import { getAllDevicesApi, initStationDevices, type Station } from '@/apis'; import { LINE_DEVICES_QUERY_KEY, STATION_DEVICES_MUTATION_KEY } from '@/constants'; import { useDeviceStore, useStationStore } from '@/stores'; import { parseErrorFeedback } from '@/utils'; import { CancelledError, useMutation, useQuery } from '@tanstack/vue-query'; import { isCancel } from 'axios'; import { storeToRefs } from 'pinia'; import { computed } from 'vue'; export const useStationDevicesMutation = () => { const deviceStore = useDeviceStore(); return useMutation({ mutationKey: [STATION_DEVICES_MUTATION_KEY], mutationFn: async (params: { station: Station; signal?: AbortSignal }) => { const { station, signal } = params; if (!station.online) { return initStationDevices(); } return await getAllDevicesApi({ stationCode: station.code, signal }); }, onSuccess: (devices, { station }) => { deviceStore.setStationDevices(station.code, devices); }, onError: (error) => { console.error(error); if (isCancel(error) || error instanceof CancelledError) return; const errorFeedback = parseErrorFeedback(error); window.$message.error(errorFeedback); }, }); }; /** * 由 `useLineStationsQuery` 显式触发 * @see [use-line-stations-query.ts](./use-line-stations-query.ts) */ export const useLineDevicesQuery = () => { const stationStore = useStationStore(); const { stations } = storeToRefs(stationStore); const { mutateAsync: getStationDevices } = useStationDevicesMutation(); return useQuery({ queryKey: computed(() => [LINE_DEVICES_QUERY_KEY]), enabled: false, queryFn: async ({ signal }) => { console.time(LINE_DEVICES_QUERY_KEY); for (const station of stations.value) { await getStationDevices({ station, signal }).catch(() => {}); } console.timeEnd(LINE_DEVICES_QUERY_KEY); return null; }, }); };