fix(device-center-query): 简化并修正设备站点与通道的处理逻辑
原先的逻辑先按API返回的站点分组通道,再通过通道编码重建站点列表,存在冗余且可能出错。现在改为单次循环直接基于通道编码生成正确的站点,并按站点分组相机和告警通道,同时完善了相关注释说明。
This commit is contained in:
@@ -48,59 +48,40 @@ export const useDeviceCenterQuery = () => {
|
|||||||
|
|
||||||
const sitesFromApi = await catalogAllDeviceApi({ signal });
|
const sitesFromApi = await catalogAllDeviceApi({ signal });
|
||||||
|
|
||||||
const siteCamerasMapFromApi = new Map<string, VimpChannel[]>();
|
|
||||||
const siteAlarmsMapFromApi = new Map<string, VimpChannel[]>();
|
|
||||||
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 接口获取的站点信息并不保证真实性和完整性,
|
// 从 /allDevice 接口获取的站点信息并不保证真实性和完整性,
|
||||||
// 例如有一个站点的编码是 010699 开头,但是其下的通道是 010199 和 010599 开头,
|
// 例如有一个站点的编码是 010699 开头,但是其下的通道是 010199 和 010599 开头,
|
||||||
// 而 010699 是一个不存在的站点编码,所以需要基于通道的编码来确定所有的站点。
|
// 而 010699 是一个不存在的站点编码,所以需要基于通道的编码来确定所有的站点。
|
||||||
const sites: VimpStation[] = [];
|
const sites: VimpStation[] = [];
|
||||||
const siteCamerasMap = new Map<string, VimpChannel[]>();
|
const siteCamerasMap = new Map<string, VimpChannel[]>();
|
||||||
const siteOnlineMap = new Map<string, boolean>();
|
const siteAlarmsMap = new Map<string, VimpChannel[]>();
|
||||||
(sitesFromApi ?? []).forEach((site) => siteOnlineMap.set(site.code.substring(0, 6), site.online));
|
|
||||||
const builtSitesSet = new Set<string>();
|
for (const siteFromApi of sitesFromApi ?? []) {
|
||||||
siteCamerasMapFromApi.forEach((cameras, siteCode) => {
|
const channels = await catalogChannelApi(siteFromApi.code, { signal });
|
||||||
for (const camera of cameras) {
|
if (!channels || channels.length === 0) continue;
|
||||||
const { code: cameraGbCode } = camera;
|
|
||||||
const cameraSiteCode = cameraGbCode.substring(0, 6);
|
channels.forEach((channel) => {
|
||||||
// 聚合同一站点的摄像机
|
const siteCode = channel.code.substring(0, 6);
|
||||||
if (!siteCamerasMap.has(cameraSiteCode)) {
|
if (siteCode in codeSites && !sites.some((site) => site.code === siteCode)) {
|
||||||
siteCamerasMap.set(cameraSiteCode, []);
|
sites.push({
|
||||||
|
code: siteCode,
|
||||||
|
name: codeSites[siteCode]?.name ?? '',
|
||||||
|
online: siteFromApi.online,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
siteCamerasMap.get(cameraSiteCode)!.push(camera);
|
const typeCode = Number(channel.code.substring(11, 14));
|
||||||
// 如果码表中不存在该站点则跳过
|
if (typeCode >= 4 && typeCode <= 6) {
|
||||||
if (!(cameraSiteCode in codeSites)) continue;
|
if (!siteCamerasMap.has(siteCode)) {
|
||||||
// 如果该站点已被添加则跳过
|
siteCamerasMap.set(siteCode, []);
|
||||||
if (builtSitesSet.has(cameraSiteCode)) continue;
|
}
|
||||||
// 添加该站点到站点列表
|
siteCamerasMap.get(siteCode)!.push(channel);
|
||||||
sites.push({
|
} else if ((typeCode >= 101 && typeCode <= 108) || (typeCode >= 810 && typeCode <= 815)) {
|
||||||
code: cameraSiteCode,
|
if (!siteAlarmsMap.has(siteCode)) {
|
||||||
name: codeSites[cameraSiteCode]?.name ?? '',
|
siteAlarmsMap.set(siteCode, []);
|
||||||
// 要用 siteCode,而不是 cameraSiteCode,
|
}
|
||||||
// 因为 siteCode 是 010699,cameraSiteCode 是 010199 和 010599,
|
siteAlarmsMap.get(siteCode)!.push(channel);
|
||||||
// 我们要将 010699 的状态分派给 010199 和 010599
|
}
|
||||||
online: siteOnlineMap.get(siteCode) ?? false,
|
});
|
||||||
});
|
}
|
||||||
// 标记该站点已被添加
|
|
||||||
builtSitesSet.add(cameraSiteCode);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
cameraStore.buildLineTabPanes({
|
cameraStore.buildLineTabPanes({
|
||||||
sites,
|
sites,
|
||||||
|
|||||||
Reference in New Issue
Block a user