import { memo } from 'react'; import { PieChart, Pie, Cell, Tooltip, Legend, ResponsiveContainer } from 'recharts'; import { CLINICAL_COLORS, TOOLTIP_STYLE } from './chartColors'; export interface DonutSlice { name: string; value: number; } interface DonutChartProps { data: DonutSlice[]; /** name -> color。未命中时按 palette 顺序回退。 */ colorMap?: Record; } /** 通用环形图。复用于「出院结局构成」与「入院途径构成」。 */ export const DonutChart = memo(function DonutChart({ data, colorMap }: DonutChartProps) { if (!data || data.length === 0) { return
暂无数据
; } const total = data.reduce((s, d) => s + d.value, 0); const colorFor = (name: string, idx: number) => colorMap?.[name] ?? CLINICAL_COLORS.routePalette[idx % CLINICAL_COLORS.routePalette.length] ?? CLINICAL_COLORS.outcomeFallback; return ( {data.map((d, idx) => ( ))} [ `${v.toLocaleString()}(${total > 0 ? ((v / total) * 100).toFixed(1) : '0'}%)`, name, ]} /> ); });