From c8eed3d2d1a52f76fbc0c88d66aeda2e46904d04 Mon Sep 17 00:00:00 2001 From: yangsy Date: Fri, 29 May 2026 20:15:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(vimp=E8=AE=BE=E5=A4=87=E4=B8=AD=E5=BF=83):?= =?UTF-8?q?=20=E4=BF=AE=E6=AD=A3=E6=91=84=E5=83=8F=E5=A4=B4=E5=92=8C?= =?UTF-8?q?=E5=91=8A=E8=AD=A6=E7=9A=84=E7=AB=99=E7=82=B9=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E5=8F=8A=E5=8C=BA=E5=9F=9F=E7=A0=81=E6=88=AA=E5=8F=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重命名站点摄像头和告警的映射变量以提升代码可读性,存储API返回数据时将站点代码截断为前6位。 - 新增摄像头站点列表生成逻辑,通过摄像头国标码修复原始站点列表的匹配错误问题,同时调整区域码截取长度,列车站点使用3位长度,其他站点使用2位。 --- .../query/use-device-center-query.ts | 13 ++++--- src/pages/vimp/stores/alarm.ts | 8 ++-- src/pages/vimp/stores/camera.ts | 37 ++++++++++++++++--- 3 files changed, 43 insertions(+), 15 deletions(-) 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 a7b3dd5..de9fd04 100644 --- a/src/pages/vimp/composables/query/use-device-center-query.ts +++ b/src/pages/vimp/composables/query/use-device-center-query.ts @@ -46,8 +46,8 @@ export const useDeviceCenterQuery = () => { const codeOccAreas = (await axios.get('/cdn/vimp/codes/codeOccAreas.json', config)).data; const codeTrainAreas = buildTrainAreas(); - const siteCamerasMap: Record = {}; - const siteAlarmsMap: Record = {}; + const siteCamerasMapFromApi: Record = {}; + const siteAlarmsMapFromApi: Record = {}; const sitesFromApi = await catalogAllDeviceApi({ signal }); if (!!sitesFromApi) { @@ -67,14 +67,15 @@ export const useDeviceCenterQuery = () => { } }); - siteCamerasMap[site.code] = cameras; - siteAlarmsMap[site.code] = alarms; + const siteCode = site.code.substring(0, 6); + siteCamerasMapFromApi[siteCode] = cameras; + siteAlarmsMapFromApi[siteCode] = alarms; } } cameraStore.buildLineTabPanes({ sitesFromApi, - siteCamerasMap, + siteCamerasMapFromApi, codeLines, codeSites, codeStationAreas, @@ -85,7 +86,7 @@ export const useDeviceCenterQuery = () => { alarmStore.buildLineTabPanes({ sitesFromApi, - siteAlarmsMap, + siteAlarmsMapFromApi, codeLines, codeSites, codeStationAreas, diff --git a/src/pages/vimp/stores/alarm.ts b/src/pages/vimp/stores/alarm.ts index ba8e9b7..3e0ac3f 100644 --- a/src/pages/vimp/stores/alarm.ts +++ b/src/pages/vimp/stores/alarm.ts @@ -7,7 +7,7 @@ import { SirenIcon } from 'lucide-vue-next'; interface BuildLineTabPanesParams { sitesFromApi: VimpStation[] | null; - siteAlarmsMap: Record; + siteAlarmsMapFromApi: Record; codeLines: CodeLines; codeSites: CodeSites; codeStationAreas: CodeArea[]; @@ -20,7 +20,7 @@ export const useAlarmStore = defineStore('vimp-alarm-store', () => { const lineTabPanes = ref([]); const buildLineTabPanes = (params: BuildLineTabPanesParams) => { - const { sitesFromApi, siteAlarmsMap, codeLines, codeSites, codeStationAreas, codeParkingAreas, codeOccAreas, codeTrainAreas } = params; + const { sitesFromApi, siteAlarmsMapFromApi, codeLines, codeSites, codeStationAreas, codeParkingAreas, codeOccAreas, codeTrainAreas } = params; if (!sitesFromApi) { lineTabPanes.value = []; return; @@ -54,7 +54,7 @@ export const useAlarmStore = defineStore('vimp-alarm-store', () => { _lineTabPanes.find((lineTabPane) => lineTabPane.lineCode === lineCode)?.alarmTree.push(siteNode); // 获取所有警报器 - const alarms = siteAlarmsMap[site.code]; + const alarms = siteAlarmsMapFromApi[siteCode]; if (!alarms || alarms.length === 0) continue; // 遍历警报器 @@ -64,7 +64,7 @@ export const useAlarmStore = defineStore('vimp-alarm-store', () => { const alarmSiteCode = alarmGbCode.substring(0, 6); const alarmSiteType = codeSites[alarmSiteCode]?.type; const alarmAreaCode = alarmGbCode.substring(6, 11); - const alarmMainAreaCode = alarmAreaCode.slice(0, 2); + const alarmMainAreaCode = alarmAreaCode.slice(0, alarmSiteType === 'train' ? 3 : 2); // 构造车站/基地/OCC/车次区域 let siteArea: CodeArea | undefined = undefined; diff --git a/src/pages/vimp/stores/camera.ts b/src/pages/vimp/stores/camera.ts index d04762f..f7b5112 100644 --- a/src/pages/vimp/stores/camera.ts +++ b/src/pages/vimp/stores/camera.ts @@ -6,10 +6,11 @@ import { NIcon } from 'naive-ui'; import BulletCamera from '../components/icon/bullet-camera.vue'; import PtzCamera from '../components/icon/ptz-camera.vue'; import HemiPtzCamera from '../components/icon/hemi-ptz-camera.vue'; +import { objectEntries } from '@vueuse/core'; interface BuildLineTabPanesParams { sitesFromApi: VimpStation[] | null; - siteCamerasMap: Record; + siteCamerasMapFromApi: Record; codeLines: CodeLines; codeSites: CodeSites; codeStationAreas: CodeArea[]; @@ -22,7 +23,7 @@ export const useCameraStore = defineStore('vimp-camera-store', () => { const lineTabPanes = ref([]); const buildLineTabPanes = (params: BuildLineTabPanesParams) => { - const { sitesFromApi, siteCamerasMap, codeLines, codeSites, codeStationAreas, codeParkingAreas, codeOccAreas, codeTrainAreas } = params; + const { sitesFromApi, siteCamerasMapFromApi, codeLines, codeSites, codeStationAreas, codeParkingAreas, codeOccAreas, codeTrainAreas } = params; if (!sitesFromApi) { lineTabPanes.value = []; return; @@ -39,8 +40,34 @@ export const useCameraStore = defineStore('vimp-camera-store', () => { }); } + // 从 /allDevice 接口获取的站点信息并不保证真实性和完整性, + // 例如有一个站点的编码是 010699 开头,但是其下的通道是 010199 和 010599 开头, + // 而 010699 是一个不存在的站点编码,所以需要基于通道的编码来确定所有的站点。 + const sites: VimpStation[] = []; + const siteCamerasMap: Record = {}; + objectEntries(siteCamerasMapFromApi).forEach(([siteFullCode, cameras]) => { + const siteCode = siteFullCode.substring(0, 6); + for (const camera of cameras) { + const { code: cameraGbCode } = camera; + const cameraSiteCode = cameraGbCode.substring(0, 6); + + if (!(cameraSiteCode in siteCamerasMap)) { + siteCamerasMap[cameraSiteCode] = []; + } + siteCamerasMap[cameraSiteCode]?.push(camera); + + if (!(cameraSiteCode in codeSites)) continue; + if (sites.some((site) => site.code === cameraSiteCode)) continue; + sites.push({ + code: cameraSiteCode, + name: codeSites[cameraSiteCode]?.name ?? '', + online: sitesFromApi.find((site) => site.code.substring(0, 6) === siteCode)?.online ?? false, + }); + } + }); + // 遍历所有站点 - for (const site of sitesFromApi) { + for (const site of sites) { const siteCode = site.code.substring(0, 6); const siteName = codeSites[siteCode]?.name; if (!siteName) continue; @@ -56,7 +83,7 @@ export const useCameraStore = defineStore('vimp-camera-store', () => { _lineTabPanes.find((lineTabPane) => lineTabPane.lineCode === lineCode)?.cameraTree.push(siteNode); // 获取所有摄像机 - const cameras = siteCamerasMap[site.code]; + const cameras = siteCamerasMap[siteCode]; if (!cameras || cameras.length === 0) continue; // 遍历摄像机 @@ -66,7 +93,7 @@ export const useCameraStore = defineStore('vimp-camera-store', () => { const cameraSiteCode = cameraGbCode.substring(0, 6); const cameraSiteType = codeSites[cameraSiteCode]?.type; const cameraAreaCode = cameraGbCode.substring(6, 11); - const cameraMainAreaCode = cameraAreaCode.slice(0, 2); + const cameraMainAreaCode = cameraAreaCode.slice(0, cameraSiteType === 'train' ? 3 : 2); // 构造车站/基地/OCC/车次区域 let siteArea: CodeArea | undefined = undefined;