这篇文章的目的是
让不懂,流程引擎审批的人
直接上手会做一块的技术栈开发
先讲一个基本的demo,了解这个是做什么的
我这边就一句话说明这个东西
1.创建一个流程

2.把流程持久化到数据库里
3.使用这个流程,把要审批的数据存进去,然后负责审批的人,会查询出要审批的数据
4.结束审批
1.springboot配置activit7技术栈
2.一键让数据库创建activit7需要的表
3.在bpmn上创建流程(这里是静态的流程,都是固定的)
4.使用占位符机制,动态制定需要分配到人
5.使用流程变量机制,动态计算要执行的人,要做的事情
6.使用网关机制,确定要执行的流程分叉
7.部署流程
8.制定人开启流程以及相关概念
一、先理解:什么是工作流?Activiti7是什么?
工作流(Workflow) ,就是通过计算机对业务流程自动化执行管理------让文档、信息或任务在多个参与者之间按照预定义的规则自动传递,从而实现某个业务目标。说白了,就是把"请假要经过谁审批、报销要走哪些流程"这类业务规则,从代码里抽出来,交给一个专门的"引擎"去管理。
Activiti7 就是一个用Java写的开源工作流引擎。它可以将业务系统中复杂的业务流程抽取出来,用BPMN2.0建模语言进行定义,流程按照预先定义的方式执行。有了它,流程变更时不需要改代码、重新部署系统,大大降低了维护成本。
二、整体流程概览
一个完整的Activiti7工作流开发,按你的梳理分为以下步骤:
| 步骤 | 做什么 | 对应你的描述 |
|---|---|---|
| 1 | Spring Boot配置Activiti7 | 技术栈搭建 |
| 2 | 数据库自动创建Activiti7需要的表 | 一键建表 |
| 3 | 在BPMN上创建流程(静态流程) | 创建流程 |
| 4 | 使用占位符(UEL表达式)动态指定处理人 | 动态分配人员 |
| 5 | 使用流程变量传递业务数据、控制走向 | 流程变量机制 |
| 6 | 使用网关控制流程分支(排他/并行) | 流程分叉 |
| 7 | 部署流程到引擎 | 持久化到数据库 |
| 8 | 启动流程实例、查询任务、完成任务 | 开启流程+审批 |
下面逐一展开。
三、Step by Step 实现
Step 1:Spring Boot 配置 Activiti7
① 引入Maven依赖
在pom.xml中添加Activiti7的Spring Boot Starter:
xml
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
</dependency>
注意版本兼容:Activiti 7.1.x 通常与 Spring Boot 2.3.x ~ 2.7.x 兼容性最佳。
② 配置 application.yml
在application.yml中添加Activiti7相关配置:
yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/activiti?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: your_password
driver-class-name: com.mysql.jdbc.Driver
activiti:
# true:表不存在则自动创建,存在则更新(开发环境推荐)
database-schema-update: true
# 开启历史记录
db-history-used: true
# 历史记录级别:full 保存全部细节数据
history-level: full
# 不校验流程文件(避免启动时检查resources/processes下的文件)
check-process-definitions: false
database-schema-update有几种模式:
false(默认):不创建/更新表,版本不匹配会抛异常(生产环境用)true:表不存在则自动创建,存在则更新(开发环境用)create-drop:启动时创建表,关闭时删除表(测试用)
Step 2:一键创建数据库表
配置好database-schema-update: true后,启动Spring Boot项目,Activiti7会自动创建约25张核心表。
这些表按前缀分为几类:
| 前缀 | 全称 | 存储内容 |
|---|---|---|
ACT_RE_ |
Repository | 流程定义、模型等静态部署资源 |
ACT_RU_ |
Runtime | 运行时数据(流程实例、任务、变量),流程结束时删除 |
ACT_HI_ |
History | 历史数据(已完成的流程实例、任务、变量) |
ACT_ID_ |
Identity | 用户、用户组及其关系 |
ACT_GE_ |
General | 通用数据(流程图、部署文件等二进制资源) |
你不需要手动创建任何表,全部由Activiti7自动完成。
Step 3:在BPMN上创建流程(静态流程)
① 安装IDEA插件
在IDEA中安装 actiBPM 插件,用于可视化绘制流程图。
② 创建BPMN文件
在src/main/resources下新建一个processes文件夹,在里面创建.bpmn文件(如leave.bpmn)。
③ 绘制流程图
用IDEA的actiBPM插件绘制一个简单的请假审批流程图:
开始 → 请假申请 → 部门经理审批 → 总经理审批 → 结束
每个节点(用户任务)可以设置名称、处理人等属性。
注意:如果编辑时出现中文乱码,将IDEA编码统一设置为UTF-8。
Step 4:使用占位符(UEL表达式)动态指定处理人
固定分配 是在BPMN中直接写死处理人ID(如assignee="zhangsan"),这在真实项目中基本不可行------审批人应该是动态的。
UEL表达式 就是Activiti的"占位符机制"。在BPMN的用户任务中,处理人字段写成表达式形式:
xml
<userTask id="managerAudit" name="部门经理审批" activiti:assignee="${managerId}" />
这里的${managerId}就是一个占位符,具体值在流程启动时通过流程变量传入。
UEL表达式支持两种方式:
- UEL-Value :
${variableName},从流程变量中取值 - UEL-Method :
${bean.method()},调用Spring Bean的方法动态计算
Step 5:使用流程变量传递业务数据、控制走向
流程变量 是Activiti中贯穿整个流程的数据载体。可以在以下时机设置:
① 启动流程时设置全局变量:
java
@Autowired
private RuntimeService runtimeService;
public void startLeaveProcess(String applicantId, String managerId) {
Map<String, Object> variables = new HashMap<>();
variables.put("applicantId", applicantId); // 申请人
variables.put("managerId", managerId); // 部门经理(动态分配)
variables.put("days", 3); // 请假天数(用于网关判断)
ProcessInstance instance = runtimeService
.startProcessInstanceByKey("leave", variables);
}
② 完成任务时设置变量:
java
@Autowired
private TaskService taskService;
public void completeTask(String taskId, boolean approved) {
Map<String, Object> variables = new HashMap<>();
variables.put("approved", approved);
taskService.complete(taskId, variables);
}
流程变量在act_ru_variable运行时表中存储,流程结束后会被清除。
Step 6:使用网关控制流程分支
网关用于处理流程中的分支情况。
① 排他网关(Exclusive Gateway) ------ 多条分支只选一条执行
比如请假审批:3天以内部门经理批就行,3天以上需要总经理批。
在BPMN中,排他网关的出口连线上配置条件表达式:
- 连线1:
${days <= 3}→ 走部门经理审批 - 连线2:
${days > 3}→ 走总经理审批
② 并行网关(Parallel Gateway) ------ 所有分支同时执行
比如重大事项需要主编和副主编同时审核,两人都通过才能继续。
并行网关会创建多个并发的子流程,所有分支都执行完毕后才会聚合继续往下走。
网关本身在Java代码中不需要特殊处理,逻辑完全在BPMN流程图中配置。
Step 7:部署流程
流程定义(BPMN文件)需要部署到Activiti引擎中,才能被识别和使用。
方式一:自动部署
把BPMN文件放在resources/processes/目录下,Spring Boot启动时会自动扫描并部署该目录下的流程文件。
方式二:编程部署
java
@Autowired
private RepositoryService repositoryService;
public void deployProcess() {
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("processes/leave.bpmn")
.name("请假流程")
.deploy();
System.out.println("部署ID:" + deployment.getId());
}
部署后,流程定义会存入ACT_RE_PROCDEF表,BPMN文件内容存入ACT_GE_BYTEARRAY表。
Step 8:启动流程实例、查询任务、完成任务
流程部署后,就可以开始使用了。
① 启动流程实例
java
@Autowired
private RuntimeService runtimeService;
public void startProcess() {
Map<String, Object> variables = new HashMap<>();
variables.put("managerId", "zhangsan");
variables.put("days", 2);
ProcessInstance instance = runtimeService
.startProcessInstanceByKey("leave", variables);
System.out.println("流程实例ID:" + instance.getId());
}
启动流程实例,就相当于"张三发起了一次请假申请"。每次发起都是一次独立的流程实例。
② 查询待办任务
java
@Autowired
private TaskService taskService;
public List<Task> getMyTasks(String userId) {
return taskService.createTaskQuery()
.taskAssignee(userId) // 查询分配给该用户的任务
.list();
}
③ 完成任务
java
public void completeTask(String taskId) {
taskService.complete(taskId);
}
每完成一个任务,流程自动推进到下一个节点,直到走完全部节点,流程结束。
四、总结
用一张图总结整个流程:
1. 引入依赖 + 配置application.yml
↓
2. 启动项目 → Activiti7自动创建25张数据库表
↓
3. 用actiBPM插件画流程图(.bpmn文件)
- 节点处理人写UEL占位符:${managerId}
- 网关出口写条件表达式:${days > 3}
↓
4. 部署流程(自动部署 或 编程部署)
↓
5. 业务代码调用API:
- 启动流程(传入流程变量)
- 查询待办任务
- 完成任务(传入新的流程变量)
↓
6. 流程自动流转,直到结束
核心思想 :把"流程怎么走"画在BPMN图里(静态),把"谁审批、数据是什么"通过流程变量在运行时动态传入(动态)。这样流程变更只需要改BPMN图重新部署,不需要改Java代码。