diff --git a/clinical-web/src/api/management/documents.ts b/clinical-web/src/api/management/documents.ts index 11a2e20..51db1f6 100644 --- a/clinical-web/src/api/management/documents.ts +++ b/clinical-web/src/api/management/documents.ts @@ -6,6 +6,8 @@ import { request } from '@/utils/request' import { collectFieldDefs } from '@/utils/signing-fields' import type { ApiResponse, PageResult } from '@/types/common' +import type { SigningFieldKind } from '@/api/workbench/types' + import type { BackendCollection, BackendPage, @@ -160,10 +162,27 @@ export function buildSignatureFieldsPayload(contentHtml: string): unknown[] { }) } +/** + * 后端对 formFields 的 `label` 有非空校验:整项名称为空时,`POST /v1/templates/{id}/versions` + * 直接返回 400「正文填写项标识、标签、类型无效或重复」——实测(2026-10-07,联调后端) + * 同一份请求只把 label 换上即可 200,与是否插在表格里无关。 + * + * 不能改用「插入时必须命名」来绕:勾选项在设计上就是无名的(正文里只显示一个方框, + * 这一格勾什么由表格相邻列交代,见 WordEditorDialog 的 MANUAL_BUTTONS), + * 所以名称兜底只落在**提交给后端的这一层**:正文与编辑器仍以 data-label 为准,纸面上不多出文字。 + */ +const FORM_FIELD_LABEL_FALLBACK: Record = { + checkbox: '勾选项', + choice: '选择项', + text: '填写项', + date: '日期', + signature: '签名', +} + export function buildFormFieldsPayload(contentHtml: string): unknown[] { return collectFieldDefs(contentHtml).map((field) => ({ id: field.id, - label: field.label, + label: field.label || FORM_FIELD_LABEL_FALLBACK[field.kind], kind: field.kind, required: field.required, options: field.options,