Activiti工作流使用

一、前期准备

( 一) 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/beans
http://www.springframework.org/schema/beans/spring
beans.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("工作流尚未结束");
}
}

 

Activiti 是一个流行的开源工作流引擎,用于管理和执行各种业务流程。它提供了丰富的功能和易于使用的接口,使开发人员可以快速构建和部署工作流应用。 Activiti 工作流使用手册是一个详细的指南,帮助用户了解 Activiti 的各个方面并学会使用它来设计和执行工作流。手册通常包括以下内容: 1. Activiti 的基本概念和架构:手册会介绍 Activiti 的核心概念,例如流程定义、流程实例、任务和执行等。它还会解释 Activiti 的组件和模块如何协同工作,以及其在整个工作流执行过程中的角色和责任。 2. Activiti 的安装和配置:手册会提供指导,说明如何安装和配置 Activiti 引擎。这包括数据库设置、环境变量配置和相关依赖的安装等。 3. 工作流设计和建模:手册会详细讲解如何使用 Activiti Designer 工具来设计和建模工作流。它会介绍如何创建流程定义、绘制流程图、定义任务和网关等。 4. 工作流执行和管理:手册会说明如何部署和执行工作流定义,包括启动流程实例、处理任务、查看流程状态和历史记录等操作。它还会介绍如何管理流程定义和部署信息,以及如何监控和优化工作流性能。 5. Activiti API 和扩展:手册会介绍 Activiti API 和相关库的使用方法,以及如何通过扩展和自定义来满足特定需求。 通过 Activiti 工作流使用手册,用户可以系统地学习和掌握 Activiti工作流管理功能。手册提供了详细的说明和示例,使用户能够快速上手并构建复杂的工作流应用。无论是初学者还是有经验的开发人员,都可以从手册中获得对 Activiti 工作流引擎的深入了解和应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值