feat(签署): 支持文书填写项与签名回显

This commit is contained in:
yelan
2026-09-16 15:54:40 +08:00
parent b15df82be2
commit 5361839cf2
10 changed files with 1178 additions and 164 deletions
+8 -1
View File
@@ -23,6 +23,7 @@ import type {
SignTaskEventResponseDto,
SignTaskResponseDto,
SignTaskSendPreparationResponseDto,
SigningAnswers,
SigningApiOptions,
SigningMethod,
SigningTaskEvent,
@@ -351,6 +352,8 @@ function cloneTask(task: SigningTaskRecord): SigningTaskRecord {
...task,
// 勾选结果是数组,浅拷贝会让调用方和内存数据共享同一个引用
selectedItems: task.selectedItems ? [...task.selectedItems] : task.selectedItems,
// 填写项取值同理,调用方会就地改动它
fieldAnswers: task.fieldAnswers ? { ...task.fieldAnswers } : task.fieldAnswers,
}
}
@@ -1008,6 +1011,7 @@ export function completeSigningTask(
id: string,
signatureDataUrl: string,
selectedItems: string[] = [],
fieldAnswers: SigningAnswers = {},
): Promise<SigningTaskRecord | null> {
if (!useMockData) {
throw new Error('真实签署需要通过签署投递与文件上传接口完成')
@@ -1025,6 +1029,8 @@ export function completeSigningTask(
task.updatedAt = task.signedAt
// 勾选结果随签署一起固化,否则重新打开文书会丢掉患者勾了哪些项
task.selectedItems = [...selectedItems]
// 填写项取值(含签名图)随签署一起固化:重新打开文书时按原位置回显
task.fieldAnswers = { ...fieldAnswers, signature: signatureDataUrl }
persistMockRecords()
return Promise.resolve(cloneTask(task))
}
@@ -1050,8 +1056,9 @@ export async function reopenSigningTask(
task.status = 'pending'
task.signatureDataUrl = undefined
task.signedAt = undefined
// 重新发起等于重新签,上一次的勾选不再沿用
// 重新发起等于重新签,上一次的勾选与填写项取值都不再沿用
task.selectedItems = []
task.fieldAnswers = undefined
task.updatedAt = formatMockDate()
persistMockRecords()
return Promise.resolve(cloneTask(task))
+30
View File
@@ -167,6 +167,31 @@ export interface SigningTaskQuery extends PageQuery {
export type SigningDateRange = 'today' | 'yesterday' | '3d' | '7d' | 'all'
/**
* 文书填写项的控件类型。
* signature 与其他类型并列:签名是文书上的一个填写项,不是特殊的文本替换。
*/
export type SigningFieldKind = 'text' | 'date' | 'choice' | 'checkbox' | 'signature'
/** 文书里的一个填写项定义,由模板内容中的占位符解析得到。 */
export interface SigningFieldDef {
/** 稳定字段键:与 HIS / 患者快照取值一一对应,不随占位符显示文字变化 */
id: string
/** 文书中显示的文字 */
label: string
kind: SigningFieldKind
required: boolean
/** choice / checkbox 的可选项 */
options: string[]
/** 取值等于该字符串时视为异常项(如风险筛查选了"是") */
risk?: string
}
export type SigningFieldValue = string | boolean
/** 填写项取值,key 为 SigningFieldDef.id。 */
export type SigningAnswers = Record<string, SigningFieldValue>
export interface SigningTaskRecord extends WorkbenchTask {
templateVersionId: string
campus: WorkbenchCampus
@@ -192,6 +217,11 @@ export interface SigningTaskRecord extends WorkbenchTask {
documentContentHtml?: string
/** 原型:患者勾选结果,随签署一起留存(对应真实实现里随签署证据提交的勾选摘要)。 */
selectedItems?: string[]
/**
* 文书填写项取值(含签名图),签署时固化。
* 重新打开文书时用它回显,签名因此落在文书原本的签名位上。
*/
fieldAnswers?: SigningAnswers
}
export type SigningTaskListResponse = PageResult<SigningTaskRecord>