import React, { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import Sidebar from '../components/Sidebar'; import { Search, Eye, Edit, Trash2, FileText, History, X, Download, Printer } from 'lucide-react'; import { User, Report, DEFAULT_FORM_FIELDS } from '../types'; import { storage } from '../utils/storage'; import { printDocument } from '../utils/print'; const formatDateTime = (iso: string) => { if (!iso) return '-'; const d = new Date(iso); if (isNaN(d.getTime())) return iso; const pad = (n: number) => n.toString().padStart(2, '0'); return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`; }; export default function ReportManage() { const navigate = useNavigate(); const [reports, setReports] = useState([]); const [filteredReports, setFilteredReports] = useState([]); const [currentUser, setCurrentUser] = useState(null); const [searchTerm, setSearchTerm] = useState(''); const [statusFilter, setStatusFilter] = useState(''); const [dateFilter, setDateFilter] = useState(''); const [historyModalOpen, setHistoryModalOpen] = useState(false); const [historyReport, setHistoryReport] = useState(null); const [selectedIds, setSelectedIds] = useState([]); const [exportModalOpen, setExportModalOpen] = useState(false); const [exportTarget, setExportTarget] = useState(null); useEffect(() => { const user = storage.get('currentUser', null); if (!user) { navigate('/'); return; } setCurrentUser(user); const savedReports = storage.get('reports', []); setReports(savedReports); }, [navigate]); useEffect(() => { if (!currentUser) return; let filtered = [...reports]; if (currentUser.role === 'user') { filtered = filtered.filter(r => r.author === currentUser.username); } if (searchTerm) { const term = searchTerm.toLowerCase(); filtered = filtered.filter(r => r.title.toLowerCase().includes(term) || r.patientName.toLowerCase().includes(term) || r.hospitalId.toLowerCase().includes(term) ); } if (statusFilter) { filtered = filtered.filter(r => r.status === statusFilter); } if (dateFilter) { const now = new Date(); filtered = filtered.filter(r => { const reportDate = new Date(r.createdAt); if (dateFilter === 'today') { return reportDate.toDateString() === now.toDateString(); } else if (dateFilter === 'week') { const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000); return reportDate >= weekAgo; } else if (dateFilter === 'month') { return reportDate.getMonth() === now.getMonth() && reportDate.getFullYear() === now.getFullYear(); } return true; }); } setFilteredReports(filtered); }, [reports, currentUser, searchTerm, statusFilter, dateFilter]); const deleteReport = (id: string) => { if (window.confirm('确定要删除此报告吗?')) { const updatedReports = reports.filter(r => r.id !== id); setReports(updatedReports); storage.set('reports', updatedReports); setSelectedIds(prev => prev.filter(pid => pid !== id)); } }; const viewReport = (id: string) => { navigate(`/report-view/${id}`); }; const editReport = (id: string) => { navigate(`/report-editor?id=${id}`); }; const openHistory = (report: Report) => { setHistoryReport(report); setHistoryModalOpen(true); }; const restoreHistory = (content: string) => { if (!historyReport) return; if (!window.confirm('确定要恢复此历史版本到编辑器吗?当前未保存的内容将丢失。')) return; navigate(`/report-editor?id=${historyReport.id}&restore=1`); storage.setSession(`restore_${historyReport.id}`, content); setHistoryModalOpen(false); }; const toggleSelect = (id: string) => { setSelectedIds(prev => prev.includes(id) ? prev.filter(x => x !== id) : [...prev, id]); }; const toggleSelectAll = () => { if (selectedIds.length === filteredReports.length && filteredReports.length > 0) { setSelectedIds([]); } else { setSelectedIds(filteredReports.map(r => r.id)); } }; const handleBulkDelete = () => { if (!window.confirm(`确定要删除选中的 ${selectedIds.length} 份报告吗?`)) return; const updated = reports.filter(r => !selectedIds.includes(r.id)); setReports(updated); storage.set('reports', updated); setSelectedIds([]); }; const buildExportData = (report: Report) => { const fields: Record = {}; DEFAULT_FORM_FIELDS.forEach(f => { fields[f.key] = (report as any)[f.key]; }); return { meta: { id: report.id, title: report.title, createdAt: report.createdAt, updatedAt: report.updatedAt, author: report.author, authorName: report.authorName, status: report.status }, fields }; }; const downloadJSON = (data: any, filename: string) => { const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; a.click(); URL.revokeObjectURL(url); }; const exportSinglePDF = (report: Report) => { printDocument(report.content); }; const exportSingleJSON = (report: Report) => { const data = buildExportData(report); downloadJSON(data, `报告_${report.patientName || '未命名'}_${report.id}.json`); }; const exportBulkPDF = () => { const selectedReports = reports.filter(r => selectedIds.includes(r.id)); const mergedHTML = selectedReports.map(r => r.content).join('
'); printDocument(mergedHTML); }; const exportBulkJSON = () => { const selectedReports = reports.filter(r => selectedIds.includes(r.id)); const data = selectedReports.map(r => buildExportData(r)); const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); downloadJSON(data, `reports_export_${timestamp}.json`); }; const openExportModal = (report: Report) => { setExportTarget(report); setExportModalOpen(true); }; if (!currentUser) return null; return (

报告管理

{currentUser.role === 'user' ? '查看、编辑、打印自己创建的报告' : '查看/检索全院所有已撰写的报告'}

setSearchTerm(e.target.value)} className="input-minimal pl-11" />
{selectedIds.length > 0 && (
已选择 {selectedIds.length} 项
)}
{filteredReports.length > 0 ? ( filteredReports.map((report) => ( )) ) : ( )}
0 && selectedIds.length === filteredReports.length} onChange={toggleSelectAll} /> 报告信息 患者 住院号 创建者 时间 状态 操作
toggleSelect(report.id)} />
{report.title}
{report.id}
{report.patientName} {report.hospitalId} {report.authorName}
创建: {formatDateTime(report.createdAt)}
修改: {formatDateTime(report.updatedAt || report.createdAt)}
{report.status === 'draft' ? '草稿' : '已完成'}
{(currentUser.role !== 'user' || report.author === currentUser.username) && ( <> )}

暂无报告

点击"新建报告"开始撰写您的第一份报告

{historyModalOpen && historyReport && (

操作历史

报告: {historyReport.title}

{[...(historyReport.history || [])].reverse().map((item, idx) => (
{item.action === 'complete_report' ? '完成报告' : '保存草稿'} {formatDateTime(item.updatedAt)}

由 {item.updatedBy} {item.action === 'complete_report' ? '完成' : '保存'}

))}
当前版本 {formatDateTime(historyReport.updatedAt || historyReport.createdAt)}

当前显示内容

)} {exportModalOpen && exportTarget && (

导出报告

选择导出格式:

)}
); }