引入依赖
【注意:由于会自动引入mybatis依赖,所以如果引入后启动项目报错,可把mybatis依赖排除。】
org.activiti
activiti-spring-boot-starter
7.0.0.Beta2
org.activiti
activiti-image-generator
7.1.0.M6
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
5.1.38
application.yml配置
【注意:activiti7配置信息,不要放在boostrap.yml 里面,我这边自测启动会报错。】
# Spring相关配置
spring:
##数据库连接信息
datasource:
# 数据源配置
url: jdbc:mysql://127.0.0.1:3306/activiti2?useUnicode=true&characterEncoding=utf-8&useSSL=false&nullCatalogMeansCurrent=true
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
application:
# 注册应用名
name: actdemo
# 如果运行报错是 Could not set database schema on connection 可以先把activiti节点相关注解掉试试。
activiti:
# 自动建表 ACTIVITI 启用 activiti 必须要配置再 application.yml中
database-schema: ACTIVITI
database-schema-update: true
history-level: full
db-history-used: true
jpa:
show-sql: true
使用前说明:
1、我这里要提前说明,你需要懂得如何画流程图(epmn)文件,再用以下工具类会合适一些。因为你要懂得代理人(assign)、候选人(candidate)、流程变量、流程控制等名词。
2:
[流程定义]:就是导入了一个bpmn文件,算是定义了一个流程的结构。
[流程实例]:根据流程定义创建出一个真实的流程数据,比如某员工创建了请假条。
[任务]: 就是流程中的节点,该节点只允许存在一个负责人,但是可以存在多个候选人或者候选组。
【流程部署】:就是把你的bpmn文件解析存到数据库中,相当于新增了一条请假单模板。
【开启流程】:相当于你根据请假条模板创建了一条请假单,在创建方法( startProcessInstanceByKey )中就要指定接下来流程节点候选人(单个或多个)都有哪些。
举例:
工具类:
package com.example.util;
import com.sun.istack.internal.NotNull;
import org.activiti.bpmn.model.*;
import org.activiti.bpmn.model.Process;
import org.activiti.engine.*;
import org.activiti.engine.history.*;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.HistoricProcessInstanceEntityImpl;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Identitylink;
import org.activiti.engine.task.Task;
import org.activiti.image.ProcessDiagramGenerator;
import org.activiti.image.impl.DefaultProcessDiagramGenerator;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.el.PropertyNotFoundException;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
import java.util.zip.ZipInputStream;
@Component
public class Activiti7Util {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private HistoryService historyService;
@Autowired
private ManagementService managementService;
public Map importProcess(MultipartFile file ,MultipartFile imgFile, String name ,
String bpmnResourceName , String imgResourceName) throws Exception{
Resource resource = file.getResource();
DeploymentBuilder name1 = repositoryService
.createDeployment()
.name(name);
name1.addInputStream(bpmnResourceName, file.getInputStream());
if (imgResourceName != null){
name1.addInputStream(imgResourceName, imgFile.getInputStream());
}
Deployment deployment = name1.deploy();
return getMap(deployment);
}
public Map importProcessByResources(@NotNull String name , @NotNull String bpmnName , String bpmnImgName){
DeploymentBuilder deployment = repositoryService.createDeployment();
deployment.name(name);
deployment.addClasspathResource("processes/"+bpmnName);
if (bpmnImgName != null){
deployment.addClasspathResource("processes/"+bpmnImgName);
}
//执行部署
Deployment deploy = deployment.deploy();
return getMap(deploy);
}
public Map importProcessByZip(String zipPath , String name ) throws FileNotFoundException {
FileInputStream fileInputStream = new FileInputStream(zipPath);
ZipInputStream stream = new ZipInputStream(fileInputStream);
Deployment deploy = repositoryService.createDeployment()
.addZipInputStream(stream)
//act_re_procdef 表中的name
.name(name)
.deploy();
return getMap(deploy);
}
private Map getMap(Deployment deploy) {
Map map = new HashMap<>(3);
System.out.println("部署ID:" + deploy.getId());
System.out.println("部署Name:" + deploy.getName());
System.out.println("部署时间:" + deploy.getDeploymentTime());
map.put("deploymentId", deploy.getId());
map.put("deploymentName", deploy.getName());
map.put("deploymentTime", deploy.getDeploymentTime());
return map;
}
public List
整个工具类有很多方法,但用得到的基本就是一部分:
@Controller
@RequestMapping("/act")
public class ActivityController {
@Resource
private Activiti7Util util;
public static String bpmnProcessId = "Process_test";
public static Map map = new HashMap<>();
public static String assigneeName = "小明";
List banzhangList = Arrays.asList("小黑班长","小白班长");
List teacherList = Arrays.asList("老师A","老师B");
List fuList = Arrays.asList("小粉副校长","小红副校长");
List zhengList = Arrays.asList("小绿正校长","小蓝正校长");
@RequestMapping("/bushu")
@ResponseBody
public Object bushu( @RequestParam Map params ){
String name = "请假条";
String bpmnName = "qingjia.bpmn";
String bpmnImgName = "qingjia.svg";
Map deployment = util.importProcessByResources(name, bpmnName, bpmnImgName);
return deployment;
}
@RequestMapping("/kaishi")
@ResponseBody
public Object kaishi(String applyUserName){
Map params = new HashMap<>();
params.put("userName", applyUserName);
params.put("banzhangList", banzhangList);
params.put("teacherList", teacherList);
params.put("fuList", fuList);
params.put("zhengList", zhengList);
//TODO 这里可加入业务表 并获得新增的业务id 传入 businessKey
String businessKey = "这里是业务id";
util.startProcessInstanceByKey(bpmnProcessId, businessKey, params);
List> tasks = util.taskListByMy(assigneeName, bpmnProcessId, 0, 100);
for (Map task : tasks) {
String taskId = (String) task.get("taskId");
//开始一个流程 就先完成自己的任务
util.completeTask(assigneeName , taskId,null);
}
return "success";
}
@RequestMapping("/shiquList")
@ResponseBody
public Object shiquList( @RequestParam Map params ){
String candidateUserName = "SYSTEM";
return util.taskListByCandidateUser(bpmnProcessId, candidateUserName);
}
@RequestMapping("/tongguo")
@ResponseBody
public Object tongguo( @RequestParam Map params ){
String taskId = "";
params.put("roomCheck", 1);
String candidateUserName = "SYSTEM";
return util.claimTaskAndCompleteTask(candidateUserName, taskId, params);
}
@RequestMapping("/lishi")
@ResponseBody
public Object historicActivityInstanceList( @RequestParam Map params ){
String definitionId = "resourcesOccupy3:2:bb047ad5-9ecd-11ec-a39b-080058000005";
String instanceId = null;
String assigneeName = "";
return util.historicActivityInstanceList(definitionId, instanceId , assigneeName);
}
}
demo地址