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

@@ -13,6 +13,7 @@ import { useVersionPlanStore } from '@/stores/useVersionPlanStore';
import { useWorkActivityStore } from '@/stores/useWorkActivityStore';
import { useXiaobaoRiskStore } from '@/stores/useXiaobaoRiskStore';
import { flattenVersions } from '@/lib/derive';
import { buildVersionDataScopeMap } from '@/lib/version-data-scope';
import { calcXiaobaoVersionRisk } from '@/lib/xiaobao-risk';
import { buildVersionDailyEvidence, buildXiaobaoWorkItems } from '@/lib/xiaobao-risk-evidence';
import { filterXiaobaoWarningVersions } from '@/lib/xiaobao-warning-view';
@@ -61,31 +62,40 @@ export function useXiaobaoWarningRisks({ loadRiskCache = false }: { loadRiskCach
[allVersions, canManage, user?.name],
);
const requirementVersionMap = useMemo(() => {
const map = new Map<string, string>();
requirements.forEach((requirement) => {
if (requirement.versionId) map.set(requirement.id, requirement.versionId);
});
return map;
}, [requirements]);
const workItems = useMemo(() => buildXiaobaoWorkItems({
const visibleVersionScopeMap = useMemo(() => buildVersionDataScopeMap({
versionIds: visibleVersions.map((version) => version.id),
plans,
requirements,
devTasks,
testCases,
bugs,
versions: allVersions.map((version) => ({
id: version.id,
name: version.name,
productName: version.productName,
projectName: version.projectName,
})),
requirementVersionMap,
}), [allVersions, bugs, devTasks, plans, requirementVersionMap, testCases]);
}), [bugs, devTasks, plans, requirements, testCases, visibleVersions]);
const workItemsByVersion = useMemo(() => {
const map = new Map<string, ReturnType<typeof buildXiaobaoWorkItems>>();
for (const version of visibleVersions) {
const scope = visibleVersionScopeMap[version.id];
if (!scope) continue;
map.set(version.id, buildXiaobaoWorkItems({
plans: scope.plans,
devTasks: scope.devTasks,
testCases: scope.testCases,
bugs: scope.bugs,
versions: [{
id: version.id,
name: version.name,
productName: version.productName,
projectName: version.projectName,
}],
requirementVersionMap: new Map(scope.requirements.map((requirement) => [requirement.id, version.id])),
}));
}
return map;
}, [visibleVersionScopeMap, visibleVersions]);
const risks = useMemo(() => visibleVersions.map((version) => {
const versionRequirements = requirements.filter((requirement) => requirement.versionId === version.id);
const requirementIds = new Set(versionRequirements.map((requirement) => requirement.id));
const scope = visibleVersionScopeMap[version.id];
const workItems = workItemsByVersion.get(version.id) ?? [];
const dailyEvidence = buildVersionDailyEvidence({
versionId: version.id,
workItems,
@@ -95,9 +105,9 @@ export function useXiaobaoWarningRisks({ loadRiskCache = false }: { loadRiskCach
return calcXiaobaoVersionRisk({
version,
devTasks: devTasks.filter((task) => requirementIds.has(task.requirementId)),
testCases: testCases.filter((testCase) => testCase.versionId === version.id),
bugs: bugs.filter((bug) => bug.versionId === version.id),
devTasks: scope?.devTasks ?? [],
testCases: scope?.testCases ?? [],
bugs: scope?.bugs ?? [],
dailyEvidence,
recentActivityCount: dailyEvidence.recentActivityCount,
lastActivityAt: dailyEvidence.lastActivityAt,
@@ -106,12 +116,9 @@ export function useXiaobaoWarningRisks({ loadRiskCache = false }: { loadRiskCach
});
}).sort((a, b) => b.riskScore - a.riskScore), [
activities,
bugs,
devTasks,
requirements,
testCases,
visibleVersionScopeMap,
visibleVersions,
workItems,
workItemsByVersion,
worklogs,
snapshots,
today,