"use client"; import { useMemo, useState } from "react"; import { Download, ChevronDown, CheckCircle2 } from "lucide-react"; import { useAuth } from "@/components/AuthProvider"; import { useD4Metrics } from "@/hooks/useD4Metrics"; import { toD4UserId } from "@/lib/d4Metrics"; import { buildRuntimeMetrics, type RuntimeMetric, type RuntimeMetricValue } from "@/lib/metricRuntime"; export default function DashboardContent() { const { user } = useAuth(); const [expandedCard, setExpandedCard] = useState(null); const [activeTab, setActiveTab] = useState<"K" | "A" | "S" | "D">("D"); const d4Query = useMemo(() => { const userId = user?.role === "stu" ? toD4UserId(user.id) : undefined; return userId ? { userId } : {}; }, [user]); const d4Metrics = useD4Metrics(d4Query); const displayData = useMemo( () => buildRuntimeMetrics({ data: d4Metrics.data, error: d4Metrics.error, isLoading: d4Metrics.isLoading }), [d4Metrics.data, d4Metrics.error, d4Metrics.isLoading], ); const toggleCard = (id: string) => { setExpandedCard(expandedCard === id ? null : id); }; const getScoreStatus = (score: number | null) => { if (score == null) { return { label: "暂无", class: "bg-surface-variant text-on-surface-variant border-outline-variant" }; } if (score >= 90) return { label: "优秀", class: "bg-metric-high/10 text-metric-high border-metric-high/30" }; if (score >= 80) return { label: "良好", class: "bg-metric-mid/10 text-metric-mid border-metric-mid/30" }; if (score >= 70) return { label: "一般", class: "bg-metric-warn/10 text-metric-warn border-metric-warn/30" }; return { label: "需改进", class: "bg-metric-low/10 text-metric-low border-metric-low/30" }; }; const getMetricStatus = (metric: RuntimeMetric) => { if (metric.state === "loading") { return { label: "加载中", class: "bg-primary/10 text-primary border-primary/30" }; } if (metric.state === "error") { return { label: "接口异常", class: "bg-metric-low/10 text-metric-low border-metric-low/30" }; } if (metric.state === "unavailable") { return { label: "未接入", class: "bg-surface-variant text-on-surface-variant border-outline-variant" }; } return getScoreStatus(metric.score); }; const getValueStatus = (value: RuntimeMetricValue) => { if (value.state === "ready" && value.score == null) { return { label: "已同步", class: "bg-primary/10 text-primary border-primary/30" }; } if (value.state === "loading") { return { label: "加载中", class: "bg-primary/10 text-primary border-primary/30" }; } if (value.state === "error") { return { label: "异常", class: "bg-metric-low/10 text-metric-low border-metric-low/30" }; } if (value.state === "unavailable") { return { label: "未接入", class: "bg-surface-variant text-on-surface-variant border-outline-variant" }; } return getScoreStatus(value.score); }; return (

综合能力总览

基于后端指标接口的数据分析与追踪

{displayData[activeTab].map((metric) => { const status = getMetricStatus(metric); const progress = metric.score ?? 0; return (
toggleCard(metric.id)} >
{metric.id}

{metric.name}

{metric.summary}

{metric.avgScore}
指标值
{metric.subMetrics.map((subMetric) => { const subStatus = subMetric.state === "ready" ? getScoreStatus(subMetric.score) : status; return (

{subMetric.id} {subMetric.name}

{subStatus.label}
{subMetric.values.map((val, idx) => { const valueStatus = getValueStatus(val); return (
{val.name}
{val.displayValue} {valueStatus.label}
{val.helperText && (

{val.helperText}

)} {val.progress != null && (
)}
); })}
); })}
); })}

指标数据同步

{displayData[activeTab].map((metric) => { const status = getMetricStatus(metric); return ( (window.location.href = `/metrics/${metric.id.toLowerCase()}`)} > ); })}
能力指标 数据来源 指标值 状态
{metric.id} {metric.name} {metric.id === "D4" ? "后端 D4 指标接口" : "等待后端接口"} {metric.avgScore} {status.label}
); }