瀏覽代碼

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

zk 2 年之前
父節點
當前提交
d1da7a0f22
共有 61 個文件被更改,包括 1542 次插入455 次删除
  1. 169 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/ListUtils.java
  2. 7 7
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/OkHttpUtils.java
  3. 2 2
      sckw-common/sckw-common-mongo/src/main/java/com/sckw/mongo/model/SckwLogisticsOrder.java
  4. 5 3
      sckw-common/sckw-common-redis/src/main/java/com/sckw/redis/utils/RedissonUtils.java
  5. 11 6
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/GoodsInfoDetailRes.java
  6. 5 0
      sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/model/GoodsDetail.java
  7. 4 0
      sckw-modules/sckw-contract/pom.xml
  8. 6 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/LogisticsBaseInfoReqVo.java
  9. 3 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/LogisticsGoodsInfoReqVo.java
  10. 5 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryListReqVo.java
  11. 6 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/TradeBaseInfoReqVo.java
  12. 15 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryListResVo.java
  13. 5 2
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractLogisticsService.java
  14. 17 2
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractTradeService.java
  15. 1 0
      sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractLogisticsMapper.xml
  16. 1 0
      sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractTradeMapper.xml
  17. 5 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/AddressQueryResVo.java
  18. 0 5
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/FindEntCooperateResVo.java
  19. 1 1
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/CommonBusinessService.java
  20. 1 3
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmAddressService.java
  21. 2 1
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmCooperateApplyService.java
  22. 4 15
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmCooperateManageService.java
  23. 3 3
      sckw-modules/sckw-manage/src/main/resources/mapper/KwmCooperateMapper.xml
  24. 0 47
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/GoodsInfo.java
  25. 69 4
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/GoodsInfoDetailRes.java
  26. 16 28
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java
  27. 6 2
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/controller/KwpLedgerLogisticsController.java
  28. 4 0
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/controller/KwpLedgerTradeController.java
  29. 2 0
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/controller/KwpSettlementOfflineController.java
  30. 2 2
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/controller/KwpSettlementWalletController.java
  31. 14 1
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/dao/KwpLedgerLogisticsMapper.java
  32. 12 1
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/dto/SettlementTradeDto.java
  33. 1 0
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/req/LogisticsReq.java
  34. 2 0
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/req/SettlementOfflinePayReq.java
  35. 2 0
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/req/TradeReq.java
  36. 2 0
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/req/WalletPayReq.java
  37. 10 5
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/KwpLedgerLogisticsService.java
  38. 27 2
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/KwpLedgerTradeService.java
  39. 40 26
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/KwpSettlementOfflineService.java
  40. 37 23
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/KwpSettlementWalletService.java
  41. 124 24
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/PayCenterService.java
  42. 18 7
      sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/dubbo/PayCenterServiceImpl.java
  43. 65 12
      sckw-modules/sckw-payment/src/main/resources/mapper/KwpLedgerLogisticsMapper.xml
  44. 92 81
      sckw-modules/sckw-payment/src/main/resources/mapper/KwpLedgerTradeMapper.xml
  45. 2 1
      sckw-modules/sckw-payment/src/main/resources/mapper/KwpSettlementTradeMapper.xml
  46. 2 0
      sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwAcceptCarriageService.java
  47. 8 2
      sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwOrderService.java
  48. 5 0
      sckw-modules/sckw-report/src/main/java/com/sckw/report/service/param/TradeOrderStatementList.java
  49. 10 0
      sckw-modules/sckw-report/src/main/java/com/sckw/report/service/vo/AcceptCarriageOrderVo.java
  50. 4 5
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java
  51. 1 1
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java
  52. 6 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/LogisticsConsignmentController.java
  53. 7 14
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderMapper.java
  54. 20 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtLogisticsOrder.java
  55. 3 3
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/AddOrderDTO.java
  56. 8 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/OrderDetailVO.java
  57. 27 7
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/AcceptCarriageOrderService.java
  58. 2 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderService.java
  59. 595 93
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/LogisticsConsignmentService.java
  60. 8 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/TransportCommonService.java
  61. 11 2
      sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderMapper.xml

+ 169 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/ListUtils.java

@@ -0,0 +1,169 @@
+package com.sckw.core.utils;
+
+import java.util.*;
+
+/**
+ * @author lfdc
+ * @description listUtils
+ * @date 2023-08-08 11:08:11
+ */
+public class ListUtils {
+
+    /**
+     * 比较两个List集合是否相等
+     * <p>注:1. 如果一个List的引用为<code>null</code>,或者其包含的元素个数为0,那么该List在本逻辑处理中都算作空;
+     * <p>2. 泛型参数E涉及到对象,所以需要确保正确实现了对应对象的<code>equal()</code>方法。
+     *
+     * @param list1
+     * @param list2
+     * @return
+     */
+    public static <E> boolean isListEqual(List<E> list1, List<E> list2) {
+        // 两个list引用相同(包括两者都为空指针的情况)
+        if (list1 == list2) {
+            return true;
+        }
+
+        // 两个list都为空(包括空指针、元素个数为0)
+        if ((list1 == null && list2 != null && list2.size() == 0)
+                || (list2 == null && list1 != null && list1.size() == 0)) {
+            return true;
+        }
+
+        // 两个list元素个数不相同
+        if (list1.size() != list2.size()) {
+            return false;
+        }
+
+        // 两个list元素个数已经相同,再比较两者内容
+        // 采用这种可以忽略list中的元素的顺序
+        // 涉及到对象的比较是否相同时,确保实现了equals()方法
+        if (!list1.containsAll(list2) && !list2.containsAll(list1)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    public static void main(String[] args) {
+        String sortTyp = "asc"; // desc-倒叙  asc-正序
+        // 组装测试数据
+        List<Map<String, Object>> list = initMapList();
+
+        // 单个map排序
+        Map<String, Object> map = list.get(0);
+        Map<String, Object> sortMap = sortMap(map, sortTyp);
+        // Map<String, Object> sortMap = sortByKey(map, false);
+        for (Map.Entry<String, Object> entry : sortMap.entrySet()) {
+            System.out.println("单个map排序" + sortTyp);
+            System.out.println(entry.getKey());
+        }
+
+        // List<map>根据某个字段排序
+        sortMapListByFeild(list, "age", sortTyp);
+        System.out.println("按年纪取最大的一条数据,其姓名是:" + list.get(0).get("name"));
+    }
+
+    /**
+     * List<Map>根据map字段排序
+     *
+     * @param list
+     * @param feild   排序字段
+     * @param sortTyp 排序方式 desc-倒序 asc-正序
+     * @return
+     */
+    public static List<Map<String, Object>> sortMapListByFeild(List<Map<String, Object>> list, String feild, String sortTyp) {
+        if (CollectionUtils.isNotEmpty(list)) {
+            // 方法1
+            list.sort((m1, m2) -> {
+                if ("desc".equals(sortTyp)) {
+                    return String.valueOf(m2.get(feild)).compareTo(String.valueOf(m1.get(feild)));
+                } else {
+                    return String.valueOf(m1.get(feild)).compareTo(String.valueOf(m2.get(feild)));
+                }
+            });
+
+            // 方法2 也ok噢
+            /*if (StringUtils.equals(sortTyp, "desc")) {
+                Collections.sort(list, (m1, m2)-> String.valueOf(m2.get(feild)).compareTo(String.valueOf(m1.get(feild)))); // lamuda排序
+            } else {
+                Collections.sort(list, (m1, m2)-> String.valueOf(m1.get(feild)).compareTo(String.valueOf(m2.get(feild)))); // lamuda排序
+            }*/
+        }
+
+        return list;
+    }
+
+    /**
+     * map排序
+     *
+     * @param map
+     * @return
+     */
+    public static Map<String, Object> sortMap(Map<String, Object> map, String sortTyp) {
+        try {
+            if ("desc".equals(sortTyp)) {
+
+                Set<String> sortSet = new TreeSet<>(Comparator.reverseOrder()); // 定义个倒叙的set
+                sortSet.addAll(map.keySet()); // 获取全部key,添加后就自然倒序了
+
+                Map<String, Object> resp = new LinkedHashMap<>();
+                for (String key : sortSet) {
+                    resp.put(key, map.get(key)); // 按顺序放入新map
+                }
+
+                return resp;
+            } else {
+                return new TreeMap<>(map); // TreeMap 本身就是正序的
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 根据map的key排序
+     *
+     * @param map    待排序的map
+     * @param isDesc 是否降序,true:降序,false:升序
+     * @param <K>
+     * @param <V>
+     * @return
+     */
+    public static <K extends Comparable<? super K>, V> Map<K, V> sortByKey(Map<K, V> map, boolean isDesc) {
+        Map<K, V> result = new LinkedHashMap<>();
+        if (isDesc) {
+            map.entrySet().stream().sorted(Map.Entry.<K, V>comparingByKey().reversed())
+                    .forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
+        } else {
+            map.entrySet().stream().sorted(Map.Entry.<K, V>comparingByKey())
+                    .forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
+        }
+        return result;
+    }
+
+    private static List<Map<String, Object>> initMapList() {
+        List<Map<String, Object>> lists = new ArrayList<>();
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("name", "王五");
+        map.put("age", 55);
+        map.put("mobile", "15900001112");
+        lists.add(map);
+
+        Map<String, Object> map1 = new HashMap<>();
+        map1.put("name", "李四");
+        map1.put("age", 18);
+        map1.put("mobile", "15900001111");
+        lists.add(map1);
+
+        Map<String, Object> map2 = new HashMap<>();
+        map2.put("name", "赵六");
+        map2.put("age", 58);
+        map2.put("mobile", "13700001111");
+        lists.add(map2);
+
+        return lists;
+    }
+}

+ 7 - 7
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/OkHttpUtils.java

@@ -222,6 +222,7 @@ public class OkHttpUtils {
             }
             urlBuilder.deleteCharAt(urlBuilder.length() - 1);
         }
+        log.info("请求地址:\n" + urlBuilder.toString());
         return urlBuilder.toString();
     }
 
@@ -232,8 +233,7 @@ public class OkHttpUtils {
      */
     public byte[] fileSync() {
         setHeader(request);
-        try {
-            Response response = okHttpClient.newCall(request.build()).execute();
+        try (Response response = okHttpClient.newCall(request.build()).execute()) {
             if (response.isSuccessful()) {
                 assert response.body() != null;
                 return response.body().bytes();
@@ -252,8 +252,7 @@ public class OkHttpUtils {
      */
     public String sync() {
         setHeader(request);
-        try {
-            Response response = okHttpClient.newCall(request.build()).execute();
+        try (Response response = okHttpClient.newCall(request.build()).execute()) {
             assert response.body() != null;
             return response.body().string();
         } catch (IOException e) {
@@ -266,7 +265,7 @@ public class OkHttpUtils {
      * 异步请求,有返回值
      */
     public String async() {
-        StringBuilder buffer = new StringBuilder("");
+        StringBuilder buffer = new StringBuilder();
         setHeader(request);
         okHttpClient.newCall(request.build()).enqueue(new Callback() {
             @Override
@@ -275,6 +274,7 @@ public class OkHttpUtils {
                 buffer.append(response.body().string());
                 getSemaphoreInstance().release();
             }
+
             @Override
             public void onFailure(@NotNull Call call, @NotNull IOException e) {
                 buffer.append("请求出错:").append(e.getMessage());
@@ -299,12 +299,12 @@ public class OkHttpUtils {
         okHttpClient.newCall(request.build()).enqueue(new Callback() {
 
             @Override
-            public void onFailure(@NotNull Call call,@NotNull  IOException e) {
+            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                 callBack.onFailure(call, e.getMessage());
             }
 
             @Override
-            public void onResponse(Call call, Response response) throws IOException {
+            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                 assert response.body() != null;
                 callBack.onSuccessful(call, response.body().string());
             }

+ 2 - 2
sckw-common/sckw-common-mongo/src/main/java/com/sckw/mongo/model/SckwLogisticsOrder.java

@@ -164,12 +164,12 @@ public class SckwLogisticsOrder {
     /**
      * 总卸货量(自己承运总卸货量+分包承运总卸货量)
      */
-    private BigDecimal unloadTotalAmount;
+    private BigDecimal totalUnloadAmount;
 
     /**
      * 总装货量(自己承运总装货量+分包承运总装货量)
      */
-    private BigDecimal loadTotalAmount;
+    private BigDecimal totalLoadAmount;
 
     /**
      * 总亏吨量(自己承运总亏吨量+分包承运总亏吨量)

+ 5 - 3
sckw-common/sckw-common-redis/src/main/java/com/sckw/redis/utils/RedissonUtils.java

@@ -15,7 +15,7 @@ import java.util.concurrent.TimeUnit;
 @Slf4j
 public class RedissonUtils {
 
-    private RedissonClient redissonClient;
+    private final RedissonClient redissonClient;
 
     private static RedissonUtils redissonUtils;
 
@@ -278,10 +278,12 @@ public class RedissonUtils {
      */
     public static void unlock(String lockKey) {
         RLock lock = redissonUtils.redissonClient.getLock(lockKey);
-        lock.unlock();
+        if (lock.isLocked() && lock.isHeldByCurrentThread()) {
+            lock.unlock();
+        }
     }
 
-    public static Long getAtomicLong(String name,Long expired) {
+    public static Long getAtomicLong(String name, Long expired) {
         RAtomicLong atomicLong = redissonUtils.redissonClient.getAtomicLong(name);
         long number = atomicLong.incrementAndGet();
         atomicLong.expire(expired <= 0 ? Duration.ofSeconds(DEFAULT_EXPIRED) : Duration.ofSeconds(expired));

+ 11 - 6
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/GoodsInfoDetailRes.java

@@ -30,12 +30,12 @@ public class GoodsInfoDetailRes implements Serializable {
     /**
      * 商品单位label
      */
-    private String goodsUnitLabel;
+    private String unitLabel;
 
     /**
      * 商品发票税率label
      */
-    private String goodsTaxRateLabel;
+    private String taxRateLabel;
 
     /**
      * 商品id
@@ -45,12 +45,17 @@ public class GoodsInfoDetailRes implements Serializable {
     /**
      * 商品编号
      */
-    private String goodsCode;
+    private String code;
 
     /**
      * 商品名称
      */
-    private String goodsName;
+    private String name;
+
+    /**
+     * 商品库存
+     */
+    private BigDecimal goodsAmount;
 
     /**
      * 商品类型
@@ -60,12 +65,12 @@ public class GoodsInfoDetailRes implements Serializable {
     /**
      * 商品发票税率(%)
      */
-    private BigDecimal goodsTaxRate;
+    private BigDecimal taxRate;
 
     /**
      * 商品尺寸大小
      */
-    private String goodsSpec;
+    private String spec;
 
     /**
      * 单位(吨、方、箱、件)

+ 5 - 0
sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/model/GoodsDetail.java

@@ -167,6 +167,11 @@ public class GoodsDetail implements Serializable {
      */
     private String statusLabel;
 
+    /**
+     * 是否删除
+     */
+    private Integer delFlag;
+
     /**
      * 商品详情图片
      */

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

@@ -68,6 +68,10 @@
             <version>1.0.0</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-order-api</artifactId>
+        </dependency>
 
     </dependencies>
     <build>

+ 6 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/LogisticsBaseInfoReqVo.java

@@ -1,11 +1,13 @@
 package com.sckw.contract.model.vo.req;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.sckw.core.utils.RegularUtils;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Pattern;
 import jakarta.validation.constraints.Size;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -70,6 +72,8 @@ public class LogisticsBaseInfoReqVo implements Serializable {
     /**
      * 终止时间
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
     private Date endTime;
 
     /**
@@ -82,6 +86,8 @@ public class LogisticsBaseInfoReqVo implements Serializable {
      * 生效时间
      */
     @NotNull(message = "生效时间不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
     private Date startTime;
 
 }

+ 3 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/LogisticsGoodsInfoReqVo.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.vo.req;
 
+import jakarta.validation.constraints.DecimalMax;
 import jakarta.validation.constraints.DecimalMin;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Size;
@@ -56,6 +57,7 @@ public class LogisticsGoodsInfoReqVo implements Serializable {
     /**
      * 合理损耗
      */
+    @DecimalMax(value = "10000000", message = "合理损耗超长")
     private BigDecimal loss;
 
     /**
@@ -66,6 +68,7 @@ public class LogisticsGoodsInfoReqVo implements Serializable {
     /**
      * 扣亏货值
      */
+    @DecimalMax(value = "100000", message = "扣亏货值超长")
     private BigDecimal deficitPrice;
 
     /**

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

@@ -68,4 +68,9 @@ public class QueryListReqVo extends PageRequest implements Serializable {
      */
     private Long targetEntId;
 
+    /**
+     * 企业id
+     */
+    private Long entId;
+
 }

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

@@ -1,8 +1,10 @@
 package com.sckw.contract.model.vo.req;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -64,6 +66,8 @@ public class TradeBaseInfoReqVo implements Serializable {
     /**
      * 终止时间
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
     private Date endTime;
 
     /**
@@ -76,6 +80,8 @@ public class TradeBaseInfoReqVo implements Serializable {
      * 生效时间
      */
     @NotNull(message = "生效时间不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
     private Date startTime;
 
 }

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

@@ -1,8 +1,10 @@
 package com.sckw.contract.model.vo.res;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.sckw.core.utils.LongToStringUtils;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -78,11 +80,15 @@ public class QueryListResVo implements Serializable {
     /**
      * 创建时间
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
     /**
      * 终止日期
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
     private Date endTime;
 
     /**
@@ -116,14 +122,23 @@ public class QueryListResVo implements Serializable {
      */
     private String signingWayName;
 
+    /**
+     * 签约方式
+     */
+    private String signingWay;
+
     /**
      * 签约时间
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date signTime;
 
     /**
      * 起始日期
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
     private Date startTime;
 
     /**

+ 5 - 2
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractLogisticsService.java

@@ -450,7 +450,9 @@ public class KwcContractLogisticsService {
         PageHelper.startPage(reqVo.getPage(), reqVo.getPageSize());
         QueryListReqDto queryListReqDto = new QueryListReqDto();
         BeanUtils.copyProperties(reqVo, queryListReqDto);
-        queryListReqDto.setEntId(LoginUserHolder.getEntId());
+        if (Objects.isNull(reqVo.getEntId())) {
+            queryListReqDto.setEntId(LoginUserHolder.getEntId());
+        }
         List<QueryListResDto> queryListResDtos = kwcContractLogisticsMapper.queryList(queryListReqDto);
         if (CollectionUtils.isEmpty(queryListResDtos)) {
             return PageHelperUtil.getPageResult(new PageInfo<>());
@@ -491,7 +493,8 @@ public class KwcContractLogisticsService {
             }
             queryListResVo.setChargingName(DictEnum.getLabel(DictTypeEnum.CHARGING_TYPE.getType(), String.valueOf(queryListResDto.getCharging())));
             queryListResVo.setStatusName(Objects.requireNonNull(ContractStatusEnum.getName(queryListResDto.getStatus())).getName());
-            queryListResVo.setSigningWayName(DictEnum.getLabel(DictTypeEnum.SIGNING_TYPE.getType(), String.valueOf(queryListResDto.getSigningWay())));
+            queryListResVo.setSigningWayName(DictEnum.getLabel(DictTypeEnum.SIGNING_TYPE.getType(), queryListResDto.getSigningWay()));
+            queryListResVo.setSigningWay(queryListResDto.getSigningWay());
             queryListResVo.setPerformedAmount(queryListResDto.getPerformedAmount());
             queryListResVo.setAmount(queryListResDto.getAmount());
             list.add(queryListResVo);

+ 17 - 2
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractTradeService.java

@@ -24,6 +24,8 @@ import com.sckw.core.utils.*;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.excel.utils.EasyExcelUtil;
+import com.sckw.order.api.dubbo.TradeOrderInfoService;
+import com.sckw.order.api.model.ContractSignCompletedParam;
 import com.sckw.product.api.dubbo.GoodsInfoService;
 import com.sckw.product.api.model.KwpGoods;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
@@ -69,6 +71,9 @@ public class KwcContractTradeService {
     @DubboReference(version = "2.0.0", group = "design", check = false)
     private GoodsInfoService goodsInfoService;
 
+    @DubboReference(version = "2.0.0", group = "design", check = false)
+    private TradeOrderInfoService tradeOrderInfoService;
+
     /**
      * @return PageResult
      * @desc: 分页查询
@@ -80,7 +85,9 @@ public class KwcContractTradeService {
         PageHelper.startPage(reqVo.getPage(), reqVo.getPageSize());
         QueryListReqDto queryListReqDto = new QueryListReqDto();
         BeanUtils.copyProperties(reqVo, queryListReqDto);
-        queryListReqDto.setEntId(LoginUserHolder.getEntId());
+        if (Objects.isNull(reqVo.getEntId())) {
+            queryListReqDto.setEntId(LoginUserHolder.getEntId());
+        }
         List<QueryListResDto> queryListResDtos = kwcContractTradeMapper.queryList(queryListReqDto);
         if (CollectionUtils.isEmpty(queryListResDtos)) {
             return PageHelperUtil.getPageResult(new PageInfo<>());
@@ -122,7 +129,8 @@ public class KwcContractTradeService {
             }
             queryListResVo.setTradingName(DictEnum.getLabel(DictTypeEnum.TRADE_TYPE.getType(), String.valueOf(queryListResDto.getTrading())));
             queryListResVo.setStatusName(Objects.requireNonNull(ContractStatusEnum.getName(queryListResDto.getStatus())).getName());
-            queryListResVo.setSigningWayName(DictEnum.getLabel(DictTypeEnum.SIGNING_TYPE.getType(), String.valueOf(queryListResDto.getSigningWay())));
+            queryListResVo.setSigningWayName(DictEnum.getLabel(DictTypeEnum.SIGNING_TYPE.getType(), queryListResDto.getSigningWay()));
+            queryListResVo.setSigningWay(queryListResDto.getSigningWay());
             queryListResVo.setAmount(queryListResDto.getAmount());
             queryListResVo.setPerformedAmount(new BigDecimal("0"));
             list.add(queryListResVo);
@@ -456,6 +464,13 @@ public class KwcContractTradeService {
         if (kwcContractTradeMapper.updateById(kwcContractTrade) <= 0) {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.UPDATE_FAIL);
         }
+
+        //完结相关订单
+        ContractSignCompletedParam contractSignCompletedParam = new ContractSignCompletedParam();
+        contractSignCompletedParam.setContractId(kwcContractTrade.getContractPid());
+        contractSignCompletedParam.setUpdateBy(LoginUserHolder.getUserId());
+        contractSignCompletedParam.setUpdateByName(LoginUserHolder.getUserName());
+        tradeOrderInfoService.contractSignCompleted(contractSignCompletedParam);
     }
 
 

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

@@ -94,6 +94,7 @@
           <if test="targetEntId != null">
               and e.ent_id = #{targetEntId}
           </if>
+        order by a.create_time desc
     </select>
 
 </mapper>

+ 1 - 0
sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractTradeMapper.xml

@@ -101,5 +101,6 @@
         <if test="targetEntId != null">
             and e.ent_id = #{targetEntId}
         </if>
+        order by a.create_time desc
     </select>
 </mapper>

+ 5 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/AddressQueryResVo.java

@@ -99,6 +99,11 @@ public class AddressQueryResVo implements Serializable {
      */
     private String type;
 
+    /**
+     * 地址类型
+     */
+    private Integer typeCode;
+
     /**
      * 修改时间
      */

+ 0 - 5
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/vo/res/FindEntCooperateResVo.java

@@ -42,9 +42,4 @@ public class FindEntCooperateResVo implements Serializable {
      */
     private String phone;
 
-    /**
-     * 对方企业
-     */
-    List<FindEntCooperateResVo> target;
-
 }

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

@@ -181,7 +181,7 @@ public class CommonBusinessService {
             String targetEntName = entMap.get(targetEntId);
             String keywords = reqDto.getKeywords();
             if (StringUtils.isNotBlank(keywords)) {
-                if (!targetEntName.contains(keywords) && !matchContacts(keywords, cooperateManageQueryResDto)) {
+                if (StringUtils.isBlank(targetEntName) || (!targetEntName.contains(keywords) && !matchContacts(keywords, cooperateManageQueryResDto))) {
                     continue;
                 }
             }

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

@@ -124,6 +124,7 @@ public class KwmAddressService {
         kwmAddresses.forEach(item -> {
             AddressQueryResVo addressQueryResVo = new AddressQueryResVo();
             BeanUtils.copyProperties(item, addressQueryResVo);
+            addressQueryResVo.setTypeCode(item.getType());
             UserCacheResDto userCacheResDto = userCacheResDtoMap.get(item.getCreateBy());
             SysDictResDto sysDictResDto = stringSysDictResDtoMap.get(DictTypeEnum.ADDRESS_TYPE.getType() + Global.POUND + item.getType());
             if (Objects.nonNull(sysDictResDto)) {
@@ -254,9 +255,6 @@ public class KwmAddressService {
      */
     @Transactional(rollbackFor = {})
     public void add(AddressAddReqVo reqVo) {
-        Integer cityCode = reqVo.getCityCode();
-
-
         LambdaQueryWrapper<KwmAddress> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(KwmAddress::getName, reqVo.getName()).
                 eq(KwmAddress::getDelFlag, Global.NO).

+ 2 - 1
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmCooperateApplyService.java

@@ -357,6 +357,7 @@ public class KwmCooperateApplyService {
                     in(KwmCooperateType::getStatus, statusList).
                     eq(KwmCooperateType::getDelFlag, Global.NO));
             List<KwmCooperateType> updateKwmCooperateTypes = kwmCooperateTypes.stream().filter(x -> x.getStatus().equals(CooperateStatusEnum.PROCESS.getCode())).toList();
+            List<Integer> currentStatusList = updateKwmCooperateTypes.stream().map(KwmCooperateType::getStatus).toList();
             if (CollectionUtils.isEmpty(updateKwmCooperateTypes)) {
                 throw new SystemException(HttpStatus.QUERY_FAIL_CODE, HttpStatus.COOPERATE_CANCEL_EXISTS);
             }
@@ -374,7 +375,7 @@ public class KwmCooperateApplyService {
             item.setUpdateBy(userId);
             item.setUpdateTime(date);
             item.setApprovalRemark(remark);
-            if (kwmCooperateTypes.stream().noneMatch(x -> x.getStatus().equals(CooperateStatusEnum.OK.getCode()))) {
+            if (!currentStatusList.contains(CooperateStatusEnum.OK.getCode())) {
                 item.setStatus(type);
             }
             if (kwmCooperateMapper.updateById(item) <= 0) {

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

@@ -200,7 +200,7 @@ public class KwmCooperateManageService {
      * @date: 2023/7/11
      */
     private boolean checkUserPermission(int status) {
-        return status != CooperateStatusEnum.OK.getCode() && LoginUserHolder.getSystemType() != SystemTypeEnum.MANAGE.getCode();
+        return status != CooperateStatusEnum.OK.getCode() && !LoginUserHolder.getSystemType().equals(SystemTypeEnum.MANAGE.getCode());
     }
 
     /**
@@ -254,8 +254,7 @@ public class KwmCooperateManageService {
     public List<FindListGroupResVo> findListGroup(CooperateManageQueryReqVo reqVo) {
         //初始化分组返参
         List<FindListGroupResVo> result = commonBusinessService.init();
-
-        List<CooperateManageQueryResVo> list = commonBusinessService.findList(buildQueryParam(reqVo));
+        List<CooperateManageQueryResVo> list = findList(buildQueryParam(reqVo));
         if (CollectionUtils.isEmpty(list)) {
             return result;
         }
@@ -273,7 +272,7 @@ public class KwmCooperateManageService {
      * @author: czh
      * @date: 2023/7/22
      */
-    public FindEntCooperateResVo findEntCooperate(FindEntCooperateReqVo reqVo) {
+    public List<FindEntCooperateResVo> findEntCooperate(FindEntCooperateReqVo reqVo) {
         Long id = reqVo.getId();
         Integer cooperateType = reqVo.getCooperateType();
         LambdaQueryWrapper<KwmCooperate> wrapper = new LambdaQueryWrapper<>();
@@ -345,17 +344,7 @@ public class KwmCooperateManageService {
 //                targetEntList.add(findEntCooperateResVo);
 //            });
 //        });
-
-        FindEntCooperateResVo findEntCooperateResVo = new FindEntCooperateResVo();
-        EntCacheResDto entCacheResDto = remoteSystemService.queryEntCacheById(id);
-        KwmCooperate kwmCooperate = kwmCooperates.get(0);
-        findEntCooperateResVo.setEntId(id);
-        findEntCooperateResVo.setEntName(entCacheResDto.getFirmName());
-        findEntCooperateResVo.setContactsId(kwmCooperate.getInviterEntId().equals(id) ? kwmCooperate.getInviterContactsId() : kwmCooperate.getInviteeContactsId());
-        findEntCooperateResVo.setContacts(kwmCooperate.getInviterEntId().equals(id) ? kwmCooperate.getInviterContacts() : kwmCooperate.getInviteeContacts());
-        findEntCooperateResVo.setPhone(kwmCooperate.getInviterEntId().equals(id) ? kwmCooperate.getInviterPhone() : kwmCooperate.getInviteePhone());
-        findEntCooperateResVo.setTarget(targetEntList);
-        return findEntCooperateResVo;
+        return targetEntList;
     }
 
 

+ 3 - 3
sckw-modules/sckw-manage/src/main/resources/mapper/KwmCooperateMapper.xml

@@ -70,7 +70,7 @@
                and exists (select 1
                              from kwm_cooperate_type c
                             where c.cooperate_id = a.id
-                               and c.statu = 1
+                               and c.status = 1
                                and c.del_flag = 0
                               and c.type in
                             <foreach collection="reqDto.cooperateTypes" item="item" open="(" close=")" separator=",">
@@ -151,7 +151,7 @@
             and exists (select 1
                             from kwm_cooperate_type c
                             where c.cooperate_id = a.id
-                              and c.statu = 1
+                              and c.status = 1
                                 and c.del_flag = 0
                             and c.type in
                         <foreach collection="reqDto.cooperateTypes" item="item" open="(" close=")" separator=",">
@@ -160,7 +160,7 @@
                         )
         </if>
         <if test="reqDto.status != null and reqDto.status.size() > 0">
-            and b.status in
+            and a.status in
             <foreach collection="reqDto.status" item="item" open="(" close=")" separator=",">
                 #{item}
             </foreach>

+ 0 - 47
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/GoodsInfo.java

@@ -26,36 +26,6 @@ public class GoodsInfo {
     @NotNull(message = "商品id不能为空")
     private Long goodsId;
 
-    /**
-     * 商品编号
-     */
-    @NotBlank(message = "商品编号不能为空")
-    private String goodsCode;
-
-    /**
-     * 商品名称
-     */
-    @NotBlank(message = "商品名称不能为空")
-    private String goodsName;
-
-    /**
-     * 商品类型
-     */
-    @NotBlank(message = "商品类型不能为空")
-    private String goodsType;
-
-    /**
-     * 商品发票税率(%)
-     */
-    @NotBlank(message = "商品发票税率不能为空")
-    private String goodsTaxRate;
-
-    /**
-     * 商品尺寸大小
-     */
-    @NotBlank(message = "商品尺寸大小不能为空")
-    private String goodsSpec;
-
     /**
      * 单位(吨、方、箱、件)
      */
@@ -73,21 +43,4 @@ public class GoodsInfo {
     @DecimalMin(value = "0.00",message = "订单成交单价最小为零")
     private BigDecimal unitPrice;
 
-    /**
-     * 商品skuId
-     */
-    private Long skuId;
-
-    /**
-     * 收款单位id
-     */
-    @NotNull(message = "收款单位id不能为空")
-    private Long collectionUnitId;
-
-    /**
-     * 收款单位名称
-     */
-    @NotBlank(message = "收款单位名称不能为空")
-    private String collectionUnit;
-
 }

+ 69 - 4
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/GoodsInfoDetailRes.java

@@ -1,6 +1,5 @@
 package com.sckw.order.model.vo.res;
 
-import com.sckw.order.model.vo.req.GoodsInfo;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
@@ -8,6 +7,7 @@ import lombok.experimental.Accessors;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 /**
  * @desc: 商品信息详情响应
@@ -18,10 +18,70 @@ import java.io.Serializable;
 @Setter
 @ToString
 @Accessors(chain = true)
-public class GoodsInfoDetailRes extends GoodsInfo implements Serializable {
+public class GoodsInfoDetailRes implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1427251412395875742L;
+
+    /**
+     * 商品id
+     */
+    private Long goodsId;
+
+    /**
+     * 商品编号
+     */
+    private String code;
+
+    /**
+     * 商品名称
+     */
+    private String name;
+
+    /**
+     * 商品类型
+     */
+    private String goodsType;
+
+    /**
+     * 商品发票税率(%)
+     */
+    private String taxRate;
+
+    /**
+     * 商品尺寸大小
+     */
+    private String spec;
+
+    /**
+     * 单位(吨、方、箱、件)
+     */
+    private String unit;
+    /**
+     * 价格段id
+     */
+    private Long priceRangeId;
+
+    /**
+     * 订单成交单价
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 商品skuId
+     */
+    private Long skuId;
+
+    /**
+     * 收款单位id
+     */
+    private Long collectionUnitId;
+
+    /**
+     * 收款单位名称
+     */
+    private String collectionUnit;
+
     /**
      * 商品类型label
      */
@@ -30,11 +90,16 @@ public class GoodsInfoDetailRes extends GoodsInfo implements Serializable {
     /**
      * 商品单位label
      */
-    private String goodsUnitLabel;
+    private String unitLabel;
 
     /**
      * 商品发票税率label
      */
-    private String goodsTaxRateLabel;
+    private String taxRateLabel;
+
+    /**
+     * 商品库存
+     */
+    private BigDecimal goodsAmount;
 
 }

+ 16 - 28
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -27,6 +27,7 @@ import com.sckw.payment.api.model.constant.ChannelEnum;
 import com.sckw.payment.api.model.dto.WalletDto;
 import com.sckw.payment.api.model.dto.common.R;
 import com.sckw.product.api.dubbo.GoodsInfoService;
+import com.sckw.product.api.model.GoodsDetail;
 import com.sckw.product.api.model.KwpGoods;
 import com.sckw.redis.constant.RedisConstant;
 import com.sckw.redis.utils.RedissonUtils;
@@ -118,8 +119,16 @@ public class KwoTradeOrderService {
         GoodsInfo goodsInfo = param.getGoodsInfo();
         KwoTradeOrderGoods goods = BeanUtils.copyProperties(goodsInfo, KwoTradeOrderGoods.class);
         if (Objects.nonNull(goods)) {
-            goods.setTOrderId(id).setTOrderNo(tOrderNo);
+            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);
+            order.setGoodsId(goodsDetail.getId()).setUnit(goodsDetail.getUnit()).setUnitPrice(goods.getUnitPrice())
+                    .setGoodsName(goodsDetail.getName()).setGoodsType(goodsDetail.getGoodsType()).setGoodsCode(goodsDetail.getCode())
+                    .setGoodsTaxRate(goodsDetail.getTaxRate()).setGoodsSpec(goodsDetail.getSpec());
             BeanUtils.copyProperties(goodsInfo, order);
         }
         //单位信息
@@ -384,12 +393,12 @@ public class KwoTradeOrderService {
                 EntCacheResDto entCache = remoteSystemService.queryEntCacheById(goods.getEntId());
                 GoodsInfoDetailRes goodsDetail = new GoodsInfoDetailRes();
                 goodsDetail.setGoodsTypeLabel(DictEnum.getLabel(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), goods.getGoodsType()))
-                        .setGoodsUnitLabel(DictEnum.getLabel(DictTypeEnum.UNIT_TYPE.getType(), goods.getUnit()))
-                        .setGoodsTaxRateLabel(DictEnum.getLabel(DictTypeEnum.TAX_RATE.getType(), goods.getTaxRate()))
-                        .setGoodsId(goods.getId()).setGoodsCode(goods.getCode()).setGoodsName(goods.getName())
-                        .setGoodsType(goods.getGoodsType()).setGoodsTaxRate(goods.getTaxRate()).setGoodsSpec(goods.getSpec())
+                        .setUnitLabel(DictEnum.getLabel(DictTypeEnum.UNIT_TYPE.getType(), goods.getUnit())).setGoodsAmount(goods.getAmount())
+                        .setTaxRateLabel(DictEnum.getLabel(DictTypeEnum.TAX_RATE.getType(), goods.getTaxRate()))
+                        .setGoodsId(goods.getId()).setCode(goods.getCode()).setName(goods.getName())
+                        .setGoodsType(goods.getGoodsType()).setTaxRate(goods.getTaxRate()).setSpec(goods.getSpec())
                         .setUnit(goods.getUnit()).setPriceRangeId(orderGoods.getPriceRangeId()).setUnitPrice(orderGoods.getUnitPrice())
-                        .setSkuId(orderGoods.getSkuId()).setCollectionUnitId(goods.getEntId()).setCollectionUnitId(goods.getEntId())
+                        .setSkuId(orderGoods.getSkuId()).setCollectionUnitId(goods.getEntId())
                         .setCollectionUnit(Objects.isNull(entCache) ? null : entCache.getFirmName());
                 detail.setGoodsInfo(goodsDetail);
             }
@@ -539,36 +548,15 @@ public class KwoTradeOrderService {
         if (Objects.isNull(goodsInfo.getGoodsId())) {
             throw new BusinessException("商品id不能为空!");
         }
-        if (StringUtils.isBlank(goodsInfo.getGoodsCode())) {
-            throw new BusinessException("商品编号不能为空!");
-        }
-        if (StringUtils.isBlank(goodsInfo.getGoodsName())) {
-            throw new BusinessException("商品名称不能为空!");
-        }
-        if (StringUtils.isBlank(goodsInfo.getGoodsType())) {
-            throw new BusinessException("商品类型不能为空!");
-        }
-        if (StringUtils.isBlank(goodsInfo.getGoodsTaxRate())) {
-            throw new BusinessException("商品发票税率不能为空!");
-        }
-        if (StringUtils.isBlank(goodsInfo.getGoodsSpec())) {
-            throw new BusinessException("商品尺寸大小不能为空!");
-        }
         if (StringUtils.isBlank(goodsInfo.getUnit())) {
             throw new BusinessException("商品单位不能为空!");
         }
-        if (Objects.isNull(goodsInfo.getPriceRangeId())) {
+        if (Objects.isNull(goodsInfo.getPriceRangeId()) && Objects.equals(source, DictEnum.TORDER_SOURCE_1.getValue())) {
             throw new BusinessException("价格段id不能为空!");
         }
         if (Objects.isNull(goodsInfo.getUnitPrice()) || goodsInfo.getUnitPrice().compareTo(BigDecimal.ZERO) < 0) {
             throw new BusinessException("订单成交单价不能为空且不能为负数!");
         }
-        if (Objects.isNull(goodsInfo.getCollectionUnitId())) {
-            throw new BusinessException("收款单位id不能为空!");
-        }
-        if (StringUtils.isBlank(goodsInfo.getCollectionUnit())) {
-            throw new BusinessException("收款单位名称不能为空!");
-        }
 
         List<UnitInfo> unitInfos = param.getUnitInfo();
         if (CollectionUtils.isEmpty(unitInfos)) {

+ 6 - 2
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/controller/KwpLedgerLogisticsController.java

@@ -139,7 +139,9 @@ public class KwpLedgerLogisticsController {
      */
     @PostMapping("shipperCount")
     public HttpResult shipperCount(@RequestBody @Valid LogisticsReq logisticsReq) {
-        return HttpResult.ok(kwpLedgerLogisticsService.orderCount(logisticsReq, 1));
+        logisticsReq.setUnitType(LogisticsUnitType.CARRIER);
+        logisticsReq.setUnitTypeTwo(LogisticsUnitType.SHIPPER);
+        return HttpResult.ok(kwpLedgerLogisticsService.orderCount(logisticsReq));
     }
 
     /**
@@ -150,7 +152,9 @@ public class KwpLedgerLogisticsController {
      */
     @PostMapping("carrierCount")
     public HttpResult carrierCount(@RequestBody @Valid LogisticsReq logisticsReq) {
-        return HttpResult.ok(kwpLedgerLogisticsService.orderCount(logisticsReq, 2));
+        logisticsReq.setUnitType(LogisticsUnitType.SHIPPER);
+        logisticsReq.setUnitTypeTwo(LogisticsUnitType.CARRIER);
+        return HttpResult.ok(kwpLedgerLogisticsService.orderCount(logisticsReq));
     }
 
     /**

+ 4 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/controller/KwpLedgerTradeController.java

@@ -8,6 +8,7 @@ import com.sckw.payment.model.dto.ILedger;
 import com.sckw.payment.model.vo.req.*;
 import com.sckw.payment.model.vo.res.LedgerTradeVo;
 import com.sckw.payment.service.KwpLedgerTradeService;
+import io.seata.spring.annotation.GlobalTransactional;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
@@ -140,6 +141,7 @@ public class KwpLedgerTradeController {
     @PostMapping("sellCount")
     public HttpResult sellCount(@RequestBody @Valid TradeReq tradeReq) {
         tradeReq.setUnitType(TradeUnitType.PURCHASE);
+        tradeReq.setUnitTypeTwo(TradeUnitType.SELL);
         return HttpResult.ok(kwpLedgerTradeService.orderCount(tradeReq));
     }
 
@@ -151,6 +153,7 @@ public class KwpLedgerTradeController {
     @PostMapping("purchaseCount")
     public HttpResult purchaseCount(@RequestBody @Valid TradeReq tradeReq) {
         tradeReq.setUnitType(TradeUnitType.SELL);
+        tradeReq.setUnitTypeTwo(TradeUnitType.PURCHASE);
         return HttpResult.ok(kwpLedgerTradeService.orderCount(tradeReq));
     }
 
@@ -219,6 +222,7 @@ public class KwpLedgerTradeController {
      * @return
      */
     @PostMapping("success")
+    @GlobalTransactional(name = "default_tx_group", rollbackFor = Exception.class)
     public HttpResult orderSuccess(@RequestBody @Valid LedgerSuccessReq ledgerReq) {
         return HttpResult.ok(kwpLedgerTradeService.orderSuccess(ledgerReq));
     }

+ 2 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/controller/KwpSettlementOfflineController.java

@@ -6,6 +6,7 @@ import com.sckw.payment.model.constant.SettlementOrderTypeEnum;
 import com.sckw.payment.model.vo.req.SettlementOfflinePayReq;
 import com.sckw.payment.model.vo.req.SettlementOfflineReq;
 import com.sckw.payment.service.KwpSettlementOfflineService;
+import io.seata.spring.annotation.GlobalTransactional;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
 import org.springframework.web.bind.annotation.*;
@@ -61,6 +62,7 @@ public class KwpSettlementOfflineController {
      * @param payReq
      * @return
      */
+    @GlobalTransactional(name = "default_tx_group", rollbackFor = Exception.class)
     @PostMapping(name = "销售收款-收款确认-线下付款", path = "confirmTradeCollection")
     public HttpResult confirmTradeCollection(@Valid @RequestBody SettlementOfflinePayReq payReq) {
         payReq.setOrderType(SettlementOrderTypeEnum.TRADE.getStatus());

+ 2 - 2
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/controller/KwpSettlementWalletController.java

@@ -7,14 +7,13 @@ import com.sckw.payment.model.vo.req.OfflinePaymentReq;
 import com.sckw.payment.model.vo.req.SettlementWalletReq;
 import com.sckw.payment.model.vo.req.WalletPayReq;
 import com.sckw.payment.service.KwpSettlementWalletService;
+import io.seata.spring.annotation.GlobalTransactional;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotBlank;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.math.BigDecimal;
-
 /**
  * 结算-电子钱包结算记录(交易订单结算/物流订单结算)
  *
@@ -82,6 +81,7 @@ public class KwpSettlementWalletController {
      * 采购-货到付款
      */
     @PostMapping(name = "销售-付款确认-(新增电子钱包记录-采购货到付款)", path = "confirmReceive")
+    @GlobalTransactional(name = "default_tx_group", rollbackFor = Exception.class)
     public HttpResult confirmTradePayment(@RequestBody @Valid WalletPayReq payReq) {
         return HttpResult.ok(kwpSettlementWalletService.confirmTradePayment(payReq));
     }

+ 14 - 1
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/dao/KwpLedgerLogisticsMapper.java

@@ -36,13 +36,26 @@ public interface KwpLedgerLogisticsMapper extends BaseMapper<KwpLedgerLogistics>
      */
     List<LedgerCarrierDto> carrierSelect(@Param("logisticsReq") LogisticsReq logisticsReq);
 
-    Map<String, Long> countOrder(@Param("logisticsReq") LogisticsReq logisticsReq, @Param("unitType") Integer unitType);
+    /**
+     * 统计订单数量
+     *
+     * @param logisticsReq
+     * @return
+     */
+    Map<String, Long> countOrder(@Param("logisticsReq") LogisticsReq logisticsReq);
 
     LedgerLogisticsDto selectId(@Param("id") Long id, @Param("unitType") Integer unitType);
 
 
     List<LedgerShipperDto> selectShipperIds(@Param("ids") List<Long> ids);
 
+    /**
+     * 承运方
+     * 1托运方、2承运方
+     *
+     * @param ids
+     * @return
+     */
     List<LedgerCarrierDto> selectCarrierIds(@Param("ids") List<Long> ids);
 
 

+ 12 - 1
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/dto/SettlementTradeDto.java

@@ -13,7 +13,10 @@ import java.util.Objects;
  * @date 2023-07-20 12:26
  */
 public class SettlementTradeDto implements ISettlement {
-
+    /**
+     * 对账单id主键
+     */
+    private Long ledgerId;
     /**
      * 主键
      */
@@ -119,6 +122,14 @@ public class SettlementTradeDto implements ISettlement {
      */
     private Integer delFlag;
 
+    public Long getLedgerId() {
+        return ledgerId;
+    }
+
+    public void setLedgerId(Long ledgerId) {
+        this.ledgerId = ledgerId;
+    }
+
     public Long getId() {
         return id;
     }

+ 1 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/req/LogisticsReq.java

@@ -29,4 +29,5 @@ public class LogisticsReq extends BasePara {
     private String ids;
     private Long entId;
     private Integer unitType;
+    private Integer unitTypeTwo;
 }

+ 2 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/req/SettlementOfflinePayReq.java

@@ -3,6 +3,7 @@ package com.sckw.payment.model.vo.req;
 import com.sckw.core.model.base.IdsList;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Positive;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -26,6 +27,7 @@ public class SettlementOfflinePayReq implements IdsList, Serializable {
     @NotBlank(message = "结算单id不能为空")
     private String id;
     @NotNull(message = "结算单金额不能为空")
+    @Positive(message = "结算金额必须大于0")
     private BigDecimal payPrice;
     @NotBlank(message = "相关附近不能为空")
     private String url;

+ 2 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/req/TradeReq.java

@@ -26,5 +26,7 @@ public class TradeReq extends BasePara {
     private String ids;
     private Long entId;
     private Integer unitType;
+    //另一方企业
+    private Integer unitTypeTwo;
 
 }

+ 2 - 0
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/model/vo/req/WalletPayReq.java

@@ -3,6 +3,7 @@ package com.sckw.payment.model.vo.req;
 import com.sckw.core.model.base.IdsList;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Positive;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -25,5 +26,6 @@ public class WalletPayReq implements IdsList {
      * 金额
      */
     @NotNull(message = "付款金额不能为空")
+    @Positive(message = "付款金额必须大于0")
     private BigDecimal price;
 }

+ 10 - 5
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/KwpLedgerLogisticsService.java

@@ -101,6 +101,7 @@ public class KwpLedgerLogisticsService extends AbsLedger {
     public PageRes<ILedger> shipperList(LogisticsReq logisticsReq) {
         fillPara(logisticsReq);
         logisticsReq.setUnitType(LogisticsUnitType.CARRIER);
+        logisticsReq.setUnitTypeTwo(LogisticsUnitType.SHIPPER);
         PageHelper.startPage(logisticsReq.getPage(), logisticsReq.getPageSize());
         List<LedgerShipperDto> kwpLedgerLogisticsList = logisticsMapper.shipperSelect(logisticsReq);
         PageInfo<ILedger> ledgerShipperDtoPageInfo = new PageInfo<>(kwpLedgerLogisticsList);
@@ -115,6 +116,7 @@ public class KwpLedgerLogisticsService extends AbsLedger {
     public PageRes<ILedger> carrierList(LogisticsReq logisticsReq) {
         fillPara(logisticsReq);
         logisticsReq.setUnitType(LogisticsUnitType.SHIPPER);
+        logisticsReq.setUnitTypeTwo(LogisticsUnitType.CARRIER);
         PageHelper.startPage(logisticsReq.getPage(), logisticsReq.getPageSize());
         List<LedgerCarrierDto> kwpLedgerLogisticsList = logisticsMapper.carrierSelect(logisticsReq);
         PageInfo<ILedger> ledgerShipperDtoPageInfo = new PageInfo<>(kwpLedgerLogisticsList);
@@ -457,13 +459,14 @@ public class KwpLedgerLogisticsService extends AbsLedger {
 
     /**
      * 按类型统计表头的数据
+     * 1-托运方 2-承运方
      *
-     * @param unitType 1-托运方 2-承运方
+     * @param logisticsReq 查询参数
      * @return 统计数据
      */
-    public List<TableTop> orderCount(LogisticsReq logisticsReq, Integer unitType) {
+    public List<TableTop> orderCount(LogisticsReq logisticsReq) {
         logisticsReq.setEntId(LoginUserHolder.getEntId());
-        Map<String, Long> map = logisticsMapper.countOrder(logisticsReq, unitType);
+        Map<String, Long> map = logisticsMapper.countOrder(logisticsReq);
         TableTop ledgerCountVo;
         /*统计数据转换*/
         List<TableTop> res = new ArrayList<>();
@@ -551,8 +554,10 @@ public class KwpLedgerLogisticsService extends AbsLedger {
         ledgerLogisticsDetailVo.setEndTime(ledgerLogisticsDto.getEndTime());
         ledgerLogisticsDetailVo.setRemark(ledgerLogisticsDto.getRemark());
         /*查询物流订单详情*/
-        List<LogisticsOrderVO> acceptCarriageOrderList = transportDubboService.getAcceptCarriageOrderList(kwpLedgerLogisticsOrders.stream().map(a -> Long.toString(a.getLOrderId())).collect(Collectors.toList()));
-        ledgerLogisticsDetailVo.setOrderList(acceptCarriageOrderList);
+        if (!CollectionUtils.isEmpty(kwpLedgerLogisticsOrders)) {
+            List<LogisticsOrderVO> acceptCarriageOrderList = transportDubboService.getAcceptCarriageOrderList(kwpLedgerLogisticsOrders.stream().map(a -> Long.toString(a.getLOrderId())).collect(Collectors.toList()));
+            ledgerLogisticsDetailVo.setOrderList(acceptCarriageOrderList);
+        }
         return ledgerLogisticsDetailVo;
     }
 

+ 27 - 2
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/KwpLedgerTradeService.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.sckw.core.common.enums.NumberConstant;
+import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.constant.Global;
@@ -16,6 +17,7 @@ import com.sckw.core.utils.StringTimeUtil;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.order.api.model.OrderDetailRes;
+import com.sckw.order.api.model.UpdateOrderStatusParam;
 import com.sckw.payment.dao.KwpLedgerTradeMapper;
 import com.sckw.payment.model.*;
 import com.sckw.payment.model.constant.LedgerEnum;
@@ -119,6 +121,7 @@ public class KwpLedgerTradeService extends AbsLedger {
         fillPara(tradeReq);
         PageHelper.startPage(tradeReq.getPage(), tradeReq.getPageSize());
         tradeReq.setUnitType(TradeUnitType.PURCHASE);
+        tradeReq.setUnitTypeTwo(TradeUnitType.SELL);
         List<LedgerSellDto> ledgerTradeDto = tradeMapper.sellList(tradeReq);
         PageInfo<ILedger> ledgerPageInfo = new PageInfo<>(ledgerTradeDto);
 
@@ -140,6 +143,7 @@ public class KwpLedgerTradeService extends AbsLedger {
         fillPara(tradeReq);
         PageHelper.startPage(tradeReq.getPage(), tradeReq.getPageSize());
         tradeReq.setUnitType(TradeUnitType.SELL);
+        tradeReq.setUnitTypeTwo(TradeUnitType.PURCHASE);
         List<LedgerPurchaseDto> ledgerTradeDto = tradeMapper.purchaseList(tradeReq);
         PageInfo<ILedger> ledgerPageInfo = new PageInfo<>(ledgerTradeDto);
         //字典转换
@@ -216,7 +220,7 @@ public class KwpLedgerTradeService extends AbsLedger {
         }
         List<KwpLedgerTradeOrder> collect = resList.stream().map(a -> {
             KwpLedgerTradeOrder kwpLedgerTradeOrder = new KwpLedgerTradeOrder();
-            kwpLedgerTradeOrder.setId(new IdWorker(1).nextId());
+            kwpLedgerTradeOrder.setId(new IdWorker(NumberConstant.ONE).nextId());
             kwpLedgerTradeOrder.setTLedgerId(kwpLedgerTrade.getId());
             kwpLedgerTradeOrder.setTOrderId(a.getId());
             kwpLedgerTradeOrder.setTOrderNo(a.getTOrderNo());
@@ -432,13 +436,17 @@ public class KwpLedgerTradeService extends AbsLedger {
      * @param ledgerReq 对账完成参数
      * @return
      */
-    @Transactional(rollbackFor = Exception.class)
     public String orderSuccess(LedgerSuccessReq ledgerReq) {
         Long id = ledgerReq.getIdLong();
         //校验对账单状态
         KwpLedgerTrade kwpLedgerTrade = tradeMapper.selectById(id);
         orderCheck(kwpLedgerTrade);
         successCheck(kwpLedgerTrade.getStatus());
+        //查询对账单关联的订单
+        List<KwpLedgerTradeOrder> kwpLedgerTradeOrders = tradeOrderService.queryList(id);
+        if (CollectionUtils.isEmpty(kwpLedgerTradeOrders)) {
+            throw new BusinessException("未找到关联的贸易订单");
+        }
         //更新对账单
         kwpLedgerTrade.setReceiptTime(LocalDateTime.of(ledgerReq.getReceiptTime(), LocalTime.MIN));
         kwpLedgerTrade.setStatus(LedgerEnum.SUCCESS.getStatus());
@@ -467,6 +475,17 @@ public class KwpLedgerTradeService extends AbsLedger {
         kwpSettlementTrade.setDelFlag(Global.UN_DELETED);
         settlementTradeService.save(kwpSettlementTrade);
 
+        //更新贸易订单状态
+        List<Long> list = kwpLedgerTradeOrders.stream().map(KwpLedgerTradeOrder::getTOrderId).toList();
+        for (Long aLong : list) {
+            UpdateOrderStatusParam updateOrderStatusParam = new UpdateOrderStatusParam();
+            updateOrderStatusParam.setTOrderId(aLong);
+            updateOrderStatusParam.setStatus(Integer.valueOf(DictEnum.TORDER_STATUS_6.getValue()));
+            updateOrderStatusParam.setUpdateBy(LoginUserHolder.getUserId());
+            updateOrderStatusParam.setUpdateByName(LoginUserHolder.getUserName());
+            tradeOrderInfoService.updateOrderStatus(updateOrderStatusParam);
+        }
+        //保存操作记录
         tradeTrackService.saveTrack(id, Global.EMPTY_STRING, LedgerTrackEnum.SUCCESS);
         return "对账完成";
     }
@@ -499,6 +518,9 @@ public class KwpLedgerTradeService extends AbsLedger {
      * @return 对账单数据
      */
     public List<ILedger> selectSellList(List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return new ArrayList<>();
+        }
         List<LedgerSellDto> ledgerTradeDto = tradeMapper.selectSellIds(ids);
         List<ILedger> ledgerSellDto = new ArrayList<>(ledgerTradeDto);
         changeDict(ledgerSellDto);
@@ -512,6 +534,9 @@ public class KwpLedgerTradeService extends AbsLedger {
      * @return 对账单数据
      */
     public List<ILedger> selectPurchaseList(List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return new ArrayList<>();
+        }
         List<LedgerPurchaseDto> ledgerTradeDto = tradeMapper.selectPurchaseIds(ids);
         List<ILedger> ledgerSellDto = new ArrayList<>(ledgerTradeDto);
         changeDict(ledgerSellDto);

+ 40 - 26
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/KwpSettlementOfflineService.java

@@ -2,10 +2,15 @@ package com.sckw.payment.service;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.sckw.core.common.enums.NumberConstant;
+import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.exception.BusinessException;
+import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.page.PageRes;
 import com.sckw.core.utils.IdWorker;
 import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.order.api.dubbo.TradeOrderInfoService;
+import com.sckw.order.api.model.UpdateOrderStatusParam;
 import com.sckw.payment.dao.KwpSettlementLogisticsMapper;
 import com.sckw.payment.dao.KwpSettlementLogisticsTrackMapper;
 import com.sckw.payment.dao.KwpSettlementOfflineMapper;
@@ -22,13 +27,12 @@ import com.sckw.redis.config.RedisLockUtil;
 import com.sckw.redis.constant.RedisConstant;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
-import jakarta.annotation.Resource;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
@@ -45,24 +49,20 @@ import java.util.stream.Collectors;
  */
 @Service
 @Slf4j
+@RequiredArgsConstructor
 public class KwpSettlementOfflineService {
-    @Resource
-    private KwpSettlementOfflineMapper settlementOfflineMapper;
-    @Resource
-    private KwpSettlementTradeService settlementTradeService;
-    @Resource
-    private KwpSettlementTradeTrackService settlementTradeTrackService;
+    private final KwpSettlementOfflineMapper settlementOfflineMapper;
+    private final KwpSettlementTradeService settlementTradeService;
+    private final KwpLedgerTradeOrderService tradeOrderService;
+    private final KwpSettlementTradeTrackService settlementTradeTrackService;
     @DubboReference(version = "2.0.0", group = "design", check = false)
     private RemoteSystemService remoteSystemService;
-    @Resource
-    private RedisLockUtil redisLockUtil;
-
-    @Resource
-    private KwpSettlementLogisticsService kwpSettlementLogisticsService;
-    @Resource
-    private KwpSettlementLogisticsMapper kwpSettlementLogisticsMapper;
-    @Resource
-    private KwpSettlementLogisticsTrackMapper kwpSettlementLogisticsTrackMapper;
+    @DubboReference(version = "2.0.0", group = "design", check = false)
+    private TradeOrderInfoService tradeOrderInfoService;
+    private final RedisLockUtil redisLockUtil;
+    private final KwpSettlementLogisticsService kwpSettlementLogisticsService;
+    private final KwpSettlementLogisticsMapper kwpSettlementLogisticsMapper;
+    private final KwpSettlementLogisticsTrackMapper kwpSettlementLogisticsTrackMapper;
 
     /**
      * 物流-线下付款(运费收款)记录-列表
@@ -200,7 +200,7 @@ public class KwpSettlementOfflineService {
             remainingReceivables = remainingReceivables.subtract(price);
             //入库
             KwpSettlementOffline kwpSettlementOffline = new KwpSettlementOffline();
-            kwpSettlementOffline.setId(new IdWorker(1).nextId());
+            kwpSettlementOffline.setId(new IdWorker(NumberConstant.ONE).nextId());
             kwpSettlementOffline.setEntId(settlementLogisticsDto.getEntId());
             kwpSettlementOffline.setSettlementId(settlementLogisticsDto.getId());
             kwpSettlementOffline.setOrderType(SettlementOrderTypeEnum.LOGISTICS.getStatus());
@@ -268,7 +268,6 @@ public class KwpSettlementOfflineService {
      * @param payReq
      * @return
      */
-    @Transactional(rollbackFor = Exception.class)
     public String confirmTradeCollection(SettlementOfflinePayReq payReq) {
         String key = String.format(RedisConstant.SETTLEMENT_KEY, payReq.getId());
         if (redisLockUtil.tryLock(key)) {
@@ -294,7 +293,7 @@ public class KwpSettlementOfflineService {
                 BigDecimal payPrice = payReq.getPayPrice();
                 //剩余待付款-本次付款=下次剩余待付款
                 BigDecimal subtract1 = subtract.subtract(payPrice);
-                if (subtract1.compareTo(new BigDecimal("0.0")) < 0) {
+                if (subtract1.compareTo(new BigDecimal("0.0")) < NumberConstant.ZERO) {
                     throw new BusinessException("实际付款金额大于剩余待付款金额");
                 }
                 //更新结算单记录
@@ -302,9 +301,24 @@ public class KwpSettlementOfflineService {
                 kwpSettlementTrade.setId(byId.getId());
                 kwpSettlementTrade.setActualPrice(actualPrice.add(payPrice));//已收款加本次收款
                 int status = 0;
-                if (subtract1.compareTo(new BigDecimal("0.0")) == 0) {
+                //全部结算,修改贸易订单状态
+                if (subtract1.compareTo(new BigDecimal("0.0")) == NumberConstant.ZERO) {
                     status = SettlementEnum.ALL_PAYMENT.getStatus();
-                } else if (subtract1.compareTo(new BigDecimal("0.0")) > 0) {
+                    //查询对账单关联的订单
+                    List<KwpLedgerTradeOrder> kwpLedgerTradeOrders = tradeOrderService.queryList(byId.getLedgerId());
+                    if (CollectionUtils.isEmpty(kwpLedgerTradeOrders)) {
+                        throw new BusinessException("未找到关联的贸易订单");
+                    }
+                    List<Long> list = kwpLedgerTradeOrders.stream().map(KwpLedgerTradeOrder::getTOrderId).toList();
+                    for (Long aLong : list) {
+                        UpdateOrderStatusParam updateOrderStatusParam = new UpdateOrderStatusParam();
+                        updateOrderStatusParam.setTOrderId(aLong);
+                        updateOrderStatusParam.setStatus(Integer.valueOf(DictEnum.TORDER_STATUS_7.getValue()));
+                        updateOrderStatusParam.setUpdateBy(LoginUserHolder.getUserId());
+                        updateOrderStatusParam.setUpdateByName(LoginUserHolder.getUserName());
+                        tradeOrderInfoService.updateOrderStatus(updateOrderStatusParam);
+                    }
+                } else if (subtract1.compareTo(new BigDecimal("0.0")) > NumberConstant.ZERO) {
                     status = SettlementEnum.PARTIAL_PAYMENT.getStatus();
                 }
                 kwpSettlementTrade.setStatus(status);
@@ -313,7 +327,7 @@ public class KwpSettlementOfflineService {
                 settlementTradeService.updateById(kwpSettlementTrade);
                 //新增线下结算记录
                 KwpSettlementOffline kwpSettlementOffline = new KwpSettlementOffline();
-                kwpSettlementOffline.setId(new IdWorker(1).nextId());
+                kwpSettlementOffline.setId(new IdWorker(NumberConstant.ONE).nextId());
                 kwpSettlementOffline.setEntId(LoginUserHolder.getEntId());
                 kwpSettlementOffline.setSettlementId(byId.getId());
                 kwpSettlementOffline.setOrderType(payReq.getOrderType());
@@ -321,13 +335,13 @@ public class KwpSettlementOfflineService {
                 kwpSettlementOffline.setPayPrice(payReq.getPayPrice());
                 kwpSettlementOffline.setTopayPrice(subtract1);
                 kwpSettlementOffline.setUrl(payReq.getUrl());
-                kwpSettlementOffline.setRemark("");
-                kwpSettlementOffline.setStatus(0);
+                kwpSettlementOffline.setRemark(LoginUserHolder.getUserName() + "结算" + payReq.getPayPrice());
+                kwpSettlementOffline.setStatus(NumberConstant.ZERO);
                 kwpSettlementOffline.setCreateBy(LoginUserHolder.getUserId());
                 kwpSettlementOffline.setCreateTime(LocalDateTime.now());
                 kwpSettlementOffline.setUpdateBy(LoginUserHolder.getUserId());
                 kwpSettlementOffline.setUpdateTime(LocalDateTime.now());
-                kwpSettlementOffline.setDelFlag(0);
+                kwpSettlementOffline.setDelFlag(Global.UN_DELETED);
 
                 settlementOfflineMapper.insert(kwpSettlementOffline);
 

+ 37 - 23
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/KwpSettlementWalletService.java

@@ -3,12 +3,15 @@ package com.sckw.payment.service;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.sckw.core.common.enums.NumberConstant;
+import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.page.PageRes;
 import com.sckw.core.utils.IdWorker;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.order.api.dubbo.TradeOrderInfoService;
+import com.sckw.order.api.model.UpdateOrderStatusParam;
 import com.sckw.payment.api.model.constant.ChannelEnum;
 import com.sckw.payment.api.model.dto.WalletDto;
 import com.sckw.payment.api.model.dto.common.R;
@@ -29,7 +32,7 @@ import com.sckw.redis.config.RedisLockUtil;
 import com.sckw.redis.constant.RedisConstant;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
-import jakarta.annotation.Resource;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.BeanUtils;
@@ -51,28 +54,22 @@ import java.util.stream.Collectors;
  */
 @Service
 @Slf4j
+@RequiredArgsConstructor
 public class KwpSettlementWalletService {
-    @Resource
-    private KwpSettlementWalletMapper settlementWalletMapper;
-    @Resource
-    private KwpSettlementLogisticsMapper kwpSettlementLogisticsMapper;
-    @Resource
-    private KwpSettlementLogisticsService kwpSettlementLogisticsService;
-    @Resource
-    private KwpSettlementTradeService kwpSettlementTradeService;
-    @Resource
-    private PayCenterService payCenterService;
-    @Resource
-    private KwpWalletRelationService walletRelationService;
-    @Resource
-    private RedisLockUtil redisLockUtil;
-    @Resource
-    private KwpSettlementTradeTrackService settlementTradeTrackService;
+    private final KwpSettlementWalletMapper settlementWalletMapper;
+    private final KwpSettlementLogisticsMapper kwpSettlementLogisticsMapper;
+    private final KwpLedgerTradeOrderService tradeOrderService;
+    private final KwpSettlementLogisticsService kwpSettlementLogisticsService;
+    private final KwpSettlementTradeService kwpSettlementTradeService;
+    private final PayCenterService payCenterService;
+    private final KwpWalletRelationService walletRelationService;
+    private final RedisLockUtil redisLockUtil;
+    private final KwpSettlementTradeTrackService settlementTradeTrackService;
     @DubboReference(version = "2.0.0", group = "design", check = false)
     private RemoteSystemService remoteSystemService;
-
-    @Resource
-    private KwpSettlementLogisticsTrackMapper kwpSettlementLogisticsTrackMapper;
+    @DubboReference(version = "2.0.0", group = "design", check = false)
+    private TradeOrderInfoService tradeOrderInfoService;
+    private final KwpSettlementLogisticsTrackMapper kwpSettlementLogisticsTrackMapper;
 
     /**
      * 物流-电子钱包付款(货到付款)结算记录-列表
@@ -267,7 +264,6 @@ public class KwpSettlementWalletService {
      * @author Aick Spt
      * @date 2023-07-27 16:13
      */
-    @Transactional(rollbackFor = Exception.class)
     public String confirmTradePayment(WalletPayReq walletPayReq) {
         String key = String.format(RedisConstant.SETTLEMENT_KEY, walletPayReq.getId());
         if (redisLockUtil.tryLock(key)) {
@@ -343,13 +339,31 @@ public class KwpSettlementWalletService {
                 KwpSettlementTrade kwpSettlementTrade = new KwpSettlementTrade();
                 kwpSettlementTrade.setId(byId.getId());
                 kwpSettlementTrade.setActualPrice(byId.getActualPrice().add(price));
-                kwpSettlementTrade.setStatus(subtract.compareTo(new BigDecimal("0.0")) == NumberConstant.ZERO ? SettlementEnum.ALL_PAYMENT.getStatus()
-                        : SettlementEnum.PARTIAL_PAYMENT.getStatus());
+                int status = subtract.compareTo(new BigDecimal("0.0")) == NumberConstant.ZERO ? SettlementEnum.ALL_PAYMENT.getStatus()
+                        : SettlementEnum.PARTIAL_PAYMENT.getStatus();
+                kwpSettlementTrade.setStatus(status);
                 kwpSettlementTrade.setUpdateBy(LoginUserHolder.getUserId());
                 kwpSettlementTrade.setUpdateTime(LocalDateTime.now());
                 kwpSettlementTradeService.updateById(kwpSettlementTrade);
 
                 settlementTradeTrackService.save(KwpSettlementTradeTrack.build(byId.getId(), SettlementTrackEnum.RECEIVE_PAY.getStatus()));
+                //更新贸易订单状态
+                if (status == SettlementEnum.ALL_PAYMENT.getStatus()) {
+                    //查询对账单关联的订单
+                    List<KwpLedgerTradeOrder> kwpLedgerTradeOrders = tradeOrderService.queryList(byId.getLedgerId());
+                    if (CollectionUtils.isEmpty(kwpLedgerTradeOrders)) {
+                        throw new BusinessException("未找到关联的贸易订单");
+                    }
+                    List<Long> list = kwpLedgerTradeOrders.stream().map(KwpLedgerTradeOrder::getTOrderId).toList();
+                    for (Long aLong : list) {
+                        UpdateOrderStatusParam updateOrderStatusParam = new UpdateOrderStatusParam();
+                        updateOrderStatusParam.setTOrderId(aLong);
+                        updateOrderStatusParam.setStatus(Integer.valueOf(DictEnum.TORDER_STATUS_7.getValue()));
+                        updateOrderStatusParam.setUpdateBy(LoginUserHolder.getUserId());
+                        updateOrderStatusParam.setUpdateByName(LoginUserHolder.getUserName());
+                        tradeOrderInfoService.updateOrderStatus(updateOrderStatusParam);
+                    }
+                }
                 //todo-xcq 调用中台接口
 
                 return "付款确认成功";

+ 124 - 24
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/PayCenterService.java

@@ -3,6 +3,7 @@ package com.sckw.payment.service;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.alibaba.fastjson2.TypeReference;
+import com.sckw.core.exception.BusinessException;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.OkHttpUtils;
 import com.sckw.payment.api.model.constant.ChannelEnum;
@@ -20,9 +21,11 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Service;
-import org.springframework.validation.annotation.Validated;
 
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * 转发中台接口
@@ -33,7 +36,6 @@ import java.util.*;
 @Service
 @Slf4j
 @RefreshScope
-@Validated
 public class PayCenterService {
     @Value("${payCenter.address}")
     private String payCenterAddr;
@@ -56,14 +58,27 @@ public class PayCenterService {
         if (!CollectionUtils.isEmpty(para)) {
             for (Map.Entry<String, Object> p : para.entrySet()) {
                 //跳过非空参数
-                if (Objects.isNull(p.getValue())) {
+                Object v = p.getValue();
+                String k = p.getKey();
+                if (Objects.isNull(v)) {
                     continue;
                 }
-                if (p.getValue() instanceof ChannelEnum channelEnum) {
-                    okHttpUtils.addPara(p.getKey(), channelEnum.getChannel());
+                if (v instanceof ChannelEnum channelEnum) {
+                    okHttpUtils.addPara(k, channelEnum.getChannel());
+                } else if (v instanceof Integer i) {
+                    okHttpUtils.addPara(k, String.valueOf(i));
+                } else if (v instanceof Long i) {
+                    okHttpUtils.addPara(k, String.valueOf(i));
+                } else if (v instanceof String i) {
+                    okHttpUtils.addPara(k, i);
+                } else if ((v.getClass().isArray()) && v instanceof String[] l) {
+                    for (int i = 0; i < l.length; i++) {
+                        okHttpUtils.addPara(k + "[" + i + "]", l[i]);
+                    }
                 } else {
-                    okHttpUtils.addPara(p.getKey(), (String) p.getValue());
+                    okHttpUtils.addPara(k, v.toString());
                 }
+
             }
         }
         String sync;
@@ -83,13 +98,25 @@ public class PayCenterService {
         if (!CollectionUtils.isEmpty(para)) {
             for (Map.Entry<String, Object> p : para.entrySet()) {
                 //跳过非空参数
-                if (Objects.isNull(p.getValue())) {
+                Object v = p.getValue();
+                String k = p.getKey();
+                if (Objects.isNull(v)) {
                     continue;
                 }
-                if (p.getValue() instanceof ChannelEnum channelEnum) {
-                    okHttpUtils.addBodyPara(p.getKey(), channelEnum.getChannel());
+                if (v instanceof ChannelEnum channelEnum) {
+                    okHttpUtils.addBodyPara(k, channelEnum.getChannel());
+                } else if (v instanceof Integer i) {
+                    okHttpUtils.addBodyPara(k, String.valueOf(i));
+                } else if (v instanceof Long i) {
+                    okHttpUtils.addBodyPara(k, String.valueOf(i));
+                } else if (v instanceof String i) {
+                    okHttpUtils.addBodyPara(k, i);
+                } else if ((v.getClass().isArray()) && v instanceof String[] l) {
+                    for (int i = 0; i < l.length; i++) {
+                        okHttpUtils.addPara(k + "[" + i + "]", l[i]);
+                    }
                 } else {
-                    okHttpUtils.addBodyPara(p.getKey(), (String) p.getValue());
+                    okHttpUtils.addBodyPara(k, v.toString());
                 }
             }
         }
@@ -141,6 +168,9 @@ public class PayCenterService {
      * @return
      */
     public R<List<WalletDto>> wallet(@NotNull String uid, ChannelEnum channel, String filter) {
+        if (StringUtils.isBlank(uid)) {
+            throw new BusinessException("提现用户不能为空");
+        }
         String sync = getHttp(PayCenterEnum.MEMBER_WALLET, new HashMap<>() {{
             put("uid", uid);
             put("channel", channel);
@@ -157,7 +187,13 @@ public class PayCenterService {
      * @param orderNo
      * @return
      */
-    public R<CashDetail> withdrawDetail(@NotBlank(message = "提现用户不能为空") String uid, @NotBlank(message = "") String view, @NotBlank(message = "订单编号不能为空") String orderNo) {
+    public R<CashDetail> withdrawDetail(String uid, String view, String orderNo) {
+        if (StringUtils.isBlank(uid)) {
+            throw new BusinessException("提现用户不能为空");
+        }
+        if (StringUtils.isBlank(orderNo)) {
+            throw new BusinessException("订单编号不能为空");
+        }
         String sync = getHttp(PayCenterEnum.WITHDRAW_DETAIL, new HashMap<>() {{
             put("uid", uid);
             put("view", view);
@@ -176,12 +212,26 @@ public class PayCenterService {
      * @param pageSize
      * @return
      */
-    public R<CashPage> withdrawIndex(@NotBlank(message = "提现用户不能为空") String uid, @NotNull(message = "支付渠道不能为空") ChannelEnum channel, @NotNull(message = "分页参数不能为空") Integer page, @NotNull(message = "分页大小参数不能为空") Integer pageSize) {
+    public R<CashPage> withdrawIndex(String uid, ChannelEnum channel, Integer page, Integer pageSize) {
+        if (StringUtils.isBlank(uid)) {
+            throw new BusinessException("用户不能为空");
+        }
+        if (Objects.isNull(channel)) {
+            throw new BusinessException("支付渠道不能为空");
+        }
+        if (Objects.isNull(page)) {
+            page = 1;
+        }
+        if (Objects.isNull(pageSize)) {
+            pageSize = 5;
+        }
+        Integer finalPage = page;
+        Integer finalPageSize = pageSize;
         String sync = getHttp(PayCenterEnum.WITHDRAW_INDEX, new HashMap<>() {{
             put("uid", uid);
             put("channel", channel);
-            put("page", page);
-            put("pageSize", pageSize);
+            put("page", finalPage);
+            put("pageSize", finalPageSize);
         }});
         return JSONObject.parseObject(sync, new TypeReference<>() {
         });
@@ -212,7 +262,13 @@ public class PayCenterService {
      * @param orderNo
      * @return
      */
-    public R<Object> withdrawCancel(@NotBlank(message = "提现用户不能为空") String uid, @NotBlank(message = "体现订单号不能为空") String orderNo) {
+    public R<Object> withdrawCancel(String uid, String orderNo) {
+        if (StringUtils.isBlank(uid)) {
+            throw new BusinessException("用户不能为空");
+        }
+        if (StringUtils.isBlank(orderNo)) {
+            throw new BusinessException("提现订单不能为空");
+        }
         String sync = postHttp(PayCenterEnum.WITHDRAW_CANCEL, new HashMap<>() {{
             put("uid", uid);
             put("order_no", orderNo);
@@ -230,7 +286,19 @@ public class PayCenterService {
      * @param remarks
      * @return
      */
-    public R<Order> withdrawTake(@NotBlank(message = "提现用户不能为空") String uid, @NotBlank(message = "渠道不能为空") ChannelEnum channel, @NotBlank(message = "金额(分)不能为空") Long money, @NotBlank(message = "备注不能为空") String remarks) {
+    public R<Order> withdrawTake(String uid, @NotBlank(message = "渠道不能为空") ChannelEnum channel, Long money, String remarks) {
+        if (StringUtils.isBlank(uid)) {
+            throw new BusinessException("提现用户不能为空");
+        }
+        if (Objects.isNull(channel)) {
+            throw new BusinessException("提现渠道不能为空");
+        }
+        if (Objects.isNull(money)) {
+            throw new BusinessException("提现金额不能为空");
+        }
+        if (StringUtils.isBlank(remarks)) {
+            throw new BusinessException("备注不能为空");
+        }
         String sync = postHttp(PayCenterEnum.WITHDRAW_TAKE, new HashMap<>() {{
             put("uid", uid);
             put("channel", channel);
@@ -249,7 +317,16 @@ public class PayCenterService {
      * @param filter
      * @return
      */
-    public R<WalletInfo> totalInfo(@NotBlank(message = "用户不能为空") String uid, @NotBlank(message = "渠道不能为空") ChannelEnum channel, @NotBlank(message = "乙方用户不能为空") String filter) {
+    public R<WalletInfo> totalInfo(String uid, ChannelEnum channel, String filter) {
+        if (StringUtils.isBlank(uid)) {
+            throw new BusinessException("提现用户不能为空");
+        }
+        if (Objects.isNull(channel)) {
+            throw new BusinessException("提现渠道不能为空");
+        }
+        if (StringUtils.isBlank(filter)) {
+            throw new BusinessException("乙方用户不能为空");
+        }
         String sync = getHttp(PayCenterEnum.TOTAL_INFO, new HashMap<>() {{
             put("uid", uid);
             put("channel", channel);
@@ -268,6 +345,15 @@ public class PayCenterService {
      * @return
      */
     public R<OperateDown> operateDownload(String uid, ChannelEnum channel, String filter) {
+        if (StringUtils.isBlank(uid)) {
+            throw new BusinessException("提现用户不能为空");
+        }
+        if (Objects.isNull(channel)) {
+            throw new BusinessException("提现渠道不能为空");
+        }
+        if (StringUtils.isBlank(filter)) {
+            throw new BusinessException("乙方用户不能为空");
+        }
         String sync = getHttp(PayCenterEnum.OPERATE_DOWNLOAD, new HashMap<>() {{
             put("uid", uid);
             put("channel", channel);
@@ -297,12 +383,28 @@ public class PayCenterService {
      * @param pageSize
      * @return
      */
-    public R<Operate> operateIndex(String uid, ChannelEnum channel, Integer page, Integer pageSize) {
+    public R<Operate> operateIndex(String uid, ChannelEnum channel, Integer page, Integer pageSize, String[] createTime, String[] money) {
+        if (StringUtils.isBlank(uid)) {
+            throw new BusinessException("用户不能为空");
+        }
+        if (Objects.isNull(channel)) {
+            throw new BusinessException("支付渠道不能为空");
+        }
+        if (Objects.isNull(page)) {
+            page = 1;
+        }
+        if (Objects.isNull(pageSize)) {
+            pageSize = 5;
+        }
+        Integer finalPage = page;
+        Integer finalPageSize = pageSize;
         String sync = getHttp(PayCenterEnum.OPERATE_INDEX, new HashMap<>() {{
             put("uid", uid);
             put("channel", channel);
-            put("page", page);
-            put("pageSize", pageSize);
+            put("page", finalPage);
+            put("pageSize", finalPageSize);
+            put("createTime", createTime);
+            put("money", money);
         }});
         return JSONObject.parseObject(sync, new TypeReference<>() {
         });
@@ -561,9 +663,7 @@ public class PayCenterService {
      * @param nickname
      * @return
      */
-    public R<Object> walletIndex(@NotBlank(message = "uid不能为空") String uid,
-                                 @NotNull(message = "支付渠道不能为空") ChannelEnum channel,
-                                 @NotBlank(message = "filter不能为空") String filter, String nickname) {
+    public R<Object> walletIndex(@NotBlank(message = "uid不能为空") String uid, @NotNull(message = "支付渠道不能为空") ChannelEnum channel, @NotBlank(message = "filter不能为空") String filter, String nickname) {
         String sync = postHttp(PayCenterEnum.WALLET_INDEX, new HashMap<>() {{
             put("uid", uid);
             put("channel", channel);

+ 18 - 7
sckw-modules/sckw-payment/src/main/java/com/sckw/payment/service/dubbo/PayCenterServiceImpl.java

@@ -27,14 +27,25 @@ public class PayCenterServiceImpl implements PayCenterDubboService {
 
     @Override
     public R<MemberDetail> memberDetail(Long entId, ChannelEnum channel) {
-        String uid = kwpWalletRelationService.getRelation(entId);
-        if (StringUtils.isBlank(uid)) {
-            throw new BusinessException("企业未开通电子钱包");
-        }
-        payCenterService.withdrawDetail("kll_0001", "", "");
-        payCenterService.walletUnFreeze("kll_0001");
+//        String uid = kwpWalletRelationService.getRelation(entId);
+//        if (StringUtils.isBlank(uid)) {
+//            throw new BusinessException("企业未开通电子钱包");
+//        }
+//        payCenterService.withdrawDetail("kll_0001", "", "1");
+//        payCenterService.withdrawIndex("kll_0001", ChannelEnum.HF, 1, 5);
+//        payCenterService.walletUnFreeze("kll_0001");
+//        payCenterService.withdrawStatus("");
+//        payCenterService.withdrawCancel("kll_0001", "123");
+//        payCenterService.withdrawTake("kll_0001", ChannelEnum.HF, 123L, "1");
+//        payCenterService.totalInfo("kll_0001", ChannelEnum.HF, "kll_0002");
+//        payCenterService.operateDownload("kll_0001", ChannelEnum.HF, "kll_0002");
+//        payCenterService.operateCategory();
+//        payCenterService.operateIndex("kll_0001", ChannelEnum.HF, 1, 5, new String[]{"2023-07-20", "2023-07-21"}, null);
+        payCenterService.logCategory();
+        payCenterService.record("kll_0001", "kll_0002", 1, 5);
+
 //        payCenterService.payAgentPay("kll_0001");
-        return payCenterService.memberDetail(uid, ChannelEnum.HF);
+        return payCenterService.memberDetail("kll_0001", ChannelEnum.HF);
     }
 
     @Override

+ 65 - 12
sckw-modules/sckw-payment/src/main/resources/mapper/KwpLedgerLogisticsMapper.xml

@@ -82,15 +82,17 @@
         kllu.firm_name    firmName,
         kll.order_count   orderCount
     </sql>
-    <sql id="pageList">
+    <select id="shipperSelect" resultType="com.sckw.payment.model.dto.LedgerShipperDto">
         select
         <include refid="list_col"/>
         from kwp_ledger_logistics kll
-                 inner join kwp_ledger_logistics_unit kllu on kll.id = kllu.l_ledger_id and kllu.del_flag = 0
+                 inner join kwp_ledger_logistics_unit kllu
+                            on kll.id = kllu.l_ledger_id and kllu.del_flag = 0 and kllu.unit_type = #{logisticsReq.unitType,jdbcType=INTEGER}
+                 inner join kwp_ledger_logistics_unit kllu2
+                            on kll.id = kllu2.l_ledger_id and kllu2.del_flag = 0 and kllu2.unit_type = #{logisticsReq.unitTypeTwo,jdbcType=INTEGER}
         <where>
             kll.del_flag = 0
-              and kllu.unit_type = #{logisticsReq.unitType,jdbcType=INTEGER}
-              and kllu.top_ent_id = #{logisticsReq.entId,jdbcType=BIGINT}
+              and kllu2.top_ent_id = #{logisticsReq.entId,jdbcType=BIGINT}
             <if test="logisticsReq.status != null">
                 and kll.status = #{logisticsReq.status}
             </if>
@@ -110,12 +112,40 @@
             </if>
         </where>
         order by kll.generate_time desc
-    </sql>
-    <select id="shipperSelect" resultType="com.sckw.payment.model.dto.LedgerShipperDto">
-        <include refid="pageList"/>
     </select>
+    <!--托运方1 承运方2-->
     <select id="carrierSelect" resultType="com.sckw.payment.model.dto.LedgerCarrierDto">
-        <include refid="pageList"/>
+        select
+        <include refid="list_col"/>
+        from kwp_ledger_logistics kll
+                 inner join kwp_ledger_logistics_unit kllu
+                            on kll.id = kllu.l_ledger_id and kllu.del_flag = 0 and
+                               kllu.unit_type = #{logisticsReq.unitType,jdbcType=INTEGER}
+                 inner join kwp_ledger_logistics_unit kllu2
+                            on kll.id = kllu2.l_ledger_id and kllu2.del_flag = 0 and
+                               kllu2.unit_type = #{logisticsReq.unitTypeTwo,jdbcType=INTEGER}
+        <where>
+            kll.del_flag = 0
+              and kllu2.top_ent_id = #{logisticsReq.entId,jdbcType=BIGINT}
+            <if test="logisticsReq.status != null">
+                and kll.status = #{logisticsReq.status}
+            </if>
+            <if test="logisticsReq.trading != null">
+                and kll.trading = #{logisticsReq.trading,jdbcType=INTEGER}
+            </if>
+            <if test="logisticsReq.startCreateTime != null and logisticsReq.startCreateTime != '' and logisticsReq.endCreateTime != null and logisticsReq.endCreateTime != ''">
+                and kll.generate_time between #{logisticsReq.startCreateTime,jdbcType=TIMESTAMP}
+                    and #{logisticsReq.endCreateTime,jdbcType=TIMESTAMP}
+            </if>
+            <if test="logisticsReq.keywords != null and logisticsReq.keywords != ''">
+                and (
+                            kll.l_ledger_no like concat('%', #{logisticsReq.keywords,jdbcType=VARCHAR}, '%')
+                        or kllu.firm_name like concat('%', #{logisticsReq.keywords,jdbcType=VARCHAR}, '%')
+                        or kllu.contacts like concat('%', #{logisticsReq.keywords,jdbcType=VARCHAR}, '%')
+                    )
+            </if>
+        </where>
+        order by kll.generate_time desc
     </select>
 
     <select id="countOrder" resultType="java.util.Map">
@@ -127,10 +157,33 @@
                count(IF(kll.status = 5, 1, NULL)) "5",
                count(IF(kll.status = 6, 1, NULL)) "6"
         FROM kwp_ledger_logistics kll
-                 inner join kwp_ledger_logistics_unit kllu on kll.id = kllu.l_ledger_id and kllu.del_flag = 0
-        WHERE kll.del_flag = 0
-          and kllu.unit_type = #{unitType,jdbcType=INTEGER}
-          and kllu.top_ent_id = #{logisticsReq.entId,jdbcType=BIGINT}
+                 inner join kwp_ledger_logistics_unit kllu
+                            on kll.id = kllu.l_ledger_id and kllu.del_flag = 0 and
+                               kllu.unit_type = #{logisticsReq.unitType,jdbcType=INTEGER}
+                 inner join kwp_ledger_logistics_unit kllu2
+                            on kll.id = kllu2.l_ledger_id and kllu2.del_flag = 0 and
+                               kllu2.unit_type = #{logisticsReq.unitTypeTwo,jdbcType=INTEGER}
+        <where>
+            kll.del_flag = 0
+            and kllu2.top_ent_id = #{logisticsReq.entId,jdbcType=BIGINT}
+            <if test="logisticsReq.status != null">
+                and kll.status = #{logisticsReq.status}
+            </if>
+            <if test="logisticsReq.trading != null">
+                and kll.trading = #{logisticsReq.trading,jdbcType=INTEGER}
+            </if>
+            <if test="logisticsReq.startCreateTime != null and logisticsReq.startCreateTime != '' and logisticsReq.endCreateTime != null and logisticsReq.endCreateTime != ''">
+                and kll.generate_time between #{logisticsReq.startCreateTime,jdbcType=TIMESTAMP}
+                and #{logisticsReq.endCreateTime,jdbcType=TIMESTAMP}
+            </if>
+            <if test="logisticsReq.keywords != null and logisticsReq.keywords != ''">
+                and (
+                kll.l_ledger_no like concat('%', #{logisticsReq.keywords,jdbcType=VARCHAR}, '%')
+                or kllu.firm_name like concat('%', #{logisticsReq.keywords,jdbcType=VARCHAR}, '%')
+                or kllu.contacts like concat('%', #{logisticsReq.keywords,jdbcType=VARCHAR}, '%')
+                )
+            </if>
+        </where>
     </select>
 
     <select id="selectCarrierIds" resultType="com.sckw.payment.model.dto.LedgerCarrierDto">

+ 92 - 81
sckw-modules/sckw-payment/src/main/resources/mapper/KwpLedgerTradeMapper.xml

@@ -59,7 +59,7 @@
         del_flag
     </sql>
     <sql id="sell_col">
-         klt.id,
+        klt.id,
         klt.t_ledger_no   tLedgerNo,
         klt.name,
         klt.start_time    startTime,
@@ -106,16 +106,20 @@
         kltu.firm_name    firmName,
         klt.order_count   orderCount
     </sql>
+    <!--销售2 采购1-->
     <select id="sellList" resultType="com.sckw.payment.model.dto.LedgerSellDto">
         select
         <include refid="sell_col"/>
         from kwp_ledger_trade klt
                  inner join kwp_ledger_trade_unit kltu
-        on klt.id = kltu.t_ledger_id and kltu.del_flag = 0
+                            on klt.id = kltu.t_ledger_id and kltu.del_flag = 0 and
+                               kltu.unit_type = #{tradeReq.unitType,jdbcType=INTEGER}
+                 inner join kwp_ledger_trade_unit kltu2
+                            on klt.id = kltu2.t_ledger_id and kltu2.del_flag = 0 and kltu2.unit_type =
+                                                                                     #{tradeReq.unitTypeTwo,jdbcType=INTEGER}
         <where>
             klt.del_flag = 0
-            and kltu.unit_type = #{tradeReq.unitType,jdbcType=INTEGER}
-            and kltu.top_ent_id = #{tradeReq.entId,jdbcType=BIGINT}
+              and kltu2.top_ent_id = #{tradeReq.entId,jdbcType=BIGINT}
             <if test="tradeReq.status != null">
                 and klt.status = #{tradeReq.status}
             </if>
@@ -124,19 +128,19 @@
             </if>
             <if test="tradeReq.endCreateTime != null and tradeReq.endCreateTime != '' and tradeReq.startCreateTime != null and tradeReq.startCreateTime != ''">
                 and klt.generate_time between #{tradeReq.startCreateTime,jdbcType=TIMESTAMP}
-                and #{tradeReq.endCreateTime,jdbcType=TIMESTAMP}
+                    and #{tradeReq.endCreateTime,jdbcType=TIMESTAMP}
             </if>
             <if test="tradeReq.keywords != null and tradeReq.keywords != ''">
                 and (
-                    klt.t_ledger_no like concat('%'
-                  , #{tradeReq.keywords,jdbcType=VARCHAR}
-                  , '%')
-                 or kltu.firm_name like concat('%'
-                  , #{tradeReq.keywords,jdbcType=VARCHAR}
-                  , '%')
-                 or kltu.contacts like concat('%'
-                  , #{tradeReq.keywords,jdbcType=VARCHAR}
-                  , '%')
+                            klt.t_ledger_no like concat('%'
+                            , #{tradeReq.keywords,jdbcType=VARCHAR}
+                            , '%')
+                        or kltu.firm_name like concat('%'
+                        , #{tradeReq.keywords,jdbcType=VARCHAR}
+                        , '%')
+                        or kltu.contacts like concat('%'
+                        , #{tradeReq.keywords,jdbcType=VARCHAR}
+                        , '%')
                     )
             </if>
         </where>
@@ -146,12 +150,15 @@
         select
         <include refid="purchase_col"/>
         from kwp_ledger_trade klt
-        inner join kwp_ledger_trade_unit kltu
-        on klt.id = kltu.t_ledger_id and kltu.del_flag = 0
+                 inner join kwp_ledger_trade_unit kltu
+                            on klt.id = kltu.t_ledger_id and kltu.del_flag = 0 and
+                               kltu.unit_type = #{tradeReq.unitType,jdbcType=INTEGER}
+                 inner join kwp_ledger_trade_unit kltu2
+                            on klt.id = kltu2.t_ledger_id and kltu2.del_flag = 0 and kltu2.unit_type =
+                                                                                     #{tradeReq.unitTypeTwo,jdbcType=INTEGER}
         <where>
             klt.del_flag = 0
-            and kltu.unit_type = #{tradeReq.unitType,jdbcType=INTEGER}
-            and kltu.top_ent_id = #{tradeReq.entId,jdbcType=BIGINT}
+              and kltu2.top_ent_id = #{tradeReq.entId,jdbcType=BIGINT}
             <if test="tradeReq.status != null">
                 and klt.status = #{tradeReq.status}
             </if>
@@ -160,20 +167,20 @@
             </if>
             <if test="tradeReq.endCreateTime != null and tradeReq.endCreateTime != '' and tradeReq.startCreateTime != null and tradeReq.startCreateTime != ''">
                 and klt.generate_time between #{tradeReq.startCreateTime,jdbcType=TIMESTAMP}
-                and #{tradeReq.endCreateTime,jdbcType=TIMESTAMP}
+                    and #{tradeReq.endCreateTime,jdbcType=TIMESTAMP}
             </if>
             <if test="tradeReq.keywords != null and tradeReq.keywords != ''">
                 and (
-                klt.t_ledger_no like concat('%'
-                , #{tradeReq.keywords,jdbcType=VARCHAR}
-                , '%')
-                or kltu.firm_name like concat('%'
-                , #{tradeReq.keywords,jdbcType=VARCHAR}
-                , '%')
-                or kltu.contacts like concat('%'
-                , #{tradeReq.keywords,jdbcType=VARCHAR}
-                , '%')
-                )
+                            klt.t_ledger_no like concat('%'
+                            , #{tradeReq.keywords,jdbcType=VARCHAR}
+                            , '%')
+                        or kltu.firm_name like concat('%'
+                        , #{tradeReq.keywords,jdbcType=VARCHAR}
+                        , '%')
+                        or kltu.contacts like concat('%'
+                        , #{tradeReq.keywords,jdbcType=VARCHAR}
+                        , '%')
+                    )
             </if>
         </where>
         order by klt.generate_time desc
@@ -186,12 +193,16 @@
                count(IF(klt.status = 4, 1, NULL)) "4",
                count(IF(klt.status = 5, 1, NULL)) "5",
                count(IF(klt.status = 6, 1, NULL)) "6"
-        FROM kwp_ledger_trade klt
-                 inner join kwp_ledger_trade_unit kltu on klt.id = kltu.t_ledger_id and kltu.del_flag = 0
+        from kwp_ledger_trade klt
+                 inner join kwp_ledger_trade_unit kltu
+                            on klt.id = kltu.t_ledger_id and kltu.del_flag = 0 and
+                               kltu.unit_type = #{tradeReq.unitType,jdbcType=INTEGER}
+                 inner join kwp_ledger_trade_unit kltu2
+                            on klt.id = kltu2.t_ledger_id and kltu2.del_flag = 0 and kltu2.unit_type =
+                                                                                     #{tradeReq.unitTypeTwo,jdbcType=INTEGER}
         <where>
             klt.del_flag = 0
-              and kltu.unit_type = #{tradeReq.unitType,jdbcType=INTEGER}
-              and kltu.top_ent_id = #{tradeReq.entId,jdbcType=BIGINT}
+              and kltu2.top_ent_id = #{tradeReq.entId,jdbcType=BIGINT}
             <if test="tradeReq.status != null">
                 and klt.status = #{tradeReq.status}
             </if>
@@ -220,33 +231,33 @@
 
     <select id="selectSellIds" resultType="com.sckw.payment.model.dto.LedgerSellDto">
         select klt.id,
-        klt.t_ledger_no   tLedgerNo,
-        klt.name,
-        klt.start_time    startTime,
-        klt.end_time      endTime,
-        klt.tax_rate      taxRate,
-        klt.trading,
-        klt.total_price   totalPrice,
-        klt.ex_tax_price  exTaxPrice,
-        klt.settle_price  settlePrice,
-        klt.actual_price  actualPrice,
-        klt.audit_phone   auditPhone,
-        klt.audit_user    auditUser,
-        klt.url,
-        klt.generate_time generateTime,
-        klt.receipt_time  receiptTime,
-        klt.remark,
-        klt.status,
-        kltu.contacts,
-        kltu.phone,
-        kltu.firm_name    firmName,
-        klt.order_count   orderCount
+               klt.t_ledger_no   tLedgerNo,
+               klt.name,
+               klt.start_time    startTime,
+               klt.end_time      endTime,
+               klt.tax_rate      taxRate,
+               klt.trading,
+               klt.total_price   totalPrice,
+               klt.ex_tax_price  exTaxPrice,
+               klt.settle_price  settlePrice,
+               klt.actual_price  actualPrice,
+               klt.audit_phone   auditPhone,
+               klt.audit_user    auditUser,
+               klt.url,
+               klt.generate_time generateTime,
+               klt.receipt_time  receiptTime,
+               klt.remark,
+               klt.status,
+               kltu.contacts,
+               kltu.phone,
+               kltu.firm_name    firmName,
+               klt.order_count   orderCount
         from kwp_ledger_trade klt
-        inner join kwp_ledger_trade_unit kltu on klt.id = kltu.t_ledger_id and kltu.del_flag = 0
+                 inner join kwp_ledger_trade_unit kltu on klt.id = kltu.t_ledger_id and kltu.del_flag = 0
         <where>
             klt.del_flag = 0
-            and kltu.unit_type = 1
-            and klt.id in
+              and kltu.unit_type = 1
+              and klt.id in
             <foreach collection="ids" item="id" close=")" open="(" separator=",">
                 #{id,jdbcType=BIGINT}
             </foreach>
@@ -255,33 +266,33 @@
     </select>
     <select id="selectPurchaseIds" resultType="com.sckw.payment.model.dto.LedgerPurchaseDto">
         select klt.id,
-        klt.t_ledger_no   tLedgerNo,
-        klt.name,
-        klt.start_time    startTime,
-        klt.end_time      endTime,
-        klt.tax_rate      taxRate,
-        klt.trading,
-        klt.total_price   totalPrice,
-        klt.ex_tax_price  exTaxPrice,
-        klt.settle_price  settlePrice,
-        klt.actual_price  actualPrice,
-        klt.audit_phone   auditPhone,
-        klt.audit_user    auditUser,
-        klt.url,
-        klt.generate_time generateTime,
-        klt.receipt_time  receiptTime,
-        klt.remark,
-        klt.status,
-        kltu.contacts,
-        kltu.phone,
-        kltu.firm_name    firmName,
-        klt.order_count   orderCount
+               klt.t_ledger_no   tLedgerNo,
+               klt.name,
+               klt.start_time    startTime,
+               klt.end_time      endTime,
+               klt.tax_rate      taxRate,
+               klt.trading,
+               klt.total_price   totalPrice,
+               klt.ex_tax_price  exTaxPrice,
+               klt.settle_price  settlePrice,
+               klt.actual_price  actualPrice,
+               klt.audit_phone   auditPhone,
+               klt.audit_user    auditUser,
+               klt.url,
+               klt.generate_time generateTime,
+               klt.receipt_time  receiptTime,
+               klt.remark,
+               klt.status,
+               kltu.contacts,
+               kltu.phone,
+               kltu.firm_name    firmName,
+               klt.order_count   orderCount
         from kwp_ledger_trade klt
-        inner join kwp_ledger_trade_unit kltu on klt.id = kltu.t_ledger_id and kltu.del_flag = 0
+                 inner join kwp_ledger_trade_unit kltu on klt.id = kltu.t_ledger_id and kltu.del_flag = 0
         <where>
             klt.del_flag = 0
-            and kltu.unit_type = 1
-            and klt.id in
+              and kltu.unit_type = 2
+              and klt.id in
             <foreach collection="ids" item="id" close=")" open="(" separator=",">
                 #{id,jdbcType=BIGINT}
             </foreach>

+ 2 - 1
sckw-modules/sckw-payment/src/main/resources/mapper/KwpSettlementTradeMapper.xml

@@ -154,6 +154,7 @@
                kst.success_user,
                kst.success_phone,
                kst.create_time,
+               klt.id                                             ledgerId,
                klt.name,
                klt.trading,
                kltu.firm_name
@@ -163,7 +164,7 @@
         <where>
             kst.del_flag = 0
               and kst.id = #{id,jdbcType=BIGINT}
-            and kltu.unit_type = #{unitType,jdbcType=INTEGER}
+              and kltu.unit_type = #{unitType,jdbcType=INTEGER}
         </where>
     </select>
 

+ 2 - 0
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwAcceptCarriageService.java

@@ -249,11 +249,13 @@ public class KwAcceptCarriageService {
                     null : String.valueOf(logisticsOrder.getSettlementCycle()));
             vo.setAppointor(logisticsOrder.getCreateByName());
             vo.setBillingMode(logisticsOrder.getBillingMode());
+            vo.setCarrierCompanyId(String.valueOf(logisticsOrder.getCarrierEntId()));
             vo.setCarrierCompany(logisticsOrder.getCarrierFirmName());
             vo.setCarrierOrder(logisticsOrder.getWOrderNo());
             vo.setCarrierPhone(logisticsOrder.getCarrierPhone());
             vo.setCarryingCapacity(logisticsOrder.getCarryingCapacity() == null ?
                     null : String.valueOf(logisticsOrder.getCarryingCapacity()));
+            vo.setConsignCompanyId(String.valueOf(logisticsOrder.getCheckEntId()));
             vo.setConsignCompany(logisticsOrder.getCheckFirmName());
             vo.setConsignContacts(logisticsOrder.getCheckContacts());
             vo.setConsignPhone(logisticsOrder.getCheckPhone());

+ 8 - 2
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwOrderService.java

@@ -99,7 +99,8 @@ public class KwOrderService {
                     .setPickupTypeLabel(DictEnum.getLabel(DictTypeEnum.PICKUP_TYPE.getType(), e.getPickupType()))
                     .setLoadDetailAddressInfo(loadCityName + loadDetailAddress)
                     .setUnloadDetailAddressInfo(unloadCityName + unloadDetailAddress)
-                    .setConsignmentStatus(Objects.isNull(e.getEntrustAmount()) || e.getEntrustAmount().compareTo(e.getAmount()) < 0 ? "待托运" : "已托运")
+                    .setConsignmentStatus(Objects.isNull(e.getEntrustAmount()) || Objects.isNull(e.getAmount())
+                            || e.getEntrustAmount().compareTo(e.getAmount()) < 0 ? "待托运" : "已托运")
                     .setSource(DictEnum.getLabel(DictTypeEnum.TORDER_SOURCE.getType(), e.getSource()));
             result.add(order);
         });
@@ -235,7 +236,7 @@ public class KwOrderService {
             Long entId = LoginUserHolder.getEntId();
             Criteria criteria = new Criteria();
             String topEnt = Objects.equals(params.getOrderType(), 1) ? "procureTopEntId" : "supplyTopEntId";
-            criteria.and("tOrderId").in(ids).and(topEnt).is(entId).and("delFlag").is(0);
+            criteria.and("_id").in(ids).and(topEnt).is(entId).and("delFlag").is(0);
             query.addCriteria(criteria);
         } else {
             query = getQuery(params, false);
@@ -281,6 +282,11 @@ public class KwOrderService {
         Criteria criteria = new Criteria();
         String topEnt = Objects.equals(params.getOrderType(), 1) ? "procureTopEntId" : "supplyTopEntId";
         criteria.and(topEnt).is(entId).and("status").is(Integer.valueOf(DictEnum.TORDER_STATUS_5.getValue())).and("delFlag").is(0);
+        //排除订单ids
+        if (StringUtils.isNotBlank(params.getExcludeIds())) {
+            List<Long> ids = StringUtils.splitStrToList(params.getExcludeIds(), ",", Long.class);
+            criteria.and("_id").nin(ids);
+        }
         //采购企业
         if (Objects.nonNull(params.getProcureEntId())) {
             criteria.and("procureEntId").is(params.getProcureEntId());

+ 5 - 0
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/param/TradeOrderStatementList.java

@@ -58,4 +58,9 @@ public class TradeOrderStatementList extends PageRequest {
      * 商品名称
      */
     private String goodsName;
+
+    /**
+     * 排除订单ids
+     */
+    private String excludeIds;
 }

+ 10 - 0
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/vo/AcceptCarriageOrderVo.java

@@ -22,6 +22,11 @@ public class AcceptCarriageOrderVo extends PageRequest {
      * 计费方式
      */
     private String billingMode;
+
+    /**
+     * 承运单位ID
+     */
+    private String carrierCompanyId;
     /**
      * 承运单位
      */
@@ -42,6 +47,11 @@ public class AcceptCarriageOrderVo extends PageRequest {
      * 分配承运量
      */
     private String carryingCapacity;
+
+    /**
+     * 托运单位id
+     */
+    private String consignCompanyId;
     /**
      * 托运单位
      */

+ 4 - 5
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java

@@ -544,15 +544,14 @@ public class KwsEnterpriseService {
         for (BusinessLicense businessLicense : businessLicenseList) {
             Integer type = businessLicense.getType();
             if (type.equals(CertificateTypeEnum.BUSINESSLICENSE.getCode())) {
-                if (!RegularUtils.matchWithFix(RegularUtils.NUMBER_AND_UPPERCASE_LATTER, reqVo.getCode(), 18)) {
+                if (!RegularUtils.matchWithFix(RegularUtils.NUMBER_AND_UPPERCASE_LATTER, businessLicense.getCode(), 18)) {
                     throw new SystemException(HttpStatus.PARAMETERS_PATTERN_ERROR_CODE, HttpStatus.ENT_CODE_ERROR);
                 }
             }
 
-            if (type.equals(CertificateTypeEnum.CORPORATION_IDCARD.getCode())) {
-                throw new SystemException(HttpStatus.PARAMETERS_PATTERN_ERROR_CODE, HttpStatus.LEGAL_ID_CARD_ERROR);
-
-            }
+//            if (type.equals(CertificateTypeEnum.CORPORATION_IDCARD.getCode())) {
+//                throw new SystemException(HttpStatus.PARAMETERS_PATTERN_ERROR_CODE, HttpStatus.LEGAL_ID_CARD_ERROR);
+//            }
         }
 
         if (StringUtils.isNotBlank(reqVo.getContacts()) && !RegularUtils.matchs(RegularUtils.NAME, reqVo.getContacts())) {

+ 1 - 1
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java

@@ -144,7 +144,7 @@ public class KwsUserService {
 
         /*存企业机构等*/
         //目前注册接口只有企业管理员进来
-        if (reqDto.getIsMain() == Global.YES && reqDto.getSystemType() != SystemTypeEnum.MANAGE.getCode()) {
+        if (reqDto.getIsMain() == Global.YES && !reqDto.getSystemType().equals(SystemTypeEnum.MANAGE.getCode())) {
             KwsEnterprise kwsEnterprise = new KwsEnterprise();
             long entId = new IdWorker(1L).nextId();
             kwsEnterprise.setId(entId);

+ 6 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/LogisticsConsignmentController.java

@@ -81,7 +81,7 @@ public class LogisticsConsignmentController {
     public HttpResult purchaseLogisticsOrderCount(@RequestParam("id") @NotBlank(message = "单据id不能为空") String id) {
         log.info("采购订单-托运订单列表 传递参数信息:{}", id);
         try {
-            return logisticsConsignmentService.logisticsOrderCount(id,"1");
+            return logisticsConsignmentService.logisticsOrderCount(id, "1");
         } catch (Exception e) {
             log.error("采购订单-托运订单列表 error :{}", e.getMessage(), e);
             return HttpResult.error(HttpStatus.GLOBAL_EXCEPTION_CODE, e.getMessage());
@@ -110,7 +110,7 @@ public class LogisticsConsignmentController {
     /**
      * 采购订单-车辆信息-销售订单id
      *
-     * @param ids       销售订单ids
+     * @param ids      销售订单ids
      * @param page
      * @param pageSize
      * @return
@@ -213,12 +213,13 @@ public class LogisticsConsignmentController {
     public HttpResult sellLogisticsOrderCount(@RequestParam("id") @NotBlank(message = "单据id不能为空") String id) {
         log.info("销售订单-托运订单列表 传递参数信息:{}", id);
         try {
-            return logisticsConsignmentService.logisticsOrderCount(id,"2");
+            return logisticsConsignmentService.logisticsOrderCount(id, "2");
         } catch (Exception e) {
             log.error("销售订单-托运订单列表 error :{}", e.getMessage(), e);
             return HttpResult.error(HttpStatus.GLOBAL_EXCEPTION_CODE, e.getMessage());
         }
     }
+
     /**
      * 销售订单-车辆列表-销售订单id
      *
@@ -283,11 +284,11 @@ public class LogisticsConsignmentController {
     @Validated
     @RequestMapping(value = "/sellOrderFinish", method = RequestMethod.POST)
     public HttpResult sellOrderFinish(@RequestBody @Validated OrderFinishDTO orderFinishDTO) {
-        log.info("采购订单-托运订单列表-完结订单 传递参数信息:{}", JSONObject.toJSONString(orderFinishDTO));
+        log.info("销售订单-托运订单列表-完结订单 传递参数信息:{}", JSONObject.toJSONString(orderFinishDTO));
         try {
             return logisticsConsignmentService.orderFinish(orderFinishDTO, "2");
         } catch (Exception e) {
-            log.error("采购订单-托运订单列表-完结订单 error :{}", e.getMessage(), e);
+            log.error("销售订单-托运订单列表-完结订单 error :{}", e.getMessage(), e);
             return HttpResult.error(HttpStatus.GLOBAL_EXCEPTION_CODE, e.getMessage());
         }
     }

+ 7 - 14
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderMapper.java

@@ -18,23 +18,9 @@ import java.util.Map;
 
 @Mapper
 public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {
-    /**
-     * @param id
-     * @return
-     */
-    int deleteByPrimaryKey(Long id);
 
     int insert(KwtLogisticsOrder record);
 
-    int insertSelective(KwtLogisticsOrder record);
-
-    KwtLogisticsOrder selectByPrimaryKey(Long id);
-
-    int updateByPrimaryKeySelective(KwtLogisticsOrder record);
-
-    int updateByPrimaryKey(KwtLogisticsOrder record);
-
-//    void removeById(KwtLogisticsOrder logisticsOrder);
 
     /**
      * 查询物流订单数据
@@ -157,4 +143,11 @@ public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {
      * @return
      */
     List<AddressResDTO> getAddressDetailListByEntId(@Param("entId") Long entId);
+
+    /**
+     *
+     * @param id
+     * @return
+     */
+    int selectMaxLevel(@Param("id") String id);
 }

+ 20 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtLogisticsOrder.java

@@ -1,5 +1,6 @@
 package com.sckw.transport.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import jakarta.validation.constraints.DecimalMin;
@@ -11,6 +12,7 @@ import lombok.Data;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 /**
  * @author lfdc
@@ -20,6 +22,9 @@ import java.util.Date;
 @Data
 @TableName("kwt_logistics_order")
 public class KwtLogisticsOrder implements Serializable {
+
+    @TableField(exist = false)
+    private List<KwtLogisticsOrder> childList;
     /**
      * 主键
      */
@@ -60,6 +65,11 @@ public class KwtLogisticsOrder implements Serializable {
      */
     private String pids;
 
+    /**
+     * 当前单据所属等级
+     */
+    private String level;
+
     /**
      * 结算周期(周结、月结、季结)
      */
@@ -158,6 +168,16 @@ public class KwtLogisticsOrder implements Serializable {
      */
     private BigDecimal deficitPrice;
 
+    /**
+     * 卸货-履约量(自己+下游承运总卸货量)
+     */
+    private BigDecimal totalUnloadAmount;
+
+    /**
+     * 装货-履约量(自己+下游承运总装货量)
+     */
+    private BigDecimal totalLoadAmount;
+
     /**
      * 实际开始时间(装货)
      */

+ 3 - 3
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/AddOrderDTO.java

@@ -217,8 +217,8 @@ public class AddOrderDTO {
      * 装货城市编码
      */
     @NotNull(message = "装货城市编码不能为空")
-    @Min(value = 0,message = "城市编码必须大于等于{value}")
-    @Max(value = 999,message = "城市编码必须小于等于{value}")
+    @Min(value = 0,message = "装货城市编码必须大于等于{value}")
+    @Max(value = 1000000,message = "装货城市编码必须小于等于{value}")
     private Integer loadCityCode;
 
     /**
@@ -260,7 +260,7 @@ public class AddOrderDTO {
      */
     @NotNull(message = "卸货城市编码不能为空")
     @Min(value = 0,message = "卸货城市编码必须大于等于{value}")
-    @Max(value = 999,message = "卸货城市编码必须小于等于{value}")
+    @Max(value = 1000000,message = "卸货城市编码必须小于等于{value}")
     private Integer unloadCityCode;
 
     /**

+ 8 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/OrderDetailVO.java

@@ -14,6 +14,10 @@ public class OrderDetailVO {
      * 计费方式
      */
     private String billingMode;
+    /**
+     * 承运单位id
+     */
+    private Long carrierCompanyId;
     /**
      * 承运单位
      */
@@ -30,6 +34,10 @@ public class OrderDetailVO {
      * 收款单位
      */
     private String collectionCompany;
+    /**
+     * 托运单位id
+     */
+    private Long consignCompanyId;
     /**
      * 托运单位
      */

+ 27 - 7
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/AcceptCarriageOrderService.java

@@ -214,14 +214,24 @@ public class AcceptCarriageOrderService {
         logisticsOrderMapper.updateById(logisticsOrder);
         //修改父级mongodb数据
         //更新mongodb
-        SckwLogisticsOrder sckwLogisticsOrder = mongoTemplate.findById(logisticsOrder.getId(), SckwLogisticsOrder.class);
-        SckwLogisticsOrder updateParam = BeanUtils.copyProperties(sckwLogisticsOrder, SckwLogisticsOrder.class);
-        updateParam.setSubcontractAmount(logisticsOrder.getSubcontractAmount().add(new BigDecimal(bo.getCarryingCapacity())))
-                .setUpdateTime(new Date()).setUpdateBy(LoginUserHolder.getUserId()).setUpdateByName(LoginUserHolder.getUserName());
+        SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
+        lOrder.set_id(order.getId());
+        lOrder.setLOrderId(order.getId());
+        lOrder.setEntrustAmount(order.getEntrustAmount());
+        lOrder.setStatus(String.valueOf(order.getStatus()));
+        lOrder.setUpdateTime(order.getUpdateTime());
+        lOrder.setUpdateBy(order.getUpdateBy());
+        lOrder.setUpdateByName(LoginUserHolder.getUserName());
+        lOrder.setSubcontractAmount(logisticsOrder.getSubcontractAmount().add(new BigDecimal(bo.getCarryingCapacity())));        //rabbitMq业务汇总数据发送/消费对象
         SckwBusSum busSum = new SckwBusSum();
+        //业务汇总类型
+        busSum.setBusSumType(BusinessTypeEnum.LOGISTICS_ORDER_TYPE.getName());
+        //操作对象(1新增/2修改/3替换数据)
+        busSum.setMethod(2);
+        //业务汇总数据对象
+        busSum.setObject(lOrder);
         busSum.setBusSumType(BusinessTypeEnum.LOGISTICS_ORDER_TYPE.getName());
         busSum.setMethod(NumberConstant.TWO);
-        busSum.setObject(updateParam);
         streamBridge.send("sckw-busSum", com.alibaba.fastjson2.JSON.toJSONString(busSum));
         //新增当前分包mongodb数据
         subcontractSendMongoDB(lOrderNo, orderId, bo, logisticsOrder, orderStatus);
@@ -548,9 +558,9 @@ public class AcceptCarriageOrderService {
     private void insertSubcontractLogisticsGoods(SubcontractConsignmentDTO bo, String lOrderNo, Long orderId) {
         KwtLogisticsOrderGoods kwtLogisticsOrderGoods = new KwtLogisticsOrderGoods();
         kwtLogisticsOrderGoods.setId(new IdWorker(NumberConstant.ONE).nextId());
-        kwtLogisticsOrderGoods.setGoodsId(Long.parseLong(bo.getGoodsId()));
+//        kwtLogisticsOrderGoods.setGoodsId(Long.parseLong(bo.getGoodsId()));
         kwtLogisticsOrderGoods.setGoodsName(bo.getGoodsName());
-        kwtLogisticsOrderGoods.setSkuId(StringUtils.isBlank(bo.getSkuId()) ? null : Long.parseLong(bo.getSkuId()));
+//        kwtLogisticsOrderGoods.setSkuId(StringUtils.isBlank(bo.getSkuId()) ? null : Long.parseLong(bo.getSkuId()));
         kwtLogisticsOrderGoods.setLOrderId(orderId);
         kwtLogisticsOrderGoods.setLOrderNo(lOrderNo);
         kwtLogisticsOrderGoods.setUpdateBy(LoginUserHolder.getUserId());
@@ -635,6 +645,7 @@ public class AcceptCarriageOrderService {
                     .set(KwtLogisticsOrder::getUpdateTime, new Date())
                     .set(KwtLogisticsOrder::getUpdateBy, LoginUserHolder.getUserId()));
         } else {
+            //todo 当前为删除订单 后续要改为拒绝接单  数据统计在页面已退回状态中
             //删除订单
             logisticsOrderMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrder>()
                     .eq(StringUtils.isNotBlank(orderDTO.getLOrderId()), KwtLogisticsOrder::getId, orderDTO.getLOrderId())
@@ -864,6 +875,13 @@ public class AcceptCarriageOrderService {
                             .set(KwtLogisticsOrderCirculate::getStatus, NumberConstant.ONE)
                             .eq(KwtLogisticsOrderCirculate::getWOrderId, wOrderId));
 //                    /**更新MongoDB*/
+                    SckwWaybillOrder order = new SckwWaybillOrder();
+                    order.setStatus(NumberConstant.ONE);
+                    SckwBusSum busSum = new SckwBusSum();
+                    busSum.setBusSumType(BusinessTypeEnum.WAYBILL_ORDER_TYPE.getName());
+                    busSum.setMethod(NumberConstant.TWO);
+                    busSum.setObject(order);
+                    streamBridge.send("sckw-busSum", com.alibaba.fastjson2.JSON.toJSONString(busSum));
                     jsonObject.put("status", HttpStatus.SUCCESS_CODE);
                     jsonObject.put("message", "停止接单成功");
                 }
@@ -1153,12 +1171,14 @@ public class AcceptCarriageOrderService {
             }
         }
         if (unitOne != null) {
+            orderDetailVO.setConsignCompanyId(unitOne.getId());
             orderDetailVO.setConsignCompany(unitOne.getFirmName());
             orderDetailVO.setConsignContacts(unitOne.getContacts());
             orderDetailVO.setConsignPhone(unitOne.getPhone());
             orderDetailVO.setCollectionCompany(unitOne.getFirmName());
         }
         if (unitTwo != null) {
+            orderDetailVO.setCarrierCompanyId(unitTwo.getId());
             orderDetailVO.setCarrierCompany(unitTwo.getFirmName());
             orderDetailVO.setCarrierContacts(unitTwo.getContacts());
             orderDetailVO.setCarrierPhone(unitTwo.getPhone());

+ 2 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderService.java

@@ -1581,8 +1581,8 @@ public class KwtWaybillOrderService {
         SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
         lOrder.setLoadTime(waybillCount.getLoadTime());
         lOrder.setUnloadTime(waybillCount.getUnloadTime());
-        lOrder.setLoadTotalAmount(waybillCount.getLoadAmount());
-        lOrder.setUnloadTotalAmount(waybillCount.getUnloadAmount());
+        lOrder.setTotalLoadAmount(waybillCount.getLoadAmount());
+        lOrder.setTotalUnloadAmount(waybillCount.getUnloadAmount());
         lOrder.setDeficitTotalAmount(waybillCount.getDeficitAmount());
         BigDecimal deficitPrice = deficitPrice(waybillCount.getLoadAmount(), waybillCount.getDeficitAmount(),
                 logisticsOrder.getLoss(), logisticsOrder.getGoodsPrice());

+ 595 - 93
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/LogisticsConsignmentService.java

@@ -1,5 +1,6 @@
 package com.sckw.transport.service;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ArrayUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
@@ -7,7 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.core.common.enums.NumberConstant;
-import com.sckw.core.common.enums.StringConstant;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.enums.CarWaybillEnum;
@@ -27,8 +27,8 @@ import com.sckw.mongo.enums.BusinessTypeEnum;
 import com.sckw.mongo.model.SckwLogisticsOrder;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.order.api.model.AddressInfoDetail;
+import com.sckw.order.api.model.CreateOrCancelLogisticsOrderParam;
 import com.sckw.order.api.model.OrderDetailRes;
-import com.sckw.order.api.model.UpdateOrderAmountParam;
 import com.sckw.product.api.dubbo.GoodsInfoService;
 import com.sckw.product.api.model.KwpGoods;
 import com.sckw.stream.model.SckwBusSum;
@@ -40,6 +40,7 @@ import com.sckw.transport.model.dto.OrderCarDTO;
 import com.sckw.transport.model.dto.OrderFinishDTO;
 import com.sckw.transport.model.param.LogisticsConsignmentParam;
 import com.sckw.transport.model.vo.OrderFinishVO;
+import io.seata.core.context.RootContext;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -50,10 +51,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ObjectUtils;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -526,7 +524,7 @@ public class LogisticsConsignmentService {
      */
     public HttpResult purchaseLogisticsOrder(String id, Integer page, Integer pageSize, String type) {
         Long count = getLogisticsOrderCount(id, type);
-        Integer newPage = page - 1;
+        Integer newPage = (page - 1) * pageSize;
         List<LogisticsOrderDTO> list = getLogisticsOrderData(id, newPage, pageSize, type);
         PageResult build = PageResult.build(page, pageSize, count, list);
         return HttpResult.ok(build);
@@ -765,19 +763,58 @@ public class LogisticsConsignmentService {
         return HttpResult.ok(build);
     }
 
+    //    /**
+//     * 销售订单获取车辆信息
+//     *
+//     * @param id
+//     * @param page
+//     * @param pageSize
+//     * @return
+//     */
+//    public HttpResult sellLogisticsCar(String id, Integer page, Integer pageSize) {
+//        Long count = getLogisticsCarDataCount(id);
+//        Integer newPage = (page - 1) * pageSize;
+//        List<OrderCarDTO> list = getLogisticsCarData(id, newPage, pageSize);
+//        PageResult build = PageResult.build(page, pageSize, count, list);
+//        return HttpResult.ok(build);
+//    }
+
     /**
-     * 销售订单获取车辆信息
+     * 销售订单-车辆列表-销售订单id
      *
-     * @param id
+     * @param ids
      * @param page
      * @param pageSize
      * @return
      */
-    public HttpResult sellLogisticsCar(String id, Integer page, Integer pageSize) {
-        Long count = getLogisticsCarDataCount(id);
-        Integer newPage = page - 1;
-        List<OrderCarDTO> list = getLogisticsCarData(id, newPage, pageSize);
-        PageResult build = PageResult.build(page, pageSize, count, list);
+    public HttpResult sellLogisticsCar(String ids, Integer page, Integer pageSize) {
+        List<String> stringList = StringUtils.splitStrToList(ids, String.class);
+        if (CollectionUtils.isEmpty(stringList)) {
+            return HttpResult.ok();
+        }
+        List<OrderCarDTO> returnList = new ArrayList<>();
+        for (String id : stringList) {
+            List<OrderCarDTO> list = waybillOrderMapper.selectWaybillOrderCarListNotPage(id);
+            List<String> collect = list.stream().map(OrderCarDTO::getTruckNo).collect(Collectors.toList());
+            Map<String, RTruckVo> truck = remoteFleetService.findTruck(collect);
+            for (OrderCarDTO orderCarDTO : list) {
+//            orderCarDTO.setDriverId(String.valueOf(orderCarDTO.getDriverId()));
+//            orderCarDTO.setDriverName(orderCarDTO.getDriverName());
+//            orderCarDTO.setDriverPhone(orderCarDTO.getDriverPhone());
+//            orderCarDTO.setDriverCard(orderCarDTO.getDriverCard());
+                orderCarDTO.setLoadAmount(truck.get(orderCarDTO.getTruckNo()) == null ?
+                        null : (truck.get(orderCarDTO.getTruckNo()).getActualWeight() == null ?
+                        null : (String.valueOf(truck.get(orderCarDTO.getTruckNo()).getActualWeight()))));
+            }
+            if (CollectionUtils.isNotEmpty(list)) {
+                returnList.addAll(list);
+            }
+        }
+        List<OrderCarDTO> subList = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(returnList)) {
+            subList = returnList.stream().skip((page - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
+        }
+        PageResult build = PageResult.build(page, pageSize, returnList.stream().count(), subList);
         return HttpResult.ok(build);
     }
 
@@ -843,21 +880,29 @@ public class LogisticsConsignmentService {
                 jsonObject.put("message", "单据状态异常或单据不存在");
                 jsonObject.put("status", HttpStatus.GLOBAL_EXCEPTION_CODE);
             } else {
-                OrderDetailRes orderDetailRes = tradeOrderInfoService.getOrderDetailById(Long.parseLong(s));
-                UpdateOrderAmountParam param = new UpdateOrderAmountParam();
+                /**撤退推送接口数据溯源修改贸易订单已委托量*/
+                CreateOrCancelLogisticsOrderParam param = new CreateOrCancelLogisticsOrderParam();
                 param.setTOrderId(Long.parseLong(s));
-                param.setActualAmount(orderDetailRes.getActualAmount().add(kwtLogisticsOrder.getLoadAmount()));
-                param.setEntrustAmount(orderDetailRes.getEntrustAmount().add(kwtLogisticsOrder.getEntrustAmount().subtract(kwtLogisticsOrder.getLoadAmount())));
-                tradeOrderInfoService.updateOrderAmount(param);
-                kwtLogisticsOrder.setDelFlag(1);
-                kwtLogisticsOrder.setUpdateTime(new Date());
-                kwtLogisticsOrder.setUpdateBy(LoginUserHolder.getUserId());
-                kwtLogisticsOrderMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrder>()
-                        .eq(KwtLogisticsOrder::getId, kwtLogisticsOrder.getId())
-                        .set(KwtLogisticsOrder::getDelFlag, NumberConstant.ONE)
-                        .set(KwtLogisticsOrder::getUpdateBy, LoginUserHolder.getUserId())
-                        .set(KwtLogisticsOrder::getUpdateTime, new Date()));
-                jsonObject.put("status", HttpStatus.SUCCESS_CODE);
+                param.setEntrustAmount(kwtLogisticsOrder.getLoadAmount().negate());
+                param.setUpdateBy(LoginUserHolder.getUserId());
+                param.setUpdateByName(LoginUserHolder.getUserName());
+                HttpResult httpResult = tradeOrderInfoService.createOrCancelLogisticsOrder(param);
+                if (HttpStatus.SUCCESS_CODE == httpResult.getCode()) {
+                    kwtLogisticsOrder.setDelFlag(NumberConstant.ONE);
+                    kwtLogisticsOrder.setUpdateTime(new Date());
+                    kwtLogisticsOrder.setUpdateBy(LoginUserHolder.getUserId());
+                    kwtLogisticsOrderMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrder>()
+                            .eq(KwtLogisticsOrder::getId, kwtLogisticsOrder.getId())
+                            .set(KwtLogisticsOrder::getDelFlag, NumberConstant.ONE)
+                            .set(KwtLogisticsOrder::getUpdateBy, LoginUserHolder.getUserId())
+                            .set(KwtLogisticsOrder::getUpdateTime, new Date()));
+                    jsonObject.put("status", HttpStatus.SUCCESS_CODE);
+                    jsonObject.put("message", "操作成功");
+                } else {
+                    JSONObject.toJSONString(httpResult);
+                    jsonObject.put("status", HttpStatus.GLOBAL_EXCEPTION_CODE);
+                    jsonObject.put("message", "操作失败:" + httpResult.getMsg());
+                }
             }
             list.add(jsonObject);
         });
@@ -885,21 +930,28 @@ public class LogisticsConsignmentService {
                 jsonObject.put("message", "单据状态异常或单据不存在");
                 jsonObject.put("status", HttpStatus.GLOBAL_EXCEPTION_CODE);
             } else {
-                OrderDetailRes orderDetailRes = tradeOrderInfoService.getOrderDetailById(Long.parseLong(s));
-                UpdateOrderAmountParam param = new UpdateOrderAmountParam();
+                /**撤退推送接口数据溯源修改贸易订单已委托量*/
+                CreateOrCancelLogisticsOrderParam param = new CreateOrCancelLogisticsOrderParam();
                 param.setTOrderId(Long.parseLong(s));
-                param.setActualAmount(orderDetailRes.getActualAmount().add(kwtLogisticsOrder.getLoadAmount()));
-                param.setEntrustAmount(orderDetailRes.getEntrustAmount().add(kwtLogisticsOrder.getEntrustAmount().subtract(kwtLogisticsOrder.getLoadAmount())));
-                tradeOrderInfoService.updateOrderAmount(param);
-                kwtLogisticsOrder.setDelFlag(1);
-                kwtLogisticsOrder.setUpdateTime(new Date());
-                kwtLogisticsOrder.setUpdateBy(LoginUserHolder.getUserId());
-                kwtLogisticsOrderMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrder>()
-                        .eq(KwtLogisticsOrder::getId, kwtLogisticsOrder.getId())
-                        .set(KwtLogisticsOrder::getDelFlag, NumberConstant.ONE)
-                        .set(KwtLogisticsOrder::getUpdateBy, LoginUserHolder.getUserId())
-                        .set(KwtLogisticsOrder::getUpdateTime, new Date()));
-                jsonObject.put("status", HttpStatus.SUCCESS_CODE);
+                param.setEntrustAmount(kwtLogisticsOrder.getLoadAmount().negate());
+                param.setUpdateBy(LoginUserHolder.getUserId());
+                param.setUpdateByName(LoginUserHolder.getUserName());
+                HttpResult httpResult = tradeOrderInfoService.createOrCancelLogisticsOrder(param);
+                if (HttpStatus.SUCCESS_CODE == httpResult.getCode()) {
+                    kwtLogisticsOrder.setDelFlag(NumberConstant.ONE);
+                    kwtLogisticsOrder.setUpdateTime(new Date());
+                    kwtLogisticsOrder.setUpdateBy(LoginUserHolder.getUserId());
+                    kwtLogisticsOrderMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrder>()
+                            .eq(KwtLogisticsOrder::getId, kwtLogisticsOrder.getId())
+                            .set(KwtLogisticsOrder::getDelFlag, NumberConstant.ONE)
+                            .set(KwtLogisticsOrder::getUpdateBy, LoginUserHolder.getUserId())
+                            .set(KwtLogisticsOrder::getUpdateTime, new Date()));
+                    jsonObject.put("status", HttpStatus.SUCCESS_CODE);
+                    jsonObject.put("message", "操作失败:" + httpResult.getMsg());
+                } else {
+                    jsonObject.put("status", HttpStatus.GLOBAL_EXCEPTION_CODE);
+                    jsonObject.put("message", "操作失败:" + httpResult.getMsg());
+                }
             }
             list.add(jsonObject);
         });
@@ -913,6 +965,7 @@ public class LogisticsConsignmentService {
      * @return
      */
     @Transactional(rollbackFor = Exception.class)
+//    @GlobalTransactional(timeoutMills = 120000)
     public HttpResult orderFinish(OrderFinishDTO orderFinishDTO, String type) {
         HttpResult httpResult = ValidUtil.serviceValid(orderFinishDTO);
         if (!String.valueOf(httpResult.getCode()).equals(String.valueOf(HttpStatus.SUCCESS_CODE))) {
@@ -920,9 +973,13 @@ public class LogisticsConsignmentService {
         }
         //1采购 2销售
         if (String.valueOf(NumberConstant.ONE).equals(type)) {
+            log.info("采购订单-托运订单列表-完结订单 处理开始 seata xid:{}", RootContext.getXID());
             purchaseOrderFinish(orderFinishDTO);
+            log.info("采购订单-托运订单列表-完结订单 处理结束 seata xid:{}", RootContext.getXID());
         } else if (String.valueOf(NumberConstant.TWO).equals(type)) {
+            log.info("销售订单-托运订单列表-完结订单 处理开始 seata xid:{}", RootContext.getXID());
             sellOrderFinish(orderFinishDTO);
+            log.info("销售订单-托运订单列表-完结订单 处理结束 seata xid:{}", RootContext.getXID());
         } else {
             throw new RuntimeException("完结订单-单据类型异常!");
         }
@@ -943,7 +1000,7 @@ public class LogisticsConsignmentService {
      *
      * @param orderFinishDTO
      */
-    private void purchaseOrderFinish(OrderFinishDTO orderFinishDTO) {
+    public void purchaseOrderFinish(OrderFinishDTO orderFinishDTO) {
         /** 订单完结 物流运单状态为【待派车】、【运输中】可操作*/
         /**完结拦截 必须车辆运单无正在运输中的单据才能完结 状态有 待接单之后已核弹之前的状态 都不能完结*/
         /**完结订单-对应物流订单下子订单都要进行完结*/
@@ -953,7 +1010,7 @@ public class LogisticsConsignmentService {
         KwtLogisticsOrder logisticsOrder = kwtLogisticsOrderMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrder>()
                 .eq(KwtLogisticsOrder::getId, id));
         if (logisticsOrder == null) {
-            throw new RuntimeException("采购订单-完结订单-物流单据不存在!");
+            throw new BusinessException("采购订单-完结订单-物流单据不存在!");
         }
         if (logisticsOrder.getLoadAmount().compareTo(orderFinishDTO.getLoadAmount()) > 0) {
             throw new BusinessException("完结订单,实装量不能大于分配量");
@@ -961,49 +1018,472 @@ public class LogisticsConsignmentService {
         /**订单状态验证*/
         if (!LogisticsOrderEnum.WAIT_DELIVERY.getStatus().equals(String.valueOf(logisticsOrder.getStatus()))
                 && !LogisticsOrderEnum.IN_TRANSIT.getStatus().equals(String.valueOf(logisticsOrder.getStatus()))) {
-            throw new RuntimeException("当前运单并不属于【待派车】,【运输中】状态");
+            throw new BusinessException("当前运单并不属于【待派车】,【运输中】状态");
+        }
+        //验证当前物流订单是否还存在进行的车辆运单
+        boolean flag = judgmentWaybillOrderIsFinish(id);
+        if (flag) {
+            throw new BusinessException("您现在有车辆运单正在执行中,该订单目前不可完结,请先将运单执行完毕");
+        }
+        //修改单据本身数据
+        logisticsOrder.setTotalLoadAmount(orderFinishDTO.getLoadAmount());
+        logisticsOrder.setTotalUnloadAmount(orderFinishDTO.getUnloadAmount());
+        logisticsOrder.setStatus(LogisticsOrderEnum.HAVE_FINISHED.getCode());
+        logisticsOrder.setUpdateTime(new Date());
+        logisticsOrder.setUpdateBy(LoginUserHolder.getUserId());
+        kwtLogisticsOrderMapper.updateById(logisticsOrder);
+        //修改mongodb的数据
+        updateMongoDbByLogisticsOrder(logisticsOrder, orderFinishDTO);
+        //获取物流订单下的子单
+        /**完结订单-对应物流订单下子订单都要进行完结*/
+        List<KwtLogisticsOrder> kwtLogisticsOrders = kwtLogisticsOrderMapper.selectList(new LambdaQueryWrapper<KwtLogisticsOrder>()
+                .eq(KwtLogisticsOrder::getDelFlag, NumberConstant.ZERO)
+                .apply(id != null, "FIND_IN_SET ('" + id + "', pids)").ne(KwtLogisticsOrder::getId, id));
+        //找到该订单下所有的物流订单
+        if (!org.springframework.util.CollectionUtils.isEmpty(kwtLogisticsOrders)) {
+            //修改单据状态
+//            List<Long> ids = kwtLogisticsOrders.stream().map(KwtLogisticsOrder::getId).collect(Collectors.toList());
+            //修改单据剩余运输量
+            kwtLogisticsOrders.forEach(kwtLogisticsOrder -> {
+                BigDecimal subtract = kwtLogisticsOrder.getAmount().subtract(kwtLogisticsOrder.getTotalLoadAmount());
+                updateLogisticOrderAndTrack(kwtLogisticsOrder.getId(), orderFinishDTO, subtract);
+                //修改mongodb的数据
+                updateMongoDbByLogisticsOrder(kwtLogisticsOrder,orderFinishDTO);
+            });
+        }
+        //todo 直接订单完结-不递归操作
+//
+//        //存在子集
+//        if (CollectionUtils.isNotEmpty(kwtLogisticsOrders)) {
+//            if (kwtLogisticsOrders.size() == 1 && !(kwtLogisticsOrders.get(0).getPids().contains(StringConstant.COMMA))) {
+//                //不存在子集
+//                /**
+//                 * 验证是否存在进行中的车辆运单
+//                 * 统计当前物流订单的 分配量/实装量/实卸量
+//                 * 验证当前贸易订单是否存在进行中的物流运单
+//                 * */
+//                judgmentLogisticsOrderIsFinish(logisticsOrder);
+//                //直接修改数据以及状态
+//            } else {
+//                //分组排序
+//                Map<String, List<KwtLogisticsOrder>> collect1 = kwtLogisticsOrders.stream().collect(Collectors.groupingBy(KwtLogisticsOrder::getLevel,
+//                        Collectors.collectingAndThen(Collectors.toList(),
+//                                logisticsOrders -> logisticsOrders.stream().sorted(Comparator.comparing(KwtLogisticsOrder::getLevel).reversed())
+//                                        .collect(Collectors.toList()))
+//                ));
+//                //查出来最原始的数据
+//                List<KwtLogisticsOrder> orderLists = new ArrayList<>();
+//                for (List<KwtLogisticsOrder> value : collect1.values()) {
+//                    orderLists.addAll(value);
+//                }
+//                //当前订单下的最大分包等级
+//                int maxLevel = kwtLogisticsOrderMapper.selectMaxLevel(id);
+//                List<Map<String, Object>> list = new ArrayList<>();
+//                for (int level = maxLevel; level > 0; level--) {
+//                    if (maxLevel == level) {
+//                        List<KwtLogisticsOrder> logisticsOrderList = collect1.get(String.valueOf(level));
+//                        //操作最底层数据,溯源父级
+//                        for (KwtLogisticsOrder kwtLogisticsOrder : logisticsOrderList) {
+//                            BigDecimal entrustAmount = kwtLogisticsOrder.getEntrustAmount();
+//                            BigDecimal subcontractAmount = kwtLogisticsOrder.getSubcontractAmount();
+//                            BigDecimal amount = kwtLogisticsOrder.getAmount();
+//                            BigDecimal loadAmount = kwtLogisticsOrder.getLoadAmount();
+//                            BigDecimal unloadAmount = kwtLogisticsOrder.getUnloadAmount();
+//                            //已完成的量
+//                            BigDecimal subtract = subcontractAmount.add(loadAmount);
+//                            //本身数据修改(剩余量=上游给的委托量-(分包量+实际装货))
+//                            //剩余量
+//                            BigDecimal ignoreAmount = amount.subtract((subcontractAmount.add(loadAmount)));
+//                            kwtLogisticsOrderMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrder>()
+//                                    .eq(KwtLogisticsOrder::getId, kwtLogisticsOrder.getId())
+//                                    .set(KwtLogisticsOrder::getIgnoreAmount, ignoreAmount)
+//                            );
+//                            //最底下根节点-获取父级
+//                            KwtLogisticsOrder selectOne = kwtLogisticsOrderMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrder>()
+//                                    .eq(KwtLogisticsOrder::getId, kwtLogisticsOrder.getPid())
+//                            );
+//                            BigDecimal amount1 = selectOne.getAmount();
+//                            BigDecimal loadAmount1 = selectOne.getLoadAmount();
+//                            BigDecimal subcontractAmount1 = selectOne.getSubcontractAmount();
+//                            BigDecimal ignoreAmount1 = selectOne.getIgnoreAmount();
+//                            subcontractAmount1 = subcontractAmount1.subtract(subtract);
+//                            ignoreAmount1 = amount1.subtract((subcontractAmount1.add(loadAmount1)));
+//                            kwtLogisticsOrderMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrder>()
+//                                    .eq(KwtLogisticsOrder::getId, selectOne.getId())
+//                                    .set(KwtLogisticsOrder::getSubcontractAmount, subcontractAmount1)
+//                                    .set(KwtLogisticsOrder::getIgnoreAmount, ignoreAmount1)
+//                            );
+//                        }
+////                    List<KwtLogisticsOrder> collect = logisticsOrderList.stream().filter(item -> StringUtils.isNotBlank(item.getPid())).collect(Collectors.toList());
+//                    } else {
+//                        //不是一级,也不是最后一级
+//                        List<KwtLogisticsOrder> logisticsOrderList = collect1.get(String.valueOf(level));
+//                        if (CollectionUtils.isNotEmpty(logisticsOrderList)) {
+//                            for (KwtLogisticsOrder kwtLogisticsOrder : logisticsOrderList) {
+//                                Map<String, Object> map = new HashMap<>(NumberConstant.SIXTEEN);
+//                                List<Object> collect = list.stream().map(item -> item.get("level")).collect(Collectors.toList());
+//                                if (!collect.contains(kwtLogisticsOrder.getId())) {
+//                                    map.put("level", level);
+//                                    map.put("id", kwtLogisticsOrder.getId());
+//                                    list.add(map);
+//                                }
+//
+//                            }
+//                        }
+//                    }
+//                }
+//                lllll(list);
+//            }
+////
+////            List<Long> collect = kwtLogisticsOrders.stream().map(KwtLogisticsOrder::getId).collect(Collectors.toList());
+////            //验证 是否存在进行中车辆运单
+////            List<KwtLogisticsOrder> kwtLogisticsOrderList = kwtLogisticsOrderMapper.selectList(new LambdaQueryWrapper<KwtLogisticsOrder>().in(KwtLogisticsOrder::getId, collect));
+////            if (CollectionUtils.isNotEmpty(kwtLogisticsOrderList)) {
+////                judgmentLogisticsOrderIsFinish(logisticsOrder);
+////            }
+////            // 按照父级ID分组
+////            //判断是不是一级(一级的情况下,pid为null 方便处理,赋值为OL)
+////            List<KwtLogisticsOrder> list = kwtLogisticsOrders.stream()
+////                    .map(object -> {
+////                        KwtLogisticsOrder LogisticsOrder = new KwtLogisticsOrder();
+////                        BeanUtils.copyProperties(object, LogisticsOrder);
+////                        if (LogisticsOrder.getPid() == null) {
+////                            LogisticsOrder.setPid(0L);
+////                        }
+////                        return LogisticsOrder;
+////                    })
+////                    .collect(Collectors.toList());
+////            Map<Long, List<KwtLogisticsOrder>> groupByParentIdMap = list.stream().collect(Collectors.groupingBy(KwtLogisticsOrder::getPid));
+////            //存放:对应的当前节点ID数据
+////            Set<Long> topToLowerChildIdSet = new HashSet<>();
+////            // 取出顶级数据(也就是父级ID为0的数据  父级ID也可以自定义 当前赋值0L)
+////            List<KwtLogisticsOrder> topTreeNodes = groupByParentIdMap.get(0L);
+////            if (CollectionUtils.isEmpty(topTreeNodes)) {
+////                /**当前传输的代表不是一级 可能是二级或者三级
+////                 topTreeNodes = groupByParentIdMap.get(Long.parseLong(id));*/
+////                getMinimumChildIdArray(groupByParentIdMap, Long.parseLong(id), topToLowerChildIdSet);
+////                System.out.println("当前节点【" + id + "】节点下所有的根节点数据集合:" + topToLowerChildIdSet.toString());
+////                //根据等级分组倒序排序
+////                List<KwtLogisticsOrder> orderList = kwtLogisticsOrderMapper.selectList(new LambdaQueryWrapper<KwtLogisticsOrder>()
+////                        .in(KwtLogisticsOrder::getId, topToLowerChildIdSet)
+////                );
+////
+////            } else {
+////                for (KwtLogisticsOrder node : topTreeNodes) {
+////                    getMinimumChildIdArray(groupByParentIdMap, node.getId(), topToLowerChildIdSet);
+////                }
+////                System.out.println("0节点(传输为一级)下所有的根节点数据集合:" + topToLowerChildIdSet.toString());
+////            }
+////            //处理当前传递的id下  全部完结需要改的量
+////            BigDecimal decimals = new BigDecimal("0.00");
+////            BigDecimal decimal = judgmentOrderFinish(id, topToLowerChildIdSet, decimals, logisticsOrder);
+////            //返回给贸易订单实际装卸货量
+////            Map map = countOrderNumber(logisticsOrder.getTOrderId());
+////            //修改单据状态
+//////            updateLogisticOrderStatus(id,orderFinishDTO);
+//        } else {
+//            throw new BusinessException("不存在物流订单,不可操作!");
+//        }
+    }
+
+    /**
+     * 根据物流订单修改mongodb数据
+     *
+     * @param logisticsOrder
+     * @param orderFinishDTO
+     */
+    private void updateMongoDbByLogisticsOrder(KwtLogisticsOrder logisticsOrder, OrderFinishDTO orderFinishDTO) {
+        //更新mongodb
+        SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
+        lOrder.set_id(logisticsOrder.getId());
+        lOrder.setLOrderId(logisticsOrder.getId());
+        lOrder.setStatus(LogisticsOrderEnum.HAVE_FINISHED.getStatus());
+        lOrder.setUpdateTime(new Date());
+        lOrder.setUpdateBy(LoginUserHolder.getUserId());
+        lOrder.setUpdateByName(LoginUserHolder.getUserName());
+        lOrder.setTotalLoadAmount(orderFinishDTO.getLoadAmount());
+        lOrder.setTotalUnloadAmount(orderFinishDTO.getUnloadAmount());
+        //rabbitMq业务汇总数据发送/消费对象
+        SckwBusSum busSum = new SckwBusSum();
+        //业务汇总类型
+        busSum.setBusSumType(BusinessTypeEnum.LOGISTICS_ORDER_TYPE.getName());
+        //操作对象(1新增/2修改/3替换数据)
+        busSum.setMethod(2);
+        //业务汇总数据对象
+        busSum.setObject(lOrder);
+        busSum.setBusSumType(BusinessTypeEnum.LOGISTICS_ORDER_TYPE.getName());
+        busSum.setMethod(NumberConstant.TWO);
+        streamBridge.send("sckw-busSum", JSON.toJSONString(busSum));
+    }
+
+    private void lllll(List<Map<String, Object>> list) {
+        if (!org.springframework.util.CollectionUtils.isEmpty(list) && list.size() > 0) {
+            //倒序排序
+//                List<Map<String, Object>> maps = ListUtils.sortMapListByFeild(list, "level", "desc");
+            int level = list.stream().mapToInt(m -> (Integer) m.getOrDefault("level", Long.MAX_VALUE)).max().getAsInt();
+            List<Long> ids = new ArrayList<>();
+            for (int i = level; i > 0; i--) {
+                for (Map<String, Object> map : list) {
+                    if (CollectionUtils.isEmpty(list)) {
+                        continue;
+                    }
+                    if (String.valueOf(i).equals(String.valueOf(map.get("level")))) {
+                        List<KwtLogisticsOrder> orderList = kwtLogisticsOrderMapper.selectList(new LambdaQueryWrapper<KwtLogisticsOrder>()
+                                .eq(KwtLogisticsOrder::getId, map.get("id"))
+                        );
+                        if (CollectionUtils.isNotEmpty(orderList)) {
+                            //操作最底层数据,溯源父级
+                            for (KwtLogisticsOrder kwtLogisticsOrder : orderList) {
+                                BigDecimal entrustAmount = kwtLogisticsOrder.getEntrustAmount();
+                                BigDecimal subcontractAmount = kwtLogisticsOrder.getSubcontractAmount();
+                                BigDecimal amount = kwtLogisticsOrder.getAmount();
+                                BigDecimal loadAmount = kwtLogisticsOrder.getLoadAmount();
+                                BigDecimal unloadAmount = kwtLogisticsOrder.getUnloadAmount();
+                                //剩余未完成的量
+                                BigDecimal subtract = amount.subtract(loadAmount);
+                                //最底下根节点-获取父级
+                                if (kwtLogisticsOrder.getPid() == null && kwtLogisticsOrder.getPids().equals(String.valueOf(kwtLogisticsOrder.getId()))) {
+                                    //代表是一级
+                                    //todo 当前不做操作
+                                } else {
+                                    KwtLogisticsOrder selectOne = kwtLogisticsOrderMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrder>()
+                                            .eq(KwtLogisticsOrder::getId, kwtLogisticsOrder.getPid())
+                                    );
+                                    kwtLogisticsOrderMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrder>()
+                                            .eq(KwtLogisticsOrder::getId, selectOne.getId())
+                                            .set(KwtLogisticsOrder::getEntrustAmount, selectOne.getEntrustAmount().add(subtract))
+                                            .set(KwtLogisticsOrder::getSubcontractAmount, selectOne.getSubcontractAmount().subtract(subtract))
+                                    );
+                                }
+                                ids.add(kwtLogisticsOrder.getId());
+                            }
+                        }
+                    } else {
+                        if (!ObjectUtils.isEmpty(map.get(String.valueOf(i)))) {
+                            List<KwtLogisticsOrder> orderList = kwtLogisticsOrderMapper.selectList(new LambdaQueryWrapper<KwtLogisticsOrder>()
+                                    .eq(KwtLogisticsOrder::getId, Long.parseLong((String) map.get("id")))
+                            );
+                            if (CollectionUtils.isNotEmpty(orderList)) {
+                                for (KwtLogisticsOrder kwtLogisticsOrder : orderList) {
+                                    Map<String, Object> maps = new HashMap<>(NumberConstant.SIXTEEN);
+                                    List<Object> collect = list.stream().map(item -> item.get("level")).collect(Collectors.toList());
+                                    if (!collect.contains(kwtLogisticsOrder.getId())) {
+                                        maps.put("level", level);
+                                        maps.put("id", kwtLogisticsOrder.getId());
+                                        list.add(maps);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                Iterator<Map<String, Object>> iterator = list.iterator();
+                while (iterator.hasNext()) {
+                    Map<String, Object> next = iterator.next();
+                    String key = String.valueOf(next.get(("id")));
+                    for (Long id : ids) {
+                        if (key.equals(String.valueOf(id))) {
+                            iterator.remove();
+                        }
+                    }
+                }
+            }
+            lllll(list);
+        }
+    }
+
+
+    private Map countOrderNumber(Long tOrderId) {
+        Map<String, BigDecimal> map = new HashMap<>();
+        BigDecimal loadAmountTotal = new BigDecimal("0.00");
+        BigDecimal unloadAmountTotal = new BigDecimal("0.00");
+        List<KwtLogisticsOrder> kwtLogisticsOrderList = kwtLogisticsOrderMapper.selectList(new LambdaQueryWrapper<KwtLogisticsOrder>().eq(KwtLogisticsOrder::getTOrderId, tOrderId));
+        for (KwtLogisticsOrder kwtLogisticsOrder : kwtLogisticsOrderList) {
+            BigDecimal loadAmount = kwtLogisticsOrder.getLoadAmount();
+            BigDecimal unloadAmount = kwtLogisticsOrder.getUnloadAmount();
+            loadAmountTotal = loadAmountTotal.add(loadAmount);
+            unloadAmountTotal = unloadAmountTotal.add(unloadAmount);
+        }
+        return map;
+    }
+
+    /**
+     * 处理当前传递的id下  全部完结
+     *
+     * @param id                   当前完结物流订单传递id
+     * @param topToLowerChildIdSet 当前传递的下的最末一级的物流订单主键id
+     * @param logisticsOrder       本身物流订单
+     */
+    private BigDecimal judgmentOrderFinish(String id, Set<Long> topToLowerChildIdSet, BigDecimal amount, KwtLogisticsOrder logisticsOrder) {
+        if (CollectionUtils.isNotEmpty(topToLowerChildIdSet)) {
+            List<KwtLogisticsOrder> kwtLogisticsOrderList = kwtLogisticsOrderMapper.selectList(new LambdaQueryWrapper<KwtLogisticsOrder>()
+                    .in(KwtLogisticsOrder::getId, topToLowerChildIdSet)
+            );
+            List<KwtLogisticsOrder> logisticsOrders = new ArrayList<>();
+            if (CollectionUtils.isNotEmpty(kwtLogisticsOrderList)) {
+                for (KwtLogisticsOrder kwtLogisticsOrder : kwtLogisticsOrderList) {
+                    BigDecimal entrustAmount = kwtLogisticsOrder.getEntrustAmount();
+                    BigDecimal subcontractAmount = kwtLogisticsOrder.getSubcontractAmount();
+                    if (subcontractAmount.compareTo(new BigDecimal("0.00")) == 0) {
+                        //最底下根节点-获取父级
+                        KwtLogisticsOrder selectOne = kwtLogisticsOrderMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrder>()
+                                .eq(KwtLogisticsOrder::getId, kwtLogisticsOrder.getPid())
+                        );
+                        BigDecimal amount1 = kwtLogisticsOrder.getAmount().subtract(entrustAmount.add(subcontractAmount));
+                        amount = amount.add(amount1);
+                        kwtLogisticsOrderMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrder>()
+                                .eq(KwtLogisticsOrder::getId, selectOne.getId())
+                                .set(KwtLogisticsOrder::getEntrustAmount, selectOne.getEntrustAmount().subtract(kwtLogisticsOrder.getEntrustAmount()))
+                                .set(KwtLogisticsOrder::getSubcontractAmount, selectOne.getSubcontractAmount().subtract(kwtLogisticsOrder.getSubcontractAmount()))
+                        );
+                    } else {
+                        logisticsOrders.add(kwtLogisticsOrder);
+                    }
+                }
+            }
+
+        }
+        return amount;
+    }
+
+
+    private void updateLogisticOrderAndTrack(Long lOrderId, OrderFinishDTO orderFinishDTO, BigDecimal ignoreAmount) {
+        Integer code = LogisticsOrderEnum.HAVE_FINISHED.getCode();
+        kwtLogisticsOrderMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrder>()
+                .set(KwtLogisticsOrder::getStatus, code)
+                .set(KwtLogisticsOrder::getUpdateBy, LoginUserHolder.getUserId())
+                .set(KwtLogisticsOrder::getIgnoreAmount, ignoreAmount)
+                .set(KwtLogisticsOrder::getUpdateTime, new Date())
+                .eq(KwtLogisticsOrder::getId, lOrderId)
+        );
+        KwtLogisticsOrderTrack track = kwtLogisticsOrderTrackMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrderTrack>()
+                .eq(KwtLogisticsOrderTrack::getLOrderId, lOrderId).eq(KwtLogisticsOrderTrack::getStatus, code)
+        );
+        if (track != null) {
+            kwtLogisticsOrderTrackMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrderTrack>()
+                    .set(KwtLogisticsOrderTrack::getUpdateBy, LoginUserHolder.getUserId())
+                    .set(KwtLogisticsOrderTrack::getUpdateTime, new Date())
+                    .set(KwtLogisticsOrderTrack::getRemark, orderFinishDTO.getRemark())
+                    .eq(KwtLogisticsOrderTrack::getId, track.getId())
+            );
+        } else {
+            KwtLogisticsOrderTrack orderTrack = new KwtLogisticsOrderTrack();
+            orderTrack.setId(new IdWorker(NumberConstant.ONE).nextId());
+            orderTrack.setLOrderId(lOrderId);
+            orderTrack.setRemark(orderFinishDTO.getRemark());
+            orderTrack.setStatus(code);
+            orderTrack.setCreateBy(LoginUserHolder.getUserId());
+            orderTrack.setCreateTime(new Date());
+            orderTrack.setUpdateBy(LoginUserHolder.getUserId());
+            orderTrack.setUpdateTime(new Date());
+            orderTrack.setDelFlag(NumberConstant.ZERO);
+            kwtLogisticsOrderTrackMapper.insert(orderTrack);
         }
-        /**完结拦截*/
+    }
+
+    /**
+     * 根据父级节点获取最低层次 那一级的节点数据
+     * 1
+     * /   \
+     * 2     3
+     * / \   / \
+     * 4  5  6  7
+     * 上面的树形结构调用此方法  根据1 可以获取到  [4 5 6 7]
+     * 根据3 可以获得到  [6 7]
+     *
+     * @param groupByParentIdMap   所有的元素集合(根据父级ID进行了分组) 分组方法可以使用lambda 如下:
+     *                             Map<String, List<Person>> peopleByCity = personStream.collect(Collectors.groupingBy(Person::getCity));
+     * @param pid                  父级ID
+     * @param topToLowerChildIdSet 存储最深根节点的数据集合
+     */
+    public static Set<Long> getMinimumChildIdArray(Map<Long, List<KwtLogisticsOrder>> groupByParentIdMap,
+                                                   Long pid, Set<Long> topToLowerChildIdSet) {
+        // 存放当前pid对应的所有根节点ID数据
+        Set<Long> currentPidLowerChildIdSet = new HashSet<>();
+        // 获取当前pid下所有的子节点
+        List<KwtLogisticsOrder> childTreeNodes = groupByParentIdMap.get(pid);
+        if (CollUtil.isEmpty(childTreeNodes)) {
+            return null;
+        }
+        for (KwtLogisticsOrder treeNode : childTreeNodes) {
+            Set<Long> lowerChildIdSet = getMinimumChildIdArray(groupByParentIdMap, treeNode.getId(), currentPidLowerChildIdSet);
+            if (CollUtil.isEmpty(lowerChildIdSet)) {
+                // 如果返回null  表示当前遍历的treeNode节点为最底层的节点
+                currentPidLowerChildIdSet.add(treeNode.getId());
+            }
+        }
+        System.out.println("当前父级ID:" + pid + "下所有的根节点数据:" + currentPidLowerChildIdSet.toString());
+        // 把当前获取到的根节点数据 一并保存到上一个节点父级ID集合中
+        topToLowerChildIdSet.addAll(currentPidLowerChildIdSet);
+        return currentPidLowerChildIdSet;
+    }
+
+    /**
+     * 验证当前物流订单是否存在未完结的车辆运单
+     *
+     * @param id 对应物流订单id
+     */
+    private boolean judgmentWaybillOrderIsFinish(String id) {
+        boolean flag = false;
         List<Integer> statusList = new ArrayList<>();
+        statusList.add(CarWaybillEnum.PENDING_ORDER.getCode());
         statusList.add(CarWaybillEnum.PENDING_VEHICLE.getCode());
         statusList.add(CarWaybillEnum.EXIT_COMPLETED.getCode());
         statusList.add(CarWaybillEnum.WAIT_LOADING.getCode());
         statusList.add(CarWaybillEnum.COMPLETION_LOADING.getCode());
         statusList.add(CarWaybillEnum.WAIT_UNLOADING.getCode());
         statusList.add(CarWaybillEnum.COMPLETION_UNLOADING.getCode());
+        statusList.add(CarWaybillEnum.APPROVAL_PASS.getCode());
         int count = waybillOrderMapper.selectDataByLorderId(id, statusList);
         if (count > NumberConstant.ZERO) {
-            throw new RuntimeException("检测您现在有运单正在执行中,该订单目前不可完结,请先将运单执行完毕");
+            flag = true;
         }
-        /**完结订单-对应物流订单下子订单都要进行完结*/
-        List<KwtLogisticsOrder> kwtLogisticsOrders = kwtLogisticsOrderMapper.selectList(new LambdaQueryWrapper<KwtLogisticsOrder>()
-                .in(KwtLogisticsOrder::getPids, Long.parseLong(orderFinishDTO.getId())));
-        if (CollectionUtils.isNotEmpty(kwtLogisticsOrders)) {
-            for (KwtLogisticsOrder kwtLogisticsOrder : kwtLogisticsOrders) {
-                String[] split = kwtLogisticsOrder.getPids().split(StringConstant.COMMA);
-                if (split.length > NumberConstant.ONE) {
-                    for (String s : split) {
-                        if (String.valueOf(kwtLogisticsOrder.getId()).equals(s)) {
-                            //本身订单
-                            //只存在当前订单无分包订单
-                            /**单据完结修改状态以及数据*/
-                            updateDataByItself(logisticsOrder, orderFinishDTO);
-                        } else {
-                            //修改分包后的订单-代表存在分包订单
-                            /**单据完结修改状态以及数据*/
-                            updateDataBySubset(orderFinishDTO, s);
-                        }
-                    }
-                } else {
-                    //只存在当前订单无分包订单
-                    /**单据完结修改状态以及数据*/
-                    updateDataByItself(logisticsOrder, orderFinishDTO);
-                }
-            }
+        return flag;
+    }
+
+    /**
+     * 验证是否存在进行中的车辆运单
+     * 统计当前物流订单的 分配量/实装量/实卸量
+     * 验证当前贸易订单是否存在进行中的物流运单
+     *
+     * @param logisticsOrder 物流订单数据
+     */
+    public void judgmentLogisticsOrderIsFinish(KwtLogisticsOrder logisticsOrder) {
+        //查询是否存在进行中的车辆运单 取至 CarWaybillEnum 枚举类
+        long[] waybillStatus = {1, 2, 3, 4, 5, 6, 7, 8};
+        List<KwtWaybillOrder> waybillOrders = waybillOrderMapper.selectList(new LambdaQueryWrapper<KwtWaybillOrder>()
+                .eq(KwtWaybillOrder::getLOrderId, logisticsOrder.getId())
+                .in(KwtWaybillOrder::getStatus, waybillStatus));
+        if (CollectionUtils.isNotEmpty(waybillOrders)) {
+            log.info("完结订单时存在进行中的车辆运单,物流订单id:{},物流订单编号:{},车辆运单:{}",
+                    logisticsOrder.getId(), logisticsOrder.getLOrderNo(), JSONObject.toJSONString(waybillOrders));
+            throw new BusinessException("不能进行订单完结,存在进行中的车辆运单");
+        }
+        //获取贸易订单下物流运单是否存在进行中的单据(贸易订单统计物流订单) 取至 LogisticsOrderEnum枚举类
+        long[] logisticsStatus = {0, 1, 2, 3};
+        List<KwtLogisticsOrder> orderList = kwtLogisticsOrderMapper.selectList(new LambdaQueryWrapper<KwtLogisticsOrder>()
+                .eq(KwtLogisticsOrder::getTOrderId, logisticsOrder.getTOrderId())
+                .in(KwtLogisticsOrder::getStatus, logisticsStatus));
+        boolean flag = true;
+        if (CollectionUtils.isNotEmpty(orderList)) {
+            log.info("完结订单时存在当前进行中的贸易订单下的物流运单,物流订单id:{},物流订单编号:{},贸易订单id:{},贸易订单编号:{},当前贸易订单其他物流订单:{}",
+                    logisticsOrder.getId(), logisticsOrder.getLOrderNo(), logisticsOrder.getTOrderId(), JSONObject.toJSONString(waybillOrders), JSONObject.toJSONString(orderList));
+            throw new BusinessException("完结订单时存在当前进行中的贸易订单下的物流运单");
         }
+        //防止事务脏读,幻读.重新查询 物流订单数据
+//        KwtLogisticsOrder kwtLogisticsOrder = kwtLogisticsOrderMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrder>().eq(KwtLogisticsOrder::getId, logisticsOrder.getId()));
+//        CompleteLogisticsOrderParam param = new CompleteLogisticsOrderParam();
+//        param.setTOrderId(logisticsOrder.getTOrderId());
+//        param.setEntrustAmount(kwtLogisticsOrder.getAmount().negate());
+//        param.setActualLoadAmount(kwtLogisticsOrder.getLoadAmount());
+//        param.setActualUnloadAmount(kwtLogisticsOrder.getUnloadAmount());
+//        param.setIsAllComplete(flag);
+//        param.setUpdateBy(LoginUserHolder.getUserId());
+//        param.setUpdateByName(LoginUserHolder.getUserName());
+//        tradeOrderInfoService.completeLogisticsOrder(param);
     }
 
-    private void updateDataBySubset(OrderFinishDTO orderFinishDTO, String orderId) {
+    public void updateDataBySubset(OrderFinishDTO orderFinishDTO, String orderId) {
         KwtLogisticsOrder kwtLogisticsOrder = kwtLogisticsOrderMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrder>()
                 .eq(KwtLogisticsOrder::getId, Long.parseLong(orderId)));
         if (kwtLogisticsOrder != null) {
@@ -1012,16 +1492,27 @@ public class LogisticsConsignmentService {
             kwtLogisticsOrder.setUpdateTime(new Date());
             kwtLogisticsOrder.setRemark(orderFinishDTO.getRemark());
             kwtLogisticsOrderMapper.updateById(kwtLogisticsOrder);
-            KwtLogisticsOrderTrack track = new KwtLogisticsOrderTrack();
-            track.setId(new IdWorker(NumberConstant.ONE).nextId());
-            track.setLOrderId(kwtLogisticsOrder.getId());
-            track.setStatus(LogisticsOrderEnum.HAVE_FINISHED.getCode());
-            track.setCreateTime(new Date());
-            track.setRemark(orderFinishDTO.getRemark());
-            track.setCreateBy(LoginUserHolder.getUserId());
-            track.setUpdateBy(LoginUserHolder.getUserId());
-            track.setUpdateTime(new Date());
-            kwtLogisticsOrderTrackMapper.insert(track);
+            KwtLogisticsOrderTrack logisticsOrderTrack = kwtLogisticsOrderTrackMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrderTrack>()
+                    .eq(KwtLogisticsOrderTrack::getLOrderId, orderId)
+                    .eq(KwtLogisticsOrderTrack::getStatus, LogisticsOrderEnum.HAVE_FINISHED.getCode()));
+            if (logisticsOrderTrack == null) {
+                KwtLogisticsOrderTrack track = new KwtLogisticsOrderTrack();
+                track.setId(new IdWorker(NumberConstant.ONE).nextId());
+                track.setLOrderId(kwtLogisticsOrder.getId());
+                track.setStatus(LogisticsOrderEnum.HAVE_FINISHED.getCode());
+                track.setCreateTime(new Date());
+                track.setRemark(orderFinishDTO.getRemark());
+                track.setCreateBy(LoginUserHolder.getUserId());
+                track.setUpdateBy(LoginUserHolder.getUserId());
+                track.setUpdateTime(new Date());
+                kwtLogisticsOrderTrackMapper.insert(track);
+            } else {
+                kwtLogisticsOrderTrackMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrderTrack>()
+                        .eq(KwtLogisticsOrderTrack::getLOrderId, orderId)
+                        .set(KwtLogisticsOrderTrack::getRemark, orderFinishDTO.getRemark())
+                        .set(KwtLogisticsOrderTrack::getUpdateTime, new Date())
+                        .set(KwtLogisticsOrderTrack::getUpdateBy, LoginUserHolder.getUserId()));
+            }
             /**单据完结修改Mongodb*/
             SckwLogisticsOrder updateParam = new SckwLogisticsOrder();
             updateParam.setLOrderId(kwtLogisticsOrder.getId())
@@ -1049,16 +1540,27 @@ public class LogisticsConsignmentService {
         logisticsOrder.setUpdateTime(new Date());
         logisticsOrder.setRemark(orderFinishDTO.getRemark());
         kwtLogisticsOrderMapper.updateById(logisticsOrder);
-        KwtLogisticsOrderTrack track = new KwtLogisticsOrderTrack();
-        track.setId(new IdWorker(NumberConstant.ONE).nextId());
-        track.setLOrderId(logisticsOrder.getId());
-        track.setStatus(LogisticsOrderEnum.HAVE_FINISHED.getCode());
-        track.setCreateTime(new Date());
-        track.setRemark(orderFinishDTO.getRemark());
-        track.setCreateBy(LoginUserHolder.getUserId());
-        track.setUpdateBy(LoginUserHolder.getUserId());
-        track.setUpdateTime(new Date());
-        kwtLogisticsOrderTrackMapper.insert(track);
+        KwtLogisticsOrderTrack logisticsOrderTrack = kwtLogisticsOrderTrackMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrderTrack>()
+                .eq(KwtLogisticsOrderTrack::getLOrderId, logisticsOrder.getId())
+                .eq(KwtLogisticsOrderTrack::getStatus, LogisticsOrderEnum.HAVE_FINISHED.getCode()));
+        if (logisticsOrderTrack == null) {
+            KwtLogisticsOrderTrack track = new KwtLogisticsOrderTrack();
+            track.setId(new IdWorker(NumberConstant.ONE).nextId());
+            track.setLOrderId(logisticsOrder.getId());
+            track.setStatus(LogisticsOrderEnum.HAVE_FINISHED.getCode());
+            track.setCreateTime(new Date());
+            track.setRemark(orderFinishDTO.getRemark());
+            track.setCreateBy(LoginUserHolder.getUserId());
+            track.setUpdateBy(LoginUserHolder.getUserId());
+            track.setUpdateTime(new Date());
+            kwtLogisticsOrderTrackMapper.insert(track);
+        } else {
+            kwtLogisticsOrderTrackMapper.update(null, new LambdaUpdateWrapper<KwtLogisticsOrderTrack>()
+                    .eq(KwtLogisticsOrderTrack::getLOrderId, logisticsOrder.getId())
+                    .set(KwtLogisticsOrderTrack::getRemark, orderFinishDTO.getRemark())
+                    .set(KwtLogisticsOrderTrack::getUpdateTime, new Date())
+                    .set(KwtLogisticsOrderTrack::getUpdateBy, LoginUserHolder.getUserId()));
+        }
         /**单据完结修改Mongodb*/
         SckwLogisticsOrder updateParam = new SckwLogisticsOrder();
         updateParam.setLOrderId(Long.parseLong(orderFinishDTO.getId()))

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

@@ -118,8 +118,8 @@ public class TransportCommonService {
      */
     private OrderDetailVO getOrderData(DocumentParamDTO dto) {
         KwtLogisticsOrder logisticsOrder = logisticsOrderMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrder>()
-                .eq(KwtLogisticsOrder::getId, dto.getId())
-                .eq(StringUtils.isNotBlank(dto.getDocumentNo()), KwtLogisticsOrder::getLOrderNo, dto.getDocumentNo())
+                        .eq(KwtLogisticsOrder::getId, dto.getId())
+                        .eq(StringUtils.isNotBlank(dto.getDocumentNo()), KwtLogisticsOrder::getLOrderNo, dto.getDocumentNo())
                 /**.eq(KwtLogisticsOrder::getEntId, LoginUserHolder.getEntId())*/);
         if (logisticsOrder == null) {
             log.info("查无单据:{}", JSONObject.toJSONString(dto));
@@ -156,12 +156,14 @@ public class TransportCommonService {
             }
         }
         if (unitOne != null) {
+            orderDetailVO.setConsignCompanyId(unitOne.getId());
             orderDetailVO.setConsignCompany(unitOne.getFirmName());
             orderDetailVO.setConsignContacts(unitOne.getContacts());
             orderDetailVO.setConsignPhone(unitOne.getPhone());
             orderDetailVO.setCollectionCompany(unitOne.getFirmName());
         }
         if (unitTwo != null) {
+            orderDetailVO.setCarrierCompanyId(unitTwo.getId());
             orderDetailVO.setCarrierCompany(unitTwo.getFirmName());
             orderDetailVO.setCarrierContacts(unitTwo.getContacts());
             orderDetailVO.setCarrierPhone(unitTwo.getPhone());
@@ -198,8 +200,8 @@ public class TransportCommonService {
         log.info("订单-撤销托运请求参数:{}", JSONObject.toJSONString(orderDto));
         HttpResult result = new HttpResult();
         KwtLogisticsOrder logisticsOrder = logisticsOrderMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrder>()
-                .eq(KwtLogisticsOrder::getId, orderDto.getId())
-                .eq(KwtLogisticsOrder::getLOrderNo, orderDto.getOrderNo())
+                        .eq(KwtLogisticsOrder::getId, orderDto.getId())
+                        .eq(KwtLogisticsOrder::getLOrderNo, orderDto.getOrderNo())
                 /**.eq(KwtLogisticsOrder::getEntId, LoginUserHolder.getEntId())*/);
         if (logisticsOrder == null) {
             result.setCode(HttpStatus.GLOBAL_EXCEPTION_CODE);
@@ -262,6 +264,7 @@ public class TransportCommonService {
 
     /**
      * 对账管理-运费收款对账界面查询接口
+     *
      * @param logisticsOrderParam
      * @return
      */
@@ -275,7 +278,7 @@ public class TransportCommonService {
             logisticsOrderParam.setEndTime(logisticsOrderParam.getEndTime() + " 23:59:59");
         }
         Integer page = logisticsOrderParam.getPage();
-        logisticsOrderParam.setPage(logisticsOrderParam.getPage() - 1);
+        logisticsOrderParam.setPage((logisticsOrderParam.getPage() - 1) * logisticsOrderParam.getPageSize());
         List<LogisticsOrderDTO> list = logisticsOrderMapper.selectLogisticOrderData(logisticsOrderParam, dictId);
         Long count = logisticsOrderMapper.selectLogisticOrderCount(logisticsOrderParam, dictId);
         if (CollectionUtils.isNotEmpty(list)) {

+ 11 - 2
sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderMapper.xml

@@ -10,6 +10,9 @@
         <result column="l_order_no" jdbcType="VARCHAR" property="lOrderNo"/>
         <result column="pid" jdbcType="BIGINT" property="pid"/>
         <result column="pids" jdbcType="VARCHAR" property="pids"/>
+        <result column="level" jdbcType="VARCHAR" property="level"/>
+        <result column="total_load_amount" jdbcType="VARCHAR" property="totalLoadAmount"/>
+        <result column="total_unload_amount" jdbcType="VARCHAR" property="totalUnloadAmount"/>
         <result column="settlement_cycle" jdbcType="BIGINT" property="settlementCycle"/>
         <result column="billing_mode" jdbcType="BIGINT" property="billingMode"/>
         <result column="price" jdbcType="DECIMAL" property="price"/>
@@ -41,7 +44,7 @@
     </resultMap>
     <sql id="Base_Column_List">
         id
-        , ent_id, t_order_id,type, t_order_no, l_order_no, pid,pids, settlement_cycle, price, price_type,billing_mode,
+        , ent_id, t_order_id,type,level,total_load_amount,total_unload_amount, t_order_no, l_order_no, pid,pids, settlement_cycle, price, price_type,billing_mode,
     amount, unit, loss, loss_unit, goods_price, goods_price_unit, start_time, end_time,
     subcontract_amount, entrust_amount, unload_amount, load_amount, ignore_amount, deficit_amount,
     deficit_price, payment, tax_rate, remark, `status`, create_by, create_time, update_by,
@@ -137,7 +140,7 @@
                 AND a.payment = #{dictId}
             </if>
             <if test="logisticsOrderParam.companyId !=null and logisticsOrderParam.companyId != ''">
-                AND d.ent_id = #{logisticsOrderParam.companyId}
+                AND a.ent_id = #{logisticsOrderParam.companyId}
             </if>
             <if test="logisticsOrderParam.taxRate != null and logisticsOrderParam.taxRate != ''">
                 AND a.tax_rate = #{logisticsOrderParam.taxRate}
@@ -509,4 +512,10 @@
     <select id="getAddressDetailListByEntId" resultType="com.sckw.transport.api.model.dto.AddressResDTO">
 
     </select>
+    <select id="selectMaxLevel" resultType="java.lang.Integer">
+        SELECT MAX(LEVEL)
+        FROM kwt_logistics_order
+        WHERE del_flag = 0
+          AND FIND_IN_SET(#{id}, pids)
+    </select>
 </mapper>