From a6740f6140b2a4059ceb4bd61c20a5d148b70bb0 Mon Sep 17 00:00:00 2001 From: WorkBuddy Date: Tue, 22 Sep 2026 19:52:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(admin):=20=E6=95=B0=E6=8D=AE=E5=AE=8C?= =?UTF-8?q?=E6=95=B4=E6=80=A7=E9=A1=B5=E8=A1=A5=E9=BD=90=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=88=B7=E6=96=B0(=E6=96=87=E6=A1=88=E6=89=BF=E8=AF=BA?= =?UTF-8?q?=E4=BD=86=E6=9C=AA=E5=AE=9E=E7=8E=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 页面描述写着「每 5 秒自动刷新」,实际只有挂载时加载一次 + 手动按钮 —— 采集完成后停在页面上的数字永远不动。 - 补 5s 自动轮询(可开关,复用 Logs 页的 checkbox 样式);已有数据时 刷新不闪骨架(loading && !data 条件已具备) - 采集页任务终态广播 profeto:ingest-done 事件,完整性页监听后 立即刷新,不必等下一个 5s 周期 --- frontend/src/admin/pages/Collection.tsx | 4 +++ frontend/src/admin/pages/DataCompleteness.tsx | 34 +++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) 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={ - +
+ + +
} />