Selaa lähdekoodia

提交查询固定企业

chenxiaofei 19 tuntia sitten
vanhempi
commit
2ea0dbb437

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

@@ -3523,12 +3523,10 @@ public class KwoTradeOrderService {
         KwoTradeOrder kwoTradeOrderDB = kwoTradeOrderMapper.selectOne(new LambdaQueryWrapper<KwoTradeOrder>().eq(KwoTradeOrder::getId, tradeOrderSettleParam.getId()).eq(KwoTradeOrder::getDelFlag, 0));
         List<KwtLogisticsOrderVO> logisticOrderList = transportRemoteService.getLogisticOrderList(new OrderFinishParam(tradeOrderSettleParam.getId()));
         if (CollUtil.isNotEmpty(logisticOrderList)) {
-            if (logisticOrderList.stream().allMatch(d -> Objects.equals(d.getStatus(), LogisticsOrderV1Enum.NEARING_COMPLETION.getCode()))) {
+            if (logisticOrderList.stream().allMatch(d -> Objects.equals(d.getStatus(), LogisticsOrderV1Enum.COMPLETED.getCode()))) {
                 kwoTradeOrder.setStatus(TradeOrderStatusEnum.SUCCESS.getCode());
                 // 预付钱包完结:解冻 + 按实际装/卸货量消费
                 calculatePrepaidBalance(kwoTradeOrderDB);
-                // 收费策略服务费完结:解冻履约中金额 + 按实际履约量扣减(内部含详细日志)
-                settleChargeStrategyIfApplied(kwoTradeOrderDB, logisticOrderList);
             } else {
                 kwoTradeOrder.setStatus(TradeOrderStatusEnum.DEAL.getCode());
             }
@@ -3541,6 +3539,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"));
@@ -3551,6 +3550,57 @@ public class KwoTradeOrderService {
         return true;
     }
 
+    /**
+     * 物流订单完结后统一处理服务费结算。
+     * <p>
+     * 所有调用 TransportRemoteService.logisticOrderFinish 的场景,均应调用此方法。
+     * 方法内部重新查询订单和运单状态,确保仅在所有运单完成且订单应用收费策略时,
+     * 执行服务费解冻、扣减并记录钱包变动明细。
+     *
+     * @param tradeOrderId 贸易订单ID
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void settleChargeStrategyAfterLogisticOrderFinish(Long 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>

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

@@ -8,6 +8,7 @@ import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.LogisticsOrderV1Enum;
 import com.sckw.core.utils.DateUtils;
 import com.sckw.core.web.constant.HttpStatus;
+import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.response.BaseResult;
 import com.sckw.order.dao.KwoTradeOrderGoodsMapper;
 import com.sckw.order.dao.KwoTradeOrderMapper;
@@ -16,13 +17,16 @@ import com.sckw.order.enums.TradeOrderStatusEnum;
 import com.sckw.order.model.KwoTradeOrder;
 import com.sckw.order.model.KwoTradeOrderGoods;
 import com.sckw.order.model.KwoTradeOrderUnit;
+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.WalletAgentDto;
 import com.sckw.payment.api.model.feign.WalletPrepaidDto;
 import com.sckw.transport.api.dubbo.TransportRemoteService;
 import com.sckw.transport.api.model.param.OrderFinishParam;
+import com.sckw.transport.api.model.param.ParkingWalletFeeFreezeParam;
 import com.sckw.transport.api.model.vo.KwtLogisticsOrderVO;
+import com.sckw.transport.api.model.vo.ParkingWalletFeeFreezeResult;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -58,6 +62,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/5 * * * ?")
@@ -94,6 +100,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());
                             }
@@ -132,6 +139,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());
                                 }
@@ -184,6 +192,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());
                             }

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

@@ -1,12 +1,14 @@
 package com.sckw.order.serivce;
 
 import com.sckw.core.exception.BusinessException;
+import com.sckw.core.model.enums.LogisticsOrderV1Enum;
 import com.sckw.core.web.response.BaseResult;
 import com.sckw.order.model.dto.TradeOrderListSelectDTO;
 import com.sckw.order.model.KwoTradeOrderUnit;
 import com.sckw.system.api.model.dto.res.EntTypeResDto;
 import com.sckw.system.api.model.dto.res.KwsEnterpriseResDto;
 import com.sckw.transport.api.model.param.AddLogisticOrderParam;
+import com.sckw.transport.api.model.vo.KwtLogisticsOrderVO;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -285,4 +287,52 @@ public class KwoTradeOrderServiceTest {
     public void resolveEnterpriseIdByNameWhenEnterpriseMissing() {
         KwoTradeOrderService.resolveEnterpriseIdByName(null, "四川开物信息技术有限公司");
     }
+
+    /**
+     * 运单列表为空时,不应触发服务费完结结算。
+     */
+    @Test
+    public void hasAllLogisticsOrdersCompletedWhenListEmpty() {
+        Assert.assertFalse(KwoTradeOrderService.hasAllLogisticsOrdersCompleted(Collections.emptyList()));
+    }
+
+    /**
+     * 存在未完成运单时,不应触发服务费完结结算。
+     */
+    @Test
+    public void hasAllLogisticsOrdersCompletedWhenOneOrderNotCompleted() {
+        KwtLogisticsOrderVO completedOrder = new KwtLogisticsOrderVO();
+        completedOrder.setStatus(LogisticsOrderV1Enum.COMPLETED.getCode());
+        KwtLogisticsOrderVO runningOrder = new KwtLogisticsOrderVO();
+        runningOrder.setStatus(LogisticsOrderV1Enum.IN_TRANSIT.getCode());
+
+        Assert.assertFalse(KwoTradeOrderService.hasAllLogisticsOrdersCompleted(
+                Arrays.asList(completedOrder, runningOrder)));
+    }
+
+    /**
+     * 所有运单完成时,应允许触发服务费解冻与扣减。
+     */
+    @Test
+    public void hasAllLogisticsOrdersCompletedWhenAllOrdersCompleted() {
+        KwtLogisticsOrderVO firstOrder = new KwtLogisticsOrderVO();
+        firstOrder.setStatus(LogisticsOrderV1Enum.COMPLETED.getCode());
+        KwtLogisticsOrderVO secondOrder = new KwtLogisticsOrderVO();
+        secondOrder.setStatus(LogisticsOrderV1Enum.COMPLETED.getCode());
+
+        Assert.assertTrue(KwoTradeOrderService.hasAllLogisticsOrdersCompleted(
+                Arrays.asList(firstOrder, secondOrder)));
+    }
+
+    /**
+     * 运单列表包含空元素时,不应误判为全部完成。
+     */
+    @Test
+    public void hasAllLogisticsOrdersCompletedWhenListContainsNull() {
+        KwtLogisticsOrderVO completedOrder = new KwtLogisticsOrderVO();
+        completedOrder.setStatus(LogisticsOrderV1Enum.COMPLETED.getCode());
+
+        Assert.assertFalse(KwoTradeOrderService.hasAllLogisticsOrdersCompleted(
+                Arrays.asList(completedOrder, null)));
+    }
 }

+ 2 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtParkingChargeStrategy.java

@@ -49,7 +49,7 @@ public class KwtParkingChargeStrategy implements Serializable {
     /**
      * 创建人
      */
-    private Long createBy;
+    private Long createUser;
 
     /**
      * 创建时间
@@ -59,7 +59,7 @@ public class KwtParkingChargeStrategy implements Serializable {
     /**
      * 创建人更新人
      */
-    private Long updateBy;
+    private Long updateUser;
 
     /**
      * 更新时间

+ 2 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtParkingChargeStrategyUnit.java

@@ -33,7 +33,7 @@ public class KwtParkingChargeStrategyUnit implements Serializable {
     /**
      * 创建人
      */
-    private Long createBy;
+    private Long createUser;
 
     /**
      * 创建时间
@@ -43,7 +43,7 @@ public class KwtParkingChargeStrategyUnit implements Serializable {
     /**
      * 创建人更新人
      */
-    private Long updateBy;
+    private Long updateUser;
 
     /**
      * 更新时间

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/ParkingChangeStrategySaveParam.java

@@ -17,7 +17,7 @@ import java.math.BigDecimal;
  * @create :2026-01-05 08:59:00
  */
 @Data
-public class ParkingChangeStrategySaveParam extends PageReq implements Serializable {
+public class ParkingChangeStrategySaveParam implements Serializable {
 
     @Serial
     private static final long serialVersionUID = -5431003248533000828L;

+ 3 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingChangeStrategyResp.java

@@ -1,5 +1,6 @@
 package com.sckw.transport.model.param;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.io.Serial;
@@ -72,6 +73,7 @@ public class ParkingChangeStrategyResp implements Serializable {
     /**
      * 创建时间
      */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
     /**
@@ -82,6 +84,7 @@ public class ParkingChangeStrategyResp implements Serializable {
     /**
      * 更新时间
      */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 
     /**

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingChangeStrategyUnitSaveParam.java

@@ -16,7 +16,7 @@ import java.util.List;
  * @create :2026-01-05 08:59:00
  */
 @Data
-public class ParkingChangeStrategyUnitSaveParam extends PageReq implements Serializable {
+public class ParkingChangeStrategyUnitSaveParam implements Serializable {
 
     @Serial
     private static final long serialVersionUID = -5431003248533000828L;

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingStrategySwitchSaveParam.java

@@ -17,7 +17,7 @@ import java.util.List;
  * @create :2026-01-05 08:59:00
  */
 @Data
-public class ParkingStrategySwitchSaveParam extends PageReq implements Serializable {
+public class ParkingStrategySwitchSaveParam implements Serializable {
 
     @Serial
     private static final long serialVersionUID = -5431003248533000828L;

+ 0 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/ParkingChangeStrategyService.java

@@ -63,10 +63,6 @@ public class ParkingChangeStrategyService {
      */
     public PageDataResult<ParkingChangeStrategyResp> pageQueryChangeStrategy(ParkingChangeStrategyQueryParam param) {
         log.info("分页查询收费策略:{}", JSON.toJSONString(param));
-        if (param.getEntId() == null) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "平台企业id不能为空!");
-        }
-
         //构建查询条件
         LambdaQueryWrapper<KwtParkingChargeStrategy> wrapper = buildAndExecuteQuery(param);