import { Activity, AlertTriangle, BedDouble, CheckCircle2, HeartPulse, Users } from "lucide-react"; import type { LucideIcon } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Table } from "@/components/ui/table"; import type { AdmissionStatus, BedStatus, IncidentSeverity } from "@/modules/core/types"; import { BedOccupancyChart, type BedOccupancyDatum } from "@/modules/dashboard/components/BedOccupancyChart"; export type DashboardMetric = { label: string; value: string; trend: string; icon: "users" | "beds" | "admissions" | "incidents"; }; export type DashboardAdmission = { id: string; elderName: string; bedLabel: string; status: AdmissionStatus; admittedAt: string; dischargedAt?: string; }; export type DashboardIncident = { id: string; severity: IncidentSeverity; status: string; title: string; source: string; createdAt: string; }; type DashboardHomeProps = { metrics: DashboardMetric[]; occupancyData: BedOccupancyDatum[]; recentAdmissions: DashboardAdmission[]; incidents: DashboardIncident[]; }; const metricIcons: Record = { users: Users, beds: BedDouble, admissions: CheckCircle2, incidents: HeartPulse, }; const admissionStatusLabels: Record = { active: "在住", transferred: "已换床", discharged: "已退住", }; const bedStatusLabels: Record = { available: "空闲", occupied: "占用", maintenance: "维修", disabled: "停用", }; function formatDateTime(value: string): string { return new Date(value).toLocaleString("zh-CN"); } function incidentVariant(severity: IncidentSeverity): "secondary" | "warning" | "danger" { switch (severity) { case "critical": return "danger"; case "warning": return "warning"; case "info": return "secondary"; } } export function DashboardHome({ metrics, occupancyData, recentAdmissions, incidents, }: DashboardHomeProps): React.ReactElement { return (
实时数据

运营看板

老人、床位、入住和系统故障概况。

{metrics.map((metric) => { const Icon = metricIcons[metric.icon]; return ( {metric.label} {metric.value}

{metric.trend}

); })}
{occupancyData.map((item) => `${bedStatusLabels[item.label as BedStatus] ?? item.label} ${item.count}`).join(" / ")} 最近入住记录
老人 床位 状态 时间 {recentAdmissions.map((admission) => ( {admission.elderName} {admission.bedLabel} {admissionStatusLabels[admission.status]} {formatDateTime(admission.dischargedAt ?? admission.admittedAt)} ))} {recentAdmissions.length === 0 ? ( 暂无入住记录 ) : null}
系统故障 {incidents.map((incident) => (

{incident.source} / {formatDateTime(incident.createdAt)}

{incident.status}
))} {incidents.length === 0 ?

暂无未关闭故障

: null}
); }