浏览代码

更新同步任务,防止之前的订单卡死

yuhongqi 1 月之前
父节点
当前提交
1483fe791a

+ 118 - 43
fs-admin/src/main/java/com/fs/task/StoreTask.java

@@ -6,6 +6,7 @@ import com.fs.common.annotation.QuartzRunnable;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
+import com.fs.erp.service.impl.JSTErpOrderServiceImpl;
 import com.fs.huifuPay.domain.HuiFuQueryOrderResult;
 import com.fs.huifuPay.dto.*;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayQueryRequest;
@@ -41,6 +42,7 @@ import com.fs.store.vo.FsUserShareVO;
 import com.fs.system.service.ISysConfigService;
 import com.fs.wx.domain.FsWxExpressTask;
 import com.fs.wx.mapper.FsWxExpressTaskMapper;
+import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.RateLimiter;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.ObjectUtils;
@@ -245,61 +247,134 @@ public class StoreTask {
     public void jstCodPush(){
         fsJstCodPushService.jstCodPush();
     }
-    /**
-     * 发货任务
-     */
-    @QuartzRunnable(name = "发货任务")
-    public void deliveryOp() {
-        List<FsStoreOrder> list = orderService.selectDeliverPenddingData();
-        Date nowDate = DateUtils.getNowDate();
-        for (FsStoreOrder order: list) {
-            order.setUpdateTime(nowDate);
-            orderService.updateFsStoreOrderDb(order);
-            String orderCode = order.getOrderCode();
-            ErpOrderQueryRequert request = new ErpOrderQueryRequert();
-            request.setCode(order.getExtendOrderId());
 
-            try{
-                // 根据仓库code找erp
-                if(com.fs.common.utils.StringUtils.isNotBlank(order.getStoreHouseCode())){
-                    String erp = fsWarehousesMapper.selectErpByCode(order.getStoreHouseCode());
-                    ErpContextHolder.setErpType(erp);
+    @Autowired
+    private JSTErpOrderServiceImpl jstErpOrderService;
+
+
+    private void jstErpOrderDelivery(List<Long> o_ids) throws InterruptedException {
+        if (org.springframework.util.CollectionUtils.isEmpty(o_ids)) return;
+
+        List<List<Long>> batches = Lists.partition(o_ids, 100);
+        List<String> extendIds = new ArrayList<>();
+        for (List<Long> batch : batches) {
+            int pageIndex = 1;
+            boolean has_next = false;
+            do {
+                Thread.sleep(300);
+                ErpOrderQueryRequert request = new ErpOrderQueryRequert();
+                request.setPage_size(100);
+                request.setPage_index(pageIndex);
+                request.setShop_id("18675245");
+                request.setO_ids(batch); // 设置当前批次
+
+                ErpOrderQueryResponse response = jstErpOrderService.getOrder(request);
+                has_next = response.hasNextSafe();
+                for (Long l : batch) {
+                    extendIds.add(l.toString());
                 }
-                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());
+                orderService.updateUpdateTimeByExtendIds(extendIds);
+
+                if (response.getOrders() != null) {
+                    for(ErpOrderQuery orderQuery : response.getOrders()){
+                        if(orderQuery.getDeliverys()!=null&& !orderQuery.getDeliverys().isEmpty()){
+                            for(ErpDeliverys delivery:orderQuery.getDeliverys()){
+                                if(delivery.getDelivery()&& org.apache.commons.lang3.StringUtils.isNotEmpty(delivery.getMail_no())){
+                                    orderStatusService.create(Long.valueOf(orderQuery.getCode()), OrderLogEnum.DELIVERY_GOODS.getValue(),
+                                            OrderLogEnum.DELIVERY_GOODS.getDesc());
+                                    try {
+                                        for (ErpDeliverys deli : orderQuery.getDeliverys()) {
+                                            FsExpress express=expressService.selectFsExpressByOmsCode(deli.getExpress_code());
+                                            if(express == null){
+                                                logger.error("当前express_code: {} 不存在!",deli.getExpress_code());
+                                                continue;
+                                            }
+                                            if (deli.getDelivery()) {
+                                                orderService.deliveryOrder(orderQuery.getCode(), deli.getMail_no(),
+                                                        deli.getExpress_code(), deli.getExpress_name());
+                                            }
+                                        }
+                                    } catch (Exception e) {
+                                        logger.error("同步订单状态失败  {}",delivery.getMail_no(),e);
                                         continue;
                                     }
-
-                                    if (delivery.getDelivery()) {
-                                        orderService.deliveryOrder(orderCode, delivery.getMail_no(),
-                                                delivery.getExpress_code(), delivery.getExpress_name());
-                                    }
                                 }
-
-                                logger.info("订单 {} 发货信息同步成功",order.getOrderCode());
                             }
+
                         }
                     }
                 }
-            }catch (Exception e){
-                logger.error(String.format("[发货任务]调用erp查询接口失败!原因: %s",e));
-            }
+                pageIndex++;
+            } while (has_next);
+        }
+    }
+    /**
+     * 发货任务
+     */
+    @QuartzRunnable(name = "发货任务")
+    public void deliveryOp() throws InterruptedException {
+        List<FsStoreOrder> list = orderService.selectDeliverPenddingData();
 
+        //聚水潭
+        ArrayList<Long> o_ids = new ArrayList<>();
+        for (FsStoreOrder fsStoreOrder : list) {
+            o_ids.add(Long.parseLong(fsStoreOrder.getExtendOrderId()));
+        }
+        if (!org.springframework.util.CollectionUtils.isEmpty(o_ids)){
+            jstErpOrderDelivery(o_ids);
         }
 
+
+
+//        Date nowDate = DateUtils.getNowDate();
+//        for (FsStoreOrder order: list) {
+//            order.setUpdateTime(nowDate);
+//            orderService.updateFsStoreOrderDb(order);
+//            String orderCode = order.getOrderCode();
+//            ErpOrderQueryRequert request = new ErpOrderQueryRequert();
+//            request.setCode(order.getExtendOrderId());
+//
+//            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;
+//                                    }
+//
+//                                    if (delivery.getDelivery()) {
+//                                        orderService.deliveryOrder(orderCode, delivery.getMail_no(),
+//                                                delivery.getExpress_code(), delivery.getExpress_name());
+//                                    }
+//                                }
+//
+//                                logger.info("订单 {} 发货信息同步成功",order.getOrderCode());
+//                            }
+//                        }
+//                    }
+//                }
+//            }catch (Exception e){
+//                logger.error(String.format("[发货任务]调用erp查询接口失败!原因: %s",e));
+//            }
+//
+//        }
+
     }
 
     /**

+ 1 - 1
fs-admin/src/test/java/com/fs/store/controller/FsStorePaymentControllerTest.java

@@ -383,7 +383,7 @@ public class FsStorePaymentControllerTest {
     private ExpressTask expressTask;
 
     @Test
-    public void deliveryOp(){
+    public void deliveryOp() throws InterruptedException {
         storeTask.deliveryOp();
     }
 

+ 2 - 0
fs-service-system/src/main/java/com/fs/erp/domain/ErpOrderQuery.java

@@ -27,6 +27,8 @@ public class ErpOrderQuery {
     String receiver_mobile;
     String receiver_address;
     Integer delivery_state;
+    Integer o_id;
+    String so_id;
 
     List<ErpDeliverys> deliverys;
 

+ 4 - 1
fs-service-system/src/main/java/com/fs/erp/dto/ErpOrderQueryRequert.java

@@ -11,5 +11,8 @@ public class ErpOrderQueryRequert implements Serializable {
     String code;
     Integer page_no;
     Integer page_size;
-
+    String platform_code;
+    String shop_id;
+    Integer page_index;
+    List<Long> o_ids;
 }

+ 7 - 0
fs-service-system/src/main/java/com/fs/erp/dto/ErpOrderQueryResponse.java

@@ -1,5 +1,6 @@
 package com.fs.erp.dto;
 
+import cn.hutool.core.annotation.Alias;
 import com.fs.erp.domain.ErpDeliverys;
 import com.fs.erp.domain.ErpOrderQuery;
 import lombok.Data;
@@ -10,4 +11,10 @@ import java.util.List;
 public class ErpOrderQueryResponse extends BaseResponse {
     List<ErpOrderQuery> orders;
 
+    @Alias("has_next")
+    private Boolean hasNext;
+
+    public boolean hasNextSafe() {
+        return Boolean.TRUE.equals(hasNext);
+    }
 }

+ 10 - 2
fs-service-system/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java

@@ -3,6 +3,7 @@ package com.fs.erp.service.impl;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.fs.common.utils.StringUtils;
 import com.fs.erp.constant.AfterSalesOrderStatusEnum;
 import com.fs.erp.constant.ErpQueryOrderStatusEnum;
 import com.fs.erp.constant.OrderStatusEnum;
@@ -38,7 +39,6 @@ import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.ObjectUtils;
-import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
@@ -220,7 +220,14 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     public ErpOrderQueryResponse getOrder(ErpOrderQueryRequert param) {
         // 1. 构建查询请求DTO
         OrderQueryRequestDTO requestDTO = new OrderQueryRequestDTO();
-        requestDTO.setOIds(Collections.singletonList(Long.valueOf(param.getCode())));
+        if(StringUtils.isNotEmpty(param.getCode())) {
+            requestDTO.setOIds(Collections.singletonList(Long.valueOf(param.getCode())));
+        }else {
+            requestDTO.setOIds(param.getO_ids());
+            requestDTO.setShopId(Integer.parseInt(param.getShop_id()));
+            requestDTO.setPageIndex(param.getPage_index());
+            requestDTO.setPageSize(param.getPage_size());
+        }
 
 
         // 2. 调用ERP服务查询订单
@@ -238,6 +245,7 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
                     .collect(Collectors.toList());
 
             response.setOrders(erpOrders);
+            response.setHasNext(query.getHasNext());
         } else {
             response.setOrders(Collections.emptyList());
         }

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsStoreOrderMapper.java

@@ -1014,4 +1014,6 @@ public interface FsStoreOrderMapper
 
     @Select("SELECT * FROM fs_store_order WHERE create_time >= DATE_SUB(NOW(), INTERVAL 25 MINUTE) AND create_time <= DATE_SUB(NOW(), INTERVAL 4 MINUTE) AND status = 0")
     List<FsStoreOrder> selectBankOrder();
+
+    void updateUpdateTimeByExtendIds(@Param("batch") List<String> batch);
 }

+ 2 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java

@@ -310,4 +310,6 @@ public interface IFsStoreOrderService
     List<FsStoreOrder> selectBankOrder();
 
     void updateFsStoreOrderDb(FsStoreOrder order);
+
+    void updateUpdateTimeByExtendIds(List<String> batch);
 }

+ 16 - 6
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java

@@ -1217,6 +1217,17 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
                 fsStoreDeliversMapper.insert(fsStoreDeliver);
             }
 
+            FsWxExpressTask fsWxExpressTask1 = fsWxExpressTaskMapper.selectByOrderCode(Long.valueOf(order.getOrderCode()), order.getUserId());
+            //订阅物流回调
+            String lastFourNumber = "";
+            if (StringUtils.equals(express.getCode(),ShipperCodeEnum.SF.getValue())) {
+                lastFourNumber = PhoneUtils.getLastFourNum(order.getUserPhone());
+            }
+            expressService.subscribeEspress(order.getOrderCode(),express.getCode(),deliveryId,lastFourNumber);
+            if (fsWxExpressTask1 != null) {
+                return;
+            }
+
             FsWxExpressTask fsWxExpressTask = new FsWxExpressTask();
             fsWxExpressTask.setUserId(order.getUserId());
             fsWxExpressTask.setStatus(0);
@@ -1246,12 +1257,6 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
                     .build();
             publisher.publishEvent(new TemplateEvent(this, templateBean));
 
-            //订阅物流回调
-            String lastFourNumber = "";
-            if (StringUtils.equals(express.getCode(),ShipperCodeEnum.SF.getValue())) {
-                lastFourNumber = PhoneUtils.getLastFourNum(order.getUserPhone());
-            }
-            expressService.subscribeEspress(order.getOrderCode(),express.getCode(),deliveryId,lastFourNumber);
         }
     }
 
@@ -1990,6 +1995,11 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         fsStoreOrderMapper.updateFsStoreOrder(order);
     }
 
+    @Override
+    public void updateUpdateTimeByExtendIds(List<String> batch) {
+        fsStoreOrderMapper.updateUpdateTimeByExtendIds(batch);
+    }
+
     @Override
     @Transactional(rollbackFor = Throwable.class,propagation = Propagation.REQUIRED)
     //类型1支付回调 类型2货到付款

+ 3 - 0
fs-service-system/src/main/java/com/fs/wx/mapper/FsWxExpressTaskMapper.java

@@ -18,6 +18,9 @@ public interface FsWxExpressTaskMapper {
     @Select("SELECT * FROM fs_wx_express_task WHERE id = #{id}")
     FsWxExpressTask selectById(@Param("id") Long id);
 
+    @Select("SELECT * FROM fs_wx_express_task WHERE order_code = #{ordercode} and user_id = #{userId}")
+    FsWxExpressTask selectByOrderCode(@Param("ordercode") Long ordercode,@Param("userId") Long userId);
+
     /**
      * 插入新任务
      * @param task 任务实体

+ 5 - 0
fs-service-system/src/main/resources/mapper/store/FsStoreOrderMapper.xml

@@ -672,4 +672,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order by o.id desc
     </select>
 
+    <update id="updateUpdateTimeByExtendIds">
+        UPDATE fs_store_order SET update_time = NOW()
+        WHERE extend_order_id IN
+        <foreach  item='item' collection='batch' open='(' separator=',' close=')'> #{item}    </foreach>
+    </update>
 </mapper>