Forráskód Böngészése

feat: 同步发货定时任务增强

xdd 1 hónapja
szülő
commit
305336c417

+ 60 - 49
fs-admin/src/main/java/com/fs/task/StoreTask.java

@@ -148,7 +148,6 @@ public class StoreTask {
      * 发货任务
      */
     @QuartzRunnable(name = "发货任务")
-    @Transactional
     public void deliveryOp() {
         List<FsStoreOrder> list = orderService.selectDeliverPenddingData();
 
@@ -156,40 +155,46 @@ public class StoreTask {
             String orderCode = order.getOrderCode();
             ErpOrderQueryRequert request = new ErpOrderQueryRequert();
             request.setCode(order.getExtendOrderId());
-            // 根据仓库code找erp
-            if(com.fs.common.utils.StringUtils.isNotBlank(order.getStoreHouseCode())){
-                String erp = fsWarehousesMapper.selectErpByCode(order.getStoreHouseCode());
-                ErpContextHolder.setErpType(erp);
-            }
-            ErpOrderQueryResponse response = erpOrderService.getOrder(request);
-            if (CollectionUtils.isNotEmpty(response.getOrders())) {
-                for (ErpOrderQuery orderQuery : response.getOrders()) {
-                    if (CollectionUtils.isNotEmpty(orderQuery.getDeliverys())) {
-                        // 部分发货或者全部发货
-                        if (ObjectUtils.equals(orderQuery.getDelivery_state(), 1) || ObjectUtils.equals(orderQuery.getDelivery_state(), 2)) {
 
-                            orderStatusService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
-                                    OrderLogEnum.DELIVERY_GOODS.getDesc());
-
-                            for (ErpDeliverys delivery : orderQuery.getDeliverys()) {
+            try{
+                // 根据仓库code找erp
+                if(com.fs.common.utils.StringUtils.isNotBlank(order.getStoreHouseCode())){
+                    String erp = fsWarehousesMapper.selectErpByCode(order.getStoreHouseCode());
+                    ErpContextHolder.setErpType(erp);
+                }
+                ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+                if (CollectionUtils.isNotEmpty(response.getOrders())) {
+                    for (ErpOrderQuery orderQuery : response.getOrders()) {
+                        if (CollectionUtils.isNotEmpty(orderQuery.getDeliverys())) {
+                            // 部分发货或者全部发货
+                            if (ObjectUtils.equals(orderQuery.getDelivery_state(), 1) || ObjectUtils.equals(orderQuery.getDelivery_state(), 2)) {
+
+                                orderStatusService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
+                                        OrderLogEnum.DELIVERY_GOODS.getDesc());
+
+                                for (ErpDeliverys delivery : orderQuery.getDeliverys()) {
+
+                                    FsExpress express=expressService.selectFsExpressByOmsCode(delivery.getExpress_code());
+                                    if(express == null){
+                                        logger.warn("当前express_code: {} 不存在!",delivery.getExpress_code());
+                                        continue;
+                                    }
 
-                                FsExpress express=expressService.selectFsExpressByOmsCode(delivery.getExpress_code());
-                                if(express == null){
-                                    logger.warn("当前express_code: {} 不存在!",delivery.getExpress_code());
-                                    continue;
+                                    if (delivery.getDelivery()) {
+                                        orderService.deliveryOrder(orderCode, delivery.getMail_no(),
+                                                delivery.getExpress_code(), delivery.getExpress_name());
+                                    }
                                 }
 
-                                if (delivery.getDelivery()) {
-                                    orderService.deliveryOrder(orderCode, delivery.getMail_no(),
-                                            delivery.getExpress_code(), delivery.getExpress_name());
-                                }
+                                logger.info("订单 {} 发货信息同步成功",order.getOrderCode());
                             }
-
-                            logger.info("订单 {} 发货信息同步成功",order.getOrderCode());
                         }
                     }
                 }
+            }catch (Exception e){
+                logger.error(String.format("[发货任务]调用erp查询接口失败!原因: %s",e));
             }
+
         }
 
     }
@@ -503,34 +508,40 @@ public class StoreTask {
         List<FsStoreOrder> list = fsStoreOrderMapper.selectUpdateExpress();
 
         for (FsStoreOrder order : list) {
-            ErpOrderQueryRequert request = new ErpOrderQueryRequert();
-            request.setCode(order.getExtendOrderId());
-            // 根据仓库code找erp
-            if(com.fs.common.utils.StringUtils.isNotBlank(order.getStoreHouseCode())){
-                String erp = fsWarehousesMapper.selectErpByCode(order.getStoreHouseCode());
-                ErpContextHolder.setErpType(erp);
-            }
 
-            ErpOrderQueryResponse response = erpOrderService.getOrder(request);
-            if (CollectionUtils.isNotEmpty(response.getOrders())) {
-                for (ErpOrderQuery orderQuery : response.getOrders()) {
-                    // 部分发货或者全部发货
-                    if (ObjectUtils.equals(orderQuery.getDelivery_state(), 1) || ObjectUtils.equals(orderQuery.getDelivery_state(), 2)) {
-                        // 订单状态变更
-                        orderStatusService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
-                                OrderLogEnum.DELIVERY_GOODS.getDesc());
-
-                        redisCache.deleteObject(DELIVERY + ":" + order.getExtendOrderId());
-
-                        for (ErpDeliverys delivery : orderQuery.getDeliverys()) {
-                            if (delivery.getDelivery()) {
-                                orderService.deliveryOrder(order.getOrderCode(), delivery.getMail_no(),
-                                        delivery.getExpress_code(), delivery.getExpress_name());
+            try{
+                logger.info("[发货任务] 当前单号: {}",order.getOrderCode());
+                ErpOrderQueryRequert request = new ErpOrderQueryRequert();
+                request.setCode(order.getExtendOrderId());
+                // 根据仓库code找erp
+                if(com.fs.common.utils.StringUtils.isNotBlank(order.getStoreHouseCode())){
+                    String erp = fsWarehousesMapper.selectErpByCode(order.getStoreHouseCode());
+                    ErpContextHolder.setErpType(erp);
+                }
+
+                ErpOrderQueryResponse response = erpOrderService.getOrder(request);
+                if (CollectionUtils.isNotEmpty(response.getOrders())) {
+                    for (ErpOrderQuery orderQuery : response.getOrders()) {
+                        // 部分发货或者全部发货
+                        if (ObjectUtils.equals(orderQuery.getDelivery_state(), 1) || ObjectUtils.equals(orderQuery.getDelivery_state(), 2)) {
+                            // 订单状态变更
+                            orderStatusService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
+                                    OrderLogEnum.DELIVERY_GOODS.getDesc());
+
+                            redisCache.deleteObject(DELIVERY + ":" + order.getExtendOrderId());
+
+                            for (ErpDeliverys delivery : orderQuery.getDeliverys()) {
+                                if (delivery.getDelivery()) {
+                                    orderService.deliveryOrder(order.getOrderCode(), delivery.getMail_no(),
+                                            delivery.getExpress_code(), delivery.getExpress_name());
+                                }
                             }
-                        }
 
+                        }
                     }
                 }
+            }catch (Exception e) {
+                logger.error("获取订单是否发货失败!原因: ",e);
             }
         }
 

+ 36 - 0
fs-service-system/src/main/java/com/fs/erp/service/impl/ErpOrderServiceProxy.java

@@ -7,6 +7,9 @@ import com.fs.erp.domain.ErpUser;
 import com.fs.erp.dto.*;
 import com.fs.erp.service.IErpOrderService;
 import com.fs.erp.utils.ErpContextHolder;
+import com.google.common.util.concurrent.RateLimiter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Primary;
@@ -19,9 +22,11 @@ import java.util.Map;
  * ERP订单服务动态代理类
  * 通过ErpContextHolder获取当前ERP类型,实现多ERP系统无感切换
  */
+@Slf4j
 @Service
 @Primary
 public class ErpOrderServiceProxy implements IErpOrderService {
+    private final RateLimiter rateLimiter = RateLimiter.create(5.0);
 
     /**
      * 存储所有实现的ERP订单服务
@@ -70,6 +75,37 @@ public class ErpOrderServiceProxy implements IErpOrderService {
 
     @Override
     public ErpOrderQueryResponse getOrder(ErpOrderQueryRequert param) {
+        if(StringUtils.equals(ErpContextHolder.getErpType(), ErpTypeConstant.JST_ERP)) {
+            // 最大重试次数
+            int maxRetries = 3;
+            // 当前重试次数
+            int retryCount = 0;
+
+            while (retryCount < maxRetries) {
+                if (rateLimiter.tryAcquire()) {
+                    // 获取到令牌,直接执行请求
+                    return getCurrentErpService().getOrder(param);
+                }
+
+                // 重试计数增加
+                retryCount++;
+
+                if (retryCount < maxRetries) {
+                    try {
+                        // 每次重试间隔时间递增:500ms, 1000ms, 1500ms...
+                        long waitTime = 1000 * retryCount;
+                        Thread.sleep(waitTime);
+                        log.info("ERP请求被限流,等待{}ms后第{}次重试", waitTime, retryCount);
+                    } catch (InterruptedException e) {
+                        Thread.currentThread().interrupt();
+                        break;
+                    }
+                }
+            }
+
+            // 达到最大重试次数后仍无法获取令牌,才抛出异常
+            throw new RuntimeException("请求过于频繁,请稍后再试");
+        }
         return getCurrentErpService().getOrder(param);
     }