一句话说明
审批流一旦提交,后续各节点的审批人就只能来自提交那一刻的记录快照($trigger)。流程跑起来之后,无论是「前一个审批人决定下一批审批人」,还是用节点重新算出来的审批人,都喂不进后面的审批节点。这类「运行中动态确定审批人」的能力目前缺失。
核心问题
审批人的解析被绑死在提交时的不可变快照上,缺一条「在节点进入时、按当前实时状态确定审批人」的路径。于是所有动态审批路由(上一步决定下一步审批人 / 动态会签 / 临时指定协办部门 / 依据流程中产生的数据分派)都无法用声明式方式表达。
具体表现(目前已确认的两个口子)
{type: 'field'} 审批人只读 $trigger 快照(主证据,已真机确认):审批人来源为记录字段时,value 锚定 $trigger(schema xRef.objectSource='$trigger'),提交后再改该字段读不到。
- 审批人无法引用流变量:
get_record 能在流程中把实时记录读进流变量,但审批人的 value 只能绑 $trigger、不能指向该变量,所以「先重查再据此定审批人」这条路也走不通。
补充:平台已有的 Reassign(转派)是逐条请求的手动动态改派,能救急;但缺的是声明式、自动的「节点进入时按实时状态定审批人」。
场景(业务视角)
不合格品审批:① 质检部部长审批 → ② 部长在这一步选择要并行会审的几个部门 → ③ 被选部门并行会签 → ④ 工厂长终审。第 ② 步部长选的部门展开成审批人写进记录字段,③ 用该字段当审批人——但 ③ 读的是 ① 提交时的旧快照,读不到部长中途填的人。
对照实验(16.1.0 真机)
| 审批人(记录字段)何时确定 |
后续并行节点解析到的审批人 |
| 提交之前就定好 |
✅ 正确(多选用户字段能 fan-out 成多个会审人) |
| 提交之后、流程中途定 |
❌ 空(读的是 $trigger 提交快照) |
顺带确认:多选用户字段 → 多个并行审批人的 fan-out 本身是支持的,问题只在「中途确定读不到」。
期望
支持在节点进入时按实时状态确定审批人。可选实现(由易到通用):
- 节点进入时对
field 型审批人按记录 id 重查实时值(最小改动,直接解决主场景);
- 允许审批人
value 引用流变量(get_record 刷新后喂给节点),覆盖「先重查再定人」;
- 提供计算型 / 动态审批人来源(如
type: 'expression' 或节点级 resolver 钩子),一次性覆盖任意「按流程中数据分派」的动态路由。
倾向 #1 保底、#2/#3 作为更通用的演进。
最小复现
- 对象加多选用户字段
approvers_dynamic(初始空);
- 流:节点A(固定审批人,如
type: 'position')→ 节点B({type: 'field', value: 'approvers_dynamic'},behavior: 'unanimous');
- 提交进 A → 审批 A 期间往
approvers_dynamic 写 2 个用户 → 通过 A;
- 看 B 的
sys_approval_request.pending_approvers:空(期望那 2 人);
- 对照:提交前写好
approvers_dynamic → B 正确解析出 2 人。
环境
@objectstack/spec 16.1.0,运行时 16.x;ApprovalsServicePlugin;流类型 record_change;审批人 {type: 'field'}
一句话说明
审批流一旦提交,后续各节点的审批人就只能来自提交那一刻的记录快照(
$trigger)。流程跑起来之后,无论是「前一个审批人决定下一批审批人」,还是用节点重新算出来的审批人,都喂不进后面的审批节点。这类「运行中动态确定审批人」的能力目前缺失。核心问题
审批人的解析被绑死在提交时的不可变快照上,缺一条「在节点进入时、按当前实时状态确定审批人」的路径。于是所有动态审批路由(上一步决定下一步审批人 / 动态会签 / 临时指定协办部门 / 依据流程中产生的数据分派)都无法用声明式方式表达。
具体表现(目前已确认的两个口子)
{type: 'field'}审批人只读$trigger快照(主证据,已真机确认):审批人来源为记录字段时,value锚定$trigger(schemaxRef.objectSource='$trigger'),提交后再改该字段读不到。get_record能在流程中把实时记录读进流变量,但审批人的value只能绑$trigger、不能指向该变量,所以「先重查再据此定审批人」这条路也走不通。场景(业务视角)
不合格品审批:① 质检部部长审批 → ② 部长在这一步选择要并行会审的几个部门 → ③ 被选部门并行会签 → ④ 工厂长终审。第 ② 步部长选的部门展开成审批人写进记录字段,③ 用该字段当审批人——但 ③ 读的是 ① 提交时的旧快照,读不到部长中途填的人。
对照实验(16.1.0 真机)
$trigger提交快照)顺带确认:多选用户字段 → 多个并行审批人的 fan-out 本身是支持的,问题只在「中途确定读不到」。
期望
支持在节点进入时按实时状态确定审批人。可选实现(由易到通用):
field型审批人按记录 id 重查实时值(最小改动,直接解决主场景);value引用流变量(get_record刷新后喂给节点),覆盖「先重查再定人」;type: 'expression'或节点级 resolver 钩子),一次性覆盖任意「按流程中数据分派」的动态路由。倾向 #1 保底、#2/#3 作为更通用的演进。
最小复现
approvers_dynamic(初始空);type: 'position')→ 节点B({type: 'field', value: 'approvers_dynamic'},behavior: 'unanimous');approvers_dynamic写 2 个用户 → 通过 A;sys_approval_request.pending_approvers:空(期望那 2 人);approvers_dynamic→ B 正确解析出 2 人。环境
@objectstack/spec16.1.0,运行时 16.x;ApprovalsServicePlugin;流类型record_change;审批人{type: 'field'}