refactor: 抽离未读告警状态,不再持久化
This commit is contained in:
2
.env
2
.env
@@ -19,7 +19,7 @@ VITE_LAMP_PASSWORD = fjoc(1KHP(Ls&Bje)C
|
|||||||
VITE_LAMP_AUTHORIZATION = Y3VlZGVzX2FkbWluOmN1ZWRlc19hZG1pbl9zZWNyZXQ=
|
VITE_LAMP_AUTHORIZATION = Y3VlZGVzX2FkbWluOmN1ZWRlc19hZG1pbl9zZWNyZXQ=
|
||||||
|
|
||||||
# 当需要重置localStorage时, 修改此变量
|
# 当需要重置localStorage时, 修改此变量
|
||||||
VITE_STORAGE_VERSION = 3
|
VITE_STORAGE_VERSION = 4
|
||||||
|
|
||||||
# 调试码
|
# 调试码
|
||||||
VITE_DEBUG_CODE = ndm_debug
|
VITE_DEBUG_CODE = ndm_debug
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ type IndexedDbStoreId = typeof NDM_STATION_STORE_ID | typeof NDM_DEVICE_STORE_ID
|
|||||||
type IndexedDbStoreStates = {
|
type IndexedDbStoreStates = {
|
||||||
[NDM_STATION_STORE_ID]: { stations: Station[] };
|
[NDM_STATION_STORE_ID]: { stations: Station[] };
|
||||||
[NDM_DEVICE_STORE_ID]: { lineDevices: LineDevices };
|
[NDM_DEVICE_STORE_ID]: { lineDevices: LineDevices };
|
||||||
[NDM_ALARM_STORE_ID]: { lineAlarms: LineAlarms; unreadLineAlarms: LineAlarms };
|
[NDM_ALARM_STORE_ID]: { lineAlarms: LineAlarms };
|
||||||
};
|
};
|
||||||
const exportFromIndexedDB = async <K extends IndexedDbStoreId>(storeId: K, options?: { errorMsg?: string }) => {
|
const exportFromIndexedDB = async <K extends IndexedDbStoreId>(storeId: K, options?: { errorMsg?: string }) => {
|
||||||
const { errorMsg } = options ?? {};
|
const { errorMsg } = options ?? {};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import type { NdmDeviceAlarmLogResultVO, Station, SyncCameraResult } from '@/apis';
|
import type { NdmDeviceAlarmLogResultVO, Station, SyncCameraResult } from '@/apis';
|
||||||
import { ALARM_TOPIC, SYNC_CAMERA_STATUS_TOPIC } from '@/constants';
|
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 { Client } from '@stomp/stompjs';
|
||||||
import { watchDebounced } from '@vueuse/core';
|
import { watchDebounced } from '@vueuse/core';
|
||||||
import destr from 'destr';
|
import destr from 'destr';
|
||||||
@@ -19,8 +19,10 @@ const getBrokerUrl = () => {
|
|||||||
export const useStompClient = () => {
|
export const useStompClient = () => {
|
||||||
const stationStore = useStationStore();
|
const stationStore = useStationStore();
|
||||||
const { stations } = storeToRefs(stationStore);
|
const { stations } = storeToRefs(stationStore);
|
||||||
const alarmStore = useAlarmStore();
|
|
||||||
const { unreadLineAlarms } = storeToRefs(alarmStore);
|
const unreadStore = useUnreadStore();
|
||||||
|
const { unreadLineAlarms } = storeToRefs(unreadStore);
|
||||||
|
|
||||||
const settingStore = useSettingStore();
|
const settingStore = useSettingStore();
|
||||||
const { offlineDev } = storeToRefs(settingStore);
|
const { offlineDev } = storeToRefs(settingStore);
|
||||||
|
|
||||||
@@ -40,8 +42,9 @@ export const useStompClient = () => {
|
|||||||
console.log('Stomp连接成功');
|
console.log('Stomp连接成功');
|
||||||
stompClient.value?.subscribe(ALARM_TOPIC, (message) => {
|
stompClient.value?.subscribe(ALARM_TOPIC, (message) => {
|
||||||
const alarm = destr<NdmDeviceAlarmLogResultVO>(message.body);
|
const alarm = destr<NdmDeviceAlarmLogResultVO>(message.body);
|
||||||
if (alarm.alarmCategory === '1') {
|
const { alarmCategory, stationCode } = alarm;
|
||||||
alarmStore.pushUnreadAlarm(alarm);
|
if (alarmCategory === '1' && !!stations.value.find((station) => station.code === stationCode)) {
|
||||||
|
unreadStore.pushUnreadAlarm(alarm);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
stompClient.value?.subscribe(SYNC_CAMERA_STATUS_TOPIC, (message) => {
|
stompClient.value?.subscribe(SYNC_CAMERA_STATUS_TOPIC, (message) => {
|
||||||
|
|||||||
@@ -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_POLLIING_STORE_ID = 'ndm-polling-store';
|
||||||
export const NDM_SETTING_STORE_ID = 'ndm-setting-store';
|
export const NDM_SETTING_STORE_ID = 'ndm-setting-store';
|
||||||
export const NDM_STATION_STORE_ID = 'ndm-station-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';
|
export const NDM_USER_STORE_ID = 'ndm-user-store';
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import { SettingsDrawer, SyncCameraResultModal } from '@/components';
|
import { SettingsDrawer, SyncCameraResultModal } from '@/components';
|
||||||
import { useLineStationsQuery, useStompClient, useVerifyUserQuery } from '@/composables';
|
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 { 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 { parseErrorFeedback } from '@/utils';
|
||||||
import { useIsFetching, useIsMutating, useMutation } from '@tanstack/vue-query';
|
import { useIsFetching, useIsMutating, useMutation } from '@tanstack/vue-query';
|
||||||
import { isCancel } from 'axios';
|
import { isCancel } from 'axios';
|
||||||
@@ -33,8 +33,8 @@ const router = useRouter();
|
|||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
const { userInfo } = storeToRefs(userStore);
|
const { userInfo } = storeToRefs(userStore);
|
||||||
|
|
||||||
const alarmStore = useAlarmStore();
|
const unreadStore = useUnreadStore();
|
||||||
const { unreadAlarmCount } = storeToRefs(alarmStore);
|
const { unreadAlarmCount } = storeToRefs(unreadStore);
|
||||||
|
|
||||||
const settingStore = useSettingStore();
|
const settingStore = useSettingStore();
|
||||||
const { menuCollpased, offlineDev } = storeToRefs(settingStore);
|
const { menuCollpased, offlineDev } = storeToRefs(settingStore);
|
||||||
@@ -141,7 +141,7 @@ const routeToRoot = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const routeToAlarmPage = () => {
|
const routeToAlarmPage = () => {
|
||||||
alarmStore.clearUnreadAlarms();
|
unreadStore.clearUnreadAlarms();
|
||||||
if (route.path !== '/alarm/alarm-log') {
|
if (route.path !== '/alarm/alarm-log') {
|
||||||
router.push({ path: '/alarm/alarm-log' });
|
router.push({ path: '/alarm/alarm-log' });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { exportDeviceAlarmLogApi, pageDeviceAlarmLogApi, type NdmDeviceAlarmLog,
|
|||||||
import { useAlarmActionColumn, useCameraSnapColumn } from '@/composables';
|
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 { 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 { renderAlarmDateCell, renderAlarmTypeCell, renderDeviceTypeCell, renderFaultLevelCell } from '@/helpers';
|
||||||
import { useAlarmStore, useDeviceStore, useStationStore } from '@/stores';
|
import { useDeviceStore, useStationStore, useUnreadStore } from '@/stores';
|
||||||
import { downloadByData, parseErrorFeedback } from '@/utils';
|
import { downloadByData, parseErrorFeedback } from '@/utils';
|
||||||
import { useMutation } from '@tanstack/vue-query';
|
import { useMutation } from '@tanstack/vue-query';
|
||||||
import { watchDebounced } from '@vueuse/core';
|
import { watchDebounced } from '@vueuse/core';
|
||||||
@@ -44,10 +44,12 @@ const router = useRouter();
|
|||||||
|
|
||||||
const stationStore = useStationStore();
|
const stationStore = useStationStore();
|
||||||
const { stations } = storeToRefs(stationStore);
|
const { stations } = storeToRefs(stationStore);
|
||||||
|
|
||||||
const deviceStore = useDeviceStore();
|
const deviceStore = useDeviceStore();
|
||||||
const { lineDevices } = storeToRefs(deviceStore);
|
const { lineDevices } = storeToRefs(deviceStore);
|
||||||
const alarmStore = useAlarmStore();
|
|
||||||
const { unreadAlarmCount } = storeToRefs(alarmStore);
|
const unreadStore = useUnreadStore();
|
||||||
|
const { unreadAlarmCount } = storeToRefs(unreadStore);
|
||||||
|
|
||||||
const stationSelectOptions = computed<SelectOption[]>(() => {
|
const stationSelectOptions = computed<SelectOption[]>(() => {
|
||||||
return stations.value.map((station) => ({
|
return stations.value.map((station) => ({
|
||||||
|
|||||||
@@ -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 { NDM_ALARM_STORE_ID } from '@/constants';
|
||||||
import { tryGetDeviceType } from '@/enums';
|
|
||||||
import { defineStore } from 'pinia';
|
import { defineStore } from 'pinia';
|
||||||
import { computed, shallowRef, triggerRef } from 'vue';
|
import { shallowRef, triggerRef } from 'vue';
|
||||||
|
|
||||||
export const useAlarmStore = defineStore(
|
export const useAlarmStore = defineStore(
|
||||||
NDM_ALARM_STORE_ID,
|
NDM_ALARM_STORE_ID,
|
||||||
@@ -18,42 +17,10 @@ export const useAlarmStore = defineStore(
|
|||||||
triggerRef(lineAlarms);
|
triggerRef(lineAlarms);
|
||||||
};
|
};
|
||||||
|
|
||||||
// 全线所有车站的未读告警 (来自stomp订阅)
|
|
||||||
const unreadLineAlarms = shallowRef<LineAlarms>({});
|
|
||||||
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 {
|
return {
|
||||||
lineAlarms,
|
lineAlarms,
|
||||||
setLineAlarms,
|
setLineAlarms,
|
||||||
setStationAlarms,
|
setStationAlarms,
|
||||||
|
|
||||||
unreadLineAlarms,
|
|
||||||
unreadAlarmCount,
|
|
||||||
pushUnreadAlarm,
|
|
||||||
clearUnreadAlarms,
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,4 +3,5 @@ export * from './device';
|
|||||||
export * from './polling';
|
export * from './polling';
|
||||||
export * from './setting';
|
export * from './setting';
|
||||||
export * from './station';
|
export * from './station';
|
||||||
|
export * from './unread';
|
||||||
export * from './user';
|
export * from './user';
|
||||||
|
|||||||
44
src/stores/unread.ts
Normal file
44
src/stores/unread.ts
Normal file
@@ -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<LineAlarms>({});
|
||||||
|
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,
|
||||||
|
};
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user