Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/dev_20251130' into dev_20251130

donglang 2 settimane fa
parent
commit
f31defeeea
14 ha cambiato i file con 387 aggiunte e 280 eliminazioni
  1. 12 4
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/LocUtils.java
  2. 8 1
      sckw-modules-api/sckw-payment-api/src/main/java/com/sckw/payment/api/dubbo/PaymentDubboService.java
  3. 0 28
      sckw-modules-api/sckw-payment-api/src/main/java/com/sckw/payment/api/feign/WalletApi.java
  4. 4 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/VehicleDataDTO.java
  5. 7 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java
  6. 1 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderParam.java
  7. 6 7
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java
  8. 8 4
      sckw-modules/sckw-order/src/main/java/com/sckw/order/task/TradeOrderTask.java
  9. 0 20
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/controller/KwpBizWalletController.java
  10. 157 1
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/dubbo/PaymentDubboServiceImpl.java
  11. 0 142
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/wallet/KwpBizWalletService.java
  12. 38 28
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java
  13. 39 21
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java
  14. 107 24
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/kwfTruckTraceService.java

+ 12 - 4
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/LocUtils.java

@@ -110,10 +110,16 @@ public class LocUtils {
             }
             
             // 从所有点位中均匀选取指定数量的点
-            List<RoutePoint> selectedPoints = selectUniformPoints(allPoints, pointCount);
-            
+            //List<RoutePoint> selectedPoints = selectUniformPoints(allPoints, pointCount);
+            LocalDateTime now = LocalDateTime.now();
+            for (int i = 0; i < allPoints.size(); i++) {
+                RoutePoint point = allPoints.get(i);
+                point.setTs(now.plusMinutes(i * 5L));
+               // selectedPoints.add(point);
+            }
+
             RouteResult result = new RouteResult();
-            result.setPointInfo(JSON.toJSONString(selectedPoints));
+            result.setPointInfo(JSON.toJSONString(allPoints));
             result.setDuration(duration);
             
             return result;
@@ -189,7 +195,9 @@ public class LocUtils {
     private static List<RoutePoint> selectUniformPoints(List<RoutePoint> allPoints, int pointCount) {
         List<RoutePoint> selectedPoints = new ArrayList<>();
         
-        if (allPoints.isEmpty()) return selectedPoints;
+        if (allPoints.isEmpty()) {
+            return selectedPoints;
+        }
         
         if (allPoints.size() <= pointCount) {
             LocalDateTime now = LocalDateTime.now();

+ 8 - 1
sckw-modules-api/sckw-payment-api/src/main/java/com/sckw/payment/api/dubbo/PaymentDubboService.java

@@ -1,6 +1,8 @@
 package com.sckw.payment.api.dubbo;
 
+import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
+import com.sckw.payment.api.model.WalletFreeze;
 import com.sckw.payment.api.model.constant.ChannelEnum;
 import com.sckw.payment.api.model.constant.OrderEnum;
 import com.sckw.payment.api.model.dto.LedgerCount;
@@ -49,7 +51,7 @@ public interface PaymentDubboService {
      * @param entId 集团id
      * @return
      */
-    LedgerCount countLedger(Long entId,List<Long> enterpriseIds);
+    LedgerCount countLedger(Long entId, List<Long> enterpriseIds);
 
     //工作台金额统计数据四个接口
 
@@ -85,4 +87,9 @@ public interface PaymentDubboService {
      */
     SettlementMoney countShipper(Long entId, Integer countType);
 
+    BaseResult<Boolean> freezeMoney(WalletFreeze walletFreeze);
+
+    BaseResult<Boolean> unfreezeMoney(WalletFreeze walletFreeze);
+
+    BaseResult<Boolean> dealMoney(WalletFreeze walletFreeze);
 }

+ 0 - 28
sckw-modules-api/sckw-payment-api/src/main/java/com/sckw/payment/api/feign/WalletApi.java

@@ -1,28 +0,0 @@
-package com.sckw.payment.api.feign;
-
-import com.sckw.core.web.response.BaseResult;
-import com.sckw.payment.api.model.WalletFreeze;
-import jakarta.validation.Valid;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-
-@FeignClient(name = "sckw-ng-payment", path = "/biz/wallet")
-public interface WalletApi {
-    /**
-     * 下单时冻结金额
-     *
-     */
-    @PostMapping("/freezeMoney")
-    BaseResult<Boolean> freezeMoney(@RequestBody @Valid WalletFreeze walletFreeze);
-    @PostMapping("/unfreezeMoney")
-    BaseResult<Boolean> unfreezeMoney(@RequestBody @Valid WalletFreeze walletFreeze);
-
-    /**
-     * 结算
-     *
-     */
-    @PostMapping("/dealMoney")
-    BaseResult<Boolean> dealMoney(@RequestBody @Valid WalletFreeze walletFreeze);
-
-}

+ 4 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/VehicleDataDTO.java

@@ -19,6 +19,10 @@ public class VehicleDataDTO implements Serializable {
      * 运单号
      */
     private String wOrderNo;
+    /**
+     * 订单号
+     */
+    private String orderNo;
 
     /**
      * 车牌号

+ 7 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java

@@ -1835,6 +1835,13 @@ public class KwcContractTradeService {
         }
         Date date = new Date();
         logistics = logistics.stream()
+                .peek(log -> {
+                    if (Objects.isNull(log.getEndTime())){
+                        LocalDate localDate = LocalDate.of(9999, 12, 30);
+                        Date date1 = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
+                        log.setEndTime(date1);
+                    }
+                })
                 .filter(log -> Objects.nonNull(log.getStartTime()) && Objects.nonNull(log.getEndTime()))
                 .filter(log -> Objects.equals(log.getStatus(), ContractStatusEnum.SIGNED.getCode())
                         && log.getStartTime().before(date) && log.getEndTime().after(date))

+ 1 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderParam.java

@@ -37,6 +37,7 @@ public class TradeOrderParam {
     @NotBlank(message = "贸易合同名称不能为空")
     @Schema(description = "贸易合同名称")
     private String tradeContractName;
+    private String tradeContractNo;
     /**
      * 订单总量
      */

+ 6 - 7
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -54,7 +54,6 @@ import com.sckw.order.model.vo.res.OrderDetailRes;
 import com.sckw.order.model.vo.res.UnitInfoDetailRes;
 import com.sckw.payment.api.dubbo.PayCenterDubboService;
 import com.sckw.payment.api.dubbo.PaymentDubboService;
-import com.sckw.payment.api.feign.WalletApi;
 import com.sckw.payment.api.model.WalletFreeze;
 import com.sckw.payment.api.model.constant.ChannelEnum;
 import com.sckw.payment.api.model.dto.WalletDto;
@@ -142,7 +141,6 @@ public class KwoTradeOrderService {
     private final KwoTradeOrderGoodsUnitService kwoTradeOrderGoodsUnitService;
     private final KwoTradeOrderAmountService tradeOrderAmountService;
     private final KwoTradeOrderTransportService kwoTradeOrderTransportService;
-    private final WalletApi walletApi;
     @Value("${url.order.list.valet.pc}")
     private String pcValetListUrl;
 
@@ -2004,7 +2002,7 @@ public class KwoTradeOrderService {
 
         KwoTradeOrderContract kwoTradeOrderContract = new KwoTradeOrderContract();
         kwoTradeOrderContract.setContractId(tradeOrderParam.getTradeContractId());
-        kwoTradeOrderContract.setContractNo(tradeOrderParam.getTradeContractName());
+        kwoTradeOrderContract.setContractNo(tradeOrderParam.getTradeContractNo());
         kwoTradeOrderContract.setTOrderId(order.getId());
         kwoTradeOrderContract.setTOrderNo(order.getTOrderNo());
         kwoTradeOrderContract.setId(new IdWorker(1).nextId());
@@ -2055,7 +2053,7 @@ public class KwoTradeOrderService {
         });
         kwoTradeOrderUnitService.insertBatch(list);
         //钱包
-        BaseResult<Boolean> booleanBaseResult = walletApi.freezeMoney(walletFreeze);
+        BaseResult<Boolean> booleanBaseResult = paymentDubboService.freezeMoney(walletFreeze);
         if (booleanBaseResult.getCode() != 60200) {
             throw new BusinessException(booleanBaseResult.getMessage());
         }
@@ -2081,6 +2079,7 @@ public class KwoTradeOrderService {
         if (Objects.isNull(goodsInfoDto)) {
             throw new BusinessException("当前贸易订单不存在交易商品");
         }
+        tradeOrderParam.setTradeContractNo(tradeContractResDto.getContractNo());
         order.setUnit(goodsById.getUnit());
         order.setPickupType(String.valueOf(tradeContractResDto.getConsignment()));//来源于合同约束的托运方式
         order.setDeliveryType("");
@@ -2091,6 +2090,7 @@ public class KwoTradeOrderService {
         order.setLoadAmount(new BigDecimal("0"));
         order.setUnloadAmount(new BigDecimal("0"));
         order.setChargeType(tradeContractResDto.getUnloadWay());
+        order.setDispatchWay(tradeContractResDto.getDispatchWay());
         order.setConsignmentWay(tradeContractResDto.getConsignment());
         order.setDispatchWay(tradeContractResDto.getDispatchWay());
         order.setEntId(LoginUserHolder.getEntId()).setTOrderNo(getOrderNo()).setAmount(tradeOrderParam.getAmount()).setStartTime(DateUtils.localDateToDateStart(tradeOrderParam.getStartTime())).setEndTime(DateUtils.localDateToDateEnd(tradeOrderParam.getEndTime())).setSource(OrderSourceEnum.PURCHASE.getType()).setStatus(TradeOrderStatusEnum.AUDIT.getCode()).setRemark(tradeOrderParam.getRemark());
@@ -2137,7 +2137,7 @@ public class KwoTradeOrderService {
             WalletFreeze walletFreeze = new WalletFreeze();
             walletFreeze.setTTradeOrderId(kwoTradeOrder.getId());
             walletFreeze.setOrderNo(kwoTradeOrder.getTOrderNo());
-            BaseResult<Boolean> booleanBaseResult = walletApi.unfreezeMoney(walletFreeze);
+            BaseResult<Boolean> booleanBaseResult = paymentDubboService.unfreezeMoney(walletFreeze);
             if (booleanBaseResult.getCode() != 60200) {
                 throw new BusinessException(booleanBaseResult.getMessage());
             }
@@ -2163,8 +2163,7 @@ public class KwoTradeOrderService {
         Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(List.of(DictTypeEnum.UNIT_TYPE.getType()));
         List<LogisticsEntDtoVO> validContractLog = new ArrayList<>();
         List<LogisticsEntDto> logisticsContractId = new ArrayList<>();
-        if (Objects.equals(DispatchWayEnums.AUTO_DISPATCH.getCode(), tradeContractResDto.getDispatchWay())
-                && Objects.equals(tradeOrderAuditParam.getStatus(), Global.NUMERICAL_ONE)) {
+        if (Objects.equals(DispatchWayEnums.AUTO_DISPATCH.getCode(), tradeContractResDto.getDispatchWay()) && Objects.equals(tradeOrderAuditParam.getStatus(), Global.NUMERICAL_ONE)) {
             //自动派单校验: 判断当前有无包含该商品的有效自动派车物流合同
             validContractLog = checkAutoContractLogOrder(unitMap, byOrderId, tradeContractResDto);
         } else {

+ 8 - 4
sckw-modules/sckw-order/src/main/java/com/sckw/order/task/TradeOrderTask.java

@@ -13,7 +13,7 @@ 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.payment.api.feign.WalletApi;
+import com.sckw.payment.api.dubbo.PaymentDubboService;
 import com.sckw.payment.api.model.WalletFreeze;
 import com.sckw.transport.api.dubbo.TransportRemoteService;
 import com.sckw.transport.api.model.param.OrderFinishParam;
@@ -47,14 +47,15 @@ public class TradeOrderTask {
     private KwoTradeOrderUnitMapper kwoTradeOrderUnitMapper;
     @Resource
     private KwoTradeOrderGoodsMapper kwoTradeOrderGoodsMapper;
-    @Resource
-    private WalletApi walletApi;
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     private TransportRemoteService transportRemoteService;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
+    private PaymentDubboService paymentDubboService;
     private final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 2, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(20));
 
     @Scheduled(cron = "0 0/5 * * * ?")
     public void task() {
+        log.info("定时任务");
         List<KwoTradeOrder> kwoTradeOrders = kwoTradeOrderMapper.selectList(new LambdaQueryWrapper<KwoTradeOrder>()
                 .eq(KwoTradeOrder::getStatus, TradeOrderStatusEnum.DEAL.getCode())
                 .eq(KwoTradeOrder::getDelFlag, Global.UN_DELETED)
@@ -96,7 +97,10 @@ public class TradeOrderTask {
                         walletFreeze.setTTradeOrderId(kwoTradeOrder.getId());
                         walletFreeze.setOrderNo(kwoTradeOrder.getTOrderNo());
                         log.info("结算 {}", JSONObject.toJSONString(walletFreeze));
-                        walletApi.dealMoney(walletFreeze);
+                        paymentDubboService.dealMoney(walletFreeze);
+
+                        kwoTradeOrder.setStatus(TradeOrderStatusEnum.SUCCESS.getCode());
+                        kwoTradeOrderMapper.updateById(kwoTradeOrder);
                     } catch (Exception ex) {
                         log.error("更新订单异常{}", ex.getMessage());
                     }

+ 0 - 20
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/controller/KwpBizWalletController.java

@@ -4,7 +4,6 @@ package com.sckw.payment.controller;
 import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.excel.utils.ExcelUtil;
-import com.sckw.payment.api.model.WalletFreeze;
 import com.sckw.payment.repose.KwpBizWalletPageResponse;
 import com.sckw.payment.repose.KwpBizWalletPrepayPageResponse;
 import com.sckw.payment.repose.vo.KwpBizWalletPrepayExcelVO;
@@ -123,24 +122,5 @@ public class KwpBizWalletController {
         ExcelUtil.downData(response, KwpBizWalletPrepayExcelVO.class, excelVOList);
     }
 
-    /**
-     * 冻结金额
-     */
-    @Operation(summary = "冻结金额", description = "冻结金额")
-    @PostMapping("/freezeMoney")
-    public BaseResult<Boolean> freezeMoney(@RequestBody @Validated WalletFreeze walletFreeze) {
-        return kwpBizWalletService.freezeMoney(walletFreeze);
-    }
 
-    @Operation(summary = "解冻金额", description = "解冻金额")
-    @PostMapping("/unfreezeMoney")
-    public BaseResult<Boolean> unfreezeMoney(@RequestBody @Validated WalletFreeze walletFreeze) {
-        return kwpBizWalletService.unfreezeMoney(walletFreeze);
-    }
-
-    @Operation(summary = "结算金额", description = "结算金额")
-    @PostMapping("/dealMoney")
-    public BaseResult<Boolean> dealMoney(@RequestBody @Validated WalletFreeze walletFreeze) {
-        return kwpBizWalletService.dealMoney(walletFreeze);
-    }
 }

+ 157 - 1
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/dubbo/PaymentDubboServiceImpl.java

@@ -1,26 +1,37 @@
 package com.sckw.payment.dubbo;
 
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.sckw.core.exception.BusinessException;
+import com.sckw.core.utils.DateTimeUtil;
 import com.sckw.core.utils.OrderUtils;
 import com.sckw.core.web.constant.HttpStatus;
+import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.payment.api.dubbo.PaymentDubboService;
+import com.sckw.payment.api.model.WalletFreeze;
 import com.sckw.payment.api.model.constant.ChannelEnum;
 import com.sckw.payment.api.model.constant.OrderEnum;
 import com.sckw.payment.api.model.dto.LedgerCount;
 import com.sckw.payment.api.model.dto.SettlementMoney;
+import com.sckw.payment.dao.KwpBizWalletMapper;
+import com.sckw.payment.dao.KwpBizWalletPrepayMapper;
+import com.sckw.payment.model.KwpBizWallet;
+import com.sckw.payment.model.KwpBizWalletPrepay;
 import com.sckw.payment.model.constant.LogisticsUnitType;
 import com.sckw.payment.model.constant.TradeUnitType;
 import com.sckw.payment.model.dto.LedgerSize;
 import com.sckw.payment.model.dto.MoneyType;
 import com.sckw.payment.service.*;
-import com.sckw.core.utils.DateTimeUtil;
 import com.sckw.payment.utils.DecimalUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
@@ -43,6 +54,8 @@ public class PaymentDubboServiceImpl implements PaymentDubboService {
     private final KwpSettlementTradeService kwpSettlementTradeService;
     private final WalletService walletService;
     private final KwpTradeFreezeService kwpTradeFreezeService;
+    private final KwpBizWalletPrepayMapper kwpBizWalletPrepayMapper;
+    private final KwpBizWalletMapper kwpBizWalletMapper;
 
 
     private SettlementMoney change(List<MoneyType> moneyType) {
@@ -229,5 +242,148 @@ public class PaymentDubboServiceImpl implements PaymentDubboService {
         List<MoneyType> moneyType = kwpSettlementLogisticsService.moneySum(entId, cur, pre, LogisticsUnitType.SHIPPER);
         return change(moneyType);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public BaseResult<Boolean> freezeMoney(WalletFreeze walletFreeze) {
+        log.info("冻结钱包:{}", JSONObject.toJSONString(walletFreeze));
+        KwpBizWallet one = kwpBizWalletMapper.selectOne(new LambdaQueryWrapper<KwpBizWallet>()
+                .eq(KwpBizWallet::getSupEntId, walletFreeze.getSaleEntId())
+                .eq(KwpBizWallet::getProEntId, walletFreeze.getBuyEntId()).eq(KwpBizWallet::getState, 1)
+        );
+        if (Objects.isNull(one)) {
+            return BaseResult.failed("钱包不存在,请核实");
+        }
+        BigDecimal amount = one.getAmount();
+        if (NumberUtil.isLess(amount, walletFreeze.getMoney())) {
+            return BaseResult.failed("可用余额不足");
+        }
+        one.setAmount(NumberUtil.sub(amount, walletFreeze.getMoney()));
+        one.setPrepayAmount(NumberUtil.add(one.getPrepayAmount(), walletFreeze.getMoney()));
+        one.setUpdateUser(LoginUserHolder.getUserName());
+        kwpBizWalletMapper.updateById(one);
+        //新增订单
+        KwpBizWalletPrepay kwpBizWalletPrepay = new KwpBizWalletPrepay();
+        kwpBizWalletPrepay.setWalletId(one.getId());
+        kwpBizWalletPrepay.setOrderId(walletFreeze.getTTradeOrderId());
+        kwpBizWalletPrepay.setChangeAmount(walletFreeze.getMoney());
+        kwpBizWalletPrepay.setAmount(one.getAmount());
+        kwpBizWalletPrepay.setPrepayAmount(one.getPrepayAmount());
+        kwpBizWalletPrepay.setType(2);
+        kwpBizWalletPrepay.setRemark(StrUtil.format("[订单号:{}]冻结", walletFreeze.getOrderNo()));
+        kwpBizWalletPrepay.setVoucherUrl("");
+        kwpBizWalletPrepay.setCreateTime(new Date());
+        kwpBizWalletPrepay.setUpdateTime(new Date());
+        kwpBizWalletPrepay.setCreateUser(LoginUserHolder.getUserName());
+        kwpBizWalletPrepay.setUpdateUser(LoginUserHolder.getUserName());
+
+        kwpBizWalletPrepayMapper.insert(kwpBizWalletPrepay);
+        return BaseResult.success();
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public BaseResult<Boolean> dealMoney(WalletFreeze walletFreeze) {
+        log.info("钱包结算 {}", JSONObject.toJSONString(walletFreeze));
+        Long tTradeOrderId = walletFreeze.getTTradeOrderId();
+        KwpBizWalletPrepay one = kwpBizWalletPrepayMapper.selectOne(new LambdaQueryWrapper<KwpBizWalletPrepay>()
+                .eq(KwpBizWalletPrepay::getOrderId, tTradeOrderId)
+                .eq(KwpBizWalletPrepay::getType, 2)
+                .last("limit 1")
+        );
+        if (Objects.isNull(one)) {
+            return BaseResult.failed("冻结订单不存在");
+        }
+
+        KwpBizWallet wallet = kwpBizWalletMapper.selectById(one.getWalletId());
+        if (Objects.isNull(wallet) || Objects.equals(wallet.getState(), 0)) {
+            return BaseResult.failed("钱包不存在或状态异常");
+        }
+        BigDecimal changeAmount = one.getChangeAmount();//冻结金额
+        //钱包实际可用
+        BigDecimal amount = wallet.getAmount();
+        //新增解冻订单
+        amount = NumberUtil.add(amount, changeAmount);
+        KwpBizWalletPrepay kwpBizWalletPrepay = new KwpBizWalletPrepay();
+        kwpBizWalletPrepay.setWalletId(one.getId());
+        kwpBizWalletPrepay.setOrderId(walletFreeze.getTTradeOrderId());
+        kwpBizWalletPrepay.setChangeAmount(changeAmount);
+        kwpBizWalletPrepay.setAmount(amount);
+        kwpBizWalletPrepay.setPrepayAmount(NumberUtil.sub(wallet.getPrepayAmount(), changeAmount));
+        kwpBizWalletPrepay.setType(3);
+        kwpBizWalletPrepay.setRemark(StrUtil.format("[{}][结算]解冻订单总金额", walletFreeze.getOrderNo()));
+        kwpBizWalletPrepay.setVoucherUrl("");
+        kwpBizWalletPrepay.setCreateTime(new Date());
+        kwpBizWalletPrepay.setUpdateTime(new Date());
+        kwpBizWalletPrepay.setCreateUser(LoginUserHolder.getUserName());
+        kwpBizWalletPrepay.setUpdateUser(LoginUserHolder.getUserName());
+        kwpBizWalletPrepayMapper.insert(kwpBizWalletPrepay);
+
+        //新增消费订单
+        KwpBizWalletPrepay kwpBizWalletPrepay2 = new KwpBizWalletPrepay();
+        kwpBizWalletPrepay2.setWalletId(one.getId());
+        kwpBizWalletPrepay2.setOrderId(walletFreeze.getTTradeOrderId());
+        kwpBizWalletPrepay2.setChangeAmount(walletFreeze.getMoney());
+        kwpBizWalletPrepay2.setAmount(NumberUtil.sub(amount, walletFreeze.getMoney()));
+        kwpBizWalletPrepay2.setPrepayAmount(kwpBizWalletPrepay.getPrepayAmount());
+        kwpBizWalletPrepay2.setType(4);
+        kwpBizWalletPrepay2.setRemark(StrUtil.format("[{}][结算]扣除订单总金额", walletFreeze.getOrderNo()));
+        kwpBizWalletPrepay2.setVoucherUrl("");
+        kwpBizWalletPrepay2.setCreateTime(new Date());
+        kwpBizWalletPrepay2.setUpdateTime(new Date());
+        kwpBizWalletPrepay2.setCreateUser(LoginUserHolder.getUserName());
+        kwpBizWalletPrepay2.setUpdateUser(LoginUserHolder.getUserName());
+        kwpBizWalletPrepayMapper.insert(kwpBizWalletPrepay2);
+
+        wallet.setAmount(kwpBizWalletPrepay2.getAmount());
+        wallet.setPrepayAmount(kwpBizWalletPrepay2.getPrepayAmount());
+        kwpBizWalletMapper.updateById(wallet);
+        return BaseResult.success();
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public BaseResult<Boolean> unfreezeMoney(WalletFreeze walletFreeze) {
+        log.info("解冻钱包:{}", JSONObject.toJSONString(walletFreeze));
+        Long tTradeOrderId = walletFreeze.getTTradeOrderId();
+        KwpBizWalletPrepay one = kwpBizWalletPrepayMapper.selectOne(new LambdaQueryWrapper<KwpBizWalletPrepay>()
+                .eq(KwpBizWalletPrepay::getOrderId, tTradeOrderId)
+                .eq(KwpBizWalletPrepay::getType, 2)
+                .last("limit 1")
+        );
+        if (Objects.isNull(one)) {
+            return BaseResult.failed("冻结订单不存在");
+        }
+
+        KwpBizWallet wallet = kwpBizWalletMapper.selectById(one.getWalletId());
+        if (Objects.isNull(wallet) || Objects.equals(wallet.getState(), 0)) {
+            return BaseResult.failed("钱包不存在或状态异常");
+        }
+        BigDecimal changeAmount = one.getChangeAmount();//冻结金额
+        //钱包实际可用
+        BigDecimal amount = wallet.getAmount();
+        //新增解冻订单
+        amount = NumberUtil.add(amount, changeAmount);
+        KwpBizWalletPrepay kwpBizWalletPrepay = new KwpBizWalletPrepay();
+        kwpBizWalletPrepay.setWalletId(one.getId());
+        kwpBizWalletPrepay.setOrderId(walletFreeze.getTTradeOrderId());
+        kwpBizWalletPrepay.setChangeAmount(changeAmount);
+        kwpBizWalletPrepay.setAmount(amount);
+        kwpBizWalletPrepay.setPrepayAmount(NumberUtil.sub(wallet.getPrepayAmount(), changeAmount));
+        kwpBizWalletPrepay.setType(3);
+        kwpBizWalletPrepay.setRemark(StrUtil.format("[订单号:{}]解冻", walletFreeze.getOrderNo()));
+        kwpBizWalletPrepay.setVoucherUrl("");
+        kwpBizWalletPrepay.setCreateTime(new Date());
+        kwpBizWalletPrepay.setUpdateTime(new Date());
+        kwpBizWalletPrepay.setCreateUser(LoginUserHolder.getUserName());
+        kwpBizWalletPrepay.setUpdateUser(LoginUserHolder.getUserName());
+        kwpBizWalletPrepayMapper.insert(kwpBizWalletPrepay);
+
+
+        wallet.setAmount(amount);
+        wallet.setPrepayAmount(kwpBizWalletPrepay.getPrepayAmount());
+        kwpBizWalletMapper.updateById(wallet);
+        return BaseResult.success();
+    }
 }
 

+ 0 - 142
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/wallet/KwpBizWalletService.java

@@ -1,7 +1,5 @@
 package com.sckw.payment.service.wallet;
 
-import cn.hutool.core.util.NumberUtil;
-import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -12,9 +10,7 @@ import com.sckw.core.common.enums.StringConstant;
 import com.sckw.core.model.enums.EntTypeEnum;
 import com.sckw.core.model.enums.SystemTypeEnum;
 import com.sckw.core.web.context.LoginUserHolder;
-import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.result.PageDataResult;
-import com.sckw.payment.api.model.WalletFreeze;
 import com.sckw.payment.enums.PrepayTypEnum;
 import com.sckw.payment.model.KwpBizWallet;
 import com.sckw.payment.model.KwpBizWalletPrepay;
@@ -471,142 +467,4 @@ public class KwpBizWalletService {
         log.info("钱包冻账明细导出成功,结果:{}", JSONObject.toJSONString(walletPrepayPageResult));
         return walletPrepayExcelVO;
     }
-
-    @Transactional(rollbackFor = Exception.class)
-    public BaseResult<Boolean> freezeMoney(WalletFreeze walletFreeze) {
-        log.info("冻结钱包:{}", JSONObject.toJSONString(walletFreeze));
-        KwpBizWallet one = kwpBizWalletRepository.getOne(new LambdaQueryWrapper<KwpBizWallet>()
-                .eq(KwpBizWallet::getSupEntId, walletFreeze.getSaleEntId())
-                .eq(KwpBizWallet::getProEntId, walletFreeze.getBuyEntId()).eq(KwpBizWallet::getState, 1)
-        );
-        if (Objects.isNull(one)) {
-            return BaseResult.failed("钱包不存在,请核实");
-        }
-        BigDecimal amount = one.getAmount();
-        if (NumberUtil.isLess(amount, walletFreeze.getMoney())) {
-            return BaseResult.failed("可用余额不足");
-        }
-        one.setAmount(NumberUtil.sub(amount, walletFreeze.getMoney()));
-        one.setPrepayAmount(NumberUtil.add(one.getPrepayAmount(), walletFreeze.getMoney()));
-        one.setUpdateUser(LoginUserHolder.getUserName());
-        kwpBizWalletRepository.updateById(one);
-        //新增订单
-        KwpBizWalletPrepay kwpBizWalletPrepay = new KwpBizWalletPrepay();
-        kwpBizWalletPrepay.setWalletId(one.getId());
-        kwpBizWalletPrepay.setOrderId(walletFreeze.getTTradeOrderId());
-        kwpBizWalletPrepay.setChangeAmount(walletFreeze.getMoney());
-        kwpBizWalletPrepay.setAmount(one.getAmount());
-        kwpBizWalletPrepay.setPrepayAmount(one.getPrepayAmount());
-        kwpBizWalletPrepay.setType(2);
-        kwpBizWalletPrepay.setRemark(StrUtil.format("[订单号:{}]冻结", walletFreeze.getOrderNo()));
-        kwpBizWalletPrepay.setVoucherUrl("");
-        kwpBizWalletPrepay.setCreateTime(new Date());
-        kwpBizWalletPrepay.setUpdateTime(new Date());
-        kwpBizWalletPrepay.setCreateUser(LoginUserHolder.getUserName());
-        kwpBizWalletPrepay.setUpdateUser(LoginUserHolder.getUserName());
-        kwpBizWalletPrepayRepository.save(kwpBizWalletPrepay);
-        return BaseResult.success();
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    public BaseResult<Boolean> dealMoney(WalletFreeze walletFreeze) {
-        Long tTradeOrderId = walletFreeze.getTTradeOrderId();
-        KwpBizWalletPrepay one = kwpBizWalletPrepayRepository.getOne(new LambdaQueryWrapper<KwpBizWalletPrepay>()
-                .eq(KwpBizWalletPrepay::getOrderId, tTradeOrderId)
-                .eq(KwpBizWalletPrepay::getType, 2)
-                .last("limit 1")
-        );
-        if (Objects.isNull(one)) {
-            return BaseResult.failed("冻结订单不存在");
-        }
-
-        KwpBizWallet wallet = kwpBizWalletRepository.getById(one.getWalletId());
-        if (Objects.isNull(wallet) || Objects.equals(wallet.getState(), 0)) {
-            return BaseResult.failed("钱包不存在或状态异常");
-        }
-        BigDecimal changeAmount = one.getChangeAmount();//冻结金额
-        //钱包实际可用
-        BigDecimal amount = wallet.getAmount();
-        //新增解冻订单
-        amount = NumberUtil.add(amount, changeAmount);
-        KwpBizWalletPrepay kwpBizWalletPrepay = new KwpBizWalletPrepay();
-        kwpBizWalletPrepay.setWalletId(one.getId());
-        kwpBizWalletPrepay.setOrderId(walletFreeze.getTTradeOrderId());
-        kwpBizWalletPrepay.setChangeAmount(changeAmount);
-        kwpBizWalletPrepay.setAmount(amount);
-        kwpBizWalletPrepay.setPrepayAmount(NumberUtil.sub(wallet.getPrepayAmount(), changeAmount));
-        kwpBizWalletPrepay.setType(3);
-        kwpBizWalletPrepay.setRemark(StrUtil.format("[{}][结算]解冻订单总金额", walletFreeze.getOrderNo()));
-        kwpBizWalletPrepay.setVoucherUrl("");
-        kwpBizWalletPrepay.setCreateTime(new Date());
-        kwpBizWalletPrepay.setUpdateTime(new Date());
-        kwpBizWalletPrepay.setCreateUser(LoginUserHolder.getUserName());
-        kwpBizWalletPrepay.setUpdateUser(LoginUserHolder.getUserName());
-        kwpBizWalletPrepayRepository.save(kwpBizWalletPrepay);
-
-        //新增消费订单
-        KwpBizWalletPrepay kwpBizWalletPrepay2 = new KwpBizWalletPrepay();
-        kwpBizWalletPrepay2.setWalletId(one.getId());
-        kwpBizWalletPrepay2.setOrderId(walletFreeze.getTTradeOrderId());
-        kwpBizWalletPrepay2.setChangeAmount(walletFreeze.getMoney());
-        kwpBizWalletPrepay2.setAmount(NumberUtil.sub(amount, walletFreeze.getMoney()));
-        kwpBizWalletPrepay2.setPrepayAmount(kwpBizWalletPrepay.getPrepayAmount());
-        kwpBizWalletPrepay2.setType(4);
-        kwpBizWalletPrepay2.setRemark(StrUtil.format("[{}][结算]扣除订单总金额", walletFreeze.getOrderNo()));
-        kwpBizWalletPrepay2.setVoucherUrl("");
-        kwpBizWalletPrepay2.setCreateTime(new Date());
-        kwpBizWalletPrepay2.setUpdateTime(new Date());
-        kwpBizWalletPrepay2.setCreateUser(LoginUserHolder.getUserName());
-        kwpBizWalletPrepay2.setUpdateUser(LoginUserHolder.getUserName());
-        kwpBizWalletPrepayRepository.save(kwpBizWalletPrepay);
-
-        wallet.setAmount(kwpBizWalletPrepay2.getAmount());
-        wallet.setPrepayAmount(kwpBizWalletPrepay2.getPrepayAmount());
-        kwpBizWalletRepository.updateById(wallet);
-        return BaseResult.success();
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    public BaseResult<Boolean> unfreezeMoney(WalletFreeze walletFreeze) {
-        log.info("解冻钱包:{}", JSONObject.toJSONString(walletFreeze));
-        Long tTradeOrderId = walletFreeze.getTTradeOrderId();
-        KwpBizWalletPrepay one = kwpBizWalletPrepayRepository.getOne(new LambdaQueryWrapper<KwpBizWalletPrepay>()
-                .eq(KwpBizWalletPrepay::getOrderId, tTradeOrderId)
-                .eq(KwpBizWalletPrepay::getType, 2)
-                .last("limit 1")
-        );
-        if (Objects.isNull(one)) {
-            return BaseResult.failed("冻结订单不存在");
-        }
-
-        KwpBizWallet wallet = kwpBizWalletRepository.getById(one.getWalletId());
-        if (Objects.isNull(wallet) || Objects.equals(wallet.getState(), 0)) {
-            return BaseResult.failed("钱包不存在或状态异常");
-        }
-        BigDecimal changeAmount = one.getChangeAmount();//冻结金额
-        //钱包实际可用
-        BigDecimal amount = wallet.getAmount();
-        //新增解冻订单
-        amount = NumberUtil.add(amount, changeAmount);
-        KwpBizWalletPrepay kwpBizWalletPrepay = new KwpBizWalletPrepay();
-        kwpBizWalletPrepay.setWalletId(one.getId());
-        kwpBizWalletPrepay.setOrderId(walletFreeze.getTTradeOrderId());
-        kwpBizWalletPrepay.setChangeAmount(changeAmount);
-        kwpBizWalletPrepay.setAmount(amount);
-        kwpBizWalletPrepay.setPrepayAmount(NumberUtil.sub(wallet.getPrepayAmount(), changeAmount));
-        kwpBizWalletPrepay.setType(3);
-        kwpBizWalletPrepay.setRemark(StrUtil.format("[订单号:{}]解冻", walletFreeze.getOrderNo()));
-        kwpBizWalletPrepay.setVoucherUrl("");
-        kwpBizWalletPrepay.setCreateTime(new Date());
-        kwpBizWalletPrepay.setUpdateTime(new Date());
-        kwpBizWalletPrepay.setCreateUser(LoginUserHolder.getUserName());
-        kwpBizWalletPrepay.setUpdateUser(LoginUserHolder.getUserName());
-        kwpBizWalletPrepayRepository.save(kwpBizWalletPrepay);
-
-
-        wallet.setAmount(amount);
-        wallet.setPrepayAmount(kwpBizWalletPrepay.getPrepayAmount());
-        kwpBizWalletRepository.updateById(wallet);
-        return BaseResult.success();
-    }
 }

+ 38 - 28
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java

@@ -2244,7 +2244,8 @@ public class KwtLogisticsConsignmentService {
 
         //根据商品名称查询物流订单
         Set<Long> logOrderIds = getLogOrderIds(req, entList, allEnt);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logOrderIds) && org.apache.commons.collections4.CollectionUtils.isNotEmpty(entList)) {
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logOrderIds) && (org.apache.commons.collections4.CollectionUtils.isNotEmpty(entList)
+                || !org.apache.commons.lang3.StringUtils.isAllBlank(req.getContractId(),req.getGoodsName()))) {
             return PageDataResult.empty(req.getPageNum(), req.getPageSize());
         }
 
@@ -2385,12 +2386,34 @@ public class KwtLogisticsConsignmentService {
     @NotNull
     private Set<Long> getLogOrderIds(QueryLogisticsOrderReq req, Set<Long> entList, Set<Long> allEnt) {
         Set<Long> logOrderIds = Sets.newHashSet();
+        if (CollectionUtils.isNotEmpty(entList)) {
+            List<KwtLogisticsOrderUnit> logOrderUnits = logisticsOrderUnitRepository.queryByEntIds(entList);
+            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(logOrderUnits)) {
+                //获取物流订单
+                Set<Long> logOrderIdList = logOrderUnits.stream()
+                        .filter(x -> allEnt.contains(x.getEntId()))
+                        .map(KwtLogisticsOrderUnit::getLOrderId)
+                        .collect(Collectors.toSet());
+                Set<Long> logOrderFormUnitIds =
+                        logOrderUnits.stream()
+                                .filter(x -> logOrderIdList.contains(x.getLOrderId()))
+                                .map(KwtLogisticsOrderUnit::getLOrderId)
+                                .collect(Collectors.toSet());
+                logOrderIds.addAll(logOrderFormUnitIds);
+            }
+        }
         if (StringUtils.isNotBlank(req.getContractId())) {
             List<KwtLogisticsOrderContract> kwtLogisticsOrderContracts = logisticsOrderContractRepository.queryByContractId(Long.parseLong(req.getContractId()));
             if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwtLogisticsOrderContracts)) {
-                logOrderIds.addAll(kwtLogisticsOrderContracts.stream()
+                Set<Long> logOrderIdList = kwtLogisticsOrderContracts.stream()
                         .map(KwtLogisticsOrderContract::getLOrderId)
-                        .collect(Collectors.toSet()));
+                        .collect(Collectors.toSet());
+                logOrderIds.addAll(logOrderIdList);
+                logOrderIds  = logOrderIds.stream()
+                        .filter(x->logOrderIdList.contains(x))
+                        .collect(Collectors.toSet());
+            }else {
+                logOrderIds = Sets.newHashSet();
             }
         }
 
@@ -2402,25 +2425,14 @@ public class KwtLogisticsConsignmentService {
                 Set<Long> logOrderFormGoodsIds =
                         logisticsOrderGoodsList.stream().map(KwtLogisticsOrderGoods::getLOrderId).collect(Collectors.toSet());
                 logOrderIds.addAll(logOrderFormGoodsIds);
-            }
-        }
-
-        if (CollectionUtils.isNotEmpty(entList)) {
-            List<KwtLogisticsOrderUnit> logOrderUnits = logisticsOrderUnitRepository.queryByEntIds(entList);
-            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(logOrderUnits)) {
-                //获取物流订单
-                Set<Long> logOrderIdList = logOrderUnits.stream()
-                        .filter(x -> allEnt.contains(x.getEntId()))
-                        .map(KwtLogisticsOrderUnit::getLOrderId)
+                logOrderIds  = logOrderIds.stream()
+                        .filter(x->logOrderFormGoodsIds.contains(x))
                         .collect(Collectors.toSet());
-                Set<Long> logOrderFormUnitIds =
-                        logOrderUnits.stream()
-                                .filter(x -> logOrderIdList.contains(x.getLOrderId()))
-                                .map(KwtLogisticsOrderUnit::getLOrderId)
-                                .collect(Collectors.toSet());
-                logOrderIds.addAll(logOrderFormUnitIds);
+            }else {
+                logOrderIds = Sets.newHashSet();
             }
         }
+
         return logOrderIds;
     }
 
@@ -2438,14 +2450,6 @@ public class KwtLogisticsConsignmentService {
             return allEnt;
         }
         allEnt.add(enterId);
-        EntCacheResDto entCacheResDto = remoteSystemService.queryEntTreeById(enterId);
-        if (Objects.nonNull(entCacheResDto)) {
-            EntCacheResDto entCacheResDto1 = remoteSystemService.queryEntTreeById(entCacheResDto.getId());
-            List<EntCacheResDto> child = entCacheResDto1.getChild();
-            if (CollectionUtils.isNotEmpty(child)) {
-                allEnt.addAll(child.stream().map(EntCacheResDto::getId).toList());
-            }
-        }
         return allEnt;
     }
 
@@ -2475,8 +2479,9 @@ public class KwtLogisticsConsignmentService {
 
         KwtLogisticsOrderGoods goods = finalLogIdAndGoodsMap.getOrDefault(kwtLogisticsOrder.getId(), new KwtLogisticsOrderGoods());
         KwpGoods kwpGoods = finalGoodsIdAndGoodsMap.get(goods.getGoodsId());
-        String priceUnit = kwpGoods.getPriceUnit();
+        String priceUnit = "";
         if (Objects.nonNull(kwpGoods)) {
+            priceUnit = kwpGoods.getPriceUnit();
             logisticsOrderResp.setGoodsId(String.valueOf(goods.getGoodsId()));
             Map<String, String> goodsTypeMap = dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), new HashMap<>());
             Map<String, String> goodsSpecMap = dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.GOODS_SPEC.getType(), new HashMap<>());
@@ -3147,6 +3152,11 @@ public class KwtLogisticsConsignmentService {
 
             //查询物流订单下的所有运单
             List<KwtWaybillOrderSubtask> waybillOrderSubtasks = waybillOrderSubtaskRepository.queryByLogId(x.getId());
+            if (org.apache.commons.collections4.CollectionUtils.isEmpty(waybillOrderSubtasks)) {
+                updateLogisticsOrder.setStatus(LogisticsOrderV1Enum.COMPLETED.getCode());
+                logisticsOrders.add(updateLogisticsOrder);
+                tradeIds.add(x.getTOrderId());
+            }
             if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(waybillOrderSubtasks) && Objects.equals(x.getStatus(), LogisticsOrderV1Enum.IN_TRANSIT.getCode())) {
                 boolean b = waybillOrderSubtasks.stream()
                         .anyMatch(y -> !Arrays.asList(CarWaybillV1Enum.COMPLETED.getCode(), CarWaybillV1Enum.CANCELLED.getCode()).contains(y.getStatus()));

+ 39 - 21
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -3190,24 +3190,6 @@ public class KwtWaybillOrderV1Service {
     @NotNull
     private Set<Long> getLogOrderIds(WaybillOrderReq req) {
         Set<Long> logOrderIds = Sets.newHashSet();
-        if (StringUtils.isNotBlank(req.getLogisticsOrderId())){
-            logOrderIds.add(Long.parseLong(req.getLogisticsOrderId()));
-        }
-
-        if (StringUtils.isNotBlank(req.getBillingMethod() )){
-            List<KwtLogisticsOrder> kwtLogisticsOrder = logisticsOrderRepository.queryByBillMethod(req.getBillingMethod());
-            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwtLogisticsOrder)){
-                logOrderIds.addAll(kwtLogisticsOrder.stream()
-                        .map(KwtLogisticsOrder::getId)
-                        .collect(Collectors.toSet()));
-            }
-        }
-        if (StringUtils.isNotBlank(req.getLogisticsOrderNo()) && StringUtils.isBlank(req.getLogisticsOrderId())){
-            KwtLogisticsOrder kwtLogisticsOrder = logisticsOrderRepository.queryByLogisticsOrderNo(req.getLogisticsOrderNo());
-            if (Objects.nonNull(kwtLogisticsOrder)){
-                logOrderIds.add(kwtLogisticsOrder.getId());
-            }
-        }
         Set<Long> entIds = Sets.newHashSet();
         entIds.add(LoginUserHolder.getEntId());
         if (StringUtils.isNotBlank(req.getConsignorId())){
@@ -3231,9 +3213,41 @@ public class KwtWaybillOrderV1Service {
                 if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(logisticsOrderIds)){
                     logOrderIds.addAll(logisticsOrderIds);
                 }
+            }
+        }
+        if (StringUtils.isNotBlank(req.getLogisticsOrderId())){
+            logOrderIds.add(Long.parseLong(req.getLogisticsOrderId()));
+            logOrderIds = logOrderIds.stream()
+                    .filter(x->Objects.equals(x, Long.parseLong(req.getLogisticsOrderId())))
+                    .collect(Collectors.toSet());
+        }
 
+        if (StringUtils.isNotBlank(req.getBillingMethod() )){
+            List<KwtLogisticsOrder> kwtLogisticsOrder = logisticsOrderRepository.queryByBillMethod(req.getBillingMethod());
+            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwtLogisticsOrder)){
+                Set<Long> logisticsOrderIds = kwtLogisticsOrder.stream()
+                        .map(KwtLogisticsOrder::getId)
+                        .collect(Collectors.toSet());
+                logOrderIds.addAll(logisticsOrderIds);
+                logOrderIds =logOrderIds.stream()
+                        .filter(logisticsOrderIds::contains)
+                        .collect(Collectors.toSet());
+            }else {
+                logOrderIds = Sets.newHashSet();
             }
-         }
+        }
+
+        if (StringUtils.isNotBlank(req.getLogisticsOrderNo())){
+            KwtLogisticsOrder kwtLogisticsOrder = logisticsOrderRepository.queryByLogisticsOrderNo(req.getLogisticsOrderNo());
+            if (Objects.nonNull(kwtLogisticsOrder)){
+                logOrderIds.add(kwtLogisticsOrder.getId());
+                logOrderIds = logOrderIds.stream()
+                        .filter(x->Objects.equals(x, kwtLogisticsOrder.getId()))
+                        .collect(Collectors.toSet());
+            } else {
+                logOrderIds = Sets.newHashSet();
+            }
+        }
         List<KwtLogisticsOrderGoods> logisticsOrderGoods =null ;
         if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getGoodsName())){
             List<KwpGoods> goods = goodsInfoService.findGoodsByGoodsName(req.getGoodsName());
@@ -3245,9 +3259,13 @@ public class KwtWaybillOrderV1Service {
             }
         }
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(logisticsOrderGoods)){
-            logOrderIds.addAll(logisticsOrderGoods.stream()
+            Set<Long> logOrderIdList = logisticsOrderGoods.stream()
                     .map(KwtLogisticsOrderGoods::getLOrderId)
-                    .collect(Collectors.toSet()));
+                    .collect(Collectors.toSet());
+            logOrderIds.addAll(logOrderIdList);
+            logOrderIds = logOrderIds.stream().filter(logOrderIdList::contains).collect(Collectors.toSet());
+        }else {
+            logOrderIds = Sets.newHashSet();
         }
 
         if (StringUtils.isNotBlank(req.getLogisticsOrderId())  && CollectionUtils.isNotEmpty(logOrderIds)){

+ 107 - 24
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/kwfTruckTraceService.java

@@ -14,6 +14,7 @@ import com.sckw.core.model.enums.AddressTypeEnum;
 import com.sckw.core.model.enums.CarWaybillEnum;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.core.utils.DateUtils;
+import com.sckw.core.utils.LocUtils;
 import com.sckw.core.web.constant.CommonConstants;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.response.BaseIotResult;
@@ -33,6 +34,7 @@ import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.KwsEnterpriseResDto;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
+import com.sckw.transport.api.model.vo.RWaybillOrderVo;
 import com.sckw.transport.common.config.UrlConfigProperties;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.dto.TruckDto;
@@ -653,6 +655,7 @@ public class kwfTruckTraceService {
     private List<VehicleReturnData> getVehicleReturnDataList(String wOrderNo) {
         VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
         vehicleDataDTO.setWOrderNo(wOrderNo);
+        vehicleDataDTO.setOrderNo(wOrderNo);
         
         try {
             // 使用 Feign 调用查询车辆轨迹列表
@@ -1445,7 +1448,22 @@ public class kwfTruckTraceService {
     @Transactional(rollbackFor = Exception.class)
     public void generateTrace(GenerateTraceReq req) {
         log.info("生成车辆轨迹参数:{}", JSON.toJSONString(req));
-        
+        LocalDate date = LocalDate.parse(req.getDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        LocalDateTime startDateTime = date.atStartOfDay();
+        LocalDateTime endDateTime = date.atTime(23, 59, 59);
+        List<VehicleReturnData> vehicleReturnDataList = getVehicleReturnDataList(req.getWayOrderNo());
+        if (CollectionUtils.isNotEmpty(vehicleReturnDataList)){
+            vehicleReturnDataList.forEach(vehicleReturnData ->{
+                Timestamp ts = vehicleReturnData.getTs();
+                if (ts != null) {
+                    LocalDateTime dataTime = ts.toLocalDateTime();
+                    if (dataTime.isAfter(startDateTime) && dataTime.isBefore(endDateTime)) {
+                        throw new BusinessException("当前时间段已生成轨迹数据,请勿重新生成");
+                    }
+                }
+            });
+        }
+
         // 校验当前位置格式,必须为经度,纬度格式
         String[] location = req.getCurrentLocation().split(",");
         if (location.length != 2) {
@@ -1467,7 +1485,42 @@ public class kwfTruckTraceService {
         if (Objects.isNull(subOrders)){
             throw new BusinessException("子运单不存在");
         }
-        
+        //查询运单装卸货地址
+        List<KwtWaybillOrderAddress> addressList = kwtWaybillOrderAddressRepository.queryByWOrderId(order.getId());
+        if (CollectionUtils.isEmpty(addressList)){
+            throw new BusinessException("运单地址不存在");
+        }
+        String startLng= "";
+        String startLat= "";
+        String endLng =  "";
+        String endLat = "";
+        for (KwtWaybillOrderAddress address : addressList) {
+            if (Objects.equals(address.getAddressType(), AddressTypeEnum.SHIPMENT.getCode())) {
+                startLng = address.getLng();
+                startLat = address.getLat();
+            }
+            if (Objects.equals(address.getAddressType(), AddressTypeEnum.TAKE.getCode())) {
+                endLng = address.getLng();
+                endLat = address.getLat();
+            }
+        }
+        List<Integer> statusList = Arrays.asList(CarWaybillV1Enum.COMPLETED.getCode(), CarWaybillV1Enum.COMPLETION_LOADING.getCode());
+        if (!statusList.contains(order.getStatus())){
+             endLng =  longitude;
+             endLat = latitude;
+        }
+
+        LocUtils.RouteResult routeResult = generateRoutePointsWithDuration(startLng, startLat, endLng, endLat);
+        if (routeResult == null || com.sckw.core.utils.StringUtils.isBlank(routeResult.getPointInfo())) {
+            log.error("高德API生成轨迹点位失败,起点: {},{} 终点: {},{}", startLng, startLat, endLng, endLat);
+            throw new BusinessException("生成轨迹失败:高德API生成轨迹点位失败");
+        }
+        List<LocUtils.RoutePoint> routePoints = JSON.parseArray(routeResult.getPointInfo(), LocUtils.RoutePoint.class);
+        if (CollectionUtils.isEmpty(routePoints)) {
+            log.error("高德API生成轨迹点位失败,起点: {},{} 终点: {},{}", startLng, startLat, endLng, endLat);
+            throw new BusinessException("生成轨迹失败:高德API生成轨迹点位为空");
+        }
+
         // 通过车牌ID查询所属车队信息
         RFleetVo fleetByTruckId = fleetService.findFleetByTruckId(order.getTruckId());
         
@@ -1475,29 +1528,64 @@ public class kwfTruckTraceService {
         KwtLogisticsOrder logisticsOrder = kwtLogisticsOrderRepository.queryByLogisticsOrderId(subOrders.getLOrderId());
 
         // 构造要发送给数据中台的轨迹数据请求
-        VehiclesTrajectoryReq vehiclesTrajectoryReq = getVehiclesTrajectoryReq(req, order, longitude, latitude, logisticsOrder, fleetByTruckId);
+        String dateStr = req.getDate();
+        // 输入的日期字符串
+       // LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        LocalDateTime dateTime = date.atTime(LocalTime.now());
+        for (int i = 0; i < routePoints.size(); i++) {
+            LocUtils.RoutePoint routePoint = routePoints.get(i);
+            VehiclesTrajectoryReq vehiclesTrajectoryReq = getVehiclesTrajectoryReq(req, order, routePoint.getLongitude(), routePoint.getLatitude(), logisticsOrder, fleetByTruckId);
+            LocalDateTime localDateTime = dateTime.plusSeconds(i * 5L);
+            Timestamp timestamp = Timestamp.valueOf(localDateTime);
+            vehiclesTrajectoryReq.setTs(timestamp);
+            try {
+                // 调用数据中台保存轨迹数据
+                log.info("调用数据中台保存车辆轨迹数据:{}", JSON.toJSONString(vehiclesTrajectoryReq));
+                BaseIotResult<Void> result = vehicleTraceClient.saveVehicleData(vehiclesTrajectoryReq);
+                if (!Objects.equals(result.getCode(), "0")) {
+                    log.error("保存车辆轨迹数据失败:{}", result.getMessage());
+                    throw new BusinessException("生成轨迹失败:" + result.getMessage());
+                }
+
+                // 如果请求中包含异常类型,则同时保存到本地车辆异常表
+                saveException(req, order, longitude, latitude);
+
+                log.info("生成车辆轨迹成功,运单号:{},车牌号:{}", req.getWayOrderNo(), req.getTruckNo());
+            } catch (Exception e) {
+                log.error("生成车辆轨迹异常:", e);
+                throw new BusinessException("生成轨迹失败:" + e.getMessage());
+            }
+        }
+
+    }
+
 
+    private LocUtils.RouteResult generateRoutePointsWithDuration(String startLng, String startLat, String endLng, String endLat) {
         try {
-            // 调用数据中台保存轨迹数据
-            log.info("调用数据中台保存车辆轨迹数据:{}", JSON.toJSONString(vehiclesTrajectoryReq));
-            BaseIotResult<Void> result = vehicleTraceClient.saveVehicleData(vehiclesTrajectoryReq);
-            if (!Objects.equals(result.getCode(), "0")) {
-                log.error("保存车辆轨迹数据失败:{}", result.getMessage());
-                throw new BusinessException("生成轨迹失败:" + result.getMessage());
+            log.info("开始调用高德API生成轨迹点位和耗时,起点: {},{} 终点: {},{}",
+                    startLng, startLat, endLng, endLat);
+
+            // 调用高德驾车路径规划API,生成20个轨迹点位和耗时
+            LocUtils.RouteResult routeResult = com.sckw.core.utils.LocUtils.getDrivingRoutePointsWithDuration(
+                    startLng,
+                    startLat,
+                    endLng,
+                    endLat,
+                    20
+            );
+
+            if (routeResult != null && com.sckw.core.utils.StringUtils.isNotBlank(routeResult.getPointInfo())) {
+                log.info("高德API生成轨迹点位成功,耗时: {}秒", routeResult.getDuration());
+            } else {
+                log.warn("高德API生成轨迹点位失败或返回空数据");
             }
-            
-            // 如果请求中包含异常类型,则同时保存到本地车辆异常表
-            saveException(req, order, longitude, latitude);
 
-            log.info("生成车辆轨迹成功,运单号:{},车牌号:{}", req.getWayOrderNo(), req.getTruckNo());
+            return routeResult;
         } catch (Exception e) {
-            log.error("生成车辆轨迹异常:", e);
-            throw new BusinessException("生成轨迹失败:" + e.getMessage());
+            log.error("调用高德API生成轨迹点位异常", e);
+            return null;
         }
-
-
     }
-
     private void saveException(GenerateTraceReq req, KwtWaybillOrder order, String longitude, String latitude) {
         if (Objects.nonNull(req.getExceptionType())) {
             // 保存到车辆异常表
@@ -1530,12 +1618,7 @@ public class kwfTruckTraceService {
     @NotNull
     private static VehiclesTrajectoryReq getVehiclesTrajectoryReq(GenerateTraceReq req, KwtWaybillOrder order, String longitude, String latitude, KwtLogisticsOrder logisticsOrder, RFleetVo fleetByTruckId) {
         VehiclesTrajectoryReq vehiclesTrajectoryReq = new VehiclesTrajectoryReq();
-        String dateStr = req.getDate();
-        // 输入的日期字符串
-        LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
-        LocalDateTime dateTime = date.atTime(LocalTime.now());
-        Timestamp timestamp = Timestamp.valueOf(dateTime);
-        vehiclesTrajectoryReq.setTs(timestamp);
+
         vehiclesTrajectoryReq.setMobile(order.getDriverPhone());
         vehiclesTrajectoryReq.setTruckNo(req.getTruckNo());
         vehiclesTrajectoryReq.setLongitude(longitude);