"use client"; import Link from "next/link"; import { useCallback, useEffect, useMemo, useState } from "react"; import { RefreshCcw } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; type TruthHistoryItem = { city: string; display_name?: string; target_date: string; actual_high?: number | null; settlement_source?: string | null; settlement_station_code?: string | null; settlement_station_label?: string | null; truth_version?: string | null; updated_by?: string | null; truth_updated_at?: number | null; is_final?: boolean | null; }; type TruthHistoryPayload = { items?: TruthHistoryItem[]; available_cities?: Array<{ city: string; name?: string }>; filters?: { city?: string | null; date_from?: string | null; date_to?: string | null; limit?: number; }; filtered_count?: number; }; function formatUnixDateTime(value?: number | null) { if (!value) return "-"; const date = new Date(value * 1000); if (Number.isNaN(date.getTime())) return "-"; return date.toLocaleString("zh-CN", { hour12: false }); } async function readJson(url: string): Promise { const response = await fetch(url, { cache: "no-store" }); if (!response.ok) { const raw = await response.text(); throw new Error(`${url} -> HTTP ${response.status} ${raw.slice(0, 180)}`); } return response.json() as Promise; } export function TruthHistoryDashboard() { const [city, setCity] = useState(""); const [dateFrom, setDateFrom] = useState(""); const [dateTo, setDateTo] = useState(""); const [limit, setLimit] = useState("200"); const [payload, setPayload] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const load = useCallback(async () => { setLoading(true); setError(null); try { const url = new URL("/api/ops/truth-history", window.location.origin); if (city.trim()) url.searchParams.set("city", city.trim()); if (dateFrom.trim()) url.searchParams.set("date_from", dateFrom.trim()); if (dateTo.trim()) url.searchParams.set("date_to", dateTo.trim()); if (limit.trim()) url.searchParams.set("limit", limit.trim()); const data = await readJson(url.toString()); setPayload(data); } catch (loadError) { setError(String(loadError)); } finally { setLoading(false); } }, [city, dateFrom, dateTo, limit]); useEffect(() => { void load(); }, [load]); const items = payload?.items || []; const availableCities = payload?.available_cities || []; const stats = useMemo(() => { const uniqueCities = new Set(items.map((item) => item.city)).size; const finalCount = items.filter((item) => item.is_final).length; return { rows: items.length, filtered: payload?.filtered_count ?? items.length, uniqueCities, finalCount, }; }, [items, payload?.filtered_count]); return (
Ops Truth History 返回 /ops

真值历史浏览

面向后台运营/研究的历史真值表格页,支持按城市和日期范围过滤,直接查看最终 `actual_high` 与来源口径。

当前结果 本次筛选实际返回的记录条数。 {stats.rows} 匹配总数 过滤后总命中条数,返回结果受 limit 限制。 {stats.filtered} 覆盖城市 本次结果涉及的城市数量。 {stats.uniqueCities} Final Rows 当前返回里标记为最终真值的条数。 {stats.finalCount}
筛选器 按 city / date range 查历史真值。 setDateFrom(event.target.value)} className="rounded-2xl border border-slate-700 bg-slate-950 px-3 py-2 text-sm text-slate-200" /> setDateTo(event.target.value)} className="rounded-2xl border border-slate-700 bg-slate-950 px-3 py-2 text-sm text-slate-200" /> setLimit(event.target.value)} className="rounded-2xl border border-slate-700 bg-slate-950 px-3 py-2 text-sm text-slate-200" /> {error ? ( 加载失败 {error} ) : null} 历史真值表 字段包括 `actual_high`、`settlement_source`、`station_code`、`truth_version`、`updated_by`、`updated_at`。
{items.map((item) => ( ))} {!items.length ? ( ) : null}
Date City Actual Source Station Version Updated By Updated At
{item.target_date}
{item.display_name || item.city}
{item.city}
{item.actual_high ?? "-"}
{item.is_final ? "final" : "non-final"}
{item.settlement_source || "-"}
{item.settlement_station_code || "-"}
{item.settlement_station_label || "-"}
{item.truth_version || "-"} {item.updated_by || "-"} {formatUnixDateTime(item.truth_updated_at)}
当前筛选条件下没有历史真值记录
); }