perf(web): 优化大数据量页面切换与聚合性能

This commit is contained in:
Script Generator
2026-07-03 09:43:36 +08:00
parent 554ab520d1
commit a509bb4922
32 changed files with 1087 additions and 360 deletions

View File

@@ -23,6 +23,14 @@ export function calcVersionProgress(
const vDevTasks = devTasks.filter((t) => isDevTaskInVersion(t, versionId, vReqIds));
const vTestCases = testCases.filter((c) => c.versionId === versionId);
return calcScopedVersionProgress(vPlans, vDevTasks, vTestCases);
}
export function calcScopedVersionProgress(
vPlans: VersionPlan[],
vDevTasks: DevTask[],
vTestCases: TestCase[],
): number {
const segments: number[] = [];
const researchPlans = vPlans.filter((p) => p.type === 'research');
@@ -93,9 +101,40 @@ export function buildVersionProgressMap(
devTasks: DevTask[],
testCases: TestCase[],
): Record<string, number> {
const plansByVersion = groupByVersionId(plans);
const requirementVersionMap = new Map<string, string>();
for (const requirement of requirements) {
if (!requirement.versionId) continue;
requirementVersionMap.set(requirement.id, requirement.versionId);
}
const devTasksByVersion = new Map<string, DevTask[]>();
for (const task of devTasks) {
const versionId = task.versionId || requirementVersionMap.get(task.requirementId);
if (!versionId) continue;
const items = devTasksByVersion.get(versionId) ?? [];
items.push(task);
devTasksByVersion.set(versionId, items);
}
const testCasesByVersion = groupByVersionId(testCases);
const map: Record<string, number> = {};
for (const v of versions) {
map[v.id] = calcVersionProgress(v.id, plans, requirements, devTasks, testCases);
map[v.id] = calcScopedVersionProgress(
plansByVersion.get(v.id) ?? [],
devTasksByVersion.get(v.id) ?? [],
testCasesByVersion.get(v.id) ?? [],
);
}
return map;
}
function groupByVersionId<T extends { versionId: string }>(items: T[]): Map<string, T[]> {
const map = new Map<string, T[]>();
for (const item of items) {
const group = map.get(item.versionId) ?? [];
group.push(item);
map.set(item.versionId, group);
}
return map;
}