Bläddra i källkod

Merge branch 'dev' into dev-xcq-payment

xucaiqin 1 år sedan
förälder
incheckning
f98a48f6d0
100 ändrade filer med 4522 tillägg och 554 borttagningar
  1. 2 0
      .gitignore
  2. 1 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictEnum.java
  3. 2 2
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/filter/RequestCheckFilter.java
  4. 101 53
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarWaybillEnum.java
  5. 1 1
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/page/PageHelperUtil.java
  6. 4 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtils.java
  7. 29 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/StringUtils.java
  8. 1 1
      sckw-common/sckw-common-excel/src/main/java/com/sckw/excel/easyexcel/ExcelImportListener.java
  9. 0 151
      sckw-common/sckw-common-excel/src/main/java/com/sckw/excel/utils/EasyExcelUtil.java
  10. 8 0
      sckw-common/sckw-common-redis/src/main/java/com/sckw/redis/constant/RedisConstant.java
  11. 20 0
      sckw-gateway/src/main/resources/bootstrap-lfdc.yml
  12. 14 4
      sckw-modules-api/sckw-manage-api/src/main/java/com/sckw/manage/api/RemoteManageService.java
  13. 152 0
      sckw-modules-api/sckw-manage-api/src/main/java/com/sckw/manage/api/model/dto/res/LineFreightAddressRes.java
  14. 34 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/RemoteTradeOrderAmountService.java
  15. 11 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/TradeOrderInfoService.java
  16. 39 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/AddressActualAmountParam.java
  17. 6 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/AddressInfoDetail.java
  18. 90 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/OrderAddressDetailRes.java
  19. 47 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/UpdateAddressActualAmountParam.java
  20. 53 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/UpdateAddressEntrustAmountParam.java
  21. 2 0
      sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/dubbo/GoodsInfoService.java
  22. 21 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/RemoteTransportLineFreightRateService.java
  23. 5 23
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java
  24. 1 1
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteStatisticsService.java
  25. 1 1
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/AcceptCarriageLogisticsOrderDto.java
  26. 0 13
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/AddressResDTO.java
  27. 1 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcCarrierController.java
  28. 1 7
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcCheckedController.java
  29. 1 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcContractSaleController.java
  30. 1 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcPurchaseController.java
  31. 15 9
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/CommonBusinessService.java
  32. 4 6
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractLogisticsGoodsService.java
  33. 5 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractLogisticsService.java
  34. 5 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java
  35. 2 2
      sckw-modules/sckw-example/src/main/java/com/sckw/example/service/TransportService.java
  36. 3 3
      sckw-modules/sckw-file/src/main/java/com/sckw/file/controller/KwfFileController.java
  37. 2 2
      sckw-modules/sckw-file/src/main/java/com/sckw/file/service/FileService.java
  38. 5 5
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfDriverService.java
  39. 14 18
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckReportService.java
  40. 9 10
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java
  41. 80 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/controller/KwmLineFreightRateController.java
  42. 15 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/dao/KwmLineFreightRateMapper.java
  43. 49 2
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/dubbo/RemoteManageServiceImpl.java
  44. 115 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/entity/KwmLineFreightRate.java
  45. 75 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/AddLineFreightRateParam.java
  46. 37 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/ChooseLineFreightRateParam.java
  47. 54 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/ExportLineFreightRateParam.java
  48. 21 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/LineFreightRateFindListParam.java
  49. 5 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/QueryByEntReqVo.java
  50. 57 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/SelectLineFreightRateParam.java
  51. 82 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/UpdateLineFreightRateParam.java
  52. 61 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/LineFreightRateDetail.java
  53. 53 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/LineFreightRateExport.java
  54. 38 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/LineFreightRateFindListResVO.java
  55. 86 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/LineFreightRateListResVO.java
  56. 0 3
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/CommonBusinessService.java
  57. 24 22
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmAddressService.java
  58. 4 6
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmCooperateApplyService.java
  59. 3 3
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmCooperateManageService.java
  60. 322 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmLineFreightRateService.java
  61. 88 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwoTradeOrderController.java
  62. 18 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/dao/KwoTradeOrderAmountMapper.java
  63. 82 2
      sckw-modules/sckw-order/src/main/java/com/sckw/order/dao/KwoTradeOrderMapper.java
  64. 148 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/RemoteTradeOrderAmountServiceImpl.java
  65. 15 7
      sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java
  66. 10 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/enums/OrderStatusEnum.java
  67. 7 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrderAddress.java
  68. 60 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrderAmount.java
  69. 23 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/LoadAddressDTO.java
  70. 155 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/OrderListResDTO.java
  71. 35 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/TradeOrderAppStatisticParamDTO.java
  72. 25 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/TradeOrderContractParamDTO.java
  73. 95 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/TradeOrderListSelectDTO.java
  74. 55 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/TradeOrderStatementListParamDTO.java
  75. 24 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/UnloadAddressDTO.java
  76. 13 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/AcceptanceOrderParam.java
  77. 17 2
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/AddressInfo.java
  78. 3 3
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/PurchaseOrderDraftParam.java
  79. 0 1
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/PurchaseOrderParam.java
  80. 25 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderAppStatisticParam.java
  81. 30 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderContractParam.java
  82. 110 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListExport.java
  83. 21 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListExportParam.java
  84. 25 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListSelectParam.java
  85. 91 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListStatisticParam.java
  86. 66 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderStatementList.java
  87. 28 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/UpdateAddressAmountParam.java
  88. 0 1
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/UpdateOrderParam.java
  89. 24 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/UpdateUnitParam.java
  90. 5 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/AddressInfoDetailRes.java
  91. 33 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/LoadAddressResVO.java
  92. 42 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/OrderAddressInfoRes.java
  93. 215 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/OrderListResVO.java
  94. 28 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TradeOrderAppStatisticVO.java
  95. 5 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/UnitInfoDetailRes.java
  96. 34 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/UnloadAddressResVO.java
  97. 115 6
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderAddressService.java
  98. 125 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderAmountService.java
  99. 729 179
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java
  100. 4 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderUnitService.java

+ 2 - 0
.gitignore

@@ -25,3 +25,5 @@ hs_err_pid*
 ### logs目录 ###
 logs
 
+.flattened-pom.xml
+

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

@@ -80,6 +80,7 @@ public enum DictEnum {
     CHARGING_TYPE_1("charging_type", "1", "按装货量") ,
     CHARGING_TYPE_2("charging_type", "2", "按卸货量") ,
     CHARGING_TYPE_3("charging_type", "3", "按车次"),
+    CHARGING_TYPE_4("charging_type", "4", "按线路"),
     SIGNING_WAY_1("signing_way", "1", "线上签约"),
     SIGNING_WAY_2("signing_way", "2", "线下签约"),
     TRANSPORT_DEMAND_STATUS_0("transport_demand_status", "0","已保存"),

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

@@ -67,8 +67,8 @@ public class RequestCheckFilter implements Filter {
             EXCLUDEPATH.addAll(Arrays.asList(links.split(Global.COMMA)));
         }
 
-        String importLinks = customConfig.getSpecialLinks();
-        if (StringUtils.isNotBlank(importLinks)) {
+        String specialLinks = customConfig.getSpecialLinks();
+        if (StringUtils.isNotBlank(specialLinks)) {
             IMPORT_PASS_PATH.addAll(Arrays.asList(links.split(Global.COMMA)));
         }
 //        String withoutLinks = customConfig.getWithoutLinks();

+ 101 - 53
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarWaybillEnum.java

@@ -5,68 +5,73 @@ import java.util.List;
 
 /**
  * @author lfdc
- * @description 车辆运单状态枚举
+ * @desc 车辆运单状态枚举
  * @date 2023-07-14 14:07:23
  */
 public enum CarWaybillEnum {
     /**
      * 待接单
      */
-    PENDING_ORDER(1, "pendingOrder", "1", "待接单"),
+    PENDING_ORDER(101, "pendingOrder", "101", "待接单", "已指派"),
     /**
-     * 待出车
+     * 已撤销
      */
-    PENDING_VEHICLE(2, "pendingVehicle", "2", "待出车"),
+    REVOKED(102, "revoked", "102", "撤回", "撤回"),
     /**
-     * 已出车
+     * 拒接单
      */
-    EXIT_COMPLETED(3, "exitCompleted", "3", "已出车"),
+    REJECT_ORDER(103, "rejectOrder", "103", "拒接单", "拒接单"),
     /**
-     * 到达装货点
+     * 出车-待出车
      */
-    WAIT_LOADING(4, "waitLoading", "4", "到达装货点"),
+    PENDING_VEHICLE(201, "pendingVehicle", "201", "待出车", "确认接单"),
     /**
-     * 已装货
+     * 出车-拒出车
      */
-    COMPLETION_LOADING(5, "completionLoading", "5", "已装货"),
+    REFUSE_TRAFFIC(202, "refuseTraffic", "202", "拒出车", "拒出车"),
     /**
-     * 到达卸货点
+     * 出车-已出车
      */
-    WAIT_UNLOADING(6, "waitUnloading", "6", "到达卸货点"),
+    EXIT_COMPLETED(203, "exitCompleted", "203", "已出车", "确认出车"),
     /**
-     * 已卸货
+     * 装货-到达装货点
      */
-    COMPLETION_UNLOADING(7, "completionUnloading", "7", "已卸货"),
+    WAIT_LOADING(301, "waitLoading", "301", "到达装货点", "到达装货点"),
     /**
-     * 已核-通过
+     * 装货-已装货
      */
-    APPROVAL_PASS(8, "approvalPass", "8", "审核通过"),
+    COMPLETION_LOADING(302, "completionLoading", "302", "已装货", "确认装货"),
     /**
-     * 拒接单
+     * 卸货-到达卸货点
      */
-    REJECT_ORDER(9, "rejectOrder", "9", "拒接单"),
+    WAIT_UNLOADING(401, "waitUnloading", "401", "到达卸货点", "到达卸货点"),
     /**
-     * 拒出车
+     * 卸货-已卸货
      */
-    REFUSE_TRAFFIC(10, "refuseTraffic", "10", "拒出车"),
+    COMPLETION_UNLOADING(402, "completionUnloading", "402", "已卸货", "确认卸货"),
     /**
-     * 已撤销
+     * 审核-待
      */
-    REVOKED(11, "revoked", "11", "撤回"),
+    APPROVAL_TREAT(501, "approvalTreat", "501", "待审核", "待审核"),
     /**
-     * 已核单-不通过[审核不通过]
+     * 审核-通过
      */
-    APPROVAL_NO_PASS(12, "revoked", "12", "核单驳回"),
+    APPROVAL_PASS(502, "approvalPass", "502", "审核通过", "审核通过"),
     /**
-     * 单证更新审核中
+     * 审核-驳回
      */
-    APPROVAL_IN(13, "approvalIn", "13", "单证更新审核中"),
+    APPROVAL_NO_PASS(503, "revoked", "503", "核单驳回", "核单驳回"),
+    /**
+     * 审核-单证更新审核中
+     */
+    APPROVAL_IN(504, "approvalIn", "504", "单证更新审核中", "单证更新审核中"),
     ;
 
     private final Integer code;
     private final String value;
     private final String status;
     private final String destination;
+    private final String alias;
 
     public Integer getCode() {
         return code;
@@ -80,14 +85,19 @@ public enum CarWaybillEnum {
         return status;
     }
 
+    public String getAlias() {
+        return alias;
+    }
+
     public String getDestination() {
         return destination;
     }
 
-    CarWaybillEnum(Integer code, String value, String status, String destination) {
+    CarWaybillEnum(Integer code, String value, String status, String destination, String alias) {
         this.code = code;
         this.value = value;
         this.status = status;
+        this.alias = alias;
         this.destination = destination;
     }
 
@@ -118,6 +128,15 @@ public enum CarWaybillEnum {
         return null;
     }
 
+    public static String getAlias(Integer code) {
+        for (CarWaybillEnum waybillEnum : CarWaybillEnum.values()) {
+            if (waybillEnum.getCode().equals(code)) {
+                return waybillEnum.getAlias();
+            }
+        }
+        return null;
+    }
+
     public static List<Integer> getCodes() {
         List<Integer> codes = new ArrayList<>();
         for (CarWaybillEnum waybillEnum : CarWaybillEnum.values()) {
@@ -141,15 +160,41 @@ public enum CarWaybillEnum {
      * @date 2023/8/2
      **/
     public static boolean changeDriver(int code) {
-        if (code == CarWaybillEnum.COMPLETION_UNLOADING.getCode()
-                || code == CarWaybillEnum.APPROVAL_PASS.getCode()
-                || code == CarWaybillEnum.REJECT_ORDER.getCode()
-                || code == CarWaybillEnum.REFUSE_TRAFFIC.getCode()
-                || code == CarWaybillEnum.REVOKED.getCode()
-                || code == CarWaybillEnum.APPROVAL_NO_PASS.getCode()) {
-            return false;
-        }
-        return true;
+        return code != CarWaybillEnum.COMPLETION_UNLOADING.getCode()
+                && code != CarWaybillEnum.APPROVAL_PASS.getCode()
+                && code != CarWaybillEnum.REJECT_ORDER.getCode()
+                && code != CarWaybillEnum.REFUSE_TRAFFIC.getCode()
+                && code != CarWaybillEnum.REVOKED.getCode()
+                && code != CarWaybillEnum.APPROVAL_NO_PASS.getCode();
+    }
+
+    /**
+     * @param code 状态码
+     * @desc 是否可以变更司机
+     * @author zk
+     * @date 2023/8/2
+     **/
+    public static boolean arriveLocation(int code) {
+        return code == CarWaybillEnum.EXIT_COMPLETED.getCode()
+                || code == CarWaybillEnum.WAIT_LOADING.getCode()
+                || code == CarWaybillEnum.COMPLETION_LOADING.getCode()
+                || code == CarWaybillEnum.WAIT_UNLOADING.getCode()
+                || code == CarWaybillEnum.COMPLETION_UNLOADING.getCode();
+    }
+
+    /**
+     * @param code 状态码
+     * @desc 是否可以变更司机
+     * @author zk
+     * @date 2023/8/2
+     **/
+    public static boolean arriveLoading(int code) {
+        return code == CarWaybillEnum.WAIT_LOADING.getCode()
+                || code == CarWaybillEnum.COMPLETION_LOADING.getCode()
+                || code == CarWaybillEnum.WAIT_UNLOADING.getCode()
+                || code == CarWaybillEnum.COMPLETION_UNLOADING.getCode()
+                || code == CarWaybillEnum.APPROVAL_TREAT.getCode()
+                || code == CarWaybillEnum.APPROVAL_NO_PASS.getCode();
     }
 
     /**
@@ -159,28 +204,31 @@ public enum CarWaybillEnum {
      * @date 2023/8/2
      **/
     public static boolean changeTruck(int code) {
-        if (code == CarWaybillEnum.PENDING_ORDER.getCode()
-                || code == CarWaybillEnum.PENDING_VEHICLE.getCode()) {
-            return true;
-        }
-        return false;
+        return code == CarWaybillEnum.PENDING_ORDER.getCode()
+                || code == CarWaybillEnum.PENDING_VEHICLE.getCode();
     }
 
     /**
-     * 获取编码以及注释
-     *
-     * @return
+     * 运单状态
+     * @return 状态集
      */
-    public static String getCodeAndDestination() {
-        StringBuilder sb = new StringBuilder();
-        for (CarWaybillEnum value : CarWaybillEnum.values()) {
-            sb.append(value.getCode()+":").append(value.destination).append(";");
-        }
-        return sb.toString();
+    public static List<Integer> initWaybillStatusV1() {
+        List<Integer> statuses = new ArrayList<>();
+        //statuses.add(CarWaybillEnum.PENDING_ORDER.getCode());
+        statuses.add(CarWaybillEnum.PENDING_VEHICLE.getCode());
+        statuses.add(CarWaybillEnum.EXIT_COMPLETED.getCode());
+        return statuses;
     }
 
-    public static void main(String[] args) {
-        String codeAndDestination = getCodeAndDestination();
-        System.out.println(codeAndDestination);
+    /**
+     * 运单状态
+     * @return 状态集
+     */
+    public static List<Integer> initWaybillStatusV2() {
+        List<Integer> statuses = new ArrayList<>();
+        statuses.add(CarWaybillEnum.PENDING_ORDER.getCode());
+        statuses.add(CarWaybillEnum.PENDING_VEHICLE.getCode());
+        statuses.add(CarWaybillEnum.EXIT_COMPLETED.getCode());
+        return statuses;
     }
 }

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

@@ -73,7 +73,7 @@ public class PageHelperUtil {
         pageResult.setPage(pageInfo.getPageNum());
         pageResult.setPageSize(pageInfo.getPageSize());
         pageResult.setSize(pageInfo.getTotal());
-        pageResult.setPages(pageInfo.getPages());
+        pageResult.setPages((int)(pageResult.getSize() + pageResult.getPageSize() - 1) / pageResult.getPageSize());
         pageResult.setList(pageInfo.getList());
         return pageResult;
     }

+ 4 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/DateUtils.java

@@ -46,6 +46,10 @@ public class DateUtils extends DateUtil {
 
     public static String FORMAT10 = "yyyy-MM";
 
+    public static String FORMAT11 = "MM-dd HH:mm";
+
+    public static String FORMAT12 = "yy-MM";
+
     public static int THIRTEEN = 13;
 
     /**

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

@@ -656,6 +656,28 @@ public class StringUtils {
         return ret.toString();
     }
 
+    /**
+     * 分字符串拼接
+     *
+     * @param list 字符串数组
+     * @return 拼接字符串 "," 分割
+     */
+    public static String stringListSpliceToString(List<String> list) {
+        StringBuilder sb = new StringBuilder();
+        if (CollectionUtils.isEmpty(list)) {
+            return null;
+        }
+        for (int i = 0; i < list.size(); i++) {
+            if (i != (list.size() - 1)) {
+                sb.append(list.get(i).trim()).append(";");
+            } else {
+                sb.append(list.get(i).trim());
+            }
+        }
+        return sb.toString();
+    }
+
+
     /**
      * 替换字符串${xxxx}
      *
@@ -816,6 +838,13 @@ public class StringUtils {
     }
 
     public static void main(String[] args) {
+        String s = stringListSpliceToString(new ArrayList<>() {{
+            add("张三");
+            add("李四");
+            add("aaaa");
+            add("bbbb");
+            add("cccc");
+        }});
         Map<String, Object> param = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         param.put("account", "17358629955");
         param.put("pwd", "123456");

+ 1 - 1
sckw-common/sckw-common-excel/src/main/java/com/sckw/excel/easyexcel/ExcelImportListener.java

@@ -31,7 +31,7 @@ public class ExcelImportListener extends AnalysisEventListener<Object> {
         String validMsg = ValidDataUtil.valid(data);
         if (validMsg != null) {
             //+1行(实际中excel中第几行的数据)
-            int rowIndex = context.readRowHolder().getRowIndex() + 1;
+            int rowIndex = context.readRowHolder().getRowIndex() + 4;
             String errorMsg = "第" + rowIndex + "行数据有误," + validMsg;
             errorList.add(errorMsg);
         } else {

+ 0 - 151
sckw-common/sckw-common-excel/src/main/java/com/sckw/excel/utils/EasyExcelUtil.java

@@ -1,151 +0,0 @@
-package com.sckw.excel.utils;
-
-
-import com.alibaba.excel.EasyExcel;
-import com.alibaba.excel.ExcelWriter;
-import com.alibaba.excel.support.ExcelTypeEnum;
-import com.alibaba.excel.write.metadata.WriteSheet;
-import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
-import com.alibaba.fastjson.JSON;
-import com.sckw.core.web.response.HttpResult;
-import com.sckw.excel.config.easyexcel.CustomCellWriteHandler;
-import com.sckw.excel.config.easyexcel.ExcelListener;
-import com.sckw.excel.config.easyexcel.RequestHolder;
-import com.sckw.excel.config.easyexcel.SheetExcelData;
-import jakarta.servlet.ServletOutputStream;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.HttpStatus;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.time.LocalDate;
-import java.util.List;
-
-/**
- * Excel工具类
- * @author LengFaQiang
- * @Created 2019-7-18 18:01:53
- **/
-@Slf4j
-public class EasyExcelUtil {
-    /**
-     * 读取单个sheet的excel文件
-     * @param excel 文件
-     * @param t 实体类型
-     * @param headRowNumber 头行数
-     * @return
-     * @throws Exception
-     */
-    public static <T> List<T> readSingleExcel(MultipartFile excel, T t, int headRowNumber) throws IOException {
-        return EasyExcel.read(excel.getInputStream(), t.getClass(), new ExcelListener())
-                .sheet().headRowNumber(headRowNumber).doReadSync();
-    }
-
-
-    /**
-     * 导出文件
-     * 导出模板时,tList传一个空list即可
-     * @param tList 数据集
-     * @param tClass 数据类型
-     * @param <T>
-     * @throws IOException
-     */
-    public static <T> void writeSingleExcel(String fileName,String sheetName, List<T> tList, Class tClass) throws IOException{
-        HttpServletResponse response = RequestHolder.getResponse();
-        try (ServletOutputStream outputStream = response.getOutputStream()){
-            setResponse(fileName, response);
-            EasyExcel.write(outputStream, tClass).autoCloseStream(Boolean.FALSE)
-                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
-                    .registerWriteHandler(new CustomCellWriteHandler())
-                    .sheet(sheetName)
-                    .doWrite(tList);
-        } catch (Exception e) {
-            errorWrite(response, e);
-        }
-    }
-
-    /**
-     * 导出多sheet
-     * @param fileName 文件名
-     * @param sheetExcelDataList sheet对象
-     * @throws IOException
-     */
-    public static void writeMultiExcel(String fileName, List<SheetExcelData> sheetExcelDataList) throws IOException{
-        HttpServletResponse response = RequestHolder.getResponse();
-        ServletOutputStream outputStream = response.getOutputStream();
-        setResponse(fileName, response);
-        ExcelWriter excelWriter = EasyExcel.write(outputStream).autoCloseStream(false).build();
-        try {
-            for (int i = 0,length = sheetExcelDataList.size(); i < length; i++) {
-                WriteSheet writeSheet = EasyExcel.writerSheet(i+1, sheetExcelDataList.get(i).getSheetName())
-                        .head(sheetExcelDataList.get(i).getTClass())
-                        .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
-                excelWriter.write(sheetExcelDataList.get(i).getDataList(), writeSheet);
-            }
-        } catch (Exception e) {
-            errorWrite(response, e);
-        }finally {
-            // 刷新流,不加这句话,下载文件损坏打不开
-            outputStream.flush();
-            // outputStream.close();
-            if(excelWriter != null){
-                // 千万别忘记finish关闭流
-                excelWriter.finish();
-            }
-        }
-    }
-
-    /**
-     * 无对象导出
-     * @param fileName
-     * @param headList
-     * @param dataList
-     * @throws IOException
-     */
-    public static void writeWithoutModel(String fileName, List<List<String>> headList,List<List<Object>> dataList) throws IOException{
-        HttpServletResponse response = RequestHolder.getResponse();
-        try (ServletOutputStream outputStream = response.getOutputStream()){
-            setResponse(fileName, response);
-            // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
-            EasyExcel.write(outputStream).head(headList).sheet("模板").registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).doWrite(dataList);
-        } catch (Exception e) {
-            errorWrite(response, e);
-        }
-    }
-
-    /**
-     * 导出错误
-     * @param response
-     * @param e
-     * @throws IOException
-     */
-    private static void errorWrite(HttpServletResponse response, Exception e) throws IOException {
-        // 重置response
-        response.reset();
-        log.error(e.getMessage(), e);
-        response.setContentType("application/json");
-        response.setCharacterEncoding("utf-8");
-        response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
-        response.getWriter().println(JSON.toJSONString(HttpResult.error(com.sckw.core.web.constant.HttpStatus.GLOBAL_EXCEPTION_CODE,"导出失败")));
-    }
-
-    /**
-     * 设置导出信息
-     * @param fileName
-     * @param response
-     * @throws UnsupportedEncodingException
-     */
-    private static void setResponse(String fileName, HttpServletResponse response) throws UnsupportedEncodingException {
-        // 重置response
-        response.reset();
-        response.setContentType("application/vnd.ms-excel;charset=utf-8");
-        response.setCharacterEncoding("utf-8");
-        // 这里URLEncoder.encode可以防止中文乱码
-        //,"yyyy-MM-dd_HH_mm_ss"
-        fileName = URLEncoder.encode(fileName + DateUtil.dateToStr(LocalDate.now()) + ExcelTypeEnum.XLSX.getValue(), "UTF-8");
-        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
-    }
-}

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

@@ -42,6 +42,14 @@ public class RedisConstant {
      * 更新贸易订单委托量、已履约量锁key
      */
     public static final String TORDER_UPDATE_AMOUNT_KEY = "order:trade:update:amount:%s";
+    /**
+     * 更新贸易订单地址下的委托量锁key
+     */
+    public static final String TORDER_ADDRESS_UPDATE_ENTRUST_AMOUNT = "order:trade:address:update:entrustAmount:%s";
+    /**
+     * 更新贸易订单地址下的实际交付量锁key
+     */
+    public static final String TORDER_ADDRESS_UPDATE_ACTUAL_AMOUNT = "order:trade:address:update:actualAmount:%s";
     /**
      * 合同签约完成更新贸易订单状态锁key
      */

+ 20 - 0
sckw-gateway/src/main/resources/bootstrap-lfdc.yml

@@ -0,0 +1,20 @@
+spring:
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+        server-addr: 10.10.10.230:8848
+        # 命名空间
+        namespace: sckw_lfdc
+        # 共享配置
+        group: sckw-service-platform
+      config:
+        # 配置中心地址
+        server-addr: 10.10.10.230:8848
+        # 配置文件格式
+        file-extension: yaml
+        # 命名空间
+        namespace: sckw_lfdc
+        # 共享配置
+        group: sckw-service-platform
+

+ 14 - 4
sckw-modules-api/sckw-manage-api/src/main/java/com/sckw/manage/api/RemoteManageService.java

@@ -1,9 +1,6 @@
 package com.sckw.manage.api;
 
-import com.sckw.manage.api.model.dto.res.EntAddressResDto;
-import com.sckw.manage.api.model.dto.res.FindCooperateByEntReqVo;
-import com.sckw.manage.api.model.dto.res.FindCooperateByEntResVo;
-import com.sckw.manage.api.model.dto.res.FindEntCooperateResVo;
+import com.sckw.manage.api.model.dto.res.*;
 
 import java.util.List;
 import java.util.Map;
@@ -45,4 +42,17 @@ public interface RemoteManageService {
 
     List<FindCooperateByEntResVo> findCooperateByEnt(FindCooperateByEntReqVo reqVo);
 
+    /**
+     * 获取路线地址信息
+     * @param lineFreightId
+     * @return
+     */
+    Map<Long, LineFreightAddressRes> findLineFreightAddress(List<Long> lineFreightId);
+
+    /**
+     * 通过ids获取地址信息
+     *
+     * @param addressIds
+     */
+    Map<Long, EntAddressResDto> queryAddressListByAddressIdList(List<String> addressIds);
 }

+ 152 - 0
sckw-modules-api/sckw-manage-api/src/main/java/com/sckw/manage/api/model/dto/res/LineFreightAddressRes.java

@@ -0,0 +1,152 @@
+package com.sckw.manage.api.model.dto.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author lfdc
+ * @description 线路地址
+ * @date 2024-03-04 13:03:51
+ */
+@Getter
+@Setter
+public class LineFreightAddressRes implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -4571752839456202179L;
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 线路名称
+     */
+    private String name;
+
+    /**
+     * 起始地_名称
+     */
+    private String loadName;
+
+    /**
+     * 起始地-所在地区
+     */
+    private Integer loadCityCode;
+
+    /**
+     * 起始地-所属区域名称
+     */
+    private String loadCityName;
+
+    /**
+     * 起始地-详细地址
+     */
+    private String loadDetailAddress;
+
+    /**
+     * 起始地-纬度
+     */
+    private String loadLat;
+
+    /**
+     * 起始地-经度
+     */
+    private String loadLng;
+
+    /**
+     * 目的地_名称
+     */
+    private String unloadName;
+
+    /**
+     * 目的地-所在地区
+     */
+    private Integer unloadCityCode;
+
+    /**
+     * 目的地-所属区域名称
+     */
+    private String unloadCityName;
+
+    /**
+     * 目的地-详细地址
+     */
+    private String unloadDetailAddress;
+
+    /**
+     * 目的地-纬度
+     */
+    private String unloadLat;
+
+    /**
+     * 目的地-经度
+     */
+    private String unloadLng;
+
+    /**
+     * 运输里程
+     */
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输总价
+     */
+    private BigDecimal transportAmount;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 备注
+     */
+    @Size(max = 200, message = "备注长度不能超过200")
+    private String remark;
+
+    /**
+     * 状态:0正常/1锁定
+     */
+    private Integer status;
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新人
+     */
+    private Long updateBy;
+
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 删除标识(0正常/-1删除)
+     */
+    private Integer delFlag;
+
+}

+ 34 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/RemoteTradeOrderAmountService.java

@@ -0,0 +1,34 @@
+package com.sckw.order.api.dubbo;
+
+import com.sckw.core.web.response.HttpResult;
+import com.sckw.order.api.model.UpdateAddressActualAmountParam;
+import com.sckw.order.api.model.UpdateAddressEntrustAmountParam;
+
+/**
+ * @desc: 贸易订单地址分配量信息相关dubbo
+ * @author: yzc
+ * @date: 2023-07-18 18:18
+ */
+
+public interface RemoteTradeOrderAmountService {
+
+
+    /**
+     * @param param
+     * @return com.sckw.core.web.response.HttpResult
+     * @desc 更新贸易订单地址下的委派量
+     * @author yzc
+     * @date 2024/3/12 16:40
+     */
+    HttpResult updateAddressEntrustAmount(UpdateAddressEntrustAmountParam param);
+
+    /**
+     * @param param
+     * @return com.sckw.core.web.response.HttpResult
+     * @desc 更新贸易订单地址下的实际交付量
+     * @author yzc
+     * @date 2024/3/12 16:41
+     */
+    HttpResult updateAddressActualAmount(UpdateAddressActualAmountParam param);
+
+}

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

@@ -21,6 +21,17 @@ public interface TradeOrderInfoService {
      */
     OrderDetailRes getOrderDetailById(Long tOrderId);
 
+
+
+    /**
+     * @desc: 获取订单详情
+     * @author: yzc
+     * @date: 2023-07-18 18:25
+     * @Param tOrderId:
+     * @return: com.sckw.order.api.model.OrderAddressDetailRes
+     */
+    OrderAddressDetailRes getOrderDetailByTradeOrderIdAndAddressId(Long tOrderId,Long tAddressId);
+
     /**
      * @desc: 更新订单状态
      * @author: yzc

+ 39 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/AddressActualAmountParam.java

@@ -0,0 +1,39 @@
+package com.sckw.order.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+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;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-13  08:59
+ * @desc: 贸易订单地址下实际交付量参数
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class AddressActualAmountParam implements Serializable {
+
+
+    @Serial
+    private static final long serialVersionUID = 3315075003391902459L;
+
+    /**
+     * 地址id
+     */
+    @JsonProperty("tAddressId")
+    private Long tAddressId;
+
+    /**
+     * 实际成交量
+     */
+    private BigDecimal actualAmount;
+
+}

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

@@ -19,6 +19,12 @@ public class AddressInfoDetail implements Serializable {
 
     @Serial
     private static final long serialVersionUID = -7229803070964346948L;
+
+    /**
+     * 地址id
+     */
+    private String id;
+
     /**
      * 地址类型label
      */

+ 90 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/OrderAddressDetailRes.java

@@ -0,0 +1,90 @@
+package com.sckw.order.api.model;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author lfdc
+ * @description 贸易订单地址id
+ * @date 2024-03-04 10:03:34
+ */
+@Getter
+@Setter
+public class OrderAddressDetailRes implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -2951319997472302360L;
+    /**
+     * 地址id
+     */
+    private String id;
+
+    /**
+     * 地址类型label
+     */
+    private String addressTypeLabel;
+
+    /**
+     * 地址类型label
+     */
+    private String typeLabel;
+
+
+    /**
+     * 地址类型(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;
+}

+ 47 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/UpdateAddressActualAmountParam.java

@@ -0,0 +1,47 @@
+package com.sckw.order.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-12  16:29
+ * @desc: 更新贸易订单地址下实际交付量
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class UpdateAddressActualAmountParam implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -4767110260359382199L;
+
+    /**
+     * 订单id
+     */
+    @JsonProperty("tOrderId")
+    private Long tOrderId;
+
+    /**
+     * 地址实际成交量参数
+     */
+    private List<AddressActualAmountParam> addressActualAmountParams;
+
+    /**
+     * 更新用户id 需传,订单状态变化记录需要
+     */
+    private Long updateBy;
+
+    /**
+     * 更新者姓名 需传,订单状态变化记录需要
+     */
+    private String updateByName;
+
+}

+ 53 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/UpdateAddressEntrustAmountParam.java

@@ -0,0 +1,53 @@
+package com.sckw.order.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+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;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-12  16:29
+ * @desc: 更新贸易订单地址下委托量
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class UpdateAddressEntrustAmountParam implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -2032841683310300595L;
+
+    /**
+     * 订单id
+     */
+    @JsonProperty("tOrderId")
+    private Long tOrderId;
+
+    /**
+     * 地址id
+     */
+    @JsonProperty("tAddressId")
+    private Long tAddressId;
+
+    /**
+     * 委托量  生成物流订单传正数,撤销物流订单传负数
+     */
+    private BigDecimal entrustAmount;
+
+    /**
+     * 更新用户id 需传,订单状态变化记录需要
+     */
+    private Long updateBy;
+
+    /**
+     * 更新者姓名 需传,订单状态变化记录需要
+     */
+    private String updateByName;
+
+}

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

@@ -71,4 +71,6 @@ public interface GoodsInfoService {
     Boolean associateSupplyEnt(Long entId);
 
     KwpGoods getGoodsByGoodsName(String goodsName);
+
+    List<Long> getGoodsByGoodsNameAndTaxRate(String goodsName, String goodsTaxRate);
 }

+ 21 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/RemoteTransportLineFreightRateService.java

@@ -0,0 +1,21 @@
+package com.sckw.transport.api.dubbo;
+
+import java.util.List;
+
+/**
+ * @author lfdc
+ * @version 1.0
+ * @className RemoteTransportLineFreightRateService
+ * @description 物流订单线路dubbo
+ * @company sckw
+ * @date 2024-03-13 10:06:27
+ */
+public interface RemoteTransportLineFreightRateService {
+
+    /**
+     * 路径id是否被关联
+     * @param lineFreightRateIds 线路ids
+     * @return
+     */
+    Boolean getRemoteLineFreightRateIsUse(List<Long> lineFreightRateIds);
+}

+ 5 - 23
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportService.java → sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java

@@ -1,27 +1,26 @@
 package com.sckw.transport.api.dubbo;
 
 import com.sckw.core.web.response.HttpResult;
+import com.sckw.transport.api.model.dto.AcceptCarriageLogisticsOrderDto;
 import com.sckw.transport.api.model.dto.AccountCheckingBindDTO;
-import com.sckw.transport.api.model.dto.AddressResDTO;
-import com.sckw.transport.api.model.dto.LogisticsOrderDTO;
 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.vo.KwtLogisticsOrderVO;
 import com.sckw.transport.api.model.vo.RTruckMonitorVo;
 import com.sckw.transport.api.model.vo.RWaybillOrderVo;
+
 import java.util.List;
-import java.util.Map;
 
 /**
  * @author lfdc
  * @version 1.0
- * @className TransportDubboService
+ * @className TransportRemoteService
  * @description 物流订单dubbo
  * @company sckw
  * @date 2023-07-17 10:06:27
  */
-public interface TransportService {
+public interface TransportRemoteService {
 
     /**
      * 根据id 获取主表详情
@@ -37,7 +36,7 @@ public interface TransportService {
      * @param ids
      * @return
      */
-    List<LogisticsOrderDTO> getAcceptCarriageOrderList(List<String> ids);
+    List<AcceptCarriageLogisticsOrderDto> getAcceptCarriageOrderList(List<String> ids);
 
     /**
      * 获取物流订单中地址信息
@@ -45,15 +44,6 @@ public interface TransportService {
      * @return
      */
     List<Integer> getLogisticsOrderAddressList();
-
-    /**
-     * 根据企业id获取物流订单地址信息
-     *
-     * @param entId 企业id
-     * @return
-     */
-    List<AddressResDTO> getLogisticsOrderAddressListByEntId(Long entId);
-
     /**
      * 贸易订单验证物流订单是否已完成
      *
@@ -70,14 +60,6 @@ public interface TransportService {
      */
     HttpResult checkLogisticsOrderStatusById(LogisticsOrderParam logisticsOrderParam);
 
-    /**
-     * 根据企业id获取物流订单地址信息
-     *
-     * @param entIds 企业id
-     * @return
-     */
-    Map<Long, List<AddressResDTO>> getLogisticsOrderAddressListByEntId(List<Long> entIds);
-
     /**
      * 运费对账是否进行对账绑定数据
      *

+ 1 - 1
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportStatisticsService.java → sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteStatisticsService.java

@@ -10,7 +10,7 @@ import java.util.List;
  * @company sckw
  * @date 2023-09-08 10:06:27
  */
-public interface TransportStatisticsService {
+public interface TransportRemoteStatisticsService {
     /**
      * 统计承运订单
      *

+ 1 - 1
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/LogisticsOrderDTO.java → sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/AcceptCarriageLogisticsOrderDto.java

@@ -15,7 +15,7 @@ import java.util.Date;
  * @date 2023-07-17 11:07:08
  */
 @Data
-public class LogisticsOrderDTO implements Serializable {
+public class AcceptCarriageLogisticsOrderDto implements Serializable {
 
     /**
      * 物流订单id

+ 0 - 13
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/AddressResDTO.java

@@ -1,13 +0,0 @@
-package com.sckw.transport.api.model.dto;
-
-import lombok.Data;
-
-/**
- * @author lfdc
- * @description 地址信息
- * @date 2023-08-02 14:08:52
- */
-@Data
-public class AddressResDTO {
-
-}

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

@@ -2,7 +2,7 @@ package com.sckw.contract.controller;
 
 import com.sckw.contract.model.vo.req.IdReqVo;
 import com.sckw.contract.model.vo.req.QueryListReqVo;
-import com.sckw.contract.service.KwcContractLogisticsService;
+import com.sckw.contract.service.operateService.KwcContractLogisticsService;
 import com.sckw.core.model.enums.EntTypeEnum;
 import com.sckw.core.web.response.HttpResult;
 import jakarta.servlet.http.HttpServletResponse;

+ 1 - 7
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcCheckedController.java

@@ -1,14 +1,10 @@
 package com.sckw.contract.controller;
 
 import com.sckw.contract.model.vo.req.*;
-import com.sckw.contract.service.*;
-import com.sckw.core.exception.BusinessException;
-import com.sckw.core.exception.SystemException;
+import com.sckw.contract.service.operateService.KwcContractLogisticsService;
 import com.sckw.core.model.enums.EntTypeEnum;
-import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.response.HttpResult;
-import com.sckw.excel.utils.ExcelUtil;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,8 +14,6 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.List;
-
 /**
  * @author czh
  * @desc 托运合同

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

@@ -1,7 +1,7 @@
 package com.sckw.contract.controller;
 
 import com.sckw.contract.model.vo.req.*;
-import com.sckw.contract.service.KwcContractTradeService;
+import com.sckw.contract.service.operateService.KwcContractTradeService;
 import com.sckw.core.model.enums.EntTypeEnum;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.response.HttpResult;

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

@@ -2,7 +2,7 @@ package com.sckw.contract.controller;
 
 import com.sckw.contract.model.vo.req.IdReqVo;
 import com.sckw.contract.model.vo.req.QueryListReqVo;
-import com.sckw.contract.service.KwcContractTradeService;
+import com.sckw.contract.service.operateService.KwcContractTradeService;
 import com.sckw.core.model.enums.EntTypeEnum;
 import com.sckw.core.web.response.HttpResult;
 import jakarta.servlet.http.HttpServletResponse;

+ 15 - 9
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/CommonBusinessService.java

@@ -14,32 +14,38 @@ import com.sckw.contract.model.entity.KwcContractLogisticsUnit;
 import com.sckw.contract.model.entity.KwcContractTrade;
 import com.sckw.contract.model.entity.KwcContractTradeUnit;
 import com.sckw.contract.model.vo.req.ESignCallBackReqVo;
+import com.sckw.contract.service.operateService.KwcContractLogisticsService;
+import com.sckw.contract.service.operateService.KwcContractTradeService;
 import com.sckw.core.exception.SystemException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.ClientTypeEnum;
 import com.sckw.core.model.enums.CooperateTypeEnum;
 import com.sckw.core.utils.*;
-import lombok.RequiredArgsConstructor;
-import org.springframework.cloud.stream.function.StreamBridge;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.order.api.model.ContractSignCompletedParam;
+import com.sckw.stream.enums.MessageEnum;
+import com.sckw.stream.model.SckwMessage;
+import com.sckw.stream.model.UserInfo;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
-import com.sckw.transport.api.dubbo.TransportService;
+import com.sckw.transport.api.dubbo.TransportRemoteService;
 import com.sckw.transport.api.model.param.ContractSignLogisticsParam;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.stream.function.StreamBridge;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import com.sckw.stream.enums.MessageEnum;
-import com.sckw.stream.model.SckwMessage;
-import com.sckw.stream.model.UserInfo;
-import java.io.*;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
@@ -59,7 +65,7 @@ public class CommonBusinessService {
     private TradeOrderInfoService tradeOrderInfoService;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
-    private TransportService transportDubboService;
+    private TransportRemoteService transportRemoteService;
 
     @Autowired
     private KwcContractTradeMapper kwcContractTradeMapper;
@@ -248,7 +254,7 @@ public class CommonBusinessService {
         contractSignLogisticsParam.setContractId(contractId);
         contractSignLogisticsParam.setUpdateBy(userId);
         contractSignLogisticsParam.setUpdateByName(name);
-        transportDubboService.contractSignLogisticsCompleted(contractSignLogisticsParam);
+        transportRemoteService.contractSignLogisticsCompleted(contractSignLogisticsParam);
     }
 
 

+ 4 - 6
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractLogisticsGoodsService.java

@@ -11,14 +11,14 @@ import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.IdWorker;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
-import com.sckw.product.api.dubbo.GoodsInfoService;
-import com.sckw.product.api.model.KwpGoods;
-import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -33,8 +33,6 @@ public class KwcContractLogisticsGoodsService {
     @Autowired
     private KwcContractLogisticsGoodsMapper kwcContractLogisticsGoodsMapper;
 
-    @DubboReference(version = "1.0.0", group = "design", check = false)
-    private GoodsInfoService goodsInfoService;
 
 
     /**

+ 5 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractLogisticsService.java → sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractLogisticsService.java

@@ -1,4 +1,4 @@
-package com.sckw.contract.service;
+package com.sckw.contract.service.operateService;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -15,6 +15,10 @@ import com.sckw.contract.model.entity.KwcContractLogisticsUnit;
 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.service.CommonBusinessService;
+import com.sckw.contract.service.KwcContractLogisticsGoodsService;
+import com.sckw.contract.service.KwcContractLogisticsTrackService;
+import com.sckw.contract.service.KwcContractLogisticsUnitService;
 import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.exception.BusinessException;

+ 5 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractTradeService.java → sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java

@@ -1,4 +1,4 @@
-package com.sckw.contract.service;
+package com.sckw.contract.service.operateService;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -15,6 +15,10 @@ import com.sckw.contract.model.entity.KwcContractTradeUnit;
 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.service.CommonBusinessService;
+import com.sckw.contract.service.KwcContractTradeGoodsService;
+import com.sckw.contract.service.KwcContractTradeTrackService;
+import com.sckw.contract.service.KwcContractTradeUnitService;
 import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.exception.SystemException;

+ 2 - 2
sckw-modules/sckw-example/src/main/java/com/sckw/example/service/TransportService.java

@@ -1,6 +1,6 @@
 package com.sckw.example.service;
 
-import com.sckw.transport.api.dubbo.TransportStatisticsService;
+import com.sckw.transport.api.dubbo.TransportRemoteStatisticsService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Value;
@@ -24,7 +24,7 @@ public class TransportService {
     private String refreshScope;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
-    private TransportStatisticsService statisticsService;
+    private TransportRemoteStatisticsService statisticsService;
 
     public Integer statisticsLogistics(Long topEntId) {
         return statisticsService.statisticsLogistics(topEntId,new ArrayList<>());

+ 3 - 3
sckw-modules/sckw-file/src/main/java/com/sckw/file/controller/FileApiController.java → sckw-modules/sckw-file/src/main/java/com/sckw/file/controller/KwfFileController.java

@@ -38,13 +38,13 @@ import java.util.Map;
 @RestController
 @RequestMapping("/file")
 @AllArgsConstructor
-public class FileApiController {
+public class KwfFileController {
 
     @Autowired
     private FileService fileService;
 
     @Autowired
-    private FileDubboApiServiceImpl fileDubboApiService;
+    private FileDubboApiServiceImpl fileApiService;
 
     /**
      * 上传文件至OSS
@@ -204,7 +204,7 @@ public class FileApiController {
     @GlobalTransactional(rollbackFor = Exception.class)
     public HttpResult fileInfoInsertByOSS(@RequestBody FileInfo fileInfo) {
         try {
-            return fileDubboApiService.fileInfoInsert(fileInfo);
+            return fileApiService.fileInfoInsert(fileInfo);
         } catch (ParseException e) {
             throw new RuntimeException(e);
         }

+ 2 - 2
sckw-modules/sckw-file/src/main/java/com/sckw/file/service/FileService.java

@@ -137,7 +137,7 @@ public class FileService {
             for (MultipartFile multipartFile : multipartFiles) {
                 Map<String, Object> map = new HashMap<>(NumberConstant.SIXTEEN);
                 //文件大小
-                String fileSize = FileUtils.getFileSize(multipartFile);
+//                String fileSize = FileUtils.getFileSize(multipartFile);
                 //文件名称
                 String originalFilename = multipartFile.getOriginalFilename();
                 map.put("code", HttpStatus.SUCCESS_CODE);
@@ -183,7 +183,7 @@ public class FileService {
 
     public void remove(String fileName) {
         String str = FileUtils.getOSSAddressPrefix();
-        String fileNameSubstring = StringUtils.substring(fileName, str.length() + 1);
+//        String fileNameSubstring = StringUtils.substring(fileName, str.length() + 1);
         FileUtils.remove(fileName);
     }
 

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

@@ -882,11 +882,11 @@ public class KwfDriverService {
         driverImport.setRemark(JSON.toJSONString(returnFileInfo));
         kwfDriverImportDao.insert(driverImport);
 
-        try {
-            //remoteFileService.fileInfoInsert(fileInfo);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+//        try {
+//            //remoteFileService.fileInfoInsert(fileInfo);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
     }
 
     /**

+ 14 - 18
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckReportService.java

@@ -20,8 +20,13 @@ import com.sckw.fleet.dao.KwfDriverMapper;
 import com.sckw.fleet.dao.KwfTruckMapper;
 import com.sckw.fleet.dao.KwfTruckReportImportMapper;
 import com.sckw.fleet.dao.KwfTruckReportMapper;
-import com.sckw.fleet.model.*;
-import com.sckw.fleet.model.dto.*;
+import com.sckw.fleet.model.KwfDriver;
+import com.sckw.fleet.model.KwfTruck;
+import com.sckw.fleet.model.KwfTruckReport;
+import com.sckw.fleet.model.KwfTruckReportImport;
+import com.sckw.fleet.model.dto.KwfChangeFleetDto;
+import com.sckw.fleet.model.dto.KwfTruckReportDto;
+import com.sckw.fleet.model.dto.KwfTruckReportExcelImportDto;
 import com.sckw.fleet.model.vo.KwfTableTopCount;
 import com.sckw.fleet.model.vo.KwfTruckReportVo;
 import com.sckw.system.api.RemoteSystemService;
@@ -30,11 +35,11 @@ import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
 import org.apache.dubbo.config.annotation.DubboReference;
-import org.checkerframework.checker.units.qual.K;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.multipart.MultipartFile;
+
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -68,15 +73,6 @@ public class KwfTruckReportService {
     @DubboReference(version = "1.0.0", group = "design", check = false,timeout = 8000)
     private RemoteUserService remoteUserService;
 
-    /**
-     * @param key 主键id
-     * @desc 根据主键查询
-     * @author zk
-     * @date 2023/7/15
-     **/
-    public KwfTruckReport selectByKey(Long key) {
-        return null;
-    }
 
     /**
      * @param params 参数
@@ -515,12 +511,12 @@ public class KwfTruckReportService {
         truckReportImport.setUrl(returnFileInfo.getFilePath());
         truckReportImport.setRemark(JSON.toJSONString(returnFileInfo));
         kwfTruckReportImportDao.insert(truckReportImport);
-
-        try {
-            //remoteFileService.fileInfoInsert(fileInfo);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+//
+//        try {
+//            //remoteFileService.fileInfoInsert(fileInfo);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
     }
 
     /**

+ 9 - 10
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java

@@ -30,7 +30,7 @@ import com.sckw.system.api.RemoteUserService;
 import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
-import com.sckw.transport.api.dubbo.TransportService;
+import com.sckw.transport.api.dubbo.TransportRemoteService;
 import com.sckw.transport.api.model.dto.RWaybillOrderDto;
 import com.sckw.transport.api.model.vo.RTruckMonitorVo;
 import com.sckw.transport.api.model.vo.RWaybillOrderVo;
@@ -75,7 +75,7 @@ public class KwfTruckService {
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     private RemoteUserService remoteUserService;
     @DubboReference(version = "1.0.0", group = "design", check = false)
-    private TransportService transportDubboService;
+    private TransportRemoteService transportRemoteService;
 
     /**
      * @param key 主键id
@@ -700,11 +700,11 @@ public class KwfTruckService {
         truckImport.setRemark(JSON.toJSONString(returnFileInfo));
         kwfTruckImportDao.insert(truckImport);
 
-        try {
-            //remoteFileService.fileInfoInsert(fileInfo);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+//        try {
+//            //remoteFileService.fileInfoInsert(fileInfo);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
     }
 
     /**
@@ -819,7 +819,7 @@ public class KwfTruckService {
             //托运方
             bool = EntTypeEnum.check(entTypes);
             if (bool != null && bool) {
-                List<RTruckMonitorVo> checkTrucks = transportDubboService.truckInTask(LoginUserHolder.getEntId());
+                List<RTruckMonitorVo> checkTrucks = transportRemoteService.truckInTask(LoginUserHolder.getEntId());
                 checkTrucks.forEach(order -> trucks.add(new KwfTruckMonitorVo(order.getEntId(), order.getTruckNo(), Global.NUMERICAL_ONE)));
             }
 
@@ -1063,7 +1063,7 @@ public class KwfTruckService {
      **/
     public RWaybillOrderVo getWaybillOrder(String truckNo, int busStatus) {
         try {
-            List<RWaybillOrderVo> waybillOrders = transportDubboService.findWaybillOrder(new RWaybillOrderDto(truckNo, busStatus));
+            List<RWaybillOrderVo> waybillOrders = transportRemoteService.findWaybillOrder(new RWaybillOrderDto(truckNo, busStatus));
             if (CollectionUtils.isEmpty(waybillOrders)) {
                 return null;
             }
@@ -1105,7 +1105,6 @@ public class KwfTruckService {
                     return truckGpsMap;
                 }
                 JSONArray trucks = result.getJSONArray("data");
-                //log.info("车牌号数量="+ truckNos.size() + " GPS数量=" + (trucks != null ? trucks.size() : 0) + " 响应时间="+(entTime - begTime));
                 for (int i = 0; trucks != null && i < trucks.size(); i++) {
                     JSONObject truck = trucks.getJSONObject(i);
                     JSONObject locateInfo = truck.getJSONObject("locateInfo");

+ 80 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/controller/KwmLineFreightRateController.java

@@ -0,0 +1,80 @@
+package com.sckw.manage.controller;
+
+import com.sckw.core.annotation.RepeatSubmit;
+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.HttpResult;
+import com.sckw.excel.utils.ExcelUtil;
+import com.sckw.manage.model.vo.req.*;
+import com.sckw.manage.model.vo.res.LineFreightRateExport;
+import com.sckw.manage.service.KwmLineFreightRateService;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  09:20
+ * @desc: 路径管理
+ */
+@RestController
+@RequestMapping(value = "/kwmLineFreightRate")
+@RequiredArgsConstructor
+public class KwmLineFreightRateController {
+
+    private final KwmLineFreightRateService lineFreightRateService;
+
+    @PostMapping(value = "/add", produces = MediaType.APPLICATION_JSON_VALUE)
+    @RepeatSubmit(interval = 1000, message = "前方拥堵,请稍后尝试")
+    public HttpResult add(@RequestBody @Validated AddLineFreightRateParam addLineFreightRateParam) {
+        lineFreightRateService.add(addLineFreightRateParam);
+        return HttpResult.ok(" 新增运价成功");
+    }
+
+    @GetMapping("/detail")
+    public HttpResult detail(@RequestParam Long id) {
+        return HttpResult.ok(lineFreightRateService.detail(id));
+    }
+
+    @PostMapping(value = "/update", produces = MediaType.APPLICATION_JSON_VALUE)
+    @RepeatSubmit(interval = 1000, message = "前方拥堵,请稍后尝试")
+    public HttpResult update(@RequestBody @Validated UpdateLineFreightRateParam updateLineFreightRateParam) {
+        lineFreightRateService.update(updateLineFreightRateParam);
+        return HttpResult.ok(" 编辑运价成功");
+    }
+
+    @PostMapping(value = "/select", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult select(@RequestBody SelectLineFreightRateParam params) {
+        return HttpResult.ok(lineFreightRateService.select(params));
+    }
+
+    @PostMapping(value = "/choose", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult choose(@RequestBody ChooseLineFreightRateParam params) {
+        return HttpResult.ok(lineFreightRateService.choose(params));
+    }
+
+    @PostMapping(value = "/export", produces = MediaType.APPLICATION_JSON_VALUE)
+    public void export(@RequestBody ExportLineFreightRateParam params, HttpServletResponse response) {
+        List<LineFreightRateExport> list = lineFreightRateService.export(params);
+        if (CollectionUtils.isEmpty(list)) {
+            throw new CustomPromptException(HttpStatus.SUCCESS_CODE, "暂无数据,请确认");
+        }
+        ExcelUtil.downData(response, LineFreightRateExport.class, list);
+    }
+
+    @GetMapping("/batchDelete")
+    public HttpResult batchDelete(@RequestParam List<Long> ids) {
+        lineFreightRateService.batchDelete(ids);
+        return HttpResult.ok("批量删除成功");
+    }
+
+    @PostMapping("/findList")
+    public HttpResult findList(@RequestBody LineFreightRateFindListParam params) {
+        return HttpResult.ok(lineFreightRateService.findList(params));
+    }
+}

+ 15 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/dao/KwmLineFreightRateMapper.java

@@ -0,0 +1,15 @@
+package com.sckw.manage.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.manage.model.entity.KwmLineFreightRate;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @desc: 路径mapper
+ * @author: yzc
+ * @date: 2023-06-25 14:40
+ */
+@Mapper
+public interface KwmLineFreightRateMapper extends BaseMapper<KwmLineFreightRate> {
+
+}

+ 49 - 2
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/dubbo/RemoteManageServiceImpl.java

@@ -1,19 +1,24 @@
 package com.sckw.manage.dubbo;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.sckw.core.model.constant.Global;
+import com.sckw.core.model.constant.NumberConstant;
 import com.sckw.core.model.enums.CooperateStatusEnum;
 import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.manage.api.RemoteManageService;
 import com.sckw.manage.api.model.dto.res.EntAddressResDto;
 import com.sckw.manage.api.model.dto.res.FindEntCooperateResVo;
+import com.sckw.manage.api.model.dto.res.LineFreightAddressRes;
 import com.sckw.manage.dao.KwmAddressMapper;
 import com.sckw.manage.dao.KwmCooperateMapper;
 import com.sckw.manage.dao.KwmCooperateTypeMapper;
+import com.sckw.manage.dao.KwmLineFreightRateMapper;
 import com.sckw.manage.model.entity.KwmAddress;
 import com.sckw.manage.model.entity.KwmCooperate;
 import com.sckw.manage.model.entity.KwmCooperateType;
+import com.sckw.manage.model.entity.KwmLineFreightRate;
 import com.sckw.manage.model.vo.req.FindCooperateByEntReqVo;
 import com.sckw.manage.model.vo.req.FindEntCooperateReqVo;
 import com.sckw.manage.model.vo.res.FindCooperateByEntResVo;
@@ -26,6 +31,7 @@ import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -48,6 +54,9 @@ public class RemoteManageServiceImpl implements RemoteManageService {
     @Autowired
     private KwmCooperateMapper kwmCooperateMapper;
 
+    @Autowired
+    private KwmLineFreightRateMapper lineFreightRateMapper;
+
     @Autowired
     private KwmCooperateTypeMapper kwmCooperateTypeMapper;
 
@@ -56,7 +65,7 @@ public class RemoteManageServiceImpl implements RemoteManageService {
 
     /**
      * @param idList 企业id集合
-     * @return Map<Long, List<EntAddressResDto>>
+     * @return Map<Long, List < EntAddressResDto>>
      * @desc: 根据企业id查下面的地址
      * @author: czh
      * @date: 2023/7/31
@@ -66,7 +75,7 @@ public class RemoteManageServiceImpl implements RemoteManageService {
         Map<Long, List<EntAddressResDto>> map = new HashMap<>(4);
         LambdaQueryWrapper<KwmAddress> kwmAddressLambdaQueryWrapper = new LambdaQueryWrapper<>();
         kwmAddressLambdaQueryWrapper.in(KwmAddress::getEntId, idList).
-                                     eq(KwmAddress::getDelFlag, Global.NO);
+                eq(KwmAddress::getDelFlag, Global.NO);
         List<KwmAddress> kwmAddressList = kwmAddressMapper.selectList(kwmAddressLambdaQueryWrapper);
         if (CollectionUtils.isEmpty(kwmAddressList)) {
             return map;
@@ -249,4 +258,42 @@ public class RemoteManageServiceImpl implements RemoteManageService {
         }
         return list;
     }
+
+    @Override
+    public Map<Long, LineFreightAddressRes> findLineFreightAddress(List<Long> lineFreightId) {
+        List<KwmLineFreightRate> list = lineFreightRateMapper.selectList(new LambdaQueryWrapper<KwmLineFreightRate>()
+                .in(KwmLineFreightRate::getId, lineFreightId).eq(KwmLineFreightRate::getDelFlag, 0));
+        Map<Long, LineFreightAddressRes> rateMap = new HashMap<>(NumberConstant.SIXTEEN);
+        List<LineFreightAddressRes> lineFre = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(list)) {
+            for (KwmLineFreightRate kwmLineFreightRate : list) {
+                LineFreightAddressRes lineFreightRate = new LineFreightAddressRes();
+                BeanUtil.copyProperties(kwmLineFreightRate, lineFreightRate);
+                lineFre.add(lineFreightRate);
+            }
+        }
+        if (!CollectionUtils.isEmpty(lineFre)) {
+            rateMap = lineFre.stream().collect(Collectors.toMap(LineFreightAddressRes::getId, Function.identity()));
+        }
+        return rateMap;
+    }
+
+    /**
+     * 通过ids获取地址信息
+     * @param addressIds
+     */
+    @Override
+    public Map<Long, EntAddressResDto> queryAddressListByAddressIdList(List<String> addressIds) {
+        Map<Long, EntAddressResDto> map = new HashMap<>(4);
+        LambdaQueryWrapper<KwmAddress> kwmAddressLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        kwmAddressLambdaQueryWrapper.in(KwmAddress::getId, addressIds).
+                eq(KwmAddress::getDelFlag, Global.NO);
+        List<KwmAddress> kwmAddressList = kwmAddressMapper.selectList(kwmAddressLambdaQueryWrapper);
+        if (CollectionUtils.isEmpty(kwmAddressList)) {
+            return map;
+        }
+
+        List<EntAddressResDto> entAddressResDtoList = BeanUtils.copyToList(kwmAddressList, EntAddressResDto.class);
+        return entAddressResDtoList.stream().collect(Collectors.toMap(EntAddressResDto::getId,Function.identity()));
+    }
 }

+ 115 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/entity/KwmLineFreightRate.java

@@ -0,0 +1,115 @@
+package com.sckw.manage.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.sckw.core.model.base.BaseModel;
+import lombok.EqualsAndHashCode;
+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;
+
+/**
+ * @desc: 路径
+ * @author: yzc
+ * @date: 2024-03-01 9:04
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@TableName("kwm_line_freight_rate")
+public class KwmLineFreightRate extends BaseModel implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -4571752839456202179L;
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 线路名称
+     */
+    private String name;
+
+    /**
+     * 起始地_名称
+     */
+    private String loadName;
+
+    /**
+     * 起始地-所在地区
+     */
+    private Integer loadCityCode;
+
+    /**
+     * 起始地-所属区域名称
+     */
+    private String loadCityName;
+
+    /**
+     * 起始地-详细地址
+     */
+    private String loadDetailAddress;
+
+    /**
+     * 起始地-纬度
+     */
+    private String loadLat;
+
+    /**
+     * 起始地-经度
+     */
+    private String loadLng;
+
+    /**
+     * 目的地_名称
+     */
+    private String unloadName;
+
+    /**
+     * 目的地-所在地区
+     */
+    private Integer unloadCityCode;
+
+    /**
+     * 目的地-所属区域名称
+     */
+    private String unloadCityName;
+
+    /**
+     * 目的地-详细地址
+     */
+    private String unloadDetailAddress;
+
+    /**
+     * 目的地-纬度
+     */
+    private String unloadLat;
+
+    /**
+     * 目的地-经度
+     */
+    private String unloadLng;
+
+    /**
+     * 运输里程
+     */
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输总价
+     */
+    private BigDecimal transportAmount;
+
+}

+ 75 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/AddLineFreightRateParam.java

@@ -0,0 +1,75 @@
+package com.sckw.manage.model.vo.req;
+
+import jakarta.validation.constraints.*;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Length;
+
+import java.math.BigDecimal;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  09:24
+ * @desc: 添加运价参数
+ */
+@Getter
+@Setter
+@ToString
+public class AddLineFreightRateParam {
+
+
+    /**
+     * 运价名称
+     */
+    @NotBlank(message = "运价名称不能为空")
+    @Length(max = 40, message = "运价名称最多支持50字")
+    private String name;
+
+    /**
+     * 起始地-地址名称
+     */
+    @NotBlank(message = "路径起始位置不能为空")
+    private String loadName;
+
+    @NotNull(message = "起始位置所属企业不能为空")
+    private Long loadEntId;
+
+    /**
+     * 目的地-地址名称
+     */
+    @NotBlank(message = "路径结束位置不能为空")
+    private String unloadName;
+
+    @NotNull(message = "结束位置所属企业不能为空")
+    private Long unloadEntId;
+
+    /**
+     * 行驶里程/公里
+     */
+    @NotNull(message = "行驶里程/公里不能为空")
+    @Digits(integer = 7, fraction = 2, message = "行驶里程格式错误")
+    @DecimalMin(value = "0", message = "行驶里程不能小于零")
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    @Digits(integer = 10, fraction = 6, message = "运输单价格式错误")
+    @DecimalMin(value = "0", message = "运输单价不能小于零")
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输总价
+     */
+    @Digits(integer = 10, fraction = 6, message = "运输总价格式错误")
+    @DecimalMin(value = "0", message = "运输总价不能小于零")
+    @NotNull(message = "运输总价不能为空")
+    private BigDecimal transportAmount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 37 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/ChooseLineFreightRateParam.java

@@ -0,0 +1,37 @@
+package com.sckw.manage.model.vo.req;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.Size;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.util.List;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  15:00
+ * @desc: 选择运价路径请求参数
+ */
+@Getter
+@Setter
+@ToString
+@EqualsAndHashCode(callSuper = false)
+public class ChooseLineFreightRateParam {
+
+    /**
+     * 装货地名称集合
+     */
+    @NotEmpty(message = "装货地名不能为空")
+    @Size(min = 1,max = 3,message = "装货地名称最多3条")
+    private List<String> loadNames;
+
+    /**
+     * 卸货地名称集合
+     */
+    @NotEmpty(message = "卸货地名不能为空")
+    @Size(min = 1,max = 3,message = "卸货地名称最多3条")
+    private List<String> unloadNames;
+
+}

+ 54 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/ExportLineFreightRateParam.java

@@ -0,0 +1,54 @@
+package com.sckw.manage.model.vo.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.Digits;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  15:00
+ * @desc: 导出运价列表请求参数
+ */
+
+@Getter
+@Setter
+@ToString
+public class ExportLineFreightRateParam {
+
+    /**
+     * 模糊匹配运价名称、路径起始位置、路径结束位置
+     */
+    private String keywords;
+
+    /**
+     * 创建时间开始(yyyy-MM-dd HH:mm:ss)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startCreateTime;
+
+    /**
+     * 创建时间结束(yyyy-MM-dd HH:mm:ss)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endCreateTime;
+
+    /**
+     * 行驶里程开始
+     */
+    @DecimalMin(value = "0", message = "行驶里程不能小于零")
+    @Digits(integer = 7, fraction = 2, message = "行驶里程格式错误")
+    private BigDecimal startMileage;
+
+    /**
+     * 行驶里程结束
+     */
+    @DecimalMin(value = "0", message = "行驶里程不能小于零")
+    @Digits(integer = 7, fraction = 2, message = "行驶里程格式错误")
+    private BigDecimal endMileage;
+}

+ 21 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/LineFreightRateFindListParam.java

@@ -0,0 +1,21 @@
+package com.sckw.manage.model.vo.req;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-04  10:08
+ * @desc: 路径下拉列表请求参数
+ */
+@Getter
+@Setter
+@ToString
+public class LineFreightRateFindListParam {
+
+    /**
+     * 路径名称
+     */
+    private String name;
+}

+ 5 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/QueryByEntReqVo.java

@@ -21,6 +21,11 @@ public class QueryByEntReqVo implements Serializable {
      */
     private Long id;
 
+    /**
+     * 地址名称
+     */
+    private String name;
+
     /**
      * 地址名
      */

+ 57 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/SelectLineFreightRateParam.java

@@ -0,0 +1,57 @@
+package com.sckw.manage.model.vo.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.sckw.core.model.page.PageRequest;
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.Digits;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  15:00
+ * @desc: 分页查询运价请求参数
+ */
+@Getter
+@Setter
+@ToString
+@EqualsAndHashCode(callSuper = false)
+public class SelectLineFreightRateParam extends PageRequest {
+
+    /**
+     * 模糊匹配运价名称、路径起始位置、路径结束位置
+     */
+    private String keywords;
+
+    /**
+     * 创建时间开始(yyyy-MM-dd HH:mm:ss)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startCreateTime;
+
+    /**
+     * 创建时间结束(yyyy-MM-dd HH:mm:ss)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endCreateTime;
+
+    /**
+     * 行驶里程开始
+     */
+    @DecimalMin(value = "0", message = "行驶里程不能小于零")
+    @Digits(integer = 7, fraction = 2, message = "行驶里程格式错误")
+    private BigDecimal startMileage;
+
+    /**
+     * 行驶里程结束
+     */
+    @DecimalMin(value = "0", message = "行驶里程不能小于零")
+    @Digits(integer = 7, fraction = 2, message = "行驶里程格式错误")
+    private BigDecimal endMileage;
+
+}

+ 82 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/req/UpdateLineFreightRateParam.java

@@ -0,0 +1,82 @@
+package com.sckw.manage.model.vo.req;
+
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.Digits;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Length;
+
+import java.math.BigDecimal;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  14:34
+ * @desc: 编辑运价参数
+ */
+@Getter
+@Setter
+@ToString
+public class UpdateLineFreightRateParam {
+
+    /**
+     * 运价id
+     */
+    @NotNull(message = "运价id不能为空")
+    private Long id;
+
+    /**
+     * 运价名称
+     */
+    @NotBlank(message = "运价名称不能为空")
+    @Length(max = 40, message = "运价名称最多支持50字")
+    private String name;
+
+    /**
+     * 起始地-地址名称
+     */
+    @NotBlank(message = "路径起始位置不能为空")
+    private String loadName;
+
+    @NotNull(message = "起始位置所属企业不能为空")
+    private Long loadEntId;
+
+    /**
+     * 目的地-地址名称
+     */
+    @NotBlank(message = "路径结束位置不能为空")
+    private String unloadName;
+
+    @NotNull(message = "结束位置所属企业不能为空")
+    private Long unloadEntId;
+
+    /**
+     * 行驶里程/公里
+     */
+    @NotNull(message = "行驶里程/公里不能为空")
+    @Digits(integer = 7, fraction = 2, message = "行驶里程格式错误")
+    @DecimalMin(value = "0", message = "行驶里程不能小于零")
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    @Digits(integer = 10, fraction = 6, message = "运输单价格式错误")
+    @DecimalMin(value = "0", message = "运输单价不能小于零")
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输总价
+     */
+    @Digits(integer = 10, fraction = 6, message = "运输总价格式错误")
+    @DecimalMin(value = "0", message = "运输总价不能小于零")
+    @NotNull(message = "运输总价不能为空")
+    private BigDecimal transportAmount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 61 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/LineFreightRateDetail.java

@@ -0,0 +1,61 @@
+package com.sckw.manage.model.vo.res;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  11:16
+ * @desc: 运价详情
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class LineFreightRateDetail {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 线路名称
+     */
+    private String name;
+
+    /**
+     * 起始地_名称
+     */
+    private String loadName;
+
+    /**
+     * 目的地_名称
+     */
+    private String unloadName;
+
+    /**
+     * 运输里程
+     */
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输总价
+     */
+    private BigDecimal transportAmount;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 53 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/LineFreightRateExport.java

@@ -0,0 +1,53 @@
+package com.sckw.manage.model.vo.res;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.sckw.excel.annotation.ExcelContext;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  15:02
+ * @desc: 运价列表信息
+ */
+@Data
+@Accessors(chain = true)
+@ExcelContext(fileName = "运价列表信息", sheetName = "运价列表信息")
+public class LineFreightRateExport implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 6529061725929970732L;
+
+    @ExcelProperty(value = "运价名称")
+    private String name;
+
+    @ExcelProperty(value = "路径起始位置")
+    private String loadName;
+
+    @ExcelProperty(value = "路径结束位置")
+    private String unloadName;
+
+    @ExcelProperty(value = "行驶里程/公里")
+    private String transportMileage;
+
+    @ExcelProperty(value = "运输单价/元")
+    private String transportPrice;
+
+    @ExcelProperty(value = "运输总价/元")
+    private String transportAmount;
+
+    @ExcelProperty(value = "创建人")
+    private String createByName;
+
+    @ExcelProperty(value = "创建时间")
+    private String createTime;
+
+    @ExcelProperty(value = "更新时间")
+    private String updateTime;
+
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+}

+ 38 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/LineFreightRateFindListResVO.java

@@ -0,0 +1,38 @@
+package com.sckw.manage.model.vo.res;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-04  10:09
+ * @desc: 路径下拉列表响应vo
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class LineFreightRateFindListResVO {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 线路名称
+     */
+    private String name;
+
+    /**
+     * 起始地_名称
+     */
+    private String loadName;
+
+    /**
+     * 目的地_名称
+     */
+    private String unloadName;
+}

+ 86 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/LineFreightRateListResVO.java

@@ -0,0 +1,86 @@
+package com.sckw.manage.model.vo.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  16:02
+ * @desc: 运价列表响应vo
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class LineFreightRateListResVO {
+
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 线路名称
+     */
+    private String name;
+
+    /**
+     * 起始地_名称
+     */
+    private String loadName;
+
+    /**
+     * 目的地_名称
+     */
+    private String unloadName;
+
+    /**
+     * 运输里程
+     */
+    private BigDecimal transportMileage;
+
+    /**
+     * 运输单价(元/公里)
+     */
+    private BigDecimal transportPrice;
+
+    /**
+     * 运输总价
+     */
+    private BigDecimal transportAmount;
+
+    /**
+     * 创建人id
+     */
+    private Long createBy;
+
+    /**
+     * 创建人姓名
+     */
+    private String createByName;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 0 - 3
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/CommonBusinessService.java

@@ -49,9 +49,6 @@ public class CommonBusinessService {
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteSystemService remoteSystemService;
 
-    @DubboReference(version = "1.0.0", group = "design", check = false)
-    private RemoteUserService remoteUserService;
-
     @Autowired
     private KwmCooperateMapper kwmCooperateMapper;
 

+ 24 - 22
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmAddressService.java

@@ -33,7 +33,6 @@ import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.stream.function.StreamBridge;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -60,8 +59,6 @@ public class KwmAddressService {
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteUserService remoteUserService;
 
-    @Autowired
-    private StreamBridge streamBridge;
 
     /**
      * @param reqVo 分页入参
@@ -96,7 +93,7 @@ public class KwmAddressService {
             }
         }
 
-        List<KwmAddress> kwmAddressList = findList(reqVo,authEntIdList);
+        List<KwmAddress> kwmAddressList = findList(reqVo, authEntIdList);
         if (CollectionUtils.isEmpty(kwmAddressList)) {
             return PageHelperUtil.getPageResult(new PageInfo<>());
         }
@@ -111,10 +108,10 @@ public class KwmAddressService {
      * @author: czh
      * @date: 2023/7/12
      */
-    private List<KwmAddress> findList(AddressQueryReqVo reqVo,List<Long> authEntIdList ) {
+    private List<KwmAddress> findList(AddressQueryReqVo reqVo, List<Long> authEntIdList) {
         LambdaQueryWrapper<KwmAddress> wrapper = new LambdaQueryWrapper<>();
-        if (CollectionUtils.isNotEmpty(authEntIdList)){
-            wrapper.in(KwmAddress::getEntId,authEntIdList);
+        if (CollectionUtils.isNotEmpty(authEntIdList)) {
+            wrapper.in(KwmAddress::getEntId, authEntIdList);
         }
         wrapper.in(Objects.nonNull(reqVo.getCityCode()), KwmAddress::getCityCode, reqVo.getCityCodeList()).
                 eq(Objects.nonNull(reqVo.getType()), KwmAddress::getType, reqVo.getType()).
@@ -220,20 +217,6 @@ public class KwmAddressService {
         Integer defaultType = kwmAddress.getDefaultType();
         Integer setDefaultType = reqVo.getDefaultType();
 
-//        LambdaQueryWrapper<KwmAddress> wrapper = new LambdaQueryWrapper<>();
-//        wrapper.eq(KwmAddress::getEntId, entId).
-//                eq(KwmAddress::getDelFlag, Global.NO).
-//                eq(KwmAddress::getStatus, Global.NO);
-//        List<KwmAddress> entAddress = kwmAddressMapper.selectList(wrapper);
-//        List<Integer> defaultTypeList = entAddress.stream().map(KwmAddress::getDefaultType).distinct().toList();
-//        if (defaultType.equals(AddressDefaultTypeEnum.SHIPMENT.getCode()) && (defaultTypeList.contains(AddressDefaultTypeEnum.SHIPMENT.getCode()) || defaultTypeList.contains(AddressDefaultTypeEnum.BOTH.getCode()))) {
-//            throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.MSG_021);
-//        }
-//
-//        if (defaultType.equals(AddressDefaultTypeEnum.TAKE.getCode()) && (defaultTypeList.contains(AddressDefaultTypeEnum.TAKE.getCode()) || defaultTypeList.contains(AddressDefaultTypeEnum.BOTH.getCode()))) {
-//            throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.MSG_021);
-//        }
-
         //当前是收货或者卸货
         if (!defaultType.equals(AddressDefaultTypeEnum.NO.getCode()) && !defaultType.equals(AddressDefaultTypeEnum.BOTH.getCode())) {
             if (defaultType.equals(setDefaultType)) {
@@ -414,7 +397,7 @@ public class KwmAddressService {
                 authEntIdList.addAll(ids);
             }
         }
-        List<KwmAddress> kwmAddressList = findList(reqVo,authEntIdList);
+        List<KwmAddress> kwmAddressList = findList(reqVo, authEntIdList);
         if (CollectionUtils.isEmpty(kwmAddressList)) {
             throw new SystemException(HttpStatus.SUCCESS_CODE, "暂无数据,请确认!");
         }
@@ -446,6 +429,9 @@ public class KwmAddressService {
         if (StringUtils.isNotBlank(reqVo.getCityTrueName())) {
             wrapper.eq(KwmAddress::getName, reqVo.getCityTrueName());
         }
+        if (StringUtils.isNotBlank(reqVo.getName())) {
+            wrapper.like(KwmAddress::getName, reqVo.getName());
+        }
         if (StringUtils.isNotBlank(reqVo.getCityName())) {
             wrapper.and(wp -> wp.like(KwmAddress::getCityName, reqVo.getCityName()).or().
                     like(KwmAddress::getDetailAddress, reqVo.getCityName()));
@@ -480,4 +466,20 @@ public class KwmAddressService {
         return addressDetailResVo;
     }
 
+    /**
+     * @desc 根据id及企业id查询未删除的地址信息
+     * @param name
+     * @param entId
+     * @return com.sckw.manage.model.entity.KwmAddress
+     * @author yzc
+     * @date 2024/3/1 10:53
+     */
+    public KwmAddress getByNameAndEntId(String name, Long entId) {
+        LambdaQueryWrapper<KwmAddress> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwmAddress::getName, name)
+                .eq(KwmAddress::getEntId, entId)
+                .eq(KwmAddress::getDelFlag, Global.NO)
+                .last("LIMIT 1");
+        return kwmAddressMapper.selectOne(wrapper);
+    }
 }

+ 4 - 6
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmCooperateApplyService.java

@@ -1,8 +1,5 @@
 package com.sckw.manage.service;
 
-import java.io.IOException;
-import java.util.Date;
-
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
@@ -12,10 +9,12 @@ import com.sckw.core.model.enums.CooperateStatusEnum;
 import com.sckw.core.model.enums.CooperateTypeEnum;
 import com.sckw.core.model.page.PageHelperUtil;
 import com.sckw.core.model.page.PageResult;
-import com.sckw.core.utils.*;
+import com.sckw.core.utils.BeanUtils;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.IdWorker;
+import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
-import com.sckw.excel.utils.EasyExcelUtil;
 import com.sckw.excel.utils.ExcelUtil;
 import com.sckw.manage.dao.KwmCooperateMapper;
 import com.sckw.manage.dao.KwmCooperateTypeMapper;
@@ -24,7 +23,6 @@ import com.sckw.manage.model.dto.res.CooperateManageQueryResDto;
 import com.sckw.manage.model.dto.res.CooperateQueryDto;
 import com.sckw.manage.model.entity.KwmCooperate;
 import com.sckw.manage.model.entity.KwmCooperateType;
-import com.sckw.manage.model.report.AddressQueryExport;
 import com.sckw.manage.model.report.CooperateManageExport;
 import com.sckw.manage.model.vo.req.CooperateApplyQueryReqVo;
 import com.sckw.manage.model.vo.req.CooperateApproveReqVo;

+ 3 - 3
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmCooperateManageService.java

@@ -38,7 +38,7 @@ import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.FindEntUserResDto;
 import com.sckw.system.api.model.dto.res.KwsEnterpriseResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
-import com.sckw.transport.api.dubbo.TransportService;
+import com.sckw.transport.api.dubbo.TransportRemoteService;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -78,7 +78,7 @@ public class KwmCooperateManageService {
     private TradeOrderInfoService tradeOrderInfoService;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
-    private TransportService transportDubboService;
+    private TransportRemoteService transportRemoteService;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private PaymentDubboService paymentDubboService;
@@ -297,7 +297,7 @@ public class KwmCooperateManageService {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.MSG_031);
         }
         //判断是否可以解除-托运和承运
-        HttpResult response = transportDubboService.checkLogisticsOrderIsFinishByEntId(kwmCooperate.getInviteeEntId(), kwmCooperate.getInviterEntId());
+        HttpResult response = transportRemoteService.checkLogisticsOrderIsFinishByEntId(kwmCooperate.getInviteeEntId(), kwmCooperate.getInviterEntId());
         int receivedResult = response.getCode();
         if (!Integer.toString(receivedResult).equals(String.valueOf(HttpStatus.SUCCESS_CODE))) {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.MSG_032);

+ 322 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmLineFreightRateService.java

@@ -0,0 +1,322 @@
+package com.sckw.manage.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sckw.core.exception.BusinessException;
+import com.sckw.core.model.constant.Global;
+import com.sckw.core.model.page.PageResult;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.StringUtils;
+import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.excel.utils.DateUtil;
+import com.sckw.manage.dao.KwmLineFreightRateMapper;
+import com.sckw.manage.model.entity.KwmAddress;
+import com.sckw.manage.model.entity.KwmLineFreightRate;
+import com.sckw.manage.model.vo.req.*;
+import com.sckw.manage.model.vo.res.LineFreightRateDetail;
+import com.sckw.manage.model.vo.res.LineFreightRateExport;
+import com.sckw.manage.model.vo.res.LineFreightRateFindListResVO;
+import com.sckw.manage.model.vo.res.LineFreightRateListResVO;
+import com.sckw.system.api.RemoteSystemService;
+import com.sckw.system.api.model.dto.res.UserCacheResDto;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-01  09:18
+ * @desc: 路径service
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class KwmLineFreightRateService {
+
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private RemoteSystemService remoteSystemService;
+
+    private final KwmLineFreightRateMapper lineFreightRateMapper;
+    private final KwmAddressService addressService;
+
+    /**
+     * @param addLineFreightRateParam
+     * @return void
+     * @desc 新增路径
+     * @author yzc
+     * @date 2024/3/1 11:14
+     */
+    public void add(AddLineFreightRateParam addLineFreightRateParam) {
+        Long entId = LoginUserHolder.getEntId();
+        Long count = countByEntIdAndName(entId, addLineFreightRateParam.getName(), null);
+        if (count > 0) {
+            throw new BusinessException("路径名称已存在,不可重复!");
+        }
+        String loadName = addLineFreightRateParam.getLoadName();
+        String unloadName = addLineFreightRateParam.getUnloadName();
+        if (Objects.equals(loadName, unloadName)) {
+            throw new BusinessException("路径起始结束位置不能相同!");
+        }
+        KwmAddress load = addressService.getByNameAndEntId(loadName, addLineFreightRateParam.getLoadEntId());
+        if (Objects.isNull(load)) {
+            throw new BusinessException("路径起始位置信息不存在!");
+        }
+        KwmAddress unload = addressService.getByNameAndEntId(unloadName, addLineFreightRateParam.getUnloadEntId());
+        if (Objects.isNull(unload)) {
+            throw new BusinessException("路径结束位置信息不存在!");
+        }
+        KwmLineFreightRate freightRate = BeanUtil.copyProperties(addLineFreightRateParam, KwmLineFreightRate.class);
+        freightRate.setEntId(entId).setLoadName(load.getName()).setLoadCityCode(load.getCityCode())
+                .setLoadCityName(load.getCityName()).setLoadDetailAddress(load.getDetailAddress())
+                .setLoadLng(load.getLng()).setLoadLat(load.getLat())
+                .setUnloadName(unload.getName()).setUnloadCityCode(unload.getCityCode())
+                .setUnloadCityName(unload.getCityName()).setUnloadDetailAddress(unload.getDetailAddress())
+                .setUnloadLng(unload.getLng()).setUnloadLat(unload.getLat());
+        lineFreightRateMapper.insert(freightRate);
+    }
+
+    /**
+     * @param param
+     * @return void
+     * @desc 编辑路径
+     * @author yzc
+     * @date 2024/3/1 14:37
+     */
+    public void update(UpdateLineFreightRateParam param) {
+        Long entId = LoginUserHolder.getEntId();
+        KwmLineFreightRate lineFreightRate = getById(param.getId());
+        if (Objects.isNull(lineFreightRate)) {
+            throw new BusinessException("路径信息不存在!");
+        }
+        Long count = countByEntIdAndName(entId, param.getName(), param.getId());
+        if (count > 0) {
+            throw new BusinessException("路径名称已存在,不可重复!");
+        }
+        KwmLineFreightRate freightRate = BeanUtil.copyProperties(param, KwmLineFreightRate.class);
+        String loadName = param.getLoadName();
+        String unloadName = param.getUnloadName();
+        if (Objects.equals(loadName, unloadName)) {
+            throw new BusinessException("路径起始结束位置不能相同!");
+        }
+        if (!Objects.equals(loadName, lineFreightRate.getLoadName())) {
+            KwmAddress load = addressService.getByNameAndEntId(param.getLoadName(), param.getLoadEntId());
+            if (Objects.isNull(load)) {
+                throw new BusinessException("路径起始位置信息不存在!");
+            }
+            freightRate.setLoadName(load.getName()).setLoadCityCode(load.getCityCode())
+                    .setLoadCityName(load.getCityName()).setLoadDetailAddress(load.getDetailAddress())
+                    .setLoadLng(load.getLng()).setLoadLat(load.getLat());
+        }
+        if (!Objects.equals(unloadName, lineFreightRate.getUnloadName())) {
+            KwmAddress unload = addressService.getByNameAndEntId(param.getUnloadName(), param.getUnloadEntId());
+            if (Objects.isNull(unload)) {
+                throw new BusinessException("路径结束位置信息不存在!");
+            }
+            freightRate.setUnloadName(unload.getName()).setUnloadCityCode(unload.getCityCode())
+                    .setUnloadCityName(unload.getCityName()).setUnloadDetailAddress(unload.getDetailAddress())
+                    .setUnloadLng(unload.getLng()).setUnloadLat(unload.getLat());
+        }
+        lineFreightRateMapper.updateById(freightRate);
+    }
+
+    /**
+     * @param id
+     * @return com.sckw.manage.model.vo.res.LineFreightRateDetail
+     * @desc 路径详情
+     * @author yzc
+     * @date 2024/3/1 11:18
+     */
+    public LineFreightRateDetail detail(Long id) {
+        LambdaQueryWrapper<KwmLineFreightRate> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(KwmLineFreightRate::getId, id)
+                .eq(KwmLineFreightRate::getDelFlag, Global.NO)
+                .last("LIMIT 1");
+        KwmLineFreightRate freightRate = lineFreightRateMapper.selectOne(queryWrapper);
+        if (Objects.isNull(freightRate)) {
+            throw new BusinessException("路径信息不存在");
+        }
+        return BeanUtil.copyProperties(freightRate, LineFreightRateDetail.class);
+    }
+
+
+    /**
+     * @param params
+     * @return com.sckw.core.model.page.PageResult
+     * @desc 路径分页列表
+     * @author yzc
+     * @date 2024/3/1 16:27
+     */
+    public PageResult select(SelectLineFreightRateParam params) {
+        LambdaQueryWrapper<KwmLineFreightRate> wrapper = buildWrapper(BeanUtil.copyProperties(params, ExportLineFreightRateParam.class));
+        Page<KwmLineFreightRate> page = new Page<>(params.getPage(), params.getPageSize());
+        Page<KwmLineFreightRate> ipage = lineFreightRateMapper.selectPage(page, wrapper);
+        List<KwmLineFreightRate> list = ipage.getRecords();
+        if (CollectionUtils.isEmpty(list)) {
+            return PageResult.build(params.getPage(), params.getPageSize(), ipage.getTotal(), Collections.emptyList());
+        }
+        List<Long> createByIds = list.stream().map(KwmLineFreightRate::getCreateBy).toList();
+        Map<Long, UserCacheResDto> userMap = remoteSystemService.queryUserCacheMapByIds(createByIds);
+        List<LineFreightRateListResVO> result = new ArrayList<>();
+        list.forEach(e -> {
+            LineFreightRateListResVO vo = BeanUtil.copyProperties(e, LineFreightRateListResVO.class);
+            UserCacheResDto user = userMap.get(e.getCreateBy());
+            vo.setCreateByName(Objects.nonNull(user) ? user.getName() : "");
+            result.add(vo);
+        });
+        return PageResult.build(params.getPage(), params.getPageSize(), ipage.getTotal(), result);
+    }
+
+    /**
+     * @param params
+     * @return java.util.List<com.sckw.manage.model.vo.res.LineFreightRateExport>
+     * @desc 路径导出
+     * @author yzc
+     * @date 2024/3/1 16:40
+     */
+    public List<LineFreightRateExport> export(ExportLineFreightRateParam params) {
+        LambdaQueryWrapper<KwmLineFreightRate> wrapper = buildWrapper(params);
+        List<KwmLineFreightRate> list = lineFreightRateMapper.selectList(wrapper);
+        if (CollectionUtils.isEmpty(list)) {
+            return Collections.emptyList();
+        }
+        List<Long> createByIds = list.stream().map(KwmLineFreightRate::getCreateBy).toList();
+        Map<Long, UserCacheResDto> userMap = remoteSystemService.queryUserCacheMapByIds(createByIds);
+        List<LineFreightRateExport> result = new ArrayList<>();
+        list.forEach(e -> {
+            LineFreightRateExport vo = BeanUtil.copyProperties(e, LineFreightRateExport.class);
+            UserCacheResDto user = userMap.get(e.getCreateBy());
+            vo.setCreateByName(Objects.nonNull(user) ? user.getName() : "")
+                    .setTransportMileage(Objects.isNull(e.getTransportMileage()) ? null : String.valueOf(e.getTransportMileage()))
+                    .setTransportMileage(Objects.isNull(e.getTransportPrice()) ? null : String.valueOf(e.getTransportPrice()))
+                    .setTransportMileage(Objects.isNull(e.getTransportAmount()) ? null : String.valueOf(e.getTransportAmount()))
+                    .setTransportMileage(Objects.isNull(e.getCreateTime()) ? null : String.valueOf(DateUtil.getDateTime(e.getCreateTime())))
+                    .setTransportMileage(Objects.isNull(e.getUpdateTime()) ? null : String.valueOf(DateUtil.getDateTime(e.getUpdateTime())));
+            result.add(vo);
+        });
+        return result;
+    }
+
+    /**
+     * @param params
+     * @return com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.sckw.manage.model.entity.KwmLineFreightRate>
+     * @desc 构建路径查询条件
+     * @author yzc
+     * @date 2024/3/1 16:40
+     */
+    private LambdaQueryWrapper<KwmLineFreightRate> buildWrapper(ExportLineFreightRateParam params) {
+        LambdaQueryWrapper<KwmLineFreightRate> wrapper = new LambdaQueryWrapper<>();
+        if (Objects.nonNull(params.getStartCreateTime())) {
+            wrapper.ge(KwmLineFreightRate::getCreateTime, params.getStartCreateTime());
+        }
+        if (Objects.nonNull(params.getEndCreateTime())) {
+            wrapper.le(KwmLineFreightRate::getCreateTime, params.getEndCreateTime());
+        }
+        if (Objects.nonNull(params.getStartMileage())) {
+            wrapper.ge(KwmLineFreightRate::getTransportMileage, params.getStartMileage());
+        }
+        if (Objects.nonNull(params.getEndMileage())) {
+            wrapper.le(KwmLineFreightRate::getTransportMileage, params.getEndMileage());
+        }
+        String keywords = params.getKeywords();
+        if (StringUtils.isNotBlank(keywords)) {
+            wrapper.and(e -> e.like(KwmLineFreightRate::getName, keywords)
+                    .or().like(KwmLineFreightRate::getLoadName, keywords)
+                    .or().like(KwmLineFreightRate::getUnloadName, keywords));
+        }
+        wrapper.eq(KwmLineFreightRate::getEntId, LoginUserHolder.getEntId())
+                .eq(KwmLineFreightRate::getDelFlag, Global.NO)
+                .orderByDesc(KwmLineFreightRate::getCreateTime);
+        return wrapper;
+    }
+
+    /**
+     * @param ids
+     * @return void
+     * @desc 批量删除
+     * @author yzc
+     * @date 2024/3/1 16:41
+     */
+    public void batchDelete(List<Long> ids) {
+        //todo 关联托运、承运订单不可删除
+        LambdaQueryWrapper<KwmLineFreightRate> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(KwmLineFreightRate::getId, ids)
+                .eq(KwmLineFreightRate::getEntId, LoginUserHolder.getEntId())
+                .eq(KwmLineFreightRate::getDelFlag, Global.NO);
+        List<KwmLineFreightRate> list = lineFreightRateMapper.selectList(wrapper);
+        if (!Objects.equals(ids.size(), list.size())) {
+            throw new BusinessException("删除数据与数据库数据不一致");
+        }
+        LambdaUpdateWrapper<KwmLineFreightRate> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(KwmLineFreightRate::getDelFlag, Global.YES).in(KwmLineFreightRate::getId, ids);
+        lineFreightRateMapper.update(null, updateWrapper);
+    }
+
+    /**
+     * @param entId
+     * @param name
+     * @param id
+     * @return java.lang.Long
+     * @desc 根据企业ID和路径名称统计
+     * @author yzc
+     * @date 2024/3/1 14:50
+     */
+    public Long countByEntIdAndName(Long entId, String name, Long id) {
+        LambdaQueryWrapper<KwmLineFreightRate> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(KwmLineFreightRate::getEntId, entId)
+                .ne(Objects.nonNull(id), KwmLineFreightRate::getId, id)
+                .eq(KwmLineFreightRate::getName, name)
+                .eq(KwmLineFreightRate::getDelFlag, Global.NO);
+        return lineFreightRateMapper.selectCount(queryWrapper);
+    }
+
+    /**
+     * @param id
+     * @return com.sckw.manage.model.entity.KwmLineFreightRate
+     * @desc 根据id查询路径信息
+     * @author yzc
+     * @date 2024/3/1 16:41
+     */
+    public KwmLineFreightRate getById(Long id) {
+        LambdaQueryWrapper<KwmLineFreightRate> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(KwmLineFreightRate::getId, id)
+                .eq(KwmLineFreightRate::getDelFlag, Global.NO);
+        return lineFreightRateMapper.selectOne(queryWrapper);
+    }
+
+    /**
+     * @param params
+     * @return java.util.List<com.sckw.manage.model.vo.res.LineFreightRateFindListResVO>
+     * @desc 路径下拉列表查询
+     * @author yzc
+     * @date 2024/3/4 10:15
+     */
+    public List<LineFreightRateFindListResVO> findList(LineFreightRateFindListParam params) {
+        LambdaQueryWrapper<KwmLineFreightRate> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(KwmLineFreightRate::getEntId, LoginUserHolder.getEntId())
+                .eq(KwmLineFreightRate::getDelFlag, Global.NO)
+                .like(StringUtils.isNotBlank(params.getName()), KwmLineFreightRate::getName, params.getName());
+        List<KwmLineFreightRate> list = lineFreightRateMapper.selectList(queryWrapper);
+        return BeanUtil.copyToList(list, LineFreightRateFindListResVO.class);
+    }
+
+    /**
+     * @param param
+     * @return java.util.List<com.sckw.manage.model.vo.res.LineFreightRateListResVO>
+     * @desc 物流订单路径选择查询
+     * @author yzc
+     * @date 2024/3/13 16:11
+     */
+    public List<LineFreightRateListResVO> choose(ChooseLineFreightRateParam param) {
+        LambdaQueryWrapper<KwmLineFreightRate> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(KwmLineFreightRate::getLoadName, param.getLoadNames())
+                .in(KwmLineFreightRate::getUnloadName, param.getUnloadNames())
+                .eq(KwmLineFreightRate::getDelFlag, Global.NO);
+        List<KwmLineFreightRate> list = lineFreightRateMapper.selectList(wrapper);
+        return BeanUtil.copyToList(list, LineFreightRateListResVO.class);
+    }
+}

+ 88 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwoTradeOrderController.java

@@ -1,15 +1,22 @@
 package com.sckw.order.controller;
 
 import com.sckw.core.annotation.RepeatSubmit;
+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.HttpResult;
+import com.sckw.excel.utils.ExcelUtil;
 import com.sckw.order.model.vo.req.*;
 import com.sckw.order.serivce.KwoTradeOrderService;
 import io.seata.spring.annotation.GlobalTransactional;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * @desc: 贸易订单相关
  * @author: yzc
@@ -203,4 +210,85 @@ public class KwoTradeOrderController {
         return HttpResult.ok(kwoTradeOrderService.goodsUnit(id));
     }
 
+
+    @GetMapping("/getAddressInfo")
+    public HttpResult getAddressInfo(@RequestParam Long id) {
+        return HttpResult.ok("贸易订单地址信息查询成功", kwoTradeOrderService.getAddressInfo(id));
+    }
+
+    /**
+     * @desc: 贸易订单列表分页查询
+     * @author: yzc
+     * @date: 2023-07-17 10:29
+     * @Param params:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @PostMapping(value = "/tradeOrderSelect", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult select(@RequestBody @Validated TradeOrderListSelectParam params) {
+        return HttpResult.ok(kwoTradeOrderService.tradeOrderSelect(params));
+    }
+
+    /**
+     * @desc: 贸易订单列表统计查询
+     * @author: yzc
+     * @date: 2023-07-17 10:29
+     * @Param params:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @PostMapping(value = "/tradeOrderStatistic", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult statistic(@RequestBody @Validated TradeOrderListStatisticParam params) {
+        return HttpResult.ok(kwoTradeOrderService.tradeOrderStatistic(params));
+    }
+
+    /**
+     * @desc: app主界面贸易订单统计
+     * @author: yzc
+     * @date: 2023-08-21 17:38
+     * @Param params:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @PostMapping(value = "/tradeOrderAppStatistic", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult appStatistic(@RequestBody @Validated TradeOrderAppStatisticParam params) {
+        return HttpResult.ok(kwoTradeOrderService.appStatistic(params));
+    }
+
+    /**
+     * @desc: 贸易订单列表导出
+     * @author: yzc
+     * @date: 2023-07-17 10:29
+     * @Param params:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @PostMapping(value = "/tradeOrderExport", produces = MediaType.APPLICATION_JSON_VALUE)
+    public void export(@RequestBody @Validated TradeOrderListExportParam params, HttpServletResponse response) {
+        List<TradeOrderListExport> list = kwoTradeOrderService.export(params);
+        if (CollectionUtils.isEmpty(list)) {
+            throw new CustomPromptException(HttpStatus.SUCCESS_CODE, "暂无数据,请确认");
+        }
+        ExcelUtil.downData(response, TradeOrderListExport.class, list);
+    }
+
+    /**
+     * @desc: 贸易订单对账单分页列表查询
+     * @author: yzc
+     * @date: 2023-07-20 15:03
+     * @Param params:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @PostMapping(value = "/tradeOrderStatementList", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult tradeOrderStatementList(@RequestBody @Validated TradeOrderStatementList params) {
+        return HttpResult.ok(kwoTradeOrderService.tradeOrderStatementList(params));
+    }
+
+    /**
+     * @desc: 合同关联订单列表
+     * @author: yzc
+     * @date: 2023-07-27 16:48
+     * @Param params:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @PostMapping(value = "/tradeOrderContractList", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult tradeOrderContractList(@RequestBody @Validated TradeOrderContractParam params) {
+        return HttpResult.ok(kwoTradeOrderService.tradeOrderContractList(params));
+    }
 }

+ 18 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/dao/KwoTradeOrderAmountMapper.java

@@ -0,0 +1,18 @@
+package com.sckw.order.dao;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.order.model.KwoTradeOrderAmount;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @desc: 交易订单装卸货地址委派及交付量信息mapper
+ * @author: yzc
+ * @date: 2024-03-04 14:18
+ */
+@Mapper
+public interface KwoTradeOrderAmountMapper extends BaseMapper<KwoTradeOrderAmount> {
+
+
+
+}

+ 82 - 2
sckw-modules/sckw-order/src/main/java/com/sckw/order/dao/KwoTradeOrderMapper.java

@@ -1,10 +1,11 @@
 package com.sckw.order.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.core.model.vo.TableTop;
 import com.sckw.order.api.model.TradeOrderCountStatisticsDTO;
 import com.sckw.order.model.KwoTradeOrder;
-import com.sckw.order.model.dto.WbTOrderExcelStsReqDTO;
-import com.sckw.order.model.dto.WbTOrderExcelStsResDTO;
+import com.sckw.order.model.dto.*;
+import com.sckw.order.model.vo.res.TradeOrderAppStatisticVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -45,4 +46,83 @@ public interface KwoTradeOrderMapper extends BaseMapper<KwoTradeOrder> {
      * @return: java.util.List<com.sckw.order.model.dto.WbTOrderExcelStsResDTO>
      */
     List<WbTOrderExcelStsResDTO> workbenchExcel(@Param("item") WbTOrderExcelStsReqDTO item);
+
+    /**
+     * @param query
+     * @param goodIds
+     * @param authUserIds
+     * @return java.util.List<com.sckw.order.model.dto.OrderListResDTO>
+     * @desc 贸易订单列表查询
+     * @author yzc
+     * @date 2024/3/6 15:50
+     */
+    List<OrderListResDTO> tradeOrderSelect(@Param("query") TradeOrderListSelectDTO query,
+                                           @Param("goodIds") List<Long> goodIds,
+                                           @Param("authUserIds") List<Long> authUserIds);
+
+
+    /***
+     * @desc 贸易订单列表统计查询
+     * @param query
+     * @param goodIds
+     * @param authUserIds
+     * @return java.util.List<com.sckw.core.model.vo.TableTop>
+     * @author yzc
+     * @date 2024/3/14 14:34
+     */
+    List<TableTop> tradeOrderStatistic(@Param("query") TradeOrderListSelectDTO query,
+                                       @Param("goodIds") List<Long> goodIds,
+                                       @Param("authUserIds") List<Long> authUserIds);
+
+    /**
+     * @param query
+     * @param statuses
+     * @param authUserIds
+     * @return java.util.List<com.sckw.order.model.vo.res.TradeOrderAppStatisticVO>
+     * @desc app主界面贸易订单统计
+     * @author yzc
+     * @date 2024/3/15 14:24
+     */
+    List<TradeOrderAppStatisticVO> appStatistic(@Param("query") TradeOrderAppStatisticParamDTO query,
+                                                @Param("statuses") List<Integer> statuses,
+                                                @Param("authUserIds") List<Long> authUserIds);
+
+    /**
+     * @param query
+     * @param goodIds
+     * @param authUserIds
+     * @param ids
+     * @return java.util.List<com.sckw.order.model.dto.OrderListResDTO>
+     * @desc 贸易订单列表导出
+     * @author yzc
+     * @date 2024/3/15 14:24
+     */
+    List<OrderListResDTO> tradeOrderExport(@Param("query") TradeOrderListSelectDTO query,
+                                           @Param("goodIds") List<Long> goodIds,
+                                           @Param("authUserIds") List<Long> authUserIds,
+                                           @Param("ids") List<Long> ids);
+
+    /**
+     * @param query
+     * @param goodsIds
+     * @param excludeIds
+     * @return java.util.List<com.sckw.order.model.dto.OrderListResDTO>
+     * @desc 贸易订单对账单分页列表查询
+     * @author yzc
+     * @date 2024/3/15 14:24
+     */
+    List<OrderListResDTO> tradeOrderStatementList(@Param("query") TradeOrderStatementListParamDTO query,
+                                                  @Param("goodsIds") List<Long> goodsIds,
+                                                  @Param("excludeIds") List<Long> excludeIds);
+
+    /**
+     * @param query
+     * @param contractIds
+     * @return java.util.List<com.sckw.order.model.dto.OrderListResDTO>
+     * @desc 合同关联订单列表
+     * @author yzc
+     * @date 2024/3/15 14:24
+     */
+    List<OrderListResDTO> tradeOrderContractList(@Param("query") TradeOrderContractParamDTO query,
+                                                 @Param("contractIds") List<Long> contractIds);
 }

+ 148 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/RemoteTradeOrderAmountServiceImpl.java

@@ -0,0 +1,148 @@
+package com.sckw.order.dubbo;
+
+import cn.hutool.core.collection.CollUtil;
+import com.sckw.core.utils.StringUtils;
+import com.sckw.core.web.response.HttpResult;
+import com.sckw.order.api.dubbo.RemoteTradeOrderAmountService;
+import com.sckw.order.api.model.AddressActualAmountParam;
+import com.sckw.order.api.model.UpdateAddressActualAmountParam;
+import com.sckw.order.api.model.UpdateAddressEntrustAmountParam;
+import com.sckw.order.enums.DeliveryTypeEnum;
+import com.sckw.order.enums.OrderAddressTypeEnum;
+import com.sckw.order.enums.OrderStatusEnum;
+import com.sckw.order.model.KwoTradeOrder;
+import com.sckw.order.model.KwoTradeOrderAmount;
+import com.sckw.order.serivce.KwoTradeOrderAddressService;
+import com.sckw.order.serivce.KwoTradeOrderAmountService;
+import com.sckw.order.serivce.KwoTradeOrderService;
+import com.sckw.redis.constant.RedisConstant;
+import com.sckw.redis.utils.RedissonUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-12  16:23
+ * @desc: 贸易订单地址分配量信息相关dubbo实现
+ */
+@DubboService(group = "design", version = "1.0.0")
+@Slf4j
+@RequiredArgsConstructor
+public class RemoteTradeOrderAmountServiceImpl implements RemoteTradeOrderAmountService {
+
+    private final KwoTradeOrderService tradeOrderService;
+    private final KwoTradeOrderAmountService tradeOrderAmountService;
+    private final KwoTradeOrderAddressService tradeOrderAddressService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult updateAddressEntrustAmount(UpdateAddressEntrustAmountParam param) {
+        Long tOrderId = param.getTOrderId();
+        if (Objects.isNull(tOrderId)) {
+            return HttpResult.error("贸易订单id不能为空!");
+        }
+        Long tAddressId = param.getTAddressId();
+        if (Objects.isNull(tAddressId)) {
+            return HttpResult.error("贸易订单地址id不能为空!");
+        }
+        BigDecimal entrustAmount = param.getEntrustAmount();
+        Long updateBy = param.getUpdateBy();
+        String updateByName = param.getUpdateByName();
+        if (Objects.isNull(updateBy) || StringUtils.isBlank(updateByName)) {
+            return HttpResult.error("操作人信息不能为空!");
+        }
+        if (Objects.isNull(entrustAmount)) {
+            return HttpResult.error("任务量不能为空!");
+        }
+        String lockKey = String.format(RedisConstant.TORDER_ADDRESS_UPDATE_ENTRUST_AMOUNT, tAddressId);
+        if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 5L, 10L))) {
+            return HttpResult.error("业务繁忙,请稍后再试!");
+        }
+        try {
+            KwoTradeOrder order = tradeOrderService.getById(tOrderId);
+            if (Objects.isNull(order)) {
+                return HttpResult.error("订单不存在!");
+            }
+            if (!Objects.equals(order.getStatus(), OrderStatusEnum.EXECUTING.getCode())) {
+                return HttpResult.error("执行中的订单才可物流托运!");
+            }
+            KwoTradeOrderAmount orderAmount = tradeOrderAmountService.getByOrderIdAndTaddressId(tOrderId, tAddressId);
+            if (Objects.isNull(orderAmount)) {
+                return HttpResult.error("地址下分配量信息不存在!");
+            }
+            BigDecimal totalEntrustAmount = Objects.isNull(order.getEntrustAmount()) ?
+                    entrustAmount : entrustAmount.add(order.getEntrustAmount());
+            orderAmount.setEntrustAmount(totalEntrustAmount).setUpdateBy(param.getUpdateBy());
+            tradeOrderAmountService.updateById(orderAmount);
+            //更新mongodb??
+        } finally {
+            RedissonUtils.unlock(lockKey);
+        }
+        return HttpResult.ok();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult updateAddressActualAmount(UpdateAddressActualAmountParam param) {
+        Long tOrderId = param.getTOrderId();
+        if (Objects.isNull(tOrderId)) {
+            return HttpResult.error("贸易订单id不能为空!");
+        }
+        List<AddressActualAmountParam> addressActualAmountParams = param.getAddressActualAmountParams();
+        if (CollUtil.isEmpty(addressActualAmountParams) || addressActualAmountParams.size() != 2) {
+            return HttpResult.error("地址实际成交量参数有误!");
+        }
+        Map<Long, BigDecimal> map = addressActualAmountParams.stream().collect(Collectors.toMap
+                (AddressActualAmountParam::getTAddressId, AddressActualAmountParam::getActualAmount, (k1, k2) -> k1));
+        if (map.size() != 2) {
+            return HttpResult.error("地址实际成交量参数有误!");
+        }
+        Long updateBy = param.getUpdateBy();
+        String updateByName = param.getUpdateByName();
+        if (Objects.isNull(updateBy) || StringUtils.isBlank(updateByName)) {
+            return HttpResult.error("操作人信息不能为空!");
+        }
+        KwoTradeOrder order = tradeOrderService.getById(tOrderId);
+        if (Objects.isNull(order)) {
+            return HttpResult.error("订单不存在!");
+        }
+        if (!Objects.equals(order.getStatus(), OrderStatusEnum.EXECUTING.getCode())) {
+            return HttpResult.error("执行中的订单才可物流托运!");
+        }
+        Map<String, Long> addressTypeMap = tradeOrderAddressService.getByIdsAndTOrderId(map.keySet(), tOrderId);
+        String addressType = Objects.equals(order.getDeliveryType(), DeliveryTypeEnum.ISSUE.getType()) ? OrderAddressTypeEnum.LOAD.getType() : OrderAddressTypeEnum.UNLOAD.getType();
+        Long addressId = addressTypeMap.get(addressType);
+        if (Objects.isNull(addressId)) {
+            return HttpResult.error("未查询到订单交付类型对应的地址实际成交量参数!");
+        }
+        BigDecimal actualAmount = map.get(addressId);
+        if (Objects.isNull(actualAmount)) {
+            return HttpResult.error("地址实际成交量不能为空!");
+        }
+        KwoTradeOrderAmount orderAmount = tradeOrderAmountService.getByOrderIdAndTaddressId(tOrderId, addressId);
+        if (Objects.isNull(orderAmount)) {
+            return HttpResult.error("地址下分配量信息不存在!");
+        }
+        String lockKey = String.format(RedisConstant.TORDER_ADDRESS_UPDATE_ACTUAL_AMOUNT, addressId);
+        if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 5L, 10L))) {
+            return HttpResult.error("业务繁忙,请稍后再试!");
+        }
+        try {
+            orderAmount.setActualAmount(Objects.isNull(orderAmount.getActualAmount()) ? actualAmount : orderAmount.getActualAmount().add(actualAmount))
+                    .setUpdateBy(param.getUpdateBy());
+            tradeOrderAmountService.updateById(orderAmount);
+            //更新mongodb??
+        } finally {
+            RedissonUtils.unlock(lockKey);
+        }
+        return HttpResult.ok();
+    }
+}

+ 15 - 7
sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson2.JSON;
 import com.google.common.collect.Lists;
 import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.constant.NumberConstant;
+import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.response.HttpResult;
@@ -18,6 +19,7 @@ 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.vo.res.AddressInfoDetailRes;
 import com.sckw.order.serivce.*;
 import com.sckw.redis.constant.RedisConstant;
 import com.sckw.redis.utils.RedissonUtils;
@@ -47,6 +49,8 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
     @Autowired
     private KwoTradeOrderService kwoTradeOrderService;
     @Autowired
+    private KwoTradeOrderAddressService tradeOrderAddressService;
+    @Autowired
     private StreamBridge streamBridge;
     @Autowired
     private KwoTradeOrderTrackService kwoTradeOrderTrackService;
@@ -69,6 +73,17 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
         return order;
     }
 
+    @Override
+    public OrderAddressDetailRes getOrderDetailByTradeOrderIdAndAddressId(Long tOrderId, Long tAddressId) {
+        //地址信息
+        AddressInfoDetailRes addressInfoDetailRes = tradeOrderAddressService.getByOrderIdAndAddressId(tOrderId, tAddressId);
+        OrderAddressDetailRes orderAddressDetailRes = new OrderAddressDetailRes();
+        if (addressInfoDetailRes != null) {
+            BeanUtils.copyProperties(addressInfoDetailRes, orderAddressDetailRes);
+        }
+        return orderAddressDetailRes;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateOrderStatus(UpdateOrderStatusParam param) {
@@ -184,14 +199,7 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
             for (GoodsLoadingParam goodsLoading : loading) {
                 //差值
                 BigDecimal differenceAmount = goodsLoading.getLoadAmount().subtract(goodsLoading.getAmount());
-//                BigDecimal totalEntrustAmount = Objects.isNull(order.getEntrustAmount()) ? differenceAmount : differenceAmount.add(order.getEntrustAmount());
                 BigDecimal totalEntrustAmount = NumberConstant.ZERO_TWO.compareTo(order.getEntrustAmount()) == 0 ? differenceAmount : differenceAmount.add(order.getEntrustAmount());
-//                BigDecimal totalEntrustAmount = new BigDecimal("0.00");
-//                if (NumberConstant.ZERO_TWO.compareTo(order.getEntrustAmount()) == 0) {
-//                    totalEntrustAmount = differenceAmount;
-//                } else {
-//                    totalEntrustAmount = differenceAmount.add(order.getEntrustAmount());
-//                }
                 if (goodsLoading.getUnit().equals(order.getUnit())) {
                     order.setEntrustAmount(totalEntrustAmount).setUpdateBy(updateBy);
                     kwoTradeOrderService.updateById(order);

+ 10 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/enums/OrderStatusEnum.java

@@ -3,6 +3,11 @@ package com.sckw.order.enums;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * @desc: 订单状态枚举
  * @author: yzc
@@ -36,4 +41,9 @@ public enum OrderStatusEnum {
         return null;
     }
 
+    public static List<OrderStatusEnum> getSortList() {
+        OrderStatusEnum[] enums = OrderStatusEnum.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(OrderStatusEnum::getCode)).collect(Collectors.toList());
+    }
+
 }

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

@@ -3,6 +3,7 @@ package com.sckw.order.model;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.sckw.core.model.base.BaseModel;
+import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
@@ -20,6 +21,7 @@ import java.io.Serializable;
 @Setter
 @ToString
 @Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
 @TableName("kwo_trade_order_address")
 public class KwoTradeOrderAddress extends BaseModel implements Serializable {
 
@@ -93,4 +95,9 @@ public class KwoTradeOrderAddress extends BaseModel implements Serializable {
      */
     private String fence;
 
+    /**
+     * 排序(升序)
+     */
+    private Integer sort;
+
 }

+ 60 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrderAmount.java

@@ -0,0 +1,60 @@
+package com.sckw.order.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.sckw.core.model.base.BaseModel;
+import lombok.EqualsAndHashCode;
+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;
+
+/**
+ * @desc: 交易订单装卸货地址委派及交付量信息
+ * @author: yzc
+ * @date: 2024-03-04 9:31
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@TableName("kwo_trade_order_amount")
+public class KwoTradeOrderAmount extends BaseModel implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -8603636665614208263L;
+
+    /**
+     * 交易订单id
+     */
+    @JsonProperty("tOrderId")
+    private Long tOrderId;
+
+    /**
+     * 地址id
+     */
+    @JsonProperty("tAddressId")
+    private Long tAddressId;
+
+    /**
+     * 货物数量
+     */
+    private BigDecimal amount;
+
+    /**
+     * 已委托量
+     */
+    private BigDecimal entrustAmount;
+
+    /**
+     * 实际交付量
+     */
+    private BigDecimal actualAmount;
+
+
+}

+ 23 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/LoadAddressDTO.java

@@ -0,0 +1,23 @@
+package com.sckw.order.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-14  09:32
+ * @desc: 装货地址信息dto
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class LoadAddressDTO {
+
+    private Long loadAddressId;
+    private String loadName;
+    private String loadCityName;
+    private String loadDetailAddress;
+}

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

@@ -0,0 +1,155 @@
+package com.sckw.order.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @desc: 订单列表响应参数
+ * @author: yzc
+ * @date: 2023-07-12 17:45
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class OrderListResDTO {
+
+    /**
+     * 订单id
+     */
+    @JsonProperty("tOrderId")
+    private Long tOrderId;
+    /**
+     * 订单状态
+     */
+    private Integer status;
+    /**
+     * 订单编号
+     */
+    @JsonProperty("tOrderNo")
+    private String tOrderNo;
+    /**
+     * 采购企业主键ID
+     */
+    private Long procureEntId;
+
+    /**
+     * 采购单位
+     */
+    private String procureFirmName;
+
+    /**
+     * 销售单位主键ID
+     */
+    private Long supplyEntId;
+    /**
+     * 销售单位
+     */
+    private String supplyFirmName;
+    /**
+     * 交易方式(预付款、货到付款)
+     */
+    private String trading;
+
+    /**
+     * 交付类型(签发交付、签收交付)
+     */
+    private String deliveryType;
+
+    /**
+     * 提货方式(采方自提、供应配送)
+     */
+    private String pickupType;
+
+    /**
+     * 下单方式(自主下单/代客下单)
+     */
+    private String source;
+
+    /**
+     * 合同主键
+     */
+    private Long contractId;
+
+    /**
+     * 合同编号
+     */
+    private String contractNo;
+
+    /**
+     * 商品id
+     */
+    private Long goodsId;
+
+    /**
+     * 订单成交单价
+     */
+    private BigDecimal unitPrice;
+    /**
+     * 订单金额
+     */
+    private BigDecimal price;
+
+    /**
+     * 订单总量
+     */
+    private BigDecimal amount;
+    /**
+     * 已委托量
+     */
+    private BigDecimal entrustAmount;
+
+    /**
+     * 实际交付量
+     */
+    private BigDecimal actualAmount;
+
+    /**
+     * 计划开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate startTime;
+    /**
+     * 计划结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate endTime;
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 单位
+     */
+    private String unit;
+
+    /**
+     * 创建人id
+     */
+    private Long createBy;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 装货地址信息
+     */
+    private List<LoadAddressDTO> loadAddresses;
+
+    /**
+     * 卸货地址信息
+     */
+    private List<UnloadAddressDTO> unloadAddresses;
+}

+ 35 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/TradeOrderAppStatisticParamDTO.java

@@ -0,0 +1,35 @@
+package com.sckw.order.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-15  08:57
+ * @desc: app主界面贸易订单统计请求参数DTO
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class TradeOrderAppStatisticParamDTO {
+
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 订单类型(1采购订单、2销售订单)
+     */
+    private Integer orderType;
+
+    /**
+     * 是否主账号(0是/1否)
+     */
+    private Integer isMain;
+
+
+}

+ 25 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/TradeOrderContractParamDTO.java

@@ -0,0 +1,25 @@
+package com.sckw.order.model.dto;
+
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @desc: 合同关联订单列表请求参数dto
+ * @author: yzc
+ * @date: 2023-07-27 16:48
+ */
+@Getter
+@Setter
+@ToString
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class TradeOrderContractParamDTO {
+
+    private Long entId;
+
+    private Integer orderType;
+
+}

+ 95 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/TradeOrderListSelectDTO.java

@@ -0,0 +1,95 @@
+package com.sckw.order.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-06  15:14
+ * @desc: 贸易订单列表查询dto对象
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class TradeOrderListSelectDTO {
+
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 是否主账号(0是/1否)
+     */
+    private Integer isMain;
+
+    /**
+     * 订单类型(1采购订单、2销售订单)
+     */
+    private Integer orderType;
+    /**
+     * 订单编号、单位、商品名称(模糊匹配共用)
+     */
+    private String keywords;
+
+    /**
+     * 商品名称(模糊匹配查出的商品id)
+     */
+    private List<Long> goodIds;
+
+    /**
+     * 创建时间开始(yyyy-MM-dd HH:mm:ss)
+     */
+    private Date startCreateTime;
+
+    /**
+     * 创建时间结束(yyyy-MM-dd HH:mm:ss)
+     */
+    private Date endCreateTime;
+
+    /**
+     * 装货地址code
+     */
+    private String loadAddressCode;
+
+    /**
+     * 卸货地址code
+     */
+    private String unloadAddressCode;
+
+    /**
+     * 交易方式(预付款、货到付款)
+     */
+    private String trading;
+
+    /**
+     * 提货方式(采方自提、供应配送)
+     */
+    private String pickupType;
+
+    /**
+     * 交付类型(签发交付、签收交付)
+     */
+    private String deliveryType;
+
+    /**
+     * 下单方式(1采购下单/2代客下单)
+     */
+    private String source;
+
+    /**
+     * 订单状态
+     */
+    private Integer status;
+}

+ 55 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/TradeOrderStatementListParamDTO.java

@@ -0,0 +1,55 @@
+package com.sckw.order.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDate;
+
+/**
+ * @desc: 贸易订单对账单列表请求参数DTO
+ * @author: yzc
+ * @date: 2023-07-20 14:43
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+public class TradeOrderStatementListParamDTO {
+
+    /**
+     * 订单类型(1采购订单2销售订单)
+     */
+    private Integer orderType;
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 采购单位id
+     */
+    private Long procureEntId;
+
+    /**
+     * 计划开始时间(yyyy-MM-dd)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate startTime;
+
+    /**
+     * 计划结束时间(yyyy-MM-dd)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate endTime;
+
+    /**
+     * 交易方式(预付款、货到付款)
+     */
+    private String trading;
+
+}

+ 24 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/UnloadAddressDTO.java

@@ -0,0 +1,24 @@
+package com.sckw.order.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-14  09:32
+ * @desc: 卸货地址信息dto
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class UnloadAddressDTO {
+
+    private Long unloadAddressId;
+    private String unloadName;
+    private String unloadCityName;
+    private String unloadDetailAddress;
+
+}

+ 13 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/AcceptanceOrderParam.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import jakarta.validation.Valid;
 import jakarta.validation.constraints.DecimalMin;
 import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.Getter;
 import lombok.Setter;
@@ -11,6 +12,7 @@ import lombok.ToString;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.util.List;
 
 /**
  * @desc: 受理订单请求参数
@@ -54,6 +56,17 @@ public class AcceptanceOrderParam {
     @NotBlank(message = "交付类型不能为空")
     private String deliveryType;
 
+    @NotNull(message = "我方联系人信息不能为空")
+    private UpdateUnitParam saleUnitParam;
+
+    @NotEmpty(message = "卸货信息不能为空")
+    @Valid
+    private List<UpdateAddressAmountParam> addressAmountParams;
+
+    @NotEmpty(message = "装货信息不能为空")
+    @Valid
+    private List<AddressInfo> addressInfo;
+
     @NotNull(message = "合同信息不能为空")
     @Valid
     private ContractInfo contractInfo;

+ 17 - 2
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/AddressInfo.java

@@ -1,5 +1,6 @@
 package com.sckw.order.model.vo.req;
 
+import jakarta.validation.constraints.DecimalMin;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Pattern;
@@ -8,6 +9,8 @@ import lombok.Setter;
 import lombok.ToString;
 import org.hibernate.validator.constraints.Range;
 
+import java.math.BigDecimal;
+
 /**
  * @desc: 地址信息
  * @author: yzc
@@ -21,7 +24,7 @@ public class AddressInfo {
     /**
      * 地址类型(1装货地址、2卸货地址)
      */
-    @NotNull(message = "地址类型不能为空")
+    @NotBlank(message = "地址类型不能为空")
     @Range(min = 1, max = 2, message ="非法地址类型")
     private String addressType;
 
@@ -34,7 +37,7 @@ public class AddressInfo {
     /**
      * 地址类型
      */
-    @NotNull(message = "地址类型不能为空")
+    @NotBlank(message = "地址类型不能为空")
     private String type;
 
     /**
@@ -84,4 +87,16 @@ public class AddressInfo {
      * 电子围栏
      */
     private String fence;
+
+    /**
+     * 货物数量
+     */
+    @NotNull(message = "货物数量不能为空")
+    @DecimalMin(value = "0.00",message = "分配量必须大于零")
+    private BigDecimal amount;
+
+    /**
+     * 地址排序
+     */
+    private Integer sort;
 }

+ 3 - 3
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/PurchaseOrderDraftParam.java

@@ -2,7 +2,7 @@ package com.sckw.order.model.vo.req;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.sckw.core.model.constant.NumberConstant;
-import jakarta.validation.constraints.*;
+import jakarta.validation.constraints.Size;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
@@ -21,10 +21,11 @@ import java.util.List;
 @Setter
 @ToString
 public class PurchaseOrderDraftParam {
-    public PurchaseOrderDraftParam(){
+    public PurchaseOrderDraftParam() {
         this.amount = NumberConstant.ZERO_TWO;
         this.price = NumberConstant.ZERO_TWO;
     }
+
     /**
      * 商品信息
      */
@@ -47,7 +48,6 @@ public class PurchaseOrderDraftParam {
     /**
      * 地址信息
      */
-    @Size(max = 2, message = "地址信息最多有两条")
     private List<AddressInfo> addressInfo;
     /**
      * 开始时间

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

@@ -53,7 +53,6 @@ public class PurchaseOrderParam {
      * 地址信息
      */
     @NotEmpty(message = "地址信息不能为空")
-    @Size(min = 2, max = 2, message = "装货或卸货地址信息缺失")
     @Valid
     private List<AddressInfo> addressInfo;
     /**

+ 25 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderAppStatisticParam.java

@@ -0,0 +1,25 @@
+package com.sckw.order.model.vo.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Range;
+
+/**
+ * @desc: 贸易订单app统计
+ * @author: yzc
+ * @date: 2023-08-21 17:21
+ */
+@Getter
+@Setter
+@ToString
+public class TradeOrderAppStatisticParam {
+
+    /**
+     * 订单类型(2销售订单、1采购订单)
+     */
+    @Range(min = 1, max = 2, message = "非法订单类型")
+    @NotNull(message = "订单类型不能为空")
+    private Integer orderType;
+}

+ 30 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderContractParam.java

@@ -0,0 +1,30 @@
+package com.sckw.order.model.vo.req;
+
+import com.sckw.core.model.page.PageRequest;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Range;
+
+/**
+ * @desc: 合同关联订单列表请求参数
+ * @author: yzc
+ * @date: 2023-07-27 16:48
+ */
+@Getter
+@Setter
+@ToString
+@EqualsAndHashCode(callSuper = false)
+public class TradeOrderContractParam extends PageRequest {
+
+    @NotBlank(message = "合同ids不能为空")
+    private String contractIds;
+
+    @Range(min = 1, max = 2, message = "非法订单类型")
+    @NotNull(message = "订单类型不能为空")
+    private Integer orderType;
+
+}

+ 110 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListExport.java

@@ -0,0 +1,110 @@
+package com.sckw.order.model.vo.req;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.sckw.excel.annotation.ExcelContext;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @desc: 交易列表信息导出对象
+ * @author: yzc
+ * @date: 2023-07-17 10:36
+ */
+@Data
+@Accessors(chain = true)
+@ExcelContext(fileName = "交易列表信息", sheetName = "交易列表信息")
+public class TradeOrderListExport implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -5895230502149598364L;
+
+    @ExcelProperty(value = "状态" )
+    private String status;
+
+    @ExcelProperty(value = "订单编号" )
+    private String tOrderNo;
+
+    @ExcelProperty(value = "采购单位")
+    private String procureFirmName;
+
+    @ExcelProperty(value = "销售单位")
+    private String supplyFirmName;
+
+    @ExcelProperty(value = "商品名称")
+    private String goodsName;
+
+    @ExcelProperty(value = "规格")
+    private String goodsSpec;
+
+    @ExcelProperty(value = "单价/元")
+    private String unitPrice;
+
+    @ExcelProperty(value = "订单总量")
+    private String amount;
+
+    @ExcelProperty(value = "订单金额")
+    private String price;
+
+    @ExcelProperty(value = "税率/%")
+    private String goodsTaxRate;
+
+    @ExcelProperty(value = "已分配运输量")
+    private String entrustAmount;
+
+    @ExcelProperty(value = "已履约量")
+    private String actualAmount;
+
+    @ExcelProperty(value = "待分配运输量")
+    private String waitEntrustAmount;
+
+    @ExcelProperty(value = "提货方式" )
+    private String pickupType;
+
+    @ExcelProperty(value = "交付类型" )
+    private String deliveryType;
+
+    @ExcelProperty(value = "下单方式" )
+    private String source;
+
+    @ExcelProperty(value = "支付方式")
+    private String trading;
+
+    @ExcelProperty(value = "装货地址名称")
+    private String loadName;
+
+    @ExcelProperty(value = "地址明细")
+    private String loadDetailAddressInfo;
+
+    @ExcelProperty(value = "卸货地址名称")
+    private String unloadName;
+
+    @ExcelProperty(value = "地址明细")
+    private String unloadDetailAddressInfo;
+
+    @ExcelProperty(value = "计划开始日期")
+    private String startTime;
+
+    @ExcelProperty(value = "计划结束日期")
+    private String endTime;
+
+    @ExcelProperty(value = "关联合同")
+    private String contractNo;
+
+    @ExcelProperty(value = "签约方式")
+    private String contractSigningWay;
+
+    @ExcelProperty(value = "归属项目")
+    private String projectName;
+
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    @ExcelProperty(value = "创建人")
+    private String createByName;
+
+    @ExcelProperty(value = "创建时间")
+    private String createTime;
+
+}

+ 21 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListExportParam.java

@@ -0,0 +1,21 @@
+package com.sckw.order.model.vo.req;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @desc: 订单列表导出请求参数
+ * @author: yzc
+ * @date: 2023-07-12 17:41
+ */
+@Getter
+@Setter
+@ToString
+public class TradeOrderListExportParam extends TradeOrderListStatisticParam {
+
+    /**
+     * 订单ids
+     */
+    private String ids;
+}

+ 25 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListSelectParam.java

@@ -0,0 +1,25 @@
+package com.sckw.order.model.vo.req;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @desc: 订单列表分页请求参数
+ * @author: yzc
+ * @date: 2023-07-12 17:38
+ */
+@Getter
+@Setter
+@ToString
+public class TradeOrderListSelectParam extends TradeOrderListStatisticParam {
+
+    /**
+     * 当前页码
+     */
+    private int page = 1;
+    /**
+     * 每页数量
+     */
+    private int pageSize = 10;
+}

+ 91 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListStatisticParam.java

@@ -0,0 +1,91 @@
+package com.sckw.order.model.vo.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Range;
+
+import java.util.Date;
+
+/**
+ * @desc: 订单列表统计请求参数
+ * @author: yzc
+ * @date: 2023-07-12 17:37
+ */
+@Getter
+@Setter
+@ToString
+public class TradeOrderListStatisticParam {
+
+    /**
+     * 订单类型(2销售订单、1采购订单)
+     */
+    @Range(min = 1, max = 2, message = "非法订单类型")
+    @NotNull(message = "订单类型不能为空")
+    private Integer orderType;
+    /**
+     * 订单编号、单位、商品名称(模糊匹配共用)
+     */
+    private String keywords;
+    /**
+     * 创建时间开始(yyyy-MM-dd HH:mm:ss)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startCreateTime;
+
+    /**
+     * 创建时间结束(yyyy-MM-dd HH:mm:ss)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endCreateTime;
+
+    /**
+     * 装货地址code
+     */
+    private String shippingAddressCode;
+
+    /**
+     * 装货地址等级
+     */
+    @Range(min = 1,max = 3,message = "非法装货地址等级")
+    private Integer shippingAddressLevel;
+
+    /**
+     * 装货地址code
+     */
+    private String unloadingAddressCode;
+
+    /**
+     * 卸货地址等级
+     */
+    @Range(min = 1,max = 3,message = "非法卸货地址等级")
+    private Integer unloadingAddressLevel;
+
+    /**
+     * 交易方式(预付款、货到付款)
+     */
+    private String trading;
+
+    /**
+     * 提货方式(采方自提、供应配送)
+     */
+    private String pickupType;
+
+    /**
+     * 交付类型(签发交付、签收交付)
+     */
+    private String deliveryType;
+
+    /**
+     * 下单方式(1采购下单/2代客下单)
+     */
+    private String source;
+
+    /**
+     * 订单状态
+     */
+    private Integer status;
+
+}

+ 66 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderStatementList.java

@@ -0,0 +1,66 @@
+package com.sckw.order.model.vo.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.sckw.core.model.page.PageRequest;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Range;
+
+import java.time.LocalDate;
+
+/**
+ * @desc: 贸易订单对账单列表请求参数
+ * @author: yzc
+ * @date: 2023-07-20 14:43
+ */
+@Getter
+@Setter
+@ToString
+public class TradeOrderStatementList extends PageRequest {
+
+    /**
+     * 订单类型(1采购订单2销售订单)
+     */
+    @Range(min = 1, max = 2, message = "非法订单类型")
+    @NotNull(message = "订单类型不能为空")
+    private Integer orderType;
+
+    /**
+     * 采购单位id
+     */
+    private Long procureEntId;
+
+    /**
+     * 计划开始时间(yyyy-MM-dd)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate startTime;
+
+    /**
+     * 计划结束时间(yyyy-MM-dd)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate endTime;
+
+    /**
+     * 交易方式(预付款、货到付款)
+     */
+    private String trading;
+
+    /**
+     * 商品税率
+     */
+    private String goodsTaxRate;
+
+    /**
+     * 商品名称
+     */
+    private String goodsName;
+
+    /**
+     * 排除订单ids
+     */
+    private String excludeIds;
+}

+ 28 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/UpdateAddressAmountParam.java

@@ -0,0 +1,28 @@
+package com.sckw.order.model.vo.req;
+
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.math.BigDecimal;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-12  09:46
+ * @desc: 更新地点分配量参数
+ */
+@Getter
+@Setter
+@ToString
+public class UpdateAddressAmountParam {
+
+    @NotNull(message = "地址id不能为空")
+    private Long id;
+
+    @NotNull(message = "分配量不能为空")
+    @DecimalMin(value = "0.00",message = "分配量必须大于零")
+    private BigDecimal amount;
+
+}

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

@@ -75,7 +75,6 @@ public class UpdateOrderParam {
     /**
      * 地址信息
      */
-    @Size(max = 2, message = "地址信息最多有两条")
     private List<AddressInfo> addressInfo;
 
     /**

+ 24 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/UpdateUnitParam.java

@@ -0,0 +1,24 @@
+package com.sckw.order.model.vo.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-12  10:13
+ * @desc: 修改单位参数
+ */
+@Getter
+@Setter
+@ToString
+public class UpdateUnitParam {
+
+    @NotNull(message = "单位信息主键id不能为空")
+    private Long id;
+
+    @NotNull(message = "联系人id不能为空")
+    private Long contactsId;
+
+}

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

@@ -29,4 +29,9 @@ public class AddressInfoDetailRes extends AddressInfo implements Serializable {
      * 地址类型label
      */
     private String typeLabel;
+
+    /**
+     * 地址id
+     */
+    private Long id;
 }

+ 33 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/LoadAddressResVO.java

@@ -0,0 +1,33 @@
+package com.sckw.order.model.vo.res;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-14  09:32
+ * @desc: 装货地址信息VO
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class LoadAddressResVO {
+
+    /**
+     * 装货地址id
+     */
+    private Long loadAddressId;
+
+    /**
+     * 装货地点
+     */
+    private String loadName;
+
+    /**
+     * 装货详细地址=loadCityName+loadDetailAddress
+     */
+    private String loadDetailAddressInfo;
+}

+ 42 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/OrderAddressInfoRes.java

@@ -0,0 +1,42 @@
+package com.sckw.order.model.vo.res;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-05  15:34
+ * @desc: 订单地址信息响应
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class OrderAddressInfoRes {
+
+    /**
+     * 装货地址名称集合
+     */
+    private List<String> loadNameList;
+
+    /**
+     * 装货详细地址集合
+     */
+    private List<String> loadDetailAddressList;
+
+
+    /**
+     * 卸货址名称集合
+     */
+    private List<String> unloadNameList;
+
+    /**
+     * 卸货详细地址集合
+     */
+    private List<String> unloadDetailAddressList;
+
+}

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

@@ -0,0 +1,215 @@
+package com.sckw.order.model.vo.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @desc: 订单列表响应参数
+ * @author: yzc
+ * @date: 2023-07-12 17:45
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class OrderListResVO {
+
+    /**
+     * 订单id
+     */
+    @JsonProperty("tOrderId")
+    private Long tOrderId;
+    /**
+     * 订单状态
+     */
+    private Integer status;
+    /**
+     * 订单状态label
+     */
+    private String statusLabel;
+    /**
+     * 订单编号
+     */
+    @JsonProperty("tOrderNo")
+    private String tOrderNo;
+    /**
+     * 采购企业主键ID
+     */
+    private Long procureEntId;
+
+    /**
+     * 采购单位
+     */
+    private String procureFirmName;
+
+    /**
+     * 销售单位主键ID
+     */
+    private Long supplyEntId;
+    /**
+     * 销售单位
+     */
+    private String supplyFirmName;
+    /**
+     * 交易方式(预付款、货到付款)
+     */
+    private String trading;
+
+    /**
+     * 交易方式label
+     */
+    private String tradingLabel;
+    /**
+     * 交付类型(签发交付、签收交付)
+     */
+    private String deliveryType;
+
+    /**
+     * 交付类型label
+     */
+    private String deliveryTypeLabel;
+    /**
+     * 提货方式(采方自提、供应配送)
+     */
+    private String pickupType;
+    /**
+     * 提货方式label
+     */
+    private String pickupTypeLabel;
+    /**
+     * 下单方式(自主下单/代客下单)
+     */
+    private String source;
+
+    /**
+     * 下单方式label
+     */
+    private String sourceLabel;
+
+    /**
+     * 合同主键
+     */
+    private Long contractId;
+
+    /**
+     * 合同编号
+     */
+    private String contractNo;
+
+    /**
+     * 合同mc
+     */
+    private String contractName;
+
+    /**
+     * 合同签约方式
+     */
+    private String contractSigningWay;
+    /**
+     * 商品id
+     */
+    private Long goodsId;
+    /**
+     * 商品名称
+     */
+    private String goodsName;
+    /**
+     * 单位(吨、方、箱、件)
+     */
+    private String goodsSpec;
+
+    private String goodsTaxRate;
+
+    /**
+     * 商品缩略图
+     */
+    private String goodsThumb;
+
+    /**
+     * 订单成交单价
+     */
+    private BigDecimal unitPrice;
+    /**
+     * 订单金额
+     */
+    private BigDecimal price;
+
+    /**
+     * 订单总量
+     */
+    private BigDecimal amount;
+    /**
+     * 已委托量
+     */
+    private BigDecimal entrustAmount;
+    /**
+     * 待委托量
+     */
+    private BigDecimal waitEntrustAmount;
+    /**
+     * 实际交付量
+     */
+    private BigDecimal actualAmount;
+
+    /**
+     * 实际订单金额
+     */
+    private BigDecimal actualPrice;
+    /**
+     * 归属项目
+     */
+    private String projectName;
+
+    /**
+     * 装货地址信息
+     */
+    private List<LoadAddressResVO> loadAddresses;
+    /**
+     * 卸货地址信息
+     */
+    private List<UnloadAddressResVO> unloadAddresses;
+
+    /**
+     * 计划开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate startTime;
+    /**
+     * 计划结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate endTime;
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 单位
+     */
+    private String unit;
+
+    /**
+     * 单位
+     */
+    private String unitLabel;
+
+    /**
+     * 创建人e
+     */
+    private String createByName;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+}

+ 28 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TradeOrderAppStatisticVO.java

@@ -0,0 +1,28 @@
+package com.sckw.order.model.vo.res;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @desc: 贸易订单主界面统计
+ * @author: yzc
+ * @date: 2023-08-21 17:35
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class TradeOrderAppStatisticVO {
+
+    /**
+     * 状态值
+     */
+    private Integer value;
+
+    /**
+     * 统计数据
+     */
+    private Integer total;
+}

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

@@ -25,4 +25,9 @@ public class UnitInfoDetailRes extends UnitInfo implements Serializable {
      */
     private String unitTypeLabel;
 
+    /**
+     * 主键id
+     */
+    private Long id;
+
 }

+ 34 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/UnloadAddressResVO.java

@@ -0,0 +1,34 @@
+package com.sckw.order.model.vo.res;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-14  09:32
+ * @desc: 卸货地址信息VO
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class UnloadAddressResVO {
+
+    /**
+     * 卸货地址id
+     */
+    private Long unloadAddressId;
+
+    /**
+     * 卸货地点
+     */
+    private String unloadName;
+
+    /**
+     * 卸货详细地址=unloadCityName+unloadDetailAddress
+     */
+    private String unloadDetailAddressInfo;
+
+}

+ 115 - 6
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderAddressService.java

@@ -1,17 +1,23 @@
 package com.sckw.order.serivce;
 
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.model.constant.Global;
+import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.order.dao.KwoTradeOrderAddressMapper;
 import com.sckw.order.model.KwoTradeOrderAddress;
+import com.sckw.order.model.vo.res.AddressInfoDetailRes;
+import com.sckw.system.api.RemoteSystemService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
 
-import java.util.Collection;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @desc: 交易订单装卸货地址信息service
@@ -23,6 +29,9 @@ import java.util.List;
 @RequiredArgsConstructor
 public class KwoTradeOrderAddressService {
 
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private RemoteSystemService remoteSystemService;
+
     private final KwoTradeOrderAddressMapper kwoTradeOrderAddressMapper;
 
     /**
@@ -36,6 +45,11 @@ public class KwoTradeOrderAddressService {
         kwoTradeOrderAddressMapper.insertBatch(list);
     }
 
+    public Long add(KwoTradeOrderAddress address) {
+        kwoTradeOrderAddressMapper.insert(address);
+        return address.getId();
+    }
+
     /**
      * @desc: 根据orderId删除
      * @author: yzc
@@ -59,9 +73,65 @@ public class KwoTradeOrderAddressService {
      */
     public List<KwoTradeOrderAddress> getByOrderId(Long torderId) {
         LambdaQueryWrapper<KwoTradeOrderAddress> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(KwoTradeOrderAddress::getTOrderId, torderId).eq(KwoTradeOrderAddress::getDelFlag, Global.NO);
+        wrapper.eq(KwoTradeOrderAddress::getTOrderId, torderId)
+                .eq(KwoTradeOrderAddress::getDelFlag, Global.NO)
+                .orderByAsc(KwoTradeOrderAddress::getSort);
+        List<KwoTradeOrderAddress> list = kwoTradeOrderAddressMapper.selectList(wrapper);
+        return CollUtil.emptyIfNull(list);
+    }
+
+    /**
+     * @param torderId
+     * @param type
+     * @return java.util.List<com.sckw.order.model.KwoTradeOrderAddress>
+     * @desc 根据贸易订单id和地址类型查询
+     * @author yzc
+     * @date 2024/3/12 11:51
+     */
+    public List<KwoTradeOrderAddress> getByOrderIdAndType(Long torderId, String type) {
+        LambdaQueryWrapper<KwoTradeOrderAddress> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwoTradeOrderAddress::getTOrderId, torderId)
+                .eq(KwoTradeOrderAddress::getAddressType, type)
+                .eq(KwoTradeOrderAddress::getDelFlag, Global.NO)
+                .orderByAsc(KwoTradeOrderAddress::getSort);
         List<KwoTradeOrderAddress> list = kwoTradeOrderAddressMapper.selectList(wrapper);
-        return CollectionUtils.emptyIfNull(list);
+        return CollUtil.emptyIfNull(list);
+    }
+
+    /**
+     * @desc: 根据orderId获取
+     * @author: yzc
+     * @date: 2023-07-18 11:24
+     * @Param torderId:
+     * @return: java.util.List<com.sckw.order.model.KwoTradeOrderAddress>
+     */
+    public AddressInfoDetailRes getByOrderIdAndAddressId(Long tOrderId, Long tAddressId) {
+        Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(
+                List.of(DictTypeEnum.TRADE_TYPE.getType(), DictTypeEnum.PICKUP_TYPE.getType(),
+                        DictTypeEnum.DELIVERY_TYPE.getType(), DictTypeEnum.TORDER_SOURCE.getType(), DictTypeEnum.TORDER_STATUS.getType(),
+                        DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.UNIT_TYPE.getType(), DictTypeEnum.TAX_RATE.getType(),
+                        DictTypeEnum.TORDER_UNIT_TYPE.getType(), DictTypeEnum.TORDER_ADDRESS_TYPE.getType(), DictTypeEnum.ADDRESS_TYPE.getType()));
+        Map<String, String> orderAddressMap, addressMap;
+        if (CollectionUtils.isNotEmpty(dict)) {
+            orderAddressMap = dict.get(DictTypeEnum.TORDER_ADDRESS_TYPE.getType());
+            addressMap = dict.get(DictTypeEnum.ADDRESS_TYPE.getType());
+        } else {
+            orderAddressMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            addressMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        }
+        LambdaQueryWrapper<KwoTradeOrderAddress> wrapper = new LambdaQueryWrapper<>();
+        if (tAddressId != null) {
+            wrapper.eq(KwoTradeOrderAddress::getId, tAddressId);
+        }
+        wrapper.eq(KwoTradeOrderAddress::getTOrderId, tOrderId).eq(KwoTradeOrderAddress::getDelFlag, Global.NO);
+        KwoTradeOrderAddress address = kwoTradeOrderAddressMapper.selectOne(wrapper);
+        AddressInfoDetailRes addressInfoDetailRes = new AddressInfoDetailRes();
+        if (address != null) {
+            BeanUtils.copyProperties(address, addressInfoDetailRes);
+            addressInfoDetailRes.setAddressTypeLabel(CollectionUtils.isNotEmpty(orderAddressMap) ? orderAddressMap.get(address.getAddressType()) : null);
+            addressInfoDetailRes.setTypeLabel(CollectionUtils.isNotEmpty(addressMap) ? addressMap.get(address.getType()) : null);
+        }
+        return addressInfoDetailRes;
     }
 
     /**
@@ -78,6 +148,21 @@ public class KwoTradeOrderAddressService {
         kwoTradeOrderAddressMapper.update(null, wrapper);
     }
 
+    /**
+     * @param ids
+     * @return void
+     * @desc 根据ids删除
+     * @author yzc
+     * @date 2024/3/12 11:54
+     */
+    public void delByIds(List<Long> ids) {
+        LambdaUpdateWrapper<KwoTradeOrderAddress> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.in(KwoTradeOrderAddress::getId, ids)
+                .eq(KwoTradeOrderAddress::getDelFlag, Global.NO)
+                .set(KwoTradeOrderAddress::getDelFlag, Global.YES);
+        kwoTradeOrderAddressMapper.update(null, wrapper);
+    }
+
     /**
      * @desc: 根据orderIds查询
      * @author: yzc
@@ -87,8 +172,32 @@ public class KwoTradeOrderAddressService {
      */
     public List<KwoTradeOrderAddress> getByOrderIds(Collection<Long> tOrderIds) {
         LambdaQueryWrapper<KwoTradeOrderAddress> wrapper = new LambdaQueryWrapper<>();
-        wrapper.in(KwoTradeOrderAddress::getTOrderId, tOrderIds).eq(KwoTradeOrderAddress::getDelFlag, Global.NO);
+        wrapper.in(KwoTradeOrderAddress::getTOrderId, tOrderIds)
+                .eq(KwoTradeOrderAddress::getDelFlag, Global.NO)
+                .orderByAsc(KwoTradeOrderAddress::getTOrderId)
+                .orderByAsc(KwoTradeOrderAddress::getSort);
+        List<KwoTradeOrderAddress> list = kwoTradeOrderAddressMapper.selectList(wrapper);
+        return CollUtil.emptyIfNull(list);
+    }
+
+    /**
+     * @param ids
+     * @param tOrderId
+     * @return java.util.Map<java.lang.String, java.lang.Long>
+     * @desc 根据id集合及贸易订单id查询
+     * @author yzc
+     * @date 2024/3/13 9:25
+     */
+    public Map<String, Long> getByIdsAndTOrderId(Collection<Long> ids, Long tOrderId) {
+        LambdaQueryWrapper<KwoTradeOrderAddress> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(KwoTradeOrderAddress::getId, ids)
+                .eq(KwoTradeOrderAddress::getTOrderId, tOrderId)
+                .eq(KwoTradeOrderAddress::getDelFlag, Global.NO);
         List<KwoTradeOrderAddress> list = kwoTradeOrderAddressMapper.selectList(wrapper);
-        return CollectionUtils.emptyIfNull(list);
+        if (CollUtil.isEmpty(list)) {
+            return Collections.emptyMap();
+        }
+        return list.stream().collect(Collectors.toMap(KwoTradeOrderAddress::getAddressType, KwoTradeOrderAddress::getId, (k1, k2) -> k1));
     }
+
 }

+ 125 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderAmountService.java

@@ -0,0 +1,125 @@
+package com.sckw.order.serivce;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.sckw.core.model.constant.Global;
+import com.sckw.order.dao.KwoTradeOrderAmountMapper;
+import com.sckw.order.model.KwoTradeOrderAmount;
+import com.sckw.order.model.vo.req.UpdateAddressAmountParam;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-04  16:57
+ * @desc: 交易订单装卸货地址委派及交付量信息service
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class KwoTradeOrderAmountService {
+
+    private final KwoTradeOrderAmountMapper tradeOrderAmountMapper;
+
+    /**
+     * @param orderAmount
+     * @return void
+     * @desc 添加
+     * @author yzc
+     * @date 2024/3/5 15:04
+     */
+    public void add(KwoTradeOrderAmount orderAmount) {
+        tradeOrderAmountMapper.insert(orderAmount);
+    }
+
+    /**
+     * @param orderId
+     * @return void
+     * @desc 根据贸易订单id删除
+     * @author yzc
+     * @date 2024/3/5 15:04
+     */
+    public void delByOrderId(Long orderId) {
+        LambdaUpdateWrapper<KwoTradeOrderAmount> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(KwoTradeOrderAmount::getTOrderId, orderId).eq(KwoTradeOrderAmount::getDelFlag, Global.NO)
+                .set(KwoTradeOrderAmount::getDelFlag, Global.YES);
+        tradeOrderAmountMapper.update(null, wrapper);
+    }
+
+    /**
+     * @desc: 根据orderIds删除
+     * @author: yzc
+     * @date: 2023-07-18 16:50
+     * @Param orderIds:
+     * @return: void
+     */
+    public void delByOrderIds(List<Long> orderIds) {
+        LambdaUpdateWrapper<KwoTradeOrderAmount> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.in(KwoTradeOrderAmount::getTOrderId, orderIds).eq(KwoTradeOrderAmount::getDelFlag, Global.NO)
+                .set(KwoTradeOrderAmount::getDelFlag, Global.YES);
+        tradeOrderAmountMapper.update(null, wrapper);
+    }
+
+    /**
+     * @param orderId
+     * @param addressIds
+     * @return void
+     * @desc 根据订单id及地址ids删除
+     * @author yzc
+     * @date 2024/3/12 13:45
+     */
+    public void delByOrderIdAndAddressIds(Long orderId, List<Long> addressIds) {
+        LambdaUpdateWrapper<KwoTradeOrderAmount> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(KwoTradeOrderAmount::getTOrderId, orderId)
+                .in(KwoTradeOrderAmount::getTAddressId, addressIds)
+                .eq(KwoTradeOrderAmount::getDelFlag, Global.NO)
+                .set(KwoTradeOrderAmount::getDelFlag, Global.YES);
+        tradeOrderAmountMapper.update(null, wrapper);
+    }
+
+    /**
+     * @desc: 根据orderId获取
+     * @author: yzc
+     * @date: 2023-07-18 11:24
+     * @Param torderId:
+     * @return: java.util.List<com.sckw.order.model.KwoTradeOrderAmount>
+     */
+    public List<KwoTradeOrderAmount> getByOrderId(Long tOrderId) {
+        LambdaQueryWrapper<KwoTradeOrderAmount> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwoTradeOrderAmount::getTOrderId, tOrderId).eq(KwoTradeOrderAmount::getDelFlag, Global.NO);
+        List<KwoTradeOrderAmount> list = tradeOrderAmountMapper.selectList(wrapper);
+        return CollUtil.emptyIfNull(list);
+    }
+
+    /**
+     * @param param
+     * @return void
+     * @desc 更新
+     * @author yzc
+     * @date 2024/3/12 11:45
+     */
+    public void update(UpdateAddressAmountParam param) {
+        LambdaUpdateWrapper<KwoTradeOrderAmount> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.set(KwoTradeOrderAmount::getAmount, param.getAmount())
+                .eq(KwoTradeOrderAmount::getId, param.getId());
+        tradeOrderAmountMapper.update(null, wrapper);
+    }
+
+    public KwoTradeOrderAmount getByOrderIdAndTaddressId(Long tOrderId, Long tAddressId) {
+        LambdaQueryWrapper<KwoTradeOrderAmount> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwoTradeOrderAmount::getTOrderId, tOrderId)
+                .eq(KwoTradeOrderAmount::getTAddressId,tAddressId)
+                .eq(KwoTradeOrderAmount::getDelFlag, Global.NO);
+        return tradeOrderAmountMapper.selectOne(wrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void updateById(KwoTradeOrderAmount orderAmount) {
+        tradeOrderAmountMapper.updateById(orderAmount);
+    }
+}

+ 729 - 179
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -1,9 +1,14 @@
 package com.sckw.order.serivce;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.contract.api.model.dto.res.ContractCommonInfoResDto;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
@@ -15,7 +20,15 @@ import com.sckw.core.model.enums.ClientTypeEnum;
 import com.sckw.core.model.enums.CooperateTypeEnum;
 import com.sckw.core.model.enums.OrderRuleEnum;
 import com.sckw.core.model.enums.RedisOrderGenerateEnum;
-import com.sckw.core.utils.*;
+import com.sckw.core.model.page.PageHelperUtil;
+import com.sckw.core.model.page.PageResult;
+import com.sckw.core.model.vo.TableBottom;
+import com.sckw.core.model.vo.TableStatisticRes;
+import com.sckw.core.model.vo.TableTop;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.DateUtils;
+import com.sckw.core.utils.OrderGenerateSeqNoUtils;
+import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.response.HttpResult;
@@ -26,9 +39,7 @@ import com.sckw.order.api.model.TradeOrderCountStatisticsDTO;
 import com.sckw.order.dao.KwoTradeOrderMapper;
 import com.sckw.order.enums.*;
 import com.sckw.order.model.*;
-import com.sckw.order.model.dto.OrderCheckDTO;
-import com.sckw.order.model.dto.WbTOrderExcelStsReqDTO;
-import com.sckw.order.model.dto.WbTOrderExcelStsResDTO;
+import com.sckw.order.model.dto.*;
 import com.sckw.order.model.vo.req.*;
 import com.sckw.order.model.vo.res.*;
 import com.sckw.payment.api.dubbo.PayCenterDubboService;
@@ -48,15 +59,19 @@ import com.sckw.stream.model.SckwMessage;
 import com.sckw.stream.model.UserInfo;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.*;
-import com.sckw.transport.api.dubbo.TransportService;
+import com.sckw.transport.api.dubbo.TransportRemoteService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.stream.function.StreamBridge;
 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.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -89,7 +104,7 @@ public class KwoTradeOrderService {
     private PaymentDubboService paymentDubboService;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
-    private TransportService transportDubboService;
+    private TransportRemoteService transportRemoteService;
 
     private final KwoTradeOrderMapper kwoTradeOrderMapper;
     private final StreamBridge streamBridge;
@@ -99,6 +114,7 @@ public class KwoTradeOrderService {
     private final KwoTradeOrderContractService kwoTradeOrderContractService;
     private final KwoTradeOrderTrackService kwoTradeOrderTrackService;
     private final KwoTradeOrderGoodsUnitService kwoTradeOrderGoodsUnitService;
+    private final KwoTradeOrderAmountService tradeOrderAmountService;
 
     @Value("${url.order.list.valet.pc}")
     private String pcValetListUrl;
@@ -120,7 +136,7 @@ public class KwoTradeOrderService {
      * @return: void
      */
     public void addPurchaseOrderDraft(PurchaseOrderDraftParam param) {
-        KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
+        KwoTradeOrder order = BeanUtil.copyProperties(param, KwoTradeOrder.class);
         order.setEntId(LoginUserHolder.getEntId())
                 .setTOrderNo(getOrderNo())
                 .setStartTime(DateUtils.localDateToDateStart(param.getStartTime()))
@@ -128,7 +144,7 @@ public class KwoTradeOrderService {
                 .setUnit(Objects.nonNull(param.getGoodsInfo()) ? param.getGoodsInfo().getUnit() : null)
                 .setSource(OrderSourceEnum.PURCHASE.getType()).setStatus(OrderStatusEnum.SAVED.getCode());
         kwoTradeOrderMapper.insert(order);
-        addOtherOrderInfo(order, BeanUtils.copyProperties(param, ValetOrderParam.class), false);
+        addOtherOrderInfo(order, BeanUtil.copyProperties(param, ValetOrderParam.class), false, true);
     }
 
     /**
@@ -140,131 +156,160 @@ public class KwoTradeOrderService {
      * @Param isUpdate:
      * @return: void
      */
-    private void addOtherOrderInfo(KwoTradeOrder tradeOrder, ValetOrderParam param, Boolean isUpdate) {
-        try {
-            Long id = tradeOrder.getId();
-            String tOrderNo = tradeOrder.getTOrderNo();
-            SckwTradeOrder order = new SckwTradeOrder();
-            order.setFirmName(LoginUserHolder.getEntName())
-                    .setCreateByName(LoginUserHolder.getUserName())
-                    .setUpdateByName(LoginUserHolder.getUserName())
-                    .setTOrderId(id)
-                    .setAssociateStatement(0)
-                    .setPrice(tradeOrder.getPrice().doubleValue())
-                    .setAmount(tradeOrder.getAmount().doubleValue())
-                    .setEntrustAmount(tradeOrder.getEntrustAmount().doubleValue())
-                    .setActualAmount(tradeOrder.getActualAmount().doubleValue());
-
-            BeanUtils.copyProperties(tradeOrder, order);
-
-            //商品信息
-            kwoTradeOrderGoodsService.delByOrderId(id);
-            GoodsInfo goodsInfo = param.getGoodsInfo();
-            KwoTradeOrderGoods goods = BeanUtils.copyProperties(goodsInfo, KwoTradeOrderGoods.class);
-            if (Objects.nonNull(goods) && Objects.nonNull(goods.getGoodsId())) {
-                GoodsDetail goodsDetail = goodsInfoService.getDetailById(goods.getGoodsId());
-                if (Objects.isNull(goodsDetail)
-                        || !Objects.equals(goodsDetail.getStatus(), 1)
-                        || Objects.equals(goodsDetail.getDelFlag(), Global.YES)) {
-                    throw new BusinessException("商品不存在或已下架!");
-                }
-                goods.setTOrderId(id).setTOrderNo(tOrderNo).setGoodsType(goodsDetail.getGoodsType());
-                kwoTradeOrderGoodsService.insert(goods);
-
-                //商品辅助单位
-                kwoTradeOrderGoodsUnitService.delByOrderId(id);
-                List<GoodsUnitDetail> assistUnit = goodsDetail.getAssistUnit();
-                if (CollectionUtils.isNotEmpty(assistUnit)) {
-                    List<KwoTradeOrderGoodsUnit> units = new ArrayList<>(assistUnit.size());
-                    assistUnit.forEach(e -> {
-                        KwoTradeOrderGoodsUnit unit = BeanUtils.copyProperties(e, KwoTradeOrderGoodsUnit.class);
-                        unit.setGoodsId(goodsDetail.getId());
-                        unit.setTOrderId(id);
-                        unit.setUnit(order.getUnit().equals(e.getFromUnit()) ? e.getToUnit() : e.getFromUnit());
-                        units.add(unit);
-                    });
-                    kwoTradeOrderGoodsUnitService.insertBatch(units);
-                }
+    private void addOtherOrderInfo(KwoTradeOrder tradeOrder, ValetOrderParam param, Boolean isUpdate, boolean isDraft) {
+        Long id = tradeOrder.getId();
+        String tOrderNo = tradeOrder.getTOrderNo();
+        SckwTradeOrder order = new SckwTradeOrder();
+        order.setFirmName(LoginUserHolder.getEntName())
+                .setCreateByName(LoginUserHolder.getUserName())
+                .setUpdateByName(LoginUserHolder.getUserName())
+                .setTOrderId(id)
+                .setAssociateStatement(0)
+                .setPrice(Objects.isNull(tradeOrder.getPrice()) ? null : tradeOrder.getPrice().doubleValue())
+                .setAmount(Objects.isNull(tradeOrder.getAmount()) ? null : tradeOrder.getAmount().doubleValue())
+                .setEntrustAmount(Objects.isNull(tradeOrder.getEntrustAmount()) ? null : tradeOrder.getEntrustAmount().doubleValue())
+                .setActualAmount(Objects.isNull(tradeOrder.getActualAmount()) ? null : tradeOrder.getActualAmount().doubleValue());
 
-                //订单关联商品信息
-                order.setGoodsId(goodsDetail.getId()).setUnit(goodsDetail.getUnit()).setUnitPrice(goods.getUnitPrice().doubleValue())
-                        .setGoodsName(goodsDetail.getName()).setGoodsType(goodsDetail.getGoodsType()).setGoodsCode(goodsDetail.getCode())
-                        .setGoodsTaxRate(goodsDetail.getTaxRate()).setGoodsSpec(goodsDetail.getSpec()).setGoodsThumb(goodsDetail.getThumb());
-            }
-            if (Objects.isNull(order.getUnitPrice())) {
-                order.setUnitPrice(BigDecimal.ZERO.doubleValue());
-            }
+        BeanUtil.copyProperties(tradeOrder, order);
 
-            //单位信息
-            kwoTradeOrderUnitService.delByOrderId(id);
-            List<UnitInfo> unitInfos = param.getUnitInfo();
-            if (CollectionUtils.isNotEmpty(unitInfos)) {
-                List<KwoTradeOrderUnit> list = new ArrayList<>(unitInfos.size());
-                List<Long> entIds = unitInfos.stream().map(UnitInfo::getEntId).distinct().toList();
-                Map<Long, EntCacheResDto> entMap = remoteSystemService.queryEntTreeByIds(entIds);
-                unitInfos.forEach(e -> {
-                    EntCacheResDto ent = entMap.get(e.getEntId());
-                    if (Objects.isNull(ent)) {
-                        throw new BusinessException("企业:" + e.getFirmName() + "的一级企业信息不存在!");
-                    }
-                    KwoTradeOrderUnit unit = BeanUtils.copyProperties(e, KwoTradeOrderUnit.class);
-                    unit.setTOrderId(id).setTOrderNo(tOrderNo).setTopEntId(ent.getId());
-                    list.add(unit);
-                    if (Objects.equals(e.getUnitType(), OrderUnitTypeEnum.PURCHASE.getType())) {
-                        order.setProcureEntId(e.getEntId()).setProcureTopEntId(unit.getTopEntId()).setProcureFirmName(e.getFirmName())
-                                .setProcureContacts(e.getContacts()).setProcurePhone(e.getPhone()).setProcureContactsId(e.getContactsId());
-                    } else {
-                        order.setSupplyEntId(e.getEntId()).setSupplyTopEntId(unit.getTopEntId()).setSupplyFirmName(e.getFirmName())
-                                .setSupplyContacts(e.getContacts()).setSupplyPhone(e.getPhone()).setSupplyContactsId(e.getContactsId());
-                    }
+        //商品信息
+        kwoTradeOrderGoodsService.delByOrderId(id);
+        GoodsInfo goodsInfo = param.getGoodsInfo();
+        KwoTradeOrderGoods goods = BeanUtil.copyProperties(goodsInfo, KwoTradeOrderGoods.class);
+        if (Objects.nonNull(goods) && Objects.nonNull(goods.getGoodsId())) {
+            GoodsDetail goodsDetail = goodsInfoService.getDetailById(goods.getGoodsId());
+            if (Objects.isNull(goodsDetail)
+                    || !Objects.equals(goodsDetail.getStatus(), 1)
+                    || Objects.equals(goodsDetail.getDelFlag(), Global.YES)) {
+                throw new BusinessException("商品不存在或已下架!");
+            }
+            goods.setTOrderId(id).setTOrderNo(tOrderNo).setGoodsType(goodsDetail.getGoodsType());
+            kwoTradeOrderGoodsService.insert(goods);
+
+            //商品辅助单位
+            kwoTradeOrderGoodsUnitService.delByOrderId(id);
+            List<GoodsUnitDetail> assistUnit = goodsDetail.getAssistUnit();
+            if (CollUtil.isNotEmpty(assistUnit)) {
+                List<KwoTradeOrderGoodsUnit> units = new ArrayList<>(assistUnit.size());
+                assistUnit.forEach(e -> {
+                    KwoTradeOrderGoodsUnit unit = BeanUtil.copyProperties(e, KwoTradeOrderGoodsUnit.class);
+                    unit.setGoodsId(goodsDetail.getId());
+                    unit.setTOrderId(id);
+                    unit.setUnit(order.getUnit().equals(e.getFromUnit()) ? e.getToUnit() : e.getFromUnit());
+                    units.add(unit);
                 });
-                kwoTradeOrderUnitService.insertBatch(list);
+                kwoTradeOrderGoodsUnitService.insertBatch(units);
             }
 
-            //地址信息
-            kwoTradeOrderAddressService.delByOrderId(id);
-            List<AddressInfo> addressInfos = param.getAddressInfo();
-            if (CollectionUtils.isNotEmpty(addressInfos)) {
-                List<KwoTradeOrderAddress> list = new ArrayList<>(addressInfos.size());
-                addressInfos.forEach(e -> {
-                    KwoTradeOrderAddress address = BeanUtils.copyProperties(e, KwoTradeOrderAddress.class);
-                    address.setTOrderId(id).setTOrderNo(tOrderNo);
-                    list.add(address);
+            //订单关联商品信息
+            order.setGoodsId(goodsDetail.getId()).setUnit(goodsDetail.getUnit()).setUnitPrice(goods.getUnitPrice().doubleValue())
+                    .setGoodsName(goodsDetail.getName()).setGoodsType(goodsDetail.getGoodsType()).setGoodsCode(goodsDetail.getCode())
+                    .setGoodsTaxRate(goodsDetail.getTaxRate()).setGoodsSpec(goodsDetail.getSpec()).setGoodsThumb(goodsDetail.getThumb());
+        }
+        if (Objects.isNull(order.getUnitPrice())) {
+            order.setUnitPrice(BigDecimal.ZERO.doubleValue());
+        }
+
+        //单位信息
+        kwoTradeOrderUnitService.delByOrderId(id);
+        List<UnitInfo> unitInfos = param.getUnitInfo();
+        if (CollUtil.isNotEmpty(unitInfos)) {
+            List<KwoTradeOrderUnit> list = new ArrayList<>(unitInfos.size());
+            List<Long> entIds = unitInfos.stream().map(UnitInfo::getEntId).distinct().toList();
+            Map<Long, EntCacheResDto> entMap = remoteSystemService.queryEntTreeByIds(entIds);
+            unitInfos.forEach(e -> {
+                EntCacheResDto ent = entMap.get(e.getEntId());
+                if (Objects.isNull(ent)) {
+                    throw new BusinessException("企业:" + e.getFirmName() + "的一级企业信息不存在!");
+                }
+                KwoTradeOrderUnit unit = BeanUtil.copyProperties(e, KwoTradeOrderUnit.class);
+                unit.setTOrderId(id).setTOrderNo(tOrderNo).setTopEntId(ent.getId());
+                list.add(unit);
+                if (Objects.equals(e.getUnitType(), OrderUnitTypeEnum.PURCHASE.getType())) {
+                    order.setProcureEntId(e.getEntId()).setProcureTopEntId(unit.getTopEntId()).setProcureFirmName(e.getFirmName())
+                            .setProcureContacts(e.getContacts()).setProcurePhone(e.getPhone()).setProcureContactsId(e.getContactsId());
+                } else {
+                    order.setSupplyEntId(e.getEntId()).setSupplyTopEntId(unit.getTopEntId()).setSupplyFirmName(e.getFirmName())
+                            .setSupplyContacts(e.getContacts()).setSupplyPhone(e.getPhone()).setSupplyContactsId(e.getContactsId());
+                }
+            });
+            kwoTradeOrderUnitService.insertBatch(list);
+        }
+
+        //地址信息
+        kwoTradeOrderAddressService.delByOrderId(id);
+        tradeOrderAmountService.delByOrderId(id);
+        List<AddressInfo> addressInfos = param.getAddressInfo();
+        if (CollUtil.isNotEmpty(addressInfos)) {
+            BigDecimal amount = Objects.isNull(param.getAmount()) ? BigDecimal.ZERO : param.getAmount();
+            if (!isDraft) {
+                BigDecimal totalLoadAmount = BigDecimal.ZERO;
+                BigDecimal totalUnloadAmount = BigDecimal.ZERO;
+                boolean loadFlag = false;
+                boolean unloadFlag = false;
+                for (AddressInfo e : addressInfos) {
+                    BigDecimal addressAmount = Objects.isNull(e.getAmount()) ? BigDecimal.ZERO : e.getAmount();
                     if (Objects.equals(e.getAddressType(), OrderAddressTypeEnum.LOAD.getType())) {
-                        order.setLoadName(e.getName()).setLoadType(e.getType()).setLoadContacts(e.getContacts())
-                                .setLoadPhone(e.getPhone()).setLoadCityCode(String.valueOf(e.getCityCode())).setLoadCityName(e.getCityName())
-                                .setLoadDetailAddress(e.getDetailAddress()).setLoadLat(e.getLat()).setLoadLng(e.getLng());
+                        totalLoadAmount = totalLoadAmount.add(addressAmount);
+                        loadFlag = true;
                     } else {
-                        order.setUnloadName(e.getName()).setUnloadType(e.getType()).setUnloadContacts(e.getContacts())
-                                .setUnloadPhone(e.getPhone()).setUnloadCityCode(String.valueOf(e.getCityCode())).setUnloadCityName(e.getCityName())
-                                .setUnloadDetailAddress(e.getDetailAddress()).setUnloadLat(e.getLat()).setUnloadLng(e.getLng());
+                        totalUnloadAmount = totalUnloadAmount.add(addressAmount);
+                        unloadFlag = true;
                     }
-                });
-                kwoTradeOrderAddressService.insertBatch(list);
+                }
+                if (loadFlag && totalLoadAmount.compareTo(amount) != 0) {
+                    throw new BusinessException("装货分配量总量与订单总量不符!");
+                }
+                if (unloadFlag && totalUnloadAmount.compareTo(amount) != 0) {
+                    throw new BusinessException("卸货分配量总量与订单总量不符!");
+                }
             }
+            AtomicInteger loadSort = new AtomicInteger(0);
+            AtomicInteger unloadSort = new AtomicInteger(0);
+            addressInfos.forEach(e -> {
+                KwoTradeOrderAddress address = BeanUtil.copyProperties(e, KwoTradeOrderAddress.class);
+                address.setTOrderId(id).setTOrderNo(tOrderNo);
+                //todo MongoDB如何存多个地址信息?
+                if (Objects.equals(address.getAddressType(), OrderAddressTypeEnum.LOAD.getType())) {
+                    address.setSort(loadSort.getAndIncrement());
+                    order.setLoadName(e.getName()).setLoadType(e.getType()).setLoadContacts(e.getContacts())
+                            .setLoadPhone(e.getPhone()).setLoadCityCode(String.valueOf(e.getCityCode())).setLoadCityName(e.getCityName())
+                            .setLoadDetailAddress(e.getDetailAddress()).setLoadLat(e.getLat()).setLoadLng(e.getLng());
+                } else {
+                    address.setSort(unloadSort.getAndIncrement());
+                    order.setUnloadName(e.getName()).setUnloadType(e.getType()).setUnloadContacts(e.getContacts())
+                            .setUnloadPhone(e.getPhone()).setUnloadCityCode(String.valueOf(e.getCityCode())).setUnloadCityName(e.getCityName())
+                            .setUnloadDetailAddress(e.getDetailAddress()).setUnloadLat(e.getLat()).setUnloadLng(e.getLng());
+                }
+                //地址信息
+                Long addressId = kwoTradeOrderAddressService.add(address);
+                //分配量信息
+                KwoTradeOrderAmount orderAmount = new KwoTradeOrderAmount();
+                orderAmount.setTOrderId(id).setAmount(e.getAmount())
+                        .setTAddressId(addressId);
+                tradeOrderAmountService.add(orderAmount);
+            });
+        }
 
-            //合同信息
-            kwoTradeOrderContractService.delByOrderId(id);
-            ContractInfo contractInfo = param.getContractInfo();
-            KwoTradeOrderContract contract = BeanUtils.copyProperties(contractInfo, KwoTradeOrderContract.class);
-            if (Objects.nonNull(contract)) {
-                contract.setTOrderId(id).setTOrderNo(tOrderNo);
-                kwoTradeOrderContractService.insert(contract);
-                BeanUtils.copyProperties(contractInfo, order);
-            }
+        //合同信息
+        kwoTradeOrderContractService.delByOrderId(id);
+        ContractInfo contractInfo = param.getContractInfo();
+        KwoTradeOrderContract contract = BeanUtil.copyProperties(contractInfo, KwoTradeOrderContract.class);
+        if (Objects.nonNull(contract)) {
+            contract.setTOrderId(id).setTOrderNo(tOrderNo);
+            kwoTradeOrderContractService.insert(contract);
+            BeanUtil.copyProperties(contractInfo, order);
+        }
 
-            //状态信息(草稿更新不加状态记录)
-            if (!isUpdate || !Objects.equals(OrderStatusEnum.SAVED.getCode(), tradeOrder.getStatus())) {
-                KwoTradeOrderTrack track = new KwoTradeOrderTrack();
-                track.setTOrderId(id).setTOrderNo(tOrderNo).setStatus(tradeOrder.getStatus()).setRemark(tradeOrder.getRemark());
-                kwoTradeOrderTrackService.insert(track);
-            }
-            int method = isUpdate ? 2 : 1;
-            //存MongoDb
-            saveMongoDb(method, order);
-        }catch (Exception e) {
-            e.printStackTrace();
+        //状态信息(草稿更新不加状态记录)
+        if (!isUpdate || !Objects.equals(OrderStatusEnum.SAVED.getCode(), tradeOrder.getStatus())) {
+            KwoTradeOrderTrack track = new KwoTradeOrderTrack();
+            track.setTOrderId(id).setTOrderNo(tOrderNo).setStatus(tradeOrder.getStatus()).setRemark(tradeOrder.getRemark());
+            kwoTradeOrderTrackService.insert(track);
         }
+        int method = isUpdate ? 2 : 1;
+        //存MongoDb
+        saveMongoDb(method, order);
     }
 
     /**
@@ -292,7 +337,7 @@ public class KwoTradeOrderService {
      * @return: void
      */
     public void addValetOrderDraft(ValetOrderDraftParam param) {
-        KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
+        KwoTradeOrder order = BeanUtil.copyProperties(param, KwoTradeOrder.class);
         order.setEntId(LoginUserHolder.getEntId())
                 .setTOrderNo(getOrderNo())
                 .setStartTime(DateUtils.localDateToDateStart(param.getStartTime()))
@@ -300,7 +345,7 @@ public class KwoTradeOrderService {
                 .setUnit(Objects.nonNull(param.getGoodsInfo()) ? param.getGoodsInfo().getUnit() : null)
                 .setSource(OrderSourceEnum.SALE.getType()).setStatus(OrderStatusEnum.SAVED.getCode());
         kwoTradeOrderMapper.insert(order);
-        addOtherOrderInfo(order, BeanUtils.copyProperties(param, ValetOrderParam.class), false);
+        addOtherOrderInfo(order, BeanUtil.copyProperties(param, ValetOrderParam.class), false, true);
     }
 
     /**
@@ -315,12 +360,12 @@ public class KwoTradeOrderService {
         if (Objects.isNull(goodsInfo.getPriceRangeId())) {
             throw new BusinessException("采购下单价格梯度信息不能为空!");
         }
-        OrderCheckDTO orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
+        OrderCheckDTO orderCheck = BeanUtil.copyProperties(param, OrderCheckDTO.class);
         getTopEnt(orderCheck, param.getUnitInfo());
         orderCheck.setGoodsId(goodsInfo.getGoodsId()).setUnitPrice(goodsInfo.getUnitPrice())
                 .setOrderSource(OrderSourceEnum.PURCHASE.getType());
         orderCheck(orderCheck, false);
-        KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
+        KwoTradeOrder order = BeanUtil.copyProperties(param, KwoTradeOrder.class);
         order.setEntId(LoginUserHolder.getEntId())
                 .setTOrderNo(getOrderNo())
                 .setStartTime(DateUtils.localDateToDateStart(param.getStartTime()))
@@ -335,7 +380,7 @@ public class KwoTradeOrderService {
             throw new BusinessException(updateResult.getMsg());
         }
         //添加订单其他信息
-        addOtherOrderInfo(order, BeanUtils.copyProperties(param, ValetOrderParam.class), false);
+        addOtherOrderInfo(order, BeanUtil.copyProperties(param, ValetOrderParam.class), false, false);
         //发送消息提醒
         submitOrderSendMsg(orderCheck, order.getTOrderNo());
     }
@@ -459,7 +504,7 @@ public class KwoTradeOrderService {
         String trading = param.getTrading();
         BigDecimal price = param.getPrice();
         KwpGoods goods = goodsInfoService.getGoodsById(param.getGoodsId());
-        if (Objects.isNull(goods) || Objects.equals(goods.getDelFlag(), Global.YES) ) {
+        if (Objects.isNull(goods) || Objects.equals(goods.getDelFlag(), Global.YES)) {
             throw new BusinessException("商品不存在!");
         }
         if (Boolean.FALSE.equals(isAcceptanceOrder)) {
@@ -512,7 +557,7 @@ public class KwoTradeOrderService {
      * @return: void
      */
     public void addValetOrderSubmit(ValetOrderParam param) {
-        OrderCheckDTO orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
+        OrderCheckDTO orderCheck = BeanUtil.copyProperties(param, OrderCheckDTO.class);
         getTopEnt(orderCheck, param.getUnitInfo());
         orderCheck.setGoodsId(param.getGoodsInfo().getGoodsId()).setUnitPrice(param.getGoodsInfo().getUnitPrice())
                 .setOrderSource(OrderSourceEnum.SALE.getType());
@@ -520,7 +565,7 @@ public class KwoTradeOrderService {
         ContractInfo contract = param.getContractInfo();
         contractCheck(contract);
         param.setContractInfo(contract);
-        KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
+        KwoTradeOrder order = BeanUtil.copyProperties(param, KwoTradeOrder.class);
         order.setEntId(LoginUserHolder.getEntId())
                 .setTOrderNo(getOrderNo())
                 .setStartTime(DateUtils.localDateToDateStart(param.getStartTime()))
@@ -549,7 +594,7 @@ public class KwoTradeOrderService {
                 throw new BusinessException(freezeResult.getMsg());
             }
         }
-        addOtherOrderInfo(order, BeanUtils.copyProperties(param, ValetOrderParam.class), false);
+        addOtherOrderInfo(order, BeanUtil.copyProperties(param, ValetOrderParam.class), false, false);
         //发送消息提醒
         submitOrderSendMsg(orderCheck, order.getTOrderNo());
     }
@@ -557,6 +602,7 @@ public class KwoTradeOrderService {
 
     /**
      * 生成贸易订单号
+     *
      * @return 订单编号
      */
     private String getOrderNo() {
@@ -568,7 +614,7 @@ public class KwoTradeOrderService {
                 if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 5L, 10L))) {
                     throw new BusinessException("业务繁忙,请稍后再试!");
                 }
-                DateTime dateTime = DateUtils.beginOfDay(date);
+                DateTime dateTime = DateUtil.beginOfDay(date);
                 String maxOrderNo = kwoTradeOrderMapper.getMaxOrderNoByDate(dateTime);
                 if (StringUtils.isNotBlank(maxOrderNo)) {
                     Long maxNum = Long.valueOf(StringUtils.subStrFromIndexToEnd(maxOrderNo, 4));
@@ -621,11 +667,11 @@ public class KwoTradeOrderService {
         List<Long> createBys = tracks.stream().map(KwoTradeOrderTrack::getCreateBy).distinct().toList();
         Map<Long, UserCacheResDto> map = remoteSystemService.queryUserCacheMapByIds(createBys);
         tracks.forEach(e -> {
-            OrderProcess process = BeanUtils.copyProperties(e, OrderProcess.class);
+            OrderProcess process = BeanUtil.copyProperties(e, OrderProcess.class);
             UserCacheResDto user = map.get(process.getCreateBy());
             if (Objects.nonNull(user)) {
                 process.setCreateByName(user.getName());
-                if (CollectionUtils.isNotEmpty(user.getRoleInfo())) {
+                if (CollUtil.isNotEmpty(user.getRoleInfo())) {
                     List<String> roleNames = user.getRoleInfo().stream().map(KwsRoleResDto::getName).distinct().toList();
                     process.setRoleName(String.join(",", roleNames));
                 }
@@ -663,7 +709,7 @@ public class KwoTradeOrderService {
         Map<String, String> unitMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         Map<String, String> taxRateMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         Map<String, String> orderUnitMap, orderAddressMap, addressMap;
-        if (CollectionUtils.isNotEmpty(dict)) {
+        if (CollUtil.isNotEmpty(dict)) {
             tradeMap = dict.get(DictTypeEnum.TRADE_TYPE.getType());
             pickupMap = dict.get(DictTypeEnum.PICKUP_TYPE.getType());
             deleveryMap = dict.get(DictTypeEnum.DELIVERY_TYPE.getType());
@@ -681,16 +727,16 @@ public class KwoTradeOrderService {
             addressMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         }
         //订单基本信息
-        OrderDetailRes detail = BeanUtils.copyProperties(order, OrderDetailRes.class);
+        OrderDetailRes detail = BeanUtil.copyProperties(order, OrderDetailRes.class);
         UserCacheResDto createUser = remoteSystemService.queryUserCacheById(detail.getCreateBy());
         EntCacheResDto ent = remoteSystemService.queryEntCacheById(detail.getEntId());
         detail.setFirmName(Objects.isNull(ent) ? null : ent.getFirmName())
                 .setCreateByName(Objects.isNull(createUser) ? null : createUser.getName())
-                .setTradingLabel(CollectionUtils.isNotEmpty(tradeMap) ? tradeMap.get(detail.getTrading()) : null)
-                .setPickupTypeLabel(CollectionUtils.isNotEmpty(pickupMap) ? pickupMap.get(detail.getPickupType()) : null)
-                .setDeliveryTypeLabel(CollectionUtils.isNotEmpty(deleveryMap) ? deleveryMap.get(detail.getDeliveryType()) : null)
-                .setSourceLabel(CollectionUtils.isNotEmpty(sourceMap) ? sourceMap.get(detail.getSource()) : null)
-                .setStatusLabel(CollectionUtils.isNotEmpty(statusMap) ? statusMap.get(String.valueOf(detail.getStatus())) : null);
+                .setTradingLabel(CollUtil.isNotEmpty(tradeMap) ? tradeMap.get(detail.getTrading()) : null)
+                .setPickupTypeLabel(CollUtil.isNotEmpty(pickupMap) ? pickupMap.get(detail.getPickupType()) : null)
+                .setDeliveryTypeLabel(CollUtil.isNotEmpty(deleveryMap) ? deleveryMap.get(detail.getDeliveryType()) : null)
+                .setSourceLabel(CollUtil.isNotEmpty(sourceMap) ? sourceMap.get(detail.getSource()) : null)
+                .setStatusLabel(CollUtil.isNotEmpty(statusMap) ? statusMap.get(String.valueOf(detail.getStatus())) : null);
         //商品信息
         KwoTradeOrderGoods orderGoods = kwoTradeOrderGoodsService.getByOrderId(id);
         if (Objects.nonNull(orderGoods)) {
@@ -698,9 +744,9 @@ public class KwoTradeOrderService {
             if (Objects.nonNull(goods)) {
                 EntCacheResDto entCache = remoteSystemService.queryEntCacheById(goods.getEntId());
                 GoodsInfoDetailRes goodsDetail = new GoodsInfoDetailRes();
-                goodsDetail.setGoodsTypeLabel(CollectionUtils.isNotEmpty(prodcutNameMap) ? prodcutNameMap.get(goods.getGoodsType()) : null)
-                        .setUnitLabel(CollectionUtils.isNotEmpty(unitMap) ? unitMap.get(goods.getUnit()) : null)
-                        .setTaxRateLabel(CollectionUtils.isNotEmpty(taxRateMap) ? taxRateMap.get(goods.getTaxRate()) : null)
+                goodsDetail.setGoodsTypeLabel(CollUtil.isNotEmpty(prodcutNameMap) ? prodcutNameMap.get(goods.getGoodsType()) : null)
+                        .setUnitLabel(CollUtil.isNotEmpty(unitMap) ? unitMap.get(goods.getUnit()) : null)
+                        .setTaxRateLabel(CollUtil.isNotEmpty(taxRateMap) ? taxRateMap.get(goods.getTaxRate()) : null)
                         .setGoodsAmount(goods.getAmount())
                         .setGoodsId(goods.getId()).setCode(goods.getCode()).setName(goods.getName())
                         .setGoodsType(goods.getGoodsType()).setTaxRate(goods.getTaxRate()).setSpec(goods.getSpec())
@@ -712,11 +758,11 @@ public class KwoTradeOrderService {
 
                 //商品辅助单位信息
                 List<GoodsUnitDetailRes> assistUnit = kwoTradeOrderGoodsUnitService.findGoodsUnitDetail(id);
-                if (CollectionUtils.isNotEmpty(assistUnit)) {
+                if (CollUtil.isNotEmpty(assistUnit)) {
                     Map<String, String> finalUnitMap = unitMap;
                     assistUnit.forEach(e -> {
-                        e.setFromUnitName(CollectionUtils.isNotEmpty(finalUnitMap) ? finalUnitMap.get(e.getFromUnit()) : null);
-                        e.setToUnitName(CollectionUtils.isNotEmpty(finalUnitMap) ? finalUnitMap.get(e.getToUnit()) : null);
+                        e.setFromUnitName(CollUtil.isNotEmpty(finalUnitMap) ? finalUnitMap.get(e.getFromUnit()) : null);
+                        e.setToUnitName(CollUtil.isNotEmpty(finalUnitMap) ? finalUnitMap.get(e.getToUnit()) : null);
                     });
                 }
                 detail.setAssistUnit(assistUnit);
@@ -725,23 +771,30 @@ public class KwoTradeOrderService {
 
         //单位信息
         List<KwoTradeOrderUnit> units = kwoTradeOrderUnitService.getByOrderId(id);
-        if (CollectionUtils.isNotEmpty(units)) {
+        if (CollUtil.isNotEmpty(units)) {
             List<UnitInfoDetailRes> unitInfos = new ArrayList<>(units.size());
             units.forEach(e -> {
-                UnitInfoDetailRes unit = BeanUtils.copyProperties(e, UnitInfoDetailRes.class);
-                unit.setUnitTypeLabel(CollectionUtils.isNotEmpty(orderUnitMap) ? orderUnitMap.get(unit.getUnitType()) : null);
+                UnitInfoDetailRes unit = BeanUtil.copyProperties(e, UnitInfoDetailRes.class);
+                unit.setUnitTypeLabel(CollUtil.isNotEmpty(orderUnitMap) ? orderUnitMap.get(unit.getUnitType()) : null);
                 unitInfos.add(unit);
             });
             detail.setUnitInfo(unitInfos);
         }
         //地址信息
         List<KwoTradeOrderAddress> addressList = kwoTradeOrderAddressService.getByOrderId(id);
-        if (CollectionUtils.isNotEmpty(addressList)) {
+        if (CollUtil.isNotEmpty(addressList)) {
+            //分配量信息
+            List<KwoTradeOrderAmount> amountList = tradeOrderAmountService.getByOrderId(id);
+            Map<Long, KwoTradeOrderAmount> amountMap = amountList.stream().collect(Collectors.toMap(KwoTradeOrderAmount::getTAddressId, e -> e, (k1, k2) -> k1));
             List<AddressInfoDetailRes> addressInfoDetails = new ArrayList<>(addressList.size());
             addressList.forEach(e -> {
-                AddressInfoDetailRes address = BeanUtils.copyProperties(e, AddressInfoDetailRes.class);
-                address.setAddressTypeLabel(CollectionUtils.isNotEmpty(orderAddressMap) ? orderAddressMap.get(address.getAddressType()) : null);
-                address.setTypeLabel(CollectionUtils.isNotEmpty(addressMap) ? addressMap.get(address.getType()) : null);
+                AddressInfoDetailRes address = BeanUtil.copyProperties(e, AddressInfoDetailRes.class);
+                address.setAddressTypeLabel(CollUtil.isNotEmpty(orderAddressMap) ? orderAddressMap.get(address.getAddressType()) : null);
+                address.setTypeLabel(CollUtil.isNotEmpty(addressMap) ? addressMap.get(address.getType()) : null);
+                KwoTradeOrderAmount orderAmount = amountMap.get(e.getId());
+                if (Objects.nonNull(orderAmount)) {
+                    address.setAmount(orderAmount.getAmount());
+                }
                 addressInfoDetails.add(address);
             });
             detail.setAddressInfo(addressInfoDetails);
@@ -749,7 +802,7 @@ public class KwoTradeOrderService {
         //合同信息
         KwoTradeOrderContract contract = kwoTradeOrderContractService.getByOrderId(id);
         if (Objects.nonNull(contract)) {
-            ContractInfo contractInfo = BeanUtils.copyProperties(contract, ContractInfo.class);
+            ContractInfo contractInfo = BeanUtil.copyProperties(contract, ContractInfo.class);
             Map<Long, ContractCommonInfoResDto> contractMap = remoteContractService.queryContractBaseInfo(List.of(contractInfo.getContractId()));
             ContractCommonInfoResDto contractRes = contractMap.get(contractInfo.getContractId());
             if (Objects.nonNull(contractRes)) {
@@ -805,7 +858,7 @@ public class KwoTradeOrderService {
                     throw new BusinessException("Invalid contract status");
                 }
             }
-            orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
+            orderCheck = BeanUtil.copyProperties(param, OrderCheckDTO.class);
             getTopEnt(orderCheck, param.getUnitInfo());
             orderCheck.setGoodsId(param.getGoodsInfo().getGoodsId()).setUnitPrice(param.getGoodsInfo().getUnitPrice())
                     .setOrderSource(source);
@@ -816,7 +869,7 @@ public class KwoTradeOrderService {
                 throw new BusinessException(updateResult.getMsg());
             }
             //代客下单冻结金额
-            if (Objects.equals(source, OrderSourceEnum.SALE.getType()) && param.getTrading().startsWith("1")){
+            if (Objects.equals(source, OrderSourceEnum.SALE.getType()) && param.getTrading().startsWith("1")) {
                 HttpResult freezeResult = paymentDubboService.freezeMoney(orderCheck.getProcureTopEntId(),
                         ChannelEnum.getByTrading(param.getTrading()), orderCheck.getSupplyTopEntId(), param.getPrice(), order.getId());
                 if (!Objects.equals(HttpStatus.SUCCESS_CODE, freezeResult.getCode())) {
@@ -843,9 +896,9 @@ public class KwoTradeOrderService {
                 .set(KwoTradeOrder::getStatus, order.getStatus())
                 .eq(KwoTradeOrder::getId, order.getId());
         kwoTradeOrderMapper.update(null, wrapper);
-        ValetOrderParam valetOrderParam = BeanUtils.copyProperties(param, ValetOrderParam.class);
+        ValetOrderParam valetOrderParam = BeanUtil.copyProperties(param, ValetOrderParam.class);
 
-        addOtherOrderInfo(order, valetOrderParam, true);
+        addOtherOrderInfo(order, valetOrderParam, true, false);
         //订单提交发送提醒消息
         if (Objects.equals(param.getOperateType(), 1)) {
             submitOrderSendMsg(orderCheck, order.getTOrderNo());
@@ -972,6 +1025,23 @@ public class KwoTradeOrderService {
      * @return: void
      */
     public void acceptanceOrder(AcceptanceOrderParam param) {
+        BigDecimal amount = param.getAmount();
+        List<UpdateAddressAmountParam> addressAmountParams = param.getAddressAmountParams();
+        BigDecimal totalLoadAmount = addressAmountParams.stream()
+                .map(UpdateAddressAmountParam::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (amount.compareTo(totalLoadAmount) != 0) {
+            throw new BusinessException("分配卸货量总量与订单总量不相符!");
+        }
+        List<AddressInfo> loadAddressInfo = param.getAddressInfo();
+        long unloadCount = loadAddressInfo.stream().filter(e -> Objects.equals(OrderAddressTypeEnum.UNLOAD.getType(), e.getAddressType())).count();
+        if (unloadCount > 0) {
+            throw new BusinessException("装货地址类型信息有误!");
+        }
+        BigDecimal totalUnLoadAmount = loadAddressInfo.stream()
+                .map(AddressInfo::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (amount.compareTo(totalUnLoadAmount) != 0) {
+            throw new BusinessException("分配装货量总量与订单总量不相符!");
+        }
         if (param.getPrice().compareTo(param.getUnitPrice().multiply(param.getAmount())) != 0) {
             throw new BusinessException("订单总金额不等于商品单价*订单总量!");
         }
@@ -989,16 +1059,31 @@ public class KwoTradeOrderService {
         if (Objects.isNull(goods)) {
             throw new BusinessException("订单商品信息异常!");
         }
-        //受理订单总量-原订单总量=订单变化量
         List<KwoTradeOrderUnit> units = kwoTradeOrderUnitService.getByOrderId(order.getId());
-        List<UnitInfo> unitInfos = BeanUtils.copyToList(units, UnitInfo.class);
+        Long saleUnitId = param.getSaleUnitParam().getId();
+        KwoTradeOrderUnit saleUnit = units.stream().filter(e -> Objects.equals(e.getId(), saleUnitId) &&
+                Objects.equals(e.getUnitType(), OrderUnitTypeEnum.SALE.getType())).findFirst().orElse(null);
+        if (Objects.isNull(saleUnit)) {
+            throw new BusinessException("我方单位信息异常!");
+        }
+        Long contactsId = param.getSaleUnitParam().getContactsId();
+        boolean updateUnit = !Objects.equals(contactsId, saleUnit.getContactsId());
+        if (updateUnit) {
+            UserCacheResDto contactsInfo = remoteSystemService.queryUserCacheById(contactsId);
+            if (Objects.isNull(contactsInfo)) {
+                throw new BusinessException("未查询到我方联系人信息");
+            }
+            saleUnit.setContactsId(contactsId).setContacts(contactsInfo.getName()).setPhone(contactsInfo.getPhone());
+        }
+        List<UnitInfo> unitInfos = BeanUtil.copyToList(units, UnitInfo.class);
         if (CollectionUtils.isEmpty(unitInfos)) {
             throw new BusinessException("订单企业信息异常!");
         }
-        BigDecimal amount = param.getAmount().subtract(order.getAmount());
-        OrderCheckDTO orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
+        //受理订单总量-原订单总量=订单变化量
+        BigDecimal changeAmount = amount.subtract(order.getAmount());
+        OrderCheckDTO orderCheck = BeanUtil.copyProperties(param, OrderCheckDTO.class);
         getTopEnt(orderCheck, unitInfos);
-        orderCheck.setGoodsId(goods.getGoodsId()).setAmount(amount);
+        orderCheck.setGoodsId(goods.getGoodsId()).setAmount(changeAmount);
         orderCheck(orderCheck, true);
         //冻结金额
         if (param.getTrading().startsWith("1")) {
@@ -1009,7 +1094,7 @@ public class KwoTradeOrderService {
             }
         }
         //更新订单信息
-        BeanUtils.copyProperties(param, order);
+        BeanUtil.copyProperties(param, order);
         ContractInfo contractInfo = param.getContractInfo();
         contractCheck(contractInfo);
         String contractStatus = contractInfo.getContractStatus();
@@ -1025,8 +1110,32 @@ public class KwoTradeOrderService {
         kwoTradeOrderMapper.updateById(order);
         //更新商品价格
         kwoTradeOrderGoodsService.updateUnitPrice(param.getId(), param.getUnitPrice());
+        //更新单位信息
+        if (updateUnit) {
+            kwoTradeOrderUnitService.updateById(saleUnit);
+        }
+        //更新装货地址信息
+        List<Long> oldLoadAddressIds = kwoTradeOrderAddressService.getByOrderIdAndType(param.getId(), OrderAddressTypeEnum.LOAD.getType())
+                .stream().map(KwoTradeOrderAddress::getId).toList();
+        if (CollUtil.isNotEmpty(oldLoadAddressIds)) {
+            kwoTradeOrderAddressService.delByIds(oldLoadAddressIds);
+            tradeOrderAmountService.delByOrderIdAndAddressIds(param.getId(), oldLoadAddressIds);
+        }
+        loadAddressInfo.forEach(e -> {
+            KwoTradeOrderAddress address = BeanUtil.copyProperties(e, KwoTradeOrderAddress.class);
+            address.setTOrderId(param.getId()).setTOrderNo(order.getTOrderNo());
+            //地址信息
+            Long addressId = kwoTradeOrderAddressService.add(address);
+            //分配量信息
+            KwoTradeOrderAmount orderAmount = new KwoTradeOrderAmount();
+            orderAmount.setTOrderId(param.getId()).setAmount(e.getAmount())
+                    .setTAddressId(addressId);
+            tradeOrderAmountService.add(orderAmount);
+        });
+        //更新卸货地址分配量信息
+        addressAmountParams.forEach(tradeOrderAmountService::update);
         //保存合同信息
-        KwoTradeOrderContract tradeOrderContract = BeanUtils.copyProperties(contractInfo, KwoTradeOrderContract.class);
+        KwoTradeOrderContract tradeOrderContract = BeanUtil.copyProperties(contractInfo, KwoTradeOrderContract.class);
         tradeOrderContract.setTOrderId(order.getId()).setTOrderNo(order.getTOrderNo());
         kwoTradeOrderContractService.insert(tradeOrderContract);
         //订单状态记录
@@ -1041,7 +1150,7 @@ public class KwoTradeOrderService {
             }
         }
         //更新mongodb
-        SckwTradeOrder updateParam = BeanUtils.copyProperties(param, SckwTradeOrder.class);
+        SckwTradeOrder updateParam = BeanUtil.copyProperties(param, SckwTradeOrder.class);
         updateParam.setTOrderId(param.getId())
                 .setStatus(order.getStatus())
                 .setStartTime(DateUtils.localDateToDateStart(param.getStartTime()))
@@ -1174,7 +1283,7 @@ public class KwoTradeOrderService {
         if (kwoTradeOrderUnitService.entMatch(param.getId(), LoginUserHolder.getEntId(), OrderUnitTypeEnum.SALE.getType())) {
             throw new BusinessException("无订单操作权限!");
         }
-        if (transportDubboService.checkLogisticsOrderByTradeOrderId(tOrderId)) {
+        if (transportRemoteService.checkLogisticsOrderByTradeOrderId(tOrderId)) {
             throw new CustomPromptException(HttpStatus.COMPLETE_TORDER_FAIL_CODE, "订单存在未完成的物流托运,不可完结!");
         }
         String lockKey = String.format(RedisConstant.TORDER_UPDATE_AMOUNT_KEY, tOrderId);
@@ -1230,12 +1339,12 @@ public class KwoTradeOrderService {
         LambdaQueryWrapper<KwoTradeOrder> wrapper = new LambdaQueryWrapper<>();
         wrapper.in(KwoTradeOrder::getId, ids).ne(KwoTradeOrder::getStatus, 0).eq(KwoTradeOrder::getDelFlag, Global.NO);
         List<KwoTradeOrder> list = kwoTradeOrderMapper.selectList(wrapper);
-        if (CollectionUtils.isNotEmpty(list)) {
+        if (CollUtil.isNotEmpty(list)) {
             throw new BusinessException("删除操作仅针对“已保存”状态的订单");
         }
         //排除草稿状态权限匹配
         List<Long> filterIds = list.stream().filter(e -> !(Objects.equals(e.getStatus(), 0))).map(KwoTradeOrder::getId).toList();
-        if (CollectionUtils.isNotEmpty(filterIds) &&
+        if (CollUtil.isNotEmpty(filterIds) &&
                 kwoTradeOrderUnitService.entBatchMatch(filterIds, LoginUserHolder.getEntId(), String.valueOf(param.getOrderType()))) {
             throw new BusinessException("无订单操作权限!");
         }
@@ -1245,6 +1354,7 @@ public class KwoTradeOrderService {
         kwoTradeOrderGoodsService.delByOrderIds(ids);
         kwoTradeOrderUnitService.delByOrderIds(ids);
         kwoTradeOrderAddressService.delByOrderIds(ids);
+        tradeOrderAmountService.delByOrderIds(ids);
         kwoTradeOrderContractService.delByOrderIds(ids);
         //更新mongodb
         ids.forEach(id -> {
@@ -1276,6 +1386,7 @@ public class KwoTradeOrderService {
      * @Param order:
      * @return: void
      */
+    @Transactional(rollbackFor = Exception.class)
     public void updateById(KwoTradeOrder order) {
         kwoTradeOrderMapper.updateById(order);
     }
@@ -1293,7 +1404,7 @@ public class KwoTradeOrderService {
         wrapper.eq(KwoTradeOrder::getStatus, OrderStatusEnum.WAIT_SIGNED.getCode())
                 .in(KwoTradeOrder::getId, tOrderIds).eq(KwoTradeOrder::getDelFlag, Global.NO);
         List<KwoTradeOrder> list = kwoTradeOrderMapper.selectList(wrapper);
-        return CollectionUtils.emptyIfNull(list);
+        return CollUtil.emptyIfNull(list);
     }
 
     /**
@@ -1355,7 +1466,7 @@ public class KwoTradeOrderService {
         wrapper.in(KwoTradeOrder::getId, tOrderIds).eq(KwoTradeOrder::getDelFlag, Global.NO)
                 .in(KwoTradeOrder::getStatus, 1, 2, 3, 4);
         List<KwoTradeOrder> list = kwoTradeOrderMapper.selectList(wrapper);
-        return CollectionUtils.emptyIfNull(list);
+        return CollUtil.emptyIfNull(list);
     }
 
     /**
@@ -1365,8 +1476,8 @@ public class KwoTradeOrderService {
      * @Param topEntId:
      * @return: java.util.List<com.sckw.order.api.model.TradeOrderCountStatisticsDTO>
      */
-    public List<TradeOrderCountStatisticsDTO> getOrderNumByTopEntId(Long topEntId,List<Long> enterpriseIds) {
-        return kwoTradeOrderMapper.getOrderNumByTopEntId(topEntId,enterpriseIds);
+    public List<TradeOrderCountStatisticsDTO> getOrderNumByTopEntId(Long topEntId, List<Long> enterpriseIds) {
+        return kwoTradeOrderMapper.getOrderNumByTopEntId(topEntId, enterpriseIds);
     }
 
     /**
@@ -1378,7 +1489,7 @@ public class KwoTradeOrderService {
      */
     public List<WbTOrderExcelStsResDTO> workbenchExcel(WbTOrderExcelStsReqDTO reqDTO) {
         List<WbTOrderExcelStsResDTO> list = kwoTradeOrderMapper.workbenchExcel(reqDTO);
-        return CollectionUtils.emptyIfNull(list);
+        return CollUtil.emptyIfNull(list);
     }
 
     /**
@@ -1396,27 +1507,27 @@ public class KwoTradeOrderService {
 
         //商品辅助单位
         List<GoodsUnitDetailRes> assistUnit = kwoTradeOrderGoodsUnitService.findGoodsUnitDetail(tOrderId);
-        if (CollectionUtils.isNotEmpty(assistUnit)) {
+        if (CollUtil.isNotEmpty(assistUnit)) {
             assistUnit.forEach(e -> {
                 unitDetails.add(new GoodsUnitRes(e.getToUnit(), null, false));
             });
         }
 
         //数据组装
-        if (CollectionUtils.isNotEmpty(unitDetails)) {
+        if (CollUtil.isNotEmpty(unitDetails)) {
             //货物单位与合理损耗单位
             List<SysDictResDto> dicts = remoteSystemService.queryDictByType(DictTypeEnum.UNIT_LOSS_TYPE.getType());
             //单位
             Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(List.of(DictTypeEnum.UNIT_TYPE.getType()));
             Map<String, String> unitMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
-            if (CollectionUtils.isNotEmpty(dict)) {
+            if (CollUtil.isNotEmpty(dict)) {
                 unitMap = dict.get(DictTypeEnum.UNIT_TYPE.getType());
             }
             Map<String, String> finalUnitMap = unitMap;
             unitDetails.forEach(e -> {
-                e.setLabel( finalUnitMap != null ? finalUnitMap.get(e.getValue()) : null);
+                e.setLabel(finalUnitMap != null ? finalUnitMap.get(e.getValue()) : null);
                 //组装合理损耗
-                if (CollectionUtils.isNotEmpty(dicts)) {
+                if (CollUtil.isNotEmpty(dicts)) {
                     for (SysDictResDto ee : dicts)
                         if (ee.getParentId().equals((long) NumberConstant.ZERO)) {
                             if (ee.getValue().equals(e.getValue())) {
@@ -1438,4 +1549,443 @@ public class KwoTradeOrderService {
 
         return unitDetails;
     }
+
+    /**
+     * @param id
+     * @return com.sckw.order.model.vo.res.OrderAddressInfoRes
+     * @desc 根据id获取地址信息
+     * @author yzc
+     * @date 2024/3/5 15:50
+     */
+    public OrderAddressInfoRes getAddressInfo(Long id) {
+        OrderAddressInfoRes res = new OrderAddressInfoRes();
+        List<String> loadNameList = new ArrayList<>();
+        List<String> loadDetailAddressList = new ArrayList<>();
+        List<String> unloadNameList = new ArrayList<>();
+        List<String> unloadDetailAddressList = new ArrayList<>();
+        List<KwoTradeOrderAddress> list = kwoTradeOrderAddressService.getByOrderId(id);
+        list.forEach(e -> {
+            if (OrderAddressTypeEnum.LOAD.getType().equals(e.getAddressType())) {
+                loadNameList.add(e.getName());
+                loadDetailAddressList.add(e.getCityName() + e.getDetailAddress());
+            } else {
+                unloadNameList.add(e.getName());
+                unloadDetailAddressList.add(e.getCityName() + e.getDetailAddress());
+            }
+        });
+        res.setLoadNameList(loadNameList)
+                .setLoadDetailAddressList(loadDetailAddressList)
+                .setUnloadNameList(unloadNameList)
+                .setUnloadDetailAddressList(unloadDetailAddressList);
+        return res;
+    }
+
+    /**
+     * @param params
+     * @return com.sckw.core.model.page.PageResult
+     * @desc 贸易订单列表分页查询
+     * @author yzc
+     * @date 2024/3/15 8:51
+     */
+    public PageResult tradeOrderSelect(TradeOrderListSelectParam params) {
+        TradeOrderListSelectDTO dto = buildSelectParam(params);
+        PageHelper.startPage(params.getPage(), params.getPageSize());
+        List<OrderListResDTO> list = kwoTradeOrderMapper.tradeOrderSelect(dto, dto.getGoodIds(), LoginUserHolder.getAuthUserIdList());
+        return buildResult(list, params.getPageSize());
+
+    }
+
+    /**
+     * @param list
+     * @param pageSize
+     * @return com.sckw.core.model.page.PageRes
+     * @desc 构建列表结果响应
+     * @author yzc
+     * @date 2024/3/15 14:23
+     */
+    private PageResult buildResult(List<OrderListResDTO> list, int pageSize) {
+        if (CollUtil.isEmpty(list)) {
+            return PageHelperUtil.getPageResult(new PageInfo<>());
+        }
+        List<OrderListResVO> result = new ArrayList<>();
+        List<Long> goodIdList = new ArrayList<>();
+        List<Long> contracIdList = new ArrayList<>();
+        List<Long> createByIds = new ArrayList<>();
+        list.forEach(e -> {
+            goodIdList.add(e.getGoodsId());
+            contracIdList.add(e.getContractId());
+            createByIds.add(e.getCreateBy());
+        });
+        Map<Long, UserCacheResDto> userMap = remoteSystemService.queryUserCacheMapByIds(createByIds);
+        Map<Long, KwpGoods> goodsMap = goodsInfoService.getGoodsByIds(goodIdList);
+        Map<Long, ContractCommonInfoResDto> contractMap = remoteContractService.queryContractBaseInfo(contracIdList);
+        Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(List.of(
+                DictTypeEnum.TORDER_STATUS.getType(), DictTypeEnum.TRADE_TYPE.getType(), DictTypeEnum.DELIVERY_TYPE.getType(),
+                DictTypeEnum.PICKUP_TYPE.getType(), DictTypeEnum.TORDER_SOURCE.getType()));
+        Map<String, SysDictResDto> unitType = remoteSystemService.queryDictMapByType(DictTypeEnum.UNIT_TYPE.getType());
+        Map<String, String> statusMap, tradeMap, deliveryMap, pickupMap, sourceMap;
+        if (CollUtil.isNotEmpty(dict)) {
+            statusMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.TORDER_STATUS.getType())) ?
+                    dict.get(DictTypeEnum.TORDER_STATUS.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            tradeMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.TRADE_TYPE.getType())) ?
+                    dict.get(DictTypeEnum.TRADE_TYPE.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            deliveryMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.DELIVERY_TYPE.getType())) ?
+                    dict.get(DictTypeEnum.DELIVERY_TYPE.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            pickupMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.PICKUP_TYPE.getType())) ?
+                    dict.get(DictTypeEnum.PICKUP_TYPE.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            sourceMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.TORDER_SOURCE.getType())) ?
+                    dict.get(DictTypeEnum.TORDER_SOURCE.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        } else {
+            statusMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            tradeMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            deliveryMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            pickupMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            sourceMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        }
+
+        list.forEach(e -> {
+            OrderListResVO vo = BeanUtil.copyProperties(e, OrderListResVO.class);
+            List<LoadAddressDTO> loadAddresses = e.getLoadAddresses();
+            if (CollUtil.isNotEmpty(loadAddresses)) {
+                List<LoadAddressResVO> loadList = new ArrayList<>();
+                loadAddresses.forEach(l -> {
+                    LoadAddressResVO load = new LoadAddressResVO();
+                    load.setLoadAddressId(l.getLoadAddressId()).setLoadName(l.getLoadName())
+                            .setLoadDetailAddressInfo(l.getLoadCityName() + l.getLoadDetailAddress());
+                    loadList.add(load);
+                });
+                vo.setLoadAddresses(loadList);
+            }
+            List<UnloadAddressDTO> unloadAddresses = e.getUnloadAddresses();
+            if (CollUtil.isNotEmpty(unloadAddresses)) {
+                List<UnloadAddressResVO> unloadList = new ArrayList<>();
+                unloadAddresses.forEach(u -> {
+                    UnloadAddressResVO unload = new UnloadAddressResVO();
+                    unload.setUnloadAddressId(u.getUnloadAddressId()).setUnloadName(u.getUnloadName())
+                            .setUnloadDetailAddressInfo(u.getUnloadCityName() + u.getUnloadDetailAddress());
+                    unloadList.add(unload);
+                });
+                vo.setUnloadAddresses(unloadList);
+            }
+            BigDecimal actualAmount = Objects.isNull(e.getActualAmount()) ? BigDecimal.ZERO : e.getActualAmount();
+            BigDecimal unitPrice = Objects.isNull(e.getUnitPrice()) ? BigDecimal.ZERO : e.getUnitPrice();
+            KwpGoods goods = goodsMap.get(e.getGoodsId());
+            ContractCommonInfoResDto contract = contractMap.get(e.getContractId());
+            UserCacheResDto userCache = userMap.get(e.getCreateBy());
+            vo.setStatusLabel(statusMap.get(String.valueOf(e.getStatus())))
+                    .setTradingLabel(tradeMap.get(e.getTrading()))
+                    .setTrading(tradeMap.get(e.getTrading()))
+                    .setDeliveryTypeLabel(deliveryMap.get(e.getDeliveryType()))
+                    .setDeliveryType(deliveryMap.get(e.getDeliveryType()))
+                    .setPickupTypeLabel(pickupMap.get(e.getPickupType()))
+                    .setSourceLabel(sourceMap.get(e.getSource()))
+                    .setSource(sourceMap.get(e.getSource()))
+                    .setContractName(Objects.isNull(contract) ? null : contract.getContactName())
+                    .setContractSigningWay(Objects.isNull(contract) ? null : contract.getSigningWayName())
+                    .setGoodsName(Objects.isNull(goods) ? null : goods.getName())
+                    .setGoodsSpec(Objects.isNull(goods) ? null : goods.getSpec())
+                    .setGoodsTaxRate(Objects.isNull(goods) ? null : goods.getTaxRate())
+                    .setGoodsThumb(Objects.isNull(goods) ? null : goods.getThumb())
+                    .setWaitEntrustAmount(setScale(getWaitEntrustAmount(e.getAmount(), e.getEntrustAmount())))
+                    .setActualPrice(actualAmount.multiply(unitPrice).setScale(2, RoundingMode.HALF_UP))
+                    .setUnitPrice(setScale(e.getUnitPrice()))
+                    .setPrice(setScale(e.getPrice()))
+                    .setUnit(e.getUnit())
+                    .setUnitLabel(unitType == null ? e.getUnit() : (unitType.get(e.getUnit()) == null ? e.getUnit() : unitType.get(e.getUnit()).getLabel()))
+                    .setAmount(setScale(vo.getAmount()))
+                    .setEntrustAmount(setScale(e.getEntrustAmount()))
+                    .setActualAmount(setScale(e.getActualAmount()))
+                    .setCreateByName(Objects.isNull(userCache) ? null : userCache.getName());
+            result.add(vo);
+        });
+        return PageHelperUtil.getPageResult(new PageInfo<>(result), list, pageSize);
+    }
+
+    /**
+     * @param params
+     * @return com.sckw.order.model.dto.TradeOrderListSelectDTO
+     * @desc 构建贸易订单列表请求参数
+     * @author yzc
+     * @date 2024/3/15 8:52
+     */
+    private TradeOrderListSelectDTO buildSelectParam(TradeOrderListStatisticParam params) {
+        TradeOrderListSelectDTO dto = BeanUtil.copyProperties(params, TradeOrderListSelectDTO.class);
+        dto.setEntId(LoginUserHolder.getEntId())
+                .setUserId(LoginUserHolder.getUserId())
+                .setIsMain(LoginUserHolder.getIsMain());
+        //装卸货地址
+        String loadCode = params.getShippingAddressCode();
+        if (StringUtils.isNotBlank(loadCode) && Objects.nonNull(params.getShippingAddressLevel())) {
+            switch (params.getShippingAddressLevel()) {
+                case 1 -> dto.setLoadAddressCode(
+                        loadCode.substring(0, 2).trim());
+                case 2 -> dto.setLoadAddressCode(
+                        loadCode.substring(0, 4).trim());
+                case 3 -> dto.setLoadAddressCode(loadCode);
+            }
+        }
+        String unloadCode = params.getUnloadingAddressCode();
+        if (StringUtils.isNotBlank(unloadCode) && Objects.nonNull(params.getUnloadingAddressLevel())) {
+            switch (params.getUnloadingAddressLevel()) {
+                case 1 -> dto.setUnloadAddressCode(
+                        loadCode.substring(0, 2).trim());
+                case 2 -> dto.setUnloadAddressCode(
+                        loadCode.substring(0, 4).trim());
+                case 3 -> dto.setUnloadAddressCode(loadCode);
+            }
+        }
+        String keywords = params.getKeywords();
+        if (StringUtils.isNotBlank(keywords)) {
+            List<Long> goodIds = goodsInfoService.getGoodsByGoodsNameAndTaxRate(keywords, null);
+            dto.setGoodIds(goodIds);
+        }
+        return dto;
+    }
+
+    /**
+     * @desc: 设置两位小数
+     * @author: yzc
+     * @date: 2023-09-26 10:11
+     * @Param d:
+     * @return: java.lang.BigDecimal
+     */
+    private BigDecimal setScale(BigDecimal d) {
+        if (Objects.isNull(d) || BigDecimal.ZERO.compareTo(d) == 0) {
+            return NumberConstant.ZERO_TWO;
+        }
+        return d.setScale(2, RoundingMode.HALF_UP);
+    }
+
+    /**
+     * @desc: 获取订单待分配运输量
+     * @author: yzc
+     * @date: 2023-08-25 10:32
+     * @Param amount:
+     * @Param entrustAmount:
+     * @return: java.math.Double
+     */
+    private BigDecimal getWaitEntrustAmount(BigDecimal amount, BigDecimal entrustAmount) {
+        if (Objects.isNull(amount) || Objects.isNull(entrustAmount)) {
+            return amount;
+        }
+        return amount.subtract(entrustAmount);
+    }
+
+    /**
+     * @param params
+     * @return com.sckw.core.model.vo.TableStatisticRes
+     * @desc 贸易订单列表统计
+     * @author yzc
+     * @date 2024/3/15 8:52
+     */
+    public TableStatisticRes tradeOrderStatistic(TradeOrderListStatisticParam params) {
+        TableStatisticRes res = new TableStatisticRes();
+        TradeOrderListSelectDTO dto = buildSelectParam(params);
+        dto.setStatus(null);
+        List<TableTop> tableTops = kwoTradeOrderMapper.tradeOrderStatistic(dto, dto.getGoodIds(), LoginUserHolder.getAuthUserIdList());
+        Map<Integer, Integer> map = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        if (CollUtil.isNotEmpty(tableTops)) {
+            map = tableTops.stream().collect(Collectors.toMap
+                    (TableTop::getValue, TableTop::getTotal, (k1, k2) -> k2));
+        }
+        List<TableTop> list = new ArrayList<>();
+        int count = 0;
+        for (OrderStatusEnum e : OrderStatusEnum.getSortList()) {
+            Integer value = e.getCode();
+            int total = Objects.isNull(map.get(value)) ? 0 : map.get(value);
+            TableTop tableTop = new TableTop();
+            tableTop.setName(e.getMsg()).setValue(value).setTotal(total);
+            list.add(tableTop);
+            count = count + total;
+        }
+        TableTop all = new TableTop();
+        all.setName("全部").setTotal(count);
+        list.add(0, all);
+        TableBottom tableBottom = new TableBottom();
+        tableBottom.setTotal(count);
+        res.setTableTops(list).setTableBottom(tableBottom);
+        return res;
+    }
+
+    /**
+     * @desc: app主界面贸易订单统计
+     * @author: yzc
+     * @date: 2023-08-21 17:39
+     * @Param params:
+     * @return: java.util.List<com.sckw.order.model.vo.res.TradeOrderAppStatisticVO>
+     */
+    public List<TradeOrderAppStatisticVO> appStatistic(TradeOrderAppStatisticParam params) {
+        TradeOrderAppStatisticParamDTO dto = new TradeOrderAppStatisticParamDTO();
+        dto.setOrderType(params.getOrderType())
+                .setIsMain(LoginUserHolder.getIsMain())
+                .setEntId(LoginUserHolder.getEntId());
+        List<Integer> statuses = Arrays.asList(1, 4, 5, 7);
+        List<Long> authUserIds = LoginUserHolder.getAuthUserIdList();
+        List<TradeOrderAppStatisticVO> tableTops = kwoTradeOrderMapper.appStatistic(dto, statuses, authUserIds);
+        Map<Integer, Integer> map = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        if (CollUtil.isNotEmpty(tableTops)) {
+            map = tableTops.stream().collect(Collectors.toMap
+                    (TradeOrderAppStatisticVO::getValue, TradeOrderAppStatisticVO::getTotal, (k1, k2) -> k2));
+        }
+        List<TradeOrderAppStatisticVO> statistics = new ArrayList<>();
+        for (Integer e : statuses) {
+            int total = Objects.isNull(map.get(e)) ? 0 : map.get(e);
+            TradeOrderAppStatisticVO statistic = new TradeOrderAppStatisticVO();
+            statistic.setValue(e).setTotal(total);
+            statistics.add(statistic);
+        }
+        return statistics;
+    }
+
+    /**
+     * @desc: 贸易订单列表导出
+     * @author: yzc
+     * @date: 2023-07-17 18:05
+     * @Param params:
+     * @return: java.util.List<com.sckw.report.service.param.TradeOrderListExport>
+     */
+    public List<TradeOrderListExport> export(TradeOrderListExportParam params) {
+        TradeOrderListSelectDTO dto = new TradeOrderListSelectDTO();
+        List<Long> ids = new ArrayList<>();
+        if (StringUtils.isNotBlank(params.getIds())) {
+            ids = StringUtils.splitStrToList(params.getIds(), ",", Long.class);
+            dto.setEntId(LoginUserHolder.getEntId()).setOrderType(params.getOrderType());
+        } else {
+            dto = buildSelectParam(params);
+        }
+        List<OrderListResDTO> orders = kwoTradeOrderMapper.tradeOrderExport(dto, dto.getGoodIds(), LoginUserHolder.getAuthUserIdList(), ids);
+        if (CollUtil.isEmpty(orders)) {
+            return Collections.emptyList();
+        }
+        Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(List.of(
+                DictTypeEnum.TORDER_STATUS.getType(), DictTypeEnum.PICKUP_TYPE.getType(), DictTypeEnum.DELIVERY_TYPE.getType(),
+                DictTypeEnum.TORDER_SOURCE.getType(), DictTypeEnum.TRADE_TYPE.getType()));
+        Map<String, String> statusMap, pickupMap, deliveryMap, sourceMap, tradeMap;
+        if (CollUtil.isNotEmpty(dict)) {
+            statusMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.TORDER_STATUS.getType())) ?
+                    dict.get(DictTypeEnum.TORDER_STATUS.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            pickupMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.PICKUP_TYPE.getType())) ?
+                    dict.get(DictTypeEnum.PICKUP_TYPE.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            deliveryMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.DELIVERY_TYPE.getType())) ?
+                    dict.get(DictTypeEnum.DELIVERY_TYPE.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            sourceMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.TORDER_SOURCE.getType())) ?
+                    dict.get(DictTypeEnum.TORDER_SOURCE.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            tradeMap = CollUtil.isNotEmpty(dict.get(DictTypeEnum.TRADE_TYPE.getType())) ?
+                    dict.get(DictTypeEnum.TRADE_TYPE.getType()) : new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        } else {
+            statusMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            pickupMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            deliveryMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            sourceMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            tradeMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        }
+        List<Long> goodIdList = new ArrayList<>();
+        List<Long> contracIdList = new ArrayList<>();
+        List<Long> createByIds = new ArrayList<>();
+        orders.forEach(e -> {
+            goodIdList.add(e.getGoodsId());
+            contracIdList.add(e.getContractId());
+            createByIds.add(e.getCreateBy());
+        });
+        Map<Long, UserCacheResDto> userMap = remoteSystemService.queryUserCacheMapByIds(createByIds);
+        Map<Long, KwpGoods> goodsMap = goodsInfoService.getGoodsByIds(goodIdList);
+        Map<Long, ContractCommonInfoResDto> contractMap = remoteContractService.queryContractBaseInfo(contracIdList);
+        List<TradeOrderListExport> list = new ArrayList<>();
+        orders.forEach(e -> {
+            TradeOrderListExport vo = BeanUtil.copyProperties(e, TradeOrderListExport.class);
+            List<LoadAddressDTO> loadAddresses = e.getLoadAddresses();
+            if (CollUtil.isNotEmpty(loadAddresses)) {
+                StringBuilder loadName = new StringBuilder();
+                StringBuilder loadDetailAddressInfo = new StringBuilder();
+                for (int i = 0; i < loadAddresses.size(); i++) {
+                    LoadAddressDTO l = loadAddresses.get(i);
+                    if (i != loadAddresses.size() - 1) {
+                        loadName.append(l.getLoadName()).append(",");
+                        loadDetailAddressInfo.append(l.getLoadCityName()).append(l.getLoadDetailAddress()).append(",");
+                    } else {
+                        loadName.append(l.getLoadName());
+                        loadDetailAddressInfo.append(l.getLoadCityName()).append(l.getLoadDetailAddress());
+                    }
+                }
+                vo.setLoadName(loadName.toString()).setLoadDetailAddressInfo(loadDetailAddressInfo.toString());
+            }
+            List<UnloadAddressDTO> unloadAddresses = e.getUnloadAddresses();
+            if (CollUtil.isNotEmpty(unloadAddresses)) {
+                StringBuilder unloadName = new StringBuilder();
+                StringBuilder unloadDetailAddressInfo = new StringBuilder();
+                for (int i = 0; i < unloadAddresses.size(); i++) {
+                    UnloadAddressDTO ul = unloadAddresses.get(i);
+                    if (i != unloadAddresses.size() - 1) {
+                        unloadName.append(ul.getUnloadName()).append(",");
+                        unloadDetailAddressInfo.append(ul.getUnloadCityName()).append(ul.getUnloadDetailAddress()).append(",");
+                    } else {
+                        unloadName.append(ul.getUnloadName());
+                        unloadDetailAddressInfo.append(ul.getUnloadCityName()).append(ul.getUnloadDetailAddress());
+                    }
+                }
+                vo.setUnloadName(unloadName.toString()).setUnloadDetailAddressInfo(unloadDetailAddressInfo.toString());
+            }
+            KwpGoods goods = goodsMap.get(e.getGoodsId());
+            ContractCommonInfoResDto contract = contractMap.get(e.getContractId());
+            UserCacheResDto userCache = userMap.get(e.getCreateBy());
+            BigDecimal waitEntrustAmount = getWaitEntrustAmount(e.getAmount(), e.getEntrustAmount());
+            vo.setStatus(statusMap.get(String.valueOf(vo.getStatus())))
+                    .setGoodsName(Objects.isNull(goods) ? null : goods.getName())
+                    .setGoodsSpec(Objects.isNull(goods) ? null : goods.getSpec())
+                    .setUnitPrice(String.valueOf(setScale(e.getUnitPrice())))
+                    .setAmount(String.valueOf(setScale(e.getAmount())))
+                    .setPrice(String.valueOf(setScale(e.getPrice())))
+                    .setGoodsTaxRate(Objects.isNull(goods) ? null : goods.getTaxRate())
+                    .setEntrustAmount(String.valueOf(setScale(e.getEntrustAmount())))
+                    .setActualAmount(String.valueOf(setScale(e.getActualAmount())))
+                    .setWaitEntrustAmount(String.valueOf(setScale(waitEntrustAmount)))
+                    .setPickupType(pickupMap.get(e.getPickupType()))
+                    .setDeliveryType(deliveryMap.get(e.getDeliveryType()))
+                    .setSource(sourceMap.get(e.getSource()))
+                    .setTrading(tradeMap.get(e.getTrading()))
+                    .setStartTime(Objects.isNull(e.getStartTime()) ? null : e.getStartTime().toString())
+                    .setEndTime(Objects.isNull(e.getEndTime()) ? null : e.getEndTime().toString())
+                    .setContractSigningWay(Objects.isNull(contract) ? null : contract.getSigningWayName())
+                    .setCreateByName(Objects.isNull(userCache) ? null : userCache.getName())
+                    .setCreateTime(com.sckw.excel.utils.DateUtil.getDateTime(e.getCreateTime()));
+            list.add(vo);
+        });
+        return list;
+    }
+
+    /**
+     * @desc: 贸易订单对账单分页列表查询
+     * @author: yzc
+     * @date: 2023-07-20 15:03
+     * @Param params:
+     * @return: com.sckw.core.model.page.PageResult
+     */
+    public PageResult tradeOrderStatementList(TradeOrderStatementList params) {
+        TradeOrderStatementListParamDTO dto = BeanUtil.copyProperties(params, TradeOrderStatementListParamDTO.class);
+        List<Long> excludeIds = new ArrayList<>();
+        if (StringUtils.isNotBlank(params.getExcludeIds())) {
+            excludeIds = StringUtils.splitStrToList(params.getExcludeIds(), ",", Long.class);
+        }
+        dto.setEntId(LoginUserHolder.getEntId());
+        List<Long> goodsIds = goodsInfoService.getGoodsByGoodsNameAndTaxRate(params.getGoodsName(), params.getGoodsTaxRate());
+        PageHelper.startPage(params.getPage(), params.getPageSize());
+        List<OrderListResDTO> list = kwoTradeOrderMapper.tradeOrderStatementList(dto, goodsIds, excludeIds);
+        return buildResult(list, params.getPageSize());
+    }
+
+    /**
+     * @desc: 合同关联订单列表
+     * @author: yzc
+     * @date: 2023-07-27 17:05
+     * @Param params:
+     * @return: com.sckw.core.model.page.PageResult
+     */
+    public PageResult tradeOrderContractList(TradeOrderContractParam params) {
+        TradeOrderContractParamDTO dto = BeanUtil.copyProperties(params, TradeOrderContractParamDTO.class);
+        dto.setEntId(LoginUserHolder.getEntId());
+        List<Long> contractIds = StringUtils.splitStrToList(params.getContractIds(), ",", Long.class);
+        PageHelper.startPage(params.getPage(), params.getPageSize());
+        List<OrderListResDTO> list = kwoTradeOrderMapper.tradeOrderContractList(dto, contractIds);
+        return buildResult(list, params.getPageSize());
+    }
 }

+ 4 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderUnitService.java

@@ -153,4 +153,8 @@ public class KwoTradeOrderUnitService {
         });
         return orderIds;
     }
+
+    public void updateById(KwoTradeOrderUnit unit) {
+        kwoTradeOrderUnitMapper.updateById(unit);
+    }
 }

Vissa filer visades inte eftersom för många filer har ändrats