浏览代码

提交630第二阶段自动派车功能

chenxiaofei 1 周之前
父节点
当前提交
cd85533702

+ 5 - 0
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/vo/RTruckVo.java

@@ -100,4 +100,9 @@ public class RTruckVo implements Serializable {
      * 能源类型
      */
     private Integer energyType;
+
+    /**
+     * 最大运输距离,单位:公里;为空表示车辆未维护该限制。
+     */
+    private BigDecimal maxTransportDistance;
 }

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

@@ -172,6 +172,7 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
             truckVo.setTotalWeight(truck.getTotalWeight());
             truckVo.setBusinessStatus(truck.getBusinessStatus());
             truckVo.setTruckType(StringUtils.objectStr(truck.getType()));
+            truckVo.setMaxTransportDistance(truck.getMaxTransportDistance());
             truckMap.put(truckVo.getTruckNo(), truckVo);
         }
         return truckMap;
@@ -370,6 +371,7 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
         rTruckVo.setCarAxis(carAxisInfo.getName());
         rTruckVo.setLegalLoad(Objects.equals(TruckTypeEnum.TRUCK.getCode(), truck.getType()) ? carAxisInfo.getLegalLoad() : carAxisInfo.getTractorLegalLoad());
         rTruckVo.setEnergyType(truck.getEnergyType());
+        rTruckVo.setMaxTransportDistance(truck.getMaxTransportDistance());
         return rTruckVo;
     }
     /**

+ 86 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/AutoDispatchDistanceUtils.java

@@ -0,0 +1,86 @@
+package com.sckw.transport.service;
+
+import com.sckw.fleet.api.model.vo.RTruckVo;
+import lombok.extern.slf4j.Slf4j;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 自动派车距离筛选工具类。
+ */
+@Slf4j
+final class AutoDispatchDistanceUtils {
+
+    private AutoDispatchDistanceUtils() {
+    }
+
+
+    /**
+     * 校验车辆最大运输距离是否满足订单任务距离要求。
+     * <p>
+     * 校验逻辑如下:
+     * 1. 若车辆信息为空,视为不满足条件。
+     * 2. 若车辆未设置最大运输距离(null),视为无限制,满足条件。
+     * 3. 若订单距离为空、空白或解析失败,视为无效数据或无限制,默认满足条件。
+     * 4. 若订单距离小于等于0,视为无效数据,默认满足条件。
+     * 5. 比较车辆最大运输距离与订单距离,若车辆最大距离 >= 订单距离,则满足条件。
+     * </p>
+     *
+     * @param truck       车辆信息对象
+     * @param orderDistance 订单任务距离字符串,单位:公里
+     * @return true-满足或不限制,false-车辆最大运输距离小于订单任务距离
+     */
+    static boolean isTransportDistanceAvailable(RTruckVo truck, String orderDistance) {
+        // 1. 基础非空校验:车辆对象不能为空
+        if (truck == null) {
+            log.warn("自动派车距离校验失败:车辆信息为空");
+            return false;
+        }
+
+        // 2. 获取车辆最大运输距离
+        BigDecimal maxTransportDistance = truck.getMaxTransportDistance();
+
+        // 3. 若车辆未配置最大运输距离,默认认为无限制,校验通过
+        if (maxTransportDistance == null) {
+            log.debug("自动派车距离校验:车辆[{}]未配置最大运输距离,默认通过", truck.getTruckNo());
+            return true;
+        }
+
+        // 4. 校验订单距离参数有效性
+        if (orderDistance == null || orderDistance.trim().isEmpty()) {
+            log.debug("自动派车距离校验:订单距离为空,默认通过");
+            return true;
+        }
+
+        try {
+            // 5. 解析订单距离并校验数值合法性
+            String trimmedDistance = orderDistance.trim();
+            BigDecimal taskDistance = new BigDecimal(trimmedDistance);
+
+            // 6. 若订单距离小于等于0,视为异常数据或无实际距离要求,默认通过
+            if (taskDistance.compareTo(BigDecimal.ZERO) <= 0) {
+                log.debug("自动派车距离校验:订单距离[{}]小于等于0,默认通过", trimmedDistance);
+                return true;
+            }
+
+            // 7. 核心比对:车辆最大运输距离必须大于等于订单任务距离
+            boolean isAvailable = maxTransportDistance.compareTo(taskDistance) >= 0;
+            
+            if (!isAvailable) {
+                log.info("自动派车距离校验不通过:车辆[{}]最大运输距离[{}]km < 订单距离[{}]km", 
+                        truck.getTruckNo(), maxTransportDistance, taskDistance);
+            } else {
+                log.debug("自动派车距离校验通过:车辆[{}]最大运输距离[{}]km >= 订单距离[{}]km", 
+                        truck.getTruckNo(), maxTransportDistance, taskDistance);
+            }
+            
+            return isAvailable;
+
+        } catch (Exception e) {
+            // 8. 异常处理:若距离字符串格式错误,记录日志并默认通过(避免因数据脏读导致派车失败,可根据业务需求调整为返回false)
+            log.warn("自动派车距离校验:订单距离格式非法[{}],异常信息:{},默认通过", orderDistance, e.getMessage());
+            return true;
+        }
+    }
+}

+ 4 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtAcceptCarriageOrderService.java

@@ -3382,11 +3382,15 @@ public class KwtAcceptCarriageOrderService {
         }
         List<String> axleNumStrId = Arrays.asList(goodsById.getCarAxis().split(","));
         List<RTruckVo> truckVoList = fleetService.findTruckByEntIds(logEntId);
+        String orderDistance = getDistance(orderDTO);
+        log.info("物流订单距离:{}", orderDistance);
         //过滤满足轴数的车辆
         List<RTruckVo> truckVoFilterList = truckVoList.stream()
                 .filter(Objects::nonNull)
                 .filter(truck -> truck.getCarAxisId() != null)
                 .filter(truck ->    axleNumStrId.contains(String.valueOf(truck.getCarAxisId())))
+                // 自动派车按订单任务距离筛选车辆;车辆未维护最大运输距离时视为不限制。
+                .filter(truck -> AutoDispatchDistanceUtils.isTransportDistanceAvailable(truck, orderDistance))
                 .collect(Collectors.toList());
 
         //过滤满足车辆最大可派任务数的车辆

+ 64 - 0
sckw-modules/sckw-transport/src/test/java/com/sckw/transport/service/KwtAcceptCarriageOrderServiceTest.java

@@ -0,0 +1,64 @@
+package com.sckw.transport.service;
+
+import com.sckw.fleet.api.model.vo.RTruckVo;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.math.BigDecimal;
+
+/**
+ * 自动派车车辆最大运输距离筛选单元测试。
+ */
+public class KwtAcceptCarriageOrderServiceTest {
+
+    /**
+     * 车辆未维护最大运输距离时,应视为不限制运输距离。
+     */
+    @Test
+    public void isTransportDistanceAvailableWhenMaxDistanceIsNull() {
+        RTruckVo truck = new RTruckVo();
+
+        boolean result = AutoDispatchDistanceUtils.isTransportDistanceAvailable(truck, "300.50");
+
+        Assert.assertTrue(result);
+    }
+
+    /**
+     * 车辆最大运输距离大于订单任务距离时,应允许自动派车。
+     */
+    @Test
+    public void isTransportDistanceAvailableWhenMaxDistanceGreaterThanOrderDistance() {
+        RTruckVo truck = new RTruckVo();
+        truck.setMaxTransportDistance(new BigDecimal("500.00"));
+
+        boolean result = AutoDispatchDistanceUtils.isTransportDistanceAvailable(truck, "300.50");
+
+        Assert.assertTrue(result);
+    }
+
+    /**
+     * 车辆最大运输距离等于订单任务距离时,应允许自动派车。
+     */
+    @Test
+    public void isTransportDistanceAvailableWhenMaxDistanceEqualsOrderDistance() {
+        RTruckVo truck = new RTruckVo();
+        truck.setMaxTransportDistance(new BigDecimal("300.50"));
+
+        boolean result = AutoDispatchDistanceUtils.isTransportDistanceAvailable(truck, "300.50");
+
+        Assert.assertTrue(result);
+    }
+
+    /**
+     * 车辆最大运输距离小于订单任务距离时,应过滤该车辆。
+     */
+    @Test
+    public void isTransportDistanceAvailableWhenMaxDistanceLessThanOrderDistance() {
+        RTruckVo truck = new RTruckVo();
+        truck.setMaxTransportDistance(new BigDecimal("200.00"));
+
+        boolean result = AutoDispatchDistanceUtils.isTransportDistanceAvailable(truck, "300.50");
+
+        Assert.assertFalse(result);
+    }
+}