一、前期准备
(
一)
setting
的
Plugins
中搜索并点击
installed

(二)在此处可看到创建BPMN文件、或者可以编辑即可
(三)创建项目,并导入相关jar包
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>5.22.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-rest</artifactId>
<version>5.22.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-diagram-rest</artifactId>
<version>5.22.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>5.22.0</version></dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>5.22.0</version>
</dependency>
(四) activiti配置文件(activiti.cfg.xml放于resource文件夹下)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns = "http://www.springframework.org/schema/beans"xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation = "http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/springbeans.xsd" ><!--dbcp 链接池 --><bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" ><property name = "driverClassName" value = "com.mysql.jdbc.Driver" /><property name = "url" value = "jdbc:mysql:///activiti?nullCatalogMeansCurrent=true" /><property name = "username" value = "root" /><property name = "password" value = "root" /><property name = "maxActive" value = "3" /><property name = "maxIdle" value = "1" /></bean><!-- 在默认方式下 bean 的 id 固定为 processEngineConfiguration--><bean id = "processEngineConfiguration"class = "org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration" ><!-- 直接引用上面配置的链接池 --><property name = "dataSource" ref = "dataSource" /><!--actviti 数据库表在生成时的策略true - 如果数据库中已经存在相应的表,那么直接使用,如果不存在,那么会创建 --><property name = "databaseSchemaUpdate" value = "true" /></bean></beans>
二、流程图制作
(一)首先创建一个
bpmn2.0
文件,然后编辑,上述有提到。

(二)右键可创建组件
(三)连线点击右上角的箭头并拖动到其他组件中
(四)生成流程图片
三、创建activiti表与了解其结构
(
一
)activiti
创建表方式
:
1
、使用方法
getDefaultProcessEngine
2
、默认从
resources
下读取名字为
actviti.cfg.xml
的文件
3
、创建
processEngine
时,就会创建
mysql
的表
我使用的第二种方式创建表
:
@Test
public void testCreat() {
ProcessEngineConfiguration processEngineConfiguration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activi
ti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine =
processEngineConfiguration.buildProcessEngine();
System.out.println("processEngine = " + processEngine);
}
(二)了解
activiti
表结构
act_hi
*
:
'hi’
表示
history
,历史数据。
act_ge
:
'ge’
表示
general
,通用数据。
act_evt_
:
'evt’
表示
event
,事件日志。
act_procdef
*
:
'procdef’
表示
processdefine
,流程定义信息。
act_re
:
're’
表示
repository
,静态资源。
act_ru_
:
'ru’
表示
runtime
,表示运行时数据

四、流程部署
(一)流程部署
@Test
public void testDeployment(){
// 1.创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.获取RepositoryService
RepositoryService repositoryService =
processEngine.getRepositoryService();
// 3.使用service进行流程部署 ,定义流程名,把 bpmn 和 png 部署到数据库
Deployment deployment = repositoryService.createDeployment()
.name("申诉流程")
.addClasspathResource("bpmn/activiti.bpmn20.xml")
.addClasspathResource("bpmn/activiti.png")
.deploy();
System.out.println("流程部署id = " + deployment.getId());
System.out.println("流程部署name = " + deployment.getName());
}
部署完成后会在act_re_deoloyment表中插入一条部署记录
五、启动流程实例
(一)启动流程实例,先找到刚刚流程定义的
key
@Testpublic void testStartProcess(){
// 1. 创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2. 获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3. 根据流程定义的id启动流程
ProcessInstance myEvection =
runtimeService.startProcessInstanceByKey("activiti.bpmn20");
System.out.println("流程定义id = " + myEvection.getProcessDefinitionId());
System.out.println("流程实例id = " + myEvection.getId());
System.out.println("当前活动id = " + myEvection.getActivityId());}
(二)启动流程修改的表

6. ACT_RU_TASK(运行时任务信息数据信息表)
五、查询个人代办任务
@Test
public void testFindPersonalTaskList(){
// 1.获取流程引擎 ProcessEngine processEngine =
ProcessEngines.getDefaultProcessEngine();
// 2.获取taskService
TaskService taskService = processEngine.getTaskService();
// 3.根据流程key 和 任务负责人 查询任务
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey("activiti.bpmn20")
.taskAssignee("员工")
.list();
for (Task task : list) {
System.out.println("流程实例id = " + task.getProcessInstanceId());
System.out.println("任务id = " + task.getId());
System.out.println("任务负责人id = " + task.getAssignee());
System.out.println("任务名称 = " + task.getName()); }
}
六、完成个人任务
@Testpublic void completTesk(){
// 1.获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.获取taskService
TaskService taskService = processEngine.getTaskService();
List<Task> task = taskService.createTaskQuery()
.processDefinitionKey("activiti.bpmn20")
.taskAssignee("员工")
.list();
for (Task task1:task){
if (task1.getId().equals("85004")){
taskService.complete(task1.getId());
System.out.println("流程实例id = " + task1.getProcessInstanceId());
System.out.println("任务id = " + task1.getId());
System.out.println("任务负责人id = " + task1.getAssignee());
System.out.println("任务名称 = " + task1.getName());
}
}
//在完成任务时同时添加批注信息
@Test
public void testAddComment(){ //任务负责人
String assignee = "总公司";
//创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取TaskService
TaskService taskService = processEngine.getTaskService();
//获取任务集合
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey("activiti.bpmn20").taskAssignee(assignee)
.list();
//遍历任务列表
for(Task task:taskList){
//在任务执行之前任务添加批注信息
taskService.addComment(task.getId(),task.getProcessInstanceId(),task.getName()+
"审批通过");
taskService.complete(task.getId()); }}
此时再次查询员工的代办任务就为空了
七、查看历史信息
@Testpublic void testSelectHistoryTask(){
//流程实例ID
String processInstanceId = "22501";
//任务审核人
String taskAssignee = "服务站长";
//创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取historyService
HistoryService historyService = processEngine.getHistoryService();
//获取taskService
TaskService taskService = processEngine.getTaskService();
//获取历史审核信息
List<HistoricActivityInstance> list = historyService
.createHistoricActivityInstanceQuery().activityType("userTask")
.processInstanceId(processInstanceId)
.taskAssignee(taskAssignee)
.finished()
.list();
for(HistoricActivityInstance instance:list){
System.out.println("任务名称:"+instance.getActivityName());
System.out.println("任务开始时间:"+instance.getStartTime());
System.out.println("任务结束时间:"+instance.getEndTime());
System.out.println("任务耗时:"+instance.getDurationInMillis());
//获取审核批注信息
List<Comment> taskComments =
taskService.getTaskComments(instance.getTaskId());
if(taskComments.size()>0){
System.out.println("审批批注:"+taskComments.get(0).getFullMessage());
} }}
八、使用网关控制流程走向
网关和分支是流程图中相当重要的一环。毕竟不可能所有流程都是一条直线走到底的,可能需要并行处
理,也可能需要根据条件的不同选择对应的路由,网关的作用正是在此。
并行网关

并行网关就是当流程到达改网关时,会分成多个分支,对应业务中的并发情况。
排他网关
当流程执行到排他网关时,排他网关会选择第一条符合条件路由走出。
包含网关

包含网关融合了并行网关和排他网关的特点,并行网关的
“
出线
”
属于无条件,而排他网关只能选择符合
条件的第一条
“
出线
”
。那如果我们需要一个路由选择,只要满足条件的
“
出线
”
,都可以路由走出去,这
时候需要选择包含网关。
我这里介绍排他网关的使用
(一)在制作流程图时选择排他网关
点击排他网关对应的流程线,可以添加走向此流程线需满足的条件
@Test
public void errorCompletTesk(){
// 1.获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.获取taskService
TaskService taskService = processEngine.getTaskService();
Map<String, Object> variables = new HashMap<>();
variables.put("result", "驳回");
// 替换为你的变量名和值
Task task = taskService.createTaskQuery()
.processDefinitionKey("activiti.bpmn20")
.taskAssignee("服务站长")
.singleResult();
taskService.complete(task.getId(),variables);
}
然后完成个人任务时,将参数带进去即可
九、查看工作流状态
@Test
public void status(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取运行时服务
RuntimeService runtimeService = processEngine.getRuntimeService();
// 查询流程实例
ProcessInstance processInstance =
runtimeService.createProcessInstanceQuery()
.processInstanceId("67501") .singleResult();// 替换为实际的流程实例ID
// 判断流程是否结束
boolean isProcessEnded = processInstance == null;
if (isProcessEnded) {
System.out.println("工作流已结束"); } else {
System.out.println("工作流尚未结束");
}
}