From d835c869e2f9ac70bd95bfd7697d8b4d3e5909e2 Mon Sep 17 00:00:00 2001 From: yelan Date: Wed, 7 Oct 2026 19:48:13 +0800 Subject: [PATCH] =?UTF-8?q?fix(signing):=20=E7=BB=9F=E4=B8=80=E6=80=A7?= =?UTF-8?q?=E5=88=AB=E5=BD=92=E4=B8=80=E9=80=BB=E8=BE=91=EF=BC=8C=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E6=96=87=E4=B9=A6=E6=98=BE=E7=A4=BA=E8=8B=B1=E6=96=87?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clinical-web/src/api/workbench/signing.ts | 12 ++++-------- clinical-web/src/utils/signing-document.ts | 8 ++++++++ clinical-web/src/utils/signing-fields.ts | 22 +++++++++++++++++++++- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/clinical-web/src/api/workbench/signing.ts b/clinical-web/src/api/workbench/signing.ts index c2ff0f0..53bac76 100644 --- a/clinical-web/src/api/workbench/signing.ts +++ b/clinical-web/src/api/workbench/signing.ts @@ -10,6 +10,7 @@ import { mockFlags } from '@/utils/mock-flags' import { readLocalSigningTemplates } from '@/utils/mock-document-library' import { MOCK_STORAGE_KEYS, readMockState, writeMockState } from '@/utils/mock-storage' import { request } from '@/utils/request' +import { normalizeSexLabel } from '@/utils/signing-fields' import { ALL_SIGNING_METHODS, formatSigningMethod, @@ -683,16 +684,11 @@ function formatApiDate(value: string | null | undefined) { return formatApiDateTime(value).slice(0, 10) } +/** 与文书渲染同一条口径(utils/signing-fields 的 normalizeSexLabel),避免两处各认一套枚举 */ function normalizePatientSex(value: string): PatientSex { - if (value === 'MALE' || value === '男') { - return '男' - } + const label = normalizeSexLabel(value) - if (value === 'FEMALE' || value === '女') { - return '女' - } - - return '未知' + return label === '男' || label === '女' ? label : '未知' } function normalizeVisitType(value: string): VisitType { diff --git a/clinical-web/src/utils/signing-document.ts b/clinical-web/src/utils/signing-document.ts index 675c6f3..7c359e2 100644 --- a/clinical-web/src/utils/signing-document.ts +++ b/clinical-web/src/utils/signing-document.ts @@ -27,6 +27,7 @@ import { collectStructuredFieldIds, FIELD_ELEMENT_SELECTOR, FIELD_TOKEN_OPEN, + normalizeSexLabel, PRIMARY_SIGNATURE_FIELD_ID, readFieldFromElement, resolveAnswersFromSystem, @@ -775,6 +776,13 @@ export function buildSigningDocumentHtml( ...(data.fieldAnswers ?? {}), } + // 性别在文书上必须落成中文:后端的填写结果里可能是 HIS 的英文枚举(MALE / FEMALE), + // 它会盖掉患者快照那一路的归一值,所以只在两路合并之后收口一次 —— + // 不这样做的话,工作台列表显示「男」、点开文书却是「MALE」。 + if (typeof answers.sex === 'string') { + answers.sex = normalizeSexLabel(answers.sex) + } + if (data.signatureDataUrl && !answers.signature) { answers.signature = data.signatureDataUrl } diff --git a/clinical-web/src/utils/signing-fields.ts b/clinical-web/src/utils/signing-fields.ts index 2f8f8de..859bad2 100644 --- a/clinical-web/src/utils/signing-fields.ts +++ b/clinical-web/src/utils/signing-fields.ts @@ -1057,11 +1057,31 @@ export interface SigningSystemSnapshot { signatureDataUrl?: string } +/** + * 性别取值归一:HIS / 患者就诊快照可能给 `MALE` / `FEMALE` 这类英文枚举, + * 而文书上要印的是「男」/「女」——文书是要打印、要留档的,不能夹着原始枚举值。 + * + * 认不出的取值原样返回,而不是抹成空:多一个没见过的枚举让它照抄原文, + * 也比把已有信息变成空白强(性别在文书上是核对项,不是纯展示项)。 + */ +export function normalizeSexLabel(value: string): string { + switch (value.trim().toUpperCase()) { + case 'MALE': + case '男': + return '男' + case 'FEMALE': + case '女': + return '女' + default: + return value.trim() + } +} + /** 把患者/就诊快照映射成填写项初值,字段键即 SIGNING_FIELD_PRESETS 的 id。 */ export function resolveAnswersFromSystem(snapshot: SigningSystemSnapshot): SigningAnswers { return { patient: snapshot.patientName ?? '', - sex: snapshot.sex ?? '', + sex: normalizeSexLabel(snapshot.sex ?? ''), age: snapshot.age === undefined || snapshot.age === null ? '' : String(snapshot.age), visit: snapshot.visitNo ?? '', phone: snapshot.phone ?? '',