From b59b34e68b8bb99b1e6522c3583ab99549759197 Mon Sep 17 00:00:00 2001 From: yangsy Date: Thu, 15 Jan 2026 13:58:13 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=8A=BD=E7=A6=BB=E6=9C=AA?= =?UTF-8?q?=E8=AF=BB=E5=91=8A=E8=AD=A6=E7=8A=B6=E6=80=81=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E6=8C=81=E4=B9=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 +- .../settings-drawer/settings-drawer.vue | 2 +- src/composables/stomp/use-stomp-client.ts | 13 +++--- src/constants/store.ts | 1 + src/layouts/app-layout.vue | 8 ++-- src/pages/alarm/alarm-log-page.vue | 8 ++-- src/stores/alarm.ts | 37 +--------------- src/stores/index.ts | 1 + src/stores/unread.ts | 44 +++++++++++++++++++ 9 files changed, 67 insertions(+), 49 deletions(-) create mode 100644 src/stores/unread.ts diff --git a/.env b/.env index f1bc0d4..53d90db 100644 --- a/.env +++ b/.env @@ -19,7 +19,7 @@ VITE_LAMP_PASSWORD = fjoc(1KHP(Ls&Bje)C VITE_LAMP_AUTHORIZATION = Y3VlZGVzX2FkbWluOmN1ZWRlc19hZG1pbl9zZWNyZXQ= # 当需要重置localStorage时, 修改此变量 -VITE_STORAGE_VERSION = 3 +VITE_STORAGE_VERSION = 4 # 调试码 VITE_DEBUG_CODE = ndm_debug diff --git a/src/components/global/settings-drawer/settings-drawer.vue b/src/components/global/settings-drawer/settings-drawer.vue index 62c7c1f..2d2491e 100644 --- a/src/components/global/settings-drawer/settings-drawer.vue +++ b/src/components/global/settings-drawer/settings-drawer.vue @@ -159,7 +159,7 @@ type IndexedDbStoreId = typeof NDM_STATION_STORE_ID | typeof NDM_DEVICE_STORE_ID type IndexedDbStoreStates = { [NDM_STATION_STORE_ID]: { stations: Station[] }; [NDM_DEVICE_STORE_ID]: { lineDevices: LineDevices }; - [NDM_ALARM_STORE_ID]: { lineAlarms: LineAlarms; unreadLineAlarms: LineAlarms }; + [NDM_ALARM_STORE_ID]: { lineAlarms: LineAlarms }; }; const exportFromIndexedDB = async (storeId: K, options?: { errorMsg?: string }) => { const { errorMsg } = options ?? {}; diff --git a/src/composables/stomp/use-stomp-client.ts b/src/composables/stomp/use-stomp-client.ts index 12533bd..7be33e5 100644 --- a/src/composables/stomp/use-stomp-client.ts +++ b/src/composables/stomp/use-stomp-client.ts @@ -1,6 +1,6 @@ import type { NdmDeviceAlarmLogResultVO, Station, SyncCameraResult } from '@/apis'; import { ALARM_TOPIC, SYNC_CAMERA_STATUS_TOPIC } from '@/constants'; -import { useAlarmStore, useSettingStore, useStationStore } from '@/stores'; +import { useSettingStore, useStationStore, useUnreadStore } from '@/stores'; import { Client } from '@stomp/stompjs'; import { watchDebounced } from '@vueuse/core'; import destr from 'destr'; @@ -19,8 +19,10 @@ const getBrokerUrl = () => { export const useStompClient = () => { const stationStore = useStationStore(); const { stations } = storeToRefs(stationStore); - const alarmStore = useAlarmStore(); - const { unreadLineAlarms } = storeToRefs(alarmStore); + + const unreadStore = useUnreadStore(); + const { unreadLineAlarms } = storeToRefs(unreadStore); + const settingStore = useSettingStore(); const { offlineDev } = storeToRefs(settingStore); @@ -40,8 +42,9 @@ export const useStompClient = () => { console.log('Stomp连接成功'); stompClient.value?.subscribe(ALARM_TOPIC, (message) => { const alarm = destr(message.body); - if (alarm.alarmCategory === '1') { - alarmStore.pushUnreadAlarm(alarm); + const { alarmCategory, stationCode } = alarm; + if (alarmCategory === '1' && !!stations.value.find((station) => station.code === stationCode)) { + unreadStore.pushUnreadAlarm(alarm); } }); stompClient.value?.subscribe(SYNC_CAMERA_STATUS_TOPIC, (message) => { diff --git a/src/constants/store.ts b/src/constants/store.ts index d78ab37..c84c85a 100644 --- a/src/constants/store.ts +++ b/src/constants/store.ts @@ -3,4 +3,5 @@ export const NDM_DEVICE_STORE_ID = 'ndm-device-store'; export const NDM_POLLIING_STORE_ID = 'ndm-polling-store'; export const NDM_SETTING_STORE_ID = 'ndm-setting-store'; export const NDM_STATION_STORE_ID = 'ndm-station-store'; +export const NDM_UNREAD_STORE_ID = 'ndm-unread-store'; export const NDM_USER_STORE_ID = 'ndm-user-store'; diff --git a/src/layouts/app-layout.vue b/src/layouts/app-layout.vue index fe57eaa..c79976e 100644 --- a/src/layouts/app-layout.vue +++ b/src/layouts/app-layout.vue @@ -2,7 +2,7 @@ import { SettingsDrawer, SyncCameraResultModal } from '@/components'; import { useLineStationsQuery, useStompClient, useVerifyUserQuery } from '@/composables'; import { LINE_ALARMS_QUERY_KEY, LINE_DEVICES_QUERY_KEY, LINE_STATIONS_MUTATION_KEY, LINE_STATIONS_QUERY_KEY, STATION_ALARMS_MUTATION_KEY, STATION_DEVICES_MUTATION_KEY } from '@/constants'; -import { useAlarmStore, useSettingStore, useUserStore } from '@/stores'; +import { useSettingStore, useUnreadStore, useUserStore } from '@/stores'; import { parseErrorFeedback } from '@/utils'; import { useIsFetching, useIsMutating, useMutation } from '@tanstack/vue-query'; import { isCancel } from 'axios'; @@ -33,8 +33,8 @@ const router = useRouter(); const userStore = useUserStore(); const { userInfo } = storeToRefs(userStore); -const alarmStore = useAlarmStore(); -const { unreadAlarmCount } = storeToRefs(alarmStore); +const unreadStore = useUnreadStore(); +const { unreadAlarmCount } = storeToRefs(unreadStore); const settingStore = useSettingStore(); const { menuCollpased, offlineDev } = storeToRefs(settingStore); @@ -141,7 +141,7 @@ const routeToRoot = () => { }; const routeToAlarmPage = () => { - alarmStore.clearUnreadAlarms(); + unreadStore.clearUnreadAlarms(); if (route.path !== '/alarm/alarm-log') { router.push({ path: '/alarm/alarm-log' }); } diff --git a/src/pages/alarm/alarm-log-page.vue b/src/pages/alarm/alarm-log-page.vue index 06d5dcf..a49f0f0 100644 --- a/src/pages/alarm/alarm-log-page.vue +++ b/src/pages/alarm/alarm-log-page.vue @@ -3,7 +3,7 @@ import { exportDeviceAlarmLogApi, pageDeviceAlarmLogApi, type NdmDeviceAlarmLog, import { useAlarmActionColumn, useCameraSnapColumn } from '@/composables'; import { ALARM_TYPES, DEVICE_TYPE_CODES, DEVICE_TYPE_LITERALS, DEVICE_TYPE_NAMES, FAULT_LEVELS, tryGetDeviceType, type DeviceType } from '@/enums'; import { renderAlarmDateCell, renderAlarmTypeCell, renderDeviceTypeCell, renderFaultLevelCell } from '@/helpers'; -import { useAlarmStore, useDeviceStore, useStationStore } from '@/stores'; +import { useDeviceStore, useStationStore, useUnreadStore } from '@/stores'; import { downloadByData, parseErrorFeedback } from '@/utils'; import { useMutation } from '@tanstack/vue-query'; import { watchDebounced } from '@vueuse/core'; @@ -44,10 +44,12 @@ const router = useRouter(); const stationStore = useStationStore(); const { stations } = storeToRefs(stationStore); + const deviceStore = useDeviceStore(); const { lineDevices } = storeToRefs(deviceStore); -const alarmStore = useAlarmStore(); -const { unreadAlarmCount } = storeToRefs(alarmStore); + +const unreadStore = useUnreadStore(); +const { unreadAlarmCount } = storeToRefs(unreadStore); const stationSelectOptions = computed(() => { return stations.value.map((station) => ({ diff --git a/src/stores/alarm.ts b/src/stores/alarm.ts index 99744c1..ced59ac 100644 --- a/src/stores/alarm.ts +++ b/src/stores/alarm.ts @@ -1,8 +1,7 @@ -import { initStationAlarms, type LineAlarms, type NdmDeviceAlarmLogResultVO, type Station, type StationAlarms } from '@/apis'; +import { type LineAlarms, type Station, type StationAlarms } from '@/apis'; import { NDM_ALARM_STORE_ID } from '@/constants'; -import { tryGetDeviceType } from '@/enums'; import { defineStore } from 'pinia'; -import { computed, shallowRef, triggerRef } from 'vue'; +import { shallowRef, triggerRef } from 'vue'; export const useAlarmStore = defineStore( NDM_ALARM_STORE_ID, @@ -18,42 +17,10 @@ export const useAlarmStore = defineStore( triggerRef(lineAlarms); }; - // 全线所有车站的未读告警 (来自stomp订阅) - const unreadLineAlarms = shallowRef({}); - const unreadAlarmCount = computed(() => { - let count = 0; - Object.values(unreadLineAlarms.value).forEach((stationAlarms) => { - count += stationAlarms['unclassified'].length; - }); - return count; - }); - const pushUnreadAlarm = (alarm: NdmDeviceAlarmLogResultVO) => { - const stationCode = alarm.stationCode; - if (!stationCode) return; - if (!unreadLineAlarms.value[stationCode]) { - unreadLineAlarms.value[stationCode] = initStationAlarms(); - } - const deviceType = tryGetDeviceType(alarm.deviceType); - if (!deviceType) return; - const stationAlarms = unreadLineAlarms.value[stationCode]; - stationAlarms[deviceType].push(alarm); - stationAlarms['unclassified'].push(alarm); - triggerRef(unreadLineAlarms); - }; - const clearUnreadAlarms = () => { - unreadLineAlarms.value = {}; - triggerRef(unreadLineAlarms); - }; - return { lineAlarms, setLineAlarms, setStationAlarms, - - unreadLineAlarms, - unreadAlarmCount, - pushUnreadAlarm, - clearUnreadAlarms, }; }, { diff --git a/src/stores/index.ts b/src/stores/index.ts index 080721b..2740215 100644 --- a/src/stores/index.ts +++ b/src/stores/index.ts @@ -3,4 +3,5 @@ export * from './device'; export * from './polling'; export * from './setting'; export * from './station'; +export * from './unread'; export * from './user'; diff --git a/src/stores/unread.ts b/src/stores/unread.ts new file mode 100644 index 0000000..9920732 --- /dev/null +++ b/src/stores/unread.ts @@ -0,0 +1,44 @@ +import { initStationAlarms, type LineAlarms, type NdmDeviceAlarmLogResultVO } from '@/apis'; +import { NDM_UNREAD_STORE_ID } from '@/constants'; +import { tryGetDeviceType } from '@/enums'; +import { defineStore } from 'pinia'; +import { computed, shallowRef, triggerRef } from 'vue'; + +export const useUnreadStore = defineStore(NDM_UNREAD_STORE_ID, () => { + // 全线所有车站的未读告警 (来自stomp订阅) + const unreadLineAlarms = shallowRef({}); + const unreadAlarmCount = computed(() => { + let count = 0; + Object.values(unreadLineAlarms.value).forEach((stationAlarms) => { + count += stationAlarms['unclassified'].length; + }); + return count; + }); + + const pushUnreadAlarm = (alarm: NdmDeviceAlarmLogResultVO) => { + const stationCode = alarm.stationCode; + if (!stationCode) return; + if (!unreadLineAlarms.value[stationCode]) { + unreadLineAlarms.value[stationCode] = initStationAlarms(); + } + const deviceType = tryGetDeviceType(alarm.deviceType); + if (!deviceType) return; + const stationAlarms = unreadLineAlarms.value[stationCode]; + stationAlarms[deviceType].push(alarm); + stationAlarms['unclassified'].push(alarm); + triggerRef(unreadLineAlarms); + }; + + const clearUnreadAlarms = () => { + unreadLineAlarms.value = {}; + triggerRef(unreadLineAlarms); + }; + + return { + unreadLineAlarms, + unreadAlarmCount, + + pushUnreadAlarm, + clearUnreadAlarms, + }; +});