refactor: 重构NVR集群处理逻辑,优化设备树展示
抽离NVR集群相关的公共工具函数,重构isNvrCluster的实现逻辑。修复原有设备树中NVR分组的逻辑错误,原本会将所有单机NVR添加到每个集群的子节点中,现在会正确将单机NVR分配到对应集群,未归属的单机NVR作为独立节点。简化设备树组件的代码,统一使用封装后的工具方法处理集群分组。修复设备定位时的集群匹配逻辑,使用更准确的IP包含判断。初始化设备树数据的默认空值,修正类型定义错误。
This commit is contained in:
@@ -1,8 +1,56 @@
|
||||
import type { NdmNvrResultVO } from '@/apis';
|
||||
|
||||
// 解析 clusterList 字段
|
||||
export const parseIpListFromClusterList = (nvr: NdmNvrResultVO) => {
|
||||
const ipList = (nvr.clusterList ?? '').split(';');
|
||||
return ipList.map((ip) => ip.trim()).filter((ip) => !!ip);
|
||||
};
|
||||
|
||||
export const isNvrCluster = (maybeNvrCluster: NdmNvrResultVO) => {
|
||||
const { ipAddress, clusterList } = maybeNvrCluster;
|
||||
if (!clusterList?.trim()) return false;
|
||||
if (clusterList === ipAddress) return false;
|
||||
const { ipAddress } = maybeNvrCluster;
|
||||
const ipList = parseIpListFromClusterList(maybeNvrCluster);
|
||||
if (ipList.length === 0) return false;
|
||||
if (ipList.length === 1 && ipList.at(0) === ipAddress) return false;
|
||||
return true;
|
||||
};
|
||||
|
||||
export const nvrInCluster = (nvr: NdmNvrResultVO, cluster: NdmNvrResultVO) => {
|
||||
const { ipAddress } = nvr;
|
||||
if (!ipAddress) return false;
|
||||
const ipList = parseIpListFromClusterList(cluster);
|
||||
return ipList.includes(ipAddress);
|
||||
};
|
||||
|
||||
export const createNvrClusterRelationship = (nvrDevices: NdmNvrResultVO[]) => {
|
||||
const nvrClusters = nvrDevices.filter((nvr) => isNvrCluster(nvr));
|
||||
const nvrNotClusters = nvrDevices.filter((nvr) => !isNvrCluster(nvr));
|
||||
const nodedNvrIpAddressSet = new Set<string | null>();
|
||||
const nvrStandalones: NdmNvrResultVO[] = [];
|
||||
const nvrTreeMap = new Map<string, NdmNvrResultVO[]>();
|
||||
// 遍历所有非集群录像机,将它们分配到对应的录像机集群中
|
||||
for (const nvr of nvrNotClusters) {
|
||||
for (const cluster of nvrClusters) {
|
||||
if (nvrInCluster(nvr, cluster)) {
|
||||
if (!!cluster.ipAddress) {
|
||||
// 写入录像机与集群的关系
|
||||
nvrTreeMap.set(cluster.ipAddress, [...(nvrTreeMap.get(cluster.ipAddress) ?? []), nvr]);
|
||||
// 记录已分配的录像机IP地址
|
||||
nodedNvrIpAddressSet.add(nvr.ipAddress);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 分配完成后,过滤出未分配的录像机,形成录像机单机列表
|
||||
nvrNotClusters.forEach((device) => {
|
||||
if (!nodedNvrIpAddressSet.has(device.ipAddress)) {
|
||||
nvrStandalones.push(device);
|
||||
}
|
||||
});
|
||||
|
||||
return {
|
||||
nvrClusters,
|
||||
// nvrNotClusters,
|
||||
nvrTreeMap,
|
||||
nvrStandalones,
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user