Просмотр исходного кода

refactor(cockpit): use authoritative seven-state work order dictionary (#25)

Kazerin 1 месяц назад
Родитель
Сommit
0ec06fbe31

+ 34 - 33
docs/cockpit/work-order-nine-states-demo.html → docs/cockpit/work-order-seven-states-demo.html

@@ -3,7 +3,7 @@
 <head>
   <meta charset="utf-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1" />
-  <title>Cockpit Work Order Nine States Demo</title>
+  <title>Cockpit Work Order Seven States Demo</title>
   <style>
     body { margin:0; min-height:100vh; background:#08131f; color:#e8f1f8; font:15px/1.5 "Microsoft YaHei",sans-serif; }
     main { width:min(1280px,calc(100vw - 32px)); margin:28px auto; display:grid; gap:16px; }
@@ -20,13 +20,13 @@
     .title { display:flex; justify-content:space-between; gap:8px; align-items:flex-start; }
     .code { color:#78a2b8; font-family:Consolas,monospace; font-size:12px; overflow-wrap:anywhere; }
     .badge { font-size:12px; padding:3px 8px; border:1px solid; white-space:nowrap; }
-    .active { color:#68d095; border-color:#68d095; } .legacy { color:#ff7a7a; border-color:#ff7a7a; } .finished { color:#a9b7c0; border-color:#a9b7c0; }
+    .active { color:#68d095; border-color:#68d095; } .cancelled { color:#ff7a7a; border-color:#ff7a7a; } .finished { color:#a9b7c0; border-color:#a9b7c0; }
     .timeline { margin-top:10px; display:grid; gap:8px; }
     .entry { border-left:3px solid #61c2ff; background:#0e1e2d; padding:8px 10px; }
-    .entry.legacy { border-left-color:#ff7a7a; } .entry.finished { border-left-color:#a9b7c0; }
+    .entry.cancelled { border-left-color:#ff7a7a; } .entry.finished { border-left-color:#a9b7c0; }
     .meta { color:#8fb3c7; font-size:13px; margin:6px 0 0; overflow-wrap:anywhere; }
     .dictionary { display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:8px; }
-    .state { border:1px solid #275b74; background:#0b1922; padding:8px; } .state.legacy { border-color:#ff7a7a; }
+    .state { border:1px solid #275b74; background:#0b1922; padding:8px; } .state.cancelled { border-color:#ff7a7a; }
     .mono { font-family:Consolas,monospace; overflow-wrap:anywhere; } pre { max-height:340px; overflow:auto; background:#071019; border:1px solid #275b74; padding:12px; }
     .note { color:#8fb3c7; font-size:13px; }
   </style>
@@ -34,14 +34,14 @@
 <body>
 <main>
   <header>
-    <h1>驾驶舱事件关联工单九态演示</h1>
+    <h1>驾驶舱事件关联工单七态演示</h1>
     <p class="endpoint">GET /api/cockpit/v1/equipments/{deviceCode}/work-orders</p>
     <p class="endpoint">GET /api/cockpit/v1/events/{eventSource}/{eventCode}/work-orders</p>
     <p class="endpoint">GET /api/cockpit/v1/work-orders/{workOrderCode}/timeline</p>
   </header>
   <section>
     <div class="toolbar">
-      <button type="button" data-mode="all" class="active">九态总览</button>
+      <button type="button" data-mode="all" class="active">七态总览</button>
       <button type="button" data-mode="multi">同设备多类型报警</button>
     </div>
     <div class="layout">
@@ -57,32 +57,28 @@
   </section>
   <section>
     <h2>响应契约</h2>
-    <p class="note">legacyState / legacyName 保留现网九态兼容编码;authoritativeState 是 ADR-0008 七态权威映射,旧 8/9 标记 deprecated,避免新功能依赖已废止状态。</p>
+    <p class="note">状态字典采用 ADR-0008 新七态:1 待派单、2 待接单、3 已接单、4 处理中、5 待验收、6 已结案、7 已取消;已废止状态不再输出。</p>
     <pre id="payload" class="mono"></pre>
   </section>
 </main>
 <script>
-  const stateNames = ['待派单','待接单','已接单','处理中','待验收','已结案','已驳回','延期审核','已延期'];
-  const authoritative = [
-    {code:1,name:'待派单'}, {code:2,name:'待接单'}, {code:3,name:'已接单'}, {code:4,name:'处理中'},
-    {code:5,name:'待验收'}, {code:6,name:'已结案'}, {code:7,name:'已取消'}, null, null
+  const stateDictionary = [
+    {code:1,name:'待派单'}, {code:2,name:'待接单'}, {code:3,name:'已接单'},
+    {code:4,name:'处理中'}, {code:5,name:'待验收'}, {code:6,name:'已结案'}, {code:7,name:'已取消'}
   ];
-  const stateDictionary = stateNames.map((name, index) => ({
-    legacyCode:index + 1, legacyName:name,
-    authoritativeCode:authoritative[index]?.code ?? null, authoritativeName:authoritative[index]?.name ?? null,
-    deprecated:index >= 6
-  }));
-  const summary = (code, state, source, eventCode, desc) => ({
-    workOrderCode:code, deviceCode:'TC-PS-WS-202609020012', orderType:1, orderTypeName:'故障维修',
-    orderLevel:2, orderDesc:desc,
-    legacyState:state, legacyStateName:stateNames[state - 1],
-    authoritativeState:authoritative[state - 1]?.code ?? null, authoritativeStateName:authoritative[state - 1]?.name ?? null,
-    deprecatedState:state >= 7,
-    createTime:'2026-09-02T09:00:00+08:00', updateTime:'2026-09-02T10:00:00+08:00',
-    planFinishTime:'2026-09-03T09:00:00+08:00', realFinishTime:state === 6 ? '2026-09-02T10:00:00+08:00' : null,
-    eventAssociation:{ eventSource:source, eventCode, associatedAt:'2026-09-02T10:00:00+08:00' }
-  });
-  const allOrders = stateNames.map((name, index) => summary('WO-202609020000' + (index + 1), index + 1, 'ALARM', 'ALM-20260902-00' + (index + 1), '演示第 ' + (index + 1) + ' 态'));
+  const summary = (code, state, source, eventCode, desc) => {
+    const stateName = stateDictionary[state - 1].name;
+    return {
+      workOrderCode:code, deviceCode:'TC-PS-WS-202609020012', orderType:1, orderTypeName:'故障维修',
+      orderLevel:2, orderDesc:desc,
+      stateCode:state, stateName,
+      createTime:'2026-09-02T09:00:00+08:00', updateTime:'2026-09-02T10:00:00+08:00',
+      planFinishTime:'2026-09-03T09:00:00+08:00', realFinishTime:state === 6 ? '2026-09-02T10:00:00+08:00' : null,
+      eventAssociation:{ eventSource:source, eventCode, associatedAt:'2026-09-02T10:00:00+08:00' }
+    };
+  };
+  const allOrders = stateDictionary.map(state => summary(
+    'WO-202609020000' + state.code, state.code, 'ALARM', 'ALM-20260902-00' + state.code, '演示第 ' + state.code + ' 态'));
   const multiOrders = [
     summary('WO-2026090200101', 4, 'ALARM', 'ALM-WS_ENV_HIGH-001', '污水COD超标维修'),
     summary('WO-2026090200102', 5, 'ALARM', 'ALM-WS_ENV_PH-002', '污水pH越界维修')
@@ -91,15 +87,20 @@
     'WO-2026090200101': ['创建:待派单','派单:待接单','开始处置:处理中'],
     'WO-2026090200102': ['创建:待派单','派单:待接单','提交验收:待验收']
   };
+  function badgeClass(order) {
+    if (order.stateCode === 6) return 'finished';
+    if (order.stateCode === 7) return 'cancelled';
+    return 'active';
+  }
   function renderOrder(order) {
-    const timeline = timelines[order.workOrderCode] || ['创建:' + order.legacyStateName];
+    const timeline = timelines[order.workOrderCode] || ['创建:' + order.stateName];
     return `<article class="order ${order.eventAssociation.eventSource === 'ALARM' ? 'alarm' : 'warning'}">
       <div class="title">
         <div><h3>${order.orderDesc}</h3><div class="code">${order.workOrderCode}</div></div>
-        <span class="badge ${order.deprecatedState ? 'legacy' : order.legacyState === 6 ? 'finished' : 'active'}">${order.legacyState} ${order.legacyStateName}</span>
+        <span class="badge ${badgeClass(order)}">${order.stateCode} ${order.stateName}</span>
       </div>
-      <p class="meta">权威状态:${order.authoritativeState ?? '已废止'} ${order.authoritativeStateName ?? ''}<br />事件:${order.eventAssociation.eventSource} ${order.eventAssociation.eventCode}</p>
-      <div class="timeline">${timeline.map(item => `<div class="entry ${order.deprecatedState ? 'legacy' : order.legacyState === 6 ? 'finished' : ''}">${item}</div>`).join('')}</div>
+      <p class="meta">事件:${order.eventAssociation.eventSource} ${order.eventAssociation.eventCode}</p>
+      <div class="timeline">${timeline.map(item => `<div class="entry ${badgeClass(order)}">${item}</div>`).join('')}</div>
     </article>`;
   }
   function render(mode) {
@@ -107,8 +108,8 @@
     const orders = mode === 'all' ? allOrders : multiOrders;
     document.getElementById('orders').innerHTML = orders.map(renderOrder).join('');
     document.getElementById('dictionary').innerHTML = stateDictionary.map(state => `
-      <div class="state ${state.deprecated ? 'legacy' : ''}"><strong>${state.legacyCode} ${state.legacyName}</strong>
-        <p class="meta">${state.authoritativeCode ? '权威:' + state.authoritativeCode + ' ' + state.authoritativeName : '已废止'}</p>
+      <div class="state ${state.code === 7 ? 'cancelled' : ''}"><strong>${state.code} ${state.name}</strong>
+        <p class="meta">${state.code === 7 ? '终态' : '中间态'}</p>
       </div>`).join('');
     document.getElementById('payload').textContent = JSON.stringify({
       code:200, msg:'操作成功', data:{

+ 47 - 50
pipe-network-service/zksy-admin/src/test/java/com/zksy/web/controller/cockpit/CockpitWorkOrderReadControllerTest.java

@@ -51,8 +51,8 @@ class CockpitWorkOrderReadControllerTest {
     }
 
     @Test
-    void deviceWorkOrdersReturnNineStateDictionaryAndAuthoritativeMapping() throws Exception {
-        when(adapter.loadByDevice(DEVICE_CODE)).thenReturn(nineStateFixture());
+    void deviceWorkOrdersReturnSevenStateDictionary() throws Exception {
+        when(adapter.loadByDevice(DEVICE_CODE)).thenReturn(sevenStateFixture());
 
         mockMvc.perform(get("/api/cockpit/v1/equipments/" + DEVICE_CODE + "/work-orders")
                         .header("X-Request-Id", "work-order-device-001"))
@@ -62,22 +62,22 @@ class CockpitWorkOrderReadControllerTest {
                 .andExpect(jsonPath("$.data.apiVersion").value("v1"))
                 .andExpect(jsonPath("$.data.readOnly").value(true))
                 .andExpect(jsonPath("$.data.deviceCode").value(DEVICE_CODE))
-                .andExpect(jsonPath("$.data.stateDictionary", hasSize(9)))
-                .andExpect(jsonPath("$.data.stateDictionary[0].legacyCode").value(1))
-                .andExpect(jsonPath("$.data.stateDictionary[0].legacyName").value("待派单"))
-                .andExpect(jsonPath("$.data.stateDictionary[5].legacyCode").value(6))
-                .andExpect(jsonPath("$.data.stateDictionary[5].legacyName").value("已结案"))
-                .andExpect(jsonPath("$.data.stateDictionary[6].legacyCode").value(7))
-                .andExpect(jsonPath("$.data.stateDictionary[6].legacyName").value("已驳回"))
-                .andExpect(jsonPath("$.data.stateDictionary[6].authoritativeCode").value(7))
-                .andExpect(jsonPath("$.data.stateDictionary[6].authoritativeName").value("已取消"))
-                .andExpect(jsonPath("$.data.stateDictionary[7].deprecated").value(true))
-                .andExpect(jsonPath("$.data.stateDictionary[8].deprecated").value(true))
-                .andExpect(jsonPath("$.data.workOrders", hasSize(9)))
-                .andExpect(jsonPath("$.data.workOrders[0].legacyState").value(1))
-                .andExpect(jsonPath("$.data.workOrders[0].authoritativeState").value(1))
-                .andExpect(jsonPath("$.data.workOrders[8].legacyState").value(9))
-                .andExpect(jsonPath("$.data.workOrders[8].authoritativeState").doesNotExist());
+                .andExpect(jsonPath("$.data.stateDictionary", hasSize(7)))
+                .andExpect(jsonPath("$.data.stateDictionary[0].code").value(1))
+                .andExpect(jsonPath("$.data.stateDictionary[0].name").value("待派单"))
+                .andExpect(jsonPath("$.data.stateDictionary[5].code").value(6))
+                .andExpect(jsonPath("$.data.stateDictionary[5].name").value("已结案"))
+                .andExpect(jsonPath("$.data.stateDictionary[6].code").value(7))
+                .andExpect(jsonPath("$.data.stateDictionary[6].name").value("已取消"))
+                .andExpect(jsonPath("$.data.stateDictionary[0].legacyCode").doesNotExist())
+                .andExpect(jsonPath("$.data.stateDictionary[0].deprecated").doesNotExist())
+                .andExpect(jsonPath("$.data.workOrders", hasSize(7)))
+                .andExpect(jsonPath("$.data.workOrders[0].stateCode").value(1))
+                .andExpect(jsonPath("$.data.workOrders[0].stateName").value("待派单"))
+                .andExpect(jsonPath("$.data.workOrders[6].stateCode").value(7))
+                .andExpect(jsonPath("$.data.workOrders[6].stateName").value("已取消"))
+                .andExpect(jsonPath("$.data.workOrders[0].legacyState").doesNotExist())
+                .andExpect(jsonPath("$.data.workOrders[0].deprecatedState").doesNotExist());
     }
 
     @Test
@@ -131,13 +131,14 @@ class CockpitWorkOrderReadControllerTest {
                 .andExpect(status().isOk())
                 .andExpect(jsonPath("$.data.requestId").value("timeline-001"))
                 .andExpect(jsonPath("$.data.workOrderCode").value("WO-2026090200001"))
-                .andExpect(jsonPath("$.data.stateDictionary", hasSize(9)))
+                .andExpect(jsonPath("$.data.stateDictionary", hasSize(7)))
                 .andExpect(jsonPath("$.data.timelineEntries", hasSize(3)))
                 .andExpect(jsonPath("$.data.timelineEntries[0].workOrderCode").value("WO-2026090200001"))
-                .andExpect(jsonPath("$.data.timelineEntries[0].legacyState").value(1))
-                .andExpect(jsonPath("$.data.timelineEntries[0].authoritativeState").value(1))
-                .andExpect(jsonPath("$.data.timelineEntries[2].legacyState").value(3))
-                .andExpect(jsonPath("$.data.timelineEntries[2].authoritativeState").value(3));
+                .andExpect(jsonPath("$.data.timelineEntries[0].stateCode").value(1))
+                .andExpect(jsonPath("$.data.timelineEntries[0].stateName").value("待派单"))
+                .andExpect(jsonPath("$.data.timelineEntries[2].stateCode").value(3))
+                .andExpect(jsonPath("$.data.timelineEntries[2].stateName").value("已接单"))
+                .andExpect(jsonPath("$.data.timelineEntries[0].legacyState").doesNotExist());
 
         mockMvc.perform(get("/api/cockpit/v1/work-orders/WO-2026090200002/timeline")
                         .header("X-Request-Id", "timeline-002"))
@@ -145,8 +146,8 @@ class CockpitWorkOrderReadControllerTest {
                 .andExpect(jsonPath("$.data.workOrderCode").value("WO-2026090200002"))
                 .andExpect(jsonPath("$.data.timelineEntries", hasSize(1)))
                 .andExpect(jsonPath("$.data.timelineEntries[0].workOrderCode").value("WO-2026090200002"))
-                .andExpect(jsonPath("$.data.timelineEntries[0].legacyState").value(6))
-                .andExpect(jsonPath("$.data.timelineEntries[0].authoritativeState").value(6));
+                .andExpect(jsonPath("$.data.timelineEntries[0].stateCode").value(6))
+                .andExpect(jsonPath("$.data.timelineEntries[0].stateName").value("已结案"));
     }
 
     @Test
@@ -195,9 +196,9 @@ class CockpitWorkOrderReadControllerTest {
         org.junit.jupiter.api.Assertions.assertTrue(condition);
     }
 
-    private CockpitWorkOrderReadSnapshot nineStateFixture() {
+    private CockpitWorkOrderReadSnapshot sevenStateFixture() {
         List<CockpitWorkOrderSummary> summaries = new java.util.ArrayList<>();
-        for (int state = 1; state <= 9; state++) {
+        for (int state = 1; state <= 7; state++) {
             summaries.add(summary("WO-202609020000" + state, state, "ALM-20260902-00" + state));
         }
         return new CockpitWorkOrderReadSnapshot(DEVICE_CODE, null, null, summaries);
@@ -216,14 +217,14 @@ class CockpitWorkOrderReadControllerTest {
                 DEVICE_CODE,
                 "WARNING",
                 "WRN-20260902-001",
-                Collections.singletonList(new CockpitWorkOrderSummary(
-                        "WO-2026090200002", DEVICE_CODE, 1, "故障维修", 2, "处理异常", 2, "待接单", 2, "待接单", false,
-                        "2026-09-02T09:59:30+08:00", "2026-09-02T10:00:00+08:00", "2026-09-02T09:00:00+08:00", "2026-09-02T09:30:00+08:00",
-                        new CockpitWorkOrderEventAssociation("WARNING", "WRN-20260902-001", "2026-09-02T10:00:00+08:00"))));
+                Collections.singletonList(summary("WO-2026090200002", 2, "WARNING", "WRN-20260902-001")));
+    }
+    private CockpitWorkOrderSummary summary(String workOrderCode, int state, String eventCode) {
+        return summary(workOrderCode, state, "ALARM", eventCode);
     }
 
-    private CockpitWorkOrderSummary summary(String workOrderCode, int legacyState, String eventCode) {
-        CockpitWorkOrderState state = CockpitWorkOrderStateDictionary.byLegacyCode(legacyState);
+    private CockpitWorkOrderSummary summary(String workOrderCode, int state, String eventSource, String eventCode) {
+        CockpitWorkOrderState stateEntry = CockpitWorkOrderStateDictionary.byLegacyCode(state);
         return new CockpitWorkOrderSummary(
                 workOrderCode,
                 DEVICE_CODE,
@@ -231,16 +232,13 @@ class CockpitWorkOrderReadControllerTest {
                 "故障维修",
                 2,
                 "处理异常",
-                state.getLegacyCode(),
-                state.getLegacyName(),
-                state.getAuthoritativeCode(),
-                state.getAuthoritativeName(),
-                state.isDeprecated(),
+                stateEntry.getCode(),
+                stateEntry.getName(),
                 "2026-09-02T09:59:30+08:00",
                 "2026-09-02T10:00:00+08:00",
                 "2026-09-02T09:00:00+08:00",
                 "2026-09-02T09:30:00+08:00",
-                new CockpitWorkOrderEventAssociation("ALARM", eventCode, "2026-09-02T10:00:00+08:00"));
+                                new CockpitWorkOrderEventAssociation(eventSource, eventCode, "2026-09-02T10:00:00+08:00"));
     }
 
     private CockpitWorkOrderTimelineSnapshot timelineFixture(String workOrderCode, String lastState) {
@@ -249,24 +247,23 @@ class CockpitWorkOrderReadControllerTest {
         if (state >= 6) {
             return new CockpitWorkOrderTimelineSnapshot(
                     summary,
-                    Collections.singletonList(entry(workOrderCode, 6, 6)));
+                    Collections.singletonList(entry(workOrderCode, 6)));
         }
         return new CockpitWorkOrderTimelineSnapshot(
                 summary,
                 Arrays.asList(
-                        entry(workOrderCode, 1, 1),
-                        entry(workOrderCode, 2, 2),
-                        entry(workOrderCode, 3, 3)));
+                        entry(workOrderCode, 1),
+                        entry(workOrderCode, 2),
+                        entry(workOrderCode, 3)));
     }
-    private CockpitWorkOrderTimelineEntry entry(String workOrderCode, int legacyState, int authoritativeState) {
+
+    private CockpitWorkOrderTimelineEntry entry(String workOrderCode, int state) {
+        CockpitWorkOrderState stateEntry = CockpitWorkOrderStateDictionary.byLegacyCode(state);
         return new CockpitWorkOrderTimelineEntry(
-                (long) legacyState,
+                (long) state,
                 workOrderCode,
-                legacyState,
-                CockpitWorkOrderStateDictionary.byLegacyCode(legacyState).getLegacyName(),
-                authoritativeState,
-                CockpitWorkOrderStateDictionary.byLegacyCode(legacyState).getAuthoritativeName(),
-                false,
+                stateEntry.getCode(),
+                stateEntry.getName(),
                 "创建",
                 "创建工单",
                 "系统",

+ 5 - 11
pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/workorder/BusinessCockpitWorkOrderReadAdapter.java

@@ -112,11 +112,8 @@ public class BusinessCockpitWorkOrderReadAdapter implements CockpitWorkOrderRead
                 orderTypeName(order.getOrderType()),
                 order.getOrderLevel(),
                 order.getOrderDesc(),
-                state.getLegacyCode(),
-                state.getLegacyName(),
-                state.getAuthoritativeCode(),
-                state.getAuthoritativeName(),
-                state.isDeprecated(),
+                state.getCode(),
+                state.getName(),
                 format(order.getCreateTime()),
                 format(order.getUpdateTime()),
                 format(order.getPlanFinishTime()),
@@ -130,12 +127,9 @@ public class BusinessCockpitWorkOrderReadAdapter implements CockpitWorkOrderRead
         return new CockpitWorkOrderTimelineEntry(
                 log.getLogId(),
                 order.getOrderNo(),
-                state.getLegacyCode(),
-                state.getLegacyName(),
-                state.getAuthoritativeCode(),
-                state.getAuthoritativeName(),
-                state.isDeprecated(),
-                state.getLegacyName(),
+                state.getCode(),
+                state.getName(),
+                state.getName(),
                 log.getOperDesc(),
                 log.getOperUserName(),
                 format(log.getOperTime()));

+ 7 - 21
pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/workorder/CockpitWorkOrderState.java

@@ -1,28 +1,14 @@
 package com.zksy.cockpit.workorder;
 
 public class CockpitWorkOrderState {
-    private final int legacyCode;
-    private final String legacyName;
-    private final Integer authoritativeCode;
-    private final String authoritativeName;
-    private final boolean deprecated;
+    private final int code;
+    private final String name;
 
-    public CockpitWorkOrderState(
-            int legacyCode,
-            String legacyName,
-            Integer authoritativeCode,
-            String authoritativeName,
-            boolean deprecated) {
-        this.legacyCode = legacyCode;
-        this.legacyName = legacyName;
-        this.authoritativeCode = authoritativeCode;
-        this.authoritativeName = authoritativeName;
-        this.deprecated = deprecated;
+    public CockpitWorkOrderState(int code, String name) {
+        this.code = code;
+        this.name = name;
     }
 
-    public int getLegacyCode() { return legacyCode; }
-    public String getLegacyName() { return legacyName; }
-    public Integer getAuthoritativeCode() { return authoritativeCode; }
-    public String getAuthoritativeName() { return authoritativeName; }
-    public boolean isDeprecated() { return deprecated; }
+    public int getCode() { return code; }
+    public String getName() { return name; }
 }

+ 27 - 17
pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/workorder/CockpitWorkOrderStateDictionary.java

@@ -2,26 +2,28 @@ package com.zksy.cockpit.workorder;
 
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.function.Function;
-import java.util.stream.Collectors;
 
 public final class CockpitWorkOrderStateDictionary {
     private static final List<CockpitWorkOrderState> STATES = Collections.unmodifiableList(Arrays.asList(
-            new CockpitWorkOrderState(1, "待派单", 1, "待派单", false),
-            new CockpitWorkOrderState(2, "待接单", 2, "待接单", false),
-            new CockpitWorkOrderState(3, "已接单", 3, "已接单", false),
-            new CockpitWorkOrderState(4, "处理中", 4, "处理中", false),
-            new CockpitWorkOrderState(5, "待验收", 5, "待验收", false),
-            new CockpitWorkOrderState(6, "已结案", 6, "已结案", false),
-            new CockpitWorkOrderState(7, "已驳回", 7, "已取消", true),
-            new CockpitWorkOrderState(8, "延期审核", null, null, true),
-            new CockpitWorkOrderState(9, "已延期", null, null, true)
+            new CockpitWorkOrderState(1, "待派单"),
+            new CockpitWorkOrderState(2, "待接单"),
+            new CockpitWorkOrderState(3, "已接单"),
+            new CockpitWorkOrderState(4, "处理中"),
+            new CockpitWorkOrderState(5, "待验收"),
+            new CockpitWorkOrderState(6, "已结案"),
+            new CockpitWorkOrderState(7, "已取消")
     ));
 
-    private static final Map<Integer, CockpitWorkOrderState> BY_LEGACY_CODE = STATES.stream()
-            .collect(Collectors.toMap(CockpitWorkOrderState::getLegacyCode, Function.identity()));
+    private static final Map<Integer, CockpitWorkOrderState> BY_CODE = new HashMap<>();
+
+    static {
+        for (CockpitWorkOrderState state : STATES) {
+            BY_CODE.put(state.getCode(), state);
+        }
+    }
 
     private CockpitWorkOrderStateDictionary() {
     }
@@ -30,10 +32,18 @@ public final class CockpitWorkOrderStateDictionary {
         return STATES;
     }
 
-    public static CockpitWorkOrderState byLegacyCode(Integer code) {
-        if (code == null) {
-            return BY_LEGACY_CODE.get(7);
+    public static CockpitWorkOrderState byCode(Integer code) {
+        return code == null ? null : BY_CODE.get(code);
+    }
+
+    public static CockpitWorkOrderState byLegacyCode(Integer legacyCode) {
+        // 迁移期兼容:现网旧编码 1-6 与新模型同值;旧 7 为取消/驳回混用,收敛为“已取消”。
+        if (legacyCode == null) {
+            return null;
+        }
+        if (legacyCode >= 1 && legacyCode <= 7) {
+            return BY_CODE.get(legacyCode);
         }
-        return BY_LEGACY_CODE.get(code);
+        return BY_CODE.get(7);
     }
 }

+ 8 - 20
pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/workorder/CockpitWorkOrderSummary.java

@@ -7,11 +7,8 @@ public class CockpitWorkOrderSummary {
     private final String orderTypeName;
     private final Integer orderLevel;
     private final String orderDesc;
-    private final Integer legacyState;
-    private final String legacyStateName;
-    private final Integer authoritativeState;
-    private final String authoritativeStateName;
-    private final boolean deprecatedState;
+    private final Integer stateCode;
+    private final String stateName;
     private final String createTime;
     private final String updateTime;
     private final String planFinishTime;
@@ -25,11 +22,8 @@ public class CockpitWorkOrderSummary {
             String orderTypeName,
             Integer orderLevel,
             String orderDesc,
-            Integer legacyState,
-            String legacyStateName,
-            Integer authoritativeState,
-            String authoritativeStateName,
-            boolean deprecatedState,
+            Integer stateCode,
+            String stateName,
             String createTime,
             String updateTime,
             String planFinishTime,
@@ -41,11 +35,8 @@ public class CockpitWorkOrderSummary {
         this.orderTypeName = orderTypeName;
         this.orderLevel = orderLevel;
         this.orderDesc = orderDesc;
-        this.legacyState = legacyState;
-        this.legacyStateName = legacyStateName;
-        this.authoritativeState = authoritativeState;
-        this.authoritativeStateName = authoritativeStateName;
-        this.deprecatedState = deprecatedState;
+        this.stateCode = stateCode;
+        this.stateName = stateName;
         this.createTime = createTime;
         this.updateTime = updateTime;
         this.planFinishTime = planFinishTime;
@@ -59,11 +50,8 @@ public class CockpitWorkOrderSummary {
     public String getOrderTypeName() { return orderTypeName; }
     public Integer getOrderLevel() { return orderLevel; }
     public String getOrderDesc() { return orderDesc; }
-    public Integer getLegacyState() { return legacyState; }
-    public String getLegacyStateName() { return legacyStateName; }
-    public Integer getAuthoritativeState() { return authoritativeState; }
-    public String getAuthoritativeStateName() { return authoritativeStateName; }
-    public boolean isDeprecatedState() { return deprecatedState; }
+    public Integer getStateCode() { return stateCode; }
+    public String getStateName() { return stateName; }
     public String getCreateTime() { return createTime; }
     public String getUpdateTime() { return updateTime; }
     public String getPlanFinishTime() { return planFinishTime; }

+ 8 - 20
pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/workorder/CockpitWorkOrderTimelineEntry.java

@@ -3,11 +3,8 @@ package com.zksy.cockpit.workorder;
 public class CockpitWorkOrderTimelineEntry {
     private final Long logId;
     private final String workOrderCode;
-    private final Integer legacyState;
-    private final String legacyStateName;
-    private final Integer authoritativeState;
-    private final String authoritativeStateName;
-    private final boolean deprecatedState;
+    private final Integer stateCode;
+    private final String stateName;
     private final String operationName;
     private final String operationDesc;
     private final String operatorName;
@@ -16,22 +13,16 @@ public class CockpitWorkOrderTimelineEntry {
     public CockpitWorkOrderTimelineEntry(
             Long logId,
             String workOrderCode,
-            Integer legacyState,
-            String legacyStateName,
-            Integer authoritativeState,
-            String authoritativeStateName,
-            boolean deprecatedState,
+            Integer stateCode,
+            String stateName,
             String operationName,
             String operationDesc,
             String operatorName,
             String operatedAt) {
         this.logId = logId;
         this.workOrderCode = workOrderCode;
-        this.legacyState = legacyState;
-        this.legacyStateName = legacyStateName;
-        this.authoritativeState = authoritativeState;
-        this.authoritativeStateName = authoritativeStateName;
-        this.deprecatedState = deprecatedState;
+        this.stateCode = stateCode;
+        this.stateName = stateName;
         this.operationName = operationName;
         this.operationDesc = operationDesc;
         this.operatorName = operatorName;
@@ -40,11 +31,8 @@ public class CockpitWorkOrderTimelineEntry {
 
     public Long getLogId() { return logId; }
     public String getWorkOrderCode() { return workOrderCode; }
-    public Integer getLegacyState() { return legacyState; }
-    public String getLegacyStateName() { return legacyStateName; }
-    public Integer getAuthoritativeState() { return authoritativeState; }
-    public String getAuthoritativeStateName() { return authoritativeStateName; }
-    public boolean isDeprecatedState() { return deprecatedState; }
+    public Integer getStateCode() { return stateCode; }
+    public String getStateName() { return stateName; }
     public String getOperationName() { return operationName; }
     public String getOperationDesc() { return operationDesc; }
     public String getOperatorName() { return operatorName; }