import { useState, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; import { Button } from '@/components/common/Button'; import { Input } from '@/components/common/Input'; import { PageHeader } from '@/components/layout/PageHeader'; import { ToastContainer, toast } from '@/components/common/Toast'; import * as reportService from '@/services/report.service'; import styles from './ReportUploadPage.module.css'; export function ReportUploadPage() { const navigate = useNavigate(); const fileRef = useRef(null); const [title, setTitle] = useState(''); const [category, setCategory] = useState('血液检查'); const [files, setFiles] = useState([]); const [uploading, setUploading] = useState(false); const categories = ['血液检查', '心电图', '影像学', '尿液检查', '其他']; const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files) { setFiles((prev) => [...prev, ...Array.from(e.target.files!)]); } if (fileRef.current) fileRef.current.value = ''; }; const removeFile = (index: number) => { setFiles((prev) => prev.filter((_, i) => i !== index)); }; const handleSubmit = async () => { if (!title.trim()) { toast('请输入报告名称', 'error'); return; } setUploading(true); try { // Step 1: Upload files const imageUrls: string[] = []; for (const file of files) { const formData = new FormData(); formData.append('file', file); const token = JSON.parse(localStorage.getItem('hrt_auth') || '{}')?.state?.token; const res = await fetch(`${import.meta.env.VITE_API_URL}/api/files/upload`, { method: 'POST', headers: token ? { 'Authorization': `Bearer ${token}` } : {}, body: formData, }); if (res.ok) { const data = await res.json(); imageUrls.push(data.url); } } // Step 2: Create report await reportService.uploadReport({ title, category, imageUrls }); toast('上传成功'); setTimeout(() => navigate('/services/reports'), 800); } catch { toast('上传失败,请检查后端是否运行', 'error'); } finally { setUploading(false); } }; return (
setTitle(e.target.value)} placeholder="如:血脂全套检查报告" />
报告类型
{categories.map((c) => ( ))}
fileRef.current?.click()}>
点击选择报告图片 {files.length > 0 ? `已选 ${files.length} 个文件` : '支持 jpg、png、pdf,可多选'}
{files.length > 0 && (
{files.map((file, i) => (
{file.name} ({(file.size / 1024).toFixed(0)}KB)
))}
)}
); }