Commit 1fb057b9 by 周晓航

修改 sdk版本 Redis数据根据开关配置 替换ES数据

parent 5e14d013
...@@ -13,10 +13,38 @@ ...@@ -13,10 +13,38 @@
package com.freemud.application.sdk.api.ordercenter.config; package com.freemud.application.sdk.api.ordercenter.config;
import com.freemud.application.sdk.api.config.CenterConfigProperties; import com.freemud.application.sdk.api.config.CenterConfigProperties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component @Component
@ConfigurationProperties(prefix = "order") @ConfigurationProperties(prefix = "order")
public class OrderCenterProperties extends CenterConfigProperties { public class OrderCenterProperties extends CenterConfigProperties {
/**
* 校验 多少时间类 从redis拿 数据 反馈es查询结果
*/
private int redisToEsTimeLimit = 0;
private List<String> redisToEsPartnerIds = new ArrayList<>();
public List<String> getRedisToEsPartnerIds() {
return redisToEsPartnerIds;
}
public void setRedisToEsPartnerIds(List<String> redisToEsPartnerIds) {
this.redisToEsPartnerIds = redisToEsPartnerIds;
}
public int getRedisToEsTimeLimit() {
return redisToEsTimeLimit;
}
public void setRedisToEsTimeLimit(int redisToEsTimeLimit) {
this.redisToEsTimeLimit = redisToEsTimeLimit;
}
} }
...@@ -19,7 +19,7 @@ import lombok.Data; ...@@ -19,7 +19,7 @@ import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
// fisherman
@Data @Data
public class OrderInfoReqs { public class OrderInfoReqs {
......
package com.freemud.application.sdk.api.ordercenter.service; package com.freemud.application.sdk.api.ordercenter.service;
import com.alibaba.fastjson.JSON;
import com.freemud.application.sdk.api.base.BaseRequest; import com.freemud.application.sdk.api.base.BaseRequest;
import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.log.ThirdPartyLog; import com.freemud.application.sdk.api.log.ThirdPartyLog;
import com.freemud.application.sdk.api.ordercenter.config.OrderCenterProperties;
import com.freemud.application.sdk.api.ordercenter.config.OrderDownLoadCenterProperties; import com.freemud.application.sdk.api.ordercenter.config.OrderDownLoadCenterProperties;
import com.freemud.application.sdk.api.ordercenter.constant.InterfaceAddressConstant; import com.freemud.application.sdk.api.ordercenter.constant.InterfaceAddressConstant;
import com.freemud.application.sdk.api.ordercenter.enums.ResponseResultEnum; import com.freemud.application.sdk.api.ordercenter.enums.ResponseResultEnum;
...@@ -10,6 +12,7 @@ import com.freemud.application.sdk.api.ordercenter.request.OrderConditionsReq; ...@@ -10,6 +12,7 @@ import com.freemud.application.sdk.api.ordercenter.request.OrderConditionsReq;
import com.freemud.application.sdk.api.ordercenter.request.ParkingOrderConditionsReq; import com.freemud.application.sdk.api.ordercenter.request.ParkingOrderConditionsReq;
import com.freemud.application.sdk.api.ordercenter.request.QueryAfterSalesOrderConditionsReq; import com.freemud.application.sdk.api.ordercenter.request.QueryAfterSalesOrderConditionsReq;
import com.freemud.application.sdk.api.ordercenter.request.QueryOrderByScrollRequest; import com.freemud.application.sdk.api.ordercenter.request.QueryOrderByScrollRequest;
import com.freemud.application.sdk.api.ordercenter.request.create.BatchQueryByCodesReq;
import com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse; import com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse;
import com.freemud.application.sdk.api.ordercenter.response.AfterSalesListResp; import com.freemud.application.sdk.api.ordercenter.response.AfterSalesListResp;
import com.freemud.application.sdk.api.ordercenter.response.BaseResponse; import com.freemud.application.sdk.api.ordercenter.response.BaseResponse;
...@@ -19,15 +22,15 @@ import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoR ...@@ -19,15 +22,15 @@ import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoR
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderStatisticsResp; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderStatisticsResp;
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.QueryByCodeResponse; import com.freemud.application.sdk.api.ordercenter.response.orderInfo.QueryByCodeResponse;
import com.freemud.application.sdk.api.util.RequestThirdPartyUtils; import com.freemud.application.sdk.api.util.RequestThirdPartyUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.ParameterizedTypeReference;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import java.util.List; import java.util.*;
import java.util.Objects; import java.util.stream.Collectors;
/** /**
* All rights Reserved, Designed By www.freemud.com * All rights Reserved, Designed By www.freemud.com
...@@ -50,7 +53,10 @@ public class OrderDownLoadSdkService { ...@@ -50,7 +53,10 @@ public class OrderDownLoadSdkService {
@Autowired @Autowired
private OrderDownLoadCenterProperties orderCenterProperties; private OrderDownLoadCenterProperties orderCenterProperties;
public static final String SUCCESS_RESPONSE_CODE = "100"; public static final String SUCCESS_RESPONSE_CODE = "100";
@Autowired
private OrderCenterProperties orderCenter;
@Autowired
private OrderSdkService orderSdkService;
/** /**
* 根据综合条件查询订单 * 根据综合条件查询订单
*/ */
...@@ -59,6 +65,7 @@ public class OrderDownLoadSdkService { ...@@ -59,6 +65,7 @@ public class OrderDownLoadSdkService {
BaseDownLoadResponse<List<OrderInfoReqs>> responseDTO = RequestThirdPartyUtils.httpJsonReqComplexDownLoad(restTemplate, InterfaceAddressConstant.QUERY_ORDER_BY_CONDITIONS, BaseDownLoadResponse<List<OrderInfoReqs>> responseDTO = RequestThirdPartyUtils.httpJsonReqComplexDownLoad(restTemplate, InterfaceAddressConstant.QUERY_ORDER_BY_CONDITIONS,
createBaseRequest(request, trackingNo), new ParameterizedTypeReference<BaseDownLoadResponse<List<OrderInfoReqs>>>() { createBaseRequest(request, trackingNo), new ParameterizedTypeReference<BaseDownLoadResponse<List<OrderInfoReqs>>>() {
}); });
batchCheckTime(request,responseDTO);
ThirdPartyLog.infoConvertJson(begin, System.currentTimeMillis(), InterfaceAddressConstant.QUERY_ORDER_BY_CONDITIONS, request, responseMini(responseDTO)); ThirdPartyLog.infoConvertJson(begin, System.currentTimeMillis(), InterfaceAddressConstant.QUERY_ORDER_BY_CONDITIONS, request, responseMini(responseDTO));
return responseHandle(responseDTO); return responseHandle(responseDTO);
} }
...@@ -123,8 +130,8 @@ public class OrderDownLoadSdkService { ...@@ -123,8 +130,8 @@ public class OrderDownLoadSdkService {
QueryByCodeResponse queryResponse = RequestThirdPartyUtils.httpGetReqComplex(this.restTemplate, url QueryByCodeResponse queryResponse = RequestThirdPartyUtils.httpGetReqComplex(this.restTemplate, url
, createBaseRequest(null, trackingNo), new ParameterizedTypeReference<QueryByCodeResponse>() { , createBaseRequest(null, trackingNo), new ParameterizedTypeReference<QueryByCodeResponse>() {
}); });
// fisherman 【ID1029765】 【技术线】【订单】订单ES服务订单数据查询热数据从DB(Redis)获取
return queryResponse; return checkTime(partnerId ,queryResponse);
} }
/** /**
...@@ -219,5 +226,154 @@ public class OrderDownLoadSdkService { ...@@ -219,5 +226,154 @@ public class OrderDownLoadSdkService {
} }
/**
* 批量查询
* 【ID1029765】 【技术线】【订单】订单ES服务订单数据查询热数据从DB(Redis)获取
* @param responseDTO
*/
private void batchCheckTime(OrderConditionsReq request,BaseDownLoadResponse<List<OrderInfoReqs>> responseDTO) {
// 商户级别配置开关 是否需要数据替换操作
if (!checkConfig(request.getPartnerId())){
return;
}
if (responseDTO == null || CollectionUtils.isEmpty(responseDTO.getResult())) {
return;
}
List<OrderInfoReqs> result = responseDTO.getResult();
// 过滤 需要查询 redis 的 ordercode
List<String> orderCodes = result.stream().
filter(orderInfoReqs -> isAfterTime(orderInfoReqs.getUpdateTime()))
.map(OrderInfoReqs::getOrderCode).collect(Collectors.toList());
if (CollectionUtils.isEmpty(orderCodes)) {
return;
}
try {
ApiLog.info("进入redis 数据替换 ES 逻辑", LogThreadLocal.getTrackingNo(), null);
// 查询redis
BatchQueryByCodesReq batchQueryByCodesReq = new BatchQueryByCodesReq();
batchQueryByCodesReq.setOrderCodes(orderCodes);
BaseResponse<List<OrderInfoReqs>> redisResponse = orderSdkService.batchQueryByCodes(batchQueryByCodesReq, LogThreadLocal.getTrackingNo());
ApiLog.info("list 热点数据查询redis, ",batchQueryByCodesReq,redisResponse);
if (CollectionUtils.isEmpty(redisResponse.getResult())) {
return ;
}
// 替换原有查询结果
List<OrderInfoReqs> orderInfoReqs = replaceData(result, redisResponse.getResult());
ApiLog.info("list 替换 结果 ",result,orderInfoReqs);
responseDTO.setResult(orderInfoReqs);
}catch (Exception e){
// 不要影响主流程
ApiLog.info("Redis替换ES异常 error",responseDTO, e);
}
}
/**
* 校验 是否需要走 ES热点数据替换
* @param partnerId
* @return true 需要, false 不需要
*/
private boolean checkConfig(String partnerId) {
// 查询参数没传递 partnerId
if (Objects.isNull(partnerId)) {
return false;
}
// 查询时间
if (orderCenter.getRedisToEsTimeLimit() < 0) {
return false;
}
// 没有配置商户
List<String> redisToEsPartnerIds = orderCenter.getRedisToEsPartnerIds();
if (CollectionUtils.isEmpty(redisToEsPartnerIds)) {
return false;
}
return redisToEsPartnerIds.contains(partnerId);
}
/**
* 替换原有查询结果 需要考虑替换的时间复杂度
* 用流 拿出 原有的数据 + 现有数据 (有排序功能 不能使用这种方式)
* @param to 需要替换的数据
* @param from 新数据
*/
private List<OrderInfoReqs> replaceData(List<OrderInfoReqs> to, List<OrderInfoReqs> from) {
if (CollectionUtils.isEmpty(to) || CollectionUtils.isEmpty(from)) {
return to;
}
// 这里还可以优化 暂时先上线
from.forEach(orderInfoReqs -> {
for (int i = 0; i < to.size(); i++) {
OrderInfoReqs infoReqs = to.get(i);
if (orderInfoReqs.getOrderCode().equals(infoReqs.getOrderCode())) {
to.set(i,orderInfoReqs);
break;
}
}
});
return to;
}
/**
* 更新时间在6小时以内,则根据orderCode调用DB(Redis)查询一次并替换该订单对象
* @param partnerId 商户级别开关控制
* @param queryResponse
* @return
*/
private QueryByCodeResponse checkTime(String partnerId,QueryByCodeResponse queryResponse) {
// 商户级别开关控制 fisherman
ApiLog.info("获取到的商户级别配置, timeLimit redisToEsPartnerIds",orderCenter.getRedisToEsTimeLimit(),orderCenter.getRedisToEsPartnerIds());
// 商户级别配置开关 是否需要数据替换操作
if (!checkConfig(partnerId)){
return queryResponse;
}
if (queryResponse ==null || queryResponse.getResult() ==null) {
return queryResponse;
}
OrderInfoReqs infoReqs = queryResponse.getResult();
String strtime = infoReqs.getUpdateTime();
if (Objects.isNull(strtime)) {
return queryResponse;
}
if (isAfterTime(strtime)) {
// 在 6小时范围内 ,就查询 redis 进行 对象数据替换
try {
ApiLog.info("进入redis 数据替换 ES 逻辑", LogThreadLocal.getTrackingNo(), null);
BatchQueryByCodesReq batchQueryByCodesReq = new BatchQueryByCodesReq();
batchQueryByCodesReq.setOrderCodes(Collections.singletonList(infoReqs.getOrderCode()));
BaseResponse<List<OrderInfoReqs>> redisResponse = orderSdkService.batchQueryByCodes(batchQueryByCodesReq, LogThreadLocal.getTrackingNo());
ApiLog.info("热点数据查询redis, ",batchQueryByCodesReq,redisResponse);
if (CollectionUtils.isEmpty(redisResponse.getResult())) {
return queryResponse;
}
List<OrderInfoReqs> result = redisResponse.getResult();
result.forEach(orderInfoReqs -> {
if (infoReqs.getOrderCode().equals(orderInfoReqs.getOrderCode())) {
queryResponse.setResult(orderInfoReqs);
}
});
ApiLog.info("替换 结果 ",result,queryResponse);
return queryResponse;
}catch (Exception e){
// 不要影响主流程
ApiLog.info("Redis替换ES异常 error",queryResponse, e);
return queryResponse;
}
}
return queryResponse;
}
/**
*
* @param time 13位时间戳
* @return
*/
private boolean isAfterTime(String time) {
Date dateTime = new Date(Long.parseLong(time));
// 和设置的时间 进行对比
Calendar calendar = Calendar.getInstance();
// - 6 小时 注意 下面是 加 [负数]
calendar.add(Calendar.HOUR,-orderCenter.getRedisToEsTimeLimit());
Date limitDate = calendar.getTime();
return dateTime.after(limitDate);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment