Jelajahi Sumber

运单逻辑优化

donglang 1 bulan lalu
induk
melakukan
2297f3163a

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

@@ -58,6 +58,7 @@ public enum ErrorCodeEnum {
     LOGISTICS_ORDER_NOT_ENT("700003", "物流订单无关联企业信息"),
     LOGISTICS_ORDER_NOT_ADDRESS("700004", "物流订单无装卸货信息"),
     LOGISTICS_ORDER_AMOUNT_ERROR("70005", "物流运单的总运单量异常"),
+    LOGISTICS_ORDER_NOT_DISPATCH_TRUCK("70005", "物流运单无当前派车数据"),
 
     // ====================== 运单订单(80000~89999)======================
     WAYBILL_ORDER_NOT_FOUND("80000", " 当前物流运单不存在"),

+ 1 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java

@@ -474,7 +474,7 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
     public RTruckVo findTruckByTruckNo(String truckNo) {
         KwfTruck truck = kwfTruckRepository.findTruckByTruckNo(truckNo);
         if (truck == null) {
-            return new RTruckVo();
+            return null;
         }
         return getTruckVo(truck);
     }

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

@@ -254,9 +254,9 @@ public class AppWayBillController {
      */
     @Operation(summary = "接单", description = "物流订单接单")
     @PostMapping("/orderTaking")
-    public BaseResult orderTaking(@RequestBody @Valid OrderCirculateTakingQueryParam param){
-        waybillOrderService.orderTaking(param);
-        return BaseResult.success();
+    public BaseResult<OrderTakingResp> orderTaking(@RequestBody @Valid OrderCirculateTakingQueryParam param){
+        OrderTakingResp orderTakingResp = waybillOrderService.orderTaking(param);
+        return BaseResult.success(orderTakingResp);
     }
 
     /**

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

@@ -9,10 +9,7 @@ import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.transport.model.KwtWaybillOrder;
 import com.sckw.transport.model.KwtWaybillOrderNode;
 import com.sckw.transport.model.KwtWaybillOrderSubtask;
-import com.sckw.transport.model.param.OrderCirculateTakingQueryParam;
-import com.sckw.transport.model.param.WaybillOrderCmeIntoWeighParam;
-import com.sckw.transport.model.param.WaybillOrderLeaveMockParam;
-import com.sckw.transport.model.param.WaybillOrderProcessParam;
+import com.sckw.transport.model.param.*;
 import com.sckw.transport.repository.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -44,6 +41,8 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
     protected KwtWaybillOrderAddressRepository waybillOrderAddressRepository;
     @Autowired
     protected KwtLogisticsOrderAddressRepository logisticsOrderAddressRepository;
+    @Autowired
+    protected KwtLogisticsOrderCirculateRepository logisticsOrderCirculateRepository;
 
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
     protected RemoteFleetService remoteFleetService;
@@ -57,7 +56,7 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
      * 模板方法 - 定义处理流程
      */
     @Transactional(rollbackFor = Exception.class)
-    public void handler(T param) {
+    public OrderTakingResp handler(T param) {
         try {
             log.info("开始处理{},参数:{}", getProcessName(), JSON.toJSONString(param));
 
@@ -74,9 +73,10 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
             // 6. 生成节点轨迹
             createNodeTrace(param, waybillOrder);
             // 7. 后置处理
-            afterProcess(param, waybillOrder);
+            OrderTakingResp handlerResult = afterProcess(param, waybillOrder);
 
             log.info("{}处理完成", getProcessName());
+            return handlerResult;
         } finally {
             // 确保清理线程上下文,防止内存泄漏
             BusinessContext.clear();
@@ -145,7 +145,9 @@ public abstract class AbstractWaybillOrderHandler<T extends WaybillOrderProcessP
     }
 
     // 7. 后置处理
-    protected void afterProcess(T param, KwtWaybillOrder waybillOrder) {}
+    protected OrderTakingResp afterProcess(T param, KwtWaybillOrder waybillOrder) {
+        return new OrderTakingResp();
+    }
 
     protected abstract String getProcessName();
 

+ 39 - 12
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/TakingOrderHandler.java

@@ -16,8 +16,11 @@ import com.sckw.order.api.model.OrderDetailVo;
 import com.sckw.order.api.model.UpdateActualAmountParam;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.param.OrderCirculateTakingQueryParam;
+import com.sckw.transport.model.param.OrderTakingResp;
+import com.sckw.transport.repository.KwtLogisticsOrderCirculateRepository;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
@@ -57,15 +60,17 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
 
     @Override
     protected void checkState(OrderCirculateTakingQueryParam param, KwtWaybillOrder waybillOrder) {
-        // 1.校验物流订单
+        // 1.校验车辆是否已被派单
+        checkTruckDispatch(param);
+        // 2.校验物流订单
         KwtLogisticsOrder logOrder = checkLogOrder(param);
-        // 2.校验交易订单
+        // 3.校验交易订单
         OrderDetailVo tradeOrder = checkTradeOrder(param, logOrder);
-        // 3.校验司机
+        // 4.校验司机
         RDriverVo driver = checkDriver(param);
-        // 4.校验车辆
+        // 5.校验车辆
         RTruckVo truck = checkTruck(param);
-        // 5.校验车辆是否已有未完成运单
+        // 6.校验车辆是否已有未完成运单
         checkTruckUnfinished(param);
 
         // 存储到线程上下文
@@ -77,6 +82,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
 
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     protected void doBusiness(OrderCirculateTakingQueryParam param, KwtWaybillOrder waybill) {
         KwtLogisticsOrder logOrder = BusinessContext.get("logOrder");
         OrderDetailVo tradeOrder = BusinessContext.get("tradeOrder");
@@ -111,7 +117,17 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
 
 
 
-
+    /**
+     * 校验车辆是否已被派单
+     * @param param
+     */
+    private void checkTruckDispatch(OrderCirculateTakingQueryParam param) {
+        KwtLogisticsOrderCirculate orderCirculate = logisticsOrderCirculateRepository
+                .findOneByLogOrderIdsAndTruckNo(param.getLogOrderId(), param.getTruckNo(), param.getEntId());
+        if (orderCirculate == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_DISPATCH_TRUCK, "当前车辆无派车数据,不可继续接单");
+        }
+    }
 
     /**
      * 校验物流订单是否是可接单状态
@@ -253,7 +269,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         KwtWaybillOrder waybillOrder = new KwtWaybillOrder();
         waybillOrder.setEntId(param.getEntId());
         waybillOrder.setLOrderId(param.getLogOrderId());
-        waybillOrder.setWOrderNo(null); //TODO donglang
+        waybillOrder.setWOrderNo("W" + System.currentTimeMillis());
         waybillOrder.setType(1);
         waybillOrder.setTruckId(truckNo.getId());
         waybillOrder.setTruckNo(param.getTruckNo());
@@ -263,6 +279,8 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         waybillOrder.setDriverIdcard(driver.getIdcard());
         waybillOrder.setStatus(CarWaybillV1Enum.PENDING_VEHICLE.getCode());
         waybillOrder.setTaskStartTime(new Date());
+        waybillOrder.setCreateBy(param.getDriverId());
+        waybillOrder.setUpdateBy(param.getDriverId());
         waybillOrderRepository.save(waybillOrder);
         log.info("创建物流运单成功,运单ID:{}", waybillOrder.getId());
 
@@ -284,12 +302,14 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         subtask.setLOrderId(param.getLogOrderId());
         subtask.setWOrderId(waybillOrder.getId());
         subtask.setWOrderNo(waybillOrder.getWOrderNo());
-        subtask.setUnit(null);
+        subtask.setUnit("吨"); //TODO DONGLANG
 
         subtask.setEntrustAmount(truckLoadVolume);
         subtask.setLoadTime(waybillOrder.getTaskStartTime());
         subtask.setUnloadTime(waybillOrder.getEndTime());
         subtask.setStatus(CarWaybillV1Enum.PENDING_VEHICLE.getCode());
+        subtask.setCreateBy(param.getDriverId());
+        subtask.setUpdateBy(param.getDriverId());
         waybillOrderSubtaskRepository.save(subtask);
         log.info("创建物流子运单成功,子运单ID:{}", subtask.getId());
 
@@ -354,7 +374,8 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         address.setPlanTime(waybillOrder.getTaskStartTime());
         address.setSort(Global.NUMERICAL_ONE);
         address.setEntrustAmount(subtask.getEntrustAmount());
-
+        address.setCreateBy(waybillOrder.getDriverId());
+        address.setUpdateBy(waybillOrder.getDriverId());
         waybillOrderAddressRepository.save(address);
         return address;
     }
@@ -391,7 +412,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
      */
     private KwtWaybillOrderAddress getWaybillOrderAddress(List<KwtWaybillOrderAddress> waybillOrderAddresses, AddressTypeEnum typeEnum) {
         return waybillOrderAddresses.stream()
-                .filter(address -> address != null && typeEnum.getCode() == address.getType())
+                .filter(address -> address != null && address.getAddressType() != null && typeEnum.getCode() == address.getAddressType())
                 .findFirst()
                 .orElseThrow(() -> new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_ADDRESS_NOT_FOUND, "未找到装货地址数据!"));
     }
@@ -414,6 +435,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
         ticket.setAmount(BigDecimal.ZERO);
         ticket.setGrossAmount(truckNo.getGrossWeight());
         ticket.setTareAmount(truckNo.getTareWeight());
+        ticket.setCreateBy(waybillOrder.getDriverId());
         waybillOrderTicketRepository.save(ticket);
     }
 
@@ -469,7 +491,7 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
             throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_ADDRESS, "物流订单无装卸货地址信息");
         }
         return logOrderAddressList.stream().collect(Collectors
-                .toMap(address -> address.getLOrderId() + "-" + address.getType(),
+                .toMap(address -> address.getLOrderId() + "-" + address.getAddressType(),
                         Function.identity(), (x, y) -> x));
     }
 
@@ -492,9 +514,14 @@ public class TakingOrderHandler extends AbstractWaybillOrderHandler<OrderCircula
     }
 
     // 7. 接单需要单独创建接单轨迹数据
-    protected void afterProcess(OrderCirculateTakingQueryParam param, KwtWaybillOrder waybillOrder) {
+    protected OrderTakingResp afterProcess(OrderCirculateTakingQueryParam param, KwtWaybillOrder waybillOrder) {
         KwtWaybillOrder actualOrder = BusinessContext.get("createdWaybillOrder");
         createNodeTrace(param, actualOrder);
+        //接单需要返回运单id
+        OrderTakingResp orderTakingResp = new OrderTakingResp();
+        orderTakingResp.setWaybillOrderId(actualOrder.getId());
+        return orderTakingResp;
+
     }
 
 

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

@@ -28,9 +28,8 @@ public class KwtWaybillOrder implements Serializable {
     private Long entId;
 
     /**
-     * 物流订单id(kwt_logistics_order)
+     * 物流订单id
      */
-    @TableField(exist = false)
     private Long lOrderId;
 
     /**

+ 29 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/OrderTakingResp.java

@@ -0,0 +1,29 @@
+package com.sckw.transport.model.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 接单响应参数
+ * @create :2025-11-11 20:16:00
+ */
+@Data
+public class OrderTakingResp implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -6153312023002477484L;
+
+    /**
+     * 运单id
+     */
+    @Schema(description = "运单id")
+    private Long waybillOrderId;
+
+
+}

+ 6 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderStatusResp.java

@@ -19,6 +19,12 @@ public class WaybillOrderStatusResp implements Serializable {
     @Serial
     private static final long serialVersionUID = -6153312023002477484L;
 
+    /**
+     * 运单id
+     */
+    @Schema(description = "运单id")
+    private Long id;
+
     /**
      * 物流订单id
      */

+ 3 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderCirculateRepository.java

@@ -67,9 +67,10 @@ public class KwtLogisticsOrderCirculateRepository extends ServiceImpl<KwtLogisti
     }
 
     public List<KwtLogisticsOrderCirculate> queryByLogOrderIdsAndTruckNo(List<Long> logOrderIds, String truckNo) {
-        return list(Wrappers.<KwtLogisticsOrderCirculate>lambdaQuery().eq(KwtLogisticsOrderCirculate::getDelFlag,0)
+        return list(Wrappers.<KwtLogisticsOrderCirculate>lambdaQuery()
+                .eq(KwtLogisticsOrderCirculate::getDelFlag,0)
                 .in(KwtLogisticsOrderCirculate::getLOrderId, logOrderIds)
-                .eq(StringUtils.isNotBlank(truckNo), KwtLogisticsOrderCirculate::getTruckId, truckNo)
+                .eq(StringUtils.isNotBlank(truckNo), KwtLogisticsOrderCirculate::getTruckNo, truckNo)
         );
     }
 

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

@@ -49,6 +49,7 @@ import com.sckw.transport.utils.DistanceUtils;
 import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.stream.function.StreamBridge;
@@ -186,6 +187,9 @@ public class WaybillOrderService {
      */
     public PageDataResult<LogisticsOrderResp> queryTruckLogisticsOrder(OrderCirculateQueryParam param) {
         log.info("查询司机关联车辆的物流订单:{}", JSON.toJSONString(param));
+        if (StringUtils.isBlank(param.getTruckNo())) {
+            return PageDataResult.empty(param.getPageNum(), param.getPageSize());
+        }
         LambdaQueryWrapper<KwtLogisticsOrderCirculate> queryWrapper = Wrappers.<KwtLogisticsOrderCirculate>lambdaQuery()
                 .eq(KwtLogisticsOrderCirculate::getEntId, param.getEntId())
                 .eq(KwtLogisticsOrderCirculate::getTruckNo, param.getTruckNo())
@@ -359,6 +363,9 @@ public class WaybillOrderService {
      */
     public PageDataResult<WaybillOrderStatusResp> queryWaybillOrder(WaybillOrderQueryParam param) {
         log.info("查询司机的物流运单:{}", JSON.toJSONString(param));
+        if (StringUtils.isBlank(param.getTruckNo())) {
+            return PageDataResult.empty(param.getPageNum(), param.getPageSize());
+        }
         LambdaQueryWrapper<KwtWaybillOrder> queryWrapper = Wrappers.<KwtWaybillOrder>lambdaQuery()
                 .eq(KwtWaybillOrder::getEntId, param.getEntId())
                 .eq(KwtWaybillOrder::getTruckNo, param.getTruckNo())
@@ -479,6 +486,7 @@ public class WaybillOrderService {
                                                        Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap,
                                                        Map<String, KwtWaybillOrderTicket> ticketMap) {
         WaybillOrderStatusResp wbOrderResp = new WaybillOrderStatusResp();
+        wbOrderResp.setId(wbOrder.getId());
 
         //装货、卸货净重、任务量
         KwtWaybillOrderSubtask subtask = subtaskMap.getOrDefault(wbOrder.getId(), new KwtWaybillOrderSubtask());
@@ -591,8 +599,8 @@ public class WaybillOrderService {
      * @param param
      */
     @Transactional(rollbackFor = Exception.class)
-    public void orderTaking(OrderCirculateTakingQueryParam param) {
-        takingOrderHandler.handler(param);
+    public OrderTakingResp orderTaking(OrderCirculateTakingQueryParam param) {
+        return takingOrderHandler.handler(param);
     }
 
     /**