浏览代码

千人千面开发

xucaiqin 1 周之前
父节点
当前提交
6879397de1
共有 64 个文件被更改,包括 3944 次插入364 次删除
  1. 284 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtil.java
  2. 1 1
      sckw-common/sckw-common-datasource/pom.xml
  3. 6 0
      sckw-common/sckw-common-redis/src/main/java/com/sckw/redis/constant/RedisConstant.java
  4. 7 1
      sckw-modules-api/sckw-contract-api/pom.xml
  5. 16 2
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java
  6. 22 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/req/ContractAuditPara.java
  7. 349 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/ContractDetailRespVo.java
  8. 228 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/LogisticDetailRespVo.java
  9. 25 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/ContractCountVo.java
  10. 36 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/vo/ContractVo.java
  11. 7 1
      sckw-modules-api/sckw-order-api/pom.xml
  12. 18 1
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/TradeOrderInfoService.java
  13. 20 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/BuyDto.java
  14. 28 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/BuyVo.java
  15. 19 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/CountPara.java
  16. 20 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/GoodsDto.java
  17. 27 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/GoodsVo.java
  18. 21 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/RankDto.java
  19. 23 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/SaleDto.java
  20. 28 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/SaleVo.java
  21. 22 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TimeSaleDataDto.java
  22. 21 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TimeSaleDto.java
  23. 23 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeBuyVo.java
  24. 22 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeOrderAuditPara.java
  25. 27 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeSaleVo.java
  26. 50 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeVo.java
  27. 2 0
      sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/dubbo/GoodsInfoService.java
  28. 167 0
      sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/model/GoodsDetails.java
  29. 11 5
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java
  30. 22 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/LogisticsOrderAuditPara.java
  31. 19 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/TimePara.java
  32. 19 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/CountPara2.java
  33. 21 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/LogisticsDto.java
  34. 49 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/LogisticsVo.java
  35. 259 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/WaybillOrderDetailVo.java
  36. 19 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/WaybillRankVo.java
  37. 19 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/WaybillVo.java
  38. 11 6
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dao/KwcContractLogisticsMapper.java
  39. 6 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dao/KwcContractTradeMapper.java
  40. 218 3
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java
  41. 39 0
      sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractLogisticsMapper.xml
  42. 187 136
      sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractTradeMapper.xml
  43. 17 6
      sckw-modules/sckw-order/src/main/java/com/sckw/order/dao/KwoTradeOrderMapper.java
  44. 342 80
      sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java
  45. 166 4
      sckw-modules/sckw-order/src/main/resources/mapper/KwoTradeOrderMapper.xml
  46. 6 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/dubbo/GoodsInfoServiceImpl.java
  47. 37 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java
  48. 161 0
      sckw-modules/sckw-report/src/main/java/com/sckw/report/controller/HomeController.java
  49. 138 0
      sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwHomeService.java
  50. 31 0
      sckw-modules/sckw-report/src/main/java/com/sckw/report/service/vo/OperationCountVo.java
  51. 29 0
      sckw-modules/sckw-report/src/main/resources/bootstrap-local.yml
  52. 15 1
      sckw-modules/sckw-system/pom.xml
  53. 15 5
      sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsMenuController.java
  54. 5 4
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dubbo/RemoteBaseService.java
  55. 0 4
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dubbo/RemoteSystemServiceImpl.java
  56. 4 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/FindMenuTreeReqVo.java
  57. 4 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/FindMenuTreeResVo.java
  58. 32 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/MenuTreeCountResVo.java
  59. 114 7
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsMenuService.java
  60. 8 4
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderMapper.java
  61. 63 30
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderMapper.java
  62. 239 62
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java
  63. 19 0
      sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderMapper.xml
  64. 81 1
      sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderMapper.xml

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

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

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

+ 16 - 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.*;
 
@@ -74,7 +75,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 +130,6 @@ public interface RemoteContractService {
     TradeContractUnitDto queryEntByContractId(Long contractId);
 
 
-
     /**
      * 查询物流企业评分
      */
@@ -139,4 +140,17 @@ public interface RemoteContractService {
      */
     KwcContractLogisticsDto findLogContractByEntId(Long entId);
 
+    Long queryTradeCount();
+    Long queryLogisticsCount();
+    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;
+}

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

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

+ 18 - 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,21 @@ public interface TradeOrderInfoService {
 
     List<TradeOrderContractVo> queryByTradeContactIds(Set<Long> tradeContractIds);
 
+    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;
+}

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

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

+ 11 - 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,15 @@ public interface TransportRemoteService {
     List<KwtLogisticsOrderAddressVo> queryByWOrderId(Long wayBillOrderId);
 
     List<WayContaractbillOrderVo> queryLogisticContractByContTradeIds(Set<Long> contractIds);
+    Long queryLogisticsCount();
+    Long queryWaybillCount();
+    Long queryCount();
+
+    List<LogisticsVo> logisticsList();
+
+    LogisticsDto logisticsRank(TimePara timePara);
+
+    WaybillOrderDetailVo auditLogisticsTask(LogisticsOrderAuditPara para);
+
+    Object countLogistics(CountPara2 countPara);
 }

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

+ 11 - 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,10 @@ 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);
 }
 
 

+ 6 - 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,11 @@ 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);
+
 }
 
 

+ 218 - 3
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java

@@ -1,18 +1,29 @@
 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.req.QueryListReqVo;
+import com.sckw.contract.model.vo.req.QueryLogisticListReq;
+import com.sckw.contract.model.vo.res.ContractDetailResp;
+import com.sckw.contract.model.vo.res.ContractStatusCountResp;
+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 +32,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 +42,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 +79,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 +89,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) {
@@ -280,9 +297,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 +343,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 -> {
@@ -475,5 +493,202 @@ public class RemoteContractServiceImpl implements RemoteContractService {
         }).orElse(null);
     }
 
+    @Override
+    public Long queryTradeCount() {
+        ContractStatusCountResp contractStatusCountResp = kwcContractTradeService.queryTradeContractStatusCount(new QueryListReqVo());
+
+        List<ContractStatusCountResp.ContractStatusCount> contractStatusInfo = contractStatusCountResp.getContractStatusInfo();
+        if (CollUtil.isEmpty(contractStatusInfo)) {
+            return 0L;
+        }
+        Optional<ContractStatusCountResp.ContractStatusCount> first = contractStatusInfo.stream().filter(d -> Objects.equals(d.getOrderStatus(), "1")).findFirst();
+        return first.map(contractStatusCount -> Long.parseLong(contractStatusCount.getOrderNum())).orElse(0L);
+    }
+
+    @Override
+    public Long queryLogisticsCount() {
+        ContractStatusCountResp contractStatusCountResp = kwcContractLogisticsService.queryLogisticContractStatusCount(new QueryLogisticListReq());
+        List<ContractStatusCountResp.ContractStatusCount> contractStatusInfo = contractStatusCountResp.getContractStatusInfo();
+        if (CollUtil.isEmpty(contractStatusInfo)) {
+            return 0L;
+        }
+        Optional<ContractStatusCountResp.ContractStatusCount> first = contractStatusInfo.stream().filter(d -> Objects.equals(d.getOrderStatus(), "1")).findFirst();
+        return first.map(contractStatusCount -> Long.parseLong(contractStatusCount.getOrderNum())).orElse(0L);
+    }
+
+    @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("未找到合同");
+    }
+
 
 }

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

@@ -188,4 +188,43 @@
         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>
 </mapper>

+ 187 - 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,63 @@
     <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}
+              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>
 </mapper>

+ 17 - 6
sckw-modules/sckw-order/src/main/java/com/sckw/order/dao/KwoTradeOrderMapper.java

@@ -2,10 +2,7 @@ package com.sckw.order.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.core.model.vo.TableTop;
-import com.sckw.order.api.model.OrderSaleVo;
-import com.sckw.order.api.model.TradeOrderCountStatisticsDTO;
-import com.sckw.order.api.model.TradeOrderPara;
-import com.sckw.order.api.model.TradeOrderVo;
+import com.sckw.order.api.model.*;
 import com.sckw.order.model.KwoTradeOrder;
 import com.sckw.order.model.dto.*;
 import com.sckw.order.model.vo.res.TradeOrderAppStatisticVO;
@@ -132,10 +129,10 @@ public interface KwoTradeOrderMapper extends BaseMapper<KwoTradeOrder> {
                                                  @Param("contractIds") List<Long> contractIds);
 
     /**
-     * @desc TODO
      * @param procureTopEntId
      * @param excludeStatuses
      * @return java.util.List<com.sckw.order.model.dto.WorkbenchPurchaseDTO>
+     * @desc TODO
      * @author yzc
      * @date 2024/3/18 17:04
      */
@@ -148,5 +145,19 @@ public interface KwoTradeOrderMapper extends BaseMapper<KwoTradeOrder> {
 
     List<OrderSaleVo> querySaleOrder(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end);
 
-    List<TradeOrderVo> selectData(@Param("para")TradeOrderPara para);
+    List<TradeOrderVo> selectData(@Param("para") TradeOrderPara para);
+
+    Long queryCount(@Param("ids") List<Long> ids);
+
+    List<TradeVo> queryList(@Param("ids") List<Long> ids, @Param("all") Boolean all);
+
+    List<TradeSaleVo> countList(@Param("ids") List<Long> ids, @Param("para") CountPara countPara);
+
+    List<SaleVo> countSale(@Param("para") CountPara countPara, @Param("ids") List<Long> ids);
+
+    List<BuyVo> countBuy(@Param("para") CountPara countPara, @Param("ids") List<Long> ids);
+
+    List<GoodsVo> countGoods(@Param("para") CountPara countPara, @Param("ids") List<Long> ids);
+
+    List<TradeBuyVo> buyRank(@Param("para") CountPara countPara, @Param("ids") List<Long> ids);
 }

+ 342 - 80
sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java

@@ -6,34 +6,47 @@ import com.alibaba.fastjson2.JSON;
 import com.google.common.collect.Lists;
 import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.constant.NumberConstant;
+import com.sckw.core.model.vo.TableStatisticRes;
+import com.sckw.core.model.vo.TableTop;
 import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.DateUtil;
 import com.sckw.core.utils.StringUtils;
+import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.mongo.model.SckwTradeOrder;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.order.api.model.*;
+import com.sckw.order.dao.KwoTradeOrderMapper;
 import com.sckw.order.enums.DeliveryTypeEnum;
 import com.sckw.order.enums.OrderStatusEnum;
 import com.sckw.order.model.*;
+import com.sckw.order.model.vo.req.TradeOrderListSelectParam;
 import com.sckw.order.model.vo.res.AddressInfoDtoDetailRes;
 import com.sckw.order.repository.*;
 import com.sckw.order.serivce.*;
+import com.sckw.product.api.dubbo.GoodsInfoService;
+import com.sckw.product.api.model.GoodsDetail;
+import com.sckw.product.api.model.GoodsDetails;
 import com.sckw.redis.constant.RedisConstant;
 import com.sckw.redis.utils.RedissonUtils;
 import com.sckw.stream.model.SckwBusSum;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.stream.function.StreamBridge;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -60,7 +73,10 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
     private KwoTradeOrderUnitService tradeOrderUnitService;
     @Autowired
     private KwoTradeOrderGoodsUnitService tradeOrderGoodsUnitService;
-
+    private final KwoTradeOrderMapper kwoTradeOrderMapper;
+    private final RedisTemplate<String, Object> redisTemplate;
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private GoodsInfoService goodsInfoService;
     private final KwoTradeOrderRepository kwoTradeOrderRepository;
     private final KwoTradeOrderGoodsRepository kwoTradeOrderGoodsRepository;
     private final KwoTradeOrderUnitRepository kwoTradeOrderUnitRepository;
@@ -70,11 +86,7 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
     @Override
     public OrderDetailRes getOrderDetailById(Long tOrderId) {
         OrderDetailRes order = BeanUtil.copyProperties(kwoTradeOrderService.detail(tOrderId), OrderDetailRes.class);
-        BigDecimal actualPrice = Objects.isNull(order.getActualAmount())
-                || Objects.isNull(order.getGoodsInfo())
-                || Objects.isNull(order.getGoodsInfo().getUnitPrice())
-                ? BigDecimal.ZERO :
-                order.getActualAmount().multiply(order.getGoodsInfo().getUnitPrice()).setScale(2, RoundingMode.HALF_UP);
+        BigDecimal actualPrice = Objects.isNull(order.getActualAmount()) || Objects.isNull(order.getGoodsInfo()) || Objects.isNull(order.getGoodsInfo().getUnitPrice()) ? BigDecimal.ZERO : order.getActualAmount().multiply(order.getGoodsInfo().getUnitPrice()).setScale(2, RoundingMode.HALF_UP);
         order.setActualPrice(actualPrice);
         return order;
     }
@@ -117,13 +129,11 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
         kwoTradeOrderService.updateById(order);
         //订单状态记录
         KwoTradeOrderTrack track = new KwoTradeOrderTrack();
-        track.setTOrderId(order.getId()).setTOrderNo(order.getTOrderNo()).setStatus(order.getStatus())
-                .setCreateBy(updateBy).setUpdateBy(updateBy);
+        track.setTOrderId(order.getId()).setTOrderNo(order.getTOrderNo()).setStatus(order.getStatus()).setCreateBy(updateBy).setUpdateBy(updateBy);
         kwoTradeOrderTrackService.insert(track);
         //更新mongodb
         SckwTradeOrder updateParam = new SckwTradeOrder();
-        updateParam.setTOrderId(order.getId()).setStatus(order.getStatus()).setUpdateBy(param.getUpdateBy())
-                .setUpdateByName(param.getUpdateByName()).setUpdateTime(new Date());
+        updateParam.setTOrderId(order.getId()).setStatus(order.getStatus()).setUpdateBy(param.getUpdateBy()).setUpdateByName(param.getUpdateByName()).setUpdateTime(new Date());
         saveMongoDb(updateParam);
     }
 
@@ -152,14 +162,12 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
             if (!Objects.equals(order.getStatus(), OrderStatusEnum.EXECUTING.getCode())) {
                 return HttpResult.error("执行中的订单才可物流托运!");
             }
-            BigDecimal totalEntrustAmount = Objects.isNull(order.getEntrustAmount()) ?
-                    entrustAmount : entrustAmount.add(order.getEntrustAmount());
+            BigDecimal totalEntrustAmount = Objects.isNull(order.getEntrustAmount()) ? entrustAmount : entrustAmount.add(order.getEntrustAmount());
             order.setEntrustAmount(totalEntrustAmount).setUpdateBy(param.getUpdateBy());
             kwoTradeOrderService.updateById(order);
             //更新mongodb
             SckwTradeOrder updateParam = new SckwTradeOrder();
-            updateParam.setTOrderId(order.getId()).setEntrustAmount(totalEntrustAmount.doubleValue())
-                    .setUpdateBy(param.getUpdateBy()).setUpdateByName(param.getUpdateByName()).setUpdateTime(new Date());
+            updateParam.setTOrderId(order.getId()).setEntrustAmount(totalEntrustAmount.doubleValue()).setUpdateBy(param.getUpdateBy()).setUpdateByName(param.getUpdateByName()).setUpdateTime(new Date());
             saveMongoDb(updateParam);
         } finally {
             RedissonUtils.unlock(lockKey);
@@ -212,8 +220,7 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
 
                     //更新mongodb
                     SckwTradeOrder updateParam = new SckwTradeOrder();
-                    updateParam.setTOrderId(order.getId()).setEntrustAmount(totalEntrustAmount.doubleValue())
-                            .setUpdateBy(updateBy).setUpdateByName(updateByName).setUpdateTime(new Date());
+                    updateParam.setTOrderId(order.getId()).setEntrustAmount(totalEntrustAmount.doubleValue()).setUpdateBy(updateBy).setUpdateByName(updateByName).setUpdateTime(new Date());
                     saveMongoDb(updateParam);
                 }
             }
@@ -251,15 +258,13 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
                 return HttpResult.error("执行中的订单才可物流托运!");
             }
             BigDecimal actualAmount = Objects.isNull(order.getActualAmount()) ? BigDecimal.ZERO : order.getActualAmount();
-            BigDecimal addActualAmount = Objects.equals(order.getDeliveryType(), DeliveryTypeEnum.ISSUE.getType())
-                    ? actualLoadAmount : actualUnloadAmount;
+            BigDecimal addActualAmount = Objects.equals(order.getDeliveryType(), DeliveryTypeEnum.ISSUE.getType()) ? actualLoadAmount : actualUnloadAmount;
             BigDecimal totalActualAmount = actualAmount.add(addActualAmount);
             order.setActualAmount(totalActualAmount).setUpdateBy(param.getUpdateBy());
             kwoTradeOrderService.updateById(order);
             //更新mongodb
             SckwTradeOrder updateParam = new SckwTradeOrder();
-            updateParam.setTOrderId(order.getId()).setActualAmount(totalActualAmount.doubleValue()).setStatus(order.getStatus())
-                    .setUpdateBy(param.getUpdateBy()).setUpdateByName(param.getUpdateByName()).setUpdateTime(new Date());
+            updateParam.setTOrderId(order.getId()).setActualAmount(totalActualAmount.doubleValue()).setStatus(order.getStatus()).setUpdateBy(param.getUpdateBy()).setUpdateByName(param.getUpdateByName()).setUpdateTime(new Date());
             saveMongoDb(updateParam);
         } finally {
             RedissonUtils.unlock(lockKey);
@@ -278,9 +283,7 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
             return HttpResult.error("任务量不能为空!");
         }
         for (GoodsLoadingV1Param goodsLoading : loading) {
-            if (StringUtils.isBlank(goodsLoading.getUnit())
-                    || goodsLoading.getActualLoadAmount() == null
-                    || goodsLoading.getActualUnloadAmount() == null) {
+            if (StringUtils.isBlank(goodsLoading.getUnit()) || goodsLoading.getActualLoadAmount() == null || goodsLoading.getActualUnloadAmount() == null) {
                 return HttpResult.error("任务量不能为空!");
             }
         }
@@ -304,8 +307,7 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
                 BigDecimal actualUnloadAmount = goodsLoading.getActualUnloadAmount();
 
                 BigDecimal actualAmount = Objects.isNull(order.getActualAmount()) ? BigDecimal.ZERO : order.getActualAmount();
-                BigDecimal addActualAmount = Objects.equals(order.getDeliveryType(), DeliveryTypeEnum.ISSUE.getType())
-                        ? actualLoadAmount : actualUnloadAmount;
+                BigDecimal addActualAmount = Objects.equals(order.getDeliveryType(), DeliveryTypeEnum.ISSUE.getType()) ? actualLoadAmount : actualUnloadAmount;
                 BigDecimal totalActualAmount = actualAmount.add(addActualAmount);
                 if (goodsLoading.getUnit().equals(order.getUnit())) {
                     order.setActualAmount(totalActualAmount).setUpdateBy(updateBy);
@@ -313,8 +315,7 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
 
                     //更新mongodb
                     SckwTradeOrder updateParam = new SckwTradeOrder();
-                    updateParam.setTOrderId(order.getId()).setActualAmount(totalActualAmount.doubleValue()).setStatus(order.getStatus())
-                            .setUpdateBy(updateBy).setUpdateByName(updateByName).setUpdateTime(new Date());
+                    updateParam.setTOrderId(order.getId()).setActualAmount(totalActualAmount.doubleValue()).setStatus(order.getStatus()).setUpdateBy(updateBy).setUpdateByName(updateByName).setUpdateTime(new Date());
                     saveMongoDb(updateParam);
                 } else {
                     KwoTradeOrderGoodsUnit goodsUnit = tradeOrderGoodsUnitService.findByIdAndUnit(tOrderId, goodsLoading.getUnit());
@@ -353,18 +354,12 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
             if (!Objects.equals(order.getStatus(), OrderStatusEnum.EXECUTING.getCode())) {
                 return HttpResult.error("执行中的订单才可物流托运!");
             }
-            BigDecimal addActualAmount = Objects.equals(order.getDeliveryType(), DeliveryTypeEnum.ISSUE.getType())
-                    ? actualLoadAmount : actualUnloadAmount;
+            BigDecimal addActualAmount = Objects.equals(order.getDeliveryType(), DeliveryTypeEnum.ISSUE.getType()) ? actualLoadAmount : actualUnloadAmount;
             order.setActualAmount(addActualAmount).setUpdateBy(param.getUpdateBy());
             kwoTradeOrderService.updateById(order);
             //更新mongodb
             SckwTradeOrder updateParam = new SckwTradeOrder();
-            updateParam.setTOrderId(order.getId())
-                    .setActualAmount(addActualAmount.doubleValue())
-                    .setStatus(order.getStatus())
-                    .setUpdateBy(param.getUpdateBy())
-                    .setUpdateByName(param.getUpdateByName())
-                    .setUpdateTime(new Date());
+            updateParam.setTOrderId(order.getId()).setActualAmount(addActualAmount.doubleValue()).setStatus(order.getStatus()).setUpdateBy(param.getUpdateBy()).setUpdateByName(param.getUpdateByName()).setUpdateTime(new Date());
             saveMongoDb(updateParam);
         } finally {
             RedissonUtils.unlock(lockKey);
@@ -422,13 +417,10 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
             kwoTradeOrderService.contractCompletedUpdate(ids, updateBy);
             orders.forEach(e -> {
                 KwoTradeOrderTrack track = new KwoTradeOrderTrack();
-                track.setTOrderId(e.getId()).setTOrderNo(e.getTOrderNo())
-                        .setStatus(OrderStatusEnum.EXECUTING.getCode())
-                        .setCreateBy(updateBy).setUpdateBy(updateBy);
+                track.setTOrderId(e.getId()).setTOrderNo(e.getTOrderNo()).setStatus(OrderStatusEnum.EXECUTING.getCode()).setCreateBy(updateBy).setUpdateBy(updateBy);
                 tracks.add(track);
                 SckwTradeOrder updateParam = new SckwTradeOrder();
-                updateParam.setTOrderId(e.getId()).setStatus(OrderStatusEnum.EXECUTING.getCode())
-                        .setUpdateBy(updateBy).setUpdateByName(param.getUpdateByName()).setUpdateTime(new Date());
+                updateParam.setTOrderId(e.getId()).setStatus(OrderStatusEnum.EXECUTING.getCode()).setUpdateBy(updateBy).setUpdateByName(param.getUpdateByName()).setUpdateTime(new Date());
                 tradeOrders.add(updateParam);
             });
             kwoTradeOrderTrackService.insertBatch(tracks);
@@ -461,8 +453,7 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
         kwoTradeOrderService.updateById(order);
         //更新mongodb
         SckwTradeOrder updateParam = new SckwTradeOrder();
-        updateParam.setTOrderId(order.getId()).setAssociateStatement(associateStatement).setUpdateBy(updateBy)
-                .setUpdateByName(updateByName).setUpdateTime(new Date());
+        updateParam.setTOrderId(order.getId()).setAssociateStatement(associateStatement).setUpdateBy(updateBy).setUpdateByName(updateByName).setUpdateTime(new Date());
         saveMongoDb(updateParam);
 
     }
@@ -528,42 +519,39 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
         }
 
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwoTradeOrderUnits)) {
-            orderDetailRes.setUnitInfo(kwoTradeOrderUnits.stream()
-                    .map(u -> {
-                        OrderDetailVo.UnitInfo unitInfo = new OrderDetailVo.UnitInfo();
-                        unitInfo.setTOrderId(u.getTOrderId());
-                        unitInfo.setTOrderNo(u.getTOrderNo());
-                        unitInfo.setUnitType(u.getUnitType());
-                        unitInfo.setEntId(u.getEntId());
-                        unitInfo.setTopEntId(u.getTopEntId());
-                        unitInfo.setFirmName(u.getFirmName());
-                        unitInfo.setContactsId(u.getContactsId());
-                        unitInfo.setContacts(u.getContacts());
-                        unitInfo.setPhone(u.getPhone());
-                        return unitInfo;
-                    }).collect(Collectors.toList())
-            );
+            orderDetailRes.setUnitInfo(kwoTradeOrderUnits.stream().map(u -> {
+                OrderDetailVo.UnitInfo unitInfo = new OrderDetailVo.UnitInfo();
+                unitInfo.setTOrderId(u.getTOrderId());
+                unitInfo.setTOrderNo(u.getTOrderNo());
+                unitInfo.setUnitType(u.getUnitType());
+                unitInfo.setEntId(u.getEntId());
+                unitInfo.setTopEntId(u.getTopEntId());
+                unitInfo.setFirmName(u.getFirmName());
+                unitInfo.setContactsId(u.getContactsId());
+                unitInfo.setContacts(u.getContacts());
+                unitInfo.setPhone(u.getPhone());
+                return unitInfo;
+            }).collect(Collectors.toList()));
         }
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwoTradeOrderAddresses)) {
-            List<OrderDetailVo.AddressInfo> addressInfos = kwoTradeOrderAddresses.stream()
-                    .map(a -> {
-                        OrderDetailVo.AddressInfo addressInfo = new OrderDetailVo.AddressInfo();
-                        addressInfo.setTOrderId(a.getTOrderId());
-                        addressInfo.setTOrderNo(a.getTOrderNo());
-                        addressInfo.setAddressType(a.getAddressType());
-                        addressInfo.setName(a.getName());
-                        addressInfo.setType(a.getType());
-                        addressInfo.setContacts(a.getContacts());
-                        addressInfo.setPhone(a.getPhone());
-                        addressInfo.setCityCode(a.getCityCode());
-                        addressInfo.setCityName(a.getCityName());
-                        addressInfo.setDetailAddress(a.getDetailAddress());
-                        addressInfo.setLat(a.getLat());
-                        addressInfo.setLng(a.getLng());
-                        addressInfo.setFence(a.getFence());
-                        addressInfo.setSort(a.getSort());
-                        return addressInfo;
-                    }).collect(Collectors.toList());
+            List<OrderDetailVo.AddressInfo> addressInfos = kwoTradeOrderAddresses.stream().map(a -> {
+                OrderDetailVo.AddressInfo addressInfo = new OrderDetailVo.AddressInfo();
+                addressInfo.setTOrderId(a.getTOrderId());
+                addressInfo.setTOrderNo(a.getTOrderNo());
+                addressInfo.setAddressType(a.getAddressType());
+                addressInfo.setName(a.getName());
+                addressInfo.setType(a.getType());
+                addressInfo.setContacts(a.getContacts());
+                addressInfo.setPhone(a.getPhone());
+                addressInfo.setCityCode(a.getCityCode());
+                addressInfo.setCityName(a.getCityName());
+                addressInfo.setDetailAddress(a.getDetailAddress());
+                addressInfo.setLat(a.getLat());
+                addressInfo.setLng(a.getLng());
+                addressInfo.setFence(a.getFence());
+                addressInfo.setSort(a.getSort());
+                return addressInfo;
+            }).collect(Collectors.toList());
             orderDetailRes.setAddressInfo(addressInfos);
         }
         if (Objects.nonNull(kwoTradeOrderContract)) {
@@ -580,10 +568,10 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
 
     @Override
     public List<OrderDetailVo> queryByTradeOrderIds(Set<Long> tradeOrderIds) {
-         List<KwoTradeOrder> kwoTradeOrders = kwoTradeOrderRepository.queryByTradeOrderIds(tradeOrderIds);
-         if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwoTradeOrders)){
-             return List.of();
-         }
+        List<KwoTradeOrder> kwoTradeOrders = kwoTradeOrderRepository.queryByTradeOrderIds(tradeOrderIds);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwoTradeOrders)) {
+            return List.of();
+        }
 
         return kwoTradeOrders.stream().map(TradeOrderInfoServiceImpl::getOrderDetailVo).collect(Collectors.toList());
     }
@@ -634,6 +622,280 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
         }).collect(Collectors.toList());
     }
 
+    @Override
+    public Long queryTradeCount() {
+        TableStatisticRes tableStatisticRes = kwoTradeOrderService.tradeOrderStatistic(new TradeOrderListSelectParam());
+        Optional<TableTop> first = tableStatisticRes.getTableTops().stream().filter(d -> Objects.equals(d.getValue(), 1)).findFirst();
+        return first.map(d -> (long) d.getTotal()).orElse(0L);
+    }
+
+    @Override
+    public Long orderCount() {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        return kwoTradeOrderMapper.queryCount(ids);
+    }
+
+    @Override
+    public List<TradeVo> tradeList() {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        return kwoTradeOrderMapper.queryList(ids, false);
+    }
+
+    @Override
+    public SaleDto countSale(CountPara countPara) {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        List<SaleVo> saleVos = kwoTradeOrderMapper.countSale(countPara, ids);
+        if (CollUtil.isEmpty(saleVos)) {
+            saleVos = new ArrayList<>();
+        }
+        Map<String, SaleVo> map = saleVos.stream().collect(Collectors.toMap(SaleVo::getOrderDay, Function.identity()));
+        List<String> last7Days = DateUtil.getDateRange(countPara.getStartTime(), countPara.getEndTime());
+        SaleDto jsonObject = new SaleDto();
+        List<String> date = new ArrayList<>();//日期
+        List<BigDecimal> two = new ArrayList<>();
+        List<Integer> three = new ArrayList<>();
+        for (String last7Day : last7Days) {
+            date.add(last7Day);
+            SaleVo saleVo = map.get(last7Day);
+            if (Objects.nonNull(saleVo)) {
+                two.add(Objects.nonNull(saleVo.getUnitPrice()) ? saleVo.getUnitPrice().divide(new BigDecimal("10000"), RoundingMode.HALF_UP) : new BigDecimal("0"));
+                three.add(saleVo.getCount());
+            } else {
+                two.add(new BigDecimal("0"));
+                three.add(0);
+            }
+        }
+        jsonObject.setDate(date);
+        jsonObject.setSale(two);
+        jsonObject.setOrder(three);
+
+        return jsonObject;
+    }
+
+    public List<BigDecimal> sizeOf(Integer size) {
+        ArrayList<BigDecimal> bigDecimals = new ArrayList<>();
+        for (int i = 0; i < size; i++) {
+            bigDecimals.add(new BigDecimal("0"));
+        }
+        return bigDecimals;
+    }
+
+    private List<BigDecimal> getData(List<String> times, List<TradeSaleVo> data) {
+        Map<String, BigDecimal> map = data.stream().collect(Collectors.toMap(TradeSaleVo::getTimePeriod, TradeSaleVo::getAmount, (a, b) -> a));
+        return times.stream().map(d -> {
+            BigDecimal bigDecimal = map.get(d);
+            if (Objects.isNull(bigDecimal)) {
+                return new BigDecimal("0");
+            }
+            return bigDecimal;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public TimeSaleDto timeSale(CountPara countPara) {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        List<TradeSaleVo> tradeSaleVos = kwoTradeOrderMapper.countList(ids, countPara);
+        if (CollUtil.isEmpty(tradeSaleVos)) {
+            tradeSaleVos = new ArrayList<>();
+        }
+        Map<Long, GoodsDetail> goodsMap = new HashMap<>();
+        List<Long> collect = tradeSaleVos.stream().map(TradeSaleVo::getGoodsId).distinct().toList();
+        for (Long aLong : collect) {
+            GoodsDetail detailById = goodsInfoService.getDetailById(aLong);
+            if (Objects.nonNull(detailById)) {
+                goodsMap.put(aLong, detailById);
+            }
+        }
+
+        Map<Long, List<TradeSaleVo>> collect1 = tradeSaleVos.stream().collect(Collectors.groupingBy(TradeSaleVo::getGoodsId));
+
+        List<TimeSaleDataDto> data = new ArrayList<>();
+        List<String> strings1 = DateUtil.generateHourRanges(countPara.getStartTime(), countPara.getEndTime());
+        TimeSaleDto timeSaleDto = new TimeSaleDto();
+        timeSaleDto.setDate(strings1);
+
+
+        for (Map.Entry<Long, List<TradeSaleVo>> map : collect1.entrySet()) {
+            TimeSaleDataDto timeSaleDataDto = new TimeSaleDataDto();
+            Long key = map.getKey();
+            List<TradeSaleVo> value = map.getValue();
+
+            GoodsDetail goodsDetail = goodsMap.get(key);
+            if (Objects.isNull(goodsDetail)) {
+                timeSaleDataDto.setName("-");
+                timeSaleDataDto.setData(sizeOf(strings1.size()));
+            } else {
+                timeSaleDataDto.setName(goodsDetail.getName() + goodsDetail.getSpec());
+                if (CollUtil.isEmpty(value)) {
+                    timeSaleDataDto.setData(sizeOf(strings1.size()));
+                } else {
+                    timeSaleDataDto.setData(getData(strings1, value));
+                }
+            }
+            data.add(timeSaleDataDto);
+        }
+
+        timeSaleDto.setData(data);
+        return timeSaleDto;
+    }
+
+    @Override
+    public RankDto buyRank(CountPara countPara) {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        List<TradeBuyVo> tradeSaleVos = kwoTradeOrderMapper.buyRank(countPara, ids);
+        if (CollUtil.isEmpty(tradeSaleVos)) {
+            tradeSaleVos = new ArrayList<>();
+        }
+        ArrayList<String> strings = new ArrayList<>();
+        ArrayList<BigDecimal> strings2 = new ArrayList<>();
+
+        for (TradeBuyVo tradeSaleVo : tradeSaleVos) {
+            strings.add(tradeSaleVo.getFirmName());
+            strings2.add(Objects.nonNull(tradeSaleVo.getAmount()) ? tradeSaleVo.getAmount() : new BigDecimal("0"));
+        }
+        RankDto rankDto = new RankDto();
+        rankDto.setFirmName(strings);
+        rankDto.setAmount(strings2);
+
+
+        return rankDto;
+    }
+
+    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 OrderDetailRes auditTradeOrder(TradeOrderAuditPara para) {
+        Long orderId = para.getOrderId();
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        String key = String.format(RedisConstant.AUDIT_TRADE_ORDER, LoginUserHolder.getEntId());
+
+        if (para.getStart()) {//首次加载,合同id为第一个合同
+            if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) {
+                redisTemplate.delete(key);
+            }
+            //写入缓存
+            List<TradeVo> tradeVos = kwoTradeOrderMapper.queryList(ids, true);
+            if (CollUtil.isNotEmpty(tradeVos)) {
+                List<Long> list = tradeVos.stream().map(TradeVo::getId).toList();
+                List<Long> longs = separateAndRotate(list, orderId);
+                redisTemplate.opsForList().rightPushAll(key, longs);
+                redisTemplate.expire(key, 24, TimeUnit.HOURS);
+            }
+
+        } else {
+            orderId = (Long) redisTemplate.opsForList().leftPop(key);
+            if (Objects.isNull(orderId)) {
+                throw new BusinessException("已审核完成");
+            }
+        }
+
+        OrderDetailRes order = BeanUtil.copyProperties(kwoTradeOrderService.detail(orderId), OrderDetailRes.class);
+
+        if (Objects.nonNull(order)) {
+            return order;
+        }
+        throw new BusinessException("未找到贸易订单");
+    }
+
+    @Override
+    public BuyDto countBuy(CountPara countPara) {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        List<BuyVo> saleVos = kwoTradeOrderMapper.countBuy(countPara, ids);
+        if (CollUtil.isEmpty(saleVos)) {
+            saleVos = new ArrayList<>();
+        }
+
+        BuyDto jsonObject = new BuyDto();
+        List<String> two = new ArrayList<>();
+        List<BigDecimal> three = new ArrayList<>();
+        for (BuyVo saleVo : saleVos) {
+            two.add(saleVo.getFirmName());
+            three.add(Objects.nonNull(saleVo.getPrice()) ? saleVo.getPrice().divide(new BigDecimal("10000"), RoundingMode.HALF_UP) : new BigDecimal("0"));
+        }
+
+        jsonObject.setFirm(two);
+        jsonObject.setAmount(three);
+
+        return jsonObject;
+    }
+
+    @Override
+    public GoodsDto countGoods(CountPara countPara) {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        List<GoodsVo> goodsVos = kwoTradeOrderMapper.countGoods(countPara, ids);
+        if (CollUtil.isEmpty(goodsVos)) {
+            goodsVos = new ArrayList<>();
+        }
+        Map<Long, GoodsDetails> map = new HashMap<>();
+        List<Long> collect = goodsVos.stream().map(GoodsVo::getGoodsId).distinct().toList();
+        for (Long aLong : collect) {
+            GoodsDetails detailById = goodsInfoService.getDetail(aLong);
+            if (Objects.nonNull(detailById)) {
+                map.put(aLong, detailById);
+            }
+        }
+        GoodsDto jsonObject = new GoodsDto();
+        List<String> two = new ArrayList<>();
+        List<BigDecimal> three = new ArrayList<>();
+        for (GoodsVo saleVo : goodsVos) {
+            two.add(saleVo.getGoodsName() + (Objects.nonNull(map.get(saleVo.getGoodsId())) ? map.get(saleVo.getGoodsId()).getSpecLabel() : ""));
+            three.add(Objects.nonNull(saleVo.getAmount()) ? saleVo.getAmount().divide(new BigDecimal("10000"), RoundingMode.HALF_UP) : new BigDecimal("0"));
+        }
+
+        jsonObject.setGoodsName(two);
+        jsonObject.setAmount(three);
+
+        return jsonObject;
+    }
+
     @Override
     public List<OrderSaleVo> queryRecentSale(LocalDateTime start, LocalDateTime end) {
         return kwoTradeOrderService.queryRecentSale(start, end);

+ 166 - 4
sckw-modules/sckw-order/src/main/resources/mapper/KwoTradeOrderMapper.xml

@@ -715,7 +715,6 @@
     </select>
 
 
-
     <select id="querySaleOrder" resultType="com.sckw.order.api.model.OrderSaleVo">
         select ktog.goods_id,
                sum(ifnull(kto.amount, 0)) as amount
@@ -759,12 +758,12 @@
             <if test="para.entId != null and para.entId.size() > 0">
                 <if test="para.type != null and para.type == 1">
                     and
-                    e.ent_id in
+                        e.ent_id in
                     <foreach collection="para.entId" item="item" open="(" close=")" separator=",">
-                    #{item}
+                        #{item}
                     </foreach>
                 </if>
-                <if test="para.type != null and para.type ==2">
+                <if test="para.type != null and para.type == 2">
                     and d.ent_id in
                     <foreach collection="para.entId" item="item" open="(" close=")" separator=",">
                         #{item}
@@ -774,4 +773,167 @@
             limit 10
         </where>
     </select>
+
+    <select id="queryCount" resultType="java.lang.Long">
+        select count(1)
+        from kwo_trade_order kto
+                 inner JOIN kwo_trade_order_unit d ON kto.id = d.t_order_id AND d.unit_type = '2' AND d.del_flag = 0
+        <where>
+            kto.del_flag = 0
+              and kto.status = 1
+            <if test="ids != null and ids.size() != 0">
+                and d.ent_id in
+                <foreach collection="ids" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+    </select>
+
+    <select id="queryList" resultType="com.sckw.order.api.model.TradeVo">
+        select kto.id,
+               kto.create_time,
+               kto.status,
+               kto.amount,
+               ktog.unit_price,
+               ktog.goods_name,
+               kto.t_order_no,
+               c.firm_name
+        from kwo_trade_order kto
+                 inner JOIN kwo_trade_order_unit d ON kto.id = d.t_order_id AND d.unit_type = '2' AND d.del_flag = 0
+                 inner JOIN kwo_trade_order_unit c ON kto.id = c.t_order_id AND c.unit_type = '1' AND c.del_flag = 0
+                 inner join kwo_trade_order_goods ktog on kto.id = ktog.t_order_id and ktog.del_flag = 0
+        <where>
+            kto.del_flag = 0
+              and kto.status = 1
+            <if test="ids != null and ids.size() != 0">
+                and d.ent_id in
+                <foreach collection="ids" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+            order by kto.create_time desc
+            <if test="all != null and all">
+                limit 10
+            </if>
+        </where>
+    </select>
+
+    <select id="countList" resultType="com.sckw.order.api.model.TradeSaleVo">
+        select ktog.goods_id,
+               CONCAT(
+                       LPAD(HOUR(kto.create_time), 2, '0'),
+                       ':00-',
+                       LPAD(MOD(HOUR(kto.create_time) + 1, 24), 2, '0'),
+                       ':00'
+                   ) AS time_period,
+               sum(kto.amount)
+        from kwo_trade_order kto
+                 inner JOIN kwo_trade_order_unit d ON kto.id = d.t_order_id AND d.unit_type = '2' AND d.del_flag = 0
+                 inner JOIN kwo_trade_order_unit c ON kto.id = c.t_order_id AND c.unit_type = '1' AND c.del_flag = 0
+                 inner join kwo_trade_order_goods ktog on kto.id = ktog.t_order_id and ktog.del_flag = 0
+        <where>
+            kto.del_flag = 0
+              and kto.status in (1, 2, 3, 4)
+            <if test="ids != null and ids.size() != 0">
+                and d.ent_id in
+                <foreach collection="ids" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+            and kto.create_time between #{para.startTime} and #{para.endTime}
+            group by time_period, ktog.goods_id
+            order by time_period
+        </where>
+    </select>
+
+    <select id="countSale" resultType="com.sckw.order.api.model.SaleVo">
+        select DATE_FORMAT(kto.create_time, '%Y-%m-%d') as order_day,
+               count(kto.id)                               count,
+               sum(kto.price)                           as price
+        from kwo_trade_order kto
+                 inner JOIN kwo_trade_order_unit d
+                            ON kto.id = d.t_order_id AND d.unit_type = '2' AND d.del_flag = 0
+                 inner JOIN kwo_trade_order_unit c ON kto.id = c.t_order_id AND c.unit_type = '1' AND c.del_flag = 0
+        <where>
+            kto.del_flag = 0
+              and kto.status in (1, 2, 3, 4)
+            <if test="ids != null and ids.size() != 0">
+                and d.ent_id in
+                <foreach collection="ids" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+            and kto.create_time between #{para.startTime}
+                and #{para.endTime}
+            group by order_day
+        </where>
+    </select>
+
+    <select id="countBuy" resultType="com.sckw.order.api.model.BuyVo">
+        select sum(kto.price) as price,
+               c.firm_name,
+               c.ent_id
+        from kwo_trade_order kto
+                 inner JOIN kwo_trade_order_unit d
+                            ON kto.id = d.t_order_id AND d.unit_type = '2' AND d.del_flag = 0
+                 inner JOIN kwo_trade_order_unit c ON kto.id = c.t_order_id AND c.unit_type = '1' AND c.del_flag = 0
+        <where>
+            kto.del_flag = 0
+              and kto.status in (1, 2, 3, 4)
+            <if test="ids != null and ids.size() != 0">
+                and d.ent_id in
+                <foreach collection="ids" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+            and kto.create_time between #{para.startTime}
+                and #{para.endTime}
+            group by c.ent_id, c.firm_name
+            order by price desc
+            limit 5
+        </where>
+    </select>
+
+    <select id="countGoods" resultType="com.sckw.order.api.model.GoodsVo">
+        select sum(kto.amount), ktog.goods_name, ktog.goods_id
+        from kwo_trade_order kto
+                 inner JOIN kwo_trade_order_unit d ON kto.id = d.t_order_id AND d.unit_type = '2' AND d.del_flag = 0
+                 inner join kwo_trade_order_goods ktog on kto.id = ktog.t_order_id and ktog.del_flag = 0
+        <where>
+            kto.del_flag = 0
+              and kto.status in (1, 2, 3, 4)
+            <if test="ids != null and ids.size() != 0">
+                and d.ent_id in
+                <foreach collection="ids" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+            and kto.create_time between #{para.startTime} and #{para.endTime}
+            group by ktog.goods_name, ktog.goods_id
+        </where>
+    </select>
+
+    <select id="buyRank" resultType="com.sckw.order.api.model.TradeBuyVo">
+        select sum(kto.amount) as amount,
+               c.firm_name     as firmName
+        from kwo_trade_order kto
+                 inner JOIN kwo_trade_order_unit d ON kto.id = d.t_order_id AND d.unit_type = '2' AND d.del_flag = 0
+                 inner JOIN kwo_trade_order_unit c ON kto.id = c.t_order_id AND c.unit_type = '1' AND c.del_flag = 0
+                 inner join kwo_trade_order_goods ktog on kto.id = ktog.t_order_id and ktog.del_flag = 0
+        <where>
+            kto.del_flag = 0
+              and kto.status in (1, 2, 3, 4)
+            <if test="ids != null and ids.size() != 0">
+                and d.ent_id in
+                <foreach collection="ids" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+            and kto.create_time between #{para.startTime} and #{para.endTime}
+            group by c.ent_id, c.firm_name
+            order by amount desc
+            limit 5
+        </where>
+    </select>
 </mapper>

+ 6 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/dubbo/GoodsInfoServiceImpl.java

@@ -9,6 +9,7 @@ import com.sckw.core.web.response.HttpResult;
 import com.sckw.product.api.dubbo.GoodsInfoService;
 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 com.sckw.product.dao.KwpGoodsAddressMapper;
 import com.sckw.product.model.KwpGoodsAddress;
@@ -45,6 +46,11 @@ public class GoodsInfoServiceImpl implements GoodsInfoService {
     @Autowired
     private KwpGoodsAddressMapper kwpGoodsAddressMapper;
 
+    @Override
+    public GoodsDetails getDetail(Long id) {
+        return kwpGoodsService.getDetails(id);
+    }
+
     @Override
     public GoodsDetail getDetailById(Long id) {
         return BeanUtils.copyProperties(kwpGoodsService.detail(id), GoodsDetail.class);

+ 37 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java

@@ -33,6 +33,7 @@ import com.sckw.payment.api.dubbo.PayCenterDubboService;
 import com.sckw.payment.api.model.constant.ChannelEnum;
 import com.sckw.payment.api.model.dto.WalletDto;
 import com.sckw.payment.api.model.dto.common.R;
+import com.sckw.product.api.model.GoodsDetails;
 import com.sckw.product.api.model.GoodsNumStsParam;
 import com.sckw.product.dao.KwpGoodsMapper;
 import com.sckw.product.dao.KwpGoodsViewLogMapper;
@@ -1632,4 +1633,40 @@ public class KwpGoodsService {
     }
 
 
+    public GoodsDetails getDetails(Long id) {
+        KwpGoods goods = kwpGoodsMapper.selectById(id);
+        if (Objects.isNull(goods)) {
+            throw new BusinessException("当前商品不存在!");
+        }
+        GoodsDetails detail = BeanUtils.copyProperties(goods, GoodsDetails.class);
+
+        Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(List.of(DictTypeEnum.PRODUCT_NAME_TYPE.getType(),
+                DictTypeEnum.UNIT_TYPE.getType(),
+                DictTypeEnum.TAX_RATE.getType(),
+                DictTypeEnum.GOODS_STATUS.getType(),
+                DictTypeEnum.ADDRESS_TYPE.getType(),
+                DictTypeEnum.GOODS_SPEC.getType()
+        ));
+        Map<String, String> productNameMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        Map<String, String> unitMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        Map<String, String> goodsStatusMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        Map<String, String> goodsSpecMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        if (CollectionUtils.isNotEmpty(dict)) {
+            productNameMap = dict.get(DictTypeEnum.PRODUCT_NAME_TYPE.getType());
+            unitMap = dict.get(DictTypeEnum.UNIT_TYPE.getType());
+            goodsStatusMap = dict.get(DictTypeEnum.GOODS_STATUS.getType());
+            goodsSpecMap = dict.get(DictTypeEnum.GOODS_SPEC.getType());
+        }
+        List<SysDictResDto> types = remoteSystemService.queryDictFrontAll(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), detail.getGoodsType());
+        if (CollectionUtils.isNotEmpty(types)) {
+            detail.setGoodsTypes(types.stream().map(SysDictResDto::getValue).toList())
+                    .setGoodsTypeLabels(String.join(Global.RIGHT_SLASH, types.stream().map(SysDictResDto::getLabel).toList()));
+        }
+        detail.setGoodsTypeLabel(CollectionUtils.isNotEmpty(productNameMap) ? productNameMap.get(detail.getGoodsType()) : null)
+                .setUnitLabel(CollectionUtils.isNotEmpty(unitMap) ? unitMap.get(detail.getUnit()) : null)
+                .setStatusLabel(CollectionUtils.isNotEmpty(goodsStatusMap) ? goodsStatusMap.get(String.valueOf(detail.getStatus())) : null)
+                .setSpecLabel(CollectionUtils.isNotEmpty(goodsSpecMap) ? goodsSpecMap.get(String.valueOf(detail.getSpec())) : null);
+
+        return null;
+    }
 }

+ 161 - 0
sckw-modules/sckw-report/src/main/java/com/sckw/report/controller/HomeController.java

@@ -0,0 +1,161 @@
+package com.sckw.report.controller;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.StrUtil;
+import com.sckw.contract.api.model.dto.req.ContractAuditPara;
+import com.sckw.contract.api.model.dto.res.ContractDetailRespVo;
+import com.sckw.contract.api.model.dto.res.LogisticDetailRespVo;
+import com.sckw.contract.api.model.vo.ContractVo;
+import com.sckw.core.web.response.BaseResult;
+import com.sckw.order.api.model.*;
+import com.sckw.report.service.KwHomeService;
+import com.sckw.report.service.vo.OperationCountVo;
+import com.sckw.transport.api.model.vo.LogisticsDto;
+import com.sckw.transport.api.model.param.LogisticsOrderAuditPara;
+import com.sckw.transport.api.model.vo.LogisticsVo;
+import com.sckw.transport.api.model.vo.WaybillOrderDetailVo;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+
+@AllArgsConstructor
+@RestController
+@RequestMapping("/kwHome")
+@Tag(name = "供应商首页", description = "供应商首页")
+public class HomeController {
+
+    private final KwHomeService kwHomeService;
+
+    @GetMapping("/operationCount")
+    @Operation(summary = "运营-运营统计", description = "运营统计")
+    public BaseResult<OperationCountVo> operationCount() {
+        return BaseResult.success(kwHomeService.operationCount());
+    }
+
+
+    @GetMapping("/operationTradeContract")
+    @Operation(summary = "运营-列表贸易合同", description = "运营数据列表贸易合同")
+    public BaseResult<List<ContractVo>> operationTradeContract() {
+        return BaseResult.success(kwHomeService.operationTradeContract());
+    }
+
+    @GetMapping("/operationLogisticsContract")
+    @Operation(summary = "运营-列表物流合同", description = "运营数据列表物流合同")
+    public BaseResult<List<ContractVo>> operationLogisticsContract() {
+        return BaseResult.success(kwHomeService.operationLogisticsContract());
+    }
+
+    @GetMapping("/operationTradeOrder")
+    @Operation(summary = "运营-列表贸易订单", description = "运营数据列表贸易订单")
+    public BaseResult<List<TradeVo>> operationTradeOrder() {
+        return BaseResult.success(kwHomeService.operationTradeOrder());
+    }
+
+    @GetMapping("/operationLogisticsWaybill")
+    @Operation(summary = "运营-列表物流运单", description = "运营数据列表物流运单")
+    public BaseResult<List<LogisticsVo>> operationLogisticsWaybill() {
+        return BaseResult.success(kwHomeService.operationLogisticsOrder());
+    }
+
+    //连续审核贸易合同
+    // kwcSale/queryContractDetail-贸易合同详情
+    @PostMapping("/auditTradeContract")
+    @Operation(summary = "运营-贸易合同审核", description = "勾选连续审核时,操作通过或拒绝之后,拿着上次的合同id再次调用这个接口。有下一个待审核的合同时,返回详情。如果没有,将返回业务异常。")
+    public BaseResult<ContractDetailRespVo> auditTradeContract(@RequestBody @Valid ContractAuditPara contractAuditPara) {
+        return BaseResult.success(kwHomeService.auditTradeContract(contractAuditPara));
+    }
+
+    // kwcSale/queryContractDetail-贸易合同详情
+    @PostMapping("/signTradeContract")
+    @Operation(summary = "运营-贸易合同签约", description = "")
+    public BaseResult<ContractDetailRespVo> signTradeContract(@RequestBody @Valid ContractAuditPara contractAuditPara) {
+        return BaseResult.success(kwHomeService.signTradeContract(contractAuditPara));
+    }
+
+    //logisticsContract/queryLogisticsContractDetail
+    @PostMapping("/signLogisticsContract")
+    @Operation(summary = "运营-物流合同签约", description = "物流合同签约")
+    public BaseResult<LogisticDetailRespVo> signLogisticsContract(@RequestBody @Valid ContractAuditPara contractAuditPara) {
+        return BaseResult.success(kwHomeService.signLogisticsContract(contractAuditPara));
+    }
+
+    //kwoTradeOrder/detail
+    @PostMapping("/auditTradeOrder")
+    @Operation(summary = "运营-贸易订单审核", description = "贸易订单审核")
+    public BaseResult<OrderDetailRes> auditTradeOrder(@RequestBody @Valid TradeOrderAuditPara para) {
+        return BaseResult.success(kwHomeService.auditTradeOrder(para));
+    }
+
+    //kwtWaybillOrder/queryBillOrderDetail
+    @PostMapping("/auditLogisticsTask")
+    @Operation(summary = "运营-物流运单审核", description = "物流运单审核")
+    public BaseResult<WaybillOrderDetailVo> auditLogisticsTask(@RequestBody @Valid LogisticsOrderAuditPara para) {
+        return BaseResult.success(kwHomeService.auditLogisticsTask(para));
+    }
+
+    private void fillDefault(CountPara countPara) {
+        if (StrUtil.isBlank(countPara.getStartTime()) && StrUtil.isBlank(countPara.getEndTime())) {
+            LocalDateTime start = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()).minusDays(7);
+            LocalDateTime end = LocalDateTimeUtil.endOfDay(LocalDateTime.now());
+
+            countPara.setStartTime(LocalDateTimeUtil.formatNormal(start));
+            countPara.setEndTime(LocalDateTimeUtil.formatNormal(end));
+        }
+    }
+
+    @PostMapping("/countSale")
+    @Operation(summary = "数据统计-销量", description = "数据统计-销量")
+    public BaseResult<SaleDto> countSale(@RequestBody CountPara countPara) {
+        fillDefault(countPara);
+        return BaseResult.success(kwHomeService.countSale(countPara));
+    }
+
+    @PostMapping("/countBuy")
+    @Operation(summary = "数据统计-采购商", description = "数据统计-采购商")
+    public BaseResult<BuyDto> countBuy(@RequestBody CountPara countPara) {
+        fillDefault(countPara);
+        return BaseResult.success(kwHomeService.countBuy(countPara));
+    }
+
+    @PostMapping("/countLogistics")
+    @Operation(summary = "数据统计-物流", description = "数据统计-物流")
+    public BaseResult countLogistics(@RequestBody CountPara countPara) {
+        fillDefault(countPara);
+        return BaseResult.success(kwHomeService.countLogistics(countPara));
+    }
+
+    @PostMapping("/countGoods")
+    @Operation(summary = "数据统计-商品", description = "数据统计-商品")
+    public BaseResult<GoodsDto> countGoods(@RequestBody CountPara countPara) {
+        fillDefault(countPara);
+        return BaseResult.success(kwHomeService.countGoods(countPara));
+    }
+
+    //实时销量
+    @GetMapping("/timeSale")
+    @Operation(summary = "实时销量", description = "实时销量")
+    public BaseResult<TimeSaleDto> timeSale() {
+        return BaseResult.success(kwHomeService.timeSale());
+    }
+
+    //采购量排行
+    @GetMapping("/buyRank")
+    @Operation(summary = "采购量排行", description = "采购量排行")
+    public BaseResult<RankDto> buyRank() {
+        return BaseResult.success(kwHomeService.buyRank());
+    }
+
+    //物流排行
+    @GetMapping("/logisticsRank")
+    @Operation(summary = "物流排行", description = "物流排行")
+    public BaseResult<LogisticsDto> logisticsRank() {
+        return BaseResult.success(kwHomeService.logisticsRank());
+    }
+
+}

+ 138 - 0
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwHomeService.java

@@ -0,0 +1,138 @@
+package com.sckw.report.service;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import com.sckw.contract.api.RemoteContractService;
+import com.sckw.contract.api.model.dto.req.ContractAuditPara;
+import com.sckw.contract.api.model.dto.res.ContractDetailRespVo;
+import com.sckw.contract.api.model.dto.res.LogisticDetailRespVo;
+import com.sckw.contract.api.model.vo.ContractCountVo;
+import com.sckw.contract.api.model.vo.ContractVo;
+import com.sckw.core.utils.BeanUtils;
+import com.sckw.order.api.dubbo.TradeOrderInfoService;
+import com.sckw.order.api.model.*;
+import com.sckw.report.service.vo.OperationCountVo;
+import com.sckw.system.api.RemoteSystemService;
+import com.sckw.transport.api.dubbo.TransportRemoteService;
+import com.sckw.transport.api.model.vo.LogisticsDto;
+import com.sckw.transport.api.model.param.LogisticsOrderAuditPara;
+import com.sckw.transport.api.model.param.TimePara;
+import com.sckw.transport.api.model.vo.CountPara2;
+import com.sckw.transport.api.model.vo.LogisticsVo;
+import com.sckw.transport.api.model.vo.WaybillOrderDetailVo;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author zk
+ * @desc 订单服务
+ * @date 2023/7/10 0010
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class KwHomeService {
+
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private RemoteSystemService remoteSystemService;
+
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 80000)
+    private RemoteContractService remoteContractService;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 80000)
+    private TradeOrderInfoService tradeOrderInfoService;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 80000)
+    private TransportRemoteService transportRemoteService;
+
+    /**
+     * 运营统计
+     *
+     * @return
+     */
+    public OperationCountVo operationCount() {
+        ContractCountVo contractCountVo = remoteContractService.contractCount();
+        Long aLong = tradeOrderInfoService.orderCount();
+        Long aLong1 = transportRemoteService.queryCount();
+        return new OperationCountVo(contractCountVo.getTradeContractCount(), contractCountVo.getLogisticsContractCount(), aLong, aLong1, 0L);
+    }
+
+
+    public List<ContractVo> operationTradeContract() {
+        return remoteContractService.tradeList();
+    }
+
+    public List<ContractVo> operationLogisticsContract() {
+        return remoteContractService.logisticsList();
+    }
+
+    public List<TradeVo> operationTradeOrder() {
+        return tradeOrderInfoService.tradeList();
+    }
+
+    public List<LogisticsVo> operationLogisticsOrder() {
+        return transportRemoteService.logisticsList();
+    }
+
+    public SaleDto countSale(CountPara countPara) {
+        return tradeOrderInfoService.countSale(countPara);
+    }
+
+    public BuyDto countBuy(CountPara countPara) {
+        return tradeOrderInfoService.countBuy(countPara);
+    }
+
+    public Object countLogistics(CountPara countPara) {
+        return transportRemoteService.countLogistics(BeanUtils.toBean(countPara, CountPara2.class));
+    }
+
+    public GoodsDto countGoods(CountPara countPara) {
+        return tradeOrderInfoService.countGoods(countPara);
+    }
+
+    public TimeSaleDto timeSale() {
+        CountPara countPara = new CountPara();
+        LocalDateTime localDateTime = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
+        countPara.setStartTime(LocalDateTimeUtil.formatNormal(localDateTime));
+        countPara.setEndTime(LocalDateTimeUtil.formatNormal(LocalDateTime.now()));
+        return tradeOrderInfoService.timeSale(countPara);
+    }
+
+    public RankDto buyRank() {
+        CountPara countPara = new CountPara();
+        LocalDateTime localDateTime = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
+        countPara.setStartTime(LocalDateTimeUtil.formatNormal(localDateTime));
+        countPara.setEndTime(LocalDateTimeUtil.formatNormal(LocalDateTime.now()));
+        return tradeOrderInfoService.buyRank(countPara);
+    }
+
+    public LogisticsDto logisticsRank() {
+        TimePara timePara = new TimePara();
+        LocalDateTime localDateTime = LocalDateTimeUtil.beginOfDay(LocalDateTime.now());
+        timePara.setStartTime(LocalDateTimeUtil.formatNormal(localDateTime));
+        timePara.setEndTime(LocalDateTimeUtil.formatNormal(LocalDateTime.now()));
+        return transportRemoteService.logisticsRank(timePara);
+    }
+
+    public ContractDetailRespVo auditTradeContract(ContractAuditPara contractAuditPara) {
+        return remoteContractService.auditTradeContract(contractAuditPara);
+    }
+
+    public ContractDetailRespVo signTradeContract(ContractAuditPara contractAuditPara) {
+        return remoteContractService.signTradeContract(contractAuditPara);
+    }
+
+    public LogisticDetailRespVo signLogisticsContract(ContractAuditPara contractAuditPara) {
+        return remoteContractService.signLogisticsContract(contractAuditPara);
+    }
+
+    public OrderDetailRes auditTradeOrder(TradeOrderAuditPara para) {
+        return tradeOrderInfoService.auditTradeOrder(para);
+    }
+
+    public WaybillOrderDetailVo auditLogisticsTask(LogisticsOrderAuditPara para) {
+        return transportRemoteService.auditLogisticsTask(para);
+    }
+}

+ 31 - 0
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/vo/OperationCountVo.java

@@ -0,0 +1,31 @@
+package com.sckw.report.service.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:34:54
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "运营统计数据")
+public class OperationCountVo implements Serializable {
+    @Schema(description = "贸易合同统计数据")
+    private Long tradeContractCount;
+    @Schema(description = "物流合同统计数据")
+    private Long logisticsContractCount;
+    @Schema(description = "贸易订单统计数据")
+    private Long tradeOrderCount;
+    @Schema(description = "物流订单统计数据")
+    private Long logisticsOrderCount;
+    @Schema(description = "其它")
+    private Long other;
+}

+ 29 - 0
sckw-modules/sckw-report/src/main/resources/bootstrap-local.yml

@@ -0,0 +1,29 @@
+spring:
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+        server-addr: @nacos.server@
+        # 命名空间
+        namespace: @nacos.namespace@
+        # 共享配置
+        group: sckw-ng-service-platform
+      config:
+        # 配置中心地址
+        server-addr: @nacos.server@
+        # 命名空间
+        namespace: @nacos.namespace@
+        # 共享配置
+        group: sckw-ng-service-platform
+        # 配置文件格式
+        file-extension: yaml
+        shared-configs:
+          - data-id: sckw-common.yml
+            group: sckw-ng-common
+            refresh: true
+
+        #可以读多个配置文件 需要在同一个命名空间下面可以是不同的组
+        extension-configs:
+          - dataId: sckw-common.yml
+            group: sckw-ng-service-platform
+            refresh: true

+ 15 - 1
sckw-modules/sckw-system/pom.xml

@@ -77,6 +77,11 @@
             <version>${basic.version}</version>
 <!--            <version>1.0.0</version>-->
         </dependency>
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-ai-api</artifactId>
+            <version>${basic.version}</version>
+        </dependency>
         <dependency>
             <groupId>com.sckw</groupId>
             <artifactId>sckw-transport-api</artifactId>
@@ -97,6 +102,15 @@
             <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
             <version>4.5.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-contract-api</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-order-api</artifactId>
+        </dependency>
 
     </dependencies>
     <build>
@@ -117,4 +131,4 @@
             </plugin>
         </plugins>
     </build>
-</project>
+</project>

+ 15 - 5
sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsMenuController.java

@@ -5,17 +5,21 @@ import com.sckw.core.web.response.HttpResult;
 import com.sckw.system.model.KwsMenu;
 import com.sckw.system.model.vo.req.*;
 import com.sckw.system.service.KwsMenuService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.validation.Valid;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 /**
  * 菜单
+ *
  * @author zk
  * @date 2023-05-31
  */
 @RestController
 @RequestMapping("/kwsMenu")
+@Tag(name = "菜单管理", description = "菜单管理")
 public class KwsMenuController {
 
     @Autowired
@@ -45,6 +49,12 @@ public class KwsMenuController {
         return HttpResult.ok(kwsMenuService.findTree(reqVo));
     }
 
+    @PostMapping("/list")
+    @Operation(summary = "导航首页统计")
+    public HttpResult list(@RequestBody @Valid FindMenuTreeReqVo reqVo) {
+        return HttpResult.ok(kwsMenuService.list(reqVo));
+    }
+
     /**
      * @param params {clientType:终端类型、parentId:父级id、name:菜单名称、url:跳转地址、perms:权限标识、
      *               type:类型:0目录/1菜单/2按钮、icon:图标、sort:排序、level:层级、custom:是否定制、
@@ -88,7 +98,7 @@ public class KwsMenuController {
     }
 
     /**
-     * @param  reqVo 菜单ID多个用","隔开
+     * @param reqVo 菜单ID多个用","隔开
      * @return HttpResult
      * @desc: 角色分配菜单
      * @author: czh
@@ -101,7 +111,7 @@ public class KwsMenuController {
     }
 
     /**
-     * @param  reqVo 入参
+     * @param reqVo 入参
      * @return HttpResult
      * @desc: 移动菜单
      * @author: czh
@@ -114,7 +124,7 @@ public class KwsMenuController {
     }
 
     /**
-     * @param  reqVo 入参
+     * @param reqVo 入参
      * @return HttpResult
      * @desc: 查子菜单
      * @author: czh
@@ -126,7 +136,7 @@ public class KwsMenuController {
     }
 
     /**
-     * @param  reqVo 入参
+     * @param reqVo 入参
      * @return HttpResult
      * @desc: 保存映射关系
      * @author: czh
@@ -139,7 +149,7 @@ public class KwsMenuController {
     }
 
     /**
-     * @param  reqVo 入参
+     * @param reqVo 入参
      * @return HttpResult
      * @desc: 根据菜单查映射关系
      * @author: czh

+ 5 - 4
sckw-modules/sckw-system/src/main/java/com/sckw/system/dubbo/RemoteBaseService.java

@@ -7,7 +7,6 @@ import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.system.api.model.dto.res.*;
-import com.sckw.system.api.model.pojo.DeptInfoPojo;
 import com.sckw.system.dao.KwsAuthorityDao;
 import com.sckw.system.dao.KwsEntDeptDao;
 import com.sckw.system.dao.KwsEntTypeDao;
@@ -15,10 +14,12 @@ import com.sckw.system.dao.KwsEnterpriseDao;
 import com.sckw.system.model.*;
 import com.sckw.system.model.pojo.FindManagePojo;
 import com.sckw.system.model.vo.res.CertificateResVo;
-import com.sckw.system.model.vo.res.KwsDeptResVo;
 import com.sckw.system.model.vo.res.KwsUserResVo;
 import com.sckw.system.repository.KwsEnterpriseRepository;
-import com.sckw.system.service.*;
+import com.sckw.system.service.KwsEnterpriseService;
+import com.sckw.system.service.KwsRoleService;
+import com.sckw.system.service.KwsSpecialService;
+import com.sckw.system.service.KwsUserService;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 
@@ -332,7 +333,7 @@ public class RemoteBaseService {
     public PageDataResult<KwsEnterpriseResDto> pageEnt(int pageNum, int pageSize, Long entId) {
         IPage<KwsEnterprise> kwsEnterprisePage = kwsEnterpriseReposiory.pageEnt(pageNum, pageSize, entId);
         List<KwsEnterprise> records = kwsEnterprisePage.getRecords();
-        if (CollectionUtils.isEmpty(records)){
+        if (CollectionUtils.isEmpty(records)) {
             return new PageDataResult<>();
         }
         List<KwsEnterpriseResDto> enterpriseResDtoList = records.stream().map(RemoteBaseService::getKwsEnterpriseResDto).collect(Collectors.toList());

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

@@ -10,10 +10,6 @@ import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.EntTypeEnum;
 import com.sckw.core.utils.*;
-import com.sckw.core.utils.BeanUtils;
-import com.sckw.core.utils.CollectionUtils;
-import com.sckw.core.utils.FileUtils;
-import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.redis.utils.RedissonUtils;
 import com.sckw.system.api.RemoteSystemService;

+ 4 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/FindMenuTreeReqVo.java

@@ -1,5 +1,7 @@
 package com.sckw.system.model.vo.req;
 
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 
 import java.io.Serial;
@@ -19,6 +21,8 @@ public class FindMenuTreeReqVo implements Serializable {
     /**
      * 客户端类型 3-app端菜单,平台运营端需要查询
      */
+    @NotBlank(message = "客户端类型不能为空")
+    @Schema(description = "客户端类型")
     private String clientType;
 
     /**

+ 4 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/FindMenuTreeResVo.java

@@ -2,6 +2,7 @@ package com.sckw.system.model.vo.res;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.sckw.core.utils.LongToStringUtils;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.io.Serial;
@@ -15,6 +16,7 @@ import java.util.List;
  * @date 2023/7/10
  */
 @Data
+@Schema(description = "菜单数据")
 public class FindMenuTreeResVo implements Serializable {
 
     @Serial
@@ -132,6 +134,8 @@ public class FindMenuTreeResVo implements Serializable {
      * PC端适用企业类型(1供应商,2采购商,34PL物流,43PL物流)
      */
     private String usingRoles;
+    @Schema(description = "统计")
+    private Long count;
 
     /**
      * 子菜单

+ 32 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/MenuTreeCountResVo.java

@@ -0,0 +1,32 @@
+package com.sckw.system.model.vo.res;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author czh
+ * @desc 菜单树
+ * @date 2023/7/10
+ */
+@Schema(description = "导航首页菜单数据")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class MenuTreeCountResVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 6849124104398557126L;
+
+    @Schema(description = "导航首页待处理总数")
+    private Long count;
+
+    @Schema(description = "导航首页菜单")
+    private List<FindMenuTreeResVo> menu;
+
+}

+ 114 - 7
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsMenuService.java

@@ -1,14 +1,12 @@
 package com.sckw.system.service;
 
-import java.util.Date;
-
-import java.util.*;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.sckw.contract.api.RemoteContractService;
 import com.sckw.core.exception.SystemException;
 import com.sckw.core.model.constant.Global;
+import com.sckw.core.model.enums.ApprovalEnum;
 import com.sckw.core.model.enums.ClientTypeEnum;
 import com.sckw.core.model.enums.MenuTypeEnum;
 import com.sckw.core.model.enums.SystemTypeEnum;
@@ -18,16 +16,24 @@ import com.sckw.core.utils.IdWorker;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.system.dao.*;
 import com.sckw.system.model.*;
+import com.sckw.system.model.pojo.FindEntListPojo;
 import com.sckw.system.model.pojo.FindMenuTreePojo;
+import com.sckw.system.model.pojo.FindPojoParam;
 import com.sckw.system.model.vo.req.*;
 import com.sckw.system.model.vo.res.*;
-import net.sf.jsqlparser.expression.CollateExpression;
+import com.sckw.transport.api.dubbo.TransportRemoteService;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
 /**
  * 菜单service接口
  *
@@ -57,6 +63,12 @@ public class KwsMenuService {
 
     @Autowired
     KwsEntTypeDao kwsEntTypeDao;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
+    private RemoteContractService remoteContractService;
+    @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;
 
     /**
      * @param params 实体
@@ -557,4 +569,99 @@ public class KwsMenuService {
     public List<Long> test(String ids) {
         return getAllMenus(StringUtils.splitStrToList(ids, Long.class), new ArrayList<>());
     }
+
+    /**
+     * 查询
+     *
+     * @param reqVo
+     * @return
+     */
+    public MenuTreeCountResVo list(FindMenuTreeReqVo reqVo) {
+        List<FindMenuTreeResVo> tree = findTree(reqVo);
+        long total = 0L;
+        for (FindMenuTreeResVo findMenuTreeResVo : tree) {
+            //平台运营端
+            if (StrUtil.equals(findMenuTreeResVo.getName(), "企业客户")) {
+                long sum = 0L;
+                List<FindMenuTreeResVo> children = findMenuTreeResVo.getChildren();
+                for (FindMenuTreeResVo child : children) {
+                    if (StrUtil.equals(child.getName(), "入驻认证")) {
+                        List<Long> authEntIdList = Objects.equals(LoginUserHolder.getSystemType(), SystemTypeEnum.MANAGE.getCode()) ? new ArrayList<>() : LoginUserHolder.getAuthEntIdList();
+                        List<FindEntListPojo> list = kwsEnterpriseDao.findPojoAndManager(new FindPojoParam(), authEntIdList);
+                        Map<Integer, List<FindEntListPojo>> collect = list.stream().collect(Collectors.groupingBy(FindEntListPojo::getApproval));
+                        List<FindEntListPojo> a = collect.get(ApprovalEnum.PROCESS.getCode());
+                        List<FindEntListPojo> b = collect.get(ApprovalEnum.REFRESH.getCode());
+                        child.setCount((CollUtil.isNotEmpty(a) ? a.size() : 0L) + (CollUtil.isNotEmpty(b) ? b.size() : 0L));
+                        sum = sum + child.getCount();
+                        total = total+ child.getCount();
+                    }
+                }
+                findMenuTreeResVo.setCount(sum);
+                continue;
+            }
+            //企业管理端
+            if (StrUtil.equals(findMenuTreeResVo.getName(), "合同管理")) {
+                List<FindMenuTreeResVo> children = findMenuTreeResVo.getChildren();
+                long sum = 0L;
+                if (CollUtil.isNotEmpty(children)) {
+                    for (FindMenuTreeResVo child : children) {
+                        if (StrUtil.equals(child.getName(), "贸易合同") && hasPerm(child.getChildren(), "tradeContract:sign")) {
+                            Long aLong = remoteContractService.queryTradeCount();
+                            child.setCount(aLong);
+                            sum = sum + aLong;
+                            total = total+ aLong;
+                            continue;
+                        }
+                        if (StrUtil.equals(child.getName(), "物流合同") && hasPerm(child.getChildren(), "logisticsContract:sign")) {
+                            Long aLong = remoteContractService.queryLogisticsCount();
+                            child.setCount(aLong);
+                            sum = sum + aLong;
+                            total = total+ aLong;
+                        }
+                    }
+                }
+                findMenuTreeResVo.setCount(sum);
+                continue;
+            }
+            if (StrUtil.equals(findMenuTreeResVo.getName(), "运营管理")) {
+                List<FindMenuTreeResVo> children = findMenuTreeResVo.getChildren();
+                long sum = 0L;
+                if (CollUtil.isNotEmpty(children)) {
+                    for (FindMenuTreeResVo child : children) {
+                        if (StrUtil.equals(child.getName(), "贸易订单") && hasPerm(child.getChildren(), "tradeOrder:audit")) {
+                            Long aLong = tradeOrderInfoService.queryTradeCount();
+                            child.setCount(aLong);
+                            sum = sum + aLong;
+                            total = total+ aLong;
+                            continue;
+                        }
+                        if (StrUtil.equals(child.getName(), "物流订单") && hasPerm(child.getChildren(), "logisticsOrder:add")) {
+                            Long aLong = transportRemoteService.queryLogisticsCount();
+                            child.setCount(aLong);
+                            sum = sum + aLong;
+                            total = total+ aLong;
+                            continue;
+                        }
+                        if (StrUtil.equals(child.getName(), "物流运单") && hasPerm(child.getChildren(), "waybillList:verification")) {
+                            Long aLong = transportRemoteService.queryWaybillCount();
+                            child.setCount(aLong);
+                            sum = sum + aLong;
+                            total = total+ aLong;
+                        }
+
+                    }
+
+                }
+                findMenuTreeResVo.setCount(sum);
+            }
+        }
+        return new MenuTreeCountResVo(total,tree);
+    }
+
+    private boolean hasPerm(List<FindMenuTreeResVo> children, String perm) {
+        if (CollUtil.isNotEmpty(children)) {
+            return children.stream().anyMatch(d -> StrUtil.equals(d.getPerms(), perm));
+        }
+        return false;
+    }
 }

+ 8 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderMapper.java

@@ -63,7 +63,7 @@ public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {
     /**
      * 销售订单-采购订单-托运详情
      *
-     * @param ids 贸易订单id
+     * @param ids  贸易订单id
      * @param type
      * @return
      */
@@ -123,6 +123,7 @@ public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {
      * @return
      */
     List<SubcontractConsignmentVO> getSubcontractConsignmentNotPage(@Param("lOrderId") String lOrderId);
+
     List<SubcontractConsignmentVO> getSubcontractConsignmentList(@Param("lOrderIds") List<Long> lOrderIds);
 
     /**
@@ -163,11 +164,11 @@ public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {
 
     /**
      * @param params {ownOrderId 物流订单id, upperlOrderId 下级分包物流订单,belowlOrderId 所属上级分包}
+     * @return
      * @desc 查询分包物流订单
      * @author zk
      * @date 2023/7/20
-     *
-     * @return*/
+     */
     List<KwtLogisticsOrder> findLogisticsOrder(Map params);
 
     /**
@@ -474,5 +475,8 @@ public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {
      **/
     LogisticsCountVo findLogisticsOrderCount(Map<String, Object> params);
 
-    List<LogisticsOrderVo> selectData(@Param("para")LogisticsOrderPara orderPara);
+    List<LogisticsOrderVo> selectData(@Param("para") LogisticsOrderPara orderPara);
+
+    Long queryCount(@Param("ids") List<Long> ids);
+
 }

+ 63 - 30
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderMapper.java

@@ -2,6 +2,11 @@ package com.sckw.transport.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.mongo.model.TableTops;
+import com.sckw.transport.api.model.param.TimePara;
+import com.sckw.transport.api.model.vo.CountPara2;
+import com.sckw.transport.api.model.vo.LogisticsVo;
+import com.sckw.transport.api.model.vo.WaybillRankVo;
+import com.sckw.transport.api.model.vo.WaybillVo;
 import com.sckw.transport.model.KwtWaybillOrder;
 import com.sckw.transport.model.dto.OrderCarDTO;
 import com.sckw.transport.model.dto.WayBillDetailDTO;
@@ -24,39 +29,43 @@ import java.util.Map;
 public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
     /**
      * 新增
+     *
      * @param record 新增参数
+     * @return 新增数量
      * @desc 新增
      * @author zk
      * @date 2023/7/31
-     * @return 新增数量
      **/
     @Override
     int insert(KwtWaybillOrder record);
 
     /**
      * 查询车辆信息
-     * @param id 运单ID
-     * @param page 分页参数
+     *
+     * @param id       运单ID
+     * @param page     分页参数
      * @param pageSize 分页参数
+     * @return 销售订单-采购订单-车辆信息
      * @desc 查询车辆信息
      * @author zk
      * @date 2023/7/31
-     * @return 销售订单-采购订单-车辆信息
      **/
     List<OrderCarDTO> selectWaybillOrderCarList(@Param("id") String id, @Param("page") int page, @Param("pageSize") int pageSize);
 
     /**
      * 托运订单-承运订单-通过单据号根据车牌号分组获取车辆信息统计信息
+     *
      * @param ids
      * @param statusList
      * @param page
      * @param pageSize
      * @return 销售订单-采购订单-车辆信息
      */
-    List<OrderCarDTO> selectWaybillOrderCarListGroupByTruckNo(@Param("ids") List<String> ids, @Param("statusList") List<Integer> statusList , @Param("page") int page, @Param("pageSize") int pageSize);
+    List<OrderCarDTO> selectWaybillOrderCarListGroupByTruckNo(@Param("ids") List<String> ids, @Param("statusList") List<Integer> statusList, @Param("page") int page, @Param("pageSize") int pageSize);
 
     /**
      * 贸易订单对应车辆运单数
+     *
      * @param id 贸易订单ID
      * @return 关联数量
      */
@@ -64,6 +73,7 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
 
     /**
      * 根据司机id+定义状态统计
+     *
      * @param id
      * @param status
      * @return 统计数
@@ -72,6 +82,7 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
 
     /**
      * 根据司机id+运单状态获取物流订单id
+     *
      * @param id
      * @param status
      * @return 物流订单id
@@ -80,6 +91,7 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
 
     /**
      * 根基运单ID查询关联数据
+     *
      * @param id
      * @return 订单详情
      */
@@ -87,6 +99,7 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
 
     /**
      * 通过物流订单id+车辆运单状态查询是否存在处理中的数据
+     *
      * @param id
      * @param statusList
      * @return 处理中的数据
@@ -95,86 +108,94 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
 
     /**
      * 统计车辆运单
+     *
      * @param params {
      *               lOrderId 物流订单id,
      *               upperlOrderId 下级分包物流订单,
      *               belowlOrderId 所属上级分包,
      *               loadCountStatus 有效装货状态,
      *               unloadCountStatus 有效卸货状态}
+     * @return 统计数据
      * @desc 统计车辆运单
      * @author zk
      * @date 2023/7/31
-     * @return 统计数据
      **/
     WaybillCountVo findWaybillOrderCount(Map<String, Object> params);
 
     /**
      * 统计车辆运单
+     *
      * @param params {
      *               lOrderId 物流订单id,
      *               upperlOrderId 下级分包物流订单,
      *               belowlOrderId 所属上级分包,
      *               loadCountStatus 有效装货状态,
      *               unloadCountStatus 有效卸货状态}
+     * @return 统计数据
      * @desc 统计车辆运单
      * @author zk
      * @date 2023/7/31
-     * @return 统计数据
      **/
     Double findWaybillOrderTicketCount(Map<String, Object> params);
 
     /**
      * 统计司机任务数(待接单/出车/执行/完结)
+     *
      * @param params {driverId 司机ID}
-     * @desc 统计司机任务数(待接单/出车/执行/完结)
+     * @return 统计数据
+     * @desc 统计司机任务数(待接单 / 出车 / 执行 / 完结)
      * @author zk
      * @date 2023/8/1
-     * @return 统计数据
      **/
     Map<String, Object> findStatisticsCountByDriver(Map<String, Object> params);
 
     /**
      * 统计司机任务数(任务数/委派量/装货量/卸货量/亏吨量/亏吨扣款)
+     *
      * @param params {driverId 司机ID, month月份}
+     * @return 统计数据
      * @desc 统计司机任务数(任务数/委派量/装货量/卸货量/亏吨量/亏吨扣款)
      * @author zk
      * @date 2023/8/1
-     * @return 统计数据
      **/
     Map<String, BigDecimal> findStatisticsSumByDriver(Map<String, Object> params);
 
     /**
      * 统计司机任务数(任务数/委派量/装货量/卸货量/亏吨量/亏吨扣款)
+     *
      * @param params {driverId 司机ID, month月份}
+     * @return 口亏量
      * @desc 统计司机任务数(任务数/委派量/装货量/卸货量/亏吨量/亏吨扣款)
      * @author zk
      * @date 2023/8/1
-     * @return 口亏量
      **/
     BigDecimal deficitLossAmountByDriver(Map<String, Object> params);
 
     /**
      * 查询司机任务列表-待接单
+     *
      * @param params {driverId 司机ID}
+     * @return 待接单运单
      * @desc 查询司机任务列表-待接单
      * @author zk
      * @date 2023/8/1
-     * @return 待接单运单
      **/
     List<WaybillOrderDriverVo> findWaitWaybillOrderByDriver(Map<String, Object> params);
 
     /**
      * 查询司机任务列表-出车/执行/完结
+     *
      * @param params {driverId 司机ID, busStatus 状态 2出车/3执行/4完结, month月份}
+     * @return 运单数据
      * @desc 查询司机任务列表-出车/执行/完结
      * @author zk
      * @date 2023/8/1
-     * @return 运单数据
      **/
     List<WaybillOrderDriverVo> findOtherWaybillOrderByDriver(Map<String, Object> params);
 
     /**
      * 易订单id查找相关联车辆信息
+     *
      * @param id
      * @return 车辆信息
      */
@@ -182,19 +203,21 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
 
     /**
      * 贸易订单ids查找相关联车辆信息
-     * @param ids   贸易订单ids
+     *
+     * @param ids 贸易订单ids
      * @return 车辆信息
      */
     List<OrderCarDTO> selectWaybillOrderCarListByTradeOrderId(@Param("ids") List<Long> ids);
 
     /**
      * 按状态统计运单
-     * @param entId 企业ID
+     *
+     * @param entId     企业ID
      * @param createBys 创建人
-     * @param statuses 查询状态
-     * @param keyword 关键字
+     * @param statuses  查询状态
+     * @param keyword   关键字
      * @param startDate 开始时间
-     * @param endDate 结束时间
+     * @param endDate   结束时间
      * @return 统计数据
      */
     Long selectWaybillOrderCountByStatus(
@@ -207,23 +230,25 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
 
     /**
      * 查询订单
-     * @param orderId 订单id
-     * @param type 类型
+     *
+     * @param orderId    订单id
+     * @param type       类型
      * @param statusList 状态集
      * @return 订单信息
      */
-    Map<String,Object> selectOrderByOrderId(@Param("orderId") Long orderId,
-                                            @Param("type") Integer type,
-                                            @Param("statusList") List<Long> statusList);
+    Map<String, Object> selectOrderByOrderId(@Param("orderId") Long orderId,
+                                             @Param("type") Integer type,
+                                             @Param("statusList") List<Long> statusList);
 
     /**
      * 按装卸量统计运单
-     * @param entId 企业ID
+     *
+     * @param entId     企业ID
      * @param createBys 创建人
-     * @param statuses 查询状态
-     * @param keyword 关键字
+     * @param statuses  查询状态
+     * @param keyword   关键字
      * @param startDate 开始时间
-     * @param endDate 结束时间
+     * @param endDate   结束时间
      * @return 统计数据
      */
     List<WaybillAmountDTO> selectWaybillOrdersByStatus(
@@ -237,6 +262,7 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
 
     /**
      * 查询最大运单编号
+     *
      * @param lOrderNo 运单编号
      * @return 运单编号
      */
@@ -244,16 +270,18 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
 
     /**
      * 查询车辆运单
+     *
      * @param params {driverId 司机ID, truckNo车牌号, busStatus 状态 2出车/3执行/4完结}
+     * @return 运单信息
      * @desc 查询车辆运单
      * @author zk
      * @date 2023/9/6
-     * @return 运单信息
      **/
     List<KwtWaybillOrder> findWaybillOrder(Map<String, Object> params);
 
     /**
      * 托运订单-承运订单-通过单据号根据车牌号分组获取车辆信息统计信息
+     *
      * @param ids
      * @param statusList
      * @param page
@@ -261,8 +289,13 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
      * @return 运单关联司机信息
      */
     List<OrderCarDTO> selectInvalidWaybillOrderCarListGroupByTruckNo(@Param("ids") List<String> ids,
-                                                                     @Param("statusList") List<Integer> statusList ,
+                                                                     @Param("statusList") List<Integer> statusList,
                                                                      @Param("page") int page,
                                                                      @Param("pageSize") int pageSize);
 
-}
+    List<LogisticsVo> queryList(@Param("ids") List<Long> ids, @Param("all") Boolean all);
+
+    List<WaybillVo> countLogistics(@Param("para") CountPara2 countPara, @Param("ids") List<Long> ids);
+
+    List<WaybillRankVo> logisticsRank(@Param("ids")List<Long> ids, @Param("para") TimePara timePara);
+}

+ 239 - 62
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java

@@ -1,7 +1,9 @@
 package com.sckw.transport.dubbo;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -49,31 +51,39 @@ import com.sckw.transport.dao.*;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.dto.AddLogisticOrderDTO;
 import com.sckw.transport.model.dto.LogisticData;
+import com.sckw.transport.model.dto.WaybillOrderRequest;
+import com.sckw.transport.model.param.QueryLogisticsOrderReq;
+import com.sckw.transport.model.param.WaybillOrderReq;
 import com.sckw.transport.model.vo.OrderFinishReq;
+import com.sckw.transport.model.vo.OrderStatusStatisticsResp;
+import com.sckw.transport.model.vo.StatisticsWaybillResp;
+import com.sckw.transport.model.vo.WaybillOrderDetailResp;
 import com.sckw.transport.repository.*;
 import com.sckw.transport.service.KwtAcceptCarriageOrderService;
 import com.sckw.transport.service.KwtCommonService;
 import com.sckw.transport.service.KwtLogisticsConsignmentService;
+import com.sckw.transport.service.KwtWaybillOrderV1Service;
 import jakarta.annotation.Resource;
 import jodd.util.StringUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
-import org.checkerframework.checker.units.qual.C;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.stream.function.StreamBridge;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.ZoneId;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * @author lfdc
@@ -121,6 +131,9 @@ public class TransportServiceImpl implements TransportRemoteService {
 
     @Autowired
     private KwtWaybillOrderV1Mapper waybillOrderV1Mapper;
+    @Autowired
+    private KwtWaybillOrderMapper kwtWaybillOrderMapper;
+    private final RedisTemplate<String, Object> redisTemplate;
 
     @Autowired
     private KwtWaybillOrderSubtaskMapper waybillOrderSubtaskMapper;
@@ -142,6 +155,7 @@ public class TransportServiceImpl implements TransportRemoteService {
     private final KwtLogisticsConsignmentService logisticsConsignmentService;
     private final KwtLogisticsOrderGoodsRepository logisticsOrderGoodsRepository;
     private final KwtLogisticsOrderAddressRepository logisticsOrderAddressRepository;
+    private final KwtWaybillOrderV1Service waybillOrderV1Service;
 
     // 定义禁止关联车辆删除的状态集合
     private static final List<Integer> FORBIDDEN_STATUSES = Arrays.asList(
@@ -152,6 +166,7 @@ public class TransportServiceImpl implements TransportRemoteService {
             CarWaybillV1Enum.WAIT_LOADING.getCode(),
             CarWaybillV1Enum.REVIEW_REJECTION.getCode()
     );
+
     /**
      * 对账管理-ids查询
      *
@@ -845,29 +860,29 @@ public class TransportServiceImpl implements TransportRemoteService {
 
     @Override
     public List<RWaybillOrderVo> queryWaybillOrderByEntId(Long entId) {
-        List<KwtWaybillOrder> waybillOrders  = waybillOrderRepository.queryWaybillOrderByEntId(entId);
-        if (CollectionUtils.isEmpty(waybillOrders)){
+        List<KwtWaybillOrder> waybillOrders = waybillOrderRepository.queryWaybillOrderByEntId(entId);
+        if (CollectionUtils.isEmpty(waybillOrders)) {
             return Collections.emptyList();
         }
-       return waybillOrders.stream()
-               .map(TransportServiceImpl::getWaybillOrderVo)
-               .collect(Collectors.toList());
+        return waybillOrders.stream()
+                .map(TransportServiceImpl::getWaybillOrderVo)
+                .collect(Collectors.toList());
     }
 
     @Override
     public List<RTransportEntVo> queryTransportEnt(Set<Long> tradeOrderIds) {
         List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByTradeOrderIds(tradeOrderIds);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logisticsOrders)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logisticsOrders)) {
             return Collections.emptyList();
         }
         List<Long> logIds = logisticsOrders.stream()
                 .map(KwtLogisticsOrder::getId)
                 .collect(Collectors.toList());
         List<KwtLogisticsOrderUnit> units = logisticsOrderUnitRepository.queryByLogOrderIds(logIds);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(units)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(units)) {
             return Collections.emptyList();
         }
-       return units.stream().map(unit -> {
+        return units.stream().map(unit -> {
             RTransportEntVo rTransportEntVo = new RTransportEntVo();
             rTransportEntVo.setTransportEntType(unit.getUnitType());
             rTransportEntVo.setTransportEntId(unit.getEntId());
@@ -879,20 +894,20 @@ public class TransportServiceImpl implements TransportRemoteService {
     @Override
     public List<RWaybillSubOrderVo> queryWaybillOrderByTradeOrderIds(Set<Long> tradeOrderIds) {
         List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByTradeOrderIds(tradeOrderIds);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logisticsOrders)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logisticsOrders)) {
             return Collections.emptyList();
         }
         List<Long> logIds = logisticsOrders.stream()
                 .map(KwtLogisticsOrder::getId)
                 .collect(Collectors.toList());
         List<KwtWaybillOrderSubtask> subtasks = waybillOrderSubtaskRepository.queryByLogIds(logIds);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(subtasks)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(subtasks)) {
             return Collections.emptyList();
         }
         //查询物流订单和的商品关系
         List<KwtLogisticsOrderGoods> logOrderGoods = logisticsOrderGoodsRepository.queryByLogIds(logIds);
         Map<Long, KwtLogisticsOrderGoods> logisticsOrderGoodsMap = Maps.newHashMap();
-        if (CollectionUtils.isNotEmpty(logOrderGoods)){
+        if (CollectionUtils.isNotEmpty(logOrderGoods)) {
             logisticsOrderGoodsMap = logOrderGoods.stream()
                     .collect(Collectors.toMap(KwtLogisticsOrderGoods::getLOrderId, Function.identity(), (x, y) -> x));
         }
@@ -909,7 +924,7 @@ public class TransportServiceImpl implements TransportRemoteService {
             List<RWaybillSubOrderVo.BillSubOrder> subOrdersList = Lists.newArrayList();
             List<RWaybillSubOrderVo.LogisticGoodsInfo> goodsInfos = Lists.newArrayList();
             logisticsOrderList.forEach(l -> {
-                KwtLogisticsOrderGoods goods = finalLogisticsOrderGoodsMap.getOrDefault(l.getId(),new KwtLogisticsOrderGoods());
+                KwtLogisticsOrderGoods goods = finalLogisticsOrderGoodsMap.getOrDefault(l.getId(), new KwtLogisticsOrderGoods());
                 RWaybillSubOrderVo.LogisticGoodsInfo logisticGoodsInfo = new RWaybillSubOrderVo.LogisticGoodsInfo();
                 logisticGoodsInfo.setLOrderId(l.getId());
                 logisticGoodsInfo.setGoodsId(goods.getGoodsId());
@@ -917,7 +932,7 @@ public class TransportServiceImpl implements TransportRemoteService {
                 List<KwtWaybillOrderSubtask> waybillOrderSubtasks = logIdAndSubtasksMap.get(l.getId());
                 if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(waybillOrderSubtasks)) {
                     List<RWaybillSubOrderVo.BillSubOrder> collect = waybillOrderSubtasks.stream()
-                            .map(x -> getRWaybillSubOrderVo(x, goods.getGoodsId(),null))
+                            .map(x -> getRWaybillSubOrderVo(x, goods.getGoodsId(), null))
                             .collect(Collectors.toList());
                     subOrdersList.addAll(collect);
                 }
@@ -934,7 +949,7 @@ public class TransportServiceImpl implements TransportRemoteService {
     public List<LogisticContractVo> queryLogisticContractByTradeId(Long tradeId) {
         //查询物流id
         List<KwtLogisticsOrder> kwtLogisticsOrders = logisticsOrderRepository.queryByTradeOrderId(tradeId);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwtLogisticsOrders)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwtLogisticsOrders)) {
             return Collections.emptyList();
         }
         //获取物流订单
@@ -943,21 +958,21 @@ public class TransportServiceImpl implements TransportRemoteService {
                 .collect(Collectors.toSet());
         //根据物流订单id获取物流合同
         List<KwtLogisticsOrderContract> contracts = logisticsOrderContractRepository.queryByLogOrderIds(logOrderIds);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(contracts)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(contracts)) {
             return Collections.emptyList();
         }
         //获取物流合同id
-        return contracts.stream().map(c->{
-             LogisticContractVo logisticContractVo = new LogisticContractVo();
-             logisticContractVo.setLogContractId(c.getContractId());
-             return logisticContractVo;
-         }).collect(Collectors.toList());
+        return contracts.stream().map(c -> {
+            LogisticContractVo logisticContractVo = new LogisticContractVo();
+            logisticContractVo.setLogContractId(c.getContractId());
+            return logisticContractVo;
+        }).collect(Collectors.toList());
     }
 
     @Override
     public List<RTransportEntVo> queryTransportEntByTradeOrderId(Long tradeId) {
         List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByTradeOrderId(tradeId);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logisticsOrders)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logisticsOrders)) {
             return Collections.emptyList();
         }
         List<Long> logIds = logisticsOrders.stream()
@@ -966,10 +981,10 @@ public class TransportServiceImpl implements TransportRemoteService {
         //物流订单映射物流信息
         Map<Long, KwtLogisticsOrder> logIdAndLogisticsOrderMap =
                 logisticsOrders.stream().collect(Collectors.toMap(KwtLogisticsOrder::getId,
-                Function.identity(),
-                (e1, e2) -> e1));
+                        Function.identity(),
+                        (e1, e2) -> e1));
         List<KwtLogisticsOrderUnit> units = logisticsOrderUnitRepository.queryByLogOrderIds(logIds);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(units)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(units)) {
             return Collections.emptyList();
         }
 
@@ -989,7 +1004,7 @@ public class TransportServiceImpl implements TransportRemoteService {
     @Override
     public List<KwtLogisticsOrderVO> queryLogisticOrderByTradeId(Long tradeId) {
         List<KwtLogisticsOrder> kwtLogisticsOrders = logisticsOrderRepository.queryByTradeOrderId(tradeId);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwtLogisticsOrders)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwtLogisticsOrders)) {
             return Collections.emptyList();
         }
         return kwtLogisticsOrders.stream()
@@ -1002,7 +1017,7 @@ public class TransportServiceImpl implements TransportRemoteService {
     public List<KwtLogisticsOrderVO> queryTransportEntByEntId(Long entId) {
         //通过承运单位查询物流订单
         List<KwtLogisticsOrderUnit> unitList = logisticsOrderUnitRepository.queryByEntId(entId);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(unitList)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(unitList)) {
             return Collections.emptyList();
         }
         // 物流订单号
@@ -1011,10 +1026,10 @@ public class TransportServiceImpl implements TransportRemoteService {
                 .collect(Collectors.toSet());
         //通过物流订单号查询物流订单
         List<KwtLogisticsOrder> logOrders = logisticsOrderRepository.queryByLogOrderIds(logOrderIds);
-        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(logOrders)){
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(logOrders)) {
             return Collections.emptyList();
         }
-       return logOrders.stream()
+        return logOrders.stream()
                 .map(TransportServiceImpl::getLogisticsOrderVo)
                 .collect(Collectors.toList());
 
@@ -1038,10 +1053,10 @@ public class TransportServiceImpl implements TransportRemoteService {
         kwtLogisticsOrderVO.setLossUnit(logOrder.getLossUnit());
         kwtLogisticsOrderVO.setGoodsPrice(logOrder.getGoodsPrice());
         kwtLogisticsOrderVO.setGoodsPriceUnit(logOrder.getGoodsPriceUnit());
-        if (logOrder.getStartTime() != null){
+        if (logOrder.getStartTime() != null) {
             kwtLogisticsOrderVO.setStartTime(Date.from(logOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
         }
-        if (logOrder.getEndTime() != null){
+        if (logOrder.getEndTime() != null) {
             kwtLogisticsOrderVO.setEntTime(Date.from(logOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
         }
         kwtLogisticsOrderVO.setSubcontractAmount(logOrder.getSubcontractAmount());
@@ -1064,7 +1079,7 @@ public class TransportServiceImpl implements TransportRemoteService {
     }
 
     @NotNull
-    private static RWaybillSubOrderVo.BillSubOrder getRWaybillSubOrderVo(KwtWaybillOrderSubtask subtask,Long goodsId,KwtLogisticsOrder logisticsOrder) {
+    private static RWaybillSubOrderVo.BillSubOrder getRWaybillSubOrderVo(KwtWaybillOrderSubtask subtask, Long goodsId, KwtLogisticsOrder logisticsOrder) {
         RWaybillSubOrderVo.BillSubOrder billSubOrder = new RWaybillSubOrderVo.BillSubOrder();
         billSubOrder.setEntId(subtask.getEntId());
         billSubOrder.setLOrderId(subtask.getLOrderId());
@@ -1109,6 +1124,7 @@ public class TransportServiceImpl implements TransportRemoteService {
 
     /**
      * 查询物流订单已派运力车辆
+     *
      * @param param
      * @return
      */
@@ -1116,8 +1132,8 @@ public class TransportServiceImpl implements TransportRemoteService {
         log.info("查询物流订单已派运力车辆:{}", com.alibaba.fastjson.JSON.toJSONString(param));
         LambdaQueryWrapper<KwtLogisticsOrderCirculate> queryWrapper = Wrappers.<KwtLogisticsOrderCirculate>lambdaQuery()
                 .in(KwtLogisticsOrderCirculate::getEntId, param.getEntId())
-                .eq(KwtLogisticsOrderCirculate::getDelFlag,0)
-                .eq(KwtLogisticsOrderCirculate::getTruckNo,param.getTruckNo())
+                .eq(KwtLogisticsOrderCirculate::getDelFlag, 0)
+                .eq(KwtLogisticsOrderCirculate::getTruckNo, param.getTruckNo())
                 .orderByDesc(KwtLogisticsOrderCirculate::getCreateTime)
                 .orderByAsc(KwtLogisticsOrderCirculate::getId);
         //TODO 是否考虑订单状态
@@ -1143,14 +1159,15 @@ public class TransportServiceImpl implements TransportRemoteService {
 
     /**
      * 查询物流订单已派运力车辆
+     *
      * @param param
      * @return
      */
     public List<RWaybillOrderVo> queryWaybillOrder(CapacityTruckParam param) {
         log.info("查询物流运单已派运力车辆:{}", com.alibaba.fastjson.JSON.toJSONString(param));
         LambdaQueryWrapper<KwtWaybillOrder> queryWrapper = Wrappers.<KwtWaybillOrder>lambdaQuery()
-                .eq(KwtWaybillOrder::getDelFlag,0)
-                .eq(KwtWaybillOrder::getTruckNo,param.getTruckNo())
+                .eq(KwtWaybillOrder::getDelFlag, 0)
+                .eq(KwtWaybillOrder::getTruckNo, param.getTruckNo())
                 .in(KwtWaybillOrder::getStatus, FORBIDDEN_STATUSES)
                 .orderByDesc(KwtWaybillOrder::getCreateTime)
                 .orderByAsc(KwtWaybillOrder::getId);
@@ -1174,7 +1191,7 @@ public class TransportServiceImpl implements TransportRemoteService {
     @Override
     public Boolean logisticOrderFinish(OrderFinishParam req) {
         log.info("流程完结物流订单:{}", JSON.toJSONString(req));
-        if (Objects.isNull( req.getTradeOrderId())){
+        if (Objects.isNull(req.getTradeOrderId())) {
             throw new BusinessException("贸易订单id不能为空");
         }
 
@@ -1186,11 +1203,11 @@ public class TransportServiceImpl implements TransportRemoteService {
 
     @Override
     public List<KwtLogisticsOrderVO> getLogisticOrderList(OrderFinishParam param) {
-        if(Objects.isNull(param.getTradeOrderId())){
+        if (Objects.isNull(param.getTradeOrderId())) {
             throw new BusinessException("贸易订单id不能为空");
         }
         List<KwtLogisticsOrder> kwtLogisticsOrders = logisticsOrderRepository.queryByTradeOrderId(param.getTradeOrderId());
-        if (CollectionUtils.isEmpty(kwtLogisticsOrders)){
+        if (CollectionUtils.isEmpty(kwtLogisticsOrders)) {
             return List.of();
         }
         return kwtLogisticsOrders.stream()
@@ -1201,31 +1218,31 @@ public class TransportServiceImpl implements TransportRemoteService {
 
     @Override
     public List<RWaybillSubOrderVo> queryWaybillOrderByLogContractIds(Set<Long> logContractIds) {
-        if (CollectionUtils.isEmpty(logContractIds)){
+        if (CollectionUtils.isEmpty(logContractIds)) {
             return List.of();
         }
         //根据物流合同查询物流id
         List<KwtLogisticsOrderContract> logisticsOrderContracts = logisticsOrderContractRepository.queryByLogContractIds(logContractIds);
-        if (CollectionUtils.isEmpty(logisticsOrderContracts)){
+        if (CollectionUtils.isEmpty(logisticsOrderContracts)) {
             return List.of();
         }
         List<Long> logIds = logisticsOrderContracts.stream()
                 .map(KwtLogisticsOrderContract::getLOrderId)
                 .distinct()
                 .collect(Collectors.toList());
-        if (CollectionUtils.isEmpty(logIds)){
+        if (CollectionUtils.isEmpty(logIds)) {
             return List.of();
         }
         //查询物流运单
         List<KwtWaybillOrderSubtask> waybillOrderSubtasks = waybillOrderSubtaskRepository.queryByLogIds(logIds);
-        if (CollectionUtils.isEmpty(waybillOrderSubtasks)){
+        if (CollectionUtils.isEmpty(waybillOrderSubtasks)) {
             return List.of();
         }
         Map<Long, List<KwtWaybillOrderSubtask>> logIdAndWaybillOrderSubtasksMap = waybillOrderSubtasks.stream()
                 .collect(Collectors.groupingBy(KwtWaybillOrderSubtask::getLOrderId));
         //查询物流 订单
         List<KwtLogisticsOrder> logOrders = logisticsOrderRepository.queryByLogisticsOrderIds(logIds);
-        if (CollectionUtils.isEmpty(logOrders)){
+        if (CollectionUtils.isEmpty(logOrders)) {
             return List.of();
         }
         Map<Long, KwtLogisticsOrder> logIdAndLogOrderMap = logOrders.stream()
@@ -1233,12 +1250,12 @@ public class TransportServiceImpl implements TransportRemoteService {
         //查询物流订单和的商品关系
         List<KwtLogisticsOrderGoods> logOrderGoods = logisticsOrderGoodsRepository.queryByLogIds(logIds);
         Map<Long, KwtLogisticsOrderGoods> logisticsOrderGoodsMap = Maps.newHashMap();
-        if (CollectionUtils.isNotEmpty(logOrderGoods)){
+        if (CollectionUtils.isNotEmpty(logOrderGoods)) {
             logisticsOrderGoodsMap = logOrderGoods.stream()
                     .collect(Collectors.toMap(KwtLogisticsOrderGoods::getLOrderId, Function.identity(), (x, y) -> x));
         }
         Map<Long, KwtLogisticsOrderGoods> finalLogisticsOrderGoodsMap = logisticsOrderGoodsMap;
-        return logisticsOrderContracts.stream().map(x->{
+        return logisticsOrderContracts.stream().map(x -> {
             RWaybillSubOrderVo rWaybillSubOrderVo = new RWaybillSubOrderVo();
             rWaybillSubOrderVo.setLogContractId(x.getContractId());
             KwtLogisticsOrder logisticsOrder = logIdAndLogOrderMap.getOrDefault(x.getLOrderId(), new KwtLogisticsOrder());
@@ -1339,7 +1356,8 @@ public class TransportServiceImpl implements TransportRemoteService {
 
     /**
      * 查询司机的当天完成量、7天完成量、30天完成量
-     * @param entId 企业id
+     *
+     * @param entId    企业id
      * @param driverId
      * @return
      */
@@ -1362,7 +1380,7 @@ public class TransportServiceImpl implements TransportRemoteService {
         // 3. 定义时间范围
         Date todayStart = DateUtil.beginOfDay(new Date()); // 当天00:00:00
         Date todayEnd = DateUtil.endOfDay(new Date());  // 当天23:59:59
-        Date sevenDaysStart =  DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -7)); // 7天前的00:00:00
+        Date sevenDaysStart = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -7)); // 7天前的00:00:00
         Date thirtyDaysStart = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -30)); // 30天前的00:00:00
         //4. 初始化计数器
         int todayCount = 0;
@@ -1393,7 +1411,7 @@ public class TransportServiceImpl implements TransportRemoteService {
 
                 if (Objects.equals(billingMode, String.valueOf(1))) {
                     statusValid = CarWaybillV1Enum.COMPLETION_LOADING.getCode().equals(order.getStatus())
-                            ||CarWaybillV1Enum.COMPLETED.getCode().equals(order.getStatus());
+                            || CarWaybillV1Enum.COMPLETED.getCode().equals(order.getStatus());
                 } else {
                     //按照卸货量结算(统计“已完成”运单)
                     statusValid = order.getStatus().equals(CarWaybillV1Enum.COMPLETED.getCode());
@@ -1424,13 +1442,13 @@ public class TransportServiceImpl implements TransportRemoteService {
     @Override
     public RWaybillOrderVo queryWaybillOrderByWayBillOrderId(Long wayBillOrderId) {
         KwtWaybillOrder waybillOrder = waybillOrderRepository.queryByBillOrderId(wayBillOrderId);
-        if (Objects.isNull(waybillOrder)){
+        if (Objects.isNull(waybillOrder)) {
             return new RWaybillOrderVo();
         }
         //查询子运单
         KwtWaybillOrderSubtask subtasks = waybillOrderSubtaskRepository.queryByWOrderId(waybillOrder.getId());
-        List<KwtLogisticsOrderAddress> addressList =null;
-        if (Objects.nonNull(subtasks) && Objects.nonNull(subtasks.getLOrderId())){
+        List<KwtLogisticsOrderAddress> addressList = null;
+        if (Objects.nonNull(subtasks) && Objects.nonNull(subtasks.getLOrderId())) {
             addressList = logisticsOrderAddressRepository.queryByLogOrderId(subtasks.getLOrderId());
         }
         RWaybillOrderVo rWaybillOrderVo = new RWaybillOrderVo();
@@ -1448,12 +1466,12 @@ public class TransportServiceImpl implements TransportRemoteService {
         rWaybillOrderVo.setStartTime(waybillOrder.getStartTime());
         rWaybillOrderVo.setEndTime(waybillOrder.getEndTime());
         rWaybillOrderVo.setStatus(waybillOrder.getStatus());
-        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(addressList)){
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(addressList)) {
             addressList.forEach(address -> {
-                if (Objects.equals(address.getAddressType(), AddressTypeEnum.SHIPMENT.getCode())){
+                if (Objects.equals(address.getAddressType(), AddressTypeEnum.SHIPMENT.getCode())) {
                     rWaybillOrderVo.setStartLng(address.getLng());
                     rWaybillOrderVo.setStartLat(address.getLat());
-                }else if (Objects.equals(address.getAddressType(), AddressTypeEnum.TAKE.getCode())){
+                } else if (Objects.equals(address.getAddressType(), AddressTypeEnum.TAKE.getCode())) {
                     rWaybillOrderVo.setEndLng(address.getLng());
                     rWaybillOrderVo.setEndLat(address.getLat());
                 }
@@ -1466,7 +1484,7 @@ public class TransportServiceImpl implements TransportRemoteService {
     @Override
     public WaybillOrderSubtaskVo queryWaybillOrderId(Long wayBillOrderId) {
         KwtWaybillOrderSubtask kwtWaybillOrder = waybillOrderSubtaskRepository.queryByBillOrderId(wayBillOrderId);
-        if (Objects.isNull(kwtWaybillOrder)){
+        if (Objects.isNull(kwtWaybillOrder)) {
             return new WaybillOrderSubtaskVo();
         }
         WaybillOrderSubtaskVo rWaybillOrderVo = new WaybillOrderSubtaskVo();
@@ -1479,7 +1497,7 @@ public class TransportServiceImpl implements TransportRemoteService {
     @Override
     public List<KwtLogisticsOrderAddressVo> queryByWOrderId(Long wayBillOrderId) {
         List<KwtLogisticsOrderAddress> addressList = logisticsOrderAddressRepository.queryByLogOrderId(wayBillOrderId);
-        if (org.apache.commons.collections4.CollectionUtils.isEmpty(addressList)){
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(addressList)) {
             return List.of();
         }
         return addressList.stream().map(address -> {
@@ -1496,12 +1514,12 @@ public class TransportServiceImpl implements TransportRemoteService {
 
     @Override
     public List<WayContaractbillOrderVo> queryLogisticContractByContTradeIds(Set<Long> contractIds) {
-        if (CollectionUtils.isEmpty(contractIds)){
+        if (CollectionUtils.isEmpty(contractIds)) {
             return List.of();
         }
         //根据物流合同查询物流id
         List<KwtLogisticsOrderContract> logisticsOrderContracts = logisticsOrderContractRepository.queryByLogContractIds(contractIds);
-        if (CollectionUtils.isEmpty(logisticsOrderContracts)){
+        if (CollectionUtils.isEmpty(logisticsOrderContracts)) {
             return List.of();
         }
 
@@ -1511,12 +1529,12 @@ public class TransportServiceImpl implements TransportRemoteService {
                 .map(KwtLogisticsOrderContract::getLOrderId)
                 .distinct()
                 .collect(Collectors.toList());
-        if (CollectionUtils.isEmpty(logIds)){
+        if (CollectionUtils.isEmpty(logIds)) {
             return List.of();
         }
         //查询物流订单
         List<KwtLogisticsOrder> kwtLogisticsOrders = logisticsOrderRepository.queryByLogisticsOrderIds(logIds);
-        if (CollectionUtils.isEmpty(kwtLogisticsOrders)){
+        if (CollectionUtils.isEmpty(kwtLogisticsOrders)) {
             return List.of();
         }
         List<WayContaractbillOrderVo> result = Lists.newArrayList();
@@ -1570,4 +1588,163 @@ public class TransportServiceImpl implements TransportRemoteService {
         return result;
     }
 
+    @Override
+    public Long queryLogisticsCount() {
+        OrderStatusStatisticsResp orderStatusStatisticsResp = logisticsConsignmentService.orderStatusStatistics(new QueryLogisticsOrderReq());
+        List<OrderStatusStatisticsResp.OrderStatusStatistics> orderStatusStatistics = orderStatusStatisticsResp.getOrderStatusStatistics();
+
+        if (CollUtil.isEmpty(orderStatusStatistics)) {
+            return 0L;
+        }
+        Optional<OrderStatusStatisticsResp.OrderStatusStatistics> first = orderStatusStatistics.stream().filter(d -> StrUtil.equals(d.getOrderStatus(), "5")).findFirst();
+        return first.map(contractStatusCount -> Long.parseLong(contractStatusCount.getOrderNum())).orElse(0L);
+
+    }
+
+    @Override
+    public Long queryWaybillCount() {
+        StatisticsWaybillResp statisticsWaybillResp = waybillOrderV1Service.statisticsWaybillOrder(new WaybillOrderReq());
+        List<StatisticsWaybillResp.OrderBillStatusStatistics> orderStatusStatistics = statisticsWaybillResp.getOrderStatusStatistics();
+        if (CollUtil.isEmpty(orderStatusStatistics)) {
+            return 0L;
+        }
+        Optional<StatisticsWaybillResp.OrderBillStatusStatistics> first = orderStatusStatistics.stream().filter(d -> StrUtil.equals(d.getOrderStatus(), "20")).findFirst();
+        return first.map(contractStatusCount -> Long.parseLong(contractStatusCount.getOrderNum())).orElse(0L);
+
+    }
+
+    @Override
+    public Long queryCount() {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        return logisticsOrderMapper.queryCount(ids);
+    }
+
+    @Override
+    public List<LogisticsVo> logisticsList() {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        return kwtWaybillOrderMapper.queryList(ids, false);
+    }
+
+    @Override
+    public LogisticsDto logisticsRank(TimePara timePara) {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+
+        List<WaybillRankVo> waybillRankVos = kwtWaybillOrderMapper.logisticsRank(ids, timePara);
+        if (CollUtil.isEmpty(waybillRankVos)) {
+            waybillRankVos = new ArrayList<>();
+        }
+        LogisticsDto logisticsDto = new LogisticsDto();
+        List<String> strings = new ArrayList<>();
+        List<BigDecimal> strings1 = new ArrayList<>();
+        for (WaybillRankVo waybillRankVo : waybillRankVos) {
+            strings.add(waybillRankVo.getFirmName());
+            strings1.add(Objects.nonNull(waybillRankVo.getAmount()) ? waybillRankVo.getAmount() : new BigDecimal("0"));
+        }
+        logisticsDto.setFirmName(strings);
+        logisticsDto.setAmount(strings1);
+
+        return logisticsDto;
+    }
+
+    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 WaybillOrderDetailVo auditLogisticsTask(LogisticsOrderAuditPara para) {
+        Long orderId = para.getOrderId();
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        String key = String.format(RedisConstant.AUDIT_LOGISTICS_TASK, LoginUserHolder.getEntId());
+
+        if (para.getStart()) {//首次加载,合同id为第一个合同
+            if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) {
+                redisTemplate.delete(key);
+            }
+            //写入缓存
+            List<LogisticsVo> tradeVos = kwtWaybillOrderMapper.queryList(ids, true);
+            if (CollUtil.isNotEmpty(tradeVos)) {
+                List<Long> list = tradeVos.stream().map(LogisticsVo::getId).toList();
+                List<Long> longs = separateAndRotate(list, orderId);
+                redisTemplate.opsForList().rightPushAll(key, longs);
+                redisTemplate.expire(key, 24, TimeUnit.HOURS);
+            }
+
+        } else {
+            //继续审核合同,合同id为上一次的合同id。
+            orderId = (Long) redisTemplate.opsForList().leftPop(key);
+            if (Objects.isNull(orderId)) {
+                throw new BusinessException("已审核完成");
+            }
+        }
+        WaybillOrderRequest waybillOrderRequest = new WaybillOrderRequest();
+        waybillOrderRequest.setOrderId(orderId);
+        WaybillOrderDetailResp waybillOrderDetailResp = waybillOrderV1Service.queryBillOrderDetail(waybillOrderRequest);
+
+        WaybillOrderDetailVo order = BeanUtil.copyProperties(waybillOrderDetailResp, WaybillOrderDetailVo.class);
+
+        if (Objects.nonNull(order)) {
+            return order;
+        }
+        throw new BusinessException("未找到贸易订单");
+    }
+
+    @Override
+    public Object countLogistics(CountPara2 countPara) {
+        List<Long> ids = new ArrayList<>();
+        if (!LoginUserHolder.isManager()) {
+            ids = LoginUserHolder.getChildEntList();
+        }
+        List<WaybillVo> waybillVos = kwtWaybillOrderMapper.countLogistics(countPara, ids);
+        if (CollUtil.isEmpty(waybillVos)) {
+            waybillVos = new ArrayList<>();
+        }
+
+        com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
+        List<String> two = new ArrayList<>();
+        List<BigDecimal> three = new ArrayList<>();
+        for (WaybillVo saleVo : waybillVos) {
+            two.add(saleVo.getFirmName());
+            three.add(Objects.nonNull(saleVo.getMoney()) ? saleVo.getMoney().divide(new BigDecimal("10000"), RoundingMode.HALF_UP) : new BigDecimal("0"));
+        }
+
+        jsonObject.put("firm", two);
+        jsonObject.put("amount", three);
+
+        return jsonObject;
+    }
+
 }

+ 19 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderMapper.xml

@@ -2990,4 +2990,23 @@
             limit 10
         </where>
     </select>
+
+    <select id="queryCount" resultType="java.lang.Long">
+        select count(1)
+        from kwt_logistics_order a
+        LEFT JOIN kwt_logistics_order_unit d ON a.id = d.l_order_id
+        AND d.unit_type = 1 AND d.del_flag = 0
+        <where>
+            a.del_flag = 0
+              and a.status = 20
+            <if test="ids != null and ids.size() != 0">
+                and d.ent_id in
+                <foreach collection="ids" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+    </select>
+
+
 </mapper>

+ 81 - 1
sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderMapper.xml

@@ -837,4 +837,84 @@
         a.truck_no
         limit #{page},#{pageSize}
     </select>
-</mapper>
+
+    <select id="queryList" resultType="com.sckw.transport.api.model.vo.LogisticsVo">
+        SELECT d.firm_name,
+               aa.create_time,
+               aa.w_order_no,
+               aa.status,
+               aa.unload_time,
+               g.goods_name,
+               aa.entrust_amount taskAmount,
+               aa.unload_amount
+
+        FROM kwt_waybill_order_subtask aa
+                 LEFT JOIN kwt_waybill_order a on a.id = aa.w_order_id and a.del_flag = 0
+                 LEFT JOIN kwt_logistics_order b ON a.l_order_id = b.id and b.del_flag = 0
+                 LEFT JOIN kwt_logistics_order_unit c ON b.id = c.l_order_id AND c.unit_type = 1 AND c.del_flag = 0
+                 LEFT JOIN kwt_logistics_order_unit d ON b.id = d.l_order_id AND d.unit_type = 2 AND d.del_flag = 0
+                 LEFT JOIN kwt_logistics_order_goods g ON b.id = g.l_order_id AND g.del_flag = 0
+        <where>
+            aa.del_flag = 0
+              and aa.status = 20
+            <if test="ids != null and ids.size() != 0">
+                and c.ent_id in
+                <foreach collection="ids" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+            order by aa.unload_time desc
+            limit 10
+        </where>
+    </select>
+
+    <select id="countLogistics" resultType="com.sckw.transport.api.model.vo.WaybillVo">
+        SELECT d.firm_name,
+               (case b.billing_mode
+                    when 1 then aa.load_amount * b.price
+                    when 2 then aa.unload_amount * b.price end) as money
+
+        FROM kwt_waybill_order_subtask aa
+                 inner JOIN kwt_waybill_order a on a.id = aa.w_order_id and a.del_flag = 0
+                 inner JOIN kwt_logistics_order b ON a.l_order_id = b.id and b.del_flag = 0
+                 inner JOIN kwt_logistics_order_unit c ON b.id = c.l_order_id AND c.unit_type = 1 AND c.del_flag = 0
+                 inner JOIN kwt_logistics_order_unit d ON b.id = d.l_order_id AND d.unit_type = 2 AND d.del_flag = 0
+        <where>
+            aa.del_flag = 0
+              and aa.status = 20
+            <if test="ids != null and ids.size() != 0">
+                and c.ent_id in
+                <foreach collection="ids" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+            and aa.create_time between #{para.startTime} and #{para.endTime}
+        </where>
+    </select>
+
+    <select id="logisticsRank" resultType="com.sckw.transport.api.model.vo.WaybillRankVo">
+        SELECT d.firm_name,
+               (case b.billing_mode
+                    when 1 then aa.load_amount
+                    when 2 then aa.unload_amount end) as amount
+
+        FROM kwt_waybill_order_subtask aa
+                 inner JOIN kwt_waybill_order a on a.id = aa.w_order_id and a.del_flag = 0
+                 inner JOIN kwt_logistics_order b ON a.l_order_id = b.id and b.del_flag = 0
+                 inner JOIN kwt_logistics_order_unit c ON b.id = c.l_order_id AND c.unit_type = 1 AND c.del_flag = 0
+                 inner JOIN kwt_logistics_order_unit d ON b.id = d.l_order_id AND d.unit_type = 2 AND d.del_flag = 0
+        <where>
+            aa.del_flag = 0
+              and aa.status = 20
+            <if test="ids != null and ids.size() != 0">
+                and c.ent_id in
+                <foreach collection="ids" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+            and aa.create_time between #{para.startTime} and #{para.endTime}
+            order by amount desc
+            limit 5
+        </where>
+    </select>
+</mapper>