Jelajahi Sumber

合并代码

donglang 11 jam lalu
induk
melakukan
a321a56a54

+ 53 - 8
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -3063,12 +3063,6 @@ public class KwoTradeOrderService {
         return actualDisPatch;
     }
 
-    /**
-     * 手动完结订单
-     *
-     * @param tradeOrderSettleParam
-     * @return
-     */
     @Transactional(rollbackFor = Exception.class)
     public Object settleOrder(TradeOrderSettleParam tradeOrderSettleParam) {
         KwoTradeOrder kwoTradeOrder = new KwoTradeOrder();
@@ -3079,8 +3073,6 @@ public class KwoTradeOrderService {
                 kwoTradeOrder.setStatus(TradeOrderStatusEnum.SUCCESS.getCode());
                 // 预付钱包完结:解冻 + 按实际装/卸货量消费
                 calculatePrepaidBalance(kwoTradeOrderDB);
-                // 收费策略服务费完结:解冻履约中金额 + 按实际履约量扣减(内部含详细日志)
-                settleChargeStrategyIfApplied(kwoTradeOrderDB, logisticOrderList);
             } else {
                 kwoTradeOrder.setStatus(TradeOrderStatusEnum.DEAL.getCode());
             }
@@ -3093,6 +3085,7 @@ public class KwoTradeOrderService {
         //通知下游,贸易订单已完结,或处于完结中。
         try {
             transportRemoteService.logisticOrderFinish(new OrderFinishParam(tradeOrderSettleParam.getId()));
+            settleChargeStrategyAfterLogisticOrderFinish(tradeOrderSettleParam.getId());
         } catch (BusinessException e) {
             if (StrUtil.equals(e.getMsg(), "未找到该物流订单信息")) {
                 kwoTradeOrder.setUnloadAmount(new BigDecimal("0"));
@@ -3103,6 +3096,58 @@ public class KwoTradeOrderService {
         return true;
     }
 
+    /**
+     * 物流订单完结后统一处理服务费结算。
+     * <p>
+     * 所有调用 TransportRemoteService.logisticOrderFinish 的场景,均应调用此方法。
+     * 方法内部重新查询订单和运单状态,确保仅在所有运单完成且订单应用收费策略时,
+     * 执行服务费解冻、扣减并记录钱包变动明细。
+     *
+     * @param tradeOrderId 贸易订单ID
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void settleChargeStrategyAfterLogisticOrderFinish(Long tradeOrderId) {
+        log.info("物流订单完结后服务费结算开始,订单ID:{}", tradeOrderId);
+        if (tradeOrderId == null) {
+            log.warn("物流订单完结后服务费结算跳过,订单ID为空");
+            return;
+        }
+        KwoTradeOrder order = kwoTradeOrderMapper.selectOne(new LambdaQueryWrapper<KwoTradeOrder>()
+                .eq(KwoTradeOrder::getId, tradeOrderId)
+                .eq(KwoTradeOrder::getDelFlag, Global.UN_DELETED));
+        if (order == null) {
+            log.warn("物流订单完结后服务费结算跳过,未找到贸易订单,订单ID:{}", tradeOrderId);
+            return;
+        }
+        List<KwtLogisticsOrderVO> logisticOrderList;
+        try {
+            logisticOrderList = transportRemoteService.getLogisticOrderList(new OrderFinishParam(tradeOrderId));
+        } catch (Exception e) {
+            log.error("物流订单完结后查询运单列表失败,订单ID:{}, 订单号:{}",
+                    order.getId(), order.getTOrderNo(), e);
+            throw new BusinessException("物流订单完结后查询运单列表失败");
+        }
+        if (!hasAllLogisticsOrdersCompleted(logisticOrderList)) {
+            log.info("物流订单尚未全部完成,服务费结算跳过,订单ID:{}, 订单号:{}, 运单数量:{}",
+                    order.getId(), order.getTOrderNo(), CollUtil.size(logisticOrderList));
+            return;
+        }
+        settleChargeStrategyIfApplied(order, logisticOrderList);
+    }
+
+    /**
+     * 判断贸易订单下是否存在运单且所有运单均已完成。
+     *
+     * @param logisticOrderList 物流订单列表
+     * @return true-所有运单完成;false-无运单或存在未完成运单
+     */
+    static boolean hasAllLogisticsOrdersCompleted(List<KwtLogisticsOrderVO> logisticOrderList) {
+        return CollUtil.isNotEmpty(logisticOrderList)
+                && logisticOrderList.stream()
+                .allMatch(order -> order != null
+                        && Objects.equals(order.getStatus(), LogisticsOrderV1Enum.COMPLETED.getCode()));
+    }
+
     /**
      * 贸易订单完结时,处理收费策略关联的服务费结算
      * <p>

+ 5 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/task/TradeOrderTask.java

@@ -21,6 +21,7 @@ import com.sckw.order.model.KwoTradeOrderArchive;
 import com.sckw.order.model.KwoTradeOrderGoods;
 import com.sckw.order.model.KwoTradeOrderUnit;
 import com.sckw.order.serivce.KwoTradeOrderArchiveService;
+import com.sckw.order.serivce.KwoTradeOrderService;
 import com.sckw.payment.api.dubbo.PaymentDubboService;
 import com.sckw.payment.api.feign.PaymentFeignService;
 import com.sckw.payment.api.model.feign.WalletPrepaidDto;
@@ -75,6 +76,8 @@ public class TradeOrderTask {
 
     @Autowired
     private PaymentFeignService paymentFeignService;
+    @Autowired
+    private KwoTradeOrderService kwoTradeOrderService;
     private final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 2, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(20));
 
     @Scheduled(cron = "0 0/10 * * * ?")
@@ -143,6 +146,7 @@ public class TradeOrderTask {
                             kwoTradeOrderMapper.updateById(kwoTradeOrder);
                             try {
                                 Boolean aBoolean = transportRemoteService.logisticOrderFinish(new OrderFinishParam(kwoTradeOrder.getId()));
+                                kwoTradeOrderService.settleChargeStrategyAfterLogisticOrderFinish(kwoTradeOrder.getId());
                             } catch (Exception e) {
                                 log.error("物流订单结算失败 {}", e.getMessage());
                             }
@@ -175,6 +179,7 @@ public class TradeOrderTask {
                                 kwoTradeOrderMapper.updateById(kwoTradeOrder);
                                 try {
                                     Boolean aBoolean = transportRemoteService.logisticOrderFinish(new OrderFinishParam(kwoTradeOrder.getId()));
+                                    kwoTradeOrderService.settleChargeStrategyAfterLogisticOrderFinish(kwoTradeOrder.getId());
                                 } catch (Exception e) {
                                     log.error("物流订单结算失败 {}", e.getMessage());
                                 }