在之前的文章已经介绍过Activiti7的基本使用,现在就使用springboot整合Activiti7,完成一个完整的请假流程。
Activiti7 发布正式版之后,它与 SpringBoot2.x 已经完全支持整合开发。
Activti7 新支持ProcessRuntime 接口和TaskRuntime 接口,我没有尝试用这两个接口,想用的朋友可以自己研究。
首先创建一个springboot项目,添加Activiti依赖,如下:
因为 Activiti7 与 SpringBoot 整合后,默认情况下,集成了 SpringSecurity 安全框架,所以我们就要去准备 SpringSecurity 整合进来的相关用户权限配置信息(该配置我就不贴出来了)。
项目搭建好后,就要画流程图:
整个流程是这样:请假人填写请假信息提交后,就开启一个流程实例,并完成“填写请假信息”任务,然后到“部门主管审批”,审批不通过就返回“填写请假信息”,审批通过并且请假天数小于等于5天,就转到“人事存档”,审批通过并且请假天数大于5天,转到“总经理审批”,经理审批不通过就跳回“填写请假信息”,经理审批通过就转到“人事存档”,“人事存档”完成任务就转到“行政考勤”和“财务统计”,当“行政考勤”和“财务统计”都完成任务,整个流程结束。
下边是流程图的详细信息:
在除了“填写请假信息”外的所有任务,都添加了监听器,作用是在这些任务创建时,添加任务的候选人,然后这些候选人都可以查看到这些任务,然后可以领取任务并完成任务。在排他网关的出口都添加判断条件,这些条件在上面xml中都有。
然后我们启动springboot项目,发现数据库表只有17张,但不影响操作;
首先部署流程:
//部署流程定义
@RequestMapping(value= "deploy/{zipName}")
@ResponseBody
public Respon deploy(@PathVariable(name="zipName")String zipName){
Respon respon=new Respon();
//转化出ZipInputStream流对象
InputStream is = TestController.class.getClassLoader().getResourceAsStream("diagram/"+zipName+".zip");
//将 inputstream流转化为ZipInputStream流
ZipInputStream zipInputStream = new ZipInputStream(is);
//进行部署
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream(zipInputStream).deploy();
//输出部署的一些信息
System.out.println(deployment.getId());
respon.setCode(Constant.CODE_SUCCESS);
respon.setMsg(Constant.CODE_SUCCESS_STRING);
return respon;
}
开始请假
//开始一个请假流程,并完成填写请假申请信息
@RequestMapping(value= "startTest/{userName}/{totalDay}")
@ResponseBody
public Respon startTest(@PathVariable(name="userName")String userName, @PathVariable(name="totalDay")Float totalDay){
Respon respon=new Respon();
String key="qingjia_1";
ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(key);
String processInstanceId=processInstance.getProcessInstanceId();
System.out.println(processInstanceId);
System.out.println("开启了流程实例");
List
.processDefinitionKey(key)//流程实例key
.processInstanceId(processInstanceId)
.list();
for(Task task:list){
System.out.println("任务id:"+list.get(0).getId());
System.out.println("任务名称:"+list.get(0).getName());
taskService.setAssignee(list.get(0).getId(),userName);
Map
map.put("totalDay",totalDay);
map.put("applyUserName",userName);
taskService.complete(task.getId(),map);
//这里完成任务后,监听器马上触发,所以是监听器代码先运行。
System.out.println(userName+"-->完成任务:"+task.getId()+"."+task.getName());
}
respon.setData(processInstanceId);
respon.setCode(Constant.CODE_SUCCESS);
respon.setMsg(Constant.CODE_SUCCESS_STRING);
return respon;
}
/**
* Created by Administrator on 2019/11/22.
* 主管监听器
*/
@Component
public class ZhuGuanListener implements TaskListener{
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("进入主管监听器");
System.out.println("新产生任务id:"+delegateTask.getId());
System.out.println("新产生任务名称:"+delegateTask.getName());
List
list.add("主管-诸葛亮");
list.add("副主管-刘伯温");
list.add("副主管-李靖");
delegateTask.addCandidateUsers(list);
}
}
所有主管都可以查询到相关任务
//查询可选任务
@RequestMapping(value= "listTask/{userName}")
@ResponseBody
public Respon listTask(@PathVariable(name="userName")String userName){
Respon respon=new Respon();
List
if(list.size()>0){
String taskId=list.get(0).getId();
System.out.println("任务id:"+list.get(0).getId());
System.out.println("任务名称:"+list.get(0).getName());
respon.setMsg(taskId);
}else{
respon.setMsg("没有可选任务");
return respon;
}
respon.setCode(Constant.CODE_SUCCESS);
return respon;
}
主管领取并完成任务
//主管领取任务并审批
@RequestMapping(value= "claimTask/{userName}/{taskId}/{flag}/{totalDay}")
@ResponseBody
public Respon claimTask(@PathVariable(name="userName")String userName,@PathVariable(name="taskId")String taskId,@PathVariable(name="flag")String flag,@PathVariable(name="totalDay")Float totalDay){
Respon respon=new Respon();
//flag="_3"驳回;flag="1"通过
Map
map.put("zhuguanFlag",flag);
map.put("totalDay",totalDay);
taskService.claim(taskId,userName);
taskService.complete(taskId,map);
System.out.println(userName+":审批任务id:"+taskId);
respon.setCode(Constant.CODE_SUCCESS);
respon.setMsg(Constant.CODE_SUCCESS_STRING);
return respon;
}
我这里主管审批通过了,所以下一步就是总经理可以查看到任务
总经理审批任务不通过
//经理领取任务并审批
@RequestMapping(value= "claimTask2/{userName}/{taskId}/{flag}")
@ResponseBody
public Respon claimTask2(@PathVariable(name="userName")String userName,@PathVariable(name="taskId")String taskId,@PathVariable(name="flag")String flag){
Respon respon=new Respon();
//flag="2"驳回;flag="1"通过
Map
map.put("jingliFlag",flag);
taskService.claim(taskId,userName);
taskService.complete(taskId,map);
System.out.println(userName+":审批任务id:"+taskId);
respon.setCode(Constant.CODE_SUCCESS);
respon.setMsg(Constant.CODE_SUCCESS_STRING);
return respon;
}
审批没通过就返回到“填写请假信息”,我不知道是什么原因,这里驳回不用写其他代码,在网上看过很多驳回的例子都是要写很多东西,但那都是Activiti6及更低的版本,可能Activiti7就不需要。
那现在就查看是否进行到“填写请假信息”这个任务
//查询该流程实例有什么任务
@RequestMapping(value= "processTask/{processInstanceId}")
@ResponseBody
public Respon processTask(@PathVariable(name="processInstanceId")String processInstanceId){
Respon respon=new Respon();
String key="qingjia_1";
List
.processInstanceId(processInstanceId).list();
if(list.size()>0){
String taskId=list.get(0).getId();
System.out.println("任务id:"+list.get(0).getId());
System.out.println("任务名称:"+list.get(0).getName());
respon.setMsg(taskId);
}else{
respon.setMsg("没有可选任务");
return respon;
}
respon.setCode(Constant.CODE_SUCCESS);
return respon;
}
到这里差不多了,剩下的步骤和上面的都类似,所有我就不一一操作,如各位有什么问题和意见都可以提出来,大家一起研究。
最后希望这篇文章能帮到各位学习到更多,谢谢。