SpringBoot整合Activiti(一)

Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),可以定义流程、执行流程并以不同方式对其实现运行。

一、应用Activiti

1、引入pom坐标

1
2
3
4
5
6
<!-- activiti -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>6.0.0</version>
</dependency>

2、配置application.yml

1
2
3
4
5
spring:
activiti:
database-schema-update: false
history-level: full
db-history-used: true

3、运行项目即可自动创建所需要的的表

二、Activiti的表结构

Activiti工作流总共包含23张数据表,所有的表名默认以“ACT_”开头。

并且表名的第二部分用两个字母表明表的用例,而这个用例也基本上跟Service API匹配。

ACT_GE_* : “GE”代表“General”(通用),用在各种情况下;

ACT_GE_BYTEARRAY:通用的流程定义和流程资源

ACT_GE_PROPERTY:系统相关属性

ACT_HI_* : “HI”代表“History”(历史),这些表中保存的都是历史数据,比如执行过的流程实例、变量、任务,等等。Activit默认提供了

4种历史级别:

none: 不保存任何历史记录,可以提高系统性能;

activity:保存所有的流程实例、任务、活动信息;

audit:也是Activiti的默认级别,保存所有的流程实例、任务、活动、表单属性;

full:最完整的历史记录,除了包含audit级别的信息之外还能保存详细,例如:流程变量

ACT_ID_* : “ID”代表“Identity”(身份),这些表中保存的都是身份信息,如用户和组以及两者之间的关系。如果Activiti被集成在某一系统当中的话,这些表可以不用,可以直接使用现有系统中的用户或组信息;

ACT_RE_* : “RE”代表“Repository”(仓库),这些表中保存一些‘静态’信息,如流程定义和流程资源(如图片、规则等);

ACT_RU_* : “RU”代表“Runtime”(运行时),这些表中保存一些流程实例、用户任务、变量等的运行时数据。Activiti只保存流程实例在执行过程中的运行时数据,并且当流程结束后会立即移除这些数据,这是为了保证运行时表尽量的小并运行的足够快

三、Activiti创建运行流程的步骤

1、部署流程

1
2
3
4
repositoryService.createDeployment()
.addClasspathResource("processes/train.bpmn")=====>流程bpmn文件位置
.name("测试Spring流程部署")============》name
.deploy();==========>执行定义流程

在部署一次流程之后,会自动创建一个流程实例

procdef表

deployment表

2、启动流程实例

1
2
3
4
5
String key = "myProcess_1";   流程实例的key
Map<String,Object> hashMap = new HashMap<>(); 流程参数
hashMap.put("userId",1); ==》如果bpmn文件使用el表达式的话userId要与文件里的一致
hashMap.put("msg","我想请假");
ProcessInstance instance = runtimeService.startProcessInstanceByKey(key, hashMap);

启动流程实例后,会在task表里新增一行数据,这就是我们启动的流程

3、查看指定用户的待办任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 //根据流程实例id获取流程信息
List<Task> taskInstanceList = ProcessEngines.getDefaultProcessEngine()
.getTaskService()
.createTaskQuery()
.processInstanceId(instance.getId())
.orderByTaskCreateTime().asc()
.list();

//根据用户查询待办任务
List<Task> result = taskService
.createTaskQuery()
.processDefinitionKey("myProcess_1")
.taskCandidateOrAssigned("department")
.list();

4、审核任务

1
2
3
4
5
6
7
Task tasks = taskService.createTaskQuery().processInstanceId(t.getProcessInstanceId()).singleResult();
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("userId",4);
map2.put("inputUser",3);
map2.put("msg","我想请假");
log.info("当前处理人:"+tasks.getAssignee());
taskService.complete(tasks.getId(), map2);