yuhongqi 3 недель назад
Родитель
Сommit
b82ae51ca9

+ 71 - 44
fs-admin/src/main/java/com/fs/task/LiveTask.java

@@ -7,10 +7,10 @@ import com.fs.erp.domain.ErpOrderQuery;
 import com.fs.erp.dto.ErpOrderQueryRequert;
 import com.fs.erp.dto.ErpOrderQueryResponse;
 import com.fs.erp.service.FsJstAftersalePushService;
-import com.fs.erp.service.IErpOrderService;
-import com.fs.erp.utils.ErpContextHolder;
+import com.fs.erp.service.impl.JSTErpOrderServiceImpl;
 import com.fs.express.FsStoreDeliversService;
 import com.fs.common.utils.StringUtils;
+import com.google.common.collect.Lists;
 import com.fs.huifuPay.domain.HuiFuQueryOrderResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayQueryRequest;
 import com.fs.live.domain.LiveOrderPayment;
@@ -30,7 +30,6 @@ import com.fs.store.mapper.*;
 import com.fs.store.param.LiveAfterSalesAudit1Param;
 import com.fs.store.service.*;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.ObjectUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,6 +38,7 @@ import org.springframework.stereotype.Component;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
@@ -52,6 +52,9 @@ import static com.fs.live.utils.redis.RedisBatchHandler.CONSUME_INTERVAL;
 public class LiveTask {
     Logger logger = LoggerFactory.getLogger(LiveTask.class);
 
+    /** 聚水潭发货查询每批 o_id 数量 */
+    private static final int DELIVERY_QUERY_BATCH_SIZE = 30;
+    private static final String JST_SHOP_ID = "18675245";
 
     @Autowired
     private ILiveOrderService liveOrderService;
@@ -67,8 +70,7 @@ public class LiveTask {
 
 
     @Autowired
-    private IErpOrderService erpOrderService;
-
+    private JSTErpOrderServiceImpl jstErpOrderService;
 
     @Autowired
     private IFsExpressService expressService;
@@ -77,10 +79,6 @@ public class LiveTask {
     @Autowired
     private ILiveOrderLogsService orderLogsService;
 
-
-    @Autowired
-    private FsWarehousesMapper fsWarehousesMapper;
-
     @Autowired
     public FsJstAftersalePushService fsJstAftersalePushService;
     @Autowired
@@ -166,57 +164,86 @@ public class LiveTask {
      * 发货任务
      */
     @QuartzRunnable(name = "发货任务")
-    public void deliveryOp() {
+    public void deliveryOp() throws InterruptedException {
         List<LiveOrder> list = liveOrderService.selectDeliverPenddingData();
 
-        for (LiveOrder order : list) {
-            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.getOrderLive(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)) {
-
-                                orderLogsService.create(order.getOrderId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
-                                        OrderLogEnum.DELIVERY_GOODS.getDesc());
+        ArrayList<Long> oIds = new ArrayList<>();
+        for (LiveOrder liveOrder : list) {
+            if (StringUtils.isNotEmpty(liveOrder.getExtendOrderId())) {
+                oIds.add(Long.parseLong(liveOrder.getExtendOrderId()));
+            }
+        }
+        if (!CollectionUtils.isEmpty(oIds)) {
+            jstErpOrderDelivery(oIds);
+        }
+    }
 
-                                for (ErpDeliverys delivery : orderQuery.getDeliverys()) {
+    private void jstErpOrderDelivery(List<Long> oIds) throws InterruptedException {
+        if (CollectionUtils.isEmpty(oIds)) {
+            return;
+        }
 
-                                    FsExpress express = expressService.selectFsExpressByOmsCode(delivery.getExpress_code());
+        List<List<Long>> batches = Lists.partition(oIds, DELIVERY_QUERY_BATCH_SIZE);
+        for (List<Long> batch : batches) {
+            List<String> extendIds = new ArrayList<>();
+            for (Long oId : batch) {
+                extendIds.add(oId.toString());
+            }
+            int pageIndex = 1;
+            boolean hasNext;
+            do {
+                Thread.sleep(300);
+                ErpOrderQueryRequert request = new ErpOrderQueryRequert();
+                request.setPage_size(100);
+                request.setPage_index(pageIndex);
+                request.setShop_id(JST_SHOP_ID);
+                request.setO_ids(batch);
+
+                ErpOrderQueryResponse response = jstErpOrderService.getOrderLive(request);
+                hasNext = response.hasNextSafe();
+                liveOrderService.updateUpdateTimeByExtendIds(extendIds);
+
+                if (response.getOrders() != null) {
+                    for (ErpOrderQuery orderQuery : response.getOrders()) {
+                        if (orderQuery.getDeliverys() == null || orderQuery.getDeliverys().isEmpty()) {
+                            continue;
+                        }
+                        for (ErpDeliverys delivery : orderQuery.getDeliverys()) {
+                            if (!delivery.getDelivery() || org.apache.commons.lang3.StringUtils.isEmpty(delivery.getMail_no())) {
+                                continue;
+                            }
+                            LiveOrder liveOrder = liveOrderService.selectLiveOrderByOrderCode(orderQuery.getCode());
+                            if (liveOrder == null) {
+                                logger.warn("直播发货任务未找到订单 orderCode={}", orderQuery.getCode());
+                                continue;
+                            }
+                            orderLogsService.create(liveOrder.getOrderId(), 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.warn("当前express_code: {} 不存在!", delivery.getExpress_code());
+                                        logger.error("当前express_code: {} 不存在!", deli.getExpress_code());
                                         continue;
                                     }
-
-                                    if (delivery.getDelivery()) {
-                                        liveOrderService.deliveryOrder(orderCode, delivery.getMail_no(),
-                                                delivery.getExpress_code(), delivery.getExpress_name());
+                                    if (deli.getDelivery()) {
+                                        liveOrderService.deliveryOrder(orderQuery.getCode(), deli.getMail_no(),
+                                                deli.getExpress_code(), deli.getExpress_name());
                                     }
                                 }
-
-                                logger.info("订单 {} 发货信息同步成功", order.getOrderCode());
+                                logger.info("直播订单 {} 发货信息同步成功", orderQuery.getCode());
+                            } catch (Exception e) {
+                                logger.error("同步直播订单发货状态失败 orderCode={} mailNo={}",
+                                        orderQuery.getCode(), delivery.getMail_no(), e);
                             }
                         }
                     }
                 }
-            } catch (Exception e) {
-                logger.error(String.format("[发货任务]调用erp查询接口失败!原因: %s", e));
-            }
-
+                pageIndex++;
+            } while (hasNext);
         }
     }
 
-
     /**
      * 同步近三天直播订单关联的APP用户数据
      */

+ 12 - 7
fs-admin/src/main/java/com/fs/task/StoreTask.java

@@ -69,6 +69,11 @@ import static com.fs.store.constants.StoreConstants.DELIVERY;
 @Component("storeTask")
 public class StoreTask {
     Logger logger = LoggerFactory.getLogger(StoreTask.class);
+
+    /** 聚水潭发货查询每批 o_id 数量 */
+    private static final int DELIVERY_QUERY_BATCH_SIZE = 30;
+    private static final String JST_SHOP_ID = "18675245";
+
     @Autowired
     private RedisTemplate redisTemplate;
     @Autowired
@@ -255,9 +260,12 @@ public class StoreTask {
     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<>();
+        List<List<Long>> batches = Lists.partition(o_ids, DELIVERY_QUERY_BATCH_SIZE);
         for (List<Long> batch : batches) {
+            List<String> extendIds = new ArrayList<>();
+            for (Long oId : batch) {
+                extendIds.add(oId.toString());
+            }
             int pageIndex = 1;
             boolean has_next = false;
             do {
@@ -265,14 +273,11 @@ public class StoreTask {
                 ErpOrderQueryRequert request = new ErpOrderQueryRequert();
                 request.setPage_size(100);
                 request.setPage_index(pageIndex);
-                request.setShop_id("18675245");
-                request.setO_ids(batch); // 设置当前批次
+                request.setShop_id(JST_SHOP_ID);
+                request.setO_ids(batch);
 
                 ErpOrderQueryResponse response = jstErpOrderService.getOrder(request);
                 has_next = response.hasNextSafe();
-                for (Long l : batch) {
-                    extendIds.add(l.toString());
-                }
                 orderService.updateUpdateTimeByExtendIds(extendIds);
 
                 if (response.getOrders() != null) {

+ 16 - 2
fs-admin/src/main/resources/application.yml

@@ -27,19 +27,33 @@ server:
   tomcat:
     # tomcat的URI编码
     uri-encoding: UTF-8
-    # tomcat最大线程数,默认为200
     max-threads: 800
     # Tomcat启动初始化的线程数,默认值25
     min-spare-threads: 30
 
-# 日志配置
+# 日志配置(文件与控制台均为 UTF-8)
 logging:
+  file:
+    path: logs
+  logback:
+    rollingpolicy:
+      # 单文件大小上限(200MB~500MB,按需调整)
+      max-file-size: 300MB
+      # 归档保留天数
+      max-history: 60
+      # 所有归档日志总大小上限
+      total-size-cap: 20GB
   level:
     com.fs: warn
     org.springframework: warn
 
 # Spring配置
 spring:
+  http:
+    encoding:
+      charset: UTF-8
+      enabled: true
+      force: true
   mvc:
     async:
       request-timeout: 30000

+ 77 - 0
fs-admin/src/main/resources/logback-spring.xml

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds">
+
+    <!-- 日志目录,可通过 logging.file.path 或环境变量 LOG_PATH 覆盖 -->
+    <springProperty scope="context" name="LOG_PATH" source="logging.file.path" defaultValue="logs"/>
+    <!-- 单文件大小上限,建议 200MB~500MB -->
+    <springProperty scope="context" name="MAX_FILE_SIZE" source="logging.logback.rollingpolicy.max-file-size" defaultValue="300MB"/>
+    <!-- 保留天数 -->
+    <springProperty scope="context" name="MAX_HISTORY" source="logging.logback.rollingpolicy.max-history" defaultValue="60"/>
+    <!-- 所有归档日志总大小上限 -->
+    <springProperty scope="context" name="TOTAL_SIZE_CAP" source="logging.logback.rollingpolicy.total-size-cap" defaultValue="20GB"/>
+
+    <property name="APP_NAME" value="fs-admin"/>
+    <property name="LOG_CHARSET" value="UTF-8"/>
+    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
+
+    <!-- 控制台(UTF-8,配合 -Dfile.encoding=UTF-8 与 LANG=zh_CN.UTF-8) -->
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${LOG_PATTERN}</pattern>
+            <charset>${LOG_CHARSET}</charset>
+            <immediateFlush>true</immediateFlush>
+        </encoder>
+    </appender>
+
+    <!--
+        按「日期 + 大小」滚动,归档为 UTF-8 文本再 gzip:
+        - 每天凌晨跨日自动切割(fileNamePattern 含 yyyy-MM-dd)
+        - 单文件超过 MAX_FILE_SIZE 时在同一天内继续切割(.%i)
+    -->
+    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_PATH}/${APP_NAME}.log</file>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${LOG_PATTERN}</pattern>
+            <charset>${LOG_CHARSET}</charset>
+            <immediateFlush>true</immediateFlush>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_PATH}/archive/${APP_NAME}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
+            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
+            <cleanHistoryOnStart>false</cleanHistoryOnStart>
+        </rollingPolicy>
+    </appender>
+
+    <!-- ERROR 单独归档(UTF-8) -->
+    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${LOG_PATH}/${APP_NAME}-error.log</file>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${LOG_PATTERN}</pattern>
+            <charset>${LOG_CHARSET}</charset>
+            <immediateFlush>true</immediateFlush>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${LOG_PATH}/archive/${APP_NAME}-error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
+            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            <maxHistory>${MAX_HISTORY}</maxHistory>
+            <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
+        </rollingPolicy>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE_ALL"/>
+        <appender-ref ref="FILE_ERROR"/>
+    </root>
+
+    <logger name="com.fs" level="WARN"/>
+    <logger name="org.springframework" level="WARN"/>
+
+</configuration>

+ 9 - 8
fs-service-system/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java

@@ -256,26 +256,27 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
 
     @Override
     public ErpOrderQueryResponse getOrderLive(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服务查询订单
         OrderQueryResponseDTO query = jstErpHttpService.query(requestDTO);
 
-        // 3. 构建响应对象
         ErpOrderQueryResponse response = new ErpOrderQueryResponse();
 
-        // 4. 设置基本响应信息
-
-        // 5. 转换订单数据
         if (query.getOrders() != null && !query.getOrders().isEmpty()) {
             List<ErpOrderQuery> erpOrders = query.getOrders().stream()
                     .map(this::convertToErpOrderQueryLive)
                     .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/live/mapper/LiveOrderMapper.java

@@ -136,6 +136,8 @@ public interface LiveOrderMapper {
 
     List<LiveOrder> selectFsOutDateOrder();
 
+    void updateUpdateTimeByExtendIds(@Param("batch") List<String> batch);
+
     @Select("SELECT * FROM live_order WHERE live_id= #{liveId}")
     List<LiveOrder> selectOrderByLiveId(@Param("liveId") Long liveId);
 

+ 2 - 0
fs-service-system/src/main/java/com/fs/live/service/ILiveOrderService.java

@@ -193,6 +193,8 @@ public interface ILiveOrderService {
 
     void deliveryOrder(String orderCode, String mailNo, String expressCode, String expressName);
 
+    void updateUpdateTimeByExtendIds(List<String> extendOrderIds);
+
     LiveOrderComputeDTO computedOrder(long l, LiveOrderComputedParam param);
 
     LiveOrder selectOrderIdByOrderCode(String platformCode);

+ 8 - 0
fs-service-system/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -1787,6 +1787,14 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         return baseMapper.selectDeliverPenddingData();
     }
 
+    @Override
+    public void updateUpdateTimeByExtendIds(List<String> extendOrderIds) {
+        if (CollectionUtils.isEmpty(extendOrderIds)) {
+            return;
+        }
+        baseMapper.updateUpdateTimeByExtendIds(extendOrderIds);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
     public void deliveryOrder(String orderCode, String deliveryId, String deliverCode, String deliverName) {

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

@@ -1255,15 +1255,15 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             fsWxExpressTaskMapper.insert(fsWxExpressTask);
 
             // 微信消息通知
-            TemplateBean templateBean = TemplateBean.builder()
-                    .orderId(order.getId().toString())
-                    .orderCode(order.getOrderCode())
-                    .deliveryId(deliveryId)
-                    .deliveryName(express.getName())
-                    .userId(order.getUserId())
-                    .templateType(TemplateListenEnum.TYPE_2.getValue())
-                    .build();
-            publisher.publishEvent(new TemplateEvent(this, templateBean));
+//            TemplateBean templateBean = TemplateBean.builder()
+//                    .orderId(order.getId().toString())
+//                    .orderCode(order.getOrderCode())
+//                    .deliveryId(deliveryId)
+//                    .deliveryName(express.getName())
+//                    .userId(order.getUserId())
+//                    .templateType(TemplateListenEnum.TYPE_2.getValue())
+//                    .build();
+//            publisher.publishEvent(new TemplateEvent(this, templateBean));
 
         }
     }

+ 8 - 0
fs-service-system/src/main/resources/mapper/live/LiveOrderMapper.xml

@@ -647,4 +647,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </select>
 
+    <update id="updateUpdateTimeByExtendIds">
+        UPDATE live_order SET update_time = NOW()
+        WHERE extend_order_id IN
+        <foreach item="item" collection="batch" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </update>
+
 </mapper>