Explorar el Código

1、运单多单位调整;

zk hace 2 años
padre
commit
532d9f8072
Se han modificado 34 ficheros con 1707 adiciones y 414 borrados
  1. 0 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtAcceptCarriageOrderController.java
  2. 0 42
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtConsignOrderController.java
  3. 0 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtLogisticsConsignmentController.java
  4. 0 15
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtWaybillOrderController.java
  5. 18 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderGoodsUnitMapper.java
  6. 21 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderMapper.java
  7. 22 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderTicketMapper.java
  8. 2 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java
  9. 5 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtLogisticsOrderCirculate.java
  10. 71 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtLogisticsOrderGoodsUnit.java
  11. 5 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrder.java
  12. 5 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrderTicket.java
  13. 83 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketApprovalV1Dto.java
  14. 44 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketLoadingDto.java
  15. 84 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketV2Dto.java
  16. 76 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketV3Dto.java
  17. 32 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/GoodsUnitParam.java
  18. 5 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/LogisticsConsignmentParam.java
  19. 37 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillOrderLoadingVO.java
  20. 11 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillTicketVO.java
  21. 4 4
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtAcceptCarriageOrderService.java
  22. 34 31
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtCommonService.java
  23. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtConsignOrderService.java
  24. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java
  25. 122 9
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsOrderGoodsService.java
  26. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtManagementLogisticsOrderService.java
  27. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtManagementWaybillOrderService.java
  28. 2 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtTransportCommonService.java
  29. 167 3
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillManagementService.java
  30. 565 285
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderService.java
  31. 185 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderTicketService.java
  32. 18 0
      sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderGoodsUnitMapper.xml
  33. 56 7
      sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderMapper.xml
  34. 29 2
      sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderTicketMapper.xml

+ 0 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtAcceptCarriageOrderController.java

@@ -48,7 +48,6 @@ public class KwtAcceptCarriageOrderController {
     @Autowired
     KwtTransportCommonService transportCommonService;
 
-
     /**
      * 承运订单首页条件查询
      *
@@ -66,7 +65,6 @@ public class KwtAcceptCarriageOrderController {
         }
     }
 
-
     /**
      * 承运订单top统计
      *
@@ -116,7 +114,6 @@ public class KwtAcceptCarriageOrderController {
         }
     }
 
-
     /**
      * 承运合同/托运合同-根据合同id获取托运订单列表
      *
@@ -215,7 +212,6 @@ public class KwtAcceptCarriageOrderController {
         }
     }
 
-
     /**
      * 承运订单-获取运单详情
      *
@@ -232,7 +228,6 @@ public class KwtAcceptCarriageOrderController {
         }
     }
 
-
     /**
      * 承运订单-获取分包托运列表
      *

+ 0 - 42
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtConsignOrderController.java

@@ -66,7 +66,6 @@ public class KwtConsignOrderController {
         }
     }
 
-
     /**
      * 托运订单-top统计
      *
@@ -97,7 +96,6 @@ public class KwtConsignOrderController {
         ExcelUtil.downData(response, ConsignOrderExcelVo.class, list);
     }
 
-
     /**
      * 托运订单/承运订单-获取车辆运单
      * @param orderDto  物流订单请求数据
@@ -114,7 +112,6 @@ public class KwtConsignOrderController {
         }
     }
 
-
     /**
      * 托运订单-设置停止接单-物流订单id查询-针对循环单
      *
@@ -149,7 +146,6 @@ public class KwtConsignOrderController {
         }
     }
 
-
     /**
      * 托运订单-设置停止接单-提交-针对循环单
      *
@@ -168,41 +164,6 @@ public class KwtConsignOrderController {
         }
     }
 
-
-//
-//    /**
-//     * 托运订单-设置停止接单-查询
-//     *
-//     * @return
-//     */
-//    @RequestMapping(value = "/stopDocumentDetail", method = RequestMethod.POST)
-//    public HttpResult stopDocumentDetail(@Validated @RequestBody DriverParam driverParam) {
-//        log.info("托运订单-设置停止接单-查询 请求参数:{}", JSONObject.toJSONString(driverParam));
-//        try {
-//            return consignOrderService.stopDocumentDetail(driverParam);
-//        } catch (Exception e) {
-//            log.error("托运订单-设置停止接单-查询 error:{}", e.getMessage(), e);
-//            return HttpResult.error(HttpStatus.GLOBAL_EXCEPTION_CODE, e.getMessage());
-//        }
-//    }
-//
-//    /**
-//     * 托运订单-设置停止接单-提交
-//     *
-//     * @param stopOrderTakingDTO
-//     * @return
-//     */
-//    @RequestMapping(value = "/stopDocumentCommit", method = RequestMethod.POST)
-//    public HttpResult stopDocumentCommit(@Validated @RequestBody StopOrderTakingDTO stopOrderTakingDTO) {
-//        log.info("托运订单-设置停止接单-提交 请求参数:{}", JSONObject.toJSONString(stopOrderTakingDTO));
-//        try {
-//            return consignOrderService.stopDocumentCommit(stopOrderTakingDTO);
-//        } catch (Exception e) {
-//            log.error("托运订单-设置停止接单-提交 error:{}", e.getMessage(), e);
-//            return HttpResult.error(HttpStatus.GLOBAL_EXCEPTION_CODE, e.getMessage());
-//        }
-//    }
-
     /**
      * 托运订单/承运订单-获取车辆运单-统计
      *
@@ -220,7 +181,6 @@ public class KwtConsignOrderController {
         }
     }
 
-
     /**
      * 托运订单查看驳回原因
      *
@@ -232,7 +192,6 @@ public class KwtConsignOrderController {
                                           @NotNull @RequestParam("status") Integer status) {
         return consignOrderService.getRejectReasonById(id, status);
     }
-
     /**
      * 托运订单-获取车辆信息
      *
@@ -331,7 +290,6 @@ public class KwtConsignOrderController {
         }
     }
 
-
     /**
      * 工作台-物流运输数据统计-托运业务
      * @param logisticsOrderStatistics  物流订单统计请求参数

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

@@ -195,7 +195,6 @@ public class KwtLogisticsConsignmentController {
         }
     }
 
-
     /**
      * 销售订单-物流托运生成托运订单
      *

+ 0 - 15
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtWaybillOrderController.java

@@ -302,19 +302,4 @@ public class KwtWaybillOrderController {
         return waybillOrderService.approvalEditTicket(params);
     }
 
-
-
-    //取消派车(未接单前)
-    //更换车辆(趟次派车(-出车前)/循环派车(接单后-出车前))
-    //更换司机(趟次派车(-卸货前)/循环派车(接单后-卸货前))
-    //确认接单-趟次/循环
-    //拒绝接单-趟次/循环
-    //确认/拒绝出车
-    //到达装货地点
-    //确认装货
-    //到达卸货地点
-    //确认卸货
-    //修改单证
-    //单证审核
-
 }

+ 18 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderGoodsUnitMapper.java

@@ -0,0 +1,18 @@
+package com.sckw.transport.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.transport.model.KwtLogisticsOrderGoodsUnit;
+import org.apache.ibatis.annotations.Mapper;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @desc 物流订单-商品-单位换算
+ * @author zk
+ * @date 2023/12/6 0006
+ */
+@Mapper
+public interface KwtLogisticsOrderGoodsUnitMapper extends BaseMapper<KwtLogisticsOrderGoodsUnit> {
+
+    List<KwtLogisticsOrderGoodsUnit> findGoodsUnit(Map<String, Object> params);
+}

+ 21 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderMapper.java

@@ -95,7 +95,12 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
 
     /**
      * 统计车辆运单
-     * @param params {lOrderId 物流订单id, upperlOrderId 下级分包物流订单,belowlOrderId 所属上级分包, loadCountStatus 有效装货状态, unloadCountStatus 有效卸货状态}
+     * @param params {
+     *               lOrderId 物流订单id,
+     *               upperlOrderId 下级分包物流订单,
+     *               belowlOrderId 所属上级分包,
+     *               loadCountStatus 有效装货状态,
+     *               unloadCountStatus 有效卸货状态}
      * @desc 统计车辆运单
      * @author zk
      * @date 2023/7/31
@@ -103,6 +108,21 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
      **/
     WaybillCountVo findWaybillOrderCount(Map<String, Object> params);
 
+    /**
+     * 统计车辆运单
+     * @param params {
+     *               lOrderId 物流订单id,
+     *               upperlOrderId 下级分包物流订单,
+     *               belowlOrderId 所属上级分包,
+     *               loadCountStatus 有效装货状态,
+     *               unloadCountStatus 有效卸货状态}
+     * @desc 统计车辆运单
+     * @author zk
+     * @date 2023/7/31
+     * @return 统计数据
+     **/
+    WaybillCountVo findWaybillOrderTicketCount(Map<String, Object> params);
+
     /**
      * 统计司机任务数(待接单/出车/执行/完结)
      * @param driverId 司机ID

+ 22 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderTicketMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.transport.model.KwtWaybillOrderTicket;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
+import java.util.List;
 
 /**
  * @author zk
@@ -22,5 +23,25 @@ public interface KwtWaybillOrderTicketMapper extends BaseMapper<KwtWaybillOrderT
      * @date 2023/7/27
      * @return 榜单信息
      **/
-    KwtWaybillOrderTicket findWaybillOrderTicket(@Param("wOrderId") Long wOrderId, @Param("type") Integer type);
+    List<KwtWaybillOrderTicket> findWaybillOrderTicket(@Param("wOrderId") Long wOrderId, @Param("type") Integer type);
+
+    /**
+     * 查询车辆运单榜单信息
+     * @param wOrderId 车辆订单id
+     * @param type 磅单类型(1装货单/2卸货单)
+     * @param unit 单位
+     * @desc 查询车辆运单榜单信息
+     * @author zk
+     * @date 2023/7/27
+     * @return 榜单信息
+     **/
+    KwtWaybillOrderTicket findWaybillOrderTicketV1(@Param("wOrderId") Long wOrderId, @Param("type") Integer type, @Param("unit") String unit);
+
+    /**
+     * 修改榜单删除标识
+     * @param wOrderId 运单ID
+     * @param type 榜单类型
+     * @return 跟新数量
+     */
+    int deleteTicket(@Param("wOrderId") Long wOrderId, @Param("type") Integer type);
 }

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

@@ -41,7 +41,7 @@ import com.sckw.transport.api.model.vo.RWaybillOrderVo;
 import com.sckw.transport.dao.*;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.vo.WaybillCountVo;
-import com.sckw.transport.service.CommonService;
+import com.sckw.transport.service.KwtCommonService;
 import jakarta.annotation.Resource;
 import jodd.util.StringUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -68,7 +68,7 @@ import java.util.stream.Collectors;
 public class TransportServiceImpl implements TransportService {
 
     @Autowired
-    public CommonService commonService;
+    public KwtCommonService commonService;
 
     @Resource
     private StreamBridge streamBridge;

+ 5 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtLogisticsOrderCirculate.java

@@ -82,6 +82,11 @@ public class KwtLogisticsOrderCirculate implements Serializable {
      */
     private Date endTime;
 
+    /**
+     * 托量单位
+     */
+    private String unit;
+
     /**
      * 委托量
      */

+ 71 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtLogisticsOrderGoodsUnit.java

@@ -0,0 +1,71 @@
+package com.sckw.transport.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.sckw.core.model.base.BaseModel;
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @desc 物流订单-商品-单位换算
+ * @author zk
+ * @date 2023/12/6 0006
+ */
+@Data
+@TableName("kwt_logistics_order_goods_unit")
+public class KwtLogisticsOrderGoodsUnit extends BaseModel implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 5603636665614208263L;
+
+    /**
+     * 物流订单id
+     */
+    private Long lOrderId;
+
+    /**
+     * 商品id
+     */
+    private Long goodsId;
+
+    /**
+     * 被转换单位
+     */
+    private String fromUnit;
+
+    /**
+     * 转换目标单位
+     */
+    private String toUnit;
+
+    /**
+     * 换算值
+     */
+    private BigDecimal conversionValue;
+
+    /**
+     * 存储单位
+     */
+    private String unit;
+
+    /**
+     * 卸货量(自己承运总卸货量)
+     */
+    private BigDecimal unloadAmount;
+
+    /**
+     * 装货量(自己承运总装货量)
+     */
+    private BigDecimal loadAmount;
+
+    /**
+     * 装货-履约量(自己下游承运总装货量)
+     */
+    private BigDecimal totalLoadAmount;
+
+    /**
+     * 卸货-履约量(自己下游承运总卸货量)
+     */
+    private BigDecimal totalUnloadAmount;
+}

+ 5 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrder.java

@@ -71,6 +71,11 @@ public class KwtWaybillOrder implements Serializable {
      */
     private String driverIdcard;
 
+    /**
+     * 托量单位
+     */
+    private String unit;
+
     /**
      * 已委托量
      */

+ 5 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrderTicket.java

@@ -31,6 +31,11 @@ public class KwtWaybillOrderTicket implements Serializable {
      */
     private Integer type;
 
+    /**
+     * 装卸货单位
+     */
+    private String unit;
+
     /**
      * 装卸货数量
      */

+ 83 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketApprovalV1Dto.java

@@ -0,0 +1,83 @@
+package com.sckw.transport.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author zk
+ * @desc 车辆运单审核
+ * @date 2023/7/27 0027
+ */
+@Data
+public class WaybillOrderTicketApprovalV1Dto {
+    /**
+     * 车辆运单id
+     */
+    @JsonProperty("wOrderId")
+    @NotNull(message = "车辆运单ID不能为空")
+    private Long wOrderId;
+
+    /**
+     * 上传凭证地址,多个以英文逗号隔开
+     */
+    @JsonProperty("loadUrls")
+    @NotBlank(message = "装货凭证不能为空")
+    private String loadUrls;
+
+    /**
+     * 操作时间
+     */
+    @JsonProperty("loadOperateTime")
+    @JsonFormat(locale="zh", pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @NotNull(message = "装货时间不能为空")
+    private Date loadOperateTime;
+
+    /**
+     * 装卸量信息
+     */
+    @NotNull(message = "装货数量信息不能为空")
+    List<WaybillOrderTicketLoadingDto> load;
+
+    /**
+     * 上传凭证地址,多个以英文逗号隔开
+     */
+    @JsonProperty("unloadUrls")
+    @NotBlank(message = "卸货凭证不能为空")
+    private String unloadUrls;
+
+    /**
+     * 操作时间
+     */
+    @JsonProperty("unloadOperateTime")
+    @JsonFormat(locale="zh", pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @NotNull(message = "卸货时间不能为空")
+    private Date unloadOperateTime;
+
+    /**
+     * 装卸量信息
+     */
+    @NotNull(message = "卸货数量信息不能为空")
+    List<WaybillOrderTicketLoadingDto> unload;
+
+    /**
+     * 磅单类型(0 审核-通过/1 已核-不通过)
+     */
+    @JsonProperty("status")
+    @NotNull(message = "磅单类型不能为空")
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    @Size(max=100, message = "原因长度不能大于100个字符!")
+    private String remark;
+}

+ 44 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketLoadingDto.java

@@ -0,0 +1,44 @@
+package com.sckw.transport.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import java.math.BigDecimal;
+
+/**
+ * @author zk
+ * @desc 装卸货榜单信息
+ * @date 2023/7/26 0026
+ */
+@Data
+public class WaybillOrderTicketLoadingDto {
+
+    /**
+     * 装货量单位
+     */
+    @JsonProperty("unit")
+    @NotBlank(message = "装货量单位不能为空")
+    private String unit;
+
+    /**
+     * 装卸货数量
+     */
+    @JsonProperty("amount")
+    @NotNull(message = "装卸货净重不能为空")
+    @DecimalMin(value= "0", inclusive=false, message = "装卸货净重必须等于或大于0")
+    private BigDecimal amount;
+
+    /**
+     * 毛重
+     */
+    @JsonProperty("grossAmount")
+    private BigDecimal grossAmount;
+
+    /**
+     * 皮重
+     */
+    @JsonProperty("tareAmount")
+    private BigDecimal tareAmount;
+}

+ 84 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketV2Dto.java

@@ -0,0 +1,84 @@
+package com.sckw.transport.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author zk
+ * @desc 装卸货榜单信息
+ * @date 2023/7/26 0026
+ */
+@Data
+public class WaybillOrderTicketV2Dto {
+
+    /**
+     * 车辆运单id
+     */
+    @JsonProperty("wOrderId")
+    @NotNull(message = "车辆运单ID不能为空")
+    private Long wOrderId;
+
+    /**
+     * 磅单类型(1装货单/2卸货单)
+     */
+    @JsonProperty("type")
+    //@NotNull(message = "磅单类型不能为空")
+    private Integer type;
+
+    /**
+     * 装卸货数量
+
+    @JsonProperty("amount")
+    @NotNull(message = "装卸货净重不能为空")
+    @DecimalMin(value= "0", inclusive=false, message = "装卸货净重必须等于或大于0")
+    private BigDecimal amount;*/
+
+    /**
+     * 毛重
+
+    @JsonProperty("grossAmount")
+    private BigDecimal grossAmount;*/
+
+    /**
+     * 皮重
+
+    @JsonProperty("tareAmount")
+    private BigDecimal tareAmount;*/
+
+    /**
+     * 上传凭证地址,多个以英文逗号隔开
+     */
+    @JsonProperty("urls")
+    @NotBlank(message = "凭证不能为空")
+    private String urls;
+
+    /**
+     * 操作时间
+     */
+    @JsonProperty("operateTime")
+    @JsonFormat(locale="zh", pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @NotNull(message = "时间不能为空")
+    private Date operateTime;
+
+    /**
+     * 备注
+     */
+    @Size(max=100, message = "原因长度不能大于100个字符!")
+    private String remark;
+
+    /**
+     * 装载量信息
+     */
+    @NotNull(message = "装卸货数量信息不能为空")
+    List<WaybillOrderTicketLoadingDto> loading;
+}

+ 76 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketV3Dto.java

@@ -0,0 +1,76 @@
+package com.sckw.transport.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author zk
+ * @desc 车辆运单审核
+ * @date 2023/7/27 0027
+ */
+@Data
+public class WaybillOrderTicketV3Dto {
+    /**
+     * 车辆运单id
+     */
+    @JsonProperty("wOrderId")
+    @NotNull(message = "车辆运单ID不能为空")
+    private Long wOrderId;
+
+    /**
+     * 上传凭证地址,多个以英文逗号隔开
+     */
+    @JsonProperty("loadUrls")
+    @NotBlank(message = "装货凭证不能为空")
+    private String loadUrls;
+
+    /**
+     * 操作时间
+     */
+    @JsonProperty("loadOperateTime")
+    @JsonFormat(locale="zh", pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @NotNull(message = "装货时间不能为空")
+    private Date loadOperateTime;
+
+    /**
+     * 装卸量信息
+     */
+    @NotNull(message = "装货数量信息不能为空")
+    List<WaybillOrderTicketLoadingDto> load;
+
+    /**
+     * 上传凭证地址,多个以英文逗号隔开
+     */
+    @JsonProperty("unloadUrls")
+    @NotBlank(message = "卸货凭证不能为空")
+    private String unloadUrls;
+
+    /**
+     * 操作时间
+     */
+    @JsonProperty("unloadOperateTime")
+    @JsonFormat(locale="zh", pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @NotNull(message = "卸货时间不能为空")
+    private Date unloadOperateTime;
+
+    /**
+     * 装卸量信息
+     */
+    @NotNull(message = "卸货数量信息不能为空")
+    List<WaybillOrderTicketLoadingDto> unload;
+
+    /**
+     * 备注
+     */
+    @Size(max=100, message = "原因长度不能大于100个字符!")
+    private String remark;
+}

+ 32 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/GoodsUnitParam.java

@@ -0,0 +1,32 @@
+package com.sckw.transport.model.param;
+
+import lombok.Data;
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @desc 商品-单位换算
+ * @author zk
+ * @date 2023/12/4 0004
+ */
+@Data
+public class GoodsUnitParam implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 41804905372870133L;
+
+    /**
+     * 被转换单位
+     */
+    private String fromUnit;
+
+    /**
+     * 转换目标单位
+     */
+    private String toUnit;
+
+    /**
+     * 换算值
+     */
+    private Double conversionValue;
+}

+ 5 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/LogisticsConsignmentParam.java

@@ -12,6 +12,7 @@ import org.hibernate.validator.constraints.Length;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.util.List;
 
 /**
  * @author lfdc
@@ -244,4 +245,8 @@ public class LogisticsConsignmentParam {
     @NotNull(message = "计费方式不能为空")
     private String billingMode;
 
+    /**
+     * 辅助单位
+     */
+    private List<GoodsUnitParam> assistUnit;
 }

+ 37 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillOrderLoadingVO.java

@@ -0,0 +1,37 @@
+package com.sckw.transport.model.vo;
+
+import lombok.Data;
+import java.math.BigDecimal;
+
+/**
+ * @author lfdc
+ * @description 运单装载信息
+ * @date 2023-07-18 13:50:57
+ */
+@Data
+public class WaybillOrderLoadingVO {
+
+    /**
+     * 装卸货单位
+     */
+    private String unit;
+
+    /**
+     * 装卸货单位
+     */
+    private String unitName;
+
+    /**
+     * 装卸货数量
+     */
+    private BigDecimal amount;
+
+    public WaybillOrderLoadingVO() {
+    }
+
+    public WaybillOrderLoadingVO(String unit, String unitName, BigDecimal amount) {
+        this.unit = unit;
+        this.unitName = unitName;
+        this.amount = amount;
+    }
+}

+ 11 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillTicketVO.java

@@ -4,6 +4,7 @@ import lombok.Data;
 import lombok.experimental.Accessors;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * @author JC
@@ -49,4 +50,14 @@ public class WaybillTicketVO {
      */
     private String deficitRealAmount;
 
+    /**
+     * 装载信息
+     */
+    List<WaybillOrderLoadingVO> loadLoading;
+
+    /**
+     * 卸载信息
+     */
+    List<WaybillOrderLoadingVO> unloadLoading;
+
 }

+ 4 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtAcceptCarriageOrderService.java

@@ -119,7 +119,7 @@ public class KwtAcceptCarriageOrderService {
     private MessageUrlConfig messageUrlConfig;
 
     @Autowired
-    public CommonService commonService;
+    public KwtCommonService commonService;
 
     @Autowired
     public KwtWaybillOrderService waybillOrderService;
@@ -180,8 +180,8 @@ public class KwtAcceptCarriageOrderService {
                     httpResult.setCode(HttpStatus.GLOBAL_EXCEPTION_CODE);
                     return httpResult;
                 }
-                KwtLogisticsOrder logisticsOrder = logisticsOrderMapper.selectOne(new LambdaQueryWrapper<KwtLogisticsOrder>()
-                        .eq(KwtLogisticsOrder::getId, bo.getLOrderId()));
+
+                KwtLogisticsOrder logisticsOrder = logisticsOrderMapper.selectById(bo.getLOrderId());
                 if (logisticsOrder == null) {
                     log.error("订单id查找失败:{},订单编号:{}", bo.getLOrderId(), bo.getLOrderNo());
                     throw new BusinessException("单据错误,数据不存在");
@@ -276,7 +276,7 @@ public class KwtAcceptCarriageOrderService {
                     throw new RuntimeException("生成物流托运合同异常");
                 }
                 //主体信息保存
-                logisticsOrderGoodsService.insertSubcontractLogisticsGoods(bo, lOrderNo, orderId);
+                logisticsOrderGoodsService.insertSubcontractLogisticsGoods(logisticsOrder, lOrderNo, orderId);
                 insertSubcontractLogisticsOrder(bo, lOrderNo, order, orderId, pids, orderStatus, logisticsOrder);
                 insertSubcontractLogisticsOrderContract(bo, orderId, infoResDto);
                 insertSubcontractLogisticsOrderUnit(bo, orderId);

+ 34 - 31
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/CommonService.java → sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtCommonService.java

@@ -40,7 +40,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.stream.function.StreamBridge;
 import org.springframework.stereotype.Service;
-
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
@@ -48,12 +47,12 @@ import java.util.stream.Collectors;
 
 /**
  * @author lfdc
- * @description 通用Service
+ * @desc 通用Service
  * @date 2023-07-06 13:07:43
  */
 @Slf4j
 @Service
-public class CommonService {
+public class KwtCommonService {
 
     @Autowired
     private StreamBridge streamBridge;
@@ -88,8 +87,8 @@ public class CommonService {
     /**
      * 组装返回数据
      *
-     * @param mappedResults
-     * @param arrayList
+     * @param mappedResults 请求参数
+     * @param arrayList 请求参数
      */
     public List<TableTops> packageReturnStatistics(List<com.sckw.mongo.model.TableTops> mappedResults, List<TableTops> arrayList) {
         List<String> codeList = LogisticsOrderEnum.getCodeStringList();
@@ -195,8 +194,8 @@ public class CommonService {
 
     /**
      * 修改合同履约量
-     * @param loadAmount
-     * @param unloadAmount
+     * @param loadAmount 装货量
+     * @param unloadAmount 卸货量
      */
     public void updatePerformed(KwtLogisticsOrder logisticsOrder, BigDecimal loadAmount, BigDecimal unloadAmount) {
         /**
@@ -226,8 +225,8 @@ public class CommonService {
     }
 
     /**
-     * @param userIds 企业用户ID+司机ID
      * @desc 查询用户信息
+     * @param userIds 企业用户ID+司机ID
      * @author zk
      * @date 2023/9/7
      **/
@@ -330,11 +329,11 @@ public class CommonService {
 
     /**
      * 给业务联系人发消息[承运方]
-     * @param carriageUnit
-     * @param map
-     * @param pcUrl
-     * @param appUrl
-     * @param messageEnum
+     * @param carriageUnit 承运单位
+     * @param map 消息参数
+     * @param pcUrl  pc端调整地址
+     * @param appUrl app调整地址
+     * @param messageEnum 消息模板
      */
     private void sendLogisticsCarriageMessage(KwtLogisticsOrderUnit carriageUnit, Map<String, Object> map, String pcUrl, String appUrl, MessageEnum messageEnum) {
         //给业务联系人发消息[承运方]
@@ -361,11 +360,11 @@ public class CommonService {
 
     /**
      * 给业务联系人发消息[托运方]
-     * @param consignUnit
-     * @param map
-     * @param pcUrl
-     * @param appUrl
-     * @param messageEnum
+     * @param consignUnit 发货单位
+     * @param map 消息参数
+     * @param pcUrl pc端调整地址
+     * @param appUrl app调整地址
+     * @param messageEnum 消息模板
      */
     private void sendLogisticsConsignMessage(KwtLogisticsOrderUnit consignUnit, Map<String, Object> map, String pcUrl, String appUrl, MessageEnum messageEnum) {
         //给业务联系人发消息[托运方]
@@ -440,10 +439,9 @@ public class CommonService {
 
     /**
      * 给承运和托运双方发送消息
-     *
-     * @param checkUnit
-     * @param carriageUnit
-     * @param map
+     * @param checkUnit 托运单位
+     * @param carriageUnit 承运单位
+     * @param map 消息参数
      */
     private void sendMessageLogistics(KwtLogisticsOrderUnit checkUnit, KwtLogisticsOrderUnit carriageUnit, Map map) {
         //给业务联系人发消息[承运方]
@@ -638,7 +636,13 @@ public class CommonService {
         }
     }
 
-
+    /**
+     * 脱水消息
+     * @param consignUnit 托运单位
+     * @param carriageUnit 承运单位
+     * @param map          消息参数
+     * @param consignMessageEnum 消息模板
+     */
     private void sendMessagePublicLogistics(KwtLogisticsOrderUnit consignUnit, KwtLogisticsOrderUnit carriageUnit, Map<String, Object> map, MessageEnum consignMessageEnum) {
         //给业务联系人发消息[承运方]
         List<UserInfo> userInfoList = new ArrayList<>();
@@ -681,6 +685,7 @@ public class CommonService {
     }
 
     /**
+     * 推送消息
      * @param consignUnit                     托运单位
      * @param carriageUnit                    承运单位
      * @param orderNo                         单据号
@@ -696,8 +701,7 @@ public class CommonService {
     public void pushMessageByUrl(KwtLogisticsOrderUnit consignUnit, KwtLogisticsOrderUnit carriageUnit, String orderNo, Long createBy, Long entId,
                                  MessageEnum consignMessageEnum, MessageEnum carriageMessageEnum,
                                  String pcConsignLogisticsAddOrderUrl, String pcCarriageLogisticsAddOrderUrl,
-                                 String appConsignLogisticsAddOrderUrl, String appCarriageLogisticsAddOrderUrl
-    ) {
+                                 String appConsignLogisticsAddOrderUrl, String appCarriageLogisticsAddOrderUrl) {
         boolean flag = false;
         if (createBy.equals(consignUnit.getContactsId()) || createBy.equals(carriageUnit.getContactsId())) {
             flag = true;
@@ -733,17 +737,17 @@ public class CommonService {
     }
 
     /**
+     * 推送消息
      * @param consignUnit         托运单位
      * @param carriageUnit        承运单位
-     * @param map
+     * @param map                 参数
      * @param consignMessageEnum  托运枚举
      * @param carriageMessageEnum 承运枚
      */
     private void sendPushMessageByUrlLogistics(KwtLogisticsOrderUnit consignUnit, KwtLogisticsOrderUnit carriageUnit,
                                                Map<String, Object> map,
                                                MessageEnum consignMessageEnum,
-                                               MessageEnum carriageMessageEnum
-    ) {
+                                               MessageEnum carriageMessageEnum) {
         //给业务联系人发消息[承运方]
         List<UserInfo> userInfoList = new ArrayList<>();
         UserInfo userInfo = new UserInfo();
@@ -784,7 +788,6 @@ public class CommonService {
         streamBridge.send("sckw-message", JSON.toJSONString(message));
     }
 
-
     /**
      * 验证当前物流订单是否存在未完结的车辆运单
      *
@@ -811,10 +814,10 @@ public class CommonService {
     }
 
     /**
+     * @desc 计算扣亏量
      * @param loadAmount    装货量
      * @param deficitAmount 亏吨量
      * @param loss          合理损耗
-     * @desc 计算扣亏量
      **/
     public BigDecimal deficitAmount(BigDecimal loadAmount, BigDecimal deficitAmount, BigDecimal entrustAmount, BigDecimal loss, String lossUnit) {
         //亏吨<=0
@@ -856,10 +859,10 @@ public class CommonService {
     }
 
     /**
+     * @desc 计算扣亏量
      * @param loadAmount    装货量
      * @param deficitAmount 亏吨量
      * @param loss          合理损耗
-     * @desc 计算扣亏量
      * @author zk
      * @date 2023/7/27
      **/

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

@@ -112,7 +112,7 @@ public class KwtConsignOrderService {
     RedisLockUtil redisLockUtil;
 
     @Autowired
-    public CommonService commonService;
+    public KwtCommonService commonService;
 
     @Autowired
     public MongoTemplate mongoTemplate;

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

@@ -95,7 +95,7 @@ public class KwtLogisticsConsignmentService {
     MessageUrlConfig messageUrlConfig;
 
     @Autowired
-    public CommonService commonService;
+    public KwtCommonService commonService;
 
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
     RemoteSystemService remoteSystemService;

+ 122 - 9
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsOrderGoodsService.java

@@ -1,18 +1,32 @@
 package com.sckw.transport.service;
 
+import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.constant.NumberConstant;
+import com.sckw.core.model.enums.LogisticsOrderEnum;
+import com.sckw.core.utils.BeanUtils;
+import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.IdWorker;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.transport.dao.KwtLogisticsOrderGoodsMapper;
+import com.sckw.transport.dao.KwtLogisticsOrderGoodsUnitMapper;
+import com.sckw.transport.dao.KwtLogisticsOrderMapper;
+import com.sckw.transport.dao.KwtWaybillOrderMapper;
+import com.sckw.transport.model.KwtLogisticsOrder;
 import com.sckw.transport.model.KwtLogisticsOrderGoods;
+import com.sckw.transport.model.KwtLogisticsOrderGoodsUnit;
 import com.sckw.transport.model.dto.AddOrderDTO;
-import com.sckw.transport.model.dto.SubcontractConsignmentDTO;
+import com.sckw.transport.model.param.GoodsUnitParam;
 import com.sckw.transport.model.param.LogisticsConsignmentParam;
+import com.sckw.transport.model.vo.LogisticsCountVo;
+import com.sckw.transport.model.vo.WaybillCountVo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @desc 物流订单关联商品信息
@@ -23,9 +37,14 @@ import java.util.Date;
 @Service
 @SuppressWarnings("all")
 public class KwtLogisticsOrderGoodsService {
-
     @Autowired
-    public KwtLogisticsOrderGoodsMapper kwtLogisticsOrderGoodsMapper;
+    KwtWaybillOrderMapper waybillOrderMapper;
+    @Autowired
+    KwtLogisticsOrderMapper logisticsOrderMapper;
+    @Autowired
+    public KwtLogisticsOrderGoodsMapper goodsMapper;
+    @Autowired
+    public KwtLogisticsOrderGoodsUnitMapper goodsUnitMapper;
 
     /**
      * 物流订单-商品信息
@@ -45,7 +64,19 @@ public class KwtLogisticsOrderGoodsService {
         kwtLogisticsOrderGoods.setUpdateTime(new Date());
         kwtLogisticsOrderGoods.setCreateBy(LoginUserHolder.getUserId());
         kwtLogisticsOrderGoods.setCreateTime(new Date());
-        kwtLogisticsOrderGoodsMapper.insert(kwtLogisticsOrderGoods);
+        goodsMapper.insert(kwtLogisticsOrderGoods);
+
+        //辅助单位
+        List<GoodsUnitParam> assistUnit = bo.getAssistUnit();
+        if (CollectionUtils.isNotEmpty(assistUnit)) {
+            assistUnit.forEach(e -> {
+                KwtLogisticsOrderGoodsUnit unit = BeanUtils.copyProperties(e, KwtLogisticsOrderGoodsUnit.class);
+                unit.setGoodsId(kwtLogisticsOrderGoods.getGoodsId());
+                unit.setLOrderId(kwtLogisticsOrderGoods.getLOrderId());
+                unit.setUnit(unit.getFromUnit().equals(bo.getCarryingCapacityUnit()) ? unit.getToUnit() : unit.getFromUnit());
+                goodsUnitMapper.insert(unit);
+            });
+        }
     }
 
     /**
@@ -54,18 +85,40 @@ public class KwtLogisticsOrderGoodsService {
      * @param lOrderNo
      * @param orderId
      */
-    public void insertSubcontractLogisticsGoods(SubcontractConsignmentDTO bo, String lOrderNo, Long orderId) {
+    public void insertSubcontractLogisticsGoods(KwtLogisticsOrder logisticsOrder, String lOrderNo, Long orderId) {
+        KwtLogisticsOrderGoods superiorGodds = goodsMapper.findByGoods(logisticsOrder.getId());
         KwtLogisticsOrderGoods kwtLogisticsOrderGoods = new KwtLogisticsOrderGoods();
         kwtLogisticsOrderGoods.setId(new IdWorker(NumberConstant.ONE).nextId());
-        kwtLogisticsOrderGoods.setGoodsId(bo.getGoodsId() == null ? null : Long.parseLong(bo.getGoodsId()));
-        kwtLogisticsOrderGoods.setGoodsName(bo.getGoodsName());
         kwtLogisticsOrderGoods.setLOrderId(orderId);
         kwtLogisticsOrderGoods.setLOrderNo(lOrderNo);
+        kwtLogisticsOrderGoods.setGoodsId(superiorGodds != null ? superiorGodds.getGoodsId() : null);
+        kwtLogisticsOrderGoods.setGoodsName(superiorGodds != null ? superiorGodds.getGoodsName() : null);
+        kwtLogisticsOrderGoods.setGoodsType(superiorGodds != null ? superiorGodds.getGoodsType() : null);
+        kwtLogisticsOrderGoods.setSkuId(superiorGodds != null ? superiorGodds.getSkuId() : null);
+        kwtLogisticsOrderGoods.setRemark(superiorGodds != null ? superiorGodds.getRemark() : null);
         kwtLogisticsOrderGoods.setUpdateBy(LoginUserHolder.getUserId());
         kwtLogisticsOrderGoods.setUpdateTime(new Date());
         kwtLogisticsOrderGoods.setCreateBy(LoginUserHolder.getUserId());
         kwtLogisticsOrderGoods.setCreateTime(new Date());
-        kwtLogisticsOrderGoodsMapper.insert(kwtLogisticsOrderGoods);
+        goodsMapper.insert(kwtLogisticsOrderGoods);
+
+        //辅助单位
+        List<KwtLogisticsOrderGoodsUnit> assistUnit = goodsUnitMapper.findGoodsUnit(new HashMap<>(NumberConstant.SIXTEEN){{
+            put("lOrderId", logisticsOrder.getId());
+        }});
+        if (CollectionUtils.isNotEmpty(assistUnit)) {
+            assistUnit.forEach(e -> {
+                KwtLogisticsOrderGoodsUnit unit = new KwtLogisticsOrderGoodsUnit();
+                unit.setLOrderId(orderId);
+                unit.setGoodsId(e.getGoodsId());
+                unit.setFromUnit(e.getFromUnit());
+                unit.setToUnit(e.getToUnit());
+                unit.setConversionValue(e.getConversionValue());
+                unit.setUnit(e.getUnit());
+                unit.setRemark(e.getRemark());
+                goodsUnitMapper.insert(unit);
+            });
+        }
     }
 
     /**
@@ -86,6 +139,66 @@ public class KwtLogisticsOrderGoodsService {
         goods.setCreateTime(new Date());
         goods.setUpdateBy(LoginUserHolder.getUserId());
         goods.setUpdateTime(new Date());
-        kwtLogisticsOrderGoodsMapper.insert(goods);
+        goodsMapper.insert(goods);
     }
+
+    /**
+     * 更新物流订单商品辅助单位-装卸货量
+     * @param lOrderId 物流订单
+     */
+    public void editLogisticsOrderGoodsLoading(Long lOrderId) {
+        //辅助单位
+        List<KwtLogisticsOrderGoodsUnit> assistUnit = goodsUnitMapper.findGoodsUnit(new HashMap<>(NumberConstant.SIXTEEN){{
+            put("lOrderId", lOrderId);
+        }});
+        if (CollectionUtils.isNotEmpty(assistUnit)) {
+            assistUnit.forEach(e -> {
+                //车辆运单统计(运输中的物流订单+车辆运单审核通过)
+                WaybillCountVo waybillCount = waybillOrderMapper.findWaybillOrderTicketCount(new HashMap() {{
+                    put("unit", e.getUnit());
+                    put("lOrderId", lOrderId);
+                    put("passStatus", Global.NUMERICAL_ONE);
+                }});
+                //更新物流订单商品辅助单位-装卸货量
+                e.setLoadAmount(waybillCount.getLoadAmount());
+                e.setUnloadAmount(waybillCount.getUnloadAmount());
+                goodsUnitMapper.updateById(e);
+            });
+        }
+    }
+
+
+    /**
+     * 更新物流订单商品辅助单位-装卸货量
+     * @param lOrderId 物流订单
+     */
+    public void editLogisticsOrderGoodsTotalLoading(Long lOrderId) {
+        //辅助单位
+        List<KwtLogisticsOrderGoodsUnit> assistUnit = goodsUnitMapper.findGoodsUnit(new HashMap<>(NumberConstant.SIXTEEN){{
+            put("lOrderId", lOrderId);
+        }});
+        if (CollectionUtils.isNotEmpty(assistUnit)) {
+            assistUnit.forEach(e -> {
+                //车辆运单统计(运输中的物流订单+车辆运单审核通过)
+                WaybillCountVo waybillCount = waybillOrderMapper.findWaybillOrderTicketCount(new HashMap() {{
+                    put("unit", e.getUnit());
+                    put("upperlOrderId", lOrderId);
+                    put("passStatus", Global.NUMERICAL_ONE);
+                    put("logisticsStatus", LogisticsOrderEnum.IN_TRANSIT.getCode());
+                }});
+                //物流订单统计(运输完成后的物流订单)
+                LogisticsCountVo LogisticsCount = logisticsOrderMapper.findLogisticsOrderCount(new HashMap() {{
+                    put("upperlOrderId", lOrderId);
+                    put("finishedStatus", Global.NUMERICAL_ONE);
+                }});
+                //更新物流订单商品辅助单位-总装卸货量
+                e.setTotalLoadAmount(waybillCount.getLoadAmount().add(LogisticsCount.getLoadAmount()));
+                e.setTotalUnloadAmount(waybillCount.getUnloadAmount().add(LogisticsCount.getUnloadAmount()));
+                goodsUnitMapper.updateById(e);
+            });
+        }
+    }
+
+
+
 }

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

@@ -57,7 +57,7 @@ import java.util.stream.Collectors;
 public class KwtManagementLogisticsOrderService {
 
     @Autowired
-    CommonService commonService;
+    KwtCommonService commonService;
 
     @Autowired
     KwtLogisticsOrderMapper logisticsOrderMapper;

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

@@ -46,7 +46,7 @@ public class KwtManagementWaybillOrderService {
     private MongoTemplate mongoTemplate;
 
     @Autowired
-    private CommonService commonService;
+    private KwtCommonService commonService;
 
     @Autowired
     private KwtWaybillManagementService waybillManagementService;

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

@@ -57,7 +57,7 @@ import java.util.stream.Collectors;
 
 /**
  * @author lfdc
- * @description 运输服务公共service接口
+ * @desc 运输服务公共service接口
  * @date 2023-06-29 15:06:45
  */
 @Slf4j
@@ -80,7 +80,7 @@ public class KwtTransportCommonService {
     MessageUrlConfig messageUrlConfig;
 
     @Autowired
-    public CommonService commonService;
+    public KwtCommonService commonService;
 
     @Autowired
     public KwtWaybillOrderService waybillOrderService;

+ 167 - 3
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillManagementService.java

@@ -68,16 +68,19 @@ public class KwtWaybillManagementService {
     public KwtWaybillOrderTicketMapper kwtWaybillOrderTicketMapper;
 
     @Autowired
-    private KwtLogisticsOrderCirculateMapper orderCirculateDao;
+    private KwtLogisticsOrderCirculateMapper orderCirculateMapper;
 
     @Autowired
     public KwtWaybillOrderTrackMapper kwtWaybillOrderTrackMapper;
 
+    @Autowired
+    KwtWaybillOrderTicketService kwtWaybillOrderTicketService;
+
     @Autowired
     private MongoTemplate mongoTemplate;
 
     @Autowired
-    private CommonService commonService;
+    private KwtCommonService commonService;
 
     /**
      * 运单详情
@@ -86,6 +89,167 @@ public class KwtWaybillManagementService {
      * @return
      */
     public HttpResult waybillData(Long id) {
+        if (Objects.isNull(id)) {
+            return HttpResult.error("id不能为空");
+        }
+        WaybillDataVO waybillDataVO = new WaybillDataVO();
+        Criteria criteria = new Criteria();
+        criteria.and("_id").is(id);
+        criteria.and("delFlag").is(NumberConstant.ZERO);
+        Query queryFormat = new Query(criteria);
+        SckwWaybillOrder info = mongoTemplate.findOne(queryFormat, SckwWaybillOrder.class);
+
+        WayBillDetailDTO wayBillDetailDTO = new WayBillDetailDTO();
+        WaybillTicketVO waybillTicketVO = new WaybillTicketVO();
+        WaybillCarVO waybillCarVO = new WaybillCarVO();
+        if (!ObjectUtils.isEmpty(info)) {
+            // 基础信息
+            wayBillDetailDTO.setTruckId(info.getTruckId());
+            wayBillDetailDTO.setStatus(String.valueOf(info.getStatus()));
+            wayBillDetailDTO.setTruckNo(info.getTruckNo());
+            wayBillDetailDTO.setDriverId(info.getDriverId());
+            wayBillDetailDTO.setDriverName(info.getDriverName());
+            wayBillDetailDTO.setDriverPhone(info.getDriverPhone());
+            wayBillDetailDTO.setDriverId(info.getDriverId());
+            wayBillDetailDTO.setWOrderId(info.getWOrderId());
+            wayBillDetailDTO.setWOrderNo(info.getWOrderNo());
+            wayBillDetailDTO.setLOrderId(info.getLOrderId());
+            wayBillDetailDTO.setLOrderNo(info.getLOrderNo());
+            wayBillDetailDTO.setLOrderNo(info.getLOrderNo());
+            wayBillDetailDTO.setEntrustAmount(String.valueOf(info.getEntrustAmount()));
+            wayBillDetailDTO.setType(String.valueOf(info.getType()));
+            wayBillDetailDTO.setTypeLabel(info.getType().equals(NumberConstant.ONE) ? "趟次" : "循环");
+            wayBillDetailDTO.setStartTime(info.getStartTime());
+            wayBillDetailDTO.setEndTime(info.getEndTime());
+            wayBillDetailDTO.setCreateBy(info.getCreateByName());
+            wayBillDetailDTO.setGoodsName(info.getGoodsName());
+            if (info.getLoadDetailAddress().contains(info.getLoadCityName())){
+                wayBillDetailDTO.setLoadDetailAddress(info.getLoadDetailAddress());
+            }else {
+                wayBillDetailDTO.setLoadDetailAddress(info.getLoadCityName().concat(info.getLoadDetailAddress()));
+            }
+            if (info.getUnloadDetailAddress().contains(info.getUnloadCityName())){
+                wayBillDetailDTO.setUnloadDetailAddress(info.getUnloadDetailAddress());
+            }else {
+                wayBillDetailDTO.setUnloadDetailAddress(info.getUnloadCityName().concat(info.getUnloadDetailAddress()));
+            }
+            wayBillDetailDTO.setLoadName(info.getLoadName());
+            wayBillDetailDTO.setUnloadName(info.getUnloadName());
+            wayBillDetailDTO.setCarrierFirmName(info.getCarrierFirmName());
+            wayBillDetailDTO.setCheckFirmName(info.getCheckFirmName());
+            // 计费方式
+            KwtLogisticsOrder kwtLogisticsOrder = kwtLogisticsOrderMapper.selectById(info.getLOrderId());
+            if (!ObjectUtils.isEmpty(kwtLogisticsOrder)) {
+                wayBillDetailDTO.setPriceType(kwtLogisticsOrder.getBillingMode());
+                SysDictResDto billingMode = remoteSystemService.queryDictByTypeAndValue(DictTypeEnum.CHARGING_TYPE.getType(), kwtLogisticsOrder.getBillingMode());
+                if (!ObjectUtils.isEmpty(billingMode)) {
+                    wayBillDetailDTO.setPriceTypeLabe(billingMode.getLabel());
+                }
+            }
+            wayBillDetailDTO.setCheckFirmName(info.getCheckFirmName());
+            // 运输量单位
+            wayBillDetailDTO.setUnit(info.getUnit() == null ? null : info.getUnit());
+            if (info.getUnit() != null) {
+                Map<String, SysDictResDto> unitType = remoteSystemService.queryDictMapByType(DictTypeEnum.UNIT_TYPE.getType());
+                SysDictResDto sysDict = unitType.get(info.getUnit());
+                wayBillDetailDTO.setUnitLabel(sysDict == null ? null : sysDict.getLabel());
+            }
+            // 派车人信息
+            UserCacheResDto createUser = remoteSystemService.queryUserCacheById(info.getCreateBy());
+            if (!ObjectUtils.isEmpty(createUser)) {
+                wayBillDetailDTO.setCreateByPhone(createUser.getPhone());
+            }
+            // 车辆信息
+            SysDictResDto truckTypeString = remoteSystemService.queryDictByTypeAndValue(DictTypeEnum.TRUCK_TYPE.getType(), info.getTruckType());
+            if (!ObjectUtils.isEmpty(truckTypeString)) {
+                waybillCarVO.setTypeLabel(truckTypeString.getLabel());
+            }
+            waybillCarVO.setTruckId(String.valueOf(info.getTruckId()));
+            waybillCarVO.setTruckNo(info.getTruckNo());
+            waybillCarVO.setType(info.getTruckType());
+            waybillCarVO.setDriverName(info.getDriverName());
+            waybillCarVO.setDriverPhone(info.getDriverPhone());
+            waybillCarVO.setDriverId(String.valueOf(info.getTruckId()));
+            waybillCarVO.setTrailerNo(info.getTruckTrailerNo());
+
+            // 单证信息
+            BigDecimal deficitLoss = info.getLoss() == null ? BigDecimal.valueOf(0) : info.getLoss();
+            BigDecimal loadAmount = info.getLoadAmount() == null ? new BigDecimal("0.00") : info.getLoadAmount();
+            BigDecimal unloadAmount = info.getUnloadAmount() == null ? new BigDecimal("0.00") : info.getUnloadAmount();
+            BigDecimal deficitRealAmount = commonService.deficitLossAmount( info.getLoadAmount(), loadAmount.subtract(unloadAmount), deficitLoss, info.getLossUnit());
+            waybillTicketVO = kwtWaybillOrderTicketService.agreement(id, String.valueOf(info.getDeficitAmount()), deficitRealAmount.toString());
+        }
+
+        List<Integer> statuses = initWaybillIndexStatus();
+        // 初始化各状态
+        List<WaybillStatusVO> statusVOS = new ArrayList<>();
+        statuses.forEach(e -> {
+            WaybillStatusVO waybillStatusVO = new WaybillStatusVO();
+            waybillStatusVO.setStatus(false);
+            if(e.equals(CarWaybillEnum.PENDING_ORDER.getCode())) {
+                // 默认选中 待接单 状态
+                waybillStatusVO.setStatus(true);
+            }
+            waybillStatusVO.setCode(e);
+            waybillStatusVO.setDestination(CarWaybillEnum.getName(e));
+            statusVOS.add(waybillStatusVO);
+        });
+
+        List<KwtWaybillOrderTrack> kwtWaybillOrderTracks = kwtWaybillOrderTrackMapper
+                .selectList(new LambdaQueryWrapper<KwtWaybillOrderTrack>()
+                        .eq(KwtWaybillOrderTrack::getWOrderId, id));
+        List<WaybillTrackVO> waybillTrackVOS = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(kwtWaybillOrderTracks)) {
+            List<Long> userIds = new ArrayList<>();
+            kwtWaybillOrderTracks.forEach(e -> userIds.add(e.getCreateBy()));
+            List<UserInfoVo> users = commonService.findUserList(userIds);
+            Map<Long, String> userNameMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            users.forEach(e -> userNameMap.put(e.getId(), e.getName()));
+            Map<Long, String> userPhoneMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+            users.forEach(e -> userPhoneMap.put(e.getId(), e.getPhone()));
+
+            for (KwtWaybillOrderTrack track : kwtWaybillOrderTracks) {
+                for (WaybillStatusVO statusVO : statusVOS) {
+                    if (statusVO.getCode().equals(track.getStatus())) {
+                        statusVO.setStatus(true);
+                        statusVO.setId(track.getId());
+                        statusVO.setCreateTime(DateUtil.getDateTime(track.getCreateTime()));
+                        statusVO.setOperateTime(DateUtil.getDateTime(track.getOperateTime()));
+                        statusVO.setCreateByName(userNameMap.get(track.getCreateBy()));
+                        break;
+                    }
+                }
+
+                WaybillTrackVO waybillTrackVO = new WaybillTrackVO();
+                waybillTrackVO.setId(String.valueOf(track.getId()))
+                        .setRemark(track.getRemark())
+                        .setStatus(String.valueOf(track.getStatus()))
+                        .setStatusLabel(CarWaybillEnum.getName(track.getStatus()))
+                        .setCreateBy(track.getCreateBy())
+                        .setCreateByPhone(userPhoneMap.get(track.getCreateBy()))
+                        .setCreateByName(userNameMap.get(track.getCreateBy()))
+                        .setCreateTime(DateUtil.getDateTime(track.getCreateTime()))
+                        .setOperateTime(DateUtil.getDateTime(track.getOperateTime()));
+                waybillTrackVOS.add(waybillTrackVO);
+            }
+        }
+
+        waybillDataVO.setAgreement(waybillTicketVO);
+        waybillDataVO.setCar(waybillCarVO);
+        waybillDataVO.setTransport(wayBillDetailDTO);
+        waybillDataVO.setProcess(statusVOS);
+        waybillTrackVOS = waybillTrackVOS.stream().sorted(Comparator.comparing(WaybillTrackVO::getCreateTime).reversed()).collect(Collectors.toList());
+        waybillDataVO.setLogs(waybillTrackVOS);
+        return HttpResult.ok(waybillDataVO);
+    }
+
+    /**
+     * 运单详情
+     *
+     * @param id
+     * @return
+     */
+    public HttpResult waybillDataOld(Long id) {
         if (Objects.isNull(id)) {
             return HttpResult.error("id不能为空");
         }
@@ -286,7 +450,7 @@ public class KwtWaybillManagementService {
             BeanUtils.copyPropertiesValue(waybillOrder, waybillSimpleDataVO);
             waybillSimpleDataVO.setWOrderId(waybillOrder.getId());
         } else {
-            KwtLogisticsOrderCirculate orderCirculate = orderCirculateDao.selectById(id);
+            KwtLogisticsOrderCirculate orderCirculate = orderCirculateMapper.selectById(id);
             if (orderCirculate == null) {
                 return HttpResult.error("车辆运单已不存在!");
             }

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

@@ -34,10 +34,7 @@ import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.transport.dao.*;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.dto.*;
-import com.sckw.transport.model.vo.LogisticsCountVo;
-import com.sckw.transport.model.vo.UserInfoVo;
-import com.sckw.transport.model.vo.WaybillCountVo;
-import com.sckw.transport.model.vo.WaybillOrderDriverVo;
+import com.sckw.transport.model.vo.*;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
 import lombok.extern.slf4j.Slf4j;
@@ -52,6 +49,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 /**
@@ -85,7 +83,11 @@ public class KwtWaybillOrderService {
     @Autowired
     KwtLogisticsOrderCirculateMapper logisticsOrderCirculateDao;
     @Autowired
-    CommonService commonService;
+    KwtWaybillOrderTicketService waybillOrderTicketService;
+    @Autowired
+    KwtLogisticsOrderGoodsService kwtLogisticsOrderGoodsService;
+    @Autowired
+    KwtCommonService commonService;
     @Resource
     private StreamBridge streamBridge;
     @DubboReference(version = "1.0.0", group = "design", check = false)
@@ -505,7 +507,7 @@ public class KwtWaybillOrderService {
         List<SckwWaybillOrder> sckwWaybillOrders = new ArrayList();
         for (SendCarDto1 sendCarDto : params) {
             /**KwtWaybillOrder数据组装**/
-            KwtWaybillOrder waybillOrder = this.setKwtWaybillOrder(sendCarDto);
+            KwtWaybillOrder waybillOrder = this.setKwtWaybillOrder(sendCarDto, logisticsOrder);
             /**数据存储**/
             if (sendCarDto.getType() == Global.NUMERICAL_ONE) {
                 for (int i = 0; i < sendCarDto.getCount(); i++) {
@@ -694,7 +696,7 @@ public class KwtWaybillOrderService {
      * @author zk
      * @date 2023/7/20
      **/
-    public KwtWaybillOrder setKwtWaybillOrder(SendCarDto1 sendCarDto) {
+    public KwtWaybillOrder setKwtWaybillOrder(SendCarDto1 sendCarDto, KwtLogisticsOrder logisticsOrder) {
         KwtWaybillOrder waybillOrder = new KwtWaybillOrder();
         waybillOrder.setEntId(LoginUserHolder.getEntId());
         waybillOrder.setLOrderId(sendCarDto.getLOrderId());
@@ -707,6 +709,7 @@ public class KwtWaybillOrderService {
         waybillOrder.setDriverName(sendCarDto.getDriverName());
         waybillOrder.setDriverPhone(sendCarDto.getDriverPhone());
         waybillOrder.setDriverIdcard(sendCarDto.getDriverIdcard());
+        waybillOrder.setUnit(logisticsOrder.getUnit());
         waybillOrder.setEntrustAmount(new BigDecimal(sendCarDto.getEntrustAmount()));
         waybillOrder.setUnloadAmount(new BigDecimal(Global.AMOUNT));
         waybillOrder.setLoadAmount(new BigDecimal(Global.AMOUNT));
@@ -1655,6 +1658,48 @@ public class KwtWaybillOrderService {
         return HttpResult.ok("装货成功!");
     }
 
+    /**
+     * @param params {}
+     * @desc 装货-多单位
+     * @author zk
+     * @date 2023/7/26
+     **/
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult loadingV1(WaybillOrderTicketV2Dto params) {
+        /**1数据校验**/
+        KwtWaybillOrder waybillOrder = waybillOrderDao.selectById(params.getWOrderId());
+        if (waybillOrder == null) {
+            return HttpResult.error("车辆运单不存在!");
+        }
+        //到达装货地车辆运单才能装货
+        if (waybillOrder.getStatus() != CarWaybillEnum.WAIT_LOADING.getCode()) {
+            return HttpResult.error("车辆运单当前状态已不能装货!");
+        }
+
+        /**2更新车辆运单**/
+        //装卸货信息
+        List<WaybillOrderTicketLoadingDto> loading = params.getLoading();
+        waybillOrder.setLoadAmount(waybillOrderTicketService.countAmount(loading, waybillOrder.getUnit(), waybillOrder.getLoadAmount()));
+        waybillOrder.setStatus(CarWaybillEnum.COMPLETION_LOADING.getCode());
+        waybillOrderDao.updateById(waybillOrder);
+
+        /**3新增运单状态记录**/
+        setWaybillOrderTrack(waybillOrder.getId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+
+        /**4新增装卸货榜单信息**/
+        waybillOrderTicketService.addTicket(loading, waybillOrder.getId(), params.getUrls(), params.getOperateTime(), Global.NUMERICAL_ONE);
+
+        /**5Mongodb数据更新**/
+        //1车辆运单
+        SckwWaybillOrder wOrder = new SckwWaybillOrder();
+        wOrder.set_id(waybillOrder.getId());
+        wOrder.setLoadAmount(waybillOrder.getLoadAmount());
+        wOrder.setLoadUrls(FileUtils.replaceAllBatch(params.getUrls()));
+        wOrder.setLoadTime(params.getOperateTime());
+        editSckwWaybillOrder(wOrder, waybillOrder, 2);
+        return HttpResult.ok("装货成功!");
+    }
+
     /**
      * @param params {}
      * @desc 到达卸货地点
@@ -1793,296 +1838,142 @@ public class KwtWaybillOrderService {
     }
 
     /**
-     * @param loadAmount    装货量
-     * @param deficitAmount 亏吨量
-     * @param loss          合理损耗
-     * @param goodsPrice    货值单价
-     * @desc 计算亏吨扣款
+     * @param params {}
+     * @desc 卸货-多单位
      * @author zk
-     * @date 2023/7/27
+     * @date 2023/7/26
      **/
-    public BigDecimal deficitPrice(BigDecimal loadAmount, BigDecimal deficitAmount, BigDecimal loss,
-                                   String lossUnit, BigDecimal goodsPrice) {
-        //亏吨<=0
-        if (deficitAmount.compareTo(new BigDecimal(Global.AMOUNT)) <= 0) {
-            return new BigDecimal(Global.AMOUNT);
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult unloadingV1(WaybillOrderTicketV2Dto params) {
+        /**1数据校验**/
+        KwtWaybillOrder waybillOrder = waybillOrderDao.selectById(params.getWOrderId());
+        if (waybillOrder == null) {
+            return HttpResult.error("车辆运单不存在!");
         }
-        //承运订单亏吨扣款=(承运订单亏吨量 -(承运订单装货量 * 承运订单合理损耗))* 扣亏货值
-        loss = loss == null ? new BigDecimal(Global.AMOUNT) : loss;
-        if (loss.doubleValue() > 0 && StringUtils.isNotBlank(lossUnit)) {
-            if (lossUnit.equals(String.valueOf(TaxRateTypeEnum.PERCENT.getCode()))) {
-                loss = loss.divide(new BigDecimal(TaxRateTypeEnum.PERCENT.getValue()));
-            }
-            if (lossUnit.equals(String.valueOf(TaxRateTypeEnum.MILLIMETER.getCode()))) {
-                loss = loss.divide(new BigDecimal(TaxRateTypeEnum.MILLIMETER.getValue()));
-            }
+        //到达卸货地车辆运单才能卸货
+        if (waybillOrder.getStatus() != CarWaybillEnum.WAIT_UNLOADING.getCode()) {
+            return HttpResult.error("车辆运单当前状态已不能装货!");
         }
 
-        goodsPrice = goodsPrice == null ? new BigDecimal(Global.AMOUNT) : goodsPrice;
-        BigDecimal deficitLossAmount = deficitAmount.subtract(loadAmount.multiply(loss).setScale(2, RoundingMode.HALF_UP));
-        //扣亏量=亏吨量-合理损耗值【要求大于0,如果小于0则扣亏货量取0】
-        if (deficitLossAmount.doubleValue() <= 0) {
-            return new BigDecimal(Global.AMOUNT);
-        }
-        //罚款值=扣亏量 * 扣亏货值
-        BigDecimal deficitPrice = deficitLossAmount.multiply(goodsPrice).setScale(4, RoundingMode.HALF_UP);
-        return deficitPrice;
-    }
+        /**2更新车辆运单**/
+        KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(waybillOrder.getLOrderId());
+        //装卸货信息
+        List<WaybillOrderTicketLoadingDto> loading = params.getLoading();
+        waybillOrder.setUnloadAmount(waybillOrderTicketService.countAmount(loading, waybillOrder.getUnit(), waybillOrder.getUnloadAmount()));
+        waybillOrder.setDeficitAmount(waybillOrder.getLoadAmount().subtract(waybillOrder.getUnloadAmount()));
+        BigDecimal deficitPrice = deficitPrice(waybillOrder.getLoadAmount(), waybillOrder.getDeficitAmount(),
+                logisticsOrder.getLoss(), logisticsOrder.getLossUnit(), logisticsOrder.getGoodsPrice());
+        waybillOrder.setDeficitPrice(deficitPrice);
+        waybillOrder.setStatus(CarWaybillEnum.COMPLETION_UNLOADING.getCode());
+        waybillOrderDao.updateById(waybillOrder);
 
-    /**
-     * @param lOrderId 承运订单ID
-     * @description 校验当前承运订单是否运输完成(修改状态 + 统计量)
-     * @author zk
-     * @date 2023/7/27
-     **/
-    public void checkLogisticsByStatus(Long lOrderId) {
-        /**
-         校验当前承运订单是否运输完成(虑该当前承运订单上下级物流订单)
-         1存在下级分包,下级物流订单和当前物流订单全部运输完成则修改当前物流订单状态为已完成(HAVE_FINISHED)、统计值
-         2当前物流订单属于分包:需要判断上级及同级分包全部运输完成修改上级物流订单状态为已完成(HAVE_FINISHED)、统计值-一直向上到一级物流订单
-         **/
+        /**3新增运单状态记录**/
+        setWaybillOrderTrack(waybillOrder.getId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
 
-        /**1存在下级分包**/
-        KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(lOrderId);
-        /**1-1校验下级分包是否全部运输完成**/
-        boolean subcontractBool = checkSubcontract(logisticsOrder);
+        /**4新增装卸货榜单信息**/
+        waybillOrderTicketService.addTicket(loading, waybillOrder.getId(), params.getUrls(), params.getOperateTime(), Global.NUMERICAL_TWO);
 
-        /**1-2校验当前承运订单是否运输完成**/
-        //车辆运单统计(运输中的物流订单+车辆运单审核通过)
-        WaybillCountVo waybillCount = waybillOrderDao.findWaybillOrderCount(new HashMap() {{
-            put("upperlOrderId", logisticsOrder.getId());
-            put("passStatus", Global.NUMERICAL_ONE);
-            put("logisticsStatus", LogisticsOrderEnum.IN_TRANSIT.getCode());
-        }});
-        //物流订单统计(运输完成后的物流订单)
-        LogisticsCountVo LogisticsCount = logisticsOrderDao.findLogisticsOrderCount(new HashMap() {{
-            put("upperlOrderId", logisticsOrder.getId());
-            put("finishedStatus", Global.NUMERICAL_ONE);
-        }});
+        /**5循环派车重置派车信息kwt_logistics_order_circulate**/
+        if (waybillOrder.getType() == Global.NUMERICAL_TWO) {
+            //循环派车信息
+            KwtLogisticsOrderCirculate circulate = logisticsOrderCirculateDao.findCirculate(waybillOrder.getLOrderId(),
+                    waybillOrder.getTruckId(), waybillOrder.getDriverId());
+            /*circulate.setWOrderId(null);
+            logisticsOrderCirculateDao.updateById(circulate);*/
+            Long newId = new IdWorker(Global.NUMERICAL_ONE).nextId();
+            logisticsOrderCirculateDao.updateIdByKey(newId, null, circulate.getId(), waybillOrder.getUpdateBy(), waybillOrder.getUpdateTime());
 
-        logisticsOrder.setTotalLoadAmount(waybillCount.getLoadAmount().add(LogisticsCount.getLoadAmount()));
-        logisticsOrder.setTotalUnloadAmount(waybillCount.getUnloadAmount().add(LogisticsCount.getUnloadAmount()));
-        logisticsOrderDao.updateById(logisticsOrder);
+            circulate = logisticsOrderCirculateDao.selectById(newId);
+            //Mongodb 重新生成一条运单数据
+            SckwWaybillOrder wOrder = setSckwWaybillOrder(circulate);
+            wOrder.setWOrderId(waybillOrder.getId());
+            editSckwWaybillOrder(wOrder, null, 3);
+        }
 
-        /**1-3更新贸易订单总量
-        if (logisticsLevel(logisticsOrder) == Global.NUMERICAL_ONE) {
-            //物流订单统计(运输完成后的物流订单)
-            LogisticsCountVo tradeCount = logisticsOrderDao.findLogisticsOrderCount(new HashMap<>() {{
-                put("tOrderId", logisticsOrder.getTOrderId());
-                put("level", Global.NUMERICAL_ONE);
-            }});
-            //查询贸易订单关联物流运单是否全部完结-totalUnfinished
-            WaybillCountVo tradeCount1 = waybillOrderDao.findWaybillOrderCount(new HashMap<>() {{
-                put("tOrderId", logisticsOrder.getTOrderId());
-            }});
-            UpdateActualAmountParam tradeOrder = new UpdateActualAmountParam();
-            tradeOrder.setTOrderId(logisticsOrder.getTOrderId());
-            tradeOrder.setActualLoadAmount(tradeCount.getLoadAmount());
-            tradeOrder.setActualUnloadAmount(tradeCount.getUnloadAmount());
-            tradeOrder.setUpdateBy(LoginUserHolder.getUserId());
-            tradeOrder.setUpdateByName(LoginUserHolder.getUserName());
-            tradeOrderInfoService.updateActualAmount(tradeOrder);
-        }**/ //与物流订单完结订单统计履约量统计重复,该处适用于物流订单自动完结
+        /**6跟新司机/车辆数据**/
+        //更新司机信息
+        editDriver(waybillOrder.getDriverId());
+        //更新车辆信息
+        editTruck(waybillOrder.getTruckId());
 
-        /**1-4Mongodb数据更新**/
-        //承运订单
-        SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
-        lOrder.setTotalLoadAmount(logisticsOrder.getTotalLoadAmount());
-        lOrder.setTotalUnloadAmount(logisticsOrder.getTotalUnloadAmount());
-        editSckwLogisticsOrder(lOrder, logisticsOrder);
+        /**7更新承运订单entrustAmount
+         //更新卸货量/卸货时间/亏吨/亏吨扣款
+         //承运订单卸货量=承运订单原卸货量+当前车辆运单卸货量
+         BigDecimal unloadAmount = logisticsOrder.getUnloadAmount() == null ? new BigDecimal(Global.AMOUNT) : logisticsOrder.getUnloadAmount();
+         logisticsOrder.setUnloadAmount(unloadAmount.add(waybillOrder.getUnloadAmount()));
+         logisticsOrder.setUnloadTime(waybillOrder.getUpdateTime());
+         //承运订单亏吨量=承运订单装货量-承运订单卸货量
+         logisticsOrder.setDeficitAmount(logisticsOrder.getLoadAmount().subtract(logisticsOrder.getUnloadAmount()));
+         //承运订单亏吨扣款
+         deficitPrice = deficitPrice(logisticsOrder.getLoadAmount(), logisticsOrder.getDeficitAmount(),
+         logisticsOrder.getLoss(), logisticsOrder.getGoodsPrice());
+         logisticsOrder.setDeficitPrice(deficitPrice);
+         logisticsOrderDao.updateById(logisticsOrder);**/
 
-        /**2当前物流订单属于分包(存在上级物流订单)**/
-        //获取所有上级物流订单ID(当前物流订单ID除外)
-        String pids = logisticsOrder.getPids();
-        if (StringUtils.isNotBlank(pids)) {
-            String[] idArray = pids.split(Global.COMMA);
-            for (String id : idArray) {
-                Long pid = Long.parseLong(id);
-                //当前物流订单ID除外
-                if (!pid.equals(lOrderId)) {
-                    /**校验当前承运订单是否运输完成**/
-                    checkLogisticsByStatus(pid);
-                }
-            }
-        }
+        /**8Mongodb数据更新**/
+        //1车辆运单
+        SckwWaybillOrder wOrder = new SckwWaybillOrder();
+        wOrder.set_id(waybillOrder.getId());
+        wOrder.setUnloadAmount(waybillOrder.getUnloadAmount());
+        wOrder.setDeficitAmount(waybillOrder.getDeficitAmount());
+        wOrder.setDeficitPrice(waybillOrder.getDeficitPrice());
+        wOrder.setUnloadUrls(FileUtils.replaceAllBatch(params.getUrls()));
+        wOrder.setUnloadTime(params.getOperateTime());
+        editSckwWaybillOrder(wOrder, waybillOrder, 2);
+
+        //2承运订单
+        /*SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
+        lOrder.setUnloadTime(logisticsOrder.getUnloadTime());
+        lOrder.setUnloadAmount(logisticsOrder.getUnloadAmount());
+        lOrder.setDeficitAmount(logisticsOrder.getDeficitAmount());
+        lOrder.setDeficitPrice(logisticsOrder.getDeficitPrice());
+        editSckwLogisticsOrder(lOrder, logisticsOrder);*/
+
+        /**9发送消息**/
+
+        return HttpResult.ok("卸货成功!");
     }
 
     /**
-     * @param lOrderId 承运订单ID
-     * @description 校验当前承运订单是否运输完成(修改状态 + 统计量)
+     * @param params {}
+     * @desc 修改单证
      * @author zk
-     * @date 2023/7/27
+     * @date 2023/7/26
      **/
-    public void checkLogisticsByStatusV1(Long lOrderId) {
-        /**
-         校验当前承运订单是否运输完成(虑该当前承运订单上下级物流订单)
-         1存在下级分包,下级物流订单和当前物流订单全部运输完成则修改当前物流订单状态为已完成(HAVE_FINISHED)、统计值
-         2当前物流订单属于分包:需要判断上级及同级分包全部运输完成修改上级物流订单状态为已完成(HAVE_FINISHED)、统计值-一直向上到一级物流订单
-         **/
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult editTicket(WaybillOrderTicketDto params) {
+        /**1校验**/
+        KwtWaybillOrder waybillOrder = waybillOrderDao.selectById(params.getWOrderId());
+        if (waybillOrder == null) {
+            return HttpResult.error("车辆运单信息不存在!");
+        }
+        KwtWaybillOrderTicket ticket = null;//waybillOrderTicketDao.findWaybillOrderTicket(params.getWOrderId(), params.getType());
+        if (ticket == null) {
+            return HttpResult.error("车辆运单榜单信息不存在!");
+        }
+        if (params.getType() == Global.NUMERICAL_ONE && (waybillOrder.getStatus() != CarWaybillEnum.COMPLETION_LOADING.getCode()
+                && waybillOrder.getStatus() != CarWaybillEnum.WAIT_UNLOADING.getCode()
+                && waybillOrder.getStatus() != CarWaybillEnum.COMPLETION_UNLOADING.getCode())) {
+            return HttpResult.error("当前运单不能编辑装货榜单!");
+        }
+        if (params.getType() == Global.NUMERICAL_TWO && waybillOrder.getStatus() != CarWaybillEnum.COMPLETION_UNLOADING.getCode()) {
+            return HttpResult.error("当前运单不能编辑卸货榜单!");
+        }
 
-        /**1存在下级分包**/
-        KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(lOrderId);
-        /**1-1校验下级分包是否全部运输完成**/
-        boolean subcontractBool = checkSubcontract(logisticsOrder);
+        /**2更新车辆运单信息**/
+        KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(waybillOrder.getLOrderId());
+        waybillOrder.setLoadAmount(params.getType() == Global.NUMERICAL_ONE ? params.getAmount() : waybillOrder.getLoadAmount());
+        waybillOrder.setUnloadAmount(params.getType() == Global.NUMERICAL_TWO ? params.getAmount() : waybillOrder.getUnloadAmount());
+        waybillOrder.setDeficitAmount(waybillOrder.getLoadAmount().subtract(waybillOrder.getUnloadAmount()));
+        BigDecimal deficitPrice = deficitPrice(waybillOrder.getLoadAmount(), waybillOrder.getDeficitAmount(),
+                logisticsOrder.getLoss(), logisticsOrder.getLossUnit(), logisticsOrder.getGoodsPrice());
+        waybillOrder.setDeficitPrice(deficitPrice);
+        waybillOrderDao.updateById(waybillOrder);
 
-        /**1-2校验当前承运订单是否运输完成**/
-        //车辆运单统计(运输中的物流订单+车辆运单审核通过)
-        WaybillCountVo waybillCount = waybillOrderDao.findWaybillOrderCount(new HashMap() {{
-            put("upperlOrderId", logisticsOrder.getId());
-            put("passStatus", Global.NUMERICAL_ONE);
-            put("logisticsStatus", LogisticsOrderEnum.IN_TRANSIT.getCode());
-        }});
-        //物流订单统计(运输完成后的物流订单)
-        LogisticsCountVo LogisticsCount = logisticsOrderDao.findLogisticsOrderCount(new HashMap() {{
-            put("upperlOrderId", logisticsOrder.getId());
-            put("finishedStatus", Global.NUMERICAL_ONE);
-        }});
-
-        logisticsOrder.setTotalLoadAmount(waybillCount.getLoadAmount().add(LogisticsCount.getLoadAmount()));
-        logisticsOrder.setTotalUnloadAmount(waybillCount.getUnloadAmount().add(LogisticsCount.getUnloadAmount()));
-        BigDecimal subcontractAmount = logisticsOrder.getSubcontractAmount() == null ? new BigDecimal(Global.AMOUNT) : logisticsOrder.getSubcontractAmount();
-        //物流运单状态(不包含已完成、已对账、已结算)+ 物流订单上级委派量-下游分包总量 <= 自己承运总装货量 + 下级分包全部运输完成
-        if (!LogisticsOrderEnum.transportCompleted(logisticsOrder.getStatus())
-                && logisticsOrder.getAmount().subtract(subcontractAmount).compareTo(waybillCount.getLoadAmount()) <= 0
-                && subcontractBool) {
-            //---------------------------------------------zk 2023-08-01 全量可运
-            /**1-3下级分包承运订单运输完成**/
-            logisticsOrder.setStatus(LogisticsOrderEnum.HAVE_FINISHED.getCode());//取消自动完结
-            logisticsOrderDao.updateById(logisticsOrder);
-
-            /**1-4承运订单状态记录**/
-            KwtLogisticsOrderTrack orderTrack = new KwtLogisticsOrderTrack();
-            orderTrack.setLOrderId(logisticsOrder.getId());
-            orderTrack.setStatus(logisticsOrder.getStatus());
-            orderTrack.setRemark(LogisticsOrderEnum.getName(logisticsOrder.getStatus()));
-            logisticsOrderTrackDao.insert(orderTrack);
-
-            /**1-5循环派车失效kwt_logistics_order_circulate**/
-            //循环派车信息
-            List<KwtLogisticsOrderCirculate> circulates = logisticsOrderCirculateDao.findCirculateList(logisticsOrder.getId(), null, null, 0);
-            for (KwtLogisticsOrderCirculate circulate : circulates) {
-                circulate.setStatus(Global.NUMERICAL_ONE);
-                logisticsOrderCirculateDao.updateById(circulate);
-
-                //车辆订单-Mongodb数据更新
-                SckwWaybillOrder wOrder = new SckwWaybillOrder();
-                wOrder.set_id(circulate.getId());
-                KwtWaybillOrder waybillOrder = new KwtWaybillOrder();
-                waybillOrder.setStatus(CarWaybillEnum.REVOKED.getCode());
-                waybillOrder.setUpdateTime(circulate.getUpdateTime());
-                waybillOrder.setUpdateBy(circulate.getUpdateBy());
-                editSckwWaybillOrder(wOrder, waybillOrder, 2);
-            }
-        } else {
-            logisticsOrderDao.updateById(logisticsOrder);
-        }
-
-        /**1-6更新贸易订单总量**/
-        if (logisticsLevel(logisticsOrder) == Global.NUMERICAL_ONE) {
-            //查询贸易订单总装货量/总卸货量
-            WaybillCountVo tradeCount = waybillOrderDao.findWaybillOrderCount(new HashMap() {{
-                put("tOrderId", logisticsOrder.getTOrderId());
-                put("passStatus", Global.NUMERICAL_ONE);
-            }});
-            CompleteLogisticsOrderParam tradeOrder = new CompleteLogisticsOrderParam();
-            tradeOrder.setTOrderId(logisticsOrder.getTOrderId());
-            tradeOrder.setActualLoadAmount(tradeCount.getLoadAmount());
-            tradeOrder.setActualUnloadAmount(tradeCount.getUnloadAmount());
-            tradeOrder.setUpdateBy(LoginUserHolder.getUserId());
-            tradeOrder.setUpdateByName(LoginUserHolder.getUserName());
-            tradeOrderInfoService.completeLogisticsOrder(tradeOrder);
-        }
-
-        /**1-7Mongodb数据更新**/
-        //承运订单
-        SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
-        lOrder.setTotalLoadAmount(waybillCount.getLoadAmount());
-        lOrder.setTotalUnloadAmount(waybillCount.getUnloadAmount());
-        editSckwLogisticsOrder(lOrder, logisticsOrder);
-
-        /**2当前物流订单属于分包(存在上级物流订单)**/
-        //获取所有上级物流订单ID(当前物流订单ID除外)
-        String pids = logisticsOrder.getPids();
-        if (StringUtils.isNotBlank(pids)) {
-            String[] idArray = pids.split(Global.COMMA);
-            for (String id : idArray) {
-                Long pid = Long.parseLong(id);
-                //当前物流订单ID除外
-                if (!pid.equals(lOrderId)) {
-                    /**校验当前承运订单是否运输完成**/
-                    checkLogisticsByStatus(pid);
-                }
-            }
-        }
-    }
-
-    /**
-     * @param logisticsOrder 物流订单
-     * @desc 校验下级分包是否全部运输完成
-     * @author zk
-     * @date 2023/7/26
-     **/
-    public boolean checkSubcontract(KwtLogisticsOrder logisticsOrder) {
-        boolean subcontractBool = true;
-        BigDecimal subcontractAmount = logisticsOrder.getSubcontractAmount() == null ? new BigDecimal(Global.AMOUNT) : logisticsOrder.getSubcontractAmount();
-        if (subcontractAmount.compareTo(new BigDecimal(Global.AMOUNT)) > 0) {
-            /**1-1校验下级分包是否全部运输完成**/
-            List<KwtLogisticsOrder> logisticsOrders = logisticsOrderDao.findLogisticsOrder(
-                    new HashMap() {{
-                        put("upperlOrderId", logisticsOrder.getId());
-                        put("ownOrderId", logisticsOrder.getId());
-                    }});
-            for (KwtLogisticsOrder logisticsOrder1 : logisticsOrders) {
-                if (!LogisticsOrderEnum.transportCompleted(logisticsOrder1.getStatus())) {
-                    //下级分包承运订单运输未完成
-                    subcontractBool = false;
-                    continue;
-                }
-            }
-        }
-        return subcontractBool;
-    }
-
-    /**
-     * @param params {}
-     * @desc 修改单证
-     * @author zk
-     * @date 2023/7/26
-     **/
-    @Transactional(rollbackFor = Exception.class)
-    public HttpResult editTicket(WaybillOrderTicketDto params) {
-        /**1校验**/
-        KwtWaybillOrder waybillOrder = waybillOrderDao.selectById(params.getWOrderId());
-        if (waybillOrder == null) {
-            return HttpResult.error("车辆运单信息不存在!");
-        }
-        KwtWaybillOrderTicket ticket = waybillOrderTicketDao.findWaybillOrderTicket(params.getWOrderId(), params.getType());
-        if (ticket == null) {
-            return HttpResult.error("车辆运单榜单信息不存在!");
-        }
-        if (params.getType() == Global.NUMERICAL_ONE && (waybillOrder.getStatus() != CarWaybillEnum.COMPLETION_LOADING.getCode()
-                && waybillOrder.getStatus() != CarWaybillEnum.WAIT_UNLOADING.getCode()
-                && waybillOrder.getStatus() != CarWaybillEnum.COMPLETION_UNLOADING.getCode())) {
-            return HttpResult.error("当前运单不能编辑装货榜单!");
-        }
-        if (params.getType() == Global.NUMERICAL_TWO && waybillOrder.getStatus() != CarWaybillEnum.COMPLETION_UNLOADING.getCode()) {
-            return HttpResult.error("当前运单不能编辑卸货榜单!");
-        }
-
-        /**2更新车辆运单信息**/
-        KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(waybillOrder.getLOrderId());
-        waybillOrder.setLoadAmount(params.getType() == Global.NUMERICAL_ONE ? params.getAmount() : waybillOrder.getLoadAmount());
-        waybillOrder.setUnloadAmount(params.getType() == Global.NUMERICAL_TWO ? params.getAmount() : waybillOrder.getUnloadAmount());
-        waybillOrder.setDeficitAmount(waybillOrder.getLoadAmount().subtract(waybillOrder.getUnloadAmount()));
-        BigDecimal deficitPrice = deficitPrice(waybillOrder.getLoadAmount(), waybillOrder.getDeficitAmount(),
-                logisticsOrder.getLoss(), logisticsOrder.getLossUnit(), logisticsOrder.getGoodsPrice());
-        waybillOrder.setDeficitPrice(deficitPrice);
-        waybillOrderDao.updateById(waybillOrder);
-
-        /**3更新榜单信息**/
-        BeanUtils.copyProperties(params, ticket);
-        ticket.setUrls(FileUtils.replaceAllBatch(ticket.getUrls()));
-        waybillOrderTicketDao.updateById(ticket);
+        /**3更新榜单信息**/
+        BeanUtils.copyProperties(params, ticket);
+        ticket.setUrls(FileUtils.replaceAllBatch(ticket.getUrls()));
+        waybillOrderTicketDao.updateById(ticket);
 
         /**4Mongodb数据更新**/
         //1车辆运单
@@ -2111,7 +2002,7 @@ public class KwtWaybillOrderService {
 
     /**
      * @param params {}
-     * @desc 单证审核(编辑单证)
+     * @desc 修改单证-装卸货
      * @author zk
      * @date 2023/7/26
      **/
@@ -2140,12 +2031,12 @@ public class KwtWaybillOrderService {
         waybillOrderDao.updateById(waybillOrder);
 
         /**3更新榜单信息**/
-        KwtWaybillOrderTicket loadTicket = waybillOrderTicketDao.findWaybillOrderTicket(params.getWOrderId(), Global.NUMERICAL_ONE);
+        KwtWaybillOrderTicket loadTicket = null;//waybillOrderTicketDao.findWaybillOrderTicket(params.getWOrderId(), Global.NUMERICAL_ONE);
         loadTicket.setAmount(params.getLoadAmount());
         loadTicket.setUrls(FileUtils.replaceAllBatch(params.getLoadUrls()));
         loadTicket.setOperateTime(params.getLoadOperateTime());
         waybillOrderTicketDao.updateById(loadTicket);
-        KwtWaybillOrderTicket unloadTicket = waybillOrderTicketDao.findWaybillOrderTicket(params.getWOrderId(), Global.NUMERICAL_TWO);
+        KwtWaybillOrderTicket unloadTicket = null;//waybillOrderTicketDao.findWaybillOrderTicket(params.getWOrderId(), Global.NUMERICAL_TWO);
         unloadTicket.setAmount(params.getUnloadAmount());
         unloadTicket.setUrls(FileUtils.replaceAllBatch(params.getUnloadUrls()));
         unloadTicket.setOperateTime(params.getUnloadOperateTime());
@@ -2173,6 +2064,63 @@ public class KwtWaybillOrderService {
         return HttpResult.ok("车辆运单单证更新完成!");
     }
 
+    /**
+     * @param params {}
+     * @desc 修改单证-装卸货-多单位
+     * @author zk
+     * @date 2023/7/26
+     **/
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult editTicketV1(WaybillOrderTicketV3Dto params) {
+        /**1数据校验**/
+        KwtWaybillOrder waybillOrder = waybillOrderDao.selectById(params.getWOrderId());
+        if (waybillOrder == null) {
+            return HttpResult.error("车辆运单不存在!");
+        }
+        //已卸货/审批不通过车辆运单才能审核
+        if (waybillOrder.getStatus() != CarWaybillEnum.COMPLETION_UNLOADING.getCode()
+                && waybillOrder.getStatus() != CarWaybillEnum.APPROVAL_NO_PASS.getCode()) {
+            return HttpResult.error("车辆运单当前状态不能编辑!");
+        }
+
+        /**2更新车辆运单**/
+        KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(waybillOrder.getLOrderId());
+        //装卸货信息
+        List<WaybillOrderTicketLoadingDto> load = params.getLoad();
+        List<WaybillOrderTicketLoadingDto> unload = params.getLoad();
+        waybillOrder.setLoadAmount(waybillOrderTicketService.countAmount(load, waybillOrder.getUnit(), waybillOrder.getLoadAmount()));
+        waybillOrder.setUnloadAmount(waybillOrderTicketService.countAmount(unload, waybillOrder.getUnit(), waybillOrder.getUnloadAmount()));
+        waybillOrder.setDeficitAmount(waybillOrder.getLoadAmount().subtract(waybillOrder.getUnloadAmount()));
+        BigDecimal deficitPrice = deficitPrice(waybillOrder.getLoadAmount(), waybillOrder.getDeficitAmount(),
+                logisticsOrder.getLoss(), logisticsOrder.getLossUnit(), logisticsOrder.getGoodsPrice());
+        waybillOrder.setDeficitPrice(deficitPrice);
+        waybillOrder.setStatus(CarWaybillEnum.APPROVAL_IN.getCode());
+        waybillOrderDao.updateById(waybillOrder);
+
+        /**3更新榜单信息**/
+        waybillOrderTicketService.editTicket(load, waybillOrder.getId(), params.getLoadUrls(), params.getLoadOperateTime(), Global.NUMERICAL_ONE);
+        waybillOrderTicketService.editTicket(unload, waybillOrder.getId(), params.getUnloadUrls(), params.getUnloadOperateTime(), Global.NUMERICAL_TWO);
+
+        /**4新增运单状态记录**/
+        setWaybillOrderTrack(waybillOrder.getId(), waybillOrder.getUpdateTime(), waybillOrder.getStatus(), params.getRemark());
+
+        /**5Mongodb数据更新**/
+        //1车辆运单
+        SckwWaybillOrder wOrder = new SckwWaybillOrder();
+        wOrder.set_id(waybillOrder.getId());
+        wOrder.setLoadAmount(waybillOrder.getLoadAmount());
+        wOrder.setLoadTime(params.getLoadOperateTime());
+        wOrder.setLoadUrls(FileUtils.replaceAllBatch(params.getLoadUrls()));
+        wOrder.setUnloadAmount(waybillOrder.getUnloadAmount());
+        wOrder.setUnloadTime(params.getUnloadOperateTime());
+        wOrder.setUnloadUrls(FileUtils.replaceAllBatch(params.getUnloadUrls()));
+        wOrder.setDeficitAmount(waybillOrder.getDeficitAmount());
+        wOrder.setDeficitPrice(waybillOrder.getDeficitPrice());
+        editSckwWaybillOrder(wOrder, waybillOrder, Global.NUMERICAL_TWO);
+
+        return HttpResult.ok("车辆运单单证更新完成!");
+    }
+
     /**
      * @param wOrderId
      * @desc 修改单证查询运单
@@ -2185,10 +2133,88 @@ public class KwtWaybillOrderService {
         if (waybillOrder == null) {
             return HttpResult.error("车辆运单信息不存在!");
         }
+
+        //装货榜单
+        List<KwtWaybillOrderTicket> loadTickets = waybillOrderTicketDao.findWaybillOrderTicket(wOrderId, NumberConstant.ONE);
+        KwtWaybillOrderTicket loadTicket = CollectionUtils.isNotEmpty(loadTickets) ? loadTickets.get(NumberConstant.ZERO) : null;
+        List<WaybillOrderLoadingVO> loadLoading = waybillOrderTicketService.agreement(wOrderId, NumberConstant.ONE);
+        //卸货榜单
+        List<KwtWaybillOrderTicket> unloadTickets = waybillOrderTicketDao.findWaybillOrderTicket(wOrderId, NumberConstant.TWO);
+        KwtWaybillOrderTicket unloadTicket = CollectionUtils.isNotEmpty(unloadTickets) ? unloadTickets.get(NumberConstant.ZERO) : null;
+        List<WaybillOrderLoadingVO> unloadLoading = waybillOrderTicketService.agreement(wOrderId, NumberConstant.TWO);
+
+        //装货地址
+        KwtWaybillOrderAddress loadAddress = this.getAddress(waybillOrder.getId(), NumberConstant.ONE, NumberConstant.TWO);
+        //卸货地址
+        KwtWaybillOrderAddress unloadAddress = this.getAddress(waybillOrder.getId(), Global.NUMERICAL_TWO, NumberConstant.TWO);
+        //商品信息
+        KwtLogisticsOrderGoods goods = logisticsOrderGoodsDao.findByGoods(waybillOrder.getLOrderId());
+        //审批意见
+        KwtWaybillOrderTrack track = waybillOrderTrackDao.findWaybillOrderTrack(waybillOrder.getId(), CarWaybillEnum.APPROVAL_NO_PASS.getCode());
+
+        //用户数据集
+        List<Long> createBys = new ArrayList() {{
+            add(loadTicket != null ? loadTicket.getUpdateBy() : null);
+            add(unloadTicket != null ? unloadTicket.getUpdateBy() : null);
+            add(track != null ? track.getCreateBy() : null);
+        }};
+        createBys = createBys.stream().distinct().collect(Collectors.toList());
+        List<UserInfoVo> users = commonService.findUserList(createBys);
+        Map<Long, String> usersMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        users.forEach(e -> usersMap.put(e.getId(), e.getName()));
+
+        Map result = new HashMap();
+        result.put("wOrderId", wOrderId);
+        result.put("wOrderNo", waybillOrder.getWOrderNo());
+        result.put("status", waybillOrder.getStatus());
+        result.put("truckNo", waybillOrder.getTruckNo());
+        result.put("driverName", waybillOrder.getDriverName());
+        result.put("driverPhone", waybillOrder.getDriverPhone());
+        result.put("driverIdcard", waybillOrder.getDriverIdcard());
+        result.put("goodsName", goods != null ? goods.getGoodsName() : null);
+        result.put("loadStatus", loadTicket != null ? 0 : 1);
+        result.put("loadLoading", loadLoading);
+
+        result.put("loadUrls", loadTicket != null ? FileUtils.spliceBatch(loadTicket.getUrls()) : null);
+        result.put("loadOperateTime", loadTicket != null ? DateUtil.dateTimeFormatter(loadTicket.getOperateTime()) : null);
+        result.put("loadCreateTime", loadTicket != null ? DateUtil.dateTimeFormatter(loadTicket.getCreateTime()) : null);
+        result.put("loadCreateByName", usersMap.get(loadTicket.getUpdateBy()));
+        result.put("loadCityName", loadAddress != null ? loadAddress.getCityName() : null);
+        result.put("loadDetailAddress", loadAddress != null ? loadAddress.getDetailAddress() : null);
+        result.put("unloadStatus", loadTicket != null ? 0 : 1);
+        result.put("unloadLoading", unloadLoading);
+
+        result.put("unloadUrls", unloadTicket != null ? FileUtils.spliceBatch(unloadTicket.getUrls()) : null);
+        result.put("unloadOperateTime", unloadTicket != null ? DateUtil.dateTimeFormatter(unloadTicket.getOperateTime()) : null);
+        result.put("unloadCreateTime", unloadTicket != null ? DateUtil.dateTimeFormatter(unloadTicket.getCreateTime()) : null);
+        result.put("unloadCreateByName", unloadTicket != null ? usersMap.get(unloadTicket.getUpdateBy()) : null);
+        result.put("unloadCityName", unloadAddress != null ? unloadAddress.getCityName() : null);
+        result.put("unloadDetailAddress", unloadAddress != null ? unloadAddress.getDetailAddress() : null);
+        result.put("approvalTime", track != null ? DateUtils.formatV1(track.getCreateTime()) : null);
+        result.put("approvalOpinions", track != null ? track.getRemark() : null);
+        result.put("approver", usersMap.get(track != null ? track.getUpdateBy() : null));
+        return HttpResult.ok(result);
+    }
+
+    /**
+     * @param wOrderId
+     * @desc 修改单证查询运单
+     * @author zk
+     * @date 2023/8/10
+     **/
+    public HttpResult ticketWaybillOrderOld(Long wOrderId) {
+        //车辆运单信息
+        KwtWaybillOrder waybillOrder = waybillOrderDao.selectById(wOrderId);
+        if (waybillOrder == null) {
+            return HttpResult.error("车辆运单信息不存在!");
+        }
         //装货榜单
-        KwtWaybillOrderTicket loadTicket = waybillOrderTicketDao.findWaybillOrderTicket(wOrderId, Global.NUMERICAL_ONE);
+        List<KwtWaybillOrderTicket> loadTickets = waybillOrderTicketDao.findWaybillOrderTicket(wOrderId, NumberConstant.ONE);
+        KwtWaybillOrderTicket loadTicket = CollectionUtils.isNotEmpty(loadTickets) ? loadTickets.get(NumberConstant.ZERO) : null;
         //卸货榜单
-        KwtWaybillOrderTicket unloadTicket = waybillOrderTicketDao.findWaybillOrderTicket(wOrderId, Global.NUMERICAL_TWO);
+        List<KwtWaybillOrderTicket> unloadTickets = waybillOrderTicketDao.findWaybillOrderTicket(wOrderId, NumberConstant.TWO);
+        KwtWaybillOrderTicket unloadTicket = CollectionUtils.isNotEmpty(unloadTickets) ? unloadTickets.get(NumberConstant.ZERO) : null;
+
         //装货地址
         KwtWaybillOrderAddress loadAddress = this.getAddress(waybillOrder.getId(), Global.NUMERICAL_ONE, Global.NUMERICAL_TWO);
         //卸货地址
@@ -2363,12 +2389,13 @@ public class KwtWaybillOrderService {
         waybillOrderDao.updateById(waybillOrder);
 
         /**3更新榜单信息**/
-        KwtWaybillOrderTicket loadTicket = waybillOrderTicketDao.findWaybillOrderTicket(params.getWOrderId(), Global.NUMERICAL_ONE);
+        KwtWaybillOrderTicket loadTicket = null;//waybillOrderTicketDao.findWaybillOrderTicket(params.getWOrderId(), Global.NUMERICAL_ONE);
         loadTicket.setAmount(params.getLoadAmount());
         loadTicket.setUrls(FileUtils.replaceAllBatch(params.getLoadUrls()));
         loadTicket.setOperateTime(params.getLoadOperateTime());
         waybillOrderTicketDao.updateById(loadTicket);
-        KwtWaybillOrderTicket unloadTicket = waybillOrderTicketDao.findWaybillOrderTicket(params.getWOrderId(), Global.NUMERICAL_TWO);
+
+        KwtWaybillOrderTicket unloadTicket = null;//waybillOrderTicketDao.findWaybillOrderTicket(params.getWOrderId(), Global.NUMERICAL_TWO);
         unloadTicket.setAmount(params.getUnloadAmount());
         unloadTicket.setUrls(FileUtils.replaceAllBatch(params.getUnloadUrls()));
         unloadTicket.setOperateTime(params.getUnloadOperateTime());
@@ -2438,6 +2465,115 @@ public class KwtWaybillOrderService {
         return HttpResult.ok("车辆运单审核完成!");
     }
 
+    /**
+     * @param params {}
+     * @desc 单证审核(编辑单证)-多单位
+     * @author zk
+     * @date 2023/7/26
+     **/
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult approvalEditTicketV1(WaybillOrderTicketApprovalV1Dto params) {
+        /**1数据校验**/
+        KwtWaybillOrder waybillOrder = waybillOrderDao.selectById(params.getWOrderId());
+        if (waybillOrder == null) {
+            return HttpResult.error("车辆运单不存在!");
+        }
+        //已卸货/审批不通过车辆运单才能审核
+        if (waybillOrder.getStatus() != CarWaybillEnum.COMPLETION_UNLOADING.getCode()
+                && waybillOrder.getStatus() != CarWaybillEnum.APPROVAL_NO_PASS.getCode()
+                && waybillOrder.getStatus() != CarWaybillEnum.APPROVAL_IN.getCode()) {
+            return HttpResult.error("车辆运单当前状态已不能审核!");
+        }
+        //已卸货/审批不通过车辆运单只能审批通过或审批不通过
+        if (params.getStatus() != Global.NO && params.getStatus() != Global.YES) {
+            return HttpResult.error("车辆运单当前状态只能审批通过或审批不通过!");
+        }
+
+        /**2更新车辆运单**/
+        KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(waybillOrder.getLOrderId());
+        int status = params.getStatus() == Global.NO ? CarWaybillEnum.APPROVAL_PASS.getCode() : CarWaybillEnum.APPROVAL_NO_PASS.getCode();
+        //装卸货信息
+        List<WaybillOrderTicketLoadingDto> load = params.getLoad();
+        List<WaybillOrderTicketLoadingDto> unload = params.getLoad();
+        waybillOrder.setLoadAmount(waybillOrderTicketService.countAmount(load, waybillOrder.getUnit(), waybillOrder.getLoadAmount()));
+        waybillOrder.setUnloadAmount(waybillOrderTicketService.countAmount(unload, waybillOrder.getUnit(), waybillOrder.getUnloadAmount()));
+        waybillOrder.setDeficitAmount(waybillOrder.getLoadAmount().subtract(waybillOrder.getUnloadAmount()));
+        BigDecimal deficitPrice = deficitPrice(waybillOrder.getLoadAmount(), waybillOrder.getDeficitAmount(),
+                logisticsOrder.getLoss(), logisticsOrder.getLossUnit(), logisticsOrder.getGoodsPrice());
+        waybillOrder.setDeficitPrice(deficitPrice);
+        waybillOrder.setStatus(status);
+        waybillOrderDao.updateById(waybillOrder);
+
+
+        /**3更新榜单信息**/
+        waybillOrderTicketService.editTicket(load, waybillOrder.getId(), params.getLoadUrls(), params.getLoadOperateTime(), Global.NUMERICAL_ONE);
+        waybillOrderTicketService.editTicket(unload, waybillOrder.getId(), params.getUnloadUrls(), params.getUnloadOperateTime(), Global.NUMERICAL_TWO);
+
+        /**4新增运单状态记录**/
+        setWaybillOrderTrack(waybillOrder.getId(), waybillOrder.getUpdateTime(), waybillOrder.getStatus(), params.getRemark());
+
+        if (waybillOrder.getStatus() == CarWaybillEnum.APPROVAL_PASS.getCode()) {
+            /**5跟新司机/车辆数据**/
+            //更新司机信息
+            editDriver(waybillOrder.getDriverId());
+            //更新车辆信息
+            editTruck(waybillOrder.getTruckId());
+
+            /**6更新承运订单信息**/
+            //更新卸货量/卸货时间/亏吨/亏吨扣款
+            Map queryParams = new HashMap();
+            queryParams.put("lOrderId", waybillOrder.getLOrderId());
+            queryParams.put("passStatus", Global.NUMERICAL_ONE);
+            WaybillCountVo waybillCount = waybillOrderDao.findWaybillOrderCount(queryParams);
+
+            //委派未运量=承运委派量-装货量
+            BigDecimal residue = waybillOrder.getEntrustAmount().subtract(waybillOrder.getLoadAmount());
+            logisticsOrder.setEntrustAmount(logisticsOrder.getEntrustAmount().subtract(residue));
+            logisticsOrder.setLoadAmount(waybillCount.getLoadAmount());
+            logisticsOrder.setLoadTime(waybillCount.getLoadTime());
+            logisticsOrder.setUnloadAmount(waybillCount.getUnloadAmount());
+            logisticsOrder.setUnloadTime(waybillCount.getUnloadTime());
+            logisticsOrder.setDeficitAmount(waybillCount.getDeficitAmount());
+            deficitPrice = deficitPrice(waybillCount.getLoadAmount(), waybillCount.getDeficitAmount(),
+                    logisticsOrder.getLoss(), logisticsOrder.getLossUnit(), logisticsOrder.getGoodsPrice());
+            logisticsOrder.setDeficitPrice(deficitPrice);
+            logisticsOrderDao.updateById(logisticsOrder);
+
+            //物流运单辅助单位
+            kwtLogisticsOrderGoodsService.editLogisticsOrderGoodsLoading(logisticsOrder.getId());
+
+            /**7Mongodb数据更新**/
+            //2承运订单
+            SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
+            lOrder.setLoadAmount(logisticsOrder.getLoadAmount());
+            lOrder.setLoadTime(logisticsOrder.getLoadTime());
+            lOrder.setUnloadAmount(logisticsOrder.getUnloadAmount());
+            lOrder.setUnloadTime(logisticsOrder.getUnloadTime());
+            lOrder.setDeficitAmount(logisticsOrder.getDeficitAmount());
+            lOrder.setDeficitPrice(logisticsOrder.getDeficitPrice());
+            editSckwLogisticsOrder(lOrder, logisticsOrder);
+
+            /**8校验当前承运订单是否运输完成(修改状态+统计量)**/
+            checkLogisticsByStatus(waybillOrder.getLOrderId());
+        }
+
+        /**9Mongodb数据更新**/
+        //1车辆运单
+        SckwWaybillOrder wOrder = new SckwWaybillOrder();
+        wOrder.set_id(waybillOrder.getId());
+        wOrder.setLoadAmount(waybillOrder.getLoadAmount());
+        wOrder.setLoadTime(params.getLoadOperateTime());
+        wOrder.setLoadUrls(FileUtils.replaceAllBatch(params.getLoadUrls()));
+        wOrder.setUnloadAmount(waybillOrder.getUnloadAmount());
+        wOrder.setUnloadTime(params.getUnloadOperateTime());
+        wOrder.setUnloadUrls(FileUtils.replaceAllBatch(params.getUnloadUrls()));
+        wOrder.setDeficitAmount(waybillOrder.getDeficitAmount());
+        wOrder.setDeficitPrice(waybillOrder.getDeficitPrice());
+        editSckwWaybillOrder(wOrder, waybillOrder, Global.NUMERICAL_TWO);
+
+        return HttpResult.ok("车辆运单审核完成!");
+    }
+
     /**
      * @param driverId 司机档案ID
      * @desc 更新司机信息
@@ -2488,6 +2624,150 @@ public class KwtWaybillOrderService {
         return remoteFleetService.findTruck(truckId);
     }
 
+    /**
+     * @param loadAmount    装货量
+     * @param deficitAmount 亏吨量
+     * @param loss          合理损耗
+     * @param goodsPrice    货值单价
+     * @desc 计算亏吨扣款
+     * @author zk
+     * @date 2023/7/27
+     **/
+    public BigDecimal deficitPrice(BigDecimal loadAmount, BigDecimal deficitAmount, BigDecimal loss,
+                                   String lossUnit, BigDecimal goodsPrice) {
+        //亏吨<=0
+        if (deficitAmount.compareTo(new BigDecimal(Global.AMOUNT)) <= 0) {
+            return new BigDecimal(Global.AMOUNT);
+        }
+        //承运订单亏吨扣款=(承运订单亏吨量 -(承运订单装货量 * 承运订单合理损耗))* 扣亏货值
+        loss = loss == null ? new BigDecimal(Global.AMOUNT) : loss;
+        if (loss.doubleValue() > 0 && StringUtils.isNotBlank(lossUnit)) {
+            if (lossUnit.equals(String.valueOf(TaxRateTypeEnum.PERCENT.getCode()))) {
+                loss = loss.divide(new BigDecimal(TaxRateTypeEnum.PERCENT.getValue()));
+            }
+            if (lossUnit.equals(String.valueOf(TaxRateTypeEnum.MILLIMETER.getCode()))) {
+                loss = loss.divide(new BigDecimal(TaxRateTypeEnum.MILLIMETER.getValue()));
+            }
+        }
+
+        goodsPrice = goodsPrice == null ? new BigDecimal(Global.AMOUNT) : goodsPrice;
+        BigDecimal deficitLossAmount = deficitAmount.subtract(loadAmount.multiply(loss).setScale(2, RoundingMode.HALF_UP));
+        //扣亏量=亏吨量-合理损耗值【要求大于0,如果小于0则扣亏货量取0】
+        if (deficitLossAmount.doubleValue() <= 0) {
+            return new BigDecimal(Global.AMOUNT);
+        }
+        //罚款值=扣亏量 * 扣亏货值
+        BigDecimal deficitPrice = deficitLossAmount.multiply(goodsPrice).setScale(4, RoundingMode.HALF_UP);
+        return deficitPrice;
+    }
+
+    /**
+     * @param lOrderId 承运订单ID
+     * @description 校验当前承运订单是否运输完成(修改状态 + 统计量)
+     * @author zk
+     * @date 2023/7/27
+     **/
+    public void checkLogisticsByStatus(Long lOrderId) {
+        /**
+         校验当前承运订单是否运输完成(虑该当前承运订单上下级物流订单)
+         1存在下级分包,下级物流订单和当前物流订单全部运输完成则修改当前物流订单状态为已完成(HAVE_FINISHED)、统计值
+         2当前物流订单属于分包:需要判断上级及同级分包全部运输完成修改上级物流订单状态为已完成(HAVE_FINISHED)、统计值-一直向上到一级物流订单
+         **/
+
+        /**1存在下级分包**/
+        KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(lOrderId);
+        /**1-1校验下级分包是否全部运输完成**/
+        boolean subcontractBool = checkSubcontract(logisticsOrder);
+
+        /**1-2校验当前承运订单是否运输完成**/
+        //车辆运单统计(运输中的物流订单+车辆运单审核通过)
+        WaybillCountVo waybillCount = waybillOrderDao.findWaybillOrderCount(new HashMap() {{
+            put("upperlOrderId", logisticsOrder.getId());
+            put("passStatus", Global.NUMERICAL_ONE);
+            put("logisticsStatus", LogisticsOrderEnum.IN_TRANSIT.getCode());
+        }});
+        //物流订单统计(运输完成后的物流订单)
+        LogisticsCountVo LogisticsCount = logisticsOrderDao.findLogisticsOrderCount(new HashMap() {{
+            put("upperlOrderId", logisticsOrder.getId());
+            put("finishedStatus", Global.NUMERICAL_ONE);
+        }});
+        //更新物流订单总装卸货量
+        logisticsOrder.setTotalLoadAmount(waybillCount.getLoadAmount().add(LogisticsCount.getLoadAmount()));
+        logisticsOrder.setTotalUnloadAmount(waybillCount.getUnloadAmount().add(LogisticsCount.getUnloadAmount()));
+        logisticsOrderDao.updateById(logisticsOrder);
+        //更新物流运单辅助单位
+        kwtLogisticsOrderGoodsService.editLogisticsOrderGoodsTotalLoading(logisticsOrder.getId());
+
+        /**1-3更新贸易订单总量
+         if (logisticsLevel(logisticsOrder) == Global.NUMERICAL_ONE) {
+         //物流订单统计(运输完成后的物流订单)
+         LogisticsCountVo tradeCount = logisticsOrderDao.findLogisticsOrderCount(new HashMap<>() {{
+         put("tOrderId", logisticsOrder.getTOrderId());
+         put("level", Global.NUMERICAL_ONE);
+         }});
+         //查询贸易订单关联物流运单是否全部完结-totalUnfinished
+         WaybillCountVo tradeCount1 = waybillOrderDao.findWaybillOrderCount(new HashMap<>() {{
+         put("tOrderId", logisticsOrder.getTOrderId());
+         }});
+         UpdateActualAmountParam tradeOrder = new UpdateActualAmountParam();
+         tradeOrder.setTOrderId(logisticsOrder.getTOrderId());
+         tradeOrder.setActualLoadAmount(tradeCount.getLoadAmount());
+         tradeOrder.setActualUnloadAmount(tradeCount.getUnloadAmount());
+         tradeOrder.setUpdateBy(LoginUserHolder.getUserId());
+         tradeOrder.setUpdateByName(LoginUserHolder.getUserName());
+         tradeOrderInfoService.updateActualAmount(tradeOrder);
+         }**/ //与物流订单完结订单统计履约量统计重复,该处适用于物流订单自动完结
+
+        /**1-4Mongodb数据更新**/
+        //承运订单
+        SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
+        lOrder.setTotalLoadAmount(logisticsOrder.getTotalLoadAmount());
+        lOrder.setTotalUnloadAmount(logisticsOrder.getTotalUnloadAmount());
+        editSckwLogisticsOrder(lOrder, logisticsOrder);
+
+        /**2当前物流订单属于分包(存在上级物流订单)**/
+        //获取所有上级物流订单ID(当前物流订单ID除外)
+        String pids = logisticsOrder.getPids();
+        if (StringUtils.isNotBlank(pids)) {
+            String[] idArray = pids.split(Global.COMMA);
+            for (String id : idArray) {
+                Long pid = Long.parseLong(id);
+                //当前物流订单ID除外
+                if (!pid.equals(lOrderId)) {
+                    /**校验当前承运订单是否运输完成**/
+                    checkLogisticsByStatus(pid);
+                }
+            }
+        }
+    }
+
+    /**
+     * @param logisticsOrder 物流订单
+     * @desc 校验下级分包是否全部运输完成
+     * @author zk
+     * @date 2023/7/26
+     **/
+    public boolean checkSubcontract(KwtLogisticsOrder logisticsOrder) {
+        boolean subcontractBool = true;
+        BigDecimal subcontractAmount = logisticsOrder.getSubcontractAmount() == null ? new BigDecimal(Global.AMOUNT) : logisticsOrder.getSubcontractAmount();
+        if (subcontractAmount.compareTo(new BigDecimal(Global.AMOUNT)) > 0) {
+            /**1-1校验下级分包是否全部运输完成**/
+            List<KwtLogisticsOrder> logisticsOrders = logisticsOrderDao.findLogisticsOrder(
+                    new HashMap() {{
+                        put("upperlOrderId", logisticsOrder.getId());
+                        put("ownOrderId", logisticsOrder.getId());
+                    }});
+            for (KwtLogisticsOrder logisticsOrder1 : logisticsOrders) {
+                if (!LogisticsOrderEnum.transportCompleted(logisticsOrder1.getStatus())) {
+                    //下级分包承运订单运输未完成
+                    subcontractBool = false;
+                    continue;
+                }
+            }
+        }
+        return subcontractBool;
+    }
+
     /** 当前物流订单是全量下游则只能全量可运、否则可委托量或全量
      校验上游是否全量,并获取全量跟节点物流订单或贸易订单(可委派量)
      1、派车、循环派车接单需校验贸易订单/物流订单是否委派完成;

+ 185 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderTicketService.java

@@ -0,0 +1,185 @@
+package com.sckw.transport.service;
+
+import com.sckw.core.common.enums.enums.DictTypeEnum;
+import com.sckw.core.model.constant.Global;
+import com.sckw.core.model.constant.NumberConstant;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.FileUtils;
+import com.sckw.excel.utils.DateUtil;
+import com.sckw.system.api.RemoteSystemService;
+import com.sckw.system.api.model.dto.res.SysDictResDto;
+import com.sckw.transport.dao.*;
+import com.sckw.transport.model.KwtWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrderTicket;
+import com.sckw.transport.model.dto.WaybillOrderTicketLoadingDto;
+import com.sckw.transport.model.vo.WaybillOrderLoadingVO;
+import com.sckw.transport.model.vo.WaybillTicketVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * @author zk
+ * @desc 运单榜单
+ * @date 2023/7/19 0019
+ */
+@Slf4j
+@Service
+@SuppressWarnings("all")
+public class KwtWaybillOrderTicketService {
+    @Autowired
+    KwtWaybillOrderMapper waybillOrderMapper;
+    @Autowired
+    KwtWaybillOrderTicketMapper waybillOrderTicketMapper;
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    RemoteSystemService remoteSystemService;
+
+    /**
+     * @param loading 装载信息
+     * @param unit 运单分配单位
+     * @param amount 运单装载量
+     * @desc 计算装载量
+     * @author zk
+     * @date 2023/12/6
+     */
+    public BigDecimal countAmount(List<WaybillOrderTicketLoadingDto> loading, String unit, BigDecimal amount) {
+        if (CollectionUtils.isNotEmpty(loading)) {
+            for (WaybillOrderTicketLoadingDto ticket:loading) {
+                if (unit.equals(ticket.getUnit())) {
+                    return ticket.getAmount();
+                }
+            }
+        }
+        return amount;
+    }
+
+    /**
+     *
+     * @param loading 装载信息
+     * @param wOrderId 运单ID
+     * @param urls 榜单地址
+     * @param operateTime 操作时间
+     * @param type 装卸货类型
+     * @desc 更新办单
+     * @author zk
+     * @date 2023/12/6
+     */
+    public void addTicket(List<WaybillOrderTicketLoadingDto> loading, Long wOrderId, String urls, Date operateTime, int type) {
+        if (CollectionUtils.isNotEmpty(loading)) {
+            loading.forEach(e -> {
+                KwtWaybillOrderTicket ticket = new KwtWaybillOrderTicket();
+                ticket.setWOrderId(wOrderId);
+                ticket.setType(type);
+                ticket.setUnit(e.getUnit());
+                ticket.setAmount(e.getAmount());
+                ticket.setUrls(FileUtils.replaceAllBatch(urls));
+                ticket.setOperateTime(operateTime);
+                waybillOrderTicketMapper.insert(ticket);
+            });
+        }
+    }
+
+    /**
+     *
+     * @param loading 装载信息
+     * @param wOrderId 运单ID
+     * @param urls 榜单地址
+     * @param operateTime 操作时间
+     * @param type 装卸货类型
+     * @desc 更新办单
+     * @author zk
+     * @date 2023/12/6
+     */
+    public void editTicket(List<WaybillOrderTicketLoadingDto> loading, Long wOrderId, String urls, Date operateTime, int type) {
+        if (CollectionUtils.isNotEmpty(loading)) {
+            for (WaybillOrderTicketLoadingDto ticket:loading) {
+                KwtWaybillOrderTicket oldTicket = waybillOrderTicketMapper.findWaybillOrderTicketV1(wOrderId, type, ticket.getUnit());
+                //对比是否存在更新
+                if (oldTicket != null && oldTicket.getAmount() == ticket.getAmount()
+                        && oldTicket.getUrls().equals(urls)
+                        && oldTicket.getOperateTime() == operateTime) {
+                    continue;
+                }
+                //删除
+                oldTicket.setDelFlag(Global.YES);
+                waybillOrderTicketMapper.updateById(oldTicket);
+
+                //新增
+                KwtWaybillOrderTicket waybillOrderTicket = new KwtWaybillOrderTicket();
+                waybillOrderTicket.setWOrderId(wOrderId);
+                waybillOrderTicket.setType(type);
+                waybillOrderTicket.setUnit(ticket.getUnit());
+                waybillOrderTicket.setAmount(ticket.getAmount());
+                waybillOrderTicket.setUrls(FileUtils.replaceAllBatch(urls));
+                waybillOrderTicket.setOperateTime(operateTime);
+                waybillOrderTicketMapper.insert(waybillOrderTicket);
+            }
+        }
+    }
+
+    /**
+     * 运单详情单证信息
+     * @param wOrderId 运单ID
+     * @param deficitAmount 亏吨
+     * @param deficitRealAmount 扣亏量
+     * @return 单证信息
+     */
+    public WaybillTicketVO agreement(Long wOrderId, String deficitAmount, String deficitRealAmount) {
+        WaybillTicketVO waybillTicket = new WaybillTicketVO();
+        waybillTicket.setDeficitAmount(deficitAmount);
+        waybillTicket.setDeficitRealAmount(deficitRealAmount);
+        //单位数据字典
+        Map<String, SysDictResDto> unitType = remoteSystemService.queryDictMapByType(DictTypeEnum.UNIT_TYPE.getType());
+        //装货
+        List<KwtWaybillOrderTicket> load = waybillOrderTicketMapper.findWaybillOrderTicket(wOrderId, NumberConstant.ONE);
+        //卸货
+        List<KwtWaybillOrderTicket> unload = waybillOrderTicketMapper.findWaybillOrderTicket(wOrderId, NumberConstant.TWO);
+        if (CollectionUtils.isNotEmpty(load)) {
+            List<WaybillOrderLoadingVO> loadLoading = new ArrayList<>();
+            load.forEach(e -> {
+                SysDictResDto sysDict = unitType != null ? unitType.get(e.getUnit()) : null;
+                waybillTicket.setLoadUrl(FileUtils.splice(e.getUrls()));
+                waybillTicket.setLoadTime(e.getOperateTime() == null ? null : DateUtil.getDateTime(e.getOperateTime()));
+                loadLoading.add(new WaybillOrderLoadingVO(e.getUnit(), sysDict != null ? sysDict.getLabel() : null, e.getAmount()));
+            });
+            waybillTicket.setLoadLoading(loadLoading);
+        }
+        if (CollectionUtils.isNotEmpty(unload)) {
+            List<WaybillOrderLoadingVO> unloadLoading = new ArrayList<>();
+            load.forEach(e -> {
+                SysDictResDto sysDict = unitType != null ? unitType.get(e.getUnit()) : null;
+                waybillTicket.setUnloadUrl(FileUtils.splice(e.getUrls()));
+                waybillTicket.setUnloadTime(e.getOperateTime() == null ? null : DateUtil.getDateTime(e.getOperateTime()));
+                unloadLoading.add(new WaybillOrderLoadingVO(e.getUnit(), sysDict != null ? sysDict.getLabel() : null, e.getAmount()));
+            });
+            waybillTicket.setUnloadLoading(unloadLoading);
+        }
+        return waybillTicket;
+    }
+
+    /**
+     * 单证信息
+     * @param wOrderId 运单ID
+     * @param type 单证类型
+     * @return
+     */
+    public List<WaybillOrderLoadingVO> agreement(Long wOrderId, int type) {
+        List<WaybillOrderLoadingVO> loadLoading = new ArrayList<>();
+        //单位数据字典
+        Map<String, SysDictResDto> unitType = remoteSystemService.queryDictMapByType(DictTypeEnum.UNIT_TYPE.getType());
+        //装载信息
+        List<KwtWaybillOrderTicket> loading = waybillOrderTicketMapper.findWaybillOrderTicket(wOrderId, type);
+        if (CollectionUtils.isNotEmpty(loading)) {
+            loading.forEach(e -> {
+                SysDictResDto sysDict = unitType != null ? unitType.get(e.getUnit()) : null;
+                loadLoading.add(new WaybillOrderLoadingVO(e.getUnit(), sysDict != null ? sysDict.getLabel() : null, e.getAmount()));
+            });
+        }
+        return loadLoading;
+    }
+
+}

+ 18 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderGoodsUnitMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sckw.transport.dao.KwtLogisticsOrderGoodsUnitMapper">
+
+    <select id="findGoodsUnit" resultType="com.sckw.transport.model.KwtLogisticsOrderGoodsUnit" parameterType="java.util.Map" >
+        SELECT
+            id, l_order_id lOrderId, goods_id goodsId, from_unit fromUnit, to_unit toUnit,
+            conversion_value conversionValue, unit, unload_amount unloadAmount,
+            load_amount loadAmount, total_load_amount totalLoadAmount, total_unload_amount totalUnloadAmount,
+            remark, status, create_by createBy, create_time createTime, update_by updateBy, update_time updateTime
+        from kwt_logistics_order_goods_unit
+        where del_flag = 0
+        <if test="lOrderId != null and goodsId != ''">
+            and l_order_id = #{lOrderId, jdbcType=BIGINT}
+        </if>
+        ORDER BY create_time desc
+    </select>
+</mapper>

+ 56 - 7
sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderMapper.xml

@@ -161,25 +161,62 @@
         IFNULL(SUM(wo.unload_amount), 0.0) unloadAmount, IFNULL(SUM(wo.deficit_amount), 0.0) deficitAmount,
         MIN(wot1.operate_time) loadTime, MAX(wot2.operate_time) unloadTime
         from kwt_waybill_order wo
-        left join kwt_waybill_order_ticket wot1 on wot1.w_order_id = wo.id and wot1.type = 1 and wot1.del_flag = 0
-        left join kwt_waybill_order_ticket wot2 on wot2.w_order_id = wo.id and wot2.type = 2 and wot2.del_flag = 0
+        left join kwt_waybill_order_ticket wot1 on wot1.w_order_id = wo.id and wot1.type = 1 and wo.unit = wot1.unit and wot1.del_flag = 0
+        left join kwt_waybill_order_ticket wot2 on wot2.w_order_id = wo.id and wot2.type = 2 and wo.unit = wot2.unit and wot2.del_flag = 0
         left join kwt_logistics_order lo on lo.id = wo.l_order_id
         where wo.del_flag = 0 and lo.del_flag = 0
+        <if test="driverId != null and driverId != ''">
+            and wo.driver_id = #{driverId, jdbcType=BIGINT}
+        </if>
+        <if test="truckId != null and truckId != ''">
+            and wo.truck_id = #{truckId, jdbcType=BIGINT}
+        </if>
+        <if test="passStatus != null and passStatus != ''">
+            and wo.status = 8
+        </if>
+        <if test="loadCountStatus != null and loadCountStatus != ''">
+            and wo.status in (5, 6, 7, 8, 12, 13)
+        </if>
+        <if test="unloadCountStatus != null and unloadCountStatus != ''">
+            and wo.status in (7, 8, 12, 13)
+        </if>
         <if test="tOrderId != null and tOrderId != ''">
             and lo.t_order_id = #{tOrderId, jdbcType=BIGINT}
         </if>
         <if test="lOrderId != null and lOrderId != ''">
             and lo.id = #{lOrderId, jdbcType=BIGINT}
         </if>
+        <if test="logisticsStatus != null and logisticsStatus != ''">
+            and lo.status  = #{logisticsStatus, jdbcType=INTEGER}
+        </if>
+        <if test="upperlOrderId != null and upperlOrderId != ''">
+            and FIND_IN_SET(#{upperlOrderId, jdbcType=BIGINT}, lo.pids)
+        </if>
+        <if test="belowlOrderId != null and belowlOrderId != ''">
+            and FIND_IN_SET(lo.id, #{belowlOrderId, jdbcType=VARCHAR})
+        </if>
+        <if test="ownOrderId != null and ownOrderId != ''">
+            and lo.id != #{ownOrderId, jdbcType=BIGINT}
+        </if>
+    </select>
+
+    <select id="findWaybillOrderTicketCount" resultType="com.sckw.transport.model.vo.WaybillCountVo"
+            parameterType="java.util.Map">
+        SELECT
+        IFNULL(SUM(wo.load_amount), 0.0) loadAmount,
+        IFNULL(SUM(wo.unload_amount), 0.0) unloadAmount
+        from kwt_waybill_order wo
+        left join kwt_waybill_order_ticket wot1 on wot1.w_order_id = wo.id and wot1.type = 1 and wot1.del_flag = 0
+        left join kwt_waybill_order_ticket wot2 on wot2.w_order_id = wo.id and wot2.type = 2 and wot2.del_flag = 0
+        left join kwt_logistics_order lo on lo.id = wo.l_order_id
+        where wo.del_flag = 0 and lo.del_flag = 0
+        and wot1.unit = 0 and wot2.unit = 0
         <if test="driverId != null and driverId != ''">
             and wo.driver_id = #{driverId, jdbcType=BIGINT}
         </if>
         <if test="truckId != null and truckId != ''">
             and wo.truck_id = #{truckId, jdbcType=BIGINT}
         </if>
-        <if test="logisticsStatus != null and logisticsStatus != ''">
-            and lo.status  = #{logisticsStatus, jdbcType=INTEGER}
-        </if>
         <if test="passStatus != null and passStatus != ''">
             and wo.status = 8
         </if>
@@ -189,11 +226,23 @@
         <if test="unloadCountStatus != null and unloadCountStatus != ''">
             and wo.status in (7, 8, 12, 13)
         </if>
+        <if test="unit != null and unit != ''">
+            and wot1.unit = #{unit, jdbcType=VARCHAR} and wot2.unit = #{unit, jdbcType=VARCHAR}
+        </if>
+        <if test="tOrderId != null and tOrderId != ''">
+            and lo.t_order_id = #{tOrderId, jdbcType=BIGINT}
+        </if>
+        <if test="lOrderId != null and lOrderId != ''">
+            and lo.id = #{lOrderId, jdbcType=BIGINT}
+        </if>
+        <if test="logisticsStatus != null and logisticsStatus != ''">
+            and lo.status  = #{logisticsStatus, jdbcType=INTEGER}
+        </if>
         <if test="upperlOrderId != null and upperlOrderId != ''">
-            and FIND_IN_SET(#{upperlOrderId, jdbcType=BIGINT}, pids)
+            and FIND_IN_SET(#{upperlOrderId, jdbcType=BIGINT}, lo.pids)
         </if>
         <if test="belowlOrderId != null and belowlOrderId != ''">
-            and FIND_IN_SET(id, #{belowlOrderId, jdbcType=VARCHAR})
+            and FIND_IN_SET(lo.id, #{belowlOrderId, jdbcType=VARCHAR})
         </if>
         <if test="ownOrderId != null and ownOrderId != ''">
             and lo.id != #{ownOrderId, jdbcType=BIGINT}

+ 29 - 2
sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderTicketMapper.xml

@@ -5,6 +5,7 @@
         <id column="id" jdbcType="BIGINT" property="id" />
         <result column="w_order_id" jdbcType="BIGINT" property="wOrderId" />
         <result column="type" jdbcType="INTEGER" property="type" />
+        <result column="unit" jdbcType="VARCHAR" property="unit" />
         <result column="amount" jdbcType="DECIMAL" property="amount" />
         <result column="gross_amount" jdbcType="DECIMAL" property="grossAmount" />
         <result column="tare_amount" jdbcType="DECIMAL" property="tareAmount" />
@@ -19,13 +20,13 @@
         <result column="del_flag" jdbcType="INTEGER" property="delFlag" />
     </resultMap>
     <sql id="Base_Column_List">
-        id, w_order_id, `type`, amount, gross_amount, tare_amount, urls, operate_time, remark, `status`,
+        id, w_order_id, `type`, unit, amount, gross_amount, tare_amount, urls, operate_time, remark, `status`,
         create_by, create_time, update_by, update_time, del_flag
     </sql>
 
     <select id="findWaybillOrderTicket" resultType="com.sckw.transport.model.KwtWaybillOrderTicket" >
         select
-        id, w_order_id wOrderId, `type`, amount, gross_amount grossAmount, tare_amount tareAmount,
+        id, w_order_id wOrderId, `type`, unit, amount, gross_amount grossAmount, tare_amount tareAmount,
         urls, operate_time, remark, `status`, create_by createBy, create_time createTime, update_by updateBy,
         update_time updateTime
         from kwt_waybill_order_ticket
@@ -37,4 +38,30 @@
             and type = #{type, jdbcType=INTEGER}
         </if>
     </select>
+
+    <select id="findWaybillOrderTicketV1" resultType="com.sckw.transport.model.KwtWaybillOrderTicket" >
+        select
+        id, w_order_id wOrderId, `type`, unit, amount, gross_amount grossAmount, tare_amount tareAmount,
+        urls, operate_time, remark, `status`, create_by createBy, create_time createTime, update_by updateBy,
+        update_time updateTime
+        from kwt_waybill_order_ticket
+        where del_flag = 0
+        <if test="wOrderId != null and wOrderId != ''">
+            and w_order_id = #{wOrderId, jdbcType=BIGINT}
+        </if>
+        <if test="type != null and type != ''">
+            and type = #{type, jdbcType=INTEGER}
+        </if>
+        <if test="unit != null and unit != ''">
+            and unit = #{unit, jdbcType=VARCHAR}
+        </if>
+    </select>
+
+    <update id="deleteTicket">
+        UPDATE kwt_waybill_order_ticket set del_flag = 1
+        WHERE del_flag = 0
+        and w_order_id = #{wOrderId, jdbcType=BIGINT}
+        and type = #{type, jdbcType=INTEGER}
+    </update>
+
 </mapper>