diff --git a/frontend/src/admin/pages/Collection.tsx b/frontend/src/admin/pages/Collection.tsx index b078349..be760ee 100644 --- a/frontend/src/admin/pages/Collection.tsx +++ b/frontend/src/admin/pages/Collection.tsx @@ -94,6 +94,10 @@ export default function CollectionPage() { setTaskStatus(job.status === 'success' ? 'done' : 'error') stopPolling() loadRecentJobs() // 终态后刷新历史列表 + // 广播采集终态:数据完整性等依赖页立即刷新,不必等轮询周期 + window.dispatchEvent(new CustomEvent('profeto:ingest-done', { + detail: { jobId: job.id, status: job.status }, + })) } } catch { /* 单次轮询失败不影响后续 */ } } diff --git a/frontend/src/admin/pages/DataCompleteness.tsx b/frontend/src/admin/pages/DataCompleteness.tsx index 04fd5b3..c4155c0 100644 --- a/frontend/src/admin/pages/DataCompleteness.tsx +++ b/frontend/src/admin/pages/DataCompleteness.tsx @@ -55,6 +55,9 @@ export default function DataCompletenessPage() { const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [highlightedLeague, setHighlightedLeague] = useState(null) + // 页面文案承诺「每 5 秒自动刷新」,此前并未实现(仅挂载加载一次), + // 采集完成后数字不动 —— 现补齐:5s 轮询 + 采集完成事件即时刷新。 + const [autoRefresh, setAutoRefresh] = useState(true) const leagueRefs = useRef>({}) const load = useCallback(async () => { @@ -72,6 +75,20 @@ export default function DataCompletenessPage() { useEffect(() => { load() }, [load]) + // 5s 自动轮询(与页面文案一致);已有数据时刷新不闪骨架 + useEffect(() => { + if (!autoRefresh) return + const t = setInterval(load, 5_000) + return () => clearInterval(t) + }, [autoRefresh, load]) + + // 采集页任务终态广播 → 立即刷新(不等下一个 5s 周期) + useEffect(() => { + const onIngestDone = () => load() + window.addEventListener('profeto:ingest-done', onIngestDone) + return () => window.removeEventListener('profeto:ingest-done', onIngestDone) + }, [load]) + // 点击问题项 → 滚动到对应联赛卡片并高亮 const scrollToLeague = useCallback((code: string) => { setHighlightedLeague(code) @@ -92,9 +109,20 @@ export default function DataCompletenessPage() { title="数据完整性" description="按联赛统计 bzzoiro 数据采集覆盖度。每 5 秒自动刷新,或点击右上角按钮手动刷新。" action={ - +
+ + +
} />