Selaa lähdekoodia

Merge branch 'dev_20251130' into dev_mvp3

# Conflicts:
#	sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java
#	sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/TradeOrderInfoService.java
#	sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java
#	sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java
xucaiqin 1 viikko sitten
vanhempi
commit
e4fa3b79fd
50 muutettua tiedostoa jossa 2944 lisäystä ja 1210 poistoa
  1. 41 1
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtils.java
  2. 49 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/ParallelQueryExecutor.java
  3. 5 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java
  4. 15 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/LogisticsEntDtoVO.java
  5. 2 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/TradeContractGoodsDto.java
  6. 3 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/TradeOrderInfoService.java
  7. 28 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java
  8. 4 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryListResVo.java
  9. 4 3
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsRepository.java
  10. 17 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeGoodsRepository.java
  11. 2 2
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/impl/KwcContractLogisticsScoreServiceImpl.java
  12. 62 38
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java
  13. 13 5
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java
  14. 4 4
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfTruck.java
  15. 1 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfTruckReport.java
  16. 10 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckEntRepository.java
  17. 11 80
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckRepository.java
  18. 7 4
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverService.java
  19. 183 181
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckReportService.java
  20. 53 94
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckRouteService.java
  21. 127 96
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java
  22. 28 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java
  23. 7 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/OrderListResDTO.java
  24. 5 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/OrderListResVO.java
  25. 6 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderContractRepository.java
  26. 37 13
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java
  27. 3 1
      sckw-modules/sckw-order/src/main/resources/mapper/KwoTradeOrderMapper.xml
  28. 2 2
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dubbo/RemoteSystemServiceImpl.java
  29. 6 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/AbstractWaybillOrderHandler.java
  30. 6 6
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/CancelHandler.java
  31. 6 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java
  32. 4 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java
  33. 5 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingHandler.java
  34. 9 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/LogisticsOrderResp.java
  35. 0 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderProcessParam.java
  36. 10 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderResp.java
  37. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderStatusResp.java
  38. 18 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/TruckInfoVo.java
  39. 11 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillOrderDetailResp.java
  40. 1 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderCirculateRepository.java
  41. 26 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderRepository.java
  42. 9 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderNodeRepository.java
  43. 5 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwfTaskService.java
  44. 98 49
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtAcceptCarriageOrderService.java
  45. 471 118
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java
  46. 704 181
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java
  47. 102 59
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/VehicleExceptionService.java
  48. 88 22
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java
  49. 531 216
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/kwfTruckTraceService.java
  50. 104 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/task/LogisticsOrderCompletionTask.java

+ 41 - 1
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtils.java

@@ -4,6 +4,9 @@ import cn.hutool.core.date.DateUtil;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessException;
 import com.sckw.core.exception.BusinessPlatfromException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
 
 import java.text.DateFormat;
 import java.text.ParseException;
@@ -24,6 +27,7 @@ import java.util.stream.IntStream;
  *
  * @author
  */
+@Slf4j
 public class DateUtils extends DateUtil {
     /**
      * 时间格式(yyyy-MM-dd)
@@ -860,7 +864,8 @@ public class DateUtils extends DateUtil {
         LocalDate end = endTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
 
         // 计算日历天数差
-        return java.time.temporal.ChronoUnit.DAYS.between(start, end);
+        long daysDiff = java.time.temporal.ChronoUnit.DAYS.between(start, end);
+        return daysDiff + 1;
     }
 
     /**
@@ -889,6 +894,41 @@ public class DateUtils extends DateUtil {
         return diffMinutes;
     }
 
+
+    public static Date getStartDate(String date) {
+        Date startDate;
+        if (org.apache.commons.lang3.StringUtils.isBlank(date)) {
+            startDate = DateUtils.getStartOfDay(new Date());
+        } else {
+            try {
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                startDate = sdf.parse(date);
+                startDate = DateUtils.getStartOfDay(startDate);
+            } catch (Exception e) {
+                log.error("解析开始日期失败", e);
+                startDate = DateUtils.getStartOfDay(new Date());
+            }
+        }
+        return startDate;
+    }
+    public static Date getEndDate(String date) {
+        Date endDate;
+        if (StringUtils.isBlank(date)) {
+            endDate = DateUtils.getEndOfDay(new Date());
+        } else {
+            try {
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                endDate = sdf.parse(date);
+                endDate = DateUtils.getEndOfDay(endDate);
+            } catch (Exception e) {
+                log.error("解析结束日期失败", e);
+                endDate = DateUtils.getEndOfDay(new Date());
+            }
+        }
+        return endDate;
+    }
+
+
     public static void main(String[] args) {
         getPreviousMonthsExclusive(5).forEach(x->{
             System.out.println(x.toString());

+ 49 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/ParallelQueryExecutor.java

@@ -0,0 +1,49 @@
+package com.sckw.core.utils;
+
+
+import com.sckw.core.exception.BusinessException;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Map;
+import java.util.concurrent.*;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+// 创建并行任务管理器类
+@Slf4j
+public class ParallelQueryExecutor {
+    private final Map<String, CompletableFuture<?>> futures = new ConcurrentHashMap<>();
+    
+    public <T> CompletableFuture<T> addTask(String taskName, Supplier<T> supplier, Executor executor) {
+        CompletableFuture<T> future = CompletableFuture.supplyAsync(supplier, executor)
+            .exceptionally(e -> {
+                log.error("并行任务执行失败: {}", taskName, e);
+                return null; // 或根据业务返回默认值
+            });
+        futures.put(taskName, future);
+        return future;
+    }
+    
+    public void awaitAll(long timeout, TimeUnit unit) {
+        CompletableFuture<?>[] futureArray = futures.values().toArray(new CompletableFuture[0]);
+        try {
+            CompletableFuture.allOf(futureArray).get(timeout, unit);
+        } catch (TimeoutException e) {
+            log.warn("并行查询超时,已完成任务: {}", 
+                futures.entrySet().stream()
+                    .filter(entry -> entry.getValue().isDone())
+                    .map(Map.Entry::getKey)
+                    .collect(Collectors.toList()));
+            throw new BusinessException("查询超时");
+        } catch (Exception e) {
+            throw new BusinessException("查询失败");
+        }
+    }
+    
+    @SuppressWarnings("unchecked")
+    public <T> T getResult(String taskName) {
+        CompletableFuture<T> future = (CompletableFuture<T>) futures.get(taskName);
+        return future != null ? future.join() : null;
+    }
+
+}

+ 5 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java

@@ -8,6 +8,8 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CompletionStage;
 
 /**
  * @author czh
@@ -140,6 +142,9 @@ public interface RemoteContractService {
      */
     KwcContractLogisticsDto findLogContractByEntId(Long entId);
 
+    TradeContractGoodsDto queryContractGoodsByContractId(Long contractId, Long goodsId);
+
+    List<TradeContractGoodsDto> queryContractGoodsByContractIds(Set<Long> contractIds, Set<Long> goodsIds);
     Long queryTradeCount();
     Long queryLogisticsCount();
     ContractCountVo contractCount();

+ 15 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/LogisticsEntDtoVO.java

@@ -27,6 +27,21 @@ public class LogisticsEntDtoVO implements Serializable {
      */
     private String contractNo;
 
+    /**
+     * 合同名称
+     */
+    private String contractName;
+
+    /**
+     * 签约方式
+     */
+    private String contractSigningWay;
+
+    /**
+     * 合同状态
+     */
+    private String contractStatus;
+
     /**
      * 开始时间
      */

+ 2 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/TradeContractGoodsDto.java

@@ -12,6 +12,8 @@ public class TradeContractGoodsDto implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 2656035411576510101L;
+    private Long contractId;
+    private Long goodsId;
 
     private BigDecimal price;
 

+ 3 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/TradeOrderInfoService.java

@@ -157,6 +157,9 @@ public interface TradeOrderInfoService {
 
     List<TradeOrderContractVo> queryByTradeContactIds(Set<Long> tradeContractIds);
 
+    TradeOrderContractVo queryByContractByTradeOrderId(Long tOrderId);
+
+    List<TradeOrderContractVo>  queryTradeOrderIds(Set<Long> tradeOrderIds);
     Long queryTradeCount();
 
     Long orderCount();

+ 28 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java

@@ -449,7 +449,7 @@ public class RemoteContractServiceImpl implements RemoteContractService {
         if (CollectionUtils.isEmpty(contractLogisticsUnits)) {
             return null;
         }
-        List<Long> contractIds = contractLogisticsUnits.stream().map(KwcContractLogisticsUnit::getContractId).distinct().collect(Collectors.toList());
+        Set<Long> contractIds = contractLogisticsUnits.stream().map(KwcContractLogisticsUnit::getContractId).collect(Collectors.toSet());
 
         //查询自动派车且有效的物流合同
         List<KwcContractLogistics> kwcContractLogistics = contractLogisticsRepository.queryByIdsAndDispatch(contractIds);
@@ -493,6 +493,33 @@ public class RemoteContractServiceImpl implements RemoteContractService {
         }).orElse(null);
     }
 
+    @Override
+    public TradeContractGoodsDto queryContractGoodsByContractId(Long contractId, Long goodsId) {
+        KwcContractTradeGoods contractTradeGoods = kwcContractTradeGoodsRepository.queryByContractIdAndGoodsId(contractId, goodsId);
+        if(Objects.isNull(contractTradeGoods)){
+            return new TradeContractGoodsDto();
+        }
+        TradeContractGoodsDto tradeContractGoodsDto = new TradeContractGoodsDto();
+        tradeContractGoodsDto.setPrice(contractTradeGoods.getPrice());
+        return tradeContractGoodsDto;
+
+    }
+
+    @Override
+    public List<TradeContractGoodsDto> queryContractGoodsByContractIds(Set<Long> contractIds, Set<Long> goodsIds) {
+        List<KwcContractTradeGoods> contractTradeGoods = kwcContractTradeGoodsRepository.queryByContractIdsAndGoodsIds(contractIds, goodsIds);
+        if(Objects.isNull(contractTradeGoods)){
+            return List.of();
+        }
+       return contractTradeGoods.stream().map(contractTrade -> {
+            TradeContractGoodsDto tradeContractGoodsDto = new TradeContractGoodsDto();
+            tradeContractGoodsDto.setContractId(contractTrade.getContractId());
+            tradeContractGoodsDto.setGoodsId(contractTrade.getGoodsId());
+            tradeContractGoodsDto.setPrice(contractTrade.getPrice());
+            return tradeContractGoodsDto;
+        }).collect(Collectors.toList());
+    }
+
     @Override
     public Long queryTradeCount() {
         ContractStatusCountResp contractStatusCountResp = kwcContractTradeService.queryTradeContractStatusCount(new QueryListReqVo());

+ 4 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryListResVo.java

@@ -180,6 +180,10 @@ public class QueryListResVo implements Serializable {
     @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @Schema(description = "创建时间")
     private Date createTime;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "更新时间")
+    private Date updateTime;
     /**
      * 起始日期
      */

+ 4 - 3
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsRepository.java

@@ -77,10 +77,11 @@ public class KwcContractLogisticsRepository extends ServiceImpl<KwcContractLogis
     public List<KwcContractLogistics> queryValidByEntId(Long entId) {
         return list(Wrappers.<KwcContractLogistics>lambdaQuery()
                 .eq(KwcContractLogistics::getEntId, entId)
+                .eq(KwcContractLogistics::getDispatchWay, 2)
                 .eq(KwcContractLogistics::getDelFlag, 0)
                 .eq(KwcContractLogistics::getStatus, 0)
                 .and(queryWrapper -> queryWrapper.apply("{0} between start_time and end_time",new Date())
-                        //.or(queryWrapper1->queryWrapper1.le(KwcContractLogistics::getStartTime, new Date()).isNull(KwcContractLogistics::getEndTime))
+                        .or(queryWrapper1->queryWrapper1.le(KwcContractLogistics::getStartTime, new Date()).isNull(KwcContractLogistics::getEndTime))
                 ));
     }
 
@@ -113,12 +114,12 @@ public class KwcContractLogisticsRepository extends ServiceImpl<KwcContractLogis
                         .or().between(KwcContractLogistics::getEndTime, startTime, endTime)
                         .or(queryWrapper1->queryWrapper1.le(KwcContractLogistics::getStartTime, startTime).ge(KwcContractLogistics::getEndTime, endTime))
                         // 结束日期为空,代表长期有效
-                        //.or(queryWrapper2->queryWrapper2.ge(KwcContractLogistics::getStartTime, endTime).isNull(KwcContractLogistics::getEndTime))
+                        .or(queryWrapper2->queryWrapper2.ge(KwcContractLogistics::getStartTime, endTime).isNull(KwcContractLogistics::getEndTime))
                 ));
     }
 
 
-    public List<KwcContractLogistics> queryByIdsAndDispatch(List<Long> ids) {
+    public List<KwcContractLogistics> queryByIdsAndDispatch(Set<Long> ids) {
         return list(Wrappers.<KwcContractLogistics>lambdaQuery()
                 .in(KwcContractLogistics::getId, ids)
                 .eq(KwcContractLogistics::getDispatchWay, 2)

+ 17 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeGoodsRepository.java

@@ -50,4 +50,21 @@ public class KwcContractTradeGoodsRepository extends ServiceImpl<KwcContractTrad
                 .in(KwcContractTradeGoods::getContractId, contractIds)
                 .eq(Objects.nonNull(goodsId),KwcContractTradeGoods::getGoodsId, goodsId));
     }
+
+    public KwcContractTradeGoods queryByContractIdAndGoodsId(Long contractId, Long goodsId) {
+        return getOne(Wrappers.<KwcContractTradeGoods>lambdaQuery()
+                .eq(KwcContractTradeGoods::getDelFlag,0)
+                .eq(KwcContractTradeGoods::getContractId, contractId)
+                .eq(KwcContractTradeGoods::getGoodsId, goodsId)
+                .orderByDesc(KwcContractTradeGoods::getId)
+                .last("limit 1"));
+    }
+
+    public List<KwcContractTradeGoods> queryByContractIdsAndGoodsIds(Set<Long> contractIds, Set<Long> goodsIds) {
+        return list(Wrappers.<KwcContractTradeGoods>lambdaQuery()
+                .eq(KwcContractTradeGoods::getDelFlag,0)
+                .in(KwcContractTradeGoods::getContractId, contractIds)
+                .in(KwcContractTradeGoods::getGoodsId, goodsIds)
+        );
+    }
 }

+ 2 - 2
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/impl/KwcContractLogisticsScoreServiceImpl.java

@@ -200,7 +200,7 @@ public class KwcContractLogisticsScoreServiceImpl implements IKwcContractLogisti
     {
         LogisticsScoreQueryDto scoreReqDto = new LogisticsScoreQueryDto();
         providerEntId = providerEntId !=null ? providerEntId : LoginUserHolder.getEntId();
-        //1.查询当前供应商企业有效的物流合同
+        //1.查询当前供应商企业有效的自动派车物流合同
         List<KwcContractLogistics> logisticsContracts = kwcContractLogisticsRepository.queryValidByEntId(providerEntId);
         List<Long> contractIds = logisticsContracts.stream().map(KwcContractLogistics::getId).toList();
         if(CollectionUtils.isNotEmpty(contractIds)){
@@ -260,7 +260,7 @@ public class KwcContractLogisticsScoreServiceImpl implements IKwcContractLogisti
             throw new BusinessException("业务繁忙,请稍后再试!");
         }
         try {
-            if(kwcContractLogisticsScoreMapper.selectLogisticsScoreByEntId(baseInfo.getPurchaseEntId(),baseInfo.getPurchaseEntId())==null){
+            if(kwcContractLogisticsScoreMapper.selectLogisticsScoreByEntId(baseInfo.getProvideEntId(),baseInfo.getPurchaseEntId())==null){
                 //初始化物流企业评分记录
                 kwcContractLogisticsScoreMapper.insertKwcContractLogisticsScore(logisticsScore);
                 //初始化物流企业评分明细

+ 62 - 38
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java

@@ -367,27 +367,16 @@ public class KwcContractTradeService {
      * @param goodsInfo
      */
     private void checkLogContractTime(TradeBaseInfoReqVo baseInfo, List<TradeGoodsInfoReqVo> goodsInfo) {
-        if (true) {
-            return;
-        }
         if (Objects.equals(DispatchWayEnums.AUTO_DISPATCH.getCode(), baseInfo.getDispatchWay())) {
             //商品ids
             List<Long> goodsIdList = goodsInfo.stream().map(TradeGoodsInfoReqVo::getGoodsId).collect(Collectors.toList());
-            //查询满足条件的物合同
+            //查询满足条件的物合同
             List<LogisticsEntDtoVO> logisticsList = queryAutoContractLogOrder(baseInfo.getProvideEntId(), goodsIdList);
-            List<LogisticsEntDtoVO> filteredLogistics  = logisticsList.stream()
-                    .filter(Objects::nonNull)
-                    .filter(log -> log.getStartTime() != null && log.getEndTime() != null)
-                    .filter(log -> {
-                        boolean startTimeOk  = log.getStartTime().after(baseInfo.getStartTime());
-                        boolean endTimeOk = baseInfo.getEndTime() == null || log.getEndTime().before(baseInfo.getEndTime());
-                        return startTimeOk && endTimeOk;
-                    }).collect(Collectors.toList());
-            if (CollectionUtils.isEmpty(filteredLogistics)) {
+            if (CollectionUtils.isEmpty(logisticsList)) {
                 throw new SystemException("请供应商先签订包含贸易商品的自动派车物流合同。");
             }
             //结束时间最早的
-            LogisticsEntDtoVO logEndTimeMin = filteredLogistics.stream()
+            LogisticsEntDtoVO logEndTimeMin = logisticsList.stream()
                     .filter(log -> log.getEndTime() != null)
                     .min(Comparator.comparing(LogisticsEntDtoVO::getEndTime))
                     .orElse(new LogisticsEntDtoVO());
@@ -1740,7 +1729,10 @@ public class KwcContractTradeService {
                     .filter(x -> org.apache.commons.lang3.StringUtils.equals(x.getProvideEntId(), req.getSupplyEntId()))
                     .collect(Collectors.toList());
         }
-        return queryListResVos;
+        return queryListResVos.stream()
+                .sorted(Comparator.comparing(QueryListResVo::getUpdateTime).reversed()
+                        .thenComparing(Comparator.comparing(QueryListResVo::getId).reversed()))
+                .collect(Collectors.toList());
     }
 
     @NotNull
@@ -1820,7 +1812,8 @@ public class KwcContractTradeService {
         }
         queryListResVo.setCreateTime(t.getCreateTime());
         queryListResVo.setStartTime(t.getStartTime());
-        if (Objects.nonNull(t.getStartTime())) {
+        queryListResVo.setUpdateTime(t.getUpdateTime());
+        if (Objects.nonNull(t.getEndTime())) {
             queryListResVo.setEndTime(t.getEndTime());
             String endDate = DateUtils.format(t.getEndTime(), DateUtils.DATE_PATTERN);
             if (org.apache.commons.lang3.StringUtils.equals(endDate, "9999-12-30")) {
@@ -2191,40 +2184,68 @@ public class KwcContractTradeService {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "商品id不能为空!");
         }
 
-        //查询供应商企业物流合同信息
+        //1. 查询供应商企业物流合同关联的unit信息
         List<KwcContractLogisticsUnit> contractLogisticsUnits = kwcContractLogisticsUnitRepository.queryByEntIdAndType(entId);
         if (CollectionUtils.isEmpty(contractLogisticsUnits)) {
             return Collections.emptyList();
         }
         Set<Long> unitContractIds = contractLogisticsUnits.stream().map(KwcContractLogisticsUnit::getContractId).collect(Collectors.toSet());
 
-        //查询物流商品合同信息
-        List<KwcContractLogisticsGoods> contractLogisticsGoods = kwcContractLogisticsGoodsRepository.queryByContractIds(unitContractIds);
-        if (CollectionUtils.isEmpty(contractLogisticsGoods)) {
+        //2. 查询自动派车物流合同信息
+        List<KwcContractLogistics> contractLogisticsList = contractLogisticsRepository.queryByIdsAndDispatch(unitContractIds);
+        if (CollectionUtils.isEmpty(contractLogisticsList)) {
             return Collections.emptyList();
         }
-        Map<Long, List<KwcContractLogisticsGoods>> logisticsGoodsMap = contractLogisticsGoods.stream().collect(Collectors.groupingBy(KwcContractLogisticsGoods::getContractId));
-        List<Long> contractIdList = new ArrayList<>();
-        //校验合同里是否都包含贸易合同里的商品
-        for (Map.Entry<Long, List<KwcContractLogisticsGoods>> entry : logisticsGoodsMap.entrySet()) {
-            Long contractId = entry.getKey();
-            List<KwcContractLogisticsGoods> logisticsGoodList = entry.getValue();
-            if (CollectionUtils.isEmpty(logisticsGoodList)) {
-                continue;
+
+        // 3. 拆分合同:通用价格>0的直接保留,通用价格=0的需要校验商品id
+        List<Long> validContractIds = new ArrayList<>();
+        List<Long> needCheckGoodsContractIds = new ArrayList<>();
+
+        for (KwcContractLogistics contractLogistics : contractLogisticsList) {
+            if (contractLogistics.getCommonPrice().compareTo(BigDecimal.ZERO) > 0) {
+                //通用价格大于0,无需校验goodsIds
+                validContractIds.add(contractLogistics.getId());
+            } else {
+                // 通用价格=0,需要校验商品
+                needCheckGoodsContractIds.add(contractLogistics.getId());
             }
-            //提取当前合同下的所有商品ID
-            Set<Long> currentGoodsIds  = logisticsGoodList.stream().map(KwcContractLogisticsGoods::getGoodsId).filter(Objects::nonNull).collect(Collectors.toSet());
-            boolean isContains = goodsIds.stream().allMatch(currentGoodsIds::contains);
-            if (isContains) {
-                contractIdList.add(contractId);
+        }
+
+        // 4. 处理需要校验商品的合同ID
+        if (CollectionUtils.isNotEmpty(needCheckGoodsContractIds)) {
+            //查询物流商品合同信息
+            List<KwcContractLogisticsGoods> contractLogisticsGoods = kwcContractLogisticsGoodsRepository.queryByContractIds(unitContractIds);
+            if (CollectionUtils.isNotEmpty(contractLogisticsGoods)) {
+                // 按合同ID分组商品信息
+                Map<Long, List<KwcContractLogisticsGoods>> logisticsGoodsMap = contractLogisticsGoods.stream().collect(Collectors.groupingBy(KwcContractLogisticsGoods::getContractId));
+                for (Long contractId : needCheckGoodsContractIds) {
+                    List<KwcContractLogisticsGoods> logisticsGoodList = logisticsGoodsMap.get(contractId);
+                    // 提取当前合同下的所有商品ID
+                    Set<Long> currentGoodsIds = logisticsGoodList.stream().map(KwcContractLogisticsGoods::getGoodsId).filter(Objects::nonNull).collect(Collectors.toSet());
+                    // 校验目标商品ID是否全部包含
+                    boolean isContains = goodsIds.stream().allMatch(currentGoodsIds::contains);
+                    if (isContains) {
+                        validContractIds.add(contractId);
+                    }
+                }
             }
         }
-        if (CollectionUtils.isEmpty(contractIdList)) {
+        if (CollectionUtils.isEmpty(validContractIds)) {
             return Collections.emptyList();
         }
-        //查询自动派车物流合同
-        List<KwcContractLogistics> contractLogisticsList = contractLogisticsRepository.queryByIdsAndDispatch(contractIdList);
-        return toLogisticsEntDtoVO(entId, contractLogisticsList);
+        //过滤满足商品数据
+        List<KwcContractLogistics> finalContractList = contractLogisticsList.stream()
+                .filter(contract -> validContractIds.contains(contract.getId()))
+                .collect(Collectors.toList());
+
+        //过滤有效期合同
+        List<KwcContractLogistics> filteredLogistics = finalContractList.stream().filter(Objects::nonNull)
+                .filter(con -> con.getStartTime() != null)
+                .filter(con -> {
+                    return !con.getStartTime().after(new Date());
+                }).collect(Collectors.toList());
+
+        return toLogisticsEntDtoVO(entId, filteredLogistics);
     }
 
     /**
@@ -2237,6 +2258,9 @@ public class KwcContractTradeService {
             LogisticsEntDtoVO vo = new LogisticsEntDtoVO();
             vo.setContractId(log.getId());
             vo.setContractNo(log.getContractNo());
+            vo.setContractName(log.getName());
+            vo.setContractSigningWay(String.valueOf(log.getSigningWay()));
+            vo.setContractStatus(String.valueOf(log.getStatus()));
             vo.setStartTime(log.getStartTime());
             vo.setEndTime(log.getEndTime());
             vo.setCommonPrice(log.getCommonPrice());
@@ -2308,7 +2332,7 @@ public class KwcContractTradeService {
         //查询物流商品合同信息
         KwcContractLogisticsGoods goods = kwcContractLogisticsGoodsRepository.queryByContractIdAndGoodId(contractId, goodsId);
         if (goods == null) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "当前物流合同商品信息不存在!");
+            return new LogisticsGoodsDto();
         }
         LogisticsGoodsDto dto = new LogisticsGoodsDto();
         dto.setGoodsId(goods.getGoodsId());

+ 13 - 5
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java

@@ -64,6 +64,7 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
     private final KwfDriverScoreService driverScoreService;
     private final KwfDriverService driverService;
     private final KwfTruckReportRepository truckReportRepository;
+    private final KwfTruckEntRepository truckEntRepository;
 
 
     /**
@@ -225,11 +226,11 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
 
     @Override
     public RTruckVo findDataFirstTruck(Long entId) {
-        KwfTruck truck = kwfTruckRepository.getOneByEntId(entId);
-        if (Objects.isNull(truck)){
+        List<RTruckVo> dTruckVoList = findTruckByEntIds(entId);
+        if (CollectionUtils.isEmpty(dTruckVoList)) {
             return new RTruckVo();
         }
-        return getTruckVo(truck);
+        return dTruckVoList.get(0);
     }
 
     @Override
@@ -565,7 +566,7 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
     public TruckDispatchCoefficientVO findAutoTruckDispatchByEntId(Long entId) {
         KwfTruckDispatchCoefficient result = truckDispatchCoefficientRepository.findAutoTruckDispatchByEntId(entId);
         if (result == null) {
-            return new TruckDispatchCoefficientVO();
+            return null;
         }
 
         TruckDispatchCoefficientVO rulesVO = new TruckDispatchCoefficientVO();
@@ -624,7 +625,14 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
 
     @Override
     public List<RTruckVo> findTruckByEntIds(Long entId) {
-        List<KwfTruck> truckList = kwfTruckRepository.findTruckByEntIds(entId);
+        //先查询车辆企业关联关系
+        List<KwfTruckEnt> truckEntByEntIds = truckEntRepository.findTruckEntByEntIds(entId);
+        if(CollectionUtils.isEmpty(truckEntByEntIds)){
+            return new ArrayList<>();
+        }
+        List<Long> truckIds = truckEntByEntIds.stream().map(KwfTruckEnt::getTruckId).collect(Collectors.toList());
+        //通过车牌id查询车辆
+        List<KwfTruck> truckList = kwfTruckRepository.findTruckByTruckIds(truckIds);
         if(CollectionUtils.isEmpty(truckList)){
             return new ArrayList<>();
         }

+ 4 - 4
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfTruck.java

@@ -17,10 +17,10 @@ import java.math.BigDecimal;
 @Accessors(chain = true)
 public class KwfTruck extends BaseModel {
 
-    /**
-     * 企业id
-     */
-    private Long entId;
+//    /**
+//     * 企业id
+//     */
+//    private Long entId;
 
     /**
      * 车牌号

+ 1 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfTruckReport.java

@@ -21,7 +21,7 @@ public class KwfTruckReport extends BaseModel {
     private Long entId;
 
     /**
-     * 车牌
+     * 车牌id
      */
     private Long truckId;
 

+ 10 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckEntRepository.java

@@ -1,15 +1,25 @@
 package com.sckw.fleet.repository;
 
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.core.model.base.BaseModel;
 import com.sckw.fleet.dao.KwfTruckEntMapper;
 import com.sckw.fleet.model.KwfTruckEnt;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * @author PC
  * 车辆信息与企业关联信息接口
  */
 @Repository
 public class KwfTruckEntRepository extends ServiceImpl<KwfTruckEntMapper, KwfTruckEnt> {
+    public List<KwfTruckEnt> findTruckEntByEntIds(Long entId) {
+        return list(Wrappers.<KwfTruckEnt>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .eq(KwfTruckEnt::getEntId,entId)
+                .orderByDesc(BaseModel::getCreateTime));
+    }
 }

+ 11 - 80
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckRepository.java

@@ -22,29 +22,16 @@ import java.util.Set;
  */
 @Repository
 public class KwfTruckRepository extends ServiceImpl<KwfTruckMapper, KwfTruck> {
-    public KwfTruck getOneByEntId(Long entId) {
-        return getOne(Wrappers.<KwfTruck>lambdaQuery()
-                .eq(BaseModel::getDelFlag,0)
-                .eq(Objects.nonNull(entId),KwfTruck::getEntId, entId)
-                .orderByDesc(BaseModel::getCreateTime)
-                .last("limit 1"));
-    }
 
-    public List<KwfTruck> getTurkNoList(Long entId, String truckNo) {
+    public List<KwfTruck> getTurkNoList(List<Long> truckIds, String truckNo) {
         return list(Wrappers.<KwfTruck>lambdaQuery()
                 .eq(BaseModel::getDelFlag, 0)
-                .eq(Objects.nonNull(entId), KwfTruck::getEntId, entId)
+                .in(Objects.nonNull(truckIds), KwfTruck::getId, truckIds)
                 .like(Objects.nonNull(truckNo), KwfTruck::getTruckNo, truckNo)
                 .orderByDesc(BaseModel::getCreateTime));
     }
 
 
-
-    public List<KwfTruck> findAll() {
-        return list(Wrappers.<KwfTruck>lambdaQuery()
-                .eq(BaseModel::getDelFlag,0));
-    }
-
     public List<KwfTruck> queryByTruckIds(Set<Long> truckIds) {
         return list(Wrappers.<KwfTruck>lambdaQuery()
                 .eq(BaseModel::getDelFlag,0)
@@ -58,20 +45,11 @@ public class KwfTruckRepository extends ServiceImpl<KwfTruckMapper, KwfTruck> {
 
     }
 
-    public List<KwfTruck> queryByEntIds(List<Long> entIds, String truckMark,String startTime, String endTime) {
-        return list(Wrappers.<KwfTruck>lambdaQuery()
-                .eq(BaseModel::getDelFlag,0)
-                .in(CollectionUtils.isNotEmpty(entIds),KwfTruck::getEntId, entIds)
-                .eq(StringUtils.isNotBlank(truckMark),KwfTruck::getTruckMark, truckMark)
-                .ge(StringUtils.isNotBlank(startTime),KwfTruck::getCreateTime, startTime)
-                .le(StringUtils.isNotBlank(endTime),KwfTruck::getCreateTime, endTime));
-    }
-
-    public IPage<KwfTruck> queryByCondition(Long entId,String truckNo, String truckMark, String startTime, String endTime, int pageNum, int pageSize) {
+    public IPage<KwfTruck> queryByCondition(List<Long> truckIds,String truckNo, String truckMark, String startTime, String endTime, int pageNum, int pageSize) {
         Page<KwfTruck> page = new Page<>(pageNum, pageSize);
         return page(page, Wrappers.<KwfTruck>lambdaQuery()
                 .eq(BaseModel::getDelFlag,0)
-                .eq(Objects.nonNull(entId),KwfTruck::getEntId, entId)
+                .in(Objects.nonNull(truckIds),KwfTruck::getId, truckIds)
                 .eq(StringUtils.isNotBlank(truckNo),KwfTruck::getTruckNo, truckNo)
                 .eq(StringUtils.isNotBlank(truckMark),KwfTruck::getTruckMark, truckMark)
                 .ge(StringUtils.isNotBlank(startTime),KwfTruck::getCreateTime, startTime)
@@ -79,16 +57,16 @@ public class KwfTruckRepository extends ServiceImpl<KwfTruckMapper, KwfTruck> {
     }
 
     public List<KwfTruck> findTruckByTruckIds(List<Long> truckIds) {
-
         return list(Wrappers.<KwfTruck>lambdaQuery()
                 .eq(BaseModel::getDelFlag,0)
-                .in(KwfTruck::getId, truckIds));
+                .in(KwfTruck::getId, truckIds)
+                .orderByDesc(BaseModel::getId));
     }
 
-    public IPage<KwfTruck> queryByPage(int pageNum, int pageSize, Long entId,Integer businessStatus, String truckNo) {
+    public IPage<KwfTruck> queryByPage(int pageNum, int pageSize, List<Long> truckIds, Integer businessStatus, String truckNo) {
         return page(new Page<>(pageNum, pageSize), Wrappers.<KwfTruck>lambdaQuery()
                 .eq(BaseModel::getDelFlag,0)
-                .eq(Objects.nonNull(entId),KwfTruck::getEntId, entId)
+                .in(Objects.nonNull(truckIds),KwfTruck::getId, truckIds)
                 .like(StringUtils.isNotBlank(truckNo),KwfTruck::getTruckNo, truckNo)
                 .eq(Objects.nonNull(businessStatus),KwfTruck::getBusinessStatus, businessStatus)
                 .orderByDesc(KwfTruck::getId));
@@ -101,59 +79,12 @@ public class KwfTruckRepository extends ServiceImpl<KwfTruckMapper, KwfTruck> {
                 .last("limit 1"));
     }
 
-    public Boolean updateTruck(KwfTruck updateTruck) {
-       return update(updateTruck, Wrappers.<KwfTruck>lambdaQuery().eq(KwfTruck::getId, updateTruck.getId()));
-    }
-
     public KwfTruck findTruckByTruckNo(String truckNo) {
         return getOne(Wrappers.<KwfTruck>lambdaQuery()
                 .eq(BaseModel::getDelFlag,0)
-                .eq(KwfTruck::getTruckNo, truckNo));
+                .eq(KwfTruck::getTruckNo, truckNo)
+                .last("limit 1")
+        );
     }
 
-    public List<KwfTruck> queryByTruckNosAndEntId(List<String> truckNoList, Long entId) {
-        return list(Wrappers.<KwfTruck>lambdaQuery()
-                .eq(BaseModel::getDelFlag,0)
-                .eq(Objects.nonNull(entId),KwfTruck::getEntId, entId)
-                .in(CollectionUtils.isNotEmpty(truckNoList),KwfTruck::getTruckNo, truckNoList));
-    }
-
-    public List<KwfTruck> queryTruckByEntId(Long entId) {
-        return list(Wrappers.<KwfTruck>lambdaQuery()
-                .eq(BaseModel::getDelFlag, 0)
-                .eq(KwfTruck::getEntId, entId)
-                .orderByDesc(BaseModel::getCreateTime));
-    }
-
-    /**
-     * 统计车辆总数(根据企业ID)
-     * @param entId 企业ID
-     * @return 车辆总数
-     */
-    public List<KwfTruck> countByEntId(Long entId) {
-        return list(Wrappers.<KwfTruck>lambdaQuery()
-                .select(BaseModel::getId,KwfTruck::getBusinessStatus)
-                .eq(BaseModel::getDelFlag, 0)
-                .eq(Objects.nonNull(entId), KwfTruck::getEntId, entId));
-    }
-
-    /**
-     * 统计指定业务状态的车辆数量(根据企业ID)
-     * @param entId 企业ID
-     * @param businessStatus 业务状态(0空闲、1任务)
-     * @return 车辆数量
-     */
-    public Long countByEntIdAndBusinessStatus(Long entId, Integer businessStatus) {
-        return count(Wrappers.<KwfTruck>lambdaQuery()
-                .eq(BaseModel::getDelFlag, 0)
-                .eq(Objects.nonNull(entId), KwfTruck::getEntId, entId)
-                .eq(Objects.nonNull(businessStatus), KwfTruck::getBusinessStatus, businessStatus));
-    }
-
-    public List<KwfTruck> findTruckByEntIds(Long entId) {
-        return list(Wrappers.<KwfTruck>lambdaQuery()
-                .eq(BaseModel::getDelFlag,0)
-                .eq(KwfTruck::getEntId,entId)
-                .orderByDesc(BaseModel::getId));
-    }
 }

+ 7 - 4
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverService.java

@@ -110,6 +110,8 @@ public class KwfDriverService {
 
     @Autowired
     private KwfDriverMapper driverMapper;
+    @Autowired
+    KwfTruckService truckService;
 
     /**
      * @param key 逐渐id
@@ -355,6 +357,7 @@ public class KwfDriverService {
         if (truckReport == null) {
             return new KwfTruck();
         }
+
         //查询车辆信息
         KwfTruck truck = truckRepository.getOne(Wrappers.<KwfTruck>lambdaQuery()
                 .eq(BaseModel::getDelFlag, 0)
@@ -395,9 +398,9 @@ public class KwfDriverService {
      * @return
      */
     private void getDriverScore(String entId, String driverId, KwfDriverVo driver) {
-        if (true) {
-            return; //TODO 开关
-        }
+//        if (true) {
+//            return; //TODO 开关
+//        }
 
         if (StringUtils.isEmpty(entId) || StringUtils.isEmpty(driverId)) {
             return;
@@ -1333,7 +1336,7 @@ public class KwfDriverService {
         int systemType = LoginUserHolder.getSystemType();
         if (systemType == SystemTypeEnum.DRIVER.getCode()) {
             //查询企业下的车辆信息
-            List<KwfTruck> kwfTrucks = truckRepository.queryTruckByEntId(request.getEntId());
+            List<KwfTruck> kwfTrucks = truckService.findTruckByEntIds(request.getEntId());
             if (CollectionUtils.isEmpty(kwfTrucks)) {
                 throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_NOT_FOUND, "您所在的企业暂无该车辆,请与企业管理人员联系");
             }

+ 183 - 181
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckReportService.java

@@ -236,100 +236,101 @@ public class KwfTruckReportService {
      * @date 2023/07/11
      **/
     public HttpResult importExcel(MultipartFile file) {
-        /**文件存储**/
-        importFileSave(file);
-
-        /**参数校验**/
-        HttpResult result = this.checkParams(file);
-        if (result.getCode() != HttpStatus.SUCCESS_CODE) {
-            return result;
-        }
-
-        List<KwfTruckReportExcelImportDto> truckReportExcels = (List)result.getData();
-        List<String> errorList = checkParams(truckReportExcels);
-        if (!CollectionUtils.isEmpty(errorList)) {
-            return HttpResult.error("导入数据存在已上报,请核对再上传!", errorList);
-        }
-
-        /**数据处理**/
-        int count = 0;
-        for (KwfTruckReportExcelImportDto truckReportExcel:truckReportExcels) {
-            KwfTruckReport truckReport = new KwfTruckReport();
-            truckReport.setEntId(LoginUserHolder.getEntId());
-
-            /**车辆信息**/
-            //校验车辆档案是否存在
-            List<KwfTruck> trucks = truckDao.findTruck(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{ put("truckNo", truckReportExcel.getTruckNo());}});
-            if (CollectionUtils.isEmpty(trucks)) {
-                //车辆信息
-                KwfTruck truckParams = new KwfTruck();
-                truckParams.setTruckNo(truckReportExcel.getTruckNo());
-                truckParams.setActualWeight(new BigDecimal(truckReportExcel.getActualWeight()));
-                truckParams.setAuthStatus(Global.NUMERICAL_TWO);
-                result = truckService.truckEdit(truckParams);
-                if (result.getCode() != HttpStatus.SUCCESS_CODE) {
-                    continue;
-                }
-
-                KwfTruck truck = (KwfTruck) result.getData();
-                truckReport.setTruckId(truck.getId());
-            } else {
-                //校验车辆是否已上报
-                KwfTruck truck = trucks.get(Global.NUMERICAL_ZERO);
-                List<Map<String, Object>> reports = truckReportDao.findList(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{
-                    put("truckId", truck.getId());
-                    put("entId", LoginUserHolder.getEntId());
-                }});
-                if (CollectionUtils.isEmpty(reports)) {
-                    truckReport.setTruckId(truck.getId());
-                } else {
-                    continue;
-                }
-
-                //校验企业是否添加该车辆
-                KwfTruck truckEnt = new KwfTruck();
-                truckEnt.setId(truck.getId());
-                truckService.truckEntEdit(truckEnt);
-            }
-
-            /**档案信息**/
-            //校验司机档案是否存在
-            List<KwfDriver> drivers = driverDao.findDriver(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{put("phone", truckReportExcel.getPhone());}});
-            if (CollectionUtils.isEmpty(drivers)) {
-                KwfDriver driverParams = new KwfDriver();
-                driverParams.setName(truckReportExcel.getName());
-                driverParams.setPhone(truckReportExcel.getPhone());
-                driverParams.setIdcard(truckReportExcel.getIdcard());
-                driverParams.setAuthStatus(Global.NUMERICAL_TWO);
-                result = driverService.driverEdit(driverParams);
-                if (result.getCode() != HttpStatus.SUCCESS_CODE) {
-                    continue;
-                }
-
-                KwfDriver driver = (KwfDriver) result.getData();
-                truckReport.setDriverId(driver.getId());
-            } else {
-                //校验司机是否已上报
-                KwfDriver driver = drivers.get(0);
-                List<Map<String, Object>> reports = truckReportDao.findList(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{
-                    put("driverId", driver.getId());
-                    put("entId", LoginUserHolder.getEntId());
-                }});
-                if (CollectionUtils.isEmpty(reports)) {
-                    truckReport.setDriverId(driver.getId());
-                } else {
-                    continue;
-                }
-
-                //校验企业是否添加该司机
-                KwfDriver driverEnt = new KwfDriver();
-                driverEnt.setId(driver.getId());
-                driverService.driverEntEdit(driverEnt);
-            }
-            count += truckReportDao.insert(truckReport);
-        }
-
-        return HttpResult.ok("成功导入"+count+"行数据!");
+//        /**文件存储**/
+//        importFileSave(file);
+//
+//        /**参数校验**/
+//        HttpResult result = this.checkParams(file);
+//        if (result.getCode() != HttpStatus.SUCCESS_CODE) {
+//            return result;
+//        }
+//
+//        List<KwfTruckReportExcelImportDto> truckReportExcels = (List)result.getData();
+//        List<String> errorList = checkParams(truckReportExcels);
+//        if (!CollectionUtils.isEmpty(errorList)) {
+//            return HttpResult.error("导入数据存在已上报,请核对再上传!", errorList);
+//        }
+//
+//        /**数据处理**/
+//        int count = 0;
+//        for (KwfTruckReportExcelImportDto truckReportExcel:truckReportExcels) {
+//            KwfTruckReport truckReport = new KwfTruckReport();
+//            truckReport.setEntId(LoginUserHolder.getEntId());
+//
+//            /**车辆信息**/
+//            //校验车辆档案是否存在
+//            List<KwfTruck> trucks = truckDao.findTruck(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{ put("truckNo", truckReportExcel.getTruckNo());}});
+//            if (CollectionUtils.isEmpty(trucks)) {
+//                //车辆信息
+//                KwfTruck truckParams = new KwfTruck();
+//                truckParams.setTruckNo(truckReportExcel.getTruckNo());
+//                truckParams.setActualWeight(new BigDecimal(truckReportExcel.getActualWeight()));
+//                truckParams.setAuthStatus(Global.NUMERICAL_TWO);
+//                result = truckService.truckEdit(truckParams);
+//                if (result.getCode() != HttpStatus.SUCCESS_CODE) {
+//                    continue;
+//                }
+//
+//                KwfTruck truck = (KwfTruck) result.getData();
+//                truckReport.setTruckId(truck.getId());
+//            } else {
+//                //校验车辆是否已上报
+//                KwfTruck truck = trucks.get(Global.NUMERICAL_ZERO);
+//                List<Map<String, Object>> reports = truckReportDao.findList(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{
+//                    put("truckId", truck.getId());
+//                    put("entId", LoginUserHolder.getEntId());
+//                }});
+//                if (CollectionUtils.isEmpty(reports)) {
+//                    truckReport.setTruckId(truck.getId());
+//                } else {
+//                    continue;
+//                }
+//
+//                //校验企业是否添加该车辆
+//                KwfTruck truckEnt = new KwfTruck();
+//                truckEnt.setId(truck.getId());
+//                truckService.truckEntEdit(truckEnt);
+//            }
+//
+//            /**档案信息**/
+//            //校验司机档案是否存在
+//            List<KwfDriver> drivers = driverDao.findDriver(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{put("phone", truckReportExcel.getPhone());}});
+//            if (CollectionUtils.isEmpty(drivers)) {
+//                KwfDriver driverParams = new KwfDriver();
+//                driverParams.setName(truckReportExcel.getName());
+//                driverParams.setPhone(truckReportExcel.getPhone());
+//                driverParams.setIdcard(truckReportExcel.getIdcard());
+//                driverParams.setAuthStatus(Global.NUMERICAL_TWO);
+//                result = driverService.driverEdit(driverParams);
+//                if (result.getCode() != HttpStatus.SUCCESS_CODE) {
+//                    continue;
+//                }
+//
+//                KwfDriver driver = (KwfDriver) result.getData();
+//                truckReport.setDriverId(driver.getId());
+//            } else {
+//                //校验司机是否已上报
+//                KwfDriver driver = drivers.get(0);
+//                List<Map<String, Object>> reports = truckReportDao.findList(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{
+//                    put("driverId", driver.getId());
+//                    put("entId", LoginUserHolder.getEntId());
+//                }});
+//                if (CollectionUtils.isEmpty(reports)) {
+//                    truckReport.setDriverId(driver.getId());
+//                } else {
+//                    continue;
+//                }
+//
+//                //校验企业是否添加该司机
+//                KwfDriver driverEnt = new KwfDriver();
+//                driverEnt.setId(driver.getId());
+//                driverService.driverEntEdit(driverEnt);
+//            }
+//            count += truckReportDao.insert(truckReport);
+//        }
+//
+//        return HttpResult.ok("成功导入"+count+"行数据!");
+        return HttpResult.ok("成功导入!");
     }
 
     /**
@@ -344,93 +345,94 @@ public class KwfTruckReportService {
             return HttpResult.error("请选择需要上报的数据!");
         }
 
-        for (KwfTruckReportDto reportDto:params){
-            boolean bool = checkReport(reportDto);
-            if (!bool) {
-                return HttpResult.error("上报数据已存在,请重新识别!");
-            }
-        }
-
-        /**数据更新**/
-        int count = 0;
-        for (KwfTruckReportDto reportDto:params){
-            KwfTruckReport truckReport = new KwfTruckReport();
-            truckReport.setEntId(LoginUserHolder.getEntId());
-
-            /**车辆信息**/
-            //校验车辆档案是否存在
-            List<KwfTruck> trucks = truckDao.findTruck(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{ put("truckNo", reportDto.getTruckNo());}});
-            if (CollectionUtils.isEmpty(trucks)) {
-                //车辆信息
-                KwfTruck truckParams = new KwfTruck();
-                truckParams.setTruckNo(reportDto.getTruckNo());
-                truckParams.setActualWeight(reportDto.getActualWeight());
-                truckParams.setAuthStatus(Global.NUMERICAL_TWO);
-                HttpResult result = truckService.truckEdit(truckParams);
-                if (result.getCode() != HttpStatus.SUCCESS_CODE) {
-                    return result;
-                }
-
-                KwfTruck truck = (KwfTruck) result.getData();
-                truckReport.setTruckId(truck.getId());
-            } else {
-                //校验车辆是否已上报
-                KwfTruck truck = trucks.get(Global.NUMERICAL_ZERO);
-                List<Map<String, Object>> reports = truckReportDao.findList(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{
-                    put("truckId", truck.getId());
-                    put("entId", LoginUserHolder.getEntId());
-                }});
-                if (CollectionUtils.isEmpty(reports)) {
-                    truckReport.setTruckId(truck.getId());
-                } else {
-                    continue;
-                }
-
-                //校验企业是否添加该车辆
-                KwfTruck truckEnt = new KwfTruck();
-                truckEnt.setId(truck.getId());
-                truckService.truckEntEdit(truckEnt);
-            }
-
-            /**档案信息**/
-            //校验司机档案是否存在
-            List<KwfDriver> drivers = driverDao.findDriver(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{put("phone", reportDto.getPhone());}});
-            if (CollectionUtils.isEmpty(drivers)) {
-                KwfDriver driverParams = new KwfDriver();
-                driverParams.setName(reportDto.getName());
-                driverParams.setPhone(reportDto.getPhone());
-                driverParams.setIdcard(reportDto.getIdcard());
-                driverParams.setAuthStatus(Global.NUMERICAL_TWO);
-                HttpResult result = driverService.driverEdit(driverParams);
-                if (result.getCode() != HttpStatus.SUCCESS_CODE) {
-                    return result;
-                }
-
-                KwfDriver driver = (KwfDriver) result.getData();
-                truckReport.setDriverId(driver.getId());
-            } else {
-                //校验司机是否已上报
-                KwfDriver driver = drivers.get(0);
-                List<Map<String, Object>> reports = truckReportDao.findList(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{
-                    put("driverId", driver.getId());
-                    put("entId", LoginUserHolder.getEntId());
-                }});
-                if (CollectionUtils.isEmpty(reports)) {
-                    truckReport.setDriverId(driver.getId());
-                } else {
-                    continue;
-                }
-
-                //校验企业是否添加该司机
-                KwfDriver driverEnt = new KwfDriver();
-                driverEnt.setId(driver.getId());
-                driverService.driverEntEdit(driverEnt);
-            }
-
-            count += truckReportDao.insert(truckReport);
-        }
-
-        return HttpResult.ok("车辆上报成功"+count+"条!");
+//        for (KwfTruckReportDto reportDto:params){
+//            boolean bool = checkReport(reportDto);
+//            if (!bool) {
+//                return HttpResult.error("上报数据已存在,请重新识别!");
+//            }
+//        }
+//
+//        /**数据更新**/
+//        int count = 0;
+//        for (KwfTruckReportDto reportDto:params){
+//            KwfTruckReport truckReport = new KwfTruckReport();
+//            truckReport.setEntId(LoginUserHolder.getEntId());
+//
+//            /**车辆信息**/
+//            //校验车辆档案是否存在
+//            List<KwfTruck> trucks = truckDao.findTruck(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{ put("truckNo", reportDto.getTruckNo());}});
+//            if (CollectionUtils.isEmpty(trucks)) {
+//                //车辆信息
+//                KwfTruck truckParams = new KwfTruck();
+//                truckParams.setTruckNo(reportDto.getTruckNo());
+//                truckParams.setActualWeight(reportDto.getActualWeight());
+//                truckParams.setAuthStatus(Global.NUMERICAL_TWO);
+//                HttpResult result = truckService.truckEdit(truckParams);
+//                if (result.getCode() != HttpStatus.SUCCESS_CODE) {
+//                    return result;
+//                }
+//
+//                KwfTruck truck = (KwfTruck) result.getData();
+//                truckReport.setTruckId(truck.getId());
+//            } else {
+//                //校验车辆是否已上报
+//                KwfTruck truck = trucks.get(Global.NUMERICAL_ZERO);
+//                List<Map<String, Object>> reports = truckReportDao.findList(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{
+//                    put("truckId", truck.getId());
+//                    put("entId", LoginUserHolder.getEntId());
+//                }});
+//                if (CollectionUtils.isEmpty(reports)) {
+//                    truckReport.setTruckId(truck.getId());
+//                } else {
+//                    continue;
+//                }
+//
+//                //校验企业是否添加该车辆
+//                KwfTruck truckEnt = new KwfTruck();
+//                truckEnt.setId(truck.getId());
+//                truckService.truckEntEdit(truckEnt);
+//            }
+//
+//            /**档案信息**/
+//            //校验司机档案是否存在
+//            List<KwfDriver> drivers = driverDao.findDriver(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{put("phone", reportDto.getPhone());}});
+//            if (CollectionUtils.isEmpty(drivers)) {
+//                KwfDriver driverParams = new KwfDriver();
+//                driverParams.setName(reportDto.getName());
+//                driverParams.setPhone(reportDto.getPhone());
+//                driverParams.setIdcard(reportDto.getIdcard());
+//                driverParams.setAuthStatus(Global.NUMERICAL_TWO);
+//                HttpResult result = driverService.driverEdit(driverParams);
+//                if (result.getCode() != HttpStatus.SUCCESS_CODE) {
+//                    return result;
+//                }
+//
+//                KwfDriver driver = (KwfDriver) result.getData();
+//                truckReport.setDriverId(driver.getId());
+//            } else {
+//                //校验司机是否已上报
+//                KwfDriver driver = drivers.get(0);
+//                List<Map<String, Object>> reports = truckReportDao.findList(new HashMap<>(Global.NUMERICAL_SIXTEEN) {{
+//                    put("driverId", driver.getId());
+//                    put("entId", LoginUserHolder.getEntId());
+//                }});
+//                if (CollectionUtils.isEmpty(reports)) {
+//                    truckReport.setDriverId(driver.getId());
+//                } else {
+//                    continue;
+//                }
+//
+//                //校验企业是否添加该司机
+//                KwfDriver driverEnt = new KwfDriver();
+//                driverEnt.setId(driver.getId());
+//                driverService.driverEntEdit(driverEnt);
+//            }
+//
+//            count += truckReportDao.insert(truckReport);
+//        }
+//
+//        return HttpResult.ok("车辆上报成功"+count+"条!");
+        return HttpResult.ok("车辆上报成功!");
     }
 
     /**

+ 53 - 94
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckRouteService.java

@@ -10,6 +10,7 @@ import com.sckw.core.utils.DateUtils;
 import com.sckw.core.utils.LocUtils;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.core.web.response.BaseIotResult;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.fleet.model.*;
 import com.sckw.fleet.model.dto.KwfTruckRouteDto;
@@ -22,6 +23,9 @@ import com.sckw.fleet.model.vo.QueryTruckRoteVo;
 import com.sckw.fleet.model.vo.TruckRoteDetailVo;
 import com.sckw.fleet.repository.*;
 import com.sckw.transport.api.dubbo.TransportRemoteService;
+import com.sckw.transport.api.feign.VehicleTraceClient;
+import com.sckw.transport.api.model.dto.VehicleDataDTO;
+import com.sckw.transport.api.model.dto.VehicleReturnData;
 import com.sckw.transport.api.model.vo.KwtLogisticsOrderAddressVo;
 import com.sckw.transport.api.model.vo.KwtWaybillOrderAddressVo;
 import com.sckw.transport.api.model.vo.RWaybillOrderVo;
@@ -51,6 +55,7 @@ public class KwfTruckRouteService {
     private final KwfDriverRepository driverRepository;
     private final KwfFleetTruckRepository fleetTruckRepository;
     private final KwfTruckRepository truckRepository;
+    private final VehicleTraceClient vehicleTraceClient;
     @Resource
     private  KwfFleetRepository fleetRepository;
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
@@ -196,114 +201,68 @@ public class KwfTruckRouteService {
     public QueryTruckRoteVo queryTruckRouteByDriver(QueryTruckRouteByDriverReq req) {
         log.info("根据司机ID和装货卸货地址查询常用路线,请求参数 :{}", JSON.toJSONString(req));
         // 查询常用路线
-        WaybillOrderSubtaskVo waybillOrderSubtaskVo = transportRemoteService.queryWaybillOrderId(req.getWayBillOrderId());
+        RWaybillOrderVo waybillOrderSubtaskVo = transportRemoteService.queryWaybillOrderByWayBillOrderId(req.getWayBillOrderId());
         // 根据运单号查询运单信息
         if (Objects.isNull(waybillOrderSubtaskVo)){
             throw new BusinessException("运单不存在");
         }
-        //查询运单装卸货地址
-        List<KwtLogisticsOrderAddressVo> addressList = transportRemoteService.queryByWOrderId(waybillOrderSubtaskVo.getLOrderId());
-        if (CollectionUtils.isEmpty(addressList)){
-            throw new BusinessException("运单地址不存在");
+        if (StringUtils.isBlank(waybillOrderSubtaskVo.getTruckId())){
+            log.info("车辆不存在,运单id:{}", waybillOrderSubtaskVo.getId());
+            throw new BusinessException("车辆不存在");
         }
-        String startLng= "";
-        String startLat= "";
-        String endLng =  "";
-        String endLat = "";
-        for (KwtLogisticsOrderAddressVo kwtLogisticsOrderAddressVo : addressList) {
-            if (Objects.equals(kwtLogisticsOrderAddressVo.getAddressType(), AddressTypeEnum.SHIPMENT.getCode())) {
-                req.setStartPoint(kwtLogisticsOrderAddressVo.getDetailAddress());
-                startLng = kwtLogisticsOrderAddressVo.getLng();
-                startLat = kwtLogisticsOrderAddressVo.getLat();
-            } else if (Objects.equals(kwtLogisticsOrderAddressVo.getAddressType(), AddressTypeEnum.TAKE.getCode())) {
-                req.setUnloadingPoint(kwtLogisticsOrderAddressVo.getDetailAddress());
-                endLng = kwtLogisticsOrderAddressVo.getLng();
-                endLat = kwtLogisticsOrderAddressVo.getLat();
-            }
+        String startLng= waybillOrderSubtaskVo.getStartLng();
+        String startLat= waybillOrderSubtaskVo.getStartLat();
+        String endLng =  waybillOrderSubtaskVo.getEndLng();
+        String endLat = waybillOrderSubtaskVo.getEndLat();
+        VehicleReturnData vehicleReturnData = getVehicleReturnData(String.valueOf(waybillOrderSubtaskVo.getTruckId()));
+        if (Objects.nonNull(vehicleReturnData) && org.apache.commons.lang3.StringUtils.isNotBlank(vehicleReturnData.getLongitude()) && org.apache.commons.lang3.StringUtils.isNotBlank(vehicleReturnData.getLatitude())){
+            startLat= vehicleReturnData.getLatitude();
+            endLng =  vehicleReturnData.getLongitude();
         }
-        KwfTruckRoute truckRoute = truckRouteRepository.queryByDriverIdAndAddress(
-                req.getDriverId(),
-                startLng, startLat,endLng ,endLat
-        );
-        
-        if (Objects.isNull(truckRoute)) {
-
-            try {
-                log.info("未查询到,开始mock数据司机ID:{},装货地址:{},卸货地址:{} 的常用路线",
-                        req.getDriverId(), req.getStartPoint(), req.getUnloadingPoint());
-                saveTruckRote(req, startLng, startLat, endLng, endLat);
-                truckRoute = truckRouteRepository.queryByDriverIdAndAddress(
-                        req.getDriverId(),
-                        startLng,
-                        startLat,
-                        endLng,
-                        endLat
-                );
-            } catch (Exception e) {
-                log.error("新增常用路线异常", e);
-            }
+        LocUtils.RouteResult routeResult = generateRoutePointsWithDuration(startLng, startLat, endLng, endLat);
+        // 如果生成了轨迹点,更新到数据库的point_info字段
+        if (routeResult == null || StringUtils.isBlank(routeResult.getPointInfo())) {
+            return new QueryTruckRoteVo();
         }
-        if (Objects.isNull(truckRoute)){
-            log.info("未查询到司机ID:{},装货地址:{},卸货地址:{} 的常用路线",
-                    req.getDriverId(), req.getStartPoint(), req.getUnloadingPoint());
+        List<LocUtils.RoutePoint> routePoints = JSON.parseArray(routeResult.getPointInfo(), LocUtils.RoutePoint.class);
+        if (CollectionUtils.isEmpty(routePoints)) {
             return new QueryTruckRoteVo();
         }
+        List<QueryTruckRoteVo.TruckRoteDetail> details = routePoints.stream().map(x -> {
+            QueryTruckRoteVo.TruckRoteDetail truckRoteDetail = new QueryTruckRoteVo.TruckRoteDetail();
+            truckRoteDetail.setTs(x.getTs());
+            truckRoteDetail.setLongitude(x.getLongitude());
+            truckRoteDetail.setLatitude(x.getLatitude());
+            return truckRoteDetail;
+        }).collect(Collectors.toList());
         // 组装返回数据
         QueryTruckRoteVo vo = new QueryTruckRoteVo();
-        vo.setId(truckRoute.getId());
-        vo.setTruckId(String.valueOf(truckRoute.getTruckId()));
-        vo.setTruckNo(truckRoute.getTruckNo());
-        vo.setStartPoint(truckRoute.getStartPoint());
-        vo.setUnloadingPoint(truckRoute.getUnloadingPoint());
-        vo.setDriverId(String.valueOf(truckRoute.getDriverId()));
-        vo.setSortedTime(truckRoute.getShortestTime());
-        vo.setUpdateTime(DateUtils.format(truckRoute.getUpdateTime(), DateUtils.DATE_TIME_PATTERN));
-        
-        // 查询车队信息
-        if (Objects.nonNull(truckRoute.getFleetId())) {
-            vo.setFleetId(String.valueOf(truckRoute.getFleetId()));
-            KwfFleet fleet = fleetRepository.getById(truckRoute.getFleetId());
-            if (Objects.nonNull(fleet)) {
-                vo.setFleetName(fleet.getName());
+        vo.setDriverName(waybillOrderSubtaskVo.getDriverName());
+        vo.setDriverId(String.valueOf(waybillOrderSubtaskVo.getDriverId()));
+        vo.setTruckId(String.valueOf(waybillOrderSubtaskVo.getTruckId()));
+        vo.setTruckNo(waybillOrderSubtaskVo.getTruckNo());
+        vo.setTruckRoteDetails(details);
+        return vo;
+    }
+
+    public VehicleReturnData getVehicleReturnData(String truckId) {
+        VehicleDataDTO vehicleDataDTO = new VehicleDataDTO();
+        vehicleDataDTO.setCarNo(truckId);
+
+        try {
+            // 使用 Feign 调用查询实时位置
+            BaseIotResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
+            log.info("查询实时轨迹返回数据: {}", JSON.toJSONString( result));
+            if (result == null || !Objects.equals(result.getCode(), "0") || result.getData() == null) {
+                log.warn("查询实时轨迹返回空数据, 车牌号: {}", truckId);
+                return null;
             }
-        }
-        
-        // 查询司机信息
-        KwfDriver driver = driverRepository.getById(truckRoute.getDriverId());
-        if (Objects.nonNull(driver)) {
-            vo.setDriverName(driver.getName());
-        }
 
-        // 使用更新后的轨迹点
-        String pointInfo = truckRoute.getPointInfo();
-        if (StringUtils.isNotBlank(pointInfo)) {
-            List<QueryTruckRoteVo.TruckRoteDetail> truckRoteDetails = JSON.parseArray(pointInfo, QueryTruckRoteVo.TruckRoteDetail.class);
-            truckRoteDetails = truckRoteDetails.stream()
-                    .sorted(Comparator.comparing(QueryTruckRoteVo.TruckRoteDetail::getTs))
-                    .collect(Collectors.toList());
-            vo.setTruckRoteDetails(truckRoteDetails);
+            return result.getData();
+        } catch (Exception e) {
+            log.error("查询任务轨迹异常, 车牌号: {}", truckId, e);
+            return null;
         }
-//        else {
-//
-//            log.info("开始调用高德API生成轨迹点位,起点: {},{} 终点: {},{}", startLng, startLat, endLng, endLat);
-//            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.isNotEmpty(routePoints)) {
-//                routePoints.stream().map(x->{
-//                    QueryTruckRoteVo.TruckRoteDetail truckRoteDetail = new QueryTruckRoteVo.TruckRoteDetail();
-//                    truckRoteDetail.setTs(truckRoteDetail.getTs());
-//                    truckRoteDetail.setLongitude(truckRoteDetail.getLongitude());
-//                    truckRoteDetail.setLatitude(truckRoteDetail.getLatitude());
-//                    return truckRoteDetail;
-//                }).collect(Collectors.toList());
-//            }
-//        }
-
-        return vo;
     }
     private LocUtils.RouteResult generateRoutePointsWithDuration(String startLng, String startLat, String endLng, String endLat) {
         try {

+ 127 - 96
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java

@@ -16,11 +16,9 @@ import com.sckw.core.exception.BusinessException;
 import com.sckw.core.exception.SystemException;
 import com.sckw.core.model.base.BaseModel;
 import com.sckw.core.model.constant.Global;
-import com.sckw.core.model.constant.UrlConstants;
 import com.sckw.core.model.enums.EntTypeEnum;
 import com.sckw.core.model.enums.SystemTypeEnum;
 import com.sckw.core.model.file.FileInfo;
-
 import com.sckw.core.utils.*;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginEntHolder;
@@ -28,7 +26,6 @@ import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.request.HttpClientUtil;
 import com.sckw.core.web.response.BaseIotResult;
 import com.sckw.core.web.response.HttpResult;
-import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.excel.easyexcel.ExcelImportListener;
 import com.sckw.excel.utils.ExcelUtil;
@@ -36,7 +33,10 @@ import com.sckw.fleet.config.UrlConfigProperties;
 import com.sckw.fleet.dao.*;
 import com.sckw.fleet.model.*;
 import com.sckw.fleet.model.dto.*;
-import com.sckw.fleet.model.request.*;
+import com.sckw.fleet.model.request.BatchTruckValidateReq;
+import com.sckw.fleet.model.request.CapacityStatusReq;
+import com.sckw.fleet.model.request.TruckInfoReq;
+import com.sckw.fleet.model.request.TruckNoReq;
 import com.sckw.fleet.model.vo.*;
 import com.sckw.fleet.repository.*;
 import com.sckw.system.api.RemoteSystemService;
@@ -52,7 +52,6 @@ import com.sckw.transport.api.model.dto.VehicleDataDTO;
 import com.sckw.transport.api.model.dto.VehicleReturnData;
 import com.sckw.transport.api.model.vo.RTruckMonitorVo;
 import com.sckw.transport.api.model.vo.RWaybillOrderVo;
-import com.sckw.transport.api.model.vo.VehicleTraceResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -99,6 +98,7 @@ public class KwfTruckService {
     private final UrlConfigProperties urlConfigProperties;
     private final KwfFleetDriverRepository kwfFleetDriverRepository;
     private final KwfTruckAxleNumRepository truckAxleNumRepository;
+    private final KwfTruckEntRepository truckEntRepository;
 
     private final KwfFleetTruckRepository kwfFleetTruckRepository;
     private final VehicleTraceClient vehicleTraceClient;
@@ -607,8 +607,8 @@ public class KwfTruckService {
             }});
             if (CollectionUtils.isEmpty(trucks)) {
                 /**新增**/
-                params.setEntId(LoginUserHolder.getEntId());
-                params.setEntId(params.getEntId() == null ? 1 : params.getEntId());// 暂时处理---------------zk
+//                params.setEntId(LoginUserHolder.getEntId());
+//                params.setEntId(params.getEntId() == null ? 1 : params.getEntId());// 暂时处理---------------zk
                 params.setBusinessStatus(Global.NO);
                 params.setStatus(Global.NO);
                 int count = truckDao.insert(params);
@@ -623,7 +623,7 @@ public class KwfTruckService {
 
                 /**车辆信息与企业关联信息**/
                 KwfTruck truckEnt = new KwfTruck();
-                truckEnt.setEntId(LoginUserHolder.getEntId());
+//                truckEnt.setEntId(LoginUserHolder.getEntId());
                 truckEnt.setId(truck.getId());
                 truckEntEdit(truckEnt);
                 return count > 0 ? HttpResult.ok("车辆信息修改成功!", truck) : HttpResult.error("车辆信息修改失败!");
@@ -751,7 +751,7 @@ public class KwfTruckService {
     public int truckEntEdit(KwfTruck params) {
         KwfTruckEnt truckEnt = new KwfTruckEnt();
         truckEnt.setTruckId(params.getId());
-        truckEnt.setEntId(params.getEntId() == null ? LoginUserHolder.getEntId() : params.getEntId());
+        truckEnt.setEntId(LoginUserHolder.getEntId());
         KwfTruckEnt ent = truckEntDao.findByTruckEnt(truckEnt);
         if (ent == null) {
             int count = truckEntDao.insert(truckEnt);
@@ -832,6 +832,41 @@ public class KwfTruckService {
         return truckDao.truckStatistics(LoginUserHolder.getEntId());
     }
 
+
+    /**
+     * 通过企业id查询车辆ids
+     * @param entId
+     * @return
+     */
+    public List<Long> findTruckIdListByEntIds(Long entId) {
+        //先查询车辆企业关联关系
+        List<KwfTruckEnt> truckEntByEntIds = truckEntRepository.findTruckEntByEntIds(entId);
+        if(CollectionUtils.isEmpty(truckEntByEntIds)){
+            return new ArrayList<>();
+        }
+        return truckEntByEntIds.stream().map(KwfTruckEnt::getTruckId).collect(Collectors.toList());
+    }
+
+    /**
+     * 通过企业id查询车辆信息
+     * @param entId
+     * @return
+     */
+    public List<KwfTruck> findTruckByEntIds(Long entId) {
+        //先查询车辆企业关联关系
+        List<KwfTruckEnt> truckEntByEntIds = truckEntRepository.findTruckEntByEntIds(entId);
+        if(CollectionUtils.isEmpty(truckEntByEntIds)){
+            return new ArrayList<>();
+        }
+        List<Long> truckIds = truckEntByEntIds.stream().map(KwfTruckEnt::getTruckId).collect(Collectors.toList());
+        //通过车牌id查询车辆
+        List<KwfTruck> truckList = kwfTruckRepository.findTruckByTruckIds(truckIds);
+        if(CollectionUtils.isEmpty(truckList)){
+            return new ArrayList<>();
+        }
+        return truckList;
+    }
+
     /**
      * 统计车辆业务状态数量(全部、空闲、任务中)
      * @return 统计结果
@@ -842,7 +877,7 @@ public class KwfTruckService {
         log.info("统计车辆业务状态数量(全部、空闲、任务中)");
         Long entId = LoginUserHolder.getEntId();
         // 统计全部车辆数量
-        List<KwfTruck> trucks = kwfTruckRepository.countByEntId(entId);
+        List<KwfTruck> trucks = findTruckByEntIds(entId);
         if (org.apache.commons.collections4.CollectionUtils.isEmpty( trucks)){
             return TruckBusinessStatusStatisticsVo.of(0L, 0L, 0L);
         }
@@ -999,15 +1034,15 @@ public class KwfTruckService {
                 put("truckNo", truckNo);
             }});
             KwfTruck truck = CollectionUtils.isEmpty(trucks) ? null : trucks.get(Global.NUMERICAL_ZERO);
-            if (truck != null) {
-                //企业数据集
-                List<Long> entIds = new ArrayList<>() {{
-                    add(truck.getEntId());
-                }};
-                Map<Long, EntCacheResDto> ents = remoteSystemService.queryEntCacheMapByIds(entIds);
-                EntCacheResDto ent = ents == null ? null : ents.get(truck.getEntId());
-                firmName = ent != null ? ent.getFirmName() : null;
-            }
+//            if (truck != null) {
+//                //企业数据集
+//                List<Long> entIds = new ArrayList<>() {{
+//                    add(truck.getEntId());
+//                }};
+//                Map<Long, EntCacheResDto> ents = remoteSystemService.queryEntCacheMapByIds(entIds);
+//                EntCacheResDto ent = ents == null ? null : ents.get(truck.getEntId());
+//                firmName = ent != null ? ent.getFirmName() : null;
+//            }
         }
         //详细地址
         String detailAddress = truckGps != null
@@ -1565,58 +1600,58 @@ public class KwfTruckService {
      */
     public PageDataResult<TruckInfoVo> pageTruckInfo(TruckInfoReq req) {
         log.info("分页查询车辆信息,请求参数:{}",JSON.toJSONString(req));
-        //查询车辆信息
-        Long entId = req.getEntId();
-        if (StringUtils.isNotBlank(req.getTruckNo())){
-            KwfTruck kwfTruck = kwfTruckRepository.queryByTruckNo(req.getTruckNo());
-            entId = Optional.ofNullable(kwfTruck).map(KwfTruck::getEntId).orElse(null);
-        }
-
-        //分页查询所有企业
-        PageDataResult<KwsEnterpriseResDto> page = remoteSystemService.pageEnt(req.getPageNum(), req.getPageSize(), entId);
-        List<KwsEnterpriseResDto> enterpriseResDtoList = page.getList();
-        if (CollectionUtils.isEmpty(page.getList())){
-            return PageDataResult.empty(req.getPageNum(), req.getPageSize());
-        }
-        //获取企业id
-        List<Long> entIds = enterpriseResDtoList.stream()
-                .map(KwsEnterpriseResDto::getId)
-                .collect(Collectors.toList());
-        //获取车辆信息
-        List<KwfTruck> truckList = kwfTruckRepository.queryByEntIds(entIds, req.getTruckMark(), req.getStartTime(), req.getEndTime());
-        if (CollectionUtils.isEmpty(truckList)){
-            return PageDataResult.empty(req.getPageNum(), req.getPageSize());
-        }
-        if (Objects.nonNull(req.getEntId())){
-            truckList = truckList.stream()
-                    .filter(x->Objects.equals(x.getEntId(), req.getEntId()))
-                    .collect(Collectors.toList());
-        }
-        if (StringUtils.isNotBlank(req.getTruckNo())){
-            truckList = truckList.stream()
-                    .filter(x-> org.apache.commons.lang3.StringUtils.equals(x.getTruckNo(), req.getTruckNo()))
-                    .collect(Collectors.toList()) ;
-        }
-        //将车辆信息按照企业id进行分组
-        Map<Long, List<KwfTruck>> entIdAndTruckMap = truckList.stream()
-                .collect(Collectors.groupingBy(KwfTruck::getEntId));
-
-        //查询订单
-        List<RWaybillOrderVo> rWaybillOrderVos = transportRemoteService.queryWaybillOrderByEntId(req.getEntId());
-        Map<Long, List<RWaybillOrderVo>> truckIdAndOrderMap = Maps.newHashMap() ;
-        if (CollectionUtils.isNotEmpty(rWaybillOrderVos)){
-            truckIdAndOrderMap = rWaybillOrderVos.stream()
-                    .collect(Collectors.groupingBy(RWaybillOrderVo::getTruckId));
-        }
-
-
-        //遍历所有企业
-        Map<Long, List<RWaybillOrderVo>> finalTruckIdAndOrderMap = truckIdAndOrderMap;
-        List<TruckInfoVo> ents = enterpriseResDtoList.stream()
-                .map(e -> getTruckInfoVo(e, entIdAndTruckMap, finalTruckIdAndOrderMap))
-                .filter(x->CollectionUtils.isNotEmpty(x.getTruck()))
-                .collect(Collectors.toList());
-        return PageDataResult.success(page.getPageNum(),page.getPageSize(),page.getTotal(),ents);
+//        //查询车辆信息
+//        Long entId = req.getEntId();
+//        if (StringUtils.isNotBlank(req.getTruckNo())){
+//            KwfTruck kwfTruck = kwfTruckRepository.queryByTruckNo(req.getTruckNo());
+//        }
+//
+//        //分页查询所有企业
+//        PageDataResult<KwsEnterpriseResDto> page = remoteSystemService.pageEnt(req.getPageNum(), req.getPageSize(), entId);
+//        List<KwsEnterpriseResDto> enterpriseResDtoList = page.getList();
+//        if (CollectionUtils.isEmpty(page.getList())){
+//            return PageDataResult.empty(req.getPageNum(), req.getPageSize());
+//        }
+//        //获取企业id
+//        List<Long> entIds = enterpriseResDtoList.stream()
+//                .map(KwsEnterpriseResDto::getId)
+//                .collect(Collectors.toList());
+//        //获取车辆信息
+//        List<KwfTruck> truckList = kwfTruckRepository.queryByEntIds(entIds, req.getTruckMark(), req.getStartTime(), req.getEndTime());
+//        if (CollectionUtils.isEmpty(truckList)){
+//            return PageDataResult.empty(req.getPageNum(), req.getPageSize());
+//        }
+//        if (Objects.nonNull(req.getEntId())){
+//            truckList = truckList.stream()
+//                    .filter(x->Objects.equals(x.getEntId(), req.getEntId()))
+//                    .collect(Collectors.toList());
+//        }
+//        if (StringUtils.isNotBlank(req.getTruckNo())){
+//            truckList = truckList.stream()
+//                    .filter(x-> org.apache.commons.lang3.StringUtils.equals(x.getTruckNo(), req.getTruckNo()))
+//                    .collect(Collectors.toList()) ;
+//        }
+//        //将车辆信息按照企业id进行分组
+//        Map<Long, List<KwfTruck>> entIdAndTruckMap = truckList.stream()
+//                .collect(Collectors.groupingBy(KwfTruck::getEntId));
+//
+//        //查询订单
+//        List<RWaybillOrderVo> rWaybillOrderVos = transportRemoteService.queryWaybillOrderByEntId(req.getEntId());
+//        Map<Long, List<RWaybillOrderVo>> truckIdAndOrderMap = Maps.newHashMap() ;
+//        if (CollectionUtils.isNotEmpty(rWaybillOrderVos)){
+//            truckIdAndOrderMap = rWaybillOrderVos.stream()
+//                    .collect(Collectors.groupingBy(RWaybillOrderVo::getTruckId));
+//        }
+//
+//
+//        //遍历所有企业
+//        Map<Long, List<RWaybillOrderVo>> finalTruckIdAndOrderMap = truckIdAndOrderMap;
+//        List<TruckInfoVo> ents = enterpriseResDtoList.stream()
+//                .map(e -> getTruckInfoVo(e, entIdAndTruckMap, finalTruckIdAndOrderMap))
+//                .filter(x->CollectionUtils.isNotEmpty(x.getTruck()))
+//                .collect(Collectors.toList());
+//        return PageDataResult.success(page.getPageNum(),page.getPageSize(),page.getTotal(),ents);
+        return PageDataResult.empty(req.getPageNum(), req.getPageSize());
     }
 
 
@@ -1694,17 +1729,14 @@ public class KwfTruckService {
         log.info("app端分页查询车辆信息,请求参数:{}",JSON.toJSONString(req));
         //查询车辆信息
         Long entId = req.getEntId();
-        IPage<KwfTruck> page = kwfTruckRepository.queryByCondition(entId,req.getTruckNo(),req.getTruckMark(),req.getStartTime(),req.getEndTime(),req.getPageNum(),req.getPageSize());
+        List<Long> truckIdList = findTruckIdListByEntIds(entId);
+        IPage<KwfTruck> page = kwfTruckRepository.queryByCondition(truckIdList,req.getTruckNo(),req.getTruckMark(),req.getStartTime(),req.getEndTime(),req.getPageNum(),req.getPageSize());
         List<KwfTruck> truckList = page.getRecords();
         if (CollectionUtils.isEmpty(truckList)){
             return PageDataResult.empty(req.getPageNum(), req.getPageSize());
         }
-        List<Long> entIds = truckList.stream()
-                .map(KwfTruck::getEntId)
-                .distinct()
-                .collect(Collectors.toList());
         //entId映射企业信息
-        Map<Long, KwsEnterpriseResDto> entIdKwsEnterpriseResDtoMap = remoteSystemService.queryEnterpriseByEntIds(entIds);
+        Map<Long, KwsEnterpriseResDto> entIdKwsEnterpriseResDtoMap = remoteSystemService.queryEnterpriseByEntIds(Lists.newArrayList(entId));
         //根据车辆车辆id,查询车队
         Set<Long> truckIds = truckList.stream().map(BaseModel::getId).collect(Collectors.toSet());
         List<KwfFleetTruck> kwfFleetTrucks = kwfFleetTruckRepository.queryByTruckIds(truckIds);
@@ -1769,7 +1801,7 @@ public class KwfTruckService {
         Map<Long, List<KwfFleetDriver>> finalFleetIdAndDriverMap = fleetIdAndDriverMap;
         Map<Long, List<RWaybillOrderVo>> finalTruckIdAndWaybillOrderMap = truckIdAndWaybillOrderMap;
         List<AppTruckInfoVo> ents = truckList.stream()
-                .map(t-> getAppTruckInfoVo(t, entIdKwsEnterpriseResDtoMap, finalTruckIdAndFleetTruckMap
+                .map(t-> getAppTruckInfoVo(t, entId, entIdKwsEnterpriseResDtoMap, finalTruckIdAndFleetTruckMap
                         , finalFleetIdAndFleetMap, finalDriverIdAndDriverMap, finalFleetIdAndDriverMap, finalTruckIdAndWaybillOrderMap))
                 .collect(Collectors.toList());
 
@@ -1777,15 +1809,15 @@ public class KwfTruckService {
     }
 
 
-    private AppTruckInfoVo getAppTruckInfoVo(KwfTruck t, Map<Long, KwsEnterpriseResDto> entIdKwsEnterpriseResDtoMap
+    private AppTruckInfoVo getAppTruckInfoVo(KwfTruck t, Long entId, Map<Long, KwsEnterpriseResDto> entIdKwsEnterpriseResDtoMap
             ,Map<Long, List<KwfFleetTruck>> truckIdAndFleetTruckMap
             ,Map<Long, KwfFleet> fleetIdAndFleetMap
             , Map<Long, KwfDriver> driverIdAndDriverMap
             ,Map<Long, List<KwfFleetDriver>> fleetIdAndDriverMap
             ,Map<Long, List<RWaybillOrderVo>> finalTruckIdAndWaybillOrderMap) {
         AppTruckInfoVo truckInfoVo = new AppTruckInfoVo();
-        truckInfoVo.setEntId(String.valueOf(t.getEntId()));
-        KwsEnterpriseResDto enterpriseResDto = entIdKwsEnterpriseResDtoMap.getOrDefault(t.getEntId(), new KwsEnterpriseResDto());
+        truckInfoVo.setEntId(String.valueOf(entId));
+        KwsEnterpriseResDto enterpriseResDto = entIdKwsEnterpriseResDtoMap.getOrDefault(entId, new KwsEnterpriseResDto());
         truckInfoVo.setEntName(enterpriseResDto.getFirmName());
         truckInfoVo.setTruckId(String.valueOf(t.getId()));
         truckInfoVo.setTruckNo(t.getTruckNo());
@@ -1828,7 +1860,8 @@ public class KwfTruckService {
      * @return
      */
     public List<KwfTruckVo> queryTruckNo(TruckNoReq req) {
-        List<KwfTruck> turkNoList = kwfTruckRepository.getTurkNoList(req.getEntId(), req.getTruckNo());
+        List<Long> truckIds = findTruckIdListByEntIds(req.getEntId());
+        List<KwfTruck> turkNoList = kwfTruckRepository.getTurkNoList(truckIds, req.getTruckNo());
         if (CollectionUtils.isEmpty(turkNoList)) {
             return Collections.emptyList();
         }
@@ -1856,7 +1889,9 @@ public class KwfTruckService {
          }
          Integer businessStatus = org.apache.commons.lang3.StringUtils.isBlank(req.getBusinessStatus()) ? null :
                  Integer.parseInt(req.getBusinessStatus());
-        IPage<KwfTruck> kwfTruckIPage = kwfTruckRepository.queryByPage(req.getPageNum(), req.getPageSize(), req.getEntId(), businessStatus,
+
+        List<Long> truckIds = findTruckIdListByEntIds(req.getEntId());
+        IPage<KwfTruck> kwfTruckIPage = kwfTruckRepository.queryByPage(req.getPageNum(), req.getPageSize(), truckIds, businessStatus,
                 req.getTruckNo());
         List<KwfTruck> records = kwfTruckIPage.getRecords();
         if (org.apache.commons.collections4.CollectionUtils.isEmpty( records)){
@@ -1916,23 +1951,20 @@ public class KwfTruckService {
         // 批量查询车辆信息
         Map<String, KwfTruck> truckMap = new HashMap<>();
         if (!truckNoList.isEmpty()) {
-            List<KwfTruck> trucks = kwfTruckRepository.queryByTruckNosAndEntId(truckNoList,entId);
+            List<KwfTruck> kwfTruckList = findTruckByEntIds(entId);
+            List<KwfTruck> trucks = kwfTruckList.stream().filter(Objects::nonNull)
+                    .filter(truck -> truck.getTruckNo() != null && truckNoList.contains(truck.getTruckNo()))
+                    .collect(Collectors.toList());
             truckMap = trucks.stream()
                 .collect(Collectors.toMap(KwfTruck::getTruckNo, Function.identity(), (k1, k2) -> k1));
         }
 
-        // 批量查询企业信息
-        Set<Long> entIds = truckMap.values().stream()
-            .map(KwfTruck::getEntId)
-            .collect(Collectors.toSet());
-        Map<Long, EntCacheResDto> entMap = new HashMap<>();
-        if (!entIds.isEmpty()) {
-            entMap = remoteSystemService.queryEntCacheMapByIds(new ArrayList<>(entIds));
-        }
+        // 查询企业信息
+        EntCacheResDto entCacheResDto = remoteSystemService.queryEntCacheById(entId);
 
         // 处理每个车牌号
         for (String originalTruckNo : truckNoList) {
-            TruckValidateVo vo = validateSingleTruckNo(originalTruckNo, truckMap, entMap);
+            TruckValidateVo vo = validateSingleTruckNo(originalTruckNo, truckMap, entCacheResDto);
             result.add(vo);
         }
         if (CollectionUtils.isNotEmpty( result)){
@@ -1951,7 +1983,7 @@ public class KwfTruckService {
      */
     private TruckValidateVo validateSingleTruckNo(String originalTruckNo, 
                                                   Map<String, KwfTruck> truckMap,
-                                                  Map<Long, EntCacheResDto> entMap) {
+                                                  EntCacheResDto ent) {
         TruckValidateVo.TruckValidateVoBuilder builder = TruckValidateVo.builder()
             .originalTruckNo(originalTruckNo);
 
@@ -1980,10 +2012,9 @@ public class KwfTruckService {
             builder.exists(true)
                    .truckId(truck.getId())
                    .carAxis(axleNum.getName())
-                   .entId(truck.getEntId());
+                   .entId(ent.getId());
 
             // 获取企业名称
-            EntCacheResDto ent = entMap.get(truck.getEntId());
             if (ent != null) {
                 builder.entName(ent.getFirmName());
             }

+ 28 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java

@@ -897,6 +897,34 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
     }
 
     @Override
+    public TradeOrderContractVo queryByContractByTradeOrderId(Long tOrderId) {
+        KwoTradeOrderContract kwoTradeOrderContracts = kwoTradeOrderContractRepository.queryByTradeOrderId(tOrderId);
+        if (Objects.isNull(kwoTradeOrderContracts)) {
+            return new TradeOrderContractVo();
+        }
+        TradeOrderContractVo tradeOrderContractVo = new TradeOrderContractVo();
+        tradeOrderContractVo.setContractId(kwoTradeOrderContracts.getContractId());
+        tradeOrderContractVo.setContractNo(kwoTradeOrderContracts.getContractNo());
+        tradeOrderContractVo.setTOrderId(kwoTradeOrderContracts.getTOrderId());
+        tradeOrderContractVo.setTOrderNo(kwoTradeOrderContracts.getTOrderNo());
+        return tradeOrderContractVo;
+    }
+
+    @Override
+    public List<TradeOrderContractVo> queryTradeOrderIds(Set<Long> tradeOrderIds) {
+        List<KwoTradeOrderContract> kwoTradeOrderContracts = kwoTradeOrderContractRepository.queryTradeOrderIds(tradeOrderIds);
+        if (CollectionUtils.isEmpty(kwoTradeOrderContracts)) {
+            return List.of();
+        }
+        return kwoTradeOrderContracts.stream().map(item -> {
+            TradeOrderContractVo tradeOrderContractVo = new TradeOrderContractVo();
+            tradeOrderContractVo.setContractId(item.getContractId());
+            tradeOrderContractVo.setContractNo(item.getContractNo());
+            tradeOrderContractVo.setTOrderId(item.getTOrderId());
+            tradeOrderContractVo.setTOrderNo(item.getTOrderNo());
+            return tradeOrderContractVo;
+        }).collect(Collectors.toList());
+    }
     public List<OrderSaleVo> queryRecentSale(LocalDateTime start, LocalDateTime end) {
         return kwoTradeOrderService.queryRecentSale(start, end);
     }

+ 7 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/OrderListResDTO.java

@@ -149,6 +149,13 @@ public class OrderListResDTO {
      * 计费方式
      */
     private Integer chargeType;
+
+
+    /**
+     * 是否需要增派运力(0-否,1-是)
+     */
+    private Integer addVehicles;
+
     /**
      * 装货地址信息
      */

+ 5 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/OrderListResVO.java

@@ -95,6 +95,11 @@ public class OrderListResVO {
      */
     private String sourceLabel;
 
+    /**
+     * 是否需要增派运力(0-否,1-是)
+     */
+    private Integer addVehicles;
+
     /**
      * 合同主键
      */

+ 6 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderContractRepository.java

@@ -36,4 +36,10 @@ public class KwoTradeOrderContractRepository extends ServiceImpl<KwoTradeOrderCo
                 .eq(BaseModel::getDelFlag,0)
                 .in(KwoTradeOrderContract::getContractId, tradeContractIds));
     }
+
+    public List<KwoTradeOrderContract> queryTradeOrderIds(Set<Long> tradeOrderIds) {
+        return list(Wrappers.<KwoTradeOrderContract>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .in(KwoTradeOrderContract::getTOrderId, tradeOrderIds));
+    }
 }

+ 37 - 13
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -791,6 +791,7 @@ public class KwoTradeOrderService {
                 contractInfo.setContractName(contractRes.getContactName());
                 contractInfo.setContractSigningWay(contractRes.getSigningWayName());
                 contractInfo.setContractStatus(contractRes.getStatusName());
+                contractInfo.setDispatchWay(contractRes.getDispatchWay());
             }
             detail.setContractInfo(contractInfo);
         }
@@ -807,6 +808,7 @@ public class KwoTradeOrderService {
                     contractInfo.setContractName(c.getContactName());
                     contractInfo.setContractSigningWay(c.getSigningWayName());
                     contractInfo.setContractStatus(c.getStatusName());
+                    contractInfo.setDispatchWay(c.getDispatchWay());
                 });
                 return contractInfo;
             }).collect(Collectors.toList());
@@ -823,9 +825,34 @@ public class KwoTradeOrderService {
                 return transportUnitInfo;
             }).collect(Collectors.toList());
             detail.setUnitInfoList(collect1);
+        } else {
+            //自动派单
+            if (detail.getContractInfo() != null && DispatchWayEnums.AUTO_DISPATCH.getCode().equals(detail.getContractInfo().getDispatchWay())) {
+                //查询销售企业
+                KwoTradeOrderUnit tradeOrderUnit = units.stream().filter(unit -> String.valueOf(Global.NUMERICAL_TWO).equals(unit.getUnitType())).findFirst().orElse(null);
+                Long goodsId = detail.getGoodsInfo().getGoodsId();
+                //查询满足自动派单的物流合同
+                List<LogisticsEntDtoVO> contractLogisticsList = remoteContractService.queryAutoContractLogOrder(tradeOrderUnit.getEntId(), Lists.newArrayList(goodsId));
+                if (CollectionUtils.isEmpty(contractLogisticsList)) {
+                    throw new BusinessException("未找到该商品有效的自动派车物流合同,请先签订自动派车物流合同");
+                }
+                List<ContractInfo> contractInfoList = contractLogisticsList.stream().map(d -> {
+                    ContractInfo contractInfo = new ContractInfo();
+                    contractInfo.setContractId(d.getContractId());
+                    contractInfo.setContractNo(d.getContractNo());
+
+                    contractInfo.setContractName(d.getContractName());
+                    contractInfo.setContractSigningWay(d.getContractSigningWay());
+                    contractInfo.setContractStatus(d.getContractStatus());
+                    contractInfo.setDispatchWay(DispatchWayEnums.AUTO_DISPATCH.getCode());
 
+                    return contractInfo;
+                }).collect(Collectors.toList());
+                detail.setContractInfoList(contractInfoList);
+            }
         }
 
+
         //todo 关联物流订单信息
         return detail;
     }
@@ -1628,6 +1655,7 @@ public class KwoTradeOrderService {
             vo.setWaitEntrustAmount(setScale(getWaitEntrustAmount(e.getAmount(), e.getEntrustAmount())));
             vo.setActualPrice(actualAmount.multiply(unitPrice).setScale(2, RoundingMode.HALF_UP)).setUnitPrice(setScale(e.getUnitPrice())).setPrice(setScale(e.getPrice())).setUnit(e.getUnit()).setUnitLabel(unitType == null ? e.getUnit() : (unitType.get(e.getUnit()) == null ? e.getUnit() : unitType.get(e.getUnit()).getLabel())).setAmount(setScale(vo.getAmount())).setEntrustAmount(setScale(e.getEntrustAmount())).setActualAmount(setScale(e.getActualAmount())).setCreateByName(Objects.isNull(userCache) ? null : userCache.getName());
             vo.setDeliveryTypeLabel(DictEnum.getLabel(DictTypeEnum.LOAD_UNLOAD_WAY.getType(), String.valueOf(e.getChargeType())));
+            vo.setAddVehicles(e.getAddVehicles());
             loadAddress.ifPresent(d -> {
                 vo.setLoadName(d.getName());
                 vo.setLoadAddress(d.getCityName() + " " + d.getDetailAddress());
@@ -2253,7 +2281,7 @@ public class KwoTradeOrderService {
             addLogisticOrderParam.setDispatchWay(DispatchWayEnums.AUTO_DISPATCH.getCode());
 
             //实际派车数
-            Integer actualDisPatch = getActualDisPatch(kwoTradeOrder, addressList);
+            Integer actualDisPatch = getActualDisPatch(kwoTradeOrder, unitMap, addressList);
             addLogisticOrderParam.setActualDisPatch(actualDisPatch);
 
         } else if (Objects.equals(tradeContractResDto.getConsignment(), 2)) {
@@ -2406,20 +2434,14 @@ public class KwoTradeOrderService {
 
     @NotNull
     private List<LogisticsEntDtoVO> checkAutoContractLogOrder(Map<String, KwoTradeOrderUnit> unitMap, KwoTradeOrderGoods byOrderId, TradeContractResDto tradeContractResDto) {
-        List<LogisticsEntDtoVO> validContractLog;
         KwoTradeOrderUnit tradeOrderUnit = unitMap.get(String.valueOf(Global.NUMERICAL_TWO));
         //查询满足自动派单的物流合同
         List<LogisticsEntDtoVO> contractLogisticsList = remoteContractService.queryAutoContractLogOrder(tradeOrderUnit.getEntId(), Lists.newArrayList(byOrderId.getId()));
-        validContractLog = contractLogisticsList.stream().filter(Objects::nonNull).filter(log -> log.getStartTime() != null && log.getEndTime() != null).filter(log -> {
-            boolean startTimeOk = log.getStartTime().after(tradeContractResDto.getStartTime());
-            boolean endTimeOk = tradeContractResDto.getEndTime() == null || log.getEndTime().before(tradeContractResDto.getEndTime());
-            return startTimeOk && endTimeOk;
-        }).collect(Collectors.toList());
-        if (CollectionUtils.isEmpty(validContractLog)) {
+        if (CollectionUtils.isEmpty(contractLogisticsList)) {
             throw new BusinessException("未找到该商品有效的自动派车物流合同,请先签订自动派车物流合同");
         }
         //填充运输单价
-        for (LogisticsEntDtoVO vo : validContractLog) {
+        for (LogisticsEntDtoVO vo : contractLogisticsList) {
             LogisticsGoodsDto dto = remoteContractService.queryLogGoodsByContractId(vo.getContractId(), byOrderId.getGoodsId());
             if (dto.getPrice() == null || dto.getPrice().compareTo(BigDecimal.ZERO) == 0) {
                 vo.setTransportPrice(vo.getCommonPrice());
@@ -2427,7 +2449,7 @@ public class KwoTradeOrderService {
                 vo.setTransportPrice(dto.getPrice());
             }
         }
-        return validContractLog;
+        return contractLogisticsList;
     }
 
     /**
@@ -2437,14 +2459,16 @@ public class KwoTradeOrderService {
      * @param addressList
      * @return
      */
-    public Integer getActualDisPatch(KwoTradeOrder tradeOrder, List<KwoTradeOrderAddress> addressList) {
-        TruckDispatchCoefficientVO truckDispatchVO = remoteFleetService.findAutoTruckDispatchByEntId(tradeOrder.getEntId());
+    public Integer getActualDisPatch(KwoTradeOrder tradeOrder, Map<String, KwoTradeOrderUnit> unitMap, List<KwoTradeOrderAddress> addressList) {
+        //获取供应企业id
+        KwoTradeOrderUnit tradeOrderUnit = unitMap.get(String.valueOf(Global.NUMERICAL_TWO));
+        TruckDispatchCoefficientVO truckDispatchVO = remoteFleetService.findAutoTruckDispatchByEntId(tradeOrderUnit.getEntId());
         if (truckDispatchVO == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "未找到自动派车系数!");
         }
         ActualDisPatchDto dto = new ActualDisPatchDto();
         dto.setTradeOrderId(tradeOrder.getId());
-        dto.setEntId(tradeOrder.getEntId());
+        dto.setEntId(tradeOrderUnit.getEntId());
         dto.setStartTime(tradeOrder.getStartTime());
         dto.setEndTime(tradeOrder.getEndTime());
         dto.setAmount(tradeOrder.getAmount());

+ 3 - 1
sckw-modules/sckw-order/src/main/resources/mapper/KwoTradeOrderMapper.xml

@@ -30,6 +30,7 @@
         <result column="unit" property="unit"/>
         <result column="createBy" property="createBy"/>
         <result column="createTime" property="createTime"/>
+        <result column="addVehicles" property="addVehicles"/>
 
         <collection property="loadAddresses" ofType="com.sckw.order.model.dto.LoadAddressDTO">
             <id column="loadAddressId" property="loadAddressId"/>
@@ -73,7 +74,8 @@
         a.remark         AS remark,
         a.unit           AS unit,
         a.create_by      AS createBy,
-        a.create_time    AS createTime
+        a.create_time    AS createTime,
+        a.add_vehicles   AS addVehicles
     </sql>
 
     <select id="tradeOrderSelect" resultMap="mainEntityMap">

+ 2 - 2
sckw-modules/sckw-system/src/main/java/com/sckw/system/dubbo/RemoteSystemServiceImpl.java

@@ -1067,13 +1067,13 @@ public class RemoteSystemServiceImpl implements RemoteSystemService {
         BigDecimal totalTimeBig = new BigDecimal(totalTransportationTime);
         BigDecimal singleTripBig = new BigDecimal(singleTripTotalTimes);
         BigDecimal roundTripBig = totalTimeBig.divide(singleTripBig, 2, RoundingMode.HALF_UP);
-        Integer maxRoundTripTimes = roundTripBig.setScale(0, RoundingMode.FLOOR).intValue();
+        Integer maxRoundTripTimes = roundTripBig.setScale(0, RoundingMode.CEILING).intValue();
 
         //单车总运量 = 车辆平均载重 X 单车最大往返次数
         int totalVehicle = vehicleAvgLoad * maxRoundTripTimes;
         BigDecimal totalVehicleBig = new BigDecimal(totalVehicle);
         //所需车辆数 = 订单总量/单车总运量
-        BigDecimal vehiclesNum = dto.getAmount().multiply(totalVehicleBig);
+        BigDecimal vehiclesNum = dto.getAmount().divide(totalVehicleBig, 0, RoundingMode.CEILING);
 
         //实际派车 = 所需车辆数 X 缓冲系数(向上取整)
         BigDecimal actualVehicleBig = vehiclesNum.multiply(bufferCoefficient);

+ 6 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/AbstractWaybillOrderHandler.java

@@ -10,6 +10,7 @@ import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.StringUtils;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.dto.RUpdateDriverScoreDto;
 import com.sckw.fleet.api.model.vo.DriverConductRulesVO;
@@ -24,9 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.Date;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -110,6 +109,11 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
         if (param == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "参数不能为空");
         }
+        if (!(param instanceof WaybillOrderCancelParam)) {
+            if (StringUtils.isBlank(param.getLng()) || StringUtils.isBlank(param.getLat())) {
+                throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "未获取到定位,请重启app后再次操作");
+            }
+        }
         // 非接单流程必须校验运单ID
         if (!(param instanceof OrderCirculateTakingQueryParam) && param.getWaybillOrderId() == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "运单ID不能为空");

+ 6 - 6
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/CancelHandler.java

@@ -152,10 +152,10 @@ public class CancelHandler extends AbstractWaybillOrderHandler<WaybillOrderCance
      */
     @Override
     protected void calculateAutoDispatchScore(WaybillOrderCancelParam param, KwtWaybillOrder waybillOrder) {
-        if (true) {
-            //先不执行自动派单逻辑
-            return;
-        }
+//        if (true) {
+//            //先不执行自动派单逻辑
+//            return;
+//        }
         // 获取司机行为规则配置
         DriverConductRulesVO driverRulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
         //分数
@@ -166,7 +166,7 @@ public class CancelHandler extends AbstractWaybillOrderHandler<WaybillOrderCance
             log.warn("【司机违规取消运单】企业{}的司机违规取消运单分钟数/分数异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
             throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【司机违规取消运单】配置的分钟数/分数需大于0!");
         }
-
+        long cancelOrderInMillis = cancelOrderMinutes * 60 * 1000;
         //司机接单时间
         KwtWaybillOrderNode takingOrderNodes = getNodesByOrderId(waybillOrder.getId(), CarWaybillV1Enum.PENDING_VEHICLE.getCode());
         Date takingOrderTime = takingOrderNodes.getCreateTime() != null ? takingOrderNodes.getCreateTime() : null;
@@ -176,7 +176,7 @@ public class CancelHandler extends AbstractWaybillOrderHandler<WaybillOrderCance
 
         // 计算两个时间的分钟差
         Long timeDiffMinutes = DateUtils.calculateTimeDiffMinutes(takingOrderTime, cancelNodeTime);
-        if (timeDiffMinutes > cancelOrderMinutes.longValue()) {
+        if (timeDiffMinutes > cancelOrderInMillis) {
             log.info("【司机违规取消运单】超时!司机违规取消运单分钟数限制:" + cancelOrderMinutes + "分钟,实际:" + timeDiffMinutes + "分钟");
             //1、更新司机分数(减分)
             cancelOrderScore = -Math.abs(cancelOrderScore);

+ 6 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java

@@ -118,10 +118,10 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
     @Override
     @Transactional(rollbackFor = Exception.class)
     protected void calculateAutoDispatchScore(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
-        if (true) {
-            //先不执行自动派单逻辑
-            return;
-        }
+//        if (true) {
+//            //先不执行自动派单逻辑
+//            return;
+//        }
         // 司机到达装货点是否超时(未按时到场)
         checkArrivedLoadingPointTimeout(waybillOrder);
 
@@ -169,6 +169,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
             log.warn("【司机未按时到场】企业{}的司机超时限制配置异常,运单ID:{}", entId,wOrderId);
             throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【司机未按时到场】司机超时限制配置需大于0!");
         }
+        long driverTimeoutInMillis = driverTimeout * 60 * 1000;
         //司机接单时间
         KwtWaybillOrderNode takingOrderNodes = getNodesByOrderId(wOrderId, CarWaybillV1Enum.PENDING_VEHICLE.getCode());
         Date takingOrderTime = takingOrderNodes.getCreateTime() != null ? takingOrderNodes.getCreateTime() : null;
@@ -179,7 +180,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         // 计算两个时间的分钟差
         Long timeDiffMinutes = DateUtils.calculateTimeDiffMinutes(takingOrderTime, comeIntoTime);
         //超时
-        if (timeDiffMinutes > driverTimeout.longValue()) {
+        if (timeDiffMinutes > driverTimeoutInMillis) {
             log.info("司机到场耗时超时!司机超时限制:" + driverTimeout + "分钟,实际:" + timeDiffMinutes + "分钟");
             return true;
         }

+ 4 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java

@@ -106,7 +106,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         List<KwtWaybillOrderAddress> addresses = createWaybillOrderAddress(param, waybillOrder, waybillOrderSubtask);
 
         //4、生成车辆运单-装卸货信息
-        createWaybillOrderTicket(param, logOrder, waybillOrder, waybillOrderSubtask, addresses);
+        createWaybillOrderTicket(logOrder, waybillOrder, waybillOrderSubtask, addresses);
 
         //5、更新上游订单:回写物流订单
         updateLogOrder(logOrder, truckLoadVolume);
@@ -431,13 +431,12 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
     /**
      * 生成车辆运单-装卸货信息
      *
-     * @param param
+     * @param logOrder
      * @param waybillOrder
      */
-    private void createWaybillOrderTicket(OrderCirculateTakingQueryParam param, KwtLogisticsOrder logOrder,
-                                          KwtWaybillOrder waybillOrder, KwtWaybillOrderSubtask waybillOrderSubtask,
+    private void createWaybillOrderTicket(KwtLogisticsOrder logOrder, KwtWaybillOrder waybillOrder, KwtWaybillOrderSubtask waybillOrderSubtask,
                                           List<KwtWaybillOrderAddress> waybillOrderAddresses) {
-        log.info("创建车辆运单-装卸货信息,入参参数:{}", JSON.toJSONString(param));
+        log.info("创建车辆运单-装卸货信息,运单id:{}", waybillOrder.getId());
 
         //装货地址
         KwtWaybillOrderAddress shipmentAddress = getWaybillOrderAddress(waybillOrderAddresses, AddressTypeEnum.SHIPMENT);

+ 5 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingHandler.java

@@ -271,7 +271,7 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
         } else {
             //订单按照卸货货方式计算
             KwtWaybillOrderNode node = getWaybillOrderNode(param, waybillOrder);
-            node.setRemark("司机[" + waybillOrder.getDriverName() + "]已上传卸货凭证");
+            node.setRemark("司机[" + waybillOrder.getDriverName() + "]已上传卸货凭证,卸货量[" + param.getUnloadAmount() + "]");
             waybillOrderNodeRepository.save(node);
             log.info("记录【卸货】节点轨迹成功,节点ID:{}", node.getId());
         }
@@ -279,10 +279,10 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
 
     @Override
     protected void calculateAutoDispatchScore(WaybillOrderUnloadParam param, KwtWaybillOrder waybillOrder) {
-        if (true) {
-            //先不执行自动派单逻辑
-            return;
-        }
+//        if (true) {
+//            //先不执行自动派单逻辑
+//            return;
+//        }
         //查询运单装卸货地址
         List<KwtWaybillOrderAddress> addressList = waybillOrderAddressRepository.queryByWOrderId(waybillOrder.getId());
         if (CollectionUtils.isEmpty(addressList)) {

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

@@ -5,6 +5,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 /**
  * @author :chenXiaoFei
@@ -184,9 +185,16 @@ public class LogisticsOrderResp implements Serializable {
     @Schema(description = "装卸货之间距离")
     private String distanceKm;
 
+    /**
+     * 订单余量(带单位)
+     */
+    @Schema(description = "订单余量(带单位)")
+    private String orderSurplus;
+
     /**
      * 订单余量
      */
     @Schema(description = "订单余量")
-    private String orderSurplus;
+    private BigDecimal remainingAmount;
+
 }

+ 0 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderProcessParam.java

@@ -29,14 +29,12 @@ public class WaybillOrderProcessParam implements Serializable {
      * 经度
      */
     @Schema(description = "经度")
-    @NotBlank(message = "未获取到定位,请重启app后再次操作")
     private String lng;
 
     /**
      * 纬度
      */
     @Schema(description = "纬度")
-    @NotBlank(message = "未获取到定位,请重启app后再次操作")
     private String lat;
 
     /**

+ 10 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderResp.java

@@ -137,4 +137,14 @@ public class WaybillOrderResp implements Serializable {
      */
     @Schema(description = "状态描述")
     private String statusDesc;
+    /**
+     * 实际运费
+     */
+    @Schema(description = "实际运费")
+    private String actualPrice;
+    /**
+     * 货物实际费用
+     */
+    @Schema(description = "货物实际费用")
+    private String actualGoodsPrice;
 }

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

@@ -209,5 +209,5 @@ public class WaybillOrderStatusResp implements Serializable {
      * 订单余量
      */
     @Schema(description = "订单余量")
-    private String orderSurplus;
+    private BigDecimal orderSurplus;
 }

+ 18 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/TruckInfoVo.java

@@ -28,27 +28,34 @@ public class TruckInfoVo implements Serializable {
     /**
      * 车辆id
      */
+    @Schema(description = "车辆id")
     private String truckId;
     /**
      * 司机id
      */
+    @Schema(description = "司机id")
     private String driveId;
     /**
      * 司机名称
      */
+    @Schema(description = "司机名称")
     private String driveName;
     /**
      * 承运单位
      */
+    @Schema(description = "承运单位")
     private String  carrier ;
 
     /**
      * 司机手机号
      */
+    @Schema(description = "司机手机号")
     private String drivePhone;
     /**
      * 运单状态
      */
+    @Schema(description = "运单状态")
+
     private String taskStatus;
 
     /**
@@ -83,6 +90,17 @@ public class TruckInfoVo implements Serializable {
      */
     @Schema(description = "任务地点")
     private String taskAddress;
+    /**
+     * 商品名称
+     */
+    @Schema(description = "商品名称")
+    private String goodsName;
+
+    /**
+     * 轴数
+     */
+    @Schema(description = "轴数")
+    private String axleNum;
 
     public static TruckInfoVo getInstance() {
         return new TruckInfoVo();

+ 11 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillOrderDetailResp.java

@@ -48,6 +48,17 @@ public class WaybillOrderDetailResp implements Serializable {
      */
     @Schema(description = "计费方式描述")
     private String priceTypeDesc;
+
+    /**
+     * 实际运费
+     */
+    @Schema(description = "实际运费")
+    private String actualPrice;
+    /**
+     * 货物实际费用
+     */
+    @Schema(description = "货物实际费用")
+    private String actualGoodsPrice;
     /**
      * 车牌号
      */

+ 1 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderCirculateRepository.java

@@ -64,6 +64,7 @@ public class KwtLogisticsOrderCirculateRepository extends ServiceImpl<KwtLogisti
                 .eq(Objects.nonNull(truckNo),KwtLogisticsOrderCirculate::getTruckNo, truckNo)
                 .eq(KwtLogisticsOrderCirculate::getEntId, entId)
                 .eq(KwtLogisticsOrderCirculate::getStatus, Global.NUMERICAL_ZERO) //0-开启,1-关闭
+                .last("limit 1")
         );
     }
 

+ 26 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderRepository.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.core.model.enums.LogisticsOrderV1Enum;
 import com.sckw.transport.dao.KwtLogisticsOrderMapper;
 import com.sckw.transport.model.KwtLogisticsOrder;
 import org.apache.commons.collections4.CollectionUtils;
@@ -11,6 +12,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Repository;
 
 import java.time.LocalDateTime;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
@@ -38,9 +40,9 @@ public class KwtLogisticsOrderRepository extends ServiceImpl<KwtLogisticsOrderMa
                 .eq(KwtLogisticsOrder::getTOrderId, tradeId));
     }
 
-        public IPage<KwtLogisticsOrder> queryByPage(Set<Long> logisticsOrderIds,Long  tradeOrderId,String orderNo,
+        public IPage<KwtLogisticsOrder> queryByPage(Set<Long> logisticsOrderIds, Long  tradeOrderId, String orderNo,
                                                     String status,
-                                                 String startTime, String endTime,  int pageNum, int pageSize) {
+                                                    Date startTime, Date endTime, int pageNum, int pageSize) {
         return page(new Page<>(pageNum, pageSize),
                 Wrappers.<KwtLogisticsOrder>lambdaQuery()
                         .eq(KwtLogisticsOrder::getDelFlag, 0)
@@ -48,8 +50,8 @@ public class KwtLogisticsOrderRepository extends ServiceImpl<KwtLogisticsOrderMa
                         .eq(Objects.nonNull(tradeOrderId),KwtLogisticsOrder::getTOrderId, tradeOrderId)
                         .eq(StringUtils.isNotBlank(status),KwtLogisticsOrder::getStatus, status)
                         .like(StringUtils.isNotBlank(orderNo),KwtLogisticsOrder::getLOrderNo, orderNo)
-                        .ge(StringUtils.isNotBlank(startTime),KwtLogisticsOrder::getLoadTime, startTime)
-                        .le(StringUtils.isNotBlank(startTime),KwtLogisticsOrder::getUnloadTime, endTime)
+                        .ge(Objects.nonNull(startTime),KwtLogisticsOrder::getCreateTime, startTime)
+                        .le(Objects.nonNull(endTime),KwtLogisticsOrder::getCreateTime, endTime)
                         .orderByDesc(KwtLogisticsOrder::getUpdateTime)
                         .orderByDesc(KwtLogisticsOrder::getId)
         );
@@ -119,7 +121,7 @@ public class KwtLogisticsOrderRepository extends ServiceImpl<KwtLogisticsOrderMa
     public KwtLogisticsOrder queryByLogisticOrderId(String lOrderNo) {
         return getOne(Wrappers.<KwtLogisticsOrder>lambdaQuery()
                 .eq(KwtLogisticsOrder::getDelFlag,0)
-                .eq(KwtLogisticsOrder::getId, lOrderNo)
+                .eq(KwtLogisticsOrder::getLOrderNo, lOrderNo)
                 .last("limit 1"));
     }
 
@@ -135,4 +137,23 @@ public class KwtLogisticsOrderRepository extends ServiceImpl<KwtLogisticsOrderMa
                 .in( KwtLogisticsOrder::getId, logOrderIds)
                 .like(StringUtils.isNotBlank(logisticOrderNo), KwtLogisticsOrder::getLOrderNo, logisticOrderNo));
     }
+
+
+    public List<KwtLogisticsOrder> queryByLogOrderIds(List<Long> logOrderIdList) {
+        return list(Wrappers.<KwtLogisticsOrder>lambdaQuery()
+                .in(KwtLogisticsOrder::getId, logOrderIdList)
+                .eq(KwtLogisticsOrder::getDelFlag,0)
+                .eq(KwtLogisticsOrder::getStatus, LogisticsOrderV1Enum.IN_TRANSIT.getCode())
+                .orderByDesc(KwtLogisticsOrder::getCreateTime)
+                .orderByDesc(KwtLogisticsOrder::getId));
+    }
+
+    public List<KwtLogisticsOrder> queryByLOrderIdsAndStatus(List<Long> logOrderIds) {
+        return list(Wrappers.<KwtLogisticsOrder>lambdaQuery()
+                .eq(KwtLogisticsOrder::getDelFlag,0)
+                .in(KwtLogisticsOrder::getId, logOrderIds)
+                .eq(KwtLogisticsOrder::getStatus, 10));
+    }
+
+
 }

+ 9 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderNodeRepository.java

@@ -3,10 +3,12 @@ package com.sckw.transport.repository;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.transport.dao.KwtWaybillOrderNodeMapper;
 import com.sckw.transport.model.KwtWaybillOrderNode;
 import org.springframework.stereotype.Repository;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
@@ -80,4 +82,11 @@ public class KwtWaybillOrderNodeRepository extends ServiceImpl<KwtWaybillOrderNo
                 .in(KwtWaybillOrderNode::getOrderStatus,statusList )
                 .orderByAsc(KwtWaybillOrderNode::getCreateTime));
     }
+
+    public List<KwtWaybillOrderNode> queryByOperateTime(Date startDate, Date endDate,Integer status) {
+        return list(Wrappers.<KwtWaybillOrderNode>lambdaQuery()
+                .eq(KwtWaybillOrderNode::getOrderStatus, status)
+                .between(KwtWaybillOrderNode::getCreateTime, startDate, endDate)
+                .orderByAsc(KwtWaybillOrderNode::getCreateTime));
+    }
 }

+ 5 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwfTaskService.java

@@ -51,7 +51,6 @@ public class KwfTaskService {
     private final KwtWaybillOrderRepository kwtWaybillOrderRepository;
     private final AmapProperties amapProperties;
     private final KwtWaybillOrderSubtaskRepository kwtWaybillOrderSubtaskRepository;
-    private final KwtLogisticsOrderRepository kwtLogisticsOrderRepository;
     private final KwtVehicleExceptionRepository kwtVehicleExceptionRepository;
     private final KwtLogisticsOrderUnitRepository kwtLogisticsOrderUnitRepository;
     private final KwtWaybillOrderSubtaskMapper waybillOrderSubtaskDao;
@@ -138,7 +137,6 @@ public class KwfTaskService {
         if (yesterdayTaskCount != 0.0){
             growthRate= (double) (yesterdayTaskCount - taskTotalBeforeYesterday) / taskTotalBeforeYesterday * 100;
         }
-        List<Long> waybillOrderIds = waybillOrder.stream().map(KwtWaybillOrder::getId).collect(Collectors.toList());
         //查询车辆异常车辆数
         List<KwtVehicleException> vehicleExceptions = kwtVehicleExceptionRepository.queryByEnt(wayOrderIds,startDate,endDate);
         Map<Long, List<KwtVehicleException>> vehicleExceptionMap = Optional.ofNullable(vehicleExceptions)
@@ -146,14 +144,15 @@ public class KwfTaskService {
                 .stream()
                 .collect(Collectors.groupingBy(KwtVehicleException::getTruckId));
         return getTaskStatisticsVo(totalCount, taskingCount, completedCount, yesterdayTaskCount,
-                taskTotalBeforeYesterday, growthRate, unloadTon, unloadTonThisMonth, unloadTonBeforeMonth,unloadGrowthRate,vehicleExceptionMap);
+                taskTotalBeforeYesterday, growthRate, unloadTon, unloadTonThisMonth, unloadTonBeforeMonth,unloadGrowthRate,vehicleExceptionMap,vehicleExceptions);
     }
 
 
     private TaskStatisticsVo getTaskStatisticsVo(int totalCount, long taskingCount, long completedCount
             , long yesterdayTaskCount, long taskTotalBeforeYesterday, double growthRate, double unloadTon
             , double unloadTonThisMonth, double unloadTonBeforeMonth,double unloadGrowthRate,
-                                                 Map<Long, List<KwtVehicleException>> vehicleExceptionMap) {
+                                                 Map<Long, List<KwtVehicleException>> vehicleExceptionMap,
+                                                 List<KwtVehicleException> vehicleExceptions) {
         TaskStatisticsVo taskStatisticsVo = new TaskStatisticsVo();
         taskStatisticsVo.setTaskTotal(String.valueOf(totalCount));
         taskStatisticsVo.setTaskRunning(String.valueOf(taskingCount));
@@ -161,7 +160,8 @@ public class KwfTaskService {
         taskStatisticsVo.setTaskPercent(taskingCount == 0 ? "0" : String.format("%.2f", (double) taskingCount / totalCount * 100));
         int size = vehicleExceptionMap.size();
         taskStatisticsVo.setTruckAbnormal(String.valueOf(size));
-        taskStatisticsVo.setWarningTotal("0");
+        int totalSize = Optional.ofNullable(vehicleExceptions).orElse(List.of()).size();
+        taskStatisticsVo.setWarningTotal(String.valueOf(totalSize));
         taskStatisticsVo.setTaskTotalYesterday(String.valueOf(yesterdayTaskCount));
         taskStatisticsVo.setTaskTotalBeforeYesterday(String.valueOf(taskTotalBeforeYesterday));
         taskStatisticsVo.setTaskPercentChange(String.format("%.2f", growthRate));

+ 98 - 49
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtAcceptCarriageOrderService.java

@@ -10,7 +10,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.google.common.collect.Lists;
-import com.mysql.cj.x.protobuf.MysqlxDatatypes;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.contract.api.model.dto.res.ContractCommonInfoResDto;
 import com.sckw.core.common.enums.StringConstant;
@@ -31,7 +30,6 @@ import com.sckw.excel.utils.DateUtil;
 import com.sckw.excel.utils.ValidUtil;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.vo.RTruckVo;
-import com.sckw.fleet.api.model.vo.TmsTruckAxleNumVO;
 import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
 import com.sckw.manage.api.RemoteManageService;
 import com.sckw.manage.api.model.dto.res.FindEntCooperateResVo;
@@ -85,6 +83,7 @@ import java.text.DecimalFormat;
 import java.text.ParseException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -3220,24 +3219,12 @@ public class KwtAcceptCarriageOrderService {
         List<KwtLogisticsOrderGoods> savelogOrderGoodsList = Lists.newArrayList();
         List<KwtLogisticsOrderContract> saveContractList = Lists.newArrayList();
         List<KwtLogisticsOrderUnit> savelogOrderUnitList = Lists.newArrayList();
+        List<KwtLogisticsOrderCirculate> savelogOrderCirculateList = Lists.newArrayList();
+        //装卸地之间距离
+        String distance = getDistance(orderDTO);
         //实际派车数 20
         Integer actualDisPatch = orderDTO.getActualDisPatch() == null ? 0 : orderDTO.getActualDisPatch();
         //已派车辆数(累计已分配的车辆数)
-        //装卸地之间距离
-        double distanceKm = LocUtils.calculateDistanceByAmap(
-                Optional.ofNullable(orderDTO.getLoadLng()).map(String::valueOf).orElse(null),
-                Optional.ofNullable(orderDTO.getLoadLat()).map(String::valueOf).orElse(null),
-                Optional.ofNullable(orderDTO.getUnloadLng()).map(String::valueOf).orElse(null),
-                Optional.ofNullable(orderDTO.getUnloadLat()).map(String::valueOf).orElse(null));
-        // 如果高德API调用失败,使用原始方法作为备选
-        if (distanceKm == -1) {
-            distanceKm = DistanceUtils.calculateDistance(
-                    Optional.ofNullable(orderDTO.getLoadLng()).map(Double::valueOf).orElse(null),
-                    Optional.ofNullable(orderDTO.getLoadLat()).map(Double::valueOf).orElse(null),
-                    Optional.ofNullable(orderDTO.getUnloadLng()).map(Double::valueOf).orElse(null),
-                    Optional.ofNullable(orderDTO.getUnloadLat()).map(Double::valueOf).orElse(null));
-        }
-        String distance = String.valueOf(distanceKm);
         Integer dispatched = 0;
         for (LogisticData x : logisticInfo) {
             Long lOrderId = new IdWorker(NumberConstant.ONE).nextId();
@@ -3249,7 +3236,7 @@ public class KwtAcceptCarriageOrderService {
                     break;
                 }
                 //校验物流企业可派车辆
-                List<RTruckVo> signEntAvailableVehicle = getSignEntAvailableVehicle(orderDTO.getGoodsId(), x.getAcceptCompanyId());
+                List<RTruckVo> signEntAvailableVehicle = getSignEntAvailableVehicle(orderDTO, x.getAcceptCompanyId());
                 if (CollectionUtils.isEmpty(signEntAvailableVehicle)) {
                     continue;
                 }
@@ -3280,7 +3267,7 @@ public class KwtAcceptCarriageOrderService {
                 setLogisticUnitInfo(orderDTO, x, lOrderId, savelogOrderUnitList);
 
                 //创建物流派单数据
-                setLogisticCirculateInfo(x, lOrderId, signEntAvailableVehicle);
+                setLogisticCirculateInfo(orderDTO, x, lOrderId, actualUseVehicles, savelogOrderCirculateList);
 
             } else {
                 //物流订单信息
@@ -3300,7 +3287,7 @@ public class KwtAcceptCarriageOrderService {
         }
 
         // 批量保存并检查结果
-        saveBatch(saveLogisticsOrderList, saveAddressList, savelogOrderGoodsList, saveContractList, savelogOrderUnitList, lOrderNo);
+        saveBatch(saveLogisticsOrderList, saveAddressList, savelogOrderGoodsList, saveContractList, savelogOrderUnitList, savelogOrderCirculateList, lOrderNo);
 
         //校验派车总量,处理未达标场景
         int unDispatched = actualDisPatch - dispatched;
@@ -3313,37 +3300,38 @@ public class KwtAcceptCarriageOrderService {
     }
 
     /**
-     * 创建物流派单数据
-     * @param x
-     * @param lOrderId
-     * @param signEntAvailableVehicle
+     * 获取装卸货地之间的导航距离
+     * @param orderDTO
+     * @return
      */
-    private void setLogisticCirculateInfo(LogisticData x, Long lOrderId, List<RTruckVo> signEntAvailableVehicle) {
-        DispatchCarReq req = new DispatchCarReq();
-        req.setEntId(String.valueOf(x.getAcceptCompanyId()));
-        req.setLogisticOrderId(String.valueOf(lOrderId));
-
-        List<DispatchCarReq.CarInfo> carInfoList = signEntAvailableVehicle.stream().map(ve -> {
-            DispatchCarReq.CarInfo carInfo = new DispatchCarReq.CarInfo();
-            carInfo.setTruckId(Optional.ofNullable(ve.getId()).map(String::valueOf).orElse(null));
-            carInfo.setTruckNo(ve.getTruckNo());
-            return carInfo;
-        }).collect(Collectors.toList());
-
-        req.setCarInfos(carInfoList);
-        logisticsConsignmentService.dispatchCar(req);
+    private static String getDistance(AddLogisticOrderDTO orderDTO) {
+        double distanceKm = LocUtils.calculateDistanceByAmap(
+                Optional.ofNullable(orderDTO.getLoadLng()).map(String::valueOf).orElse(null),
+                Optional.ofNullable(orderDTO.getLoadLat()).map(String::valueOf).orElse(null),
+                Optional.ofNullable(orderDTO.getUnloadLng()).map(String::valueOf).orElse(null),
+                Optional.ofNullable(orderDTO.getUnloadLat()).map(String::valueOf).orElse(null));
+        // 如果高德API调用失败,使用原始方法作为备选
+        if (distanceKm == -1) {
+            distanceKm = DistanceUtils.calculateDistance(
+                    Optional.ofNullable(orderDTO.getLoadLng()).map(Double::valueOf).orElse(null),
+                    Optional.ofNullable(orderDTO.getLoadLat()).map(Double::valueOf).orElse(null),
+                    Optional.ofNullable(orderDTO.getUnloadLng()).map(Double::valueOf).orElse(null),
+                    Optional.ofNullable(orderDTO.getUnloadLat()).map(Double::valueOf).orElse(null));
+        }
+        String distance = String.valueOf(distanceKm);
+        return distance;
     }
 
     /**
      * 单个物流企业满足轴数可派车
-     * @param goodId
+     * @param orderDTO
      * @param logEntId
      * @return
      */
-    public List<RTruckVo> getSignEntAvailableVehicle(Long goodId, Long logEntId) {
+    public List<RTruckVo> getSignEntAvailableVehicle(AddLogisticOrderDTO orderDTO, Long logEntId) {
 
         //查询商品轴数
-        KwpGoods goodsById = goodsInfoService.getGoodsById(goodId);
+        KwpGoods goodsById = goodsInfoService.getGoodsById(orderDTO.getGoodsId());
         if (goodsById == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "【创建物流订单】商品信息不能为空!");
         }
@@ -3356,13 +3344,14 @@ public class KwtAcceptCarriageOrderService {
         //过滤满足轴数的车辆
         List<RTruckVo> truckVoFilterList = truckVoList.stream()
                 .filter(Objects::nonNull)
-                .filter(truck -> axleNumStrId.contains(truck.getCarAxis()))
+                .filter(truck -> truck.getCarAxisId() != null)
+                .filter(truck ->    axleNumStrId.contains(String.valueOf(truck.getCarAxisId())))
                 .collect(Collectors.toList());
 
         //过滤满足车辆最大可派任务数的车辆
         return truckVoFilterList.stream().filter(Objects::nonNull)
                 // 过滤已派单且生效中的车辆 + 校验最大可派任务数
-                .filter(this::isTruckAvailable)
+                .filter(truck -> isTruckAvailable(truck, orderDTO.getEntId()))
                 .collect(Collectors.toList());
     }
 
@@ -3372,7 +3361,7 @@ public class KwtAcceptCarriageOrderService {
      * @param truck
      * @return
      */
-    private boolean isTruckAvailable(RTruckVo truck) {
+    private boolean isTruckAvailable(RTruckVo truck, Long entId) {
         // 查询车辆对应的物流订单合同(按车辆编号)
         String truckNo = truck.getTruckNo();
         if (StringUtils.isEmpty(truckNo)) {
@@ -3383,8 +3372,15 @@ public class KwtAcceptCarriageOrderService {
         if (CollectionUtils.isEmpty(circulatesList)) {
             return false;
         }
+        List<Long> lOrderIds = circulatesList.stream().map(KwtLogisticsOrderCirculate::getLOrderId).distinct().collect(Collectors.toList());
+        //查询当前车辆正在运输的物流订单
+        List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByLOrderIdsAndStatus(lOrderIds);
+        List<Long> inTransitLOrderIds = logisticsOrders.stream().map(KwtLogisticsOrder::getId).distinct().collect(Collectors.toList());
+        //过滤出正在运输的派车订单数据
+        List<KwtLogisticsOrderCirculate> orderCirculates = circulatesList.stream()
+                .filter(cir -> inTransitLOrderIds.contains(cir.getLOrderId()))
+                .collect(Collectors.toList());
 
-        Long entId = LoginUserHolder.getEntId();
         TruckDispatchCoefficientVO truckDispatchVO = fleetService.findAutoTruckDispatchByEntId(entId);
         if (truckDispatchVO == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "未找到自动派车系数!");
@@ -3395,15 +3391,18 @@ public class KwtAcceptCarriageOrderService {
             throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "自动派单车辆最大任务数需大于0!");
         }
         //TODO 车辆最大可派任务数校验
-        boolean available = circulatesList.size() < vehicleMaxTasks;
+        boolean available = orderCirculates.size() <= vehicleMaxTasks;
         return available;
 
     }
 
-    private void saveBatch(List<KwtLogisticsOrder> saveLogisticsOrderList, List<KwtLogisticsOrderAddress> saveAddressList, List<KwtLogisticsOrderGoods> savelogOrderGoodsList, List<KwtLogisticsOrderContract> saveContractList, List<KwtLogisticsOrderUnit> savelogOrderUnitList, String lOrderNo) {
-        log.info("开始批量保存物流订单数据,订单数量:{},地址数量:{},商品数量:{},合同数量:{},单位数量:{}",
+    private void saveBatch(List<KwtLogisticsOrder> saveLogisticsOrderList, List<KwtLogisticsOrderAddress> saveAddressList,
+                           List<KwtLogisticsOrderGoods> savelogOrderGoodsList, List<KwtLogisticsOrderContract> saveContractList,
+                           List<KwtLogisticsOrderUnit> savelogOrderUnitList, List<KwtLogisticsOrderCirculate> savelogOrderCirculateList,
+                           String lOrderNo) {
+        log.info("开始批量保存物流订单数据,订单数量:{},地址数量:{},商品数量:{},合同数量:{},单位数量:{}, 派车数量:{}",
                 saveLogisticsOrderList.size(), saveAddressList.size(), savelogOrderGoodsList.size(),
-                saveContractList.size(), savelogOrderUnitList.size());
+                saveContractList.size(), savelogOrderUnitList.size(), savelogOrderCirculateList.size());
 
         try {
             if (!saveLogisticsOrderList.isEmpty()) {
@@ -3446,6 +3445,23 @@ public class KwtAcceptCarriageOrderService {
                 }
             }
 
+            if (!savelogOrderCirculateList.isEmpty()) {
+                boolean result6 = logisticsOrderCirculateRepository.saveBatch(savelogOrderCirculateList);
+                log.info("物流订单派车保存结果:{}", result6);
+                if (!result6) {
+                    throw new BusinessException("物流订单派车保存失败");
+                }
+                //派车成功修改物流订单状态
+                saveLogisticsOrderList.forEach(
+                        logOrder -> logOrder.setStatus(LogisticsOrderV1Enum.IN_TRANSIT.getCode())
+                );
+
+                Boolean updateFlag = logisticsOrderRepository.updateBatchById(saveLogisticsOrderList);
+                if (!updateFlag) {
+                    throw new BusinessException("修改物流订单状态失败");
+                }
+            }
+
             log.info("物流订单批量保存成功,订单编号:{}", lOrderNo);
         } catch (Exception e) {
             log.error("物流订单批量保存失败,订单编号:{},错误信息:{}", lOrderNo, e.getMessage(), e);
@@ -3650,4 +3666,37 @@ public class KwtAcceptCarriageOrderService {
         kwtLogisticsOrder.setDistance(distance);
         saveLogisticsOrderList.add(kwtLogisticsOrder);
     }
+
+    /**
+     * 创建物流派单数据
+     * @param x
+     * @param lOrderId
+     * @param signEntAvailableVehicle
+     */
+    private void setLogisticCirculateInfo(AddLogisticOrderDTO orderDTO, LogisticData x, Long lOrderId,
+                                          List<RTruckVo> signEntAvailableVehicle,
+                                          List<KwtLogisticsOrderCirculate> savelogOrderCirculateList) {
+        for (RTruckVo truckVo : signEntAvailableVehicle) {
+            KwtLogisticsOrderCirculate logisticsOrderCirculate = new KwtLogisticsOrderCirculate();
+            logisticsOrderCirculate.setEntId(x.getAcceptCompanyId());
+            logisticsOrderCirculate.setLOrderId(lOrderId);
+            logisticsOrderCirculate.setTruckId(truckVo.getId());
+            logisticsOrderCirculate.setTruckNo(truckVo.getTruckNo());
+            logisticsOrderCirculate.setDriverId(-9L);
+            Date startDate = Objects.nonNull(orderDTO.getStartTime()) ?
+                    Date.from(orderDTO.getStartTime().atStartOfDay(ZoneId.systemDefault()).toInstant()) : null;
+            logisticsOrderCirculate.setStartTime(startDate);
+            Date endDate = Objects.nonNull(orderDTO.getEndTime()) ?
+                    Date.from(orderDTO.getEndTime().atStartOfDay(ZoneId.systemDefault()).toInstant())  : null;
+            logisticsOrderCirculate.setEndTime(endDate);
+            logisticsOrderCirculate.setUnit(orderDTO.getGoodsUnit());
+            logisticsOrderCirculate.setEntrustAmount(BigDecimal.ZERO);
+            Date date = new Date();
+            logisticsOrderCirculate.setCreateBy(LoginUserHolder.getUserId());
+            logisticsOrderCirculate.setCreateTime(date);
+            logisticsOrderCirculate.setUpdateBy(LoginUserHolder.getUserId());
+            logisticsOrderCirculate.setUpdateTime(date);
+            savelogOrderCirculateList.add(logisticsOrderCirculate);
+        }
+    }
 }

+ 471 - 118
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java

@@ -76,9 +76,13 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.ZoneId;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @author lfdc
@@ -2232,120 +2236,454 @@ public class KwtLogisticsConsignmentService {
         return logisticsOrderConsignmentService.logisticsOrderSubcontract(logisticsOrderSubcontractDto);
     }
 
+    // 自定义线程池
+    private static final ExecutorService QUERY_EXECUTOR = Executors.newFixedThreadPool(10);
+
+
+
     public PageDataResult<LogisticsOrderResp> queryLogisticsOrderByPage(QueryLogisticsOrderReq req) {
         log.info("分页查询物流订单传递参数信息:{}", JSONObject.toJSONString(req));
 
-        Set<Long> allEnt = getAllEnt(req.getEntId());
-        //根据托运单位或者承运单位查询企业
-        Set<Long> entList = getEntList(req);
-        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(allEnt)) {
-            entList.addAll(allEnt);
-        }
+        // 1. 并行获取基础数据
+        log.debug("开始并行获取基础数据");
+        Long allEnt = getAllEnt(req.getEntId());
 
-        //根据商品名称查询物流订单
+        BaseQueryData baseQueryData = fetchBaseQueryData(req);
+
+        // 2. 处理企业信息
+        log.debug("处理企业信息");
+        Set<Long> entList = processEnterpriseData(baseQueryData);
+
+        // 3. 获取物流订单ID集合
+        log.debug("获取物流订单ID集合");
         Set<Long> logOrderIds = getLogOrderIds(req, entList, allEnt);
-        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()))) {
+
+        // 4. 检查是否需要返回空结果
+        log.debug("检查是否需要返回空结果,logOrderIds大小: {}, entList大小: {}", logOrderIds.size(), entList.size());
+        if (shouldReturnEmptyResult(logOrderIds, entList, req)) {
+            log.info("满足返回空结果条件,直接返回空分页数据");
             return PageDataResult.empty(req.getPageNum(), req.getPageSize());
         }
 
-        //分页查询物流订单
-        IPage<KwtLogisticsOrder> page = logisticsOrderRepository.queryByPage(logOrderIds, req.getTradeOrderId(), req.getOrderNo(), req.getOrderStatus(),
-                req.getStartTime(), req.getEndTime(), req.getPageNum(), req.getPageSize());
+        // 5. 分页查询物流订单
+        log.debug("开始分页查询物流订单,订单ID数量: {}", logOrderIds.size());
+        IPage<KwtLogisticsOrder> page = queryLogisticsOrdersPage(logOrderIds, req);
         List<KwtLogisticsOrder> records = page.getRecords();
-        if (org.springframework.util.CollectionUtils.isEmpty(records)) {
+
+        if (CollectionUtils.isEmpty(records)) {
+            log.info("查询结果为空,返回空分页数据");
             return PageDataResult.empty(req.getPageNum(), req.getPageSize());
         }
-        //查获取物流订单号
-        List<Long> logOrderIdList =
-                records.stream().map(KwtLogisticsOrder::getId).distinct().collect(Collectors.toList());
-        //通过物流订单号查询运输的单位
-        List<KwtLogisticsOrderUnit> unitList = logisticsOrderUnitRepository.queryByLogOrderIds(logOrderIdList);
-        Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitTypeKeyAndUnitMap = Maps.newHashMap();
-        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(unitList)) {
-            logOrderIdAndUnitTypeKeyAndUnitMap = unitList.stream()
-                    .collect(Collectors.toMap(x -> x.getLOrderId() + "-" + x.getUnitType(),
-                            Function.identity(), (x, y) -> x));
+
+        log.info("分页查询结果,总记录数: {},当前页记录数: {}", page.getTotal(), records.size());
+
+        // 6. 提取物流订单ID列表
+        log.debug("提取物流订单ID列表");
+        List<Long> logOrderIdList = extractLogisticsOrderIds(records);
+
+        // 7. 并行获取相关数据
+        log.debug("并行获取相关数据");
+        RelatedOrderData relatedData = fetchRelatedOrderData(logOrderIdList, records);
+
+        // 8. 获取字典数据
+        log.debug("获取字典数据");
+        Map<String, Map<String, String>> dictMap = getCachedDictData(baseQueryData.getDictFuture());
+
+        // 9. 转换为响应对象
+        log.debug("转换为响应对象");
+        List<LogisticsOrderResp> resps = convertToResponseList(
+                records, relatedData, dictMap);
+
+        log.info("物流订单分页查询完成,返回结果数量: {}", resps.size());
+        return PageDataResult.of(page, resps);
+    }
+
+    /**
+     * 获取基础查询数据
+     */
+    private BaseQueryData fetchBaseQueryData(QueryLogisticsOrderReq req) {
+        CompletableFuture<Set<Long>> entListFuture = CompletableFuture.supplyAsync(
+                () -> getEntList(req), QUERY_EXECUTOR);
+        CompletableFuture<Map<String, Map<String, String>>> dictFuture = CompletableFuture.supplyAsync(
+                () -> getCachedDictData(), QUERY_EXECUTOR);
+
+        return new BaseQueryData(entListFuture, dictFuture);
+    }
+
+    /**
+     * 处理企业数据
+     */
+    private Set<Long> processEnterpriseData(BaseQueryData baseQueryData) {
+        Set<Long> entList = baseQueryData.getEntListFuture().join();
+        return entList;
+    }
+
+    /**
+     * 检查是否需要返回空结果
+     */
+    private boolean shouldReturnEmptyResult(Set<Long> logOrderIds, Set<Long> entList, QueryLogisticsOrderReq req) {
+        return CollectionUtils.isEmpty(logOrderIds) &&
+                (!org.apache.commons.lang3.StringUtils.isAllBlank(req.getContractId(), req.getGoodsName(),req.getConsignCompanyId(),req.getCarriageCompanyId()));
+    }
+
+    /**
+     * 分页查询物流订单
+     */
+    private IPage<KwtLogisticsOrder> queryLogisticsOrdersPage(Set<Long> logOrderIds, QueryLogisticsOrderReq req) {
+        QueryLogisticsOrderReq optimizedReq = optimizeRequestWithFilters(req);
+        Date startDate = null;
+        Date endDate = null;
+        if (org.apache.commons.lang3.StringUtils.isNoneBlank(optimizedReq.getStartTime(), optimizedReq.getEndTime())) {
+            startDate = DateUtils.getStartDate(optimizedReq.getStartTime());
+            endDate = DateUtils.getEndDate(optimizedReq.getEndTime());
         }
-        //查询贸易订单
+        return logisticsOrderRepository.queryByPage(
+                logOrderIds, optimizedReq.getTradeOrderId(), optimizedReq.getOrderNo(),
+                optimizedReq.getOrderStatus(), startDate,
+                endDate, optimizedReq.getPageNum(), optimizedReq.getPageSize());
+    }
+
+    /**
+     * 提取物流订单ID列表
+     */
+    private List<Long> extractLogisticsOrderIds(List<KwtLogisticsOrder> records) {
+        return records.stream()
+                .map(KwtLogisticsOrder::getId)
+                .distinct()
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 获取相关订单数据
+     */
+
+    /**
+     * 并行获取相关订单数据
+     * 包括:订单单位信息、订单商品信息、订单地址信息、订单合同信息、子运单信息和贸易订单信息
+     *
+     * @param logOrderIdList 物流订单ID列表
+     * @param records        物流订单记录列表
+     * @return RelatedOrderData 包含所有相关订单数据的对象
+     */
+
+    private RelatedOrderData fetchRelatedOrderData(List<Long> logOrderIdList, List<KwtLogisticsOrder> records) {
+        log.debug("开始并行获取相关订单数据,物流订单数量: {}", logOrderIdList.size());
+
+        // 并行执行多个不相互依赖的查询
+        CompletableFuture<List<KwtLogisticsOrderUnit>> unitListFuture = CompletableFuture.supplyAsync(
+                () -> {
+                    log.debug("开始查询物流订单单位信息");
+                    List<KwtLogisticsOrderUnit> result = logisticsOrderUnitRepository.queryByLogOrderIds(logOrderIdList);
+                    log.debug("物流订单单位信息查询完成,结果数量: {}", result.size());
+                    return result;
+                }, QUERY_EXECUTOR);
+
+        CompletableFuture<List<KwtLogisticsOrderGoods>> goodsListFuture = CompletableFuture.supplyAsync(
+                () -> {
+                    log.debug("开始查询物流订单商品信息");
+                    List<KwtLogisticsOrderGoods> result = logisticsOrderGoodsRepository.queryByLogOrderIds(logOrderIdList);
+                    log.debug("物流订单商品信息查询完成,结果数量: {}", result.size());
+                    return result;
+                }, QUERY_EXECUTOR);
+
+        CompletableFuture<Map<String, KwtLogisticsOrderAddress>> addressMapFuture = CompletableFuture.supplyAsync(
+                () -> {
+                    log.debug("开始查询物流订单地址信息");
+                    Map<String, KwtLogisticsOrderAddress> result = getStringKwtLogisticsOrderAddressMap(logOrderIdList);
+                    log.debug("物流订单地址信息查询完成,结果数量: {}", result.size());
+                    return result;
+                }, QUERY_EXECUTOR);
+
+        CompletableFuture<Map<Long, KwtLogisticsOrderContract>> contractMapFuture = CompletableFuture.supplyAsync(
+                () -> {
+                    log.debug("开始查询物流订单合同信息");
+                    Map<Long, KwtLogisticsOrderContract> result = getLongKwtLogisticsOrderContractMap(logOrderIdList);
+                    log.debug("物流订单合同信息查询完成,结果数量: {}", result.size());
+                    return result;
+                }, QUERY_EXECUTOR);
+
+        CompletableFuture<List<KwtWaybillOrderSubtask>> subtaskListFuture = CompletableFuture.supplyAsync(
+                () -> {
+                    log.debug("开始查询物流订单子运单信息");
+                    List<KwtWaybillOrderSubtask> result = waybillOrderSubtaskRepository.queryByLogIds(logOrderIdList);
+                    log.debug("物流订单子运单信息查询完成,结果数量: {}", result.size());
+                    return result;
+                }, QUERY_EXECUTOR);
+
+        // 并行处理贸易订单信息
+        CompletableFuture<Map<Long, OrderDetailVo>> tradeMapFuture = CompletableFuture.supplyAsync(
+                () -> {
+                    log.debug("开始查询贸易订单信息");
+                    Map<Long, OrderDetailVo> result = fetchTradeOrderData(records);
+                    log.debug("贸易订单信息查询完成,结果数量: {}", result.size());
+                    return result;
+                }, QUERY_EXECUTOR);
+
+        // 等待所有并行查询完成
+        log.debug("等待所有并行查询完成");
+        CompletableFuture.allOf(unitListFuture, goodsListFuture, addressMapFuture,
+                contractMapFuture, subtaskListFuture, tradeMapFuture).join();
+        log.debug("所有并行查询已完成");
+
+        // 处理查询结果
+        log.debug("开始处理查询结果");
+        Map<String, KwtLogisticsOrderUnit> unitMap = processUnitData(unitListFuture.join());
+        GoodsData goodsData = processGoodsData(goodsListFuture.join());
+        Map<String, KwtLogisticsOrderAddress> addressMap = addressMapFuture.join();
+        Map<Long, KwtLogisticsOrderContract> contractMap = contractMapFuture.join();
+        Map<Long, List<KwtWaybillOrderSubtask>> subtaskMap = processSubtaskData(subtaskListFuture.join());
+        Map<Long, OrderDetailVo> tradeMap = tradeMapFuture.join();
+        Map<Long, List<KwtLogisticsOrder>> tradeLogOrderMap = groupByTradeOrder(records);
+        log.debug("查询结果处理完成");
+
+        log.debug("相关订单数据获取完成");
+        return new RelatedOrderData(unitMap, goodsData, addressMap, contractMap,
+                subtaskMap, tradeMap, tradeLogOrderMap);
+    }
+
+    /**
+     * 获取贸易订单数据
+     */
+    private Map<Long, OrderDetailVo> fetchTradeOrderData(List<KwtLogisticsOrder> records) {
         Set<Long> tradeIds = records.stream()
                 .map(KwtLogisticsOrder::getTOrderId)
                 .collect(Collectors.toSet());
-        Map<Long, OrderDetailVo> tradeIdAndOrderDetailVoMap = Maps.newHashMap();
-        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tradeIds)) {
-            List<OrderDetailVo> orderDetailVos = tradeOrderInfoService.queryByTradeOrderIds(tradeIds);
-            tradeIdAndOrderDetailVoMap = orderDetailVos.stream()
-                    .collect(Collectors.toMap(OrderDetailVo::getId, Function.identity(), (x, y) -> x));
+
+        if (CollectionUtils.isEmpty(tradeIds)) {
+            return Maps.newHashMap();
         }
 
-        //查询商品信息
-        List<KwtLogisticsOrderGoods> logOrderGoodsList = logisticsOrderGoodsRepository.queryByLogOrderIds(logOrderIdList);
+        List<OrderDetailVo> orderDetailVos = tradeOrderInfoService.queryByTradeOrderIds(tradeIds);
+        return orderDetailVos.stream()
+                .collect(Collectors.toMap(OrderDetailVo::getId, Function.identity(), (x, y) -> x));
+    }
 
-        List<Long> goodsIds = Lists.newArrayList();
-        Map<Long, KwtLogisticsOrderGoods> logIdAndGoodsMap = Maps.newHashMap();
-        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(logOrderGoodsList)) {
-            goodsIds =
-                    logOrderGoodsList.stream().map(KwtLogisticsOrderGoods::getGoodsId).distinct().collect(Collectors.toList());
-            logIdAndGoodsMap =
-                    logOrderGoodsList.stream().collect(Collectors.toMap(KwtLogisticsOrderGoods::getLOrderId, Function.identity(),
-                            (x, y) -> x));
+    /**
+     * 处理单位数据
+     */
+    private Map<String, KwtLogisticsOrderUnit> processUnitData(List<KwtLogisticsOrderUnit> unitList) {
+        if (CollectionUtils.isEmpty(unitList)) {
+            return Maps.newHashMap();
         }
-        Map<Long, KwpGoods> goodsIdAndGoodsMap = Maps.newHashMap();
-        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(goodsIds)) {
-            goodsIdAndGoodsMap = goodsInfoService.getGoodsByIds(goodsIds);
+
+        return unitList.stream()
+                .collect(Collectors.toMap(x -> x.getLOrderId() + "-" + x.getUnitType(),
+                        Function.identity(), (x, y) -> x));
+    }
+
+    /**
+     * 处理商品数据
+     */
+    private GoodsData processGoodsData(List<KwtLogisticsOrderGoods> logOrderGoodsList) {
+        Map<Long, KwtLogisticsOrderGoods> logGoodsMap = Maps.newHashMap();
+        Map<Long, KwpGoods> goodsMap = Maps.newHashMap();
+
+        if (CollectionUtils.isNotEmpty(logOrderGoodsList)) {
+            List<Long> goodsIds = logOrderGoodsList.stream()
+                    .map(KwtLogisticsOrderGoods::getGoodsId)
+                    .distinct()
+                    .collect(Collectors.toList());
+
+            logGoodsMap = logOrderGoodsList.stream()
+                    .collect(Collectors.toMap(KwtLogisticsOrderGoods::getLOrderId,
+                            Function.identity(), (x, y) -> x));
+
+            if (CollectionUtils.isNotEmpty(goodsIds)) {
+                goodsMap = goodsInfoService.getGoodsByIds(goodsIds);
+            }
         }
 
-        //查询地址信息
-        Map<String, KwtLogisticsOrderAddress> logisticsOrderIdAndUnitTypeKeyAndAddressMap = getStringKwtLogisticsOrderAddressMap(logOrderIdList);
-        //查询物流订单合同信息
-        Map<Long, KwtLogisticsOrderContract> logOrderIdAndContractMap = getLongKwtLogisticsOrderContractMap(logOrderIdList);
+        return new GoodsData(logGoodsMap, goodsMap);
+    }
 
-        //查询字典
-        Map<String, Map<String, String>> dictValueAndDictResDtoMap = remoteSystemService.queryDictByType(Arrays.asList(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
-//        Map<String, SysDictResDto> dictValueAndDictResDtoMap = new HashMap<>();
-//        if (CollectionUtils.isNotEmpty(sysDictResDtos)){
-//            //字典value映射字典
-//            dictValueAndDictResDtoMap = sysDictResDtos.stream()
-//                    .collect(Collectors.toMap(SysDictResDto::getValue, Function.identity()));
-//
-//        }
+    /**
+     * 处理子运单数据
+     */
+    private Map<Long, List<KwtWaybillOrderSubtask>> processSubtaskData(List<KwtWaybillOrderSubtask> subtaskList) {
+        if (CollectionUtils.isEmpty(subtaskList)) {
+            return Maps.newHashMap();
+        }
+
+        return subtaskList.stream()
+                .collect(Collectors.groupingBy(KwtWaybillOrderSubtask::getLOrderId));
+    }
 
-        Map<Long, List<KwtLogisticsOrder>> tradeIdAndLogOrderList = records.stream()
+    /**
+     * 按贸易订单分组
+     */
+    private Map<Long, List<KwtLogisticsOrder>> groupByTradeOrder(List<KwtLogisticsOrder> records) {
+        return records.stream()
                 .collect(Collectors.groupingBy(KwtLogisticsOrder::getTOrderId));
+    }
+
+    /**
+     * 获取缓存的字典数据
+     */
+    private Map<String, Map<String, String>> getCachedDictData() {
+        // 这里可以使用Redis或本地缓存如Caffeine
+        // 如果缓存中没有,则查询远程系统并更新缓存
+        return remoteSystemService.queryDictByType(Arrays.asList(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
+    }
+
+    /**
+     * 获取缓存的字典数据
+     */
+    private Map<String, Map<String, String>> getCachedDictData(CompletableFuture<Map<String, Map<String, String>>> dictFuture) {
+        return dictFuture.join();
+    }
 
-        //子运单
-        List<KwtWaybillOrderSubtask> orderSubtaskList = waybillOrderSubtaskRepository.queryByLogIds(logOrderIdList);
-        Map<Long, List<KwtWaybillOrderSubtask>> logOrderIdAndSubtaskMap = Maps.newHashMap();
-        if (CollectionUtils.isNotEmpty(orderSubtaskList)) {
-            logOrderIdAndSubtaskMap = orderSubtaskList.stream()
-                    .collect(Collectors.groupingBy(KwtWaybillOrderSubtask::getLOrderId));
-        }
-
-        Map<String, KwtLogisticsOrderUnit> finalLogOrderIdAndUnitTypeKeyAndUnitMap = logOrderIdAndUnitTypeKeyAndUnitMap;
-        Map<Long, KwtLogisticsOrderGoods> finalLogIdAndGoodsMap = logIdAndGoodsMap;
-        Map<Long, KwpGoods> finalGoodsIdAndGoodsMap = goodsIdAndGoodsMap;
-        Map<String, KwtLogisticsOrderAddress> finalLogisticsOrderIdAndUnitTypeKeyAndAddressMap = logisticsOrderIdAndUnitTypeKeyAndAddressMap;
-        Map<Long, KwtLogisticsOrderContract> finalLogOrderIdAndContractMap = logOrderIdAndContractMap;
-        Map<Long, OrderDetailVo> finalTradeIdAndOrderDetailVoMap = tradeIdAndOrderDetailVoMap;
-        Map<Long, List<KwtWaybillOrderSubtask>> finalLogOrderIdAndSubtaskMap = logOrderIdAndSubtaskMap;
-        List<LogisticsOrderResp> resps = records.stream()
-                .map(x -> getLogisticsOrderResp(x, finalLogOrderIdAndUnitTypeKeyAndUnitMap, finalLogIdAndGoodsMap
-                        , finalGoodsIdAndGoodsMap, finalLogisticsOrderIdAndUnitTypeKeyAndAddressMap, finalLogOrderIdAndContractMap,
-                        dictValueAndDictResDtoMap, finalTradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList, finalLogOrderIdAndSubtaskMap))
+    /**
+     * 优化请求对象,添加过滤条件
+     */
+    private QueryLogisticsOrderReq optimizeRequestWithFilters(QueryLogisticsOrderReq req) {
+        QueryLogisticsOrderReq optimizedReq = new QueryLogisticsOrderReq();
+        BeanUtils.copyProperties(req, optimizedReq);
+
+        // 如果有承运单位或托运单位过滤条件,可以在这里添加到请求中
+        // 这样可以在数据库层面完成过滤,减少内存中的过滤操作
+
+        return optimizedReq;
+    }
+
+    /**
+     * 转换为响应对象列表
+     */
+    private List<LogisticsOrderResp> convertToResponseList(
+            List<KwtLogisticsOrder> records,
+            RelatedOrderData relatedData,
+            Map<String, Map<String, String>> dictMap) {
+
+        return records.stream()
+                .map(order -> getLogisticsOrderResp(
+                        order,
+                        relatedData.getUnitMap(),
+                        relatedData.getGoodsData().getLogGoodsMap(),
+                        relatedData.getGoodsData().getGoodsMap(),
+                        relatedData.getAddressMap(),
+                        relatedData.getContractMap(),
+                        dictMap,
+                        relatedData.getTradeMap(),
+                        relatedData.getTradeLogOrderMap(),
+                        relatedData.getSubtaskMap()))
                 .collect(Collectors.toList());
-        if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getConsignCompanyId())) {
-            resps = resps.stream()
-                    .filter(x -> org.apache.commons.lang3.StringUtils.equals(x.getConsignCompanyId(), req.getConsignCompanyId()))
-                    .collect(Collectors.toList());
+    }
+
+    /**
+     * 基础查询数据
+     */
+    private static class BaseQueryData {
+        private final CompletableFuture<Set<Long>> entListFuture;
+        private final CompletableFuture<Map<String, Map<String, String>>> dictFuture;
+
+        public BaseQueryData(CompletableFuture<Set<Long>> entListFuture,
+                             CompletableFuture<Map<String, Map<String, String>>> dictFuture) {
+            this.entListFuture = entListFuture;
+            this.dictFuture = dictFuture;
         }
-        if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getCarriageCompanyId())) {
-            resps = resps.stream()
-                    .filter(x -> org.apache.commons.lang3.StringUtils.equals(x.getCarriageCompanyId(), req.getCarriageCompanyId()))
-                    .collect(Collectors.toList());
+
+
+        public CompletableFuture<Set<Long>> getEntListFuture() {
+            return entListFuture;
+        }
+
+        public CompletableFuture<Map<String, Map<String, String>>> getDictFuture() {
+            return dictFuture;
+        }
+
+
+
+        public Set<Long> getEntList() {
+            return entListFuture.join();
         }
-        return PageDataResult.of(page, resps);
     }
 
+    /**
+     * 商品数据
+     */
+    private static class GoodsData {
+        private final Map<Long, KwtLogisticsOrderGoods> logGoodsMap;
+        private final Map<Long, KwpGoods> goodsMap;
+
+        public GoodsData(Map<Long, KwtLogisticsOrderGoods> logGoodsMap,
+                         Map<Long, KwpGoods> goodsMap) {
+            this.logGoodsMap = logGoodsMap;
+            this.goodsMap = goodsMap;
+        }
+
+        public Map<Long, KwtLogisticsOrderGoods> getLogGoodsMap() {
+            return logGoodsMap;
+        }
+
+        public Map<Long, KwpGoods> getGoodsMap() {
+            return goodsMap;
+        }
+    }
+
+    /**
+     * 相关订单数据
+     */
+    private static class RelatedOrderData {
+        private final Map<String, KwtLogisticsOrderUnit> unitMap;
+        private final GoodsData goodsData;
+        private final Map<String, KwtLogisticsOrderAddress> addressMap;
+        private final Map<Long, KwtLogisticsOrderContract> contractMap;
+        private final Map<Long, List<KwtWaybillOrderSubtask>> subtaskMap;
+        private final Map<Long, OrderDetailVo> tradeMap;
+        private final Map<Long, List<KwtLogisticsOrder>> tradeLogOrderMap;
+
+        public RelatedOrderData(Map<String, KwtLogisticsOrderUnit> unitMap,
+                                GoodsData goodsData,
+                                Map<String, KwtLogisticsOrderAddress> addressMap,
+                                Map<Long, KwtLogisticsOrderContract> contractMap,
+                                Map<Long, List<KwtWaybillOrderSubtask>> subtaskMap,
+                                Map<Long, OrderDetailVo> tradeMap,
+                                Map<Long, List<KwtLogisticsOrder>> tradeLogOrderMap) {
+            this.unitMap = unitMap;
+            this.goodsData = goodsData;
+            this.addressMap = addressMap;
+            this.contractMap = contractMap;
+            this.subtaskMap = subtaskMap;
+            this.tradeMap = tradeMap;
+            this.tradeLogOrderMap = tradeLogOrderMap;
+        }
+
+        public Map<String, KwtLogisticsOrderUnit> getUnitMap() {
+            return unitMap;
+        }
+
+        public GoodsData getGoodsData() {
+            return goodsData;
+        }
+
+        public Map<String, KwtLogisticsOrderAddress> getAddressMap() {
+            return addressMap;
+        }
+
+        public Map<Long, KwtLogisticsOrderContract> getContractMap() {
+            return contractMap;
+        }
+
+        public Map<Long, List<KwtWaybillOrderSubtask>> getSubtaskMap() {
+            return subtaskMap;
+        }
+
+        public Map<Long, OrderDetailVo> getTradeMap() {
+            return tradeMap;
+        }
+
+        public Map<Long, List<KwtLogisticsOrder>> getTradeLogOrderMap() {
+            return tradeLogOrderMap;
+        }
+    }
+
+    /**
+     * 优化请求对象,添加过滤条件
+     */
+    /**
+     * 获取缓存的字典数据
+     */
+
+
     @NotNull
     private static Set<Long> getEntList(QueryLogisticsOrderReq req) {
         Set<Long> entList = Sets.newHashSet();
@@ -2384,23 +2722,40 @@ public class KwtLogisticsConsignmentService {
     }
 
     @NotNull
-    private Set<Long> getLogOrderIds(QueryLogisticsOrderReq req, Set<Long> entList, Set<Long> allEnt) {
+    private Set<Long> getLogOrderIds(QueryLogisticsOrderReq req, Set<Long> entList, 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()))
+        if (Objects.nonNull(allEnt)){
+            entList.add(allEnt);
+        }
+        List<KwtLogisticsOrderUnit> logOrderUnits = logisticsOrderUnitRepository.queryByEntIds(entList);
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(logOrderUnits)) {
+            Long entId = LoginUserHolder.getEntId();
+            // 获取物流订单ID集合
+            Set<Long> logOrderIdList = logOrderUnits.stream()
+                    .filter(x->Objects.equals(x.getEntId(),entId))
+                    .map(KwtLogisticsOrderUnit::getLOrderId)
+                    .collect(Collectors.toSet());
+
+            // 根据托运单位和承运单位进行过滤
+            if (StringUtils.isNotBlank(req.getConsignCompanyId())) {
+                Set<Long> consignCompanyLogOrderIds = logOrderUnits.stream()
+                        .filter(x -> Objects.equals(x.getEntId(), Long.valueOf(req.getConsignCompanyId())))
+                        .map(KwtLogisticsOrderUnit::getLOrderId)
+                        .collect(Collectors.toSet());
+                // 只有当托运单位过滤条件存在时,才进行交集操作
+                logOrderIdList.retainAll(consignCompanyLogOrderIds);
+            }
+
+            if (StringUtils.isNotBlank(req.getCarriageCompanyId())) {
+                Set<Long> carriageCompanyLogOrderIds = logOrderUnits.stream()
+                        .filter(x -> Objects.equals(x.getEntId(), Long.valueOf(req.getCarriageCompanyId())))
                         .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);
+                // 只有当承运单位过滤条件存在时,才进行交集操作
+                logOrderIdList.retainAll(carriageCompanyLogOrderIds);
             }
+
+            logOrderIds.addAll(logOrderIdList);
         }
         if (StringUtils.isNotBlank(req.getContractId())) {
             List<KwtLogisticsOrderContract> kwtLogisticsOrderContracts = logisticsOrderContractRepository.queryByContractId(Long.parseLong(req.getContractId()));
@@ -2424,10 +2779,10 @@ public class KwtLogisticsConsignmentService {
                 //获取物流订单
                 Set<Long> logOrderFormGoodsIds =
                         logisticsOrderGoodsList.stream().map(KwtLogisticsOrderGoods::getLOrderId).collect(Collectors.toSet());
-                logOrderIds.addAll(logOrderFormGoodsIds);
-                logOrderIds  = logOrderIds.stream()
-                        .filter(x->logOrderFormGoodsIds.contains(x))
-                        .collect(Collectors.toSet());
+                logOrderIds.retainAll(logOrderFormGoodsIds);
+//                logOrderIds  = logOrderIds.stream()
+//                        .filter(x->logOrderFormGoodsIds.contains(x))
+//                        .collect(Collectors.toSet());
             }else {
                 logOrderIds = Sets.newHashSet();
             }
@@ -2437,8 +2792,7 @@ public class KwtLogisticsConsignmentService {
     }
 
     @NotNull
-    private Set<Long> getAllEnt(String entId) {
-        Set<Long> allEnt = Sets.newHashSet();
+    private Long getAllEnt(String entId) {
         //根据企业类型查询企业
         Long enterId = null;
         if (org.apache.commons.lang3.StringUtils.isBlank(entId)) {
@@ -2446,11 +2800,8 @@ public class KwtLogisticsConsignmentService {
         } else {
             enterId = Long.parseLong(entId);
         }
-        if (Objects.isNull(enterId)) {
-            return allEnt;
-        }
-        allEnt.add(enterId);
-        return allEnt;
+
+        return enterId;
     }
 
     @NotNull
@@ -2526,12 +2877,13 @@ public class KwtLogisticsConsignmentService {
         logisticsOrderResp.setStatus(String.valueOf(kwtLogisticsOrder.getStatus()));
         logisticsOrderResp.setStatusDesc(LogisticsOrderV1Enum.getDesc(kwtLogisticsOrder.getStatus()));
         //设置余量
-        String orderSurplus = getSupAmount(kwtLogisticsOrder.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList, logisticsOrderIdAndSubtaskList);
-        logisticsOrderResp.setOrderSurplus(orderSurplus + kwtLogisticsOrder.getUnit());
+        BigDecimal orderSurplus = getSupAmount(kwtLogisticsOrder.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList, logisticsOrderIdAndSubtaskList);
+        logisticsOrderResp.setOrderSurplus(orderSurplus.toPlainString() + kwtLogisticsOrder.getUnit());
+        logisticsOrderResp.setRemainingAmount(orderSurplus);
         return logisticsOrderResp;
     }
 
-    private static String getSupAmount(Long tradeOrderId,
+    private static BigDecimal getSupAmount(Long tradeOrderId,
                                        Map<Long, OrderDetailVo> tradeIdAndOrderDetailVoMap,
                                        Map<Long, List<KwtLogisticsOrder>> tradeIdAndLogOrderList,
                                        Map<Long, List<KwtWaybillOrderSubtask>> logisticsOrderIdAndSubtaskList) {
@@ -2570,7 +2922,8 @@ public class KwtLogisticsConsignmentService {
                 //logTotatalAmount = logTotatalAmount.add(unloadAmountSum);
             }
         }
-        return tradeAmount.subtract(logTotatalAmount).setScale(2, RoundingMode.HALF_UP).toPlainString();
+        BigDecimal subSurplus = tradeAmount.subtract(logTotatalAmount).compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : tradeAmount.subtract(logTotatalAmount);
+        return subSurplus.setScale(2, RoundingMode.HALF_UP);
     }
 
     public LogisticsOrderDetailResp getLogisticsOrderDetail(@Valid LogisticsOrderReq req) {
@@ -2710,7 +3063,7 @@ public class KwtLogisticsConsignmentService {
                     BigDecimal.ZERO;
             performanceInfoVO.setLoadAmount(loadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + logisticsOrder.getUnit());
             performanceInfoVO.setUnloadAmount("-");
-            BigDecimal surplusAmount = tradeAmount.subtract(orderAmount.add(loadAmount));
+            BigDecimal surplusAmount = tradeAmount.subtract(orderAmount.add(loadAmount)).compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : tradeAmount.subtract(orderAmount.add(loadAmount));
             performanceInfoVO.setSurplusAmount(surplusAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + logisticsOrder.getUnit());
 
         } else if (org.apache.commons.lang3.StringUtils.equals(logisticsOrder.getBillingMode(),
@@ -2719,7 +3072,7 @@ public class KwtLogisticsConsignmentService {
                     BigDecimal.ZERO;
             performanceInfoVO.setLoadAmount(loadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + logisticsOrder.getUnit());
             performanceInfoVO.setUnloadAmount(unloadAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + logisticsOrder.getUnit());
-            BigDecimal surplusAmount = tradeAmount.subtract(orderAmount.add(unloadAmount));
+            BigDecimal surplusAmount = tradeAmount.subtract(orderAmount.add(unloadAmount)).compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : tradeAmount.subtract(orderAmount.add(unloadAmount));
             performanceInfoVO.setSurplusAmount(surplusAmount.setScale(2, RoundingMode.HALF_UP).toPlainString() + logisticsOrder.getUnit());
 
         }
@@ -2798,7 +3151,7 @@ public class KwtLogisticsConsignmentService {
             goodsInfoVO.setGoodsName(kwpGoods.getName() + "/" + goodsTypeMap.getOrDefault(kwpGoods.getGoodsType(), "") + "/" + goodsSpecMap.getOrDefault(kwpGoods.getSpec(), ""));
             priceUnit = kwpGoods.getPriceUnit();
         }
-        goodsInfoVO.setUnitPrice((Objects.nonNull(logisticsOrder.getPrice()) ? logisticsOrder.getPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "0.00") + logisticsOrder.getUnit());
+        goodsInfoVO.setUnitPrice((Objects.nonNull(logisticsOrder.getPrice()) ? logisticsOrder.getPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "0.00") + "元");
         goodsInfoVO.setOrderAmount((Objects.nonNull(orderDetailVo.getAmount()) ? orderDetailVo.getAmount().setScale(2, RoundingMode.HALF_UP).toPlainString() : "0.00") + logisticsOrder.getUnit());
         BigDecimal carriageCost = Objects.nonNull(orderDetailVo.getAmount()) && Objects.nonNull(logisticsOrder.getPrice()) ?
                 orderDetailVo.getAmount().multiply(logisticsOrder.getPrice()) : BigDecimal.ZERO;
@@ -3246,11 +3599,11 @@ public class KwtLogisticsConsignmentService {
         List<LogisticsOrderV1Enum> orderV1Enums = Arrays.stream(LogisticsOrderV1Enum.values())
                 .sorted(Comparator.comparingInt(LogisticsOrderV1Enum::getCode))
                 .collect(Collectors.toList());
-        Set<Long> allEnt = getAllEnt(req.getEntId());
+        Long allEnt = getAllEnt(req.getEntId());
         //根据托运单位或者承运单位查询企业
         Set<Long> entList = getEntList(req);
-        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(allEnt)) {
-            entList.addAll(allEnt);
+        if (Objects.nonNull(allEnt)) {
+            entList.add(allEnt);
         }
 
         if (!org.apache.commons.lang3.StringUtils.isAllBlank(req.getConsignCompanyId(), req.getCarriageCompanyId())

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 704 - 181
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java


+ 102 - 59
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/VehicleExceptionService.java

@@ -23,6 +23,7 @@ import com.sckw.transport.repository.KwtLogisticsOrderAddressRepository;
 import com.sckw.transport.repository.KwtLogisticsOrderUnitRepository;
 import com.sckw.transport.repository.KwtVehicleExceptionRepository;
 import com.sckw.transport.repository.KwtWaybillOrderSubtaskRepository;
+import lombok.Data;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
@@ -58,6 +59,12 @@ public class VehicleExceptionService {
      * @return 分页结果
      */
 
+    /**
+     * 分页查询车辆异常图片信息
+     *
+     * @param req 查询请求参数
+     * @return 车辆异常图片分页结果
+     */
     /**
      * 分页查询车辆异常图片信息
      *
@@ -65,15 +72,11 @@ public class VehicleExceptionService {
      * @return 车辆异常图片分页结果
      */
     public PageDataResult<VehicleExceptionVo> queryExceptionList(VehicleExceptionQueryReq req) {
-        log.info("分页查询车辆异常信息,参数:{}", JSON.toJSONString( req));
-        if (StringUtils.isBlank( req.getStartDate())){
-            String startDate = DateUtils.format(DateUtils.getStartOfDay(new Date()), DateUtils.DATE_TIME_PATTERN);
-            req.setStartDate(startDate);
-        }
-        if (StringUtils.isBlank( req.getEndDate())){
-            String endDate = DateUtils.format(DateUtils.getEndOfDay(new Date()), DateUtils.DATE_TIME_PATTERN);
-            req.setEndDate(endDate);
-        }
+        log.info("分页查询车辆异常信息,参数:{}", JSON.toJSONString(req));
+
+        // 设置默认日期参数
+        setDefaultDateRange(req);
+
         // 分页查询异常图片数据
         IPage<KwtVehicleException> page = exceptionImageRepository.queryExceptionImagePage(
                 req.getEntId(),
@@ -84,86 +87,126 @@ public class VehicleExceptionService {
                 req.getPageNum(),
                 req.getPageSize()
         );
-        
+
         // 获取查询结果记录列表
         List<KwtVehicleException> records = page.getRecords();
         // 如果记录为空,返回空的分页结果
         if (CollectionUtils.isEmpty(records)) {
             return PageDataResult.empty(req.getPageNum(), req.getPageSize());
         }
-        
+
         // 如果有定位状态筛选条件,需要查询车辆实时定位状态
-        Map<String, Integer> truckLocationStatusMap = new HashMap<>();
+        Map<String, Integer> truckLocationStatusMap = Collections.emptyMap();
         if (req.getLocationStatus() != null) {
             // 提取所有不重复的车牌号
-
             Map<Long, String> truckIdAndTruckNoMap = records.stream()
-                    .filter(x->Objects.nonNull(x.getTruckId()))
+                    .filter(x -> Objects.nonNull(x.getTruckId()))
                     .collect(Collectors.toMap(KwtVehicleException::getTruckId, KwtVehicleException::getTruckNo, (k1, k2) -> k1));
 
             // 批量查询车辆定位状态
             truckLocationStatusMap = queryVehicleLocationStatus(truckIdAndTruckNoMap);
         }
-        
+
         // 提取所有不重复的运单ID
         List<Long> waybillOrderIds = records.stream()
                 .map(KwtVehicleException::getWOrderId)
+                .filter(Objects::nonNull)
                 .distinct()
                 .collect(Collectors.toList());
-        
-        // 初始化地址和运单信息Map
-        Map<String, KwtLogisticsOrderAddress> logisticsOrderAddressMap = Maps.newHashMap();
-        Map<Long, KwtWaybillOrderSubtask> waybillOrderSubtaskMap = Maps.newHashMap();
-        
-        // 如果存在运单ID,则查询相关运单和地址信息
-        if (CollectionUtils.isNotEmpty(waybillOrderIds)){
-            // 查询运单信息
-            List<KwtWaybillOrderSubtask> subtasks = waybillOrderSubtaskRepository.queryByWOrderIds(waybillOrderIds);
-            List<Long> logisticOrderIds = Lists.newArrayList();
-            
-            // 如果查询到运单信息,则提取物流订单ID
-            if (CollectionUtils.isNotEmpty(subtasks)){
-                logisticOrderIds = subtasks.stream().map(KwtWaybillOrderSubtask::getLOrderId)
-                        .distinct()
-                        .collect(Collectors.toList());
-                // 构建运单ID到运单信息的映射关系
-                waybillOrderSubtaskMap = subtasks.stream()
-                        .collect(Collectors.toMap(KwtWaybillOrderSubtask::getWOrderId, Function.identity(), (k1, k2) -> k1));
-            }
-            
-            // 如果存在物流订单ID,则查询相关地址信息
-            if (CollectionUtils.isNotEmpty(logisticOrderIds)){
-                // 查询地址信息
-                List<KwtLogisticsOrderAddress> logisticOrderAddresses = logisticsOrderAddressRepository.queryByLogOrderIds(logisticOrderIds);
-                // 构建物流订单ID+地址类型到地址信息的映射关系
-                logisticsOrderAddressMap = Optional.ofNullable(logisticOrderAddresses)
-                        .orElse(List.of())
-                        .stream().collect(Collectors.toMap(x -> x.getLOrderId() + "_" + x.getAddressType(), Function.identity(), (k1, k2) -> k1));
-            }
+
+        // 查询相关运单和地址信息
+        Map<String, KwtLogisticsOrderAddress> logisticsOrderAddressMap;
+        Map<Long, KwtWaybillOrderSubtask> waybillOrderSubtaskMap;
+
+        if (CollectionUtils.isNotEmpty(waybillOrderIds)) {
+            // 查询运单信息和地址信息
+            LogisticsOrderData logisticsOrderData = queryLogisticsOrderData(waybillOrderIds);
+            waybillOrderSubtaskMap = logisticsOrderData.getWaybillOrderSubtaskMap();
+            logisticsOrderAddressMap = logisticsOrderData.getLogisticsOrderAddressMap();
+        } else {
+            logisticsOrderAddressMap = Collections.emptyMap();
+            waybillOrderSubtaskMap = Collections.emptyMap();
         }
-        
+
         // 将查询结果转换为VO对象
         final Map<String, Integer> finalLocationStatusMap = truckLocationStatusMap;
-        Map<String, KwtLogisticsOrderAddress> finalLogisticsOrderAddressMap = logisticsOrderAddressMap;
-        Map<Long, KwtWaybillOrderSubtask> finalWaybillOrderSubtaskMap = waybillOrderSubtaskMap;
-        
+        final Integer locationStatusFilter = req.getLocationStatus();
+
+
         // 遍历异常图片记录,构建VO对象列表
         List<VehicleExceptionVo> voList = records.stream()
-                .map(image -> buildVehicleExceptionVo(image, finalLocationStatusMap,finalWaybillOrderSubtaskMap, finalLogisticsOrderAddressMap))
-                // 过滤掉空值
+                .map(image -> buildVehicleExceptionVo(image, finalLocationStatusMap, waybillOrderSubtaskMap, logisticsOrderAddressMap))
+                // 过滤掉空值和不符合定位状态条件的记录
                 .filter(Objects::nonNull)
+                .filter(vo -> locationStatusFilter == null || locationStatusFilter.equals(vo.getLocationStatus()))
                 .collect(Collectors.toList());
-        
-        // 如果有定位状态筛选条件,再次过滤结果
-        if (req.getLocationStatus() != null) {
-            voList = voList.stream()
-                    .filter(vo -> req.getLocationStatus().equals(vo.getLocationStatus()))
-                    .collect(Collectors.toList());
-        }
-        
+
         // 返回分页结果
         return PageDataResult.of(page, voList);
     }
+
+    /**
+     * 设置默认日期范围
+     */
+    private void setDefaultDateRange(VehicleExceptionQueryReq req) {
+        if (StringUtils.isBlank(req.getStartDate())) {
+            String startDate = DateUtils.format(DateUtils.getStartOfDay(new Date()), DateUtils.DATE_TIME_PATTERN);
+            req.setStartDate(startDate);
+        }
+        if (StringUtils.isBlank(req.getEndDate())) {
+            String endDate = DateUtils.format(DateUtils.getEndOfDay(new Date()), DateUtils.DATE_TIME_PATTERN);
+            req.setEndDate(endDate);
+        }
+    }
+
+    /**
+     * 查询物流订单相关数据
+     */
+    private LogisticsOrderData queryLogisticsOrderData(List<Long> waybillOrderIds) {
+        LogisticsOrderData data = new LogisticsOrderData();
+
+        // 查询运单信息
+        List<KwtWaybillOrderSubtask> subtasks = waybillOrderSubtaskRepository.queryByWOrderIds(waybillOrderIds);
+
+        if (CollectionUtils.isNotEmpty(subtasks)) {
+            // 构建运单ID到运单信息的映射关系
+            Map<Long, KwtWaybillOrderSubtask> waybillOrderSubtaskMap = subtasks.stream()
+                    .collect(Collectors.toMap(KwtWaybillOrderSubtask::getWOrderId, Function.identity(), (k1, k2) -> k1));
+
+            // 提取物流订单ID
+            List<Long> logisticOrderIds = subtasks.stream()
+                    .map(KwtWaybillOrderSubtask::getLOrderId)
+                    .filter(Objects::nonNull)
+                    .distinct()
+                    .collect(Collectors.toList());
+
+            // 查询地址信息
+            if (CollectionUtils.isNotEmpty(logisticOrderIds)) {
+                List<KwtLogisticsOrderAddress> logisticOrderAddresses = logisticsOrderAddressRepository.queryByLogOrderIds(logisticOrderIds);
+                // 构建物流订单ID+地址类型到地址信息的映射关系
+                Map<String, KwtLogisticsOrderAddress> logisticsOrderAddressMap = Optional.ofNullable(logisticOrderAddresses)
+                        .orElse(Collections.emptyList())
+                        .stream()
+                        .collect(Collectors.toMap(x -> x.getLOrderId() + "_" + x.getAddressType(), Function.identity(), (k1, k2) -> k1));
+
+                data.setLogisticsOrderAddressMap(logisticsOrderAddressMap);
+            }
+
+            data.setWaybillOrderSubtaskMap(waybillOrderSubtaskMap);
+        }
+
+        return data;
+    }
+
+    /**
+     * 物流订单数据容器
+     */
+    @Data
+    private static class LogisticsOrderData {
+        private Map<Long, KwtWaybillOrderSubtask> waybillOrderSubtaskMap;
+        private Map<String, KwtLogisticsOrderAddress> logisticsOrderAddressMap;
+    }
+
     /**
      * 构建车辆异常图片VO
      *

+ 88 - 22
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java

@@ -1,12 +1,11 @@
 package com.sckw.transport.service.app;
 
 
-import cn.hutool.core.map.MapUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.google.common.collect.Maps;
+import com.google.common.collect.Lists;
 import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
@@ -18,7 +17,6 @@ import com.sckw.core.model.enums.LogisticsOrderV1Enum;
 import com.sckw.core.model.enums.UnitTypeEnum;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.DateUtils;
-import com.sckw.core.utils.DistanceUtils;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.vo.RTruckVo;
@@ -28,7 +26,6 @@ import com.sckw.order.api.model.OrderUnitInfoDetailVO;
 import com.sckw.product.api.dubbo.GoodsInfoService;
 import com.sckw.product.api.model.KwpGoods;
 import com.sckw.system.api.RemoteSystemService;
-import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
 import com.sckw.transport.handler.*;
 import com.sckw.transport.model.*;
@@ -36,7 +33,7 @@ import com.sckw.transport.model.param.*;
 import com.sckw.transport.model.vo.OrderTotalTakeVo;
 import com.sckw.transport.model.vo.StatisticsWaybillResp;
 import com.sckw.transport.repository.*;
-import com.sckw.transport.service.*;
+import com.sckw.transport.service.KwtWaybillOrderV1Service;
 import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -203,6 +200,9 @@ public class WaybillOrderService {
         if (StringUtils.isBlank(param.getTruckNo())) {
             return PageDataResult.empty(param.getPageNum(), param.getPageSize());
         }
+        //查询车辆信息
+        RTruckVo rTruckVo = getTruck(param.getTruckNo());
+
         List<KwtLogisticsOrderCirculate> circulateList = logisticsOrderCirculateRepository.queryOrderCirculateByEntId(param.getEntId(), param.getTruckNo());
         if (CollectionUtils.isEmpty(circulateList)) {
             log.info("当前车辆无派单订单,truckNo:{}", param.getTruckNo());
@@ -215,14 +215,7 @@ public class WaybillOrderService {
         List<Long> logOrderIdList = circulateList.stream().map(KwtLogisticsOrderCirculate::getLOrderId).filter(Objects::nonNull).collect(Collectors.toList());
 
         //物流订单
-        LambdaQueryWrapper<KwtLogisticsOrder> queryWrapper = Wrappers.<KwtLogisticsOrder>lambdaQuery()
-                .in(KwtLogisticsOrder::getId, logOrderIdList)
-                .eq(KwtLogisticsOrder::getDelFlag,0)
-                .eq(KwtLogisticsOrder::getStatus, LogisticsOrderV1Enum.IN_TRANSIT.getCode())
-                .orderByDesc(KwtLogisticsOrder::getCreateTime)
-                .orderByDesc(KwtLogisticsOrder::getId);
-        Page<KwtLogisticsOrder> page = logisticsOrderRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), queryWrapper);
-        List<KwtLogisticsOrder> logOrderList = page.getRecords();
+        List<KwtLogisticsOrder> logOrderList = logisticsOrderRepository.queryByLogOrderIds(logOrderIdList);
         if (CollectionUtils.isEmpty(logOrderList)) {
             log.info("当前车辆无物流订单,truckNo:{}", param.getTruckNo());
             throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_STATUS_ERROR, "当前车辆无物流订单");
@@ -297,12 +290,82 @@ public class WaybillOrderService {
                 .map(order -> {
                     return getLogisticsOrderResp(order, logOrderIdAndGoodsMap, goodsIdAndGoodsMap, logOrderIdAndUnitMap,
                             tOrderIdAndUnitMap, logOrderIdAndAddressMap, logOrderIdAndCirculateMap, tradeIdAndOrderDetailVoMap,
-                            tradeIdAndLogOrderList,logOrderIdAndSubtaskMap,dictValueAndDictResDtoMap);
-                }).collect(Collectors.toList());
+                            tradeIdAndLogOrderList, logOrderIdAndSubtaskMap, dictValueAndDictResDtoMap);
+                })
+                .filter(logisticsOrderResp -> {
+                    // 校验是否满足车辆任务量,满足才保留
+                    return checkCurTruckLoadVolume(rTruckVo, logisticsOrderResp.getRemainingAmount());
+                })
+                .collect(Collectors.toList());
+
+        //内存分页
+        List<List<LogisticsOrderResp>> pageList = Lists.partition(ordderList, param.getPageSize());
+        List<LogisticsOrderResp> walletPageList = pageList.size() >= param.getPageNum() ?
+                pageList.get(param.getPageNum() - 1) : Collections.emptyList();
+
+        PageDataResult<LogisticsOrderResp> walletPageResponse = PageDataResult.success(param.getPageNum(), param.getPageSize(), (long) walletPageList.size(), walletPageList);
         log.info("查询司机关联车辆的物流订单成功!");
-        return PageDataResult.success(param.getPageNum(), param.getPageSize(), page.getTotal(), ordderList);
+        return walletPageResponse;
+
+    }
+
+    /**
+     * 校验车辆状态
+     * @param param
+     * @return
+     */
+    private RTruckVo getTruck(String truckNo) {
+        RTruckVo truckVO = remoteFleetService.findTruckByTruckNo(truckNo);
+        if (truckVO == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_NOT_FOUND, "当前车辆不存在");
+        }
+        //核定载重
+        if (truckVO.getLegalLoad() == null || BigDecimal.ZERO.compareTo(truckVO.getLegalLoad()) == 0) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.RESOURCE_NOT_FOUND, "车辆核定载重不能为空!");
+        }
+
+        return truckVO;
     }
 
+    /**
+     * 校验当前车辆任务量:
+     * 若有皮重:任务量 = 核定载重 - 皮重
+     * 若无皮重:任务量 = 核定载重 × 80%
+     * <p>
+     * 1.当订单余量>=车辆的(法定载重-首次皮重)且<(法定载重-首次皮重 + 2)时,接取的任务量为车辆的(法定载重-首次皮重);
+     * 2.订单余量<车辆的(法定载重-首次皮重)时,该车辆无法接单;
+     * 3.当订单余量>= (法定载重-首次皮重 + 2)时,接取的任务量为 (法定载重-首次皮重 + 2)
+     *
+     * @param truckNo
+     */
+    private Boolean checkCurTruckLoadVolume(RTruckVo truckNo, BigDecimal remainingAmount) {
+        log.info("开始校验当前车辆任务量!");
+        //核定载重
+        BigDecimal actualWeight = truckNo.getLegalLoad();
+        //首次皮重
+        BigDecimal tareWeight = truckNo.getTareWeight();
+        //任务量
+        BigDecimal loadVolume;
+        if (tareWeight != null) {
+            // 有皮重:任务量 = 核定载重 - 皮重
+            loadVolume = actualWeight.subtract(tareWeight);
+            log.info("车辆有皮重,皮重:{}, 任务量:{}", tareWeight, loadVolume);
+
+        } else {
+            // 无皮重:任务量 = 核定载重 × 80%
+            loadVolume = actualWeight.multiply(EIGHTY_PERCENT);
+            log.info("车辆无皮重,按80%核定载重计算,车辆任务量:{}", loadVolume);
+        }
+
+        if (remainingAmount.compareTo(loadVolume) < 0) {
+            // 规则2:订单余量 < 任务量 → 无法接单
+            return false;
+        }
+
+        return true;
+    }
+
+
     /**
      * 装卸货地址
      * @param logOrderIdList
@@ -388,8 +451,10 @@ public class WaybillOrderService {
         orderResp.setStatus(Optional.ofNullable(order.getStatus()).map(String::valueOf).orElse(null));
         orderResp.setStatusDesc(LogisticsOrderV1Enum.IN_TRANSIT.getCode().equals(order.getStatus()) ? "待接单" : "未知状态");
         //设置余量
-        String orderSurplus = getSupAmount(order.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList, logisticsOrderIdAndSubtaskList);
-        orderResp.setOrderSurplus(orderSurplus);
+        BigDecimal orderSurplus = getSupAmount(order.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList, logisticsOrderIdAndSubtaskList);
+        orderResp.setOrderSurplus(orderSurplus.toPlainString());
+        orderResp.setRemainingAmount(orderSurplus);
+
         return orderResp;
     }
 
@@ -741,7 +806,7 @@ public class WaybillOrderService {
         wbOrderResp.setChargeTypeDesc(DictEnum.getLabel(DictTypeEnum.CHARGING_TYPE.getType(), logOrder.getBillingMode()));
         //设置余量
         KwtLogisticsOrder order = logOrderMap.getOrDefault(wbOrder.getLOrderId(), new KwtLogisticsOrder());
-        String supAmount = getSupAmount(order.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList, logisticsOrderIdAndSubtaskList);
+        BigDecimal supAmount = getSupAmount(order.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList, logisticsOrderIdAndSubtaskList);
         wbOrderResp.setOrderSurplus(supAmount);
         //托运企业
         KwtLogisticsOrderUnit consignEnt = logOrderIdAndUnitMap.getOrDefault(wbOrder.getLOrderId() + "-" + UnitTypeEnum.CONSIGN.getCode(), new KwtLogisticsOrderUnit());
@@ -818,7 +883,7 @@ public class WaybillOrderService {
 
     }
 
-    private static String getSupAmount(Long tradeOrderId,
+    private static BigDecimal getSupAmount(Long tradeOrderId,
                                        Map<Long, OrderDetailVo> tradeIdAndOrderDetailVoMap,
                                        Map<Long, List<KwtLogisticsOrder>> tradeIdAndLogOrderList,
                                        Map<Long, List<KwtWaybillOrderSubtask>> logisticsOrderIdAndSubtaskList) {
@@ -837,7 +902,6 @@ public class WaybillOrderService {
                         .map(KwtWaybillOrderSubtask::getEntrustAmount)
                         .filter(Objects::nonNull)
                         .reduce(BigDecimal.ZERO, BigDecimal::add);
-                //logTotatalAmount = logTotatalAmount.add(loadAmountSum);
                 if (org.apache.commons.lang3.StringUtils.equals(billingMode, DictEnum.CHARGING_TYPE_1.getValue())){
                     BigDecimal unloadAmountSum = waybillOrderSubtasks.stream()
                             .filter(x->!Objects.equals(x.getStatus(),CarWaybillV1Enum.CANCELLED.getCode()))
@@ -857,7 +921,9 @@ public class WaybillOrderService {
                 //logTotatalAmount = logTotatalAmount.add(unloadAmountSum);
             }
         }
-        return tradeAmount.subtract(logTotatalAmount).setScale(2, RoundingMode.HALF_UP).toPlainString();
+
+        BigDecimal subSurplus = tradeAmount.subtract(logTotatalAmount).compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : tradeAmount.subtract(logTotatalAmount);
+        return subSurplus.setScale(2, RoundingMode.HALF_UP);
     }
 
     /**

+ 531 - 216
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/kwfTruckTraceService.java

@@ -31,6 +31,7 @@ import com.sckw.order.api.dubbo.RemoteTradeOrderAmountService;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.payment.api.dubbo.PaymentDubboService;
 import com.sckw.product.api.dubbo.GoodsInfoService;
+import com.sckw.product.api.model.KwpGoods;
 import com.sckw.redis.utils.RedissonUtils;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.EntCacheResDto;
@@ -66,6 +67,7 @@ import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.BeanUtils;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
@@ -367,20 +369,28 @@ public class kwfTruckTraceService {
 
     private TruckInfoVo getTruckInfo(String truckId, String wOrderNo,String truckNo) {
         //先查询缓存 如果缓存没有就查数据中台 数据中台没有就查中交
-        String location = RedissonUtils.getString(CommonConstants.TRUCK_LOCATION + truckId+CommonConstants.UNDERSCORE+wOrderNo);
+
+        KwtWaybillOrder order = kwtWaybillOrderRepository.findOneByTruckId(truckId);
+        if (Objects.isNull(order)){
+            throw new BusinessException("该车辆运单信息不存在");
+        }
+        String location = RedissonUtils.getString(CommonConstants.TRUCK_LOCATION + truckId+CommonConstants.UNDERSCORE+order.getWOrderNo());
         if (StringUtils.isNotBlank(location)){
-            TruckDto truckDto = JSON.parseObject(location, TruckDto.class);
+            TruckInfoVo truckDto = JSON.parseObject(location, TruckInfoVo.class);
             //如果运单号为空那么返回redis的数据 这个数据是app最后一次上报的数据
             if (Objects.nonNull(truckDto)){
-                return getTruckInfoVo(truckId, truckDto);
+                return truckDto;
+               // return getTruckInfoVo(truckId, truckDto);
             }
         }
 
         //缓存没有则查询数据中台
         VehicleReturnData vehicleReturnData = getVehicleReturnData(truckId);
         if (Objects.nonNull(vehicleReturnData)){
-            saveRedisCache(truckId, wOrderNo, truckNo, vehicleReturnData);
-            return buildTruckInfo(truckId, vehicleReturnData, truckNo);
+           // saveRedisCache(truckId, wOrderNo, truckNo, vehicleReturnData);
+            TruckInfoVo truckInfoVo = buildTruckInfo(truckId, vehicleReturnData, truckNo,order);
+            RedissonUtils.putString(CommonConstants.TRUCK_LOCATION + truckId +CommonConstants.UNDERSCORE+ truckInfoVo.getOrderNo(), JSON.toJSONString(truckInfoVo),10,TimeUnit.DAYS);
+            return truckInfoVo;
         }
         //todo 查询中交 如果数据中台没有数据则查询中交
        // return getTruckInfoVoByZj(truckNo, wOrderNo,truckId);
@@ -493,7 +503,7 @@ public class kwfTruckTraceService {
      * @param vehicleReturn 中台数据
      * @return 组织的数据
      */
-    private TruckInfoVo buildTruckInfo(String truckId, VehicleReturnData vehicleReturn, String truckNo) {
+    private TruckInfoVo buildTruckInfo(String truckId, VehicleReturnData vehicleReturn, String truckNo,KwtWaybillOrder order) {
         TruckInfoVo truckInfoVo = TruckInfoVo.getInstance();
 
         truckInfoVo.setTruckNo(truckNo);
@@ -501,7 +511,6 @@ public class kwfTruckTraceService {
         truckInfoVo.setLongitude(vehicleReturn.getLongitude());
         truckInfoVo.setLatitude(vehicleReturn.getLatitude());
         truckInfoVo.setLocationTime(Objects.isNull(vehicleReturn.getTs())? "" : DateUtils.format(vehicleReturn.getTs().toLocalDateTime(),DateUtils.DATE_TIME_PATTERN));
-        KwtWaybillOrder order = kwtWaybillOrderRepository.findOneByTruckId(truckId);
         if (Objects.nonNull(order)){
             truckInfoVo.setTruckNo(order.getTruckNo());
             truckInfoVo.setOrderNo(order.getWOrderNo());
@@ -541,6 +550,19 @@ public class kwfTruckTraceService {
             }
         }
         truckInfoVo.setTaskAddress(startPoint+"-"+endPoint);
+        //查询物流商品
+        KwtLogisticsOrderGoods kwtLogisticsOrderGoods = kwtLogisticsOrderGoodsRepository.queryByLogOrderId(subtask.getLOrderId());
+        Long goodsId = Optional.ofNullable(kwtLogisticsOrderGoods)
+                .map(KwtLogisticsOrderGoods::getGoodsId)
+                .orElse(null);
+        //查询商品
+        KwpGoods goodsById = goodsInfoService.getGoodsById(goodsId);
+        //查询字典
+        Map<String, Map<String, String>> dictByTypeMap = remoteSystemService.queryDictByType(Arrays.asList(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
+        truckInfoVo.setGoodsName(goodsById.getName() + "/" + dictByTypeMap.get(DictTypeEnum.PRODUCT_NAME_TYPE.getType()).get(goodsById.getGoodsType()) + "/" + dictByTypeMap.get(DictTypeEnum.GOODS_SPEC.getType()).get(goodsById.getSpec()));
+        Long truck = com.sckw.core.utils.StringUtils.isNotBlank(truckId) ? Long.parseLong(truckId) : null;
+        Optional.ofNullable(fleetService.findTruck(truck))
+                .ifPresent(f->truckInfoVo.setAxleNum(f.getCarAxis()));
         return truckInfoVo;
     }
 
@@ -857,59 +879,141 @@ public class kwfTruckTraceService {
      * @param req 查询请求
      * @return 车辆下拉列表
      */
-    public List<TruckSelectVo> getTruckSelectList(TruckSelectReq req) {
-        log.info("查询车辆下拉列表参数:{}", JSON.toJSONString( req));
-        Long entId = LoginUserHolder.getEntId();
-        //根据企业查询物流订单
-        List<KwtLogisticsOrderUnit> kwtLogisticsOrderUnits = kwtLogisticsOrderUnitRepository.queryByEntId(entId);
-        if (CollUtil.isEmpty(kwtLogisticsOrderUnits)) {
-            log.info("该企业未查询到物流订单数据,企业id:{}", entId);
-            return List.of();
-        }
-        //获取物流订单号
-        Set<Long> logOrderIds = kwtLogisticsOrderUnits.stream()
-                .map(KwtLogisticsOrderUnit::getLOrderId)
-                .collect(Collectors.toSet());
-        if (CollUtil.isEmpty(logOrderIds)) {
-            log.info("该企业下物流订单数据,企业id:{}", entId);
-            return List.of();
-        }
-        //查询子运单
-        List<KwtWaybillOrderSubtask> kwtWaybillOrderSubtasks = waybillOrderSubtaskDao.selectList(Wrappers.<KwtWaybillOrderSubtask>lambdaQuery()
-                .in(KwtWaybillOrderSubtask::getLOrderId, logOrderIds)
-                .eq(BaseModel::getDelFlag, 0));
-        if(org.apache.commons.collections4.CollectionUtils.isEmpty(kwtWaybillOrderSubtasks)){
-            log.info("该企业下子运单的订单数据不存在,企业id:{}", entId);
-            return List.of();
-        }
-        Set<Long> wayOrderIds = kwtWaybillOrderSubtasks.stream()
-                .map(KwtWaybillOrderSubtask::getWOrderId)
-                .collect(Collectors.toSet());
-        // 使用 Repository 查询车辆运单数据
-        List<KwtWaybillOrder> waybillOrders = kwtWaybillOrderRepository.selectTruckListForSelect(req.getTruckNo(),wayOrderIds,req.getWaybillOrderNo());
-        
-        if (CollectionUtils.isEmpty(waybillOrders)) {
-            return new ArrayList<>();
-        }
-        
-        // 获取所有车牌号列表,用于查询实时位置
+public List<TruckSelectVo> getTruckSelectList(TruckSelectReq req) {
+    // 参数校验
+    if (req == null) {
+        log.warn("查询车辆下拉列表参数为空");
+        return Collections.emptyList();
+    }
 
-        Map<Long, String> truckIdTruckNoMap = waybillOrders.stream()
-                .filter(x->Objects.nonNull(x.getTruckId()))
-                .collect(Collectors.toMap(KwtWaybillOrder::getTruckId, KwtWaybillOrder::getTruckNo, (key1, key2) -> key1));
+    log.info("查询车辆下拉列表参数:{}", JSON.toJSONString(req));
 
-        // 批量查询实时位置状态(30分钟内有数据为在线)
-        Map<String, Integer> truckLocationStatusMap = getStringIntegerMap(truckIdTruckNoMap);
+    // 获取当前企业ID
+    Long entId = LoginUserHolder.getEntId();
 
-        // 转换为 VO 对象并根据状态筛选
-        return waybillOrders.stream()
-                .map(order -> getTruckSelectVo(order, truckLocationStatusMap))
-                // 根据请求参数筛选定位状态
-                .filter(vo -> req.getLocationStatus() == null || vo.getLocationStatus().equals(req.getLocationStatus()))
-                .sorted(Comparator.comparing(TruckSelectVo::getLocationStatus).reversed())
-                .collect(Collectors.toList());
+    // 获取物流订单ID集合
+    Set<Long> logOrderIds = getLogisticsOrderIds(entId);
+    if (CollUtil.isEmpty(logOrderIds)) {
+        return Collections.emptyList();
+    }
+
+    // 获取运单ID集合
+    Set<Long> wayOrderIds = getWayOrderIds(logOrderIds);
+    if (CollectionUtils.isEmpty(wayOrderIds)) {
+        return Collections.emptyList();
     }
 
+    // 查询车辆运单数据
+    List<KwtWaybillOrder> waybillOrders = queryWaybillOrders(req, wayOrderIds);
+    if (CollectionUtils.isEmpty(waybillOrders)) {
+        return Collections.emptyList();
+    }
+
+    // 获取车辆位置状态映射
+    Map<String, Integer> truckLocationStatusMap = getTruckLocationStatusMap(
+            getTruckIdTruckNoMap(waybillOrders));
+
+    // 转换为 VO 对象并根据状态筛选
+    Integer locationStatusFilter = req.getLocationStatus();
+
+    return waybillOrders.stream()
+            .map(order -> buildTruckSelectVo(order, truckLocationStatusMap))
+            // 根据请求参数筛选定位状态
+            .filter(vo -> locationStatusFilter == null || vo.getLocationStatus().equals(locationStatusFilter))
+            // 按定位状态降序排序
+            .sorted(Comparator.comparing(TruckSelectVo::getLocationStatus).reversed())
+            .collect(Collectors.toList());
+}
+
+/**
+ * 获取物流订单ID集合
+ */
+private Set<Long> getLogisticsOrderIds(Long entId) {
+    // 根据企业查询物流订单
+    List<KwtLogisticsOrderUnit> logisticsOrderUnits = kwtLogisticsOrderUnitRepository.queryByEntId(entId);
+    if (CollUtil.isEmpty(logisticsOrderUnits)) {
+        log.info("该企业未查询到物流订单数据,企业id:{}", entId);
+        return Collections.emptySet();
+    }
+
+    // 获取物流订单号
+    return logisticsOrderUnits.stream()
+            .map(KwtLogisticsOrderUnit::getLOrderId)
+            .filter(Objects::nonNull)
+            .collect(Collectors.toSet());
+}
+
+/**
+ * 获取运单ID集合
+ */
+private Set<Long> getWayOrderIds(Set<Long> logOrderIds) {
+    // 查询子运单
+    List<KwtWaybillOrderSubtask> waybillOrderSubtasks = waybillOrderSubtaskDao.selectList(
+            Wrappers.<KwtWaybillOrderSubtask>lambdaQuery()
+                    .in(KwtWaybillOrderSubtask::getLOrderId, logOrderIds)
+                    .eq(BaseModel::getDelFlag, 0));
+
+    if (CollectionUtils.isEmpty(waybillOrderSubtasks)) {
+        log.info("该企业下子运单的订单数据不存在,企业id:{}", LoginUserHolder.getEntId());
+        return Collections.emptySet();
+    }
+
+    return waybillOrderSubtasks.stream()
+            .map(KwtWaybillOrderSubtask::getWOrderId)
+            .filter(Objects::nonNull)
+            .collect(Collectors.toSet());
+}
+
+/**
+ * 查询车辆运单数据
+ */
+private List<KwtWaybillOrder> queryWaybillOrders(TruckSelectReq req, Set<Long> wayOrderIds) {
+    return kwtWaybillOrderRepository.selectTruckListForSelect(
+            req.getTruckNo(), wayOrderIds, req.getWaybillOrderNo());
+}
+
+/**
+ * 获取车辆ID和车牌号映射
+ */
+private Map<Long, String> getTruckIdTruckNoMap(List<KwtWaybillOrder> waybillOrders) {
+    return waybillOrders.stream()
+            .filter(order -> Objects.nonNull(order.getTruckId()))
+            .collect(Collectors.toMap(
+                    KwtWaybillOrder::getTruckId,
+                    KwtWaybillOrder::getTruckNo,
+                    (key1, key2) -> key1));
+}
+
+/**
+ * 构建车辆选择VO
+ */
+private TruckSelectVo buildTruckSelectVo(KwtWaybillOrder order, Map<String, Integer> truckLocationStatusMap) {
+    TruckSelectVo vo = new TruckSelectVo();
+    BeanUtils.copyProperties(order, vo);
+
+    String truckNo = order.getTruckNo();
+    if (StringUtils.isNotBlank(truckNo) && truckLocationStatusMap != null) {
+        vo.setLocationStatus(truckLocationStatusMap.getOrDefault(truckNo, 0));
+    } else {
+        vo.setLocationStatus(0);
+    }
+
+    return vo;
+}
+
+/**
+ * 获取车辆位置状态映射
+ */
+private Map<String, Integer> getTruckLocationStatusMap(Map<Long, String> truckIdTruckNoMap) {
+    if (MapUtils.isEmpty(truckIdTruckNoMap)) {
+        return Collections.emptyMap();
+    }
+
+    // 批量查询实时位置状态(30分钟内有数据为在线)
+    return getStringIntegerMap(truckIdTruckNoMap);
+}
+
+
     @NotNull
     private Map<String, Integer> getStringIntegerMap(Map<Long, String> truckIdTruckNoMap) {
         Map<String, Integer> truckLocationStatusMap = new HashMap<>();
@@ -977,216 +1081,425 @@ public class kwfTruckTraceService {
      * @param req 查询请求
      * @return 分页结果
      */
+    /**
+     * 分页查询地图车辆列表
+     * @param req 查询请求参数,包括日期范围、状态、车牌号、承运单位、托运单位等筛选条件
+     * @return 分页结果,包含车辆在地图上的相关信息
+     */
     public PageDataResult<MapVehicleVo> queryMapVehicleList(MapVehicleQueryReq req) {
+        // 打印查询参数日志
         log.info("分页查询地图车辆列表参数:{}", req);
-        Set<Long> allEnt = getAllEnt();
+
         // 处理日期参数,默认为当天
         Date startDate = getStartDate(req.getStartDate());
         Date endDate = getEndDate(req.getEndDate());
 
-        // 进行中任务状态:已接单(1)、到达装货点(5)、已装货(10)、已离场(15)
-        List<Integer> taskingStatus = Lists.newArrayList();
-        if (Objects.nonNull(req.getStatus())) {
-            taskingStatus.add(req.getStatus());
-        } else {
-            taskingStatus.addAll(Arrays.asList(CarWaybillV1Enum.PENDING_VEHICLE.getCode(),CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode(), CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),
-                    CarWaybillV1Enum.EXIT_COMPLETED.getCode(), CarWaybillV1Enum.WAIT_LOADING.getCode()));
-        }
-        
+        // 构建查询状态列表,如果未指定状态则查询任务中的订单
+        List<Integer> taskingStatus = buildTaskingStatus(req.getStatus());
+
         // 前置条件:根据承运单位和托运单位筛选出符合条件的运单ID
-        Set<Long> wayOrderIds = getWayOrderIds(req,allEnt);
-        if (CollectionUtils.isEmpty(wayOrderIds) && (StringUtils.isNotBlank(req.getLogisticOrderNo()) || Objects.nonNull(req.getCarrierEntId()) || Objects.nonNull(req.getConsignEntId()) || Objects.nonNull(LoginUserHolder.getEntId()))) {
+        Set<Long> wayOrderIds = getWayOrderIds(req, getAllEnt());
+        // 如果没有符合条件的运单ID,直接返回空结果
+        if (shouldReturnEmptyResult(req, wayOrderIds)) {
             return PageDataResult.empty(req.getPageNum(), req.getPageSize());
         }
 
         // 使用 MyBatis-Plus 分页查询(如果有前置筛选条件,则添加运单ID的IN条件)
-
+        // 根据日期范围、状态、运单ID、车牌号等条件查询运单信息
         IPage<KwtWaybillOrder> page = kwtWaybillOrderRepository.queryMapVehicleListPage(startDate, endDate, taskingStatus, wayOrderIds,req.getTrackNo(), req.getPageNum(),req.getPageSize() );
         
         List<KwtWaybillOrder> waybillOrders = page.getRecords();
         if (CollectionUtils.isEmpty(waybillOrders)) {
             return PageDataResult.empty(req.getPageNum(), req.getPageSize());
         }
-        
-        // 获取运单ID列表
-        List<Long> wOrderIds = waybillOrders.stream()
+
+        // 提取运单ID列表,用于后续批量查询
+        List<Long> wOrderIds = extractWOrderIds(waybillOrders);
+        // 提取车辆ID列表,用于查询车辆详细信息
+        List<Long> truckIds = extractTruckIds(waybillOrders);
+
+        // 批量查询相关数据,提高查询效率
+        Map<Long, RTruckVo> truckIdMap = batchQueryTruckInfo(truckIds);
+        // 批量查询子运单信息
+        Map<Long, KwtWaybillOrderSubtask> wOrderIdSubtaskMap = batchQuerySubtasks(wOrderIds);
+        // 从子运单信息中提取物流订单ID
+        Set<Long> lOrderIds = extractLOrderIds(wOrderIdSubtaskMap);
+
+        // 批量查询物流订单相关数据(单位、货物、地址、订单信息)
+        LogisticsOrderData logisticsOrderData = batchQueryLogisticsOrderData(lOrderIds);
+
+        // 批量查询定位和异常信息
+        Map<String, VehicleLocationInfo> locationInfoMap = batchQueryLocationInfo(waybillOrders);
+        Map<String, Integer> exceptionCountMap = batchQueryExceptionCount(waybillOrders);
+
+        // 获取字典数据,用于车辆能源类型转换
+        Map<String, SysDictResDto> energyTypeMap = getEnergyTypeMap();
+
+        // 根据定位状态筛选(在线/离线),如果未指定定位状态则不过滤
+        List<KwtWaybillOrder> filteredOrders = filterByLocationStatus(waybillOrders, locationInfoMap, req.getLocationStatus());
+
+        // 将查询结果转换为前端需要的VO对象
+        List<MapVehicleVo> result = convertToMapVehicleVos(
+                filteredOrders, wOrderIdSubtaskMap, logisticsOrderData,
+                locationInfoMap, exceptionCountMap, truckIdMap, energyTypeMap);
+        // 根据过滤后的结果创建新的分页对象,确保总数准确
+        Page<MapVehicleVo> filteredPage = new Page<>();
+        filteredPage.setCurrent(page.getCurrent());
+        filteredPage.setSize(page.getSize());
+        filteredPage.setTotal(filteredOrders.size()); // 使用过滤后的实际数量
+        filteredPage.setRecords(result);
+
+        // 返回分页结果(使用数据库分页的总数)
+        return PageDataResult.of(filteredPage, result);
+    }
+
+    /**
+     * 构建查询状态列表
+     */
+
+    /**
+     * 构建查询状态列表
+     * 如果传入了具体状态,则只查询该状态;否则查询任务中(进行中)的订单状态列表
+     * 
+     * @param status 传入的查询状态,如果为null则使用默认的任务中状态列表
+     * @return 状态码列表,用于数据库查询条件
+     */
+    private List<Integer> buildTaskingStatus(Integer status) {
+        if (Objects.nonNull(status)) {
+            // 如果指定了具体状态,只返回该状态的列表
+            return Collections.singletonList(status);
+        }
+        // 默认返回任务进行中的各种状态
+        return Arrays.asList(
+                CarWaybillV1Enum.PENDING_VEHICLE.getCode(),  // 待提货
+                CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode(),   // 运输中(称重)
+                CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),   // 拒绝运输
+                CarWaybillV1Enum.EXIT_COMPLETED.getCode(),   // 出口完成
+                CarWaybillV1Enum.WAIT_LOADING.getCode()      // 等待装货
+        );
+    }
+
+    /**
+     * 判断是否应返回空结果
+     */
+    private boolean shouldReturnEmptyResult(MapVehicleQueryReq req, Set<Long> wayOrderIds) {
+        return CollectionUtils.isEmpty(wayOrderIds) &&
+                (StringUtils.isNotBlank(req.getLogisticOrderNo()) ||
+                        Objects.nonNull(req.getCarrierEntId()) ||
+                        Objects.nonNull(req.getConsignEntId()) ||
+                        Objects.nonNull(LoginUserHolder.getEntId()));
+    }
+
+    /**
+     * 提取运单ID列表
+     */
+    private List<Long> extractWOrderIds(List<KwtWaybillOrder> waybillOrders) {
+        return waybillOrders.stream()
                 .map(KwtWaybillOrder::getId)
                 .collect(Collectors.toList());
-        //获取车辆id
-        List<Long> truckIds = waybillOrders.stream()
+    }
+
+    /**
+     * 提取车辆ID列表
+     */
+    private List<Long> extractTruckIds(List<KwtWaybillOrder> waybillOrders) {
+        return waybillOrders.stream()
                 .map(KwtWaybillOrder::getTruckId)
+                .filter(Objects::nonNull)
                 .distinct()
                 .collect(Collectors.toList());
-        //根据车辆id获取车辆信息
-        List<RTruckVo> truckVos = fleetService.findTruckByTruckIds(truckIds);
-        Map<Long, RTruckVo> truckIdMap = new HashMap<>();
-        if (CollectionUtils.isNotEmpty(truckVos)){
-            // 构建车辆ID到车辆信息的映射
-            truckIdMap = truckVos.stream()
-                    .filter(Objects::nonNull)
-                    .collect(Collectors.toMap(RTruckVo::getId, Function.identity(), (k1, k2) -> k1));
-        }
+    }
 
-        // 查询子运单信息
-        List<KwtWaybillOrderSubtask> subtasks = kwtWaybillOrderSubtaskRepository.queryByWOrderIds(wOrderIds);
-         Map<Long, KwtWaybillOrderSubtask> wOrderIdSubtaskMap;
-        if (CollectionUtils.isNotEmpty(subtasks)) {
-            wOrderIdSubtaskMap = subtasks.stream()
-                    .filter(subtask -> subtask.getWOrderId() != null)
-                    .collect(Collectors.toMap(KwtWaybillOrderSubtask::getWOrderId, Function.identity(), (k1, k2) -> k1));
-        } else {
-            wOrderIdSubtaskMap = new HashMap<>();
+    /**
+     * 批量查询车辆信息
+     */
+    private Map<Long, RTruckVo> batchQueryTruckInfo(List<Long> truckIds) {
+        if (CollectionUtils.isEmpty(truckIds)) {
+            return Collections.emptyMap();
         }
-        
-        // 获取物流订单ID
-        Set<Long> lOrderIds = new HashSet<>();
-        if (CollectionUtils.isNotEmpty(subtasks)) {
-            lOrderIds = subtasks.stream()
-                    .map(KwtWaybillOrderSubtask::getLOrderId)
-                    .filter(Objects::nonNull)
-                    .collect(Collectors.toSet());
+
+        List<RTruckVo> truckVos = fleetService.findTruckByTruckIds(truckIds);
+        if (CollectionUtils.isEmpty(truckVos)) {
+            return Collections.emptyMap();
         }
 
-        List<KwtLogisticsOrderUnit> logisticsOrderUnits = Lists.newArrayList();
-        List<KwtLogisticsOrderGoods> goodsList = Lists.newArrayList();
-        List<KwtLogisticsOrderAddress> logisticsOrderAddress = Lists.newArrayList();
-        if (CollectionUtils.isNotEmpty(lOrderIds)) {
-            // 查询托运企业和承运企业
-            logisticsOrderUnits = kwtLogisticsOrderUnitRepository.queryByLOrderIds(new ArrayList<>(lOrderIds));
-            // 查询商品信息
-            goodsList = kwtLogisticsOrderGoodsRepository.queryByLOrderIds(new ArrayList<>(lOrderIds));
-            //查询物流地址
-            logisticsOrderAddress = kwtLogisticsOrderAddressRepository.queryByLogOrderIds(new ArrayList<>(lOrderIds));
-        }
-        Map<String, KwtLogisticsOrderAddress> logisticsOrderAddressMap = Maps.newHashMap();
-        if (CollectionUtils.isNotEmpty(logisticsOrderAddress)){
-            logisticsOrderAddressMap = logisticsOrderAddress.stream()
-                    .collect(Collectors.toMap(x -> x.getLOrderId() + "_" + x.getAddressType(), Function.identity(), (k1, k2) -> k1));
+        return truckVos.stream()
+                .filter(Objects::nonNull)
+                .collect(Collectors.toMap(RTruckVo::getId, Function.identity(), (k1, k2) -> k1));
+    }
+
+    /**
+     * 批量查询子运单信息
+     */
+    private Map<Long, KwtWaybillOrderSubtask> batchQuerySubtasks(List<Long> wOrderIds) {
+        if (CollectionUtils.isEmpty(wOrderIds)) {
+            return Collections.emptyMap();
         }
-        
-        // 按物流订单ID和单位类型分组
-        Map<String, KwtLogisticsOrderUnit> unitMap =new HashMap<>();
-        if (CollectionUtils.isNotEmpty(logisticsOrderUnits)) {
-            unitMap = logisticsOrderUnits.stream()
-                    .filter(unit -> unit.getLOrderId() != null && unit.getUnitType() != null)
-                    .collect(Collectors.toMap(
-                        unit -> unit.getLOrderId() + "_" + unit.getUnitType(),
-                        Function.identity(),
-                        (k1, k2) -> k1
-                    ));
+
+        List<KwtWaybillOrderSubtask> subtasks = kwtWaybillOrderSubtaskRepository.queryByWOrderIds(wOrderIds);
+        if (CollectionUtils.isEmpty(subtasks)) {
+            return Collections.emptyMap();
         }
-        
 
-         Map<Long, KwtLogisticsOrderGoods> goodsMap =new HashMap<>();
-        if (CollectionUtils.isNotEmpty(goodsList)) {
-            goodsMap = goodsList.stream()
-                    .filter(goods -> goods.getLOrderId() != null)
-                    .collect(Collectors.toMap(KwtLogisticsOrderGoods::getLOrderId, Function.identity(), (k1, k2) -> k1));
+        return subtasks.stream()
+                .filter(subtask -> subtask.getWOrderId() != null)
+                .collect(Collectors.toMap(KwtWaybillOrderSubtask::getWOrderId, Function.identity(), (k1, k2) -> k1));
+    }
+
+    /**
+     * 提取物流订单ID集合
+     */
+    private Set<Long> extractLOrderIds(Map<Long, KwtWaybillOrderSubtask> wOrderIdSubtaskMap) {
+        return wOrderIdSubtaskMap.values().stream()
+                .map(KwtWaybillOrderSubtask::getLOrderId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+    }
+
+    /**
+     * 批量查询物流订单相关数据
+     */
+    private LogisticsOrderData batchQueryLogisticsOrderData(Set<Long> lOrderIds) {
+        LogisticsOrderData data = new LogisticsOrderData();
+
+        if (CollectionUtils.isEmpty(lOrderIds)) {
+            return data;
         }
-        
-        // 获取车牌号列表,查询定位信息
+
+        List<Long> lOrderIdList = new ArrayList<>(lOrderIds);
+
+        // 查询物流订单单位
+        data.setUnits(kwtLogisticsOrderUnitRepository.queryByLOrderIds(lOrderIdList));
+
+        // 查询商品信息
+        data.setGoods(kwtLogisticsOrderGoodsRepository.queryByLOrderIds(lOrderIdList));
+
+        // 查询物流地址
+        data.setAddresses(kwtLogisticsOrderAddressRepository.queryByLogOrderIds(lOrderIdList));
+
+        // 查询物流订单
+        List<KwtLogisticsOrder> logisticsOrders = kwtLogisticsOrderRepository.queryByLogisticsOrderIds(lOrderIdList);
+        data.setOrders(Optional.ofNullable(logisticsOrders)
+                .orElse(Collections.emptyList())
+                .stream()
+                .collect(Collectors.toMap(KwtLogisticsOrder::getId, Function.identity(), (k1, k2) -> k1)));
+
+        return data;
+    }
+
+    /**
+     * 批量查询定位信息
+     */
+    private Map<String, VehicleLocationInfo> batchQueryLocationInfo(List<KwtWaybillOrder> waybillOrders) {
         Map<Long, String> truckIdAndTruckNoMap = waybillOrders.stream()
-                .filter(x->Objects.nonNull(x.getTruckId()))
+                .filter(order -> Objects.nonNull(order.getTruckId()))
                 .collect(Collectors.toMap(KwtWaybillOrder::getTruckId, KwtWaybillOrder::getTruckNo, (k1, k2) -> k1));
 
-        // 批量查询定位状态和位置信息
-        Map<String, VehicleLocationInfo> locationInfoMap = queryVehicleLocationBatch(truckIdAndTruckNoMap);
+        return queryVehicleLocationBatch(truckIdAndTruckNoMap);
+    }
 
-        // 批量查询运单轨迹数据,统计异常数量(通过alarmCode判断)
+    /**
+     * 批量查询异常数量
+     */
+    private Map<String, Integer> batchQueryExceptionCount(List<KwtWaybillOrder> waybillOrders) {
         List<String> wOrderNos = waybillOrders.stream()
                 .map(KwtWaybillOrder::getWOrderNo)
                 .filter(Objects::nonNull)
                 .distinct()
                 .collect(Collectors.toList());
-        Map<String, Integer> exceptionCountMap = countExceptionsByTraceData(wOrderNos);
-        
-        // 根据定位状态筛选(这个筛选保留在内存中,因为涉及外部服务调用)
-        List<KwtWaybillOrder> filteredOrders = waybillOrders;
-        if (req.getLocationStatus() != null) {
-            filteredOrders = waybillOrders.stream()
-                    .filter(order -> {
-                        VehicleLocationInfo locationInfo = locationInfoMap.get(order.getTruckNo());
-                        return locationInfo != null && req.getLocationStatus().equals(locationInfo.getLocationStatus());
-                    })
-                    .collect(Collectors.toList());
-        }
-        //查询字段
+
+        return countExceptionsByTraceData(wOrderNos);
+    }
+
+    /**
+     * 获取能源类型字典
+     */
+    private Map<String, SysDictResDto> getEnergyTypeMap() {
         List<SysDictResDto> sysDictResDtos = remoteSystemService.queryDictByType(DictTypeEnum.ENERGY_TYPE.getType());
-        Map<String, SysDictResDto> energyTypeMap  = new HashMap<>();
-        if (CollectionUtils.isNotEmpty(sysDictResDtos)) {
-            // 构建字典映射
-            energyTypeMap = sysDictResDtos.stream()
-                    .collect(Collectors.toMap(SysDictResDto::getValue, Function.identity(), (k1, k2) -> k1));
-         }
-
-        // 转换为 VO
-        Map<String, KwtLogisticsOrderUnit> finalUnitMap = unitMap;
-        Map<Long, KwtLogisticsOrderGoods> finalGoodsMap = goodsMap;
-        Map<Long, RTruckVo> finalTruckIdMap = truckIdMap;
-        Map<String, SysDictResDto> finalEnergyTypeMap = energyTypeMap;
-        Map<String, KwtLogisticsOrderAddress> finalLogisticsOrderAddressMap = logisticsOrderAddressMap;
-        List<MapVehicleVo> result = filteredOrders.stream()
-                .map(order -> buildMapVehicleVo(order, wOrderIdSubtaskMap, finalUnitMap, finalGoodsMap,
-                        locationInfoMap, exceptionCountMap, finalTruckIdMap, finalEnergyTypeMap, finalLogisticsOrderAddressMap))
+        if (CollectionUtils.isEmpty(sysDictResDtos)) {
+            return Collections.emptyMap();
+        }
+
+        return sysDictResDtos.stream()
+                .collect(Collectors.toMap(SysDictResDto::getValue, Function.identity(), (k1, k2) -> k1));
+    }
+
+    /**
+     * 根据定位状态筛选
+     */
+
+    /**
+     * 根据定位状态筛选运单订单
+     * 
+     * @param waybillOrders 运单订单列表
+     * @param locationInfoMap 车辆位置信息映射,key为车牌号,value为位置信息
+     * @param locationStatus 定位状态筛选条件(1-在线,0-离线),如果为null则不过滤
+     * @return 筛选后的运单订单列表
+     */
+    private List<KwtWaybillOrder> filterByLocationStatus(
+            List<KwtWaybillOrder> waybillOrders,
+            Map<String, VehicleLocationInfo> locationInfoMap,
+            Integer locationStatus) {
+
+        // 如果没有定位状态筛选条件,直接返回原列表
+        if (locationStatus == null) {
+            return waybillOrders;
+        }
+
+        // 根据定位状态筛选运单订单
+        return waybillOrders.stream()
+                .filter(order -> {
+                    // 获取车辆的位置信息
+                    VehicleLocationInfo locationInfo = locationInfoMap.get(order.getTruckNo());
+                    // 筛选条件:位置信息存在且定位状态与筛选条件匹配
+                    return locationInfo != null && locationStatus.equals(locationInfo.getLocationStatus());
+                })
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 转换为MapVehicleVo列表
+ * 该方法将过滤后的运单订单列表转换为MapVehicleVo对象列表
+ *
+ * @param filteredOrders 过滤后的运单订单列表
+ * @param wOrderIdSubtaskMap 运单ID与子任务的映射关系
+ * @param logisticsOrderData 物流订单数据对象
+ * @param locationInfoMap 位置信息映射
+ * @param exceptionCountMap 异常计数映射
+ * @param truckIdMap 车辆ID映射
+ * @param energyTypeMap 能源类型映射
+ * @return 返回转换后的MapVehicleVo列表
+     */
+
+    private List<MapVehicleVo> convertToMapVehicleVos(
+            List<KwtWaybillOrder> filteredOrders,
+            Map<Long, KwtWaybillOrderSubtask> wOrderIdSubtaskMap,
+            LogisticsOrderData logisticsOrderData,
+            Map<String, VehicleLocationInfo> locationInfoMap,
+            Map<String, Integer> exceptionCountMap,
+            Map<Long, RTruckVo> truckIdMap,
+            Map<String, SysDictResDto> energyTypeMap) {
+
+        // 构建物流订单相关映射
+        // 构建单位映射,用于快速查找物流订单中的单位信息
+        Map<String, KwtLogisticsOrderUnit> unitMap = buildUnitMap(logisticsOrderData.getUnits());
+        // 构建货物映射,用于快速查找物流订单中的货物信息
+        Map<Long, KwtLogisticsOrderGoods> goodsMap = buildGoodsMap(logisticsOrderData.getGoods());
+        // 构建地址映射,用于快速查找物流订单中的地址信息
+        Map<String, KwtLogisticsOrderAddress> addressMap = buildAddressMap(logisticsOrderData.getAddresses());
+        // 获取订单映射,用于快速查找物流订单信息
+        Map<Long, KwtLogisticsOrder> orderMap = logisticsOrderData.getOrders();
+
+        // 使用Stream流处理订单列表,将每个订单转换为MapVehicleVo对象
+        return filteredOrders.stream()
+                .map(order -> buildMapVehicleVo(
+                        order, wOrderIdSubtaskMap, unitMap, goodsMap,
+                        locationInfoMap, exceptionCountMap, truckIdMap, energyTypeMap,
+                        addressMap, orderMap))
                 .collect(Collectors.toList());
-        
-        // 根据排序类型进行排序
-        MapVehicleSortTypeEnum sortType = MapVehicleSortTypeEnum.getByCode(req.getSortType());
-        result = switch (sortType) {
-            case TIME_DESC ->
-                // 按任务开始时间倒序
-                    result.stream()
-                            .sorted(Comparator.comparing(MapVehicleVo::getTaskStartTime,
-                                    Comparator.nullsLast(Comparator.reverseOrder())))
-                            .collect(Collectors.toList());
-            case DURATION_DESC ->
-                // 按任务耗时倒序
-                    result.stream()
-                            .sorted(Comparator.comparing(MapVehicleVo::getTaskDuration,
-                                    Comparator.nullsLast(Comparator.reverseOrder())))
-                            .collect(Collectors.toList());
-            case EXCEPTION_COUNT_DESC ->
-                // 按异常数量倒序
-                    result.stream()
-                            .sorted(Comparator.comparing(MapVehicleVo::getExceptionCount,
-                                    Comparator.nullsLast(Comparator.reverseOrder())))
-                            .collect(Collectors.toList());
-        };
-        
-        // 返回分页结果(使用数据库分页的总数)
-        return PageDataResult.of(page, result);
     }
 
+    /**
+     * 构建单位映射
+     */
+    private Map<String, KwtLogisticsOrderUnit> buildUnitMap(List<KwtLogisticsOrderUnit> units) {
+        if (CollectionUtils.isEmpty(units)) {
+            return Collections.emptyMap();
+        }
+
+        return units.stream()
+                .filter(unit -> unit.getLOrderId() != null && unit.getUnitType() != null)
+                .collect(Collectors.toMap(
+                        unit -> unit.getLOrderId() + "_" + unit.getUnitType(),
+                        Function.identity(),
+                        (k1, k2) -> k1));
+    }
+
+    /**
+     * 构建商品映射
+     */
+    private Map<Long, KwtLogisticsOrderGoods> buildGoodsMap(List<KwtLogisticsOrderGoods> goodsList) {
+        if (CollectionUtils.isEmpty(goodsList)) {
+            return Collections.emptyMap();
+        }
+
+        return goodsList.stream()
+                .filter(goods -> goods.getLOrderId() != null)
+                .collect(Collectors.toMap(KwtLogisticsOrderGoods::getLOrderId, Function.identity(), (k1, k2) -> k1));
+    }
+
+    /**
+     * 构建地址映射
+     */
+    private Map<String, KwtLogisticsOrderAddress> buildAddressMap(List<KwtLogisticsOrderAddress> addresses) {
+        if (CollectionUtils.isEmpty(addresses)) {
+            return Collections.emptyMap();
+        }
+
+        return addresses.stream()
+                .collect(Collectors.toMap(
+                        x -> x.getLOrderId() + "_" + x.getAddressType(),
+                        Function.identity(),
+                        (k1, k2) -> k1));
+    }
+
+    /**
+     * 物流订单数据容器
+     */
+    @Data
+    private static class LogisticsOrderData {
+        private List<KwtLogisticsOrderUnit> units;
+        private List<KwtLogisticsOrderGoods> goods;
+        private List<KwtLogisticsOrderAddress> addresses;
+        private Map<Long, KwtLogisticsOrder> orders;
+    }
+
+
+    /**
+     * 根据查询条件获取运单ID集合
+     * 支持按托运单位、承运单位和物流订单号进行筛选
+     *
+     * @param req   查询请求参数
+     * @param allEnt 初始企业ID集合
+     * @return 符合条件的运单ID集合
+     */
     @NotNull
-    private Set<Long> getWayOrderIds(MapVehicleQueryReq req,Set<Long> allEnt) {
+    private Set<Long> getWayOrderIds(MapVehicleQueryReq req, Set<Long> allEnt) {
         Set<Long> wayOrderIds = Sets.newHashSet();
-       // List<Long> entIds = new ArrayList<>();
-        if (req.getConsignEntId() != null){
+        
+        // 添加查询条件中的托运单位和承运单位到企业ID集合中
+        if (req.getConsignEntId() != null) {
             allEnt.add(req.getConsignEntId());
         }
-        if (req.getCarrierEntId() != null){
+        if (req.getCarrierEntId() != null) {
             allEnt.add(req.getCarrierEntId());
         }
+
+        // 根据企业ID集合查询运单
         if (CollectionUtils.isNotEmpty(allEnt)) {
             // 第一步:从物流订单单位表查询符合条件的物流订单ID
-            // 同时有托运和承运单位条件,将企业ID和类型组合后批量查询
             List<KwtLogisticsOrderUnit> allUnits = kwtLogisticsOrderUnitRepository.list(
                     Wrappers.<KwtLogisticsOrderUnit>lambdaQuery()
                             .eq(KwtLogisticsOrderUnit::getDelFlag, 0)
                             .in(KwtLogisticsOrderUnit::getEntId, allEnt)
-                            .in(KwtLogisticsOrderUnit::getUnitType, Arrays.asList(1, 2)));
+                            .in(KwtLogisticsOrderUnit::getUnitType, Arrays.asList(1, 2, 3))); // 1-托运单位, 2-承运单位, 3-其他单位
+
             if (CollectionUtils.isEmpty(allUnits)) {
                 return Set.of();
             }
-            Set<Long> logisticsOrderIds = allUnits.stream()
+
+            // 筛选当前登录用户企业ID相关的物流订单ID
+            Set<Long> userRelatedLogisticsOrderIds = allUnits.stream()
                     .filter(x -> Objects.equals(x.getEntId(), LoginUserHolder.getEntId()))
                     .map(KwtLogisticsOrderUnit::getLOrderId)
                     .collect(Collectors.toSet());
 
+            // 获取所有符合条件的物流订单ID(必须同时在allUnits和userRelatedLogisticsOrderIds中)
             Set<Long> lOrderIds = allUnits.stream()
                     .map(KwtLogisticsOrderUnit::getLOrderId)
-                    .filter(logisticsOrderIds::contains)
+                    .filter(userRelatedLogisticsOrderIds::contains)
                     .collect(Collectors.toSet());
+
             if (CollectionUtils.isEmpty(lOrderIds)) {
                 return Set.of();
             }
@@ -1204,29 +1517,36 @@ public class kwfTruckTraceService {
             // 第三步:获取运单ID
             wayOrderIds = subtasks.stream()
                     .map(KwtWaybillOrderSubtask::getWOrderId)
+                    .filter(Objects::nonNull)
                     .collect(Collectors.toSet());
 
             if (CollectionUtils.isEmpty(wayOrderIds)) {
                 return Set.of();
             }
         }
+
+        // 如果请求中包含物流订单号,则单独查询该订单下的运单
         if (StringUtils.isNotBlank(req.getLogisticOrderNo())) {
             // 获取物流订单ID
             KwtLogisticsOrder logOrder = kwtLogisticsOrderRepository.queryByLogisticOrderId(req.getLogisticOrderNo());
             if (Objects.isNull(logOrder)) {
                 return Set.of();
             }
-            //根据物流订单id查询子运单
+            
+            // 根据物流订单ID查询子运单
             List<KwtWaybillOrderSubtask> subtasks = kwtWaybillOrderSubtaskRepository.queryByLogId(logOrder.getId());
-            // 使用更明确的初始化方式
+            
             if (CollectionUtils.isNotEmpty(subtasks)) {
-                // 直接收集WOrderId,避免无效的addAll操作
-                wayOrderIds.addAll(subtasks.stream()
+                // 将新查询到的运单ID添加到结果集合中
+                Set<Long> additionalWayOrderIds = subtasks.stream()
                         .map(KwtWaybillOrderSubtask::getWOrderId)
                         .filter(Objects::nonNull)
-                        .collect(Collectors.toSet()));
+                        .collect(Collectors.toSet());
+                
+                wayOrderIds.addAll(additionalWayOrderIds);
             }
         }
+
         return wayOrderIds;
     }
 
@@ -1374,7 +1694,8 @@ public class kwfTruckTraceService {
                                            Map<String, Integer> exceptionCountMap,
                                            Map<Long, RTruckVo> truckIdMap,
                                            Map<String, SysDictResDto> energyTypeMap,
-                                           Map<String, KwtLogisticsOrderAddress> logisticsOrderAddressMap) {
+                                           Map<String, KwtLogisticsOrderAddress> logisticsOrderAddressMap,
+                                           Map<Long, KwtLogisticsOrder> logisticsOrderMap) {
         MapVehicleVo vo = new MapVehicleVo();
         
         // 车辆和司机信息
@@ -1392,7 +1713,8 @@ public class kwfTruckTraceService {
         KwtWaybillOrderSubtask subtask = subtaskMap.get(order.getId());
         if (subtask != null) {
             vo.setLogisticOrderId(subtask.getLOrderId());
-            vo.setLogisticOrderNo(String.valueOf(subtask.getLOrderId()));
+            KwtLogisticsOrder logisticsOrder = logisticsOrderMap.getOrDefault(subtask.getLOrderId(), new KwtLogisticsOrder());
+            vo.setLogisticOrderNo(logisticsOrder.getLOrderNo());
             vo.setLoadAmount(subtask.getLoadAmount());
             vo.setEntrustAmount(subtask.getEntrustAmount());
             vo.setUnit(subtask.getUnit());
@@ -1506,16 +1828,9 @@ public class kwfTruckTraceService {
      * 生成车辆轨迹数据(异步执行)
      * @param req 生成轨迹请求参数
      */
-    @Async("traceTaskExecutor")
+   // @Async("traceTaskExecutor")
     public void generateTrace(GenerateTraceReq req) {
-        log.info("开始异步生成车辆轨迹,运单号:{}", req.getWayOrderNo());
-        try {
-            generateTraceInternal(req);
-            log.info("异步生成车辆轨迹完成,运单号:{}", req.getWayOrderNo());
-        } catch (Exception e) {
-            log.error("异步生成车辆轨迹失败,运单号:{},错误信息:{}", req.getWayOrderNo(), e.getMessage(), e);
-            // 异步方法中的异常需要记录,但不抛出(避免影响调用方)
-        }
+        generateTraceInternal(req);
     }
 
     /**

+ 104 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/task/LogisticsOrderCompletionTask.java

@@ -2,20 +2,32 @@ package com.sckw.transport.task;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.sckw.contract.api.RemoteContractService;
+import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessException;
+import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.core.model.enums.LogisticsOrderV1Enum;
+import com.sckw.core.utils.DateUtils;
+import com.sckw.fleet.api.RemoteFleetService;
+import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
+import com.sckw.transport.handler.CancelHandler;
 import com.sckw.transport.model.KwtLogisticsOrder;
+import com.sckw.transport.model.KwtLogisticsOrderUnit;
+import com.sckw.transport.model.KwtWaybillOrder;
 import com.sckw.transport.model.KwtWaybillOrderSubtask;
-import com.sckw.transport.repository.KwtLogisticsOrderRepository;
-import com.sckw.transport.repository.KwtWaybillOrderSubtaskRepository;
+import com.sckw.transport.model.param.WaybillOrderCancelParam;
+import com.sckw.transport.repository.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -31,6 +43,17 @@ public class LogisticsOrderCompletionTask {
 
     private final KwtLogisticsOrderRepository logisticsOrderRepository;
     private final KwtWaybillOrderSubtaskRepository waybillOrderSubtaskRepository;
+    private final KwtWaybillOrderRepository waybillOrderRepository;
+    private final KwtLogisticsOrderContractRepository logisticsOrderContractRepository;
+    private final KwtLogisticsOrderUnitRepository logisticsOrderUnitRepository;
+
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
+    protected RemoteFleetService remoteFleetService;
+
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private RemoteContractService remoteContractService;
+
+    private final CancelHandler cancelHandler;
 
     /**
      * 定时任务:每5分钟执行一次
@@ -130,4 +153,83 @@ public class LogisticsOrderCompletionTask {
             throw new BusinessException("物流订单自动完成定时任务执行异常", e);
         }
     }
+
+
+    /**
+     * 定时任务:每2分钟执行一次
+     * cron表达式:0 0/2 * * * ? 表示每2分钟执行一次
+     * 可以根据实际需求调整执行频率
+     */
+    @Scheduled(cron = "${schedule.waybill-order-completion-cron}")
+    public void processWaybillOrder() {
+        log.info("超时取消运单定时任务开始...");
+
+        try {
+            // 查询状态为"已接单"的物流运单
+            List<KwtWaybillOrder> waybillOrderOrders = waybillOrderRepository.list(
+                    new LambdaQueryWrapper<KwtWaybillOrder>()
+                            .eq(KwtWaybillOrder::getStatus, CarWaybillV1Enum.PENDING_VEHICLE.getCode())
+                            .eq(KwtWaybillOrder::getDelFlag, 0)
+            );
+            if (CollectionUtils.isEmpty(waybillOrderOrders)) {
+                log.info("没有状态为'已接单'的物流运单需要处理");
+                return;
+            }
+
+            //运单根据物流订单id分组
+            Map<Long, List<KwtWaybillOrder>> waybillOrderAndLogOrderMap = waybillOrderOrders.stream()
+                    .collect(Collectors.groupingBy(KwtWaybillOrder::getLOrderId));
+
+            //提取物流订单id
+            Set<Long> logisticOrderIds = waybillOrderOrders.stream().map(KwtWaybillOrder::getLOrderId).collect(Collectors.toSet());
+
+            //物流订单和企业映射
+            List<KwtLogisticsOrderUnit> logisticsOrderUnits = logisticsOrderUnitRepository.queryByLOrderIdsAndUnitType(logisticOrderIds, 2);
+            Map<Long, KwtLogisticsOrderUnit> logisticsOrderAndUnitMap = logisticsOrderUnits.stream()
+                    .collect(Collectors.toMap(KwtLogisticsOrderUnit::getLOrderId, Function.identity(), (x, y) -> x));
+            if (MapUtils.isEmpty(logisticsOrderAndUnitMap)) {
+                throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "未找的物流订单和企业映射信息!");
+            }
+
+            //过滤超时的运单
+            List<KwtWaybillOrder> nearingCompletionOrders = new ArrayList<>();
+            for (Map.Entry<Long, List<KwtWaybillOrder>> entry : waybillOrderAndLogOrderMap.entrySet()) {
+                Long logisticOrderId = entry.getKey();
+                //物流运单
+                List<KwtWaybillOrder> waybillOrderList = entry.getValue();
+                //供应商企业信息
+                KwtLogisticsOrderUnit logisticsOrderUnit = logisticsOrderAndUnitMap.get(logisticOrderId);
+                TruckDispatchCoefficientVO truckDispatchVO = remoteFleetService.findAutoTruckDispatchByEntId(logisticsOrderUnit.getEntId());
+                if (truckDispatchVO == null) {
+                    throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "未找到自动派车系数!");
+                }
+                Integer driverTimeout = truckDispatchVO.getDriverTimeoutLimit();
+                long timestampInMillis = driverTimeout * 60 * 1000;
+
+                for (KwtWaybillOrder waybillOrder : waybillOrderList) {
+                    Long timeDiffMinutes = DateUtils.calculateTimeDiffMinutes(waybillOrder.getCreateTime(), new Date());
+                    if (timeDiffMinutes > timestampInMillis) {
+                        nearingCompletionOrders.add(waybillOrder);
+                    }
+                }
+            }
+
+            // 如果没有需要更新的物流运单,则直接返回
+            if (CollectionUtils.isEmpty(nearingCompletionOrders)){
+                log.info("没有需要超时取消运单物流运单");
+                return;
+            }
+
+            for (KwtWaybillOrder nearingCompletionOrder : nearingCompletionOrders) {
+                WaybillOrderCancelParam param = new WaybillOrderCancelParam();
+                param.setLogOrderId(nearingCompletionOrder.getLOrderId());
+                //执行取消接单
+                cancelHandler.handler(param);
+            }
+            log.info("查询到{}条状态为'已接单'的物流运单", nearingCompletionOrders.size());
+        } catch (Exception e) {
+            log.error("超时取消运单定时任务执行异常", e);
+            throw new BusinessException("超时取消运单定时任务执行异常", e);
+        }
+    }
 }

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä