feat(签署工作台): 按原型分流签名位点击,Pad 任务就地落笔并补齐弹窗标题

This commit is contained in:
yelan
2026-09-27 18:55:23 +08:00
parent c6262726d7
commit 2a0681287c
3 changed files with 63 additions and 9 deletions
+15
View File
@@ -108,6 +108,21 @@ export function formatSigningMethodTitle(method: SigningMethod): string {
return readSigningMethod(method).label
}
/**
* 手写签名板弹窗的标题(原型 `padTitle`)。
*
* **只有两个分支**,不是按四种方式各给一条文案 —— 原型的写法是
* `padTask.method==='ipad' ? '📲 Pad 签署' : '✍️ 手写板签署'`(openPad,V10.2 第 2281 行)。
*
* 为什么不能直接用 `formatSigningMethodTitle(method)`:
* 这个弹窗采的是「就地手写」,与任务声明的线上方式无关。
* `sms` / `wx` 任务点「手写板签署」按钮一样会进这里,那时标题写「📱 短信签署」是错的;
* 只有 `switchToIpad()` 把任务方式改成 `ipad` 后再点文书签名位,才写「📲 Pad 签署」。
*/
export function readPadDialogTitle(method: SigningMethod): string {
return readSigningMethod(method === 'ipad' ? 'ipad' : 'pad').label
}
/**
* 任务卡的「待签署」标签。
*
@@ -1,8 +1,9 @@
<script setup lang="ts">
import { nextTick, ref, useId, watch } from 'vue'
import { computed, nextTick, ref, useId, watch } from 'vue'
import { ElMessage } from 'element-plus'
import type { SigningTaskRecord } from '@/api/workbench/types'
import { readPadDialogTitle } from '@/utils/signing-method'
import SignatureCanvas from './SignatureCanvas.vue'
@@ -13,19 +14,26 @@ const props = withDefaults(
defineProps<{
visible: boolean
task: SigningTaskRecord | null
/** 弹窗标题:任务级是「手写板签署」,按签名位采集时传字段名(如「医师签名」) */
/**
* 弹窗标题。任务级**不传**,按当前签署方式取(原型 `padTitle`:
* 「✍️ 手写板签署」/「📲 Pad 签署」—— 在平板上签却写着「手写板签署」是错的);
* 按签名位采集时才传字段名(如「采集「医师签名」」)。
*/
title?: string
/** 说明这一笔签名要落在哪里,避免医师签在了患者签名位 */
hint?: string
confirmLabel?: string
}>(),
{
title: '手写板签署',
title: undefined,
hint: '请患者在下框内签名(当前为 Canvas 演示,真实手写板接入走设备适配器):',
confirmLabel: '确认签署',
},
)
/** 标题:按签名位采集时用调用方给的,任务级按当前方式(原型 padTitle) */
const dialogTitle = computed(() => props.title ?? readPadDialogTitle(props.task?.method ?? 'pad'))
const emit = defineEmits<{
close: []
confirm: [signatureDataUrl: string]
@@ -74,7 +82,7 @@ function confirmSignature() {
:aria-labelledby="titleId"
>
<header class="dialog-header">
<strong :id="titleId">{{ title }}</strong>
<strong :id="titleId">{{ dialogTitle }}</strong>
<span>{{ task.patientName }} · {{ task.documentName }}</span>
<button type="button" class="dialog-close" aria-label="关闭" @click="emit('close')">
×
@@ -43,6 +43,7 @@ import NewSigningTaskDialog from '@/components/signing/NewSigningTaskDialog.vue'
import { useAppStore } from '@/stores/app'
import { useLoginStore } from '@/stores/login'
import type { SigningFieldProgress, SigningSignatureRequest } from '@/utils/signing-document'
import { PRIMARY_SIGNATURE_FIELD_ID } from '@/utils/signing-fields'
import { formatSigningMethodTitle, readSigningMethod, toggleSigningMethod } from '@/utils/signing-method'
import { downloadSigningPdf } from '@/utils/signing-pdf'
@@ -462,14 +463,44 @@ async function assertSigningReady() {
}
}
/** 点击文中签名位:先记下采的是哪一个,再由弹窗把签名图回灌到该位置 */
function handleSignatureRequest(request: SigningSignatureRequest) {
if (!selectedTask.value) {
/**
* 点击文中签名位。
*
* 分两条路 —— 原型 renderPreview 给每个签名位挂的 onclick 是
* `if(curTask.method==='sms')openPhone();else openPad();`,且只挂在「待签署」任务上。
*
* ① **主签名位**(患者签名,`PRIMARY_SIGNATURE_FIELD_ID`)正是任务级签署要采的那一笔,
* 与「手写板签署 / Pad 签署」按钮走的是同一件事,所以必须开**任务级**弹窗。
* 这条不能少:Pad 方式的按钮只负责「把文书滚到签名位」(原型 openIpad 不弹窗),
* 真正落笔就是靠点这个签名位 —— 若这里只回灌一张图而不结束任务,
* Pad 任务就会永远停在「待签署」。
* 短信任务照原型走患者端 H5 页(患者在自己手机上签,不是在这台电脑上画)。
* ② 其余签名位(医师签名……)是本仓库在原型之外的扩展:它们只是文书上的填写项,
* 采完只回填该位置、不结束任务,所以走签名位弹窗。
*/
async function handleSignatureRequest(request: SigningSignatureRequest) {
const task = selectedTask.value
if (!task) {
return
}
pendingSignatureField.value = request
fieldSignatureDialogVisible.value = true
if (request.fieldId !== PRIMARY_SIGNATURE_FIELD_ID || task.status !== 'pending') {
pendingSignatureField.value = request
fieldSignatureDialogVisible.value = true
return
}
if (task.method === 'sms') {
await handleTaskAction('online-sign')
return
}
if (!(await assertSigningReady())) {
return
}
signatureDialogVisible.value = true
}
function closeFieldSignatureDialog() {