Merge pull request 'fix(admin): 数据完整性页补齐自动刷新(文案承诺但未实现)' (#21) from fix-completeness-refresh into main

Reviewed-on: #21
This commit is contained in:
2026-09-22 19:54:51 +08:00
2 changed files with 35 additions and 3 deletions
+4
View File
@@ -94,6 +94,10 @@ export default function CollectionPage() {
setTaskStatus(job.status === 'success' ? 'done' : 'error') setTaskStatus(job.status === 'success' ? 'done' : 'error')
stopPolling() stopPolling()
loadRecentJobs() // 终态后刷新历史列表 loadRecentJobs() // 终态后刷新历史列表
// 广播采集终态:数据完整性等依赖页立即刷新,不必等轮询周期
window.dispatchEvent(new CustomEvent('profeto:ingest-done', {
detail: { jobId: job.id, status: job.status },
}))
} }
} catch { /* 单次轮询失败不影响后续 */ } } catch { /* 单次轮询失败不影响后续 */ }
} }
+31 -3
View File
@@ -55,6 +55,9 @@ export default function DataCompletenessPage() {
const [loading, setLoading] = useState(true) const [loading, setLoading] = useState(true)
const [error, setError] = useState<string | null>(null) const [error, setError] = useState<string | null>(null)
const [highlightedLeague, setHighlightedLeague] = useState<string | null>(null) const [highlightedLeague, setHighlightedLeague] = useState<string | null>(null)
// 页面文案承诺「每 5 秒自动刷新」,此前并未实现(仅挂载加载一次),
// 采集完成后数字不动 —— 现补齐:5s 轮询 + 采集完成事件即时刷新。
const [autoRefresh, setAutoRefresh] = useState(true)
const leagueRefs = useRef<Record<string, HTMLDivElement | null>>({}) const leagueRefs = useRef<Record<string, HTMLDivElement | null>>({})
const load = useCallback(async () => { const load = useCallback(async () => {
@@ -72,6 +75,20 @@ export default function DataCompletenessPage() {
useEffect(() => { load() }, [load]) 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) => { const scrollToLeague = useCallback((code: string) => {
setHighlightedLeague(code) setHighlightedLeague(code)
@@ -92,9 +109,20 @@ export default function DataCompletenessPage() {
title="数据完整性" title="数据完整性"
description="按联赛统计 bzzoiro 数据采集覆盖度。每 5 秒自动刷新,或点击右上角按钮手动刷新。" description="按联赛统计 bzzoiro 数据采集覆盖度。每 5 秒自动刷新,或点击右上角按钮手动刷新。"
action={ action={
<button onClick={load} disabled={loading} className="btn-sm btn-outline"> <div className="flex items-center gap-2">
{loading ? <><Spinner /> </> : '刷新'} <label className="flex cursor-pointer items-center gap-1.5 text-2xs text-ink-500">
</button> <input
type="checkbox"
checked={autoRefresh}
onChange={e => setAutoRefresh(e.target.checked)}
className="accent-current"
/>
5s
</label>
<button onClick={load} disabled={loading} className="btn-sm btn-outline">
{loading ? <><Spinner /> </> : '刷新'}
</button>
</div>
} }
/> />