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 @@
+
+
+
+
+ {{ displayText || '—' }}
+
+
+
+
+
+
+
+
+
暂无人员
+
+
+
+
+ 取消
+
+
+
+ 确定
+
+
+
+
+
+
+
+ {{ u.label }}
+ {{ u.sub }}
+
+
+
+
+
+
+
+
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 @@
/>
onValueChange(idx, Array.isArray(v) ? v.map(String) : [])"
+ >
+
+
+