Преглед на файлове

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

zk преди 2 години
родител
ревизия
c29646c061
променени са 42 файла, в които са добавени 792 реда и са изтрити 127 реда
  1. 4 0
      sckw-common/sckw-common-core/pom.xml
  2. 49 30
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/BeanUtils.java
  3. 93 2
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/OkHttpUtils.java
  4. 17 1
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/RegularUtils.java
  5. 2 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/constant/HttpStatus.java
  6. 5 0
      sckw-common/sckw-common-mongo/src/main/java/com/sckw/mongo/model/SckwTradeOrder.java
  7. 12 2
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/TradeOrderInfoService.java
  8. 5 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/OrderDetailRes.java
  9. 42 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/UpdateAssociateStatementParam.java
  10. 4 0
      sckw-modules/sckw-contract/pom.xml
  11. 1 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcCheckedController.java
  12. 56 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/dto/req/EsignGetFlowReqDto.java
  13. 3 6
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/LogisticsGoodsInfoReqVo.java
  14. 3 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/TradeBaseInfoReqVo.java
  15. 3 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/TradeGoodsInfoReqVo.java
  16. 11 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/TradeBaseInfoResVo.java
  17. 131 15
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractLogisticsService.java
  18. 61 8
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractTradeService.java
  19. 5 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/dto/req/CooperateManageQueryReqDto.java
  20. 0 2
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/CommonBusinessService.java
  21. 15 0
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmCooperateApplyService.java
  22. 15 3
      sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmCooperateManageService.java
  23. 19 3
      sckw-modules/sckw-manage/src/main/resources/mapper/KwmCooperateMapper.xml
  24. 4 0
      sckw-modules/sckw-order/pom.xml
  25. 36 7
      sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java
  26. 5 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrder.java
  27. 5 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/OrderDetailRes.java
  28. 8 1
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java
  29. 15 7
      sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwOrderService.java
  30. 2 1
      sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwTransportService.java
  31. 6 1
      sckw-modules/sckw-report/src/main/java/com/sckw/report/service/vo/CarWaybillVo.java
  32. 25 10
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java
  33. 1 1
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java
  34. 2 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/AcceptCarriageOrderController.java
  35. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/LogisticsConsignmentController.java
  36. 8 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderMapper.java
  37. 2 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/AddOrderDTO.java
  38. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/OperateSendCarDto.java
  39. 7 4
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/SubcontractConsignmentDTO.java
  40. 43 14
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/AcceptCarriageOrderService.java
  41. 40 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/LogisticsConsignmentService.java
  42. 25 3
      sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderMapper.xml

+ 4 - 0
sckw-common/sckw-common-core/pom.xml

@@ -174,5 +174,9 @@
             <groupId>com.squareup.okhttp3</groupId>
             <artifactId>okhttp</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents.client5</groupId>
+            <artifactId>httpclient5</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 49 - 30
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/BeanUtils.java

@@ -6,7 +6,9 @@ import java.beans.PropertyDescriptor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author zk
@@ -65,8 +67,9 @@ public class BeanUtils extends BeanUtil {
             return null;
         }
         int startIndex = 0;
-        if (fieldName.charAt(0) == UNDERLINE){
-            startIndex = 1;}
+        if (fieldName.charAt(0) == UNDERLINE) {
+            startIndex = 1;
+        }
         return "get"
                 + fieldName.substring(startIndex, startIndex + 1).toUpperCase()
                 + fieldName.substring(startIndex + 1);
@@ -98,41 +101,41 @@ public class BeanUtils extends BeanUtil {
      * @return: boolean 有则反之true 反之false
      *
     public static boolean isProperty(Object bean, String propertyName){
-        if (bean == null) {
-            return false;
-        }
-        Class<?> cls = bean.getClass();
-        PropertyDescriptor[] propertys = org.springframework.beans.BeanUtils.getPropertyDescriptors(cls);
-        for (PropertyDescriptor property : propertys){
-            String fieldName = property.getName();
-            if(fieldName != null && propertyName != null && fieldName.equals(propertyName)){
-                return true;
-            }
-        }
-        return false;
+    if (bean == null) {
+    return false;
+    }
+    Class<?> cls = bean.getClass();
+    PropertyDescriptor[] propertys = org.springframework.beans.BeanUtils.getPropertyDescriptors(cls);
+    for (PropertyDescriptor property : propertys){
+    String fieldName = property.getName();
+    if(fieldName != null && propertyName != null && fieldName.equals(propertyName)){
+    return true;
+    }
+    }
+    return false;
     }*/
 
 
     /**
+     * @param object
+     * @return boolean
      * @description 判断当前对象是否为空
      * @author jiangwei
      * @date 2020/9/18 14:40
-     * @param object
-     * @return boolean
      **/
-    public static boolean objCheckIsNull(Object object){
-        return objCheckIsNull(object,null,null);
+    public static boolean objCheckIsNull(Object object) {
+        return objCheckIsNull(object, null, null);
     }
 
     /**
+     * @param object           入参对象
+     * @param excludeNameList  要剔除的属性名称,没有就传空集合或者null
+     * @param excludeValueList 要剔除的数值,没有就传空集合或者null
+     * @return boolean
      * @description 判断当前对象是否为空(包括所有属性为空)
      * 可选则在判断规则中剔除某一字段,或者某一值
      * @author jiangwei
      * @date 2020/5/22 10:14
-     * @param object 入参对象
-     * @param excludeNameList 要剔除的属性名称,没有就传空集合或者null
-     * @param excludeValueList 要剔除的数值,没有就传空集合或者null
-     * @return boolean
      **/
     public static boolean objCheckIsNull(Object object, List<String> excludeNameList, List<Object> excludeValueList) {
 
@@ -194,23 +197,22 @@ public class BeanUtils extends BeanUtil {
     }
 
     /**
-     *
-     * @Title: isProperty
-     * @Description: 判断对象是否存在某属性
-     * @param bean 对象
+     * @param bean         对象
      * @param propertyName 属性
      * @return
+     * @Title: isProperty
+     * @Description: 判断对象是否存在某属性
      * @return: boolean 有则反之true 反之false
-     * */
-    public static boolean isProperty(Object bean, String propertyName){
+     */
+    public static boolean isProperty(Object bean, String propertyName) {
         if (bean == null) {
             return false;
         }
         Class<?> cls = bean.getClass();
         PropertyDescriptor[] propertys = org.springframework.beans.BeanUtils.getPropertyDescriptors(cls);
-        for (PropertyDescriptor property : propertys){
+        for (PropertyDescriptor property : propertys) {
             String fieldName = property.getName();
-            if(fieldName != null && propertyName != null && fieldName.equals(propertyName)){
+            if (fieldName != null && propertyName != null && fieldName.equals(propertyName)) {
                 return true;
             }
         }
@@ -239,4 +241,21 @@ public class BeanUtils extends BeanUtil {
             }
         }
     }
+
+    public static Map<String, Object> convertToMap(Object yourObject) {
+        Map<String, Object> map = new HashMap<>();
+        try {
+            Field[] fields = yourObject.getClass().getDeclaredFields();
+            for (Field field : fields) {
+                field.setAccessible(true);
+                String fieldName = field.getName();
+                Object fieldValue = field.get(yourObject);
+                map.put(fieldName, fieldValue);
+            }
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+        return map;
+    }
+
 }

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

@@ -4,6 +4,16 @@ import com.alibaba.fastjson2.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.*;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.entity.mime.FileBody;
+import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.http.client.methods.HttpRequestBase;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.util.CollectionUtils;
 
@@ -11,13 +21,13 @@ import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSocketFactory;
 import javax.net.ssl.TrustManager;
 import javax.net.ssl.X509TrustManager;
+import java.io.File;
 import java.io.IOException;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.security.SecureRandom;
 import java.security.cert.X509Certificate;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
@@ -399,7 +409,88 @@ public class OkHttpUtils {
                 .postForm(tmp, file)
                 .sync();
         log.info("交易确认异步通知中台返回->{}", sync);
+    }
+
+    /**
+     * post请求提交form-data上传文件
+     * @param url
+     * @return
+     */
+    public static String doPostUploadFile(String url, Map<String, Object> param) {
+        HttpPost httpPost = new HttpPost(url);
+        CloseableHttpResponse response = null;
+
+        String respContent = null;
+
+        long startTime = System.currentTimeMillis();
+
+        // 设置请求头 boundary边界不可重复,重复会导致提交失败
+        String boundary = "-------------------------" + UUIDUtils.get32UUID();
+        httpPost.setHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
+
+        // 创建MultipartEntityBuilder
+        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
+        // 设置字符编码
+        builder.setCharset(StandardCharsets.UTF_8);
+        // 设置边界
+        builder.setBoundary(boundary);
+        for (String key : param.keySet()) {
+            Object value = param.get(key);
+            if (value instanceof File) {
+                File file = (File) value;
+                builder.addPart(key, new FileBody(file));
+                builder.addBinaryBody("media", file, ContentType.create("application/octet-stream"), file.getName());
+            } else {
+                builder.addTextBody(key, String.valueOf(value));
+            }
+        }
+        HttpEntity entity = builder.build();
+        httpPost.setEntity(entity);
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        try {
+            response = httpClient.execute(httpPost);
+            if (response != null) {
+                HttpEntity he = response.getEntity();
+                if (he != null) {
+                    respContent = EntityUtils.toString(he, "UTF-8");
+                }
+            } else {
+                log.error("对方响应的状态码不在符合的范围内!");
+                throw new RuntimeException();
+            }
+            return respContent;
+        } catch (Exception e) {
+            log.error("网络访问异常,请求url地址={},响应体={},error={}", url, response, e);
+            throw new RuntimeException();
+        } finally {
+            log.info("统一外网请求参数打印,post请求url地址={},响应={},耗时={}毫秒", url, respContent, (System.currentTimeMillis() - startTime));
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                if(null != httpClient){
+                    httpClient.close();
+                }
+            } catch (IOException e) {
+                log.error("请求链接释放异常", e);
+            }
+        }
+    }
 
 
+    /**
+     * 封装请求头
+     *
+     * @param paramsHeads
+     * @param httpMethod
+     */
+    private static void packageHeader(Map<String, String> paramsHeads, HttpRequestBase httpMethod) {
+        if (null!= paramsHeads && paramsHeads.size()>0) {
+            Set<Map.Entry<String, String>> entrySet = paramsHeads.entrySet();
+            for (Map.Entry<String, String> entry : entrySet) {
+                httpMethod.setHeader(entry.getKey(), entry.getValue());
+            }
+        }
     }
+
 }

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

@@ -1,5 +1,6 @@
 package com.sckw.core.utils;
 
+import java.math.BigDecimal;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -23,6 +24,7 @@ public class RegularUtils {
      * 非负浮点型(包括0)
      */
     public static final String DECIMAL_REG1 = "^\\d+(\\.\\d+)?$";
+
     /**
      * 数字和字母
      */
@@ -126,8 +128,22 @@ public class RegularUtils {
         return m.matches();
     }
 
+    /**
+     * @param str 数值 numLength 整数长度  fractionLenth小数长度
+     * @desc: 校验(限制固定长度)
+     * @author: czh
+     * @date: 2023/7/25
+     */
+    public static boolean matchNumberWithFix(String str, Integer numLength, Integer fractionLenth) {
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append("\\d{1,").append(numLength).append("}([\\.]\\d{0,").append(fractionLenth).append("})?");
+        Pattern p = Pattern.compile(stringBuilder.toString());
+        Matcher m = p.matcher(str);
+        return m.matches();
+    }
+
 
     public static void main(String[] args) {
-        System.out.println(matchs("(^\\d{12})", "123456789112"));
+        System.out.println(matchs("\\d{1,8}([\\.]\\d{0,2})?", new BigDecimal("99999999.00").toString()));
     }
 }

+ 2 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/constant/HttpStatus.java

@@ -171,5 +171,7 @@ public class HttpStatus {
     public static final String MSG_026 = "资质认证审核中,请等待审核后再提交!";
     public static final String MSG_027 = "一级机构不能删除!";
     public static final String MSG_028 = "合同未签约,不能手动完结!";
+    public static final String MSG_029 = "合同编号超长!";
+    public static final String MSG_030 = "合同名称超长!";
 
 }

+ 5 - 0
sckw-common/sckw-common-mongo/src/main/java/com/sckw/mongo/model/SckwTradeOrder.java

@@ -97,6 +97,11 @@ public class SckwTradeOrder {
      */
     private BigDecimal actualAmount;
 
+    /**
+     * 是否关联对账单:0未关联,1已关联
+     */
+    private Integer associateStatement;
+
     /**
      * 订单创建来源类型(1采购下单/2销售代客下单)
      */

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

@@ -24,9 +24,9 @@ public interface TradeOrderInfoService {
      * @author: yzc
      * @date: 2023-07-18 18:31
      * @Param param:
-     * @return: com.sckw.core.web.response.HttpResult
+     * @return: void
      */
-    HttpResult updateOrderStatus(UpdateOrderStatusParam param);
+    void updateOrderStatus(UpdateOrderStatusParam param);
 
     /**
      * @desc: 废弃
@@ -46,6 +46,7 @@ public interface TradeOrderInfoService {
      * @return: com.sckw.core.web.response.HttpResult
      */
     HttpResult createOrCancelLogisticsOrder(CreateOrCancelLogisticsOrderParam param);
+
     /**
      * @desc: 完结物流订单
      * @author: yzc
@@ -63,4 +64,13 @@ public interface TradeOrderInfoService {
      * @return: void
      */
     void contractSignCompleted(ContractSignCompletedParam param);
+
+    /**
+     * @desc: 更新订单是否关联对账单
+     * @author: yzc
+     * @date: 2023-08-09 14:24
+     * @Param param:
+     * @return: void
+     */
+    void updateAssociateStatement(UpdateAssociateStatementParam param);
 }

+ 5 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/OrderDetailRes.java

@@ -107,6 +107,11 @@ public class OrderDetailRes implements Serializable {
      */
     private BigDecimal actualAmount;
 
+    /**
+     * 是否关联对账单:0未关联,1已关联
+     */
+    private Integer associateStatement;
+
     /**
      * 订单创建来源类型(1采购下单/2销售代客下单)
      */

+ 42 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/UpdateAssociateStatementParam.java

@@ -0,0 +1,42 @@
+package com.sckw.order.api.model;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @desc: 更新订单是否关联对账单
+ * @author: yzc
+ * @date: 2023-08-09 14:34
+ */
+@Getter
+@Setter
+@ToString
+public class UpdateAssociateStatementParam implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 6909518527687999256L;
+
+    /**
+     * 订单id
+     */
+    private Long tOrderId;
+
+    /**
+     * 是否关联对账单:0未关联,1已关联
+     */
+    private Integer associateStatement;
+
+    /**
+     * 更新用户id 需传,订单状态变化记录需要
+     */
+    private Long updateBy;
+
+    /**
+     * 更新者姓名 需传,订单状态变化记录需要
+     */
+    private String updateByName;
+}

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

@@ -72,6 +72,10 @@
             <groupId>com.sckw</groupId>
             <artifactId>sckw-order-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+        </dependency>
 
     </dependencies>
     <build>

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

@@ -7,6 +7,7 @@ import com.sckw.core.model.enums.EntTypeEnum;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.response.HttpResult;
 import jakarta.validation.Valid;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;

+ 56 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/dto/req/EsignGetFlowReqDto.java

@@ -0,0 +1,56 @@
+package com.sckw.contract.model.dto.req;
+
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author czh
+ * @desc e签宝签署入参
+ * @date 2023/8/9
+ */
+@Data
+public class EsignGetFlowReqDto implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -2326873428898155564L;
+
+    /**
+     * 文件
+     */
+    private File file;
+
+    /**
+     * id
+     */
+    private String seqId;
+
+    /**
+     * 合同名
+     */
+    private String signFlowTitle;
+
+    /**
+     * 发起方企业名
+     */
+    private String orgFirstName;
+
+    /**
+     * 发起方签约电话
+     */
+    private String psnFirstAccount;
+
+    /**
+     * 对方企业名
+     */
+    private String orgSecondName;
+
+    /**
+     * 对方签约电话
+     */
+    private String psnSecondAccount;
+
+}

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

@@ -1,9 +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;
+import jakarta.validation.constraints.*;
 import lombok.Data;
 
 import java.io.Serial;
@@ -57,7 +54,7 @@ public class LogisticsGoodsInfoReqVo implements Serializable {
     /**
      * 合理损耗
      */
-    @DecimalMax(value = "10000000", message = "合理损耗超长")
+    @Digits(integer = 5, fraction = 2, message = "合理损耗超长")
     private BigDecimal loss;
 
     /**
@@ -68,7 +65,7 @@ public class LogisticsGoodsInfoReqVo implements Serializable {
     /**
      * 扣亏货值
      */
-    @DecimalMax(value = "100000", message = "扣亏货值超长")
+    @Digits(integer = 3, fraction = 2, message = "扣亏货值超长")
     private BigDecimal deficitPrice;
 
     /**

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

@@ -3,6 +3,7 @@ package com.sckw.contract.model.vo.req;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
@@ -55,12 +56,14 @@ public class TradeBaseInfoReqVo implements Serializable {
      * 合同编号
      */
     @NotBlank(message = "合同编号不能为空")
+    @Size(max = 20, message = "合同编号超长")
     private String contractCode;
 
     /**
      * 合同名称
      */
     @NotBlank(message = "合同名称不能为空")
+    @Size(max = 50, message = "合同编号超长")
     private String contractName;
 
     /**

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

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.vo.req;
 
+import jakarta.validation.constraints.Digits;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
@@ -27,11 +28,13 @@ public class TradeGoodsInfoReqVo implements Serializable {
     /**
      * 采购数量
      */
+    @Digits(integer = 10, fraction = 2, message = "采购数量超长")
     private BigDecimal amount;
 
     /**
      * 单价
      */
+    @Digits(integer = 10, fraction = 2, message = "单价超长")
     private BigDecimal price;
 
     /**

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

@@ -4,6 +4,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -97,4 +98,14 @@ public class TradeBaseInfoResVo implements Serializable {
      */
     private String trading;
 
+    /**
+     * 总量
+     */
+    private BigDecimal amount;
+
+    /**
+     * 已履约量
+     */
+    private BigDecimal performedAmount;
+
 }

+ 131 - 15
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractLogisticsService.java

@@ -1,17 +1,21 @@
 package com.sckw.contract.service;
 
+import java.io.*;
+import java.net.URL;
 import java.util.Date;
 
-import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.sckw.contract.dao.KwcContractLogisticsMapper;
 import com.sckw.contract.dubbo.RemoteContractServiceImpl;
+import com.sckw.contract.model.dto.req.EsignGetFlowReqDto;
 import com.sckw.contract.model.dto.req.QueryListReqDto;
 import com.sckw.contract.model.dto.res.QueryListResDto;
 import com.sckw.contract.model.entity.KwcContractLogistics;
@@ -81,6 +85,10 @@ public class KwcContractLogisticsService {
      */
     @Transactional(rollbackFor = {})
     public Long addCheckedContract(ContractLogisticsReqVo reqVo) {
+        LogisticsBaseInfoReqVo baseInfo = reqVo.getBaseInfo();
+        List<LogisticsGoodsInfoReqVo> goodsInfo = reqVo.getGoodsInfo();
+        //参数校验
+        checkParam(baseInfo, goodsInfo);
         Long id = reqVo.getId();
         //不为空时是修改
         if (Objects.nonNull(id)) {
@@ -88,8 +96,6 @@ public class KwcContractLogisticsService {
             return id;
         }
 
-        LogisticsBaseInfoReqVo baseInfo = reqVo.getBaseInfo();
-        List<LogisticsGoodsInfoReqVo> goodsInfo = reqVo.getGoodsInfo();
         //创建合同
         KwcContractLogistics kwcContractLogistics = getKwcContractLogistics(baseInfo, goodsInfo, reqVo.getRemark(), reqVo.getPid());
         long contactId = new IdWorker(1L).nextId();
@@ -108,6 +114,34 @@ public class KwcContractLogisticsService {
         return contactId;
     }
 
+    private void checkParam(LogisticsBaseInfoReqVo baseInfo, List<LogisticsGoodsInfoReqVo> goodsInfo) {
+        if(Objects.nonNull(baseInfo)) {
+            if(StringUtils.isNotBlank(baseInfo.getContractCode()) && baseInfo.getContractCode().length() > 20) {
+                throw new SystemException("合同编号超长!");
+            }
+
+            if(StringUtils.isNotBlank(baseInfo.getContractName()) && baseInfo.getContractName().length() > 20) {
+                throw new SystemException("合同名称超长!");
+            }
+        }
+
+        if (CollectionUtils.isNotEmpty(goodsInfo)) {
+            for (LogisticsGoodsInfoReqVo logisticsGoodsInfoReqVo : goodsInfo) {
+                if (StringUtils.isNotBlank(logisticsGoodsInfoReqVo.getGoodsName()) && logisticsGoodsInfoReqVo.getGoodsName().length() > 50) {
+                    throw new SystemException("商品名称超长!");
+                }
+
+                if(Objects.nonNull(logisticsGoodsInfoReqVo.getLoss()) && !RegularUtils.matchNumberWithFix(logisticsGoodsInfoReqVo.getLoss().toString(), 5, 2)) {
+                    throw new SystemException("合理损耗超长!");
+                }
+
+                if(Objects.nonNull(logisticsGoodsInfoReqVo.getDeficitPrice()) && !RegularUtils.matchNumberWithFix(logisticsGoodsInfoReqVo.getDeficitPrice().toString(), 5, 2)) {
+                    throw new SystemException("扣亏货值超长!");
+                }
+            }
+        }
+    }
+
     public KwcContractLogistics getKwcContractLogistics(LogisticsBaseInfoReqVo baseInfo, List<LogisticsGoodsInfoReqVo> goodsInfo, String remark, Long pid) {
         Date date = new Date();
         KwcContractLogistics kwcContractLogistics = new KwcContractLogistics();
@@ -121,12 +155,11 @@ public class KwcContractLogisticsService {
         kwcContractLogistics.setPerformedAmount(new BigDecimal("0"));
         kwcContractLogistics.setContractPid(pid);
         kwcContractLogistics.setRemark(remark);
+        kwcContractLogistics.setDelFlag(Global.NO);
         kwcContractLogistics.setCreateBy(LoginUserHolder.getUserId());
         kwcContractLogistics.setCreateTime(date);
         kwcContractLogistics.setUpdateBy(LoginUserHolder.getUserId());
         kwcContractLogistics.setUpdateTime(date);
-        kwcContractLogistics.setDelFlag(Global.NO);
-
         BigDecimal amountTotal = new BigDecimal(Global.NUMERICAL_ZERO);
         if (CollectionUtils.isNotEmpty(goodsInfo)) {
             for (LogisticsGoodsInfoReqVo logisticsGoodsInfoReqVo : goodsInfo) {
@@ -146,7 +179,7 @@ public class KwcContractLogisticsService {
      * @author: czh
      * @date: 2023/7/14
      */
-    public void supplement(ContractLogisticsReqVo reqVo) {
+    public void supplement(ContractLogisticsReqVo reqVo) throws SystemException {
         Long id = reqVo.getPid();
         KwcContractLogistics kwcContractLogistics = kwcContractLogisticsMapper.selectById(id);
         if (Objects.isNull(kwcContractLogistics)) {
@@ -306,7 +339,7 @@ public class KwcContractLogisticsService {
      * @date 2023/7/17
      */
     @Transactional(rollbackFor = {})
-    public Long submit(ContractLogisticsReqVo reqVo) {
+    public Long submit(ContractLogisticsReqVo reqVo) throws SystemException {
         Long id = reqVo.getId();
         //直接签约先存草稿再修改状态
         if (Objects.isNull(id)) {
@@ -316,9 +349,72 @@ public class KwcContractLogisticsService {
         }
         update(reqVo);
         changeToSubmit(id);
+
+        if (DictEnum.SIGNING_WAY_1.getValue().equals(String.valueOf(reqVo.getBaseInfo().getSigningWay()))) {
+            postToEsign(reqVo, id);
+        }
         return id;
     }
 
+    private void postToEsign(ContractLogisticsReqVo reqVo, Long id) {
+        EsignGetFlowReqDto esignGetFlowReqDto = new EsignGetFlowReqDto();
+        JSONArray jsonArray = JSONArray.parseArray(reqVo.getContractFile());
+        JSONObject jsonObject = jsonArray.getJSONObject(0);
+        String fileName = jsonObject.getString("name");
+        String url = jsonObject.getString("url");
+        File file = getFileByHttpURL(url, fileName);
+
+        Long carrierEntId = reqVo.getBaseInfo().getCarrierEntId();
+        Long checkedEntId = reqVo.getBaseInfo().getCheckedEntId();
+
+
+        esignGetFlowReqDto.setFile(file);
+        esignGetFlowReqDto.setSeqId(String.valueOf(id));
+        esignGetFlowReqDto.setSignFlowTitle(reqVo.getBaseInfo().getContractName());
+        esignGetFlowReqDto.setOrgFirstName("");
+        esignGetFlowReqDto.setPsnFirstAccount("");
+        esignGetFlowReqDto.setOrgSecondName("");
+        esignGetFlowReqDto.setPsnSecondAccount("");
+        Map<String, Object> map = BeanUtils.convertToMap(esignGetFlowReqDto);
+        String res = OkHttpUtils.doPostUploadFile("http://10.10.10.149:8840/v1/sign/getFlow", map);
+    }
+
+    public static File getFileByHttpURL(String newUrl, String fileName){
+        String[] suffix = newUrl.split("/");
+        //得到最后一个分隔符后的名字
+        File file = null;
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try{
+            file = File.createTempFile("", fileName);
+            URL urlFile = new URL(newUrl);
+            inputStream = urlFile.openStream();
+            outputStream = new FileOutputStream(file);
+
+            int bytesRead = 0;
+            byte[] buffer = new byte[8192];
+            while ((bytesRead=inputStream.read(buffer,0,8192))!=-1) {
+                outputStream.write(buffer, 0, bytesRead);
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        }finally {
+            try {
+                if (null != outputStream) {
+                    outputStream.close();
+                }
+                if (null != inputStream) {
+                    inputStream.close();
+                }
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return file;
+    }
+
+
     /**
      * @param id 合同id
      * @desc: 更新合同为发起
@@ -350,13 +446,33 @@ public class KwcContractLogisticsService {
             throw new SystemException(HttpStatus.QUERY_FAIL_CODE, HttpStatus.CONTRACT_NOT_EXISTS);
         }
 
-        KwcContractLogistics param = getKwcContractLogistics(reqVo.getBaseInfo(), reqVo.getGoodsInfo(), reqVo.getRemark(), reqVo.getPid());
-        param.setId(contractId);
-        param.setSigningUrl(reqVo.getContractFile());
-        param.setStatus(ContractStatusEnum.SAVE.getCode());
-        param.setUpdateBy(LoginUserHolder.getUserId());
-        param.setUpdateTime(date);
-        if (kwcContractLogisticsMapper.updateById(param) <= 0) {
+        LogisticsBaseInfoReqVo baseInfo = reqVo.getBaseInfo();
+        kwcContractLogistics.setEntId(LoginUserHolder.getEntId());
+        kwcContractLogistics.setContractNo(baseInfo.getContractCode());
+        kwcContractLogistics.setName(baseInfo.getContractName());
+        kwcContractLogistics.setSigningWay(baseInfo.getSigningWay());
+        kwcContractLogistics.setCharging(baseInfo.getCharging());
+        kwcContractLogistics.setStartTime(baseInfo.getStartTime());
+        kwcContractLogistics.setEndTime(baseInfo.getEndTime());
+        kwcContractLogistics.setPerformedAmount(new BigDecimal("0"));
+        kwcContractLogistics.setContractPid(reqVo.getPid());
+        kwcContractLogistics.setRemark(reqVo.getRemark());
+
+        List<LogisticsGoodsInfoReqVo> goodsInfo = reqVo.getGoodsInfo();
+        BigDecimal amountTotal = new BigDecimal(Global.NUMERICAL_ZERO);
+        if (CollectionUtils.isNotEmpty(goodsInfo)) {
+            for (LogisticsGoodsInfoReqVo logisticsGoodsInfoReqVo : goodsInfo) {
+                if (Objects.nonNull(logisticsGoodsInfoReqVo.getAmount())) {
+                    amountTotal = amountTotal.add(logisticsGoodsInfoReqVo.getAmount());
+                }
+            }
+        }
+        kwcContractLogistics.setAmount(amountTotal);
+        kwcContractLogistics.setSigningUrl(reqVo.getContractFile());
+        kwcContractLogistics.setStatus(ContractStatusEnum.SAVE.getCode());
+        kwcContractLogistics.setUpdateBy(LoginUserHolder.getUserId());
+        kwcContractLogistics.setUpdateTime(date);
+        if (kwcContractLogisticsMapper.updateById(kwcContractLogistics) <= 0) {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.UPDATE_FAIL);
         }
 
@@ -520,7 +636,7 @@ public class KwcContractLogisticsService {
         try {
             EasyExcelUtil.writeSingleExcel("物流合同.xlsx", "sheet1", queryListResVos, QueryListResVo.class);
         } catch (IOException e) {
-            log.error("导出失败:", e);
+//            log.error("导出失败:", e);
             throw new SystemException(HttpStatus.CODE_10301, HttpStatus.MSG_014);
         }
     }

+ 61 - 8
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractTradeService.java

@@ -140,6 +140,11 @@ public class KwcContractTradeService {
 
     @Transactional(rollbackFor = {})
     public Long addTradeContract(ContractTradeReqVo reqVo) {
+        TradeBaseInfoReqVo baseInfo = reqVo.getBaseInfo();
+        List<TradeGoodsInfoReqVo> goodsInfoList = reqVo.getGoodsInfo();
+        //校验
+        checkParam(baseInfo, goodsInfoList);
+
         Long id = reqVo.getId();
         //不为空时是修改
         if (Objects.nonNull(id)) {
@@ -147,8 +152,6 @@ public class KwcContractTradeService {
             return id;
         }
 
-        TradeBaseInfoReqVo baseInfo = reqVo.getBaseInfo();
-        List<TradeGoodsInfoReqVo> goodsInfoList = reqVo.getGoodsInfo();
         //创建合同
         KwcContractTrade kwcContractTrade = getKwcContractTrade(baseInfo, reqVo.getGoodsInfo(), reqVo.getRemark(), reqVo.getPid());
         long contactId = new IdWorker(1L).nextId();
@@ -167,6 +170,32 @@ public class KwcContractTradeService {
         return contactId;
     }
 
+
+    private void checkParam(TradeBaseInfoReqVo baseInfo, List<TradeGoodsInfoReqVo> goodsInfo) {
+        if(Objects.nonNull(baseInfo)) {
+            if(StringUtils.isNotBlank(baseInfo.getContractCode()) && baseInfo.getContractCode().length() > 20) {
+                throw new SystemException("合同编号超长!");
+            }
+
+            if(StringUtils.isNotBlank(baseInfo.getContractName()) && baseInfo.getContractName().length() > 20) {
+                throw new SystemException("合同名称超长!");
+            }
+        }
+
+        if (CollectionUtils.isNotEmpty(goodsInfo)) {
+            for (TradeGoodsInfoReqVo goodsInfoReqVo : goodsInfo) {
+                if(Objects.nonNull(goodsInfoReqVo.getPrice()) && !RegularUtils.matchNumberWithFix(goodsInfoReqVo.getPrice().toString(), 10, 2)) {
+                    throw new SystemException("单价超长!");
+                }
+
+                if(Objects.nonNull(goodsInfoReqVo.getAmount()) && !RegularUtils.matchNumberWithFix(goodsInfoReqVo.getAmount().toString(), 10, 2)) {
+                    throw new SystemException("采购数量超长!");
+                }
+            }
+        }
+    }
+
+
     /**
      * @param baseInfo 贸易基本信息 remark备注  pid父id
      * @return KwcContractTrade
@@ -259,6 +288,8 @@ public class KwcContractTradeService {
         tradeBaseInfoResVo.setStartTime(kwcContractTrade.getStartTime());
         tradeBaseInfoResVo.setTradingName(DictEnum.getLabel(DictTypeEnum.TRADE_TYPE.getType(), String.valueOf(kwcContractTrade.getTrading())));
         tradeBaseInfoResVo.setTrading(StringUtils.objectStr(kwcContractTrade.getTrading()));
+        tradeBaseInfoResVo.setAmount(kwcContractTrade.getAmount());
+        tradeBaseInfoResVo.setPerformedAmount(kwcContractTrade.getPerformedAmount());
 
         ContractTradeDetailResVo contractTradeDetailResVo = new ContractTradeDetailResVo();
         contractTradeDetailResVo.setStatus(kwcContractTrade.getStatus());
@@ -402,12 +433,34 @@ public class KwcContractTradeService {
             throw new SystemException(HttpStatus.QUERY_FAIL_CODE, HttpStatus.CONTRACT_NOT_EXISTS);
         }
         KwcContractTrade param = getKwcContractTrade(reqVo.getBaseInfo(), reqVo.getGoodsInfo(), reqVo.getRemark(), reqVo.getPid());
-        param.setId(contractId);
-        param.setSigningUrl(reqVo.getContractFile());
-        param.setStatus(ContractStatusEnum.SAVE.getCode());
-        param.setUpdateBy(LoginUserHolder.getUserId());
-        param.setUpdateTime(date);
-        if (kwcContractTradeMapper.updateById(param) <= 0) {
+
+        TradeBaseInfoReqVo baseInfo = reqVo.getBaseInfo();
+        kwcContractTrade.setEntId(LoginUserHolder.getEntId());
+        kwcContractTrade.setContractNo(baseInfo.getContractCode());
+        kwcContractTrade.setName(baseInfo.getContractName());
+        kwcContractTrade.setSigningWay(baseInfo.getSigningWay());
+        kwcContractTrade.setTrading(baseInfo.getTrading());
+        kwcContractTrade.setStartTime(baseInfo.getStartTime());
+        kwcContractTrade.setEndTime(baseInfo.getEndTime());
+        kwcContractTrade.setPerformedAmount(new BigDecimal("0"));
+        kwcContractTrade.setContractPid(reqVo.getPid());
+        kwcContractTrade.setRemark(reqVo.getRemark());
+
+        List<TradeGoodsInfoReqVo> goodsInfo = reqVo.getGoodsInfo();
+        BigDecimal amountTotal = new BigDecimal(Global.NUMERICAL_ZERO);
+        if (CollectionUtils.isNotEmpty(goodsInfo)) {
+            for (TradeGoodsInfoReqVo tradeGoodsInfoReqVo : goodsInfo) {
+                if (Objects.nonNull(tradeGoodsInfoReqVo.getAmount())) {
+                    amountTotal = amountTotal.add(tradeGoodsInfoReqVo.getAmount());
+                }
+            }
+        }
+        kwcContractTrade.setAmount(amountTotal);
+        kwcContractTrade.setSigningUrl(reqVo.getContractFile());
+        kwcContractTrade.setStatus(ContractStatusEnum.SAVE.getCode());
+        kwcContractTrade.setUpdateBy(LoginUserHolder.getUserId());
+        kwcContractTrade.setUpdateTime(date);
+        if (kwcContractTradeMapper.updateById(kwcContractTrade) <= 0) {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.UPDATE_FAIL);
         }
 

+ 5 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/model/dto/req/CooperateManageQueryReqDto.java

@@ -43,6 +43,11 @@ public class CooperateManageQueryReqDto {
      */
     private Long currentEntId;
 
+    /**
+     * 当前企业id包括下面的主体单位id
+     */
+    private List<Long> currentEntIdList;
+
     /**
      * 申请状态
      */

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

@@ -142,8 +142,6 @@ public class CommonBusinessService {
      * @date: 2023/7/10
      */
     public List<CooperateManageQueryResVo> findList(CooperateManageQueryReqDto reqDto) {
-        Long entId = LoginUserHolder.getEntId();
-        reqDto.setCurrentEntId(entId);
         List<CooperateManageQueryResDto> list = kwmCooperateMapper.findList(reqDto);
         if (CollectionUtils.isEmpty(list)) {
             return Collections.emptyList();

+ 15 - 0
sckw-modules/sckw-manage/src/main/java/com/sckw/manage/service/KwmCooperateApplyService.java

@@ -31,6 +31,7 @@ import com.sckw.manage.model.vo.req.InitiateReqVo;
 import com.sckw.manage.model.vo.res.CooperateManageQueryResVo;
 import com.sckw.manage.model.vo.res.FindListGroupResVo;
 import com.sckw.system.api.RemoteSystemService;
+import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -112,6 +113,20 @@ public class KwmCooperateApplyService {
             status.add(CooperateStatusEnum.CANCEL.getCode());
         }
         cooperateManageQueryReqDto.setStatus(status);
+
+
+        Long entId = LoginUserHolder.getEntId();
+        List<Long> currentEntIdList = new ArrayList<>();
+        currentEntIdList.add(entId);
+        Map<Long, List<EntCacheResDto>> longListMap = remoteSystemService.queryEntDeptCacheByIds(Collections.singletonList(entId));
+        if (!longListMap.isEmpty()) {
+            List<EntCacheResDto> entCacheResDtos = longListMap.get(entId);
+            if (CollectionUtils.isNotEmpty(entCacheResDtos)) {
+                currentEntIdList.addAll(entCacheResDtos.stream().map(EntCacheResDto::getId).toList());
+            }
+        }
+        cooperateManageQueryReqDto.setCurrentEntIdList(currentEntIdList);
+
         return cooperateManageQueryReqDto;
     }
 

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

@@ -77,8 +77,6 @@ public class KwmCooperateManageService {
 
 
     private List<CooperateManageQueryResVo> findList(CooperateManageQueryReqDto reqDto) {
-        Long entId = LoginUserHolder.getEntId();
-        reqDto.setCurrentEntId(entId);
         List<CooperateManageQueryResDto> list = kwmCooperateMapper.findManageList(reqDto);
         if (CollectionUtils.isEmpty(list)) {
             return Collections.emptyList();
@@ -118,11 +116,24 @@ public class KwmCooperateManageService {
         }
         cooperateManageQueryReqDto.setStatus(status);
 
-
         List<Long> ids = reqVo.getIds();
         if (!CollectionUtils.isEmpty(ids)) {
             cooperateManageQueryReqDto.setIds(ids);
         }
+
+
+        Long entId = LoginUserHolder.getEntId();
+        List<Long> currentEntIdList = new ArrayList<>();
+        currentEntIdList.add(entId);
+        Map<Long, List<EntCacheResDto>> longListMap = remoteSystemService.queryEntDeptCacheByIds(Collections.singletonList(entId));
+        if (!longListMap.isEmpty()) {
+            List<EntCacheResDto> entCacheResDtos = longListMap.get(entId);
+            if (CollectionUtils.isNotEmpty(entCacheResDtos)) {
+                currentEntIdList.addAll(entCacheResDtos.stream().map(EntCacheResDto::getId).toList());
+            }
+        }
+        cooperateManageQueryReqDto.setCurrentEntIdList(currentEntIdList);
+
         return cooperateManageQueryReqDto;
     }
 
@@ -289,6 +300,7 @@ public class KwmCooperateManageService {
         LambdaQueryWrapper<KwmCooperateType> kwmCooperateTypeLambdaQueryWrapper = new LambdaQueryWrapper<>();
         kwmCooperateTypeLambdaQueryWrapper.in(KwmCooperateType::getCooperateId, kwmCooperates.stream().map(KwmCooperate::getId).toList());
         kwmCooperateTypeLambdaQueryWrapper.eq(KwmCooperateType::getDelFlag, Global.NO);
+        kwmCooperateTypeLambdaQueryWrapper.eq(KwmCooperateType::getStatus, CooperateStatusEnum.OK.getCode());
         kwmCooperateTypeLambdaQueryWrapper.eq(KwmCooperateType::getType, cooperateType);
         List<KwmCooperateType> kwmCooperateTypes = kwmCooperateTypeMapper.selectList(kwmCooperateTypeLambdaQueryWrapper);
         if (CollectionUtils.isEmpty(kwmCooperateTypes)) {

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

@@ -53,7 +53,15 @@
           FROM kwm_cooperate a
           LEFT JOIN kwm_cooperate_type b ON a.id = b.cooperate_id
          WHERE a.del_flag = 0
-           and (a.invitee_ent_id = #{reqDto.currentEntId} OR a.inviter_ent_id = #{reqDto.currentEntId})
+           and (a.invitee_ent_id in
+                <foreach collection="reqDto.currentEntIdList" item="item" open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+                OR a.inviter_ent_id in
+                <foreach collection="reqDto.currentEntIdList" item="item" open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+               )
            <if test="reqDto.startTime != null">
                and b.create_time >= #{reqDto.startTime}
            </if>
@@ -70,7 +78,7 @@
                and exists (select 1
                              from kwm_cooperate_type c
                             where c.cooperate_id = a.id
-                               and c.status = 1
+                               and c.status = b.status
                                and c.del_flag = 0
                               and c.type in
                             <foreach collection="reqDto.cooperateTypes" item="item" open="(" close=")" separator=",">
@@ -134,7 +142,15 @@
         FROM kwm_cooperate a
         LEFT JOIN kwm_cooperate_type b ON a.id = b.cooperate_id and b.status = 1 and b.del_flag = 0
         WHERE a.del_flag = 0
-        and (a.invitee_ent_id = #{reqDto.currentEntId} OR a.inviter_ent_id = #{reqDto.currentEntId})
+        and (a.invitee_ent_id in
+            <foreach collection="reqDto.currentEntIdList" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+            OR a.inviter_ent_id in
+            <foreach collection="reqDto.currentEntIdList" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+            )
         <if test="reqDto.startTime != null">
             and b.create_time >= #{reqDto.startTime}
         </if>

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

@@ -87,6 +87,10 @@
             <artifactId>sckw-payment-api</artifactId>
             <version>1.0.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-transport-api</artifactId>
+        </dependency>
 
     </dependencies>
 

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

@@ -57,27 +57,27 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResult updateOrderStatus(UpdateOrderStatusParam param) {
+    public void updateOrderStatus(UpdateOrderStatusParam param) {
         log.info("更新订单状态入参:{}", JSON.toJSONString(param));
         if (Objects.isNull(param.getUpdateBy()) || StringUtils.isBlank(param.getUpdateByName())) {
-            return HttpResult.error("操作人信息不能为空!");
+            throw new BusinessException("操作人信息不能为空!");
         }
         KwoTradeOrder order = kwoTradeOrderService.getById(param.getTOrderId());
         if (Objects.isNull(order)) {
-            return HttpResult.error("订单不存在!");
+            throw new BusinessException("订单不存在!");
         }
         Integer status = param.getStatus();
         Long updateBy = param.getUpdateBy();
         if (Objects.equals(String.valueOf(status), DictEnum.TORDER_STATUS_6.getValue())) {
             if (!Objects.equals(String.valueOf(status), DictEnum.TORDER_STATUS_5.getValue())) {
-                return HttpResult.error("已完结的订单才可对账!");
+                throw new BusinessException("已完结的订单才可对账!");
             }
         } else if (Objects.equals(String.valueOf(status), DictEnum.TORDER_STATUS_7.getValue())) {
             if (!Objects.equals(String.valueOf(status), DictEnum.TORDER_STATUS_6.getValue())) {
-                return HttpResult.error("已对账的订单才可结算!");
+                throw new BusinessException("已对账的订单才可结算!");
             }
         } else {
-            return HttpResult.error("非法订单状态操作!");
+            throw new BusinessException("非法订单状态操作!");
         }
         order.setStatus(status).setUpdateBy(updateBy);
         kwoTradeOrderService.updateById(order);
@@ -91,7 +91,6 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
         updateParam.setTOrderId(order.getId()).setStatus(order.getStatus()).setUpdateBy(param.getUpdateBy())
                 .setUpdateByName(param.getUpdateByName()).setUpdateTime(new Date());
         saveMongoDb(updateParam);
-        return HttpResult.ok();
     }
 
     @Override
@@ -242,6 +241,36 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
         }
     }
 
+    @Override
+    public void updateAssociateStatement(UpdateAssociateStatementParam param) {
+        log.info("更新订单是否关联对账单入参:{}", JSON.toJSONString(param));
+        Long tOrderId = param.getTOrderId();
+        Integer associateStatement = param.getAssociateStatement();
+        Long updateBy = param.getUpdateBy();
+        String updateByName = param.getUpdateByName();
+        if (Objects.isNull(updateBy) || StringUtils.isBlank(updateByName)) {
+            throw new BusinessException("操作人信息不能为空!");
+        }
+        if (Objects.isNull(tOrderId) || Objects.isNull(associateStatement)) {
+            throw new BusinessException("更新订单是否关联对账单参数缺失!");
+        }
+        KwoTradeOrder order = kwoTradeOrderService.getById(tOrderId);
+        if (Objects.isNull(order)) {
+            throw new BusinessException("订单不存在!");
+        }
+        if (!Objects.equals(String.valueOf(order.getStatus()), DictEnum.TORDER_STATUS_5.getValue())) {
+            throw new BusinessException("已完结的订单才可对账!");
+        }
+        order.setAssociateStatement(associateStatement).setUpdateBy(updateBy).setUpdateTime(new Date());
+        kwoTradeOrderService.updateById(order);
+        //更新mongodb
+        SckwTradeOrder updateParam = new SckwTradeOrder();
+        updateParam.setTOrderId(order.getId()).setAssociateStatement(associateStatement).setUpdateBy(updateBy)
+                .setUpdateByName(updateByName).setUpdateTime(new Date());
+        saveMongoDb(updateParam);
+
+    }
+
     /**
      * @desc: mq保存mongodb
      * @author: yzc

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

@@ -84,6 +84,11 @@ public class KwoTradeOrder extends BaseModel implements Serializable {
      */
     private BigDecimal actualAmount;
 
+    /**
+     * 是否关联对账单:0未关联,1已关联
+     */
+    private Integer associateStatement;
+
     /**
      * 订单创建来源类型(1采购下单/2销售代客下单)
      */

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

@@ -108,6 +108,11 @@ public class OrderDetailRes implements Serializable {
      */
     private BigDecimal actualAmount;
 
+    /**
+     * 是否关联对账单:0未关联,1已关联
+     */
+    private Integer associateStatement;
+
     /**
      * 订单创建来源类型(采购下单/销售代客下单)
      */

+ 8 - 1
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -36,6 +36,7 @@ import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.AreaTreeFrontResDto;
 import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
+import com.sckw.transport.api.dubbo.TransportDubboService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -69,6 +70,9 @@ public class KwoTradeOrderService {
     @DubboReference(version = "2.0.0", group = "design", check = false)
     private PayCenterDubboService payCenterDubboService;
 
+    @DubboReference(version = "2.0.0", group = "design", check = false)
+    private TransportDubboService transportDubboService;
+
     private final KwoTradeOrderMapper kwoTradeOrderMapper;
     private final StreamBridge streamBridge;
     private final KwoTradeOrderAddressService kwoTradeOrderAddressService;
@@ -110,7 +114,7 @@ public class KwoTradeOrderService {
         String tOrderNo = tradeOrder.getTOrderNo();
         SckwTradeOrder order = new SckwTradeOrder();
         order.setFirmName(LoginUserHolder.getEntName()).setTOrderId(id).setCreateByName(LoginUserHolder.getUserName())
-                .setUpdateByName(LoginUserHolder.getUserName());
+                .setUpdateByName(LoginUserHolder.getUserName()).setAssociateStatement(0);
         BeanUtils.copyProperties(tradeOrder, order);
         //商品信息
         kwoTradeOrderGoodsService.delByOrderId(id);
@@ -764,6 +768,9 @@ public class KwoTradeOrderService {
         if (kwoTradeOrderUnitService.entMatch(param.getId(), LoginUserHolder.getEntId(), DictEnum.TORDER_UNIT_TYPE_2.getValue())) {
             throw new BusinessException("无订单操作权限!");
         }
+        if (transportDubboService.checkLogisticsOrderByTradeOrderId(param.getId())){
+            throw new BusinessException("订单存在未完成的物流托运,不可完结!");
+        }
         String lockKey = String.format(RedisConstant.TORDER_UPDATE_AMOUNT_KEY, param.getId());
         if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 5L, 10L))) {
             throw new BusinessException("业务繁忙,请稍后再试!");

+ 15 - 7
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwOrderService.java

@@ -120,9 +120,8 @@ public class KwOrderService {
         Long userId = LoginUserHolder.getUserId();
         Query query = new Query();
         Criteria criteria = new Criteria();
-        criteria.and("delFlag").is(0);
         String topEnt = Objects.equals(params.getOrderType(), 1) ? "procureTopEntId" : "supplyTopEntId";
-        criteria.and(topEnt).is(entId);
+        criteria.and(topEnt).is(entId).and("delFlag").is(0);
         //日期范围
         if (Objects.nonNull(params.getStartCreateTime()) && Objects.nonNull(params.getEndCreateTime())) {
             criteria.and("createTime").gte(params.getStartCreateTime()).lte(DateUtil.offsetDay(params.getEndCreateTime(), 1));
@@ -168,6 +167,7 @@ public class KwOrderService {
         if (StringUtils.isNotBlank(params.getSource())) {
             criteria.and("source").is(params.getSource());
         }
+        List<Criteria> orOperators = new ArrayList<>();
         //订单状态
         if (Objects.nonNull(params.getStatus()) && !isStatistic) {
             criteria.and("status").is(params.getStatus());
@@ -177,15 +177,22 @@ public class KwOrderService {
             }
         } else {
             //非草稿状态or草稿状态且是当前人且一级企业匹配
-            criteria.orOperator(Criteria.where("status").ne(0),
-                    Criteria.where("status").is(0).and("createBy").is(userId));
-
+            Criteria orOperator = new Criteria().orOperator(
+                    Criteria.where("status").ne(0),
+                    new Criteria().andOperator(Criteria.where("status").is(0),
+                            Criteria.where("createBy").is(userId)));
+            orOperators.add(orOperator);
         }
         //关键字模糊匹配
         if (StringUtils.isNotBlank(params.getKeywords())) {
             Pattern pattern = Pattern.compile("^.*" + params.getKeywords() + ".*$", Pattern.CASE_INSENSITIVE);
-            criteria.orOperator(Criteria.where("tOrderNo").regex(pattern), Criteria.where("procureFirmName").regex(pattern),
+            Criteria orOperator = new Criteria().orOperator(
+                    Criteria.where("tOrderNo").regex(pattern), Criteria.where("procureFirmName").regex(pattern),
                     Criteria.where("supplyFirmName").regex(pattern), Criteria.where("goodsName").regex(pattern));
+            orOperators.add(orOperator);
+        }
+        if (CollectionUtils.isNotEmpty(orOperators)) {
+            criteria.andOperator(orOperators);
         }
         return query.addCriteria(criteria);
     }
@@ -281,7 +288,8 @@ public class KwOrderService {
         Long entId = LoginUserHolder.getEntId();
         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);
+        criteria.and(topEnt).is(entId).and("status").is(Integer.valueOf(DictEnum.TORDER_STATUS_5.getValue()))
+                .and("associateStatement").ne(1).and("delFlag").is(0);
         //排除订单ids
         if (StringUtils.isNotBlank(params.getExcludeIds())) {
             List<Long> ids = StringUtils.splitStrToList(params.getExcludeIds(), ",", Long.class);

+ 2 - 1
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwTransportService.java

@@ -365,6 +365,7 @@ public class KwTransportService {
             vo.setTruckNo(waybillOrder.getTruckNo());
             vo.setDriverName(waybillOrder.getDriverName() == null ?
                     null : String.valueOf(waybillOrder.getDriverName()));
+            vo.setType(String.valueOf(waybillOrder.getType()));
             String typeString = "";
             if (waybillOrder.getType().equals(NumberConstant.ONE)) {
                 typeString = "趟次";
@@ -372,7 +373,7 @@ public class KwTransportService {
             if (waybillOrder.getType().equals(NumberConstant.TWO)) {
                 typeString = "循环";
             }
-            vo.setType(typeString);
+            vo.setTypeLabel(typeString);
             if(status.equals(String.valueOf(NumberConstant.ONE_ZERO_ZERO))) {
                 vo.setStatus(String.valueOf(NumberConstant.ONE_ZERO_ZERO));
             } else {

+ 6 - 1
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/vo/CarWaybillVo.java

@@ -42,10 +42,15 @@ public class CarWaybillVo implements Serializable {
     private String driverName;
 
     /**
-     * 运单类型
+     * 运单类型数字
      */
     private String type;
 
+    /**
+     * 运单类型字符
+     */
+    private String typeLabel;
+
     /**
      * 运单状态
      */

+ 25 - 10
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java

@@ -183,7 +183,7 @@ public class KwsEnterpriseService {
             BeanUtils.copyProperties(item, entFindPageResVo);
             entFindPageResVo.setApprovalTime(item.getApprovalTime());
             entFindPageResVo.setEntTypes(item.getType());
-            entFindPageResVo.setEntryType(item.getSystemType() == SystemTypeEnum.MANAGE.getCode() ? EntryTypeEnum.PLATFORM.getCode() : EntryTypeEnum.SELF.getCode());
+            entFindPageResVo.setEntryType(item.getSystemType().equals(SystemTypeEnum.MANAGE.getCode()) ? EntryTypeEnum.PLATFORM.getCode() : EntryTypeEnum.SELF.getCode());
             entFindPageResVo.setEntryTypeStr(EntryTypeEnum.getName(entFindPageResVo.getEntryType()).getName());
             result.add(entFindPageResVo);
         }
@@ -507,19 +507,34 @@ public class KwsEnterpriseService {
 
         checkAddEntSettleParam(reqVo);
 
-        /*1、存用户信息*/
-        RegisterReqDto registerReqDto = new RegisterReqDto();
-        registerReqDto.setEntName(reqVo.getFirmName());
-        registerReqDto.setName(reqVo.getContacts());
-        registerReqDto.setPhone(reqVo.getPhone());
-        registerReqDto.setIsMain(Global.YES);
-        registerReqDto.setSystemType(SystemTypeEnum.COMPANY.getCode());
-        RegisterResDto register = kwsUserService.register(registerReqDto);
+//        /*1、存用户信息*/
+//        RegisterReqDto registerReqDto = new RegisterReqDto();
+//        registerReqDto.setEntName(reqVo.getFirmName());
+//        registerReqDto.setName(reqVo.getContacts());
+//        registerReqDto.setPhone(reqVo.getPhone());
+//        registerReqDto.setIsMain(Global.YES);
+//        registerReqDto.setSystemType(SystemTypeEnum.COMPANY.getCode());
+//        RegisterResDto register = kwsUserService.register(registerReqDto);
+
+        KwsEnterprise kwsEnterprise = new KwsEnterprise();
+        long entId = new IdWorker(1L).nextId();
+        kwsEnterprise.setId(entId);
+        kwsEnterprise.setCode("");
+        kwsEnterprise.setFirmName(reqVo.getFirmName());
+        kwsEnterprise.setApproval(ApprovalEnum.NO.getCode());
+        kwsEnterprise.setContacts(reqVo.getContacts());
+        kwsEnterprise.setPhone(reqVo.getPhone());
+        kwsEnterprise.setCreateBy(LoginUserHolder.getUserId());
+        kwsEnterprise.setUpdateBy(LoginUserHolder.getUserId());
+        if (kwsEnterpriseDao.insert(kwsEnterprise) <= 0) {
+            throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);
+        }
+
 
         /*2、认证*/
         EntRegisterReqVo entRegisterReqVo = new EntRegisterReqVo();
         BeanUtils.copyProperties(reqVo, entRegisterReqVo);
-        entRegisterReqVo.setEntId(register.getEntId());
+        entRegisterReqVo.setEntId(entId);
         register(entRegisterReqVo);
 
 

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

@@ -156,11 +156,11 @@ public class KwsUserService {
             kwsEnterprise.setCreateBy(createBy);
             kwsEnterprise.setUpdateBy(createBy);
 
-            registerResDto.setEntId(entId);
             if (kwsEnterpriseDao.insert(kwsEnterprise) <= 0) {
                 throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);
             }
 
+            registerResDto.setEntId(entId);
             /*1、新增管理员机构*/
             KwsDept kwsDept = new KwsDept();
             Integer systemType = SystemTypeEnum.COMPANY.getCode();

+ 2 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/AcceptCarriageOrderController.java

@@ -222,8 +222,9 @@ public class AcceptCarriageOrderController {
      * @param ids 车辆运单id
      * @return
      */
-    @RequestMapping(value = "/cancelDelivery", method = RequestMethod.POST)
+    @RequestMapping(value = "/cancelDelivery", method = RequestMethod.GET)
     public HttpResult cancelDelivery(@NotBlank(message = "车辆运单id不能为空") @RequestParam("ids") String ids) {
+        log.info("承运订单-取消派车(撤回派车)/单趟撤回请求参数:{}",ids);
         List<String> lists = StringUtils.splitStrToList(ids, ",", String.class);
         try {
             return acceptCarriageOrderService.cancelDelivery(lists);

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

@@ -174,7 +174,7 @@ public class LogisticsConsignmentController {
      */
     @RequestMapping(value = "/sellLogisticsConsignment", method = RequestMethod.POST)
     public HttpResult sellLogisticsConsignment(@Valid @RequestBody LogisticsConsignmentParam logisticsConsignmentParam) {
-        log.info("销售订单传递参数信息:{}", JSONObject.toJSONString(logisticsConsignmentParam));
+        log.info("销售订单-物流托运生成托运订单 传递参数信息:{}", JSONObject.toJSONString(logisticsConsignmentParam));
         try {
             return logisticsConsignmentService.sellLogisticsConsignment(logisticsConsignmentParam);
         } catch (Exception e) {

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

@@ -13,6 +13,7 @@ import com.sckw.transport.model.vo.SubcontractConsignmentVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -150,4 +151,11 @@ public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {
      * @return
      */
     int selectMaxLevel(@Param("id") String id);
+
+    /**
+     * 根据贸易订单id统计委派量-实际装货量-实际卸货量
+     * @param tOrderId
+     * @return
+     */
+    Map<String, BigDecimal> countAmountByTradeOrderId(@Param("tOrderId") Long tOrderId);
 }

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

@@ -126,7 +126,7 @@ public class AddOrderDTO {
     /**
      * 合理损耗
      */
-    @Digits(integer = 10, fraction = 2, message = "合理损耗格式错误")
+    @Digits(integer = 7, fraction = 2, message = "合理损耗格式错误")
     @DecimalMin(value = "0.00", message = "合理损耗最小值为{value}")
     private BigDecimal loss;
 
@@ -139,7 +139,7 @@ public class AddOrderDTO {
     /**
      * 商品价值(扣亏货值)
      */
-    @Digits(integer = 10, fraction = 2, message = "扣亏货值格式错误")
+    @Digits(integer = 5, fraction = 2, message = "扣亏货值格式错误")
     @DecimalMin(value = "0.00", message = "扣亏货值最小值为{value}")
     private BigDecimal goodsPrice;
     /**

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/OperateSendCarDto.java

@@ -11,7 +11,7 @@ import java.util.Date;
 
 /**
  * @author zk
- * @desc 确认/绝接单
+ * @desc 确认/绝接单
  * @date 2023/7/25 0025
  */
 @Data

+ 7 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/SubcontractConsignmentDTO.java

@@ -2,12 +2,14 @@ package com.sckw.transport.model.dto;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.Digits;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import org.hibernate.validator.constraints.Length;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 
@@ -58,7 +60,8 @@ public class SubcontractConsignmentDTO /**implements IdsList*/ {
      * 合理损耗
      */
 //    @NotNull(message = "合理损耗不能为空")
-    private Long loss;
+    @Digits(integer = 5, fraction = 2,message = "合理损耗格式填写错误")
+    private BigDecimal loss;
     /**
      * 合理损耗单位
      */
@@ -175,7 +178,7 @@ public class SubcontractConsignmentDTO /**implements IdsList*/ {
      * 计划卸货时间
      */
     @NotNull(message = "计划卸货时间不能为空")
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date receiveGoodsDateTime;
 
@@ -183,7 +186,7 @@ public class SubcontractConsignmentDTO /**implements IdsList*/ {
      * 计划发货时间
      */
     @NotNull(message = "计划发货时间不能为空")
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date shipmentsDateTime;
 
@@ -195,7 +198,7 @@ public class SubcontractConsignmentDTO /**implements IdsList*/ {
     /**
      * 备注
      */
-    @Length(max = 200,message = "单据编号长度错误最大长度:{max}")
+    @Length(max = 200, message = "单据编号长度错误最大长度:{max}")
     private String remark;
     /**
      * 计费方式

+ 43 - 14
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/AcceptCarriageOrderService.java

@@ -124,11 +124,17 @@ public class AcceptCarriageOrderService {
      */
     @Transactional(rollbackFor = Exception.class)
     public HttpResult subcontractConsignment(SubcontractConsignmentDTO bo) {
+        HttpResult httpResult = ValidUtil.serviceValid(bo);
+        if (!String.valueOf(HttpStatus.SUCCESS_CODE).equals(String.valueOf(httpResult.getCode()))) {
+            httpResult.setMsg(httpResult.getMsg());
+            httpResult.setCode(HttpStatus.GLOBAL_EXCEPTION_CODE);
+            return httpResult;
+        }
         KwtLogisticsOrder logisticsOrder = logisticsOrderMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrder>()
                 .eq(KwtLogisticsOrder::getId, bo.getLOrderId()));
         if (logisticsOrder == null) {
             log.error("订单id查找失败:{},订单编号:{}", bo.getLOrderId(), bo.getLOrderNo());
-            throw new RuntimeException("单据错误,数据不存在");
+            throw new BusinessException("单据错误,数据不存在");
         }
         //todo  校验当前登录角色是否具有4P物流角色
         EntCacheResDto entCacheResDto = remoteSystemService.queryEntCacheById(LoginUserHolder.getEntId());
@@ -268,7 +274,7 @@ public class AcceptCarriageOrderService {
             logisticsOrder.setSubcontractAmount(new BigDecimal(NumberConstant.ZERO));
             logisticsOrder.setCarryingCapacity(0L);
         }
-        logisticsOrder.setLoss(bo.getLoss() == null ? null : new BigDecimal(bo.getLoss()));
+        logisticsOrder.setLoss(bo.getLoss() == null ? null : bo.getLoss());
         logisticsOrder.setLossUnit(bo.getLossUnit());
         logisticsOrder.setGoodsPrice(bo.getGoodsPrice() == null ? null : new BigDecimal(bo.getGoodsPrice()));
         BigDecimal decimal = new BigDecimal(NumberConstant.ZERO);
@@ -518,7 +524,7 @@ public class AcceptCarriageOrderService {
                 null : Long.parseLong(remoteSystemService.queryDictByTypeAndValue(DictTypeEnum.PRICE_TYPE.getType(), bo.getPriceType()).getValue()));
         order.setAmount(new BigDecimal(bo.getCarryingCapacity()));
         order.setBillingMode(bo.getBillingMode());
-        order.setLoss(new BigDecimal(bo.getLoss()));
+        order.setLoss(bo.getLoss());
 //        order.setLossUnit(bo.getLossUnit());
         order.setLossUnit(remoteSystemService.queryDictByTypeAndValue(DictTypeEnum.UNIT_TYPE.getType(), bo.getLossUnit()) == null ?
                 null : remoteSystemService.queryDictByTypeAndValue(DictTypeEnum.UNIT_TYPE.getType(), bo.getLossUnit()).getValue());
@@ -937,16 +943,27 @@ public class AcceptCarriageOrderService {
                     .set(KwtWaybillOrder::getUpdateBy, LoginUserHolder.getUserId())
                     .set(KwtWaybillOrder::getUpdateTime, new Date()));
             /**变更单据状态*/
-            KwtWaybillOrderTrack orderTrack = new KwtWaybillOrderTrack();
-            orderTrack.setId(new IdWorker(NumberConstant.ONE).nextId());
-            orderTrack.setWOrderId(Long.parseLong(id));
-            orderTrack.setStatus(CarWaybillEnum.REVOKED.getCode());
-            orderTrack.setDelFlag(NumberConstant.ZERO);
-            orderTrack.setCreateBy(LoginUserHolder.getUserId());
-            orderTrack.setCreateTime(new Date());
-            orderTrack.setUpdateBy(LoginUserHolder.getUserId());
-            orderTrack.setUpdateTime(new Date());
-            waybillOrderTrackMapper.insert(orderTrack);
+            KwtWaybillOrderTrack waybillOrderTrack = waybillOrderTrackMapper.selectOne(new LambdaQueryWrapper<KwtWaybillOrderTrack>()
+                    .eq(KwtWaybillOrderTrack::getWOrderId, id)
+                    .eq(KwtWaybillOrderTrack::getStatus, CarWaybillEnum.REVOKED.getCode())
+            );
+            if (waybillOrderTrack == null) {
+                KwtWaybillOrderTrack orderTrack = new KwtWaybillOrderTrack();
+                orderTrack.setId(new IdWorker(NumberConstant.ONE).nextId());
+                orderTrack.setWOrderId(Long.parseLong(id));
+                orderTrack.setStatus(CarWaybillEnum.REVOKED.getCode());
+                orderTrack.setDelFlag(NumberConstant.ZERO);
+                orderTrack.setCreateBy(LoginUserHolder.getUserId());
+                orderTrack.setCreateTime(new Date());
+                orderTrack.setUpdateBy(LoginUserHolder.getUserId());
+                orderTrack.setUpdateTime(new Date());
+                waybillOrderTrackMapper.insert(orderTrack);
+            }else {
+                waybillOrderTrack.setUpdateTime(new Date());
+                waybillOrderTrack.setUpdateBy(LoginUserHolder.getUserId());
+                waybillOrderTrackMapper.updateById(waybillOrderTrack);
+            }
+
             /**修改mongodb*/
             //mongodb更新订单状态
             SckwWaybillOrder updateParam = new SckwWaybillOrder();
@@ -954,9 +971,21 @@ public class AcceptCarriageOrderService {
                     .setUpdateBy(LoginUserHolder.getUserId()).setUpdateByName(LoginUserHolder.getUserName()).setUpdateTime(new Date());
             SckwBusSum busSum = new SckwBusSum();
             busSum.setBusSumType(BusinessTypeEnum.WAYBILL_ORDER_TYPE.getName());
-            busSum.setMethod(2);
+            busSum.setMethod(NumberConstant.TWO);
             busSum.setObject(updateParam);
             streamBridge.send("sckw-busSum", com.alibaba.fastjson2.JSON.toJSONString(busSum));
+            SckwLogisticsOrder order = new SckwLogisticsOrder();
+            order.set_id(logisticsOrder.getId());
+            order.setLOrderId(logisticsOrder.getId());
+            order.setEntrustAmount(entrustAmount);
+            order.setSubcontractAmount(subcontractAmount);
+            order.setUpdateByName(LoginUserHolder.getUserName());
+            order.setUpdateTime(new Date());
+            SckwBusSum orderBusSum = new SckwBusSum();
+            orderBusSum.setBusSumType(BusinessTypeEnum.LOGISTICS_ORDER_TYPE.getName());
+            orderBusSum.setMethod(NumberConstant.TWO);
+            orderBusSum.setObject(order);
+            streamBridge.send("sckw-busSum", com.alibaba.fastjson2.JSON.toJSONString(busSum));
             result.put("status", HttpStatus.SUCCESS_CODE);
             result.put("message", "取消成功");
             list.add(result);

+ 40 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/LogisticsConsignmentService.java

@@ -27,6 +27,7 @@ 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.CompleteLogisticsOrderParam;
 import com.sckw.order.api.model.CreateOrCancelLogisticsOrderParam;
 import com.sckw.order.api.model.OrderDetailRes;
 import com.sckw.product.api.dubbo.GoodsInfoService;
@@ -181,6 +182,18 @@ public class LogisticsConsignmentService {
         insertLogisticsOrderAddress(bo, orderId);
         insertLogisticsOrderTrack(bo, orderId, orderStatus);
         sendMongoDB(lOrderNo, orderId, bo, tradeOrder, orderStatus);
+
+        /**将生成的分配量->贸易订单*/
+        CreateOrCancelLogisticsOrderParam param = new CreateOrCancelLogisticsOrderParam();
+        param.setTOrderId(Long.valueOf(bo.getTOrderId()));
+        param.setEntrustAmount(BigDecimal.valueOf(bo.getCarryingCapacity()));
+        param.setUpdateBy(LoginUserHolder.getUserId());
+        param.setUpdateByName(LoginUserHolder.getUserName());
+        HttpResult httpResult = tradeOrderInfoService.createOrCancelLogisticsOrder(param);
+        if (httpResult.getCode() != HttpStatus.SUCCESS_CODE){
+            log.info("{}生成物流托运失败!,返回信息:{}",bo.getTOrderNo(),JSONObject.toJSONString(httpResult));
+            throw new BusinessException("{}生成物流托运失败!",bo.getTOrderNo());
+        }
     }
 
     /**
@@ -1048,9 +1061,35 @@ public class LogisticsConsignmentService {
                 BigDecimal subtract = kwtLogisticsOrder.getAmount().subtract(kwtLogisticsOrder.getTotalLoadAmount());
                 updateLogisticOrderAndTrack(kwtLogisticsOrder.getId(), orderFinishDTO, subtract);
                 //修改mongodb的数据
-                updateMongoDbByLogisticsOrder(kwtLogisticsOrder,orderFinishDTO);
+                updateMongoDbByLogisticsOrder(kwtLogisticsOrder, orderFinishDTO);
             });
         }
+        //数据推送至贸易订单
+        CompleteLogisticsOrderParam tradeOrder = new CompleteLogisticsOrderParam();
+        //获取实际装货量-实际卸货量
+        Map<String, BigDecimal> map = kwtLogisticsOrderMapper.countAmountByTradeOrderId(logisticsOrder.getTOrderId());
+        //获取是否订单已经全部处理完成
+        List<Integer> statusList = new ArrayList<>();
+        statusList.add(LogisticsOrderEnum.TO_BE_PLANNED.getCode());
+        statusList.add(LogisticsOrderEnum.PENDING_ORDER.getCode());
+        statusList.add(LogisticsOrderEnum.WAIT_DELIVERY.getCode());
+        statusList.add(LogisticsOrderEnum.IN_TRANSIT.getCode());
+        List<KwtLogisticsOrder> logisticsOrders = kwtLogisticsOrderMapper.selectList(new LambdaQueryWrapper<KwtLogisticsOrder>()
+                .eq(KwtLogisticsOrder::getTOrderId, logisticsOrder.getTOrderId())
+                .in(KwtLogisticsOrder::getStatus, statusList));
+        if (org.springframework.util.CollectionUtils.isEmpty(logisticsOrders)) {
+            tradeOrder.setIsAllComplete(true);
+        }
+        tradeOrder.setTOrderId(logisticsOrder.getTOrderId());
+        tradeOrder.setActualLoadAmount(map.get("totalLoadAmount"));
+        tradeOrder.setActualUnloadAmount(map.get("totalUnloadAmount"));
+        tradeOrder.setUpdateBy(LoginUserHolder.getUserId());
+        tradeOrder.setUpdateByName(LoginUserHolder.getUserName());
+        HttpResult httpResult = tradeOrderInfoService.completeLogisticsOrder(tradeOrder);
+        if (httpResult.getCode() != HttpStatus.SUCCESS_CODE){
+            log.info("贸易订单手动完结订单异常,传递信息:{},返回信息:{}",JSONObject.toJSONString(tradeOrder),JSONObject.toJSONString(httpResult));
+            throw new BusinessException("单据完结出现错误!");
+        }
         //todo 直接订单完结-不递归操作
 //
 //        //存在子集

+ 25 - 3
sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderMapper.xml

@@ -133,14 +133,15 @@
         FROM
         kwt_logistics_order a
         LEFT JOIN kwt_logistics_order_goods b ON a.id = b.l_order_id
+        LEFT JOIN kwt_logistics_order_unit d ON a.id = d.l_order_id
         LEFT JOIN kwt_logistics_order_contract c ON a.id=c.l_order_id
         <where>
-            a.del_flag = 0
+            a.del_flag = 0 and d.unit_type = 1
             <if test="dictId != null and dictId != ''">
                 AND a.payment = #{dictId}
             </if>
             <if test="logisticsOrderParam.companyId !=null and logisticsOrderParam.companyId != ''">
-                AND a.ent_id = #{logisticsOrderParam.companyId}
+                AND d.ent_id = #{logisticsOrderParam.companyId}
             </if>
             <if test="logisticsOrderParam.taxRate != null and logisticsOrderParam.taxRate != ''">
                 AND a.tax_rate = #{logisticsOrderParam.taxRate}
@@ -166,9 +167,10 @@
         FROM
         kwt_logistics_order a
         LEFT JOIN kwt_logistics_order_goods b ON a.id = b.l_order_id
+        LEFT JOIN kwt_logistics_order_unit d ON a.id = d.l_order_id
         LEFT JOIN kwt_logistics_order_contract c ON a.id=c.l_order_id
         <where>
-            a.del_flag = 0
+            a.del_flag = 0 and d.unit_type = 1
             <if test="dictId != null and dictId != ''">
                 AND a.payment = #{dictId}
             </if>
@@ -518,4 +520,24 @@
         WHERE del_flag = 0
           AND FIND_IN_SET(#{id}, pids)
     </select>
+
+    <select id="countAmountByTradeOrderId" resultType="java.util.Map">
+        SELECT
+            SUM(
+                    IFNULL( unload_amount, 0 )) as unloadAmount,
+            SUM(
+                    IFNULL( load_amount, 0 )) as loadAmount,
+            SUM(
+                    IFNULL( total_load_amount, 0 )) AS totalLoadAmount,
+            SUM(
+                    IFNULL( total_unload_amount, 0 )) AS totalUnloadAmount
+        FROM
+            kwt_logistics_order
+        WHERE
+            del_flag = 0
+          AND t_order_id = #{tOrderId}
+          AND `status`  IN (
+            8
+            )
+    </select>
 </mapper>