现象
一条 record_change flow 串了多个 approval 节点,各节点 lockRecord 配置不同时:
- 服务端行为是正确的 ——
lockRecord: false 的节点上记录可以正常编辑保存(plugin-approvals 的 beforeUpdate 锁钩子里明确 if (config?.lockRecord === false) return;)。
- 但 Console 记录详情页顶部的「审批中已锁定 / Locked for approval」band + 「撤回审批 / Recall approval」按钮,在所有 pending 节点上都照常渲染,不区分当前节点的
lockRecord。
结果是:同一个 band 在「记录能改」和「记录被锁死」两种完全相反的状态下长得一模一样,用户无法从界面区分。
复现
- 定义一个
record_change flow,串两个 approval 节点:
- 节点 A:
lockRecord: false
- 节点 B:
lockRecord: true
- 提交审批,流程停在节点 A。
- 打开该记录的详情页。
实际:顶部渲染「Locked for approval」band 和「Recall approval」按钮。但从「编辑」进去改任意字段并保存 —— 保存成功,值正常落库。
- 审批通过,流程进入节点 B。再次打开详情页 —— band 与节点 A 完全一致,但此时编辑保存会被服务端拒绝:
RECORD_LOCKED: record is locked while an approval is in progress
预期:当前 pending 节点的 lockRecord 为 false 时不应渲染锁定 band;或者至少让文案区分「审批中(可编辑)」与「审批中已锁定」两种状态。
影响
提示与平台自身的行为不一致 —— 平台明明支持按节点关闭锁、而且这个开关真的生效,但 UI 不读它。
实际业务里的表现:审批链上的单人节点(部门负责人 / 厂长)通常配 lockRecord: false,本意就是允许审批人在审批时补充内容;但审批人看到「已锁定」就不会去尝试编辑,这个能力等于不存在。反过来,真正锁死的并行会审节点,用户又得点进编辑表单填完一屏,才在点保存时被服务端拒掉。
我们这边测试同学据此得出了「整个审批流程都会锁记录」的结论,与实际情况不符,排查花了不少时间。
定位线索
环境
@objectstack/plugin-approvals 16.1.0
- Console(objectui)随该版本
现象
一条
record_changeflow 串了多个approval节点,各节点lockRecord配置不同时:lockRecord: false的节点上记录可以正常编辑保存(plugin-approvals的beforeUpdate锁钩子里明确if (config?.lockRecord === false) return;)。lockRecord。结果是:同一个 band 在「记录能改」和「记录被锁死」两种完全相反的状态下长得一模一样,用户无法从界面区分。
复现
record_changeflow,串两个 approval 节点:lockRecord: falselockRecord: true实际:顶部渲染「Locked for approval」band 和「Recall approval」按钮。但从「编辑」进去改任意字段并保存 —— 保存成功,值正常落库。
RECORD_LOCKED: record is locked while an approval is in progress预期:当前 pending 节点的
lockRecord为false时不应渲染锁定 band;或者至少让文案区分「审批中(可编辑)」与「审批中已锁定」两种状态。影响
提示与平台自身的行为不一致 —— 平台明明支持按节点关闭锁、而且这个开关真的生效,但 UI 不读它。
实际业务里的表现:审批链上的单人节点(部门负责人 / 厂长)通常配
lockRecord: false,本意就是允许审批人在审批时补充内容;但审批人看到「已锁定」就不会去尝试编辑,这个能力等于不存在。反过来,真正锁死的并行会审节点,用户又得点进编辑表单填完一屏,才在点保存时被服务端拒掉。我们这边测试同学据此得出了「整个审批流程都会锁记录」的结论,与实际情况不符,排查花了不少时间。
定位线索
packages/plugin-detail(DetailView approval band,参见src/__tests__/DetailView.approvalBand.test.tsx),i18n keydetail.lockedByApprovalapproval_statusfield) #2618fix(detail): show the "Locked for approval" band on request-tracked backends—— 该次修复让 band 在「存在 pending approval request」时显示,疑似未带上节点lockRecord的判定packages/plugins/plugin-approvals/src/lifecycle-hooks.ts;节点配置快照已经存在sys_approval_request.node_config_json里,band 可以从同一来源读出lockRecord,不需要额外接口环境
@objectstack/plugin-approvals16.1.0