status: done created: 2026-05-08 confirmed: 2026-05-08 complexity: 🟡中等
现有流程管理功能缺少完善的版本管理能力,导致以下问题:
deploymentId 被新值覆盖,无法追溯某个版本对应的 BPMN XML完成后可验证以下能力:
后端链路:
forge-plugin-flow/service/impl/FlowModelServiceImpl.java:126-224(deployModel 方法)FlowModelServiceImpl.java:378-413(getModelVersions 方法)从 Flowable 查询历史版本前端链路:
forge-admin-ui/src/views/flow/model.vue:1-100(流程模型管理页面)数据库现状:
sys_flow_model(FlowModel.java:14-140)version (Integer):当前版本号,每次发布 +1deploymentId (String):Flowable 部署 ID,每次发布更新为新值processDefinitionId (String):Flowable 流程定义 IDbpmnXml (String):当前流程设计 XML,每次保存覆盖版本号管理:
FlowModelServiceImpl.java:158-167Flowable 部署:
FlowModelServiceImpl.java:183-200repositoryService.createDeployment() 部署 BPMN XML 和流程图modelKey + "_v" + version(如 leave_v2)历史版本查询:
FlowModelServiceImpl.java:378-413processDefinitionKey = modelKey 的所有 ProcessDefinition发现 1:版本信息分散
发现 2:回退技术可行性
发现 3:权限控制缺失
风险 1:存储成本增加
风险 2:版本回退误操作
功能 1:版本历史查看
sys_flow_model_version 表,按版本号倒序排列功能 2:版本对比
功能 3:版本回退
功能 4:版本标记更新
sys_flow_model_version 的 version_tag 字段版本创建时机:
版本号递增规则:
版本标记规则:
版本删除规则:
流程重要性等级:
权限矩阵: | 操作 | 普通流程(等级1) | 重要流程(等级2) | |------|------------------|------------------| | 版本回退 | 模型管理员权限 | 超级管理员权限 | | 版本删除 | 模型管理员权限 | 超级管理员权限 | | 版本标记更新 | 模型管理员权限 | 模型管理员权限 | | 版本历史查看 | 所有用户 | 所有用户 |
权限校验逻辑:
回退时正在运行实例的处理:
多版本并发运行管理:
自动命名规则:
变更说明规则:
| 字段 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | VARCHAR(64) | 主键(UUID) | PRIMARY KEY |
| model_id | VARCHAR(64) | 模型 ID | INDEX, NOT NULL |
| version | INT | 版本号 | NOT NULL |
| version_name | VARCHAR(100) | 版本名称 | NOT NULL |
| version_tag | VARCHAR(20) | 版本标记(draft/test/release/deprecated) | NOT NULL, DEFAULT 'draft' |
| bpmn_xml | TEXT | BPMN 流程定义 XML | NOT NULL |
| form_json | TEXT | 表单配置 JSON | NULLABLE |
| change_description | VARCHAR(500) | 变更说明 | NULLABLE |
| deployment_id | VARCHAR(64) | Flowable 部署 ID | NULLABLE |
| process_definition_id | VARCHAR(64) | Flowable 流程定义 ID | NULLABLE |
| publish_by | VARCHAR(64) | 发布人 | NOT NULL |
| publish_time | DATETIME | 发布时间 | NOT NULL |
| tenant_id | BIGINT | 租户 ID | NOT NULL, DEFAULT 1 |
| create_time | DATETIME | 创建时间 | NOT NULL |
| del_flag | INT | 删除标志(0-正常/1-删除) | NOT NULL, DEFAULT 0 |
索引设计:
ididx_model_version (model_id, version) — 快速查询模型版本历史idx_model_id (model_id) — 查询模型所有版本约束设计:
model_id, version) — 同一模型版本号唯一model_id REFERENCES sys_flow_model(id) — 关联模型| 操作 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 新增 | importance_level | INT | 流程重要性等级(1-普通/2-重要),默认值 1 |
SQL 变更脚本:
-- 新增版本历史表
CREATE TABLE `sys_flow_model_version` (
`id` VARCHAR(64) PRIMARY KEY COMMENT '主键',
`model_id` VARCHAR(64) NOT NULL COMMENT '模型ID',
`version` INT NOT NULL COMMENT '版本号',
`version_name` VARCHAR(100) NOT NULL COMMENT '版本名称',
`version_tag` VARCHAR(20) NOT NULL DEFAULT 'draft' COMMENT '版本标记',
`bpmn_xml` TEXT NOT NULL COMMENT 'BPMN XML',
`form_json` TEXT COMMENT '表单配置',
`change_description` VARCHAR(500) COMMENT '变更说明',
`deployment_id` VARCHAR(64) COMMENT '部署ID',
`process_definition_id` VARCHAR(64) COMMENT '流程定义ID',
`publish_by` VARCHAR(64) NOT NULL COMMENT '发布人',
`publish_time` DATETIME NOT NULL COMMENT '发布时间',
`tenant_id` BIGINT NOT NULL DEFAULT 1 COMMENT '租户ID',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`del_flag` INT NOT NULL DEFAULT 0 COMMENT '删除标志',
UNIQUE KEY `uk_model_version` (`model_id`, `version`),
INDEX `idx_model_id` (`model_id`)
) ENGINE=InnoDB CHARSET=utf8mb4 COMMENT='流程模型版本历史表';
-- 修改模型表新增重要性等级字段
ALTER TABLE `sys_flow_model`
ADD COLUMN `importance_level` INT NOT NULL DEFAULT 1 COMMENT '重要性等级(1-普通/2-重要)' AFTER `status`;
| 操作 | 接口路径 | 方法 | 变更内容 |
|---|---|---|---|
| 新增 | GET /flow/model/version/list | pageVersionList | 分页查询版本历史(参数:modelId, pageNum, pageSize) |
| 新增 | GET /flow/model/version/{versionId} | getVersionDetail | 查询版本详情(返回:BPMN XML、表单配置、流程图) |
| 新增 | POST /flow/model/version/compare | compareVersions | 版本对比(参数:modelId, version1, version2) |
| 新增 | POST /flow/model/version/revert | revertVersion | 版本回退(参数:modelId, targetVersion, changeDescription) |
| 新增 | PUT /flow/model/version/{versionId}/tag | updateVersionTag | 更新版本标记(参数:versionId, versionTag) |
| 新增 | DELETE /flow/model/version/{versionId} | deleteVersion | 删除版本(仅允许删除草稿/测试版本) |
| 新增 | GET /flow/model/version/download/{versionId} | downloadVersion | 下载版本 BPMN XML |
| 修改 | POST /flow/model/deploy/{modelId} | deployModel | 发布时插入版本历史记录(参数新增:changeDescription) |
1. GET /flow/model/version/list
modelId (String): 模型 IDpageNum (Integer): 页码,默认 1pageSize (Integer): 每页数量,默认 20json
{
"code": 200,
"data": {
"records": [
{
"id": "v1_uuid",
"modelId": "model_uuid",
"version": 1,
"versionName": "v1",
"versionTag": "release",
"changeDescription": "初始版本",
"publishBy": "admin",
"publishTime": "2026-05-01 10:00:00",
"deploymentId": "dep_v1"
}
],
"total": 10,
"pageNum": 1,
"pageSize": 20
}
}
2. POST /flow/model/version/compare
json
{
"modelId": "model_uuid",
"version1": 1,
"version2": 2
}
json
{
"code": 200,
"data": {
"addedNodes": [{"id": "node_3", "name": "财务审批"}],
"modifiedNodes": [{"id": "node_1", "oldName": "经理审批", "newName": "部门审批"}],
"deletedNodes": [],
"addedFlows": [{"id": "flow_3", "source": "node_1", "target": "node_3"}],
"modifiedFlows": [],
"deletedFlows": [{"id": "flow_2"}]
}
}
3. POST /flow/model/version/revert
json
{
"modelId": "model_uuid",
"targetVersion": 1,
"changeDescription": "回退到稳定版本"
}
json
{
"code": 200,
"data": {
"newVersionId": "v4_uuid",
"newVersion": 4,
"deploymentId": "dep_v4",
"runningInstances": 5
},
"message": "回退成功,正在运行的 5 个实例将继续按旧版本执行"
}
4. PUT /flow/model/version/{versionId}/tag
versionId (String): 版本 IDversionTag (String): 新标记(draft/test/release/deprecated)json
{
"code": 200,
"message": "版本标记更新成功"
}
5. DELETE /flow/model/version/{versionId}
versionId (String): 版本 IDjson
{
"code": 200,
"message": "版本删除成功"
}
6. POST /flow/model/deploy/{modelId}(修改)
changeDescription (String): 变更说明,可选sys_flow_model_version新增文件:forge-admin-ui/src/api/flow/version.ts
// 版本历史查询
export function getVersionList(modelId: string, pageNum: number, pageSize: number) {
return request.get('/flow/model/version/list', { params: { modelId, pageNum, pageSize } })
}
// 版本详情查询
export function getVersionDetail(versionId: string) {
return request.get(`/flow/model/version/${versionId}`)
}
// 版本对比
export function compareVersions(modelId: string, version1: number, version2: number) {
return request.post('/flow/model/version/compare', { modelId, version1, version2 })
}
// 版本回退
export function revertVersion(modelId: string, targetVersion: number, changeDescription?: string) {
return request.post('/flow/model/version/revert', { modelId, targetVersion, changeDescription })
}
// 更新版本标记
export function updateVersionTag(versionId: string, versionTag: string) {
return request.put(`/flow/model/version/${versionId}/tag`, { versionTag })
}
// 删除版本
export function deleteVersion(versionId: string) {
return request.delete(`/flow/model/version/${versionId}`)
}
// 下载版本 BPMN XML
export function downloadVersion(versionId: string) {
return request.get(`/flow/model/version/download/${versionId}`, { responseType: 'blob' })
}
Controller 权限注解示例:
@PostMapping("/version/revert")
@SaCheckPermission("flow:model:revert") // 权限标识
@OperationLog(module = "流程管理", operation = "版本回退", description = "回退到 v{targetVersion}")
public RespInfo<VersionRevertVO> revertVersion(@RequestBody VersionRevertDTO dto) {
// 权限分级校验逻辑在 Service 层实现
return RespInfo.success(flowModelVersionService.revertVersion(dto));
}
flow:model:revert、flow:model:version:delete,需在系统菜单管理中配置flow_version_tag(草稿/测试/正式发布/已废弃)flow_importance_level(普通流程/重要流程)⚠️ 涉及资金/状态流转/权限变更,已标注并需经人工审查
风险描述:
缓解措施:
审查要点:
风险描述:
缓解措施:
审查要点:
风险描述:
缓解措施:
审查要点:
风险描述:
缓解措施:
审查要点:
风险描述:
缓解措施:
审查要点:
风险描述:
缓解措施:
审查要点:
单元测试:
集成测试:
端到端测试:
code-copilot/changes/flow-model-version-management/test-spec.md场景 1:版本回退后正在运行实例的完整性
场景 2:重要流程权限控制
场景 3:版本对比准确性
场景 4:版本删除限制
场景 5:连续回退版本号递增
✅ 所有技术决策已确认,可进入
/apply执行阶段
| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| 数据库表创建 | ✅已完成 | forge/forge-admin-server/src/main/resources/sql/flow_version_init.sql | 新增 sys_flow_model_version 表 + 修改 sys_flow_model 表 + 新增字典数据 + 权限配置 SQL,提交:d96a582 + ddf186b |
| FlowModel 实体修改 | ✅已完成 | forge-plugin-flow/entity/FlowModel.java | 新增 importanceLevel 字段,提交:1c685c9 |
| FlowModelVersion 实体创建 | ✅已完成 | forge-plugin-flow/entity/FlowModelVersion.java | 新增版本历史实体(14字段),提交:3078874 |
| 字典数据新增 | ✅已完成(Task 1) | flow_version_init.sql(Task 1 已包含) | 新增 flow_version_tag + flow_importance_level 字典,无需单独提交 |
| FlowModelVersionMapper 创建 | ✅已完成 | forge-plugin-flow/mapper/FlowModelVersionMapper.java + XML | 新增版本 Mapper(3个查询方法),提交:dbc41ec |
| 版本相关 DTO/VO 创建 | ✅已完成 | dto/(3个DTO)+ vo/(3个VO) | 新增 6 个 DTO/VO 类,提交:4f17be4 |
| FlowModelVersionService 创建 | ✅已完成 | forge-plugin-flow/service/FlowModelVersionService.java + impl | 新增版本 Service(7个核心方法),提交:a26859a |
| FlowModelServiceImpl 修改 | ✅已完成 | forge-plugin-flow/service/FlowModelService.java + impl | deployModel 新增 changeDescription 参数并插入版本历史,提交:d183d06 |
| FlowModelVersionController 创建 | ✅已完成 | forge-plugin-flow/controller/FlowModelVersionController.java | 新增版本 Controller(7个REST API),提交:072bde6 |
| 前端 API 接口创建 | ✅已完成 | forge-admin-ui/src/api/version.js | 新增版本 API 接口(7个接口),提交:6652264 |
| 前端版本历史组件创建 | ✅已完成 | forge-admin-ui/src/views/flow/version.vue | 新增版本历史列表组件,提交:2b58162 |
| 前端版本对比组件创建 | ✅已完成 | forge-admin-ui/src/views/flow/versionCompare.vue | 新增版本对比组件,提交:2b58162 |
| 前端 model.vue 修改 | ✅已完成 | forge-admin-ui/src/views/flow/model.vue | 新增"版本历史"按钮,提交:2b58162 |
| 权限配置和菜单新增 | ✅已完成 | flow_version_init.sql(Task 1 文件更新) | 新增权限标识(flow:model:revert + flow:model:version:delete),提交:ddf186b |
总任务数:14 完成数:14 Spec 状态:confirmed → apply → review(待审查)
Git 提交汇总(共10个提交):
d96a582: Task 1 数据库表创建1c685c9: Task 2 FlowModel实体修改dbc41ec: Task 5 FlowModelVersionMapper创建4f17be4: Task 6 DTO/VO创建a26859a: Task 7 FlowModelVersionService创建d183d06: Task 8 FlowModelServiceImpl修改072bde6: Task 9 FlowModelVersionController创建2b58162: Task 11-13 前端组件创建和修改ddf186b: Task 14 权限配置SQL核心功能已实现: ✅ 数据库层:版本历史表创建、字典数据新增 ✅ 实体层:FlowModel 和 FlowModelVersion 实体创建 ✅ Mapper层:版本查询方法(分页、详情、最大版本号) ✅ Service层:核心业务逻辑(版本查询、对比、回退、删除) ✅ Controller层:REST API(7个接口) ✅ 前端层:API接口、版本历史组件、版本对比组件 ✅ 集成层:发布时自动插入版本历史 ✅ 权限层:版本回退和删除权限标识定义 | FlowModelVersionMapper 创建 | 待执行 | forge-plugin-flow/mapper/FlowModelVersionMapper.java + XML | 新增版本 Mapper | | FlowModelVersionService 创建 | 待执行 | forge-plugin-flow/service/FlowModelVersionService.java + impl | 新增版本 Service | | FlowModelVersionController 创建 | 待执行 | forge-plugin-flow/controller/FlowModelVersionController.java | 新增版本 Controller | | FlowModelServiceImpl 修改 | 待执行 | forge-plugin-flow/service/impl/FlowModelServiceImpl.java | deployModel 方法新增版本插入 | | 前端 API 接口创建 | 待执行 | forge-admin-ui/src/api/flow/version.ts | 新增版本 API 接口 | | 前端版本历史组件创建 | 待执行 | forge-admin-ui/src/views/flow/version.vue | 新增版本历史页面 | | 前端版本对比组件创建 | 待执行 | forge-admin-ui/src/views/flow/versionCompare.vue | 新增版本对比页面 | | 前端 model.vue 修改 | 待执行 | forge-admin-ui/src/views/flow/model.vue | 新增"版本历史"按钮 | | 字典数据新增 | 待执行 | sys_dict_type + sys_dict_data 表 | 新增版本标记和重要性等级字典 | | 菜单权限配置 | 待执行 | sys_resource 表 | 新增版本管理菜单和权限标识 |
(待代码实现完成后填写)
/apply 执行阶段/apply 执行阶段