
1.导包
4.0.0 org.example activiti_demo 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.3.5.RELEASE UTF-8 UTF-8 1.8 5.1.29 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test org.activiti activiti-spring-boot-starter 7.1.0.M3.1 org.springframework.boot spring-boot-starter-security 2.3.4.RELEASE mysql mysql-connector-java ${mysql.version} org.projectlombok lombok org.springframework.boot spring-boot-maven-plugin
2.新建启动类,配置如下:
package com.wanglj;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration.class
})
public class ActivitiApplication {
public static void main(String[] args) {
SpringApplication.run(ActivitiApplication.class, args);
}
}
3.idea下载bpmn画图插件Activiti BPMN visualizer,安装重启idea
4.在resources目录下新建processes文件夹,并点击右键选择bpmn文件新建(注意:流程名字随便取,但文件必须是xx.bpmn20.xml格式)
5.填写相应参数
6.打开新建的xml文件,点击右键打开流程图工具
7.画流程图(以user task为例,其他功能自行参考官网),点击右键新建开始–>Activities–>User task,注意每个步骤写好流程名称
注:流转下一步人名称得写上(这里提交请假申请-->worker,部门经理审批-->leader,财务审批-->finance)
拖动箭头使流程连接
最终效果
8.保存流程图到项目,右键Save to PNG,选择路径为xx.bpmn.xml同路径
完整结构如图
9.新建activiti配置,也可使用yml方式springbean注入,这里使用xml方式配置(注:必须叫activiti.cfg.xml且必须放resources根目录下,否则需要在代码配置放置路径,内容如下)
10.编写测试代码
注:其中开始流程的key值为新建流程文件时的名称,如果不清楚可打开流程图面板,左键点击空白处,可显示id,对应key值
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricActivityInstanceQuery;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
@Slf4j
public class test {
@Test
public void testDeployment() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment().addClasspathResource("processes/process_955.bpmn20.xml").addClasspathResource("processes/process_955.png").name("请假申请流程").deploy();
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
}
@Test
public void testStartProcess() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process_955");
System.out.println("流程部署id:" + processInstance.getId());
System.out.println("流程部署名称:" + processInstance.getName());
System.out.println("processInstanceId:" + processInstance.getProcessInstanceId());
}
@Test
public void testFindPersonalTaskList() {
//对应各流程节点流转下一步人名称,这里第一步从worker开始
//调用下方completTask方法可通过审批,再查询下一个名称leader,以此类推直到结束,因为流程图没有不通过的情况所以暂不考虑
String assignee = "worker";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List list = taskService.createTaskQuery().processDefinitionKey("process_955").taskAssignee(assignee).list();
for (Task task : list) {
System.out.println("流程实例id:" + task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
@Test
public void completTask() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
//根据流程key和任务的负责人 查询任务
//返回一个任务对象
//对应各流程节点流转下一步人名称,这里第一步从worker开始,分别为worker-->leader-->finance
Task task = taskService.createTaskQuery().processDefinitionKey("process_955").taskAssignee("worker").singleResult();
//完成任务,参数:任务id
taskService.complete(task.getId());
}
@Test
public void queryProcessDefinition() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//查询出当前所有的流程定义
List list = processDefinitionQuery.processDefinitionKey("process_955").orderByProcessDefinitionVersion().desc().list();
//输出流程定义信息
for (ProcessDefinition processDefinition : list) {
System.out.println("流程定义 id=" + processDefinition.getId());
System.out.println("流程定义 name=" + processDefinition.getName());
System.out.println("流程定义 key=" + processDefinition.getKey());
System.out.println("流程部署id =" + processDefinition.getDeploymentId());
System.out.println("<=========================================>");
}
}
@Test
public void deleteDeployment(){
String deploymentId = "1";
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//通过流程引擎获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//删除流程定义,如果该流程定义已有流程实例启动则删除报错
repositoryService.deleteDeployment(deploymentId);
//设置为true,则有流程实例在启动也可以强制删除
// repositoryService.deleteDeployment(deploymentId,true);
}
@Test
public void queryBpmnFile()throws Exception{
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("process_955").singleResult();
//通过流程定义信息,得到部署id
String deploymentId = processDefinition.getDeploymentId();
//得到png图片流
InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
//得到bpmn文件流
InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
File file_png = new File("C:\Users\HYGK\Desktop\bpmn\process_955.png");
File file_bpmn = new File("C:\Users\HYGK\Desktop\bpmn\process_955.bpmn");
FileOutputStream pngOut = new FileOutputStream(file_png);
FileOutputStream bpmnOut = new FileOutputStream(file_bpmn);
IOUtils.copy(pngInput,pngOut);
IOUtils.copy(bpmnInput,bpmnOut);
pngOut.close();
bpmnOut.close();
}
@Test
public void findHistoryInfo(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
//获取actinst表的查询对象
HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//根据instanceId查询整个流程
instanceQuery.processInstanceId("5001").orderByHistoricActivityInstanceStartTime().asc();
List list = instanceQuery.list();
for (HistoricActivityInstance historicActivityInstance : list) {
System.out.println(historicActivityInstance.getActivityId());
System.out.println(historicActivityInstance.getActivityName());
System.out.println(historicActivityInstance.getProcessDefinitionId());
System.out.println(historicActivityInstance.getCalledProcessInstanceId());
System.out.println("<=========================================>");
}
}
}