模型与定义
模型与定义
业务用途
流程模型(Model)和流程定义(Definition)是 BPM 引擎的两层概念:
- 流程模型(
BpmProcessDefinitionInfo):管理员通过设计器创建的流程蓝图,包含simpleModelJSON、表单绑定、状态(draft/deployed)。只有deployed状态的模型才能发起流程实例。 - 流程定义(
BpmDefinition):旧版流程定义,存储 BPMN XML,支持发布/停用/设计/预览。这部分对应BpmController的/api/bpm/design/*系列接口。
当前生产环境主要使用流程模型(BpmProcessDefinitionInfo)+ SimpleFlowEngine 驱动,流程定义(BpmDefinition)为兼容保留。
涉及文件
后端
| 文件 | 说明 |
|---|---|
backend/src/main/java/com/lowcode/controller/bpm/BpmModelController.java | 模型 CRUD + 部署 + simpleModel 读写 |
backend/src/main/java/com/lowcode/service/impl/bpm/BpmModelServiceImpl.java | 模型服务实现 |
backend/src/main/java/com/lowcode/controller/bpm/BpmDefinitionController.java | 定义 CRUD + 发布/停用/设计/预览 |
backend/src/main/java/com/lowcode/service/impl/bpm/BpmDefinitionServiceImpl.java | 定义服务实现 |
backend/src/main/java/com/lowcode/entity/bpm/BpmProcessDefinitionInfo.java | 流程模型实体 |
backend/src/main/java/com/lowcode/entity/bpm/BpmDefinition.java | 流程定义实体 |
backend/src/main/java/com/lowcode/controller/BpmController.java | 旧版 /api/bpm/design/* 接口 |
前端
| 文件 | 说明 |
|---|---|
frontend/src/views/bpm/model/index.vue | 模型列表页 |
frontend/src/views/bpm/model/design.vue | 模型设计页 |
frontend/src/views/bpm/definition.vue | 流程定义管理页 |
数据库表
bpm_process_definition_info(流程模型表)
CREATE TABLE bpm_process_definition_info (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
process_definition_id VARCHAR(64), -- 流程定义编号(自动生成 def_{modelId}_{timestamp})
model_id VARCHAR(64) NOT NULL, -- 模型编号
model_type TINYINT DEFAULT 10, -- 模型类型
app_id BIGINT, -- 所属应用 ID
name VARCHAR(200), -- 模型名称
`key` VARCHAR(200), -- 模型标识(唯一)
status VARCHAR(20) DEFAULT 'draft', -- ★ draft / deployed
category VARCHAR(64), -- 流程分类编码
icon VARCHAR(512), -- 图标
description VARCHAR(255), -- 描述
form_type TINYINT NOT NULL, -- 表单类型
form_id BIGINT, -- 关联表单 ID
form_conf CLOB, -- 表单配置
form_fields CLOB, -- 表单字段数组
form_custom_create_path VARCHAR(255), -- 自定义表单提交路径
form_custom_view_path VARCHAR(255), -- 自定义表单查看路径
simple_model CLOB, -- ★ simpleModel JSON
sort BIGINT DEFAULT 0, -- 排序
visible TINYINT DEFAULT 1, -- 是否可见
start_user_ids VARCHAR(256), -- 可发起用户 ID
start_dept_ids VARCHAR(256), -- 可发起部门 ID
manager_user_ids VARCHAR(256), -- 可管理用户 ID
allow_cancel_running_process TINYINT DEFAULT 1, -- 允许撤销审批中申请
allow_withdraw_task TINYINT DEFAULT 0, -- 允许审批人撤回任务
creator VARCHAR(64) DEFAULT '',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updater VARCHAR(64) DEFAULT '',
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
deleted TINYINT DEFAULT 0,
tenant_id BIGINT DEFAULT 0
);bpm_definition(流程定义表 - 旧版)
CREATE TABLE bpm_definition (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tenant_id BIGINT DEFAULT 1,
app_id BIGINT,
def_key VARCHAR(100) NOT NULL, -- 流程标识
def_name VARCHAR(200) NOT NULL, -- 流程名称
description VARCHAR(500),
category VARCHAR(50),
version INT DEFAULT 1, -- 版本号
form_key VARCHAR(100), -- 关联表单 KEY
bpmn_xml CLOB, -- BPMN XML 内容
graphic_info CLOB, -- 图形信息
status VARCHAR(20) DEFAULT 'draft', -- draft / deployed
is_deleted CHAR(1) DEFAULT 'N',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
create_by VARCHAR(50),
update_by VARCHAR(50),
deleted TINYINT DEFAULT 0
);后端实现
BpmModelController 端点一览
基础路径:/api/bpm/model
| HTTP | 路径 | 参数 | 说明 |
|---|---|---|---|
| GET | /list | name(可选), appId(可选) | 模型列表 |
| GET | /get | id | 获取模型详情 |
| POST | /create | Body: BpmProcessDefinitionInfo | 创建模型 |
| PUT | /update | Body: BpmProcessDefinitionInfo | 更新模型 |
| DELETE | /delete | id | 删除模型 |
| POST | /deploy | id | 部署模型(draft -> deployed) |
| GET | /simple/get | id | 获取 simpleModel JSON |
| POST | /simple/update | id, Body: JSON 字符串 | 更新 simpleModel |
BpmModelServiceImpl 关键方法
// 创建模型:自动生成 processDefinitionId 和 key
public Long createModel(BpmProcessDefinitionInfo model) {
if (model.getModelId() == null || model.getModelId().isEmpty()) {
model.setModelId("model_" + System.currentTimeMillis());
}
model.setKey(model.getModelId());
model.setProcessDefinitionId("def_" + model.getModelId());
if (model.getModelType() == null) {
model.setModelType(10);
}
// 默认 draft 状态
baseMapper.insert(model);
return model.getId();
}
// 部署模型:校验 simpleModel 格式后改为 deployed
public void deployModel(Long id) {
BpmProcessDefinitionInfo model = getModel(id);
if (model.getSimpleModel() == null || model.getSimpleModel().isEmpty()) {
throw new RuntimeException("simpleModel 不能为空");
}
// 验证 simpleModel JSON 格式
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(model.getSimpleModel(), Map.class);
model.setProcessDefinitionId("def_" + model.getModelId() + "_" + System.currentTimeMillis());
model.setStatus("deployed");
baseMapper.updateById(model);
}
// 发起流程:委托给 SimpleFlowEngine
public BpmInstance startProcess(Long modelId, Map<String, Object> variables) {
BpmProcessDefinitionInfo model = getModel(modelId);
if (!"deployed".equals(model.getStatus())) {
throw new RuntimeException("流程模型未部署");
}
return flowEngine.startProcess(model, variables);
}
// 通过 defKey 获取已部署模型
public BpmProcessDefinitionInfo getDeployedModelByKey(String defKey) {
LambdaQueryWrapper<BpmProcessDefinitionInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BpmProcessDefinitionInfo::getKey, defKey);
wrapper.eq(BpmProcessDefinitionInfo::getStatus, "deployed");
return getOne(wrapper);
}BpmDefinitionController 端点一览
基础路径:/api/bpm/definition
| HTTP | 路径 | 参数 | 说明 |
|---|---|---|---|
| GET | /list | defName(可选), category(可选), appId(可选) | 定义列表 |
| GET | /page | pageNum, pageSize, defName(可选) | 分页查询 |
| GET | /{id} | id | 获取定义详情 |
| POST | `` | Body: BpmDefinition | 新增定义 |
| PUT | `` | Body: BpmDefinition | 更新定义 |
| DELETE | /{id} | id | 删除定义 |
| POST | /publish/{id} | id | 发布定义 |
| POST | /disable/{id} | id | 停用定义 |
| POST | /create | Body: BpmDefinition | 创建定义 |
| GET | /design/{id} | id | 获取设计信息 |
| GET | /preview/{id} | id | 预览定义 |
BpmController(旧版)端点一览
基础路径:/api/bpm
| HTTP | 路径 | 参数 | 说明 |
|---|---|---|---|
| GET | /design/list | appId(可选) | 设计列表 |
| GET | /design/{id} | id | 设计详情 |
| POST | /design/save | Body: BpmDefinition | 保存设计 |
| PUT | /design/{id} | id, Body: BpmDefinition | 更新设计 |
| DELETE | /design/{id} | id | 删除设计 |
| POST | /design/deploy/{id} | id | 部署设计 |
前端实现
model/index.vue(模型列表页)
模型列表页面展示所有流程模型,提供以下操作:
- 新建:调用
POST /bpm/model/create创建模型 - 设计:跳转到
design.vue页面,编辑 simpleModel - 部署:调用
POST /bpm/model/deploy?id=xxx将模型改为deployed - 删除:调用
DELETE /bpm/model/delete?id=xxx

model/design.vue(模型设计页)
嵌入 SimpleProcessDesignerV2 设计器组件,流程:
- 路由参数获取
modelId - 调用
GET /bpm/model/get?id=xxx加载模型基本信息 - 调用
GET /bpm/model/simple/get?id=xxx加载 simpleModel JSON - 将 JSON 传入
<SimpleProcessDesigner :flowNode="simpleModel">组件 - 用户编辑后,调用
POST /bpm/model/simple/update?id=xxx保存
definition.vue(定义管理页)
流程定义管理页面,对应 BpmDefinitionController:
- 列表展示所有流程定义
- 支持发布/停用操作
- 支持设计/预览
BpmProcessDefinitionInfo 实体字段
@TableName("bpm_process_definition_info")
public class BpmProcessDefinitionInfo extends BpmBaseEntity {
private String processDefinitionId; // 流程定义编号
private String modelId; // 模型编号
private Integer modelType; // 模型类型
private Long appId; // 所属应用
private String category; // 分类编码
private Long categoryId; // 分类 ID
private String icon; // 图标
private String name; // 模型名称
@TableField(value = "`key`")
private String key; // 模型标识(关键字,需转义)
private String description; // 描述
private Integer formType; // 表单类型
private Long formId; // 关联表单
private String formConf; // 表单配置
private String formFields; // 表单字段
private String formCustomCreatePath; // 自定义表单提交路径
private String formCustomViewPath; // 自定义表单查看路径
private String simpleModel; // ★ simpleModel JSON
private Long sort; // 排序
private Boolean visible; // 是否可见
private String startUserIds; // 可发起用户
private String startDeptIds; // 可发起部门
private String managerUserIds; // 可管理用户
private Boolean allowCancelRunningProcess; // 允许撤销
private Boolean allowWithdrawTask; // 允许撤回任务
private String status; // ★ draft / deployed
}操作步骤
1. 创建流程模型
# 创建模型
curl -X POST http://localhost:52856/api/bpm/model/create \
-H "Content-Type: application/json" \
-d '{
"name": "采购审批流程",
"modelId": "purchase_approval",
"formType": 20,
"category": "erp",
"description": "采购申请审批"
}'2. 设计流程
在前端进入模型设计页面,使用 SimpleProcessDesignerV2 配置节点和审批人,保存 simpleModel。
3. 部署模型
# 部署模型(draft -> deployed)
curl -X POST "http://localhost:52856/api/bpm/model/deploy?id=1"部署前检查
部署时 BpmModelServiceImpl.deployModel() 会校验 simpleModel 不为空且 JSON 格式正确。如果 JSON 格式错误会抛出异常,部署失败。

4. 发起流程
部署后可通过两种方式发起:
# 方式一:通过模型 ID 发起
curl -X POST http://localhost:52856/api/bpm/instance/start \
-H "Content-Type: application/json" \
-d '{"defId": 1, "title": "采购审批", "businessKey": "purchase_request:100"}'
# 方式二:通过 defKey 发起
curl -X POST http://localhost:52856/api/bpm/instance/startByKey \
-H "Content-Type: application/json" \
-d '{"defKey": "purchase_approval", "title": "采购审批"}'常见问题
模型 status 必须为 deployed 才能发起流程
BpmInstanceController.startProcess() 会检查 model.getStatus() 是否为 "deployed",否则返回错误「流程模型未部署,请先部署后再发起」。同样,BpmModelServiceImpl.startProcess() 也会检查。
modelId 和 key 的关系
创建模型时,如果未指定 modelId,系统自动生成 model_{timestamp}。key 字段自动取 modelId 的值。通过 defKey 发起流程时,使用的是 key 字段值。
旧版 BpmController vs 新版 BpmModelController
旧版 BpmController(/api/bpm/design/*)操作的是 BpmDefinition 表(BPMN XML),新版 BpmModelController(/api/bpm/model)操作的是 BpmProcessDefinitionInfo 表(simpleModel JSON)。生产环境应优先使用新版接口。
