Ver Fonte

🐛 fix(设备监控): 保证每条曲线仅保留最新告警

- 清理同一曲线的历史告警提示
- 避免告警恢复后再次触发时产生重复信息
- 保留不同曲线之间独立告警
- 补充告警提示替换逻辑测试
Zimo há 4 dias atrás
pai
commit
caa5afdced

+ 2 - 0
src/utils/thresholdAlarmNoticeTracker.ts

@@ -13,8 +13,10 @@ export function createThresholdAlarmNoticeTracker() {
       return acknowledgedFingerprints.get(alarmKey) === fingerprint
     },
     record(alarmKey: string, noticeKey: string, fingerprint: string) {
+      const previousNoticeKey = currentNotices.get(alarmKey)?.noticeKey
       acknowledgedFingerprints.delete(alarmKey)
       currentNotices.set(alarmKey, { noticeKey, fingerprint })
+      return previousNoticeKey
     },
     close(alarmKey: string, noticeKey: string) {
       if (currentNotices.get(alarmKey)?.noticeKey !== noticeKey) return false

+ 9 - 1
src/views/oli-connection/monitoring-board/chart.vue

@@ -600,12 +600,20 @@ function updateThresholdAlarm(pointMap: Map<string, ChartPoint>) {
 
     if (thresholdAlarmNoticeTracker.shouldCreate(alarmKey, fingerprint)) {
       const noticeKey = `${alarmKey}|${anchorTs}|${++thresholdAlarmNoticeSequence}`
+
+      // 告警状态可能已经恢复过,追踪器会清理当前键,但历史提示仍需保留到手动关闭。
+      // 新一轮告警创建时,先清理同一曲线的历史提示,确保每条曲线只展示最新一条。
+      Object.values(nextNotices).forEach((notice) => {
+        if (notice.alarmKey === alarmKey) delete nextNotices[notice.key]
+      })
+
       nextNotices[noticeKey] = {
         ...activeAlarm,
         alarmAt: anchorTs,
         key: noticeKey
       }
-      thresholdAlarmNoticeTracker.record(alarmKey, noticeKey, fingerprint)
+      const previousNoticeKey = thresholdAlarmNoticeTracker.record(alarmKey, noticeKey, fingerprint)
+      if (previousNoticeKey) delete nextNotices[previousNoticeKey]
     }
   })
 

+ 9 - 0
tests/thresholdAlarmNoticeTracker.test.mjs

@@ -48,3 +48,12 @@ test('不同指标的当前提示状态互不影响', () => {
   assert.equal(tracker.shouldCreate('oil-speed', 'oil-1'), false)
   assert.equal(tracker.shouldCreate('well-pressure', 'pressure-1'), false)
 })
+
+test('同一指标记录新提示时返回旧提示键并替换当前状态', () => {
+  const tracker = createThresholdAlarmNoticeTracker()
+
+  assert.equal(tracker.record('oil-speed', 'notice-1', 'oil-1'), undefined)
+  assert.equal(tracker.record('oil-speed', 'notice-2', 'oil-2'), 'notice-1')
+  assert.equal(tracker.close('oil-speed', 'notice-1'), false)
+  assert.equal(tracker.close('oil-speed', 'notice-2'), true)
+})