import { useEffect, useRef, useState } from 'react'; import { submitDaojiandanSign } from '../../api'; import type { ExamClient } from '../../data/mockData'; import { setExamActionRecord } from '../../utils/examActions'; import type { SignaturePadHandle } from '../ui'; import { Button, SignaturePad } from '../ui'; export const ExamPrintPanel = ({ client }: { client: ExamClient }) => { const [pdfUrl, setPdfUrl] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [pdfReady, setPdfReady] = useState(false); const [pdfBlobUrl, setPdfBlobUrl] = useState(null); const [signatureSubmitted, setSignatureSubmitted] = useState(false); const [submitLoading, setSubmitLoading] = useState(false); const [submitMessage, setSubmitMessage] = useState(null); const signaturePadRef = useRef(null); const printRef = useRef(null); const iframeRef = useRef(null); const handleSubmitSign = async () => { const examId = Number(client.id); if (!examId) { setSubmitMessage('无效的体检ID'); return; } const dataUrl = signaturePadRef.current?.toDataURL('image/png'); if (!dataUrl) { setSubmitMessage('请先完成签名'); return; } setSubmitLoading(true); setSubmitMessage(null); try { // 将 base64 转换为 Blob const blob = await fetch(dataUrl).then(r => r.blob()); // 提交签名生成导检单PDF const res = await submitDaojiandanSign({ exam_id: examId, sign_file: blob, }); if (res.Status === 200 && res.Data?.pdf_url) { setSubmitMessage('签名提交成功,正在加载导检单...'); setSignatureSubmitted(true); setPdfUrl(res.Data.pdf_url); // 记录打印导检单是否签名操作 setExamActionRecord(examId, 'printSign', true); } else { setSubmitMessage(res.Message || '签名提交失败'); } } catch (err) { console.error('提交签名失败', err); setSubmitMessage('签名提交失败,请稍后重试'); } finally { setSubmitLoading(false); } }; useEffect(() => { if (!pdfUrl) return; let objectUrl: string | null = null; setPdfReady(false); setLoading(true); fetch(pdfUrl) .then((resp) => { if (!resp.ok) throw new Error('获取PDF文件失败'); return resp.blob(); }) .then((blob) => { objectUrl = URL.createObjectURL(blob); setPdfBlobUrl(objectUrl); }) .catch((err) => { console.error('PDF 拉取失败', err); setError('PDF 加载失败,请稍后重试'); }) .finally(() => { setLoading(false); }); return () => { if (objectUrl) { URL.revokeObjectURL(objectUrl); } }; }, [pdfUrl]); const handlePrint = () => { if (!pdfBlobUrl || !pdfReady) return; const printWindow = window.open(pdfBlobUrl, '_blank'); if (printWindow) { printWindow.onload = () => { printWindow.focus(); printWindow.print(); }; } }; return (
圆和医疗体检中心 · 导检单预览
{signatureSubmitted ? '此为预览页面,实际打印效果以院内打印机为准。' : '请先完成签名,签名后将生成导检单PDF'}
体检号:{client.id}
日期:{new Date().toLocaleDateString('zh-CN')}
{signatureSubmitted && ( )}
{!signatureSubmitted ? (
请在下方区域签名
请在上方区域签名
{submitMessage && (
{submitMessage}
)}
) : loading ? (
正在加载PDF...
) : error ? (
{error}
) : pdfUrl ? (