来源:变更 flow-model-version-management
时间:2026-05-09
流程版本需要标记不同状态(待部署、已部署、已发布、已归档),并严格控制状态流转规则,避免误操作导致流程混乱。
0 = 待部署(草稿)
1 = 已部署(已提交到 Flowable)
2 = 已发布(正式使用,可发起流程)
3 = 已归档(历史版本,不可发起)
待部署 (0)
└─ 部署 → 已部署 (1)
└─ 发布 → 已发布 (2)
└─ 归档 → 已归档 (3)
❌ 不允许逆向流转(已发布不能退回已部署)
❌ 不允许跳过状态(待部署不能直接发布)
规则:每个模型只能有一个 is_primary=1 的版本
场景1:新版本发布
- 当前主版本 is_primary 设为 0
- 新版本 is_primary 设为 1
场景2:版本回退
- 当前主版本 is_primary 设为 0
- 目标历史版本 is_primary 设为 1
- ⚠️ 需确认无运行实例或实例已完成
场景3:版本删除
- 删除非主版本:直接删除
- 删除主版本:禁止删除(必须先发布新版本)
public enum VersionStatus {
DRAFT(0, "待部署"),
DEPLOYED(1, "已部署"),
PUBLISHED(2, "已发布"),
ARCHIVED(3, "已归档");
public boolean canTransitionTo(VersionStatus target) {
return switch (this) {
case DRAFT -> target == DEPLOYED;
case DEPLOYED -> target == PUBLISHED;
case PUBLISHED -> target == ARCHIVED;
case ARCHIVED -> false; // 已归档,不可流转
};
}
}
// 发布校验
public void publishVersion(String versionId) {
FlowModelVersion version = getById(versionId);
if (!version.getStatus().canTransitionTo(PUBLISHED)) {
throw new BusinessException("当前状态不允许发布");
}
// 设置主版本
clearPrimaryVersion(version.getModelId());
version.setIsPrimary(1);
version.setStatus(PUBLISHED);
updateById(version);
}
| 异常 | 检查点 | 处理 |
|---|---|---|
| 重复部署 | version 已存在 | 拒绝,提示"版本号已存在" |
| 主版本冲突 | 多个 is_primary=1 | 自动修复:保留最新版本 |
| 状态非法流转 | 已发布→已部署 | 拒绝,提示"不可逆向流转" |
| 删除主版本 | is_primary=1 | 拒绝,提示"必须先发布新版本" |