feat(签署工作台): 补代签标签、关联处方卡、线上等待态与只读副本
按原型 V10.2 详情页补齐四块: - 任务列表「代签」标签(原型 .vtag.chk 橙底):SigningTaskRecord 增加 signerType / signerRelation,仅签署人非「本人」时显示。 有意偏离:关系为空时不输出空括号(原型会渲染成「家属代签()」)。 - 「关联处方」可折叠卡(原型 rxCard):新建 api/workbench/prescriptions.ts 统一处方来源,把弹窗里那份搬过来消除重复,并新增详情用的 7 列明细。 原型两处处方口径本就不同(弹窗按就诊号哈希、详情按任务号派生),分开维护不合并。 真实模式返回空 → 整卡不渲染,不显示空表(会被读成「系统查过了,确实没处方」)。 顺带按原型调了详情卡片顺序:文书 → 签署文件 → 关联处方 → 操作留痕。 - 短信 / 公众号待签署的等待态(原型 .tg-wait):号码取后端 smsMobileMasked, 没有值时不拼号码,不拿患者档案里的号码冒充发送目标。 - 已签署的「在线预览(PDF)」与「只读副本」: 预览弹窗复用 SigningDocumentInteractive(只读态),保证预览 / 工作台 / 导出 PDF 三处版式一致;只读副本走 signing-pdf 新增的 watermark 选项, 在 html2canvas 克隆体上平铺斜排水印,审计编号直接用任务号。 水印行数按克隆体 scrollHeight 算,写死行数会让长文书下半部分没水印。
This commit is contained in:
@@ -49,6 +49,7 @@ import { downloadSigningPdf } from '@/utils/signing-pdf'
|
||||
|
||||
import OnlineSigningDialog from './components/OnlineSigningDialog.vue'
|
||||
import SignaturePadDialog from './components/SignaturePadDialog.vue'
|
||||
import SignedDocumentDialog from './components/SignedDocumentDialog.vue'
|
||||
import SigningFilterBar from './components/SigningFilterBar.vue'
|
||||
import SigningTaskDetail from './components/SigningTaskDetail.vue'
|
||||
import SigningTaskList from './components/SigningTaskList.vue'
|
||||
@@ -128,6 +129,8 @@ const newDialogVisible = ref(false)
|
||||
const signatureDialogVisible = ref(false)
|
||||
const onlineDialogVisible = ref(false)
|
||||
const voidDialogVisible = ref(false)
|
||||
/** 已签署文书的在线预览弹窗(原型 openPdfView) */
|
||||
const signedPreviewVisible = ref(false)
|
||||
const taskDetailRef = ref<InstanceType<typeof SigningTaskDetail> | null>(null)
|
||||
const pdfExporting = ref(false)
|
||||
|
||||
@@ -271,6 +274,8 @@ async function loadTaskDetail(id: string | null) {
|
||||
fieldSignatureInjections.value = {}
|
||||
pendingSignatureField.value = null
|
||||
fieldSignatureDialogVisible.value = false
|
||||
// 预览弹窗跟着任务走:换任务时留在上一份文书的预览上会让人以为看的是当前任务
|
||||
signedPreviewVisible.value = false
|
||||
|
||||
if (!id) {
|
||||
selectedTask.value = null
|
||||
@@ -531,7 +536,11 @@ async function handleTaskAction(action: SigningTaskAction, targetMethod?: Signin
|
||||
(action === 'resend-sms' && canDeliveryWrite.value) ||
|
||||
(action === 'reopen' && canReopenTask.value) ||
|
||||
(action === 'void' && canVoidTask.value) ||
|
||||
((action === 'download-pdf' || action === 'download-signature' || action === 'print') &&
|
||||
(action === 'preview-signed' && canViewArtifacts.value) ||
|
||||
((action === 'download-pdf' ||
|
||||
action === 'download-signature' ||
|
||||
action === 'download-readonly-copy' ||
|
||||
action === 'print') &&
|
||||
canDownloadArtifacts.value)
|
||||
|
||||
if (!allowed) {
|
||||
@@ -619,6 +628,16 @@ async function handleTaskAction(action: SigningTaskAction, targetMethod?: Signin
|
||||
return
|
||||
}
|
||||
|
||||
if (action === 'preview-signed') {
|
||||
signedPreviewVisible.value = true
|
||||
return
|
||||
}
|
||||
|
||||
if (action === 'download-readonly-copy') {
|
||||
await exportReadonlyCopy()
|
||||
return
|
||||
}
|
||||
|
||||
if (action === 'print') {
|
||||
ElMessage.info('原型演示:打印服务待接入')
|
||||
return
|
||||
@@ -695,6 +714,43 @@ async function exportSignedPdf() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 只读副本:在按任务固化版式渲染的结果上加「水印 + 审计编号」再导出。
|
||||
*
|
||||
* 与原件的区别是用途:原件是对内留存的正式凭证,只读副本是对外提供的那一份,
|
||||
* 因此必须能一眼看出不是原件。水印直接烙进截图,改不掉文本层。
|
||||
* 审计编号直接用任务号 —— 它是全链路可追溯的真实标识,
|
||||
* 另外编一个前端生成的编号只会让追溯断在这里。
|
||||
*/
|
||||
async function exportReadonlyCopy() {
|
||||
const task = selectedTask.value
|
||||
const element = taskDetailRef.value?.getDocumentElement()
|
||||
|
||||
if (!task || !element) {
|
||||
ElMessage.info('该任务没有固化的文书正文,无法生成只读副本')
|
||||
return
|
||||
}
|
||||
|
||||
if (pdfExporting.value) {
|
||||
return
|
||||
}
|
||||
|
||||
pdfExporting.value = true
|
||||
|
||||
try {
|
||||
await downloadSigningPdf({
|
||||
element,
|
||||
fileName: `${task.documentName}-${task.id}-只读副本`,
|
||||
watermark: `只读副本 · 审计编号 ${task.id}`,
|
||||
})
|
||||
ElMessage.success('只读副本已生成(含水印与审计编号)')
|
||||
} catch {
|
||||
ElMessage.error('只读副本生成失败,请稍后重试')
|
||||
} finally {
|
||||
pdfExporting.value = false
|
||||
}
|
||||
}
|
||||
|
||||
async function downloadArtifact(artifact: SigningArtifact) {
|
||||
if (!canDownloadArtifacts.value) {
|
||||
ElMessage.warning('当前账号没有下载签署文件的权限')
|
||||
@@ -917,6 +973,14 @@ onMounted(() => {
|
||||
@complete="completeOnlineSignature"
|
||||
@resend="handleOnlineResend"
|
||||
/>
|
||||
<SignedDocumentDialog
|
||||
:visible="signedPreviewVisible"
|
||||
:task="selectedTask"
|
||||
:exporting="pdfExporting"
|
||||
@close="signedPreviewVisible = false"
|
||||
@download="handleTaskAction('download-pdf')"
|
||||
@download-readonly-copy="exportReadonlyCopy"
|
||||
/>
|
||||
<VoidTaskDialog
|
||||
:visible="voidDialogVisible"
|
||||
:task="selectedTask"
|
||||
|
||||
Reference in New Issue
Block a user