Sfoglia il codice sorgente

状态节点映射

chenxiaofei 1 mese fa
parent
commit
11b29f6792

+ 1 - 5
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/CarWaybillV1Enum.java

@@ -27,11 +27,6 @@ public enum CarWaybillV1Enum {
      */
      */
     EXIT_COMPLETED(10,  "已装货"),
     EXIT_COMPLETED(10,  "已装货"),
 
 
-    /**
-     * 离场过磅:  弃用
-     */
-    WEIGHT_TRAFFIC(110, "离场过磅"),
-
 
 
     /**
     /**
      * 空载待离场
      * 空载待离场
@@ -74,6 +69,7 @@ public enum CarWaybillV1Enum {
      */
      */
     WAIT_LOADING(18,  "已离场"),
     WAIT_LOADING(18,  "已离场"),
 
 
+
     /**
     /**
      * 已卸货
      * 已卸货
      */
      */

+ 79 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/enuma/WaybillTimelinePhaseEnum.java

@@ -0,0 +1,79 @@
+package com.sckw.transport.model.enuma;
+
+import com.sckw.core.model.enums.CarWaybillV1Enum;
+import lombok.Getter;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 前端运单节点时间轴展示阶段;每一阶段内嵌关联若干 {@link CarWaybillV1Enum}(支持多对一)。
+ * <p>
+ * 展示顺序:已接单 → 到达装货点 → 已装货 → 已离场 → 已卸货
+ */
+@Getter
+public enum WaybillTimelinePhaseEnum {
+
+    ORDER_ACCEPTED(1, "已接单",
+            EnumSet.of(CarWaybillV1Enum.PENDING_VEHICLE)),
+
+    ARRIVED_LOADING_POINT(5, "到达装货点",
+            EnumSet.of(CarWaybillV1Enum.REFUSE_TRAFFIC)),
+
+    LOADED(15, "已装货",
+            EnumSet.of(
+                    CarWaybillV1Enum.EXIT_COMPLETED,
+                    CarWaybillV1Enum.EMPTY_WAIT_LEAVE,
+                    CarWaybillV1Enum.WAIT_LEAVE,
+                    CarWaybillV1Enum.UNLOADING,
+                    CarWaybillV1Enum.WAIT_RELEASE,
+                    CarWaybillV1Enum.REPLENISHING,
+                    CarWaybillV1Enum.REPLENISH_FINISH,
+                    CarWaybillV1Enum.RELEASED_NOT_EXITED)),
+
+    DEPARTED(20, "已离场",
+            EnumSet.of(
+                    CarWaybillV1Enum.WAIT_LOADING)),
+
+    UNLOADED(25, "已卸货",
+            EnumSet.of(
+                    CarWaybillV1Enum.COMPLETION_LOADING,
+                    CarWaybillV1Enum.REVIEW_REJECTION,
+                    CarWaybillV1Enum.CANCELLED));
+
+    private final int phaseOrder;
+    private final String phaseLabel;
+    private final Set<CarWaybillV1Enum> mappedWaybillStatuses;
+
+    WaybillTimelinePhaseEnum(int phaseOrder, String phaseLabel, Set<CarWaybillV1Enum> mappedWaybillStatuses) {
+        this.phaseOrder = phaseOrder;
+        this.phaseLabel = phaseLabel;
+        this.mappedWaybillStatuses = Collections.unmodifiableSet(mappedWaybillStatuses);
+    }
+
+    private static final Map<Integer, WaybillTimelinePhaseEnum> STATUS_CODE_TO_PHASE;
+
+    static {
+        Map<Integer, WaybillTimelinePhaseEnum> map = new HashMap<>(32);
+        for (WaybillTimelinePhaseEnum phase : values()) {
+            for (CarWaybillV1Enum st : phase.mappedWaybillStatuses) {
+                map.put(st.getCode(), phase);
+            }
+        }
+        STATUS_CODE_TO_PHASE = Collections.unmodifiableMap(map);
+    }
+
+    /**
+     * @param waybillStatusCode {@link CarWaybillV1Enum#getCode()}
+     */
+    public static Optional<WaybillTimelinePhaseEnum> resolve(Integer waybillStatusCode) {
+        if (waybillStatusCode == null) {
+            return Optional.empty();
+        }
+        return Optional.ofNullable(STATUS_CODE_TO_PHASE.get(waybillStatusCode));
+    }
+
+    public List<Integer> mappedWaybillStatusCodes() {
+        return mappedWaybillStatuses.stream().map(CarWaybillV1Enum::getCode).collect(Collectors.toList());
+    }
+}

+ 5 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillOrderNodeVo.java

@@ -1,5 +1,6 @@
 package com.sckw.transport.model.vo;
 package com.sckw.transport.model.vo;
 
 
+import com.sckw.transport.model.enuma.WaybillTimelinePhaseEnum;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.Data;
 
 
@@ -133,14 +134,14 @@ public class WaybillOrderNodeVo implements Serializable {
         private String createTime;
         private String createTime;
 
 
         /**
         /**
-         * 运单状态
+         * 状态序号:接口返回前会按 {@link WaybillTimelinePhaseEnum} 映射为前端五步序号 1~5;无法映射时仍为原始运单状态
          */
          */
-        @Schema(description = "运单状态码")
+        @Schema(description = "状态序号:1已接单 2到达装货点 3已装货 4已离场 5已卸货(无法映射时为原始运单状态码")
         private Integer orderStatus;
         private Integer orderStatus;
         /**
         /**
-         * 状态描述
+         * 状态名称:映射后为前端五步文案;无法映射时仍为运单状态原始描述
          */
          */
-        @Schema(description = "状态码描述")
+        @Schema(description = "状态名称(映射后与 orderStatus 对应五步文案)")
         private String orderStatusName;
         private String orderStatusName;
     }
     }
 }
 }

+ 11 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwfTaskService.java

@@ -104,8 +104,17 @@ public class KwfTaskService {
         }else {
         }else {
             totalCount = kwtWaybillOrderStream.size();
             totalCount = kwtWaybillOrderStream.size();
         }
         }
-        List<Integer> tasking = Arrays.asList(CarWaybillV1Enum.PENDING_VEHICLE.getCode(),CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode(), CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),
-                CarWaybillV1Enum.EXIT_COMPLETED.getCode(), CarWaybillV1Enum.WAIT_LOADING.getCode());
+        List<Integer> tasking = Arrays.asList(CarWaybillV1Enum.PENDING_VEHICLE.getCode(),
+                CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),
+                CarWaybillV1Enum.EXIT_COMPLETED.getCode(),
+                CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(),
+                CarWaybillV1Enum.WAIT_LEAVE.getCode(),
+                CarWaybillV1Enum.UNLOADING.getCode(),
+                CarWaybillV1Enum.WAIT_RELEASE.getCode(),
+                CarWaybillV1Enum.REPLENISHING.getCode(),
+                CarWaybillV1Enum.REPLENISH_FINISH.getCode(),
+                CarWaybillV1Enum.RELEASED_NOT_EXITED.getCode(),
+                CarWaybillV1Enum.WAIT_LOADING.getCode());
         //处理中的任务数
         //处理中的任务数
         long taskingCount = waybillOrder.stream()
         long taskingCount = waybillOrder.stream()
                 .filter(w -> tasking.contains(w.getStatus()) && StringUtils.isNotBlank(w.getTruckNo()))
                 .filter(w -> tasking.contains(w.getStatus()) && StringUtils.isNotBlank(w.getTruckNo()))

+ 57 - 7
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -62,10 +62,7 @@ import com.sckw.transport.common.config.UrlConfigProperties;
 import com.sckw.transport.dao.*;
 import com.sckw.transport.dao.*;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.dto.*;
 import com.sckw.transport.model.dto.*;
-import com.sckw.transport.model.enuma.ApproveStatusEnum;
-import com.sckw.transport.model.enuma.CarWaybillDetailEnum;
-import com.sckw.transport.model.enuma.CarWaybillNdexTopEnum;
-import com.sckw.transport.model.enuma.CarWaybillTableTopEnum;
+import com.sckw.transport.model.enuma.*;
 import com.sckw.transport.model.param.WaybillOrderNodeReq;
 import com.sckw.transport.model.param.WaybillOrderNodeReq;
 import com.sckw.transport.model.param.WaybillOrderReq;
 import com.sckw.transport.model.param.WaybillOrderReq;
 import com.sckw.transport.model.param.WaybillOrderResp;
 import com.sckw.transport.model.param.WaybillOrderResp;
@@ -5458,7 +5455,7 @@ public class KwtWaybillOrderV1Service {
     }
     }
 
 
     private List<Integer>  getWaybillOrderStatus() {
     private List<Integer>  getWaybillOrderStatus() {
-       return Arrays.asList(CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode(), CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(),
+       return Arrays.asList( CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(),
                 CarWaybillV1Enum.WAIT_LEAVE.getCode(), CarWaybillV1Enum.UNLOADING.getCode(),
                 CarWaybillV1Enum.WAIT_LEAVE.getCode(), CarWaybillV1Enum.UNLOADING.getCode(),
                 CarWaybillV1Enum.WAIT_RELEASE.getCode(), CarWaybillV1Enum.REPLENISHING.getCode(),
                 CarWaybillV1Enum.WAIT_RELEASE.getCode(), CarWaybillV1Enum.REPLENISHING.getCode(),
                 CarWaybillV1Enum.REPLENISH_FINISH.getCode(), CarWaybillV1Enum.RELEASED_NOT_EXITED.getCode());
                 CarWaybillV1Enum.REPLENISH_FINISH.getCode(), CarWaybillV1Enum.RELEASED_NOT_EXITED.getCode());
@@ -5496,8 +5493,13 @@ public class KwtWaybillOrderV1Service {
         //获取时间线
         //获取时间线
         List<WaybillOrderNodeVo.Timeline> voList = getTimelines(nodes);
         List<WaybillOrderNodeVo.Timeline> voList = getTimelines(nodes);
         waybillOrderNodeVo.setTimelines(voList);
         waybillOrderNodeVo.setTimelines(voList);
-        // 获取时间节点
+        // 获取时间节点,并按前端五步序号排序(映射写入 orderStatus / orderStatusName)
         List<WaybillOrderNodeVo.WaybillOrderNode> nodeList = getWaybillOrderNodes(voList);
         List<WaybillOrderNodeVo.WaybillOrderNode> nodeList = getWaybillOrderNodes(voList);
+        log.info("查询运单节点轨迹,时间节点:{}", JSON.toJSONString(nodeList));
+        // 将原始运单状态映射为前端五步时间轴阶段(1-5),并更新节点的状态码和名称
+        applyTimelinePhaseFromWaybillStatus(nodeList);
+        // 对映射后的节点列表按阶段去重,保留每个阶段最早的一条记录
+        nodeList = dedupeWaybillOrderNodesByStatus(nodeList);
         nodeList = nodeList.stream()
         nodeList = nodeList.stream()
                 .sorted(Comparator.comparing(WaybillOrderNodeVo.WaybillOrderNode::getOrderStatus))
                 .sorted(Comparator.comparing(WaybillOrderNodeVo.WaybillOrderNode::getOrderStatus))
                 .collect(Collectors.toList());
                 .collect(Collectors.toList());
@@ -5544,7 +5546,7 @@ public class KwtWaybillOrderV1Service {
     @NotNull
     @NotNull
     private static List<WaybillOrderNodeVo.WaybillOrderNode> getWaybillOrderNodes(List<WaybillOrderNodeVo.Timeline> voList) {
     private static List<WaybillOrderNodeVo.WaybillOrderNode> getWaybillOrderNodes(List<WaybillOrderNodeVo.Timeline> voList) {
         Map<Integer, List<WaybillOrderNodeVo.Timeline>> statusAndTimelineMap = voList.stream()
         Map<Integer, List<WaybillOrderNodeVo.Timeline>> statusAndTimelineMap = voList.stream()
-                .filter(t ->!Arrays.asList(CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode(),CarWaybillV1Enum.COMPLETED.getCode(),CarWaybillV1Enum.CANCELLED.getCode(), CarWaybillV1Enum.REVIEW_REJECTION.getCode()).contains(t.getOrderStatus()))
+                .filter(t ->!Arrays.asList(CarWaybillV1Enum.COMPLETED.getCode(),CarWaybillV1Enum.CANCELLED.getCode(), CarWaybillV1Enum.REVIEW_REJECTION.getCode()).contains(t.getOrderStatus()))
                 .sorted(Comparator.comparing(WaybillOrderNodeVo.Timeline::getCreateTime))
                 .sorted(Comparator.comparing(WaybillOrderNodeVo.Timeline::getCreateTime))
                 .collect(Collectors.groupingBy(WaybillOrderNodeVo.Timeline::getOrderStatus));
                 .collect(Collectors.groupingBy(WaybillOrderNodeVo.Timeline::getOrderStatus));
         List<WaybillOrderNodeVo.WaybillOrderNode> nodeList = Lists.newArrayList();
         List<WaybillOrderNodeVo.WaybillOrderNode> nodeList = Lists.newArrayList();
@@ -5562,6 +5564,54 @@ public class KwtWaybillOrderV1Service {
         return nodeList;
         return nodeList;
     }
     }
 
 
+    /**
+     * 将原始运单状态映射到前端五步时间轴,写入既有字段 {@code orderStatus}(1~5 阶段序号)、{@code orderStatusName}(阶段文案);
+     * 无法映射的节点保留 {@link #getWaybillOrderNodes} 中已赋值的原始码与描述。
+     */
+    private static void applyTimelinePhaseFromWaybillStatus(List<WaybillOrderNodeVo.WaybillOrderNode> nodeList) {
+        if (CollectionUtils.isEmpty(nodeList)) {
+            return;
+        }
+        for (WaybillOrderNodeVo.WaybillOrderNode node : nodeList) {
+            WaybillTimelinePhaseEnum.resolve(node.getOrderStatus()).ifPresent(phase -> {
+                node.setOrderStatus(phase.getPhaseOrder());
+                node.setOrderStatusName(phase.getPhaseLabel());
+            });
+        }
+    }
+
+    /**
+     * 映射后多个原始状态可能合并为同一阶段序号(1~5),会出现重复 {@code orderStatus};
+     * 按状态码去重,同一时间保留该阶段下 {@code createTime} 最早(第一次出现)的一条节点。
+     */
+    private static List<WaybillOrderNodeVo.WaybillOrderNode> dedupeWaybillOrderNodesByStatus(
+            List<WaybillOrderNodeVo.WaybillOrderNode> nodeList) {
+        if (CollectionUtils.isEmpty(nodeList)) {
+            return nodeList;
+        }
+        return nodeList.stream()
+                .filter(node -> node.getOrderStatus() != null)
+                .collect(Collectors.toMap(
+                        WaybillOrderNodeVo.WaybillOrderNode::getOrderStatus,
+                        Function.identity(),
+                        (a, b) -> {
+                            Date ta = parseWaybillNodeCreateTime(a.getCreateTime());
+                            Date tb = parseWaybillNodeCreateTime(b.getCreateTime());
+                            return !ta.after(tb) ? a : b;
+                        }))
+                .values()
+                .stream()
+                .collect(Collectors.toList());
+    }
+
+    private static Date parseWaybillNodeCreateTime(String createTime) {
+        if (org.apache.commons.lang3.StringUtils.isBlank(createTime)) {
+            return new Date(0L);
+        }
+        Date d = DateUtils.formatDate(createTime);
+        return d != null ? d : new Date(0L);
+    }
+
     /**
     /**
      * 构建状态描述文本
      * 构建状态描述文本
      * 格式:车辆【川A5478C】司机【张三】装载货物【铁矿石】【参运】【28.70吨】
      * 格式:车辆【川A5478C】司机【张三】装载货物【铁矿石】【参运】【28.70吨】

+ 7 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/kwfTruckTraceService.java

@@ -1172,9 +1172,15 @@ private Map<String, Integer> getTruckLocationStatusMap(Map<Long, String> truckId
         // 默认返回任务进行中的各种状态
         // 默认返回任务进行中的各种状态
         return Arrays.asList(
         return Arrays.asList(
                 CarWaybillV1Enum.PENDING_VEHICLE.getCode(),  // 待提货
                 CarWaybillV1Enum.PENDING_VEHICLE.getCode(),  // 待提货
-                CarWaybillV1Enum.WEIGHT_TRAFFIC.getCode(),   // 运输中(称重)
                 CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),   // 拒绝运输
                 CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),   // 拒绝运输
                 CarWaybillV1Enum.EXIT_COMPLETED.getCode(),   // 出口完成
                 CarWaybillV1Enum.EXIT_COMPLETED.getCode(),   // 出口完成
+                CarWaybillV1Enum.EMPTY_WAIT_LEAVE.getCode(),
+                CarWaybillV1Enum.WAIT_LEAVE.getCode(),
+                CarWaybillV1Enum.UNLOADING.getCode(),
+                CarWaybillV1Enum.WAIT_RELEASE.getCode(),
+                CarWaybillV1Enum.REPLENISHING.getCode(),
+                CarWaybillV1Enum.REPLENISH_FINISH.getCode(),
+                CarWaybillV1Enum.RELEASED_NOT_EXITED.getCode(),
                 CarWaybillV1Enum.WAIT_LOADING.getCode()      // 等待装货
                 CarWaybillV1Enum.WAIT_LOADING.getCode()      // 等待装货
         );
         );
     }
     }