Skip to content

审批节点「处理人 Value」应改为记录 lookup(现查 metadata 端点→只能手填);附 approver value 语义核实 + queue 未实现 #3508

Description

@baozhoutao

问题

流程设计器里,审批节点(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.tsvalue.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/departmentid,只有 position 存 name —— 这句成立。
  • 但「非 id 值」不止 position:org_membership_level 是枚举、field/manager 是字段名 ——
    它们根本不是记录,不该套记录 lookup。
  • 另有 queue 在引擎里未实现(resolveApproverSpec 无 queue 分支,只有 BFS 里一个同名局部变量),
    选了也不会解析到任何人。

建议修复

A. 设计器(objectui packages/app-shell)—— 主体改动

复用 @object-ui/fieldsLookupField(单选,useAdapter() 提供 DataSource),按类型分组渲染
Approvers 的 Value:

  • 记录 lookup(单选):
    • usersys_user,存 id
    • teamsys_team,存 id
    • departmentsys_business_unit,存 id
    • positionsys_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 决策

resolveApproverSpecqueue 分支。要么补上 queue 展开逻辑,要么把 queue
approval.zod.ts 的 approver type 枚举里移除/标注 deprecated,别让设计器提供一个运行时不生效的选项。


风险 / 待确认

  • 设计器过去是纯 metadata、不查数据;接 lookup 后要在设计器里查 sys_user 等记录(需当前用户有读权限)。
  • 预览画廊无后端,这几类仍会退化成手填(可接受,离线态)。
  • position 存 name、departmentsys_business_unit 这两处映射需重点测。

验收

  • 设计器审批节点:User/Team/Department 能弹记录选择器并选中,提交后 value 是对应 id;
  • Position 选中后 value 是 sys_position.name;
  • org_membership_level 为严格三选一;manager 无输入框;queue 处理见 B;
  • 每种类型改动后在真机(带后端)逐一验证解析到正确的人。

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions