导入依赖
<dependencies>
<!-- 整合Activiti7 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
</dependency>
<!-- 统一commons-io版本,不然集成Activiti会报错 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 不添加会报Bean method 'inMemoryUserDetailsManager' in 'UserDetailsServiceAutoConfiguration' not loaded...错 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
创建启动类
平时怎么创就怎么创,没啥特殊的
创建配置文件
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://xxx:xxx/xxx?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: xxx
password: xxx
druid:
max-active: 20
min-idle: 2
initial-size: 2
activiti:
#1.flase:activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
#2.true:默认值。activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建
#3.create_drop: fiactiviti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
#4.drop-create:/iactiviti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
database-schema-update: true
#activiti7默认不生成历史信思表,开启历史表
db-history-used: true
#记录历史等级可配置的历史级别有none,activity,audit,full
#none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
#activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
#audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit/history的默认值。
#full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。
history-level: full
check-process-definitions: true
# 流程文件默认存放路径classpath*:**/processes/
# process-definition-location-prefix: classpath*:**/processes/
# 流程文件默认文件后缀 **.bpmn20.xml", "**.bpmn"
# process-definition-location-suffixes: **.bpmn20.xml", "**.bpmn"
这里需要注意的是在数据库路径后面要加上&nullCatalogMeansCurrent=true,不然启动又会报错
三步一个坑!!
创建bpmn流程图
没必要搞得像其他帖子一样,翻墙下一个actbpmn插件,或者是下个前端页面来画,在线的bpmn编辑网站一堆啊
以下两个都不错
https://demo.bpmn.io/
https://bpmn.52itstyle.vip/
在线画完直接浏览器下载到本地,还能同时下载svg图
复制到resouces目录下
记得先创建一个processes文件夹,Activiti默认是去这个文件夹里找bpmn文件的
下载来的bpmn文件需要修改一点点地方
id是这个流程的名字,可以认为是唯一标识吧,可以自己修改,也可以就用这个也行
启动项目
一直到最后,如果没有报错,那就是表示万事大吉了
然后去看看数据库
正好多了25张表
流程测试
@SpringBootTest
@Slf4j
public class ActivitiTest {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private HistoryService historyService;
/**
* 测试流程
*/
@Test
public void testStartProcess(){
// 开启流程 key填的是流程的表示,与bpmn里的id对应
// String instanceKey = "myProcess_1";
String instanceKey = "myLeave";
log.info("开启请假流程...");
Map<String, Object> startMap = new HashMap<String, Object>();
startMap.put("userId", "10001");
ProcessInstance instance = runtimeService.startProcessInstanceByKey(instanceKey, startMap);
log.info("启动流程实例成功:{}", instance);
log.info("流程实例ID:{}", instance.getId());
log.info("流程定义ID:{}", instance.getProcessDefinitionId());
// 获取任务信息
String instanceId = instance.getId(); // 实例id,从上一步获取
String leaveDays = "10"; // 请假天数
String leaveReason = "回家睡觉"; // 请假原因
Task task = taskService.createTaskQuery().processInstanceId(instanceId).singleResult();
if (task == null) {
log.info("查询到任务为空!");
}
// 提交请假申请
Map<String, Object> workerMap = new HashMap();
workerMap.put("days", leaveDays);
workerMap.put("date", new Date());
workerMap.put("reason", leaveReason);
taskService.complete(task.getId(), workerMap);
log.info("执行【提交请假申请】环节,流程推动到【部门经理审批】环节");
// 部门经理审批 这里需要更新任务,上一步任务已经执行完了
task = taskService.createTaskQuery().processInstanceId(instanceId).singleResult();
String days = (String) taskService.getVariable(task.getId(), "days");
Date date = (Date) taskService.getVariable(task.getId(), "date");
String reason = (String) taskService.getVariable(task.getId(), "reason");
String userId = (String) taskService.getVariable(task.getId(), "userId");
System.out.println("请假人id: " + userId);
System.out.println("请假天数: " + days);
System.out.println("请假理由: " + reason);
System.out.println("请假日期: " + date.toString());
String departmentalOpinion = "批了,不用回来了!";
Map<String, Object> boosMap = new HashMap();
boosMap.put("departmentalOpinion", departmentalOpinion);
taskService.complete(task.getId(), boosMap);
log.info("请假流程结束");
}
}
执行结果
当然这里仅仅是简单的例子
简单的通过了
那接下来就是去玩更复杂的例子啦~~