'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 && }
{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} ); }