donglang 1 месяц назад
Родитель
Сommit
4487ce7d1b

+ 23 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarWaybillV1Enum.java

@@ -91,6 +91,29 @@ public enum CarWaybillV1Enum {
      * 审核驳回
      * 审核驳回
      */
      */
     REVIEW_REJECTION(30,  "审核驳回"),
     REVIEW_REJECTION(30,  "审核驳回"),
+
+
+    /**
+     * 到达卸货点
+     */
+    UNLOADING_POINT(40, "到达卸货点"),
+
+    /**
+     * 卸货待离场
+     */
+    UNLOADING_WAIT_LEAVE(45, "卸货待离场"),
+
+    /**
+     * 卸货待放行
+     */
+    UNLOADING_WAIT_RELEASE(50, "卸货待放行"),
+
+    /**
+     * 卸货已放行待离场  弃用
+     */
+    UNLOADING_RELEASED_WAIT_LEAVE(55, "卸货已放行待离场"),
+
+
     /**
     /**
      * 已作废
      * 已作废
      */
      */

+ 27 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/GatekeeperStatusEnum.java

@@ -44,6 +44,33 @@ public enum GatekeeperStatusEnum {
      */
      */
     EMPTY_EXITED(25, "空载离场"),
     EMPTY_EXITED(25, "空载离场"),
 
 
+
+    /**
+     * 卸货待进场
+     */
+    UNLOADING_PENDING_ENTRY(30,  "卸货待进场"),
+
+    /**
+     * 卸货已进场
+     */
+    UNLOADING_IN_YARD(35,  "卸货已进场"),
+
+    /**
+     * 卸货待放行
+     */
+    UNLOADING_WAIT_RELEASE(40, "卸货待放行"),
+
+    /**
+     * 卸货已放行
+     */
+    UNLOADING_READY_RELEASE(45, "卸货已放行"),
+
+    /**
+     * 卸货已离场
+     */
+    UNLOADING_EXITED(50, "卸货已离场"),
+
+
     ;
     ;
 
 
     private final Integer code;
     private final Integer code;

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

@@ -389,6 +389,19 @@ public class AppWayBillController {
         return BaseResult.success();
         return BaseResult.success();
     }
     }
 
 
+    /**
+     * 卸货离场
+     *
+     * @param param
+     * @return
+     */
+    @Operation(summary = "卸货离场", description = "卸货离场")
+    @PostMapping("/unloadingLeaved")
+    public BaseResult unloadingLeaved(@RequestBody @Valid WaybillOrderUnLoadingLeaveParam param){
+        waybillOrderService.unloadingLeaved(param);
+        return BaseResult.success();
+    }
+
     /**
     /**
      * 卸货
      * 卸货
      *
      *

+ 53 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LiftRodReleaseHandler.java

@@ -6,16 +6,16 @@ import com.sckw.core.common.enums.enums.ErrorCodeEnum;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.exception.BusinessPlatfromException;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.core.model.enums.CarWaybillV1Enum;
 import com.sckw.core.model.enums.GatekeeperStatusEnum;
 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.fleet.api.model.vo.RTruckVo;
+import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.WaybillOrderLiftRodReleaseParam;
 import com.sckw.transport.model.param.WaybillOrderLiftRodReleaseParam;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.Objects;
 import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
 
 
 /**
 /**
  * Author: donglang
  * Author: donglang
@@ -49,6 +49,9 @@ public class LiftRodReleaseHandler extends AbstractWaybillOrderHandler<WaybillOr
 
 
         //2. 修改门卫订单状态为:空载离场/离场
         //2. 修改门卫订单状态为:空载离场/离场
         updateGatekeeperOrderStatus(waybillOrder, isEmptyLoadLeave);
         updateGatekeeperOrderStatus(waybillOrder, isEmptyLoadLeave);
+
+        //3. 创建门卫卸货订单
+        creatGatekeeperUnLoadingOrder(waybillOrder);
     }
     }
 
 
     /**
     /**
@@ -90,6 +93,52 @@ public class LiftRodReleaseHandler extends AbstractWaybillOrderHandler<WaybillOr
     }
     }
 
 
 
 
+    /**
+     * 创建卸货门卫订单
+     *
+     * @param waybillOrder
+     */
+    private void creatGatekeeperUnLoadingOrder(KwtWaybillOrder waybillOrder) {
+        RTruckVo truck = remoteFleetService.findTruckByTruckNo(waybillOrder.getTruckNo());
+        if (truck == null || !Objects.equals(truck.getStatus(), 0)) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.TRUCK_STATUS_ERROR, "当前车辆非正常状态,不能接单!");
+        }
+        //查询子运单
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+
+        CompletableFuture.runAsync(() -> {
+            try {
+                KwtGatekeeperWaybillOrder gatekeeper = new KwtGatekeeperWaybillOrder();
+                gatekeeper.setEntId(waybillOrder.getEntId());
+                gatekeeper.setWOrderId(waybillOrder.getId());
+                gatekeeper.setWOrderNo(waybillOrder.getWOrderNo());
+                gatekeeper.setLOrderId(waybillOrder.getLOrderId());
+                // 查询商品信息
+                KwtLogisticsOrderGoods orderGoods = logisticsOrderGoodsRepository.queryByLogOrderId(waybillOrder.getLOrderId());
+                if (orderGoods != null) {
+                    gatekeeper.setGoodsId(orderGoods.getGoodsId());
+                    gatekeeper.setGoodsName(orderGoods.getGoodsName());
+                }
+                gatekeeper.setWaybillAcceptTime(waybillOrder.getCreateTime());
+                gatekeeper.setStatus(GatekeeperStatusEnum.UNLOADING_PENDING_ENTRY.getCode());
+                gatekeeper.setWaybillAcceptTime(waybillOrder.getCreateTime());
+                gatekeeper.setTruckType(truck.getTruckType());
+                gatekeeper.setEntrustAmount(waybillSubtask.getEntrustAmount());
+                gatekeeper.setCarAxis(truck.getCarAxis());
+                gatekeeper.setLegalLoad(truck.getLegalLoad());
+                gatekeeper.setCreateTime(new Date());
+                gatekeeper.setCreateUser(waybillOrder.getDriverId());
+                gatekeeper.setUpdateUser(waybillOrder.getDriverId());
+
+                log.debug("开始异步保存卸货门卫订单数据,运单ID:{}", waybillOrder.getId());
+                gatekeeperWaybillOrderRepository.save(gatekeeper);
+                log.debug("卸货门卫订单数据保存成功");
+            } catch (Exception e) {
+                log.error("异步保存卸货门卫订单数据失败!");
+            }
+        });
+    }
+
 
 
     @Override
     @Override
     protected void calculateAutoDispatchScore(WaybillOrderLiftRodReleaseParam param, KwtWaybillOrder waybillOrder) {
     protected void calculateAutoDispatchScore(WaybillOrderLiftRodReleaseParam param, KwtWaybillOrder waybillOrder) {

+ 103 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingLeavedHandler.java

@@ -0,0 +1,103 @@
+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.core.utils.CollectionUtils;
+import com.sckw.transport.model.KwtGatekeeperWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrderSubtask;
+import com.sckw.transport.model.param.WaybillOrderUnLoadingLeaveParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Author: donglang
+ * Time: 2026-01-20
+ * Des: 卸货离场
+ * Version: 1.0
+ */
+
+@Slf4j
+@Service
+public class UnloadingLeavedHandler extends AbstractWaybillOrderHandler<WaybillOrderUnLoadingLeaveParam> {
+
+    @Override
+    protected KwtWaybillOrder getWaybillOrder(WaybillOrderUnLoadingLeaveParam param) {
+        return getWaybillOrder(param.getWaybillOrderId());
+    }
+
+    @Override
+    protected void checkState(WaybillOrderUnLoadingLeaveParam param, KwtWaybillOrder waybillOrder) {
+        if (!Objects.equals(CarWaybillV1Enum.UNLOADING_WAIT_LEAVE.getCode(), waybillOrder.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "运单状态不是“待离场”状态, 无法推进下一节点!");
+        }
+    }
+
+    @Override
+    protected void doBusiness(WaybillOrderUnLoadingLeaveParam param, KwtWaybillOrder waybillOrder) {
+        log.info("推进门卫卸货数据为待放行:{}", JSON.toJSONString(waybillOrder));
+
+        // 修改门卫订单状态为:卸货待放行
+        updateGatekeeperOrderStatus(waybillOrder);
+    }
+
+    /**
+     * 修改门卫订单状态
+     * @param waybillOrder
+     * @return
+     */
+    public void updateGatekeeperOrderStatus(KwtWaybillOrder waybillOrder) {
+        List<KwtGatekeeperWaybillOrder> gatekeeperList = gatekeeperWaybillOrderRepository
+                .queryGatekeeperWaybillOrdersByWOrderId(waybillOrder.getId());
+        if (CollectionUtils.isEmpty(gatekeeperList)) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_NOT_FOUND, "当前门卫卸货订单数据不存在!");
+        }
+        //获取卸货门卫订单
+        KwtGatekeeperWaybillOrder gatekeeper = gatekeeperList.stream()
+                .filter(gate -> Objects.equals(gate.getStatus(), GatekeeperStatusEnum.UNLOADING_IN_YARD.getCode()))
+                .findFirst().orElse(null);
+        if (gatekeeper == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.GATEKEEPER_ORDER_NOT_FOUND, "当前门卫卸货订单数据不存在!");
+        }
+
+        //修改门卫:卸货待放行
+        gatekeeper.setStatus(GatekeeperStatusEnum.UNLOADING_WAIT_RELEASE.getCode());
+        gatekeeperWaybillOrderRepository.updateById(gatekeeper);
+    }
+
+
+    @Override
+    protected void calculateAutoDispatchScore(WaybillOrderUnLoadingLeaveParam param, KwtWaybillOrder waybillOrder) {
+
+    }
+
+    @Override
+    protected String getProcessName() {
+        return "卸货离场";
+    }
+
+    @Override
+    protected void getStatus(KwtWaybillOrder waybillOrder) {
+        // 1. 修改运单状态
+        waybillOrder.setStatus(CarWaybillV1Enum.UNLOADING_WAIT_RELEASE.getCode());
+        waybillOrderRepository.updateById(waybillOrder);
+
+        // 2. 修改子运单状态
+        KwtWaybillOrderSubtask waybillSubtask = getWaybillSubtask(waybillOrder.getId());
+        waybillSubtask.setStatus(CarWaybillV1Enum.UNLOADING_WAIT_RELEASE.getCode());
+        waybillOrderSubtaskRepository.updateById(waybillSubtask);
+    }
+
+
+    @Override
+    protected String getRemark(WaybillOrderUnLoadingLeaveParam param, KwtWaybillOrder waybillOrder) {
+        return "车辆[" + waybillOrder.getTruckNo() + "]已确认卸货离场";
+    }
+}

+ 21 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderUnLoadingLeaveParam.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 WaybillOrderUnLoadingLeaveParam extends WaybillOrderProcessParam implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1038619782660342061L;
+
+
+}

+ 16 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderUnloadingIntoParam.java

@@ -1,7 +1,7 @@
 package com.sckw.transport.model.param;
 package com.sckw.transport.model.param;
 
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Data;
 import lombok.Data;
 
 
 import java.io.Serial;
 import java.io.Serial;
@@ -20,11 +20,25 @@ public class WaybillOrderUnloadingIntoParam extends WaybillOrderProcessParam imp
     @Serial
     @Serial
     private static final long serialVersionUID = 6321184385988633871L;
     private static final long serialVersionUID = 6321184385988633871L;
 
 
+    /**
+     * 车辆号
+     */
+    @NotBlank(message = "车辆号不能为空!")
+    @Schema(description = "车辆号")
+    private String truckNo;
+
     /**
     /**
      * 毛重
      * 毛重
      */
      */
     @Schema(description = "毛重")
     @Schema(description = "毛重")
-    @NotNull(message = "毛重不能为空")
     private BigDecimal grossAmount;
     private BigDecimal grossAmount;
 
 
+    /**
+     * 皮重
+     */
+    @Schema(description = "皮重")
+    private BigDecimal tareAmount;
+
+
+
 }
 }

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

@@ -41,4 +41,11 @@ public class KwtGatekeeperWaybillOrderRepository extends ServiceImpl<KwtGatekeep
                         .last("limit 1"));
                         .last("limit 1"));
     }
     }
 
 
+    public List<KwtGatekeeperWaybillOrder> queryGatekeeperWaybillOrdersByWOrderId(Long wOrderId) {
+        return list(
+                Wrappers.<KwtGatekeeperWaybillOrder>lambdaQuery()
+                        .eq(KwtGatekeeperWaybillOrder::getWOrderId, wOrderId)
+                        .orderByDesc(KwtGatekeeperWaybillOrder::getId));
+    }
+
 }
 }

+ 10 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java

@@ -96,6 +96,7 @@ public class WaybillOrderService {
 
 
     private final UnloadingIntoHandler unloadingIntoHandler;
     private final UnloadingIntoHandler unloadingIntoHandler;
     private final UnloadingHandler unloadingHandler;
     private final UnloadingHandler unloadingHandler;
+    private final UnloadingLeavedHandler unloadingLeavedHandler;
 
 
     private final KwtWaybillOrderV1Service waybillOrderV1Service;
     private final KwtWaybillOrderV1Service waybillOrderV1Service;
 
 
@@ -1253,6 +1254,15 @@ public class WaybillOrderService {
         unloadingIntoHandler.handler(param);
         unloadingIntoHandler.handler(param);
     }
     }
 
 
+    /**
+     * 卸货离场
+     * @param param
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void unloadingLeaved(WaybillOrderUnLoadingLeaveParam param) {
+        unloadingLeavedHandler.handler(param);
+    }
+
     /**
     /**
      * 卸货
      * 卸货
      * @param param
      * @param param