perf(web): 优化大数据量页面切换与聚合性能
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user