From 6f14370751a0915d1492905014e4c8d40bd1b14b Mon Sep 17 00:00:00 2001 From: yangsy Date: Mon, 8 Jun 2026 13:38:38 +0800 Subject: [PATCH] =?UTF-8?q?refactor(vimp):=20=E6=8B=86=E5=88=86=E7=AB=99?= =?UTF-8?q?=E7=82=B9=E6=A8=A1=E5=9E=8B=E4=B8=BA=20VimpRawSite=20/=20VimpSi?= =?UTF-8?q?te=20=E5=B9=B6=E5=BD=92=E4=B8=80=E5=8C=96=20online=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 VimpStation 重命名为 VimpSite,统一"站点"语义贯穿全模块 - 新增 VimpRawSite 表示 /catalog/allDevice 接口原样数据,online 字段可选 - 抽离 normalizeVimpSite 纯函数,集中处理 online 字段缺失时的默认值 - catalogAllDeviceApi 入参改为 VimpRawSite[],出参统一归一化为 VimpSite[] | null - 下游 store、composable、树节点类型同步从 VimpStation 切换到 VimpSite - 内部业务模型保持 online: boolean 必填,避免缺失字段沿调用链向下传播 --- src/pages/vimp/apis/model/index.ts | 2 +- src/pages/vimp/apis/model/vimp-site.ts | 17 +++++++++++++++++ src/pages/vimp/apis/model/vimp-station.ts | 5 ----- .../vimp/apis/request/catalog.all-device.ts | 6 +++--- .../query/use-device-center-query.ts | 8 ++++---- src/pages/vimp/stores/alarm.ts | 4 ++-- src/pages/vimp/stores/camera.ts | 4 ++-- src/pages/vimp/types/device-tree.ts | 14 +++++++------- 8 files changed, 36 insertions(+), 24 deletions(-) create mode 100644 src/pages/vimp/apis/model/vimp-site.ts delete mode 100644 src/pages/vimp/apis/model/vimp-station.ts diff --git a/src/pages/vimp/apis/model/index.ts b/src/pages/vimp/apis/model/index.ts index e9c03f7..eb2ae15 100644 --- a/src/pages/vimp/apis/model/index.ts +++ b/src/pages/vimp/apis/model/index.ts @@ -1,2 +1,2 @@ export * from './vimp-channel'; -export * from './vimp-station'; +export * from './vimp-site'; diff --git a/src/pages/vimp/apis/model/vimp-site.ts b/src/pages/vimp/apis/model/vimp-site.ts new file mode 100644 index 0000000..02ed723 --- /dev/null +++ b/src/pages/vimp/apis/model/vimp-site.ts @@ -0,0 +1,17 @@ +export interface VimpRawSite { + code: string; + name: string; + online?: boolean; +} + +export interface VimpSite { + code: string; + name: string; + online: boolean; +} + +export const normalizeVimpSite = (site: VimpRawSite): VimpSite => ({ + code: site.code, + name: site.name, + online: site.online ?? true, +}); diff --git a/src/pages/vimp/apis/model/vimp-station.ts b/src/pages/vimp/apis/model/vimp-station.ts deleted file mode 100644 index 6891af8..0000000 --- a/src/pages/vimp/apis/model/vimp-station.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface VimpStation { - code: string; - name: string; - online: boolean; -} diff --git a/src/pages/vimp/apis/request/catalog.all-device.ts b/src/pages/vimp/apis/request/catalog.all-device.ts index df28213..959e99a 100644 --- a/src/pages/vimp/apis/request/catalog.all-device.ts +++ b/src/pages/vimp/apis/request/catalog.all-device.ts @@ -1,11 +1,11 @@ import { unwrapVimpResponse, vimpClient } from '../client'; -import type { VimpStation } from '../model'; +import { normalizeVimpSite, type VimpRawSite } from '../model'; export const catalogAllDeviceApi = async (options?: { signal?: AbortSignal }) => { const { signal } = options ?? {}; const client = vimpClient; const endpoint = `/catalog/allDevice`; - const resp = await client.post(endpoint, {}, { signal }); + const resp = await client.post(endpoint, {}, { signal }); const data = unwrapVimpResponse(resp); - return data; + return data?.map(normalizeVimpSite) ?? null; }; diff --git a/src/pages/vimp/composables/query/use-device-center-query.ts b/src/pages/vimp/composables/query/use-device-center-query.ts index 15ff5c8..982b53f 100644 --- a/src/pages/vimp/composables/query/use-device-center-query.ts +++ b/src/pages/vimp/composables/query/use-device-center-query.ts @@ -4,7 +4,7 @@ import type { AxiosRequestConfig } from 'axios'; import axios from 'axios'; import { compileCodeAreas, type CodeArea, type CodeLines, type CodeSites } from '../../types'; import { useCameraStore, useAlarmStore } from '../../stores'; -import { catalogAllDeviceApi, catalogChannelApi, type VimpChannel, type VimpStation } from '../../apis'; +import { catalogAllDeviceApi, catalogChannelApi, type VimpChannel, type VimpSite } from '../../apis'; const config: AxiosRequestConfig = { headers: { @@ -35,7 +35,7 @@ const compareByCode = (a: T, b: T) => { if (a.code > b.code) return 1; return 0; }; -const sortSitesByCode = (sites: VimpStation[]) => { +const sortSitesByCode = (sites: VimpSite[]) => { sites.sort(compareByCode); }; const sortChannelsMapByCode = (siteCodeToChannelsMap: Map) => { @@ -73,8 +73,8 @@ export const useDeviceCenterQuery = () => { // 从 /allDevice 接口获取的站点信息并不保证真实性和完整性, // 例如有一个站点的编码是 010699 开头,但是其下的通道是 010199 和 010599 开头, // 而 010699 是一个不存在的站点编码,所以需要基于通道的编码来确定所有的站点。 - const cameraSites: VimpStation[] = []; - const alarmSites: VimpStation[] = []; + const cameraSites: VimpSite[] = []; + const alarmSites: VimpSite[] = []; const cameraBuiltSitesSet = new Set(); const alarmBuiltSitesSet = new Set(); const siteCodeToCamerasMap = new Map(); diff --git a/src/pages/vimp/stores/alarm.ts b/src/pages/vimp/stores/alarm.ts index 9c65fa0..a98bf8f 100644 --- a/src/pages/vimp/stores/alarm.ts +++ b/src/pages/vimp/stores/alarm.ts @@ -1,10 +1,10 @@ import { defineStore } from 'pinia'; -import type { VimpChannel, VimpStation } from '../apis'; +import type { VimpChannel, VimpSite } from '../apis'; import { shallowRef } from 'vue'; import type { AlarmMainAreaNodeOption, AlarmNodeOption, CodeLines, CodeSites, AlarmLineTabPane, AlarmSiteNodeOption, AlarmSubAreaNodeOption, CompiledCodeAreas } from '../types'; interface BuildLineTabPanesParams { - sites: VimpStation[]; + sites: VimpSite[]; siteCodeToAlarmsMap: Map; codeLines: CodeLines; codeSites: CodeSites; diff --git a/src/pages/vimp/stores/camera.ts b/src/pages/vimp/stores/camera.ts index a847433..8924b63 100644 --- a/src/pages/vimp/stores/camera.ts +++ b/src/pages/vimp/stores/camera.ts @@ -1,10 +1,10 @@ import { defineStore } from 'pinia'; -import type { VimpChannel, VimpStation } from '../apis'; +import type { VimpChannel, VimpSite } from '../apis'; import { shallowRef } from 'vue'; import type { CameraMainAreaNodeOption, CameraNodeOption, CodeLines, CodeSites, CameraLineTabPane, CameraSiteNodeOption, CameraSubAreaNodeOption, CompiledCodeAreas } from '../types'; interface BuildLineTabPanesParams { - sites: VimpStation[]; + sites: VimpSite[]; siteCodeToCamerasMap: Map; codeLines: CodeLines; codeSites: CodeSites; diff --git a/src/pages/vimp/types/device-tree.ts b/src/pages/vimp/types/device-tree.ts index 87824a5..640d9ed 100644 --- a/src/pages/vimp/types/device-tree.ts +++ b/src/pages/vimp/types/device-tree.ts @@ -1,5 +1,5 @@ import type { TabPaneProps, TreeOption } from 'naive-ui'; -import type { VimpChannel, VimpStation } from '../apis/model'; +import type { VimpChannel, VimpSite } from '../apis/model'; export type SiteType = 'station' | 'parking' | 'occ' | 'train'; export type CodeLines = Record; @@ -57,20 +57,20 @@ export interface CountStats { export interface CameraNodeOption extends TreeOption { camera: VimpChannel; type: string; - site: VimpStation; + site: VimpSite; } export interface CameraSubAreaNodeOption extends TreeOption { children?: CameraNodeOption[]; stats: CountStats; - site: VimpStation; + site: VimpSite; areaLevel: 2; } export interface CameraMainAreaNodeOption extends TreeOption { children?: CameraSubAreaNodeOption[]; stats: CountStats; - site: VimpStation; + site: VimpSite; areaLevel: 1; } @@ -104,20 +104,20 @@ export interface CameraLineTabPane extends TabPaneProps { export interface AlarmNodeOption extends TreeOption { alarm: VimpChannel; type: string; - site: VimpStation; + site: VimpSite; } export interface AlarmSubAreaNodeOption extends TreeOption { children?: AlarmNodeOption[]; stats: CountStats; - site: VimpStation; + site: VimpSite; areaLevel: 2; } export interface AlarmMainAreaNodeOption extends TreeOption { children?: AlarmSubAreaNodeOption[]; stats: CountStats; - site: VimpStation; + site: VimpSite; areaLevel: 1; }