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

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

# Conflicts:
#	pom.xml
#	sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/PasswordUtils.java
#	sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsEnterpriseController.java
#	sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java
xucaiqin 2 месяцев назад
Родитель
Сommit
491f9fa1c9
100 измененных файлов с 4988 добавлено и 155 удалено
  1. 25 8
      pom.xml
  2. 29 0
      sckw-auth/src/main/resources/bootstrap-cxf.yml
  3. 10 8
      sckw-common/sckw-common-core/pom.xml
  4. 6 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictEnum.java
  5. 3 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictTypeEnum.java
  6. 0 26
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/config/OpenApiConfig.java
  7. 0 28
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/config/SwaggerConfig.java
  8. 4 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/exception/GlobalSystemExceptionHandler.java
  9. 8 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/filter/RequestCheckFilter.java
  10. 37 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarStatusEnum.java
  11. 9 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/ContractStatusEnum.java
  12. 0 1
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/page/PageRequest.java
  13. 2 2
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/PasswordUtils.java
  14. 5 1
      sckw-common/sckw-common-remote/src/main/java/com/sckw/remote/annotation/SckwRemoteApplication.java
  15. 6 0
      sckw-gateway/pom.xml
  16. 55 0
      sckw-gateway/src/main/java/com/sckw/gateway/config/GatewayExceptionConfig.java
  17. 119 0
      sckw-gateway/src/main/java/com/sckw/gateway/exception/GatewayGlobalExceptionHandler.java
  18. 89 0
      sckw-gateway/src/main/java/com/sckw/gateway/pojo/HttpResult.java
  19. 198 0
      sckw-gateway/src/main/java/com/sckw/gateway/pojo/HttpStatus.java
  20. 51 0
      sckw-gateway/src/main/java/com/sckw/gateway/utils/GatewayExceptionUtil.java
  21. 29 0
      sckw-gateway/src/main/resources/bootstrap-cxf.yml
  22. 11 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java
  23. 56 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/ContractLogisticsAndTradeOrderResDto.java
  24. 3 0
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/RemoteFleetService.java
  25. 8 0
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/vo/RTruckVo.java
  26. 31 0
      sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/vo/TmsTruckAxleNumVO.java
  27. 2 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/TradeOrderInfoService.java
  28. 332 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/OrderDetailVo.java
  29. 2 0
      sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/dubbo/GoodsInfoService.java
  30. 7 0
      sckw-modules-api/sckw-system-api/src/main/java/com/sckw/system/api/RemoteSystemService.java
  31. 30 3
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java
  32. 23 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/LogisticContractVo.java
  33. 49 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/RTransportEntVo.java
  34. 93 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/RWaybillSubOrderVo.java
  35. 1 0
      sckw-modules/pom.xml
  36. 10 0
      sckw-modules/sckw-contract/pom.xml
  37. 42 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcContractSaleController.java
  38. 71 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcLogisticsContractController.java
  39. 50 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java
  40. 5 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractLogistics.java
  41. 3 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractLogisticsGoods.java
  42. 4 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractLogisticsUnit.java
  43. 13 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractTradeGoods.java
  44. 39 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractTradeOrder.java
  45. 4 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractTradeUnit.java
  46. 38 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/ApprovalReq.java
  47. 33 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/ContractDetailReq.java
  48. 1 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/ContractTradeReqVo.java
  49. 202 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/LogisticListReq.java
  50. 1 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryListReqVo.java
  51. 42 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryLogisticListReq.java
  52. 52 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryTradeReq.java
  53. 5 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/SupplyContractTradeReq.java
  54. 30 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/UpdateLogisticsReq.java
  55. 341 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/ContractDetailResp.java
  56. 6 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryListResVo.java
  57. 207 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryLogisticDetailResp.java
  58. 123 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryLogisticListResp.java
  59. 43 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsGoodsRepository.java
  60. 64 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsRepository.java
  61. 43 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsUnitRepository.java
  62. 20 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeGoodsRepository.java
  63. 22 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeOrderRepository.java
  64. 71 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeRepository.java
  65. 38 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeUnitRepository.java
  66. 8 3
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractTradeGoodsService.java
  67. 384 3
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractLogisticsService.java
  68. 520 35
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java
  69. 29 0
      sckw-modules/sckw-contract/src/main/resources/bootstrap-cxf.yml
  70. 9 8
      sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractTradeMapper.xml
  71. 29 0
      sckw-modules/sckw-file/src/main/resources/bootstrap-cxf.yml
  72. 10 0
      sckw-modules/sckw-fleet/pom.xml
  73. 1 7
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfTruckAxleNumController.java
  74. 41 6
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java
  75. 7 0
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckRepository.java
  76. 3 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckRouteService.java
  77. 3 0
      sckw-modules/sckw-fleet/src/main/resources/application.yml
  78. 29 0
      sckw-modules/sckw-fleet/src/main/resources/bootstrap-cxf.yml
  79. 5 5
      sckw-modules/sckw-fleet/src/main/resources/bootstrap-test.yml
  80. 33 2
      sckw-modules/sckw-fleet/src/main/resources/bootstrap.yml
  81. 10 0
      sckw-modules/sckw-manage/pom.xml
  82. 29 0
      sckw-modules/sckw-manage/src/main/resources/bootstrap-cxf.yml
  83. 10 0
      sckw-modules/sckw-message/pom.xml
  84. 29 0
      sckw-modules/sckw-message/src/main/resources/bootstrap-cxf.yml
  85. 10 0
      sckw-modules/sckw-operation/pom.xml
  86. 29 0
      sckw-modules/sckw-operation/src/main/resources/bootstrap-cxf.yml
  87. 10 0
      sckw-modules/sckw-order/pom.xml
  88. 26 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/TradeOrderManageController.java
  89. 111 4
      sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java
  90. 15 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrder.java
  91. 4 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrderAddress.java
  92. 6 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrderGoods.java
  93. 3 1
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrderUnit.java
  94. 75 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/QueryTradeOrderReq.java
  95. 26 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderDetailReq.java
  96. 144 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/QueryTradeOrderResp.java
  97. 271 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TradeOrderDetailResp.java
  98. 32 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderAddressRepository.java
  99. 33 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderContractRepository.java
  100. 48 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderGoodsRepository.java

+ 25 - 8
pom.xml

@@ -373,19 +373,19 @@
 
     <profiles>
         <profile>
-            <id>lfdc</id>
+            <id>cxf</id>
             <properties>
-                <profiles.active>lfdc</profiles.active>
-                <nacos.server>10.10.10.230:8848</nacos.server>
-                <nacos.namespace>sckw_mg_lfdc</nacos.namespace>
+                <profiles.active>cxf</profiles.active>
+                <nacos.server>10.10.10.224:8848</nacos.server>
+                <nacos.namespace>sckw-ng-service-platform-cxf</nacos.namespace>
             </properties>
         </profile>
         <profile>
             <id>dev</id>
             <properties>
                 <profiles.active>dev</profiles.active>
-                <nacos.server>10.10.10.230:8848</nacos.server>
-                <nacos.namespace>sckw-ng-service-platform</nacos.namespace>
+                <nacos.server>10.10.10.224:8848</nacos.server>
+                <nacos.namespace>sckw-ng-service-platform-dev</nacos.namespace>
             </properties>
         </profile>
         <!--测试环境-->
@@ -396,7 +396,7 @@
             </activation>
             <properties>
                 <profiles.active>test</profiles.active>
-                <nacos.server>10.10.10.224:8848</nacos.server>
+                <nacos.server>10.10.10.230:8848</nacos.server>
                 <nacos.namespace>sckw-ng-service-platform</nacos.namespace>
             </properties>
         </profile>
@@ -496,13 +496,29 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-install-plugin</artifactId>
             </plugin>
+            <!-- 其他插件 -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <jvmArguments>--enable-native-access=ALL-UNNAMED</jvmArguments>
+                </configuration>
+            </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.10.1</version>
                 <configuration>
                     <source>17</source>
                     <target>17</target>
                     <encoding>UTF-8</encoding>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                            <version>1.18.38</version>
+                        </path>
+                    </annotationProcessorPaths>
                 </configuration>
             </plugin>
         </plugins>
@@ -526,6 +542,7 @@
                 </includes>
             </resource>
         </resources>
+
     </build>
 
-</project>
+</project>

+ 29 - 0
sckw-auth/src/main/resources/bootstrap-cxf.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

+ 10 - 8
sckw-common/sckw-common-core/pom.xml

@@ -178,15 +178,17 @@
             <groupId>org.apache.httpcomponents.client5</groupId>
             <artifactId>httpclient5</artifactId>
         </dependency>
-
-<!--        <dependency>-->
-<!--            <groupId>org.springdoc</groupId>-->
-<!--            <artifactId>springdoc-openapi-ui</artifactId>-->
-<!--        </dependency>-->
         <dependency>
-            <groupId>org.springdoc</groupId>
-            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
-
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel-core</artifactId>
+            <version>3.3.4</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.2.19</version>
+            <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>org.mybatis</groupId>

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

@@ -91,6 +91,12 @@ public enum DictEnum {
     WANT_BUY_STATUS_2("want_buy_status", "2","已下架"),
     PREPAID_LIMIT_NO("prepaid_limit", "0","否"),
     PREPAID_LIMIT_YES("prepaid_limit", "1","是"),
+    CONSIGNMENT_WAY_1("consignment_way", "1", "采购方托运"),
+    CONSIGNMENT_WAY_2("consignment_way", "2", "供应方托运"),
+    SETTLEMENT_WAY_1("settlement_way", "1", "线上结算"),
+    SETTLEMENT_WAY_2("settlement_way", "2", "线下结算"),
+    LOAD_UNLOAD_WAY_1("load_unload_way", "1", "按装货量"),
+    LOAD_UNLOAD_WAY_2("load_unload_way", "2", "按卸货量"),
     ;
 
     private final String type;

+ 3 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictTypeEnum.java

@@ -50,6 +50,9 @@ public enum DictTypeEnum {
     PREPAID_LIMIT("prepaid_limit", "预付限额"),
     WANT_BUY_STATUS("want_buy_status", "求购状态"),
     ORDER_SOURCE("order_source", "订单来源"),
+    CONSIGNMENT_WAY("consignment_way", "托运方式"),
+    SETTLEMENT_WAY(" settlement_way", "结算方式"),
+    LOAD_UNLOAD_WAY("load_unLoad_way", "装卸方式"),
     ;
 
     private final String type;

+ 0 - 26
sckw-common/sckw-common-core/src/main/java/com/sckw/core/config/OpenApiConfig.java

@@ -1,26 +0,0 @@
-package com.sckw.core.config;
-
-import io.swagger.v3.oas.annotations.OpenAPIDefinition;
-import io.swagger.v3.oas.annotations.info.Contact;
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.info.Info;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * @author PC
- */
-@Configuration
-@OpenAPIDefinition
-public class OpenApiConfig {
-    @Bean
-    public OpenAPI customOpenAPI() {
-        return new OpenAPI()
-                .info(new Info()
-                        .title("API文档")
-                        .version("1.0")
-                        .description("<font color=\"#DC143C\">**以「高质量代码」为核心,「简洁、高效、安全」**</font>基于 SpringBoot + Sa-Token + Mybatis-Plus 和 Vue3 + Vite5 + Ant Design (同时支持JavaScript和TypeScript双版本) 的快速开发平台。" +
-                                "<br/><font color=\"#DC143C\">**国内首个满足《网络安全》、《数据安全》、三级等保**</font>, 支持登录限制、支持国产接口加解密等安全、支持数据加解密等一系列安全体系的开源项目。" +
-                                "<br/><font color=\"#DC143C\">**我们开源一套漂亮的代码和一套整洁的代码规范**</font>,让大家在这浮躁的代码世界里感受到一股把代码写好的清流!同时又让开发者节省大量的时间,减少加班,快乐工作,保持谦逊,保持学习,热爱代码,更热爱生活!"));
-    }
-}

+ 0 - 28
sckw-common/sckw-common-core/src/main/java/com/sckw/core/config/SwaggerConfig.java

@@ -1,28 +0,0 @@
-package com.sckw.core.config;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.info.Info;
-import io.swagger.v3.oas.models.info.Contact;
-import io.swagger.v3.oas.models.info.License;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-public class SwaggerConfig {
-    
-    @Bean
-    public OpenAPI customOpenAPI() {
-        return new OpenAPI()
-                .info(new Info()
-                        .title("API 文档")
-                        .version("1.0")
-                        .description("Spring Boot REST API 文档")
-                        .contact(new Contact()
-                                .name("矿拉拉普适版")
-                                .email("dev@example.com")
-                                .url("https://example.com"))
-                        .license(new License()
-                                .name("Apache 2.0")
-                                .url("http://springdoc.org")));
-    }
-}

+ 4 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/exception/GlobalSystemExceptionHandler.java

@@ -33,6 +33,10 @@ public class GlobalSystemExceptionHandler {
     @ResponseBody
     public HttpResult handlerRuntimeException(RuntimeException e) {
         log.error("业务异常:", e);
+        // 处理Dubbo服务不可用异常
+        if (e.getMessage() != null && e.getMessage().contains("No provider available")) {
+            return HttpResult.error(HttpStatus.GLOBAL_EXCEPTION_CODE, "服务暂时不可用,请稍后重试");
+        }
         return HttpResult.error(HttpStatus.GLOBAL_EXCEPTION_CODE, e.getMessage());
     }
 

+ 8 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/filter/RequestCheckFilter.java

@@ -94,6 +94,14 @@ public class RequestCheckFilter implements Filter {
             filterChain.doFilter(servletRequest, servletResponse);
             return;
         }
+        
+        // 添加对Swagger相关路径的放行
+        if (requestUri.startsWith("/swagger-ui") || 
+            requestUri.startsWith("/v3/api-docs") || requestUri.startsWith("/doc.htm")||
+            requestUri.startsWith("/webjars/")) {
+            filterChain.doFilter(servletRequest, servletResponse);
+            return;
+        }
 
         /*2、校验token**/
         /*2.1、校验token非空*/

+ 37 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarStatusEnum.java

@@ -0,0 +1,37 @@
+package com.sckw.core.model.enums;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author lfdc
+ * @desc 车辆运单状态枚举
+ * @date 2023-07-14 14:07:23
+ */
+@Getter
+@RequiredArgsConstructor
+public enum CarStatusEnum {
+
+    //正常
+    NORMAL(0, "正常"),
+    //锁定
+    NOT_NORMAL(1, "锁定");
+
+
+    private final int code;
+
+    private final String name;
+
+    public static String getName(int code) {
+        for (CarStatusEnum carStatusEnum : CarStatusEnum.values()) {
+            if (carStatusEnum.getCode() == code) {
+                return carStatusEnum.getName();
+            }
+        }
+        return null;
+    }
+}

+ 9 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/ContractStatusEnum.java

@@ -40,4 +40,13 @@ public enum ContractStatusEnum {
         return null;
     }
 
+    public static String getNameByCode(int code) {
+        for (ContractStatusEnum contractTrackEnum : values()) {
+            if (contractTrackEnum.getCode() == code) {
+                return contractTrackEnum.getName();
+            }
+        }
+        return null;
+    }
+
 }

+ 0 - 1
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/page/PageRequest.java

@@ -1,5 +1,4 @@
 package com.sckw.core.model.page;
-
 import lombok.Data;
 
 /**

+ 2 - 2
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/PasswordUtils.java

@@ -363,8 +363,8 @@ public class PasswordUtils {
 //    }
 
     public static void main(String[] args) throws Exception {
-        String account = "18482106067";
-        String password = "18482106067";
+        String account = "admin";
+        String password = "123456";
         String salt = generateSalt();
         System.out.println(salt);
 

+ 5 - 1
sckw-common/sckw-common-remote/src/main/java/com/sckw/remote/annotation/SckwRemoteApplication.java

@@ -2,6 +2,7 @@ package com.sckw.remote.annotation;
 
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
 import java.lang.annotation.*;
 
 @Target({ElementType.TYPE})
@@ -10,5 +11,8 @@ import java.lang.annotation.*;
 @Inherited
 @EnableDubbo
 @EnableFeignClients({"com.sckw.*.api.feign"})
+@ComponentScan(basePackages = {"com.sckw.file.config","com.sckw.payment.config","com.sckw.fleet.config","com.sckw" +
+        ".remote.filter","com.sckw.*.controller", "com.sckw.*.service","com.sckw.*.repository", "com.sckw.*.dubbo",
+        "com.sckw.*.model","com.sckw.transport.*","com.sckw.*.serivce"})
 public @interface SckwRemoteApplication {
-}
+}

+ 6 - 0
sckw-gateway/pom.xml

@@ -86,6 +86,12 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+            <version>2.0.57</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>

+ 55 - 0
sckw-gateway/src/main/java/com/sckw/gateway/config/GatewayExceptionConfig.java

@@ -0,0 +1,55 @@
+package com.sckw.gateway.config;
+
+import com.sckw.gateway.exception.GatewayGlobalExceptionHandler;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.boot.autoconfigure.web.ServerProperties;
+import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.http.codec.ServerCodecConfigurer;
+import org.springframework.web.reactive.result.view.ViewResolver;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @desc: 网关异常配置
+ * @date: 2025-11-10
+ */
+@Configuration
+public class GatewayExceptionConfig {
+
+    private final ServerProperties serverProperties;
+
+    private final ApplicationContext applicationContext;
+
+    private final List<ViewResolver> viewResolvers;
+
+    private final ServerCodecConfigurer serverCodecConfigurer;
+
+    public GatewayExceptionConfig(ServerProperties serverProperties,
+                                  ObjectProvider<List<ViewResolver>> viewResolversProvider,
+                                  ServerCodecConfigurer serverCodecConfigurer,
+                                  ApplicationContext applicationContext) {
+        this.serverProperties = serverProperties;
+        this.applicationContext = applicationContext;
+        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
+        this.serverCodecConfigurer = serverCodecConfigurer;
+    }
+
+    /**
+     * 自定义异常处理
+     */
+    @Bean
+    @Order(Ordered.HIGHEST_PRECEDENCE)
+    public ErrorWebExceptionHandler errorWebExceptionHandler() {
+        GatewayGlobalExceptionHandler exceptionHandler = new GatewayGlobalExceptionHandler();
+        exceptionHandler.setMessageWriters(this.serverCodecConfigurer.getWriters());
+        exceptionHandler.setMessageReaders(this.serverCodecConfigurer.getReaders());
+        exceptionHandler.setViewResolvers(this.viewResolvers);
+        return exceptionHandler;
+    }
+}

+ 119 - 0
sckw-gateway/src/main/java/com/sckw/gateway/exception/GatewayGlobalExceptionHandler.java

@@ -0,0 +1,119 @@
+package com.sckw.gateway.exception;
+
+import com.sckw.gateway.pojo.HttpResult;
+import com.sckw.gateway.utils.GatewayExceptionUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.codec.HttpMessageReader;
+import org.springframework.http.codec.HttpMessageWriter;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.util.Assert;
+import org.springframework.web.reactive.function.BodyInserters;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+import org.springframework.web.reactive.result.view.ViewResolver;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @desc: 网关全局异常处理器
+ * @date: 2025-11-10
+ */
+@Slf4j
+public class GatewayGlobalExceptionHandler implements ErrorWebExceptionHandler {
+
+    /**
+     * MessageReader
+     */
+    private List<HttpMessageReader<?>> messageReaders = Collections.emptyList();
+
+    /**
+     * MessageWriter
+     */
+    private List<HttpMessageWriter<?>> messageWriters = Collections.emptyList();
+
+    /**
+     * ViewResolvers
+     */
+    private List<ViewResolver> viewResolvers = Collections.emptyList();
+
+    /**
+     * 存储处理异常后的信息
+     */
+    private ThreadLocal<Map<String, Object>> exceptionHandlerResult = new ThreadLocal<>();
+
+    /**
+     * 参考AbstractErrorWebExceptionHandler
+     */
+    public void setMessageReaders(List<HttpMessageReader<?>> messageReaders) {
+        Assert.notNull(messageReaders, "'messageReaders' must not be null");
+        this.messageReaders = messageReaders;
+    }
+
+    /**
+     * 参考AbstractErrorWebExceptionHandler
+     */
+    public void setViewResolvers(List<ViewResolver> viewResolvers) {
+        this.viewResolvers = viewResolvers;
+    }
+
+    /**
+     * 参考AbstractErrorWebExceptionHandler
+     */
+    public void setMessageWriters(List<HttpMessageWriter<?>> messageWriters) {
+        Assert.notNull(messageWriters, "'messageWriters' must not be null");
+        this.messageWriters = messageWriters;
+    }
+
+    @Override
+    public Mono<Void> handle(ServerWebExchange exchange, Throwable throwable) {
+        // 按照异常类型进行处理
+        ServerHttpRequest request = exchange.getRequest();
+        ServerHttpResponse response = exchange.getResponse();
+        String path = request.getPath().value();
+        String method = request.getMethod().name();
+        // 使用工具类构建统一的异常响应
+        HttpResult result = GatewayExceptionUtil.buildServiceUnavailableResponse(request, throwable);
+        response.setStatusCode(HttpStatus.OK);
+        response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
+
+        // 记录异常日志
+        log.warn("网关统一异常处理: 路径={}, 方法={}, 响应={}", path, method, result);
+
+        // 返回统一的错误响应
+        return response.writeWith(Mono.fromSupplier(() -> {
+            try {
+                byte[] bytes = com.alibaba.fastjson2.JSON.toJSONBytes(result);
+                return response.bufferFactory().wrap(bytes);
+            } catch (Exception e) {
+                log.error("网关异常响应序列化失败", e);
+                return response.bufferFactory().wrap("{\"code\":60500,\"msg\":\"系统异常\",\"data\":null}".getBytes());
+            }
+        }));
+    }
+
+    /**
+     * 参考AbstractErrorWebExceptionHandler
+     */
+    private Mono<ServerResponse> renderErrorResponse(ServerRequest request) {
+        Map<String, Object> result = exceptionHandlerResult.get();
+        return ServerResponse.status(HttpStatus.OK)
+                .contentType(MediaType.APPLICATION_JSON)
+                .body(BodyInserters.fromValue(result));
+    }
+
+    /**
+     * 参考AbstractErrorWebExceptionHandler
+     */
+    @SuppressWarnings("unchecked")
+    private Map<String, Object> getErrorAttributes(ServerRequest request) {
+        return exceptionHandlerResult.get();
+    }
+}

+ 89 - 0
sckw-gateway/src/main/java/com/sckw/gateway/pojo/HttpResult.java

@@ -0,0 +1,89 @@
+package com.sckw.gateway.pojo;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * HTTP结果封装
+ * @author zk
+ * @date Oct 29, 2018
+ */
+@Data
+public class HttpResult implements Serializable {
+
+    private int code = HttpStatus.SUCCESS_CODE;
+    private String msg = HttpStatus.SUCCESS_MESSAGE;
+    private Object data;
+
+    public static HttpResult error() {
+        return error(HttpStatus.GLOBAL_EXCEPTION_CODE, HttpStatus.GLOBAL_EXCEPTION_MESSAGE);
+    }
+
+    public static HttpResult error(String msg) {
+        return error(HttpStatus.GLOBAL_EXCEPTION_CODE, msg);
+    }
+
+    public static HttpResult error(int code, String msg) {
+        HttpResult r = new HttpResult();
+        r.setCode(code);
+        r.setMsg(msg);
+        return r;
+    }
+
+    public static HttpResult error(String msg, Object data) {
+        HttpResult r = new HttpResult();
+        r.setCode(HttpStatus.GLOBAL_EXCEPTION_CODE);
+        r.setMsg(msg);
+        r.setData(data);
+        return r;
+    }
+
+    public static HttpResult error(int code, String msg, Object data) {
+        HttpResult r = new HttpResult();
+        r.setCode(code);
+        r.setMsg(msg);
+        r.setData(data);
+        return r;
+    }
+
+
+    public static HttpResult ok() {
+        return new HttpResult();
+    }
+
+    public static HttpResult ok(String msg) {
+        HttpResult r = new HttpResult();
+        r.setMsg(msg);
+        return r;
+    }
+
+    public static HttpResult ok(Object data) {
+        HttpResult r = new HttpResult();
+        r.setData(data);
+        return r;
+    }
+
+    public static HttpResult ok(int code, String msg) {
+        HttpResult r = new HttpResult();
+        r.setCode(code);
+        r.setMsg(msg);
+        return r;
+    }
+
+    public static HttpResult ok(String msg, Object data) {
+        HttpResult r = new HttpResult();
+        r.setMsg(msg);
+        r.setData(data);
+        return r;
+    }
+
+    public static HttpResult ok(int code, String msg, Object data) {
+        HttpResult r = new HttpResult();
+        r.setCode(code);
+        r.setMsg(msg);
+        r.setData(data);
+        return r;
+    }
+}

+ 198 - 0
sckw-gateway/src/main/java/com/sckw/gateway/pojo/HttpStatus.java

@@ -0,0 +1,198 @@
+package com.sckw.gateway.pojo;
+
+/**
+ * @Description 自定义接口请求状态码(和http请求码无关)
+ * @Author zk
+ * @Date 2019/5/13 0013
+ */
+public class HttpStatus {
+
+    /**成功状态码*/
+    public static final int SUCCESS_CODE = 60200;
+
+    /**成功提示信息*/
+    public static final String SUCCESS_MESSAGE = "success";
+
+    /**未登录状态码*/
+    public static final int UN_LOGIN_CODE = 60300;
+    /**未登录提示信息*/
+    public static final String UN_LOGIN_MESSAGE = "您尚未登录,请先登录!";
+
+    /**访问权限状态码*/
+    public static final int AUTHORITY_NO_CODE = 60403;
+    public static final String ACCESS_FIAL = "暂无该功能权限!";
+
+    /**全局异常状态码*/
+    public static final int GLOBAL_EXCEPTION_CODE = 60500;
+
+    /**完结贸易订单失败异常码*/
+    public static final int COMPLETE_TORDER_FAIL_CODE = 60666;
+
+    /** 商品上架失败异常码*/
+    public static final int GOODS_PUT_ON_SHELVES_FAIL_CODE = 60667;
+
+    /**全局异常提示信息*/
+    public static final String GLOBAL_EXCEPTION_MESSAGE = "攻城狮正在拼命优化,请您稍候再试!";
+
+    /**参数缺失状态码*/
+    public static final int PARAMETERS_MISSING_CODE = 60600;
+    public static final String ID_MISSING = "id不能为空!";
+    public static final String ACCOUNT_MISSING = "用户账号必填!";
+    public static final String ACCOUNT_FREEZE = "用户账号不能重复冻结!";
+    public static final String ACCOUNT_UNFREEZE = "用户账号不能重复解冻!";
+    public static final String PWD_MISSING = "密码不能为空!";
+    public static final String TOKEN_MISSING = "token不能为空!";
+    public static final String TOKEN_ERROR = "非法token!";
+    public static final String CAPCHA_ERROR = "验证码无效!";
+    public static final String ADDRESS_EXISTS = "地点已存在,不可重复!";
+    public static final String INVALID_REQUEST = "无效的接口请求!";
+
+    /**其他自定义状态码*/
+    public static final int CODE_60603 = 60603;
+    public static final String ENTCERTIFICATES_INVAILD = "您的企业资质已失效,暂没有权限访问,请尽快更新资质";
+    public static final String ENTCERTIFICATES_NOT_REGISTER = "您未做企业资质认证,暂没有权限访问";
+    public static final String ENTCERTIFICATES_NOT_PASS = "您的企业资质认证还在审核中,暂没有权限访问";
+
+
+
+    public static final int CODE_60604 = 60604;
+    public static final int CODE_60605 = 60605;
+    public static final int CODE_60606 = 60606;
+    public static final int CODE_60607 = 60607;
+    public static final int CODE_60608 = 60608;
+    public static final int CODE_60609 = 60609;
+    /**sentinel异常code定义*/
+    public static final int CODE_60701 = 60701;
+    public static final int CODE_60801 = 60801;
+    public static final int CODE_60901 = 60901;
+    public static final int CODE_601001 = 601001;
+    public static final int CODE_601101 = 601101;
+    public static final int CODE_601201 = 601201;
+
+    public static final String FLOW_EXCEPTION_ERROR_MESSAGE = "您的访问过于频繁,请稍后重试";
+    public static final String DEGRADE_EXCEPTION_ERROR_MESSAGE = "调用服务响应异常,请稍后重试";
+    public static final String PARAM_FLOW_EXCEPTION_ERROR_MESSAGE = "您对热点参数访问过于频繁,请稍后重试";
+    public static final String SYSTEM_BLOCK_EXCEPTION_ERROR_MESSAGE = "已触碰系统的红线规则,请检查访问参数";
+    public static final String AUTHORITY_EXCEPTION_ERROR_MESSAGE = "授权规则检测不同,请检查访问参数";
+    public static final String OTHER_EXCEPTION_ERROR_MESSAGE = "非法访问,请稍后重试";
+
+    /**版本号和接口版本不对称状态码*/
+    public static final int VERSION_NOT_NEWEST_CODE = 60700;
+    /**版本号和接口版本不对称提示信息*/
+    public static final String VERSION_NOT_NEWEST_MESSAGE = "当前版本较低,请更新升级后再试!";
+
+
+    /**参数格式不正确状态码*/
+    public static final int PARAMETERS_PATTERN_ERROR_CODE = 60800;
+    /**参数格式不正确提示信息*/
+    public static final String PARAMETERS_PATTERN_ERROR_MESSAGE = "参数格式不正确";
+    public static final String CONTACTS_ERROR = "联系人格式不正确";
+    public static final String CONTACTS_PHONE_ERROR = "联系人手机号格式不正确";
+    public static final String LEGAL_NAME_ERROR = "法人格式不正确";
+    public static final String LEGAL_PHONE_ERROR = "法人手机号格式不正确";
+    public static final String LEGAL_ID_CARD_ERROR = "法人身份证号格式不正确";
+    public static final String ENT_CODE_ERROR = "营业执照编号格式不正确";
+
+    /**账号在别处登录状态码*/
+    public static final int ACCOUNT_OTHER_LOGIN_CODE = 60900;
+    /**账号在别处登录提示信息*/
+    public static final String ACCOUNT_OTHER_LOGIN_MESSAGE = "您的账号已在其他设备登录,如非本人操作,请及时修改密码!";
+
+
+    /**token无效状态码*/
+    public static final int TOKEN_INVALID_CODE = 60901;
+    /**token无效提示信息*/
+    public static final String TOKEN_INVALID_MESSAGE = "由于您一段时间未操作,为了您的账户安全,请重新登录!";
+
+    /**请求超过次数*/
+    public static final int FREQUENCY_OUT = 60902;
+    /**请求超过次数提示信息*/
+    public static final String FREQUENCY_OUT_MESSAGE = "您的操作过于频繁,请刷新浏览器或稍候重试!";
+
+    /**审核状态状态码*/
+    public static final int ACCOUNT_AUDIT_CODE = 60903;
+    /**审核状态状提示信息*/
+    public static final String ACCOUNT_AUDIT_MESSAGE = "您所属企业企业资质审批未通过,请核实确认!";
+
+    /**微信账号未绑定态码*/
+    public static final int WECHAR_BIND_CODE = 60904;
+    /**微信账号未绑定提示信息*/
+    public static final String WECHAR_BIND_MESSAGE = "您的微信还未绑定危品汇账号!";
+
+    /**
+     * 自定义状态码,该状态码没有特殊含义,只是提供一个状态标识(目前提供9个,可自行扩展)
+     * 现作为校验失败的一类异常码
+     */
+    public static final int CODE_10301 = 10301;
+
+    /**数据库的操作失败*/
+    public static final int CRUD_FAIL_CODE = 60601;
+    public static final String UPDATE_FAIL = "更新失败";
+    public static final String INSERT_FAIL = "新增失败";
+    public static final String DELETE_FAIL = "删除失败";
+
+    /**未查询到相关信息*/
+    public static final int QUERY_FAIL_CODE = 60602;
+    public static final String ACCOUNT_NOT_EXISTS = "用户信息不存在或已失效";
+    public static final String ENT_NOT_EXISTS = "企业信息不存在或已失效";
+    public static final String DEPT_NOT_EXISTS = "机构信息不存在或已失效";
+    public static final String ENTCERTIFICATES_NOT_EXISTS = "未查询到企业资质信息";
+    public static final String ROLE_NOT_EXISTS = "未查询到关联的角色";
+    public static final String USER_DEPT_NOT_EXISTS = "未查询到用户-机构关联信息";
+    public static final String MENU_NOT_EXISTS = "未查询到菜单信息";
+    public static final String PARENT_MENU_NOT_EXISTS = "未查询到父菜单信息";
+    public static final String PARENT_UNIT_NOT_EXISTS = "未查询到父级单位信息";
+    public static final String COOPERATE_ATTRIBUTE_NOT_EXISTS = "未查询到已有的合作属性";
+    public static final String COOPERATE_NOT_EXISTS = "未查询到合作记录或已失效";
+    public static final String COOPERATE_CANCEL_EXISTS = "未查询到可撤销的记录";
+    public static final String ADDRESS_NOT_EXISTS = "未查询到地址记录或已失效";
+    public static final String CONTRACT_NOT_EXISTS = "未查询到合同或已失效";
+    public static final String BANNER_NOT_EXISTS = "未查询到banner数据或已失效";
+
+    /**自定义提示消息*/
+    public static final String PASSWD_ERROR = "密码不正确";
+    public static final String PASSWD_REPEAT = "新密码与旧密码不能一样!";
+    public static final String CAPTCHA_ERROR = "验证码输入错误";
+    public static final String MSG_001 = "密码重置成功";
+    public static final String MSG_002 = "密码修改成功";
+    public static final String MSG_003 = "新增成功";
+    public static final String MSG_004 = "审批完成";
+    public static final String MSG_005 = "更新成功";
+    public static final String MSG_006 = "当前系统不允许绑定多个岗位!";
+    public static final String MSG_007 = "注册成功!";
+    public static final String MSG_008 = "删除成功!";
+    public static final String MSG_009 = "认证提交成功!";
+    public static final String MSG_010 = "绑定成功!";
+    public static final String MSG_011 = "当前企业还存在员工数据,不能删除!";
+    public static final String MSG_012 = "只能解除状态为合作中的记录!";
+    public static final String MSG_013 = "只能删除状态为已解除的记录!";
+    public static final String MSG_014 = "导出失败";
+    public static final String MSG_015 = "与对方企业存在待审核的合作关系,请撤销或者完成审核再申请!";
+    public static final String MSG_016 = "与对方企业已存在相同属性的合作关系!";
+    public static final String MSG_017 = "发起申请成功!";
+    public static final String MSG_018 = "撤销成功!";
+    public static final String MSG_019 = "只能操作正在审核中的记录!";
+    public static final String MSG_020 = "当前机构还存在员工数据,不能删除!";
+    public static final String MSG_021 = "不能重复设置默认地址!";
+    public static final String MSG_022 = "只能对草稿进行删除!";
+    public static final String MSG_023 = "解除成功!";
+    public static final String MSG_024 = "名称不能重复!";
+    public static final String MSG_025 = "禁止删除本人信息!";
+    public static final String MSG_026 = "资质认证审核中,请等待审核后再提交!";
+    public static final String MSG_027 = "一级机构不能删除!";
+    public static final String MSG_028 = "合同未签约,不能手动完结!";
+    public static final String MSG_029 = "合同编号超长!";
+    public static final String MSG_030 = "合同名称超长!";
+    public static final String MSG_031 = "您与所选企业存在未完结销售订单,当前无法删除!";
+    public static final String MSG_032 = "您与所选企业存在未完结托运承运订单,当前无法删除!";
+    public static final String MSG_033 = "当前企业资质在审核中,无法删除!";
+    public static final String MSG_034 = "您与所选企业存在未完结对账单,当前无法删除!";
+    public static final String MSG_035 = "地址信息已存在";
+
+    public static final String ENT_EXISTS = "企业已存在,不可重复!";
+    public static final String ACCOUNT_EXISTS = "用户账号已存在!";
+    public static final String DICTTYPE_EXISTS = "字典类型已存在,不可重复!";
+    public static final String DICT_EXISTS = "字典键值已存在,不可重复!";
+    public static final String PL34 = "3PL和4PL不能同时注册!";
+
+}

+ 51 - 0
sckw-gateway/src/main/java/com/sckw/gateway/utils/GatewayExceptionUtil.java

@@ -0,0 +1,51 @@
+package com.sckw.gateway.utils;
+
+import com.sckw.gateway.pojo.HttpResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+
+/**
+ * @desc: 网关异常处理工具类
+ * @date: 2025-11-10
+ */
+@Slf4j
+public class GatewayExceptionUtil {
+
+    /**
+     * 构建服务不可用响应
+     */
+    public static HttpResult buildServiceUnavailableResponse(ServerHttpRequest request, Throwable throwable) {
+        String path = request.getPath().value();
+        String method = request.getMethod().name();
+
+        log.error("网关服务不可用异常: 路径={}, 方法={}, 异常信息={}", path, method, throwable.getMessage());
+
+        // 根据异常类型返回不同的错误信息
+        if (throwable instanceof org.springframework.cloud.gateway.support.NotFoundException) {
+            return HttpResult.error(60500, "目标服务不存在或未启动");
+        } else if (throwable instanceof org.springframework.cloud.gateway.support.TimeoutException) {
+            return HttpResult.error(60500, "服务响应超时,请稍后重试");
+        } else if (throwable instanceof org.springframework.web.server.ResponseStatusException) {
+            org.springframework.web.server.ResponseStatusException statusException =
+                    (org.springframework.web.server.ResponseStatusException) throwable;
+            if (statusException.getStatusCode().value() == 503) {
+                return HttpResult.error(60500, "服务暂时不可用,请稍后重试");
+            }
+        }
+
+        // 默认返回服务不可用
+        return HttpResult.error(60500, "服务暂时不可用,请稍后重试");
+    }
+
+    /**
+     * 构建网关内部错误响应
+     */
+    public static HttpResult buildInternalErrorResponse(ServerHttpRequest request, Throwable throwable) {
+        String path = request.getPath().value();
+        String method = request.getMethod().name();
+
+        log.error("网关内部错误: 路径={}, 方法={}, 异常信息={}", path, method, throwable.getMessage(), throwable);
+
+        return HttpResult.error(60500, "网关内部错误,请联系管理员");
+    }
+}

+ 29 - 0
sckw-gateway/src/main/resources/bootstrap-cxf.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

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

@@ -1,11 +1,13 @@
 package com.sckw.contract.api;
 
 import com.sckw.contract.api.model.dto.res.ContractCommonInfoResDto;
+import com.sckw.contract.api.model.dto.res.ContractLogisticsAndTradeOrderResDto;
 import com.sckw.contract.api.model.dto.res.ContractLogisticsOrderResDto;
 
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @author czh
@@ -49,4 +51,13 @@ public interface RemoteContractService {
      * @return
      */
     ContractLogisticsOrderResDto getContractByContractNo(String contractNo, Long acceptId, Long consignId);
+
+    /**
+     * 根据贸易合同id查询物流合同信息
+     * @param tradeOrderContractId 贸易合同id
+     * @return 贸易合同和物流合同信息
+     */
+    ContractLogisticsAndTradeOrderResDto queryContractByContractId(Long tradeOrderContractId,Long tradeId);
+
+
 }

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

@@ -0,0 +1,56 @@
+package com.sckw.contract.api.model.dto.res;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author czh
+ * @desc 贸易合同和物流合同公共信息
+ * @date 2023/7/19
+ */
+@Data
+public class ContractLogisticsAndTradeOrderResDto implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 2656035411576510101L;
+
+    /**
+     * 贸易合同id
+     */
+    private Long id;
+
+    /**
+     * 贸易合同名
+     */
+    private String contactName;
+
+    /**
+     * 贸易合同号
+     */
+    private String contractNo;
+
+    List<ContractLogisticsOrder> logisticsContracts;
+
+    @Data
+    public static class ContractLogisticsOrder implements Serializable{
+        @Serial
+        private static final long serialVersionUID = 3434430919666054438L;
+        /**
+         * 物流合同id
+         */
+        private Long logisticsContractId;
+
+        /**
+         * 物流合同名
+         */
+        private String logisticsContractName;
+
+        /**
+         * 物流合同号
+         */
+        private String logisticsContractNo;
+    }
+}

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

@@ -103,5 +103,8 @@ public interface RemoteFleetService {
      */
     RFleetVo findFleetById(Long fleetId);
 
+    List<TmsTruckAxleNumVO> getCarAxisInfo(List<Integer> axleNumIds);
 
+
+    List<RTruckVo> findTruckByTruckIds(Set<Long> truckIds);
 }

+ 8 - 0
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/vo/RTruckVo.java

@@ -66,4 +66,12 @@ public class RTruckVo implements Serializable {
      * 车队id
      */
     private String fleetId;
+    /**
+     * 轴数
+     */
+    private String carAxis;
+    /**
+     * 车辆状态
+     */
+    private Integer status;
 }

+ 31 - 0
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/vo/TmsTruckAxleNumVO.java

@@ -0,0 +1,31 @@
+package com.sckw.fleet.api.model.vo;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Author: donglang
+ * Time: 2025-10-23
+ * Des: 车辆轴数
+ * Version: 1.0
+ */
+
+@Data
+@TableName("tms_truck_axle_num")
+public class TmsTruckAxleNumVO implements Serializable {
+
+    /**
+     * 主键ID
+     */
+    private Integer id;
+
+    /**
+     * 车辆轴数名称
+     */
+    private String name;
+
+
+}

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

@@ -116,4 +116,6 @@ public interface TradeOrderInfoService {
      * @return: java.lang.Boolean
      */
     Boolean associateEnt(Long firstEntId,Long secondEntId);
+
+    OrderDetailVo queryByTradeOrderId(Long tradeOrderId);
 }

+ 332 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/OrderDetailVo.java

@@ -0,0 +1,332 @@
+package com.sckw.order.api.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+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-07 15:35
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class OrderDetailVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -2951319997472302360L;
+    private Long entId;
+
+    /**
+     * 订单编号
+     */
+    private String tOrderNo;
+
+    /**
+     * 货物数量
+     */
+    private BigDecimal amount;
+
+    /**
+     * 单位(吨、方、件、箱、其他)
+     */
+    private String unit;
+
+    /**
+     * 价格
+     */
+    private BigDecimal price;
+
+    /**
+     * 交易方式(预付款、货到付款)
+     */
+    private String trading;
+
+    /**
+     * 提货方式(采方自提、供应配送)
+     */
+    private String pickupType;
+
+    /**
+     * 交付类型(签发交付、签收交付)
+     */
+    private String deliveryType;
+
+    /**
+     * 开始日期
+     */
+    private Date startTime;
+
+    /**
+     * 结束日期
+     */
+    private Date endTime;
+
+    /**
+     * 已委托量
+     */
+    private BigDecimal entrustAmount;
+
+    /**
+     * 实际交付量
+     */
+    private BigDecimal actualAmount;
+
+    /**
+     * 是否关联对账单:0未关联,1已关联
+     */
+    private Integer associateStatement;
+
+    /**
+     * 订单创建来源类型(1采购下单/2销售代客下单)
+     */
+    private String source;
+
+    /**
+     * 计费方式
+     */
+    private Integer chargeType;
+
+    /**
+     * 托运方式
+     */
+    private Integer consignmentWay;
+    /**
+     * 商品信息
+     */
+    private GoodsInfo goodsInfo;
+
+
+    /**
+     * 单位信息
+     */
+    private List<UnitInfo> unitInfo;
+
+    /**
+     * 地址信息
+     */
+    private List<AddressInfo> addressInfo;
+
+    /**
+     * 合同信息
+     */
+    private TradeContractInfo contractInfo;
+    @Data
+    public static class GoodsInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -3701264190688407033L;
+        /**
+         * 交易订单id
+         */
+
+        private Long tOrderId;
+
+        /**
+         * 订单编号
+         */
+
+        private String tOrderNo;
+
+        /**
+         * 商品id
+         */
+        private Long goodsId;
+
+        /**
+         * 商品类型
+         */
+        private String goodsType;
+
+        /**
+         * sku
+         */
+        private Long skuId;
+
+        /**
+         * 单位(吨、方、件、箱、其他)
+         */
+        private String unit;
+
+        /**
+         * 商品成交单价
+         */
+        private BigDecimal unitPrice;
+
+        /**
+         * kwp_goods_price_range表主键ID
+         */
+        private Long priceRangeId;
+        /**
+         * 商品名称
+         */
+
+        private String goodsName ;
+    }
+    @Data
+    public static class UnitInfo implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -449419330867155453L;
+
+        /**
+         * 交易订单id
+         */
+        @JsonProperty("tOrderId")
+        private Long tOrderId;
+
+        /**
+         * 订单编号
+         */
+        @JsonProperty("tOrderNo")
+        private String tOrderNo;
+
+        /**
+         * 单位类型(1采购单位、2销售单位)
+         */
+        private String unitType;
+
+        /**
+         * 企业id
+         */
+        private Long entId;
+
+        /**
+         * 顶级企业ID
+         */
+        private Long topEntId;
+
+        /**
+         * 企业名称
+         */
+        private String firmName;
+
+        /**
+         * 联系人id
+         */
+        private Long contactsId;
+
+        /**
+         * 联系人姓名
+         */
+        private String contacts;
+
+        /**
+         * 联系电话
+         */
+        private String phone;
+        @TableField(exist = false)
+        private String tradeOrderIdAndUnitType;
+    }
+    @Data
+    public static class AddressInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = 8189538973212791861L;
+        /**
+         * 交易订单id
+         */
+        private Long tOrderId;
+
+        /**
+         * 订单编号
+         */
+        private String tOrderNo;
+
+        /**
+         * 地址类型(1装货地址、2卸货地址)
+         */
+        private String addressType;
+
+        /**
+         * 地址名称
+         */
+        private String name;
+
+        /**
+         * 地址类型
+         */
+        private String type;
+
+        /**
+         * 联系人姓名
+         */
+        private String contacts;
+
+        /**
+         * 联系电话
+         */
+        private String phone;
+
+        /**
+         * 所在地区
+         */
+        private Integer cityCode;
+
+        /**
+         * 所属区域名称
+         */
+        private String cityName;
+
+        /**
+         * 详细地址
+         */
+        private String detailAddress;
+
+        /**
+         * 纬度
+         */
+        private String lat;
+
+        /**
+         * 经度
+         */
+        private String lng;
+
+        /**
+         * 电子围栏
+         */
+        private String fence;
+
+        /**
+         * 排序(升序)
+         */
+        private Integer sort;
+
+        @TableField(exist = false)
+        private String tradeOrderIdTypeKey;
+    }
+    @Data
+    public static class TradeContractInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -2341220780405247730L;
+        /**
+         * 合同id
+         */
+        private Long contractId;
+
+        /**
+         * 合同编号
+         */
+        private String contractNo;
+
+        /**
+         * 订单id(销售订单/采购订单)
+         */
+        private Long tOrderId;
+
+        /**
+         * 订单编号(销售订单/采购订单)
+         */
+        private String tOrderNo;
+    }
+}

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

@@ -73,4 +73,6 @@ public interface GoodsInfoService {
     KwpGoods getGoodsByGoodsName(String goodsName);
 
     List<Long> getGoodsByGoodsNameAndTaxRate(String goodsName, String goodsTaxRate);
+
+    List<KwpGoods> getGoodsByNameTypeDesc(String goodsName, String goodsType, String goodsSpec);
 }

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

@@ -281,4 +281,11 @@ public interface RemoteSystemService {
     PageDataResult<KwsEnterpriseResDto> pageEnt(int pageNum, int pageSize, Long entId);
 
     KwsEnterpriseResDto queryEnterpriseByEntId(Long entId);
+
+    List<KwsEnterpriseResDto> queryEntListByEntIds(List<Long> entIds);
+
+    EntTypeResDto queryEntTypeById(Long entId);
+
+
+
 }

+ 30 - 3
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java

@@ -7,11 +7,10 @@ import com.sckw.transport.api.model.dto.RWaybillOrderDto;
 import com.sckw.transport.api.model.param.ContractSignLogisticsParam;
 import com.sckw.transport.api.model.param.LogisticsOrderParam;
 import com.sckw.transport.api.model.param.UpdateOrderStatusDto;
-import com.sckw.transport.api.model.vo.KwtLogisticsOrderVO;
-import com.sckw.transport.api.model.vo.RTruckMonitorVo;
-import com.sckw.transport.api.model.vo.RWaybillOrderVo;
+import com.sckw.transport.api.model.vo.*;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * @author lfdc
@@ -119,4 +118,32 @@ public interface TransportRemoteService {
     HttpResult logisticsOrderInitiateReconciliationUpdateStatus(UpdateOrderStatusDto params);
 
     List<RWaybillOrderVo> queryWaybillOrderByEntId(Long entId);
+
+    /**
+     * 根据贸易订单集合查询物流公司
+     * @param tradeOrderIds 贸易订单集合
+     * @return 物流公司
+     */
+    List<RTransportEntVo> queryTransportEnt(Set<Long> tradeOrderIds);
+
+    List<RWaybillSubOrderVo> queryWaybillOrderByTradeOrderIds(Set<Long> tradeOrderIds);
+
+    /**
+     * 根据贸易订单查询物流合同
+     * @param tradeId 贸易订单
+     * @return 物流合同
+     */
+    List<LogisticContractVo> queryLogisticContractByTradeId(Long tradeId);
+    /**
+     * 根据贸易订单查询物流合同
+     * @param tradeId 贸易订单
+     * @return 物流公司
+     */
+    List<RTransportEntVo> queryTransportEntByTradeOrderId(Long tradeId);
+
+    /**
+     * 根据贸易订单查询物流订单
+     * @param tradeId 贸易订单id
+     */
+    List<KwtLogisticsOrderVO> queryLogisticOrderByTradeId(Long tradeId);
 }

+ 23 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/LogisticContractVo.java

@@ -0,0 +1,23 @@
+package com.sckw.transport.api.model.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 物流合同数据
+ * @create :2025-11-08 10:30:00
+ */
+@Data
+public class LogisticContractVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -1497190293426583205L;
+    /**
+     * 物流合同id
+     */
+    private Long logContractId;
+
+}

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

@@ -0,0 +1,49 @@
+package com.sckw.transport.api.model.vo;
+
+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-07 14:34:00
+ */
+@Data
+public class RTransportEntVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 8890768862260851922L;
+    /**
+     * 贸易订单id
+     */
+    private Long tradeOrderId;
+    /**
+     * 运输单位类型
+     */
+    private Integer transportEntType;
+    /**
+     * 运输企业id
+     */
+    private Long transportEntId;
+    /**
+     * 运输企业名称
+     */
+    private String transportEntName;
+    /**
+     * 运输单价
+     */
+    private BigDecimal transportPrice;
+    /**
+     * 运输联系人
+     */
+    private String transportContacts;
+    /**
+     * 运输联系人电话
+     */
+    private String transportContactsPhone;
+
+}

+ 93 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/RWaybillSubOrderVo.java

@@ -0,0 +1,93 @@
+package com.sckw.transport.api.model.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @author PC
+ */
+@Data
+public class RWaybillSubOrderVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -2991208083876944003L;
+    /**
+     * 交易订单
+     */
+    private Long tradeId;
+    private List<BillSubOrder> subOrders;
+
+
+
+
+    @Data
+    public static class BillSubOrder implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -3897987095923103657L;
+
+        /**
+         * 企业id
+         */
+        private Long entId;
+
+        /**
+         * 物流订单id(kwt_logistics_order)
+         */
+        private Long lOrderId;
+
+        /**
+         * 物流订单id
+         */
+        private Long wOrderId;
+
+        /**
+         * 编号
+         */
+        private String wOrderNo;
+
+        /**
+         * 托量单位
+         */
+        private String unit;
+
+        /**
+         * 已委托量
+         */
+        private BigDecimal entrustAmount;
+
+        /**
+         * 卸货重量
+         */
+        private BigDecimal unloadAmount;
+
+        /**
+         * 计划结束日期
+         */
+        private Date unloadTime;
+
+        /**
+         * 装货重量
+         */
+        private BigDecimal loadAmount;
+
+        /**
+         * 计划开始日期
+         */
+        private Date loadTime;
+
+        /**
+         * 亏吨重量
+         */
+        private BigDecimal deficitAmount;
+
+        /**
+         * 亏吨扣款
+         */
+        private BigDecimal deficitPrice;
+    }
+}

+ 1 - 0
sckw-modules/pom.xml

@@ -31,6 +31,7 @@
     <properties>
         <!--模块版本-->
         <contract.revision>1.1.0</contract.revision>
+        <example.revision>1.1.0</example.revision>
         <file.revision>1.1.0</file.revision>
         <fleet.revision>1.1.0</fleet.revision>
         <manage.revision>1.2.0</manage.revision>

+ 10 - 0
sckw-modules/sckw-contract/pom.xml

@@ -104,6 +104,16 @@
             <artifactId>sckw-common-stream</artifactId>
             <version>${basic.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
+            <version>2.6.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
+            <version>4.5.0</version>
+        </dependency>
 
     </dependencies>
     <build>

+ 42 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcContractSaleController.java

@@ -1,6 +1,7 @@
 package com.sckw.contract.controller;
 
 import com.sckw.contract.model.vo.req.*;
+import com.sckw.contract.model.vo.res.ContractDetailResp;
 import com.sckw.contract.model.vo.res.QueryListResVo;
 import com.sckw.contract.service.operateService.KwcContractTradeService;
 import com.sckw.core.model.enums.EntTypeEnum;
@@ -9,6 +10,8 @@ import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.core.web.response.result.PageDataResult;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
@@ -27,6 +30,7 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("kwcSale")
 @RequiredArgsConstructor
+@Tag(name = "贸易合同相关接口")
 public class KwcContractSaleController {
 
     private final KwcContractTradeService kwcContractTradeService;
@@ -39,11 +43,27 @@ public class KwcContractSaleController {
      * @return HttpResult
      */
     @PostMapping("/queryListByPage")
+    @Operation(summary = "分页查询贸易合同")
     public BaseResult<PageResult> queryListByPage(@RequestBody QueryListReqVo reqVo) {
-        reqVo.setEntType(EntTypeEnum.SUPPLIER.getCode());
+        //reqVo.setEntType(EntTypeEnum.SUPPLIER.getCode());
         return BaseResult.success(kwcContractTradeService.queryListByPage(reqVo));
     }
 
+    /**
+     * @desc: 分页查询
+     * @param: reqVo 分页入参
+     * @author: sky
+     * @date 2023/7/17  如果上面不能用可以用这个
+     * @return HttpResult
+     */
+    @PostMapping("/queryTradeListByPage")
+    @Operation(summary = "分页查询贸易合同")
+    public BaseResult<PageDataResult<QueryListResVo>> queryTradeListByPage(@RequestBody QueryTradeReq req) {
+        //reqVo.setEntType(EntTypeEnum.SUPPLIER.getCode());
+        return BaseResult.success(kwcContractTradeService.queryTradeListByPage(req));
+    }
+
+
     /**
      * @param reqVo 新增入参
      * @return HttpResult
@@ -52,6 +72,7 @@ public class KwcContractSaleController {
      * @date: 2023/7/18
      */
     @PostMapping("/addTradeContract")
+    @Operation(summary = "新增贸易合同")
     public BaseResult<String> addTradeContract(@Valid @RequestBody ContractTradeReqVo reqVo) {
         kwcContractTradeService.addTradeContract(reqVo);
         return BaseResult.success(HttpStatus.MSG_003);
@@ -65,6 +86,7 @@ public class KwcContractSaleController {
      * @date: 2023/7/18
      */
     @PostMapping("/addSupplyTradeContract")
+    @Operation(summary = "补充合同")
     public BaseResult<String> addSupplyTradeContract(@Valid @RequestBody SupplyContractTradeReq req) {
         kwcContractTradeService.addSupplyTradeContract(req);
         return BaseResult.success(HttpStatus.MSG_003);
@@ -115,6 +137,7 @@ public class KwcContractSaleController {
      * @return HttpResult
      */
     @PostMapping("/updateTradeContract")
+    @Operation(summary = "修改贸易合同")
     public BaseResult<String> updateTradeContract(@Valid @RequestBody ContractTradeReqVo reqVo) {
         kwcContractTradeService.update(reqVo);
         return BaseResult.success();
@@ -219,4 +242,22 @@ public class KwcContractSaleController {
         kwcContractTradeService.exportTradeList(reqVo, response);
     }
 
+    /**
+     * 修改合同状态 (审核,手动完结)
+     */
+    @PostMapping("/updateStatus")
+    @Operation(summary = "审批完结贸易合同")
+    public BaseResult<Boolean> updateStatus(@Valid @RequestBody ApprovalReq req) {
+        return BaseResult.success(kwcContractTradeService.updateStatus(req));
+    }
+
+    /**
+     * 查询合同详情
+     */
+
+    @PostMapping("/queryContractDetail")
+    @Operation(summary = "查询贸易合同详情")
+    public BaseResult<ContractDetailResp> queryContractDetail(@Valid @RequestBody ContractDetailReq req) {
+        return BaseResult.success(kwcContractTradeService.queryContractDetail(req));
+    }
 }

+ 71 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcLogisticsContractController.java

@@ -0,0 +1,71 @@
+package com.sckw.contract.controller;
+
+import com.sckw.contract.model.vo.req.ContractDetailReq;
+import com.sckw.contract.model.vo.req.LogisticListReq;
+import com.sckw.contract.model.vo.req.QueryLogisticListReq;
+import com.sckw.contract.model.vo.req.UpdateLogisticsReq;
+import com.sckw.contract.model.vo.res.QueryLogisticDetailResp;
+import com.sckw.contract.model.vo.res.QueryLogisticListResp;
+import com.sckw.contract.service.operateService.KwcContractLogisticsService;
+import com.sckw.core.web.response.BaseResult;
+import com.sckw.core.web.response.result.PageDataResult;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 物流合同相关接口
+ * @create :2025-11-06 09:34:00
+ */
+@RestController
+@RequestMapping("logisticsContract")
+@RequiredArgsConstructor
+@Tag(name = "物流合同接口")
+public class KwcLogisticsContractController {
+    private final KwcContractLogisticsService kwcContractLogisticsService;
+
+    /**
+     * @desc: 分页查询
+     * @param: reqVo 分页入参
+     * @author: sky
+     * @date 2023/7/13
+     * @return HttpResult
+     */
+    @PostMapping("/queryListByPage")
+    @Operation(summary = "分页查询物流合同")
+    public BaseResult<PageDataResult<QueryLogisticListResp>> queryListByPage(@RequestBody QueryLogisticListReq req) {
+        return BaseResult.success(kwcContractLogisticsService.queryLogisticsContractListByPage(req));
+    }
+    /**
+     * 新增物流合同
+     */
+    @Operation(summary = "新增或者修改物流合同")
+    @PostMapping("/addOrUpdateLogisticsContract")
+    public BaseResult<Boolean> addOrUpdateLogisticsContract(@RequestBody LogisticListReq req) {
+        return BaseResult.success(kwcContractLogisticsService.addOrUpdateLogisticsContract(req));
+    }
+
+    /**
+     * 查询物流合同明细
+     */
+    @PostMapping("/queryLogisticsContractDetail")
+    @Operation(summary = "查询物流合同明细")
+    public BaseResult<QueryLogisticDetailResp> queryLogisticsContractDetail(@RequestBody ContractDetailReq req) {
+       return BaseResult.success(kwcContractLogisticsService.queryLogisticsContractDetail(req)) ;
+    }
+
+    /**
+     * 修改合同状态
+     */
+    @PostMapping("/updateLogistics")
+    @Operation(summary = "手动完结")
+    public BaseResult<Boolean> updateLogistics(@RequestBody UpdateLogisticsReq req) {
+        return BaseResult.success(kwcContractLogisticsService.updateLogistics(req));
+    }
+}

+ 50 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java

@@ -1,7 +1,10 @@
 package com.sckw.contract.dubbo;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.contract.api.model.dto.res.ContractCommonInfoResDto;
+import com.sckw.contract.api.model.dto.res.ContractLogisticsAndTradeOrderResDto;
 import com.sckw.contract.api.model.dto.res.ContractLogisticsOrderResDto;
 import com.sckw.contract.api.model.dto.res.EntInfo;
 import com.sckw.contract.dao.KwcContractLogisticsMapper;
@@ -11,6 +14,8 @@ import com.sckw.contract.model.dto.res.QueryContractValidCountResDto;
 import com.sckw.contract.model.entity.KwcContractLogistics;
 import com.sckw.contract.model.entity.KwcContractLogisticsUnit;
 import com.sckw.contract.model.entity.KwcContractTrade;
+import com.sckw.contract.repository.KwcContractLogisticsRepository;
+import com.sckw.contract.repository.KwcContractTradeRepository;
 import com.sckw.contract.service.KwcContractLogisticsUnitService;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.ContractStatusEnum;
@@ -18,6 +23,9 @@ import com.sckw.core.model.enums.CooperateTypeEnum;
 import com.sckw.core.model.enums.SigningWayEnum;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.system.api.RemoteSystemService;
+import com.sckw.transport.api.dubbo.TransportRemoteService;
+import com.sckw.transport.api.model.vo.LogisticContractVo;
+import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +40,7 @@ import java.util.stream.Collectors;
  * @date 2023/7/31
  */
 @DubboService(group = "design", version = "1.0.0")
+@RequiredArgsConstructor
 public class RemoteContractServiceImpl implements RemoteContractService {
 
     @Autowired
@@ -48,6 +57,11 @@ public class RemoteContractServiceImpl implements RemoteContractService {
 
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     private RemoteSystemService remoteSystemService;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
+    private TransportRemoteService transportRemoteService ;
+
+    private final KwcContractTradeRepository kwcContractTradeRepository ;
+    private final KwcContractLogisticsRepository contractLogisticsRepository;
 
     @Override
     public Map<Long, ContractCommonInfoResDto> queryContractBaseInfo(List<Long> contractIds) {
@@ -192,6 +206,42 @@ public class RemoteContractServiceImpl implements RemoteContractService {
         return logisticsOrderResDto;
     }
 
+    @Override
+    public ContractLogisticsAndTradeOrderResDto queryContractByContractId(Long tradeOrderContractId,Long tradeId) {
+        //根据贸易合同查询贸易合同
+        KwcContractTrade kwcContractTrade = kwcContractTradeRepository.queryByContractId(tradeOrderContractId);
+        if (Objects.isNull(kwcContractTrade)){
+            return new ContractLogisticsAndTradeOrderResDto() ;
+        }
+        ContractLogisticsAndTradeOrderResDto contractLogisticsAndTradeOrderResDto = new ContractLogisticsAndTradeOrderResDto();
+        contractLogisticsAndTradeOrderResDto.setId(kwcContractTrade.getId());
+        contractLogisticsAndTradeOrderResDto.setContactName(kwcContractTrade.getName());
+        contractLogisticsAndTradeOrderResDto.setContractNo(kwcContractTrade.getContractNo());
+        //根据贸易订单id查询物流订单和物流合同关联信息
+        List<LogisticContractVo> logisticContractVos = transportRemoteService.queryLogisticContractByTradeId(tradeId);
+        Set<Long> logContractIds = Sets.newHashSet();
+        if (CollectionUtils.isNotEmpty(logisticContractVos)){
+            logContractIds =
+                    logisticContractVos.stream().map(LogisticContractVo::getLogContractId).collect(Collectors.toSet());
+        }
+        //查询物流合同
+        List<KwcContractLogistics> contractLogistics = contractLogisticsRepository.queryByLogisticContractIds(logContractIds);
+        if (CollectionUtils.isNotEmpty(contractLogistics)){
+            List<ContractLogisticsAndTradeOrderResDto.ContractLogisticsOrder> contractLogisticsOrders = contractLogistics.stream().map(c -> {
+                ContractLogisticsAndTradeOrderResDto.ContractLogisticsOrder contractLogisticsOrder = new ContractLogisticsAndTradeOrderResDto.ContractLogisticsOrder();
+                contractLogisticsOrder.setLogisticsContractId(c.getId());
+                contractLogisticsOrder.setLogisticsContractName(c.getName());
+                contractLogisticsOrder.setLogisticsContractNo(c.getContractNo());
+                return contractLogisticsOrder;
+            }).collect(Collectors.toList());
+            contractLogisticsAndTradeOrderResDto.setLogisticsContracts(contractLogisticsOrders);
+        }
+
+        return contractLogisticsAndTradeOrderResDto;
+    }
+
+
+
     private ContractCommonInfoResDto fillContractLogistics(KwcContractLogistics kwcContractLogistics) {
         ContractCommonInfoResDto contractCommonInfoResDto = new ContractCommonInfoResDto();
         List<EntInfo> entList = new ArrayList<>();

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

@@ -132,5 +132,10 @@ public class KwcContractLogistics implements Serializable {
      * 业务id
      */
     private String businessId;
+    /**
+     * 通用价格
+     */
+    @TableField("common_price")
+    private BigDecimal commonPrice;
 
 }

+ 3 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractLogisticsGoods.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
@@ -121,4 +122,6 @@ public class KwcContractLogisticsGoods implements Serializable {
      */
     private Integer delFlag;
 
+    @TableField(exist = false)
+    private String contractIdGoodsIdKey;
 }

+ 4 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractLogisticsUnit.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
@@ -89,4 +90,7 @@ public class KwcContractLogisticsUnit implements Serializable {
      */
     private Integer delFlag;
 
+    @TableField(exist = false)
+    private String contractIdUnitTypeKey;
+
 }

+ 13 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractTradeGoods.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
@@ -89,5 +90,17 @@ public class KwcContractTradeGoods implements Serializable {
      * 是否删除(0未删除,1删除)
      */
     private Integer delFlag;
+    /**
+     * 开始时间
+     */
+    @TableField("start_time")
+    private Date startTime;
+    /**
+     * 结束时间
+     */
+    @TableField("end_time")
+    private Date endTime;
 
+    @TableField(exist = false)
+    private String contractIdGoodsIdKey;
 }

+ 39 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractTradeOrder.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 import lombok.Data;
 
@@ -69,5 +70,42 @@ public class KwcContractTradeOrder implements Serializable {
      * 是否删除(0未删除,1删除)
      */
     private Integer delFlag;
-
+//    /**
+//     * 商品id
+//     */
+//    @TableField("goods_id")
+//    private Long goodsId;
+//
+//    /**
+//     * 计费方式 1:按卸货量 2:按装货量
+//     */
+//    @TableField("billing_way")
+//    private Integer billingWay;
+//    /**
+//     * 下单量
+//     */
+//    @TableField("amount")
+//    private BigDecimal amount;
+//    /**
+//     * 累计装货量
+//     */
+//    @TableField("load_amount")
+//    private BigDecimal loadAmount;
+//
+//    /**
+//     * 累计卸货量
+//     */
+//    @TableField("unload_amount")
+//    private BigDecimal unloadAmount;
+//    /**
+//     * 装货地址
+//     */
+//    @TableField("load_address")
+//    private String loadAddress;
+//    /**
+//     * 卸货地址
+//     *
+//     */
+//    @TableField("unload_address")
+//    private String unloadAddress;
 }

+ 4 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractTradeUnit.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
@@ -89,4 +90,7 @@ public class KwcContractTradeUnit implements Serializable {
      */
     private String signPhone;
 
+    @TableField(exist = false)
+    private String contractIdUniTypeKey;
+
 }

+ 38 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/ApprovalReq.java

@@ -0,0 +1,38 @@
+package com.sckw.contract.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 修改合同状态请求参数
+ * @create :2025-11-05 11:23:00
+ */
+@Data
+public class ApprovalReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 6314692652242563859L;
+    /**
+     * 合同id
+     */
+    @Schema(description = "合同id")
+    @NotBlank(message = "合同id不能为空")
+    private String contractId;
+    /**
+     * 状态
+     */
+    @Schema(description = "状态")
+    @NotNull(message = "状态不能为空")
+    private Integer status;
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+}

+ 33 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/ContractDetailReq.java

@@ -0,0 +1,33 @@
+package com.sckw.contract.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 合同详情请求对象
+ * @create :2025-11-05 14:20:00
+ */
+@Data
+public class ContractDetailReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -8524284571455415054L;
+
+    /**
+     * 合同编号
+     */
+    @Schema(description = "合同编号")
+
+    private String contractCode;
+    /**
+     * 物流合同id
+     */
+    @Schema(description = "物流合同id")
+    @NotBlank(message = "合同id不能为空")
+    private String contractId;
+}

+ 1 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/ContractTradeReqVo.java

@@ -39,7 +39,7 @@ public class ContractTradeReqVo implements Serializable {
      * 合同文件
      */
 
-    @NotBlank(message = "合同文件不能为空")
+    //@NotBlank(message = "合同文件不能为空")
     private String contractFile;
 
     /**

+ 202 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/LogisticListReq.java

@@ -0,0 +1,202 @@
+package com.sckw.contract.model.vo.req;
+
+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 14:17:00
+ */
+@Data
+public class LogisticListReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 5207417536682160933L;
+    /**
+     * 合同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;
+
+        /**
+         * 生效时间
+         */
+        @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;
+
+
+
+    }
+    @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;
+    }
+}

+ 1 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryListReqVo.java

@@ -54,6 +54,7 @@ public class QueryListReqVo extends PageRequest implements Serializable {
     /**
      * 合同状态  0已签约 1已完结 2已保存(草稿) 3签约中
      */
+    @Schema(description = "合同状态")
     private Integer status;
 
     /**

+ 42 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryLogisticListReq.java

@@ -0,0 +1,42 @@
+package com.sckw.contract.model.vo.req;
+
+import com.sckw.core.web.request.PageReq;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 物流合同分页查询
+ * @create :2025-11-06 09:39:00
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class QueryLogisticListReq extends PageReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 6839589932636493587L;
+    /**
+     * 合同编号
+     */
+    @Schema(description = "合同编号")
+    private String contractNo;
+    /**
+     * 合同名称
+     */
+    @Schema(description = "合同名称")
+    private String contractName;
+    /**
+     * 托运单位id
+     */
+    @Schema(description = "托运单位id")
+    private String consignCompanyId;
+    /**
+     * 承运单位id
+     */
+    @Schema(description = "承运单位id")
+    private String carriageCompanyId;
+}

+ 52 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryTradeReq.java

@@ -0,0 +1,52 @@
+package com.sckw.contract.model.vo.req;
+
+import com.sckw.core.web.request.PageReq;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易订单分页查询
+ * @create :2025-11-10 11:14:00
+ */
+@Data
+public class QueryTradeReq extends PageReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 2211511377945341272L;
+    /**
+     * 合同编号
+     */
+    @Schema(description = "合同编号")
+    private String contractCode;
+    /**
+     * 合同名称
+     */
+    @Schema(description = "合同名称")
+    private String contractName;
+    /**
+     * 补充合同编号
+     */
+    @Schema(description = "补充合同编号")
+    private String supplementCode;
+    /**
+     * 采购单位id
+     */
+    @Schema(description = "采购单位id")
+    private String purchaseEntId;
+    /**
+     * 供应单位id
+     */
+    @Schema(description = "供应单位id")
+    private String supplyEntId;
+    /**
+     * 合同状态  0已签约 1已完结 2已保存(草稿) 3签约中
+     */
+    @Schema(description = "合同状态")
+    private Integer status;
+    @Schema(description = "企业id")
+    private String entId;
+}

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

@@ -188,6 +188,11 @@ public class SupplyContractTradeReq implements Serializable {
         @NotNull(message = "商品不能为空")
         @Schema(description = "商品id")
         private Long goodsId;
+        /**
+         * 商品名称
+         */
+        @Schema(description = "商品名称")
+        private String goodsName;
 
         /**
          * 采购数量

+ 30 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/UpdateLogisticsReq.java

@@ -0,0 +1,30 @@
+package com.sckw.contract.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 手动完结请求参数
+ * @create :2025-11-08 16:47:00
+ */
+@Data
+public class UpdateLogisticsReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 9190078347612391118L;
+
+    /**
+     * 物流合同id
+     */
+    @Schema(description = "物流合同id")
+    private Long logContractId;
+    /**
+     * 物流状态
+     */
+    @Schema(description = "物流状态")
+    private Integer logStatus;
+}

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

@@ -0,0 +1,341 @@
+package com.sckw.contract.model.vo.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 czh
+ * @desc 贸易合同
+ * @date 2023/7/19
+ */
+@Data
+public class ContractDetailResp 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 = "托运方式")
+        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;
+//    }
+}

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

@@ -115,6 +115,12 @@ public class QueryListResVo implements Serializable {
     @Schema(description = "已履约量")
     private BigDecimal performedAmount;
 
+    /**
+     * 已履约金额
+     */
+    @Schema(description = "已履约金额")
+    private BigDecimal performedAmountMoney;
+
     /**
      * 主合同id
      */

+ 207 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryLogisticDetailResp.java

@@ -0,0 +1,207 @@
+package com.sckw.contract.model.vo.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 QueryLogisticDetailResp 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;
+
+        /**
+         * 生效时间
+         */
+        @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;
+
+
+
+    }
+    @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;
+    }
+}

+ 123 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryLogisticListResp.java

@@ -0,0 +1,123 @@
+package com.sckw.contract.model.vo.res;
+
+import com.sckw.core.web.request.PageReq;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 物流合同分页查询
+ * @create :2025-11-06 09:39:00
+ */
+
+@Data
+public class QueryLogisticListResp implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 6839589932636493587L;
+    /**
+     * 主键
+     */
+    @Schema(description = "主键")
+    private Long id;
+    /**
+     * 合同状态
+     */
+    @Schema(description = "合同状态")
+    private Integer contractStatus;
+    /**
+     * 合同状态描述
+     */
+    @Schema(description = "合同状态描述")
+    private String contractStatusDesc;
+    /**
+     * 托运单位
+     */
+    @Schema(description = "托运单位")
+    private String consignUnit;
+    /**
+     * 托运单位描述
+     */
+    @Schema(description = "托运单位名称")
+    private String consignUnitName;
+    /**
+     * 承运单位
+     */
+    @Schema(description = "承运单位")
+    private String carriageUnit;
+    /**
+     * 承运单位描述
+     */
+    @Schema(description = "承运单位名称")
+    private String carriageUnitName;
+    /**
+     * 合同编号
+     */
+    @Schema(description = "合同编号")
+    private String contractCode;
+    /**
+     * 合同名称
+     */
+    @Schema(description = "合同名称")
+    private String contractName;
+    /**
+     * 签约方式
+     */
+    @Schema(description = "签约方式")
+    private Integer signWay;
+    /**
+     * 签约方式描述
+     */
+    @Schema(description = "签约方式描述")
+    private String signWayDesc;
+    /**
+     * 合同运输总量
+     */
+    @Schema(description = "合同运输总量")
+    private String contractTransportAmount;
+
+    /**
+     * 已履约量
+     */
+    @Schema(description = "已履约量")
+    private String performedAmount;
+    /**
+     * 累计运输总额
+     */
+    @Schema(description = "累计运输总额")
+    private String totalTransportAmount;
+    /**
+     * 起始日期
+     */
+    @Schema(description = "起始日期")
+    private String startDate;
+    /**
+     * 终止日期
+     */
+    @Schema(description = "终止日期")
+    private String endDate;
+    /**
+     * 发起人
+     */
+    @Schema(description = "发起人")
+    private String initiator;
+    /**
+     * 发起单位
+     */
+    @Schema(description = "发起单位")
+    private String initiatorUnit;
+    /**
+     * 发起时间
+     */
+    @Schema(description = "发起时间")
+    private String initiatorTime;
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+}

+ 43 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsGoodsRepository.java

@@ -0,0 +1,43 @@
+package com.sckw.contract.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.contract.dao.KwcContractLogisticsGoodsMapper;
+import com.sckw.contract.model.entity.KwcContractLogisticsGoods;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 物流商品接口
+ * @create :2025-11-06 08:32:00
+ */
+@Repository
+public class KwcContractLogisticsGoodsRepository extends ServiceImpl<KwcContractLogisticsGoodsMapper, KwcContractLogisticsGoods> {
+    public List<KwcContractLogisticsGoods> queryByContractId(Long contractId) {
+        return list(Wrappers.<KwcContractLogisticsGoods>lambdaQuery()
+                .eq(KwcContractLogisticsGoods::getDelFlag,0)
+                .eq(KwcContractLogisticsGoods::getContractId,contractId));
+    }
+
+    public List<KwcContractLogisticsGoods> queryByContractIds(Set<Long> contractIds) {
+        return list(Wrappers.<KwcContractLogisticsGoods>lambdaQuery()
+                .eq(KwcContractLogisticsGoods::getDelFlag,0)
+                .in(CollectionUtils.isNotEmpty(contractIds),KwcContractLogisticsGoods::getContractId,contractIds));
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void saveLogisticsGoods(List<KwcContractLogisticsGoods> goods) {
+        saveOrUpdateBatch(goods);
+    }
+
+    public void deleteByContractId(long contactId) {
+        remove(Wrappers.<KwcContractLogisticsGoods>lambdaQuery()
+                .eq(KwcContractLogisticsGoods::getContractId,contactId));
+    }
+}

+ 64 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsRepository.java

@@ -0,0 +1,64 @@
+package com.sckw.contract.repository;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.contract.dao.KwcContractLogisticsMapper;
+import com.sckw.contract.model.entity.KwcContractLogistics;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 物流合同接口
+ * @create :2025-11-06 10:24:00
+ */
+@Repository
+public class KwcContractLogisticsRepository extends ServiceImpl<KwcContractLogisticsMapper, KwcContractLogistics> {
+    public IPage<KwcContractLogistics> queryByPage(int pageNum, int pageSize, String contractNo, String contractName,
+                                                   List<Long> entIdList) {
+        return page(new Page<>(pageNum, pageSize), Wrappers.<KwcContractLogistics>lambdaQuery()
+                .eq(KwcContractLogistics::getDelFlag, 0)
+                .in(CollectionUtils.isNotEmpty(entIdList), KwcContractLogistics::getEntId, entIdList)
+                .like(StringUtils.isNotBlank(contractNo), KwcContractLogistics::getContractNo, contractNo)
+                .like(StringUtils.isNotBlank(contractName), KwcContractLogistics::getName, contractName)
+                .orderByDesc(KwcContractLogistics::getCreateTime)
+                .orderByDesc(KwcContractLogistics::getId));
+    }
+
+    public KwcContractLogistics queryByContractCode( String contractCode) {
+        return getOne(Wrappers.<KwcContractLogistics>lambdaQuery()
+                .eq(KwcContractLogistics::getDelFlag,0)
+                .eq(KwcContractLogistics::getContractNo, contractCode)
+                .last("limit 1"));
+    }
+
+    @Transactional
+    public void saveOrUpdateLogistics(KwcContractLogistics saveContractLogistics) {
+        saveOrUpdate(saveContractLogistics);
+    }
+
+    public KwcContractLogistics queryById(Long id) {
+        return getOne(Wrappers.<KwcContractLogistics>lambdaQuery()
+                .eq(KwcContractLogistics::getId, id));
+    }
+
+    public List<KwcContractLogistics> queryByLogisticContractIds(Set<Long> logContractIds) {
+        return list(Wrappers.<KwcContractLogistics>lambdaQuery()
+                .eq(KwcContractLogistics::getDelFlag, 0)
+                .in(KwcContractLogistics::getId, logContractIds));
+    }
+
+    public Boolean updateLogistics(KwcContractLogistics updateLogistics) {
+       return update(updateLogistics,
+                Wrappers.<KwcContractLogistics>lambdaQuery()
+                        .eq(KwcContractLogistics::getId, updateLogistics.getId()));
+    }
+}

+ 43 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsUnitRepository.java

@@ -0,0 +1,43 @@
+package com.sckw.contract.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.contract.dao.KwcContractLogisticsUnitMapper;
+import com.sckw.contract.model.entity.KwcContractLogisticsUnit;
+import com.sckw.contract.model.entity.KwcContractTradeUnit;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 物流企业信息
+ * @create :2025-11-05 17:31:00
+ */
+@Repository
+public class KwcContractLogisticsUnitRepository extends ServiceImpl<KwcContractLogisticsUnitMapper, KwcContractLogisticsUnit> {
+    public List<KwcContractLogisticsUnit> queryByContractId(Long contractId) {
+        return list(Wrappers.<KwcContractLogisticsUnit>lambdaQuery()
+                .eq(KwcContractLogisticsUnit::getContractId, contractId)
+                .eq(KwcContractLogisticsUnit::getDelFlag,0));
+    }
+
+    public List<KwcContractLogisticsUnit> queryByContractIds(Set<Long> contractIds) {
+        return list(Wrappers.<KwcContractLogisticsUnit>lambdaQuery()
+                .eq(KwcContractLogisticsUnit::getDelFlag,0)
+                .in(KwcContractLogisticsUnit::getContractId, contractIds));
+    }
+
+    @Transactional
+    public void saveUnits(List<KwcContractLogisticsUnit> units) {
+        saveBatch( units);
+    }
+
+    public void removeByContractId(long contactId) {
+        remove(Wrappers.<KwcContractLogisticsUnit>lambdaQuery()
+                .eq(KwcContractLogisticsUnit::getContractId, contactId));
+    }
+}

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

@@ -7,6 +7,7 @@ import com.sckw.contract.model.entity.KwcContractTradeGoods;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * @author :chenXiaoFei
@@ -22,4 +23,23 @@ public class KwcContractTradeGoodsRepository extends ServiceImpl<KwcContractTrad
                 .eq(KwcContractTradeGoods::getContractId, pid)
                 .in(KwcContractTradeGoods::getGoodsId, goodsIds));
     }
+
+    public List<KwcContractTradeGoods> queryByContractIds(Set<Long> contractIds) {
+        return list(Wrappers.<KwcContractTradeGoods>lambdaQuery()
+                .eq(KwcContractTradeGoods::getDelFlag,0)
+                .in(KwcContractTradeGoods::getContractId, contractIds));
+    }
+
+    public List<KwcContractTradeGoods> queryByConTractIdsGoodsIds(Set<Long> pids,List<Long> goodsIds) {
+        return list(Wrappers.<KwcContractTradeGoods>lambdaQuery()
+                .eq(KwcContractTradeGoods::getDelFlag,0)
+                .in(KwcContractTradeGoods::getContractId, pids)
+                .in(KwcContractTradeGoods::getGoodsId, goodsIds));
+    }
+
+    public List<KwcContractTradeGoods> queryByContractId(Long contractId) {
+        return list(Wrappers.<KwcContractTradeGoods>lambdaQuery()
+                .eq(KwcContractTradeGoods::getDelFlag,0)
+                .eq(KwcContractTradeGoods::getContractId, contractId));
+    }
 }

+ 22 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeOrderRepository.java

@@ -0,0 +1,22 @@
+package com.sckw.contract.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.contract.dao.KwcContractTradeOrderMapper;
+import com.sckw.contract.model.entity.KwcContractTradeOrder;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易订单接口
+ * @create :2025-11-05 16:35:00
+ */
+@Repository
+public class KwcContractTradeOrderRepository extends ServiceImpl<KwcContractTradeOrderMapper, KwcContractTradeOrder> {
+    public KwcContractTradeOrder queryByContractId(Long tradeOrderId) {
+        return getOne(Wrappers.<KwcContractTradeOrder>lambdaQuery()
+                .eq(KwcContractTradeOrder::getDelFlag, 0)
+                .eq(KwcContractTradeOrder::getContractId, tradeOrderId));
+    }
+}

+ 71 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeRepository.java

@@ -0,0 +1,71 @@
+package com.sckw.contract.repository;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.contract.dao.KwcContractTradeMapper;
+import com.sckw.contract.model.entity.KwcContractTrade;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易合同接口
+ * @create :2025-11-05 09:27:00
+ */
+@Repository
+public class KwcContractTradeRepository extends ServiceImpl<KwcContractTradeMapper, KwcContractTrade> {
+    public List<KwcContractTrade> queryByPid( Long pid) {
+        return list(Wrappers.<KwcContractTrade>lambdaQuery()
+                .eq(KwcContractTrade::getDelFlag, 0)
+                .eq(KwcContractTrade::getContractPid, pid));
+    }
+
+    public KwcContractTrade queryByContractId( Long contractId) {
+        return getOne(Wrappers.<KwcContractTrade>lambdaQuery()
+                .eq(KwcContractTrade::getDelFlag, 0)
+                .eq(KwcContractTrade::getId, contractId)
+                .last("limit 1"));
+    }
+
+    public Boolean updateByContractId(KwcContractTrade updateKwcContractTrade) {
+       return update(updateKwcContractTrade, Wrappers.<KwcContractTrade>lambdaQuery()
+                .eq(KwcContractTrade::getId, updateKwcContractTrade.getId()));
+    }
+
+    public KwcContractTrade queryByContractNo( String contractCode) {
+        return getOne(Wrappers.<KwcContractTrade>lambdaQuery()
+                .eq(KwcContractTrade::getDelFlag, 0)
+                .eq(KwcContractTrade::getContractNo, contractCode)
+                .last("limit 1"));
+    }
+
+    public IPage<KwcContractTrade> queryTradeListByPage( List<Long> authEntIdList,String contractCode,
+                                                         String contractName, Set<Long> contractIds, Integer status, int pageNum, int pageSize) {
+        return page(new Page<>(pageNum, pageSize), Wrappers.<KwcContractTrade>lambdaQuery()
+                .eq(KwcContractTrade::getDelFlag, 0)
+                .like(StringUtils.isNotBlank(contractCode),KwcContractTrade::getContractNo, contractCode)
+                .like(StringUtils.isNotBlank(contractName),KwcContractTrade::getName, contractName)
+                .eq(Objects.nonNull(status),KwcContractTrade::getStatus, status)
+                .in(CollectionUtils.isNotEmpty(contractIds),KwcContractTrade::getId, contractIds)
+                .in(CollectionUtils.isNotEmpty(authEntIdList),KwcContractTrade::getEntId, authEntIdList)
+                .eq(KwcContractTrade::getDelFlag, 0));
+
+    }
+
+    public List<KwcContractTrade> queryByContractIds(Set<Long> contractPids) {
+
+        return list(Wrappers.<KwcContractTrade>lambdaQuery()
+                .eq(KwcContractTrade::getDelFlag,0)
+                .in(KwcContractTrade::getContractPid, contractPids));
+    }
+}

+ 38 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeUnitRepository.java

@@ -0,0 +1,38 @@
+package com.sckw.contract.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.contract.dao.KwcContractTradeUnitMapper;
+import com.sckw.contract.model.entity.KwcContractTradeUnit;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 公司合同信息接口
+ * @create :2025-11-05 14:52:00
+ */
+@Repository
+public class KwcContractTradeUnitRepository extends ServiceImpl<KwcContractTradeUnitMapper, KwcContractTradeUnit> {
+    public List<KwcContractTradeUnit> queryByContractId(Long contractId) {
+        return list(Wrappers.<KwcContractTradeUnit>lambdaQuery()
+                .eq(KwcContractTradeUnit::getContractId, contractId)
+                .eq(KwcContractTradeUnit::getDelFlag, 0));
+    }
+
+    public List<KwcContractTradeUnit> queryByEntIds(Set<Long> entIds) {
+        return list(Wrappers.<KwcContractTradeUnit>lambdaQuery()
+                .eq(KwcContractTradeUnit::getDelFlag, 0)
+                .in(KwcContractTradeUnit::getEntId, entIds));
+    }
+
+    public List<KwcContractTradeUnit> queryByContractIds(Set<Long> tradeContractIds) {
+        return list(Wrappers.<KwcContractTradeUnit>lambdaQuery()
+                .eq(KwcContractTradeUnit::getDelFlag, 0)
+                .in(KwcContractTradeUnit::getContractId, tradeContractIds));
+    }
+}

+ 8 - 3
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractTradeGoodsService.java

@@ -37,7 +37,8 @@ public class KwcContractTradeGoodsService {
     private final KwcContractTradeGoodsRepository kwcContractTradeGoodsRepository;
 
 
-    public void saveContractTradeGoods(long contractId, List<TradeGoodsInfoReqVo> goodsInfoList) {
+    public void saveContractTradeGoods(long contractId, List<TradeGoodsInfoReqVo> goodsInfoList,Date startTime,
+                                       Date endTime) {
         //todo 调dubbo接口返回商品详情 填充sku
         //List<Long> goodsIdList = goodsInfoList.stream().map(TradeGoodsInfoReqVo::getGoodsId).toList();
 
@@ -47,7 +48,7 @@ public class KwcContractTradeGoodsService {
             return;
         }
         Set<KwcContractTradeGoods> tradeGoods = goodsInfoList.stream()
-                .map(g -> getKwcContractTradeGoods(contractId, g, userId))
+                .map(g -> getKwcContractTradeGoods(contractId, g, userId, startTime, endTime))
                 .collect(Collectors.toSet());
         if (CollectionUtils.isNotEmpty(tradeGoods)){
             kwcContractTradeGoodsRepository.saveBatch(tradeGoods);
@@ -56,7 +57,8 @@ public class KwcContractTradeGoodsService {
     }
 
     @NotNull
-    private static KwcContractTradeGoods getKwcContractTradeGoods(long contractId, TradeGoodsInfoReqVo g, Long userId) {
+    private static KwcContractTradeGoods getKwcContractTradeGoods(long contractId, TradeGoodsInfoReqVo g, Long userId
+            ,Date startTime, Date endTime) {
         Date date = new Date();
         KwcContractTradeGoods kwcContractTradeGoods = new KwcContractTradeGoods();
         kwcContractTradeGoods.setId(new IdWorker(1L).nextId());
@@ -67,11 +69,14 @@ public class KwcContractTradeGoodsService {
         kwcContractTradeGoods.setStatus(Global.NO);
         kwcContractTradeGoods.setUnit(g.getUnit());
         kwcContractTradeGoods.setPrice(g.getPrice());
+        kwcContractTradeGoods.setAmount(g.getAmount());
         kwcContractTradeGoods.setCreateBy(userId);
         kwcContractTradeGoods.setCreateTime(date);
         kwcContractTradeGoods.setUpdateBy(userId);
         kwcContractTradeGoods.setUpdateTime(date);
         kwcContractTradeGoods.setDelFlag(Global.NO);
+        kwcContractTradeGoods.setStartTime(startTime);
+        kwcContractTradeGoods.setEndTime(endTime);
         return kwcContractTradeGoods;
     }
 

+ 384 - 3
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractLogisticsService.java

@@ -4,17 +4,21 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.sckw.contract.dao.KwcContractLogisticsMapper;
 import com.sckw.contract.model.dto.req.QueryListReqDto;
 import com.sckw.contract.model.dto.res.QueryListResDto;
-import com.sckw.contract.model.entity.KwcContractLogistics;
-import com.sckw.contract.model.entity.KwcContractLogisticsGoods;
-import com.sckw.contract.model.entity.KwcContractLogisticsUnit;
+import com.sckw.contract.model.entity.*;
 import com.sckw.contract.model.report.LogisticsListExport;
 import com.sckw.contract.model.vo.req.*;
 import com.sckw.contract.model.vo.res.*;
+import com.sckw.contract.repository.KwcContractLogisticsGoodsRepository;
+import com.sckw.contract.repository.KwcContractLogisticsRepository;
+import com.sckw.contract.repository.KwcContractLogisticsUnitRepository;
 import com.sckw.contract.service.CommonBusinessService;
 import com.sckw.contract.service.KwcContractLogisticsGoodsService;
 import com.sckw.contract.service.KwcContractLogisticsTrackService;
@@ -33,6 +37,7 @@ import com.sckw.core.model.page.PageResult;
 import com.sckw.core.utils.*;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.excel.utils.ExcelUtil;
 import com.sckw.product.api.dubbo.GoodsInfoService;
 import com.sckw.stream.enums.MessageEnum;
@@ -43,15 +48,19 @@ import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.KwsUserResDto;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
+import com.sckw.transport.api.model.vo.RWaybillSubOrderVo;
 import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -63,6 +72,7 @@ import java.util.stream.Collectors;
  */
 @Service
 @Slf4j
+@RequiredArgsConstructor
 public class KwcContractLogisticsService {
 
     @Autowired
@@ -80,6 +90,10 @@ public class KwcContractLogisticsService {
     @Autowired
     private CommonBusinessService commonBusinessService;
 
+    private final KwcContractLogisticsRepository kwcContractLogisticsRepository;
+    private final KwcContractLogisticsUnitRepository kwcContractLogisticsUnitRepository;
+    private final KwcContractLogisticsGoodsRepository kwcContractLogisticsGoodsRepository;
+
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteSystemService remoteSystemService;
 
@@ -1030,4 +1044,371 @@ public class KwcContractLogisticsService {
         ExcelUtil.downData(response, LogisticsListExport.class, dataList);
     }
 
+    public PageDataResult<QueryLogisticListResp> queryLogisticsContractListByPage(QueryLogisticListReq req) {
+        log.info("分页查询物流合同参数:{}", JSON.toJSONString( req));
+        List<Long> entIdList = Lists.newArrayList();
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getConsignCompanyId())){
+            entIdList.add(Long.valueOf(req.getConsignCompanyId()));
+        }
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getCarriageCompanyId())){
+            entIdList.add(Long.valueOf(req.getCarriageCompanyId()));
+        }
+
+        IPage<KwcContractLogistics> page =kwcContractLogisticsRepository.queryByPage(req.getPageNum(),req.getPageSize(),
+                req.getContractNo(),
+                req.getContractName(),entIdList);
+        List<KwcContractLogistics> records = page.getRecords();
+        if (CollectionUtils.isNotEmpty(records)) {
+            return PageDataResult.empty(req.getPageNum(),req.getPageSize());
+        }
+        //发起人id
+        List<Long> userIds =
+                records.stream()
+                        .map(KwcContractLogistics::getCreateBy).distinct()
+                        .collect(Collectors.toList());
+        Map<Long, UserCacheResDto> longUserCacheResDtoMap = Maps.newHashMap();
+        //获取员工信息
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(userIds)){
+            longUserCacheResDtoMap = remoteSystemService.queryUserCacheMapByIds(userIds);
+        }
+        //企业id
+        Set<Long> entIds = records.stream()
+                .map(KwcContractLogistics::getEntId)
+                .collect(Collectors.toSet());
+        //合同id
+        Set<Long> contractIds = records.stream()
+                .map(KwcContractLogistics::getId)
+                .collect(Collectors.toSet());
+        //查询物流商品信息
+        List<KwcContractLogisticsGoods> kwcContractLogisticsGoods =kwcContractLogisticsGoodsRepository.queryByContractIds(contractIds);
+        Map<Long, List<KwcContractLogisticsGoods>> contractIdAndGoodsMap = Maps.newHashMap();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwcContractLogisticsGoods)){
+            //按照合同id进行分组
+            contractIdAndGoodsMap =
+                    kwcContractLogisticsGoods.stream().collect(Collectors.groupingBy(KwcContractLogisticsGoods::getContractId));
+        }
+
+        //查询物流企业信息
+        List<KwcContractLogisticsUnit> kwcContractLogisticsUnits =
+                kwcContractLogisticsUnitRepository.queryByContractIds(contractIds);
+        Map<String, KwcContractLogisticsUnit> contractUniTypeAndUnitMap = Maps.newHashMap();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwcContractLogisticsUnits)){
+            //合同id和单位类型组合成key映射物流企业信息
+             contractUniTypeAndUnitMap = kwcContractLogisticsUnits.stream()
+                    .peek(k -> k.setContractIdUnitTypeKey(k.getContractId() + "-" + k.getUnitType()))
+                    .collect(Collectors.toMap(KwcContractLogisticsUnit::getContractIdUnitTypeKey, Function.identity(),
+                            (x, y) -> x));
+        }
+
+        Map<Long, UserCacheResDto> finalLongUserCacheResDtoMap = longUserCacheResDtoMap;
+        Map<String, KwcContractLogisticsUnit> finalContractUniTypeAndUnitMap = contractUniTypeAndUnitMap;
+        Map<Long, List<KwcContractLogisticsGoods>> finalContractIdAndGoodsMap = contractIdAndGoodsMap;
+        List<QueryLogisticListResp> resp = records.stream().map(r -> {
+            QueryLogisticListResp queryLogisticListResp = new QueryLogisticListResp();
+            queryLogisticListResp.setId(r.getId());
+            queryLogisticListResp.setContractStatus(r.getStatus());
+            queryLogisticListResp.setContractStatusDesc(ContractStatusEnum.getNameByCode(r.getStatus()));
+            KwcContractLogisticsUnit logisticsUnit = finalContractUniTypeAndUnitMap.get(r.getId() + "-" + CooperateTypeEnum.CONSIGN.getCode());
+            if (Objects.nonNull(logisticsUnit)){
+                queryLogisticListResp.setConsignUnit(String.valueOf(logisticsUnit.getEntId()));
+                queryLogisticListResp.setConsignUnitName(logisticsUnit.getFirmName());
+            }
+            KwcContractLogisticsUnit carriageUnit =
+                    finalContractUniTypeAndUnitMap.get(r.getId() + "-" + CooperateTypeEnum.CARRIAGE.getCode());
+            if (Objects.nonNull(carriageUnit)){
+                queryLogisticListResp.setCarriageUnit(String.valueOf(carriageUnit.getEntId()));
+                queryLogisticListResp.setCarriageUnitName(carriageUnit.getFirmName());
+            }
+
+
+            queryLogisticListResp.setContractCode(r.getContractNo());
+            queryLogisticListResp.setContractName(r.getName());
+            queryLogisticListResp.setSignWay(r.getSigningWay());
+            queryLogisticListResp.setSignWayDesc(DictEnum.getLabel(DictTypeEnum.SIGNING_TYPE.getType(),
+                    String.valueOf( r.getSigningWay())));
+            queryLogisticListResp.setContractTransportAmount(Objects.nonNull(r.getAmount())?
+                    r.getAmount().toPlainString():null);
+            queryLogisticListResp.setPerformedAmount(Objects.nonNull(r.getPerformedAmount())
+                    ? r.getPerformedAmount().toPlainString() : null);
+            List<KwcContractLogisticsGoods> goods = finalContractIdAndGoodsMap.get(r.getId());
+            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(goods)){
+                boolean b = goods.stream().anyMatch(g -> Objects.isNull(g.getAmount()));
+                if (b){
+                    queryLogisticListResp.setContractTransportAmount(null);
+                }else {
+                    BigDecimal totalTransportAmount = goods.stream()
+                            .map(KwcContractLogisticsGoods::getAmount)
+                            .filter(Objects::nonNull)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+                    queryLogisticListResp.setTotalTransportAmount(totalTransportAmount.setScale(2, RoundingMode.HALF_UP).toPlainString());
+                }
+
+
+             }
+
+
+            String startDate = DateUtils.format(r.getStartTime(), DateUtils.DATE_TIME_PATTERN);
+            queryLogisticListResp.setStartDate(startDate);
+            String endDate = DateUtils.format(r.getEndTime(), DateUtils.DATE_TIME_PATTERN);
+            queryLogisticListResp.setEndDate(endDate);
+            UserCacheResDto userCacheResDto = finalLongUserCacheResDtoMap.getOrDefault(r.getCreateBy(), new UserCacheResDto());
+            queryLogisticListResp.setInitiator(userCacheResDto.getName());
+            EntCacheResDto entInfo = userCacheResDto.getEntInfo();
+            queryLogisticListResp.setInitiatorUnit(Objects.nonNull(entInfo) ? entInfo.getFirmName() : null);
+            queryLogisticListResp.setInitiatorTime(DateUtils.format(r.getCreateTime(), DateUtils.DATE_TIME_PATTERN));
+            queryLogisticListResp.setRemark(r.getRemark());
+
+
+
+            return queryLogisticListResp;
+        }).collect(Collectors.toList());
+
+        return PageDataResult.of(page, resp);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean addOrUpdateLogisticsContract(LogisticListReq req) {
+        log.info("新增物流合同,请求参数 :{}", JSON.toJSONString(req));
+        //查询物流合同
+        KwcContractLogistics kwcContractLogistics =
+                kwcContractLogisticsRepository.queryById(req.getId());
+        if (org.apache.commons.lang3.StringUtils.equals(kwcContractLogistics.getContractNo(),
+                req.getBaseInfo().getContractCode())){
+            throw new BusinessException("合同已存在,合同编号:{}", req.getBaseInfo().getContractCode());
+        }
+        long contactId = new IdWorker(1L).nextId();
+
+        KwcContractLogistics saveContractLogistics = new KwcContractLogistics();
+        Date date = new Date();
+        LogisticListReq.TradeBaseInfo baseInfo = req.getBaseInfo();
+        if (Objects.nonNull(req.getId())){
+            saveContractLogistics.setId(contactId);
+        }else {
+            saveContractLogistics.setId(contactId);
+        }
+        saveContractLogistics.setEntId(LoginUserHolder.getEntId());
+        saveContractLogistics.setContractNo(baseInfo.getContractCode());
+        saveContractLogistics.setName(baseInfo.getContractName());
+        saveContractLogistics.setSigningWay(baseInfo.getSigningWay());
+        saveContractLogistics.setStartTime(baseInfo.getStartTime());
+        saveContractLogistics.setEndTime(baseInfo.getEndTime());
+        saveContractLogistics.setStatus(ContractStatusEnum.WAIT_APPROVE.getCode());
+        saveContractLogistics.setCreateBy(LoginUserHolder.getUserId());
+        saveContractLogistics.setCreateTime(date);
+        saveContractLogistics.setUpdateBy(LoginUserHolder.getUserId());
+        saveContractLogistics.setUpdateTime(date);
+        saveContractLogistics.setCommonPrice(baseInfo.getCommonPrice());
+        saveContractLogistics.setSigningUrl(changeFile(req.getContractFile()));
+        kwcContractLogisticsRepository.saveOrUpdateLogistics(saveContractLogistics);
+
+        //保存交易商品信息
+        saveLogisticsGoods(req, contactId);
+        //保存物流企业信息
+        List<Long> entIdList = new ArrayList<>();
+        if (Objects.nonNull(baseInfo.getProvideEntId())) {
+            entIdList.add(baseInfo.getProvideEntId());
+        }
+
+        if (Objects.nonNull(baseInfo.getPurchaseEntId())) {
+            entIdList.add(baseInfo.getPurchaseEntId());
+        }
+        if (CollectionUtils.isEmpty(entIdList)) {
+            return false;
+        }
+
+        saveLogisticListUnit(entIdList, baseInfo, contactId, date);
+
+        return Boolean.TRUE;
+    }
+    private String changeFile(String contractFile) {
+        if (StringUtils.isNotBlank(contractFile)) {
+            JSONArray jsonArray = JSONArray.parseArray(contractFile);
+            for (int n = 0; n < jsonArray.size(); n++) {
+                JSONObject jsonObject = jsonArray.getJSONObject(n);
+                String url = jsonObject.getString("url");
+                jsonObject.put("url", FileUtils.replaceAll(url));
+            }
+            return JSON.toJSONString(jsonArray);
+        }
+        return null;
+    }
+    private void saveLogisticsGoods(LogisticListReq req, long contactId) {
+        //删除商品
+        kwcContractLogisticsGoodsRepository.deleteByContractId(contactId);
+        LogisticListReq.TradeBaseInfo baseInfo = req.getBaseInfo();
+        List<LogisticListReq.TradeGoodsInfo> goodsInfos = req.getGoodsInfo();
+        List<KwcContractLogisticsGoods> goods = goodsInfos.stream()
+                .map(x -> getKwcContractLogisticsGoods(x, contactId,baseInfo))
+                .collect(Collectors.toList());
+        kwcContractLogisticsGoodsRepository.saveLogisticsGoods(goods);
+    }
+
+    @NotNull
+    private static KwcContractLogisticsGoods getKwcContractLogisticsGoods(LogisticListReq.TradeGoodsInfo x,
+                                                                          long contactId,LogisticListReq.TradeBaseInfo baseInfo) {
+        KwcContractLogisticsGoods logisticsGoods = new KwcContractLogisticsGoods();
+        Date date1 = new Date();
+        logisticsGoods.setId(x.getGoodsId());
+        logisticsGoods.setContractId(contactId);
+        logisticsGoods.setGoodsId(x.getGoodsId());
+        logisticsGoods.setGoodsName(x.getGoodsName());
+        logisticsGoods.setSkuId(0L);
+        logisticsGoods.setAmount(x.getAmount());
+        logisticsGoods.setUnit(x.getUnit());
+        if (Objects.isNull(x.getPrice())) {
+            logisticsGoods.setPrice(Objects.nonNull(baseInfo.getCommonPrice())? baseInfo.getCommonPrice().setScale(2,
+                    RoundingMode.HALF_UP) : null);
+        }else {
+            logisticsGoods.setPrice(x.getPrice());
+        }
+        logisticsGoods.setPriceUnit(x.getAmountUnit());
+        logisticsGoods.setCreateBy(LoginUserHolder.getUserId());
+        logisticsGoods.setCreateTime(date1);
+        logisticsGoods.setUpdateBy(LoginUserHolder.getUserId());
+        logisticsGoods.setUpdateTime(date1);
+        return logisticsGoods;
+    }
+
+    private void saveLogisticListUnit(List<Long> entIdList, LogisticListReq.TradeBaseInfo baseInfo, long contactId, Date date) {
+        Map<Long, EntCacheResDto> entCacheResDtoMap = commonBusinessService.queryEntCacheMapByIds(entIdList);
+        List<KwcContractLogisticsUnit> units = Lists.newArrayList();
+        //存供应商
+        if(Objects.nonNull(baseInfo.getProvideEntId())) {
+            buildLogisticsUnit(contactId, baseInfo.getProvideEntId(), baseInfo.getProvidePhone(), entCacheResDtoMap, date, units);
+        }
+        //存采购商
+        if (Objects.nonNull(baseInfo.getPurchaseEntId())) {
+            buildLogisticsUnit(contactId, baseInfo.getPurchaseEntId(), baseInfo.getPurchasePhone(), entCacheResDtoMap, date, units);
+        }
+        //删除企业
+        kwcContractLogisticsUnitRepository.removeByContractId(contactId);
+        kwcContractLogisticsUnitRepository.saveUnits(units);
+    }
+
+
+    private static void buildLogisticsUnit(long contactId, Long entId, String phone ,
+                                           Map<Long
+            , EntCacheResDto> entCacheResDtoMap, Date date, List<KwcContractLogisticsUnit> units) {
+        KwcContractLogisticsUnit kwcContractTradeUnit = new KwcContractLogisticsUnit();
+        kwcContractTradeUnit.setId(new IdWorker(1L).nextId());
+        kwcContractTradeUnit.setContractId(contactId);
+        kwcContractTradeUnit.setUnitType(CooperateTypeEnum.SUPPLIER.getCode());
+        kwcContractTradeUnit.setEntId(entId);
+        EntCacheResDto entCacheResDto = entCacheResDtoMap.get(kwcContractTradeUnit.getEntId());
+        if (Objects.nonNull(entCacheResDto)) {
+            kwcContractTradeUnit.setFirmName(entCacheResDto.getFirmName());
+        }
+        kwcContractTradeUnit.setContacts(entCacheResDto.getContacts());
+        kwcContractTradeUnit.setPhone(entCacheResDto.getPhone());
+        kwcContractTradeUnit.setSignPhone(phone);
+        kwcContractTradeUnit.setStatus(Global.NO);
+        kwcContractTradeUnit.setCreateBy(LoginUserHolder.getUserId());
+        kwcContractTradeUnit.setCreateTime(date);
+        kwcContractTradeUnit.setUpdateBy(LoginUserHolder.getUserId());
+        kwcContractTradeUnit.setUpdateTime(date);
+        kwcContractTradeUnit.setDelFlag(Global.NO);
+        units.add(kwcContractTradeUnit);
+    }
+
+    public QueryLogisticDetailResp queryLogisticsContractDetail(ContractDetailReq req) {
+        log.info("查询物流合同明细参数:{}", JSON.toJSONString( req));
+        if (Objects.isNull(req.getContractId())){
+            throw new BusinessException("物流合同id不能为空");
+        }
+        KwcContractLogistics logistics = kwcContractLogisticsRepository.queryById(Long.valueOf(req.getContractId()));
+        if (Objects.isNull(logistics)){
+            throw new BusinessException("物流合同不存在");
+        }
+
+        //合同id
+        Long contractId = logistics.getId();
+
+        //查询物流商品信息
+        List<KwcContractLogisticsGoods> kwcContractLogisticsGoods =kwcContractLogisticsGoodsRepository.queryByContractId(contractId);
+
+
+        List<KwcContractLogisticsUnit> kwcContractLogisticsUnits =
+                kwcContractLogisticsUnitRepository.queryByContractId(contractId);
+        Map<String, KwcContractLogisticsUnit> contractUniTypeAndUnitMap = Maps.newHashMap();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwcContractLogisticsUnits)){
+            //合同id和单位类型组合成key映射物流企业信息
+            contractUniTypeAndUnitMap = kwcContractLogisticsUnits.stream()
+                    .peek(k -> k.setContractIdUnitTypeKey(k.getContractId() + "-" + k.getUnitType()))
+                    .collect(Collectors.toMap(KwcContractLogisticsUnit::getContractIdUnitTypeKey, Function.identity(),
+                            (x, y) -> x));
+        }
+
+        return getQueryLogisticDetailResp(logistics, contractUniTypeAndUnitMap, kwcContractLogisticsGoods);
+
+    }
+
+    @NotNull
+    private static QueryLogisticDetailResp getQueryLogisticDetailResp(KwcContractLogistics logistics, Map<String, KwcContractLogisticsUnit> contractUniTypeAndUnitMap, List<KwcContractLogisticsGoods> kwcContractLogisticsGoods) {
+        QueryLogisticDetailResp queryLogisticListResp = new QueryLogisticDetailResp();
+        queryLogisticListResp.setId(logistics.getId());
+        queryLogisticListResp.setPid(logistics.getContractPid());
+        QueryLogisticDetailResp.TradeBaseInfo tradeBaseInfo = new QueryLogisticDetailResp.TradeBaseInfo();
+        KwcContractLogisticsUnit logisticsUnit = contractUniTypeAndUnitMap.get(logistics.getId() + "-" + CooperateTypeEnum.PURCHASER.getCode());
+        if (Objects.nonNull(logisticsUnit)){
+            tradeBaseInfo.setPurchaseEntId(logisticsUnit.getEntId());
+            tradeBaseInfo.setPurchasePhone(logisticsUnit.getPhone());
+        }
+        KwcContractLogisticsUnit providerLogisticsUnit =
+                contractUniTypeAndUnitMap.get(logistics.getId() + "-" + CooperateTypeEnum.PURCHASER.getCode());
+        if (Objects.nonNull(providerLogisticsUnit)){
+            tradeBaseInfo.setProvideEntId(providerLogisticsUnit.getEntId());
+            tradeBaseInfo.setProvidePhone(providerLogisticsUnit.getPhone());
+        }
+
+        tradeBaseInfo.setContractCode(logistics.getContractNo());
+        tradeBaseInfo.setContractName(logistics.getName());
+        tradeBaseInfo.setEndTime(logistics.getEndTime());
+        tradeBaseInfo.setSigningWay(logistics.getSigningWay());
+        tradeBaseInfo.setSigningWayDesc(DictEnum.getLabel(DictTypeEnum.SIGNING_TYPE.getType(),
+                String.valueOf(logistics.getSigningWay())));
+        tradeBaseInfo.setStartTime(logistics.getStartTime());
+        tradeBaseInfo.setCommonPrice(logistics.getCommonPrice());
+
+        queryLogisticListResp.setBaseInfo(tradeBaseInfo);
+        queryLogisticListResp.setContractFile(logistics.getSigningUrl());
+        List<QueryLogisticDetailResp.TradeGoodsInfo> tradeGoodsInfos = Lists.newArrayList();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwcContractLogisticsGoods)){
+            tradeGoodsInfos = kwcContractLogisticsGoods.stream()
+                    .map(KwcContractLogisticsService::getTradeGoodsInfo)
+                    .collect(Collectors.toList());
+        }
+
+        queryLogisticListResp.setGoodsInfo(tradeGoodsInfos);
+        queryLogisticListResp.setRemark(logistics.getRemark());
+        return queryLogisticListResp;
+    }
+
+    private static QueryLogisticDetailResp.TradeGoodsInfo getTradeGoodsInfo(KwcContractLogisticsGoods x) {
+        QueryLogisticDetailResp.TradeGoodsInfo tradeGoodsInfo = new QueryLogisticDetailResp.TradeGoodsInfo();
+        tradeGoodsInfo.setGoodsId(x.getGoodsId());
+        tradeGoodsInfo.setGoodsName(x.getGoodsName());
+        tradeGoodsInfo.setAmount(x.getAmount());
+        tradeGoodsInfo.setAmountUnit(x.getUnit());
+        tradeGoodsInfo.setPrice(x.getPrice());
+        return tradeGoodsInfo;
+    }
+
+    public Boolean updateLogistics(UpdateLogisticsReq req) {
+        log.info("更新物流合同参数:{}", JSON.toJSONString( req));
+        KwcContractLogistics logistics = kwcContractLogisticsRepository.queryById(req.getLogContractId());
+        if (Objects.isNull(logistics)){
+            throw new BusinessException("物流合同不存在");
+        }
+        KwcContractLogistics updateLogistics = new KwcContractLogistics();
+        if (Objects.nonNull(req.getLogStatus()) && Objects.equals(logistics.getStatus(),
+                ContractStatusEnum.SUBMIT.getCode())){
+            updateLogistics.setStatus(req.getLogStatus());
+            updateLogistics.setId(logistics.getId());
+        }
+        if (Objects.nonNull(req.getLogStatus()) && Objects.equals(logistics.getStatus(),ContractStatusEnum.SIGNED.getCode())){
+            updateLogistics.setStatus(req.getLogStatus());
+            updateLogistics.setId(logistics.getId());
+        }
+       return kwcContractLogisticsRepository.updateLogistics(updateLogistics);
+    }
 }

+ 520 - 35
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java

@@ -4,19 +4,20 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import com.sckw.contract.dao.KwcContractTradeMapper;
 import com.sckw.contract.model.dto.req.QueryListReqDto;
 import com.sckw.contract.model.dto.res.QueryListResDto;
-import com.sckw.contract.model.entity.KwcContractTrade;
-import com.sckw.contract.model.entity.KwcContractTradeGoods;
-import com.sckw.contract.model.entity.KwcContractTradeUnit;
+import com.sckw.contract.model.entity.*;
 import com.sckw.contract.model.report.TradeListExport;
 import com.sckw.contract.model.vo.req.*;
 import com.sckw.contract.model.vo.res.*;
-import com.sckw.contract.repository.KwcContractTradeGoodsRepository;
+import com.sckw.contract.repository.*;
 import com.sckw.contract.service.CommonBusinessService;
 import com.sckw.contract.service.KwcContractTradeGoodsService;
 import com.sckw.contract.service.KwcContractTradeTrackService;
@@ -26,10 +27,7 @@ import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.exception.BusinessException;
 import com.sckw.core.exception.SystemException;
 import com.sckw.core.model.constant.Global;
-import com.sckw.core.model.enums.ContractStatusEnum;
-import com.sckw.core.model.enums.ContractTrackEnum;
-import com.sckw.core.model.enums.CooperateTypeEnum;
-import com.sckw.core.model.enums.EntTypeEnum;
+import com.sckw.core.model.enums.*;
 import com.sckw.core.model.page.PageHelperUtil;
 import com.sckw.core.model.page.PageResult;
 import com.sckw.core.utils.*;
@@ -39,27 +37,30 @@ import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.excel.utils.ExcelUtil;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.order.api.model.ContractSignCompletedParam;
+import com.sckw.order.api.model.OrderDetailVo;
 import com.sckw.product.api.dubbo.GoodsInfoService;
 import com.sckw.product.api.model.KwpGoods;
 import com.sckw.stream.enums.MessageEnum;
 import com.sckw.stream.model.UserInfo;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.RemoteUserService;
-import com.sckw.system.api.model.dto.res.EntCacheResDto;
-import com.sckw.system.api.model.dto.res.KwsUserResDto;
-import com.sckw.system.api.model.dto.res.SysDictResDto;
-import com.sckw.system.api.model.dto.res.UserCacheResDto;
+import com.sckw.system.api.model.dto.res.*;
+import com.sckw.transport.api.dubbo.TransportRemoteService;
+import com.sckw.transport.api.model.vo.RWaybillSubOrderVo;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -91,6 +92,11 @@ public class KwcContractTradeService {
     private CommonBusinessService commonBusinessService;
 
     private final KwcContractTradeGoodsRepository kwcContractTradeGoodsRepository;
+    private final KwcContractTradeRepository kwcContractTradeRepository;
+    private final KwcContractTradeUnitRepository kwcContractTradeUnitRepository;
+    private final KwcContractTradeOrderRepository kwcContractTradeOrderRepository;
+    private final KwcContractLogisticsUnitRepository kwcContractLogisticsUnitRepository;
+    private final KwcContractLogisticsGoodsRepository kwcContractLogisticsGoodsRepository;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteSystemService remoteSystemService;
@@ -103,6 +109,8 @@ public class KwcContractTradeService {
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private TradeOrderInfoService tradeOrderInfoService;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
+    private TransportRemoteService transportRemoteService;
 
     /**销售合同*/
     @Value(value = "${jumpUrl.saleSendContract}")
@@ -175,7 +183,17 @@ public class KwcContractTradeService {
             return PageHelperUtil.getPageResult(new PageInfo<>());
         }
 
-        List<QueryListResVo> list = getQueryListResVos(queryListResDtos);
+        //获取贸易合同id
+        Set<Long> tradeContractIds =
+                queryListResDtos.stream().map(QueryListResDto::getId).collect(Collectors.toSet());
+        //查询贸易合同关联商品
+        List<KwcContractTradeGoods> tradeContractGoods = kwcContractTradeGoodsRepository.queryByContractIds(tradeContractIds);
+        Map<Long, List<KwcContractTradeGoods>> contractIdGoodsIdKeyAndGoodsMap = Maps.newHashMap();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tradeContractGoods)){
+            contractIdGoodsIdKeyAndGoodsMap =
+                    tradeContractGoods.stream().collect(Collectors.groupingBy(KwcContractTradeGoods::getContractId));
+        }
+        List<QueryListResVo> list = getQueryListResVos(queryListResDtos, contractIdGoodsIdKeyAndGoodsMap);
         return PageHelperUtil.getPageResult(new PageInfo<>(list), queryListResDtos, reqVo.getPageSize());
     }
 
@@ -187,7 +205,7 @@ public class KwcContractTradeService {
      * @author: czh
      * @date: 2023/7/18
      */
-    private List<QueryListResVo> getQueryListResVos(List<QueryListResDto> queryListResDtos) {
+    private List<QueryListResVo> getQueryListResVos(List<QueryListResDto> queryListResDtos,Map<Long, List<KwcContractTradeGoods>> contractIdGoodsIdKeyAndGoodsMap ) {
         Map<Long, UserCacheResDto> longUserCacheResDtoMap = new HashMap<>(8);
         List<Long> initiateByList = queryListResDtos.stream().map(QueryListResDto::getInitiateBy).toList();
         if (CollectionUtils.isNotEmpty(initiateByList)) {
@@ -220,10 +238,22 @@ public class KwcContractTradeService {
             queryListResVo.setSigningWayName(DictEnum.getLabel(DictTypeEnum.SIGNING_TYPE.getType(), queryListResDto.getSigningWay()));
             queryListResVo.setSigningWay(String.valueOf(queryListResDto.getSigningWay()));
             queryListResVo.setUnloadWay(String.valueOf(queryListResDto.getUnloadWay()));
-            queryListResVo.setUnloadWayName(DictEnum.getLabel(String.valueOf(queryListResDto.getUnloadWay())));
+            queryListResVo.setUnloadWayName(DictEnum.getLabel(DictTypeEnum.CHARGING_TYPE.getType(),
+                    String.valueOf(queryListResDto.getUnloadWay())));
             queryListResVo.setAmount(queryListResDto.getAmount());
             queryListResVo.setPerformedAmount(queryListResDto.getPerformedAmount());
-
+            BigDecimal performedAmountMoney = BigDecimal.ZERO;
+            if(MapUtils.isNotEmpty(contractIdGoodsIdKeyAndGoodsMap)) {
+                List<KwcContractTradeGoods> contractTradeGoods = contractIdGoodsIdKeyAndGoodsMap.get(queryListResDto.getId());
+                if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(contractTradeGoods)){
+                    for (KwcContractTradeGoods goods : contractTradeGoods) {
+                        BigDecimal performedAmount = goods.getPerformedAmount() != null ? goods.getPerformedAmount() : BigDecimal.ZERO;
+                        BigDecimal price = goods.getPrice() != null ? goods.getPrice() : BigDecimal.ZERO;
+                        performedAmountMoney = performedAmountMoney.add(performedAmount.multiply(price));
+                    }
+                }
+            }
+            queryListResVo.setPerformedAmountMoney( performedAmountMoney);
             if(Objects.nonNull(queryListResVo.getEndTime())) {
                 queryListResVo.setEndTime(DateUtils.getStartOfDay(queryListResVo.getEndTime()));
             }
@@ -250,14 +280,14 @@ public class KwcContractTradeService {
         KwcContractTrade kwcContractTrade = getKwcContractTrade(baseInfo, reqVo.getGoodsInfo(), reqVo.getRemark(), reqVo.getPid());
         long contactId = new IdWorker(1L).nextId();
         kwcContractTrade.setId(contactId);
-        kwcContractTrade.setStatus(ContractStatusEnum.SAVE.getCode());
-        kwcContractTrade.setSigningUrl(changeFile(reqVo.getContractFile()));
+        kwcContractTrade.setStatus(ContractStatusEnum.WAIT_APPROVE.getCode());
+       // kwcContractTrade.setSigningUrl(changeFile(reqVo.getContractFile()));
         if (kwcContractTradeMapper.insert(kwcContractTrade) <= 0) {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);
         }
 
         //保存交易合同商品信息
-        kwcContractTradeGoodsService.saveContractTradeGoods(contactId, goodsInfoList);
+        kwcContractTradeGoodsService.saveContractTradeGoods(contactId, goodsInfoList,baseInfo.getStartTime(),baseInfo.getEndTime());
 
         //存单位信息
         kwcContractTradeUnitService.saveContractTradeUnit(contactId, baseInfo);
@@ -720,7 +750,8 @@ public class KwcContractTradeService {
                 throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.UPDATE_FAIL);
             }
         }
-        kwcContractTradeGoodsService.saveContractTradeGoods(kwcContractTrade.getId(), reqVo.getGoodsInfo());
+        kwcContractTradeGoodsService.saveContractTradeGoods(kwcContractTrade.getId(), reqVo.getGoodsInfo(),
+                baseInfo.getStartTime(), baseInfo.getEndTime());
 
         //保存单位信息-先把以前的删除
         List<KwcContractTradeUnit> kwcContractTradeUnits = kwcContractTradeUnitService.queryByContractId(contractId);
@@ -857,7 +888,7 @@ public class KwcContractTradeService {
             throw new SystemException(HttpStatus.SUCCESS_CODE, "暂无数据,请确认!");
         }
 
-        List<QueryListResVo> list = getQueryListResVos(queryListResDtos);
+        List<QueryListResVo> list = getQueryListResVos(queryListResDtos,null);
         List<TradeListExport> dataList = BeanUtils.copyToList(list, TradeListExport.class);
         ExcelUtil.downData(response, TradeListExport.class, dataList);
     }
@@ -878,7 +909,7 @@ public class KwcContractTradeService {
         if (CollectionUtils.isEmpty(queryListResDtos)) {
             return Collections.emptyList();
         }
-        return getQueryListResVos(queryListResDtos);
+        return getQueryListResVos(queryListResDtos,null);
     }
 
 
@@ -1093,31 +1124,98 @@ public class KwcContractTradeService {
         //校验标的信息是否有重复
         checkParams(req);
         //保存补充合同
-        saveTradeContract(req);
+        long contactId = new IdWorker(1L).nextId();
+        saveTradeContract(req, contactId);
 
         //获取商品id
         List<Long> goodsIds = req.getGoodsInfo()
                 .stream()
                 .map(SupplyContractTradeReq.TradeGoodsInfo::getGoodsId)
                 .collect(Collectors.toList());
+
+
+        //根据父id查询补充合同id
+        List<KwcContractTrade> kwcContractTrades = kwcContractTradeRepository.queryByPid(req.getPid());
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwcContractTrades)){
+            throw new BusinessException("没有补充合同");
+        }
+
+        //获取合同id
+        Set<Long> contractIds = kwcContractTrades.stream()
+                .map(KwcContractTrade::getId)
+                .collect(Collectors.toSet());
+        contractIds.add(req.getPid());
+        //查询标的信息
         //根据商品id查询标的信息和主合同
         List<KwcContractTradeGoods> kwcContractTradeGoods =
-                kwcContractTradeGoodsRepository.queryByConTractIdGoodsIds(req.getPid(),goodsIds);
+                kwcContractTradeGoodsRepository.queryByConTractIdsGoodsIds(contractIds,goodsIds);
+        //商品id映射商品信息(排除主合同查看是否存在补充合同的商品信息)
+        Map<Long, KwcContractTradeGoods> goodsIdAndGoodsMap = kwcContractTradeGoods.stream()
+                .filter(x -> !Objects.equals(x.getContractId(), req.getPid()))
+                .collect(Collectors.toMap(KwcContractTradeGoods::getGoodsId, Function.identity(), (x, y) -> x));
+        //过滤主合同查看的标信息 , 合同id商品id组成唯一key映射商品信息
+        Map<String, KwcContractTradeGoods> contractTradeKeyAndGoodsMap =
+                kwcContractTradeGoods.stream().filter(x -> Objects.equals(x.getContractId(), req.getPid()))
+                .peek(x -> x.setContractIdGoodsIdKey(x.getContractId() + "-" + x.getGoodsId()))
+                .collect(Collectors.toMap(KwcContractTradeGoods::getContractIdGoodsIdKey, Function.identity(), (x, y) -> x));
+
         //商品id映射交易商品信息
-        Map<Long, KwcContractTradeGoods> goodsIdAndCtgMap = kwcContractTradeGoods.stream()
-                .collect(Collectors.toMap(KwcContractTradeGoods::getGoodsId, Function.identity(), (a, b) -> a));
-        List<KwcContractTradeGoods> tradeGoodsList = Lists.newArrayList();
-        req.getGoodsInfo().forEach(x->{
-            KwcContractTradeGoods tradeGoods = goodsIdAndCtgMap.getOrDefault(x.getGoodsId(),new KwcContractTradeGoods());
-            // cxdf todo  补充合同的逻辑
-//            if (tradeGoods){
-//
-//            }
+        List<KwcContractTradeGoods> saveOrUpdateTradeGoods = Lists.newArrayList();
+        req.getGoodsInfo().forEach(g -> {
+            KwcContractTradeGoods tradeGoods = goodsIdAndGoodsMap.get(g.getGoodsId());
+            if (Objects.isNull(tradeGoods)){
+                //作为新增对象
+                buildTradeGoods(req, g, contractTradeKeyAndGoodsMap, saveOrUpdateTradeGoods,contactId);
+
+            }else {
+                //如果不为空判断时间是否重叠 存在则报错
+                if (g.getEffectiveStartTime().after(tradeGoods.getStartTime()) && g.getEffectiveStartTime().before(tradeGoods.getEndTime())
+                        || (g.getEffectiveEntTime().after(tradeGoods.getStartTime()) && g.getEffectiveEntTime().before(tradeGoods.getEndTime()))){
+                    throw new BusinessException("商品:"+g.getGoodsName() +"时间重叠,只有先结束之前的补充合同,才能进行创建;");
+                }
+                buildTradeGoods(req, g, contractTradeKeyAndGoodsMap, saveOrUpdateTradeGoods,contactId);
+            }
         });
 
+        kwcContractTradeGoodsRepository.saveOrUpdateBatch(saveOrUpdateTradeGoods);
+    }
+
+    private static void buildTradeGoods(SupplyContractTradeReq req, SupplyContractTradeReq.TradeGoodsInfo g,
+                                        Map<String, KwcContractTradeGoods> contractTradeKeyAndGoodsMap,
+                                        List<KwcContractTradeGoods> saveTradeGoods,long contactId) {
+        Long userId = LoginUserHolder.getUserId();
+        Date date = new Date();
+        KwcContractTradeGoods saveSupplyTradeGoods = new KwcContractTradeGoods();
+        saveSupplyTradeGoods.setContractId(contactId);
+        saveSupplyTradeGoods.setGoodsId(g.getGoodsId());
+        saveSupplyTradeGoods.setSkuId(0L);
+        saveSupplyTradeGoods.setAmount(g.getAmount());
+        saveSupplyTradeGoods.setUnit(g.getUnit());
+        saveSupplyTradeGoods.setPrice(g.getPrice());
+        saveSupplyTradeGoods.setPerformedAmount(new BigDecimal("0"));
+        saveSupplyTradeGoods.setStatus(Global.NO);
+        saveSupplyTradeGoods.setCreateBy(userId);
+        saveSupplyTradeGoods.setCreateTime(date);
+        saveSupplyTradeGoods.setUpdateBy(userId);
+        saveSupplyTradeGoods.setUpdateTime(date);
+        saveSupplyTradeGoods.setDelFlag(Global.NO);
+        saveSupplyTradeGoods.setStartTime(g.getEffectiveStartTime());
+        saveSupplyTradeGoods.setEndTime(g.getEffectiveEntTime());
+        //修改主合同商品数量
+
+        KwcContractTradeGoods tradeGoodsData =
+                contractTradeKeyAndGoodsMap.get(req.getPid() + "-" + g.getGoodsId());
+        if (Objects.nonNull(tradeGoodsData)){
+            KwcContractTradeGoods mainTradeGoods = new KwcContractTradeGoods();
+            mainTradeGoods.setId(tradeGoodsData.getId());
+            mainTradeGoods.setPrice(g.getPrice());
+            mainTradeGoods.setAmount(g.getAmount());
+            saveTradeGoods.add(mainTradeGoods);
+        }
+        saveTradeGoods.add(saveSupplyTradeGoods);
     }
 
-    private void saveTradeContract(SupplyContractTradeReq req) {
+    private void saveTradeContract(SupplyContractTradeReq req,long contactId) {
         SupplyContractTradeReq.TradeBaseInfo baseInfo = req.getBaseInfo();
         List<SupplyContractTradeReq.TradeGoodsInfo> goodsInfo = req.getGoodsInfo();
         Date date = new Date();
@@ -1157,7 +1255,6 @@ public class KwcContractTradeService {
         }
         kwcContractTrade.setAmount(amountTotal);
 
-        long contactId = new IdWorker(1L).nextId();
         kwcContractTrade.setId(contactId);
         kwcContractTrade.setStatus(ContractStatusEnum.SAVE.getCode());
         kwcContractTrade.setSigningUrl(changeFile(req.getContractFile()));
@@ -1206,4 +1303,392 @@ public class KwcContractTradeService {
         }
         return false;
     }
+
+    public Boolean updateStatus(@Valid ApprovalReq req) {
+        log.info("修改合同状态,请求参数 :{}", JSON.toJSONString(req));
+        //查询本地商品合同信息
+        KwcContractTrade kwcContractTrade = kwcContractTradeRepository.queryByContractId(Long.valueOf(req.getContractId()));
+        if (Objects.isNull(kwcContractTrade)) {
+            throw new BusinessException("合同不存在");
+        }
+        //创建修改对象
+        KwcContractTrade updateKwcContractTrade = new KwcContractTrade();
+        updateKwcContractTrade.setId(kwcContractTrade.getId());
+        updateKwcContractTrade.setRemark(req.getRemark());
+        //审核  审核后变成待签约
+        if (Objects.equals(req.getStatus(), ContractStatusEnum.SUBMIT.getCode()) && Objects.equals(kwcContractTrade.getStatus(), ContractStatusEnum.WAIT_APPROVE.getCode())) {
+            updateKwcContractTrade.setStatus(ContractStatusEnum.SUBMIT.getCode());
+        }
+        //审核拒绝 (状态由待审核变成已作废)
+        if (Objects.equals(req.getStatus(), ContractStatusEnum.CANNEL.getCode())
+                && Arrays.asList(ContractStatusEnum.WAIT_APPROVE.getCode(), ContractStatusEnum.SUBMIT.getCode()).contains(kwcContractTrade.getStatus())) {
+            updateKwcContractTrade.setStatus(ContractStatusEnum.CANNEL.getCode());
+        }
+        //签约 (状态由带签约变成签约)
+        if (Objects.equals(req.getStatus(), ContractStatusEnum.SIGNED.getCode()) && Objects.equals(kwcContractTrade.getStatus(), ContractStatusEnum.SUBMIT.getCode())) {
+            updateKwcContractTrade.setStatus(ContractStatusEnum.SIGNED.getCode());
+        }
+        //手动完结 (如果不传状态就表示手动完结) 如果当前状态是待签约或者待签约 那么变为作废
+        if (Objects.equals(req.getStatus(),ContractStatusEnum.CANNEL.getCode()) && Arrays.asList(ContractStatusEnum.WAIT_APPROVE.getCode(),
+                ContractStatusEnum.SUBMIT.getCode()).contains(kwcContractTrade.getStatus())){
+            updateKwcContractTrade.setStatus(ContractStatusEnum.CANNEL.getCode());
+        }
+        //手动完结 如果当前的状态是已经签约,订单变成已完结
+        if (Objects.equals(req.getStatus(),ContractStatusEnum.CANNEL.getCode()) && Objects.equals(kwcContractTrade.getStatus(),
+                ContractStatusEnum.SIGNED.getCode())){
+            updateKwcContractTrade.setStatus(ContractStatusEnum.COMPLETE.getCode());
+        }
+       return kwcContractTradeRepository.updateByContractId(updateKwcContractTrade);
+
+    }
+
+    public ContractDetailResp queryContractDetail(@Valid ContractDetailReq req) {
+        log.info("查询合同详情,请求参数 :{}", JSON.toJSONString(req));
+        //查询本地商品合同信息
+        KwcContractTrade kwcContractTrade = kwcContractTradeRepository.queryByContractId(Long.valueOf(req.getContractId()));
+        if (Objects.isNull(kwcContractTrade)) {
+            return new ContractDetailResp();
+        }
+        //根据订单号查询交易企业信息
+        List<KwcContractTradeUnit> tradeUnits = kwcContractTradeUnitRepository.queryByContractId(kwcContractTrade.getId());
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(tradeUnits)){
+            return new ContractDetailResp();
+        }
+        //安装合同id和单位类型组合成key映射公司对象
+        Map<String, KwcContractTradeUnit> ctTypeKeyAndUnitMap = tradeUnits.stream()
+                .peek(t -> t.setContractIdUniTypeKey(t.getContractId() + "-" + t.getUnitType()))
+                .collect(Collectors.toMap(KwcContractTradeUnit::getContractIdUniTypeKey, Function.identity(),
+                        (v1, v2) -> v1));
+
+        //查询商品合同
+        List<KwcContractTradeGoods> tradeGoods = kwcContractTradeGoodsRepository.queryByContractId(kwcContractTrade.getId());
+        List<Long> goodsIds = Lists.newArrayList();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tradeGoods)){
+            //获取商品id
+             goodsIds = tradeGoods.stream()
+                    .map(KwcContractTradeGoods::getGoodsId)
+                     .distinct()
+                    .collect(Collectors.toList());
+
+        }
+        //查询商品 商品id映射商品
+        Map<Long, KwpGoods> goodsIdAndGoodsMap = Maps.newHashMap();
+        if (CollectionUtils.isNotEmpty(goodsIds)){
+            goodsIdAndGoodsMap = goodsInfoService.getGoodsByIds(goodsIds);
+
+        }
+        //查询贸易订单
+        KwcContractTradeOrder kwcContractTradeOrder =
+                kwcContractTradeOrderRepository.queryByContractId(kwcContractTrade.getId());
+
+        //根据贸易订单号查询贸易订单信息
+        OrderDetailVo orderDetailVo = tradeOrderInfoService.queryByTradeOrderId(kwcContractTrade.getId());
+        //查询运单信息
+        List<RWaybillSubOrderVo> rWaybillSubOrderVos = transportRemoteService.queryWaybillOrderByTradeOrderIds(Set.of(kwcContractTrade.getId()));
+        Map<Long, RWaybillSubOrderVo> tradeOrderIdAndSubOrderVoMap = Maps.newHashMap();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(rWaybillSubOrderVos)){
+           tradeOrderIdAndSubOrderVoMap =
+                    rWaybillSubOrderVos.stream().collect(Collectors.toMap(RWaybillSubOrderVo::getTradeId, Function.identity(), (k1, k2) -> k1));
+        }
+
+        //查询物流合同
+        List<KwcContractLogisticsUnit> kwcContractLogisticsUnits = kwcContractLogisticsUnitRepository.queryByContractId(kwcContractTrade.getId());
+        //合同id和单位类型组合成key映射物流对象
+        Map<String, KwcContractLogisticsUnit> contractIdUnitTypeKeyAndUnitMap = kwcContractLogisticsUnits.stream()
+                .peek(x -> x.setContractIdUnitTypeKey(x.getContractId() + "-" + x.getUnitType()))
+                .collect(Collectors.toMap(KwcContractLogisticsUnit::getContractIdUnitTypeKey, Function.identity(), (x, y) -> x));
+
+        //查询物流商品
+        List<KwcContractLogisticsGoods> kwcContractLogisticsGoods = kwcContractLogisticsGoodsRepository.queryByContractId(kwcContractTrade.getId());
+        //合同id和商品id组成唯一key映射物流信息
+        Map<String, KwcContractLogisticsGoods> contractIdGoodsIdKeyAndGoodsMap = kwcContractLogisticsGoods.stream()
+                .peek(x -> x.setContractIdGoodsIdKey(x.getContractId() + "-" + x.getGoodsId()))
+                .collect(Collectors.toMap(KwcContractLogisticsGoods::getContractIdGoodsIdKey, Function.identity(), (x, y) -> x));
+
+        ContractDetailResp contractDetailResp = new ContractDetailResp();
+        contractDetailResp.setId(kwcContractTrade.getId());
+        contractDetailResp.setPid(kwcContractTrade.getContractPid());
+        //获取基本信息
+        ContractDetailResp.TradeBaseInfo baseInfo = getBaseInfo(ctTypeKeyAndUnitMap, kwcContractTrade);
+        contractDetailResp.setBaseInfo(baseInfo);
+        //文件合同
+        contractDetailResp.setContractFile(kwcContractTrade.getSignedUrl());
+
+        //标地信息
+        if (CollectionUtils.isNotEmpty(tradeGoods)){
+            Map<Long, KwpGoods> finalGoodsIdAndGoodsMap = goodsIdAndGoodsMap;
+            List<ContractDetailResp.TradeGoodsInfo> tradeGoodsInfos = tradeGoods.stream()
+                    .map(t -> getTradeGoodsInfo(t, finalGoodsIdAndGoodsMap))
+                    .collect(Collectors.toList());
+            contractDetailResp.setGoodsInfo(tradeGoodsInfos);
+        }
+//        //获取关联贸易订单
+//        ContractDetailResp.AssociatedOrder associatedOrder = getAssociateOrder(kwcContractTradeOrder,orderDetailVo,
+//                ctTypeKeyAndUnitMap,
+//                kwcContractTrade, contractIdUnitTypeKeyAndUnitMap, goodsIdAndGoodsMap,
+//                contractIdGoodsIdKeyAndGoodsMap,tradeOrderIdAndSubOrderVoMap);
+//        contractDetailResp.setAssociatedOrder(associatedOrder);
+
+        contractDetailResp.setRemark(kwcContractTrade.getRemark());
+
+        return contractDetailResp;
+    }
+
+//    private static ContractDetailResp.AssociatedOrder getAssociateOrder(KwcContractTradeOrder kwcContractTradeOrder,OrderDetailVo orderDetailVo, Map<String,
+//            KwcContractTradeUnit> ctTypeKeyAndUnitMap, KwcContractTrade kwcContractTrade, Map<String, KwcContractLogisticsUnit> contractIdUnitTypeKeyAndUnitMap,
+//                                                                        Map<Long, KwpGoods> goodsIdAndGoodsMap, Map<String, KwcContractLogisticsGoods> contractIdGoodsIdKeyAndGoodsMap
+//    ,Map<Long, RWaybillSubOrderVo> tradeOrderIdAndSubOrderVoMap) {
+//        ContractDetailResp.AssociatedOrder associatedOrder = new ContractDetailResp.AssociatedOrder();
+//        if (Objects.nonNull(kwcContractTradeOrder)){
+//            associatedOrder.setOrderId(kwcContractTradeOrder.getOrderId());
+//            associatedOrder.setOrderStatus(kwcContractTradeOrder.getStatus());
+//            associatedOrder.setOrderCode(kwcContractTradeOrder.getOrderNo());
+//            KwcContractTradeUnit purchaseUnit =
+//                    ctTypeKeyAndUnitMap.getOrDefault(kwcContractTrade.getId() + "-" + CooperateTypeEnum.PURCHASER.getCode(), new KwcContractTradeUnit());
+//
+//
+//            KwcContractTradeUnit provideUnit =
+//                    ctTypeKeyAndUnitMap.getOrDefault(kwcContractTrade.getId() + "-" + CooperateTypeEnum.SUPPLIER.getCode(), new KwcContractTradeUnit());
+//
+//            associatedOrder.setPurchaseEntId(purchaseUnit.getEntId());
+//            associatedOrder.setPurchaseEntName(purchaseUnit.getFirmName());
+//            associatedOrder.setProvideEntId(provideUnit.getEntId());
+//            associatedOrder.setProvideEntName(provideUnit.getFirmName());
+//
+//            KwcContractLogisticsUnit logisticsUnit =
+//                    contractIdUnitTypeKeyAndUnitMap.get(kwcContractTrade.getId() + "-" + CooperateTypeEnum.CONSIGN.getCode());
+//            if (Objects.nonNull(logisticsUnit)){
+//                associatedOrder.setTransportEntId(logisticsUnit.getEntId());
+//                associatedOrder.setTransportEntName(logisticsUnit.getFirmName());
+//            }
+//            KwcContractLogisticsUnit logisticsCarrigeUnit =
+//                    contractIdUnitTypeKeyAndUnitMap.get(kwcContractTrade.getId() + "-" + CooperateTypeEnum.CARRIAGE.getCode());
+//            if (Objects.nonNull(logisticsCarrigeUnit)){
+//                associatedOrder.setTransportEntId(logisticsCarrigeUnit.getEntId());
+//                associatedOrder.setTransportEntName(logisticsCarrigeUnit.getFirmName());
+//            }
+//            OrderDetailVo.GoodsInfo goodsInfo = orderDetailVo.getGoodsInfo();
+//            if (Objects.nonNull(goodsInfo)){
+//                associatedOrder.setGoodsId(goodsInfo.getGoodsId());
+//                KwpGoods goods = goodsIdAndGoodsMap.getOrDefault(goodsInfo.getGoodsId(), new KwpGoods());
+//                associatedOrder.setGoodsName(goods.getName());
+//            }
+//
+//
+//            associatedOrder.setBillingWay(orderDetailVo.getChargeType());
+//            associatedOrder.setBillingWayDesc(DictEnum.getLabel(DictTypeEnum.CHARGING_TYPE.getType(),
+//                    String.valueOf(orderDetailVo.getChargeType())));
+//            associatedOrder.setAmount(Objects.nonNull(orderDetailVo.getAmount()) ?
+//                    orderDetailVo.getAmount().toPlainString() : null);
+//            RWaybillSubOrderVo rWaybillSubOrderVo = tradeOrderIdAndSubOrderVoMap.get(kwcContractTrade.getId());
+//            List<RWaybillSubOrderVo.BillSubOrder> subOrders = rWaybillSubOrderVo.getSubOrders();
+//
+//            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(subOrders)){
+//                String loadAmount = subOrders.stream()
+//                        .map(RWaybillSubOrderVo.BillSubOrder::getLoadAmount)
+//                        .filter(Objects::nonNull)
+//                        .reduce(BigDecimal.ZERO, BigDecimal::add).toPlainString();
+//                associatedOrder.setLoadAmount(loadAmount);
+//                String unloadAmount = subOrders.stream()
+//                        .map(RWaybillSubOrderVo.BillSubOrder::getUnloadAmount)
+//                        .filter(Objects::nonNull)
+//                        .reduce(BigDecimal.ZERO, BigDecimal::add).toPlainString();
+//                associatedOrder.setUnloadAmount(unloadAmount);
+//            }
+//
+//
+//            List<OrderDetailVo.AddressInfo> addressInfos = orderDetailVo.getAddressInfo();
+//            Map<String, OrderDetailVo.AddressInfo> tradeOrderIdAndUnitTypeKeyAndUnitMap = Maps.newHashMap() ;
+//            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(addressInfos)){
+//               tradeOrderIdAndUnitTypeKeyAndUnitMap =
+//                        addressInfos.stream().peek(x -> x.setTradeOrderIdTypeKey(x.getTOrderId() + "-" + x.getAddressType()))
+//                        .collect(Collectors.toMap(OrderDetailVo.AddressInfo::getTradeOrderIdTypeKey, Function.identity(), (x, y) -> x));
+//            }
+//
+//            associatedOrder.setTransportPrice(Objects.nonNull(orderDetailVo.getPrice()) ?
+//                    orderDetailVo.getPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : null);
+//            OrderDetailVo.AddressInfo loadAdd = tradeOrderIdAndUnitTypeKeyAndUnitMap.getOrDefault(kwcContractTradeOrder.getContractId() + "-" + AddressTypeEnum.SHIPMENT.getCode(), new OrderDetailVo.AddressInfo());
+//            associatedOrder.setLoadAddress(loadAdd.getDetailAddress());
+//            OrderDetailVo.AddressInfo unloadAdd = tradeOrderIdAndUnitTypeKeyAndUnitMap.getOrDefault(kwcContractTradeOrder.getContractId() + "-" + AddressTypeEnum.SHIPMENT.getCode(), new OrderDetailVo.AddressInfo());
+//            associatedOrder.setUnloadAddress(unloadAdd.getDetailAddress());
+//        }
+//        return associatedOrder;
+//    }
+
+    private static ContractDetailResp.TradeGoodsInfo getTradeGoodsInfo(KwcContractTradeGoods t, Map<Long,
+            KwpGoods> finalGoodsIdAndGoodsMap) {
+        ContractDetailResp.TradeGoodsInfo tradeGoodsInfo = new ContractDetailResp.TradeGoodsInfo();
+        tradeGoodsInfo.setGoodsId(t.getGoodsId());
+        KwpGoods goods = finalGoodsIdAndGoodsMap.getOrDefault(t.getGoodsId(), new KwpGoods());
+        tradeGoodsInfo.setGoodsName(goods.getName());
+        tradeGoodsInfo.setAmount(t.getAmount());
+        tradeGoodsInfo.setPrice(t.getPrice());
+        tradeGoodsInfo.setUnit(t.getUnit());
+        tradeGoodsInfo.setEffectiveStartTime(t.getStartTime());
+        tradeGoodsInfo.setEffectiveEntTime(t.getEndTime());
+        return tradeGoodsInfo;
+    }
+
+    private static ContractDetailResp.TradeBaseInfo getBaseInfo(Map<String, KwcContractTradeUnit> ctTypeKeyAndUnitMap, KwcContractTrade kwcContractTrade) {
+        ContractDetailResp.TradeBaseInfo tradeBaseInfo = new ContractDetailResp.TradeBaseInfo();
+        KwcContractTradeUnit purchaseUnit =
+                ctTypeKeyAndUnitMap.getOrDefault(kwcContractTrade.getId() + "-" + CooperateTypeEnum.PURCHASER.getCode(), new KwcContractTradeUnit());
+        tradeBaseInfo.setPurchaseEntId(purchaseUnit.getEntId());
+
+        tradeBaseInfo.setPurchaseFirmName(purchaseUnit.getFirmName());
+        tradeBaseInfo.setPurchasePhone(purchaseUnit.getPhone());
+        KwcContractTradeUnit provideUnit =
+                ctTypeKeyAndUnitMap.getOrDefault(kwcContractTrade.getId() + "-" + CooperateTypeEnum.SUPPLIER.getCode(), new KwcContractTradeUnit());
+        tradeBaseInfo.setProvideEntId(provideUnit.getEntId());
+        tradeBaseInfo.setProvideFirmName(provideUnit.getFirmName());
+        tradeBaseInfo.setProvidePhone(provideUnit.getPhone());
+        tradeBaseInfo.setContractCode(kwcContractTrade.getContractNo());
+        tradeBaseInfo.setContractName(kwcContractTrade.getName());
+        tradeBaseInfo.setContractStatus(String.valueOf(kwcContractTrade.getStatus()));
+        tradeBaseInfo.setContractStatusDesc(ContractStatusEnum.getNameByCode(kwcContractTrade.getStatus()));
+        tradeBaseInfo.setEndTime(kwcContractTrade.getEndTime());
+        tradeBaseInfo.setSigningWay(kwcContractTrade.getSigningWay());
+        tradeBaseInfo.setSigningWayDesc(DictEnum.getLabel(DictTypeEnum.SIGNING_WAY.getType(), String.valueOf(kwcContractTrade.getSigningWay())));
+        tradeBaseInfo.setStartTime(kwcContractTrade.getStartTime());
+        tradeBaseInfo.setSettlement(kwcContractTrade.getSettlement());
+        tradeBaseInfo.setSettlementDesc(DictEnum.getLabel(DictTypeEnum.SETTLEMENT_WAY.getType(),
+                String.valueOf(kwcContractTrade.getSettlement())));
+        tradeBaseInfo.setConsignment(kwcContractTrade.getConsignment());
+        tradeBaseInfo.setConsignmentDesc(DictEnum.getLabel(DictTypeEnum.CONSIGNMENT_WAY.getType(),
+                String.valueOf(kwcContractTrade.getConsignment())));
+
+        tradeBaseInfo.setUnloadWay(kwcContractTrade.getUnloadWay());
+        tradeBaseInfo.setUnloadWayDesc(DictEnum.getLabel(DictTypeEnum.CHARGING_TYPE.getType(),
+                String.valueOf(kwcContractTrade.getUnloadWay())));
+        tradeBaseInfo.setSalesmanId(kwcContractTrade.getSalesmanId());
+        tradeBaseInfo.setSalesmanPhone(kwcContractTrade.getSalesmanPhone());
+        return tradeBaseInfo;
+    }
+
+    public PageDataResult<QueryListResVo> queryTradeListByPage(QueryTradeReq req) {
+        Set<Long> entIds = Sets.newHashSet();
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getPurchaseEntId())) {
+            //查询企业 信息
+            entIds.add(Long.valueOf(req.getPurchaseEntId()));
+        }
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getSupplyEntId())) {
+            entIds.add(Long.valueOf(req.getSupplyEntId()));
+        }
+        Set<Long> contractIds = Sets.newHashSet();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(entIds)){
+           List<KwcContractTradeUnit> units = kwcContractTradeUnitRepository.queryByEntIds(entIds);
+           if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(units)){
+              contractIds = units.stream().map(KwcContractTradeUnit::getContractId).collect(Collectors.toSet());
+           }
+        }
+        List<Long> allEnt = Lists.newArrayList();
+        if (StringUtils.isBlank(req.getEntId())) {
+            req.setEntId(String.valueOf(LoginUserHolder.getEntId()));
+        }
+        allEnt.add(Long.valueOf(req.getEntId()));
+        EntCacheResDto entCacheResDto = remoteSystemService.queryEntTreeById(Long.valueOf(req.getEntId()));
+        if (Objects.nonNull(entCacheResDto)) {
+            EntCacheResDto entCacheResDto1 = remoteSystemService.queryEntTreeById(entCacheResDto.getId());
+            List<EntCacheResDto> child = entCacheResDto1.getChild();
+            if (CollectionUtils.isNotEmpty(child)) {
+                allEnt.addAll(child.stream().map(EntCacheResDto::getId).toList());
+            }
+        }
+
+        //分页查询合同信息
+        IPage<KwcContractTrade> page = kwcContractTradeRepository.queryTradeListByPage(allEnt,
+                req.getContractCode(),
+                req.getContractName(),
+                contractIds, req.getStatus(), req.getPageNum(), req.getPageSize());
+        List<KwcContractTrade> records = page.getRecords();
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(records)){
+            return PageDataResult.empty(req.getPageNum(), req.getPageSize());
+        }
+        Set<Long> tradeContractIds = records.stream().map(KwcContractTrade::getId).collect(Collectors.toSet());
+        //获取父id
+        Set<Long> contractPids = records.stream().map(KwcContractTrade::getContractPid).collect(Collectors.toSet());
+        //根据父id查询父合同信息
+        Map<Long, KwcContractTrade> pidIdAndTradeMap = Maps.newHashMap();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(contractPids)){
+            List<KwcContractTrade> contractPidList = kwcContractTradeRepository.queryByContractIds(contractPids);
+
+            pidIdAndTradeMap =
+                    contractPidList.stream().collect(Collectors.toMap(KwcContractTrade::getId
+                    , Function.identity(), (v1, v2) -> v1));
+        }
+
+        //查询公司信息
+        List<KwcContractTradeUnit> tradeUnits = kwcContractTradeUnitRepository.queryByContractIds(tradeContractIds);
+        Map<String, KwcContractTradeUnit> contractUnitTypeKeyAndUnitMap = Maps.newHashMap();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tradeUnits)){
+            contractUnitTypeKeyAndUnitMap = tradeUnits.stream()
+                    .peek(x -> x.setContractIdUniTypeKey(x.getContractId() + "-" + x.getUnitType()))
+                    .collect(Collectors.toMap(KwcContractTradeUnit::getContractIdUniTypeKey, Function.identity(), (v1
+                            , v2) -> v1));
+        }
+        //查询用户信息
+        //获取创建人
+        List<Long> createBys =
+                records.stream().map(KwcContractTrade::getCreateBy).distinct().collect(Collectors.toList());
+        Map<Long, UserCacheResDto> longUserCacheResDtoMap = remoteSystemService.queryUserCacheMapByIds(createBys);
+        Map<Long, KwcContractTrade> finalPidIdAndTradeMap = pidIdAndTradeMap;
+        Map<String, KwcContractTradeUnit> finalContractUnitTypeKeyAndUnitMap = contractUnitTypeKeyAndUnitMap;
+        List<QueryListResVo> queryListResVos = records.stream()
+                .map(t -> getQueryListResVo(t, finalContractUnitTypeKeyAndUnitMap, finalPidIdAndTradeMap, longUserCacheResDtoMap))
+                .collect(Collectors.toList());
+
+
+
+        return PageDataResult.of(page, queryListResVos);
+    }
+
+    @NotNull
+    private static QueryListResVo getQueryListResVo(KwcContractTrade t, Map<String, KwcContractTradeUnit> finalContractUnitTypeKeyAndUnitMap, Map<Long, KwcContractTrade> finalPidIdAndTradeMap, Map<Long, UserCacheResDto> longUserCacheResDtoMap) {
+        QueryListResVo queryListResVo = new QueryListResVo();
+        queryListResVo.setId(t.getId());
+        queryListResVo.setStatus(t.getStatus());
+        queryListResVo.setStatusName(ContractStatusEnum.getNameByCode(t.getStatus()));
+
+        KwcContractTradeUnit purchaseEnt = finalContractUnitTypeKeyAndUnitMap.getOrDefault(t.getId() + "-" + CooperateTypeEnum.PURCHASER.getCode(),
+                new KwcContractTradeUnit());
+        queryListResVo.setPurchaseEntId(String.valueOf(purchaseEnt.getEntId()));
+        queryListResVo.setPurchaseEntName(purchaseEnt.getFirmName());
+        KwcContractTradeUnit provideEnt =
+                finalContractUnitTypeKeyAndUnitMap.getOrDefault(t.getId() + "-" + CooperateTypeEnum.SUPPLIER.getCode(),
+                new KwcContractTradeUnit());
+        queryListResVo.setProvideEntId(String.valueOf(provideEnt.getEntId()));
+        queryListResVo.setProvideEntName(provideEnt.getFirmName());
+        //queryListResVo.setCheckedEntName();
+        queryListResVo.setContractNo(t.getContractNo());
+        queryListResVo.setContractName(t.getName());
+        queryListResVo.setSigningWay(String.valueOf(t.getSigningWay()));
+        queryListResVo.setSigningWayName(DictEnum.getLabel(DictTypeEnum.SIGNING_TYPE.getType(),String.valueOf(t.getSigningWay())));
+        queryListResVo.setUnloadWay(String.valueOf(t.getUnloadWay()));
+        queryListResVo.setUnloadWayName(DictEnum.getLabel(DictTypeEnum.LOAD_UNLOAD_WAY.getType(),
+                String.valueOf(t.getUnloadWay())));
+        queryListResVo.setAmount(t.getAmount());
+        queryListResVo.setPerformedAmount(t.getPerformedAmount());
+
+        // queryListResVo.setPerformedAmountMoney();
+        queryListResVo.setContractPid(t.getContractPid());
+        KwcContractTrade parentTrade = finalPidIdAndTradeMap.getOrDefault(t.getContractPid(),
+                new KwcContractTrade());
+        queryListResVo.setContractPname(parentTrade.getName());
+
+//            queryListResVo.setChargingName();
+//            queryListResVo.setTradingName();
+//            queryListResVo.setCarrierEntName();
+        UserCacheResDto userCacheResDto = longUserCacheResDtoMap.getOrDefault(t.getCreateBy(), new UserCacheResDto());
+        queryListResVo.setInitiateName(userCacheResDto.getName());
+        if (Objects.nonNull(userCacheResDto.getEntInfo())){
+            queryListResVo.setInitiateEntName(userCacheResDto.getEntInfo().getFirmName());
+        }
+        queryListResVo.setCreateTime(t.getCreateTime());
+        queryListResVo.setStartTime(t.getStartTime());
+        queryListResVo.setEndTime(t.getEndTime());
+        queryListResVo.setInitiateTime(t.getCreateTime());
+        queryListResVo.setRemark(t.getRemark());
+        queryListResVo.setSignTime(t.getCreateTime());
+        return queryListResVo;
+    }
 }

+ 29 - 0
sckw-modules/sckw-contract/src/main/resources/bootstrap-cxf.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

+ 9 - 8
sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractTradeMapper.xml

@@ -27,7 +27,8 @@
                a.contract_pid contractPid,
                a.performed_amount performedAmount,
                f.name contractPname,
-               f.unload_way   unloadWay
+               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
@@ -44,13 +45,13 @@
           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
+<!--           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>

+ 29 - 0
sckw-modules/sckw-file/src/main/resources/bootstrap-cxf.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

+ 10 - 0
sckw-modules/sckw-fleet/pom.xml

@@ -97,6 +97,16 @@
 <!--            <version>1.0.0</version>-->
             <version>${basic.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
+            <version>2.6.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
+            <version>4.5.0</version>
+        </dependency>
 
     </dependencies>
 

+ 1 - 7
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfTruckAxleNumController.java

@@ -35,10 +35,4 @@ public class KwfTruckAxleNumController {
         return BaseResult.success(truckAxleNumVOS);
     }
 
-
-
-
-
-
-
-}
+}

+ 41 - 6
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java

@@ -1,10 +1,10 @@
 package com.sckw.fleet.dubbo;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
-import com.sckw.core.utils.NumberUtils;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.vo.*;
@@ -14,14 +14,10 @@ import com.sckw.fleet.model.*;
 import com.sckw.fleet.repository.*;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
-import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -45,6 +41,7 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
     private final KwfFleetDriverRepository kwfFleetDriverRepository;
     private final KwfFleetTruckRepository kwfFleetTruckRepository;
     private final KwfTruckRouteRepository kwfTruckRouteRepository;
+    private final KwfTruckAxleNumRepository kwfTruckAxleNumRepository;
 
     /**
      * @param driverIds 司机档案主键id,多个已逗号隔开
@@ -336,6 +333,8 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
         rTruckVo.setTotalWeight(truck.getTotalWeight());
         rTruckVo.setBusinessStatus(truck.getBusinessStatus());
         rTruckVo.setTruckType(StringUtils.isBlank(truck.getType()) ? "": String.valueOf(truck.getType()));
+        rTruckVo.setStatus(truck.getStatus());
+        rTruckVo.setCarAxis(truck.getCarAxis());
         return rTruckVo;
     }
 
@@ -364,6 +363,42 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
         return fleetVo;
     }
 
+    /**
+     * 查询轴数
+     * @param axleNumIds
+     * @return
+     */
+    @Override
+    public List<TmsTruckAxleNumVO> getCarAxisInfo(List<Integer> axleNumIds) {
+        //查询车辆关联司机信息
+        List<TmsTruckAxleNum> axleNumList = kwfTruckAxleNumRepository.list(Wrappers.<TmsTruckAxleNum>lambdaQuery()
+                .eq(TmsTruckAxleNum::getStatus, 1)
+                .in(TmsTruckAxleNum::getId, axleNumIds));
+        if (CollectionUtils.isEmpty(axleNumList)) {
+            return new ArrayList<>();
+        }
+        List<TmsTruckAxleNumVO> voList = new ArrayList<>();
+        axleNumList.forEach(axleNum -> {
+            TmsTruckAxleNumVO vo = new TmsTruckAxleNumVO();
+            vo.setId(axleNum.getId());
+            vo.setName(axleNum.getName());
+            voList.add(vo);
+        });
+
+        return voList;
+    }
+
+    @Override
+    public List<RTruckVo> findTruckByTruckIds(Set<Long> truckIds) {
+        List<KwfTruck> trucks = kwfTruckRepository.findTruckByTruckIds(truckIds);
+        if (CollectionUtils.isEmpty(trucks)){
+            return Collections.emptyList();
+        }
+        return trucks.stream()
+                .map(RemoteFleetServiceImpl::getTruckVo)
+                .collect(Collectors.toList());
+
+    }
 
 
 }

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

@@ -77,4 +77,11 @@ public class KwfTruckRepository extends ServiceImpl<KwfTruckMapper, KwfTruck> {
                 .ge(StringUtils.isNotBlank(startTime),KwfTruck::getCreateTime, startTime)
                 .le(StringUtils.isNotBlank(endTime),KwfTruck::getCreateTime, endTime));
     }
+
+    public List<KwfTruck> findTruckByTruckIds(Set<Long> truckIds) {
+
+        return list(Wrappers.<KwfTruck>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .in(KwfTruck::getId, truckIds));
+    }
 }

+ 3 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckRouteService.java

@@ -15,6 +15,7 @@ import com.sckw.fleet.model.request.TruckRoteDetailReq;
 import com.sckw.fleet.model.vo.QueryTruckRoteVo;
 import com.sckw.fleet.model.vo.TruckRoteDetailVo;
 import com.sckw.fleet.repository.*;
+import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -37,7 +38,8 @@ public class KwfTruckRouteService {
     private final KwfDriverRepository driverRepository;
     private final KwfFleetTruckRepository fleetTruckRepository;
     private final KwfTruckRepository truckRepository;
-    private final KwfFleetRepository fleetRepository;
+    @Resource
+    private  KwfFleetRepository fleetRepository;
 
 
     public PageDataResult<QueryTruckRoteVo> pageTruckRoute(QueryTruckRoteReq req) {

+ 3 - 0
sckw-modules/sckw-fleet/src/main/resources/application.yml

@@ -0,0 +1,3 @@
+links: /kwfDriver/forgetPassword
+#直接放行的请求链接
+specialLinks: /kwfReport/import

+ 29 - 0
sckw-modules/sckw-fleet/src/main/resources/bootstrap-cxf.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

+ 5 - 5
sckw-modules/sckw-fleet/src/main/resources/bootstrap-test.yml

@@ -3,16 +3,16 @@ spring:
     nacos:
       discovery:
         # 服务注册地址
-        server-addr: @nacos.server@
+        server-addr: 10.10.10.224:8848
         # 命名空间
-        namespace: @nacos.namespace@
+        namespace: sckw-ng-service-platform
         # 共享配置
         group: sckw-ng-service-platform
       config:
         # 配置中心地址
-        server-addr: @nacos.server@
+        server-addr: 10.10.10.224:8848
         # 命名空间
-        namespace: @nacos.namespace@
+        namespace: sckw-ng-service-platform
         # 共享配置
         group: sckw-ng-service-platform
         # 配置文件格式
@@ -29,4 +29,4 @@ spring:
         extension-configs:
           - dataId: sckw-common.yml
             group: sckw-ng-service-platform
-            refresh: true
+            refresh: true

+ 33 - 2
sckw-modules/sckw-fleet/src/main/resources/bootstrap.yml

@@ -6,7 +6,38 @@ spring:
     name: sckw-ng-fleet
   profiles:
     #    active: ${DEPLOY_MODE:dev}
-    active: @profiles.active@
+    active: test
   main:
     allow-bean-definition-overriding: true
-    allow-circular-references: true
+    allow-circular-references: true
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+        server-addr: 10.10.10.224:8848
+        # 命名空间
+        namespace: sckw-ng-service-platform
+        # 共享配置
+        group: sckw-ng-service-platform
+      config:
+        # 配置中心地址
+        server-addr: 10.10.10.224:8848
+        # 命名空间
+        namespace: sckw-ng-service-platform
+        # 共享配置
+        group: sckw-ng-service-platform
+        # 配置文件格式
+        file-extension: yaml
+        shared-configs:
+          - data-id: sckw-common.yml
+            group: sckw-ng-common
+            refresh: true
+          - data-id: amap-config.yml
+            group: sckw-ng-service-platform
+            refresh: true
+
+        #可以读多个配置文件 需要在同一个命名空间下面可以是不同的组
+        extension-configs:
+          - dataId: sckw-common.yml
+            group: sckw-ng-service-platform
+            refresh: true

+ 10 - 0
sckw-modules/sckw-manage/pom.xml

@@ -103,6 +103,16 @@
 <!--            <version>1.0.0</version>-->
             <version>${basic.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
+            <version>2.6.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
+            <version>4.5.0</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 29 - 0
sckw-modules/sckw-manage/src/main/resources/bootstrap-cxf.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

+ 10 - 0
sckw-modules/sckw-message/pom.xml

@@ -83,6 +83,16 @@
 <!--            <version>1.0.0</version>-->
             <version>${basic.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
+            <version>2.6.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
+            <version>4.5.0</version>
+        </dependency>
 
     </dependencies>
 

+ 29 - 0
sckw-modules/sckw-message/src/main/resources/bootstrap-cxf.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

+ 10 - 0
sckw-modules/sckw-operation/pom.xml

@@ -78,6 +78,16 @@
 <!--            <version>1.0.0</version>-->
             <version>${basic.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
+            <version>2.6.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
+            <version>4.5.0</version>
+        </dependency>
 
     </dependencies>
 	<build>

+ 29 - 0
sckw-modules/sckw-operation/src/main/resources/bootstrap-cxf.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

+ 10 - 0
sckw-modules/sckw-order/pom.xml

@@ -118,6 +118,16 @@
 <!--            <version>1.0.0</version>-->
             <version>${basic.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.springdoc</groupId>
+            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
+            <version>2.6.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
+            <version>4.5.0</version>
+        </dependency>
 
     </dependencies>
 

+ 26 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/TradeOrderManageController.java

@@ -3,10 +3,16 @@ package com.sckw.order.controller;
 import com.sckw.core.exception.CustomPromptException;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.web.constant.HttpStatus;
+import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
+import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.excel.utils.ExcelUtil;
 import com.sckw.order.model.vo.req.*;
+import com.sckw.order.model.vo.res.QueryTradeOrderResp;
+import com.sckw.order.model.vo.res.TradeOrderDetailResp;
 import com.sckw.order.serivce.TradeOrderManageService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
 import org.springframework.http.MediaType;
@@ -26,6 +32,7 @@ import java.util.List;
 @AllArgsConstructor
 @RestController
 @RequestMapping("/kwOrderManage")
+@Tag(name = "贸易订单管理")
 public class TradeOrderManageController {
 
     private final TradeOrderManageService tradeOrderManageService;
@@ -84,4 +91,23 @@ public class TradeOrderManageController {
         return HttpResult.ok(tradeOrderManageService.contractAssociationList(params));
     }
 
+
+    /**
+     * 分页查询贸易订单
+     */
+    @PostMapping(value = "/pageQueryTradeOrder")
+    @Operation(summary = "分页查询贸易订单")
+    public BaseResult<PageDataResult<QueryTradeOrderResp>> pageQueryTradeOrder(@RequestBody @Validated QueryTradeOrderReq req) {
+        return BaseResult.success(tradeOrderManageService.pageQueryTradeOrder(req));
+    }
+
+    /**
+     * 获取贸易订单详情
+     */
+    @PostMapping(value = "/getTradeOrderDetail")
+    @Operation(summary = "获取贸易订单详情")
+    public BaseResult<TradeOrderDetailResp> getTradeOrderDetail(@RequestBody @Validated TradeOrderDetailReq req) {
+        return BaseResult.success(tradeOrderManageService.getTradeOrderDetail(req));
+    }
+
 }

+ 111 - 4
sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java

@@ -15,15 +15,14 @@ import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.order.api.model.*;
 import com.sckw.order.enums.DeliveryTypeEnum;
 import com.sckw.order.enums.OrderStatusEnum;
-import com.sckw.order.model.KwoTradeOrder;
-import com.sckw.order.model.KwoTradeOrderContract;
-import com.sckw.order.model.KwoTradeOrderGoodsUnit;
-import com.sckw.order.model.KwoTradeOrderTrack;
+import com.sckw.order.model.*;
 import com.sckw.order.model.vo.res.AddressInfoDetailRes;
+import com.sckw.order.repository.*;
 import com.sckw.order.serivce.*;
 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.DubboService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,10 +31,12 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.ZoneId;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @desc: 订单dubbo实现
@@ -44,6 +45,7 @@ import java.util.Set;
  */
 @DubboService(group = "design", version = "1.0.0")
 @Slf4j
+@RequiredArgsConstructor
 public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
 
     @Autowired
@@ -61,6 +63,12 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
     @Autowired
     private KwoTradeOrderGoodsUnitService tradeOrderGoodsUnitService;
 
+    private final KwoTradeOrderRepository kwoTradeOrderRepository;
+    private final KwoTradeOrderGoodsRepository kwoTradeOrderGoodsRepository;
+    private final KwoTradeOrderUnitRepository kwoTradeOrderUnitRepository;
+    private final KwoTradeOrderAddressRepository kwoTradeOrderAddressRepository;
+    private final KwoTradeOrderContractRepository kwoTradeOrderContractRepository;
+
     @Override
     public OrderDetailRes getOrderDetailById(Long tOrderId) {
         OrderDetailRes order = BeanUtil.copyProperties(kwoTradeOrderService.detail(tOrderId), OrderDetailRes.class);
@@ -453,6 +461,105 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
         return CollUtil.isNotEmpty(list);
     }
 
+    @Override
+    public OrderDetailVo queryByTradeOrderId(Long tradeOrderId) {
+        //根据贸易订单id查询订单
+        KwoTradeOrder kwoTradeOrder = kwoTradeOrderRepository.queryByTradeOrderId(tradeOrderId);
+        if (Objects.isNull(kwoTradeOrder)){
+            return new OrderDetailVo();
+        }
+        //根据贸易订单id查询贸易商品
+        KwoTradeOrderGoods kwoTradeOrderGoods = kwoTradeOrderGoodsRepository.queryByOrderId(tradeOrderId);
+        //根据贸易订单号查询企业信息
+        List<KwoTradeOrderUnit> kwoTradeOrderUnits = kwoTradeOrderUnitRepository.queryByOrderId(tradeOrderId);
+        //根据贸易订单id查询贸易订单地址
+        List<KwoTradeOrderAddress> kwoTradeOrderAddresses = kwoTradeOrderAddressRepository.queryByOrderId(tradeOrderId);
+        //查询合同信息
+        KwoTradeOrderContract kwoTradeOrderContract = kwoTradeOrderContractRepository.queryByTradeOrderId(tradeOrderId);
+
+        OrderDetailVo orderDetailRes = new OrderDetailVo();
+        orderDetailRes.setEntId(kwoTradeOrder.getEntId());
+        orderDetailRes.setTOrderNo(kwoTradeOrder.getTOrderNo());
+        orderDetailRes.setAmount(kwoTradeOrder.getAmount());
+        orderDetailRes.setUnit(kwoTradeOrder.getUnit());
+        orderDetailRes.setPrice(kwoTradeOrder.getPrice());
+        orderDetailRes.setTrading(kwoTradeOrder.getTrading());
+        orderDetailRes.setPickupType(kwoTradeOrder.getPickupType());
+        orderDetailRes.setDeliveryType(kwoTradeOrder.getDeliveryType());
+        orderDetailRes.setStartTime(kwoTradeOrder.getStartTime());
+        orderDetailRes.setEndTime(kwoTradeOrder.getEndTime());
+        orderDetailRes.setEntrustAmount(kwoTradeOrder.getEntrustAmount());
+        orderDetailRes.setActualAmount(kwoTradeOrder.getActualAmount());
+        orderDetailRes.setAssociateStatement(kwoTradeOrder.getAssociateStatement());
+        orderDetailRes.setSource(kwoTradeOrder.getSource());
+        orderDetailRes.setChargeType(kwoTradeOrder.getChargeType());
+        orderDetailRes.setConsignmentWay(kwoTradeOrder.getConsignmentWay());
+
+        if (Objects.nonNull(kwoTradeOrderGoods)){
+            OrderDetailVo.GoodsInfo goodsInfo = new OrderDetailVo.GoodsInfo();
+            goodsInfo.setTOrderId(kwoTradeOrderGoods.getTOrderId());
+            goodsInfo.setTOrderNo(kwoTradeOrderGoods.getTOrderNo());
+            goodsInfo.setGoodsId(kwoTradeOrderGoods.getGoodsId());
+            goodsInfo.setGoodsType(kwoTradeOrderGoods.getGoodsType());
+            goodsInfo.setSkuId(kwoTradeOrderGoods.getSkuId());
+            goodsInfo.setUnit(kwoTradeOrderGoods.getUnit());
+            goodsInfo.setUnitPrice(kwoTradeOrderGoods.getUnitPrice());
+            goodsInfo.setPriceRangeId(kwoTradeOrderGoods.getPriceRangeId());
+            goodsInfo.setGoodsName(kwoTradeOrderGoods.getGoodsName());
+            orderDetailRes.setGoodsInfo(goodsInfo);
+        }
+
+        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())
+            );
+        }
+        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());
+            orderDetailRes.setAddressInfo(addressInfos);
+        }
+        if (Objects.nonNull(kwoTradeOrderContract)){
+            OrderDetailVo.TradeContractInfo tradeContractInfo = new OrderDetailVo.TradeContractInfo();
+            tradeContractInfo.setContractId(kwoTradeOrderContract.getContractId());
+            tradeContractInfo.setContractNo(kwoTradeOrderContract.getContractNo());
+            tradeContractInfo.setTOrderId(kwoTradeOrderContract.getTOrderId());
+            tradeContractInfo.setTOrderNo(kwoTradeOrderContract.getTOrderNo());
+
+            orderDetailRes.setContractInfo(tradeContractInfo);
+        }
+        return orderDetailRes;
+    }
+
     /**
      * @desc: mq保存mongodb
      * @author: yzc

+ 15 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrder.java

@@ -1,5 +1,6 @@
 package com.sckw.order.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.sckw.core.model.base.BaseModel;
@@ -105,4 +106,18 @@ public class KwoTradeOrder extends BaseModel implements Serializable {
      */
     private String source;
 
+    /**
+     * 计费方式
+     */
+    @TableField("charge_type")
+    private Integer chargeType;
+
+    /**
+     * 托运方式
+     */
+    @TableField("consignment_way")
+    private Integer consignmentWay;
+
+
+
 }

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

@@ -1,5 +1,6 @@
 package com.sckw.order.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.sckw.core.model.base.BaseModel;
@@ -100,4 +101,7 @@ public class KwoTradeOrderAddress extends BaseModel implements Serializable {
      */
     private Integer sort;
 
+    @TableField(exist = false)
+    private String tradeOrderIdTypeKey;
+
 }

+ 6 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrderGoods.java

@@ -1,5 +1,6 @@
 package com.sckw.order.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.sckw.core.model.base.BaseModel;
@@ -67,5 +68,10 @@ public class KwoTradeOrderGoods extends BaseModel implements Serializable {
      * kwp_goods_price_range表主键ID
      */
     private Long priceRangeId;
+    /**
+     * 商品名称
+     */
+    @TableField("goods_name")
+    private String goodsName ;
 
 }

+ 3 - 1
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrderUnit.java

@@ -1,5 +1,6 @@
 package com.sckw.order.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.sckw.core.model.base.BaseModel;
@@ -71,5 +72,6 @@ public class KwoTradeOrderUnit extends BaseModel implements Serializable {
      * 联系电话
      */
     private String phone;
-
+    @TableField(exist = false)
+    private String tradeOrderIdAndUnitType;
 }

+ 75 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/QueryTradeOrderReq.java

@@ -0,0 +1,75 @@
+package com.sckw.order.model.vo.req;
+
+import com.sckw.core.web.request.PageReq;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易订单请求参数
+ * @create :2025-11-07 08:58:00
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class QueryTradeOrderReq extends PageReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -1255552097881890061L;
+    /**
+     * 贸易合同id
+     */
+    @Schema(description = "贸易合同id")
+    private String tradeOrderId;
+    /**
+     * 订单编号
+     */
+    @Schema(description = "订单编号")
+    private String orderNo;
+    /**
+     * 商品名称
+     */
+    @Schema(description = "商品名称")
+    private String goodsName;
+
+    /**
+     * 商品类别
+     */
+    @Schema(description = "商品类别")
+    private String goodsType;
+    /**
+     * 商品规格
+     */
+    @Schema(description = "商品规格")
+    private String goodsSpec;
+    /**
+     * 采购单位id
+     */
+    @Schema(description = "采购单位id")
+    private String purchaseEntId;
+    /**
+     * 供应单位id
+     */
+    @Schema(description = "供应单位id")
+    private String supplyEntId;
+
+    /**
+     * 承运单位id
+     */
+    @Schema(description = "承运单位id")
+    private String carriageEntId;
+    /**
+     * 下单开始时间
+     */
+    @Schema(description = "下单开始时间")
+    private String orderStartTime;
+    /**
+     * 下单结束时间
+     */
+    @Schema(description = "下单结束时间")
+    private String orderEndTime;
+
+}

+ 26 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderDetailReq.java

@@ -0,0 +1,26 @@
+package com.sckw.order.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易订单详情查询请求参数
+ * @create :2025-11-07 16:49:00
+ */
+@Data
+public class TradeOrderDetailReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 6441044501410981032L;
+    /**
+     * 贸易订单id
+     */
+    @Schema(description = "贸易订单id")
+    @NotBlank(message = "贸易订单id不能为空")
+    private String tradeOrderId;
+}

+ 144 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/QueryTradeOrderResp.java

@@ -0,0 +1,144 @@
+package com.sckw.order.model.vo.res;
+
+import com.sckw.core.web.request.PageReq;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易订单响应对象
+ * @create :2025-11-07 08:58:00
+ */
+
+@Data
+public class QueryTradeOrderResp  implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -1255552097881890061L;
+    /**
+     * 贸易订单id
+     */
+    @Schema(description = "贸易订单id")
+    private String orderId;
+    /**
+     * 贸易订单编号
+     */
+    @Schema(description = "贸易订单编号")
+    private String orderNo;
+    /**
+     * 采购单位id
+     */
+    @Schema(description = "采购单位id")
+    private String purchaseEntId;
+    /**
+     * 采购单位名称
+     */
+    @Schema(description = "采购单位名称")
+    private String purchaseFirmName;
+    /**
+     * 供应单位id
+     */
+    @Schema(description = "供应单位id")
+    private String supplyEntId;
+    /**
+     * 供应单位名称
+     */
+    @Schema(description = "供应单位名称")
+    private String supplyFirmName;
+    /**
+     * 运输单位 id
+     *
+     */
+    @Schema(description = "运输单位 id")
+    private String transportEntId;
+    /**
+     * 运输单位名称
+     */
+    @Schema(description = "运输单位名称")
+    private String transportFirmName;
+    /**
+     * 商品名称
+     */
+    @Schema(description = "商品名称")
+    private String goodsName;
+    /**
+     * 商品价格
+     */
+    @Schema(description = "商品价格")
+    private String goodsPrice;
+    /**
+     * 计费方式
+     */
+    @Schema(description = "计费方式")
+    private String chargeType;
+    /**
+     * 计费方式描述
+     */
+    @Schema(description = "计费方式描述")
+    private String chargeTypeDesc;
+
+    /**
+     * 下单量
+     */
+    @Schema(description = "下单量")
+    private String orderQty;
+    /**
+     * 累计装货量
+     */
+    @Schema(description = "累计装货量")
+    private String loadQty;
+    /**
+     * 累计卸货量
+     */
+    @Schema(description = "累计卸货量")
+    private String unloadQty;
+    /**
+     * 装货地址
+     */
+    @Schema(description = "装货地址")
+    private String loadAddress;
+    /**
+     * 卸货地址
+     */
+    @Schema(description = "卸货地址")
+    private String unloadAddress;
+    /**
+     * 卸货联系人
+     */
+    @Schema(description = "卸货联系人")
+    private String unloadContacts;
+    /**
+     * 卸货联系电话
+     */
+    @Schema(description = "卸货联系电话")
+    private String unloadPhone;
+    /**
+     * 开始时间
+     */
+    @Schema(description = "开始时间")
+    private String startTime;
+    /**
+     * 结束时间
+     */
+    @Schema(description = "结束时间")
+    private String endTime;
+    /**
+     * 关联合同编号
+     */
+    @Schema(description = "关联合同编号")
+    private String contractNo;
+    /**
+     * 创建人
+     */
+    @Schema(description = "创建人")
+    private String createUser;
+    /**
+     * 创建时间
+     */
+    @Schema(description = "创建时间")
+    private String createTime;
+}

+ 271 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TradeOrderDetailResp.java

@@ -0,0 +1,271 @@
+package com.sckw.order.model.vo.res;
+
+import com.sckw.transport.api.model.vo.LogisticsOrderVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易订单详情查询请求参数
+ * @create :2025-11-07 16:49:00
+ */
+@Data
+public class TradeOrderDetailResp implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 6441044501410981032L;
+    /**
+     * 贸易订单id
+     */
+    @Schema(description = "贸易订单id")
+    @NotBlank(message = "贸易订单id不能为空")
+    private String tradeOrderId;
+    /**
+     * 合同信息列表
+     */
+    @Schema(description = "合同信息")
+    private TradeOrderContractInfo tradeOrderContractInfo;
+    /**
+     * 单位信息列表
+     */
+    @Schema(description = "单位信息")
+    private TradeOrderUnitInfo tradeOrderUnitInfo;
+    /**
+     * 商品信息
+     */
+    @Schema(description = "商品信息")
+    private TradeOrderGoodsInfo tradeOrderGoodsInfo;
+    /**
+     * 卸货信息
+     */
+    @Schema(description = "卸货信息")
+    private TradeOrderUnloadInfo tradeOrderUnloadInfo;
+    /**
+     * 履约信息
+     */
+    @Schema(description = "履约信息")
+    private TradeOrderPerformanceInfo tradeOrderPerformanceInfo;
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+    @Data
+    public static class TradeOrderContractInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -2721141435748386755L;
+        /**
+         * 贸易合同名称
+         */
+        @Schema(description = "贸易合同名称")
+        private String contractName;
+        /**
+         * 贸易合同编号
+         */
+        @Schema(description = "贸易合同编号")
+        private String contractNo;
+
+        private List<LogisticsContract> logisticsContracts;
+
+    }
+    @Data
+    public static class TradeOrderUnitInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -9038880677807691151L;
+        /**
+         * 采购单位id
+         */
+        @Schema(description = "采购单位id")
+        private String purchaseUnitId;
+        /**
+         * 采购单位名称
+         */
+        @Schema(description = "采购单位名称")
+        private String purchaseUnitName;
+        /**
+         * 采购联系人
+         */
+        @Schema(description = "采购联系人")
+        private String purchaseContacts;
+        /**
+         * 采购联系人手机号
+         */
+        @Schema(description = "采购联系人手机号")
+        private String purchaseContactsPhone;
+        /**
+         * 供应单位id
+         */
+        @Schema(description = "供应单位id")
+        private String supplyUnitId;
+        /**
+         * 供应单位名称
+         */
+        @Schema(description = "供应单位名称")
+        private String supplyUnitName;
+        /**
+         * 供应联系人
+         */
+        @Schema(description = "供应联系人")
+        private String supplyContacts;
+        /**
+         * 供应联系人手机号
+         */
+        @Schema(description = "供应联系人手机号")
+        private String supplyContactsPhone;
+        /**
+         * 承运单位id
+         */
+        @Schema(description = "承运单位id")
+        private String carriageUnitId;
+        /**
+         * 承运单位名称
+         */
+        @Schema(description = "承运单位名称")
+        private String carriageUnitName;
+        /**
+         * 承运联系人
+         */
+        @Schema(description = "承运联系人")
+        private String carriageContacts;
+        /**
+         * 承运联系人手机号
+         */
+        @Schema(description = "承运联系人手机号")
+        private String carriageContactsPhone;
+        /**
+         * 运输单价
+         */
+        @Schema(description = "运输单价")
+        private String carriagePrice;
+        /**
+         * 运输费用(下单量*运输单价)
+         */
+        @Schema(description = "运输费用")
+        private String carriageCost;
+    }
+    @Data
+    public static class TradeOrderGoodsInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -9038880677807691151L;
+        /**
+         * 商品id
+         */
+        @Schema(description = "商品id")
+        private String goodsId;
+        /**
+         * 商品名称
+         */
+        @Schema(description = "商品名称")
+        private String goodsName;
+        /**
+         * 商品单价
+         */
+        @Schema(description = "商品单价")
+        private String unitPrice;
+        /**
+         * 订单总量
+         */
+        @Schema(description = "订单总量")
+        private String orderTotal;
+        /**
+         * 订单金额(下单量*单价)
+         */
+        @Schema(description = "订单金额")
+        private String orderAmount;
+    }
+    @Data
+    public static class TradeOrderUnloadInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -9038880677807691151L;
+        /**
+         * 卸货地址
+         */
+        @Schema(description = "卸货地址")
+        private String unloadAddress;
+        /**
+         * 卸货联系人
+         */
+        @Schema(description = "卸货联系人")
+        private String unloadContacts;
+        /**
+         * 卸货联系人手机号
+         */
+        @Schema(description = "卸货联系人手机号")
+        private String unloadContactsPhone;
+    }
+    @Data
+    public static class TradeOrderPerformanceInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -9038880677807691151L;
+        /**
+         * 支付方式
+         */
+        @Schema(description = "支付方式")
+        private String payType;
+        /**
+         * 支付方式描述
+         */
+        @Schema(description = "支付方式描述")
+        private String payTypeDesc;
+        /**
+         * 托运方式
+         */
+        @Schema(description = "托运方式")
+        private String transportType;
+        /**
+         *托运方式描述
+         */
+        @Schema(description = "托运方式描述")
+        private String transportTypeDesc;
+        /**
+         * 计费方式
+         */
+        @Schema(description = "计费方式")
+        private String priceType;
+        /**
+         * 计费方式描述
+         */
+        @Schema(description = "计费方式描述")
+        private String priceTypeDesc;
+        /**
+         * 已履量
+         */
+        @Schema(description = "已履量")
+        private String loadAmount;
+        /**
+         * 已履金额
+         */
+        @Schema(description = "已履金额")
+        private String loadAmountPrice;
+        /**
+         * 累计装货量
+         */
+        @Schema(description = "累计装货量")
+        private String loadTotal;
+        /**
+         * 累计卸货量
+         */
+        @Schema(description = "累计卸货量")
+        private String unloadTotal;
+    }
+    @Data
+    public static class LogisticsContract implements Serializable{
+        @Serial
+        private static final long serialVersionUID = 2797122008473312915L;
+        /**
+         * 物流合同名称
+         */
+        @Schema(description = "物流合同名称")
+        private String logisticsContractName;
+        /**
+         * 物流合同编号
+         */
+        @Schema(description = "物流合同编号")
+        private String logisticsContractNo;
+    }
+}

+ 32 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderAddressRepository.java

@@ -0,0 +1,32 @@
+package com.sckw.order.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.core.model.base.BaseModel;
+import com.sckw.order.dao.KwoTradeOrderAddressMapper;
+import com.sckw.order.model.KwoTradeOrderAddress;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易订单地址信息接口
+ * @create :2025-11-07 11:00:00
+ */
+@Repository
+public class KwoTradeOrderAddressRepository extends ServiceImpl<KwoTradeOrderAddressMapper, KwoTradeOrderAddress> {
+    public List<KwoTradeOrderAddress> queryByOrderIds(Set<Long> tradeOrderIds) {
+        return list(Wrappers.<KwoTradeOrderAddress>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .in(KwoTradeOrderAddress::getTOrderId,tradeOrderIds));
+    }
+
+    public List<KwoTradeOrderAddress> queryByOrderId(Long tradeOrderId) {
+        return list(Wrappers.<KwoTradeOrderAddress>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .eq(KwoTradeOrderAddress::getTOrderId,tradeOrderId));
+    }
+}

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

@@ -0,0 +1,33 @@
+package com.sckw.order.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.core.model.base.BaseModel;
+import com.sckw.order.dao.KwoTradeOrderContractMapper;
+import com.sckw.order.model.KwoTradeOrderContract;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易合同和贸易订单关联接口
+ * @create :2025-11-07 10:58:00
+ */
+@Repository
+public class KwoTradeOrderContractRepository extends ServiceImpl<KwoTradeOrderContractMapper, KwoTradeOrderContract> {
+    public List<KwoTradeOrderContract> queryByOrderIds(Set<Long> tradeOrderIds) {
+        return list(Wrappers.<KwoTradeOrderContract>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .in(KwoTradeOrderContract::getTOrderId, tradeOrderIds));
+    }
+
+    public KwoTradeOrderContract queryByTradeOrderId(Long traceOrderId) {
+        return getOne(Wrappers.<KwoTradeOrderContract>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .eq(KwoTradeOrderContract::getTOrderId, traceOrderId)
+                .last("limit 1"));
+    }
+}

+ 48 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderGoodsRepository.java

@@ -0,0 +1,48 @@
+package com.sckw.order.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.core.model.base.BaseModel;
+import com.sckw.order.dao.KwoTradeOrderGoodsMapper;
+import com.sckw.order.model.KwoTradeOrderGoods;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易订单商品接口
+ * @create :2025-11-07 09:51:00
+ */
+@Repository
+public class KwoTradeOrderGoodsRepository extends ServiceImpl<KwoTradeOrderGoodsMapper, KwoTradeOrderGoods> {
+    public List<KwoTradeOrderGoods> queryByCondition(KwoTradeOrderGoods kwoTradeOrderGoods) {
+        return list(Wrappers.<KwoTradeOrderGoods>lambdaQuery()
+                .eq(BaseModel::getDelFlag, 0)
+                .like(StringUtils.isNotBlank(kwoTradeOrderGoods.getGoodsName()),KwoTradeOrderGoods::getGoodsName,
+                kwoTradeOrderGoods.getGoodsName()));
+    }
+
+    public List<KwoTradeOrderGoods> queryByOrderIds(Set<Long> tradeOrderIds) {
+        return list(Wrappers.<KwoTradeOrderGoods>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .in(KwoTradeOrderGoods::getTOrderId,tradeOrderIds));
+    }
+
+    public List<KwoTradeOrderGoods> queryByGoodsIds(Set<Long> goodsIds) {
+        return list(Wrappers.<KwoTradeOrderGoods>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .in(KwoTradeOrderGoods::getGoodsId,goodsIds));
+    }
+
+    public KwoTradeOrderGoods queryByOrderId(Long tradeOrderId) {
+        return getOne(Wrappers.<KwoTradeOrderGoods>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .eq(KwoTradeOrderGoods::getTOrderId,tradeOrderId)
+                .orderByDesc(BaseModel::getId)
+                .last("limit 1"));
+    }
+}

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