Sfoglia il codice sorgente

1、4.2单证审核;

zk 1 anno fa
parent
commit
1ca03a61f3
17 ha cambiato i file con 748 aggiunte e 114 eliminazioni
  1. 26 3
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtWaybillOrderController.java
  2. 2 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderAmountMapper.java
  3. 7 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderAddressMapper.java
  4. 13 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderV1Mapper.java
  5. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrderTicket.java
  6. 6 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrderTrack.java
  7. 7 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/OperateWaybillDto.java
  8. 56 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderEditTicketDto.java
  9. 29 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketApprovalRejectDto.java
  10. 25 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketApprovalV2Dto.java
  11. 4 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillCountVo.java
  12. 51 64
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsOrderGoodsService.java
  13. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderTicketService.java
  14. 460 44
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java
  15. 10 0
      sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderAmountMapper.xml
  16. 16 0
      sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderAddressMapper.xml
  17. 34 0
      sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderV1Mapper.xml

+ 26 - 3
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtWaybillOrderController.java

@@ -408,16 +408,16 @@ public class KwtWaybillOrderController {
      * @param params {}
      * @desc 修改单证
      * @author zk
-     * @date 2024/3/6
+     * @date 2024/3/7
      **/
     @PostMapping("/editTicketV3")
-    public HttpResult editTicketV3(@RequestBody @Valid WaybillOrderTicketV4Dto params){
+    public HttpResult editTicketV3(@RequestBody @Valid WaybillOrderEditTicketDto params){
         return waybillOrderV1Service.editTicketV1(params);
     }
 
 
     /**
-     * @param wOrderId
+     * @param wOrderId 运单ID
      * @desc 修改单证查询运单
      * @author zk
      * @date 2023/8/2
@@ -438,6 +438,18 @@ public class KwtWaybillOrderController {
         return waybillOrderService.approvalTicket(params);
     }
 
+    /**
+     * @param params {}
+     * @desc 单证审核-驳回
+     * @author zk
+     * @date 2024/3/7
+     **/
+    @PostMapping("/approvalReject")
+    public HttpResult approvalReject(@RequestBody @Valid ValiList<WaybillOrderTicketApprovalRejectDto> params){
+        return waybillOrderV1Service.approvalReject(params);
+    }
+
+
     /**
      * @param params {}
      * @desc 单证审核(编辑单证)
@@ -449,4 +461,15 @@ public class KwtWaybillOrderController {
         return waybillOrderService.approvalEditTicketV1(params);
     }
 
+    /**
+     * @param params {}
+     * @desc 单证审核(编辑单证)
+     * @author zk
+     * @date 2024/3/7
+     **/
+    @PostMapping("/approvalEditTicketV1")
+    public HttpResult approvalEditTicketV1(@RequestBody @Valid WaybillOrderTicketApprovalV2Dto params){
+        return waybillOrderV1Service.approvalEditTicketV1(params);
+    }
+
 }

+ 2 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderAmountMapper.java

@@ -19,4 +19,6 @@ public interface KwtLogisticsOrderAmountMapper extends BaseMapper<KwtLogisticsOr
     List<KwtLogisticsOrderAmount> findByAddress(KwtLogisticsOrderAddress params);
 
     KwtLogisticsOrderAmount findByLAddressId(@Param("lAddressId") Long lAddressId);
+
+    List<KwtLogisticsOrderAmount> findByLOrderId(@Param("lOrderId") Long lOrderId);
 }

+ 7 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderAddressMapper.java

@@ -41,6 +41,13 @@ public interface KwtWaybillOrderAddressMapper extends BaseMapper<KwtWaybillOrder
      */
     List<KwtWaybillOrderAddress> findBySubtaskId(@Param("wSubtaskId") Long wSubtaskId, @Param("addressType") Integer addressType);
 
+    /**
+     * 查询运单地址信息
+     * @param lAddressIds 物流订单地址ID
+     * @return 地址信息集
+     */
+    List<KwtWaybillOrderAddress> findByLAddressIds(@Param("lAddressIds") List<Long> lAddressIds);
+
     /**
      * 查询车辆运单装卸货地址CODE
      * @param entId 企业信息

+ 13 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderV1Mapper.java

@@ -47,4 +47,17 @@ public interface KwtWaybillOrderV1Mapper extends BaseMapper<KwtWaybillOrderV1> {
      * @return 统计信息
      */
     WaybillCountVo findUnfinishedByTruck(@Param("type") int type, @Param("truckId") Long truckId);
+
+    /**
+     * 查询统计物流订单运量(地址关联)
+     * @param params {
+     *               upperlOrderId 下级分包物流订单,
+     *               lOrderId 物流订单id,
+     *               wAddressIds 运单地址ID集,
+     *               passStatus 运单审核通过状态,
+     *               type  榜单装卸货类型
+     *               }
+     * @return 统计信息
+     */
+    WaybillCountVo findTicketCountByAddress(Map<String, Object> params);
 }

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

@@ -73,7 +73,7 @@ public class KwtWaybillOrderTicket implements Serializable {
     private Date operateTime;
 
     /**
-     * 用户状态(0有效、1无效
+     * 状态(0待审核、1审核失败、2审核成功
      */
     private Integer status;
 

+ 6 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrderTrack.java

@@ -2,6 +2,7 @@ package com.sckw.transport.model;
 
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -31,6 +32,11 @@ public class KwtWaybillOrderTrack implements Serializable {
      */
     private Long wSubtaskId;
 
+    /**
+     * 车辆订单-地址id
+     */
+    private Long wAddressId;
+
     /**
      * 备注
      */

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

@@ -25,11 +25,17 @@ public class OperateWaybillDto {
     private Long wOrderId;
 
     /**
-     * 车辆订单id
+     * 车辆订单-子单id
      */
     @JsonProperty("wSubtaskId")
     private Long wSubtaskId;
 
+    /**
+     * 车辆订单-地址id
+     */
+    @JsonProperty("wAddressId")
+    private Long wAddressId;
+
     /**
      * 操作时间
      */

+ 56 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderEditTicketDto.java

@@ -0,0 +1,56 @@
+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/26 0026
+ */
+@Data
+public class WaybillOrderEditTicketDto {
+
+    /**
+     * 单证ID
+     */
+    @JsonProperty("wTicketId")
+    @NotNull(message = "单证ID不能为空")
+    private Long wTicketId;
+
+    /**
+     * 上传凭证地址,多个以英文逗号隔开
+     */
+    @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;
+}

+ 29 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketApprovalRejectDto.java

@@ -0,0 +1,29 @@
+package com.sckw.transport.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+/**
+ * @author zk
+ * @desc 车辆运单审核
+ * @date 2023/7/27 0027
+ */
+@Data
+public class WaybillOrderTicketApprovalRejectDto {
+    /**
+     * 车辆运单id
+     */
+    @JsonProperty("wTicketId")
+    @NotNull(message = "车辆运单榜单ID不能为空")
+    private Long wTicketId;
+
+    /**
+     * 备注
+     */
+    @JsonProperty("remark")
+    @Size(max=100, message = "原因长度不能大于100个字符!")
+    @NotNull(message = "原因不能为空")
+    private String remark;
+}

+ 25 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketApprovalV2Dto.java

@@ -0,0 +1,25 @@
+package com.sckw.transport.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import java.util.List;
+
+/**
+ * @author zk
+ * @desc 车辆运单审核
+ * @date 2023/7/27 0027
+ */
+@Data
+public class WaybillOrderTicketApprovalV2Dto {
+    /**
+     * 车辆运单id
+     */
+    @JsonProperty("wOrderId")
+    @NotNull(message = "车辆运单ID不能为空")
+    private Long wOrderId;
+
+    @JsonProperty("tickets")
+    private @Valid List<WaybillOrderTicketV4Dto> tickets;
+}

+ 4 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillCountVo.java

@@ -11,6 +11,10 @@ import java.util.Date;
  */
 @Data
 public class WaybillCountVo {
+    /**
+     * 运输量
+     */
+    private BigDecimal amount;
     /**
      * 已委托量
      */

+ 51 - 64
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsOrderGoodsService.java

@@ -13,10 +13,7 @@ import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.order.api.model.GoodsLoadingParam;
 import com.sckw.order.api.model.OrderDetailRes;
 import com.sckw.system.api.RemoteSystemService;
-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.dao.*;
 import com.sckw.transport.model.KwtLogisticsOrder;
 import com.sckw.transport.model.KwtLogisticsOrderGoods;
 import com.sckw.transport.model.KwtLogisticsOrderGoodsUnit;
@@ -27,6 +24,7 @@ import com.sckw.transport.model.dto.OrderManualCompletionDto;
 import com.sckw.transport.model.param.GoodsUnitParam;
 import com.sckw.transport.model.param.LogisticsConsignmentParam;
 import com.sckw.transport.model.vo.GoodsUnitVo;
+import com.sckw.transport.model.vo.WaybillCountVo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -47,6 +45,8 @@ public class KwtLogisticsOrderGoodsService {
     @Autowired
     KwtWaybillOrderMapper waybillOrderMapper;
     @Autowired
+    KwtWaybillOrderV1Mapper waybillOrderV1Mapper;
+    @Autowired
     KwtLogisticsOrderMapper logisticsOrderMapper;
     @Autowired
     public KwtLogisticsOrderGoodsMapper goodsMapper;
@@ -189,89 +189,76 @@ public class KwtLogisticsOrderGoodsService {
     }
 
     /**
-     * 更新物流订单商品辅助单位-装卸货量
-     *
+     * 更新物流订单商品辅助单位-装卸货量(当前层级)
      * @param lOrderId 物流订单
      */
     public void editLogisticsOrderGoodsLoading(Long lOrderId) {
         //辅助单位
-        List<KwtLogisticsOrderGoodsUnit> assistUnit = goodsUnitMapper.findList(new HashMap<>(NumberConstant.SIXTEEN) {{
-            put("lOrderId", lOrderId);
-        }});
-        if (CollectionUtils.isNotEmpty(assistUnit)) {
-            assistUnit.forEach(e -> {
-                //车辆运单统计(运输中的物流订单+车辆运单审核通过)
-                Map<String, Object> params = new HashMap<>(NumberConstant.SIXTEEN) {{
-                    put("unit", e.getUnit());
-                    put("type", NumberConstant.ONE);
-                    put("lOrderId", lOrderId);
-                    put("passStatus", Global.NUMERICAL_ONE);
-                }};
-                //装货量
-                Double loadAmount = waybillOrderMapper.findWaybillOrderTicketCount(params);
-                //卸货量
-                params.put("type", NumberConstant.TWO);
-                Double unloadAmount = waybillOrderMapper.findWaybillOrderTicketCount(params);
-                //更新物流订单商品辅助单位-装卸货量
-                e.setLoadAmount(BigDecimal.valueOf(loadAmount));
-                e.setUnloadAmount(BigDecimal.valueOf(unloadAmount));
-                goodsUnitMapper.update(e, new LambdaUpdateWrapper<KwtLogisticsOrderGoodsUnit>()
-                        .set(KwtLogisticsOrderGoodsUnit::getLoadAmount, BigDecimal.valueOf(loadAmount))
-                        .set(KwtLogisticsOrderGoodsUnit::getUnloadAmount, BigDecimal.valueOf(unloadAmount))
-                        .eq(KwtLogisticsOrderGoodsUnit::getId, e.getId())
-                );
-            });
+        Map<String, Object> queryParams = new HashMap<>(NumberConstant.SIXTEEN);
+        queryParams.put("lOrderId", lOrderId);
+        List<KwtLogisticsOrderGoodsUnit> assistUnit = goodsUnitMapper.findList(queryParams);
+        //数据处理
+        for (KwtLogisticsOrderGoodsUnit goodsUnit:assistUnit) {
+            //车辆运单统计(运输中的物流订单+车辆运单审核通过)
+            queryParams.clear();
+            //装货统计
+            queryParams.put("unit", goodsUnit.getUnit());
+            queryParams.put("type", NumberConstant.ONE);
+            queryParams.put("lOrderId", lOrderId);
+            queryParams.put("passStatus", Global.NUMERICAL_ONE);
+            WaybillCountVo loadCount = waybillOrderV1Mapper.findTicketCountByAddress(queryParams);
+            //卸货统计
+            queryParams.put("type", NumberConstant.TWO);
+            WaybillCountVo unloadCount = waybillOrderV1Mapper.findTicketCountByAddress(queryParams);
+            goodsUnit.setLoadAmount(loadCount.getAmount());
+            goodsUnit.setUnloadAmount(unloadCount.getAmount());
+            goodsUnitMapper.updateById(goodsUnit);
         }
     }
 
     /**
-     * 更新物流订单商品辅助单位-装卸货量
-     *
+     * 更新物流订单商品辅助单位-装卸货量(当前层级+下级)
      * @param lOrderId 物流订单
      */
     public void editLogisticsOrderGoodsTotalLoading(Long lOrderId) {
         //辅助单位
-        List<KwtLogisticsOrderGoodsUnit> assistUnit = goodsUnitMapper.findList(new HashMap<>(NumberConstant.SIXTEEN) {{
-            put("lOrderId", lOrderId);
-        }});
-        if (CollectionUtils.isNotEmpty(assistUnit)) {
-            assistUnit.forEach(e -> {
-                //下级物流订单-辅助单位
-                KwtLogisticsOrderGoodsUnit unitCount = goodsUnitMapper.findGoodsUnitCount(new HashMap<>(NumberConstant.SIXTEEN) {{
-                    put("belowlOrderId", lOrderId);
-                    put("unit", e.getUnit());
-                }});
-
-                //更新物流订单商品辅助单位-总装卸货量
-                e.setTotalLoadAmount(unitCount.getLoadAmount().add(e.getLoadAmount()));
-                e.setTotalUnloadAmount(unitCount.getUnloadAmount().add(e.getUnloadAmount()));
-                goodsUnitMapper.updateById(e);
-            });
+        Map<String, Object> queryParams = new HashMap<>(NumberConstant.SIXTEEN);
+        queryParams.put("lOrderId", lOrderId);
+        List<KwtLogisticsOrderGoodsUnit> assistUnit = goodsUnitMapper.findList(queryParams);
+        //数据处理
+        for (KwtLogisticsOrderGoodsUnit goodsUnit:assistUnit) {
+            //下级物流订单-辅助单位
+            queryParams.clear();
+            queryParams.put("belowlOrderId", lOrderId);
+            queryParams.put("unit", goodsUnit.getUnit());
+            KwtLogisticsOrderGoodsUnit unitCount = goodsUnitMapper.findGoodsUnitCount(queryParams);
+            //更新物流订单商品辅助单位-总装卸货量
+            goodsUnit.setTotalLoadAmount(unitCount.getLoadAmount().add(goodsUnit.getLoadAmount()));
+            goodsUnit.setTotalUnloadAmount(unitCount.getUnloadAmount().add(goodsUnit.getUnloadAmount()));
+            goodsUnitMapper.updateById(goodsUnit);
         }
     }
 
     /**
      * 完结物流订单更新商品辅助单位
-     *
      * @param params 完结参数
      */
     public void editLogisticsOrderGoodsTotalLoading(OrderManualCompletionDto params) {
         //辅助单位
-        List<KwtLogisticsOrderGoodsUnit> assistUnit = goodsUnitMapper.findList(new HashMap<>(NumberConstant.SIXTEEN) {{
-            put("lOrderId", params.getId());
-        }});
+        Map<String, Object> queryParams = new HashMap<>(NumberConstant.SIXTEEN);
+        queryParams.put("lOrderId", params.getId());
+        List<KwtLogisticsOrderGoodsUnit> assistUnit = goodsUnitMapper.findList(queryParams);
+        //数据处理
         List<OrderGoodsLoadingDto> loading = params.getLoading();
-        if (CollectionUtils.isNotEmpty(assistUnit)) {
-            assistUnit.forEach(e -> {
-                for (OrderGoodsLoadingDto goodsLoading : loading) {
-                    if (goodsLoading.getUnit().equals(e.getUnit())) {
-                        //更新物流订单商品辅助单位-总装卸货量
-                        e.setTotalLoadAmount(goodsLoading.getLoadAmount());
-                        e.setTotalUnloadAmount(goodsLoading.getUnloadAmount());
-                        goodsUnitMapper.updateById(e);
-                    }
+        for (KwtLogisticsOrderGoodsUnit goodsUnit:assistUnit) {
+            for (OrderGoodsLoadingDto goodsLoading : loading) {
+                if (goodsLoading.getUnit().equals(goodsUnit.getUnit())) {
+                    //更新物流订单商品辅助单位-总装卸货量
+                    goodsUnit.setTotalLoadAmount(goodsLoading.getLoadAmount());
+                    goodsUnit.setTotalUnloadAmount(goodsLoading.getUnloadAmount());
+                    goodsUnitMapper.updateById(goodsUnit);
                 }
-            });
+            }
         }
     }
 

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

@@ -193,7 +193,7 @@ public class KwtWaybillOrderTicketService {
                 orderTicket.setUnit(oldTicket.getUnit());
                 orderTicket.setAmount(ticket.getAmount());
                 orderTicket.setUrls(urls);
-                orderTicket.setOperateTime(operateTime);
+                orderTicket.setOperateTime(operateTime == null ? oldTicket.getOperateTime() : operateTime);
                 waybillOrderTicketMapper.insert(orderTicket);
             }
         }

+ 460 - 44
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -49,6 +49,8 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -292,7 +294,7 @@ public class KwtWaybillOrderV1Service {
                 }
 
                 /*车辆运单状态记录*/
-                this.setWaybillOrderTrack(waybillOrder.getId(), null, waybillOrder.getUpdateTime(), waybillOrder.getStatus(), null);
+                this.setWaybillOrderTrack(waybillOrder.getId(), null, null, waybillOrder.getUpdateTime(), waybillOrder.getStatus(), null);
             }
         }
         return sendCarEntrustAll;
@@ -300,6 +302,7 @@ public class KwtWaybillOrderV1Service {
 
     /**
      * @param sendCarEntrusts         委派参数
+     * @param type 运单类型
      * @desc 更新承运订单委派信息
      * @author zk
      * @date 2024/3/5
@@ -450,16 +453,18 @@ public class KwtWaybillOrderV1Service {
     /**
      * @param wOrderId 车辆订单ID
      * @param wSubtaskId 车辆运单子单ID
+     * @param wAddressId 车辆订单地址id
      * @param status   车辆运单状态
      * @param remark   备注
      * @desc 新增运单状态记录
      * @author zk
      * @date 2023/7/20
      **/
-    public void setWaybillOrderTrack(Long wOrderId, Long wSubtaskId, Date operateTime, int status, String remark) {
+    public void setWaybillOrderTrack(Long wOrderId, Long wSubtaskId, Long wAddressId, Date operateTime, int status, String remark) {
         KwtWaybillOrderTrack orderTrack = new KwtWaybillOrderTrack();
         orderTrack.setWOrderId(wOrderId);
         orderTrack.setWSubtaskId(wSubtaskId);
+        orderTrack.setWAddressId(wAddressId);
         orderTrack.setOperateTime(operateTime == null ? new Date() : operateTime);
         orderTrack.setStatus(status);
         orderTrack.setRemark(remark);
@@ -497,7 +502,7 @@ public class KwtWaybillOrderV1Service {
             waybillOrderV1Dao.updateById(waybillOrder);
 
             /*3、新增运单状态记录*/
-            setWaybillOrderTrack(waybillOrder.getId(), null, waybillOrder.getUpdateTime(), waybillOrder.getStatus(), null);
+            setWaybillOrderTrack(waybillOrder.getId(), null, null, waybillOrder.getUpdateTime(), waybillOrder.getStatus(), null);
 
             /*4、回退物流订单委托量*/
             /*4.1、装货址委派量entrustAmount回退*/
@@ -516,6 +521,10 @@ public class KwtWaybillOrderV1Service {
             //运单子订单
             List<KwtWaybillOrderSubtask> orderSubtasks = waybillOrderSubtaskDao.findByWOrderId(wOrderId);
             for (KwtWaybillOrderSubtask subtask:orderSubtasks) {
+                //更新运单子单状态
+                subtask.setStatus(waybillOrder.getStatus());
+                waybillOrderSubtaskDao.updateById(subtask);
+
                 //物流订单
                 KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(subtask.getLOrderId());
                 //承运订单已委派量=承运订单原委派量-当前车辆运单委派量
@@ -551,10 +560,18 @@ public class KwtWaybillOrderV1Service {
         waybillOrder.setStatus(CarWaybillEnum.PENDING_VEHICLE.getCode());
         waybillOrderV1Dao.updateById(waybillOrder);
 
-        /*3、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        //3、运单子单更新状态
+        List<KwtWaybillOrderSubtask> orderSubtasks = waybillOrderSubtaskDao.findByWOrderId(wOrderId);
+        for (KwtWaybillOrderSubtask subtask:orderSubtasks) {
+            //更新运单子单状态
+            subtask.setStatus(waybillOrder.getStatus());
+            waybillOrderSubtaskDao.updateById(subtask);
+        }
 
-        /*4、更新司机/车辆数据*/
+        /*4、新增运单状态记录*/
+        setWaybillOrderTrack(waybillOrder.getId(), null, null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+
+        /*5、更新司机/车辆数据*/
         //更新司机信息
         editDriver(waybillOrder.getDriverId());
         //更新车辆信息
@@ -564,8 +581,8 @@ public class KwtWaybillOrderV1Service {
             return HttpResult.ok();
         }
 
-        /*5、累加物流订单委托量(循环运单)*/
-        /*5.1、装货址委派量entrustAmount累加*/
+        /*6、累加物流订单委托量(循环运单)*/
+        /*6.1、装货址委派量entrustAmount累加*/
         //运单装货地址
         List<KwtWaybillOrderAddress> orderAddresses = waybillOrderAddressDao.findByAddresses(wOrderId, AddressDefaultTypeEnum.SHIPMENT.getCode());
         for (KwtWaybillOrderAddress address:orderAddresses) {
@@ -577,9 +594,7 @@ public class KwtWaybillOrderV1Service {
             logisticsOrderAmountDao.updateById(logisticsOrderAmount);
         }
 
-        /*5.2、物流订单委派量entrustAmount累加*/
-        //运单子订单
-        List<KwtWaybillOrderSubtask> orderSubtasks = waybillOrderSubtaskDao.findByWOrderId(wOrderId);
+        /*6.2、物流订单委派量entrustAmount累加*/
         for (KwtWaybillOrderSubtask subtask:orderSubtasks) {
             //物流订单
             KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(subtask.getLOrderId());
@@ -616,15 +631,23 @@ public class KwtWaybillOrderV1Service {
         waybillOrderV1Dao.updateById(waybillOrder);
 
         /*3、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        setWaybillOrderTrack(waybillOrder.getId(), null, null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+
+        //4、运单子单更新状态
+        List<KwtWaybillOrderSubtask> orderSubtasks = waybillOrderSubtaskDao.findByWOrderId(wOrderId);
+        for (KwtWaybillOrderSubtask subtask:orderSubtasks) {
+            //更新运单子单状态
+            subtask.setStatus(waybillOrder.getStatus());
+            waybillOrderSubtaskDao.updateById(subtask);
+        }
 
         //循环运单不对物流订单委托量变更
         if (waybillOrder.getType() == Global.NUMERICAL_TWO) {
             return HttpResult.ok();
         }
 
-        /*4、回退物流订单委托量(循环运单)*/
-        /*4.1、装货址委派量entrustAmount回退*/
+        /*5、回退物流订单委托量(循环运单)*/
+        /*5.1、装货址委派量entrustAmount回退*/
         //运单装货地址
         List<KwtWaybillOrderAddress> orderAddresses = waybillOrderAddressDao.findByAddresses(wOrderId, AddressDefaultTypeEnum.SHIPMENT.getCode());
         for (KwtWaybillOrderAddress address:orderAddresses) {
@@ -636,9 +659,7 @@ public class KwtWaybillOrderV1Service {
             logisticsOrderAmountDao.updateById(logisticsOrderAmount);
         }
 
-        /*4.2、物流订单委派量entrustAmount回退*/
-        //运单子订单
-        List<KwtWaybillOrderSubtask> orderSubtasks = waybillOrderSubtaskDao.findByWOrderId(wOrderId);
+        /*5.2、物流订单委派量entrustAmount回退*/
         for (KwtWaybillOrderSubtask subtask:orderSubtasks) {
             //物流订单
             KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(subtask.getLOrderId());
@@ -679,10 +700,18 @@ public class KwtWaybillOrderV1Service {
         waybillOrder.setStatus(CarWaybillEnum.EXIT_COMPLETED.getCode());
         waybillOrderV1Dao.updateById(waybillOrder);
 
-        /*3、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        //3、运单子单更新状态
+        List<KwtWaybillOrderSubtask> orderSubtasks = waybillOrderSubtaskDao.findByWOrderId(wOrderId);
+        for (KwtWaybillOrderSubtask subtask:orderSubtasks) {
+            //更新运单子单状态
+            subtask.setStatus(waybillOrder.getStatus());
+            waybillOrderSubtaskDao.updateById(subtask);
+        }
+
+        /*4、新增运单状态记录*/
+        setWaybillOrderTrack(waybillOrder.getId(), null, null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
 
-        /*4、更新司机/车辆数据*/
+        /*5、更新司机/车辆数据*/
         //更新司机信息
         editDriver(waybillOrder.getDriverId());
         //更新车辆信息
@@ -714,11 +743,19 @@ public class KwtWaybillOrderV1Service {
         waybillOrder.setStatus(CarWaybillEnum.REFUSE_TRAFFIC.getCode());
         waybillOrderV1Dao.updateById(waybillOrder);
 
-        /*3、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        //3、运单子单更新状态
+        List<KwtWaybillOrderSubtask> orderSubtasks = waybillOrderSubtaskDao.findByWOrderId(wOrderId);
+        for (KwtWaybillOrderSubtask subtask:orderSubtasks) {
+            //更新运单子单状态
+            subtask.setStatus(waybillOrder.getStatus());
+            waybillOrderSubtaskDao.updateById(subtask);
+        }
+
+        /*4、新增运单状态记录*/
+        setWaybillOrderTrack(waybillOrder.getId(), null, null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
 
-        /*4、回退物流订单委托量*/
-        /*4.1、装货址委派量entrustAmount回退*/
+        /*5、回退物流订单委托量*/
+        /*5.1、装货址委派量entrustAmount回退*/
         //运单装货地址
         List<KwtWaybillOrderAddress> orderAddresses = waybillOrderAddressDao.findByAddresses(wOrderId, AddressDefaultTypeEnum.SHIPMENT.getCode());
         for (KwtWaybillOrderAddress address:orderAddresses) {
@@ -730,9 +767,7 @@ public class KwtWaybillOrderV1Service {
             logisticsOrderAmountDao.updateById(logisticsOrderAmount);
         }
 
-        /*4.2、物流订单委派量entrustAmount回退*/
-        //运单子订单
-        List<KwtWaybillOrderSubtask> orderSubtasks = waybillOrderSubtaskDao.findByWOrderId(wOrderId);
+        /*5.2、物流订单委派量entrustAmount回退*/
         for (KwtWaybillOrderSubtask subtask:orderSubtasks) {
             //物流订单
             KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(subtask.getLOrderId());
@@ -768,8 +803,14 @@ public class KwtWaybillOrderV1Service {
         waybillOrder.setStatus(CarWaybillEnum.WAIT_LOADING.getCode());
         waybillOrderV1Dao.updateById(waybillOrder);
 
-        /*3、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), params.getWSubtaskId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        /*3、更新车辆运单-子单*/
+        //运单子单信息
+        KwtWaybillOrderSubtask orderSubtask = waybillOrderSubtaskDao.selectById(params.getWSubtaskId());
+        orderSubtask.setStatus(waybillOrder.getStatus());
+        waybillOrderSubtaskDao.updateById(orderSubtask);
+
+        /*4、新增运单状态记录*/
+        setWaybillOrderTrack(waybillOrder.getId(), params.getWSubtaskId(), params.getWAddressId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
         return HttpResult.ok();
     }
 
@@ -808,7 +849,7 @@ public class KwtWaybillOrderV1Service {
         waybillOrderSubtaskDao.updateById(orderSubtask);
 
         /*3、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), params.getWSubtaskId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        setWaybillOrderTrack(waybillOrder.getId(), params.getWSubtaskId(), params.getWAddressId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
 
         /*4、新增装卸货榜单信息*/
         waybillOrderTicketService.addTicketV1(loading, waybillOrder.getId(), params.getWSubtaskId(), params.getWAddressId(), params.getUrls(), params.getOperateTime(), Global.NUMERICAL_ONE);
@@ -839,8 +880,14 @@ public class KwtWaybillOrderV1Service {
         waybillOrder.setStatus(CarWaybillEnum.WAIT_UNLOADING.getCode());
         waybillOrderV1Dao.updateById(waybillOrder);
 
-        /*3、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), params.getWSubtaskId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        /*3、更新车辆运单-子单*/
+        //运单子单信息
+        KwtWaybillOrderSubtask orderSubtask = waybillOrderSubtaskDao.selectById(params.getWSubtaskId());
+        orderSubtask.setStatus(waybillOrder.getStatus());
+        waybillOrderSubtaskDao.updateById(orderSubtask);
+
+        /*4、新增运单状态记录*/
+        setWaybillOrderTrack(waybillOrder.getId(), params.getWSubtaskId(), params.getWAddressId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
         return HttpResult.ok();
     }
 
@@ -885,7 +932,7 @@ public class KwtWaybillOrderV1Service {
         waybillOrderSubtaskDao.updateById(orderSubtask);
 
         /*3、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), params.getWSubtaskId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        setWaybillOrderTrack(waybillOrder.getId(), params.getWSubtaskId(), params.getWAddressId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
 
         /*4、新增装卸货榜单信息*/
         waybillOrderTicketService.addTicketV1(loading, waybillOrder.getId(), params.getWSubtaskId(), params.getWAddressId(), params.getUrls(), params.getOperateTime(), Global.NUMERICAL_TWO);
@@ -921,7 +968,7 @@ public class KwtWaybillOrderV1Service {
         waybillOrderV1Dao.updateById(waybillOrder);
 
         /*6.2、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        setWaybillOrderTrack(waybillOrder.getId(), null, null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
 
         /*7、更新司机/车辆数据*/
         //更新司机信息
@@ -985,19 +1032,25 @@ public class KwtWaybillOrderV1Service {
         }
 
         //新增运单状态记录kwt_waybill_order_track
-        setWaybillOrderTrack(waybillOrderNew.getId(), null, waybillOrderNew.getCreateTime(), waybillOrderNew.getStatus(), null);
+        setWaybillOrderTrack(waybillOrderNew.getId(), null, null, waybillOrderNew.getCreateTime(), waybillOrderNew.getStatus(), null);
     }
 
     /**
      * @param params {}
-     * @desc 修改单证-装卸货-多单位
+     * @desc 修改单证
      * @author zk
-     * @date 2024/3/6
+     * @date 2024/3/7
      **/
     @Transactional(rollbackFor = Exception.class)
-    public HttpResult editTicketV1(WaybillOrderTicketV4Dto params) {
+    public HttpResult editTicketV1(WaybillOrderEditTicketDto params) {
         /*1、校验*/
-        Long wOrderId = params.getWOrderId();
+        Long wTicketId = params.getWTicketId();
+        KwtWaybillOrderTicket ticket = waybillOrderTicketDao.selectById(wTicketId);
+        //榜单信息
+        if (ticket == null) {
+            return HttpResult.error("榜单信息不存在,请确认!");
+        }
+        Long wOrderId = ticket.getWOrderId();
         //运单信息
         KwtWaybillOrderV1 waybillOrder = waybillOrderV1Dao.selectById(wOrderId);
         if (waybillOrder == null) {
@@ -1008,7 +1061,7 @@ public class KwtWaybillOrderV1Service {
             return HttpResult.error("运单" + waybillOrder.getWOrderNo() + "当前状态已不能修改榜单!");
         }
         //地址信息
-        KwtWaybillOrderAddress address = waybillOrderAddressDao.selectById(params.getWAddressId());
+        KwtWaybillOrderAddress address = waybillOrderAddressDao.selectById(ticket.getWAddressId());
         if (address == null) {
             return HttpResult.error("运单该地址已不存在!");
         }
@@ -1016,17 +1069,17 @@ public class KwtWaybillOrderV1Service {
         /*2、更新装卸货榜单信息*/
         //榜单信息
         List<WaybillOrderTicketLoadingDto> loading = params.getLoading();
-        waybillOrderTicketService.editTicketV1(loading, params.getWAddressId(), params.getUrls(), params.getOperateTime());
+        waybillOrderTicketService.editTicketV1(loading, ticket.getWAddressId(), params.getUrls(), params.getOperateTime());
 
         /*3、更新车辆运单-子单*/
         //运单子单信息
-        KwtWaybillOrderSubtask orderSubtask = waybillOrderSubtaskDao.selectById(params.getWSubtaskId());
+        KwtWaybillOrderSubtask orderSubtask = waybillOrderSubtaskDao.selectById(ticket.getWSubtaskId());
         //物流运单信息
         KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(orderSubtask.getLOrderId());
         //运单-子单装货榜单信息
-        List<KwtWaybillOrderTicket> loadTickets = waybillOrderTicketDao.findWaybillOrderTicketV1(wOrderId, params.getWSubtaskId(), AddressDefaultTypeEnum.SHIPMENT.getCode(), orderSubtask.getUnit());
+        List<KwtWaybillOrderTicket> loadTickets = waybillOrderTicketDao.findWaybillOrderTicketV1(wOrderId, ticket.getWSubtaskId(), AddressDefaultTypeEnum.SHIPMENT.getCode(), orderSubtask.getUnit());
         //运单-子单卸货榜单信息
-        List<KwtWaybillOrderTicket> unloadTickets = waybillOrderTicketDao.findWaybillOrderTicketV1(wOrderId, params.getWSubtaskId(), AddressDefaultTypeEnum.TAKE.getCode(), orderSubtask.getUnit());
+        List<KwtWaybillOrderTicket> unloadTickets = waybillOrderTicketDao.findWaybillOrderTicketV1(wOrderId, ticket.getWSubtaskId(), AddressDefaultTypeEnum.TAKE.getCode(), orderSubtask.getUnit());
         //装货-总量
         BigDecimal loadAmount = loadTickets.stream().map(KwtWaybillOrderTicket::getAmount ).reduce(BigDecimal.ZERO, BigDecimal::add);
         //卸货-总量
@@ -1038,9 +1091,372 @@ public class KwtWaybillOrderV1Service {
                 logisticsOrder.getLoss(), logisticsOrder.getLossUnit(), logisticsOrder.getGoodsPrice());
         orderSubtask.setDeficitPrice(deficitPrice.doubleValue());
         waybillOrderSubtaskDao.updateById(orderSubtask);
+
+        /*4、更新车辆运单子单状态*/
+        //运单子单信息
+        List<KwtWaybillOrderSubtask> subtasks = waybillOrderSubtaskDao.findByWOrderId(orderSubtask.getWOrderId());
+        for (KwtWaybillOrderSubtask subtask:subtasks) {
+            //运单子单状态不为驳回状态则不更新运单状态
+            if (!subtask.getStatus().equals(CarWaybillEnum.APPROVAL_NO_PASS.getCode())) {
+                return HttpResult.ok();
+            }
+            //榜单存在审核失败状态则不更新运单状态
+            List<KwtWaybillOrderTicket> tickets = waybillOrderTicketDao.findWaybillOrderTicket(null, subtask.getId(), null);
+            for (KwtWaybillOrderTicket ticket1:tickets) {
+                if (ticket1.getStatus() == Global.NUMERICAL_ONE) {
+                    return HttpResult.ok();
+                }
+            }
+            //运单-子弹当前为驳回则状态更新为单证更新审核中
+            int status = orderSubtask.getStatus().equals(CarWaybillEnum.APPROVAL_NO_PASS.getCode()) ? CarWaybillEnum.APPROVAL_IN.getCode() : orderSubtask.getStatus();
+            subtask.setStatus(status);
+            waybillOrderSubtaskDao.updateById(subtask);
+        }
+
+        /*5、更新车辆运单-状态*/
+        //运单状态不为驳回状态则不更新运单状态
+        if (!waybillOrder.getStatus().equals(CarWaybillEnum.APPROVAL_NO_PASS.getCode())) {
+            return HttpResult.ok();
+        }
+        //运单子单存在非待审核和审核中则不更新
+        subtasks = waybillOrderSubtaskDao.findByWOrderId(orderSubtask.getWOrderId());
+        for (KwtWaybillOrderSubtask subtask:subtasks) {
+            if (!subtask.getStatus().equals(CarWaybillEnum.APPROVAL_IN.getCode())
+                    && !subtask.getStatus().equals(CarWaybillEnum.APPROVAL_TREAT.getCode())) {
+                return HttpResult.ok();
+            }
+        }
+        waybillOrder.setStatus(CarWaybillEnum.APPROVAL_IN.getCode());
+        waybillOrderV1Dao.updateById(waybillOrder);
+
+        /*4.2、新增运单状态记录*/
+        setWaybillOrderTrack(waybillOrder.getId(), null, null, null, waybillOrder.getStatus(), null);
+        return HttpResult.ok();
+    }
+
+    /**
+     * @param params {}
+     * @desc 单证审核-驳回
+     * @author zk
+     * @date 2024/3/7
+     **/
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult approvalReject(List<WaybillOrderTicketApprovalRejectDto> params) {
+        /*1、验证*/
+        if (CollectionUtils.isEmpty(params)) {
+            return HttpResult.error("请选择需要驳回的榜单!");
+        }
+        //运单ID集
+        List<Long> wOrderIds = new ArrayList<>();
+        //运单-子单ID集
+        List<Long> wSubtaskIds = new ArrayList<>();
+        for (WaybillOrderTicketApprovalRejectDto approval:params) {
+            KwtWaybillOrderTicket ticket = waybillOrderTicketDao.selectById(approval.getWTicketId());
+            if (ticket == null) {
+                return HttpResult.error("榜单不存在请确认!");
+            }
+            wOrderIds.add(ticket.getWOrderId());
+            wSubtaskIds.add(ticket.getWSubtaskId());
+        }
+
+        /*2、数据处理*/
+        /*2.1、修改榜单状态*/
+        for (WaybillOrderTicketApprovalRejectDto approval:params) {
+            KwtWaybillOrderTicket ticket = waybillOrderTicketDao.selectById(approval.getWTicketId());
+            ticket.setStatus(Global.NUMERICAL_ONE);
+            ticket.setRemark(approval.getRemark());
+            waybillOrderTicketDao.updateById(ticket);
+        }
+        /*2.2、修改运单状态*/
+        for (Long wOrderId:wOrderIds) {
+            KwtWaybillOrderV1 waybillOrder = waybillOrderV1Dao.selectById(wOrderId);
+            if (waybillOrder.getStatus().equals(CarWaybillEnum.APPROVAL_NO_PASS.getCode())) {
+                continue;
+            }
+            waybillOrder.setStatus(CarWaybillEnum.APPROVAL_NO_PASS.getCode());
+            waybillOrderV1Dao.updateById(waybillOrder);
+
+            /*2.3、新增运单状态记录*/
+            setWaybillOrderTrack(waybillOrder.getId(), null, null, null, waybillOrder.getStatus(), null);
+        }
+
+        /*2.4、修改运单-子单状态*/
+        for (Long wSubtaskId:wSubtaskIds) {
+            KwtWaybillOrderSubtask orderSubtask = waybillOrderSubtaskDao.selectById(wSubtaskId);
+            if (orderSubtask.getStatus().equals(CarWaybillEnum.APPROVAL_NO_PASS.getCode())) {
+                continue;
+            }
+            orderSubtask.setStatus(CarWaybillEnum.APPROVAL_NO_PASS.getCode());
+            waybillOrderSubtaskDao.updateById(orderSubtask);
+        }
         return HttpResult.ok();
     }
 
+    /**
+     * @param params {}
+     * @desc 单证审核(编辑单证)
+     * @author zk
+     * @date 2024/3/7
+     **/
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult approvalEditTicketV1(WaybillOrderTicketApprovalV2Dto params) {
+        /*1、校验*/
+        Long wOrderId = params.getWOrderId();
+        //运单信息
+        KwtWaybillOrderV1 waybillOrder = waybillOrderV1Dao.selectById(wOrderId);
+        if (waybillOrder == null) {
+            return HttpResult.error("运单" + wOrderId + "不存在,请确认!");
+        }
+        //已出车、到达装货地、已装货、到达卸货地、已卸货的车辆运单才能卸货
+        if (!waybillOrder.getStatus().equals(CarWaybillEnum.APPROVAL_TREAT.getCode())
+                && waybillOrder.getStatus().equals(CarWaybillEnum.APPROVAL_NO_PASS.getCode())
+                && waybillOrder.getStatus().equals(CarWaybillEnum.APPROVAL_IN.getCode())) {
+            return HttpResult.error("运单" + waybillOrder.getWOrderNo() + "当前状态已不能审核!");
+        }
+        //变更榜单信息校验
+        if (CollectionUtils.isNotEmpty(params.getTickets())) {
+            //变更榜单信息
+            List<WaybillOrderTicketV4Dto> tickets = params.getTickets();
+            for (WaybillOrderTicketV4Dto ticket:tickets) {
+                //地址信息
+                KwtWaybillOrderAddress address = waybillOrderAddressDao.selectById(ticket.getWAddressId());
+                if (address == null) {
+                    return HttpResult.error("运单该地址已不存在!");
+                }
+            }
+        }
+
+        /*2、更新榜单信息*/
+        /*2.1、同步更新变更榜单信息*/
+        editTicket(params);
+
+        /*2.2、更新榜单状态为审核通过*/
+        List<KwtWaybillOrderTicket> tickets = waybillOrderTicketDao.findWaybillOrderTicket(wOrderId, null, null);
+        for (KwtWaybillOrderTicket ticket:tickets) {
+            ticket.setStatus(Global.NUMERICAL_TWO);
+            waybillOrderTicketDao.updateById(ticket);
+        }
+
+        /*3、修改运单状态*/
+        waybillOrder.setStatus(CarWaybillEnum.APPROVAL_PASS.getCode());
+        waybillOrderV1Dao.updateById(waybillOrder);
+
+        /*4、新增运单状态记录*/
+        setWaybillOrderTrack(waybillOrder.getId(), null, null, null, waybillOrder.getStatus(), null);
+
+        /*5、修改运单-子单状态*/
+        List<KwtWaybillOrderSubtask> subtasks = waybillOrderSubtaskDao.findByWOrderId(wOrderId);
+        for (KwtWaybillOrderSubtask subtask:subtasks) {
+            subtask.setStatus(waybillOrder.getStatus());
+            waybillOrderSubtaskDao.updateById(subtask);
+        }
+
+        /*6、更新司机/车辆数据*/
+        //更新司机信息
+        editDriver(waybillOrder.getDriverId());
+        //更新车辆信息
+        editTruck(waybillOrder.getTruckId());
+
+        /*7、物流订单信息更新*/
+        editLogisticsOrder(subtasks);
+        return HttpResult.ok();
+    }
+
+    /**
+     * @param params {}
+     * @desc 更新榜单信息-单证审核
+     * @author zk
+     * @date 2024/3/7
+     **/
+    public void editTicket(WaybillOrderTicketApprovalV2Dto params) {
+        //变更榜单信息
+        List<WaybillOrderTicketV4Dto> tickets = params.getTickets();
+        if (CollectionUtils.isEmpty(tickets)) {
+            return;
+        }
+
+        for (WaybillOrderTicketV4Dto ticket:tickets) {
+            //车辆运单ID
+            Long wOrderId = ticket.getWOrderId();
+
+            /*1、更新装卸货榜单信息*/
+            //榜单信息
+            List<WaybillOrderTicketLoadingDto> loading = ticket.getLoading();
+            waybillOrderTicketService.editTicketV1(loading, ticket.getWAddressId(), ticket.getUrls(), ticket.getOperateTime());
+
+            /*2、更新车辆运单-子单*/
+            //运单子单信息
+            KwtWaybillOrderSubtask orderSubtask = waybillOrderSubtaskDao.selectById(ticket.getWSubtaskId());
+            //物流运单信息
+            KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(orderSubtask.getLOrderId());
+            //运单-子单装货榜单信息
+            List<KwtWaybillOrderTicket> loadTickets = waybillOrderTicketDao.findWaybillOrderTicketV1(wOrderId, ticket.getWSubtaskId(), AddressDefaultTypeEnum.SHIPMENT.getCode(), orderSubtask.getUnit());
+            //运单-子单卸货榜单信息
+            List<KwtWaybillOrderTicket> unloadTickets = waybillOrderTicketDao.findWaybillOrderTicketV1(wOrderId, ticket.getWSubtaskId(), AddressDefaultTypeEnum.TAKE.getCode(), orderSubtask.getUnit());
+            //装货-总量
+            BigDecimal loadAmount = loadTickets.stream().map(KwtWaybillOrderTicket::getAmount ).reduce(BigDecimal.ZERO, BigDecimal::add);
+            //卸货-总量
+            BigDecimal unloadAmount = unloadTickets.stream().map(KwtWaybillOrderTicket::getAmount ).reduce(BigDecimal.ZERO, BigDecimal::add);
+            orderSubtask.setLoadAmount(loadAmount.doubleValue());
+            orderSubtask.setUnloadAmount(unloadAmount.doubleValue());
+            orderSubtask.setDeficitAmount(BigDecimal.valueOf(orderSubtask.getLoadAmount()).subtract(BigDecimal.valueOf(orderSubtask.getUnloadAmount())).doubleValue());
+            BigDecimal deficitPrice = deficitPrice(BigDecimal.valueOf(orderSubtask.getLoadAmount()), BigDecimal.valueOf(orderSubtask.getDeficitAmount()),
+                    logisticsOrder.getLoss(), logisticsOrder.getLossUnit(), logisticsOrder.getGoodsPrice());
+            orderSubtask.setDeficitPrice(deficitPrice.doubleValue());
+            waybillOrderSubtaskDao.updateById(orderSubtask);
+        }
+    }
+
+    /**
+     * @param subtasks {}
+     * @desc 更新物流订单信息-单证审核
+     * @author zk
+     * @date 2024/3/7
+     **/
+    public void editLogisticsOrder(List<KwtWaybillOrderSubtask> subtasks) {
+        //数据处理
+        for (KwtWaybillOrderSubtask subtask:subtasks) {
+            /*1、物流订单信息更新*/
+            //物流订单信息
+            KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(subtask.getLOrderId());
+            //装货统计
+            Map<String, Object> queryParams = new HashMap<>(NumberConstant.SIXTEEN);
+            queryParams.put("lOrderId", subtask.getLOrderId());
+            queryParams.put("unit", logisticsOrder.getUnit());
+            queryParams.put("type", NumberConstant.ONE);
+            queryParams.put("passStatus", Global.NUMERICAL_ONE);
+            WaybillCountVo loadCount = waybillOrderV1Dao.findTicketCountByAddress(queryParams);
+            //卸货统计
+            queryParams.put("type", NumberConstant.TWO);
+            WaybillCountVo unloadCount = waybillOrderV1Dao.findTicketCountByAddress(queryParams);
+
+            //委派量多退少补entrustAmount(委派未运量=运单子单承运委派量-运单子单装货量)
+            BigDecimal residue = BigDecimal.valueOf(subtask.getEntrustAmount()).subtract(BigDecimal.valueOf(subtask.getLoadAmount()));
+            logisticsOrder.setEntrustAmount(logisticsOrder.getEntrustAmount().subtract(residue));
+            logisticsOrder.setLoadAmount(loadCount.getAmount());
+            logisticsOrder.setLoadTime(loadCount.getLoadTime());
+            logisticsOrder.setUnloadAmount(unloadCount.getAmount());
+            logisticsOrder.setUnloadTime(unloadCount.getUnloadTime());
+            logisticsOrder.setDeficitAmount(logisticsOrder.getLoadAmount().subtract(logisticsOrder.getUnloadAmount()));
+            BigDecimal deficitPrice = deficitPrice(logisticsOrder.getLoadAmount(), logisticsOrder.getDeficitAmount(),
+                                      logisticsOrder.getLoss(), logisticsOrder.getLossUnit(), logisticsOrder.getGoodsPrice());
+            logisticsOrder.setDeficitPrice(deficitPrice);
+            logisticsOrderDao.updateById(logisticsOrder);
+
+            /*2、物流订单地址运量信息更新*/
+            List<KwtLogisticsOrderAmount> amounts = logisticsOrderAmountDao.findByLOrderId(subtask.getLOrderId());
+            for (KwtLogisticsOrderAmount amount:amounts) {
+                //物流运单地址信息
+                KwtLogisticsOrderAddress address = logisticsOrderAddressDao.selectById(amount.getLAddressId());
+                //运单地址进行统计
+                queryParams.clear();
+                queryParams.put("lAddressId", amount.getLAddressId());
+                queryParams.put("passStatus", Global.NUMERICAL_ONE);
+                WaybillCountVo waybillCount = waybillOrderV1Dao.findTicketCountByAddress(queryParams);
+                if (address.getAddressType().equals(AddressDefaultTypeEnum.SHIPMENT.getCode())) {
+                    //计算单个地址需要回退委派量
+                    BigDecimal countEntrustAmount = countEntrustAmount(subtask, amount.getLAddressId());
+                    amount.setEntrustAmount(amount.getEntrustAmount().subtract(countEntrustAmount));
+                    amount.setLoadAmount(waybillCount.getAmount());
+                    amount.setLoadTime(LocalDateTime.ofInstant(waybillCount.getLoadTime().toInstant(), ZoneId.systemDefault()));
+                } else {
+                    amount.setUnloadAmount(waybillCount.getAmount());
+                    amount.setUnloadTime(LocalDateTime.ofInstant(waybillCount.getUnloadTime().toInstant(), ZoneId.systemDefault()));
+                }
+                logisticsOrderAmountDao.updateById(amount);
+            }
+
+            /*3、物流订单辅助单位信息更新*/
+            kwtLogisticsOrderGoodsService.editLogisticsOrderGoodsLoading(logisticsOrder.getId());
+
+            /*4、校验当前承运订单是否运输完成(修改状态+统计量)*/
+            editLogisticsTotalCount(logisticsOrder.getId());
+        }
+    }
+
+    /**
+     * @param subtask {}
+     * @desc 计算单个地址需要回退委派量-单证审核
+     * @author zk
+     * @date 2024/3/7
+     **/
+    public BigDecimal countEntrustAmount(KwtWaybillOrderSubtask subtask, Long lAddressId){
+        List<KwtWaybillOrderAddress> addresses = waybillOrderAddressDao.findBySubtaskId(subtask.getId(), AddressDefaultTypeEnum.SHIPMENT.getCode());
+        //运单地址进行统计
+        Map<String, Object> queryParams = new HashMap<>(NumberConstant.SIXTEEN);
+        queryParams.put("wOrderId", subtask.getWOrderId());
+        queryParams.put("lAddressId", lAddressId);
+        queryParams.put("passStatus", Global.NUMERICAL_ONE);
+        WaybillCountVo waybillCount = waybillOrderV1Dao.findTicketCountByAddress(queryParams);
+        //地址总委派量
+        BigDecimal entrustAmount = addresses.stream().map(KwtWaybillOrderAddress::getEntrustAmount ).reduce(BigDecimal.ZERO, BigDecimal::add);
+        //委派量多退少补entrustAmount(委派未运量=运单子单承运委派量-运单子单装货量)
+        return entrustAmount.subtract(waybillCount.getAmount());
+    }
+
+    /**
+     * @param lOrderId 承运订单ID
+     * @desc 校验当前承运订单是否运输完成(修改状态 + 统计量)
+     * @author zk
+     * @date 2024/3/8
+     **/
+    public void editLogisticsTotalCount(Long lOrderId) {
+        /*1、物流订单信息更新*/
+        //物流订单信息
+        KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(lOrderId);
+        //装货统计
+        Map<String, Object> queryParams = new HashMap<>(NumberConstant.SIXTEEN);
+        queryParams.put("upperlOrderId", lOrderId);
+        queryParams.put("unit", logisticsOrder.getUnit());
+        queryParams.put("type", NumberConstant.ONE);
+        queryParams.put("passStatus", Global.NUMERICAL_ONE);
+        WaybillCountVo loadCount = waybillOrderV1Dao.findTicketCountByAddress(queryParams);
+        //卸货统计
+        queryParams.put("type", NumberConstant.TWO);
+        WaybillCountVo unloadCount = waybillOrderV1Dao.findTicketCountByAddress(queryParams);
+        logisticsOrder.setTotalLoadAmount(loadCount.getAmount());
+        logisticsOrder.setTotalUnloadAmount(unloadCount.getAmount());
+        logisticsOrderDao.updateById(logisticsOrder);
+
+        /*2、物流订单地址运量信息更新*/
+        List<KwtLogisticsOrderAmount> amounts = logisticsOrderAmountDao.findByLOrderId(lOrderId);
+        for (KwtLogisticsOrderAmount amount:amounts) {
+            //物流运单地址信息
+            KwtLogisticsOrderAddress address = logisticsOrderAddressDao.selectById(amount.getLAddressId());
+
+            //运单地址进行统计
+            queryParams.clear();
+            queryParams.put("lAddressId", amount.getLAddressId());
+            queryParams.put("upperlOrderId", lOrderId);
+            queryParams.put("unit", logisticsOrder.getUnit());
+            queryParams.put("passStatus", Global.NUMERICAL_ONE);
+            WaybillCountVo waybillCount1 = waybillOrderV1Dao.findTicketCountByAddress(queryParams);
+            if (address.getAddressType().equals(AddressDefaultTypeEnum.SHIPMENT.getCode())) {
+                amount.setTotalLoadAmount(waybillCount1.getAmount());
+            } else {
+                amount.setTotalUnloadAmount(waybillCount1.getAmount());
+            }
+            logisticsOrderAmountDao.updateById(amount);
+        }
+
+        /*3、物流订单辅助单位信息更新*/
+        kwtLogisticsOrderGoodsService.editLogisticsOrderGoodsTotalLoading(logisticsOrder.getId());
+
+        /*4、递归处理上级物流订单*/
+        //获取所有上级物流订单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)) {
+                    /*校验当前承运订单是否运输完成*/
+                    editLogisticsTotalCount(pid);
+                }
+            }
+        }
+    }
 
 
 

+ 10 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderAmountMapper.xml

@@ -28,4 +28,14 @@
         where del_flag = 0
         and l_address_id = #{lAddressId, jdbcType=BIGINT}
     </select>
+
+    <select id="findByLOrderId" resultType="com.sckw.transport.model.KwtLogisticsOrderAmount" >
+        select
+        id, l_order_id lOrderId, l_address_id lAddressId, amount, subcontract_amount subcontractAmount,
+        entrust_amount entrustAmount, load_amount loadAmount, unload_amount unloadAmount, ignore_amount ignoreAmount,
+        load_time loadTime, unload_time unloadTime, total_load_amount totalLoadAmount, total_unload_amount totalUnloadAmount
+        from kwt_logistics_order_amount
+        where del_flag = 0
+        and l_order_id = #{lOrderId, jdbcType=BIGINT}
+    </select>
 </mapper>

+ 16 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderAddressMapper.xml

@@ -41,6 +41,22 @@
         </if>
     </select>
 
+    <select id="findByLAddressIds" resultType="com.sckw.transport.model.KwtWaybillOrderAddress" >
+        select
+        id, w_order_id wOrderId, w_subtask_id wSubtaskId, l_address_id lAddressId, address_type addressType,
+        `name`, `type`, contacts, phone, city_code cityCode, city_name cityName, detail_address detailAddress,
+        lat, lng, fence, entry_type entryType, plan_time planTime, entrust_amount entrustAmount, sort, remark,
+        `status`, create_by createBy, create_time createTime, update_by updateBy, update_time updateTime
+        from kwt_waybill_order_address
+        where del_flag = 0
+        <if test="lAddressIds != null and lAddressIds.size() > 0">
+            AND l_address_id IN
+            <foreach collection="lAddressIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+
     <select id="findAddressCodeList" resultType="java.lang.Integer" >
         SELECT
         DISTINCT kwoa.city_code

+ 34 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderV1Mapper.xml

@@ -44,4 +44,38 @@
         </if>
     </select>
 
+    <select id="findTicketCountByAddress" resultType="com.sckw.transport.model.vo.WaybillCountVo">
+        SELECT
+        sum(wot.amount) amount,
+        MIN(wot.operate_time) loadTime,
+        MAX(wot.operate_time) unloadTime
+        from kwt_waybill_order_ticket wot
+        left join kwt_waybill_order_address woa on woa.id = wot.w_address_id
+        left join kwt_logistics_order_address loa on loa.id = woa.l_address_id
+        left join kwt_logistics_order lo on lo.id = loa.l_order_id
+        left join kwt_waybill_order wo on wo.id = wot.w_order_id
+        where wot.del_flag = 0
+        <if test="passStatus != null and passStatus != ''">
+            and wo.status = 502
+        </if>
+        <if test="wOrderId != null and wOrderId != ''">
+            and wot.w_order_id = #{wOrderId, jdbcType=BIGINT}
+        </if>
+        <if test="type != null and type != ''">
+            and wot.type = #{type, jdbcType=VARCHAR}
+        </if>
+        <if test="unit != null and unit != ''">
+            and wot.unit = #{unit, jdbcType=VARCHAR}
+        </if>
+        <if test="lAddressId != null and lAddressId != ''">
+            and loa.id = #{lAddressId, jdbcType=BIGINT}
+        </if>
+        <if test="lOrderId != null and lOrderId != ''">
+            and lo.id = #{lOrderId, jdbcType=BIGINT}
+        </if>
+        <if test="upperlOrderId != null and upperlOrderId != ''">
+            and FIND_IN_SET(#{upperlOrderId, jdbcType=BIGINT}, lo.pids)
+        </if>
+    </select>
+
 </mapper>