refactor(record-check): 优化分组逻辑并改进缺失片段交互

- 移除 es-toolkit 依赖,使用原生 Map 进行分组以保留顺序
- 将录像片段过滤选项从数字改为语义化字符串
- 修复录像时间轴缺失片段悬停交互,避免嵌套 Popover
- 重置分页时同步设备 ID 和诊断时间变化
This commit is contained in:
yangsy
2026-02-12 01:55:49 +08:00
parent 5edd86ee80
commit 7bdda5d546
2 changed files with 109 additions and 75 deletions
+21 -19
View File
@@ -1,8 +1,6 @@
import type { NdmRecordCheck, RecordInfo, RecordItem } from '@/apis';
import dayjs from 'dayjs';
import destr from 'destr';
import { groupBy } from 'es-toolkit';
export type NvrRecordDiag = {
gbCode: string;
channelName: string;
@@ -17,24 +15,28 @@ export const transformRecordChecks = (rawRecordChecks: NdmRecordCheck[]): NvrRec
...recordCheck,
diagInfo: destr<RecordInfo>(recordCheck.diagInfo),
}));
// 按国标码分组
const recordChecksByGbCode = groupBy(parsedRecordChecks, (recordCheck) => recordCheck.gbCode);
// 提取分组后的国标码和录像诊断记录
const channelGbCodes = Object.keys(recordChecksByGbCode);
const recordChecksList = Object.values(recordChecksByGbCode);
// 初始化每个通道的录像诊断数据结构
const recordDiags = channelGbCodes.map((gbCode, index) => ({
gbCode,
channelName: recordChecksList.at(index)?.at(-1)?.name ?? '',
records: [] as RecordItem[],
lostChunks: [] as RecordItem[],
}));
// 写入同一gbCode的录像片段
recordChecksList.forEach((recordChecks, index) => {
recordChecks.forEach((recordCheck) => {
recordDiags.at(index)?.records.push(...recordCheck.diagInfo.recordList);
});
// 使用 Map 按国标码分组,保留插入顺序
const recordChecksMap = new Map<string, typeof parsedRecordChecks>();
parsedRecordChecks.forEach((recordCheck) => {
if (!recordChecksMap.has(recordCheck.gbCode)) {
recordChecksMap.set(recordCheck.gbCode, []);
}
recordChecksMap.get(recordCheck.gbCode)!.push(recordCheck);
});
// 初始化每个通道的录像诊断数据结构
const recordDiags = Array.from(recordChecksMap.entries())
.map(([gbCode, recordChecks]) => {
return {
gbCode,
channelName: recordChecks.at(-1)?.name ?? '',
records: recordChecks.flatMap((check) => check.diagInfo.recordList),
lostChunks: [] as RecordItem[],
};
})
.sort((diag1, diag2) => {
return diag1.gbCode.localeCompare(diag2.gbCode);
});
// 过滤掉没有录像记录的通道
const filteredRecordDiags = recordDiags.filter((recordDiag) => recordDiag.records.length > 0);
// 计算每个通道丢失的录像时间片段