|
@@ -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;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|