Эх сурвалжийг харах

修改司机和运单关联需求业务

donglang 1 сар өмнө
parent
commit
53e9347192

+ 25 - 13
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java

@@ -152,9 +152,6 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
                 }
                 forklift.setLoadingType(LoadingTypeEnum.LOADING.getCode());
                 forklift.setStatus(ForkliftStatusEnum.PENDING_ORDERS.getCode());
-                forklift.setDriverId(waybillOrder.getDriverId());
-                forklift.setDriverName(waybillOrder.getDriverName());
-                forklift.setDriverPhone(waybillOrder.getDriverPhone());
                 forklift.setWaybillAcceptTime(waybillOrder.getCreateTime());
 
                 // 任务量
@@ -194,11 +191,12 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         }
         //修改门卫已进场
         gatekeeper.setStatus(GatekeeperStatusEnum.IN_YARD.getCode());
+        gatekeeper.setIntoTime(new Date());
         gatekeeperWaybillOrderRepository.updateById(gatekeeper);
     }
 
     /**
-     * 创建铲车记录
+     * 创建过磅记录
      * @param waybillOrder
      */
     private void createWeighbridges(KwtWaybillOrder waybillOrder) {
@@ -363,30 +361,44 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
      */
     @Override
     protected void createNodeTrace(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
-        if (checkIsFirst(waybillOrder)) {
-            // 第一条:装载完成
+        List<KwtWaybillOrderWeighbridge> weighbridges = waybillOrderWeighbridgeRepository.queryWaybillOrderWeighbridgeByWOrderId(waybillOrder.getId());
+        if (CollectionUtils.isEmpty(weighbridges)) {
+            // 第一条:称重完成
             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());
+            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);
+            //过磅次数
+            int size = weighbridges.size() + 1;
+            String grossAmount = Objects.isNull(param.getGrossAmount()) ? "0.00" : param.getGrossAmount().setScale(2, RoundingMode.HALF_UP).toPlainString();
+            node1.setRemark("第" + size + "次称重,[" + param.getWeighbridgeName() +  "]称重["  + grossAmount + "吨]");
             waybillOrderNodeRepository.save(node1);
-            log.info("记录【多次过磅】节点轨迹成功,节点ID:{}", node1.getId());
+            log.info("记录【过磅称重】节点轨迹成功,节点ID:{}", node1.getId());
+
+            // 间隔5秒钟,防止时间相同
+//            Date fiveSecondsLater = new Date(System.currentTimeMillis() + 5000);
+//            if (this.targetStatus == null) {
+//                throw new BusinessPlatfromException(ErrorCodeEnum.SYSTEM_ERROR, "[离场过磅]是否空载离场数据为空!");
+//            }
+//            String remark = buildRemark(waybillOrder, param, this.targetStatus);
+//            KwtWaybillOrderNode node2 = getWaybillOrderNode(param, waybillOrder);
+//            node2.setRemark(remark);
+//            node2.setCreateTime(fiveSecondsLater);
+//            waybillOrderNodeRepository.save(node2);
+//            log.info("记录【多次过磅】节点轨迹成功,节点ID:{}", node2.getId());
         }
     }
 

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

@@ -91,6 +91,6 @@ public class EmptyLoadLeaveHandler extends AbstractWaybillOrderHandler<WaybillOr
 
     @Override
     protected String getRemark(WaybillOrderEmptyLoadLeaveParam param, KwtWaybillOrder waybillOrder) {
-        return "司机[" + waybillOrder.getDriverName() + "]空载待放行";
+        return "司机[" + waybillOrder.getDriverName() + "]已确认空载离场";
     }
 }

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

@@ -124,6 +124,6 @@ public class LiftRodReleaseHandler extends AbstractWaybillOrderHandler<WaybillOr
 
     @Override
     protected String getRemark(WaybillOrderLiftRodReleaseParam param, KwtWaybillOrder waybillOrder) {
-        return "司机[" + waybillOrder.getDriverName() + "]已确认离场";
+        return "司机[" + waybillOrder.getDriverName() + "]已离场";
     }
 }

+ 10 - 7
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LoadingHandler.java

@@ -4,15 +4,13 @@ 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.KwtForkliftWaybillOrder;
 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;
 
 /**
@@ -55,10 +53,9 @@ public class LoadingHandler extends AbstractWaybillOrderHandler<WaybillOrderLoad
 
     @Override
     protected void getStatus(KwtWaybillOrder waybillOrder) {
-        List<KwtWaybillOrderWeighbridge> weighbridges = waybillOrderWeighbridgeRepository
-                .queryWaybillOrderWeighbridgeByWOrderId(waybillOrder.getId());
         //第一次过磅,状态为:已装货;后续过磅,状态为:补货完成
-        CarWaybillV1Enum status = CollectionUtils.isEmpty(weighbridges) ?  CarWaybillV1Enum.EXIT_COMPLETED : CarWaybillV1Enum.REPLENISH_FINISH;
+        CarWaybillV1Enum status = Objects.equals(waybillOrder.getStatus(), CarWaybillV1Enum.REFUSE_TRAFFIC.getCode())
+                ? CarWaybillV1Enum.EXIT_COMPLETED : CarWaybillV1Enum.REPLENISH_FINISH;
 
         // 1. 修改运单状态
         waybillOrder.setStatus(status.getCode());
@@ -73,6 +70,12 @@ public class LoadingHandler extends AbstractWaybillOrderHandler<WaybillOrderLoad
 
     @Override
     protected String getRemark(WaybillOrderLoadingParam param, KwtWaybillOrder waybillOrder) {
-        return "[" + waybillOrder.getDriverName() + "]已装载完成";
+        // 查询铲车订单
+        KwtForkliftWaybillOrder forkliftWaybillOrder = forkliftWaybillOrderRepository
+                .queryForkliftWaybillOrderByWOrderId(waybillOrder.getId());
+        if (forkliftWaybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前铲车订单不存在!");
+        }
+        return "装载员[" + forkliftWaybillOrder.getDriverName() + "]已完成装载,装载单号[" + forkliftWaybillOrder.getFOrderNo() + "]";
     }
 }

+ 1 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ReplenishHandler.java

@@ -83,9 +83,6 @@ public class ReplenishHandler extends AbstractWaybillOrderHandler<WaybillOrderRe
                 }
                 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());
 
                 // 任务量
@@ -133,6 +130,6 @@ public class ReplenishHandler extends AbstractWaybillOrderHandler<WaybillOrderRe
 
     @Override
     protected String getRemark(WaybillOrderReplenishParam param, KwtWaybillOrder waybillOrder) {
-        return "司机[" + waybillOrder.getDriverName() + "]已确认补货";
+        return "司机[" + waybillOrder.getDriverName() + "]返场补货";
     }
 }

+ 1 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java

@@ -157,6 +157,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
                     gatekeeper.setGoodsId(orderGoods.getGoodsId());
                     gatekeeper.setGoodsName(orderGoods.getGoodsName());
                 }
+                gatekeeper.setWaybillAcceptTime(waybillOrder.getCreateTime());
                 gatekeeper.setStatus(GatekeeperStatusEnum.PENDING_ENTRY.getCode());
                 gatekeeper.setWaybillAcceptTime(waybillOrder.getCreateTime());
                 gatekeeper.setTruckType(truck.getTruckType());

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

@@ -73,6 +73,16 @@ public class KwtGatekeeperWaybillOrder implements Serializable {
      */
     private Date leaveTime;
 
+    /**
+     * 门卫id
+     */
+    private Long gatekeeperUserId;
+
+    /**
+     * 门卫姓名
+     */
+    private String gatekeeperName;
+
     /**
      * 运单接单时间
      */

+ 15 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/forklift/request/GatekeeperOrderPassParam.java

@@ -1,6 +1,7 @@
 package com.sckw.transport.model.param.forklift.request;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
@@ -26,6 +27,20 @@ public class GatekeeperOrderPassParam implements Serializable {
     @Schema(description = "门卫订单id")
     private Long id;
 
+    /**
+     * 门卫id
+     */
+    @NotNull(message = "门卫id不能为空")
+    @Schema(description = "门卫id")
+    private Long gatekeeperUserId;
+
+    /**
+     * 门卫姓名
+     */
+    @NotBlank(message = "门卫姓名不能为空")
+    @Schema(description = "门卫姓名")
+    private String gatekeeperName;
+
 
 
 

+ 9 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtForkliftWaybillOrderRepository.java

@@ -50,7 +50,15 @@ public class KwtForkliftWaybillOrderRepository extends ServiceImpl<KwtForkliftWa
                 .last("limit 1"));
     }
 
+    public KwtForkliftWaybillOrder queryForkliftWaybillOrderByWOrderId(Long wOrderId) {
+        return getOne(Wrappers.<KwtForkliftWaybillOrder>lambdaQuery()
+                .eq(KwtForkliftWaybillOrder::getWOrderId, wOrderId)
+                .orderByDesc(KwtForkliftWaybillOrder::getId)
+                .last("limit 1"));
+    }
+
+
+
 
-  
 
 }

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

@@ -18,10 +18,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.KwtForkliftWaybillOrder;
-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.WaybillOrderLoadingParam;
 import com.sckw.transport.model.param.forklift.reponse.ForkliftOrderResp;
 import com.sckw.transport.model.param.forklift.request.ForkliftOrderCancelParam;
@@ -37,6 +34,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.script.DefaultRedisScript;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
@@ -62,6 +60,7 @@ public class ForkliftOrderService {
     private final KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
     private final KwtLogisticsOrderRepository logisticsOrderRepository;
     private final KwtLogisticsOrderGoodsRepository logisticsOrderGoodsRepository;
+    private final KwtWaybillOrderNodeRepository waybillOrderNodeRepository;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteContractService remoteContractService;
@@ -557,7 +556,8 @@ public class ForkliftOrderService {
      * 铲车接单
      * @param param
      */
-    private void createForkliftWaybillOrder(ForkliftOrderTakingParam param) {
+    @Transactional(rollbackFor = Exception.class)
+    public void createForkliftWaybillOrder(ForkliftOrderTakingParam param) {
         log.info("生成铲车订单,入参参数:{}", JSON.toJSONString(param));
         KwtForkliftWaybillOrder forkliftWaybillOrder = forkliftWaybillOrderRepository.queryForkliftWaybillOrderByFOrderId(param.getForkliftOrderId());
         if (forkliftWaybillOrder == null) {
@@ -573,9 +573,44 @@ public class ForkliftOrderService {
         forkliftWaybillOrder.setDriverName(param.getDriverName());
         forkliftWaybillOrder.setForkliftAcceptTime(new Date());
         forkliftWaybillOrderRepository.updateById(forkliftWaybillOrder);
+
+        // 创建司机日志记录
+        creatWaybillOrderNode(param, forkliftWaybillOrder);
         log.info("铲车接单成功,订单ID:{}", forkliftWaybillOrder.getWOrderId());
     }
 
+    /**
+     * 创建日子轨迹记录
+     * @param param
+     * @param forkliftWaybillOrder
+     * @return
+     */
+    public void creatWaybillOrderNode(ForkliftOrderTakingParam param, KwtForkliftWaybillOrder forkliftWaybillOrder) {
+        log.info("[铲车接单]创建车辆运单-节点轨迹入参参数:{}", JSON.toJSONString(param));
+        // 查询运单
+        KwtWaybillOrder waybillOrder = waybillOrderRepository.getById(forkliftWaybillOrder.getWOrderId());
+        if (waybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_SUB_NOT_FOUND, "未找到关联的运单!");
+        }
+        // 查询子运单
+        KwtWaybillOrderSubtask subtask = waybillOrderSubtaskRepository.queryByWOrderId(forkliftWaybillOrder.getWOrderId());
+        if (subtask == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_SUB_NOT_FOUND, "未找到关联的子运单!");
+        }
+
+        KwtWaybillOrderNode node = new KwtWaybillOrderNode();
+        node.setWOrderId(forkliftWaybillOrder.getWOrderId());
+        node.setWSubtaskId(subtask.getId());
+        node.setOrderStatus(subtask.getStatus());
+        node.setTruckNo(waybillOrder.getTruckNo());
+        node.setTruckId(waybillOrder.getTruckId());
+        node.setDriverId(waybillOrder.getDriverId());
+        node.setDriverName(waybillOrder.getDriverName());
+        node.setRemark("装载员[" + param.getDriverName() + "]已接单,装载单号[" + forkliftWaybillOrder.getFOrderNo() + "]");
+        waybillOrderNodeRepository.save(node);
+        log.info("[铲车接单]记录节点轨迹成功,节点ID:{}", node.getId());
+    }
+
     /**
      * 铲车取消接单
      * @param param

+ 42 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java

@@ -56,6 +56,7 @@ public class GatekeeperOrderService {
     private final KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
     private final KwtLogisticsOrderRepository logisticsOrderRepository;
     private final KwtLogisticsOrderGoodsRepository logisticsOrderGoodsRepository;
+    private final KwtWaybillOrderNodeRepository waybillOrderNodeRepository;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteContractService remoteContractService;
@@ -553,35 +554,42 @@ public class GatekeeperOrderService {
             throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前门卫订单不存在!");
         }
         //1. 更改门卫状态为:已放行
-        updateGatekeeperOrderStatus(gatekeeper);
+        updateGatekeeperOrderStatus(gatekeeper, param);
 
         //2. 更改司机状态为:已放行未离场
-        updateWaybillOrderStatus(gatekeeper);
+        updateWaybillOrderStatus(gatekeeper, param);
     }
 
     /**
      * 更改门卫状态为:已放行
      * @param gatekeeper
      */
-    private void updateGatekeeperOrderStatus(KwtGatekeeperWaybillOrder gatekeeper) {
+    private void updateGatekeeperOrderStatus(KwtGatekeeperWaybillOrder gatekeeper, GatekeeperOrderPassParam param) {
         if (!GatekeeperStatusEnum.PENDING_RELEASE.getCode().equals(gatekeeper.getStatus())) {
             throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_STATUS_ERROR, "当前车辆订单状态异常,不能放行!");
         }
         //门卫放行后状态更改为:已放行
         gatekeeper.setStatus(GatekeeperStatusEnum.READY_RELEASE.getCode());
+        gatekeeper.setLeaveTime(new Date());
+        gatekeeper.setGatekeeperUserId(param.getGatekeeperUserId());
+        gatekeeper.setGatekeeperName(param.getGatekeeperName());
+        gatekeeper.setUpdateUser(param.getGatekeeperUserId());
         gatekeeperWaybillOrderRepository.updateById(gatekeeper);
     }
 
     /**
-     * 更改司机状态为:已放行未离场
+      * 更改司机状态为:已放行未离场
      * @param gatekeeper
      */
-    private void updateWaybillOrderStatus(KwtGatekeeperWaybillOrder gatekeeper) {
+    private void updateWaybillOrderStatus(KwtGatekeeperWaybillOrder gatekeeper, GatekeeperOrderPassParam param) {
         // 1. 修改运单状态:已放行未离场
         updateWaybillStatus(gatekeeper);
 
         // 2. 修改子运单状态:已放行未离场
         updateWaybillSubtaskStatus(gatekeeper);
+
+        // 3.创建运单轨迹日日志
+        creatWaybillOrderNode(gatekeeper, param);
     }
 
     /**
@@ -618,6 +626,35 @@ public class GatekeeperOrderService {
         waybillOrderSubtaskRepository.updateById(waybillSubtask);
     }
 
+    /**
+     * 创建日子轨迹记录
+     * @param gatekeeper
+     * @return
+     */
+    public void creatWaybillOrderNode(KwtGatekeeperWaybillOrder gatekeeper, GatekeeperOrderPassParam param) {
+        log.info("[门卫放行]创建车辆运单-节点轨迹入参参数:{}", JSON.toJSONString(gatekeeper));
+        // 查询运单
+        KwtWaybillOrder waybillOrder = waybillOrderRepository.getById(gatekeeper.getWOrderId());
+        if (waybillOrder == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_SUB_NOT_FOUND, "未找到关联的运单!");
+        }
+        // 查询子运单
+        KwtWaybillOrderSubtask subtask = waybillOrderSubtaskRepository.queryByWOrderId(gatekeeper.getWOrderId());
+        if (subtask == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_SUB_NOT_FOUND, "未找到关联的子运单!");
+        }
+        KwtWaybillOrderNode node = new KwtWaybillOrderNode();
+        node.setWOrderId(gatekeeper.getWOrderId());
+        node.setWSubtaskId(subtask.getId());
+        node.setOrderStatus(subtask.getStatus());
+        node.setTruckId(waybillOrder.getTruckId());
+        node.setDriverId(waybillOrder.getDriverId());
+        node.setDriverName(waybillOrder.getDriverName());
+        node.setRemark("门卫[" + param.getGatekeeperName() + "]已放行");
+        waybillOrderNodeRepository.save(node);
+        log.info("[门卫放行]记录节点轨迹成功,节点ID:{}", node.getId());
+    }
+
 
 
 }

+ 3 - 1
sql/2026/01/2026_01_06_donglang_create.sql

@@ -43,7 +43,9 @@ create table kwt_gatekeeper_waybill_order
     goods_name                      varchar(20)     NOT NULL default '' COMMENT '商品名称',
     status                          int             NOT NULL DEFAULT '0' COMMENT '状态(1-待进场,5-已进场、10-待离场、15-空载待离场、20-已放行未离场、25-已离场、30-空载离场)',
     into_time                       datetime        NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '进场时间',
-    leave_time                      datetime        DEFAULT NULL COMMENT '离场时间',
+    leave_time                      datetime        DEFAULT NULL COMMENT '放行时间',
+    gatekeeper_user_id              bigint          DEFAULT DEFAULT '-1' COMMENT '门卫用户id',
+    gatekeeper_name                 varchar(40)     DEFAULT '' COMMENT '门卫姓名',
     waybill_accept_time             datetime        NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '运单接单时间',
     entrust_amount                  decimal(10,6)   DEFAULT NULL COMMENT '任务量',
     truck_type                      varchar(5)      NOT NULL default '' COMMENT '车辆类型',