feat(签署方式): 扩展为手写板/短信/Pad/公众号四种并集中口径
This commit is contained in:
@@ -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,
|
||||
})),
|
||||
|
||||
@@ -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'
|
||||
}
|
||||
Reference in New Issue
Block a user