完善导检单

This commit is contained in:
xianyi
2026-01-05 11:38:54 +08:00
parent 5baf9270c0
commit f2dd1259bc

View File

@@ -3,7 +3,7 @@ import * as pdfjsLib from 'pdfjs-dist';
import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.min.mjs?url'; import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.min.mjs?url';
import type { OutputTongyishuFileInfo } from '../../api'; import type { OutputTongyishuFileInfo } from '../../api';
import { getTongyishuPdf, signInMedicalExamCenter, submitTongyishuSign, submitDaojiandanSign, editDaojiandanPrintStatus } from '../../api'; import { getTongyishuPdf, signInMedicalExamCenter, submitTongyishuSign, submitDaojiandanSign, editDaojiandanPrintStatus, getDaojiandanPdf as getDaojiandanPdfApi } from '../../api';
import { import {
setExamActionRecord, setExamActionRecord,
setTongyishuPdfList, setTongyishuPdfList,
@@ -61,6 +61,7 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => {
// 导检单相关状态 // 导检单相关状态
const [daojiandanUrl, setDaojiandanUrl] = useState<string | null>(null); const [daojiandanUrl, setDaojiandanUrl] = useState<string | null>(null);
const [isDaojiandanSigned, setIsDaojiandanSigned] = useState(false); // 导检单是否已签名
const [showDaojiandanSignature, setShowDaojiandanSignature] = useState(false); const [showDaojiandanSignature, setShowDaojiandanSignature] = useState(false);
const daojiandanSignaturePadRef = useRef<SignaturePadHandle | null>(null); const daojiandanSignaturePadRef = useRef<SignaturePadHandle | null>(null);
const [daojiandanSubmitLoading, setDaojiandanSubmitLoading] = useState(false); const [daojiandanSubmitLoading, setDaojiandanSubmitLoading] = useState(false);
@@ -298,13 +299,31 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => {
.finally(() => setConsentLoading(false)); .finally(() => setConsentLoading(false));
}, [examId]); }, [examId]);
// 组件加载时检查导检单localStorage // 组件加载时检查导检单localStorage,如果没有则调用接口获取未签名的导检单
useEffect(() => { useEffect(() => {
if (!examId) return; if (!examId) return;
// 先检查 localStorage 中的导检单(已签名的)
const storedPdf = getDaojiandanPdfFromStorage(examId); const storedPdf = getDaojiandanPdfFromStorage(examId);
if (storedPdf && storedPdf.pdf_url) { if (storedPdf && storedPdf.pdf_url) {
setDaojiandanUrl(storedPdf.pdf_url); setDaojiandanUrl(storedPdf.pdf_url);
setIsDaojiandanSigned(true); // localStorage 中的是已签名的
} else {
// 如果 localStorage 中没有导检单,调用接口获取未签名的导检单用于查看和签名
const fetchDaojiandan = async () => {
try {
const res = await getDaojiandanPdfApi({ exam_id: examId });
if (res.Status === 200 && res.Data?.pdf_url) {
const pdfUrlValue = res.Data.pdf_url;
// 不保存到 localStorage只用于显示和签名
setDaojiandanUrl(pdfUrlValue);
setIsDaojiandanSigned(false); // 接口获取的是未签名的
}
} catch (err) {
console.error('获取导检单失败', err);
}
};
fetchDaojiandan();
} }
// 检查加项单PDF // 检查加项单PDF
@@ -599,6 +618,7 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => {
const pdfUrlValue = res.Data.pdf_url; const pdfUrlValue = res.Data.pdf_url;
const pdfNameValue = res.Data.pdf_name || '导检单'; const pdfNameValue = res.Data.pdf_name || '导检单';
setDaojiandanUrl(pdfUrlValue); setDaojiandanUrl(pdfUrlValue);
setIsDaojiandanSigned(true); // 签名成功后标记为已签名
// 保存导检单PDF信息到localStorage // 保存导检单PDF信息到localStorage
setDaojiandanPdf(examId, { setDaojiandanPdf(examId, {
@@ -839,8 +859,8 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => {
return signedCombinationCodes.includes(Number(item.combination_code)); return signedCombinationCodes.includes(Number(item.combination_code));
}); });
// 检查导检单是否已签名 // 检查导检单是否已签名(只有 localStorage 中的或签名后的才是已签名的)
const daojiandanSigned = !!daojiandanUrl; const daojiandanSigned = isDaojiandanSigned;
return allConsentsSigned && consentList.length > 0 && daojiandanSigned; return allConsentsSigned && consentList.length > 0 && daojiandanSigned;
}; };
@@ -1167,7 +1187,7 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => {
<div className='flex items-center justify-between gap-3 p-2 rounded-xl border bg-white shadow-sm'> <div className='flex items-center justify-between gap-3 p-2 rounded-xl border bg-white shadow-sm'>
<div className='text-sm text-gray-800 truncate flex items-center gap-2 relative pr-20'> <div className='text-sm text-gray-800 truncate flex items-center gap-2 relative pr-20'>
<span className='truncate'></span> <span className='truncate'></span>
{daojiandanUrl && ( {isDaojiandanSigned && (
<img <img
src='/sign.png' src='/sign.png'
alt='已签名' alt='已签名'
@@ -1177,7 +1197,8 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => {
)} )}
</div> </div>
<div className='flex items-center gap-2'> <div className='flex items-center gap-2'>
{daojiandanUrl ? ( {isDaojiandanSigned ? (
// 已签名:显示打印和查看按钮
<> <>
<Button <Button
className='py-1.5 px-3 bg-blue-600 hover:bg-blue-700 text-white' className='py-1.5 px-3 bg-blue-600 hover:bg-blue-700 text-white'
@@ -1200,7 +1221,32 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => {
</Button> </Button>
</> </>
) : daojiandanUrl ? (
// 未签名但有导检单:显示查看和签名按钮
<>
<Button
className='py-1.5 px-3'
onClick={() => {
if (busy) return;
setShowDaojiandanPreview(true);
}}
disabled={busy}
>
</Button>
<Button
className='py-1.5 px-3'
onClick={() => {
if (busy) return;
setShowDaojiandanSignature(true);
}}
disabled={busy}
>
</Button>
</>
) : ( ) : (
// 没有导检单:只显示签名按钮
<Button <Button
className='py-1.5 px-3' className='py-1.5 px-3'
onClick={() => { onClick={() => {