该demo不包含任何页面,都是接口测试类型的。
项目地址:https://github.com/qiuxinfa/boot-activiti
新建maven工程,主要是引入了activiti依赖,pom.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
</parent>
<groupId>com.qxf</groupId>
<artifactId>boot-activiti</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>6.0.0</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
</project>
2.在resources目录下新建目录processes,该目录下要有可部署的流程定义文件,因为项目启动的时候,会检查该目录,例如,我项目中的请假流程图:
3.启动类排除, org.activiti.spring.boot.SecurityAutoConfiguration,这个类
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
@MapperScan(basePackages = {"com.qxf.mapper"})
public class ActivitiApp {
public static void main(String[] args) {
SpringApplication.run(ActivitiApp.class,args);
}
}
做好这些准备工作之后,就可以开始测试工作了。
1.启动流程:
// 启动请假流程
@GetMapping("/start")
public String startLeaveProcess(){
// 模拟系统用户
String userId = "sam";
System.out.println(userId + " ,开始申请请假");
Leave leave = new Leave();
leave.setId(UUID.randomUUID().toString().replace("-",""));
leave.setUserId(userId);
leave.setStartDate(new Date());
leave.setEndDate(new Date());
leave.setReason(userId+",在 "+dateFormat.format(new Date())+" 请假");
int cnt = leaveMapper.addLeave(leave);
if (cnt <= 0){
return "请假申请失败,请确认填写的信息是否正确";
}
// 设置认证用户
identityService.setAuthenticatedUserId(userId);
// 启动流程
Map<String,Object> map = new HashMap<>(1);
// 设置流程启动人
map.put("applyUserId",userId);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess", leave.getId(), map);
System.out.println("请假流程启动成功,流程实例id为 "+processInstance.getId());
// 回填 流程实例id
leaveMapper.updateLeave(leave.getId(),processInstance.getId());
return "请假流程启动成功";
}
注意到这两行代码
runtimeService.startProcessInstanceByKey("leaveProcess", leave.getId(), map);
// 回填 流程实例id
leaveMapper.updateLeave(leave.getId(),processInstance.getId());
在启动流程时,设置了businessKey为请假表的主键id进行关联,同时也将流程实例id设置到请假表中,这样一来,我们的业务表和activiti的流程表就有了关联。
2.填写请假表单,是否提交申请,如果是提交申请,则流程进入到领导审批,否则,流程结束
// 是否请假
@GetMapping("/apply")
public String apply(String isApply){
String userId = "sam";
Task task = taskService.createTaskQuery().taskAssignee(userId).singleResult();
if (task == null){
return "请先启动流程,或者请假已经申请";
}
Map<String,Object> map = new HashMap<>(1);
map.put("isApply",isApply);
taskService.complete(task.getId(),map);
String msg = "已撤销请假";
if ("true".equals(isApply)){
msg = "已提交请假";
}
System.out.println(msg);
return msg;
}
3. 领导审批,如果审批不通过,在申请人重新填写请假审批,否则流程结束
// 领导审批
@GetMapping("/leaderApprove")
public String leaderApprove(String leaderAudit){
String userId = "qiuxinfa";
Task task = taskService.createTaskQuery().taskAssignee(userId).singleResult();
if (task == null){
return "没有待审批任务";
}
Map<String,Object> map = new HashMap<>(1);
map.put("leaderAudit",leaderAudit);
taskService.complete(task.getId(),map);
String msg = "不同意请假";
if ("true".equals(leaderAudit)){
msg = "同意请假";
}
System.out.println("已完成审批,结果为: "+msg);
return "已完成审批,结果为: "+msg;
}
4.查询我发起的请假流程,这里主要用到了startedBy,然后通过businessKey找到请假表单信息
// 我发起的请假流程
@GetMapping("/myLeave")
public List<Leave> getMyLeave(){
String userId = "sam";
List<HistoricProcessInstance> processInstanceList = historyService.createHistoricProcessInstanceQuery()
.processDefinitionKey("leaveProcess").startedBy(userId).list();
List<Leave> leaveList = new ArrayList<>();
if (processInstanceList != null && processInstanceList.size() > 0){
for (HistoricProcessInstance instance : processInstanceList){
Leave leave = leaveMapper.getLeaveById(instance.getBusinessKey());
leaveList.add(leave);
}
}
return leaveList;
}
5. 查询请假记录,和发起的请假不同之处就是,完成的流程,才算是,所以会多了一个限制条件finished()
// 我的请假记录
@GetMapping("/record")
public List<Leave> getMyLeaveRecord(){
String userId = "sam";
List<HistoricProcessInstance> processInstanceList = historyService.createHistoricProcessInstanceQuery()
.processDefinitionKey("leaveProcess").startedBy(userId).finished().list();
List<Leave> leaveList = new ArrayList<>();
if (processInstanceList != null && processInstanceList.size() > 0){
for (HistoricProcessInstance instance : processInstanceList){
Leave leave = leaveMapper.getLeaveById(instance.getBusinessKey());
leaveList.add(leave);
}
}
return leaveList;
}