Browse Source

新增卸货流程

donglang 1 day ago
parent
commit
861298f61e

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

@@ -35,6 +35,12 @@ public enum CarWaybillV1Enum {
      * 已离场
      */
     WAIT_LOADING(15,  "已离场"),
+
+    /**
+     * 卸货入场
+     */
+    INTO_UNLOADING(16,  "已离场"),
+
     /**
      * 已卸货
      */

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

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

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

@@ -2,7 +2,6 @@ package com.sckw.transport.handler;
 
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.contract.api.feign.LogisticsScoreFeignService;
 import com.sckw.contract.api.model.dto.req.LogisticsScoreDetailFeignDto;
@@ -26,7 +25,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.Collections;
+import java.util.List;
 import java.util.stream.Collectors;
 
 /**

+ 0 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/CancelHandler.java

@@ -39,11 +39,6 @@ import java.util.concurrent.TimeUnit;
 @RequiredArgsConstructor
 public class CancelHandler extends AbstractWaybillOrderHandler<WaybillOrderCancelParam>{
 
-    @Autowired
-    private KwtLogisticsOrderRepository logisticsOrderRepository;
-    @DubboReference(version = "1.0.0", group = "design", check = false)
-    private RemoteFleetService remoteFleetService;
-    private final KwtWaybillOrderRepository waybillOrderRepository;
 
     @Override
     protected KwtWaybillOrder getWaybillOrder(WaybillOrderCancelParam param) {

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

@@ -56,11 +56,11 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
 
     @Override
     protected void doBusiness(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
-        //1.填充运单皮重
-        LambdaQueryWrapper<KwtWaybillOrderTicket> queryWrapper = Wrappers.<KwtWaybillOrderTicket>lambdaQuery()
-                .eq(KwtWaybillOrderTicket::getWOrderId, param.getWaybillOrderId())
-                .eq(KwtWaybillOrderTicket::getType, AddressTypeEnum.SHIPMENT.getCode());
-        KwtWaybillOrderTicket orderTicket = waybillOrderTicketRepository.getOne(queryWrapper);
+        //1.填充运单装货单皮重
+        KwtWaybillOrderTicket orderTicket = waybillOrderTicketRepository.queryByWOrderIdByIdAndType(param.getWaybillOrderId(), 1);
+        if (orderTicket == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_TICKET_NOT_FOUND, "当前物流运单装卸货信息不存在,无法记录皮重!");
+        }
         orderTicket.setTareAmount(param.getTareAmount());
         waybillOrderTicketRepository.updateById(orderTicket);
 

+ 0 - 6
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LeaveHandler.java

@@ -25,12 +25,6 @@ import java.util.Objects;
 @Service
 public class LeaveHandler extends AbstractWaybillOrderHandler<WaybillOrderLeaveParam> {
 
-    @Autowired
-    private KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
-    @Autowired
-    private KwtWaybillOrderSubtaskRepository waybillOrderSubtaskRepository;
-
-
     @Override
     protected KwtWaybillOrder getWaybillOrder(WaybillOrderLeaveParam param) {
         return getWaybillOrder(param.getWaybillOrderId());

+ 23 - 35
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/LeaveMockHandler.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.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;
@@ -32,12 +33,6 @@ import java.util.stream.Collectors;
 @Service
 public class LeaveMockHandler extends AbstractWaybillOrderHandler<WaybillOrderLeaveMockParam> {
 
-    @Autowired
-    private KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
-    @Autowired
-    private KwtWaybillOrderSubtaskRepository waybillOrderSubtaskRepository;
-
-
     @Override
     protected KwtWaybillOrder getWaybillOrder(WaybillOrderLeaveMockParam param) {
         return getWaybillOrder(param.getWaybillOrderId());
@@ -52,14 +47,14 @@ public class LeaveMockHandler extends AbstractWaybillOrderHandler<WaybillOrderLe
 
     @Override
     protected void doBusiness(WaybillOrderLeaveMockParam param, KwtWaybillOrder waybillOrder) {
-        List<KwtWaybillOrderTicket> ticketList = waybillOrderTicketRepository.queryByWOrderId(param.getWaybillOrderId());
-        // 按 type 分组
-        Map<Integer, KwtWaybillOrderTicket> ticketMap = ticketList.stream()
-                .collect(Collectors.toMap(KwtWaybillOrderTicket::getType, Function.identity(), (a, b) -> a));
-        //1.填充毛重
-        updateGrossAmount(param, ticketMap);
-        //2.填充运单装货重
-        updateLoadAmount(param, waybillOrder, ticketMap);
+        KwtWaybillOrderTicket shipmentTicket = waybillOrderTicketRepository.queryByWOrderIdByIdAndType(param.getWaybillOrderId(), 1);
+        if (shipmentTicket == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_TICKET_NOT_FOUND, "当前物流运单装卸货信息不存在,无法记录毛重!");
+        }
+        //1.填充装货单毛重和装货净重
+        BigDecimal loadAmount = updateGrossAmount(param, shipmentTicket);
+        //2.填充运单装货
+        updateLoadAmount(param, waybillOrder, loadAmount);
     }
 
     @Override
@@ -70,40 +65,33 @@ public class LeaveMockHandler extends AbstractWaybillOrderHandler<WaybillOrderLe
     /**
      * 填充毛重
      * @param param
-     * @param ticketMap
+     * @param shipmentTicket
      */
-    private void updateGrossAmount(WaybillOrderLeaveMockParam param, Map<Integer, KwtWaybillOrderTicket> ticketMap) {
-        //查询卸货信息,用于记录毛重
-        KwtWaybillOrderTicket takeTicket = ticketMap.get(AddressTypeEnum.TAKE.getCode());
-        if (takeTicket == null) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_TICKET_NOT_FOUND, "当前物流运单装卸货信息不存在,无法记录毛重!");
-        }
-        takeTicket.setGrossAmount(param.getGrossAmount());
-        waybillOrderTicketRepository.updateById(takeTicket);
+    private BigDecimal updateGrossAmount(WaybillOrderLeaveMockParam 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 ticketMap
+     * @param loadAmount
      */
-    private void updateLoadAmount(WaybillOrderLeaveMockParam param, KwtWaybillOrder waybillOrder, Map<Integer, KwtWaybillOrderTicket> ticketMap) {
-        //查询装货信息,用于获取皮重
-        KwtWaybillOrderTicket shipmentTicket  = ticketMap.get(AddressTypeEnum.SHIPMENT.getCode());
-        if (shipmentTicket == null) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_TICKET_NOT_FOUND, "当前物流运单装卸货信息不存在,无法获取皮重!");
-        }
-        //皮重
-        BigDecimal tareAmount = shipmentTicket.getTareAmount();
-
+    private void updateLoadAmount(WaybillOrderLeaveMockParam param, KwtWaybillOrder waybillOrder, BigDecimal loadAmount) {
         //更新子运单装货净重
         KwtWaybillOrderSubtask subtask = getWaybillSubtask(waybillOrder.getId());
-        BigDecimal loadAmount = param.getGrossAmount().subtract(Optional.ofNullable(tareAmount).orElse(BigDecimal.ZERO));
         subtask.setLoadAmount(loadAmount);
         subtask.setLoadTime(new Date());
         waybillOrderSubtaskRepository.updateById(subtask);
-        log.info("物流运单离场过磅成功!运单ID: {}, 毛重: {}, 皮重: {}, 装货净重: {}", param.getWaybillOrderId(), param.getGrossAmount(), tareAmount, loadAmount);
+        log.info("物流运单离场过磅成功!运单ID: {}, 毛重: {}, 装货净重: {}", param.getWaybillOrderId(), param.getGrossAmount(), loadAmount);
     }
 
     @Override

+ 12 - 21
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingHandler.java

@@ -110,38 +110,29 @@ public class UnloadingHandler extends AbstractWaybillOrderHandler<WaybillOrderUn
             //1.更新子运单卸货量
             updateWaybillOrderSubtask(param, waybill);
 
-            //2.更新物流订单装货量
-            updateLogisticsOrderByTake(logisticsOrder, loadAmount);
+            //按照卸货方式,运单驳回后,不再更新订单装货量
+            if (Objects.equals(CarWaybillV1Enum.WAIT_LOADING.getCode(), waybill.getStatus())) {
+                //2.更新物流订单装货量
+                updateLogisticsOrderByTake(logisticsOrder, loadAmount);
 
-            //3.更新贸易订单装货量
-            updateTradeOrder(logisticsOrder, loadAmount);
+                //3.更新贸易订单装货量
+                updateTradeOrder(logisticsOrder, loadAmount);
+            }
         }
     }
 
     /**
-     * 计算净装货
+     * 计算装货单装货净
      * @param param
      * @return
      */
     private BigDecimal getLoadAmount(WaybillOrderUnloadParam param) {
-        List<KwtWaybillOrderTicket> ticketList = waybillOrderTicketRepository.queryByWOrderId(param.getWaybillOrderId());
-        // 毛重
-        BigDecimal grossAmount = ticketList.stream().filter(Objects::nonNull)
-                .filter(ticket -> Objects.equals(ticket.getType(), AddressTypeEnum.TAKE.getCode()))
-                .findFirst()
-                .map(KwtWaybillOrderTicket::getGrossAmount)
-                .orElse(BigDecimal.ZERO);
-        // 皮重
-        BigDecimal tareAmount = ticketList.stream().filter(Objects::nonNull)
-                .filter(ticket -> Objects.equals(ticket.getType(), AddressTypeEnum.SHIPMENT.getCode()))
-                .findFirst()
-                .map(KwtWaybillOrderTicket::getTareAmount)
-                .orElse(BigDecimal.ZERO);
-        if (grossAmount.compareTo(BigDecimal.ZERO) <= 0 || tareAmount.compareTo(BigDecimal.ZERO) <= 0) {
-            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_TICKET_NOT_FOUND, "运单车辆的皮重/毛重为空!");
+        KwtWaybillOrderTicket ticket = waybillOrderTicketRepository.queryByWOrderIdByIdAndType(param.getWaybillOrderId(), 1);
+        if (ticket == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_TICKET_NOT_FOUND, "当前物流运单装货单信息不存在!");
         }
         //装货净重
-        return grossAmount.subtract(tareAmount);
+        return ticket.getAmount();
     }
 
     /**

+ 70 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingIntoHandler.java

@@ -0,0 +1,70 @@
+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.transport.model.KwtWaybillOrder;
+import com.sckw.transport.model.KwtWaybillOrderTicket;
+import com.sckw.transport.model.param.WaybillOrderUnloadingIntoParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+/**
+ * Author: donglang
+ * Time: 2026-01-20
+ * Des: 卸货入场(计算卸货单毛重和净重)
+ * Version: 1.0
+ */
+
+@Slf4j
+@Service
+public class UnloadingIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderUnloadingIntoParam> {
+
+    @Override
+    protected KwtWaybillOrder getWaybillOrder(WaybillOrderUnloadingIntoParam param) {
+        return getWaybillOrder(param.getWaybillOrderId());
+    }
+
+    @Override
+    protected void checkState(WaybillOrderUnloadingIntoParam param, KwtWaybillOrder waybillOrder) {
+        if (!Objects.equals(CarWaybillV1Enum.WAIT_LOADING.getCode(), waybillOrder.getStatus())) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_STATUS_ERROR, "运单状态不是“已离场”状态,无法推进下一节点!");
+        }
+    }
+
+    @Override
+    protected void doBusiness(WaybillOrderUnloadingIntoParam param, KwtWaybillOrder waybillOrder) {
+        KwtWaybillOrderTicket takeTicket = waybillOrderTicketRepository.queryByWOrderIdByIdAndType(param.getWaybillOrderId(), 2);
+        if (takeTicket == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_TICKET_NOT_FOUND, "当前物流运单卸货单信息不存在,无法记录毛重!");
+        }
+        //填充卸货单毛重
+        takeTicket.setGrossAmount(param.getGrossAmount());
+        waybillOrderTicketRepository.updateById(takeTicket);
+
+    }
+
+    @Override
+    protected void calculateAutoDispatchScore(WaybillOrderUnloadingIntoParam param, KwtWaybillOrder waybillOrder) {
+
+    }
+
+    @Override
+    protected String getProcessName() {
+        return "离场过磅";
+    }
+
+    @Override
+    protected Integer getStatus() {
+        return CarWaybillV1Enum.INTO_UNLOADING.getCode();
+    }
+
+
+    @Override
+    protected String getRemark(WaybillOrderUnloadingIntoParam param, KwtWaybillOrder waybillOrder) {
+        return "车辆[" + waybillOrder.getTruckNo() + "]已到达卸货点["  + param.getWeighbridgeName() + "]称重[" + param.getGrossAmount() + "吨]";
+    }
+}

+ 30 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderUnloadingIntoParam.java

@@ -0,0 +1,30 @@
+package com.sckw.transport.model.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author :donglang
+ * @version :1.0
+ * @description : 车辆卸货入场过磅入参信息
+ * @create :2025-11-13 08:59:00
+ */
+@Data
+public class WaybillOrderUnloadingIntoParam extends WaybillOrderProcessParam implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 6321184385988633871L;
+
+    /**
+     * 毛重
+     */
+    @Schema(description = "毛重")
+    @NotNull(message = "毛重不能为空")
+    private BigDecimal grossAmount;
+
+}

+ 15 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderTicketRepository.java

@@ -27,6 +27,14 @@ public class KwtWaybillOrderTicketRepository extends ServiceImpl<KwtWaybillOrder
                 .eq(KwtWaybillOrderTicket::getDelFlag,0));
     }
 
+    public KwtWaybillOrderTicket queryByWOrderIdByIdAndType(Long wOrderId, Integer type) {
+        return getOne(Wrappers.<KwtWaybillOrderTicket>lambdaQuery()
+                .eq(KwtWaybillOrderTicket::getWOrderId, wOrderId)
+                .eq(KwtWaybillOrderTicket::getType, type)
+                .eq(KwtWaybillOrderTicket::getDelFlag,0)
+                .last("limit 1"));
+    }
+
     public List<KwtWaybillOrderTicket> queryByAddressIds(Set<Long> addressIds) {
         return list(Wrappers.<KwtWaybillOrderTicket>lambdaQuery()
                 .eq(KwtWaybillOrderTicket::getDelFlag,0)
@@ -53,5 +61,12 @@ public class KwtWaybillOrderTicketRepository extends ServiceImpl<KwtWaybillOrder
                 .eq(KwtWaybillOrderTicket::getDelFlag, 0));
     }
 
+    public List<KwtWaybillOrderTicket> queryByWOrderIdsAndType(List<Long> wOrderIds, Integer type) {
+        return list(Wrappers.<KwtWaybillOrderTicket>lambdaQuery()
+                .in(KwtWaybillOrderTicket::getWOrderId, wOrderIds)
+                .eq(KwtWaybillOrderTicket::getType, type)
+                .eq(KwtWaybillOrderTicket::getDelFlag, 0));
+    }
+
 
 }

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

@@ -90,6 +90,7 @@ public class WaybillOrderService {
     private final LoadingHandler loadingHandler;
     private final LeaveMockHandler leaveMockHandler;
     private final LeaveHandler leaveHandler;
+    private final UnloadingIntoHandler unloadingIntoHandler;
     private final UnloadingHandler unloadingHandler;
 
     private final KwtWaybillOrderV1Service waybillOrderV1Service;
@@ -836,12 +837,10 @@ public class WaybillOrderService {
         //装卸地之间距离
         wbOrderResp.setDistanceKm(logOrder.getDistance());
 
-        //皮重
+        //皮重、毛重
         KwtWaybillOrderTicket tareAmountTicket = ticketMap.getOrDefault(wbOrder.getId() + "-" + AddressTypeEnum.SHIPMENT.getCode(), new KwtWaybillOrderTicket());
         wbOrderResp.setTareAmount(tareAmountTicket.getTareAmount());
-        //毛重
-        KwtWaybillOrderTicket grossAmountTicket = ticketMap.getOrDefault(wbOrder.getId() + "-" + AddressTypeEnum.TAKE.getCode(), new KwtWaybillOrderTicket());
-        wbOrderResp.setGrossAmount(grossAmountTicket.getGrossAmount());
+        wbOrderResp.setGrossAmount(tareAmountTicket.getGrossAmount());
 
         //司机信息
         wbOrderResp.setDriverId(wbOrder.getDriverId());
@@ -1168,6 +1167,15 @@ public class WaybillOrderService {
         leaveHandler.handler(param);
     }
 
+    /**
+     * 卸货入场
+     * @param param
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void unloadingInto(WaybillOrderUnloadingIntoParam param) {
+        unloadingIntoHandler.handler(param);
+    }
+
     /**
      * 卸货
      * @param param