Преглед изворни кода

新增司机和运单关联需求

donglang пре 1 месец
родитељ
комит
fe9ebd4b5c
34 измењених фајлова са 1318 додато и 178 уклоњено
  1. 5 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/ErrorCodeEnum.java
  2. 42 4
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarWaybillV1Enum.java
  3. 6 11
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/GatekeeperStatusEnum.java
  4. 0 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckSaveParam.java
  5. 1 1
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckUpdateStatusParam.java
  6. 23 2
      sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java
  7. 52 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppWayBillController.java
  8. 16 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderWeighbridgeMapper.java
  9. 7 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java
  10. 13 9
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/AbstractWaybillOrderHandler.java
  11. 9 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/CancelHandler.java
  12. 268 73
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java
  13. 96 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/EmptyLoadLeaveHandler.java
  14. 39 9
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LeaveHandler.java
  15. 69 12
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LeaveMockHandler.java
  16. 129 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LiftRodReleaseHandler.java
  17. 19 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LoadingHandler.java
  18. 138 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ReplenishHandler.java
  19. 9 3
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java
  20. 20 4
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingHandler.java
  21. 10 2
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingIntoHandler.java
  22. 5 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtGatekeeperWaybillOrder.java
  23. 84 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrderWeighbridge.java
  24. 6 4
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderCmeIntoWeighParam.java
  25. 20 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderEmptyLoadLeaveParam.java
  26. 21 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderLiftRodReleaseParam.java
  27. 21 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderReplenishParam.java
  28. 8 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/reponse/GatekeeperOrderResp.java
  29. 8 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtGatekeeperWaybillOrderRepository.java
  30. 30 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderWeighbridgeRepository.java
  31. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/ForkliftOrderService.java
  32. 78 25
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java
  33. 47 12
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java
  34. 18 0
      sql/2026/01/2026_01_06_donglang_create.sql

+ 5 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/ErrorCodeEnum.java

@@ -92,6 +92,11 @@ public enum ErrorCodeEnum {
     FORKLIFT_ORDER_STATUS_ERROR("100001", "当前铲车订单状态异常"),
     FORKLIFT_QUERY_PARAM_ERROR("100002", "当前铲车查询条件异常"),
 
+    // ====================== 门卫订单(110000~120000)======================
+    GATEKEEPER_ORDER_NOT_FOUND("110000", "当前门卫订单不存在"),
+    GATEKEEPER_ORDER_STATUS_ERROR("110001", "当前门卫订单状态异常"),
+    GATEKEEPER_QUERY_PARAM_ERROR("110002", "当前门卫查询条件异常"),
+
 
 
 

+ 42 - 4
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarWaybillV1Enum.java

@@ -28,18 +28,56 @@ public enum CarWaybillV1Enum {
     EXIT_COMPLETED(10,  "已装货"),
 
     /**
-     * 离场过磅
+     * 离场过磅:  弃用
      */
     WEIGHT_TRAFFIC(11, "离场过磅"),
+
+
+    /**
+     * 空载待离场
+     */
+    EMPTY_WAIT_LEAVE(11, "空载待离场"),
+
+    /**
+     * 待离场
+     */
+    WAIT_LEAVE(12, "待离场"),
+
+    /**
+     * 卸货中
+     */
+    UNLOADING(13, "卸货中"),
+
+    /**
+     * 待放行
+     */
+    WAIT_RELEASE(14, "待放行"),
+
+    /**
+     * 补货中
+     */
+    REPLENISHING(15, "补货中"),
+
+    /**
+     * 补货完成
+     */
+    REPLENISH_FINISH(16, "补货完成"),
+
+    /**
+     * 已放行未离场
+     */
+    RELEASED_NOT_EXITED(17, "已放行未离场"),
+
+
     /**
      * 已离场
      */
-    WAIT_LOADING(15,  "已离场"),
+    WAIT_LOADING(18,  "已离场"),
 
     /**
-     * 卸货入场
+     * 卸货入场  弃用
      */
-    INTO_UNLOADING(16,  "已离场"),
+    INTO_UNLOADING(19,  "卸货入场"),
 
     /**
      * 已卸货

+ 6 - 11
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/GatekeeperStatusEnum.java

@@ -25,29 +25,24 @@ public enum GatekeeperStatusEnum {
     IN_YARD(5,  "已进场"),
 
     /**
-     * 待离场
+     * 待放行
      */
-    PENDING_EXIT(10, "待离场"),
+    PENDING_RELEASE(10, "待放行"),
 
     /**
-     * 空载待离场
+     * 已放行
      */
-    EMPTY_PENDING_EXIT(15, "空载待离场"),
-
-    /**
-     * 已放行未离场
-     */
-    RELEASED_NOT_EXITED(20, "已放行未离场"),
+    READY_RELEASE(15, "已放行"),
 
     /**
      * 已离场
      */
-    EXITED(25, "已离场"),
+    EXITED(20, "已离场"),
 
     /**
      * 空载离场
      */
-    EMPTY_EXITED(30, "空载离场"),
+    EMPTY_EXITED(25, "空载离场"),
 
     ;
 

+ 0 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckSaveParam.java

@@ -126,7 +126,6 @@ public class TruckSaveParam implements Serializable {
     /**
      * 车队id
      */
-    @NotNull(message = "车队不能为空")
     @Schema(description = "车队id")
     private Long fleetId;
 

+ 1 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckUpdateStatusParam.java

@@ -26,7 +26,7 @@ public class TruckUpdateStatusParam extends PageReq implements Serializable {
     private List<Long> ids;
 
     @NotNull(message = "车辆状态不能为空")
-    @Schema(description = "状态: 0-正常、1-停用")
+    @Schema(description = "状态: 0-启用、1-停用")
     private Integer status;
 
 }

+ 23 - 2
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckService.java

@@ -2229,7 +2229,7 @@ public class KwfTruckService {
             truck.setTruckLicense(param.getTruckLicense());
             truck.setTransportLicense(param.getTransportLicense());
             truck.setEnvironmentalList(param.getEnvironmentalList());
-            truck.setStatus(TruckStatusEnum.PENDING_REVIEW.getCode());
+            truck.setStatus(TruckStatusEnum.NORMAL.getCode());
             truck.setDelFlag(0);
             truck.setBlacklist(0);
             truck.setCreateTime(new Date());
@@ -2277,9 +2277,30 @@ public class KwfTruckService {
     public void batchUpdateStatus(TruckUpdateStatusParam param) {
         log.info("车辆停用/启用,param:{}", JSON.toJSONString(param));
         // 1. 校验状态合法性
-        if (param.getStatus() != 0 && param.getStatus() != 1) {
+        if (!param.getStatus().equals(TruckStatusEnum.NORMAL.getCode()) && !param.getStatus().equals(TruckStatusEnum.DISABLED.getCode())) {
             throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_STATUS_ERROR, "仅支持修改为正常或停用状态");
         }
+        List<KwfTruck> trucks = kwfTruckRepository.findTruckByTruckIds(param.getIds());
+        if (CollectionUtils.isEmpty(trucks)) {
+            return;
+        }
+
+        // 2.启用:校验车辆都是停用状态
+        if (param.getStatus().equals(TruckStatusEnum.NORMAL.getCode())) {
+            boolean b = trucks.stream()
+                    .allMatch(truck -> truck.getStatus() != null && truck.getStatus().equals(TruckStatusEnum.DISABLED.getCode()));
+            if (!b) {
+                throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_STATUS_ERROR, "[启用]所选车辆不全是停用状态");
+            }
+        }
+        // 3.停用:校验车辆都是正常状态
+        if (param.getStatus().equals(TruckStatusEnum.DISABLED.getCode())) {
+            boolean b = trucks.stream()
+                    .allMatch(truck -> truck.getStatus() != null && truck.getStatus().equals(TruckStatusEnum.NORMAL.getCode()));
+            if (!b) {
+                throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_STATUS_ERROR, "[停用]所选车辆不全是正常状态");
+            }
+        }
         LambdaUpdateWrapper<KwfTruck> updateWrapper = new LambdaUpdateWrapper<>();
         updateWrapper.in(KwfTruck::getId, param.getIds());
         updateWrapper.set(KwfTruck::getStatus, param.getStatus());

+ 52 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/enterpriseApp/AppWayBillController.java

@@ -311,6 +311,32 @@ public class AppWayBillController {
         return BaseResult.success();
     }
 
+    /**
+     * 空载离场
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "空载离场", description = "空载离场")
+    @PostMapping("/emptyLoadLeave")
+    public BaseResult emptyLoadLeave(@RequestBody @Valid WaybillOrderEmptyLoadLeaveParam param){
+        waybillOrderService.emptyLoadLeave(param);
+        return BaseResult.success();
+    }
+
+    /**
+     * 补货
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "补货", description = "补货")
+    @PostMapping("/replenish")
+    public BaseResult replenish(@RequestBody @Valid WaybillOrderReplenishParam param){
+        waybillOrderService.replenish(param);
+        return BaseResult.success();
+    }
+
     /**
      * 离场
      *
@@ -324,6 +350,32 @@ public class AppWayBillController {
         return BaseResult.success();
     }
 
+    /**
+     * 抬杆放行 mock
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "mock抬杆", description = "mock抬杆")
+    @PostMapping("/liftRodRelease")
+    public BaseResult liftRodRelease(@RequestBody @Valid WaybillOrderLiftRodReleaseParam param){
+        waybillOrderService.liftRodRelease(param);
+        return BaseResult.success();
+    }
+
+    /**
+     * 打印榜单
+     *
+     * @param
+     * @return
+     */
+    @Operation(summary = "打印榜单", description = "打印榜单")
+    @PostMapping("/printList")
+    public BaseResult printList(@RequestBody @Valid WaybillOrderLiftRodReleaseParam param){
+        waybillOrderService.printList(param);
+        return BaseResult.success("打印中!");
+    }
+
     /**
      * 卸货入场
      *

+ 16 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderWeighbridgeMapper.java

@@ -0,0 +1,16 @@
+package com.sckw.transport.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sckw.transport.model.KwtWaybillOrderWeighbridge;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author zk
+ * @desc 地磅记录
+ * @date 2026/01/06
+ */
+@Mapper
+public interface KwtWaybillOrderWeighbridgeMapper extends BaseMapper<KwtWaybillOrderWeighbridge> {
+
+
+}

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

@@ -162,7 +162,13 @@ public class TransportServiceImpl implements TransportRemoteService {
             CarWaybillV1Enum.PENDING_VEHICLE.getCode(),
             CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),
             CarWaybillV1Enum.EXIT_COMPLETED.getCode(),
-            CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode(),
+            CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(),
+            CarWaybillV1Enum.WAIT_LEAVE.getCode(),
+            CarWaybillV1Enum.UNLOADING.getCode(),
+            CarWaybillV1Enum.WAIT_RELEASE.getCode(),
+            CarWaybillV1Enum.REPLENISHING.getCode(),
+            CarWaybillV1Enum.REPLENISH_FINISH.getCode(),
+            CarWaybillV1Enum.RELEASED_NOT_EXITED.getCode(),
             CarWaybillV1Enum.WAIT_LOADING.getCode(),
             CarWaybillV1Enum.REVIEW_REJECTION.getCode()
     );

+ 13 - 9
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/AbstractWaybillOrderHandler.java

@@ -17,6 +17,7 @@ import com.sckw.fleet.api.model.vo.DriverConductRulesVO;
 import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.product.api.dubbo.GoodsInfoService;
+import com.sckw.system.api.RemoteSystemService;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.*;
 import com.sckw.transport.repository.*;
@@ -61,6 +62,12 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
     protected KwtLogisticsOrderUnitRepository logisticsOrderUnitRepository;
     @Autowired
     protected KwtLogisticsOrderGoodsRepository logisticsOrderGoodsRepository;
+    @Autowired
+    protected KwtGatekeeperWaybillOrderRepository gatekeeperWaybillOrderRepository;
+    @Autowired
+    protected KwtForkliftWaybillOrderRepository forkliftWaybillOrderRepository;
+    @Autowired
+    protected KwtWaybillOrderWeighbridgeRepository waybillOrderWeighbridgeRepository;
 
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
     protected RemoteFleetService remoteFleetService;
@@ -76,6 +83,9 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
     GoodsInfoService goodsInfoService;
 
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    protected RemoteSystemService remoteSystemService;
+
     /**
      * 模板方法 - 定义处理流程
      */
@@ -147,14 +157,8 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
             //接单已经初始化了,无需额外更新
             return;
         }
-        // 修改运单状态
-        waybillOrder.setStatus(getStatus());
-        waybillOrderRepository.updateById(waybillOrder);
-
-        //修改子运单状态
-        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
-        waybillSubtask.setStatus(getStatus());
-        waybillOrderSubtaskRepository.updateById(waybillSubtask);
+        getStatus(waybillOrder);
+
     }
 
     // 6. 生成节点轨迹
@@ -211,7 +215,7 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
 
     protected abstract String getProcessName();
 
-    protected abstract Integer getStatus();
+    protected abstract void getStatus(KwtWaybillOrder waybillOrder);
 
     protected abstract String getRemark(T param, KwtWaybillOrder waybillOrder);
 

+ 9 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/CancelHandler.java

@@ -128,8 +128,15 @@ public class CancelHandler extends AbstractWaybillOrderHandler<WaybillOrderCance
     }
 
     @Override
-    protected Integer getStatus() {
-        return CarWaybillV1Enum.CANCELLED.getCode();
+    protected void getStatus(KwtWaybillOrder waybillOrder) {
+        // 1. 修改运单状态
+        waybillOrder.setStatus(CarWaybillV1Enum.CANCELLED.getCode());
+        waybillOrderRepository.updateById(waybillOrder);
+
+        // 2. 修改子运单状态
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        waybillSubtask.setStatus(CarWaybillV1Enum.CANCELLED.getCode());
+        waybillOrderSubtaskRepository.updateById(waybillSubtask);
     }
 
     @Override

+ 268 - 73
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java

@@ -1,26 +1,26 @@
 package com.sckw.transport.handler;
 
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.core.model.enums.ForkliftStatusEnum;
+import com.sckw.core.model.enums.GatekeeperStatusEnum;
+import com.sckw.core.model.enums.LoadingTypeEnum;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.DateUtils;
+import com.sckw.core.utils.StringUtils;
 import com.sckw.fleet.api.model.vo.DriverConductRulesVO;
 import com.sckw.fleet.api.model.vo.RTruckVo;
 import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
 import com.sckw.product.api.model.KwpGoods;
-import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.WaybillOrderCmeIntoWeighParam;
-import com.sckw.transport.repository.KwtForkliftWaybillOrderRepository;
 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 org.springframework.transaction.annotation.Transactional;
 
@@ -41,12 +41,8 @@ import java.util.stream.Collectors;
 @Service
 public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCmeIntoWeighParam> {
 
-    @Autowired
-    private KwtForkliftWaybillOrderRepository forkliftWaybillOrderRepository;
-
-    @DubboReference(version = "1.0.0", group = "design", check = false)
-    private RemoteSystemService remoteSystemService;
-
+    //用于存储动态状态
+    private Integer targetStatus;
 
     @Override
     protected KwtWaybillOrder getWaybillOrder(WaybillOrderCmeIntoWeighParam param) {
@@ -55,24 +51,53 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
 
     @Override
     protected void checkState(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
-        // 校验运单
-        if (!Objects.equals(CarWaybillV1Enum.PENDING_VEHICLE.getCode(), waybillOrder.getStatus())) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "当前物流运单状态不是“已接单”状态,无法推进下一节点!");
-        }
-        // 校验车辆
-        RTruckVo truckNo = remoteFleetService.findTruckByTruckNo(param.getTruckNo());
-        if (truckNo == null || !Objects.equals(truckNo.getStatus(), 0)) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_STATUS_ERROR, "当前车辆非正常状态,无法到达装货点!");
-        }
     }
 
     @Override
     protected void doBusiness(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
-        //1.填充运单装货单皮重
+        //查询运单装卸货信息
         KwtWaybillOrderTicket orderTicket = waybillOrderTicketRepository.queryByWOrderIdByIdAndType(param.getWaybillOrderId(), 1);
         if (orderTicket == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_TICKET_NOT_FOUND, "当前物流运单装卸货信息不存在,无法记录皮重!");
         }
+        if (checkIsFirst(waybillOrder)) {
+            //第一次过磅
+            firstWeighbridge(param, waybillOrder, orderTicket);
+        } else {
+            //第二次过磅
+            laterWeighbridge(param,waybillOrder, orderTicket);
+        }
+
+    }
+
+    /**
+     * 校验是否第一次过磅
+     * @param waybillOrder
+     * @return
+     */
+    private Boolean checkIsFirst(KwtWaybillOrder waybillOrder) {
+        List<KwtWaybillOrderWeighbridge> weighbridges = waybillOrderWeighbridgeRepository.queryWaybillOrderWeighbridgeByWOrderId(waybillOrder.getId());
+        return CollectionUtils.isEmpty(weighbridges);
+    }
+
+    /**
+     * 第一次过磅逻辑
+     * @param param
+     * @param waybillOrder
+     */
+    private void firstWeighbridge(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder, KwtWaybillOrderTicket orderTicket) {
+        if (StringUtils.isBlank(param.getTruckNo())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "车牌号不能为空!");
+        }
+        if (param.getTareAmount() == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "皮重不能为空!");
+        }
+        // 校验运单
+        if (!Objects.equals(CarWaybillV1Enum.PENDING_VEHICLE.getCode(), waybillOrder.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "当前物流运单状态不是“已接单”状态,无法称重过磅!");
+        }
+
+        //1.填充运单装货单皮重
         orderTicket.setTareAmount(param.getTareAmount());
         waybillOrderTicketRepository.updateById(orderTicket);
 
@@ -84,8 +109,15 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
             truckNo.setTareWeight(param.getTareAmount());
             remoteFleetService.updateTruckTareAmount(truckNo);
         }
-        //3. 创建铲车记录
+
+        //3. 修改门卫状态:已进场
+        updateGatekeeperOrderStatus(waybillOrder);
+
+        //4. 创建铲车记录
         createForkliftWaybill(waybillOrder);
+
+        //5.创建过磅记录
+        createWeighbridges(waybillOrder);
     }
 
     /**
@@ -118,7 +150,7 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
                     forklift.setGoodsId(goods.getId());
                     forklift.setGoodsName(goods.getName()+"/"+goodsTypeMap.getOrDefault(goods.getGoodsType(),"")+"/"+goodsSpecMap.getOrDefault(goods.getSpec(), ""));
                 }
-                forklift.setLoadingType(0);
+                forklift.setLoadingType(LoadingTypeEnum.LOADING.getCode());
                 forklift.setStatus(ForkliftStatusEnum.PENDING_ORDERS.getCode());
                 forklift.setDriverId(waybillOrder.getDriverId());
                 forklift.setDriverName(waybillOrder.getDriverName());
@@ -146,14 +178,179 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         });
     }
 
+    /**
+     * 修改门卫订单状态
+     * @param waybillOrder
+     * @return
+     */
+    public void updateGatekeeperOrderStatus(KwtWaybillOrder waybillOrder) {
+        log.info("推进门卫数据为已进场:{}", JSON.toJSONString(waybillOrder));
+        KwtGatekeeperWaybillOrder gatekeeper = gatekeeperWaybillOrderRepository.queryGatekeeperWaybillOrderByWOrderId(waybillOrder.getId());
+        if (gatekeeper == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_NOT_FOUND, "当前门卫订单数据不存在!");
+        }
+        if (!(GatekeeperStatusEnum.PENDING_ENTRY.getCode().equals(gatekeeper.getStatus()))) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_STATUS_ERROR, "当前门卫订单状态异常,不能推进为已进场状态!");
+        }
+        //修改门卫已进场
+        gatekeeper.setStatus(GatekeeperStatusEnum.IN_YARD.getCode());
+        gatekeeperWaybillOrderRepository.updateById(gatekeeper);
+    }
+
+    /**
+     * 创建铲车记录
+     * @param waybillOrder
+     */
+    private void createWeighbridges(KwtWaybillOrder waybillOrder) {
+        CompletableFuture.runAsync(() ->{
+            try {
+                log.debug("开始异步保存地磅记录,运单ID:{}", waybillOrder.getId());
+                KwtWaybillOrderWeighbridge weighbridge = new KwtWaybillOrderWeighbridge();
+                weighbridge.setWOrderId(waybillOrder.getId());
+                weighbridge.setLOrderId(waybillOrder.getLOrderId());
+                weighbridge.setTruckId(waybillOrder.getTruckId());
+                weighbridge.setTruckNo(waybillOrder.getTruckNo());
+                weighbridge.setWeighbridgeId(10001l);
+                weighbridge.setWeight(BigDecimal.ZERO);
+                weighbridge.setWeighUrl(null);
+                weighbridge.setCreateTime(new Date());
+                weighbridge.setCreateUser(waybillOrder.getDriverId());
+                weighbridge.setUpdateUser(waybillOrder.getDriverId());
+
+                waybillOrderWeighbridgeRepository.save(weighbridge);
+                log.debug("异步保存过磅数据保存成功");
+            } catch (Exception e) {
+                log.error("异步保存过磅数据失败!");
+            }
+        });
+    }
+
+
+    /**
+     * 第二次过磅逻辑
+     * @param param
+     * @param waybillOrder
+     */
+    private void laterWeighbridge(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder, KwtWaybillOrderTicket orderTicket) {
+        if (StringUtils.isBlank(param.getGrossAmount())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "毛重不能为空!");
+        }
+
+        //1.填充装货单毛重和装货净重
+        BigDecimal loadAmount = updateGrossAmount(param, orderTicket);
+        //2.填充运单装货净重
+        updateLoadAmount(param, waybillOrder, loadAmount);
+        //3.判断流程
+        checkProcess(waybillOrder, loadAmount);
+        //4.创建过磅记录
+        createWeighbridges(waybillOrder);
+
+    }
+
+    /**
+     * 填充毛重
+     * @param param
+     * @param shipmentTicket
+     */
+    private BigDecimal updateGrossAmount(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrderTicket shipmentTicket) {
+        //毛重
+        shipmentTicket.setGrossAmount(param.getGrossAmount());
+        //皮重
+        BigDecimal tareAmount = shipmentTicket.getTareAmount();
+        //装货单装货净重
+        BigDecimal loadAmount = param.getGrossAmount().subtract(Optional.ofNullable(tareAmount).orElse(BigDecimal.ZERO));
+        shipmentTicket.setAmount(loadAmount);
+        waybillOrderTicketRepository.updateById(shipmentTicket);
+        return loadAmount;
+    }
+
+    /**
+     * 填充装货净重
+     * @param param
+     * @param waybillOrder
+     * @param loadAmount
+     */
+    private void updateLoadAmount(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder, BigDecimal loadAmount) {
+        //更新子运单装货净重
+        KwtWaybillOrderSubtask subtask = getWaybillSubtask(waybillOrder.getId());
+        subtask.setLoadAmount(loadAmount);
+        subtask.setLoadTime(new Date());
+        waybillOrderSubtaskRepository.updateById(subtask);
+        log.info("物流运单离场过磅成功!运单ID: {}, 毛重: {}, 装货净重: {}", param.getWaybillOrderId(), param.getGrossAmount(), loadAmount);
+    }
+
+    //
+
+    /**
+     * 计算并设定离场目标状态
+     *                      空载离场:净重<=0.5,        状态更改为:空载待离场
+     *                      正常流程:0.5<净重<=任务量,  状态更改为:待离场
+     *                      超载流程:净重>任务量,       状态更改为:卸货中
+     * @param waybillOrder
+     * @param loadAmount
+     */
+    private void checkProcess(KwtWaybillOrder waybillOrder, BigDecimal loadAmount) {
+        //获取运单任务量
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        if (waybillSubtask.getEntrustAmount() == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.SYSTEM_ERROR, "[称重过磅]子运单任务量信息缺失!");
+        }
+        BigDecimal entrustAmount = waybillSubtask.getEntrustAmount();
+
+        //场景一:空载离场,净重<=0.5
+        if (loadAmount.compareTo(BigDecimal.valueOf(0.5)) <= 0) {
+            this.targetStatus = 1;
+            return;
+        }
+        // 非空载情况,必须校验是否完成装载
+        checkStatus(waybillOrder);
+
+        // 场景二:正常流程,0.5<净重<=任务量
+        if (loadAmount.compareTo(entrustAmount) <= 0) {
+            this.targetStatus = 2;
+            return;
+        }
+        // 场景三:超载流程, 净重>任务量
+        this.targetStatus = 3;
+    }
+
+    /**
+     * 正常流程和超载流程,需校验是否已完成装载
+     */
+    private void checkStatus(KwtWaybillOrder waybillOrder) {
+        if (!Objects.equals(CarWaybillV1Enum.EXIT_COMPLETED.getCode(), waybillOrder.getStatus())
+                && !Objects.equals(CarWaybillV1Enum.REPLENISH_FINISH.getCode(), waybillOrder.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "当前物流运单状态不是“已装货/补货完成”状态,无法推进待离场/卸货中状态!");
+        }
+    }
+
     @Override
     protected String getProcessName() {
-        return "到达装货地点";
+        return "称重过磅";
     }
 
     @Override
-    protected Integer getStatus() {
-        return CarWaybillV1Enum.REFUSE_TRAFFIC.getCode();
+    protected void getStatus(KwtWaybillOrder waybillOrder) {
+        Integer status;
+        // 校验是否第一次过磅
+        if (checkIsFirst(waybillOrder)) {
+            status = CarWaybillV1Enum.REFUSE_TRAFFIC.getCode();
+        } else {
+            status = switch (this.targetStatus) {
+                case 1 -> CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode();
+                case 2 -> CarWaybillV1Enum.WAIT_LEAVE.getCode();
+                case 3 -> CarWaybillV1Enum.UNLOADING.getCode();
+                default -> -1;
+            };
+        }
+        // 1. 修改运单状态
+        waybillOrder.setStatus(status);
+        waybillOrderRepository.updateById(waybillOrder);
+
+        // 2. 修改子运单状态
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        waybillSubtask.setStatus(status);
+        waybillOrderSubtaskRepository.updateById(waybillSubtask);
     }
 
     @Override
@@ -166,20 +363,48 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      */
     @Override
     protected void createNodeTrace(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
-        // 第一条:装载完成
-        KwtWaybillOrderNode node1 = getWaybillOrderNode(param, waybillOrder);
-        node1.setRemark("车辆[" + waybillOrder.getTruckNo() + "]已到达装货点");
-        waybillOrderNodeRepository.save(node1);
-        log.info("记录【已装货】节点轨迹成功,节点ID:{}", node1.getId());
-        // 间隔5秒钟,防止时间相同
-        Date fiveSecondsLater = new Date(System.currentTimeMillis() + 5000);
-        // 第二条:称重信息
-        KwtWaybillOrderNode node2 = getWaybillOrderNode(param, waybillOrder);
-        String tareAmount = Objects.isNull(param.getTareAmount()) ? "0.00" : param.getTareAmount().setScale(2, RoundingMode.HALF_UP).toPlainString();
-        node2.setRemark("[" + param.getWeighbridgeName() + "]称重[" + tareAmount + "吨]");
-        node2.setCreateTime(fiveSecondsLater);
-        waybillOrderNodeRepository.save(node2);
-        log.info("记录【称重】节点轨迹成功,节点ID:{}", node2.getId());
+        if (checkIsFirst(waybillOrder)) {
+            // 第一条:装载完成
+            KwtWaybillOrderNode node1 = getWaybillOrderNode(param, waybillOrder);
+            node1.setRemark("车辆[" + waybillOrder.getTruckNo() + "]已到达装货点");
+            waybillOrderNodeRepository.save(node1);
+            log.info("记录【已装货】节点轨迹成功,节点ID:{}", node1.getId());
+            // 间隔5秒钟,防止时间相同
+            Date fiveSecondsLater = new Date(System.currentTimeMillis() + 5000);
+            // 第二条:称重信息
+            KwtWaybillOrderNode node2 = getWaybillOrderNode(param, waybillOrder);
+            String tareAmount = Objects.isNull(param.getTareAmount()) ? "0.00" : param.getTareAmount().setScale(2, RoundingMode.HALF_UP).toPlainString();
+            node2.setRemark("[" + param.getWeighbridgeName() + "]首次称重[" + tareAmount + "吨]");
+            node2.setCreateTime(fiveSecondsLater);
+            waybillOrderNodeRepository.save(node2);
+            log.info("记录【称重】节点轨迹成功,节点ID:{}", node2.getId());
+        } else {
+            if (this.targetStatus == null) {
+                throw new BusinessPlatfromException(ErrorCodeEnum.SYSTEM_ERROR, "[离场过磅]是否空载离场数据为空!");
+            }
+            String remark = buildRemark(waybillOrder, param, this.targetStatus);
+            KwtWaybillOrderNode node1 = getWaybillOrderNode(param, waybillOrder);
+            node1.setRemark(remark);
+            waybillOrderNodeRepository.save(node1);
+            log.info("记录【多次过磅】节点轨迹成功,节点ID:{}", node1.getId());
+        }
+    }
+
+    /**
+     * 构建节点备注信息
+     */
+    private String buildRemark(KwtWaybillOrder waybillOrder, WaybillOrderCmeIntoWeighParam param, Integer targetStatus) {
+        switch (targetStatus) {
+            case 1: // 空载离场
+                return "司机[" + waybillOrder.getDriverName() + "]空载待离场";
+            case 2: // 正常离场
+                String grossAmount = Objects.isNull(param.getGrossAmount()) ? "0.00" : param.getGrossAmount().setScale(2, RoundingMode.HALF_UP).toPlainString();
+                return "[" + param.getWeighbridgeName() + "]称重[" + grossAmount + "吨]";
+            case 3: // 超载离场
+                return "司机[" + waybillOrder.getDriverName() + "]已超载,卸货中";
+            default:
+                return "";
+        }
     }
 
     /**
@@ -191,44 +416,14 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
     @Override
     @Transactional(rollbackFor = Exception.class)
     protected void calculateAutoDispatchScore(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
-//        if (true) {
-//            //先不执行自动派单逻辑
-//            return;
-//        }
-        // 司机到达装货点是否超时(未按时到场)
-//        checkArrivedLoadingPointTimeout(waybillOrder);
-
-        //校验连续按时到场次数
-        checkContinuousArriveTimes(waybillOrder);
+        if (checkIsFirst(waybillOrder)) {
+            //校验连续按时到场次数
+            checkContinuousArriveTimes(waybillOrder);
+        }
 
     }
 
 
-//    /**
-//     * 校验司机到达装货点是否超时
-//     * @param waybillOrder
-//     */
-//    private void checkArrivedLoadingPointTimeout(KwtWaybillOrder waybillOrder) {
-//        //计算司机到达装货点是否超时
-//        Boolean isTimeOut = isTimeOut(waybillOrder.getEntId(), waybillOrder.getId());
-//        if (isTimeOut) {
-//            DriverConductRulesVO rulesVO = getDriverConductRulesByEntId(waybillOrder.getEntId());
-//            Integer notOnTimeArrive = rulesVO.getNotOnTimeArriveScore();
-//            if (notOnTimeArrive <= 0) {
-//                log.warn("【司机未按时到场】司机扣分失败,企业{}的司机未按时到场分数配置异常,运单ID:{}", waybillOrder.getEntId(), waybillOrder.getId());
-//                throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "【司机未按时到场】分数配置需大于0!");
-//            }
-//            //1、更新司机分数(减分)
-//            notOnTimeArrive = -Math.abs(notOnTimeArrive);
-//            Long supEntId = getSupplierId(waybillOrder);
-//            updateDriverScore(supEntId, waybillOrder.getEntId(), waybillOrder.getDriverId(), notOnTimeArrive, "司机未按时到场");
-//
-//            //2、更新企业分数(减分)
-//            updateLogEntScore(waybillOrder, supEntId, notOnTimeArrive, "司机未按时到场");
-//        }
-//    }
-
-
     /**
      * 校验连续按时到场次数
      *

+ 96 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/EmptyLoadLeaveHandler.java

@@ -0,0 +1,96 @@
+package com.sckw.transport.handler;
+
+
+import com.alibaba.fastjson.JSON;
+import com.sckw.core.common.enums.enums.ErrorCodeEnum;
+import com.sckw.core.exception.BusinessPlatfromException;
+import com.sckw.core.model.enums.CarWaybillV1Enum;
+import com.sckw.core.model.enums.GatekeeperStatusEnum;
+import com.sckw.transport.model.KwtGatekeeperWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrderSubtask;
+import com.sckw.transport.model.param.WaybillOrderEmptyLoadLeaveParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+/**
+ * Author: donglang
+ * Time: 2025-11-19
+ * Des: 空载离场
+ * Version: 1.0
+ */
+
+@Slf4j
+@Service
+public class EmptyLoadLeaveHandler extends AbstractWaybillOrderHandler<WaybillOrderEmptyLoadLeaveParam> {
+
+    @Override
+    protected KwtWaybillOrder getWaybillOrder(WaybillOrderEmptyLoadLeaveParam param) {
+        return getWaybillOrder(param.getWaybillOrderId());
+    }
+
+    @Override
+    protected void checkState(WaybillOrderEmptyLoadLeaveParam param, KwtWaybillOrder waybill) {
+        if (!Objects.equals(CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(), waybill.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "运单状态不是“空载待离场”状态, 无法推进下一节点!");
+        }
+    }
+
+    @Override
+    protected void doBusiness(WaybillOrderEmptyLoadLeaveParam param, KwtWaybillOrder waybillOrder) {
+        log.info("推进门卫数据为待放行:{}", JSON.toJSONString(waybillOrder));
+
+        // 修改门卫数据状态:待放行
+        updateGatekeeperOrderStatus(waybillOrder);
+    }
+
+
+    /**
+     * 修改门卫订单状态
+     * @param waybillOrder
+     * @return
+     */
+    public void updateGatekeeperOrderStatus(KwtWaybillOrder waybillOrder) {
+        KwtGatekeeperWaybillOrder gatekeeper = gatekeeperWaybillOrderRepository.queryGatekeeperWaybillOrderByWOrderId(waybillOrder.getId());
+        if (gatekeeper == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_NOT_FOUND, "当前门卫订单数据不存在!");
+        }
+        if (!(GatekeeperStatusEnum.IN_YARD.getCode().equals(gatekeeper.getStatus()))) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_STATUS_ERROR, "当前门卫订单状态异常,不能推进为待放行状态!");
+        }
+        //修改门卫:待放行
+        gatekeeper.setStatus(GatekeeperStatusEnum.PENDING_RELEASE.getCode());
+        gatekeeper.setRemark("空载待放行");
+        gatekeeperWaybillOrderRepository.updateById(gatekeeper);
+    }
+
+
+    @Override
+    protected void calculateAutoDispatchScore(WaybillOrderEmptyLoadLeaveParam param, KwtWaybillOrder waybillOrder) {
+
+    }
+
+    @Override
+    protected String getProcessName() {
+        return "空载离场";
+    }
+
+    @Override
+    protected void getStatus(KwtWaybillOrder waybillOrder) {
+        // 1. 修改运单状态
+        waybillOrder.setStatus(CarWaybillV1Enum.WAIT_RELEASE.getCode());
+        waybillOrderRepository.updateById(waybillOrder);
+
+        // 2. 修改子运单状态
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        waybillSubtask.setStatus(CarWaybillV1Enum.WAIT_RELEASE.getCode());
+        waybillOrderSubtaskRepository.updateById(waybillSubtask);
+    }
+
+    @Override
+    protected String getRemark(WaybillOrderEmptyLoadLeaveParam param, KwtWaybillOrder waybillOrder) {
+        return "司机[" + waybillOrder.getDriverName() + "]空载待放行";
+    }
+}

+ 39 - 9
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LeaveHandler.java

@@ -1,15 +1,16 @@
 package com.sckw.transport.handler;
 
 
+import com.alibaba.fastjson.JSON;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
+import com.sckw.core.model.enums.GatekeeperStatusEnum;
+import com.sckw.transport.model.KwtGatekeeperWaybillOrder;
 import com.sckw.transport.model.KwtWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrderSubtask;
 import com.sckw.transport.model.param.WaybillOrderLeaveParam;
-import com.sckw.transport.repository.KwtWaybillOrderSubtaskRepository;
-import com.sckw.transport.repository.KwtWaybillOrderTicketRepository;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.Objects;
@@ -32,14 +33,36 @@ public class LeaveHandler extends AbstractWaybillOrderHandler<WaybillOrderLeaveP
 
     @Override
     protected void checkState(WaybillOrderLeaveParam param, KwtWaybillOrder waybill) {
-        if (!Objects.equals(CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode(), waybill.getStatus())) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "运单状态不是“离场过磅”状态, 无法推进下一节点!");
+        if (!Objects.equals(CarWaybillV1Enum.WAIT_LEAVE.getCode(), waybill.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "运单状态不是“离场”状态, 无法推进下一节点!");
         }
     }
 
     @Override
-    protected void doBusiness(WaybillOrderLeaveParam param, KwtWaybillOrder waybill) {
-        // 离场无额外业务逻辑
+    protected void doBusiness(WaybillOrderLeaveParam param, KwtWaybillOrder waybillOrder) {
+        log.info("推进门卫数据为待放行:{}", JSON.toJSONString(waybillOrder));
+
+        // 修改门卫订单状态为:待放行
+        updateGatekeeperOrderStatus(waybillOrder);
+    }
+
+
+    /**
+     * 修改门卫订单状态
+     * @param waybillOrder
+     * @return
+     */
+    public void updateGatekeeperOrderStatus(KwtWaybillOrder waybillOrder) {
+        KwtGatekeeperWaybillOrder gatekeeper = gatekeeperWaybillOrderRepository.queryGatekeeperWaybillOrderByWOrderId(waybillOrder.getId());
+        if (gatekeeper == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_NOT_FOUND, "当前门卫订单数据不存在!");
+        }
+        if (!(GatekeeperStatusEnum.IN_YARD.getCode().equals(gatekeeper.getStatus()))) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_STATUS_ERROR, "当前门卫订单状态异常,不能推进为待放行状态!");
+        }
+        //修改门卫:待放行
+        gatekeeper.setStatus(GatekeeperStatusEnum.PENDING_RELEASE.getCode());
+        gatekeeperWaybillOrderRepository.updateById(gatekeeper);
     }
 
     @Override
@@ -53,8 +76,15 @@ public class LeaveHandler extends AbstractWaybillOrderHandler<WaybillOrderLeaveP
     }
 
     @Override
-    protected Integer getStatus() {
-        return CarWaybillV1Enum.WAIT_LOADING.getCode();
+    protected void getStatus(KwtWaybillOrder waybillOrder) {
+        // 1. 修改运单状态
+        waybillOrder.setStatus(CarWaybillV1Enum.WAIT_RELEASE.getCode());
+        waybillOrderRepository.updateById(waybillOrder);
+
+        // 2. 修改子运单状态
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        waybillSubtask.setStatus(CarWaybillV1Enum.WAIT_RELEASE.getCode());
+        waybillOrderSubtaskRepository.updateById(waybillSubtask);
     }
 
     @Override

+ 69 - 12
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LeaveMockHandler.java

@@ -3,24 +3,19 @@ package com.sckw.transport.handler;
 
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
-import com.sckw.core.model.enums.AddressTypeEnum;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
-import com.sckw.core.utils.CollectionUtils;
 import com.sckw.transport.model.KwtWaybillOrder;
 import com.sckw.transport.model.KwtWaybillOrderSubtask;
 import com.sckw.transport.model.KwtWaybillOrderTicket;
 import com.sckw.transport.model.param.WaybillOrderLeaveMockParam;
-import com.sckw.transport.repository.KwtWaybillOrderSubtaskRepository;
-import com.sckw.transport.repository.KwtWaybillOrderTicketRepository;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.*;
-import java.util.function.Function;
-import java.util.stream.Collectors;
+import java.util.Date;
+import java.util.Objects;
+import java.util.Optional;
 
 /**
  * Author: donglang
@@ -33,6 +28,9 @@ import java.util.stream.Collectors;
 @Service
 public class LeaveMockHandler extends AbstractWaybillOrderHandler<WaybillOrderLeaveMockParam> {
 
+    //用于存储动态状态
+    private Integer targetStatus;
+
     @Override
     protected KwtWaybillOrder getWaybillOrder(WaybillOrderLeaveMockParam param) {
         return getWaybillOrder(param.getWaybillOrderId());
@@ -55,6 +53,8 @@ public class LeaveMockHandler extends AbstractWaybillOrderHandler<WaybillOrderLe
         BigDecimal loadAmount = updateGrossAmount(param, shipmentTicket);
         //2.填充运单装货净重
         updateLoadAmount(param, waybillOrder, loadAmount);
+        //3.判断流程
+        checkProcess(waybillOrder, loadAmount);
     }
 
     @Override
@@ -94,20 +94,77 @@ public class LeaveMockHandler extends AbstractWaybillOrderHandler<WaybillOrderLe
         log.info("物流运单离场过磅成功!运单ID: {}, 毛重: {}, 装货净重: {}", param.getWaybillOrderId(), param.getGrossAmount(), loadAmount);
     }
 
+    // 计算并设定离场目标状态
+    // 空载离场:净重<=0.5,        状态更改为:空载待离场
+    // 正常流程:0.5<净重<=任务量,  状态更改为:待离场
+    // 超载流程:净重>任务量,       状态更改为:卸货中
+    private void checkProcess(KwtWaybillOrder waybillOrder, BigDecimal loadAmount) {
+        //获取运单任务量
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        if (waybillSubtask.getEntrustAmount() == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.SYSTEM_ERROR, "[称重过磅]子运单任务量信息缺失!");
+        }
+        BigDecimal entrustAmount = waybillSubtask.getEntrustAmount();
+
+        //场景一:空载离场,净重<=0.5
+        if (loadAmount.compareTo(BigDecimal.valueOf(0.5)) <= 0) {
+            this.targetStatus = 1;
+            return;
+        }
+        // 场景二:正常流程,0.5<净重<=任务量
+        if (loadAmount.compareTo(entrustAmount) <= 0) {
+            this.targetStatus = 2;
+            return;
+        }
+        // 场景三:超载流程, 净重>任务量
+        this.targetStatus = 3;
+    }
+
+
     @Override
     protected String getProcessName() {
         return "离场过磅";
     }
 
     @Override
-    protected Integer getStatus() {
-        return CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode();
+    protected void getStatus(KwtWaybillOrder waybillOrder) {
+        if (this.targetStatus == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.SYSTEM_ERROR, "[称重过磅]数据异常!");
+        }
+        Integer status =  switch (this.targetStatus) {
+            case 1 -> CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode();
+            case 2 -> CarWaybillV1Enum.WAIT_LEAVE.getCode();
+            case 3 -> CarWaybillV1Enum.UNLOADING.getCode();
+            default -> -1;
+        };
+
+        // 1. 修改运单状态
+        waybillOrder.setStatus(status);
+        waybillOrderRepository.updateById(waybillOrder);
+
+        // 2. 修改子运单状态
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        waybillSubtask.setStatus(status);
+        waybillOrderSubtaskRepository.updateById(waybillSubtask);
+
     }
 
 
     @Override
     protected String getRemark(WaybillOrderLeaveMockParam param, KwtWaybillOrder waybillOrder) {
-        String grossAmount = Objects.isNull(param.getGrossAmount()) ? "0.00" : param.getGrossAmount().setScale(2, RoundingMode.HALF_UP).toPlainString();
-        return "[" + param.getWeighbridgeName() + "]称重[" + grossAmount + "吨]";
+        if (this.targetStatus == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.SYSTEM_ERROR, "[离场过磅]数据异常!");
+        }
+        switch (this.targetStatus) {
+            case 1:
+                return "司机[" + waybillOrder.getDriverName() + "]已确认空载离场";
+            case 2:
+                String grossAmount = Objects.isNull(param.getGrossAmount()) ? "0.00" : param.getGrossAmount().setScale(2, RoundingMode.HALF_UP).toPlainString();
+                return "[" + param.getWeighbridgeName() + "]称重[" + grossAmount + "吨]";
+            case 3:
+                return "司机[" + waybillOrder.getDriverName() + "]已超载,卸货中";
+            default:
+                return "";
+        }
     }
 }

+ 129 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LiftRodReleaseHandler.java

@@ -0,0 +1,129 @@
+package com.sckw.transport.handler;
+
+
+import com.alibaba.fastjson.JSON;
+import com.sckw.core.common.enums.enums.ErrorCodeEnum;
+import com.sckw.core.exception.BusinessPlatfromException;
+import com.sckw.core.model.enums.CarWaybillV1Enum;
+import com.sckw.core.model.enums.GatekeeperStatusEnum;
+import com.sckw.transport.model.KwtGatekeeperWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrderSubtask;
+import com.sckw.transport.model.KwtWaybillOrderTicket;
+import com.sckw.transport.model.param.WaybillOrderLiftRodReleaseParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Objects;
+
+/**
+ * Author: donglang
+ * Time: 2025-11-19
+ * Des: 抬杆放行 mock
+ * Version: 1.0
+ */
+
+@Slf4j
+@Service
+public class LiftRodReleaseHandler extends AbstractWaybillOrderHandler<WaybillOrderLiftRodReleaseParam> {
+
+    @Override
+    protected KwtWaybillOrder getWaybillOrder(WaybillOrderLiftRodReleaseParam param) {
+        return getWaybillOrder(param.getWaybillOrderId());
+    }
+
+    @Override
+    protected void checkState(WaybillOrderLiftRodReleaseParam param, KwtWaybillOrder waybill) {
+        if (!Objects.equals(CarWaybillV1Enum.RELEASED_NOT_EXITED.getCode(), waybill.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "运单状态不是“已放行待离场”状态, 无法推进下一节点!");
+        }
+    }
+
+    @Override
+    protected void doBusiness(WaybillOrderLiftRodReleaseParam param, KwtWaybillOrder waybillOrder) {
+        log.info("推进门卫数据为已离场:{}", JSON.toJSONString(waybillOrder));
+
+        //1. 计算是否空载离场
+        Boolean isEmptyLoadLeave = calculateEmptyLoad(waybillOrder);
+
+        //2. 修改门卫订单状态为:空载离场/离场
+        updateGatekeeperOrderStatus(waybillOrder, isEmptyLoadLeave);
+    }
+
+    /**
+     * 计算是否空载离场
+     * @param waybillOrder
+     * @return
+     */
+    private Boolean calculateEmptyLoad(KwtWaybillOrder waybillOrder) {
+        //查询运单装卸货信息
+        KwtWaybillOrderTicket orderTicket = waybillOrderTicketRepository.queryByWOrderIdByIdAndType(waybillOrder.getId(), 1);
+        if (orderTicket == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_TICKET_NOT_FOUND, "当前物流运单装卸货信息不存在,无法记录皮重!");
+        }
+        BigDecimal loadAmount = orderTicket.getAmount();
+
+        //空载离场,净重<=0.5
+        return loadAmount != null && loadAmount.compareTo(BigDecimal.valueOf(0.5)) <= 0;
+    }
+
+    /**
+     * 修改门卫订单状态
+     * @param waybillOrder
+     * @return
+     */
+    public void updateGatekeeperOrderStatus(KwtWaybillOrder waybillOrder, Boolean isEmptyLoadLeave) {
+        KwtGatekeeperWaybillOrder gatekeeper = gatekeeperWaybillOrderRepository.queryGatekeeperWaybillOrderByWOrderId(waybillOrder.getId());
+        if (gatekeeper == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_NOT_FOUND, "当前门卫订单数据不存在!");
+        }
+        if (!(GatekeeperStatusEnum.READY_RELEASE.getCode().equals(gatekeeper.getStatus()))) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_STATUS_ERROR, "当前门卫订单状态异常,不能推进为已离场状态!");
+        }
+
+        // 修改门卫状态:空载离场/已离场
+        GatekeeperStatusEnum targetStatus = isEmptyLoadLeave ? GatekeeperStatusEnum.EMPTY_EXITED : GatekeeperStatusEnum.EXITED;
+        gatekeeper.setStatus(targetStatus.getCode());
+        gatekeeperWaybillOrderRepository.updateById(gatekeeper);
+
+    }
+
+
+
+    @Override
+    protected void calculateAutoDispatchScore(WaybillOrderLiftRodReleaseParam param, KwtWaybillOrder waybillOrder) {
+
+    }
+
+    @Override
+    protected String getProcessName() {
+        return "抬杆放行";
+    }
+
+    @Override
+    protected void getStatus(KwtWaybillOrder waybillOrder) {
+        // 1. 计算是否空载离场
+        Boolean isEmptyLoadLeave = calculateEmptyLoad(waybillOrder);
+
+        // 2. 校验状态:若是空载离场,运单状态为已完成
+        CarWaybillV1Enum status = isEmptyLoadLeave ? CarWaybillV1Enum.COMPLETED : CarWaybillV1Enum.WAIT_LOADING;
+        if (isEmptyLoadLeave) {
+            waybillOrder.setRemark("空载离场");
+        }
+
+        // 3. 修改运单状态
+        waybillOrder.setStatus(status.getCode());
+        waybillOrderRepository.updateById(waybillOrder);
+
+        // 4. 修改子运单状态
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        waybillSubtask.setStatus(status.getCode());
+        waybillOrderSubtaskRepository.updateById(waybillSubtask);
+    }
+
+    @Override
+    protected String getRemark(WaybillOrderLiftRodReleaseParam param, KwtWaybillOrder waybillOrder) {
+        return "司机[" + waybillOrder.getDriverName() + "]已确认离场";
+    }
+}

+ 19 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LoadingHandler.java

@@ -4,11 +4,15 @@ package com.sckw.transport.handler;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
+import com.sckw.core.utils.CollectionUtils;
 import com.sckw.transport.model.KwtWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrderSubtask;
+import com.sckw.transport.model.KwtWaybillOrderWeighbridge;
 import com.sckw.transport.model.param.WaybillOrderLoadingParam;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -49,8 +53,21 @@ public class LoadingHandler extends AbstractWaybillOrderHandler<WaybillOrderLoad
     }
 
     @Override
-    protected Integer getStatus() {
-        return CarWaybillV1Enum.EXIT_COMPLETED.getCode();
+    protected void getStatus(KwtWaybillOrder waybillOrder) {
+        List<KwtWaybillOrderWeighbridge> weighbridges = waybillOrderWeighbridgeRepository
+                .queryWaybillOrderWeighbridgeByWOrderId(waybillOrder.getId());
+        //第一次过磅,状态为:已装货;后续过磅,状态为:补货完成
+        CarWaybillV1Enum status = CollectionUtils.isEmpty(weighbridges) ?  CarWaybillV1Enum.EXIT_COMPLETED : CarWaybillV1Enum.REPLENISH_FINISH;
+
+        // 1. 修改运单状态
+        waybillOrder.setStatus(status.getCode());
+        waybillOrderRepository.updateById(waybillOrder);
+
+        // 2. 修改子运单状态
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        waybillSubtask.setStatus(status.getCode());
+        waybillOrderSubtaskRepository.updateById(waybillSubtask);
+
     }
 
     @Override

+ 138 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ReplenishHandler.java

@@ -0,0 +1,138 @@
+package com.sckw.transport.handler;
+
+
+import com.sckw.core.common.enums.enums.DictTypeEnum;
+import com.sckw.core.common.enums.enums.ErrorCodeEnum;
+import com.sckw.core.exception.BusinessPlatfromException;
+import com.sckw.core.model.enums.CarWaybillV1Enum;
+import com.sckw.core.model.enums.ForkliftStatusEnum;
+import com.sckw.core.model.enums.LoadingTypeEnum;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.fleet.api.model.vo.RTruckVo;
+import com.sckw.product.api.model.KwpGoods;
+import com.sckw.system.api.model.dto.res.SysDictResDto;
+import com.sckw.transport.model.KwtForkliftWaybillOrder;
+import com.sckw.transport.model.KwtLogisticsOrderGoods;
+import com.sckw.transport.model.KwtWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrderSubtask;
+import com.sckw.transport.model.param.WaybillOrderReplenishParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Author: donglang
+ * Time: 2025-11-19
+ * Des: 补货
+ * Version: 1.0
+ */
+
+@Slf4j
+@Service
+public class ReplenishHandler extends AbstractWaybillOrderHandler<WaybillOrderReplenishParam> {
+
+    @Override
+    protected KwtWaybillOrder getWaybillOrder(WaybillOrderReplenishParam param) {
+        return getWaybillOrder(param.getWaybillOrderId());
+    }
+
+    @Override
+    protected void checkState(WaybillOrderReplenishParam param, KwtWaybillOrder waybill) {
+        if (!Objects.equals(CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(), waybill.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "运单状态不是“空载待离场”状态, 无法推进下一节点!");
+        }
+    }
+
+    @Override
+    protected void doBusiness(WaybillOrderReplenishParam param, KwtWaybillOrder waybillOrder) {
+        //1. 补货:创建铲车记录
+        createForkliftWaybill(waybillOrder);
+    }
+
+    /**
+     * 创建铲车记录
+     * @param waybillOrder
+     */
+    private void createForkliftWaybill(KwtWaybillOrder waybillOrder) {
+        CompletableFuture.runAsync(() ->{
+            try {
+                log.debug("开始异步保存铲车司机数据,运单ID:{}", waybillOrder.getId());
+
+                KwtForkliftWaybillOrder forklift = new KwtForkliftWaybillOrder();
+                forklift.setFOrderNo("F" + System.currentTimeMillis());
+                forklift.setEntId(waybillOrder.getEntId());
+                forklift.setWOrderId(waybillOrder.getId());
+                forklift.setLOrderId(waybillOrder.getLOrderId());
+
+                //查询字典
+                Map<String, Map<String, String>> dictValueAndDictResDtoMap = remoteSystemService.queryDictByType(
+                        Arrays.asList(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
+                Map<String, String> goodsTypeMap= dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), new HashMap<>());
+                Map<String, String> goodsSpecMap= dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.GOODS_SPEC.getType(), new HashMap<>());
+
+                // 查询商品信息
+                KwtLogisticsOrderGoods orderGoods = logisticsOrderGoodsRepository.queryByLogOrderId(waybillOrder.getLOrderId());
+                KwpGoods goods = goodsInfoService.getGoodsById(orderGoods.getGoodsId());
+                if (goods != null) {
+                    List<SysDictResDto> dictResDtoList = remoteSystemService.queryDictFrontAll(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), orderGoods.getGoodsType());
+                    forklift.setDictId(CollectionUtils.isNotEmpty(dictResDtoList) ? dictResDtoList.get(0).getId() : -1L);
+                    forklift.setGoodsId(goods.getId());
+                    forklift.setGoodsName(goods.getName()+"/"+goodsTypeMap.getOrDefault(goods.getGoodsType(),"")+"/"+goodsSpecMap.getOrDefault(goods.getSpec(), ""));
+                }
+                forklift.setLoadingType(LoadingTypeEnum.SUPPLEMENT.getCode());
+                forklift.setStatus(ForkliftStatusEnum.PENDING_ORDERS.getCode());
+                forklift.setDriverId(waybillOrder.getDriverId());
+                forklift.setDriverName(waybillOrder.getDriverName());
+                forklift.setDriverPhone(waybillOrder.getDriverPhone());
+                forklift.setWaybillAcceptTime(waybillOrder.getCreateTime());
+
+                // 任务量
+                KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+                forklift.setEntrustAmount(waybillSubtask.getEntrustAmount());
+                // 车辆类型
+                RTruckVo truckVo = remoteFleetService.findTruckByTruckNo(waybillOrder.getTruckNo());
+                if (truckVo != null) {
+                    forklift.setTruckType(truckVo.getTruckType());
+                    forklift.setCarAxis(truckVo.getCarAxis());
+                }
+                forklift.setCreateTime(new Date());
+                forklift.setCreateUser(waybillOrder.getDriverId());
+                forklift.setUpdateUser(waybillOrder.getDriverId());
+
+                forkliftWaybillOrderRepository.save(forklift);
+                log.debug("铲车司机数据保存成功");
+            } catch (Exception e) {
+                log.error("异步保存铲车司机数据失败!");
+            }
+        });
+    }
+
+    @Override
+    protected void calculateAutoDispatchScore(WaybillOrderReplenishParam param, KwtWaybillOrder waybillOrder) {
+
+    }
+
+    @Override
+    protected String getProcessName() {
+        return "补货";
+    }
+
+    @Override
+    protected void getStatus(KwtWaybillOrder waybillOrder) {
+        // 1. 修改运单状态
+        waybillOrder.setStatus(CarWaybillV1Enum.REPLENISHING.getCode());
+        waybillOrderRepository.updateById(waybillOrder);
+
+        // 2. 修改子运单状态
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        waybillSubtask.setStatus(CarWaybillV1Enum.REPLENISHING.getCode());
+        waybillOrderSubtaskRepository.updateById(waybillSubtask);
+    }
+
+    @Override
+    protected String getRemark(WaybillOrderReplenishParam param, KwtWaybillOrder waybillOrder) {
+        return "司机[" + waybillOrder.getDriverName() + "]已确认补货";
+    }
+}

+ 9 - 3
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java

@@ -55,7 +55,13 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
             CarWaybillV1Enum.PENDING_VEHICLE.getCode(),
             CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),
             CarWaybillV1Enum.EXIT_COMPLETED.getCode(),
-            CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode(),
+            CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(),
+            CarWaybillV1Enum.WAIT_LEAVE.getCode(),
+            CarWaybillV1Enum.UNLOADING.getCode(),
+            CarWaybillV1Enum.WAIT_RELEASE.getCode(),
+            CarWaybillV1Enum.REPLENISHING.getCode(),
+            CarWaybillV1Enum.REPLENISH_FINISH.getCode(),
+            CarWaybillV1Enum.RELEASED_NOT_EXITED.getCode(),
             CarWaybillV1Enum.WAIT_LOADING.getCode(),
             CarWaybillV1Enum.REVIEW_REJECTION.getCode()
     );
@@ -609,8 +615,8 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
     }
 
     @Override
-    protected Integer getStatus() {
-        return null;
+    protected void getStatus(KwtWaybillOrder waybillOrder) {
+
     }
 
     @Override

+ 20 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingHandler.java

@@ -65,7 +65,13 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
             CarWaybillV1Enum.PENDING_VEHICLE.getCode(),
             CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),
             CarWaybillV1Enum.EXIT_COMPLETED.getCode(),
-            CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode(),
+            CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(),
+            CarWaybillV1Enum.WAIT_LEAVE.getCode(),
+            CarWaybillV1Enum.UNLOADING.getCode(),
+            CarWaybillV1Enum.WAIT_RELEASE.getCode(),
+            CarWaybillV1Enum.REPLENISHING.getCode(),
+            CarWaybillV1Enum.REPLENISH_FINISH.getCode(),
+            CarWaybillV1Enum.RELEASED_NOT_EXITED.getCode(),
             CarWaybillV1Enum.WAIT_LOADING.getCode(),
             CarWaybillV1Enum.COMPLETION_LOADING.getCode(),
             CarWaybillV1Enum.REVIEW_REJECTION.getCode()
@@ -282,12 +288,22 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
     }
 
     @Override
-    protected Integer getStatus() {
+    protected void getStatus(KwtWaybillOrder waybillOrder) {
         if (this.targetStatus == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.SYSTEM_ERROR, "[卸货]计算方式为空!");
         }
-        return  Objects.equals(this.targetStatus, Global.NUMERICAL_ONE) ? CarWaybillV1Enum.COMPLETED.getCode()
-                : CarWaybillV1Enum.COMPLETION_LOADING.getCode();
+        CarWaybillV1Enum status = Objects.equals(this.targetStatus, Global.NUMERICAL_ONE) ? CarWaybillV1Enum.COMPLETED
+                : CarWaybillV1Enum.COMPLETION_LOADING;
+
+        // 1. 修改运单状态
+        waybillOrder.setStatus(status.getCode());
+        waybillOrderRepository.updateById(waybillOrder);
+
+        // 2. 修改子运单状态
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        waybillSubtask.setStatus(status.getCode());
+        waybillOrderSubtaskRepository.updateById(waybillSubtask);
+
     }
 
     @Override

+ 10 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingIntoHandler.java

@@ -5,6 +5,7 @@ import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.transport.model.KwtWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrderSubtask;
 import com.sckw.transport.model.KwtWaybillOrderTicket;
 import com.sckw.transport.model.param.WaybillOrderUnloadingIntoParam;
 import lombok.extern.slf4j.Slf4j;
@@ -58,8 +59,15 @@ public class UnloadingIntoHandler extends AbstractWaybillOrderHandler<WaybillOrd
     }
 
     @Override
-    protected Integer getStatus() {
-        return CarWaybillV1Enum.INTO_UNLOADING.getCode();
+    protected void getStatus(KwtWaybillOrder waybillOrder) {
+        // 1. 修改运单状态
+        waybillOrder.setStatus(CarWaybillV1Enum.INTO_UNLOADING.getCode());
+        waybillOrderRepository.updateById(waybillOrder);
+
+        // 2. 修改子运单状态
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        waybillSubtask.setStatus(CarWaybillV1Enum.INTO_UNLOADING.getCode());
+        waybillOrderSubtaskRepository.updateById(waybillSubtask);
     }
 
 

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

@@ -98,6 +98,11 @@ public class KwtGatekeeperWaybillOrder implements Serializable {
      */
     private BigDecimal legalLoad;
 
+    /**
+     * 备注
+     */
+    private String remark;
+
     /**
      * 创建时间
      */

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

@@ -0,0 +1,84 @@
+package com.sckw.transport.model;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Author: donglang
+ * Time: 2026-04-22
+ * Des: 地磅记录信息
+ * Version: 1.0
+ */
+@Data
+@TableName("kwt_waybill_order_weighbridge")
+public class KwtWaybillOrderWeighbridge implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -6702815722773920597L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 物流运单id
+     */
+    private Long wOrderId;
+
+    /**
+     * 物流订单id
+     */
+    private Long lOrderId;
+
+    /**
+     * 车牌id
+     */
+    private Long truckId;
+
+    /**
+     * 车牌号
+     */
+    private String truckNo;
+
+    /**
+     * 地磅id
+     */
+    private Long weighbridgeId;
+
+    /**
+     * 过磅重量
+     */
+    private BigDecimal weight;
+
+    /**
+     * 过磅图片
+     */
+    private String weighUrl;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 创建人
+     */
+    private Long createUser;
+
+    /**
+     * 更新人
+     */
+    private Long updateUser;
+
+}

+ 6 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderCmeIntoWeighParam.java

@@ -1,8 +1,6 @@
 package com.sckw.transport.model.param;
 
 import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
 import java.io.Serial;
@@ -25,15 +23,19 @@ public class WaybillOrderCmeIntoWeighParam extends WaybillOrderProcessParam impl
      * 车辆号
      */
     @Schema(description = "车辆号")
-    @NotBlank(message = "车辆号不能为空")
     private String truckNo;
 
     /**
      * 皮重
      */
     @Schema(description = "皮重")
-    @NotNull(message = "皮重不能为空")
     private BigDecimal tareAmount;
 
+    /**
+     * 毛重
+     */
+    @Schema(description = "毛重")
+    private BigDecimal grossAmount;
+
 
 }

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

@@ -0,0 +1,20 @@
+package com.sckw.transport.model.param;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :donglang
+ * @version :1.0
+ * @description :
+ * @create :2025-11-13 08:59:00
+ */
+@Data
+public class WaybillOrderEmptyLoadLeaveParam extends WaybillOrderProcessParam implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 2496454006112942443L;
+
+}

+ 21 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderLiftRodReleaseParam.java

@@ -0,0 +1,21 @@
+package com.sckw.transport.model.param;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :donglang
+ * @version :1.0
+ * @description :
+ * @create :2025-11-13 08:59:00
+ */
+@Data
+public class WaybillOrderLiftRodReleaseParam extends WaybillOrderProcessParam implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 5226989654273402768L;
+
+
+}

+ 21 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderReplenishParam.java

@@ -0,0 +1,21 @@
+package com.sckw.transport.model.param;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :donglang
+ * @version :1.0
+ * @description :
+ * @create :2025-11-13 08:59:00
+ */
+@Data
+public class WaybillOrderReplenishParam extends WaybillOrderProcessParam implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -6340603797742253283L;
+
+
+}

+ 8 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/reponse/GatekeeperOrderResp.java

@@ -187,4 +187,12 @@ public class GatekeeperOrderResp implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
 
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+
+
+
 }

+ 8 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtGatekeeperWaybillOrderRepository.java

@@ -33,4 +33,12 @@ public class KwtGatekeeperWaybillOrderRepository extends ServiceImpl<KwtGatekeep
                         .orderByDesc(KwtGatekeeperWaybillOrder::getId));
     }
 
+    public KwtGatekeeperWaybillOrder queryGatekeeperWaybillOrderByWOrderId(Long wOrderId) {
+        return getOne(
+                Wrappers.<KwtGatekeeperWaybillOrder>lambdaQuery()
+                        .eq(KwtGatekeeperWaybillOrder::getWOrderId, wOrderId)
+                        .orderByDesc(KwtGatekeeperWaybillOrder::getId)
+                        .last("limit 1"));
+    }
+
 }

+ 30 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderWeighbridgeRepository.java

@@ -0,0 +1,30 @@
+package com.sckw.transport.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.transport.dao.KwtWaybillOrderWeighbridgeMapper;
+import com.sckw.transport.model.KwtWaybillOrderWeighbridge;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @Author: 地磅记录
+ * @CreateTime: 2025-10-12
+ * @Description:
+ * @Version: 1.0
+ */
+
+@Repository
+public class KwtWaybillOrderWeighbridgeRepository extends ServiceImpl<KwtWaybillOrderWeighbridgeMapper, KwtWaybillOrderWeighbridge> {
+
+    public List<KwtWaybillOrderWeighbridge> queryWaybillOrderWeighbridgeByWOrderId(Long wOrderId) {
+        return list(
+                Wrappers.<KwtWaybillOrderWeighbridge>lambdaQuery()
+                        .eq(KwtWaybillOrderWeighbridge::getWOrderId, wOrderId)
+                        .orderByDesc(KwtWaybillOrderWeighbridge::getId));
+    }
+
+
+
+}

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

@@ -614,7 +614,7 @@ public class ForkliftOrderService {
         forkliftWaybillOrder.setFinishTime(new Date());
         forkliftWaybillOrderRepository.updateById(forkliftWaybillOrder);
 
-        //更新物流运单的状态(已装货)
+        //更新司机运单状态:已装货
         WaybillOrderLoadingParam loadingParam = new WaybillOrderLoadingParam();
         loadingParam.setLng(param.getLng());
         loadingParam.setLat(param.getLat());

+ 78 - 25
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java

@@ -9,6 +9,7 @@ import com.sckw.contract.api.RemoteContractService;
 import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.constant.Global;
+import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.core.model.enums.GatekeeperStatusEnum;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.DateUtils;
@@ -18,10 +19,7 @@ import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.order.api.model.OrderUnitInfoDetailVO;
 import com.sckw.product.api.dubbo.GoodsInfoService;
 import com.sckw.system.api.RemoteSystemService;
-import com.sckw.transport.model.KwtGatekeeperWaybillOrder;
-import com.sckw.transport.model.KwtLogisticsOrder;
-import com.sckw.transport.model.KwtWaybillOrder;
-import com.sckw.transport.model.KwtWaybillOrderTicket;
+import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.forklift.reponse.GatekeeperOrderResp;
 import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassParam;
 import com.sckw.transport.model.param.forklift.request.GatekeeperOrderQueryParam;
@@ -129,21 +127,18 @@ public class GatekeeperOrderService {
             //待离场
         } else if (param.getStatus() == 2) {
             wrapper.in(KwtGatekeeperWaybillOrder::getStatus,
-                    GatekeeperStatusEnum.PENDING_EXIT.getCode(),
-                    GatekeeperStatusEnum.EMPTY_PENDING_EXIT.getCode(),
-                    GatekeeperStatusEnum.RELEASED_NOT_EXITED.getCode());
+                    GatekeeperStatusEnum.PENDING_RELEASE.getCode(),
+                    GatekeeperStatusEnum.READY_RELEASE.getCode());
             //场内车辆,状态为4是:处理场内异常车辆逻辑
         } else if (param.getStatus() == 3 || param.getStatus() == 4) {
             wrapper.in(KwtGatekeeperWaybillOrder::getStatus,
                     GatekeeperStatusEnum.IN_YARD.getCode(),
-                    GatekeeperStatusEnum.PENDING_EXIT.getCode(),
-                    GatekeeperStatusEnum.EMPTY_PENDING_EXIT.getCode(),
-                    GatekeeperStatusEnum.RELEASED_NOT_EXITED.getCode());
+                    GatekeeperStatusEnum.PENDING_RELEASE.getCode(),
+                    GatekeeperStatusEnum.READY_RELEASE.getCode());
             //出入记录
         } else if (param.getStatus() == 5) {
             wrapper.in(KwtGatekeeperWaybillOrder::getStatus,
-                    GatekeeperStatusEnum.EXITED.getCode(),
-                    GatekeeperStatusEnum.EMPTY_EXITED.getCode());
+                    GatekeeperStatusEnum.EXITED.getCode());
         }
         return wrapper;
     }
@@ -341,6 +336,7 @@ public class GatekeeperOrderService {
         gatekeeper.setEntrustAmount(gatekeeperWaybillOrder.getEntrustAmount());
         gatekeeper.setGoodsId(gatekeeperWaybillOrder.getGoodsId());
         gatekeeper.setGoodsName(gatekeeperWaybillOrder.getGoodsName());
+        gatekeeper.setRemark(gatekeeperWaybillOrder.getRemark());
 
         //运单数据
         KwtWaybillOrder waybillOrder = waybillOrderMap.getOrDefault(gatekeeperWaybillOrder.getWOrderId(), new KwtWaybillOrder());
@@ -493,9 +489,9 @@ public class GatekeeperOrderService {
         // 定义状态码聚合规则
         Map<String[], List<String>> aggregateRules = Map.of(
                 new String[]{"1", "待进场"}, Arrays.asList("1"),
-                new String[]{"2", "待离场"}, Arrays.asList("10", "15", "20"),
-                new String[]{"3", "场内车辆"}, Arrays.asList("5", "10", "15", "20"),
-                new String[]{"4", "异常车辆"}, Arrays.asList("5", "10", "15", "20")
+                new String[]{"2", "待离场"}, Arrays.asList("10", "15"),
+                new String[]{"3", "场内车辆"}, Arrays.asList("5", "10", "15"),
+                new String[]{"4", "异常车辆"}, Arrays.asList("5", "10", "15")
         );
 
         // 按原始状态统计数量
@@ -512,7 +508,7 @@ public class GatekeeperOrderService {
                     // 处理状态为4的异常车辆
                     if (Objects.equals(aggregateInfo[0],"4")) {
                         totalNum = gatekeeperOrderList.stream().filter(order -> {
-                            // 1. 必须包含在定义的异常状态源中 (5,10,15,20)
+                            // 1. 必须包含在定义的异常状态源中 (5,10,15)
                             if (!originalStatuses.contains(String.valueOf(order.getStatus()))) {
                                 return false;
                             }
@@ -552,17 +548,74 @@ public class GatekeeperOrderService {
      */
     public void pass(GatekeeperOrderPassParam param) {
         log.info("门卫放行:{}", JSON.toJSONString(param));
-        KwtGatekeeperWaybillOrder gatekeeperWaybillOrder = gatekeeperWaybillOrderRepository.getById(param.getId());
-        if (gatekeeperWaybillOrder == null) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前车辆订单不存在!");
+        KwtGatekeeperWaybillOrder gatekeeper = gatekeeperWaybillOrderRepository.getById(param.getId());
+        if (gatekeeper == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前门卫订单不存在!");
         }
-        if (!(GatekeeperStatusEnum.PENDING_EXIT.getCode().equals(gatekeeperWaybillOrder.getStatus())
-                || GatekeeperStatusEnum.EMPTY_PENDING_EXIT.getCode().equals(gatekeeperWaybillOrder.getStatus()))) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_STATUS_ERROR, "当前车辆订单状态异常,不能装载完成!");
+        //1. 更改门卫状态为:已放行
+        updateGatekeeperOrderStatus(gatekeeper);
+
+        //2. 更改司机状态为:已放行未离场
+        updateWaybillOrderStatus(gatekeeper);
+    }
+
+    /**
+     * 更改门卫状态为:已放行
+     * @param gatekeeper
+     */
+    private void updateGatekeeperOrderStatus(KwtGatekeeperWaybillOrder gatekeeper) {
+        if (!GatekeeperStatusEnum.PENDING_RELEASE.getCode().equals(gatekeeper.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_STATUS_ERROR, "当前车辆订单状态异常,不能放行!");
+        }
+        //门卫放行后状态更改为:已放行
+        gatekeeper.setStatus(GatekeeperStatusEnum.READY_RELEASE.getCode());
+        gatekeeperWaybillOrderRepository.updateById(gatekeeper);
+    }
+
+    /**
+     * 更改司机状态为:已放行未离场
+     * @param gatekeeper
+     */
+    private void updateWaybillOrderStatus(KwtGatekeeperWaybillOrder gatekeeper) {
+        // 1. 修改运单状态:已放行未离场
+        updateWaybillStatus(gatekeeper);
+
+        // 2. 修改子运单状态:已放行未离场
+        updateWaybillSubtaskStatus(gatekeeper);
+    }
+
+    /**
+     * 修改运单状态
+     * @param gatekeeper
+     */
+    private void updateWaybillStatus(KwtGatekeeperWaybillOrder gatekeeper) {
+        KwtWaybillOrder waybillOrder = waybillOrderRepository.getById(gatekeeper.getWOrderId());
+        if (waybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前运单数据不存在!");
+        }
+        if (!CarWaybillV1Enum.WAIT_RELEASE.getCode().equals(waybillOrder.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_STATUS_ERROR, "当前运单状态异常,不能推进为已放行待离场!");
+        }
+        //
+        waybillOrder.setStatus(CarWaybillV1Enum.RELEASED_NOT_EXITED.getCode());
+        waybillOrderRepository.updateById(waybillOrder);
+    }
+
+    /**
+     * 修改子运单状态
+     * @param gatekeeper
+     */
+    private void updateWaybillSubtaskStatus(KwtGatekeeperWaybillOrder gatekeeper) {
+        KwtWaybillOrderSubtask waybillSubtask = waybillOrderSubtaskRepository.queryByWOrderId(gatekeeper.getWOrderId());
+        if (waybillSubtask == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_SUB_NOT_FOUND, "未找到关联的子运单!");
+        }
+
+        if (!CarWaybillV1Enum.WAIT_RELEASE.getCode().equals(waybillSubtask.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_STATUS_ERROR, "当前子运单状态异常,不能推进为已放行待离场!");
         }
-        //车辆放行后状态更改为:已放行未离场
-        gatekeeperWaybillOrder.setStatus(GatekeeperStatusEnum.RELEASED_NOT_EXITED.getCode());
-        gatekeeperWaybillOrderRepository.updateById(gatekeeperWaybillOrder);
+        waybillSubtask.setStatus(CarWaybillV1Enum.WAIT_RELEASE.getCode());
+        waybillOrderSubtaskRepository.updateById(waybillSubtask);
     }
 
 

+ 47 - 12
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java

@@ -90,6 +90,10 @@ public class WaybillOrderService {
     private final LoadingHandler loadingHandler;
     private final LeaveMockHandler leaveMockHandler;
     private final LeaveHandler leaveHandler;
+    private final EmptyLoadLeaveHandler emptyLoadLeaveHandler;
+    private final ReplenishHandler replenishHandler;
+    private final LiftRodReleaseHandler liftRodReleaseHandler;
+
     private final UnloadingIntoHandler unloadingIntoHandler;
     private final UnloadingHandler unloadingHandler;
 
@@ -112,22 +116,20 @@ public class WaybillOrderService {
     private static final BigDecimal TWO_TONS = new BigDecimal("2");
     //载重任务量计算比例
     private static final BigDecimal EIGHTY_PERCENT = new BigDecimal("0.8");
-    // 定义禁止运单接单的状态集合
-    private static final List<Integer> FORBIDDEN_STATUSES = Arrays.asList(
-            CarWaybillV1Enum.PENDING_VEHICLE.getCode(),
-            CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),
-            CarWaybillV1Enum.EXIT_COMPLETED.getCode(),
-            CarWaybillV1Enum.WAIT_LOADING.getCode(),
-            CarWaybillV1Enum.REVIEW_REJECTION.getCode()
-    );
 
     // 定义进行中的状态集合
     private static final List<Integer> UNDER_WAY = Arrays.asList(
             CarWaybillV1Enum.PENDING_VEHICLE.getCode(),
             CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),
             CarWaybillV1Enum.EXIT_COMPLETED.getCode(),
-            CarWaybillV1Enum.WAIT_LOADING.getCode(),
-            CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode());
+            CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(),
+            CarWaybillV1Enum.WAIT_LEAVE.getCode(),
+            CarWaybillV1Enum.UNLOADING.getCode(),
+            CarWaybillV1Enum.WAIT_RELEASE.getCode(),
+            CarWaybillV1Enum.REPLENISHING.getCode(),
+            CarWaybillV1Enum.REPLENISH_FINISH.getCode(),
+            CarWaybillV1Enum.RELEASED_NOT_EXITED.getCode(),
+            CarWaybillV1Enum.WAIT_LOADING.getCode());
 
     // 定义审核的状态集合
     private static final List<Integer> REVIEW = Arrays.asList(
@@ -989,7 +991,7 @@ public class WaybillOrderService {
     private static List<StatisticsWaybillResp.OrderBillStatusStatistics> calculateStatusStatistics(List<WaybillOrderStatusResp> waybillOrdertDatas) {
         // 定义状态码聚合规则
         Map<List<String>, String[]> aggregateRules = Map.of(
-                Arrays.asList("1", "5", "10", "11", "15"), new String[]{"1", "进行中"},
+                Arrays.asList("1", "5", "10", "11", "12", "13", "14", "15", "16", "17", "18"), new String[]{"1", "进行中"},
                 Arrays.asList("20", "30"), new String[]{"2", "单证审核"},
                 Arrays.asList("25", "99"), new String[]{"3", "已完成"}
         );
@@ -1150,7 +1152,7 @@ public class WaybillOrderService {
     }
 
     /**
-     * 场过磅(计算毛重和净重)-手动推推送数据
+     * 场过磅(计算毛重和净重)-手动推推送数据
      * @param param
      */
     @Transactional(rollbackFor = Exception.class)
@@ -1158,6 +1160,22 @@ public class WaybillOrderService {
         leaveMockHandler.handler(param);
     }
 
+    /**
+     * 空载离场
+     * @param param
+     */
+    public void emptyLoadLeave(WaybillOrderEmptyLoadLeaveParam param) {
+        emptyLoadLeaveHandler.handler(param);
+    }
+
+    /**
+     * 补货
+     * @param param
+     */
+    public void replenish(WaybillOrderReplenishParam param) {
+        replenishHandler.handler(param);
+    }
+
     /**
      * 离场
      * @param param
@@ -1167,6 +1185,23 @@ public class WaybillOrderService {
         leaveHandler.handler(param);
     }
 
+    /**
+     * 抬杆放行 mock
+     * @param param
+     */
+    public void liftRodRelease(WaybillOrderLiftRodReleaseParam param){
+        liftRodReleaseHandler.handler(param);
+    }
+
+
+    /**
+     * 打印榜单
+     * @param param
+     */
+    public void printList(WaybillOrderLiftRodReleaseParam param){
+        log.info("运单状态统计,参数:{}", JSON.toJSONString(param));
+    }
+
     /**
      * 卸货入场
      * @param param

+ 18 - 0
sql/2026/01/2026_01_06_donglang_create.sql

@@ -74,3 +74,21 @@ CREATE TABLE tms_truck_axle_num (
     delete_time datetime DEFAULT NULL COMMENT '数据删除时间',
     PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='车辆轴数表';
+
+create table kwt_waybill_order_weighbridge
+(
+    id                              bigint          NOT NULL AUTO_INCREMENT COMMENT '主键',
+    w_order_id                      bigint          NOT NULL DEFAULT '-1' COMMENT '物流运单id',
+    l_order_id                      bigint          NOT NULL DEFAULT '-1' COMMENT '物流订单id',
+    truck_id                        bigint          NOT NULL DEFAULT '-1' COMMENT '车牌id',
+    truck_no                        varchar(5)      NOT NULL default '' COMMENT '车牌号',
+    weighbridge_id                  bigint          NOT NULL DEFAULT '-1' COMMENT '地磅id',
+    weight                          decimal(10,6)    NOT NULL DEFAULT 0.000000  COMMENT '过磅重量',
+    weigh_url                       longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '过磅图片',
+    create_time                     datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    update_time                     datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP COMMENT '更新时间',
+    create_user                     bigint          NOT NULL DEFAULT '-1' COMMENT '创建人',
+    update_user                     bigint          NOT NULL DEFAULT '-1' COMMENT '更新人',
+
+    PRIMARY KEY (`id`) USING BTREE
+) comment '地磅记录';