Per request — drop all monetary statistics (住院费用 is sensitive). - Backend statistics.py: remove mean_cost KPI + cost_histogram / cost_by_disease / cost_vs_los from /inpatient-clinical (models, computation, response) - Frontend: drop 人均费用 KPI card (now 4 KPIs), 住院费用分布, 各病种平均费用, 费用×住院天数散点; delete CostByDiseaseChart + CostVsLosScatter components; trim statsApi type + e2e fixture + chartColors Clinical page now: KPI(总人次/中位住院日/治愈好转率/急诊占比) + LOS dist + LOS-by-disease box + outcome donut + admission-route donut + age-band BMI box. Gates: backend 106 pytest · tsc 0 · build ok · clinical+user-flows e2e 19/19 · live endpoint confirmed cost-free Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
43 lines
1.4 KiB
TypeScript
43 lines
1.4 KiB
TypeScript
import { memo } from 'react';
|
||
import { Users, CalendarDays, HeartPulse, Siren } from 'lucide-react';
|
||
import { StatCard } from '@/components/StatCard';
|
||
import { TESTIDS } from '@/utils/testids';
|
||
import type { InpatientClinicalResponse } from '@/services/api';
|
||
|
||
interface ClinicalKpiRowProps {
|
||
kpis: InpatientClinicalResponse['kpis'];
|
||
}
|
||
|
||
/** 住院临床 4 项核心指标。375px 下 2 列,sm 起 4 列。 */
|
||
export const ClinicalKpiRow = memo(function ClinicalKpiRow({ kpis }: ClinicalKpiRowProps) {
|
||
return (
|
||
<div
|
||
data-testid={TESTIDS.clinicalKpis}
|
||
className="grid grid-cols-2 sm:grid-cols-4 gap-3"
|
||
>
|
||
<StatCard
|
||
icon={<Users className="w-4 h-4 text-primary" />}
|
||
label="住院总人次"
|
||
value={kpis.total_admissions.toLocaleString()}
|
||
/>
|
||
<StatCard
|
||
icon={<CalendarDays className="w-4 h-4 text-primary" />}
|
||
label="中位住院日"
|
||
value={`${kpis.median_los_days} 天`}
|
||
/>
|
||
<StatCard
|
||
icon={<HeartPulse className="w-4 h-4 text-success" />}
|
||
label="治愈好转率"
|
||
value={`${(kpis.cure_rate * 100).toFixed(1)}%`}
|
||
color="#16A34A"
|
||
/>
|
||
<StatCard
|
||
icon={<Siren className="w-4 h-4 text-warning" />}
|
||
label="急诊入院占比"
|
||
value={`${(kpis.emergency_admit_ratio * 100).toFixed(1)}%`}
|
||
color="#D97706"
|
||
/>
|
||
</div>
|
||
);
|
||
});
|