tuqin
2 天以前 601eca3d487e9833ffc6253579bb85496f767f23
分支
用户 tuqin <tuqin@tuqin.cn>
星期四, 十一月 5, 2026 16:18 +0800
提交者 tuqin <tuqin@tuqin.cn>
星期四, 十一月 5, 2026 16:18 +0800
提交601eca3d487e9833ffc6253579bb85496f767f23
目录 224b18a26ab07ee08f66a7e896f41b01ad4057a5 目录 | zip | gz
上一版本 1d372d5e4916eaecf9b773e52e0d887d4fd0e47a 查看 | 对比
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 字节;
- 普通角色账号(非超管、非管理员)保存 → 仍正确报「你不是该流程的管理员」,权限校验未被削弱。
已添加1个文件
已修改1个文件
54 ■■■■■ 文件已修改
sql/mysql/bpm_fix_model_manager_and_rev.sql 31 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java 23 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史