相关依赖:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.activiti/activiti-spring -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>6.0.0</version>
<!--<version>7.1.0.M5</version>-->
<!-- 去除自带的MyBatis版本 -->
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--数据库相关依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
生成表格使用默认的配置,须要配置 activiti.cfg.xml 配置文件
<!--创建流程引擎配置对象-->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://192.168.25.128:3306/activiti"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="root"/>
<property name="databaseSchemaUpdate" value="true"/>
</bean>
相关流程Demo:
package com.zelin;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.*;
import org.activiti.engine.repository.*;
import org.activiti.engine.runtime.ExecutionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceQuery;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import java.io.*;
import java.util.List;
/**
* @ClassName TestDemo
* @Description TODO
* @Author zhenglanlan
* @Date 2020/8/30 21:45
* @Version 1.0
**/
// 创建表格的三种方式
public class TestDemo {
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// 1
// 3 使用默认配置创建28张表格
@Test
public void test01(){
// 运行可自动生成28张表(先配置依赖和 activiti.cfg.xml 文件)
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
}
// 部署流程定义
// RepositoryService
// 数据库表:
// ACT_RE_DEPLOYMENT
// ACT_RE_PROCDEF
// ACT_GE_BYTEARRAY(通用表格)
@Test
public void test02(){
// 获得一个构造器对象,用于加载流程定义的文件,完成流程定义的部署
DeploymentBuilder deployment = defaultProcessEngine.getRepositoryService().createDeployment();
// 加载定义流程的文件
deployment.addClasspathResource("Process-1.bpmn");
deployment.addClasspathResource("Process-1.png");
deployment.name("请假流程");
// 读取打包的单个文件(压缩包.zip)
// deployment.addZipInputStream(new ZipInputStream())
// 部署流程定义文件
Deployment deploy = deployment.deploy();
System.out.println("deployID = " + deploy.getId());
}
// 查询部署列表
@Test
public void test03(){
// 查询部署对象,查询的表:ACT_RE_DEPLOYMENT
DeploymentQuery deploymentQuery = defaultProcessEngine.getRepositoryService().createDeploymentQuery();
List<Deployment> list = deploymentQuery.list();
for (Deployment deployment : list) {
String id = deployment.getId();
String name = deployment.getName();
System.out.println("id = " + id);
System.out.println("name = " + name);
}
}
// 查询流程定义列表
// 查询表:ACT_RE_PROCDEF
@Test
public void test04(){
ProcessDefinitionQuery processDefinitionQuery = defaultProcessEngine.getRepositoryService().createProcessDefinitionQuery();
List<ProcessDefinition> list = processDefinitionQuery.list();
for (ProcessDefinition processDefinition : list) {
String id = processDefinition.getId();
String name = processDefinition.getName();
System.out.println("id = " + id);
System.out.println("name = " + name);
}
}
// 删除部署信息
// 表:ACT_RE_DEPLOYMENT
@Test
public void test05(){
// 删除部署(删除多表的部署信息) 参数为部署表ID 字符串类型
defaultProcessEngine.getRepositoryService().deleteDeployment("10001"); // 一般删除
defaultProcessEngine.getRepositoryService().deleteDeployment("10001",true); // 强制删除 true代表级联删除,即强制删除,无论是否开启实例,都删除四张表的信息
/**
* 注意:
* 启动一个实例之后,流程删除报持久异常
* 强制删除方法:级联删除(主键和外键全部删除)参考以上的强制删除部署信息
* ACT_RU_EXECUTION
* ACT_RE_DEPLOYMENT
* ACT_RE_PROCDEF
* ACT_GE_BYTEARRAY
*
*/
}
/**
* 启动流程的方式(两种)
* 1 根据流程定义的ID启动
* 2 根据流程定义的key启动(自动选择最新版本的流程定义启动实例)
*/
// 根据流程定义的ID启动一个实例(一次请假)
// RuntimeService
// ACT_RU_EXECUTION 表
@Test
public void test06(){
ProcessInstance processInstance = defaultProcessEngine.getRuntimeService().startProcessInstanceById("qjlc:2:12504");
String id = processInstance.getId();
System.out.println("id = " + id);
}
// 2 根据流程定义的key启动(自动选择最新版本的流程定义启动实例)
/**
* ACT_RU_EXECUTION 表
*/
@Test
public void test10(){
String key = "qjlc";
ProcessInstance processInstance = defaultProcessEngine.getRuntimeService().startProcessInstanceByKey(key);
System.out.println("processInstance = " + processInstance.getId());
}
/**
* 查询流程实例列表
* ACT_RU_EXECUTION
*/
@Test
public void test11(){
ProcessInstanceQuery processInstanceQuery = defaultProcessEngine.getRuntimeService().createProcessInstanceQuery();
List<ProcessInstance> list = processInstanceQuery.list();
// 增加过滤查询条件
// processInstanceQuery.processDefinitionKey(""); //查询指定key
// processInstanceQuery.orderByProcessDefinitionId().desc(); //排序
processInstanceQuery.listPage(0,2); // 分页
for (ProcessInstance processInstance : list) {
System.out.println("processInstance = " + processInstance.getId() + ":" + processInstance.getActivityId());
}
}
/**
* 结束流程实例(删除流程实例)
* 表: ACT_RU_EXECUTION 的 ID 来删除
*/
@Test
public void test12(){
String processInstanceId = "15001";
defaultProcessEngine.getRuntimeService().deleteProcessInstance(processInstanceId,"结束流程描述");
}
/**
* 查询任务列表
* 表: ACT_RU_TASK
* 根据用户名来查询 Assignee 这个字段来过滤
*/
@Test
public void test13(){
String assignee = "张三";
TaskQuery taskQuery = defaultProcessEngine.getTaskService().createTaskQuery();
taskQuery.taskAssignee(assignee); // 查询条件用户名字段
taskQuery.orderByTaskCreateTime().desc(); //按照创建时间倒叙排序
List<Task> list = taskQuery.list();
for (Task task : list) {
System.out.println("task.getName() = " + task.getExecutionId());
}
}
/**
* 办理任务
* 表: ACT_RU_TASK 根据ID 来办理
* 一级一级办理。
*/
@Test
public void test14(){
defaultProcessEngine.getTaskService().complete("20002");
}
// 查询一次部署文件对应的输入流(bpmn png 都下载到指定位置 )
// RepositoryService
@Test
public void test07() throws IOException {
List<String> deploymentResourceNames = defaultProcessEngine.getRepositoryService().getDeploymentResourceNames("12501");
for (String deploymentResourceName : deploymentResourceNames) {
System.out.println("deploymentResourceName = " + deploymentResourceName);
// 将文件保存到本地磁盘
InputStream inputStream = defaultProcessEngine.getRepositoryService().getResourceAsStream("12501", deploymentResourceName);
FileOutputStream fileOutputStream = new FileOutputStream(new File("d://" + deploymentResourceName));
byte[] bytes = new byte[1024]; // 每次输入1024个字节
int reads = 0;
while ((reads = inputStream.read(bytes)) != -1){ // 只要下标不为-1 就一直读
fileOutputStream.write(bytes,0,reads); // 从 0 开始,reads 结束
}
fileOutputStream.close();
}
}
/**
* 获取文件的输入流
* 下载png到指定文件位置
*
*/
@Test
public void test08() throws IOException {
String processDiagramId = "qjlc:2:12504";
InputStream processDiagram = defaultProcessEngine.getRepositoryService().getProcessDiagram("qjlc:2:12504");
FileUtils.copyInputStreamToFile(processDiagram,new File("d:\\my.png"));
}
/**
* 查询历史办理完成的实例数据
* 表: ACT_HI_PROCINST
*
*
*/
@Test
public void test09(){
HistoricProcessInstanceQuery query = defaultProcessEngine.getHistoryService().createHistoricProcessInstanceQuery();
List<HistoricProcessInstance> list = query.list();
for (HistoricProcessInstance instance : list) {
System.out.println("instance.getId() = " + instance.getId());
}
}
/**
* 创建历史活动实例查询
* 表: ACT_HI_ACTINST
*
*
*/
@Test
public void test15(){
HistoricActivityInstanceQuery query = defaultProcessEngine.getHistoryService().createHistoricActivityInstanceQuery();
query.orderByProcessInstanceId().desc();
query.orderByHistoricActivityInstanceEndTime().asc();
List<HistoricActivityInstance> list = query.list();
for (HistoricActivityInstance instance : list) {
System.out.println("instance.getActivityName() + \":\" + instance.getActivityType() = " + instance.getActivityName() + ":" + instance.getActivityType());
}
}
/**
* 查询历史任务数据库
* 表: ACT_HI_TASKINST
*/
@Test
public void test16(){
HistoricTaskInstanceQuery query = defaultProcessEngine.getHistoryService().createHistoricTaskInstanceQuery();
query.orderByProcessInstanceId().asc();
query.orderByHistoricTaskInstanceEndTime().desc();
List<HistoricTaskInstance> list = query.list();
for (HistoricTaskInstance instance : list) {
System.out.println("开始时间:" + instance.getClaimTime() + " ===== 结束时间:" + instance.getEndTime());
}
}
}
Activities 框架提供的 Service 对象:
RepositoryService:操作静态资源(流程定义、bpmn、png)
TaskService:操作的是任务(查询、办理)
RuntimeService:操作流程实例(启动、查询、结束)
HistoryService:操作的是历史数据
Activiti 框架提供的对象: