Browse Source

1、4.2已出车、到达装货地、已装货、到达卸货地、已卸货接口;

zk 1 năm trước cách đây
mục cha
commit
4b90fe7b10

+ 21 - 30
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarWaybillEnum.java

@@ -141,46 +141,37 @@ public enum CarWaybillEnum {
      * @date 2023/8/2
      **/
     public static boolean changeDriver(int code) {
-        if (code == CarWaybillEnum.COMPLETION_UNLOADING.getCode()
-                || code == CarWaybillEnum.APPROVAL_PASS.getCode()
-                || code == CarWaybillEnum.REJECT_ORDER.getCode()
-                || code == CarWaybillEnum.REFUSE_TRAFFIC.getCode()
-                || code == CarWaybillEnum.REVOKED.getCode()
-                || code == CarWaybillEnum.APPROVAL_NO_PASS.getCode()) {
-            return false;
-        }
-        return true;
+        return code != CarWaybillEnum.COMPLETION_UNLOADING.getCode()
+                && code != CarWaybillEnum.APPROVAL_PASS.getCode()
+                && code != CarWaybillEnum.REJECT_ORDER.getCode()
+                && code != CarWaybillEnum.REFUSE_TRAFFIC.getCode()
+                && code != CarWaybillEnum.REVOKED.getCode()
+                && code != CarWaybillEnum.APPROVAL_NO_PASS.getCode();
     }
 
     /**
      * @param code 状态码
-     * @desc 是否可以变更司机/车辆
+     * @desc 是否可以变更司机
      * @author zk
      * @date 2023/8/2
      **/
-    public static boolean changeTruck(int code) {
-        if (code == CarWaybillEnum.PENDING_ORDER.getCode()
-                || code == CarWaybillEnum.PENDING_VEHICLE.getCode()) {
-            return true;
-        }
-        return false;
+    public static boolean arriveLocation(int code) {
+        return code == CarWaybillEnum.EXIT_COMPLETED.getCode()
+                || code == CarWaybillEnum.WAIT_LOADING.getCode()
+                || code == CarWaybillEnum.COMPLETION_LOADING.getCode()
+                || code == CarWaybillEnum.WAIT_UNLOADING.getCode()
+                || code == CarWaybillEnum.COMPLETION_UNLOADING.getCode();
     }
 
     /**
-     * 获取编码以及注释
-     *
-     * @return
-     */
-    public static String getCodeAndDestination() {
-        StringBuilder sb = new StringBuilder();
-        for (CarWaybillEnum value : CarWaybillEnum.values()) {
-            sb.append(value.getCode()+":").append(value.destination).append(";");
-        }
-        return sb.toString();
+     * @param code 状态码
+     * @desc 是否可以变更司机/车辆
+     * @author zk
+     * @date 2023/8/2
+     **/
+    public static boolean changeTruck(int code) {
+        return code == CarWaybillEnum.PENDING_ORDER.getCode()
+                || code == CarWaybillEnum.PENDING_VEHICLE.getCode();
     }
 
-    public static void main(String[] args) {
-        String codeAndDestination = getCodeAndDestination();
-        System.out.println(codeAndDestination);
-    }
 }

+ 68 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtWaybillOrderController.java

@@ -163,6 +163,7 @@ public class KwtWaybillOrderController {
         return waybillOrderV1Service.sendCarV1(params);
     }
 
+
     /**
      * @param ids 车辆运单主键ID,多个已逗号隔开
      * @desc 取消派车
@@ -185,6 +186,7 @@ public class KwtWaybillOrderController {
         return waybillOrderV1Service.cancelSendCarV1(ids);
     }
 
+
     /**
      * @param params {}
      * @desc 确认接单
@@ -207,6 +209,7 @@ public class KwtWaybillOrderController {
         return waybillOrderV1Service.confirmSendCarV1(params);
     }
 
+
     /**
      * @param params {}
      * @desc 拒绝接单
@@ -229,6 +232,7 @@ public class KwtWaybillOrderController {
         return waybillOrderV1Service.refuseSendCarV1(params);
     }
 
+
     /**
      * @param params {}
      * @desc 确认出车
@@ -244,13 +248,14 @@ public class KwtWaybillOrderController {
      * @param params {}
      * @desc 确认出车
      * @author zk
-     * @date 2023/7/26
+     * @date 2024/3/7
      **/
     @PostMapping("/confirmDepartureV1")
     public HttpResult confirmDepartureV1(@RequestBody @Valid OperateWaybillDto params){
         return waybillOrderV1Service.confirmDepartureV1(params);
     }
 
+
     /**
      * @param params {}
      * @desc 拒绝出车
@@ -266,13 +271,14 @@ public class KwtWaybillOrderController {
      * @param params {}
      * @desc 拒绝出车
      * @author zk
-     * @date 2023/7/26
+     * @date 2024/3/7
      **/
     @PostMapping("/refuseDepartureV1")
     public HttpResult refuseDepartureV1(@RequestBody @Valid OperateWaybillDto params){
         return waybillOrderV1Service.refuseDepartureV1(params);
     }
 
+
     /**
      * @param params {}
      * @desc 到达装货地点
@@ -284,6 +290,18 @@ public class KwtWaybillOrderController {
         return waybillOrderService.arriveLoadLocation(params);
     }
 
+    /**
+     * @param params {}
+     * @desc 到达装货地点
+     * @author zk
+     * @date 2024/3/7
+     **/
+    @PostMapping("/arriveLoadLocationV1")
+    public HttpResult arriveLoadLocationV1(@RequestBody @Valid OperateWaybillDto params){
+        return waybillOrderV1Service.arriveLoadLocationV1(params);
+    }
+
+
     /**
      * @param params {}
      * @desc 装货
@@ -295,6 +313,18 @@ public class KwtWaybillOrderController {
         return waybillOrderService.loadingV1(params);
     }
 
+    /**
+     * @param params {}
+     * @desc 装货
+     * @author zk
+     * @date 2024/3/7
+     **/
+    @PostMapping("/loadingV1")
+    public HttpResult loadingV1(@RequestBody @Valid WaybillOrderTicketV4Dto params){
+        return waybillOrderV1Service.loadingV1(params);
+    }
+
+
     /**
      * @param params {}
      * @desc 到达卸货地点
@@ -306,6 +336,18 @@ public class KwtWaybillOrderController {
         return waybillOrderService.arriveUnloadLocation(params);
     }
 
+    /**
+     * @param params {}
+     * @desc 到达卸货地点
+     * @author zk
+     * @date 2024/3/7
+     **/
+    @PostMapping("/arriveUnloadLocationV1")
+    public HttpResult arriveUnloadLocationV1(@RequestBody @Valid OperateWaybillDto params){
+        return waybillOrderV1Service.arriveUnloadLocationV1(params);
+    }
+
+
     /**
      * @param params {}
      * @desc 卸货
@@ -317,6 +359,18 @@ public class KwtWaybillOrderController {
         return waybillOrderService.unloadingV1(params);
     }
 
+    /**
+     * @param params {}
+     * @desc 卸货
+     * @author zk
+     * @date 2024/3/7
+     **/
+    @PostMapping("/unloadingV1")
+    public HttpResult unloadingV1(@RequestBody @Valid WaybillOrderTicketV4Dto params){
+        return waybillOrderV1Service.unloadingV1(params);
+    }
+
+
     /**
      * @param params {}
      * @desc 修改单证
@@ -350,6 +404,18 @@ public class KwtWaybillOrderController {
         return waybillOrderService.editTicketV1(params);
     }
 
+    /**
+     * @param params {}
+     * @desc 修改单证-装卸货一起修改
+     * @author zk
+     * @date 2024/3/6
+     **/
+    @PostMapping("/editTicketV3")
+    public HttpResult editTicketV3(@RequestBody @Valid WaybillOrderTicketV3Dto params){
+        return waybillOrderV1Service.editTicketV1(params);
+    }
+
+
     /**
      * @param wOrderId
      * @desc 修改单证查询运单

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

@@ -27,7 +27,7 @@ public class KwtWaybillOrderTrack implements Serializable {
     private Long wOrderId;
 
     /**
-     *车 辆运单子单ID
+     *车辆运单子单ID
      */
     private Long wSubtaskId;
 

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

@@ -24,6 +24,12 @@ public class OperateWaybillDto {
     @NotNull(message = "车辆订单ID不能为空")
     private Long wOrderId;
 
+    /**
+     * 车辆订单id
+     */
+    @JsonProperty("wSubtaskId")
+    private Long wSubtaskId;
+
     /**
      * 操作时间
      */

+ 69 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/dto/WaybillOrderTicketV4Dto.java

@@ -0,0 +1,69 @@
+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 WaybillOrderTicketV4Dto {
+
+    /**
+     * 车辆运单id
+     */
+    @JsonProperty("wOrderId")
+    @NotNull(message = "车辆运单ID不能为空")
+    private Long wOrderId;
+
+    /**
+     *车辆运单子单ID
+     */
+    @JsonProperty("wSubtaskId")
+    @NotNull(message = "车辆运单子单ID不能为空")
+    private Long wSubtaskId;
+
+    /**
+     * 车辆运单地址ID
+     */
+    @JsonProperty("wAddressId")
+    @NotNull(message = "车辆运单地址ID不能为空")
+    private Long wAddressId;
+
+    /**
+     * 上传凭证地址,多个以英文逗号隔开
+     */
+    @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/service/KwtWaybillOrderTicketService.java

@@ -89,6 +89,35 @@ public class KwtWaybillOrderTicketService {
         }
     }
 
+    /**
+     * @param loading     装载信息
+     * @param wOrderId    运单ID
+     * @param wSubtaskId    车辆运单子单ID
+     * @param wAddressId    车辆运单地址ID
+     * @param urls        榜单地址
+     * @param operateTime 操作时间
+     * @param type        装卸货类型
+     * @desc 更新办单
+     * @author zk
+     * @date 2023/12/6
+     */
+    public void addTicketV1(List<WaybillOrderTicketLoadingDto> loading, Long wOrderId, Long wSubtaskId, Long wAddressId, String urls, Date operateTime, int type) {
+        if (CollectionUtils.isNotEmpty(loading)) {
+            loading.forEach(e -> {
+                KwtWaybillOrderTicket ticket = new KwtWaybillOrderTicket();
+                ticket.setWOrderId(wOrderId);
+                ticket.setWSubtaskId(wSubtaskId);
+                ticket.setWAddressId(wAddressId);
+                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

+ 216 - 11
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -281,7 +281,7 @@ public class KwtWaybillOrderV1Service {
                 }
 
                 /*车辆运单状态记录*/
-                this.setWaybillOrderTrack(waybillOrder.getId(), waybillOrder.getUpdateTime(), waybillOrder.getStatus(), null);
+                this.setWaybillOrderTrack(waybillOrder.getId(), null, waybillOrder.getUpdateTime(), waybillOrder.getStatus(), null);
             }
         }
         return sendCarEntrustAll;
@@ -438,15 +438,17 @@ public class KwtWaybillOrderV1Service {
 
     /**
      * @param wOrderId 车辆订单ID
+     * @param wSubtaskId 车辆运单子单ID
      * @param status   车辆运单状态
      * @param remark   备注
      * @desc 新增运单状态记录
      * @author zk
      * @date 2023/7/20
      **/
-    public void setWaybillOrderTrack(Long wOrderId, Date operateTime, int status, String remark) {
+    public void setWaybillOrderTrack(Long wOrderId, Long wSubtaskId, Date operateTime, int status, String remark) {
         KwtWaybillOrderTrack orderTrack = new KwtWaybillOrderTrack();
         orderTrack.setWOrderId(wOrderId);
+        orderTrack.setWSubtaskId(wSubtaskId);
         orderTrack.setOperateTime(operateTime == null ? new Date() : operateTime);
         orderTrack.setStatus(status);
         orderTrack.setRemark(remark);
@@ -484,7 +486,7 @@ public class KwtWaybillOrderV1Service {
             waybillOrderV1Dao.updateById(waybillOrder);
 
             /*3、新增运单状态记录*/
-            setWaybillOrderTrack(waybillOrder.getId(), waybillOrder.getUpdateTime(), waybillOrder.getStatus(), null);
+            setWaybillOrderTrack(waybillOrder.getId(), null, waybillOrder.getUpdateTime(), waybillOrder.getStatus(), null);
 
             /*4、回退物流订单委托量*/
             /*4.1、装货址委派量entrustAmount回退*/
@@ -529,7 +531,7 @@ public class KwtWaybillOrderV1Service {
         if (waybillOrder == null) {
             return HttpResult.error("运单" + wOrderId + "不存在,请确认!");
         }
-        //待接单的车辆运单才能撤回
+        //待接单的车辆运单才能确认接单
         if (!waybillOrder.getStatus().equals(CarWaybillEnum.PENDING_ORDER.getCode())) {
             return HttpResult.error("运单" + waybillOrder.getWOrderNo() + "当前状态已不能接单!");
         }
@@ -539,7 +541,7 @@ public class KwtWaybillOrderV1Service {
         waybillOrderV1Dao.updateById(waybillOrder);
 
         /*3、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        setWaybillOrderTrack(waybillOrder.getId(), null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
 
         /*4、更新司机/车辆数据*/
         //更新司机信息
@@ -593,7 +595,7 @@ public class KwtWaybillOrderV1Service {
         if (waybillOrder == null) {
             return HttpResult.error("运单" + wOrderId + "不存在,请确认!");
         }
-        //待接单的车辆运单才能撤回
+        //待接单的车辆运单才能拒绝接单
         if (!waybillOrder.getStatus().equals(CarWaybillEnum.PENDING_ORDER.getCode())) {
             return HttpResult.error("运单" + waybillOrder.getWOrderNo() + "当前状态已不能拒绝接单!");
         }
@@ -603,7 +605,7 @@ public class KwtWaybillOrderV1Service {
         waybillOrderV1Dao.updateById(waybillOrder);
 
         /*3、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        setWaybillOrderTrack(waybillOrder.getId(), null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
 
         //循环运单不对物流订单委托量变更
         if (waybillOrder.getType() == Global.NUMERICAL_TWO) {
@@ -652,7 +654,7 @@ public class KwtWaybillOrderV1Service {
         if (waybillOrder == null) {
             return HttpResult.error("运单" + wOrderId + "不存在,请确认!");
         }
-        //待出车的车辆运单才能撤回
+        //待出车的车辆运单才能出车
         if (!waybillOrder.getStatus().equals(CarWaybillEnum.PENDING_VEHICLE.getCode())) {
             return HttpResult.error("运单" + waybillOrder.getWOrderNo() + "当前状态不能出车!");
         }
@@ -667,7 +669,7 @@ public class KwtWaybillOrderV1Service {
         waybillOrderV1Dao.updateById(waybillOrder);
 
         /*3、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        setWaybillOrderTrack(waybillOrder.getId(), null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
 
         /*4、更新司机/车辆数据*/
         //更新司机信息
@@ -692,7 +694,7 @@ public class KwtWaybillOrderV1Service {
         if (waybillOrder == null) {
             return HttpResult.error("运单" + wOrderId + "不存在,请确认!");
         }
-        //待出车的车辆运单才能撤回
+        //待出车的车辆运单才能拒绝出车
         if (!waybillOrder.getStatus().equals(CarWaybillEnum.PENDING_VEHICLE.getCode())) {
             return HttpResult.error("运单" + waybillOrder.getWOrderNo() + "当前状态不能拒绝出车!");
         }
@@ -702,7 +704,7 @@ public class KwtWaybillOrderV1Service {
         waybillOrderV1Dao.updateById(waybillOrder);
 
         /*3、新增运单状态记录*/
-        setWaybillOrderTrack(waybillOrder.getId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        setWaybillOrderTrack(waybillOrder.getId(), null, params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
 
         /*4、回退物流订单委托量*/
         /*4.1、装货址委派量entrustAmount回退*/
@@ -731,6 +733,173 @@ public class KwtWaybillOrderV1Service {
         return HttpResult.ok();
     }
 
+    /**
+     * @param params {}
+     * @desc 到达装货地点
+     * @author zk
+     * @date 2024/3/7
+     **/
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult arriveLoadLocationV1(OperateWaybillDto params) {
+        /*1、校验*/
+        Long wOrderId = params.getWOrderId();
+        //运单信息
+        KwtWaybillOrderV1 waybillOrder = waybillOrderV1Dao.selectById(wOrderId);
+        if (waybillOrder == null) {
+            return HttpResult.error("运单" + wOrderId + "不存在,请确认!");
+        }
+        //已出车、到达装货地、已装货、到达卸货地、已卸货的车辆运单才能到达装货地点
+        if (!CarWaybillEnum.arriveLocation(waybillOrder.getStatus())) {
+            return HttpResult.error("运单" + waybillOrder.getWOrderNo() + "当前状态已不能到达装货地点!");
+        }
+
+        /*2、更新运单状态*/
+        waybillOrder.setStatus(CarWaybillEnum.WAIT_LOADING.getCode());
+        waybillOrderV1Dao.updateById(waybillOrder);
+
+        /*3、新增运单状态记录*/
+        setWaybillOrderTrack(waybillOrder.getId(), params.getWSubtaskId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        return HttpResult.ok();
+    }
+
+    /**
+     * @param params {}
+     * @desc 装货-多单位+多地址
+     * @author zk
+     * @date 2024/3/7
+     **/
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult loadingV1(WaybillOrderTicketV4Dto params) {
+        /*1、校验*/
+        Long wOrderId = params.getWOrderId();
+        //运单信息
+        KwtWaybillOrderV1 waybillOrder = waybillOrderV1Dao.selectById(wOrderId);
+        if (waybillOrder == null) {
+            return HttpResult.error("运单" + wOrderId + "不存在,请确认!");
+        }
+        //已出车、到达装货地、已装货、到达卸货地、已卸货的车辆运单才能装货
+        if (!waybillOrder.getStatus().equals(CarWaybillEnum.WAIT_LOADING.getCode())) {
+            return HttpResult.error("运单" + waybillOrder.getWOrderNo() + "当前状态已不能装货!");
+        }
+
+        /*2、更新车辆运单*/
+        /*2.1、更新车辆运单-状态*/
+        waybillOrder.setStatus(CarWaybillEnum.COMPLETION_LOADING.getCode());
+        waybillOrderV1Dao.updateById(waybillOrder);
+
+        /*2.2、更新车辆运单-子单*/
+        //运单子单信息
+        KwtWaybillOrderSubtask orderSubtask = waybillOrderSubtaskDao.selectById(params.getWSubtaskId());
+        //榜单信息
+        List<WaybillOrderTicketLoadingDto> loading = params.getLoading();
+        orderSubtask.setLoadAmount(waybillOrderTicketService.countAmount(loading, orderSubtask.getUnit(), BigDecimal.valueOf(orderSubtask.getLoadAmount())).doubleValue());
+        orderSubtask.setStatus(waybillOrder.getStatus());
+        waybillOrderSubtaskDao.updateById(orderSubtask);
+
+        /*3、新增运单状态记录*/
+        setWaybillOrderTrack(waybillOrder.getId(), params.getWSubtaskId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+
+        /*4、新增装卸货榜单信息*/
+        waybillOrderTicketService.addTicketV1(loading, waybillOrder.getId(), params.getWSubtaskId(), params.getWAddressId(), params.getUrls(), params.getOperateTime(), Global.NUMERICAL_ONE);
+        return HttpResult.ok();
+    }
+
+    /**
+     * @param params {}
+     * @desc 到达卸货地点
+     * @author zk
+     * @date 2024/3/7
+     **/
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult arriveUnloadLocationV1(OperateWaybillDto params) {
+        /*1、校验*/
+        Long wOrderId = params.getWOrderId();
+        //运单信息
+        KwtWaybillOrderV1 waybillOrder = waybillOrderV1Dao.selectById(wOrderId);
+        if (waybillOrder == null) {
+            return HttpResult.error("运单" + wOrderId + "不存在,请确认!");
+        }
+        //已出车、到达装货地、已装货、到达卸货地、已卸货的车辆运单才能到达卸货地点
+        if (!CarWaybillEnum.arriveLocation(waybillOrder.getStatus())) {
+            return HttpResult.error("运单" + waybillOrder.getWOrderNo() + "当前状态已不能到达卸货地点!");
+        }
+
+        /*2、更新运单状态*/
+        waybillOrder.setStatus(CarWaybillEnum.WAIT_UNLOADING.getCode());
+        waybillOrderV1Dao.updateById(waybillOrder);
+
+        /*3、新增运单状态记录*/
+        setWaybillOrderTrack(waybillOrder.getId(), params.getWSubtaskId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+        return HttpResult.ok();
+    }
+
+    /**
+     * @param params {}
+     * @desc 卸货-多单位
+     * @author zk
+     * @date 2024/3/7
+     **/
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult unloadingV1(WaybillOrderTicketV4Dto params) {
+        /*1、校验*/
+        Long wOrderId = params.getWOrderId();
+        //运单信息
+        KwtWaybillOrderV1 waybillOrder = waybillOrderV1Dao.selectById(wOrderId);
+        if (waybillOrder == null) {
+            return HttpResult.error("运单" + wOrderId + "不存在,请确认!");
+        }
+        //已出车、到达装货地、已装货、到达卸货地、已卸货的车辆运单才能卸货
+        if (!waybillOrder.getStatus().equals(CarWaybillEnum.WAIT_UNLOADING.getCode())) {
+            return HttpResult.error("运单" + waybillOrder.getWOrderNo() + "当前状态已不能卸货!");
+        }
+
+        /*2、更新车辆运单*/
+        /*2.1、更新车辆运单-状态*/
+        waybillOrder.setStatus(CarWaybillEnum.COMPLETION_UNLOADING.getCode());
+        waybillOrderV1Dao.updateById(waybillOrder);
+
+        /*2.2、更新车辆运单-子单*/
+        //运单子单信息
+        KwtWaybillOrderSubtask orderSubtask = waybillOrderSubtaskDao.selectById(params.getWSubtaskId());
+        //物流运单信息
+        KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(orderSubtask.getLOrderId());
+        //榜单信息
+        List<WaybillOrderTicketLoadingDto> loading = params.getLoading();
+        orderSubtask.setUnloadAmount(waybillOrderTicketService.countAmount(loading, orderSubtask.getUnit(), BigDecimal.valueOf(orderSubtask.getUnloadAmount())).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());
+        orderSubtask.setStatus(waybillOrder.getStatus());
+        waybillOrderSubtaskDao.updateById(orderSubtask);
+
+        /*3、新增运单状态记录*/
+        setWaybillOrderTrack(waybillOrder.getId(), params.getWSubtaskId(), params.getOperateTime(), waybillOrder.getStatus(), params.getRemark());
+
+        /*4、新增装卸货榜单信息*/
+        waybillOrderTicketService.addTicketV1(loading, waybillOrder.getId(), params.getWSubtaskId(), params.getWAddressId(), params.getUrls(), params.getOperateTime(), Global.NUMERICAL_ONE);
+
+        /*5、更新司机/车辆数据*/
+        //更新司机信息
+        editDriver(waybillOrder.getDriverId());
+        //更新车辆信息
+        editTruck(waybillOrder.getTruckId());
+        return HttpResult.ok();
+    }
+
+    /**
+     * @param params {}
+     * @desc 修改单证-装卸货-多单位
+     * @author zk
+     * @date 2024/3/6
+     **/
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult editTicketV1(WaybillOrderTicketV3Dto params) {
+
+        return HttpResult.ok();
+    }
+
+
 
 
 
@@ -805,4 +974,40 @@ public class KwtWaybillOrderV1Service {
         return remoteSystemService.queryDictMapByTypeValues(String.join(Global.COMMA, dictKey));
     }
 
+    /**
+     * @param loadAmount    装货量
+     * @param deficitAmount 亏吨量
+     * @param loss          合理损耗
+     * @param goodsPrice    货值单价
+     * @desc 计算亏吨扣款
+     * @author zk
+     * @date 2023/7/27
+     **/
+    public static 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);
+        }
+        //罚款值=扣亏量 * 扣亏货值
+        return deficitLossAmount.multiply(goodsPrice).setScale(4, RoundingMode.HALF_UP);
+    }
+
 }