问题
流程设计器里,审批节点(approval)的 Approvers → Value 目前是个 datalist 组合框,数据源接的是
client.list(type) → GET /api/v1/meta/:type(metadata 注册表端点)。
但 user / team / department / queue 这些处理人是数据记录(躺在 sys_user / sys_team /
sys_business_unit 等系统对象里),不在 metadata 注册表里。结果候选恒为空,控件退化成
纯手填——作者只能手动敲 userid / 团队 id,失去了"选择"能力。
设计器本应按 spec 里已声明的 xRef(approval.zod.ts 的 value.meta.xRef,把每个 type 映射到
user/position/team/… picker)出记录选择器,现实现图省事接到了 metadata 端点。
实测证据(console preview-gallery,无后端)
在 flow 设计器加一个 approval 节点,把 Type 切成 User:
- Value
<input> 实测 list = null、候选数 = 0 → 就是个纯文本框;
- 抓到它发的请求:
GET /api/v1/meta/user(注册表端点,列不出用户记录)。
Type=Team / Department / Queue 同理(都查 /meta/:type,恒空)。
三点核实结论(以引擎为准,不是 zod 描述)
数据来源:packages/plugins/plugin-approvals/src/approval-service.ts 的
resolveApproverSpec() + 各 expand*Users()。
1. 是否全单选 —— 是
引擎里每个 approver 行的 value 一律是单个标量(全程 String(a.value),没有哪种类型在一行里吃
数组)。多个审批人 = approvers 数组里多行。所以设计器控件应为「每行单选」。
注:field 类型运行时能展开成多人,但那是记录字段里存了多个 id(csvSplit(record[value])),
不是设计器里在一行里多选出来的。
2. Value 各类型到底存什么(引擎确认)
| Type |
引擎如何使用 value |
存值 |
user |
applyOooDelegation(String(value))(L442) |
sys_user id |
team |
find('sys_team_member', { team_id: value })(L486) |
sys_team id |
department |
find('sys_business_unit', { id: value })(L502) |
sys_business_unit id(注意不是 sys_department) |
position |
find('sys_user_position', { position: value })(L550) |
sys_position name(机器名),非 id |
org_membership_level |
展开 owner/admin/member 三档 |
枚举串,非记录 |
manager |
record[value] ?? record.owner_id(L470) |
字段名(可选,通常留空) |
field |
record[value] 取用户 id/ids |
触发对象字段名 |
queue |
引擎里没有 queue 分支 → 落到 ['queue:'+value] 死值 |
运行时未实现 |
3. 是否只有 position 存 name —— 不完全是
- 在「要查记录」的类型里:
user/team/department 存 id,只有 position 存 name —— 这句成立。
- 但「非 id 值」不止 position:
org_membership_level 是枚举、field/manager 是字段名 ——
它们根本不是记录,不该套记录 lookup。
- 另有
queue 在引擎里未实现(resolveApproverSpec 无 queue 分支,只有 BFS 里一个同名局部变量),
选了也不会解析到任何人。
建议修复
A. 设计器(objectui packages/app-shell)—— 主体改动
复用 @object-ui/fields 的 LookupField(单选,useAdapter() 提供 DataSource),按类型分组渲染
Approvers 的 Value:
- 记录 lookup(单选):
user → sys_user,存 id
team → sys_team,存 id
department → sys_business_unit,存 id
position → sys_position,存 name(非 id)
- 不做记录 lookup:
org_membership_level → 严格 Select(owner/admin/member 闭合枚举,顺手防 sales_manager 这类脏值)
field → 维持对象字段选择器(现状可用)
manager → Value 框禁用 + 提示「由提交人上级自动解析」(或作为可选字段名)
queue → 暂保留手填 + 提示「运行时未支持」(见 B)
涉及:
packages/app-shell/src/views/metadata-admin/inspectors/FlowReferenceField.tsx
(KIND_TO_META_TYPE / useMetadataListOptions 现在把这些类型接到 /meta/:type)
packages/app-shell/src/views/metadata-admin/inspectors/flow-node-config.ts(approvers 列定义)
B. 引擎(framework plugin-approvals)—— queue 决策
resolveApproverSpec 缺 queue 分支。要么补上 queue 展开逻辑,要么把 queue 从
approval.zod.ts 的 approver type 枚举里移除/标注 deprecated,别让设计器提供一个运行时不生效的选项。
风险 / 待确认
- 设计器过去是纯 metadata、不查数据;接 lookup 后要在设计器里查
sys_user 等记录(需当前用户有读权限)。
- 预览画廊无后端,这几类仍会退化成手填(可接受,离线态)。
position 存 name、department→sys_business_unit 这两处映射需重点测。
验收
- 设计器审批节点:User/Team/Department 能弹记录选择器并选中,提交后 value 是对应 id;
- Position 选中后 value 是
sys_position.name;
- org_membership_level 为严格三选一;manager 无输入框;queue 处理见 B;
- 每种类型改动后在真机(带后端)逐一验证解析到正确的人。
问题
流程设计器里,审批节点(approval)的 Approvers → Value 目前是个 datalist 组合框,数据源接的是
client.list(type)→GET /api/v1/meta/:type(metadata 注册表端点)。但
user / team / department / queue这些处理人是数据记录(躺在sys_user/sys_team/sys_business_unit等系统对象里),不在 metadata 注册表里。结果候选恒为空,控件退化成纯手填——作者只能手动敲 userid / 团队 id,失去了"选择"能力。
设计器本应按 spec 里已声明的
xRef(approval.zod.ts的value.meta.xRef,把每个 type 映射到user/position/team/… picker)出记录选择器,现实现图省事接到了 metadata 端点。
实测证据(console preview-gallery,无后端)
在 flow 设计器加一个 approval 节点,把 Type 切成 User:
<input>实测list = null、候选数= 0→ 就是个纯文本框;GET /api/v1/meta/user(注册表端点,列不出用户记录)。Type=Team / Department / Queue 同理(都查
/meta/:type,恒空)。三点核实结论(以引擎为准,不是 zod 描述)
数据来源:
packages/plugins/plugin-approvals/src/approval-service.ts的resolveApproverSpec()+ 各expand*Users()。1. 是否全单选 —— 是
引擎里每个 approver 行的
value一律是单个标量(全程String(a.value),没有哪种类型在一行里吃数组)。多个审批人 =
approvers数组里多行。所以设计器控件应为「每行单选」。2. Value 各类型到底存什么(引擎确认)
userapplyOooDelegation(String(value))(L442)sys_useridteamfind('sys_team_member', { team_id: value })(L486)sys_teamiddepartmentfind('sys_business_unit', { id: value })(L502)sys_business_unitid(注意不是 sys_department)positionfind('sys_user_position', { position: value })(L550)sys_positionname(机器名),非 idorg_membership_levelmanagerrecord[value] ?? record.owner_id(L470)fieldrecord[value]取用户 id/idsqueue['queue:'+value]死值3. 是否只有 position 存 name —— 不完全是
user/team/department存 id,只有position存 name —— 这句成立。org_membership_level是枚举、field/manager是字段名 ——它们根本不是记录,不该套记录 lookup。
queue在引擎里未实现(resolveApproverSpec无 queue 分支,只有 BFS 里一个同名局部变量),选了也不会解析到任何人。
建议修复
A. 设计器(objectui
packages/app-shell)—— 主体改动复用
@object-ui/fields的LookupField(单选,useAdapter()提供 DataSource),按类型分组渲染Approvers 的 Value:
user→sys_user,存 idteam→sys_team,存 iddepartment→sys_business_unit,存 idposition→sys_position,存 name(非 id)org_membership_level→ 严格Select(owner/admin/member 闭合枚举,顺手防sales_manager这类脏值)field→ 维持对象字段选择器(现状可用)manager→ Value 框禁用 + 提示「由提交人上级自动解析」(或作为可选字段名)queue→ 暂保留手填 + 提示「运行时未支持」(见 B)涉及:
packages/app-shell/src/views/metadata-admin/inspectors/FlowReferenceField.tsx(
KIND_TO_META_TYPE/useMetadataListOptions现在把这些类型接到/meta/:type)packages/app-shell/src/views/metadata-admin/inspectors/flow-node-config.ts(approvers 列定义)B. 引擎(framework
plugin-approvals)—— queue 决策resolveApproverSpec缺queue分支。要么补上 queue 展开逻辑,要么把queue从approval.zod.ts的 approver type 枚举里移除/标注 deprecated,别让设计器提供一个运行时不生效的选项。风险 / 待确认
sys_user等记录(需当前用户有读权限)。position存 name、department→sys_business_unit这两处映射需重点测。验收
sys_position.name;