91 lines
2.9 KiB
TypeScript
91 lines
2.9 KiB
TypeScript
import { initStationAlarms, pageDeviceAlarmLogApi, type Station } from '@/apis';
|
|
import { LINE_ALARMS_QUERY_KEY, STATION_ALARMS_MUTATION_KEY } from '@/constants';
|
|
import { tryGetDeviceType } from '@/enums';
|
|
import { useAlarmStore, usePermissionStore } from '@/stores';
|
|
import { parseErrorFeedback } from '@/utils';
|
|
import { CancelledError, useMutation, useQuery } from '@tanstack/vue-query';
|
|
import { isCancel } from 'axios';
|
|
import dayjs from 'dayjs';
|
|
import { computed } from 'vue';
|
|
|
|
export const useStationAlarmsMutation = () => {
|
|
const alarmStore = useAlarmStore();
|
|
|
|
return useMutation({
|
|
mutationKey: [STATION_ALARMS_MUTATION_KEY],
|
|
mutationFn: async (params: { station: Station; signal?: AbortSignal }) => {
|
|
const { station, signal } = params;
|
|
const stationAlarms = initStationAlarms();
|
|
if (!station.online) {
|
|
return stationAlarms;
|
|
}
|
|
const now = dayjs();
|
|
const todayStart = now.startOf('date').valueOf();
|
|
const todayEnd = now.endOf('date').valueOf();
|
|
const { records } = await pageDeviceAlarmLogApi(
|
|
{
|
|
model: {
|
|
stationCode: station.code,
|
|
},
|
|
extra: {
|
|
alarmDate_ge: todayStart,
|
|
alarmDate_le: todayEnd,
|
|
},
|
|
size: 50000,
|
|
current: 1,
|
|
sort: 'alarmDate',
|
|
order: 'descending',
|
|
},
|
|
{
|
|
stationCode: station.code,
|
|
signal,
|
|
},
|
|
);
|
|
for (const alarm of records) {
|
|
const { deviceType: deviceTypeCode } = alarm;
|
|
const deviceType = tryGetDeviceType(deviceTypeCode);
|
|
if (!!deviceType) {
|
|
stationAlarms[deviceType].unshift(alarm);
|
|
}
|
|
}
|
|
stationAlarms['unclassified'] = records;
|
|
return stationAlarms;
|
|
},
|
|
onSuccess: (stationAlarms, { station }) => {
|
|
alarmStore.setStationAlarms(station.code, stationAlarms);
|
|
},
|
|
onError: (error) => {
|
|
if (isCancel(error) || error instanceof CancelledError) return;
|
|
console.error(error);
|
|
const errorFeedback = parseErrorFeedback(error);
|
|
window.$message.error(errorFeedback);
|
|
},
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 由 `useLineStationsQuery` 显式触发
|
|
* @see [use-line-stations-query.ts](./use-line-stations-query.ts)
|
|
*/
|
|
export const useLineAlarmsQuery = () => {
|
|
const permissionStore = usePermissionStore();
|
|
const stations = computed(() => permissionStore.stations.VIEW ?? []);
|
|
|
|
const { mutateAsync: getStationAlarms } = useStationAlarmsMutation();
|
|
|
|
return useQuery({
|
|
queryKey: computed(() => [LINE_ALARMS_QUERY_KEY]),
|
|
enabled: false,
|
|
queryFn: async ({ signal }) => {
|
|
const startTime = performance.now();
|
|
for (const station of stations.value) {
|
|
await getStationAlarms({ station, signal }).catch(() => {});
|
|
}
|
|
const endTime = performance.now();
|
|
console.log(`${LINE_ALARMS_QUERY_KEY}: ${endTime - startTime} ms`);
|
|
|
|
return null;
|
|
},
|
|
});
|
|
};
|