Sfoglia il codice sorgente

提交收费系统对外对接接口包装

chenxiaofei 19 ore fa
parent
commit
7625bac1c6

+ 5 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/ParkingWalletFeeFreezeResult.java

@@ -25,6 +25,11 @@ public class ParkingWalletFeeFreezeResult implements Serializable {
      */
     private Long chargeStrategyId;
 
+    /**
+     * 收费策略类型(1-按吨计费,2-按次计费,3-按月计费)
+     */
+    private Integer chargeStrategyType;
+
     /**
      * 收费策略描述,如10元/吨
      */

+ 6 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrder.java

@@ -172,6 +172,12 @@ public class KwoTradeOrder extends BaseModel implements Serializable {
     @TableField("charge_strategy_id")
     private Long chargeStrategyId;
 
+    /**
+     * 应用的收费策略类型(1-按吨计费,2-按次计费,3-按月计费)
+     */
+    @TableField("charge_strategy_type")
+    private Integer chargeStrategyType;
+
     /**
      * 应用的收费策略描述,如10元/吨
      */

+ 22 - 4
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -2872,6 +2872,7 @@ public class KwoTradeOrderService {
         }
         order.setApplyChargeStrategy(feeFreezeResult.getApplyChargeStrategy() == null ? Global.NO : feeFreezeResult.getApplyChargeStrategy());
         order.setChargeStrategyId(feeFreezeResult.getChargeStrategyId());
+        order.setChargeStrategyType(feeFreezeResult.getChargeStrategyType());
         order.setChargeStrategyDesc(feeFreezeResult.getChargeStrategyDesc());
         order.setChargeStrategyAmount(feeFreezeResult.getChargeStrategyAmount());
     }
@@ -3582,7 +3583,7 @@ public class KwoTradeOrderService {
      * 物流订单完结后统一处理服务费结算。
      * <p>
      * 所有调用 TransportRemoteService.logisticOrderFinish 的场景,均应调用此方法。
-     * 方法内部重新查询订单和运单状态,确保仅在所有运单完成且订单应用收费策略时,
+     * 方法内部重新查询订单和运单状态,确保仅在所有运单完成且订单应用按吨收费策略时,
      * 执行服务费解冻、扣减并记录钱包变动明细。
      *
      * @param tradeOrderId 贸易订单ID
@@ -3617,6 +3618,18 @@ public class KwoTradeOrderService {
         settleChargeStrategyIfApplied(order, logisticOrderList);
     }
 
+    /**
+     * 判断订单是否应用按吨收费策略。
+     *
+     * @param order 贸易订单
+     * @return true-已应用按吨收费策略
+     */
+    static boolean isChargeByTonStrategyApplied(KwoTradeOrder order) {
+        return order != null
+                && Objects.equals(order.getApplyChargeStrategy(), Global.YES)
+                && Objects.equals(order.getChargeStrategyType(), ParkingChangeStrategyEnum.BY_TON.getCode());
+    }
+
     /**
      * 判断贸易订单下是否存在运单且所有运单均已完成。
      *
@@ -3633,7 +3646,7 @@ public class KwoTradeOrderService {
     /**
      * 贸易订单完结时,处理收费策略关联的服务费结算
      * <p>
-     * 触发条件:所有运单完成且订单 applyChargeStrategy=1(下单时已冻结服务费)。
+     * 触发条件:所有运单完成且订单 applyChargeStrategy=1、chargeStrategyType=按吨计费(下单时已冻结服务费)。
      * 运输净重量:汇总已完成运单子任务的装/卸货净重(与看板运单完成量统计口径一致)。
      * 扣减逻辑:运输净重量 × 订单下单时快照的收费策略单价(无快照时回退当前策略)
      *
@@ -3646,8 +3659,13 @@ public class KwoTradeOrderService {
                     order.getId(), order.getTOrderNo(), order.getApplyChargeStrategy());
             return;
         }
-        log.info("贸易订单已应用收费策略,开始准备服务费结算,订单ID:{}, 订单号:{}, 收费策略ID:{}, 计费方式:{}",
-                order.getId(), order.getTOrderNo(), order.getChargeStrategyId(), order.getChargeType());
+        if (!isChargeByTonStrategyApplied(order)) {
+            log.info("贸易订单未应用按吨收费策略,跳过服务费解冻及扣减,订单ID:{}, 订单号:{}, 收费策略类型:{}",
+                    order.getId(), order.getTOrderNo(), order.getChargeStrategyType());
+            return;
+        }
+        log.info("贸易订单已应用按吨收费策略,开始准备服务费结算,订单ID:{}, 订单号:{}, 收费策略ID:{}, 收费策略类型:{}, 计费方式:{}",
+                order.getId(), order.getTOrderNo(), order.getChargeStrategyId(), order.getChargeStrategyType(), order.getChargeType());
 
         List<KwoTradeOrderUnit> orderUnits = kwoTradeOrderUnitService.getByOrderId(order.getId());
         if (CollUtil.isEmpty(orderUnits)) {

+ 39 - 0
sckw-modules/sckw-order/src/test/java/com/sckw/order/serivce/KwoTradeOrderServiceTest.java

@@ -1,8 +1,11 @@
 package com.sckw.order.serivce;
 
 import com.sckw.core.exception.BusinessException;
+import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.LogisticsOrderV1Enum;
+import com.sckw.core.model.enums.ParkingChangeStrategyEnum;
 import com.sckw.core.web.response.BaseResult;
+import com.sckw.order.model.KwoTradeOrder;
 import com.sckw.order.model.dto.TradeOrderListSelectDTO;
 import com.sckw.order.model.KwoTradeOrderUnit;
 import com.sckw.system.api.model.dto.res.EntTypeResDto;
@@ -335,4 +338,40 @@ public class KwoTradeOrderServiceTest {
         Assert.assertFalse(KwoTradeOrderService.hasAllLogisticsOrdersCompleted(
                 Arrays.asList(completedOrder, null)));
     }
+
+    /**
+     * 订单应用按吨收费策略时,应允许触发服务费解冻与扣减。
+     */
+    @Test
+    public void isChargeByTonStrategyAppliedWhenByTon() {
+        KwoTradeOrder order = new KwoTradeOrder();
+        order.setApplyChargeStrategy(Global.YES);
+        order.setChargeStrategyType(ParkingChangeStrategyEnum.BY_TON.getCode());
+
+        Assert.assertTrue(KwoTradeOrderService.isChargeByTonStrategyApplied(order));
+    }
+
+    /**
+     * 订单应用非按吨收费策略时,不应触发服务费解冻与扣减。
+     */
+    @Test
+    public void isChargeByTonStrategyAppliedWhenByTime() {
+        KwoTradeOrder order = new KwoTradeOrder();
+        order.setApplyChargeStrategy(Global.YES);
+        order.setChargeStrategyType(ParkingChangeStrategyEnum.BY_TIME.getCode());
+
+        Assert.assertFalse(KwoTradeOrderService.isChargeByTonStrategyApplied(order));
+    }
+
+    /**
+     * 订单未应用收费策略时,不应触发服务费解冻与扣减。
+     */
+    @Test
+    public void isChargeByTonStrategyAppliedWhenNotApplied() {
+        KwoTradeOrder order = new KwoTradeOrder();
+        order.setApplyChargeStrategy(Global.NO);
+        order.setChargeStrategyType(ParkingChangeStrategyEnum.BY_TON.getCode());
+
+        Assert.assertFalse(KwoTradeOrderService.isChargeByTonStrategyApplied(order));
+    }
 }

+ 1 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/ParkingWalletFeeService.java

@@ -506,6 +506,7 @@ public class ParkingWalletFeeService {
 
         result.setApplyChargeStrategy(Global.YES);
         result.setChargeStrategyId(currentStrategy.getId());
+        result.setChargeStrategyType(currentStrategy.getType());
         result.setChargeStrategyDesc(buildStrategyMethodDesc(currentStrategy));
         result.setChargeStrategyAmount(unitFee);
         result.setFreezeAmount(freezeAmount);

+ 2 - 0
sql/2026/07/2026_07_07_add_trade_order_charge_strategy_type.sql

@@ -0,0 +1,2 @@
+ALTER TABLE kwo_trade_order
+    ADD COLUMN charge_strategy_type tinyint DEFAULT NULL COMMENT '应用的收费策略类型(1-按吨计费,2-按次计费,3-按月计费)' AFTER charge_strategy_id;