From 176e35609fb90e0e34fb2aa6794d5cf8722abe53 Mon Sep 17 00:00:00 2001 From: yangsy Date: Sat, 30 May 2026 22:02:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(device-center-query):=20=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E6=AD=A3=E8=AE=BE=E5=A4=87=E7=AB=99=E7=82=B9?= =?UTF-8?q?=E4=B8=8E=E9=80=9A=E9=81=93=E7=9A=84=E5=A4=84=E7=90=86=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返回的站点分组通道,再通过通道编码重建站点列表,存在冗余且可能出错。现在改为单次循环直接基于通道编码生成正确的站点,并按站点分组相机和告警通道,同时完善了相关注释说明。 --- .../query/use-device-center-query.ts | 75 +++++++------------ 1 file changed, 28 insertions(+), 47 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 cbbbd2b..f882f3e 100644 --- a/src/pages/vimp/composables/query/use-device-center-query.ts +++ b/src/pages/vimp/composables/query/use-device-center-query.ts @@ -48,59 +48,40 @@ export const useDeviceCenterQuery = () => { const sitesFromApi = await catalogAllDeviceApi({ signal }); - const siteCamerasMapFromApi = new Map(); - const siteAlarmsMapFromApi = new Map(); - for (const site of sitesFromApi ?? []) { - const channels = await catalogChannelApi(site.code, { signal }); - if (!channels || channels.length === 0) continue; - const cameras: VimpChannel[] = []; - const alarms: VimpChannel[] = []; - channels.forEach((channel) => { - const typeCode = Number(channel.code.substring(11, 14)); - if (typeCode >= 4 && typeCode <= 6) { - cameras.push(channel); - } else if ((typeCode >= 101 && typeCode <= 108) || (typeCode >= 810 && typeCode <= 815)) { - alarms.push(channel); - } - }); - const siteCode = site.code.substring(0, 6); - siteCamerasMapFromApi.set(siteCode, cameras); - siteAlarmsMapFromApi.set(siteCode, alarms); - } // 从 /allDevice 接口获取的站点信息并不保证真实性和完整性, // 例如有一个站点的编码是 010699 开头,但是其下的通道是 010199 和 010599 开头, // 而 010699 是一个不存在的站点编码,所以需要基于通道的编码来确定所有的站点。 const sites: VimpStation[] = []; const siteCamerasMap = new Map(); - const siteOnlineMap = new Map(); - (sitesFromApi ?? []).forEach((site) => siteOnlineMap.set(site.code.substring(0, 6), site.online)); - const builtSitesSet = new Set(); - siteCamerasMapFromApi.forEach((cameras, siteCode) => { - for (const camera of cameras) { - const { code: cameraGbCode } = camera; - const cameraSiteCode = cameraGbCode.substring(0, 6); - // 聚合同一站点的摄像机 - if (!siteCamerasMap.has(cameraSiteCode)) { - siteCamerasMap.set(cameraSiteCode, []); + const siteAlarmsMap = new Map(); + + for (const siteFromApi of sitesFromApi ?? []) { + const channels = await catalogChannelApi(siteFromApi.code, { signal }); + if (!channels || channels.length === 0) continue; + + channels.forEach((channel) => { + const siteCode = channel.code.substring(0, 6); + if (siteCode in codeSites && !sites.some((site) => site.code === siteCode)) { + sites.push({ + code: siteCode, + name: codeSites[siteCode]?.name ?? '', + online: siteFromApi.online, + }); } - siteCamerasMap.get(cameraSiteCode)!.push(camera); - // 如果码表中不存在该站点则跳过 - if (!(cameraSiteCode in codeSites)) continue; - // 如果该站点已被添加则跳过 - if (builtSitesSet.has(cameraSiteCode)) continue; - // 添加该站点到站点列表 - sites.push({ - code: cameraSiteCode, - name: codeSites[cameraSiteCode]?.name ?? '', - // 要用 siteCode,而不是 cameraSiteCode, - // 因为 siteCode 是 010699,cameraSiteCode 是 010199 和 010599, - // 我们要将 010699 的状态分派给 010199 和 010599 - online: siteOnlineMap.get(siteCode) ?? false, - }); - // 标记该站点已被添加 - builtSitesSet.add(cameraSiteCode); - } - }); + const typeCode = Number(channel.code.substring(11, 14)); + if (typeCode >= 4 && typeCode <= 6) { + if (!siteCamerasMap.has(siteCode)) { + siteCamerasMap.set(siteCode, []); + } + siteCamerasMap.get(siteCode)!.push(channel); + } else if ((typeCode >= 101 && typeCode <= 108) || (typeCode >= 810 && typeCode <= 815)) { + if (!siteAlarmsMap.has(siteCode)) { + siteAlarmsMap.set(siteCode, []); + } + siteAlarmsMap.get(siteCode)!.push(channel); + } + }); + } cameraStore.buildLineTabPanes({ sites,