From cf069c74ec43ac08972b081c432ea889f26ff082 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Thu, 30 Jul 2026 12:18:19 +0800 Subject: [PATCH] feat(oa): add person select control with contains conditions and print Register FormCreate person field (dept-aligned UI), enable contains-only workflow conditions, and format person values in print/related summary. Co-authored-by: Cursor --- backend/app/services/oa_related_approval.py | 2 +- backend/tests/test_oa_related_approval.py | 24 ++ .../2026-07-30-oa-person-select-design.md | 2 +- .../src/assets/styles/core/oa-fc-runtime.scss | 17 + .../components/oa-approval/OaPersonSelect.vue | 382 ++++++++++++++++++ .../flow-tree/ConditionRuleEditor.vue | 87 +++- .../components/oa-approval/flow-tree/types.ts | 4 +- .../oa-approval/oa-condition-fields.ts | 16 +- web-admin/src/main.ts | 2 + web-admin/src/oa-fc-host/main.ts | 13 +- web-admin/src/utils/oa-approval-print.ts | 7 + web-admin/src/utils/oa-form-create-person.ts | 17 + web-admin/src/utils/oa-person-select-rule.ts | 60 +++ 13 files changed, 618 insertions(+), 15 deletions(-) create mode 100644 web-admin/src/components/oa-approval/OaPersonSelect.vue create mode 100644 web-admin/src/utils/oa-form-create-person.ts create mode 100644 web-admin/src/utils/oa-person-select-rule.ts diff --git a/backend/app/services/oa_related_approval.py b/backend/app/services/oa_related_approval.py index b7ab4e50..cc81a608 100644 --- a/backend/app/services/oa_related_approval.py +++ b/backend/app/services/oa_related_approval.py @@ -104,7 +104,7 @@ def _format_value(typ: str, raw: Any) -> Tuple[str, bool]: else: n = 0 return f"已关联 {n} 条", False - if typ == "dept": + if (typ == "dept" or typ == "person"): if isinstance(raw, list): names = [] for x in raw: diff --git a/backend/tests/test_oa_related_approval.py b/backend/tests/test_oa_related_approval.py index 12dbd410..22bb9081 100644 --- a/backend/tests/test_oa_related_approval.py +++ b/backend/tests/test_oa_related_approval.py @@ -61,6 +61,30 @@ class TestFlatten(unittest.TestCase): self.assertEqual(by_label["部门"], "中科兴皖 / 研发") self.assertEqual(by_label["多部门"], "中科兴皖 / 研发、中科兴皖 / 质量") + def test_person_formats_names(self): + schema = { + "rule": [ + {"type": "person", "field": "p1", "title": "协同人"}, + { + "type": "person", + "field": "p2", + "title": "多人", + "props": {"multiple": True}, + }, + ] + } + data = { + "p1": {"id": "u1", "name": "张三"}, + "p2": [ + {"id": "u1", "name": "张三"}, + {"id": "u2", "name": "李四"}, + ], + } + fields = flatten_form_fields_for_summary(schema, data) + by_label = {f["label"]: f["value"] for f in fields} + self.assertEqual(by_label["协同人"], "张三") + self.assertEqual(by_label["多人"], "张三、李四") + def test_related_approval_field_includes_related_ids(self): schema = { "rule": [ diff --git a/docs/superpowers/specs/2026-07-30-oa-person-select-design.md b/docs/superpowers/specs/2026-07-30-oa-person-select-design.md index 75c2ebc0..f8d80dfb 100644 --- a/docs/superpowers/specs/2026-07-30-oa-person-select-design.md +++ b/docs/superpowers/specs/2026-07-30-oa-person-select-design.md @@ -3,7 +3,7 @@ **日期:** 2026-07-30 **范围:** `web-admin` 审批设计器步骤 2(表单设计)+ 步骤 3(条件分支)+ 发起/详情/打印运行时;`backend` 发布白名单、发起校验、条件匹配 **关联:** `docs/superpowers/specs/2026-07-27-oa-dept-select-design.md`;`docs/superpowers/specs/2026-07-15-oa-condition-from-form-design.md`;`docs/superpowers/specs/2026-07-30-oa-money-field-design.md` -**状态:** 已评审待实现 +**状态:** 已实现 --- diff --git a/web-admin/src/assets/styles/core/oa-fc-runtime.scss b/web-admin/src/assets/styles/core/oa-fc-runtime.scss index 28b07d06..e92afc12 100644 --- a/web-admin/src/assets/styles/core/oa-fc-runtime.scss +++ b/web-admin/src/assets/styles/core/oa-fc-runtime.scss @@ -32,15 +32,20 @@ .el-form-item { width: 100%; + max-width: 100%; + min-width: 0; margin-right: 0; } .el-form-item__content { width: 100%; + max-width: 100%; + min-width: 0; } .el-input, .el-select, + .el-tree-select, .el-cascader, .el-textarea, .el-input-number, @@ -48,6 +53,18 @@ .el-date-editor.el-input, .el-date-editor.el-input__wrapper { width: 100%; + max-width: 100%; + } + + /* 自定义控件根节点:防止 padding/边框撑破列宽 */ + .oa-dept-select, + .oa-money-field, + .oa-person-select, + .oa-related-approval { + box-sizing: border-box; + width: 100%; + max-width: 100%; + min-width: 0; } /* FormCreate 上传:达到 limit 后隐藏上传入口(原 component-elm-upload style) */ diff --git a/web-admin/src/components/oa-approval/OaPersonSelect.vue b/web-admin/src/components/oa-approval/OaPersonSelect.vue new file mode 100644 index 00000000..ea416d34 --- /dev/null +++ b/web-admin/src/components/oa-approval/OaPersonSelect.vue @@ -0,0 +1,382 @@ + + + + + + diff --git a/web-admin/src/components/oa-approval/flow-tree/ConditionRuleEditor.vue b/web-admin/src/components/oa-approval/flow-tree/ConditionRuleEditor.vue index 63176776..4d4eee89 100644 --- a/web-admin/src/components/oa-approval/flow-tree/ConditionRuleEditor.vue +++ b/web-admin/src/components/oa-approval/flow-tree/ConditionRuleEditor.vue @@ -48,7 +48,25 @@ /> + + +