feat(签署方式): 扩展为手写板/短信/Pad/公众号四种并集中口径

This commit is contained in:
yelan
2026-09-25 12:09:58 +08:00
parent bd89a4d31a
commit 8ec55e48c9
26 changed files with 1864 additions and 688 deletions
@@ -17,8 +17,9 @@
* 只声明实际用到的字段,不绑定文档库页面的类型,避免 utils 反向依赖 views。
*/
import type { SigningFieldDef, SigningMethod, SigningTemplate } from '@/api/workbench/types'
import type { SigningFieldDef, SigningTemplate } from '@/api/workbench/types'
import { ALL_SIGNING_METHODS } from './signing-method'
import { buildFieldSpanHtml } from './signing-fields'
import { MOCK_STORAGE_KEYS, readMockState, writeMockState } from './mock-storage'
@@ -311,7 +312,7 @@ export function readLocalSigningTemplates(): SigningTemplate[] {
campusId: document.campusId ?? undefined,
category: category.name,
description: document.description ?? '',
supportedMethods: ['pad', 'sms'] as SigningMethod[],
supportedMethods: [...ALL_SIGNING_METHODS],
contentHtml: document.contentHtml,
contentSha256: document.contentSha256,
})),
+141
View File
@@ -0,0 +1,141 @@
/**
* 签署方式的取值口径与文案(原型 V10.2 的四种)。
*
* 为什么要单独成文件:文案在发起签署弹窗、任务卡、详情动作、记录表、报表维度五处都要用,
* 各写一份会随口径漂移而悄悄不一致(新增方式后列表静默显示成短信)。
*
* **原型里没有「通道」这一层**,四个取值都是平铺的,各处按具体取值精确分支;
* 唯一存在归并的地方是任务卡的「待签署」标签(`readPendingTag`),
* 那也照抄原型的三分支,不是「现场/线上」两分。
*/
import type { BackendSigningMethod, SigningMethod } from '@/api/workbench/types'
export interface SigningMethodDescriptor {
key: SigningMethod
/** 发起签署弹窗里的完整文案(原型 #mdNew 的 D 区四张卡片) */
title: string
/** 任务卡与列表用的短文案 */
short: string
/** 筛选项文案(记录查询与报表两处沿用各自原型的写法) */
filterLabel: string
/** 短文案前的图标(原型 methodLabel 同款) */
icon: string
/**
* 原型 methodLabel 的完整写法(任务详情、报表维度、导出用)。
*
* 单独给字段而不是拼 `${icon} ${short}签署`:原型里 `ipad` 是「📲 Pad 签署」——
* 拉丁词与「签署」之间**有空格**,而中文词(手写板 / 短信 / 公众号)之间没有。
* 拼接会在 Pad 上丢空格,与原型不一致(报表维度那一行会变成「📲 Pad签署」)。
*/
label: string
}
/** 顺序与原型 #mdNew 的 D 区一致:现场两种在前,线上两种在后 */
export const SIGNING_METHODS: readonly SigningMethodDescriptor[] = [
{
key: 'pad',
title: '手写板原笔迹签署(现场)',
short: '手写板',
filterLabel: '手写板',
icon: '✍️',
label: '✍️ 手写板签署',
},
{
key: 'sms',
title: '短信链接签署(患者移动端 H5)',
short: '短信',
filterLabel: '短信线上',
icon: '📱',
label: '📱 短信签署',
},
{
key: 'ipad',
title: 'Pad 移动端签署(床旁/诊间)',
short: 'Pad',
filterLabel: 'Pad',
icon: '📲',
label: '📲 Pad 签署',
},
{
key: 'wx',
title: '微信公众号签署(患者微信内签署)',
short: '公众号',
filterLabel: '公众号',
icon: '💬',
label: '💬 公众号签署',
},
]
const METHOD_BY_KEY = new Map<SigningMethod, SigningMethodDescriptor>(
SIGNING_METHODS.map((item) => [item.key, item]),
)
/**
* 全部四种方式。演示数据里模板一律声明全部允许 ——
* 原型没有「按文书限制签署方式」这个概念,`supportedMethods` 是本仓库的扩展位。
*/
export const ALL_SIGNING_METHODS: readonly SigningMethod[] = SIGNING_METHODS.map((item) => item.key)
/** 取方式描述。遇到未知取值按现场手写板兜底,避免列表出现空白单元格 */
export function readSigningMethod(method: SigningMethod): SigningMethodDescriptor {
return METHOD_BY_KEY.get(method) ?? SIGNING_METHODS[0]
}
/** 前端取值 → 后端取值,一一对应,不做任何归并 */
export function toBackendSigningMethod(method: SigningMethod): BackendSigningMethod {
return method.toUpperCase() as BackendSigningMethod
}
/** 带图标的短文案,如「✍️ 手写板」 */
export function formatSigningMethod(method: SigningMethod): string {
const descriptor = readSigningMethod(method)
return `${descriptor.icon} ${descriptor.short}`
}
/** 原型 methodLabel:✍️ 手写板签署 / 📲 Pad 签署 / 💬 公众号签署 / 📱 短信签署 */
export function formatSigningMethodTitle(method: SigningMethod): string {
return readSigningMethod(method).label
}
/**
* 任务卡的「待签署」标签。
*
* 配色照抄原型 renderTasks 的三分支:`pad` / `ipad` / 其余(`sms` 与 `wx` 共用短信紫)。
* 文案按**具体取值**给出(原型对 `wx` 也写「待签署·短信」,那是它漏改的老文案;
* 本仓库的取值是四个平铺值,写清楚是哪种更不容易看错)。
*/
export function readPendingTag(method: SigningMethod): { className: string; text: string } {
const className = method === 'pad' ? 'tg-pad' : method === 'ipad' ? 'tg-ipad' : 'tg-sms'
return { className, text: `待签署·${readSigningMethod(method).short}` }
}
/**
* 「方式」筛选项。原型两处的选项**并不一样**,所以分开维护,别合并成一份:
* - 记录查询 `#qMethod`:3 项(手写板 / 短信线上 / Pad),**没有公众号**;
* - 报表分析 `#repMethod`:4 项(手写板 / Pad / 短信 / 公众号),且短信写作「短信」。
*/
export interface SigningMethodFilterOption {
value: SigningMethod
label: string
}
export const WORKBENCH_METHOD_FILTERS: readonly SigningMethodFilterOption[] = [
{ value: 'pad', label: '手写板' },
{ value: 'sms', label: '短信线上' },
{ value: 'ipad', label: 'Pad' },
]
export const REPORT_METHOD_FILTERS: readonly SigningMethodFilterOption[] = [
{ value: 'pad', label: '手写板' },
{ value: 'ipad', label: 'Pad' },
{ value: 'sms', label: '短信' },
{ value: 'wx', label: '公众号' },
]
/**
* 切换签署方式(原型 switchMethod:`m || (curTask.method === 'pad' ? 'sms' : 'pad')`)。
* 原型就是「手写板 ↔ 短信」二选一,Pad / 公众号一律回到手写板。
*/
export function toggleSigningMethod(method: SigningMethod): SigningMethod {
return method === 'pad' ? 'sms' : 'pad'
}