Просмотр исходного кода

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

# Conflicts:
#	sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/response/BaseResult.java
donglang 3 месяцев назад
Родитель
Сommit
bbfb49f87e
100 измененных файлов с 3672 добавлено и 757 удалено
  1. 2 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictEnum.java
  2. 6 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarWaybillV1Enum.java
  3. 284 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtil.java
  4. 6 9
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtils.java
  5. 8 11
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/PageUtils.java
  6. 49 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/ParallelQueryExecutor.java
  7. 1 1
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/StringUtils.java
  8. 2 10
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/controller/BaseController.java
  9. 16 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/page/BaseQuery.java
  10. 3 2
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/response/BaseResult.java
  11. 1 1
      sckw-common/sckw-common-datasource/pom.xml
  12. 6 0
      sckw-common/sckw-common-redis/src/main/java/com/sckw/redis/constant/RedisConstant.java
  13. 2 1
      sckw-gateway/src/main/java/com/sckw/gateway/filter/AuthenticationFilter.java
  14. 7 1
      sckw-modules-api/sckw-contract-api/pom.xml
  15. 20 2
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java
  16. 22 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/req/ContractAuditPara.java
  17. 3 3
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/req/LogisticsScoreDetailFeignDto.java
  18. 349 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/ContractDetailRespVo.java
  19. 228 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/LogisticDetailRespVo.java
  20. 25 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/ContractCountVo.java
  21. 36 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/ContractVo.java
  22. 15 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/LogisticsEntDtoVO.java
  23. 2 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/TradeContractGoodsDto.java
  24. 4 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/TradeContractResDto.java
  25. 10 0
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/RemoteFleetService.java
  26. 7 0
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/feign/DriverScoreFeignService.java
  27. 23 0
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/dto/DriverScoreQuery.java
  28. 5 1
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/dto/RUpdateDriverScoreDto.java
  29. 6 1
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/dto/UpdateDriverScoreDto.java
  30. 7 1
      sckw-modules-api/sckw-order-api/pom.xml
  31. 21 1
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/TradeOrderInfoService.java
  32. 20 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/BuyDto.java
  33. 28 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/BuyVo.java
  34. 19 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/CountPara.java
  35. 20 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/GoodsDto.java
  36. 27 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/GoodsVo.java
  37. 25 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/OrderUrl.java
  38. 21 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/RankDto.java
  39. 23 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/SaleDto.java
  40. 28 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/SaleVo.java
  41. 22 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TimeSaleDataDto.java
  42. 21 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TimeSaleDto.java
  43. 23 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeBuyVo.java
  44. 22 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeOrderAuditPara.java
  45. 4 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeOrderPara.java
  46. 9 1
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeOrderVo.java
  47. 27 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeSaleVo.java
  48. 50 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeVo.java
  49. 2 0
      sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/dubbo/GoodsInfoService.java
  50. 167 0
      sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/model/GoodsDetails.java
  51. 1 0
      sckw-modules-api/sckw-system-api/src/main/java/com/sckw/system/api/RemoteSystemService.java
  52. 13 5
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java
  53. 4 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/AddLogisticOrderParam.java
  54. 22 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/LogisticsOrderAuditPara.java
  55. 19 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/TimePara.java
  56. 19 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/CountPara2.java
  57. 21 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/LogisticsDto.java
  58. 49 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/LogisticsVo.java
  59. 259 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/WaybillOrderDetailVo.java
  60. 19 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/WaybillRankVo.java
  61. 19 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/WaybillVo.java
  62. 1 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcContractLogisticsScoreApiController.java
  63. 9 11
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcContractLogisticsScoreController.java
  64. 13 6
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dao/KwcContractLogisticsMapper.java
  65. 7 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dao/KwcContractTradeMapper.java
  66. 233 5
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java
  67. 5 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/dto/req/LogisticsScoreDetailQueryDto.java
  68. 2 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/dto/req/LogisticsScoreQueryDto.java
  69. 5 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractTrade.java
  70. 5 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/TradeBaseInfoReqVo.java
  71. 11 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/ContractDetailResp.java
  72. 4 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryListResVo.java
  73. 5 4
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsRepository.java
  74. 1 2
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsUnitRepository.java
  75. 17 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeGoodsRepository.java
  76. 4 7
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/IKwcContractLogisticsScoreService.java
  77. 40 27
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/impl/KwcContractLogisticsScoreServiceImpl.java
  78. 318 99
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java
  79. 51 0
      sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractLogisticsMapper.xml
  80. 201 136
      sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractTradeMapper.xml
  81. 10 4
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfDriverScoreController.java
  82. 4 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dao/KwfDriverScoreMapper.java
  83. 42 11
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java
  84. 42 7
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfDriverScore.java
  85. 41 5
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfDriverScoreDetail.java
  86. 4 4
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfTruck.java
  87. 1 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfTruckReport.java
  88. 6 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/KwfDriverConductRulesLogVO.java
  89. 1 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfDriverScoreRepository.java
  90. 7 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckDispatchCoefficientRepository.java
  91. 10 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckEntRepository.java
  92. 8 79
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckRepository.java
  93. 25 7
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfAutoDispatchService.java
  94. 9 3
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverScoreService.java
  95. 7 4
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverService.java
  96. 183 181
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckReportService.java
  97. 127 96
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java
  98. 8 0
      sckw-modules/sckw-fleet/src/main/resources/mapper/KwfDriverScoreMapper.xml
  99. 24 3
      sckw-modules/sckw-message/src/main/java/com/sckw/message/controller/MessageController.java
  100. 2 0
      sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmMessageMapper.java

+ 2 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictEnum.java

@@ -97,6 +97,8 @@ public enum DictEnum {
     SETTLEMENT_WAY_2("settlement_way", "2", "线下结算"),
     LOAD_UNLOAD_WAY_1("load_unload_way", "1", "按装货量"),
     LOAD_UNLOAD_WAY_2("load_unload_way", "2", "按卸货量"),
+    MEASUREMENT_WAY_1("measurement_way", "1", "地磅自动计算"),
+    MEASUREMENT_WAY_2("measurement_way", "2", "司机填报"),
     ;
 
     private final String type;

+ 6 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarWaybillV1Enum.java

@@ -35,6 +35,12 @@ public enum CarWaybillV1Enum {
      * 已离场
      */
     WAIT_LOADING(15,  "已离场"),
+
+    /**
+     * 卸货入场
+     */
+    INTO_UNLOADING(16,  "已离场"),
+
     /**
      * 已卸货
      */

+ 284 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtil.java

@@ -0,0 +1,284 @@
+package com.sckw.core.utils;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author xucaiqin
+ * @date 2026-01-08 16:04:06
+ */
+public class DateUtil {
+    // 默认日期格式
+    private static final String DEFAULT_PATTERN = "yyyy-MM-dd";
+
+    /**
+     * 获取当前时间往前推7天的日期字符串数组(包含今天)
+     * 格式:yyyy-MM-dd
+     *
+     * @return 日期字符串数组,从最早日期到最新日期排序
+     */
+    public static String[] getLast7Days() {
+        return getLast7Days(DEFAULT_PATTERN);
+    }
+
+    /**
+     * 获取当前时间往前推7天的日期字符串数组(包含今天)
+     *
+     * @param pattern 日期格式,如:"yyyy-MM-dd", "yyyy/MM/dd", "yyyy年MM月dd日"
+     * @return 日期字符串数组,从最早日期到最新日期排序
+     */
+    public static String[] getLast7Days(String pattern) {
+        return getLastNDays(7, pattern);
+    }
+
+    /**
+     * 获取指定时间范围内的所有日期(包含开始和结束日期)
+     *
+     * @param startDate 开始日期,格式:yyyy-MM-dd
+     * @param endDate   结束日期,格式:yyyy-MM-dd
+     * @return 日期字符串列表
+     */
+    public static List<String> getDateRange(String startDate, String endDate) {
+        return getDateRange(startDate, endDate, "yyyy-MM-dd");
+    }
+
+    /**
+     * 获取指定时间范围内的所有日期(包含开始和结束日期)
+     *
+     * @param startDate 开始日期
+     * @param endDate   结束日期
+     * @param pattern   日期格式
+     * @return 日期字符串列表
+     */
+    public static List<String> getDateRange(String startDate, String endDate, String pattern) {
+        List<String> dates = new ArrayList<>();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
+
+        LocalDate start = LocalDate.parse(startDate, formatter);
+        LocalDate end = LocalDate.parse(endDate, formatter);
+
+        while (!start.isAfter(end)) {
+            dates.add(start.format(formatter));
+            start = start.plusDays(1);
+        }
+
+        return dates;
+    }
+
+    private static final DateTimeFormatter INPUT_FORMATTER =
+            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    private static final DateTimeFormatter OUTPUT_FORMATTER =
+            DateTimeFormatter.ofPattern("HH:mm");
+
+    /**
+     * 生成整点时间段数组(只按小时统计,忽略分钟和秒)
+     *
+     * @param startDateTime 开始时间,格式:2025-01-01 00:00:00
+     * @param endDateTime   结束时间,格式:2025-01-01 12:00:59
+     * @return 整点时间段列表,如 ["00:00-01:00", "01:00-02:00"]
+     */
+    public static List<String> generateHourRanges(
+            String startDateTime,
+            String endDateTime) {
+
+        // 1. 解析输入的时间字符串
+        LocalDateTime start = LocalDateTime.parse(startDateTime, INPUT_FORMATTER);
+        LocalDateTime end = LocalDateTime.parse(endDateTime, INPUT_FORMATTER);
+
+        // 2. 验证参数
+        if (end.isBefore(start)) {
+            throw new IllegalArgumentException("结束时间不能早于开始时间");
+        }
+
+        // 3. 生成时间段(按小时间隔)
+        List<String> timeRanges = new ArrayList<>();
+
+        // 从开始时间的小时开始
+        LocalDateTime current = start.withMinute(0).withSecond(0);
+
+        // 确保当前时间不大于结束时间
+        while (!current.isAfter(end)) {
+            LocalDateTime nextHour = current.plusHours(1);
+
+            // 如果下一个小时已经超过了结束时间,停止生成
+            if (nextHour.isAfter(end)) {
+                break;
+            }
+
+            // 格式化为时间段:HH:mm-HH:mm
+            String range = current.format(OUTPUT_FORMATTER) +
+                    "-" +
+                    nextHour.format(OUTPUT_FORMATTER);
+            timeRanges.add(range);
+
+            // 移动到下一个小时
+            current = nextHour;
+        }
+
+        return timeRanges;
+    }
+
+    /**
+     * 重载方法:生成整点时间段,可以指定是否包含边界小时
+     *
+     * @param startDateTime      开始时间
+     * @param endDateTime        结束时间
+     * @param includePartialHour 是否包含部分小时(即使分钟秒数不为0)
+     * @return 时间段列表
+     */
+    public static List<String> generateHourRanges(
+            String startDateTime,
+            String endDateTime,
+            boolean includePartialHour) {
+
+        if (!includePartialHour) {
+            return generateHourRanges(startDateTime, endDateTime);
+        }
+
+        // 如果包含部分小时,生成所有小时段,不考虑分钟和秒
+        LocalDateTime start = LocalDateTime.parse(startDateTime, INPUT_FORMATTER);
+        LocalDateTime end = LocalDateTime.parse(endDateTime, INPUT_FORMATTER);
+
+        if (end.isBefore(start)) {
+            throw new IllegalArgumentException("结束时间不能早于开始时间");
+        }
+
+        List<String> timeRanges = new ArrayList<>();
+        LocalDateTime current = start.withMinute(0).withSecond(0);
+
+        // 处理结束时间的小时
+        int endHour = end.getHour();
+
+        while (current.getHour() <= endHour && !current.isAfter(end)) {
+            int currentHour = current.getHour();
+            int nextHour = (currentHour + 1) % 24;
+
+            // 判断是否是跨天的情况
+            String nextHourStr = String.format("%02d:00", nextHour);
+            if (nextHour == 0) {
+                nextHourStr = "00:00";
+            }
+
+            String range = String.format("%02d:00-%s", currentHour, nextHourStr);
+            timeRanges.add(range);
+
+            current = current.plusHours(1);
+        }
+
+        return timeRanges;
+    }
+
+    /**
+     * 获取当前时间往前推N天的日期字符串数组(包含今天)
+     *
+     * @param n       天数
+     * @param pattern 日期格式
+     * @return 日期字符串数组,从最早日期到最新日期排序
+     */
+    public static String[] getLastNDays(int n, String pattern) {
+        if (n <= 0) {
+            throw new IllegalArgumentException("天数必须大于0");
+        }
+
+        if (pattern == null || pattern.trim().isEmpty()) {
+            pattern = DEFAULT_PATTERN;
+        }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
+        LocalDate today = LocalDate.now();
+        List<String> dateList = new ArrayList<>();
+
+        // 从6天前到今天,共7天
+        for (int i = n - 1; i >= 0; i--) {
+            LocalDate date = today.minusDays(i);
+            dateList.add(date.format(formatter));
+        }
+
+        return dateList.toArray(new String[0]);
+    }
+
+    /**
+     * 获取当前时间往前推7天的日期字符串数组(不包含今天)
+     *
+     * @param pattern 日期格式
+     * @return 日期字符串数组,从最早日期到最新日期排序
+     */
+    public static String[] getLast7DaysExcludeToday(String pattern) {
+        if (pattern == null || pattern.trim().isEmpty()) {
+            pattern = DEFAULT_PATTERN;
+        }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
+        LocalDate today = LocalDate.now();
+        List<String> dateList = new ArrayList<>();
+
+        // 从7天前到昨天,共7天
+        for (int i = 7; i >= 1; i--) {
+            LocalDate date = today.minusDays(i);
+            dateList.add(date.format(formatter));
+        }
+
+        return dateList.toArray(new String[0]);
+    }
+
+    /**
+     * 获取当前时间往前推7天的日期对象数组
+     *
+     * @return LocalDate数组,从最早日期到最新日期排序
+     */
+    public static LocalDate[] getLast7DaysAsLocalDate() {
+        return getLastNDaysAsLocalDate(7);
+    }
+
+    /**
+     * 获取当前时间往前推N天的日期对象数组
+     *
+     * @param n 天数
+     * @return LocalDate数组,从最早日期到最新日期排序
+     */
+    public static LocalDate[] getLastNDaysAsLocalDate(int n) {
+        if (n <= 0) {
+            throw new IllegalArgumentException("天数必须大于0");
+        }
+
+        LocalDate today = LocalDate.now();
+        LocalDate[] dateArray = new LocalDate[n];
+
+        for (int i = 0; i < n; i++) {
+            dateArray[i] = today.minusDays(n - 1 - i);
+        }
+
+        return dateArray;
+    }
+
+    public static void main(String[] args) {
+        // 测试1:完整的小时
+        System.out.println("\n1. 完整小时段:");
+        List<String> result1 = generateHourRanges("2025-01-01 00:00:00", "2025-01-01 12:00:00");
+        System.out.println(result1);
+
+        // 测试2:分钟秒数不为0的情况(应该忽略)
+        System.out.println("\n2. 非整点时间:");
+        List<String> result2 = generateHourRanges("2025-01-01 00:30:45", "2025-01-01 12:15:59");
+        System.out.println(result2);
+
+        // 测试3:开始和结束时间都不在整点
+        System.out.println("\n3. 非整点开始和结束:");
+        List<String> result3 = generateHourRanges("2025-01-01 01:15:30", "2025-01-01 04:45:20");
+        System.out.println(result3);
+
+        // 测试4:跨天情况
+        System.out.println("\n4. 跨天情况:");
+        List<String> result4 = generateHourRanges("2025-01-01 22:30:00", "2025-01-02 02:15:00");
+        System.out.println(result4);
+
+        // 测试5:包含部分小时的版本
+        System.out.println("\n5. 包含部分小时:");
+        List<String> result5 = generateHourRanges("2025-01-01 01:15:30", "2025-01-01 04:45:20", true);
+        System.out.println(result5);
+    }
+}

+ 6 - 9
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtils.java

@@ -864,11 +864,12 @@ 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;
     }
 
     /**
-     * 计算两个时间的分钟差值
+     * 计算两个时间的差值
      * @param startTime 开始时间
      * @param endTime 结束时间
      * @return
@@ -879,18 +880,14 @@ public class DateUtils extends DateUtil {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR,
                     "计算时间差失败:,startTime=[" + startTime + "], endTime=[" + endTime + "]");
         }
-
         // 计算时间戳差值(毫秒)
         long diffMillis = endTime.getTime() - startTime.getTime();
-
-        long diffMinutes = TimeUnit.MILLISECONDS.toMinutes(diffMillis);
-
         // 时间顺序异常提醒(结束时间早于开始时间)
-        if (diffMinutes < 0) {
+        if (diffMillis < 0) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR,
-                    "时间顺序异常,结束时间早于开始时间,startTime=[" + startTime + "], endTime=[" + endTime + "], 差值:[" + diffMinutes + "]分钟");
+                    "时间顺序异常,结束时间早于开始时间,startTime=[" + startTime + "], endTime=[" + endTime + "], 差值:[" + diffMillis + "]毫秒");
         }
-        return diffMinutes;
+        return diffMillis/1000;
     }
 
 

+ 8 - 11
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/PageUtils.java

@@ -1,9 +1,7 @@
 package com.sckw.core.utils;
 
 import com.github.pagehelper.PageHelper;
-import com.sckw.core.utils.sql.SqlUtil;
-import com.sckw.core.web.page.PageDomain;
-import com.sckw.core.web.page.TableSupport;
+import com.sckw.core.web.page.BaseQuery;
 
 /**
  * 分页工具类
@@ -15,15 +13,14 @@ public class PageUtils extends PageHelper
     /**
      * 设置请求分页数据
      */
-    public static PageDomain startPage()
+    public static void startPage(BaseQuery query)
     {
-        PageDomain pageDomain = TableSupport.buildPageRequest();
-        Integer pageNum = pageDomain.getPageNum();
-        Integer pageSize = pageDomain.getPageSize();
-        String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
-        Boolean reasonable = pageDomain.getReasonable();
-        PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
-        return pageDomain;
+//        PageDomain pageDomain = TableSupport.buildPageRequest();
+//        Integer pageNum = pageDomain.getPageNum();
+//        Integer pageSize = pageDomain.getPageSize();
+//        String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
+//        Boolean reasonable = pageDomain.getReasonable();
+        PageHelper.startPage(query.getPageNum(), query.getPageSize()).setReasonable(true);
     }
 
     /**

+ 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;
+    }
+
+}

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

@@ -859,4 +859,4 @@ public class StringUtils {
         m.put("pwd", "zhong");
         System.out.println(replace1(template, m));
     }
-}
+}

+ 2 - 10
sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/controller/BaseController.java

@@ -22,14 +22,6 @@ public class BaseController
 {
     protected final Logger logger = LoggerFactory.getLogger(this.getClass());
 
-    /**
-     * 设置请求分页数据
-     */
-    protected PageDomain startPage()
-    {
-        return PageUtils.startPage();
-    }
-
     /**
      * 设置请求排序数据
      */
@@ -54,8 +46,8 @@ public class BaseController
     /**
      * 响应请求分页数据
      */
-    protected <T> PageDataResult<T> getDataTable(PageInfo<T> pageInfo,PageDomain pageDomain)
+    protected <T> PageDataResult<T> getDataTable(PageInfo<T> pageInfo)
     {
-        return PageDataResult.success(pageDomain.getPageNum(), pageDomain.getPageSize(), pageInfo.getTotal(), pageInfo.getList());
+        return PageDataResult.success(pageInfo.getPageNum(), pageInfo.getPageSize(), pageInfo.getTotal(), pageInfo.getList());
     }
 }

+ 16 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/page/BaseQuery.java

@@ -0,0 +1,16 @@
+package com.sckw.core.web.page;
+
+import lombok.Data;
+
+/**
+ * @author tangyishan
+ * @since 2026-01-08  10:23
+ *  基础查询参数
+ */
+@Data
+public class BaseQuery {
+    /** 页码 */
+    private  Integer pageNum = 1;
+    /** 页大小 */
+    private  Integer pageSize = 10;
+}

+ 3 - 2
sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/response/BaseResult.java

@@ -30,9 +30,10 @@ public class BaseResult<T> implements Serializable {
         result.setData(data);
         return result;
     }
-    public static <T> BaseResult<T> success(String data) {
+    public static <T> BaseResult<T> success(T data,String message) {
         BaseResult<T> result = new BaseResult<>();
-        result.setMessage(data);
+        result.setData(data);
+        result.setMessage(message);
         return result;
     }
 

+ 1 - 1
sckw-common/sckw-common-datasource/pom.xml

@@ -48,4 +48,4 @@
             <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
         </dependency>
     </dependencies>
-</project>
+</project>

+ 6 - 0
sckw-common/sckw-common-redis/src/main/java/com/sckw/redis/constant/RedisConstant.java

@@ -144,4 +144,10 @@ public class RedisConstant {
      */
     public static final String LOGISTICS_SCORE_RECORD_RESET_KEY = "score:logistics:record:reset:%s";
 
+    public static final String AUDIT_TRADE_CONTRACT = "audit:trade:contract:%s";
+    public static final String AUDIT_TRADE_ORDER = "audit:trade:order:%s";
+    public static final String AUDIT_LOGISTICS_TASK = "audit:logistics:task:%s";
+    public static final String SIGN_TRADE_CONTRACT = "sign:trade:contract:%s";
+    public static final String SIGN_LOGISTICS_CONTRACT = "sign:trade:contract:%s";
+
 }

+ 2 - 1
sckw-gateway/src/main/java/com/sckw/gateway/filter/AuthenticationFilter.java

@@ -1,5 +1,6 @@
 package com.sckw.gateway.filter;
 
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.serializer.SimplePropertyPreFilter;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
@@ -92,7 +93,7 @@ public class AuthenticationFilter implements GlobalFilter, Ordered {
 //        String accessSpecial = request.getHeader(RequestConstant.ACCESS_SPECIAL);
         String requestUri = request.getPath().value();
         /*1、非token校验接口放行*/
-        if (EXCLUDEPATH.contains(requestUri)) {
+        if (EXCLUDEPATH.contains(requestUri)&& StrUtil.isNotBlank(token)) {
             Map<String, Object> tokenMap = EncryUtil.descryV2(Global.PRI_KEY, token);
             if (tokenMap != null) {
                 Long userId = StringUtils.isNotBlank(tokenMap.get("userId")) ? NumberUtils.parseLong(tokenMap.get("userId")) : null;

+ 7 - 1
sckw-modules-api/sckw-contract-api/pom.xml

@@ -31,5 +31,11 @@
             <groupId>com.sckw</groupId>
             <artifactId>sckw-common-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>io.swagger.core.v3</groupId>
+            <artifactId>swagger-annotations-jakarta</artifactId>
+            <version>2.2.22</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
-</project>
+</project>

+ 20 - 2
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.api;
 
+import com.sckw.contract.api.model.dto.req.ContractAuditPara;
 import com.sckw.contract.api.model.dto.res.*;
 import com.sckw.contract.api.model.vo.*;
 
@@ -7,6 +8,7 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @author czh
@@ -74,7 +76,8 @@ public interface RemoteContractService {
      * @return
      */
     TradeContractGoodsDto queryTradeContractNew(Long entId, Long goodsId, LocalDateTime time);
-    List<Long> queryNewSignGoods(Long entId,  LocalDateTime time);
+
+    List<Long> queryNewSignGoods(Long entId, LocalDateTime time);
 
     /**
      * 查询签约的商品
@@ -128,7 +131,6 @@ public interface RemoteContractService {
     TradeContractUnitDto queryEntByContractId(Long contractId);
 
 
-
     /**
      * 查询物流企业评分
      */
@@ -139,4 +141,20 @@ 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 entId,Integer type);
+    Long queryLogisticsCount(Long entId,Integer type);
+    ContractCountVo contractCount();
+
+    List<ContractVo> tradeList();
+
+    List<ContractVo> logisticsList();
+
+    ContractDetailRespVo auditTradeContract(ContractAuditPara contractAuditPara);
+
+    ContractDetailRespVo signTradeContract(ContractAuditPara contractAuditPara);
+
+    LogisticDetailRespVo signLogisticsContract(ContractAuditPara contractAuditPara);
 }

+ 22 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/req/ContractAuditPara.java

@@ -0,0 +1,22 @@
+package com.sckw.contract.api.model.dto.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author xucaiqin
+ * @date 2026-01-06 10:40:32
+ */
+@Getter
+@Setter
+@Schema(description = "合同审核参数")
+public class ContractAuditPara {
+    @Schema(description = "合同id start为 true时必填")
+//    @NotNull(message = "合同id不能为空")
+    private Long contractId;
+
+    @NotNull(message = "标识符不能为空,列表页时传 true ,其它传false")
+    private Boolean start;
+}

+ 3 - 3
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/req/LogisticsScoreDetailFeignDto.java

@@ -24,10 +24,10 @@ public class LogisticsScoreDetailFeignDto {
     @NotNull(message = "物流企业id不能为空")
     private Long logisticsEntId;
     /**
-     * 评分行为影响人id
+     * 影响人手机号
      */
-    @NotNull(message = "影响人id不能为空")
-    private Long influenceBy;
+    @NotBlank(message = "影响人手机号")
+    private String phone;
     /**
      * 评分行为
      */

+ 349 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/ContractDetailRespVo.java

@@ -0,0 +1,349 @@
+package com.sckw.contract.api.model.dto.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author czh
+ * @desc 贸易合同
+ * @date 2023/7/19
+ */
+@Data
+public class ContractDetailRespVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -3838851258036291498L;
+
+    /**
+     * 合同id 修改时必传
+     */
+    @Schema(description = "合同id")
+    private Long id;
+
+    /**
+     * 父合同ID 补充合同
+     */
+    @Schema(description = "父合同ID")
+    private Long pid;
+
+    /**
+     * 基础信息
+     */
+    @Schema(description = "基础信息")
+    private TradeBaseInfo baseInfo;
+
+    /**
+     * 合同文件
+     */
+    @Schema(description = "合同文件")
+    private String contractFile;
+
+    /**
+     * 标的信息
+     */
+    @Schema(description = "标的信息")
+    private List<TradeGoodsInfo> goodsInfo;
+
+//    @Schema(description = "关联贸易订单")
+//    private AssociatedOrder associatedOrder;
+
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+    @Data
+    public static class TradeBaseInfo implements Serializable{
+
+        @Serial
+        private static final long serialVersionUID = -5828478625710244673L;
+
+        /**
+         * 采购单位id
+         */
+        @Schema(description = "采购单位id")
+        private Long purchaseEntId;
+        /**
+         * 采购单位名称
+         */
+        @Schema(description = "采购单位名称")
+        private String purchaseFirmName;
+
+        /**
+         * 采购单位联系电话
+         */
+        @Schema(description = "采购单位联系电话")
+        private String purchasePhone;
+
+        /**
+         * 供应单位id
+         */
+        @NotNull(message = "供应单位不能为空")
+        private Long provideEntId;
+        /**
+         * 供应单位名称
+         */
+        @Schema(description = "供应单位名称")
+        private String provideFirmName;
+
+        /**
+         * 供应单位联系电话
+         */
+        @Schema(description = "供应单位联系电话")
+        private String providePhone;
+
+        /**
+         * 合同编号
+         */
+        @Schema(description = "合同编号")
+        private String contractCode;
+
+        /**
+         * 合同名称
+         */
+        @Schema(description = "合同名称")
+        private String contractName;
+        /**
+         * 合同状态
+         */
+        @Schema(description = "合同状态")
+        private String contractStatus;
+        /**
+         * 合同状态描述
+         */
+        @Schema(description = "合同状态描述")
+        private String contractStatusDesc;
+
+        /**
+         * 终止时间
+         */
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
+        @Schema(description = "终止时间")
+        private Date endTime;
+
+        /**
+         * 签约方式(1线上签约、2线下签约)
+         */
+        @Schema(description = "签约方式")
+        private Integer signingWay;
+        /**
+         * 签约方式描述
+         */
+        @Schema(description = "签约方式描述")
+        private String signingWayDesc;
+
+        /**
+         * 生效时间
+         */
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
+        @Schema(description = "生效时间")
+        private Date startTime;
+
+        /**
+         * 结算方式
+         */
+        @Schema(description = "结算方式")
+        private Integer settlement;
+        /**
+         * 结算方式描述
+         */
+        @Schema(description = "结算方式描述")
+        private String settlementDesc;
+
+        /**
+         * 派车方式
+         */
+        @Schema(description = "派车方式 1-手动派车,2-自动派车")
+        private Integer dispatchWay;
+        /**
+         * 派车方式描述
+         */
+        @Schema(description = "派车方式描述")
+        private String dispatchWayDesc;
+
+        /**
+         * 托运方式
+         */
+        @Schema(description = "托运方式")
+        private Integer consignment;
+        /**
+         * 托运方式描述
+         */
+        @Schema(description = "托运方式描述")
+        private String consignmentDesc;
+        /**
+         * 卸货方式
+         */
+        @Schema(description = "卸货方式")
+        private Integer unloadWay;
+        /**
+         * 卸货方式描述
+         */
+        @Schema(description = "卸货方式描述")
+        private String unloadWayDesc;
+        /**
+         * 销售人员id
+         */
+        @Schema(description = "销售人员id")
+        private Long salesmanId;
+        /**
+         * 销售联系电话
+         */
+        @Schema(description = "销售联系电话")
+        private String salesmanPhone;
+    }
+    @Data
+    public static class TradeGoodsInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -7003603561892852639L;
+
+        /**
+         * 商品id
+         */
+        @Schema(description = "商品id")
+        private Long goodsId;
+        /**
+         * 商品名称
+         */
+        @Schema(description = "商品名称")
+        private String goodsName;
+
+        /**
+         * 采购数量
+         */
+        @Schema(description = "采购数量")
+        private BigDecimal amount;
+
+        /**
+         * 单价
+         */
+        @Schema(description = "单价")
+        private BigDecimal price;
+
+        /**
+         * 单位
+         */
+        @Schema(description = "单位")
+        private String unit;
+        /**
+         * 生效时间
+         */
+        @Schema(description = "生效开始时间")
+        private Date effectiveStartTime;
+        /**
+         * 生效时间
+         */
+        @Schema(description = "生效结束时间")
+        private Date effectiveEntTime;
+    }
+//    @Data
+//    public static class AssociatedOrder implements Serializable{
+//        @Serial
+//        private static final long serialVersionUID = 3157352506945080734L;
+//        /**
+//         * 订单id
+//         */
+//        @Schema(description = "订单id")
+//        private Long orderId;
+//        /**
+//         * 订单状态
+//         */
+//        @Schema(description = "订单状态")
+//        private Integer orderStatus;
+//        /**
+//         * 订单编号
+//         */
+//        @Schema(description = "订单编号")
+//        private String orderCode;
+//        /**
+//         * 采购单位id
+//         */
+//        @Schema(description = "采购单位id")
+//        private Long purchaseEntId;
+//        /**
+//         * 采购单位名称
+//         */
+//        @Schema(description = "采购单位名称")
+//        private String purchaseEntName;
+//        /**
+//         * 供应单位id
+//         */
+//        @Schema(description = "供应单位id")
+//        private Long provideEntId;
+//        /**
+//         * 供应单位名称
+//         */
+//        @Schema(description = "供应单位名称")
+//        private String provideEntName;
+//        /**
+//         * 运输单位id
+//         */
+//        @Schema(description = "运输单位id")
+//        private Long transportEntId;
+//        /**
+//         * 运输单位名称
+//         */
+//        @Schema(description = "运输单位名称")
+//        private String transportEntName;
+//        /**
+//         * 商品id
+//         */
+//        @Schema(description = "商品id")
+//        private Long goodsId;
+//        /**
+//         * 商品名称
+//         */
+//        @Schema(description = "商品名称")
+//        private String goodsName;
+//        /**
+//         * 计费方式
+//         */
+//        @Schema(description = "计费方式")
+//        private Integer billingWay;
+//        /**
+//         * 计费方式描述
+//         */
+//        @Schema(description = "计费方式描述")
+//        private String billingWayDesc;
+//        /**
+//         * 下单量
+//         */
+//        @Schema(description = "下单量")
+//        private String amount;
+//        /**
+//         * 累计装货量
+//         */
+//        @Schema(description = "累计装货量")
+//        private String loadAmount;
+//        /**
+//         * 累计卸货量
+//         */
+//        @Schema(description = "累计卸货量")
+//        private String unloadAmount;
+//        /**
+//         * 运输单价
+//         */
+//        private String transportPrice;
+//        /**
+//         * 装货地址
+//         */
+//        @Schema(description = "装货地址")
+//        private String loadAddress;
+//        /**
+//         * 卸货地址
+//         */
+//        @Schema(description = "卸货地址")
+//        private String unloadAddress;
+//    }
+}

+ 228 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/LogisticDetailRespVo.java

@@ -0,0 +1,228 @@
+package com.sckw.contract.api.model.dto.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.Digits;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 物流合同明细返回参数
+ * @create :2025-11-06 18:30:00
+ */
+@Data
+public class LogisticDetailRespVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -1122401200820144338L;
+    /**
+     * 合同id 修改时必传
+     */
+    @Schema(description = "合同id")
+    private Long id;
+
+    /**
+     * 父合同ID 补充合同
+     */
+    @Schema(description = "父合同ID")
+    @NotNull(message = "父合同ID不能为空")
+    private Long pid;
+
+    /**
+     * 基础信息
+     */
+    @Schema(description = "基础信息")
+    @NotNull(message = "基础信息不能为空")
+    private TradeBaseInfo baseInfo;
+
+    /**
+     * 合同文件
+     */
+    @Schema(description = "合同文件")
+    @NotBlank(message = "合同文件不能为空")
+    private String contractFile;
+
+    /**
+     * 标的信息
+     */
+    @Schema(description = "标的信息")
+    @NotNull(message = "标的信息不能为空")
+    private List<TradeGoodsInfo> goodsInfo;
+
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+    @Data
+    public static class TradeBaseInfo implements Serializable{
+
+        @Serial
+        private static final long serialVersionUID = -5828478625710244673L;
+
+        /**
+         * 采购单位id
+         */
+        @Schema(description = "采购单位id")
+        @NotNull(message = "采购单位不能为空")
+        private Long purchaseEntId;
+
+        /**
+         * 采购单位联系电话
+         */
+        @Schema(description = "采购单位联系电话")
+        @NotBlank(message = "采购单位联系电话不能为空")
+        private String purchasePhone;
+
+        /**
+         * 供应单位id
+         */
+        @NotNull(message = "供应单位不能为空")
+        @Schema(description = "供应单位id")
+        private Long provideEntId;
+
+        /**
+         * 供应单位联系电话
+         */
+        @Schema(description = "供应单位联系电话")
+        @NotBlank(message = "供应单位联系电话不能为空")
+        private String providePhone;
+
+        /**
+         * 合同编号
+         */
+        @Schema(description = "合同编号")
+        @NotBlank(message = "合同编号不能为空")
+        @Size(max = 20, message = "合同编号超长")
+        private String contractCode;
+
+        /**
+         * 合同名称
+         */
+        @Schema(description = "合同名称")
+        @NotBlank(message = "合同名称不能为空")
+        @Size(max = 50, message = "合同名称超长")
+        private String contractName;
+
+        /**
+         * 终止时间
+         */
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
+        @Schema(description = "终止时间")
+        private Date endTime;
+
+        /**
+         * 签约方式(1线上签约、2线下签约)
+         */
+        @NotNull(message = "签约方式不能为空")
+        @Schema(description = "签约方式")
+        private Integer signingWay;
+        /**
+         * 签约方式描述
+         */
+        @Schema(description = "签约方式描述")
+        private String signingWayDesc;
+
+        /**
+         * 派车方式(1手动派车、2自动派车)
+         */
+        @Schema(description = "派车方式 1-手动派车,2-自动派车")
+        private Integer dispatchWay;
+        /**
+         * 派车方式描述
+         */
+        @Schema(description = "派车方式描述")
+        private String dispatchWayDesc;
+
+        /**
+         * 生效时间
+         */
+        @NotNull(message = "生效时间不能为空")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
+        @Schema(description = "生效时间")
+        private Date startTime;
+        /**
+         * 通用价格
+         */
+        @Schema(description = "通用价格")
+        private BigDecimal commonPrice;
+
+        /**
+         * 合同状态
+         */
+        @Schema(description = "合同状态")
+        private String contractStatus;
+        /**
+         * 合同状态描述
+         */
+        @Schema(description = "合同状态描述")
+        private String contractStatusDesc;
+
+
+    }
+    @Data
+    public static class TradeGoodsInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -7003603561892852639L;
+
+        /**
+         * 商品id
+         */
+        @NotNull(message = "商品不能为空")
+        @Schema(description = "商品id")
+        private Long goodsId;
+        /**
+         * 商品名称
+         */
+        @Schema(description = "商品名称")
+        private String goodsName;
+
+        /**
+         * 采购数量
+         */
+        @Schema(description = "采购数量")
+        @Digits(integer = 10, fraction = 2, message = "采购数量超长")
+        private BigDecimal amount;
+        /**
+         * 数量单位
+         */
+        private String amountUnit;
+
+        /**
+         * 单价
+         */
+        @Schema(description = "单价")
+        @Digits(integer = 10, fraction = 2, message = "单价超长")
+        private BigDecimal price;
+
+        /**
+         * 单位
+         */
+        @Schema(description = "价格单位")
+        private String unit;
+        /**
+         * 生效时间
+         */
+        @Schema(description = "生效开始时间")
+        @NotBlank(message = "生效时间不能为空")
+        private Date effectiveStartTime;
+        /**
+         * 生效时间
+         */
+        @Schema(description = "生效结束时间")
+        @NotBlank(message = "生效时间不能为空")
+        private Date effectiveEntTime;
+    }
+}

+ 25 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/ContractCountVo.java

@@ -0,0 +1,25 @@
+package com.sckw.contract.api.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @author xucaiqin
+ * @date 2026-01-05 10:38:44
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "合同统计")
+public class ContractCountVo implements Serializable {
+    @Schema(description = "贸易合同总数")
+    private Long tradeContractCount;
+    @Schema(description = "物流合同总数")
+    private Long logisticsContractCount;
+}

+ 36 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/ContractVo.java

@@ -0,0 +1,36 @@
+package com.sckw.contract.api.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+
+@Data
+@Schema(description = "合同信息")
+public class ContractVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7143305943655450894L;
+    private Long id;
+
+    @Schema(description = "状态")
+    private Integer status;
+
+
+    @Schema(description = "合同名称")
+    private String name;
+
+    @Schema(description = "总量")
+    private BigDecimal amount;
+
+    @Schema(description = "企业名称")
+    private String firmName;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+}

+ 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;
 

+ 4 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/TradeContractResDto.java

@@ -88,4 +88,8 @@ public class TradeContractResDto implements Serializable {
      */
     @TableField("dispatch_way")
     private Integer dispatchWay;
+    /**
+     * 计量方式
+     */
+    private Integer measurementWay;
 }

+ 10 - 0
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/RemoteFleetService.java

@@ -121,6 +121,8 @@ public interface RemoteFleetService {
 
     TruckDispatchCoefficientVO findAutoTruckDispatchByEntId(Long entId);
 
+    List<TruckDispatchCoefficientVO> findAutoTruckDispatchByEntIds(List<Long> entIds);
+
     DriverConductRulesVO findDriverConductRulesByEntId(Long entId);
 
     List<RTruckVo> findTruckByEntIds(Long entId);
@@ -131,4 +133,12 @@ public interface RemoteFleetService {
 
 
     void unbindTruck(Long entId, Long driverId);
+
+    /**
+     * @param driverId 司机分数
+     * @desc 查询司机分数
+     * @author zk
+     * @date 2023/8/3
+     **/
+    RDriverScoreVo findDriverScore(Long supEntId, Long logEntId, Long driverId);
 }

+ 7 - 0
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/feign/DriverScoreFeignService.java

@@ -1,6 +1,7 @@
 package com.sckw.fleet.api.feign;
 
 import com.sckw.core.web.response.HttpResult;
+import com.sckw.fleet.api.model.dto.DriverScoreQuery;
 import com.sckw.fleet.api.model.dto.UpdateDriverScoreDto;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.validation.annotation.Validated;
@@ -21,5 +22,11 @@ public interface DriverScoreFeignService {
      */
     @PostMapping("/kwfDriver/countDriver")
     public HttpResult countDriver(@RequestParam("entId") Long entId);
+
+    /**
+     * 统计指定物流企业所有司机总分
+     */
+    @PostMapping("/driverScore/countDriverScore")
+    public HttpResult countDriverScore(@Validated @RequestBody DriverScoreQuery query);
  }
 

+ 23 - 0
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/dto/DriverScoreQuery.java

@@ -0,0 +1,23 @@
+package com.sckw.fleet.api.model.dto;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * 司机评分查询参数
+ *
+ * @author tangyishan
+ * @since 2026-01-27  09:12
+ */
+@Data
+@AllArgsConstructor
+public class DriverScoreQuery {
+    /** 供应商企业id */
+    @NotNull(message = "供应商企业id不能为空")
+    private Long providerEntId;
+
+    /** 物流企业id */
+    @NotNull(message = "物流企业id不能为空")
+    private Long logisticsEntId;
+}

+ 5 - 1
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/dto/RUpdateDriverScoreDto.java

@@ -6,6 +6,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serial;
+import java.io.Serializable;
 import java.math.BigDecimal;
 
 /**
@@ -16,8 +18,10 @@ import java.math.BigDecimal;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class RUpdateDriverScoreDto {
+public class RUpdateDriverScoreDto implements Serializable {
 
+    @Serial
+    private static final long serialVersionUID = -8763763480079554893L;
     /**
      * 供应商企业id
      */

+ 6 - 1
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/dto/UpdateDriverScoreDto.java

@@ -6,6 +6,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serial;
+import java.io.Serializable;
 import java.math.BigDecimal;
 
 /**
@@ -16,7 +18,10 @@ import java.math.BigDecimal;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class UpdateDriverScoreDto {
+public class UpdateDriverScoreDto implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -4995959874726280406L;
 
     /** 供应商企业id */
     @NotNull(message = "供应商企业id不能为空")

+ 7 - 1
sckw-modules-api/sckw-order-api/pom.xml

@@ -28,6 +28,12 @@
             <groupId>com.sckw</groupId>
             <artifactId>sckw-common-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>io.swagger.core.v3</groupId>
+            <artifactId>swagger-annotations-jakarta</artifactId>
+            <version>2.2.22</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
-</project>
+</project>

+ 21 - 1
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/TradeOrderInfoService.java

@@ -129,6 +129,7 @@ public interface TradeOrderInfoService {
     Boolean associateEnt(Long firstEntId, Long secondEntId);
 
     OrderDetailVo queryByTradeOrderId(Long tradeOrderId);
+
     List<OrderDetailVo> queryByTradeOrderIds(Set<Long> tradeOrderId);
 
     /**
@@ -139,7 +140,6 @@ public interface TradeOrderInfoService {
     List<OrderUnitInfoDetailVO> queryOrderUnitInfByTOrderId(Set<Long> tradeOrderId);
 
 
-
     /**
      * 查询近期的贸易订单,计算商品的近期销量
      *
@@ -157,4 +157,24 @@ public interface TradeOrderInfoService {
 
     List<TradeOrderContractVo> queryByTradeContactIds(Set<Long> tradeContractIds);
 
+    TradeOrderContractVo queryByContractByTradeOrderId(Long tOrderId);
+
+    List<TradeOrderContractVo>  queryTradeOrderIds(Set<Long> tradeOrderIds);
+    Long queryTradeCount();
+
+    Long orderCount();
+
+    List<TradeVo> tradeList();
+
+    SaleDto countSale(CountPara countPara);
+
+    TimeSaleDto timeSale(CountPara countPara);
+
+    RankDto buyRank(CountPara countPara);
+
+    OrderDetailRes auditTradeOrder(TradeOrderAuditPara para);
+
+    BuyDto countBuy(CountPara countPara);
+
+    GoodsDto countGoods(CountPara countPara);
 }

+ 20 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/BuyDto.java

@@ -0,0 +1,20 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+
+@Data
+@Schema(description = "统计参数数据")
+public class BuyDto implements Serializable {
+
+    @Schema(description = "企业")
+    private List<String> firm;
+    @Schema(description = "销售")
+    private List<BigDecimal> amount;
+
+}

+ 28 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/BuyVo.java

@@ -0,0 +1,28 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+@Data
+@Schema(description = "数据统计-采购商")
+public class BuyVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7143305943655450894L;
+
+
+    @Schema(description = "采购企业id")
+    private Long entId;
+
+    @Schema(description = "采购企业")
+    private String firmName;
+
+
+    @Schema(description = "金额")
+    private BigDecimal price;
+}

+ 19 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/CountPara.java

@@ -0,0 +1,19 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+@Data
+@Schema(description = "统计参数数据")
+public class CountPara  implements Serializable {
+
+
+    @Schema(description = "开始时间")
+    private String startTime;
+    @Schema(description = "结束时间")
+    private String endTime;
+
+}

+ 20 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/GoodsDto.java

@@ -0,0 +1,20 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+
+@Data
+@Schema(description = "统计参数数据")
+public class GoodsDto implements Serializable {
+
+    @Schema(description = "商品名称")
+    private List<String> goodsName;
+    @Schema(description = "销售")
+    private List<BigDecimal> amount;
+
+}

+ 27 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/GoodsVo.java

@@ -0,0 +1,27 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+@Data
+@Schema(description = "数据统计-商品")
+public class GoodsVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7143305943655450894L;
+
+
+    @Schema(description = "商品id")
+    private Long goodsId;
+
+    @Schema(description = "商品名称")
+    private String goodsName;
+
+    @Schema(description = "金额")
+    private BigDecimal amount;
+}

+ 25 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/OrderUrl.java

@@ -0,0 +1,25 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @author xucaiqin
+ * @date 2026-01-15 13:45:43
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrderUrl implements Serializable {
+    @Schema(description = "订单号")
+    private String orderNo;
+    @Schema(description = "跳转链接")
+    private String url;
+
+}

+ 21 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/RankDto.java

@@ -0,0 +1,21 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+
+@Data
+@Schema(description = "统计参数数据")
+public class RankDto implements Serializable {
+
+
+    @Schema(description = "采购商")
+    private List<String> firmName;
+    @Schema(description = "采购金额")
+    private List<BigDecimal> amount;
+
+}

+ 23 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/SaleDto.java

@@ -0,0 +1,23 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+
+@Data
+@Schema(description = "统计销售数据")
+public class SaleDto implements Serializable {
+
+
+    @Schema(description = "日期")
+    private List<String> date;
+    @Schema(description = "销售")
+    private List<BigDecimal> sale;
+    @Schema(description = "订单")
+    private List<Integer> order;
+
+}

+ 28 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/SaleVo.java

@@ -0,0 +1,28 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+@Data
+@Schema(description = "数据统计-销售")
+public class SaleVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7143305943655450894L;
+
+
+    @Schema(description = "商品单价")
+    private BigDecimal unitPrice;
+
+    @Schema(description = "单量")
+    private Integer count;
+
+
+    @Schema(description = "日期")
+    private String orderDay;
+}

+ 22 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TimeSaleDataDto.java

@@ -0,0 +1,22 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+
+@Data
+@Schema(description = "实时销量数据")
+public class TimeSaleDataDto implements Serializable {
+
+
+    @Schema(description = "商品名称和规格")
+    private String name;
+
+    @Schema(description = "数据")
+    private List<BigDecimal> data;
+
+}

+ 21 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TimeSaleDto.java

@@ -0,0 +1,21 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+@Data
+@Schema(description = "实时销量数据")
+public class TimeSaleDto implements Serializable {
+
+
+    @Schema(description = "日期")
+    private List<String> date;
+
+    @Schema(description = "销售")
+    private List<TimeSaleDataDto> data;
+
+}

+ 23 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeBuyVo.java

@@ -0,0 +1,23 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+@Data
+@Schema(description = "采购量排行")
+public class TradeBuyVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7143305943655450894L;
+
+    @Schema(description = "采购商")
+    private String firmName;
+
+    @Schema(description = "金额")
+    private BigDecimal amount;
+}

+ 22 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeOrderAuditPara.java

@@ -0,0 +1,22 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author xucaiqin
+ * @date 2026-01-06 10:40:32
+ */
+@Getter
+@Setter
+@Schema(description = "订单审核参数")
+public class TradeOrderAuditPara {
+    @Schema(description = "订单id")
+    @NotNull(message = "订单id不能为空")
+    private Long orderId;
+
+    @NotNull(message = "标识符不能为空,列表页时传 true ,其它传false")
+    private Boolean start;
+}

+ 4 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeOrderPara.java

@@ -1,5 +1,6 @@
 package com.sckw.order.api.model;
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;
 import lombok.Getter;
 import lombok.Setter;
@@ -22,6 +23,9 @@ public class TradeOrderPara implements Serializable {
     @NotNull(message = "开始时间不能为空")
     private LocalDateTime endTime;
 
+    @Schema(description = "贸易订单号")
+    private String orderNo;
+
     private List<Long> entId;
     private Long userId;
     /**

+ 9 - 1
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeOrderVo.java

@@ -18,8 +18,16 @@ public class TradeOrderVo implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 6909518527687999256L;
+    private Long tOrderId;
+    private String moreUrl;
+
+    @JsonProperty("tOrderNoUrl")
+    private OrderUrl tOrderNoUrl;
+
+
     private Integer status;
     private String statusLabel;
+
     @JsonProperty("tOrderNo")
     private String tOrderNo;
     /**
@@ -42,7 +50,7 @@ public class TradeOrderVo implements Serializable {
     private BigDecimal unloadAmount;
     private Integer chargeType;
     private String chargeTypeLabel;
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;
 
     /**

+ 27 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeSaleVo.java

@@ -0,0 +1,27 @@
+package com.sckw.order.api.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+@Data
+@Schema(description = "商品实时销售数据")
+public class TradeSaleVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7143305943655450894L;
+
+
+    @Schema(description = "商品ID")
+    private Long goodsId;
+
+    @Schema(description = "金额")
+    private BigDecimal amount;
+
+    @Schema(description = "时间范围")
+    private String timePeriod;
+}

+ 50 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeVo.java

@@ -0,0 +1,50 @@
+package com.sckw.order.api.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+
+@Data
+public class TradeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7143305943655450894L;
+    private Long id;
+
+    /**
+     * 订单编号
+     */
+    @JsonProperty("tOrderNo")
+    @Schema(description = "订单编号")
+    private String tOrderNo;
+
+    @Schema(description = "商品名称")
+    private String goodsName;
+    /**
+     * 商品单价
+     */
+    @Schema(description = "商品单价")
+    private String unitPrice;
+    @Schema(description = "企业名称")
+    private String firmName;
+
+    @Schema(description = "状态")
+    private Integer status;
+
+    /**
+     * 下单量
+     */
+    @Schema(description = "下单量")
+    private BigDecimal amount;
+
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+}

+ 2 - 0
sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/dubbo/GoodsInfoService.java

@@ -3,6 +3,7 @@ package com.sckw.product.api.dubbo;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.product.api.model.AddressInfoDetail;
 import com.sckw.product.api.model.GoodsDetail;
+import com.sckw.product.api.model.GoodsDetails;
 import com.sckw.product.api.model.KwpGoods;
 
 import java.math.BigDecimal;
@@ -15,6 +16,7 @@ import java.util.Map;
  * @date: 2023-07-13 14:09
  */
 public interface GoodsInfoService {
+    GoodsDetails getDetail(Long id);
 
     /**
      * @desc: 根据商品id获取商品详情

+ 167 - 0
sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/model/GoodsDetails.java

@@ -0,0 +1,167 @@
+package com.sckw.product.api.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @desc: 商品详情响应
+ * @author: yzc
+ * @date: 2023-07-05 11:49
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class GoodsDetails implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 8591441505622156556L;
+    /**
+     * 商品id
+     */
+    private Long id;
+
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+
+    /**
+     * 商品编号
+     */
+    private String code;
+
+    /**
+     * 商品名称
+     */
+    private String name;
+
+    /**
+     * 商品类型
+     */
+    private String goodsType;
+
+    /**
+     * 商品类型集合
+     */
+    private List<String> goodsTypes;
+
+    /**
+     * 商品类型lab
+     */
+    private String goodsTypeLabel;
+
+    /**
+     * 商品类型labs
+     */
+    private String goodsTypeLabels;
+
+    /**
+     * 库存数量
+     */
+    private BigDecimal amount;
+
+    /**
+     * 单位(吨、方、件、箱、其他)
+     */
+    private String unit;
+
+    /**
+     * 单位lab
+     */
+    private String unitLabel;
+
+    /**
+     * 尺寸大小
+     */
+    private String spec;
+    private String specLabel;
+
+    /**
+     * 发票税率(%)
+     */
+    private String taxRate;
+
+    /**
+     * 发票税率label
+     */
+    private String taxRateLabel;
+
+    /**
+     * 是否设置预付限额0否1是
+     */
+    private Integer prepaidLimit;
+
+    /**
+     * 是否设置预付限额label
+     */
+    private String prepaidLimitLabel;
+
+    /**
+     * 预付款最低限额
+     */
+    private BigDecimal advancePrice;
+
+    /**
+     * 专属客户经理id
+     */
+    private Long manager;
+
+    /**
+     * 专属客户经理姓名
+     */
+    private String managerName;
+
+    /**
+     * 专属客户经理电话
+     */
+    private String managerPhone;
+
+    /**
+     * 成交量
+     */
+    private BigDecimal performedAmount;
+
+    /**
+     * 缩略图
+     */
+    private String thumb;
+
+    /**
+     * 上架时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date addedTime;
+
+    /**
+     * 下架时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date shelfTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 状态:0草稿/1上架/2下架
+     */
+    private Integer status;
+
+    /**
+     * 状态label
+     */
+    private String statusLabel;
+
+}

+ 1 - 0
sckw-modules-api/sckw-system-api/src/main/java/com/sckw/system/api/RemoteSystemService.java

@@ -188,6 +188,7 @@ public interface RemoteSystemService {
      */
     UserCacheResDto queryUserCacheById(Long userId);
     UserResDto queryUserById(Long userId);
+    UserResDto queryUserByPhone(String phone);
 
     /**
      * @desc: 从缓存查用户信息

+ 13 - 5
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java

@@ -1,16 +1,11 @@
 package com.sckw.transport.api.dubbo;
 
-import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.transport.api.model.dto.AcceptCarriageLogisticsOrderDto;
 import com.sckw.transport.api.model.dto.AccountCheckingBindDTO;
 import com.sckw.transport.api.model.dto.RWaybillOrderDto;
 import com.sckw.transport.api.model.param.*;
 import com.sckw.transport.api.model.vo.*;
-import io.swagger.v3.oas.annotations.Operation;
-import jakarta.validation.Valid;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
 
 import java.util.List;
 import java.util.Set;
@@ -206,4 +201,17 @@ public interface TransportRemoteService {
     List<KwtLogisticsOrderAddressVo> queryByWOrderId(Long wayBillOrderId);
 
     List<WayContaractbillOrderVo> queryLogisticContractByContTradeIds(Set<Long> contractIds);
+    Long queryLogisticsCount(Long entId,Integer type);
+    Long queryWaybillCount();
+    Long queryCount();
+
+    List<LogisticsVo> logisticsList();
+
+    LogisticsDto logisticsRank(TimePara timePara);
+
+    WaybillOrderDetailVo auditLogisticsTask(LogisticsOrderAuditPara para);
+
+    Object countLogistics(CountPara2 countPara);
+
+    List<LogisticContractVo> queryLogOrderCirculateByLogOrderId(Long tradeOrderId);
 }

+ 4 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/AddLogisticOrderParam.java

@@ -224,6 +224,10 @@ public class AddLogisticOrderParam implements Serializable {
      */
     @NotNull(message = "计费方式不能为空")
     private String billingMode;
+    /**
+     * 计量方式
+     */
+    private Integer measurementWay;
 
     /**
      * 计划卸货时间

+ 22 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/LogisticsOrderAuditPara.java

@@ -0,0 +1,22 @@
+package com.sckw.transport.api.model.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author xucaiqin
+ * @date 2026-01-06 10:40:32
+ */
+@Getter
+@Setter
+@Schema(description = "订单审核参数")
+public class LogisticsOrderAuditPara {
+    @Schema(description = "订单id 初次审核时不能为空")
+//    @NotNull(message = "订单id不能为空")
+    private Long orderId;
+
+    @NotNull(message = "标识符不能为空,列表页时传 true ,其它传false")
+    private Boolean start;
+}

+ 19 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/TimePara.java

@@ -0,0 +1,19 @@
+package com.sckw.transport.api.model.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+@Data
+@Schema(description = "统计参数数据")
+public class TimePara implements Serializable {
+
+
+    @Schema(description = "开始时间")
+    private String startTime;
+    @Schema(description = "结束时间")
+    private String endTime;
+
+}

+ 19 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/CountPara2.java

@@ -0,0 +1,19 @@
+package com.sckw.transport.api.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+@Data
+@Schema(description = "统计参数数据")
+public class CountPara2 implements Serializable {
+
+
+    @Schema(description = "开始时间")
+    private String startTime;
+    @Schema(description = "结束时间")
+    private String endTime;
+
+}

+ 21 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/LogisticsDto.java

@@ -0,0 +1,21 @@
+package com.sckw.transport.api.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+
+@Data
+@Schema(description = "物流排行")
+public class LogisticsDto implements Serializable {
+
+
+    @Schema(description = "物流商")
+    private List<String> firmName;
+    @Schema(description = "卸货量")
+    private List<BigDecimal> amount;
+
+}

+ 49 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/LogisticsVo.java

@@ -0,0 +1,49 @@
+package com.sckw.transport.api.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+
+@Data
+public class LogisticsVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7143305943655450894L;
+    private Long id;
+    /**
+     * 订单编号
+     */
+    @JsonProperty("w_order_no")
+    @Schema(description = "运单编号")
+    private String wOrderNo;
+
+    @Schema(description = "商品名称")
+    private String goodsName;
+
+    @Schema(description = "商品单价")
+    private String unitPrice;
+    @Schema(description = "单位名称")
+    private String firmName;
+
+    @Schema(description = "状态")
+    private Integer status;
+
+    /**
+     * 任务量
+     */
+    @Schema(description = "任务量")
+    private BigDecimal taskAmount;
+    @Schema(description = "卸货净量")
+    private BigDecimal unloadAmount;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "卸货时间")
+    private LocalDateTime unloadTime;
+}

+ 259 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/WaybillOrderDetailVo.java

@@ -0,0 +1,259 @@
+package com.sckw.transport.api.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 运单详情
+ * @create :2025-11-15 13:46:00
+ */
+@Data
+public class WaybillOrderDetailVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -8652529429805600924L;
+    /**
+     * 运单id
+     */
+    @Schema(description = "运单id")
+    private String waybillOrderId;
+    /**
+     * 运单编号
+     */
+    @Schema(description = "运单编号")
+    private String waybillOrderNo;
+    /**
+     * 物流订单id
+     */
+    @Schema(description = "物流订单id")
+    private String logisticOrderId;
+    /**
+     * 物流订单号
+     */
+    @Schema(description = "物流订单号")
+    private String logisticOrderNo;
+    /**
+     * 计费方式
+     */
+    @Schema(description = "计费方式")
+    private String priceType;
+    /**
+     * 计费方式描述
+     */
+    @Schema(description = "计费方式描述")
+    private String priceTypeDesc;
+    /**
+     * 车牌号
+     */
+    @Schema(description = "车牌号")
+    private String truckNo;
+    /**
+     * 车辆轴数
+     */
+    @Schema(description = "车辆轴数")
+    private String carAxis;
+    /**
+     * 所属车队
+     */
+    @Schema(description = "所属车队")
+    private String fleetName;
+    /**
+     * 司机姓名
+     */
+    @Schema(description = "司机姓名")
+    private String driverName;
+    /**
+     * 联系方式
+     */
+    @Schema(description = "联系方式")
+    private String driverPhone;
+    /**
+     * 身份证号
+     */
+    @Schema(description = "身份证号")
+    private String driverIdCard;
+    /**
+     * 商品名称
+     */
+    @Schema(description = "商品名称")
+    private String goodsName;
+    /**
+     * 装货地址
+     */
+    @Schema(description = "装货地址")
+    private String loadAddress;
+    /**
+     * 卸货地址
+     */
+    @Schema(description = "卸货地址")
+    private String unloadAddress;
+    /**
+     * 任务量
+     */
+    @Schema(description = "任务量")
+    private String taskVolume;
+    /**
+     * 装货量
+     */
+    @Schema(description = "装货量")
+    private String loadAmount;
+    /**
+     * 卸货量
+     */
+    @Schema(description = "卸货量")
+    private String unloadAmount;
+
+    /**
+     * 供应单位
+     */
+    @Schema(description = "供应单位")
+    private String supplyEntName;
+
+    /**
+     * 托运企业
+     */
+    @Schema(description = "托运企业")
+    private String transEntName;
+    /**
+     * 承运企业
+     */
+    @Schema(description = "承运企业")
+   private String carrierEntName;
+    /**
+     * 装货完成率(装货量*任务量)*100%
+     */
+    @Schema(description = "装货完成率")
+    private String loadCompleteRate;
+    /**
+     * 货损率(装货量-卸货量)*装货量*100%
+     */
+    @Schema(description = "货损率")
+    private String lossRate;
+
+    /**
+     * 皮重
+     */
+    @Schema(description = "皮重")
+    private BigDecimal tareAmount;
+
+    /**
+     * 毛重
+     */
+    @Schema(description = "毛重")
+    private BigDecimal grossAmount;
+
+    /**
+     * 状态
+     */
+    @Schema(description = "状态")
+    private Integer status;
+
+    /**
+     * 状态描述
+     */
+    @Schema(description = "状态描述")
+    private String statusDesc;
+
+    /**
+     * 法定载重
+     */
+    @Schema(description = "法定载重")
+    private BigDecimal legalLoad;
+
+    /**
+     * 装卸货之间距离
+     */
+    @Schema(description = "装卸货之间距离")
+    private String distanceKm;
+
+    /**
+     * 装货地址经度
+     */
+    @Schema(description = "装货地址经度")
+    private String loadLongitude;
+    /**
+     * 装货地址纬度
+     */
+    @Schema(description = "装货地址纬度")
+    private String loadLatitude;
+
+    /**
+     * 卸货地址经度
+     */
+    @Schema(description = "卸货地址经度")
+    private String unloadLongitude;
+    /**
+     * 卸货地址纬度
+     */
+    @Schema(description = "卸货地址纬度")
+    private String unloadLatitude;
+
+    /**
+     * 过磅记录
+     */
+    @Schema(description = "过磅记录")
+    private List<WeighingRecord> weighingRecords;
+
+    /**
+     * 单据信息
+     */
+    @Schema(description = "单据信息")
+    private BillInfo billInfo;
+    /**
+     * 运单id列表
+     */
+    private List<Long> billOrderIdList;
+    @Data
+    public static class WeighingRecord implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -2336627824004942658L;
+
+        /**
+         * 过磅时间
+         */
+        @Schema(description = "过磅时间")
+        private String weighingTime;
+        /**
+         * 过磅描述
+         */
+        @Schema(description = "过磅描述")
+        private String weighingDesc;
+        /**
+         * 过磅图片地址
+         */
+        @Schema(description = "过磅图片地址")
+        private String weighingImgUrl;
+        /**
+         * 地磅名称
+         */
+        @Schema(description = "地磅名称")
+        private String weighingName;
+
+    }
+    @Data
+    public static class BillInfo implements  Serializable{
+        @Serial
+        private static final long serialVersionUID = 327264843861102865L;
+        /**
+         * 上传人名称
+         */
+        @Schema(description = "上传人名称")
+        private String uploadByLabel;
+        /**
+         * 上传时间
+         */
+        @Schema(description = "上传时间")
+        private String uploadTime;
+        /**
+         * 单据地址
+         */
+        @Schema(description = "单据地址")
+        private String billUrl;
+    }
+}

+ 19 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/WaybillRankVo.java

@@ -0,0 +1,19 @@
+package com.sckw.transport.api.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+@Data
+@Schema(description = "物流排行")
+public class WaybillRankVo implements Serializable {
+
+    @Schema(description = "企业名称")
+    private String firmName;
+    @Schema(description = "重量")
+    private BigDecimal amount;
+
+}

+ 19 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/WaybillVo.java

@@ -0,0 +1,19 @@
+package com.sckw.transport.api.model.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+@Data
+@Schema(description = "数据统计-物流")
+public class WaybillVo implements Serializable {
+
+    @Schema(description = "企业名称")
+    private String firmName;
+    @Schema(description = "金额")
+    private BigDecimal money;
+
+}

+ 1 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/api/KwcContractLogisticsScoreApiController.java → sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcContractLogisticsScoreApiController.java

@@ -1,4 +1,4 @@
-package com.sckw.contract.api;
+package com.sckw.contract.controller;
 
 import com.sckw.contract.api.model.dto.req.LogisticsScoreDetailFeignDto;
 import com.sckw.contract.service.IKwcContractLogisticsScoreService;

+ 9 - 11
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcContractLogisticsScoreController.java

@@ -2,9 +2,7 @@ package com.sckw.contract.controller;
 
 
 import com.github.pagehelper.PageInfo;
-import com.sckw.contract.model.dto.req.LogisticsScoreApprovalDto;
-import com.sckw.contract.model.dto.req.LogisticsScoreDetailAddDto;
-import com.sckw.contract.model.dto.req.LogisticsScoreDetailQueryDto;
+import com.sckw.contract.model.dto.req.*;
 import com.sckw.contract.model.vo.res.LogisticsScoreDetailResVo;
 import com.sckw.contract.model.vo.res.LogisticsScoreResVo;
 import com.sckw.core.web.context.LoginUserHolder;
@@ -38,16 +36,16 @@ public class KwcContractLogisticsScoreController extends BaseController
     /**
      * 查询物流企业评分列表
      */
-    @GetMapping("/queryListByPage")
+    @PostMapping("/queryListByPage")
     @Operation(summary = "分页查询供应商物流企业评分",parameters =  {
             @Parameter(name = "pageNum", description = "页码"),
             @Parameter(name = "pageSize", description = "每页数量")
     })
-    public BaseResult<PageDataResult<LogisticsScoreResVo>> queryListByPage()
+    public BaseResult<PageDataResult<LogisticsScoreResVo>> queryListByPage(@RequestBody @Validated LogisticsScoreQueryDto query)
     {
-        PageDomain pageDomain = TableSupport.buildPageRequest();
-        PageInfo<LogisticsScoreResVo> list = kwcContractLogisticsScoreService.selectLogisticsScoreWithPendingSocreList(LoginUserHolder.getEntId());
-        return BaseResult.success(getDataTable(list, pageDomain));
+        query.setProviderEntId(LoginUserHolder.getEntId());
+        PageInfo<LogisticsScoreResVo> list = kwcContractLogisticsScoreService.selectLogisticsScoreWithPendingSocreList(query);
+        return BaseResult.success(getDataTable(list));
     }
 
     /**
@@ -60,9 +58,9 @@ public class KwcContractLogisticsScoreController extends BaseController
     })
     public BaseResult<PageDataResult<LogisticsScoreDetailResVo>> queryDetailListByPage(@Validated @RequestBody LogisticsScoreDetailQueryDto detailReqDto)
     {
-        PageDomain pageDomain = TableSupport.buildPageRequest();
-        PageInfo<LogisticsScoreDetailResVo> list = kwcContractLogisticsScoreService.selectKwcContractLogisticsScoreDetailList(detailReqDto,LoginUserHolder.getEntId());
-        return BaseResult.success(getDataTable(list,pageDomain));
+        detailReqDto.setProviderEntId(LoginUserHolder.getEntId());
+        PageInfo<LogisticsScoreDetailResVo> list = kwcContractLogisticsScoreService.selectKwcContractLogisticsScoreDetailList(detailReqDto);
+        return BaseResult.success(getDataTable(list));
     }
 
     /**

+ 13 - 6
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dao/KwcContractLogisticsMapper.java

@@ -1,6 +1,7 @@
 package com.sckw.contract.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.contract.api.model.vo.ContractVo;
 import com.sckw.contract.model.dto.req.QueryListReqDto;
 import com.sckw.contract.model.dto.res.QueryListResDto;
 import com.sckw.contract.model.entity.KwcContractLogistics;
@@ -11,20 +12,20 @@ import org.apache.ibatis.annotations.Param;
 import java.util.List;
 
 /**
-* @author PC
-* @description 针对表【kwc_contract_logistics(物流合同(承运合同/托运合同))】的数据库操作Mapper
-* @createDate 2023-07-13 13:36:19
-* @Entity com.sckw.contract.model.entity.KwcContractLogistics
-*/
+ * @author PC
+ * @description 针对表【kwc_contract_logistics(物流合同(承运合同/托运合同))】的数据库操作Mapper
+ * @createDate 2023-07-13 13:36:19
+ * @Entity com.sckw.contract.model.entity.KwcContractLogistics
+ */
 @Mapper
 public interface KwcContractLogisticsMapper extends BaseMapper<KwcContractLogistics> {
 
     /**
+     * @return QueryListResDto
      * @desc: 查询
      * @param: reqVo
      * @author: czh
      * @date 2023/7/17
-     * @return QueryListResDto
      */
     List<QueryListResDto> queryList(QueryListReqDto reqVo);
 
@@ -48,6 +49,12 @@ public interface KwcContractLogisticsMapper extends BaseMapper<KwcContractLogist
     List<String> checkContractIsSole(@Param("contractCode") String contractCode, @Param("carrierEntId") Long carrierEntId, @Param("checkedEntId") Long checkedEntId);
 
     List<KwcContractLogistics> selectIsSole(@Param("contractNo") String contractNo, @Param("acceptId") Long acceptId, @Param("consignId") Long consignId);
+
+    Long count(@Param("ids") List<Long> ids, @Param("entId") Long entId);
+
+    List<ContractVo> logisticsList(@Param("ids") List<Long> ids, @Param("all") Boolean all, @Param("entId") Long entId);
+
+    Long selectSignCount(@Param("entId") Long entId, @Param("type") Integer type);
 }
 
 

+ 7 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dao/KwcContractTradeMapper.java

@@ -7,6 +7,7 @@ import com.sckw.contract.model.dto.res.QueryContractValidCountResDto;
 import com.sckw.contract.model.dto.res.QueryListResDto;
 import com.sckw.contract.model.entity.KwcContractTrade;
 import com.sckw.contract.model.vo.req.QueryListReqVo;
+import com.sckw.contract.api.model.vo.ContractVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -66,6 +67,12 @@ public interface KwcContractTradeMapper extends BaseMapper<KwcContractTrade> {
     List<Long> querySignTradeContract(@Param("entId") Long entId, @Param("time") LocalDateTime time);
 
     List<Long> selectByContract(@Param("contractId") Long contractId);
+
+    Long count(@Param("ids") List<Long> ids);
+
+    List<ContractVo> tradeList(@Param("ids") List<Long> ids, @Param("audit")Boolean audit, @Param("all") Boolean all);
+
+    Long selectSignCount(@Param("entId")Long entId,@Param("type") Integer type);
 }
 
 

+ 233 - 5
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java

@@ -1,18 +1,26 @@
 package com.sckw.contract.dubbo;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.google.common.collect.Sets;
 import com.sckw.contract.api.RemoteContractService;
+import com.sckw.contract.api.model.dto.req.ContractAuditPara;
 import com.sckw.contract.api.model.dto.res.*;
 import com.sckw.contract.api.model.vo.*;
 import com.sckw.contract.dao.*;
 import com.sckw.contract.model.dto.res.QueryContractValidCountResDto;
 import com.sckw.contract.model.entity.*;
+import com.sckw.contract.model.vo.req.ContractDetailReq;
+import com.sckw.contract.model.vo.res.ContractDetailResp;
+import com.sckw.contract.model.vo.res.QueryLogisticDetailResp;
 import com.sckw.contract.repository.*;
 import com.sckw.contract.service.KwcContractLogisticsUnitService;
+import com.sckw.contract.service.operateService.KwcContractLogisticsService;
 import com.sckw.contract.service.operateService.KwcContractTradeService;
 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.constant.Global;
 import com.sckw.core.model.enums.ContractStatusEnum;
@@ -21,6 +29,8 @@ import com.sckw.core.model.enums.EntTypeEnum;
 import com.sckw.core.model.enums.SigningWayEnum;
 import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.redis.constant.RedisConstant;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.transport.api.dubbo.TransportRemoteService;
 import com.sckw.transport.api.model.vo.LogisticContractVo;
@@ -29,10 +39,12 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -64,6 +76,7 @@ public class RemoteContractServiceImpl implements RemoteContractService {
     private RemoteSystemService remoteSystemService;
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     private TransportRemoteService transportRemoteService;
+    private final RedisTemplate<String, Object> redisTemplate;
 
     private final KwcContractTradeRepository kwcContractTradeRepository;
     private final KwcContractLogisticsRepository contractLogisticsRepository;
@@ -73,6 +86,7 @@ public class RemoteContractServiceImpl implements RemoteContractService {
     private final KwcContractLogisticsGoodsRepository kwcContractLogisticsGoodsRepository;
     private final KwcContractTradeService kwcContractTradeService;
     private final KwcContractLogisticsScoreRepository contractLogisticsScoreRepository;
+    private final KwcContractLogisticsService kwcContractLogisticsService;
 
     @Override
     public Map<Long, ContractCommonInfoResDto> queryContractBaseInfo(List<Long> contractIds) {
@@ -260,6 +274,7 @@ public class RemoteContractServiceImpl implements RemoteContractService {
             tradeContractResDto.setContactName(kwcContractTrade.getName());
             tradeContractResDto.setContractNo(kwcContractTrade.getContractNo());
             tradeContractResDto.setDispatchWay(kwcContractTrade.getDispatchWay());
+            tradeContractResDto.setMeasurementWay(kwcContractTrade.getMeasurementWay());
             KwcContractTradeGoods kwcContractTradeGoods = kwcContractTradeGoodsMapper.selectOne(new LambdaQueryWrapper<KwcContractTradeGoods>()
                     .eq(KwcContractTradeGoods::getContractId, tradeContractId)
                     .eq(KwcContractTradeGoods::getGoodsId, goodsId)
@@ -280,9 +295,10 @@ public class RemoteContractServiceImpl implements RemoteContractService {
     public TradeContractGoodsDto queryTradeContractNew(Long entId, Long goodsId, LocalDateTime time) {
         return kwcContractTradeMapper.queryNewSignPrice(entId, goodsId, time);
     }
-   @Override
+
+    @Override
     public List<Long> queryNewSignGoods(Long entId, LocalDateTime time) {
-        return kwcContractTradeMapper.queryNewSignGoods(entId,  time);
+        return kwcContractTradeMapper.queryNewSignGoods(entId, time);
     }
 
     @Override
@@ -325,7 +341,7 @@ public class RemoteContractServiceImpl implements RemoteContractService {
     @Override
     public List<TradeContractUnitDto> queryContractUnitByContractId(Long contractId) {
         List<KwcContractTradeUnit> units = kwcContractTradeUnitRepository.queryByContractId(contractId);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty( units)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(units)) {
             return List.of();
         }
         return units.stream().map(unit -> {
@@ -431,7 +447,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);
@@ -467,7 +483,7 @@ public class RemoteContractServiceImpl implements RemoteContractService {
 
             //查询供应企业
             KwcContractLogisticsUnit unit = kwcContractLogisticsUnitRepository
-                    .queryByContractIdAndEntType(log.getId(), entId, EntTypeEnum.LOGISTICS3.getCode());
+                    .queryByContractIdAndEntType(log.getId(), EntTypeEnum.LOGISTICS3.getCode());
             if (unit != null) {
                 dto.setSupEntId(unit.getEntId());
             }
@@ -475,5 +491,217 @@ 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(Long entId, Integer type) {
+        return kwcContractTradeService.querySign(entId, type);
+    }
+
+    @Override
+    public Long queryLogisticsCount(Long entId, Integer type) {
+        // type 买方或物流方
+        return kwcContractLogisticsMapper.selectSignCount(entId, type);
+    }
+
+    @Override
+    public ContractCountVo contractCount() {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        Long count = kwcContractTradeMapper.count(ids);
+        ContractCountVo contractCountVo = new ContractCountVo();
+        contractCountVo.setTradeContractCount(count);
+        contractCountVo.setLogisticsContractCount(0L);
+        Long count1 = kwcContractLogisticsMapper.count(ids, LoginUserHolder.getEntId());
+        contractCountVo.setLogisticsContractCount(count1);
+        return contractCountVo;
+    }
+
+    @Override
+    public List<ContractVo> tradeList() {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        return kwcContractTradeMapper.tradeList(ids, false, false);
+    }
+
+    @Override
+    public List<ContractVo> logisticsList() {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+
+        return kwcContractLogisticsMapper.logisticsList(ids, false, LoginUserHolder.getEntId());
+    }
+
+    private List<Long> separateAndRotate(List<Long> list, long pivot) {
+        if (list == null || list.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        // 查找分隔元素的索引
+        int pivotIndex = list.indexOf(pivot);
+        if (pivotIndex == -1) {
+            // 如果元素不存在,返回原列表的副本
+            return new ArrayList<>(list);
+        }
+
+        List<Long> result = new ArrayList<>();
+
+        // 添加右边的元素(分隔元素之后的部分)
+        for (int i = pivotIndex + 1; i < list.size(); i++) {
+            result.add(list.get(i));
+        }
+
+        // 添加左边的元素(分隔元素之前的部分)
+        for (int i = 0; i < pivotIndex; i++) {
+            result.add(list.get(i));
+        }
+        return result;
+    }
+
+    @Override
+    public ContractDetailRespVo auditTradeContract(ContractAuditPara contractAuditPara) {
+        Long contractId = contractAuditPara.getContractId();
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        String key = String.format(RedisConstant.AUDIT_TRADE_CONTRACT, LoginUserHolder.getEntId());
+
+        if (contractAuditPara.getStart()) {//首次加载,合同id为第一个合同
+            if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) {
+                redisTemplate.delete(key);
+            }
+            //写入缓存
+            List<ContractVo> contractVos = kwcContractTradeMapper.tradeList(ids, true, true);
+            if (CollUtil.isNotEmpty(contractVos)) {
+                List<Long> list = contractVos.stream().map(ContractVo::getId).toList();
+                List<Long> longs = separateAndRotate(list, contractId);
+                redisTemplate.opsForList().rightPushAll(key, longs);
+                redisTemplate.expire(key, 24, TimeUnit.HOURS);
+            }
+
+        } else {
+            contractId = (Long) redisTemplate.opsForList().leftPop(key);
+            if (Objects.isNull(contractId)) {
+                throw new BusinessException("已审核完成");
+            }
+        }
+
+        ContractDetailReq contractDetailReq = new ContractDetailReq();
+        contractDetailReq.setContractId(String.valueOf(contractId));
+        ContractDetailResp contractDetailResp = kwcContractTradeService.queryContractDetail(contractDetailReq);
+        if (Objects.nonNull(contractDetailResp)) {
+            return BeanUtil.toBean(contractDetailResp, ContractDetailRespVo.class);
+        }
+        throw new BusinessException("未找到合同");
+    }
+
+    @Override
+    public ContractDetailRespVo signTradeContract(ContractAuditPara contractAuditPara) {
+        Long contractId = contractAuditPara.getContractId();
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        String key = String.format(RedisConstant.SIGN_TRADE_CONTRACT, LoginUserHolder.getEntId());
+
+        if (contractAuditPara.getStart()) {//首次加载,合同id为第一个合同
+            if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) {
+                redisTemplate.delete(key);
+            }
+            //写入缓存
+            List<ContractVo> contractVos = kwcContractTradeMapper.tradeList(ids, false, true);
+            if (CollUtil.isNotEmpty(contractVos)) {
+                List<Long> list = contractVos.stream().map(ContractVo::getId).toList();
+                List<Long> longs = separateAndRotate(list, contractId);
+                redisTemplate.opsForList().rightPushAll(key, longs);
+                redisTemplate.expire(key, 24, TimeUnit.HOURS);
+            }
+
+        } else {
+            contractId = (Long) redisTemplate.opsForList().leftPop(key);
+            if (Objects.isNull(contractId)) {
+                throw new BusinessException("已审核完成");
+            }
+        }
+
+        ContractDetailReq contractDetailReq = new ContractDetailReq();
+        contractDetailReq.setContractId(String.valueOf(contractId));
+        ContractDetailResp contractDetailResp = kwcContractTradeService.queryContractDetail(contractDetailReq);
+        if (Objects.nonNull(contractDetailResp)) {
+            return BeanUtil.toBean(contractDetailResp, ContractDetailRespVo.class);
+        }
+        throw new BusinessException("未找到合同");
+    }
+
+    @Override
+    public LogisticDetailRespVo signLogisticsContract(ContractAuditPara contractAuditPara) {
+        Long contractId = contractAuditPara.getContractId();
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        String key = String.format(RedisConstant.SIGN_LOGISTICS_CONTRACT, LoginUserHolder.getEntId());
+
+        if (contractAuditPara.getStart()) {//首次加载,合同id为第一个合同
+            if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) {
+                redisTemplate.delete(key);
+            }
+            //写入缓存
+            List<ContractVo> contractVos = kwcContractLogisticsMapper.logisticsList(ids, true, LoginUserHolder.getEntId());
+            if (CollUtil.isNotEmpty(contractVos)) {
+                List<Long> list = contractVos.stream().map(ContractVo::getId).toList();
+                List<Long> longs = separateAndRotate(list, contractId);
+                redisTemplate.opsForList().rightPushAll(key, longs);
+                redisTemplate.expire(key, 24, TimeUnit.HOURS);
+            }
+
+        } else {
+            contractId = (Long) redisTemplate.opsForList().leftPop(key);
+            if (Objects.isNull(contractId)) {
+                throw new BusinessException("已审核完成");
+            }
+        }
+
+        ContractDetailReq contractDetailReq = new ContractDetailReq();
+        contractDetailReq.setContractId(String.valueOf(contractId));
+        QueryLogisticDetailResp queryLogisticDetailResp = kwcContractLogisticsService.queryLogisticsContractDetail(contractDetailReq);
+        if (Objects.nonNull(queryLogisticDetailResp)) {
+            return BeanUtil.toBean(queryLogisticDetailResp, LogisticDetailRespVo.class);
+        }
+        throw new BusinessException("未找到合同");
+    }
+
 
 }

+ 5 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/dto/req/LogisticsScoreDetailQueryDto.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.dto.req;
 
+import com.sckw.core.web.page.BaseQuery;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
@@ -14,7 +15,7 @@ import java.util.List;
  */
 @Data
 public class
-LogisticsScoreDetailQueryDto {
+LogisticsScoreDetailQueryDto extends BaseQuery {
     /**
      * 评分id
      */
@@ -38,4 +39,7 @@ LogisticsScoreDetailQueryDto {
      */
     @Schema(hidden = true)
     private Integer status;
+
+    @Schema(hidden = true)
+    private Long providerEntId;
 }

+ 2 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/dto/req/LogisticsScoreQueryDto.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.dto.req;
 
+import com.sckw.core.web.page.BaseQuery;
 import lombok.Data;
 
 import java.util.List;
@@ -10,7 +11,7 @@ import java.util.List;
  * @Description: 物流评分查询参数
  */
 @Data
-public class LogisticsScoreQueryDto {
+public class LogisticsScoreQueryDto extends BaseQuery {
     /**
      * 供应商id
      */

+ 5 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractTrade.java

@@ -146,6 +146,11 @@ public class KwcContractTrade implements Serializable {
      */
     @TableField("unload_way")
     private Integer unloadWay;
+    /**
+     * 计量方式
+     */
+    @TableField("measurement_way")
+    private Integer measurementWay;
     /**
      * 销售人员id
      */

+ 5 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/TradeBaseInfoReqVo.java

@@ -120,5 +120,10 @@ public class TradeBaseInfoReqVo implements Serializable {
      */
     @NotBlank(message = "销售联系电话不能为空")
     private String salesmanPhone;
+    /**
+     * 计量方式
+     */
+    @Schema(description = "计量方式 1-地磅自动计算,2-司机填报")
+    private Integer measurementWay;
 
 }

+ 11 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/ContractDetailResp.java

@@ -205,6 +205,17 @@ public class ContractDetailResp implements Serializable {
          */
         @Schema(description = "销售联系电话")
         private String salesmanPhone;
+
+        /**
+         * 计量方式
+         */
+        @Schema(description = "计量方式 1-地磅自动计算,2-司机填报")
+        private Integer measurementWay;
+        /**
+         * 计量方式描述
+         */
+        @Schema(description = "计量方式描述")
+        private String measurementWayDesc;
     }
     @Data
     public static class TradeGoodsInfo implements Serializable{

+ 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;
     /**
      * 起始日期
      */

+ 5 - 4
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)
@@ -126,7 +127,7 @@ public class KwcContractLogisticsRepository extends ServiceImpl<KwcContractLogis
                 .eq(KwcContractLogistics::getDelFlag, 0));
     }
 
-    public List<KwcContractLogistics> queryBycontractIdList(List<Long> ids) {
+    public List<KwcContractLogistics> queryBycontractIdList(Set<Long> ids) {
         return list(Wrappers.<KwcContractLogistics>lambdaQuery()
                 .in(KwcContractLogistics::getId, ids)
                 .eq(KwcContractLogistics::getDispatchWay, 1)

+ 1 - 2
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsUnitRepository.java

@@ -87,10 +87,9 @@ public class KwcContractLogisticsUnitRepository extends ServiceImpl<KwcContractL
                 .last("limit 1"));
     }
 
-    public KwcContractLogisticsUnit queryByContractIdAndEntType(Long contractId, Long entId, Integer entType) {
+    public KwcContractLogisticsUnit queryByContractIdAndEntType(Long contractId, Integer entType) {
         return getOne(Wrappers.<KwcContractLogisticsUnit>lambdaQuery()
                 .eq(KwcContractLogisticsUnit::getContractId, contractId)
-                .eq(KwcContractLogisticsUnit::getEntId, entId)
                 .eq(KwcContractLogisticsUnit::getUnitType, entType)
                 .eq(KwcContractLogisticsUnit::getDelFlag,0)
                 .last("limit 1"));

+ 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)
+        );
+    }
 }

+ 4 - 7
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/IKwcContractLogisticsScoreService.java

@@ -4,9 +4,7 @@ import java.util.Map;
 
 import com.github.pagehelper.PageInfo;
 import com.sckw.contract.api.model.dto.req.LogisticsScoreDetailFeignDto;
-import com.sckw.contract.model.dto.req.LogisticsScoreApprovalDto;
-import com.sckw.contract.model.dto.req.LogisticsScoreDetailAddDto;
-import com.sckw.contract.model.dto.req.LogisticsScoreDetailQueryDto;
+import com.sckw.contract.model.dto.req.*;
 import com.sckw.contract.model.entity.KwcContractLogisticsScoreDetail;
 import com.sckw.contract.model.vo.req.LogisticListReq;
 import com.sckw.contract.model.vo.res.LogisticsScoreDetailResVo;
@@ -24,20 +22,19 @@ public interface IKwcContractLogisticsScoreService
 
     /**
      * 查询供应商企业对应的物流企业评分列表带待审核评分
-     * @param providerEntId 供应商企业id
+     * @param query 查询参数
      * @return 物流企业评分集合
      */
-    PageInfo<LogisticsScoreResVo> selectLogisticsScoreWithPendingSocreList(Long providerEntId);
+    PageInfo<LogisticsScoreResVo> selectLogisticsScoreWithPendingSocreList(LogisticsScoreQueryDto query);
 
 
     /**
      * 查询物流企业评分明细列表
      *
      * @param detailReqDto 物流企业评分明细
-     * @param providerEntId 供应商企业id
      * @return 物流企业评分明细集合
      */
-    PageInfo<LogisticsScoreDetailResVo> selectKwcContractLogisticsScoreDetailList(LogisticsScoreDetailQueryDto detailReqDto, Long providerEntId);
+    PageInfo<LogisticsScoreDetailResVo> selectKwcContractLogisticsScoreDetailList(LogisticsScoreDetailQueryDto detailReqDto);
 
 
     /**

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

@@ -5,6 +5,7 @@ import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import com.github.pagehelper.Page;
 import com.github.pagehelper.PageInfo;
@@ -34,12 +35,14 @@ import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.fleet.api.feign.DriverScoreFeignService;
+import com.sckw.fleet.api.model.dto.DriverScoreQuery;
 import com.sckw.fleet.api.model.dto.UpdateDriverScoreDto;
 import com.sckw.redis.constant.RedisConstant;
 import com.sckw.redis.utils.RedissonUtils;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
+import com.sckw.system.api.model.dto.res.UserResDto;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -81,11 +84,11 @@ public class KwcContractLogisticsScoreServiceImpl implements IKwcContractLogisti
      * @return 物流企业评分
      */
     @Override
-    public PageInfo<LogisticsScoreResVo> selectLogisticsScoreWithPendingSocreList(Long providerEntId)
+    public PageInfo<LogisticsScoreResVo> selectLogisticsScoreWithPendingSocreList(LogisticsScoreQueryDto query)
     {
         //查询评分列表
         PageInfo<LogisticsScoreResVo> pageInfo = new PageInfo<>(new ArrayList<>());
-        List<KwcContractLogisticsScore> logisticsScores = selectLogisticsScoreList(providerEntId, true);
+        List<KwcContractLogisticsScore> logisticsScores = selectLogisticsScoreList(query);
         List<Long> logisticsScoreIds = logisticsScores.stream().map(KwcContractLogisticsScore::getId).toList();
         if(CollectionUtils.isNotEmpty(logisticsScoreIds)){
             //查询待审评分
@@ -124,17 +127,16 @@ public class KwcContractLogisticsScoreServiceImpl implements IKwcContractLogisti
      * 查询物流企业评分明细列表
      *
      * @param detailReqDto 物流企业评分明细
-     * @param providerEntId 供应商企业id
      * @return 物流企业评分明细
      */
     @Override
-    public PageInfo<LogisticsScoreDetailResVo> selectKwcContractLogisticsScoreDetailList(LogisticsScoreDetailQueryDto detailReqDto, Long providerEntId)
+    public PageInfo<LogisticsScoreDetailResVo> selectKwcContractLogisticsScoreDetailList(LogisticsScoreDetailQueryDto detailReqDto)
     {
         //校验评分权限
-        KwcContractLogisticsScore logisticsScore = checkLogisticsScoreAuth(providerEntId, detailReqDto.getScoreId());
+        KwcContractLogisticsScore logisticsScore = checkLogisticsScoreAuth(detailReqDto.getProviderEntId(), detailReqDto.getScoreId());
         EntCacheResDto entCacheResDto = remoteSystemService.queryEntCacheById(logisticsScore.getLogisticsEntId());
         PageInfo<LogisticsScoreDetailResVo> pageInfo = new PageInfo<>(new ArrayList<>());
-        PageUtils.startPage();
+        PageUtils.startPage(detailReqDto);
         detailReqDto.setScoreIds(Collections.singletonList(detailReqDto.getScoreId()));
         List<KwcContractLogisticsScoreDetail> logisticsScoreDetails = kwcContractLogisticsScoreDetailMapper.selectKwcContractLogisticsScoreDetailList(detailReqDto);
         //根据影响人id列表查询影响人
@@ -196,12 +198,10 @@ public class KwcContractLogisticsScoreServiceImpl implements IKwcContractLogisti
      * isPage 是否是分页查询
      * @return 物流企业评分
      */
-    private List<KwcContractLogisticsScore> selectLogisticsScoreList(Long providerEntId, boolean isPage)
+    private List<KwcContractLogisticsScore> selectLogisticsScoreList(LogisticsScoreQueryDto query)
     {
-        LogisticsScoreQueryDto scoreReqDto = new LogisticsScoreQueryDto();
-        providerEntId = providerEntId !=null ? providerEntId : LoginUserHolder.getEntId();
-        //1.查询当前供应商企业有效的物流合同
-        List<KwcContractLogistics> logisticsContracts = kwcContractLogisticsRepository.queryValidByEntId(providerEntId);
+        //1.查询当前供应商企业有效的自动派车物流合同
+        List<KwcContractLogistics> logisticsContracts = kwcContractLogisticsRepository.queryValidByEntId(query.getProviderEntId());
         List<Long> contractIds = logisticsContracts.stream().map(KwcContractLogistics::getId).toList();
         if(CollectionUtils.isNotEmpty(contractIds)){
             //2.根据物流合同id列表和托运商类型查询物流企业列表并得到物流企业id列表
@@ -209,15 +209,12 @@ public class KwcContractLogisticsScoreServiceImpl implements IKwcContractLogisti
             List<Long> logisticsEntIds = logisticsUnits.stream().map(KwcContractLogisticsUnit::getEntId).toList();
             if(CollectionUtils.isNotEmpty(logisticsEntIds)){
                 //3.根据物流企业id列表和供应商企业id查询物流企业评分列表
-                scoreReqDto.setProviderEntId(providerEntId);
-                scoreReqDto.setLogisticsEntIds(logisticsEntIds);
-                if (isPage){
-                    PageUtils.startPage();
-                }
-                return kwcContractLogisticsScoreMapper.selectKwcContractLogisticsScoreList(scoreReqDto);
+                query.setLogisticsEntIds(logisticsEntIds);
+                PageUtils.startPage(query);
+                return kwcContractLogisticsScoreMapper.selectKwcContractLogisticsScoreList(query);
             }
         }
-        return Collections.emptyList();
+        return new Page<>(query.getPageNum(), query.getPageSize());
     }
 
 
@@ -260,7 +257,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);
                 //初始化物流企业评分明细
@@ -399,12 +396,20 @@ public class KwcContractLogisticsScoreServiceImpl implements IKwcContractLogisti
         //1、更新企业评分
         BigDecimal score = logisticsScore.getScore();
         //查询物流企业下所有的司机
-        HttpResult result = driverScoreFeignService.countDriver(detailDto.getLogisticsEntId());
-        if(result.getCode() == HttpStatus.SUCCESS_CODE  && (Integer)result.getData()>0){
-           Integer driverCount =(Integer)result.getData();
-                //企业变动评分
-            BigDecimal entScoreChange = detailDto.getScoreChange().divide(new BigDecimal(driverCount),2, RoundingMode.HALF_UP);
-            BigDecimal resultScore = score.add(entScoreChange);
+        HttpResult driverCountRes = driverScoreFeignService.countDriver(detailDto.getLogisticsEntId());
+        if(driverCountRes.getCode() == HttpStatus.SUCCESS_CODE  && (Integer)driverCountRes.getData()>0){
+            //查询物流企业下的所有司机的总分
+            HttpResult scoreCountRes = driverScoreFeignService.countDriverScore(new DriverScoreQuery(detailDto.getProviderEntId(),detailDto.getLogisticsEntId()));
+            if(scoreCountRes.getCode() != HttpStatus.SUCCESS_CODE){
+                log.error("查询物流企业下的所有司机的总分失败,响应信息如下:{}", JSON.toJSONString(scoreCountRes));
+                throw new BusinessException("系统修改评分失败,请稍后再试");
+            }
+            BigDecimal driverScoreCount = (BigDecimal)scoreCountRes.getData();
+            Integer driverCount =(Integer)driverCountRes.getData();
+            //计算物流企业最新评分
+            BigDecimal resultScore = driverScoreCount.divide(new BigDecimal(driverCount),2, RoundingMode.HALF_UP);
+            //企业变动评分
+            BigDecimal entScoreChange = resultScore.subtract(score);
             logisticsScore.setScore(resultScore);
             logisticsScore.setUpdateBy(LoginUserHolder.getUserId());
             logisticsScore.setUpdateTime(new Date());
@@ -412,8 +417,16 @@ public class KwcContractLogisticsScoreServiceImpl implements IKwcContractLogisti
             //2.插入评分明细记录
             LogisticsScoreDetailAddDto detailAddDto = new LogisticsScoreDetailAddDto();
             detailAddDto.setScoreId(logisticsScore.getId());
-            detailAddDto.setInfluenceBy(detailDto.getInfluenceBy());
-            detailAddDto.setAction(detailDto.getAction());
+            //根据影响人手机号查询影响人userId
+            UserResDto userResDto = remoteSystemService.queryUserByPhone(detailDto.getPhone());
+            if(userResDto != null){
+                detailAddDto.setInfluenceBy(userResDto.getId());
+            }
+            StringBuilder actionBuilder = new StringBuilder(detailDto.getAction());
+            if(detailDto.getScoreChange().compareTo(BigDecimal.ZERO)>0){
+                actionBuilder.append("+");
+            }
+            detailAddDto.setAction(actionBuilder.append(detailDto.getScoreChange()).append("分").toString());
             detailAddDto.setScoreChange(entScoreChange);
             detailAddDto.setScore(resultScore);
             //2.设置评分状态为通过

+ 318 - 99
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java

@@ -122,40 +122,56 @@ public class KwcContractTradeService {
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private GoodsInfoService goodsInfoService;
 
-    @DubboReference(version = "1.0.0", group = "design", check = false)
+    @DubboReference(version = "1.0.0", group = "design", check = false,timeout = 8000)
     private TradeOrderInfoService tradeOrderInfoService;
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     private TransportRemoteService transportRemoteService;
 
-    /**销售合同*/
+    /**
+     * 销售合同
+     */
     @Value(value = "${jumpUrl.saleSendContract}")
     private String saleSendContract;
 
-    /**采购合同*/
+    /**
+     * 采购合同
+     */
     @Value(value = "${jumpUrl.purchaseSendContract}")
     private String purchaseSendContract;
 
-    /**托运合同*/
+    /**
+     * 托运合同
+     */
     @Value(value = "${jumpUrl.consignmentSendContract}")
     private String consignmentSendContract;
 
-    /**承运合同*/
+    /**
+     * 承运合同
+     */
     @Value(value = "${jumpUrl.acceptanceSendContract}")
     private String acceptanceSendContract;
 
-    /**app销售合同*/
+    /**
+     * app销售合同
+     */
     @Value(value = "${jumpUrl.appSaleSendContract}")
     private String appSaleSendContract;
 
-    /**app采购合同*/
+    /**
+     * app采购合同
+     */
     @Value(value = "${jumpUrl.appPurchaseSendContract}")
     private String appPurchaseSendContract;
 
-    /**app托运合同*/
+    /**
+     * app托运合同
+     */
     @Value(value = "${jumpUrl.appConsignmentSendContract}")
     private String appConsignmentSendContract;
 
-    /**app承运合同*/
+    /**
+     * app承运合同
+     */
     @Value(value = "${jumpUrl.appAcceptanceSendContract}")
     private String appAcceptanceSendContract;
 
@@ -181,7 +197,12 @@ public class KwcContractTradeService {
 
         List<QueryListResVo> queryListResVoPageDataResult = queryTradeListByPage(queryTradeReq);
 
-        return PageHelperUtil.getPageResult(new PageInfo<>(queryListResVoPageDataResult), queryListResVoPageDataResult, reqVo.getPageSize());
+        long total = countQueryTradeListByPage(queryTradeReq);
+        PageInfo<QueryListResVo> pageInfo = new PageInfo<>(queryListResVoPageDataResult);
+        pageInfo.setTotal(total);
+        pageInfo.setPageNum(reqVo.getPageNum());
+        pageInfo.setPageSize(reqVo.getPageSize());
+        return PageHelperUtil.getPageResult(pageInfo);
     }
 
 
@@ -192,8 +213,8 @@ public class KwcContractTradeService {
      * @author: czh
      * @date: 2023/7/18
      */
-    private List<QueryListResVo> getQueryListResVos(List<QueryListResDto> queryListResDtos,Map<Long,
-            List<KwcContractTradeGoods>> contractIdGoodsIdKeyAndGoodsMap,Map<String, KwcContractTradeUnit> contractUnitTypeKeyAndUnitMap ) {
+    private List<QueryListResVo> getQueryListResVos(List<QueryListResDto> queryListResDtos, Map<Long,
+            List<KwcContractTradeGoods>> contractIdGoodsIdKeyAndGoodsMap, Map<String, KwcContractTradeUnit> contractUnitTypeKeyAndUnitMap) {
         Map<Long, UserCacheResDto> longUserCacheResDtoMap = new HashMap<>(8);
         List<Long> initiateByList = queryListResDtos.stream().map(QueryListResDto::getInitiateBy).toList();
         if (CollectionUtils.isNotEmpty(initiateByList)) {
@@ -210,9 +231,9 @@ public class KwcContractTradeService {
                 queryListResVo.setProvideEntName(queryListResDto.getUnitType().compareTo(EntTypeEnum.SUPPLIER.getCode()) == 0 ? queryListResDto.getEntName() : queryListResDto.getTargetEntName());
                 queryListResVo.setPurchaseEntName(queryListResDto.getUnitType().compareTo(EntTypeEnum.SUPPLIER.getCode()) == 0 ? queryListResDto.getTargetEntName() : queryListResDto.getEntName());
             }
-            if(Objects.equals(queryListResDto.getUnitType(),EntTypeEnum.SUPPLIER.getCode())){
+            if (Objects.equals(queryListResDto.getUnitType(), EntTypeEnum.SUPPLIER.getCode())) {
                 queryListResVo.setProvideEntId(String.valueOf(queryListResDto.getProvideEntId()));
-            }else if(Objects.equals(queryListResDto.getUnitType(),EntTypeEnum.PURCHASER.getCode())){
+            } else if (Objects.equals(queryListResDto.getUnitType(), EntTypeEnum.PURCHASER.getCode())) {
                 queryListResVo.setPurchaseEntId(String.valueOf(queryListResDto.getPurchaseEntId()));
             }
 
@@ -221,7 +242,7 @@ public class KwcContractTradeService {
                 queryListResVo.setInitiateName(userCacheResDto.getName());
                 queryListResVo.setInitiateEntName(Objects.isNull(userCacheResDto.getEntInfo()) ? "" : userCacheResDto.getEntInfo().getFirmName());
             }
-            if (MapUtils.isNotEmpty(contractUnitTypeKeyAndUnitMap)){
+            if (MapUtils.isNotEmpty(contractUnitTypeKeyAndUnitMap)) {
                 KwcContractTradeUnit kwcContractTradeUnit =
                         contractUnitTypeKeyAndUnitMap.getOrDefault(queryListResDto.getId() + "-" + EntTypeEnum.SUPPLIER.getCode()
                                 , new KwcContractTradeUnit());
@@ -244,9 +265,9 @@ public class KwcContractTradeService {
             queryListResVo.setAmount(queryListResDto.getAmount());
             queryListResVo.setPerformedAmount(queryListResDto.getPerformedAmount());
             BigDecimal performedAmountMoney = BigDecimal.ZERO;
-            if(MapUtils.isNotEmpty(contractIdGoodsIdKeyAndGoodsMap)) {
+            if (MapUtils.isNotEmpty(contractIdGoodsIdKeyAndGoodsMap)) {
                 List<KwcContractTradeGoods> contractTradeGoods = contractIdGoodsIdKeyAndGoodsMap.get(queryListResDto.getId());
-                if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(contractTradeGoods)){
+                if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(contractTradeGoods)) {
                     for (KwcContractTradeGoods goods : contractTradeGoods) {
                         BigDecimal performedAmount = goods.getPerformedAmount() != null ? goods.getPerformedAmount() : BigDecimal.ZERO;
                         BigDecimal price = goods.getPrice() != null ? goods.getPrice() : BigDecimal.ZERO;
@@ -254,11 +275,11 @@ public class KwcContractTradeService {
                     }
                 }
             }
-            queryListResVo.setPerformedAmountMoney( performedAmountMoney);
-            if(Objects.nonNull(queryListResVo.getEndTime())) {
+            queryListResVo.setPerformedAmountMoney(performedAmountMoney);
+            if (Objects.nonNull(queryListResVo.getEndTime())) {
                 queryListResVo.setEndTime(DateUtils.getStartOfDay(queryListResVo.getEndTime()));
                 String endDate = DateUtils.format(queryListResVo.getEndTime(), DateUtils.DATE_PATTERN);
-                if (org.apache.commons.lang3.StringUtils.equals(endDate,"9999-12-30")){
+                if (org.apache.commons.lang3.StringUtils.equals(endDate, "9999-12-30")) {
                     queryListResVo.setEndTime(null);
                 }
             }
@@ -287,9 +308,9 @@ public class KwcContractTradeService {
         kwcContractTrade.setId(contactId);
         EntCacheResDto entCacheResDto = remoteSystemService.queryEntTreeById(LoginUserHolder.getEntId());
         if (Objects.nonNull(entCacheResDto) && StringUtils.isNotBlank(entCacheResDto.getEntTypes())) {
-            if (org.apache.commons.lang3.StringUtils.equals(entCacheResDto.getEntTypes(), String.valueOf(EntTypeEnum.SUPPLIER.getCode()))){
+            if (org.apache.commons.lang3.StringUtils.equals(entCacheResDto.getEntTypes(), String.valueOf(EntTypeEnum.SUPPLIER.getCode()))) {
                 kwcContractTrade.setStatus(ContractStatusEnum.WAIT_APPROVE.getCode());
-            }else if (org.apache.commons.lang3.StringUtils.equals(entCacheResDto.getEntTypes(), String.valueOf(EntTypeEnum.PURCHASER.getCode()))){
+            } else if (org.apache.commons.lang3.StringUtils.equals(entCacheResDto.getEntTypes(), String.valueOf(EntTypeEnum.PURCHASER.getCode()))) {
                 kwcContractTrade.setStatus(ContractStatusEnum.SUBMIT.getCode());
             }
         }
@@ -300,7 +321,7 @@ public class KwcContractTradeService {
         }
 
         //保存交易合同商品信息
-        kwcContractTradeGoodsService.saveContractTradeGoods(contactId, goodsInfoList,baseInfo.getStartTime(),baseInfo.getEndTime());
+        kwcContractTradeGoodsService.saveContractTradeGoods(contactId, goodsInfoList, baseInfo.getStartTime(), baseInfo.getEndTime());
 
         //存单位信息
         kwcContractTradeUnitService.saveContractTradeUnit(contactId, baseInfo);
@@ -330,6 +351,10 @@ public class KwcContractTradeService {
             if (StringUtils.isNotBlank(baseInfo.getContractName()) && baseInfo.getContractName().length() > 20) {
                 throw new SystemException("合同名称超长!");
             }
+            //按卸货筽量时必选计量方式
+            if (Objects.equals(baseInfo.getUnloadWay(), Integer.parseInt(DictEnum.LOAD_UNLOAD_WAY_2.getValue())) && Objects.isNull(baseInfo.getMeasurementWay())) {
+                throw new SystemException("卸货方式为按卸货筽量时,计量方式不能为空!");
+            }
         }
 
         if (CollectionUtils.isNotEmpty(goodsInfo)) {
@@ -363,31 +388,21 @@ public class KwcContractTradeService {
 
     /**
      * 校验供应单位必须在贸易合同生效期内,且有包含该商品的自动派车的物流合同
+     *
      * @param baseInfo
      * @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());
@@ -429,7 +444,7 @@ public class KwcContractTradeService {
         kwcContractTrade.setStartTime(baseInfo.getStartTime());
         if (Objects.nonNull(baseInfo.getEndTime())) {
             kwcContractTrade.setEndTime(DateUtils.getEndOfDay(baseInfo.getEndTime()));
-        }else {
+        } else {
             LocalDate localDate = LocalDate.of(9999, 12, 30);
             Date date1 = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
             kwcContractTrade.setEndTime(DateUtils.getEndOfDay(date1));
@@ -460,6 +475,7 @@ public class KwcContractTradeService {
             }
         }
         kwcContractTrade.setAmount(amountTotal);
+        kwcContractTrade.setMeasurementWay(baseInfo.getMeasurementWay());
         return kwcContractTrade;
     }
 
@@ -724,12 +740,11 @@ public class KwcContractTradeService {
                     purchaseSendContract,
                     appPurchaseSendContract);
         } catch (Exception e) {
-           log.error("合同签约流程已发起消息出错:", e);
+            log.error("合同签约流程已发起消息出错:", e);
         }
     }
 
 
-
     /**
      * @param id 合同id
      * @desc: 更新合同为发起
@@ -764,6 +779,9 @@ public class KwcContractTradeService {
         EntTypeResDto entTypeResDto = remoteSystemService.queryEntTypeById(LoginUserHolder.getEntId());
 
         TradeBaseInfoReqVo baseInfo = reqVo.getBaseInfo();
+        if (Objects.equals(baseInfo.getUnloadWay(), Integer.parseInt(DictEnum.LOAD_UNLOAD_WAY_2.getValue())) && Objects.isNull(baseInfo.getMeasurementWay())) {
+            throw new BusinessException("卸货方式为按卸货筽量时,计量方式不能为空!");
+        }
         kwcContractTrade.setEntId(LoginUserHolder.getEntId());
         kwcContractTrade.setContractNo(baseInfo.getContractCode());
         kwcContractTrade.setName(baseInfo.getContractName());
@@ -793,15 +811,16 @@ public class KwcContractTradeService {
                 }
             }
         }
-        if (Objects.nonNull(entTypeResDto) && Objects.equals(entTypeResDto.getType(), EntTypeEnum.SUPPLIER.getCode())){
+        if (Objects.nonNull(entTypeResDto) && Objects.equals(entTypeResDto.getType(), EntTypeEnum.SUPPLIER.getCode())) {
             kwcContractTrade.setStatus(ContractStatusEnum.WAIT_APPROVE.getCode());
-        }else if (Objects.nonNull(entTypeResDto) && Objects.equals(entTypeResDto.getType(), EntTypeEnum.PURCHASER.getCode())){
+        } else if (Objects.nonNull(entTypeResDto) && Objects.equals(entTypeResDto.getType(), EntTypeEnum.PURCHASER.getCode())) {
             kwcContractTrade.setStatus(ContractStatusEnum.SUBMIT.getCode());
         }
         kwcContractTrade.setAmount(amountTotal);
         kwcContractTrade.setSigningUrl(reqVo.getContractFile());
         kwcContractTrade.setUpdateBy(LoginUserHolder.getUserId());
         kwcContractTrade.setUpdateTime(date);
+        kwcContractTrade.setMeasurementWay(baseInfo.getMeasurementWay());
         if (kwcContractTradeMapper.updateById(kwcContractTrade) <= 0) {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.UPDATE_FAIL);
         }
@@ -979,7 +998,7 @@ public class KwcContractTradeService {
         if (CollectionUtils.isEmpty(queryListResDtos)) {
             return Collections.emptyList();
         }
-        return getQueryListResVos(queryListResDtos,null,null);
+        return getQueryListResVos(queryListResDtos, null, null);
     }
 
 
@@ -1075,7 +1094,7 @@ public class KwcContractTradeService {
             authEntIdList.addAll(ids);
         }
 
-        List<QueryListResDto> queryListResDtos = kwcContractTradeMapper.queryTradeList(reqVo,authEntIdList);
+        List<QueryListResDto> queryListResDtos = kwcContractTradeMapper.queryTradeList(reqVo, authEntIdList);
         if (CollectionUtils.isEmpty(queryListResDtos)) {
             return PageHelperUtil.getPageResult(new PageInfo<>());
         }
@@ -1339,9 +1358,9 @@ public class KwcContractTradeService {
 
         EntCacheResDto entCacheResDto = remoteSystemService.queryEntTreeById(LoginUserHolder.getEntId());
         if (Objects.nonNull(entCacheResDto) && StringUtils.isNotBlank(entCacheResDto.getEntTypes())) {
-            if (org.apache.commons.lang3.StringUtils.equals(entCacheResDto.getEntTypes(), String.valueOf(EntTypeEnum.SUPPLIER.getCode()))){
+            if (org.apache.commons.lang3.StringUtils.equals(entCacheResDto.getEntTypes(), String.valueOf(EntTypeEnum.SUPPLIER.getCode()))) {
                 kwcContractTrade.setStatus(ContractStatusEnum.WAIT_APPROVE.getCode());
-            }else if (org.apache.commons.lang3.StringUtils.equals(entCacheResDto.getEntTypes(), String.valueOf(EntTypeEnum.PURCHASER.getCode()))){
+            } else if (org.apache.commons.lang3.StringUtils.equals(entCacheResDto.getEntTypes(), String.valueOf(EntTypeEnum.PURCHASER.getCode()))) {
                 kwcContractTrade.setStatus(ContractStatusEnum.SUBMIT.getCode());
             }
         }
@@ -1573,6 +1592,8 @@ public class KwcContractTradeService {
                 String.valueOf(kwcContractTrade.getUnloadWay())));
         tradeBaseInfo.setSalesmanId(kwcContractTrade.getSalesmanId());
         tradeBaseInfo.setSalesmanPhone(kwcContractTrade.getSalesmanPhone());
+        tradeBaseInfo.setMeasurementWay(Objects.equals(kwcContractTrade.getMeasurementWay(), -1) ? null : kwcContractTrade.getMeasurementWay());
+        tradeBaseInfo.setMeasurementWayDesc(Objects.equals(kwcContractTrade.getMeasurementWay(), -1) ? "" : DictEnum.getLabel(String.valueOf(kwcContractTrade.getMeasurementWay())));
         tradeBaseInfo.setDispatchWay(kwcContractTrade.getDispatchWay());
         tradeBaseInfo.setDispatchWayDesc(Optional.ofNullable(kwcContractTrade.getDispatchWay()).map(DispatchWayEnums::getDesc).orElse(""));
         return tradeBaseInfo;
@@ -1586,7 +1607,7 @@ public class KwcContractTradeService {
         } else {
             entId = LoginUserHolder.getEntId();
         }
-       // Integer type = null;
+        // Integer type = null;
         Set<Long> entIds = Sets.newHashSet();
         entIds.add(entId);
         if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getPurchaseEntId())) {
@@ -1740,7 +1761,122 @@ 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());
+    }
+
+    private long countQueryTradeListByPage(QueryTradeReq req) {
+        Long entId;
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getEntId())) {
+            entId = Long.valueOf(req.getEntId());
+        } else {
+            entId = LoginUserHolder.getEntId();
+        }
+        Set<Long> entIds = Sets.newHashSet();
+        entIds.add(entId);
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getPurchaseEntId())) {
+            entIds.add(Long.valueOf(req.getPurchaseEntId()));
+        }
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getSupplyEntId())) {
+            entIds.add(Long.valueOf(req.getSupplyEntId()));
+        }
+        Set<Long> contractIds = null;
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(entIds)) {
+            List<KwcContractTradeUnit> units = kwcContractTradeUnitRepository.queryByEntIds(entIds);
+            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(units)) {
+                Set<Long> contractIdList = units.stream().filter(x -> Objects.equals(x.getEntId(), entId))
+                        .map(KwcContractTradeUnit::getContractId)
+                        .collect(Collectors.toSet());
+                contractIds = units.stream()
+                        .map(KwcContractTradeUnit::getContractId)
+                        .filter(contractIdList::contains)
+                        .collect(Collectors.toSet());
+            }
+        }
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(contractIds)) {
+            return 0L;
+        }
+        // 不分页,获取完整数据用于计算总数
+        List<KwcContractTrade> records = kwcContractTradeRepository.queryTradeListByPageList(
+                req.getContractCode(),
+                req.getContractName(),
+                req.getSupplementCode(),
+                contractIds, req.getStatus(), req.getDispatchWay(), 0, 0);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(records)) {
+            return 0L;
+        }
+        entIds.addAll(records.stream().map(KwcContractTrade::getEntId).collect(Collectors.toSet()));
+        List<EntTypeResDto> ents = remoteSystemService.queryEntTypeByIds(entIds);
+        Map<Long, EntTypeResDto> entIdAndEntMap = Maps.newHashMap();
+        if (CollectionUtils.isNotEmpty(ents)) {
+            entIdAndEntMap =
+                    ents.stream().collect(Collectors.toMap(EntTypeResDto::getEntId, Function.identity(), (v1, v2) -> v1));
+        }
+        EntTypeResDto entTypeResDto = entIdAndEntMap.getOrDefault(entId, new EntTypeResDto());
+        List<KwcContractTrade> contractTrades = Lists.newArrayList();
+        List<KwcContractTrade> contractTrades1 = Lists.newArrayList();
+        if (entTypeResDto.getType().equals(EntTypeEnum.PURCHASER.getCode())) {
+            List<Integer> statusList = Arrays.asList(ContractStatusEnum.SIGNED.getCode(), ContractStatusEnum.COMPLETE.getCode());
+            Map<Long, EntTypeResDto> finalEntIdAndEntMap1 = entIdAndEntMap;
+
+            records.forEach(record -> {
+                EntTypeResDto orDefault = finalEntIdAndEntMap1.getOrDefault(record.getEntId(), new EntTypeResDto());
+                if (Objects.equals(orDefault.getType(), EntTypeEnum.SUPPLIER.getCode()) && statusList.contains(record.getStatus())) {
+                    contractTrades.add(record);
+                } else if (Objects.equals(orDefault.getType(), EntTypeEnum.PURCHASER.getCode())) {
+                    contractTrades1.add(record);
+                }
+            });
+        }
+        if (entTypeResDto.getType().equals(EntTypeEnum.SUPPLIER.getCode())) {
+            Map<Long, EntTypeResDto> finalEntIdAndEntMap = entIdAndEntMap;
+            records.forEach(record -> {
+                EntTypeResDto orDefault = finalEntIdAndEntMap.getOrDefault(record.getEntId(), new EntTypeResDto());
+                if (Objects.equals(orDefault.getType(), EntTypeEnum.PURCHASER.getCode()) && !Objects.equals(record.getStatus(), ContractStatusEnum.CANNEL.getCode())) {
+                    contractTrades.add(record);
+                } else if (Objects.equals(orDefault.getType(), EntTypeEnum.SUPPLIER.getCode())) {
+                    contractTrades1.add(record);
+                }
+            });
+        }
+        contractTrades.addAll(contractTrades1);
+        records = contractTrades;
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(records)) {
+            return 0L;
+        }
+
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getPurchaseEntId())
+                || org.apache.commons.lang3.StringUtils.isNotBlank(req.getSupplyEntId())) {
+            Set<Long> tradeContractIds = records.stream().map(KwcContractTrade::getId).collect(Collectors.toSet());
+            List<KwcContractTradeUnit> tradeUnits = kwcContractTradeUnitRepository.queryByContractIds(tradeContractIds);
+            Map<String, KwcContractTradeUnit> contractUnitTypeKeyAndUnitMap = Maps.newHashMap();
+            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tradeUnits)) {
+                contractUnitTypeKeyAndUnitMap = tradeUnits.stream()
+                        .peek(x -> x.setContractIdUniTypeKey(x.getContractId() + "-" + x.getUnitType()))
+                        .collect(Collectors.toMap(KwcContractTradeUnit::getContractIdUniTypeKey, Function.identity(), (v1
+                                , v2) -> v1));
+            }
+            Map<String, KwcContractTradeUnit> finalContractUnitTypeKeyAndUnitMap = contractUnitTypeKeyAndUnitMap;
+            if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getPurchaseEntId())) {
+                records = records.stream().filter(record -> {
+                    KwcContractTradeUnit purchaseEnt =
+                            finalContractUnitTypeKeyAndUnitMap.getOrDefault(record.getId() + "-" + CooperateTypeEnum.PURCHASER.getCode(),
+                                    new KwcContractTradeUnit());
+                    return org.apache.commons.lang3.StringUtils.equals(String.valueOf(purchaseEnt.getEntId()), req.getPurchaseEntId());
+                }).collect(Collectors.toList());
+            }
+            if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getSupplyEntId())) {
+                records = records.stream().filter(record -> {
+                    KwcContractTradeUnit provideEnt =
+                            finalContractUnitTypeKeyAndUnitMap.getOrDefault(record.getId() + "-" + CooperateTypeEnum.SUPPLIER.getCode(),
+                                    new KwcContractTradeUnit());
+                    return org.apache.commons.lang3.StringUtils.equals(String.valueOf(provideEnt.getEntId()), req.getSupplyEntId());
+                }).collect(Collectors.toList());
+            }
+        }
+        return records.size();
     }
 
     @NotNull
@@ -1820,7 +1956,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")) {
@@ -1875,7 +2012,7 @@ public class KwcContractTradeService {
         Date date = new Date();
         logistics = logistics.stream()
                 .peek(log -> {
-                    if (Objects.isNull(log.getEndTime())){
+                    if (Objects.isNull(log.getEndTime())) {
                         LocalDate localDate = LocalDate.of(9999, 12, 30);
                         Date date1 = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
                         log.setEndTime(date1);
@@ -1940,21 +2077,21 @@ public class KwcContractTradeService {
         //查询贸易合同企业信息
         List<KwcContractTradeUnit> tradeUnits = kwcContractTradeUnitRepository.queryByEntIdAndUnitType(contractTradeOrderDto.getEntId(),
                 contractTradeOrderDto.getEntType());
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(tradeUnits)){
-            return  List.of();
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(tradeUnits)) {
+            return List.of();
         }
         Set<Long> contractIds =
                 tradeUnits.stream().map(KwcContractTradeUnit::getContractId).collect(Collectors.toSet());
 
         List<KwcContractTradeUnit> tradeUnits1 = kwcContractTradeUnitRepository.queryByContractIds(contractIds);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(tradeUnits1)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(tradeUnits1)) {
             return List.of();
         }
         Map<String, KwcContractTradeUnit> conTractTradeUnitMap =
                 tradeUnits1.stream().collect(Collectors.toMap(x -> x.getContractId() +
                                 "_" + x.getUnitType(), Function.identity(),
                         (x, y) -> x));
-        contractIds= tradeUnits1.stream()
+        contractIds = tradeUnits1.stream()
                 .filter(x -> Objects.equals(x.getEntId(), LoginUserHolder.getEntId()) && Objects.equals(x.getUnitType(),
                         2))
                 .map(KwcContractTradeUnit::getContractId)
@@ -1966,7 +2103,7 @@ public class KwcContractTradeService {
             return Collections.emptyList();
         }
         Map<Long, KwcContractTradeGoods> contractGoodsMap = kwcContractGoods.stream()
-                .collect(Collectors.toMap(KwcContractTradeGoods::getContractId,Function.identity(),(x,y)->x));
+                .collect(Collectors.toMap(KwcContractTradeGoods::getContractId, Function.identity(), (x, y) -> x));
         //只查询已签约的
         Set<Long> contractIdList = kwcContractGoods.stream()
                 .filter(x -> Objects.equals(x.getStatus(), ContractStatusEnum.SIGNED.getCode()))
@@ -1978,15 +2115,15 @@ public class KwcContractTradeService {
             return Collections.emptyList();
         }
         kwcContractTrades = kwcContractTrades.stream()
-                .filter(x-> Objects.equals(x.getStatus(), ContractStatusEnum.SIGNED.getCode()))
+                .filter(x -> Objects.equals(x.getStatus(), ContractStatusEnum.SIGNED.getCode()))
                 .collect(Collectors.toList());
         return kwcContractTrades.stream()
-                .map(x-> getContractTradeOrderInfo(x, conTractTradeUnitMap,contractTradeOrderDto.getEntType(),contractGoodsMap))
+                .map(x -> getContractTradeOrderInfo(x, conTractTradeUnitMap, contractTradeOrderDto.getEntType(), contractGoodsMap))
                 .collect(Collectors.toList());
     }
 
     private static void checkParam(Long contractTradeOrderDto, Long contractTradeOrderDto1, Integer contractTradeOrderDto2) {
-        if (Objects.isNull(contractTradeOrderDto) && Objects.equals(contractTradeOrderDto2,1)) {
+        if (Objects.isNull(contractTradeOrderDto) && Objects.equals(contractTradeOrderDto2, 1)) {
             throw new BusinessException("商品id不能为空!");
         }
         if (Objects.isNull(contractTradeOrderDto1)) {
@@ -1999,7 +2136,7 @@ public class KwcContractTradeService {
 
     @NotNull
     private static ContractTradeOrderInfo getContractTradeOrderInfo(KwcContractTrade c, Map<String,
-            KwcContractTradeUnit> conTractTradeUnitMap,Integer entType, Map<Long, KwcContractTradeGoods> contractGoodsMap) {
+            KwcContractTradeUnit> conTractTradeUnitMap, Integer entType, Map<Long, KwcContractTradeGoods> contractGoodsMap) {
         ContractTradeOrderInfo contractTradeOrderInfo = new ContractTradeOrderInfo();
         contractTradeOrderInfo.setId(c.getId());
         KwcContractTradeUnit unit = conTractTradeUnitMap.getOrDefault(c.getId() + "_" + entType,
@@ -2031,7 +2168,7 @@ public class KwcContractTradeService {
         contractTradeOrderInfo.setSalesmanId(c.getSalesmanId());
         contractTradeOrderInfo.setSalesmanPhone(c.getSalesmanPhone());
         KwcContractTradeGoods kwcContractTradeGoods = contractGoodsMap.getOrDefault(c.getId(), new KwcContractTradeGoods());
-        contractTradeOrderInfo.setSignPrice(Objects.nonNull(kwcContractTradeGoods.getPrice())?kwcContractTradeGoods.getPrice():new BigDecimal("-1"));
+        contractTradeOrderInfo.setSignPrice(Objects.nonNull(kwcContractTradeGoods.getPrice()) ? kwcContractTradeGoods.getPrice() : new BigDecimal("-1"));
         contractTradeOrderInfo.setAmount(Objects.isNull(kwcContractTradeGoods.getAmount()) ? new BigDecimal("-1") : kwcContractTradeGoods.getAmount());
         return contractTradeOrderInfo;
     }
@@ -2050,17 +2187,17 @@ public class KwcContractTradeService {
         } else {
             entId = LoginUserHolder.getEntId();
         }
-       // Integer type =null;
+        // Integer type =null;
         Set<Long> entIds = Sets.newHashSet();
         entIds.add(entId);
         if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getPurchaseEntId())) {
             //查询企业 信息
             entIds.add(Long.valueOf(req.getPurchaseEntId()));
-           // type=CooperateTypeEnum.PURCHASER.getCode();
+            // type=CooperateTypeEnum.PURCHASER.getCode();
         }
         if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getSupplyEntId())) {
             entIds.add(Long.valueOf(req.getSupplyEntId()));
-           // type=CooperateTypeEnum.SUPPLIER.getCode();
+            // type=CooperateTypeEnum.SUPPLIER.getCode();
         }
         Set<Long> contractIds = null;
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(entIds)) {
@@ -2178,12 +2315,13 @@ public class KwcContractTradeService {
 
     /**
      * 查询同产品和同托运企业是否存在自动派车合同
-     * @param entId 托运企业
+     *
+     * @param entId    托运企业
      * @param goodsIds 商品id集合
      * @return
      */
     public List<LogisticsEntDtoVO> queryAutoContractLogOrder(Long entId, List<Long> goodsIds) {
-        log.info("查询满足贸易合合同供应企业和商品的自动派车的物流合同,企业id:{}, 商品id:{}",entId, JSON.toJSONString(goodsIds));
+        log.info("查询满足贸易合合同供应企业和商品的自动派车的物流合同,企业id:{}, 商品id:{}", entId, JSON.toJSONString(goodsIds));
         if (Objects.isNull(entId)) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "供应商企业id不能为空!");
         }
@@ -2191,44 +2329,73 @@ 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);
     }
 
     /**
      * 参数转换
+     *
      * @param contractLogisticsList
      * @return
      */
@@ -2237,6 +2404,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());
@@ -2259,12 +2429,13 @@ public class KwcContractTradeService {
 
     /**
      * 查询同产品和同托运企业是否存在手动派车合同
-     * @param entId 托运企业
+     *
+     * @param entId   托运企业
      * @param goodsId 商品id集合
      * @return
      */
     public List<LogisticsEntDtoVO> queryContractLogOrder(Long entId, Long goodsId) {
-        log.info("查询满足贸易合合同供应企业和商品的手动派车的物流合同,企业id:{}, 商品id:{}",entId, goodsId);
+        log.info("查询满足贸易合合同供应企业和商品的手动派车的物流合同,企业id:{}, 商品id:{}", entId, goodsId);
         if (Objects.isNull(entId)) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "供应商企业id不能为空!");
         }
@@ -2272,30 +2443,76 @@ public class KwcContractTradeService {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "商品id不能为空!");
         }
 
-        //查询供应商企业物流合同信息
+        //1. 查询供应商企业物流合同信息
         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.queryByLogIdsAndGoodsId(unitContractIds, goodsId);
-        if (CollectionUtils.isEmpty(contractLogisticsGoods)) {
+        //2. 查询手动派车物流合同信息
+        List<KwcContractLogistics> contractLogisticsList = contractLogisticsRepository.queryBycontractIdList(unitContractIds);
+        if (CollectionUtils.isEmpty(contractLogisticsList)) {
             return Collections.emptyList();
         }
-        List<Long> goodContractIds = contractLogisticsGoods.stream().map(KwcContractLogisticsGoods::getContractId).distinct().collect(Collectors.toList());
 
-        //查询自动派车物流合同
-        List<KwcContractLogistics> contractLogisticsList = contractLogisticsRepository.queryBycontractIdList(goodContractIds);
-        return toLogisticsEntDtoVO(entId, contractLogisticsList);
+        // 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());
+            }
+        }
+
+        // 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 = currentGoodsIds.contains(goodsId);
+                    if (isContains) {
+                        validContractIds.add(contractId);
+                    }
+                }
+            }
+        }
+        if (CollectionUtils.isEmpty(validContractIds)) {
+            return Collections.emptyList();
+        }
+        //过滤满足商品数据
+        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);
     }
 
 
     /**
      * 根据合同id和商品id查询物流合同商品信息
+     *
      * @param contractId 物流合同
-     * @param goodsId 商品id
+     * @param goodsId    商品id
      * @return
      */
     public LogisticsGoodsDto queryLogGoodsByContractId(Long contractId, Long goodsId) {
@@ -2308,7 +2525,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());
@@ -2318,7 +2535,6 @@ public class KwcContractTradeService {
     }
 
 
-
     //查询物流合同物流企业信息
     public TradeContractUnitDto queryEntByContractId(Long contractId) {
         KwcContractLogisticsUnit unit = kwcContractLogisticsUnitRepository.queryByLogContractIdUnit(contractId);
@@ -2345,5 +2561,8 @@ public class KwcContractTradeService {
         return logisticsScore;
     }
 
+    public Long querySign(Long entId, Integer type) {
+        return kwcContractTradeMapper.selectSignCount(entId, type);
+    }
 }
 

+ 51 - 0
sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractLogisticsMapper.xml

@@ -188,4 +188,55 @@
         and c.ent_id =#{consignId}
         and a.contract_no=#{contractNo}
     </select>
+
+    <select id="count" resultType="java.lang.Long">
+        SELECT count(1)
+        FROM kwc_contract_logistics a
+                 LEFT JOIN kwc_contract_logistics_unit b ON a.id = b.contract_id and b.del_flag = 0 and b.unit_type = 3
+        <where>
+            a.del_flag = 0
+              and a.status = 1
+            and a.ent_id != #{entId}
+            <if test="ids != null and ids.size() != 0">
+                and a.ent_id in
+                <foreach collection="ids" open="(" close=")" separator="," item="item">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+    </select>
+
+    <select id="logisticsList" resultType="com.sckw.contract.api.model.vo.ContractVo">
+        SELECT d.firm_name, a.name, a.status, a.create_time, a.amount
+        FROM kwc_contract_logistics a
+                 LEFT JOIN kwc_contract_logistics_unit b ON a.id = b.contract_id and b.del_flag = 0 and b.unit_type = 3
+                 LEFT JOIN kwc_contract_logistics_unit d ON a.id = d.contract_id and d.del_flag = 0 and d.unit_type = 4
+        <where>
+            a.del_flag = 0
+              and a.status = 1
+              and a.ent_id != #{entId}
+            <if test="ids != null and ids.size() != 0">
+                and a.ent_id in
+                <foreach collection="ids" open="(" close=")" separator="," item="item">
+                    #{item}
+                </foreach>
+            </if>
+            order by a.create_time desc
+            <if test="all != null and all">
+                limit 10
+            </if>
+        </where>
+    </select>
+
+    <select id="selectSignCount" resultType="java.lang.Long">
+        SELECT count(distinct a.id)
+        FROM kwc_contract_logistics a
+                 LEFT JOIN kwc_contract_logistics_unit b ON a.id = b.contract_id and b.del_flag = 0 and b.unit_type = 3
+                 LEFT JOIN kwc_contract_logistics_unit d ON a.id = d.contract_id and d.del_flag = 0 and d.unit_type = 4
+        <where>
+            a.del_flag = 0
+              and a.status = 1
+              and (d.ent_id = #{entId} or b.ent_id = #{entId})
+        </where>
+    </select>
 </mapper>

+ 201 - 136
sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractTradeMapper.xml

@@ -3,55 +3,54 @@
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.sckw.contract.dao.KwcContractTradeMapper">
-
     <select id="queryList" resultType="com.sckw.contract.model.dto.res.QueryListResDto">
         select a.amount,
                a.trading,
-               a.name contractName,
+               a.name             contractName,
                a.contract_no,
-               a.create_by initiateBy,
-               a.create_time initiateTime,
+               a.create_by        initiateBy,
+               a.create_time      initiateTime,
                a.create_time,
                a.start_time,
                a.end_time,
                a.id,
                a.remark,
                a.signing_way,
-               a.create_time signTime,
+               a.create_time      signTime,
                a.status,
                b.unit_type,
                b.ent_id,
-               b.firm_name entName,
-               b.ent_id targetEntId,
-               b.firm_name targetEntName,
-               a.contract_pid contractPid,
+               b.firm_name        entName,
+               b.ent_id           targetEntId,
+               b.firm_name        targetEntName,
+               a.contract_pid     contractPid,
                a.performed_amount performedAmount,
-               f.name contractPname,
-               a.unload_way   unloadWay,
-               a.signing_way signingWay
-          from kwc_contract_trade a
-          left join kwc_contract_trade_unit b
-            on a.id = b.contract_id
-<!--           and b.unit_type = #{entType}-->
-<!--           and case when a.status != 3 then b.ent_id in-->
-<!--                <foreach collection="allEnt" separator="," open="(" close=")" item="item">-->
-<!--                    #{item}-->
-<!--                </foreach>-->
-<!--               else 1=1-->
-<!--                end-->
-           and b.del_flag = 0
-<!--          left join kwc_contract_trade_track c on a.id = c.contract_id and c.del_flag = 0 -->
-<!--          left join kwc_contract_trade_track d on a.id = d.contract_id and d.del_flag = 0 -->
-<!--          left join kwc_contract_trade_unit e on a.id = e.contract_id and e.unit_type != #{entType} and e.del_flag = 0-->
-          left join kwc_contract_trade f on f.id = a.contract_pid
-         where a.del_flag = 0
-<!--           and case when a.status = 3 then a.ent_id = #{entId} and #{entType} = 1-->
-<!--                else (b.ent_id in-->
-<!--                        <foreach collection="allEnt" separator="," open="(" close=")" item="item">-->
-<!--                            #{item}-->
-<!--                        </foreach>-->
-<!--                        and b.id is not null)-->
-<!--                end-->
+               f.name             contractPname,
+               a.unload_way       unloadWay,
+               a.signing_way      signingWay
+        from kwc_contract_trade a
+            left join kwc_contract_trade_unit b
+        on a.id = b.contract_id
+        <!--           and b.unit_type = #{entType}-->
+        <!--           and case when a.status != 3 then b.ent_id in-->
+        <!--                <foreach collection="allEnt" separator="," open="(" close=")" item="item">-->
+        <!--                    #{item}-->
+        <!--                </foreach>-->
+        <!--               else 1=1-->
+        <!--                end-->
+        and b.del_flag = 0
+        <!--          left join kwc_contract_trade_track c on a.id = c.contract_id and c.del_flag = 0 -->
+        <!--          left join kwc_contract_trade_track d on a.id = d.contract_id and d.del_flag = 0 -->
+        <!--          left join kwc_contract_trade_unit e on a.id = e.contract_id and e.unit_type != #{entType} and e.del_flag = 0-->
+        left join kwc_contract_trade f on f.id = a.contract_pid
+        where a.del_flag = 0
+        <!--           and case when a.status = 3 then a.ent_id = #{entId} and #{entType} = 1-->
+        <!--                else (b.ent_id in-->
+        <!--                        <foreach collection="allEnt" separator="," open="(" close=")" item="item">-->
+        <!--                            #{item}-->
+        <!--                        </foreach>-->
+        <!--                        and b.id is not null)-->
+        <!--                end-->
         <if test="startTime != null">
             and a.create_time >= #{startTime}
         </if>
@@ -61,26 +60,26 @@
         <if test="status != null">
             and a.status = #{status}
         </if>
-<!--        <if test="keywords != null and keywords != ''">-->
-<!--            and (b.firm_name like concat('%', #{keywords}, '%') or-->
-<!--                 e.firm_name like concat('%', #{keywords}, '%') or-->
-<!--                 b.phone like concat('%', #{keywords}, '%') or-->
-<!--                 b.sign_phone like concat('%', #{keywords}, '%') or-->
-<!--                 a.contract_no like concat('%', #{keywords}, '%') or-->
-<!--                 a.name like concat('%', #{keywords}, '%')-->
-<!--                 <if test="initiateList != null and initiateList.size() > 0">-->
-<!--                     or a.create_by in-->
-<!--                     <foreach collection="initiateList" item="item" open="(" close=")" separator=",">-->
-<!--                         #{item}-->
-<!--                     </foreach>-->
-<!--                 </if> )-->
-<!--        </if>-->
-<!--        <if test="idList != null and idList.size() > 0">-->
-<!--            and a.id in-->
-<!--            <foreach collection="idList" open="(" close=")" separator="," item="item">-->
-<!--                #{item}-->
-<!--            </foreach>-->
-<!--        </if>-->
+        <!--        <if test="keywords != null and keywords != ''">-->
+        <!--            and (b.firm_name like concat('%', #{keywords}, '%') or-->
+        <!--                 e.firm_name like concat('%', #{keywords}, '%') or-->
+        <!--                 b.phone like concat('%', #{keywords}, '%') or-->
+        <!--                 b.sign_phone like concat('%', #{keywords}, '%') or-->
+        <!--                 a.contract_no like concat('%', #{keywords}, '%') or-->
+        <!--                 a.name like concat('%', #{keywords}, '%')-->
+        <!--                 <if test="initiateList != null and initiateList.size() > 0">-->
+        <!--                     or a.create_by in-->
+        <!--                     <foreach collection="initiateList" item="item" open="(" close=")" separator=",">-->
+        <!--                         #{item}-->
+        <!--                     </foreach>-->
+        <!--                 </if> )-->
+        <!--        </if>-->
+        <!--        <if test="idList != null and idList.size() > 0">-->
+        <!--            and a.id in-->
+        <!--            <foreach collection="idList" open="(" close=")" separator="," item="item">-->
+        <!--                #{item}-->
+        <!--            </foreach>-->
+        <!--        </if>-->
         <if test="trading != null">
             and a.trading = #{trading}
         </if>
@@ -91,18 +90,18 @@
             and b.ent_id = #{targetEntId}
         </if>
         <if test="contractCode != null  and '' != contractCode">
-            and a.contract_no like concat('%',#{contractCode},'%')
+            and a.contract_no like concat('%', #{contractCode}, '%')
         </if>
         <if test="contractName != null  and '' != contractName">
-            and a.name  like concat('%',#{contractName},'%')
+            and a.name like concat('%', #{contractName}, '%')
         </if>
         <if test="supplementCode != null  and '' != supplementCode">
             and f.contract_pid != null
-            and f.contract_no  like concat('%',#{supplementCode},'%')
+            and f.contract_no like concat('%', #{supplementCode}, '%')
         </if>
         <if test="purchaseEntId != null  and '' != purchaseEntId">
             and b.unit_type = 2
-            and b.id  = #{purchaseEntId}
+            and b.id = #{purchaseEntId}
         </if>
         <if test="supplyEntId != null  and '' != supplyEntId">
             and b.unit_type = 1
@@ -114,59 +113,59 @@
     <select id="queryContractValidCount" resultType="com.sckw.contract.model.dto.res.QueryContractValidCountResDto">
         SELECT b.unit_type,
                count(1) cnt
-          FROM kwc_contract_trade a
-          left join kwc_contract_trade_unit b on a.id = b.contract_id
-         where a.`status` != 3
-           <if test="list != null and list.size() > 0">
-               and b.ent_id in
-               <foreach collection="list" separator="," open="(" close=")" item="item">
-                   #{item}
-               </foreach>
-           </if>
-         GROUP BY b.unit_type
-         union all
+        FROM kwc_contract_trade a
+                 left join kwc_contract_trade_unit b on a.id = b.contract_id
+        where a.`status` != 3
+        <if test="list != null and list.size() > 0">
+            and b.ent_id in
+            <foreach collection="list" separator="," open="(" close=")" item="item">
+                #{item}
+            </foreach>
+        </if>
+        GROUP BY b.unit_type
+        union all
         SELECT b.unit_type,
                count(1)
-          FROM kwc_contract_logistics a
-          left join kwc_contract_logistics_unit b on a.id = b.contract_id
-         where a.`status` != 3
+        FROM kwc_contract_logistics a
+                 left join kwc_contract_logistics_unit b on a.id = b.contract_id
+        where a.`status` != 3
         <if test="list != null and list.size() > 0">
             and b.ent_id in
             <foreach collection="list" separator="," open="(" close=")" item="item">
                 #{item}
             </foreach>
         </if>
-         GROUP BY b.unit_type
+        GROUP BY b.unit_type
     </select>
 
     <select id="queryTradeList" resultType="com.sckw.contract.model.dto.res.QueryListResDto">
-         select a.amount,
-                a.trading,
-                a.name contractName,
-                a.contract_no,
-                c.create_by initiateBy,
-                c.create_time initiateTime,
-                a.create_time,
-                a.start_time,
-                a.end_time,
-                a.id,
-                a.remark,
-                a.signing_way,
-                d.create_time signTime,
-                a.status,
-                b.ent_id provideEntId,
-                b.firm_name provideEntName,
-                e.ent_id purchaseEntId,
-                e.firm_name purchaseEntName,
-                a.contract_pid contractPid,
-                a.performed_amount performedAmount,
-                f.name contractPname
+        select a.amount,
+               a.trading,
+               a.name             contractName,
+               a.contract_no,
+               c.create_by        initiateBy,
+               c.create_time      initiateTime,
+               a.create_time,
+               a.start_time,
+               a.end_time,
+               a.id,
+               a.remark,
+               a.signing_way,
+               d.create_time      signTime,
+               a.status,
+               b.ent_id           provideEntId,
+               b.firm_name        provideEntName,
+               e.ent_id           purchaseEntId,
+               e.firm_name        purchaseEntName,
+               a.contract_pid     contractPid,
+               a.performed_amount performedAmount,
+               f.name             contractPname
         from kwc_contract_trade a
-        left join kwc_contract_trade_unit b on a.id = b.contract_id and b.del_flag = 0 and b.unit_type = 1
-        left join kwc_contract_trade_unit e on a.id = e.contract_id and e.del_flag = 0 and e.unit_type = 2
-        left join kwc_contract_trade_track c on a.id = c.contract_id and c.del_flag = 0 and c.type = 1
-        left join kwc_contract_trade_track d on a.id = d.contract_id and d.del_flag = 0 and d.type = 0
-        left join kwc_contract_trade f on a.contract_pid = f.id
+                 left join kwc_contract_trade_unit b on a.id = b.contract_id and b.del_flag = 0 and b.unit_type = 1
+                 left join kwc_contract_trade_unit e on a.id = e.contract_id and e.del_flag = 0 and e.unit_type = 2
+                 left join kwc_contract_trade_track c on a.id = c.contract_id and c.del_flag = 0 and c.type = 1
+                 left join kwc_contract_trade_track d on a.id = d.contract_id and d.del_flag = 0 and d.type = 0
+                 left join kwc_contract_trade f on a.contract_pid = f.id
         where a.del_flag = 0
           and a.status != 3
         <if test="authEntIdList != null and authEntIdList.size() != 0">
@@ -209,36 +208,36 @@
 
     <select id="queryList1" resultType="com.sckw.contract.model.dto.res.QueryListResDto">
         select a.amount,
-        a.trading,
-        a.name contractName,
-        a.contract_no,
-        a.create_by initiateBy,
-        a.create_time initiateTime,
-        a.create_time,
-        a.start_time,
-        a.end_time,
-        a.id,
-        a.remark,
-        a.signing_way,
-        a.sign_time signTime,
-        a.status,
-        b.unit_type,
-        b.ent_id,
-        b.firm_name entName,
-        b.ent_id targetEntId,
-        b.firm_name targetEntName,
-        a.contract_pid contractPid,
-        a.performed_amount performedAmount,
-        f.name contractPname,
-        f.contract_no contractPidNo,
-        a.unload_way   unloadWay,
-        a.signing_way signingWay
+               a.trading,
+               a.name             contractName,
+               a.contract_no,
+               a.create_by        initiateBy,
+               a.create_time      initiateTime,
+               a.create_time,
+               a.start_time,
+               a.end_time,
+               a.id,
+               a.remark,
+               a.signing_way,
+               a.sign_time        signTime,
+               a.status,
+               b.unit_type,
+               b.ent_id,
+               b.firm_name        entName,
+               b.ent_id           targetEntId,
+               b.firm_name        targetEntName,
+               a.contract_pid     contractPid,
+               a.performed_amount performedAmount,
+               f.name             contractPname,
+               f.contract_no      contractPidNo,
+               a.unload_way       unloadWay,
+               a.signing_way      signingWay
         from kwc_contract_trade a
-        left join kwc_contract_trade_unit b
-        on a.id = b.contract_id
-        and b.del_flag = 0
+                 left join kwc_contract_trade_unit b
+                           on a.id = b.contract_id
+                               and b.del_flag = 0
 
-        left join kwc_contract_trade f on f.id = a.contract_pid
+                 left join kwc_contract_trade f on f.id = a.contract_pid
         where a.del_flag = 0
         <if test="startTime != null">
             and a.create_time >= #{startTime}
@@ -259,17 +258,17 @@
             and b.ent_id = #{targetEntId}
         </if>
         <if test="contractCode != null  and '' != contractCode">
-            and a.contract_no like concat('%',#{contractCode},'%')
+            and a.contract_no like concat('%', #{contractCode}, '%')
         </if>
         <if test="contractName != null  and '' != contractName">
-            and a.name  like concat('%',#{contractName},'%')
+            and a.name like concat('%', #{contractName}, '%')
         </if>
         <if test="supplementCode != null  and '' != supplementCode">
-            and f.contract_no  like concat('%',#{supplementCode},'%')
+            and f.contract_no like concat('%', #{supplementCode}, '%')
         </if>
         <if test="purchaseEntId != null  and '' != purchaseEntId">
             and b.unit_type = 2
-            and b.id  = #{purchaseEntId}
+            and b.id = #{purchaseEntId}
         </if>
         <if test="supplyEntId != null  and '' != supplyEntId">
             and b.unit_type = 1
@@ -278,7 +277,7 @@
         <if test="allEnt != null and allEnt.size() > 0">
             and a.ent_id in
             <foreach collection="allEnt" separator="," open="(" close=")" item="item">
-                 #{item}
+                #{item}
             </foreach>
         </if>
         order by a.create_time desc
@@ -335,11 +334,77 @@
     <select id="selectByContract" resultType="java.lang.Long">
         select distinct b.goods_id
         from kwc_contract_trade a
-        left join kwc_contract_trade_goods b on a.id = b.contract_id and b.del_flag = 0
+                 left join kwc_contract_trade_goods b on a.id = b.contract_id and b.del_flag = 0
+        <where>
+            a.del_flag = 0
+              and a.status = 0
+              and a.id = #{contractId}
+        </where>
+    </select>
+
+    <select id="count" resultType="java.lang.Long">
+        select count(1)
+        from kwc_contract_trade a
+                 left join kwc_contract_trade_unit c on a.id = c.contract_id and c.del_flag = 0 and c.unit_type = 1
+        <where>
+            a.del_flag = 0
+              and a.status in (1, 4)
+            <if test="ids != null and ids.size() != 0">
+                and c.ent_id in
+                <foreach collection="ids" open="(" close=")" separator="," item="item">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+    </select>
+
+    <select id="tradeList" resultType="com.sckw.contract.api.model.vo.ContractVo">
+        select a.id,
+               a.name,
+               a.amount,
+               a.create_time,
+               d.firm_name,
+               a.status
+        from kwc_contract_trade a
+                 left join kwc_contract_trade_unit c on a.id = c.contract_id and c.del_flag = 0 and c.unit_type = 1
+                 left join kwc_contract_trade_unit d on a.id = d.contract_id and d.del_flag = 0 and d.unit_type = 2
+        <where>
+            a.del_flag = 0
+            <if test="all != null and all">
+                <if test="audit != null and audit">
+                    and a.status = 1
+                </if>
+                <if test="audit != null and !audit">
+                    and a.status = 4
+                </if>
+            </if>
+            <if test="all != null and !all">
+                and a.status in (1, 4)
+            </if>
+            <if test="ids != null and ids.size() != 0">
+                and c.ent_id in
+                <foreach collection="ids" open="(" close=")" separator="," item="item">
+                    #{item}
+                </foreach>
+            </if>
+            order by a.create_time desc
+            <if test="all != null and all">
+                limit 10
+            </if>
+        </where>
+    </select>
+
+    <select id="selectSignCount" resultType="java.lang.Long">
+        select count(a.id)
+        from kwc_contract_trade a
+                 left join kwc_contract_trade_unit c on a.id = c.contract_id and c.del_flag = 0 and c.unit_type = 1
+                 left join kwc_contract_trade_unit d on a.id = d.contract_id and d.del_flag = 0 and d.unit_type = 2
         <where>
             a.del_flag = 0
-            and a.status = 0
-            and a.id = #{contractId}
+            and a.status =1
+            <if test="entId != null">
+                and d.ent_id = #{entId}
+            </if>
         </where>
     </select>
 </mapper>

+ 10 - 4
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfDriverScoreController.java

@@ -3,6 +3,7 @@ package com.sckw.fleet.controller;
 import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.core.web.response.result.PageDataResult;
+import com.sckw.fleet.api.model.dto.DriverScoreQuery;
 import com.sckw.fleet.api.model.dto.UpdateDriverScoreDto;
 import com.sckw.fleet.model.request.DriverScorerDetailRequest;
 import com.sckw.fleet.model.vo.DriverScorerDetailVO;
@@ -11,10 +12,9 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
 
 /**
  * @Author: tangyishan
@@ -51,4 +51,10 @@ public class KwfDriverScoreController {
         return BaseResult.success(ScorerDetailPageList);
     }
 
+    @PostMapping("/countDriverScore")
+    public HttpResult countDriverScore(@Validated @RequestBody DriverScoreQuery query) {
+        BigDecimal driverScoreCount = kwfDriverScoreService.countDriverScore(query);
+        return HttpResult.ok(driverScoreCount);
+    }
+
 }

+ 4 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dao/KwfDriverScoreMapper.java

@@ -1,10 +1,12 @@
 package com.sckw.fleet.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.fleet.api.model.dto.DriverScoreQuery;
 import com.sckw.fleet.model.KwfDriverScore;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -32,6 +34,8 @@ public interface KwfDriverScoreMapper extends BaseMapper<KwfDriverScore>
      */
     public List<KwfDriverScore> selectKwfDriverScoreList(KwfDriverScore kwfDriverScore);
 
+    public BigDecimal selectKwfDriverScoreCount(DriverScoreQuery query);
+
     /**
      * 新增司机评分
      * 

+ 42 - 11
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java

@@ -1,15 +1,11 @@
 package com.sckw.fleet.dubbo;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-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.constant.Global;
 import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.StringUtils;
-import com.sckw.core.web.context.LoginUserHolder;
-import com.sckw.core.web.response.HttpResult;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.dto.RUpdateDriverScoreDto;
 import com.sckw.fleet.api.model.vo.*;
@@ -64,6 +60,7 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
     private final KwfDriverScoreService driverScoreService;
     private final KwfDriverService driverService;
     private final KwfTruckReportRepository truckReportRepository;
+    private final KwfTruckEntRepository truckEntRepository;
 
 
     /**
@@ -225,11 +222,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,9 +562,13 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
     public TruckDispatchCoefficientVO findAutoTruckDispatchByEntId(Long entId) {
         KwfTruckDispatchCoefficient result = truckDispatchCoefficientRepository.findAutoTruckDispatchByEntId(entId);
         if (result == null) {
-            return new TruckDispatchCoefficientVO();
+            return null;
         }
+        return getTruckDispatchCoefficientVO(result);
+    }
 
+
+    private TruckDispatchCoefficientVO getTruckDispatchCoefficientVO(KwfTruckDispatchCoefficient result) {
         TruckDispatchCoefficientVO rulesVO = new TruckDispatchCoefficientVO();
         rulesVO.setId(result.getId());
         rulesVO.setEntId(result.getEntId());
@@ -587,6 +588,14 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
         rulesVO.setCreateUser(result.getCreateUser());
         rulesVO.setUpdateUser(result.getUpdateUser());
         return rulesVO;
+    }
+
+    @Override
+    public List<TruckDispatchCoefficientVO> findAutoTruckDispatchByEntIds(List<Long> entIds) {
+        List<KwfTruckDispatchCoefficient> autoTruckDispatchByEntIds = truckDispatchCoefficientRepository.findAutoTruckDispatchByEntIds(entIds);
+        return autoTruckDispatchByEntIds.stream()
+                .map(this::getTruckDispatchCoefficientVO)
+                .collect(Collectors.toList());
 
     }
 
@@ -594,7 +603,7 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
     public DriverConductRulesVO findDriverConductRulesByEntId(Long entId) {
         KwfDriverConductRules result = driverConductRulesRepository.findDriverConductRulesByEntId(entId);
         if (result == null) {
-            return new DriverConductRulesVO();
+            return null;
         }
 
         DriverConductRulesVO rulesVO = new DriverConductRulesVO();
@@ -624,7 +633,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<>();
         }
@@ -653,11 +669,26 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
                 .eq(KwfTruckReport::getDelFlag, Global.NO)
                 .eq(KwfTruckReport::getStatus, Global.YES));
         if(truckReport == null) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "此司机无车辆解绑信息!");
+            return;
         }
         truckReport.setStatus(Global.NO);
         log.info("解绑车辆请求参数 :{}", truckReport);
         truckReportRepository.updateById(truckReport);
 
     }
+
+    @Override
+    public RDriverScoreVo findDriverScore(Long supEntId, Long logEntId, Long driverId) {
+        //1. 查询司机的评分
+        KwfDriverScore driverScore = driverScoreRepository.findDriverScoreByEntIds(supEntId, logEntId, driverId);
+        if (driverScore == null) {
+            return null;
+        }
+        RDriverScoreVo driverScoreVo = new RDriverScoreVo();
+        driverScoreVo.setProviderEntId(driverScore.getProviderEntId());
+        driverScoreVo.setLogisticsEntId(driverScore.getLogisticsEntId());
+        driverScoreVo.setDriverId(driverScore.getDriverId());
+        driverScoreVo.setScore(driverScore.getScore());
+        return driverScoreVo;
+    }
 }

+ 42 - 7
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfDriverScore.java

@@ -1,25 +1,29 @@
 package com.sckw.fleet.model;
 
-import java.math.BigDecimal;
-
-import com.sckw.core.model.base.BaseModel;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
 /**
  * 司机评分对象 kwc_driver_score
  * 
  * @author tangyishan
  * @date 2025-12-11  18:12
  */
-@EqualsAndHashCode(callSuper = true)
 @Data
 @Accessors(chain = true)
-public class KwfDriverScore extends BaseModel
-{
+public class KwfDriverScore implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 主键
+     */
+    private Long id;
+
     /** 供应商企业id */
     private Long providerEntId;
 
@@ -31,4 +35,35 @@ public class KwfDriverScore extends BaseModel
 
     /** 司机评分 */
     private BigDecimal score;
+
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新人
+     */
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 删除标识(0正常/-1删除)
+     */
+    private Integer delFlag;
+
+
+
 }

+ 41 - 5
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/KwfDriverScoreDetail.java

@@ -1,24 +1,29 @@
 package com.sckw.fleet.model;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.sckw.core.model.base.BaseModel;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * @Author: tangyishan
  * @CreateTime: 2025-12-11  18:12
  * @Description: 司机评分明细
  */
-@EqualsAndHashCode(callSuper = true)
 @Data
 @Accessors(chain = true)
-public class KwfDriverScoreDetail extends BaseModel {
+public class KwfDriverScoreDetail implements Serializable {
+
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 主键
+     */
+    private Long id;
+
     /** 评分主键id */
     private Long scoreId;
 
@@ -33,4 +38,35 @@ public class KwfDriverScoreDetail extends BaseModel {
 
     /** 变动后评分 */
     private BigDecimal score;
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新人
+     */
+    private Long updateBy;
+
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 删除标识(0正常/-1删除)
+     */
+    private Integer delFlag;
+
+
+
 }

+ 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;
 

+ 6 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/KwfDriverConductRulesLogVO.java

@@ -59,6 +59,12 @@ public class KwfDriverConductRulesLogVO implements Serializable {
     @Schema(description = "创建人")
     private Long createUser;
 
+    /**
+     * 创建人
+     */
+    @Schema(description = "创建人姓名")
+    private String createUserName;
+
 
     private static KwfDriverConductRulesLogVO getInstance(){
         return new KwfDriverConductRulesLogVO();

+ 1 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfDriverScoreRepository.java

@@ -19,7 +19,7 @@ public class KwfDriverScoreRepository extends ServiceImpl<KwfDriverScoreMapper,
 
     public KwfDriverScore findDriverScoreByEntIds(Long proEntId, Long logEntId, Long driverId) {
         return getOne(Wrappers.<KwfDriverScore>lambdaQuery()
-                .eq(BaseModel::getDelFlag,0)
+                .eq(KwfDriverScore::getDelFlag,0)
                 .eq(KwfDriverScore::getProviderEntId,proEntId)
                 .eq(KwfDriverScore::getLogisticsEntId,logEntId)
                 .eq(KwfDriverScore::getDriverId,driverId)

+ 7 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckDispatchCoefficientRepository.java

@@ -6,6 +6,7 @@ import com.sckw.fleet.dao.KwfTruckDispatchCoefficientMapper;
 import com.sckw.fleet.model.KwfTruckDispatchCoefficient;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -21,4 +22,10 @@ public class KwfTruckDispatchCoefficientRepository extends ServiceImpl<KwfTruckD
                 .eq(Objects.nonNull(entId), KwfTruckDispatchCoefficient::getEntId, entId));
     }
 
+
+    public List<KwfTruckDispatchCoefficient> findAutoTruckDispatchByEntIds(List<Long> entIds) {
+        return list(Wrappers.<KwfTruckDispatchCoefficient>lambdaQuery()
+                .in(Objects.nonNull(entIds), KwfTruckDispatchCoefficient::getEntId, entIds));
+    }
+
 }

+ 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));
+    }
 }

+ 8 - 79
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,10 +79,6 @@ 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)
@@ -113,49 +87,4 @@ public class KwfTruckRepository extends ServiceImpl<KwfTruckMapper, KwfTruck> {
         );
     }
 
-    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));
-    }
 }

+ 25 - 7
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfAutoDispatchService.java

@@ -23,17 +23,18 @@ import com.sckw.fleet.model.vo.KwfTruckDispatchCoefficientVO;
 import com.sckw.fleet.repository.KwfDriverConductRulesLogRepository;
 import com.sckw.fleet.repository.KwfDriverConductRulesRepository;
 import com.sckw.fleet.repository.KwfTruckDispatchCoefficientRepository;
+import com.sckw.system.api.RemoteSystemService;
+import com.sckw.system.api.model.dto.res.UserCacheResDto;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -53,6 +54,9 @@ public class KwfAutoDispatchService {
 
     private final KwfTruckDispatchCoefficientRepository truckDispatchCoefficientRepository;
 
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private RemoteSystemService remoteSystemService;
+
 
     /**
      * 查询自动派车系数
@@ -84,9 +88,9 @@ public class KwfAutoDispatchService {
         KwfTruckDispatchCoefficient dispatchCoefficient = new KwfTruckDispatchCoefficient();
         dispatchCoefficient.setEntId(entId);
         dispatchCoefficient.setVehicleWorkHours(10);
-        dispatchCoefficient.setVehicleLoadingHours(1);
-        dispatchCoefficient.setVehicleUnloadingHours(1);
-        dispatchCoefficient.setDriverTimeoutLimit(2);
+        dispatchCoefficient.setVehicleLoadingHours(60);
+        dispatchCoefficient.setVehicleUnloadingHours(60);
+        dispatchCoefficient.setDriverTimeoutLimit(120);
         dispatchCoefficient.setVehicleAvgLoad(26);
         dispatchCoefficient.setVehicleAvgSpeed(50);
         dispatchCoefficient.setVehicleMaxTasks(3);
@@ -443,8 +447,22 @@ public class KwfAutoDispatchService {
             return PageDataResult.empty(request.getPageNum(), request.getPageSize());
         }
         List<KwfDriverConductRulesLogVO> rulesLogVOS = records.stream().map(KwfDriverConductRulesLogVO::toVO).collect(Collectors.toList());
+        // 提取所有createUser
+        Set<Long> userIds = rulesLogVOS.stream().map(KwfDriverConductRulesLogVO::getCreateUser)
+                .filter(Objects::nonNull).collect(Collectors.toSet());
+
+        // 批量查询用户信息
+        List<UserCacheResDto> userDtoList = remoteSystemService.queryUserCacheByIds(new ArrayList<>(userIds));
+        Map<Long, String> userMap = userDtoList.stream()
+                    .collect(Collectors.toMap(UserCacheResDto::getId, UserCacheResDto::getName, (v1, v2) -> v1));
+
+        List<KwfDriverConductRulesLogVO> result = rulesLogVOS.stream()
+                .peek(relu -> {
+                    relu.setCreateUserName(userMap.getOrDefault(relu.getCreateUser(), "未知用户"));
+                }).collect(Collectors.toList());
+
         log.info("查询司机行为规则日志成功!");
-        return PageDataResult.success(request.getPageNum(), request.getPageSize(), driverConductRulesLog.getTotal(), rulesLogVOS);
+        return PageDataResult.success(request.getPageNum(), request.getPageSize(), driverConductRulesLog.getTotal(), result);
     }
 
 }

+ 9 - 3
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverScoreService.java

@@ -15,6 +15,7 @@ import com.sckw.core.utils.IdWorker;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.fleet.api.RemoteFleetService;
+import com.sckw.fleet.api.model.dto.DriverScoreQuery;
 import com.sckw.fleet.api.model.dto.RUpdateDriverScoreDto;
 import com.sckw.fleet.api.model.dto.UpdateDriverScoreDto;
 import com.sckw.fleet.api.model.vo.RDriverVo;
@@ -287,6 +288,10 @@ public class KwfDriverScoreService {
         return scoreDetail;
     }
 
+    public BigDecimal countDriverScore(DriverScoreQuery query) {
+        return kwfDriverScoreMapper.selectKwfDriverScoreCount(query);
+    }
+
 
     @Data
     @AllArgsConstructor
@@ -327,6 +332,7 @@ public class KwfDriverScoreService {
             detailVO.setAction(detail.getAction());
             detailVO.setScoreChange(detail.getScoreChange());
             detailVO.setScore(detail.getScore());
+            detailVO.setCreateTime(detail.getCreateTime());
             scorerDetailVOList.add(detailVO);
 
             //查询当前物流企业自动派单且生效的物流合同
@@ -350,7 +356,6 @@ public class KwfDriverScoreService {
      * 修改司机评分
      * @param dto
      */
-    @Transactional(rollbackFor = Exception.class)
     public void updateDriverScore(RUpdateDriverScoreDto dto) {
         if (dto.getScore() == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "分数不能为空!");
@@ -361,7 +366,7 @@ public class KwfDriverScoreService {
         if (driverScore == null) {
             log.info("司机无评分, 需初始化司机分数,司机id:{}", dto.getDriverId());
             ContractLogisticsScoreVO logisticsScore = remoteContractService.findLogisticsScoreByEntId(dto.getSupEntId(), dto.getLogEntId());
-            if (logisticsScore == null) {
+            if (logisticsScore.getScore() == null || logisticsScore.getScore().compareTo(BigDecimal.ZERO) < 0) {
                 throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "修改司机分数,企业无评分!");
             }
             //初始化司机分数
@@ -374,7 +379,8 @@ public class KwfDriverScoreService {
         BigDecimal scoreChange = dto.getScore();
 
         //3. 修改司机评分
-        driverScore.setScore(currentScore.add(scoreChange));
+        BigDecimal newScore = currentScore.add(scoreChange);
+        driverScore.setScore(newScore.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : newScore);
         driverScoreRepository.updateById(driverScore);
 
         //4.新增司机评分明细

+ 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("车辆上报成功!");
     }
 
     /**

+ 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());
             }

+ 8 - 0
sckw-modules/sckw-fleet/src/main/resources/mapper/KwfDriverScoreMapper.xml

@@ -28,6 +28,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="driverId != null "> and driver_id = #{driverId}</if>
         </where>
     </select>
+
+    <select id="selectKwfDriverScoreCount" resultType="java.math.BigDecimal">
+        select sum(score) from kwf_driver_score
+        <where>
+            <if test="providerEntId != null "> and provider_ent_id = #{providerEntId}</if>
+            <if test="logisticsEntId != null "> and logistics_ent_id = #{logisticsEntId}</if>
+        </where>
+    </select>
     
     <select id="selectKwfDriverScoreById" parameterType="Long" resultMap="KwfDriverScoreResult">
         <include refid="selectKwfDriverScoreVo"/>

+ 24 - 3
sckw-modules/sckw-message/src/main/java/com/sckw/message/controller/MessageController.java

@@ -2,6 +2,7 @@ package com.sckw.message.controller;
 
 import com.sckw.core.model.page.PageRes;
 import com.sckw.core.utils.BeanUtils;
+import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.message.model.KwmMessage;
 import com.sckw.message.model.dto.SelectMessagesDTO;
@@ -9,7 +10,10 @@ import com.sckw.message.model.vo.req.DeleteMessagesReqVO;
 import com.sckw.message.model.vo.req.ReadMessagesReqVO;
 import com.sckw.message.model.vo.req.SelectMessagesReqVO;
 import com.sckw.message.model.vo.req.StatisticsMessagesReqVO;
+import com.sckw.message.model.vo.res.KwmMessageListResVO;
 import com.sckw.message.service.MessageService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.MediaType;
@@ -23,6 +27,7 @@ import org.springframework.web.bind.annotation.*;
 @RestController
 @RequestMapping(value = "/kwmMessage")
 @RequiredArgsConstructor
+@Tag(name = "消息管理", description = "消息管理")
 public class MessageController {
 
     private final MessageService messageService;
@@ -40,6 +45,13 @@ public class MessageController {
         return HttpResult.ok("获取消息详情成功", message);
     }
 
+    @PostMapping(value = "/count", produces = MediaType.APPLICATION_JSON_VALUE)
+    @Operation(summary = "我的未读消息")
+    public BaseResult<Long> count(@RequestBody @Valid SelectMessagesReqVO params) {
+        Long res = messageService.count(BeanUtils.copyProperties(params, SelectMessagesDTO.class));
+        return BaseResult.success(res, "查询成功");
+    }
+
     /**
      * @param params
      * @return com.sckw.core.web.response.HttpResult
@@ -48,9 +60,10 @@ public class MessageController {
      * @date: 2023-06-09 15:12
      */
     @PostMapping(value = "/select", produces = MediaType.APPLICATION_JSON_VALUE)
-    public HttpResult select(@RequestBody @Valid SelectMessagesReqVO params) {
-        PageRes res = messageService.select(BeanUtils.copyProperties(params, SelectMessagesDTO.class));
-        return HttpResult.ok("分页查询消息成功", res);
+    @Operation(summary = "分页查询消息")
+    public BaseResult<PageRes<KwmMessageListResVO>> select(@RequestBody @Valid SelectMessagesReqVO params) {
+        PageRes<KwmMessageListResVO> res = messageService.select(BeanUtils.copyProperties(params, SelectMessagesDTO.class));
+        return BaseResult.success(res, "分页查询消息成功");
     }
 
     /**
@@ -65,6 +78,13 @@ public class MessageController {
         return HttpResult.ok("消息列表统计查询成功", messageService.statistics(params));
     }
 
+    @PostMapping(value = "/mock", produces = MediaType.APPLICATION_JSON_VALUE)
+    @Operation(summary = "模拟数据")
+    public HttpResult mock() {
+        messageService.mock();
+        return HttpResult.ok("读取消息成功");
+    }
+
     /**
      * @param readMessagesReqVO
      * @return com.sckw.core.web.response.HttpResult
@@ -73,6 +93,7 @@ public class MessageController {
      * @date: 2023-06-09 14:21
      */
     @PostMapping(value = "/read", produces = MediaType.APPLICATION_JSON_VALUE)
+    @Operation(summary = "标记消息已读")
     public HttpResult read(@RequestBody @Valid ReadMessagesReqVO readMessagesReqVO) {
         messageService.read(readMessagesReqVO);
         return HttpResult.ok("读取消息成功");

+ 2 - 0
sckw-modules/sckw-message/src/main/java/com/sckw/message/dao/KwmMessageMapper.java

@@ -34,4 +34,6 @@ public interface KwmMessageMapper extends BaseMapper<KwmMessage> {
      * @return: java.util.List<com.sckw.core.model.vo.TableTop>
      */
     List<TableTop> statistics(@Param("item") SelectMessagesDTO item);
+
+    Long joinCount(@Param("para") SelectMessagesDTO selectMessagesDTO);
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов