fix(bpm): 修复流程模型修改后保存报「你不是该流程的管理员」
现象:流程模型 → 修改某条 → 第三步流程设计 → 保存,报
「操作流程失败,原因:你不是该流程(合同审批)的管理员」;
管理员问题修掉后又会变成「系统异常」
(FlowableOptimisticLockingException: was updated by another transaction concurrently)。
根因有两个,都在 validateModelManager / saveModel 链路上:
1) updateModel 是「先校验管理员、后写入」,校验读的是库里 META_INFO_ 的值。
而这批模型从旧备份恢复过来,managerUserIds 是空数组或整个字段缺失,
于是永久校验失败——前端即使传了新的 managerUserIds 也没用(校验不看请求体),
属于无法自愈的死锁。
2) act_re_model.REV_(Flowable 乐观锁版本号)有 14 条为 NULL,
saveModel 的 UPDATE 条件带 REV_ = ?,为 NULL 时匹配不到行,
Flowable 判定为并发修改 → 抛 OptimisticLockingException → 前端「系统异常」。
修复:
- validateModelManager 改为三层判定:
① 未配置管理员(空/缺失)→ 放行,并 warn 记录;
② 当前用户在管理员列表里 → 放行;
③ 当前用户是超级管理员(super_admin)→ 放行。
这样模型一旦被保存成只含某个具体账号,超管和换账号的人也还能继续维护。
- 新增 SQL 脚本 bpm_fix_model_manager_and_rev.sql:
补齐 managerUserIds(空数组/缺失 → [1])与 REV_(NULL → 1)。
已在 mom-zyjc 执行:20 个模型全部补齐。
实测(mom-zyjc,超管角色账号):
- 数据库管理员=[1]、当前用户非 1 时保存 → code:0(日志:超级管理员,放行);
- 保存后 REV_ 1 → 3,流程图写入 1884 字节;
- 普通角色账号(非超管、非管理员)保存 → 仍正确报「你不是该流程的管理员」,权限校验未被削弱。