文章目录
- 一、项目环境
- 二、依赖配置
- 三、配置文件
- 四、数据库表
-
- [4.1 自动生成的表(共 25 张)](#4.1 自动生成的表(共 25 张))
- [4.2 业务表](#4.2 业务表)
- [五、创建 BPMN 流程图](#五、创建 BPMN 流程图)
-
- [5.1 标准流程结构](#5.1 标准流程结构)
- [5.2 节点属性](#5.2 节点属性)
- [5.3 使用 Camunda Modeler 画图](#5.3 使用 Camunda Modeler 画图)
- [5.4 检查清单](#5.4 检查清单)
- 六、部署步骤
-
- [6.1 首次部署](#6.1 首次部署)
- [6.2 新增流程](#6.2 新增流程)
- [6.3 更新流程](#6.3 更新流程)
- 七、核心代码
-
- [7.1 三大服务](#7.1 三大服务)
- [7.2 启动流程实例](#7.2 启动流程实例)
- [7.3 完成任务](#7.3 完成任务)
- [7.4 设置流程变量](#7.4 设置流程变量)
- [7.5 查询待办任务](#7.5 查询待办任务)
- 八、状态流转
- 九、流程变量
- 十、注意事项
-
- [10.1 部署相关](#10.1 部署相关)
- [10.2 开发相关](#10.2 开发相关)
- [10.3 生产环境](#10.3 生产环境)
- 十一、完整工作流使用流程
- 十二、关键文件一览
一、项目环境
| 技术 | 版本 |
|---|---|
| Activiti | 7.1.0.M6 |
| Spring Boot | 2.5.0 |
| MyBatis-Plus | 3.4.2 |
| 数据库 | MySQL |
| 画图工具 | Camunda Modeler 5.46.1 |
二、依赖配置
pom.xml
clike
<!-- 必须 activiti7 整合 spring boot -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
</dependency>
<!--非必须 -->
<dependency>
<groupId>org.activiti.dependencies</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.1.0.M6</version>
<type>pom</type>
</dependency>
三、配置文件
application-test.yml(测试环境)
clike
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/trade?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123456
activiti:
# 首次启动设为 true,建表后可注释
database-schema-update: true
# 开启历史记录
db-history-used: true
history-level: full
# 关闭自动部署(手动部署)
check-process-definitions: false
async-executor-activate: false
application-prod.yml(生产环境)
clike
spring:
datasource:
# 生产环境数据库配置(略)
hikari:
maximum-pool-size: 40
minimum-idle: 10
activiti:
# 生产环境建议关闭自动建表
# database-schema-update: true
db-history-used: true
history-level: full
check-process-definitions: false
async-executor-activate: false
四、数据库表
4.1 自动生成的表(共 25 张)
| 表组 | 数量 | 核心表 |
|---|---|---|
act_ge_*通用数据 |
2 | act_ge_bytearray |
act_hi_* 历史数据 |
8 | act_hi_procinst, act_hi_taskinst |
act_id_* 身份信息 |
4 | act_id_user |
act_re_* 流程定义 |
3 | act_re_deployment, act_re_procdef |
act_ru_* 运行时数据 |
8 | act_ru_task, act_ru_execution, act_ru_variable |
4.2 业务表
tb_flow 表(手动创建,存储流程配置):
clike
CREATE TABLE tb_flow (
id INT PRIMARY KEY AUTO_INCREMENT,
flowname VARCHAR(100), -- 流程名称
flowkey VARCHAR(100), -- 流程标识(对应 bpmn 文件 process id)
filepath VARCHAR(200), -- bpmn 文件路径
state INT DEFAULT 1, -- 0:已部署, 1:未部署, 2:部署失败
createtime DATETIME
);
五、创建 BPMN 流程图
5.1 标准流程结构
clike
开始 → 提交申请 → 网关1 → 审核 → 网关2 → 结束(通过)
↓ ↓
结束(取消) 提交申请(打回)
5.2 节点属性
| 元素 | 属性 | 值 |
|---|---|---|
| 流程 | id |
loanApplication |
| task1 | activiti:assignee |
${assignee0} |
| task2 | activiti:candidateUsers |
${Auditor} |
| 连线 | (提交/通过) | 条件 ${type==1} |
| 连线(取消/拒绝) | 条件 | ${type==2} |
5.3 使用 Camunda Modeler 画图
-
打开 Camunda Modeler → Camunda 7 → BPMN diagram
-
拖节点到画布,设置属性
-
保存为 .bpmn 文件
-
全部替换
camunda:为activiti: -
将流程 id 改成对应值(如
loanApplication)
5.4 检查清单
| 检查项 | 搜索关键字 |
|---|---|
| 流程 ID 正确 | <process id="loanApplication" |
| 无 camunda 前缀 | 搜索 camunda:(应该没有) |
| 执行人变量 | ${assignee0} |
| 候选人变量 | ${Auditor} |
| 流程条件 | ${type==1}, ${type==2} |
六、部署步骤
6.1 首次部署
clike
1. pom.xml 中加入 Activiti 依赖
2. 配置文件中设置 database-schema-update: true
3. 启动项目 → Activiti 自动建 25 张表
4. 将 .bpmn 文件放到 resources/bpmn/ 目录
5. 在 tb_flow 表中插入流程配置记录
6. 调接口部署流程 PUT /f/flow/deployment/{id}
7. 表建好后可注释掉 database-schema-update
6.2 新增流程
clike
1. 画图生成 .bpmn 文件
2. 放到 resources/bpmn/
3. tb_flow 表插入一条新记录
4. 调接口部署 PUT /f/flow/deployment/{id}
6.3 更新流程
clike
1. 修改 .bpmn 文件
2. 覆盖 resources/bpmn/ 中的旧文件
3. 调接口重新部署 PUT /f/flow/deployment/{id}
4. 新版本部署后,新启动的流程用新版,旧流程继续用旧版
七、核心代码
7.1 三大服务
clike
@Resource
private RuntimeService runtimeService; // 管理运行中的流程实例
@Resource
private TaskService taskService; // 管理待办任务
@Resource
private HistoryService historyService; // 管理历史记录
7.2 启动流程实例
clike
public ProcessInstance startProcess(String formKey, String beanName,
String businessKey, Integer applyFormId) {
IActFlowCustomService service = SpringContextUtil.getBean(beanName);
Map<String, Object> variables = service.setvariables(applyFormId);
variables.put("bussinessKey", businessKey);
return runtimeService.startProcessInstanceByKey(
formKey, businessKey, variables
);
}
7.3 完成任务
clike
public void completeProcess(String taskId, String username, Integer type, String remark) {
// 1. 查询任务
Task task = taskService.createTaskQuery().taskId(taskId)
.taskAssignee(username).singleResult();
if (task == null) {
task = taskService.createTaskQuery().taskId(taskId)
.taskCandidateUser(username).singleResult();
}
if (task == null) {
taskService.claim(taskId, username);
}
// 2. 根据 state 和 type 更新业务状态
// state=0/4/6 + type=1 → 提交申请(state→1)
// state=0/4/6 + type=2 → 取消申请(删除流程)
// state=1 + type=1 → 审核通过(state→3)
// state=1 + type=2 → 审核拒绝(state→4)
// 3. 设置变量并完成任务
Map<String, Object> variables = new HashMap<>();
variables.put("type", type);
taskService.setVariables(taskId, variables);
taskService.complete(taskId);
}
7.4 设置流程变量
clike
@Override
public Map<String, Object> setvariables(Integer applyFormId) {
String username = WebUtils.getUsername();
List<String> auditors = getUsersByRoleId(9); // 角色 ID=9 的用户
Map<String, Object> variables = new HashMap<>();
variables.put("assignee0", username); // 提交人
variables.put("Auditor", auditors); // 审核人列表
return variables;
}
7.5 查询待办任务
clike
List<Task> tasks = taskService.createTaskQuery()
.processDefinitionKey("loanApplication")
.taskAssignee(username)
.active()
.list();
if (tasks.isEmpty()) {
tasks = taskService.createTaskQuery()
.processDefinitionKey("loanApplication")
.taskCandidateUser(username)
.active()
.list();
}
八、状态流转
| state | 含义 | 说明 |
|---|---|---|
| 0 | 待提交 | 新建草稿 |
| 1 | 待审核 | 已提交,等待审核 |
| 3 | 审核通过 | 最终状态 |
| 4 | 审核不通过 | 可修改后重新提交 |
clike
state=0 → type=1 → state=1 → type=1 → state=3(通过)
→ type=2 → state=4 → type=1 → state=1(重新提交)
九、流程变量
| 变量名 | 用途 | BPMN 引用 |
|---|---|---|
assignee0 |
提交人 | ${assignee0} |
Auditor |
审核人列表 | ${Auditor} |
type |
流程走向(1/2) | ${type==1}, ${type==2} |
注意:代码中
variables.put("键名", 值)的键名 必须与 BPMN 文件中${}内的变量名完全一致。
十、注意事项
10.1 部署相关
| 问题 | 解决方案 |
|---|---|
| 首次启动没建表 | 确认 database-schema-update: true |
| 部署失败 | 检查 bpmn 文件是否有 camunda: 前缀,需要改成activiti: |
| 流程找不到 | 确认formKey与 bpmn 文件 process id 一致 |
10.2 开发相关
| 问题 | 解决方案 |
|---|---|
| 审核拒绝后无法重新提交 | 去掉历史流程检查,只检查活跃流程 |
| 状态显示不对 | 状态更新放在流程操作成功后 |
| 分页总数不对 | 先过滤再分页,total/pages 用过滤后的数据 |
10.3 生产环境
| 注意点 | 说明 |
|---|---|
database-schema-update: false |
表建好后关闭,避免意外修改 |
check-process-definitions: false |
手动部署,不影响正在运行的流程 |
| 部署新版本 | 旧流程实例继续用旧版,新启动的用新版 |
十一、完整工作流使用流程
clike
1. pom.xml 加依赖
2. 配置数据库连接 + Activiti 配置
3. 首次启动 → 自动建 25 张表
4. 用 Camunda Modeler 画图
5. 替换 camunda: → activiti:
6. bpmn 文件放 resources/bpmn/
7. tb_flow 表插入记录
8. 调接口 PUT /f/flow/deployment/{id}
9. 流程可用,代码通过 formKey 启动
十二、关键文件一览
| 文件 | 作用 |
|---|---|
pom.xml |
Activiti 依赖 |
application-*.yml |
Activiti 配置 |
*.bpmn |
流程图定义 |
tb_flow |
流程配置表 |
ApplyFormCommService |
核心流程服务 |
LoanApplicationServiceImpl |
业务实现(含 setvariables) |
FlowController |
部署和任务接口 |
act_ru_task |
运行时任务表 |
act_ru_execution |
运行时流程实例表 |
act_hi_procinst |
历史流程实例表 |