fix(vimp设备中心): 修正摄像头和告警的站点映射及区域码截取逻辑

- 重命名站点摄像头和告警的映射变量以提升代码可读性,存储API返回数据时将站点代码截断为前6位。
- 新增摄像头站点列表生成逻辑,通过摄像头国标码修复原始站点列表的匹配错误问题,同时调整区域码截取长度,列车站点使用3位长度,其他站点使用2位。
This commit is contained in:
yangsy
2026-05-29 20:15:02 +08:00
parent 7f5aa7bb82
commit c8eed3d2d1
3 changed files with 43 additions and 15 deletions
@@ -46,8 +46,8 @@ export const useDeviceCenterQuery = () => {
const codeOccAreas = (await axios.get<CodeArea[]>('/cdn/vimp/codes/codeOccAreas.json', config)).data; const codeOccAreas = (await axios.get<CodeArea[]>('/cdn/vimp/codes/codeOccAreas.json', config)).data;
const codeTrainAreas = buildTrainAreas(); const codeTrainAreas = buildTrainAreas();
const siteCamerasMap: Record<string, VimpChannel[]> = {}; const siteCamerasMapFromApi: Record<string, VimpChannel[]> = {};
const siteAlarmsMap: Record<string, VimpChannel[]> = {}; const siteAlarmsMapFromApi: Record<string, VimpChannel[]> = {};
const sitesFromApi = await catalogAllDeviceApi({ signal }); const sitesFromApi = await catalogAllDeviceApi({ signal });
if (!!sitesFromApi) { if (!!sitesFromApi) {
@@ -67,14 +67,15 @@ export const useDeviceCenterQuery = () => {
} }
}); });
siteCamerasMap[site.code] = cameras; const siteCode = site.code.substring(0, 6);
siteAlarmsMap[site.code] = alarms; siteCamerasMapFromApi[siteCode] = cameras;
siteAlarmsMapFromApi[siteCode] = alarms;
} }
} }
cameraStore.buildLineTabPanes({ cameraStore.buildLineTabPanes({
sitesFromApi, sitesFromApi,
siteCamerasMap, siteCamerasMapFromApi,
codeLines, codeLines,
codeSites, codeSites,
codeStationAreas, codeStationAreas,
@@ -85,7 +86,7 @@ export const useDeviceCenterQuery = () => {
alarmStore.buildLineTabPanes({ alarmStore.buildLineTabPanes({
sitesFromApi, sitesFromApi,
siteAlarmsMap, siteAlarmsMapFromApi,
codeLines, codeLines,
codeSites, codeSites,
codeStationAreas, codeStationAreas,
+4 -4
View File
@@ -7,7 +7,7 @@ import { SirenIcon } from 'lucide-vue-next';
interface BuildLineTabPanesParams { interface BuildLineTabPanesParams {
sitesFromApi: VimpStation[] | null; sitesFromApi: VimpStation[] | null;
siteAlarmsMap: Record<string, VimpChannel[]>; siteAlarmsMapFromApi: Record<string, VimpChannel[]>;
codeLines: CodeLines; codeLines: CodeLines;
codeSites: CodeSites; codeSites: CodeSites;
codeStationAreas: CodeArea[]; codeStationAreas: CodeArea[];
@@ -20,7 +20,7 @@ export const useAlarmStore = defineStore('vimp-alarm-store', () => {
const lineTabPanes = ref<AlarmLineTabPane[]>([]); const lineTabPanes = ref<AlarmLineTabPane[]>([]);
const buildLineTabPanes = (params: BuildLineTabPanesParams) => { 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) { if (!sitesFromApi) {
lineTabPanes.value = []; lineTabPanes.value = [];
return; return;
@@ -54,7 +54,7 @@ export const useAlarmStore = defineStore('vimp-alarm-store', () => {
_lineTabPanes.find((lineTabPane) => lineTabPane.lineCode === lineCode)?.alarmTree.push(siteNode); _lineTabPanes.find((lineTabPane) => lineTabPane.lineCode === lineCode)?.alarmTree.push(siteNode);
// 获取所有警报器 // 获取所有警报器
const alarms = siteAlarmsMap[site.code]; const alarms = siteAlarmsMapFromApi[siteCode];
if (!alarms || alarms.length === 0) continue; if (!alarms || alarms.length === 0) continue;
// 遍历警报器 // 遍历警报器
@@ -64,7 +64,7 @@ export const useAlarmStore = defineStore('vimp-alarm-store', () => {
const alarmSiteCode = alarmGbCode.substring(0, 6); const alarmSiteCode = alarmGbCode.substring(0, 6);
const alarmSiteType = codeSites[alarmSiteCode]?.type; const alarmSiteType = codeSites[alarmSiteCode]?.type;
const alarmAreaCode = alarmGbCode.substring(6, 11); const alarmAreaCode = alarmGbCode.substring(6, 11);
const alarmMainAreaCode = alarmAreaCode.slice(0, 2); const alarmMainAreaCode = alarmAreaCode.slice(0, alarmSiteType === 'train' ? 3 : 2);
// 构造车站/基地/OCC/车次区域 // 构造车站/基地/OCC/车次区域
let siteArea: CodeArea | undefined = undefined; let siteArea: CodeArea | undefined = undefined;
+32 -5
View File
@@ -6,10 +6,11 @@ import { NIcon } from 'naive-ui';
import BulletCamera from '../components/icon/bullet-camera.vue'; import BulletCamera from '../components/icon/bullet-camera.vue';
import PtzCamera from '../components/icon/ptz-camera.vue'; import PtzCamera from '../components/icon/ptz-camera.vue';
import HemiPtzCamera from '../components/icon/hemi-ptz-camera.vue'; import HemiPtzCamera from '../components/icon/hemi-ptz-camera.vue';
import { objectEntries } from '@vueuse/core';
interface BuildLineTabPanesParams { interface BuildLineTabPanesParams {
sitesFromApi: VimpStation[] | null; sitesFromApi: VimpStation[] | null;
siteCamerasMap: Record<string, VimpChannel[]>; siteCamerasMapFromApi: Record<string, VimpChannel[]>;
codeLines: CodeLines; codeLines: CodeLines;
codeSites: CodeSites; codeSites: CodeSites;
codeStationAreas: CodeArea[]; codeStationAreas: CodeArea[];
@@ -22,7 +23,7 @@ export const useCameraStore = defineStore('vimp-camera-store', () => {
const lineTabPanes = ref<CameraLineTabPane[]>([]); const lineTabPanes = ref<CameraLineTabPane[]>([]);
const buildLineTabPanes = (params: BuildLineTabPanesParams) => { 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) { if (!sitesFromApi) {
lineTabPanes.value = []; lineTabPanes.value = [];
return; return;
@@ -39,8 +40,34 @@ export const useCameraStore = defineStore('vimp-camera-store', () => {
}); });
} }
// 从 /allDevice 接口获取的站点信息并不保证真实性和完整性,
// 例如有一个站点的编码是 010699 开头,但是其下的通道是 010199 和 010599 开头,
// 而 010699 是一个不存在的站点编码,所以需要基于通道的编码来确定所有的站点。
const sites: VimpStation[] = [];
const siteCamerasMap: Record<string, VimpChannel[]> = {};
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 siteCode = site.code.substring(0, 6);
const siteName = codeSites[siteCode]?.name; const siteName = codeSites[siteCode]?.name;
if (!siteName) continue; if (!siteName) continue;
@@ -56,7 +83,7 @@ export const useCameraStore = defineStore('vimp-camera-store', () => {
_lineTabPanes.find((lineTabPane) => lineTabPane.lineCode === lineCode)?.cameraTree.push(siteNode); _lineTabPanes.find((lineTabPane) => lineTabPane.lineCode === lineCode)?.cameraTree.push(siteNode);
// 获取所有摄像机 // 获取所有摄像机
const cameras = siteCamerasMap[site.code]; const cameras = siteCamerasMap[siteCode];
if (!cameras || cameras.length === 0) continue; if (!cameras || cameras.length === 0) continue;
// 遍历摄像机 // 遍历摄像机
@@ -66,7 +93,7 @@ export const useCameraStore = defineStore('vimp-camera-store', () => {
const cameraSiteCode = cameraGbCode.substring(0, 6); const cameraSiteCode = cameraGbCode.substring(0, 6);
const cameraSiteType = codeSites[cameraSiteCode]?.type; const cameraSiteType = codeSites[cameraSiteCode]?.type;
const cameraAreaCode = cameraGbCode.substring(6, 11); const cameraAreaCode = cameraGbCode.substring(6, 11);
const cameraMainAreaCode = cameraAreaCode.slice(0, 2); const cameraMainAreaCode = cameraAreaCode.slice(0, cameraSiteType === 'train' ? 3 : 2);
// 构造车站/基地/OCC/车次区域 // 构造车站/基地/OCC/车次区域
let siteArea: CodeArea | undefined = undefined; let siteArea: CodeArea | undefined = undefined;