|
|
@@ -524,25 +524,8 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
|
|
|
OrderQueryRequestDTO requestDTO = new OrderQueryRequestDTO();
|
|
|
requestDTO.setOIds(Collections.singletonList(Long.valueOf(param.getCode())));
|
|
|
|
|
|
- // 限流检查:每分钟最多100次请求,超过95次返回429
|
|
|
- String rateLimitKey = RATE_LIMIT_KEY_PREFIX + System.currentTimeMillis() / 60000; // 每分钟一个key
|
|
|
-
|
|
|
- // 使用原子操作增加计数,并获取增加后的值
|
|
|
- Long currentCount = redisCache.incr(rateLimitKey, 1L);
|
|
|
-
|
|
|
- // 如果是第一次请求,设置过期时间为1分钟
|
|
|
- if (currentCount == 1) {
|
|
|
- redisCache.expire(rateLimitKey, 1, TimeUnit.MINUTES);
|
|
|
- }
|
|
|
// 3. 构建响应对象
|
|
|
ErpOrderQueryResponse response = new ErpOrderQueryResponse();
|
|
|
- // 如果当前分钟内请求次数超过95次,直接返回429错误
|
|
|
- if (currentCount >= RATE_LIMIT_THRESHOLD) {
|
|
|
- response.setCode("429");
|
|
|
- response.setSuccess(false);
|
|
|
- return response;
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
// 2. 调用ERP服务查询订单
|
|
|
OrderQueryResponseDTO query = jstErpHttpService.query(requestDTO);
|
|
|
@@ -565,24 +548,10 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
|
|
|
|
|
|
@Override
|
|
|
public ErpOrderQueryResponse getLiveOrder(ErpOrderQueryRequert param) {
|
|
|
- // 限流检查:每分钟最多100次请求,超过95次返回429
|
|
|
- String rateLimitKey = RATE_LIMIT_KEY_PREFIX + System.currentTimeMillis() / 60000; // 每分钟一个key
|
|
|
|
|
|
- // 使用原子操作增加计数,并获取增加后的值
|
|
|
- Long currentCount = redisCache.incr(rateLimitKey, 1L);
|
|
|
|
|
|
- // 如果是第一次请求,设置过期时间为1分钟
|
|
|
- if (currentCount == 1) {
|
|
|
- redisCache.expire(rateLimitKey, 1, TimeUnit.MINUTES);
|
|
|
- }
|
|
|
// 3. 构建响应对象
|
|
|
ErpOrderQueryResponse response = new ErpOrderQueryResponse();
|
|
|
- // 如果当前分钟内请求次数超过95次,直接返回429错误
|
|
|
- if (currentCount >= RATE_LIMIT_THRESHOLD) {
|
|
|
- response.setCode("429");
|
|
|
- response.setSuccess(false);
|
|
|
- return response;
|
|
|
- }
|
|
|
|
|
|
// 1. 构建查询请求DTO
|
|
|
OrderQueryRequestDTO requestDTO = new OrderQueryRequestDTO();
|
|
|
@@ -1166,5 +1135,191 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
|
|
|
public void getOrderLiveDeliveryStatus(LiveOrder order) {
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量查询直播订单
|
|
|
+ * @param orderList 订单列表
|
|
|
+ * @return 查询结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ErpOrderQueryResponse batchGetLiveOrder(List<LiveOrder> orderList) {
|
|
|
+ if (CollectionUtils.isEmpty(orderList)) {
|
|
|
+ ErpOrderQueryResponse response = new ErpOrderQueryResponse();
|
|
|
+ response.setOrders(Collections.emptyList());
|
|
|
+ response.setSuccess(true);
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提取所有 extendOrderId
|
|
|
+ List<Long> extendOrderIds = orderList.stream()
|
|
|
+ .filter(order -> StringUtils.isNotEmpty(order.getExtendOrderId()))
|
|
|
+ .map(order -> Long.valueOf(order.getExtendOrderId()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(extendOrderIds)) {
|
|
|
+ ErpOrderQueryResponse response = new ErpOrderQueryResponse();
|
|
|
+ response.setOrders(Collections.emptyList());
|
|
|
+ response.setSuccess(true);
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构建批量查询请求
|
|
|
+ OrderQueryRequestDTO requestDTO = new OrderQueryRequestDTO();
|
|
|
+ requestDTO.setOIds(extendOrderIds);
|
|
|
+ requestDTO.setOrderItemFlds(Arrays.asList("status"));
|
|
|
+
|
|
|
+ // 调用ERP服务查询订单
|
|
|
+ OrderQueryResponseDTO query = jstErpHttpService.query(requestDTO);
|
|
|
+
|
|
|
+ // 构建响应对象
|
|
|
+ ErpOrderQueryResponse response = new ErpOrderQueryResponse();
|
|
|
+ List<Map<String, Object>> channelUpdateList = new ArrayList<>();
|
|
|
+ List<ErpOrderQuery> erpOrders = new ArrayList<>();
|
|
|
+
|
|
|
+ if (query.getOrders() != null && !query.getOrders().isEmpty()) {
|
|
|
+ // 创建订单映射,方便查找
|
|
|
+ Map<String, LiveOrder> orderMap = orderList.stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ LiveOrder::getExtendOrderId,
|
|
|
+ order -> order,
|
|
|
+ (existing, replacement) -> existing
|
|
|
+ ));
|
|
|
+
|
|
|
+ List<LiveOrder> splitOrders = new ArrayList<>();
|
|
|
+ // 收集需要更新channel字段的订单(其他状态)
|
|
|
+
|
|
|
+
|
|
|
+ // 处理查询结果
|
|
|
+ for (OrderQueryResponseDTO.Order order : query.getOrders()) {
|
|
|
+ String status = order.getStatus();
|
|
|
+ LiveOrder liveOrder = orderMap.get(String.valueOf(order.getOId()));
|
|
|
+
|
|
|
+ if (liveOrder == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果是 sent 状态,正常处理
|
|
|
+ if (ErpQueryOrderStatusEnum.SENT.getCode().equals(status)) {
|
|
|
+ ErpOrderQuery erpOrder = convertToErpOrderQueryLive(order);
|
|
|
+ erpOrders.add(erpOrder);
|
|
|
+ }
|
|
|
+ // 如果是 split 状态,收集起来后续处理
|
|
|
+ else if ("Split".equals(status)) {
|
|
|
+ splitOrders.add(liveOrder);
|
|
|
+ }
|
|
|
+ // 其他状态,收集起来最后统一批量更新
|
|
|
+ else {
|
|
|
+ Map<String, Object> updateMap = new HashMap<>();
|
|
|
+ updateMap.put("orderId", liveOrder.getOrderId());
|
|
|
+ updateMap.put("channel", status);
|
|
|
+ channelUpdateList.add(updateMap);
|
|
|
+ log.info("订单状态待写入channel字段,orderCode: {}, status: {}", liveOrder.getOrderCode(), status);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理 split 状态的订单,按照 getLiveOrder 的逻辑处理
|
|
|
+ if (!splitOrders.isEmpty()) {
|
|
|
+ // 对每个拆分订单,使用 soId 重新查询聚水潭,获取所有相关订单
|
|
|
+ for (LiveOrder splitLiveOrder : splitOrders) {
|
|
|
+ try {
|
|
|
+ // 使用订单号(soId)重新查询聚水潭,获取所有相关订单
|
|
|
+ OrderQueryRequestDTO splitRequestDTO = new OrderQueryRequestDTO();
|
|
|
+ splitRequestDTO.setSoIds(Collections.singletonList(splitLiveOrder.getOrderCode()));
|
|
|
+ splitRequestDTO.setOrderItemFlds(Arrays.asList("status"));
|
|
|
+
|
|
|
+ // 重新查询聚水潭
|
|
|
+ OrderQueryResponseDTO splitQuery = jstErpHttpService.query(splitRequestDTO);
|
|
|
+
|
|
|
+ if (splitQuery != null && splitQuery.getOrders() != null && !splitQuery.getOrders().isEmpty()) {
|
|
|
+ // 查找状态不为拆分并且已发货的订单
|
|
|
+ OrderQueryResponseDTO.Order sentOrder = splitQuery.getOrders().stream()
|
|
|
+ .filter(order -> !"Split".equals(order.getStatus())
|
|
|
+ && ErpQueryOrderStatusEnum.SENT.getCode().equals(order.getStatus()))
|
|
|
+ .findFirst()
|
|
|
+ .orElse(null);
|
|
|
+
|
|
|
+ if (sentOrder != null) {
|
|
|
+ // 找到符合条件的订单,同步物流状态并转换
|
|
|
+ // 同步物流状态 - 更新订单的物流信息
|
|
|
+ LiveOrder updateOrder = new LiveOrder();
|
|
|
+ updateOrder.setOrderId(splitLiveOrder.getOrderId());
|
|
|
+ if (StringUtils.isNotEmpty(sentOrder.getLogisticsCompany())) {
|
|
|
+ updateOrder.setDeliveryName(sentOrder.getLogisticsCompany());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotEmpty(sentOrder.getLId())) {
|
|
|
+ updateOrder.setDeliverySn(sentOrder.getLId());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotEmpty(sentOrder.getLcId())) {
|
|
|
+ updateOrder.setDeliveryCode(sentOrder.getLcId());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotEmpty(sentOrder.getSendDate())) {
|
|
|
+ try {
|
|
|
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ Date sendDate = formatter.parse(sentOrder.getSendDate());
|
|
|
+ updateOrder.setDeliverySendTime(sendDate);
|
|
|
+ updateOrder.setDeliveryTime(sentOrder.getSendDate());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("解析发货时间失败: {}", sentOrder.getSendDate(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ liveOrderMapper.updateLiveOrder(updateOrder);
|
|
|
+ log.info("拆分订单查询:找到已发货订单并同步物流状态,orderCode: {}, status: {}, logisticsCompany: {}, deliverySn: {}",
|
|
|
+ sentOrder.getSoId(), sentOrder.getStatus(), sentOrder.getLogisticsCompany(), sentOrder.getLId());
|
|
|
+
|
|
|
+ // 转换并添加到结果中
|
|
|
+ ErpOrderQuery erpOrder = convertToErpOrderQueryLive(sentOrder);
|
|
|
+ erpOrders.add(erpOrder);
|
|
|
+ } else {
|
|
|
+ // 如果没有找到已发货的订单,记录日志
|
|
|
+ log.warn("拆分订单查询:未找到已发货的非拆分订单,orderCode: {}", splitLiveOrder.getOrderCode());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 重新查询失败,记录日志
|
|
|
+ log.error("拆分订单查询:重新查询聚水潭失败,orderCode: {}", splitLiveOrder.getOrderCode());
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("处理拆分订单异常,orderCode: {}", splitLiveOrder.getOrderCode(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ response.setOrders(erpOrders);
|
|
|
+ } else {
|
|
|
+ response.setOrders(Collections.emptyList());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 统一批量更新其他状态的订单channel字段
|
|
|
+ if (!channelUpdateList.isEmpty()) {
|
|
|
+ batchUpdateChannel(channelUpdateList);
|
|
|
+ }
|
|
|
+
|
|
|
+ response.setSuccess(true);
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量更新订单channel字段
|
|
|
+ * @param channelUpdateList 订单ID和channel的映射列表
|
|
|
+ */
|
|
|
+ private void batchUpdateChannel(List<Map<String, Object>> channelUpdateList) {
|
|
|
+ try {
|
|
|
+ liveOrderMapper.batchUpdateChannelByOrderIds(channelUpdateList);
|
|
|
+ log.info("批量更新订单channel字段完成,共更新{}条记录", channelUpdateList.size());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("批量更新订单channel字段失败", e);
|
|
|
+ // 如果批量更新失败,可以降级为单个更新
|
|
|
+ for (Map<String, Object> updateMap : channelUpdateList) {
|
|
|
+ try {
|
|
|
+ LiveOrder updateOrder = new LiveOrder();
|
|
|
+ updateOrder.setOrderId((Long) updateMap.get("orderId"));
|
|
|
+ updateOrder.setChannel((String) updateMap.get("channel"));
|
|
|
+ liveOrderMapper.updateLiveOrder(updateOrder);
|
|
|
+ } catch (Exception ex) {
|
|
|
+ log.error("单个更新订单channel字段失败,orderId: {}, channel: {}",
|
|
|
+ updateMap.get("orderId"), updateMap.get("channel"), ex);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|