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

feat(cockpit): 预警处置场景纳入工单处置点位

维护者要求:预警处置模式的坐标点从「报警/预警」扩展到「报警/预警/工单处置」。
- 可见性判据拆出 VISIBLE_ATTENTION_STATUSES(含 WORK_ORDER),与「异常台数」计数口径
  ATTENTION_STATUSES(仍两态)刻意分开;工单处置态只看对象自身状态(pointStatus/deviceStatus),
  因为 /monitoring/situation 的 abnormalEquipment[] 不含该态
- 点位与未关联设备按「自身状态 或 设备侧证据」取并集;选择态可见性同步
- 降级说明改为「仅按对象自身状态显示」
t46 闸门同步:G2 改为三态、新增 A6b/A7b/G5(可见性与计数分离)。
ChenJZ 1 день назад
Родитель
Сommit
3152c54c0a
1 измененных файлов с 46 добавлено и 12 удалено
  1. 46 12
      src/modules/cockpit/domain/modeLayerPlan.js

+ 46 - 12
src/modules/cockpit/domain/modeLayerPlan.js

@@ -20,7 +20,20 @@ export const MODE_SELECTION = {
     CLEAR: 'clear',
 }
 
+/** 「异常台数」计数口径:报警/预警两态(唯一消费方 `isAttentionDeviceStatus`)。 */
 const ATTENTION_STATUSES = new Set(['ALARM', 'WARNING'])
+/**
+ * 预警处置模式下**可上图**的业务异常状态:报警 / 预警 / 工单处置。
+ *
+ * 与 `ATTENTION_STATUSES` **刻意分开**(两点不同,不要合并):
+ *   · 这里决定「场景上给谁坐标点」,后者只回答「异常台数怎么数」(票 47 的降级判定);
+ *   · 工单处置**只能看对象自身状态**(点位 `pointStatus` / 独立设备 `deviceStatus`)——
+ *     设备异常清单 `/monitoring/situation → abnormalEquipment[]` 只装
+ *     WARNING/ALARM/EXPIRED/OFFLINE,不含 WORK_ORDER(见 `monitoringPanels.js` 的注释)。
+ *
+ * 2026-10-29 维护者要求:预警处置场景除报警/预警外,也要显示「工单处置中」的坐标点。
+ */
+const VISIBLE_ATTENTION_STATUSES = new Set(['ALARM', 'WARNING', 'WORK_ORDER'])
 const MODE_KEYS = new Set(Object.values(MODE_LAYER))
 
 function hasArray(value) {
@@ -34,10 +47,18 @@ function note(key, text, mode) {
 /** 关联设备的模式过滤唯一判据;数据可用性仍由 deviceLayer.js 先判。 */
 export function isAssociatedDeviceVisible(mode, status) {
     if (mode === MODE_LAYER.INFRASTRUCTURE) return false
-    if (mode === MODE_LAYER.WARNING_RESPONSE) return ATTENTION_STATUSES.has(status)
+    if (mode === MODE_LAYER.WARNING_RESPONSE) return VISIBLE_ATTENTION_STATUSES.has(status)
     return true
 }
 
+/**
+ * 对象**自身状态**是否够格在预警处置模式上图。
+ * 工单处置态只能从这里来(设备异常清单不含该态),因此导出给需要同一判据的消费方。
+ */
+export function isAttentionPointStatus(status) {
+    return VISIBLE_ATTENTION_STATUSES.has(status)
+}
+
 /** 总览↔分项保留选择;分项↔分项清空选择。 */
 export function planModeSelectionTransition({ fromMode, toMode, selection } = {}) {
     const current = selection || { level: 'none', pointCode: '', deviceCode: '' }
@@ -68,9 +89,21 @@ function abnormalStatusMap(abnormalDevices) {
     )
 }
 
-function isAbnormalPoint(object, abnormalCodes) {
-    return object && object.kind === MAP_OBJECT_KIND.MONITORING_POINT &&
-        Array.isArray(object.deviceCodes) && object.deviceCodes.some((code) => abnormalCodes.has(code))
+/**
+ * 预警处置模式的点位判据(两条路径取并集):
+ *   · **自身状态**是业务异常(报警/预警/工单处置)—— 工单处置只有这条路径可得;
+ *   · 它挂着的**设备**命中设备侧异常集(票 46 规格 Q8 的设备证据口径,保留)。
+ */
+function isAttentionPoint(object, abnormalCodes) {
+    if (!object || object.kind !== MAP_OBJECT_KIND.MONITORING_POINT) return false
+    if (isAttentionPointStatus(object.status)) return true
+    return Array.isArray(object.deviceCodes) && object.deviceCodes.some((code) => abnormalCodes.has(code))
+}
+
+/** 未关联设备同口径:自身状态是业务异常,或命中设备侧异常集。 */
+function isAttentionEquipment(object, abnormalCodes) {
+    if (!object) return false
+    return isAttentionPointStatus(object.status) || abnormalCodes.has(object.code)
 }
 
 function visibleMapObjects(mode, objects, abnormalDevices) {
@@ -81,8 +114,8 @@ function visibleMapObjects(mode, objects, abnormalDevices) {
     if (mode === MODE_LAYER.WARNING_RESPONSE) {
         return source.filter((object) => {
             if (!object) return false
-            if (object.kind === MAP_OBJECT_KIND.MONITORING_POINT) return isAbnormalPoint(object, abnormalCodes)
-            if (object.kind === MAP_OBJECT_KIND.UNASSOCIATED_EQUIPMENT) return abnormalCodes.has(object.code)
+            if (object.kind === MAP_OBJECT_KIND.MONITORING_POINT) return isAttentionPoint(object, abnormalCodes)
+            if (object.kind === MAP_OBJECT_KIND.UNASSOCIATED_EQUIPMENT) return isAttentionEquipment(object, abnormalCodes)
             return false
         })
     }
@@ -124,7 +157,7 @@ function selectionVisible({ mode, selection, objects, markers, associatedDevices
         // 该设备是**当前点位的关联设备**(在 `associatedDevices` 里找得到):
         // 详情面板与该设备能否上图无关 —— 一台 `no-location`(后端判不可上图)的设备
         // 仍然要看它的档案/指标/预警等分区,所以这里**不要求 placement === 'drawn'**,
-        // 只按模式可见性(预警处置只显示报警/预警)判定。
+        // 只按模式可见性(预警处置显示报警/预警/工单处置)判定。
         // (本票真机人工走查抓到:默认现网边界设备统一 `UNVERIFIED_COORDINATE/no-location`,
         //   点设备卡片后 `selectionVisible=false` ⇒ 外壳 `<aside v-if>` 卸载 ⇒ 摘要面板消失。)
         const row = (Array.isArray(associatedDevices) ? associatedDevices : [])
@@ -133,19 +166,19 @@ function selectionVisible({ mode, selection, objects, markers, associatedDevices
             const parent = (Array.isArray(objects) ? objects : []).find((item) =>
                 item && item.kind === MAP_OBJECT_KIND.MONITORING_POINT && item.code === row.pointCode)
             return Boolean(parent && isAssociatedDeviceVisible(mode, row.status) &&
-                (mode !== MODE_LAYER.WARNING_RESPONSE || isAbnormalPoint(parent, abnormalCodes)))
+                (mode !== MODE_LAYER.WARNING_RESPONSE || isAttentionPoint(parent, abnormalCodes)))
         }
         // 未关联设备:以地图对象身份判(基础设施整体隐藏;预警处置只认异常设备)。
         const object = (Array.isArray(objects) ? objects : [])
             .find((item) => item && item.kind === MAP_OBJECT_KIND.UNASSOCIATED_EQUIPMENT && item.code === current.deviceCode)
         return Boolean(object && (mode !== MODE_LAYER.INFRASTRUCTURE) &&
-            (mode !== MODE_LAYER.WARNING_RESPONSE || abnormalCodes.has(object.code)))
+            (mode !== MODE_LAYER.WARNING_RESPONSE || isAttentionEquipment(object, abnormalCodes)))
     }
     if (current.pointCode) {
         const point = (Array.isArray(objects) ? objects : []).find((item) =>
             item && item.kind === MAP_OBJECT_KIND.MONITORING_POINT && item.code === current.pointCode)
         return Boolean(point && mode !== MODE_LAYER.INFRASTRUCTURE &&
-            (mode !== MODE_LAYER.WARNING_RESPONSE || isAbnormalPoint(point, abnormalCodes)))
+            (mode !== MODE_LAYER.WARNING_RESPONSE || isAttentionPoint(point, abnormalCodes)))
     }
     return false
 }
@@ -192,7 +225,7 @@ export function planModeLayers({
     const abnormalCodes = abnormalCodeSet(abnormalDevices)
     const abnormalDataReady = hasArray(abnormalDevices)
     if (normalizedMode === MODE_LAYER.WARNING_RESPONSE && !abnormalDataReady) {
-        degradedNotes.push(note('abnormal-devices-unready', '异常设备数据未就绪,预警处置不猜测异常点', normalizedMode))
+        degradedNotes.push(note('abnormal-devices-unready', '异常设备数据未就绪,预警处置仅按对象自身状态显示', normalizedMode))
     }
 
     const visiblePointCodes = new Set(source.filter((item) => item.kind === MAP_OBJECT_KIND.MONITORING_POINT).map((item) => item.code))
@@ -247,7 +280,8 @@ export function planModeLayers({
     }
 }
 
-/** 供测试和外壳使用的状态判断,不泄漏内部 Set。 */
+/** 「异常台数」计数判据(报警/预警两态,票 47 降级口径),**不是**场景可见性判据 ——
+ *  可见性见 `isAttentionPointStatus`(多含工单处置)。 */
 export function isAttentionDeviceStatus(status) {
     return ATTENTION_STATUSES.has(status)
 }