import { useEffect, useState } from 'react'; import { useParams, Link } from 'react-router-dom'; import { api } from '../../services/api-client'; interface RawReport { id: string; patientId: string; title: string; category: string; imageUrls: string[]; status: string; riskLevel?: string; summary?: string; suggestions?: string; patientName?: string; doctorName?: string; createdAt: string; completedAt?: string; items?: RawItem[]; } interface RawItem { id: string; itemName: string; resultValue: string; unit?: string; referenceRange?: string; isAbnormal: boolean; } const categoryMap: Record = { '血液检查': '血液检查', '心电图': '心电图', '影像学': '影像学', '尿液检查': '尿液检查', '其他': '其他', 'Blood Test': '血液检查', 'ECG': '心电图', 'Imaging': '影像学', }; export function ReportDetailPage() { const { id } = useParams<{ id: string }>(); const [report, setReport] = useState(null); const [lightbox, setLightbox] = useState(null); const [summary, setSummary] = useState(''); const [riskLevel, setRiskLevel] = useState('normal'); const [suggestions, setSuggestions] = useState(''); const [items, setItems] = useState([{ itemName: '', resultValue: '', unit: '', referenceRange: '', isAbnormal: false }]); const [submitting, setSubmitting] = useState(false); useEffect(() => { if (!id) return; api.get(`/api/reports/${id}`).then((r) => setReport(r.data)).catch(() => {}); }, [id]); const addItem = () => setItems((prev) => [...prev, { itemName: '', resultValue: '', unit: '', referenceRange: '', isAbnormal: false }]); const updateItem = (i: number, field: string, value: string | boolean) => setItems((prev) => prev.map((it, idx) => idx === i ? { ...it, [field]: value } : it)); const removeItem = (i: number) => { if (items.length > 1) setItems((prev) => prev.filter((_, idx) => idx !== i)); }; const handleInterpret = async () => { if (!summary.trim() || !id) return; setSubmitting(true); try { await api.post(`/api/reports/${id}/interpret`, { summary, items: items.filter((it) => it.itemName.trim()), riskLevel, suggestions: suggestions || null, }); const updated = await api.get(`/api/reports/${id}`); setReport(updated.data); } catch { alert('提交失败'); } finally { setSubmitting(false); } }; if (!report) return
加载中...
; const isCompleted = report.status === 'completed'; const riskMap: Record = { normal: { text: '正常', color: '#2e7d32' }, attention: { text: '关注', color: '#f57c00' }, abnormal: { text: '异常', color: '#c62828' }, }; return (
← 返回报告列表

{report.title}

患者:{report.patientName || '未知'}  |  分类:{categoryMap[report.category] || report.category}  |  日期:{report.createdAt?.split('T')[0]}
{isCompleted ? '已完成' : '待审核'}
{/* 图片 */} {report.imageUrls && report.imageUrls.length > 0 && (

上传图片({report.imageUrls.length}张)

{report.imageUrls.map((url, i) => (
setLightbox(url)} style={{ width: 120, height: 120, borderRadius: 8, overflow: 'hidden', cursor: 'pointer', border: '2px solid #eee', background: '#f5f5f5', display: 'flex', alignItems: 'center', justifyContent: 'center', }}> {`图片${i}`} { (e.target as HTMLImageElement).style.display = 'none'; }} />
))}
)} {/* 灯箱 */} {lightbox && (
setLightbox(null)} style={{ position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.85)', display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 999, cursor: 'pointer', }}> 预览
)} {/* 已完成解读 */} {isCompleted && (

解读结果

风险等级: {riskMap[report.riskLevel || '']?.text || report.riskLevel || '-'}

总结:{report.summary || '-'}

{report.suggestions &&

建议:{report.suggestions}

}
{report.items && report.items.length > 0 && ( {report.items.map((item) => ( ))}
检查项目 结果 参考范围 是否异常
{item.itemName} {item.resultValue} {item.unit || ''} {item.referenceRange || '-'} {item.isAbnormal ? '是' : '否'}
)}
)} {/* 解读表单 */} {!isCompleted && (

医生解读