feat(v2.2): 完成高频读取热路径

This commit is contained in:
Script Generator
2026-07-03 11:53:25 +08:00
parent 5a90923031
commit 70460c3273
28 changed files with 3042 additions and 121 deletions

View File

@@ -13,7 +13,14 @@ import { useVersionPlanStore } from '@/stores/useVersionPlanStore';
import { useWorkActivityStore } from '@/stores/useWorkActivityStore';
import { useXiaobaoRiskStore } from '@/stores/useXiaobaoRiskStore';
import { flattenVersions } from '@/lib/derive';
import { loadV22XiaobaoWarnings, type V22XiaobaoWarningSummary } from '@/lib/v22-api';
import { buildVersionDataScopeMap } from '@/lib/version-data-scope';
import {
buildXiaobaoRisksFromV22Summaries,
filterV22XiaobaoSummariesForVisibleVersions,
shouldLoadXiaobaoAppDataFallback,
type V22XiaobaoSummaryLoadState,
} from '@/lib/xiaobao-v22-summary';
import { calcXiaobaoVersionRisk } from '@/lib/xiaobao-risk';
import { buildVersionDailyEvidence, buildXiaobaoWorkItems } from '@/lib/xiaobao-risk-evidence';
import { filterXiaobaoWarningVersions } from '@/lib/xiaobao-warning-view';
@@ -42,16 +49,46 @@ export function useXiaobaoWarningRisks({ loadRiskCache = false }: { loadRiskCach
finishInsightUpdate,
} = useXiaobaoRiskStore();
const [calculationNow] = useState(() => new Date());
const [v22SummaryState, setV22SummaryState] = useState<V22XiaobaoSummaryLoadState>('idle');
const [v22Summaries, setV22Summaries] = useState<V22XiaobaoWarningSummary[]>([]);
const today = useMemo(() => new Date().toISOString().slice(0, 10), []);
const v22UserId = user?.name || user?.id || '';
const shouldLoadFallback = shouldLoadXiaobaoAppDataFallback(v22SummaryState);
useEffect(() => { fetchOverview(); }, [fetchOverview]);
useEffect(() => { fetchPlans(); }, [fetchPlans]);
useEffect(() => { fetchRequirements(); }, [fetchRequirements]);
useEffect(() => { fetchTasks(); }, [fetchTasks]);
useEffect(() => { fetchTestCases(); }, [fetchTestCases]);
useEffect(() => { fetchBugs(); }, [fetchBugs]);
useEffect(() => { fetchActivities(); }, [fetchActivities]);
useEffect(() => { fetchWorklogs(); }, [fetchWorklogs]);
useEffect(() => {
if (!canManage && !v22UserId) {
setV22SummaryState('idle');
setV22Summaries([]);
return;
}
let ignore = false;
setV22SummaryState('loading');
loadV22XiaobaoWarnings({
userId: v22UserId || undefined,
manager: canManage,
}).then((summaries) => {
if (ignore) return;
setV22Summaries(summaries);
setV22SummaryState(summaries.length > 0 ? 'ready' : 'empty');
}).catch(() => {
if (ignore) return;
setV22Summaries([]);
setV22SummaryState('failed');
});
return () => {
ignore = true;
};
}, [canManage, v22UserId]);
useEffect(() => { if (shouldLoadFallback) fetchPlans(); }, [fetchPlans, shouldLoadFallback]);
useEffect(() => { if (shouldLoadFallback) fetchRequirements(); }, [fetchRequirements, shouldLoadFallback]);
useEffect(() => { if (shouldLoadFallback) fetchTasks(); }, [fetchTasks, shouldLoadFallback]);
useEffect(() => { if (shouldLoadFallback) fetchTestCases(); }, [fetchTestCases, shouldLoadFallback]);
useEffect(() => { if (shouldLoadFallback) fetchBugs(); }, [fetchBugs, shouldLoadFallback]);
useEffect(() => { if (shouldLoadFallback) fetchActivities(); }, [fetchActivities, shouldLoadFallback]);
useEffect(() => { if (shouldLoadFallback) fetchWorklogs(); }, [fetchWorklogs, shouldLoadFallback]);
useEffect(() => {
if (loadRiskCache) fetchRiskData();
}, [fetchRiskData, loadRiskCache]);
@@ -93,28 +130,39 @@ export function useXiaobaoWarningRisks({ loadRiskCache = false }: { loadRiskCach
return map;
}, [visibleVersionScopeMap, visibleVersions]);
const risks = useMemo(() => visibleVersions.map((version) => {
const scope = visibleVersionScopeMap[version.id];
const workItems = workItemsByVersion.get(version.id) ?? [];
const dailyEvidence = buildVersionDailyEvidence({
versionId: version.id,
workItems,
activities,
worklogs,
});
const risks = useMemo(() => {
if (v22SummaryState === 'ready') {
return buildXiaobaoRisksFromV22Summaries({
summaries: filterV22XiaobaoSummariesForVisibleVersions(v22Summaries, visibleVersions),
versions: visibleVersions,
snapshots,
now: calculationNow,
});
}
return calcXiaobaoVersionRisk({
version,
devTasks: scope?.devTasks ?? [],
testCases: scope?.testCases ?? [],
bugs: scope?.bugs ?? [],
dailyEvidence,
recentActivityCount: dailyEvidence.recentActivityCount,
lastActivityAt: dailyEvidence.lastActivityAt,
snapshots: snapshots.filter((snapshot) => snapshot.versionId === version.id && snapshot.date < today),
now: calculationNow,
});
}).sort((a, b) => b.riskScore - a.riskScore), [
return visibleVersions.map((version) => {
const scope = visibleVersionScopeMap[version.id];
const workItems = workItemsByVersion.get(version.id) ?? [];
const dailyEvidence = buildVersionDailyEvidence({
versionId: version.id,
workItems,
activities,
worklogs,
});
return calcXiaobaoVersionRisk({
version,
devTasks: scope?.devTasks ?? [],
testCases: scope?.testCases ?? [],
bugs: scope?.bugs ?? [],
dailyEvidence,
recentActivityCount: dailyEvidence.recentActivityCount,
lastActivityAt: dailyEvidence.lastActivityAt,
snapshots: snapshots.filter((snapshot) => snapshot.versionId === version.id && snapshot.date < today),
now: calculationNow,
});
}).sort((a, b) => b.riskScore - a.riskScore);
}, [
activities,
visibleVersionScopeMap,
visibleVersions,
@@ -123,6 +171,8 @@ export function useXiaobaoWarningRisks({ loadRiskCache = false }: { loadRiskCach
snapshots,
today,
calculationNow,
v22Summaries,
v22SummaryState,
]);
return {