'use client'; import { useEffect, useMemo, useState } from 'react'; import { AlertTriangle, CheckCircle2, Database, RefreshCw } from 'lucide-react'; import { RouteGuard } from '@/components/auth/Guard'; import { type ConsistencyCheckResult, type ConsistencyResult, getConsistencyReport, summarizeConsistencyResult, } from '@/lib/consistency-api'; export default function ConsistencyPage() { return ( ); } function ConsistencyPageContent() { const [report, setReport] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const fetchReport = async () => { setLoading(true); setError(null); try { setReport(await getConsistencyReport()); } catch (e: any) { setError(e?.message ?? '读取一致性报告失败'); } finally { setLoading(false); } }; useEffect(() => { void fetchReport(); }, []); const totals = useMemo(() => report ? summarizeConsistencyResult(report) : null, [report]); return ( 一致性校验 {report && } void fetchReport()} disabled={loading} className="flex h-8 items-center gap-1.5 rounded-lg border border-[var(--line)] bg-[var(--bg-card)] px-3 text-[12px] font-medium text-[var(--ink-soft)] hover:bg-[var(--bg-subtle)] disabled:opacity-50" > 重新校验 {error && ( {error} )} {report && totals && ( <> 数据计数 {Object.entries(report.counts).map(([key, value]) => ( {key} {value} ))} > )} {!report && !error && ( {loading ? '校验中...' : '暂无校验结果'} )} ); } function Metric({ label, value, tone }: { label: string; value: number; tone?: 'ok' | 'warn' | 'error' }) { const toneClass = tone === 'error' ? 'text-red-600' : tone === 'warn' ? 'text-amber-600' : tone === 'ok' ? 'text-emerald-600' : 'text-[var(--ink)]'; return ( {value} {label} ); } function CheckGroup({ title, checks }: { title: string; checks: ConsistencyCheckResult[] }) { return ( {title} {checks.length} {checks.map((check) => ( {check.id} {check.message} {check.count} ))} ); } function StatusPill({ status }: { status: ConsistencyResult['status'] }) { const ok = status === 'pass'; return ( {ok ? : } {ok ? 'PASS' : 'FAIL'} ); } function SeverityBadge({ severity }: { severity: ConsistencyCheckResult['severity'] }) { const className = severity === 'error' ? 'bg-red-50 text-red-700 border-red-200' : severity === 'warn' ? 'bg-amber-50 text-amber-700 border-amber-200' : 'bg-emerald-50 text-emerald-700 border-emerald-200'; return ( {severity} ); }