fix(签署文书): 按字段分配页眉取值下划线宽度

This commit is contained in:
yelan
2026-09-16 17:35:45 +08:00
parent 51ec0f393d
commit 0d271d90be
4 changed files with 35 additions and 16 deletions
+4 -1
View File
@@ -464,7 +464,7 @@ function buildDocumentHeader(doc: Document, answers: SigningAnswers): HTMLElemen
const header = doc.createElement('header')
header.className = 'sign-doc-header'
SIGNING_DOCUMENT_HEADER.forEach(({ id, label }) => {
SIGNING_DOCUMENT_HEADER.forEach(({ id, label, valueWidthEm }) => {
const item = doc.createElement('span')
item.className = 'sign-doc-header__item'
@@ -476,6 +476,9 @@ function buildDocumentHeader(doc: Document, answers: SigningAnswers): HTMLElemen
const valueElement = doc.createElement('span')
valueElement.className = 'sign-doc-header__value'
valueElement.textContent = typeof value === 'string' ? value : ''
// 宽度随字段走(而不是写死在样式里):页眉四项要挤在一行,
// 各字段需要的下划线长度差别很大,样式里只能给一个统一值,容易撑到换行
valueElement.style.minWidth = `${valueWidthEm}em`
item.appendChild(labelElement)
item.appendChild(valueElement)
+21 -5
View File
@@ -44,6 +44,19 @@ export const SIGNING_FIELD_PRESETS: SigningFieldDef[] = [
{ id: 'doctor', label: '医师签名', kind: 'signature', required: false, options: [] },
]
/**
* 固定页眉的一项。
* valueWidthEm 是取值下划线的宽度(em):页眉要在一行内放下四项,
* 按内容长度分配比统一宽度更省地方——性别、年龄只有一个字/两位数字,
* 用和「住院号/门诊号」一样的长度就会把整行挤到换行。
*/
export interface SigningHeaderField {
/** 字段键,与 SIGNING_FIELD_PRESETS 对应 */
id: string
label: string
valueWidthEm: number
}
/**
* 文书固定页眉。
*
@@ -54,12 +67,15 @@ export const SIGNING_FIELD_PRESETS: SigningFieldDef[] = [
* 因为页眉是系统渲染的只读展示(不挂 data-sign-field),
* 它既不会出现在"填写项"统计里,也不会被写进签署证据——
* 患者信息以任务快照为准,页眉只是把快照展示出来。
*
* 宽度预算:A4 版心约 680px,四项标签合计约 250px、项间距约 54px,
* 取值下划线合计控制在约 290px 以内,留出余量保证一行放得下。
*/
export const SIGNING_DOCUMENT_HEADER: Array<{ id: string; label: string }> = [
{ id: 'patient', label: '患者姓名' },
{ id: 'sex', label: '性别' },
{ id: 'age', label: '年龄' },
{ id: 'visit', label: '住院号/门诊号' },
export const SIGNING_DOCUMENT_HEADER: SigningHeaderField[] = [
{ id: 'patient', label: '患者姓名', valueWidthEm: 5.5 },
{ id: 'sex', label: '性别', valueWidthEm: 2.8 },
{ id: 'age', label: '年龄', valueWidthEm: 3.2 },
{ id: 'visit', label: '住院号/门诊号', valueWidthEm: 9 },
]
/**
@@ -455,11 +455,12 @@ function syncPreviewFields() {
max-width: 100%;
}
/* 固定页眉:患者基本信息由 HIS 自动带出,与正文之间用一条横线分隔 */
/* 固定页眉:患者基本信息由 HIS 自动带出,与正文之间用一条横线分隔。
四项要在一行内放下,取值下划线的宽度由字段定义给出(内联 min-width),样式里不再写死 */
.signing-preview :deep(.sign-doc-header) {
display: flex;
flex-wrap: wrap;
gap: 12px 26px;
gap: 10px 18px;
padding-bottom: 10px;
margin-bottom: 16px;
border-bottom: 1.5px solid #52646e;
@@ -467,7 +468,7 @@ function syncPreviewFields() {
.signing-preview :deep(.sign-doc-header__item) {
display: inline-flex;
gap: 4px;
gap: 3px;
align-items: baseline;
}
@@ -478,8 +479,7 @@ function syncPreviewFields() {
}
.signing-preview :deep(.sign-doc-header__value) {
min-width: 6.5em;
padding: 0 6px 1px;
padding: 0 5px 1px;
color: #1c2b33;
font-size: 12.5px;
text-align: center;
@@ -333,11 +333,12 @@ defineExpose({ getDocumentElement })
max-width: 100%;
}
/* 固定页眉:患者基本信息由 HIS 自动带出,与正文之间用一条横线分隔 */
/* 固定页眉:患者基本信息由 HIS 自动带出,与正文之间用一条横线分隔。
四项要在一行内放下,取值下划线的宽度由字段定义给出(内联 min-width),样式里不再写死 */
.sign-doc-body :deep(.sign-doc-header) {
display: flex;
flex-wrap: wrap;
gap: 12px 26px;
gap: 10px 18px;
padding-bottom: 10px;
margin-bottom: 16px;
border-bottom: 1.5px solid #52646e;
@@ -345,7 +346,7 @@ defineExpose({ getDocumentElement })
.sign-doc-body :deep(.sign-doc-header__item) {
display: inline-flex;
gap: 4px;
gap: 3px;
align-items: baseline;
}
@@ -356,8 +357,7 @@ defineExpose({ getDocumentElement })
}
.sign-doc-body :deep(.sign-doc-header__value) {
min-width: 6.5em;
padding: 0 6px 1px;
padding: 0 5px 1px;
color: #1c2b33;
font-size: 12.5px;
text-align: center;