feat(签署工作台): 按原型分流签名位点击,Pad 任务就地落笔并补齐弹窗标题
This commit is contained in:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user