|
|
@@ -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)
|
|
|
}
|