From 44ec203dea5ba87f3ed58aa09e2e21d2921e7533 Mon Sep 17 00:00:00 2001 From: xianyi Date: Tue, 6 Jan 2026 10:23:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=93=E5=8D=B0=E6=8C=89?= =?UTF-8?q?=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/exam/ExamSignPanel.tsx | 80 ++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/src/components/exam/ExamSignPanel.tsx b/src/components/exam/ExamSignPanel.tsx index 85724e9..b3b899f 100644 --- a/src/components/exam/ExamSignPanel.tsx +++ b/src/components/exam/ExamSignPanel.tsx @@ -1119,7 +1119,20 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => { padding: 0; } .print-button { - display: none; + position: fixed; + top: 20px; + right: 20px; + padding: 10px 20px; + background-color: #2563eb; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; + z-index: 1000; + } + .print-button:hover { + background-color: #1d4ed8; } img { display: block; @@ -1220,7 +1233,20 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => { padding: 0; } .print-button { - display: none; + position: fixed; + top: 20px; + right: 20px; + padding: 10px 20px; + background-color: #2563eb; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; + z-index: 1000; + } + .print-button:hover { + background-color: #1d4ed8; } img { display: block; @@ -1376,6 +1402,41 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => { } } + // 处理加项单(如果有且已签名) + if (addItemBillUrl && isAddItemBillSigned) { + try { + const response = await fetch(addItemBillUrl); + if (response.ok) { + const blob = await response.blob(); + const arrayBuffer = await blob.arrayBuffer(); + + const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise; + + for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) { + const page = await pdf.getPage(pageNum); + const viewport = page.getViewport({ scale }); + + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d'); + if (!context) continue; + + canvas.height = viewport.height; + canvas.width = viewport.width; + + const renderContext = { + canvasContext: context, + viewport: viewport, + } as any; + + await page.render(renderContext).promise; + allImages.push(canvas.toDataURL('image/png')); + } + } + } catch (err) { + console.error('处理加项单失败', err); + } + } + if (allImages.length === 0) { alert('没有可打印的内容'); return; @@ -1416,7 +1477,20 @@ export const ExamSignPanel = ({ examId, onBusyChange }: ExamSignPanelProps) => { padding: 0; } .print-button { - display: none; + position: fixed; + top: 20px; + right: 20px; + padding: 10px 20px; + background-color: #2563eb; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; + z-index: 1000; + } + .print-button:hover { + background-color: #1d4ed8; } img { display: block;