全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<指定任务委派人篇>
Posted DT辰白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<指定任务委派人篇>相关的知识,希望对你有一定的参考价值。
前言
任务委派人:任务负责人。
简单的来说就是,我们可以指定多个备胎,帮我去完成流程审批,比如出差申请,需要总经理申批,但是总经理只要一个人,如果他那天有事情,没办法去审批,那天的流程就作废了,会一直在激活状态,没人去处理,如果我们的总经理有好几个委派人,那么张三有事,李四可以去处理,李四有事,王五可以去处理,或者当他们三个人都有事的时候,可以随意指定一个公司的委派人来处理这个申请审批。
一、流程设计
二、部署流程
@PostMapping("deployment")
public Map<String, Object> deployment() {
Deployment deployment = repositoryService.createDeployment()
.name("部署请假申请流程")
.addClasspathResource("processes/MyFlowDelegate.bpmn")
.addClasspathResource("processes/MyFlowDelegate.png")
.deploy();
Map<String, Object> map = new HashMap<>();
map.put("msg", "->>>请假申请部署成功!");
map.put("部署流程ID:", deployment.getId());
map.put("部署流程名称:", deployment.getName());
map.put("部署时间:", deployment.getDeploymentTime());
return map;
}
二、启动流程实例
启动流程实例的时候,即可指定委派人(多个)
ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables);
variables:委派人参数:一个key对应一个value,当value是多个的时候,使用英文逗号隔开
@PostMapping("startProcess")
public Map<String, Object> startProcess(String deploymentId) {
//获取流程定义(根据部署流程ID查询act_re_procdef表信息)
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
//设置多个任务委派人
Map<String, Object> variables = new HashMap<>();
variables.put("empIds", "张三,李四,王五");
variables.put("userId", "小白");
//根据流程定义key来启动流程定义,返回流程实例
ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefinition.getKey(),variables);
Map<String, Object> map = new HashMap<>();
map.put("流程实例ID: ", pi.getId());
map.put("流程定义ID: ",pi.getProcessDefinitionId());
return map;
}
查询数据库表:act_ru_task在运行任务实例表中,我们可以看到,并没有负责人名称,原因是,当前节点,有三个委派人(张三、李四、王五)谁去完成都可以,
二、我的待办任务
候选人查询方式:taskCandidateUser(name)
参与人查询方式:taskAssignee(name)
当启动流程实例的时候,在act_ru_identitylink表中,可以看到当前流程执行者的身份类别。
可以看到张三有两个身份,即是候选人、又是参与人,但是只要候选人身份采用TaskId,就是说,如果此时是张三去完成创建出差申请,那就是以候选人的身份去完成。
@PostMapping("myTask")
public Map<String, Object> myTask(String name) {
//候选人查询方式
//Task task = taskService.createTaskQuery().taskCandidateUser(name).singleResult();
//参与人查询方式
Task task = taskService.createTaskQuery().taskAssignee(name).singleResult();
//任务列表的展示
Map<String, Object> map = new HashMap<>();
map.put("流程实例ID:", task.getProcessInstanceId());
map.put("任务ID:", task.getId());
map.put("任务负责人:", task.getAssignee());
map.put("任务名称:", task.getName());
return map;
}
查询我的待办任务,由于候选人是多个(张三、李四、王五),并且他们属于同一个节点,所以他们去查询我的待办的时候,都可以查到,而且是同一个任务实例,并且注意候选人和参与人的查询方式是不同的。
张三查询待办:
李四查询待办:
王五查询待办:
可以看到他们三人的任务ID都是同一个。
三、指定委派人
三个候选人(张三、李四、王五),当李四(或者张三、或者王五)把任务委派给小王去做的时候,小王就变成了此节点参与人,此时张三、李四、王五就不再是委派候选人了,当前节点只能由小王去完成。
@PostMapping("setAssigneeTask")
public Map<String, Object> setAssigneeTask(String name,String otherName){
Map<String, Object> map = new HashMap<>();
//任务ID
Task task = taskService.createTaskQuery().taskCandidateUser(name).singleResult();
// 三个人,当李四把任务委派给小王去做的时候,小王就变成了参与人,此时张三、李四、王五就不再是委派候选人了。
String taskId = task.getId();
//指定其它任务办理人
taskService.setAssignee(taskId, otherName);
map.put("message", "任务办理人授权成功!!,即刻发送消息通知!!");
return map;
}
当委派人指定成功之后,即可让委派人去完成流程操作。此时运行任务实例表中,就是小三去完成创建流程申请,并且有了负责人的名称。
查询负责人小王的待办任务:
四、执行任务
@PostMapping("startTask")
public Map<String, Object> startTask(String name,String taskId) {
// 判断是候选人还是参与者
Task result = taskService.createTaskQuery().taskId(taskId).singleResult();
System.out.println("候选人还是参与者->>>"+result.getAssignee());
Task task = null;
if(StringUtils.isNoneBlank(result.getAssignee())) {
System.out.println("参与人");
//我的待办任务
task = taskService.createTaskQuery()
//.taskCandidateUser(name) //候选人的查询方式(无论哪个候选人:当前任务id都是一样的,通过任务id完成当前节点流程)
.taskAssignee(name) //候选人的查询方式(无论哪个候选人:当前任务id都是一样的,通过任务id完成当前节点流程)
.singleResult();
}else {
System.out.println("候选人");
//我的待办任务
task = taskService.createTaskQuery()
.taskCandidateUser(name) //候选人的查询方式(无论哪个候选人:当前任务id都是一样的,通过任务id完成当前节点流程)
//.taskAssignee(name) //候选人的查询方式(无论哪个候选人:当前任务id都是一样的,通过任务id完成当前节点流程)
.singleResult();
}
//我的任务列表的展示
Map<String, Object> map = new HashMap<>();
map.put("流程实例ID:", task.getProcessInstanceId());
map.put("任务ID:", task.getId());
map.put("任务负责人:", task.getAssignee());
map.put("任务名称:", task.getName());
map.put("msg", name + "->>>提交了任务!");
//执行审批流程
taskService.complete(task.getId());
map.put("result1", name + "->>>的审批结束!");
//查询下一个任务点
map.put("result2", name + "->>>前往下一个任务节点!");
List<Task> taskList = taskService.createTaskQuery().list();
if(!taskList.isEmpty()) {
for(Task task1 : taskList){
map.put("流程实例ID:", task1.getProcessInstanceId());
map.put("任务ID:", task1.getId());
map.put("任务负责人:", task1.getAssignee());
map.put("任务名称:", task1.getName());
}
}else {
map.put("msg", "整个流程审批任务结束!!!");
}
return map;
}
总结
当然指定委派人的方式还有监听器,关于监听器我们会有一篇文章专门来讲,后面会陆续推出!!!!
关于Activiti的东西很多,需要进下心来,慢慢品尝,下一篇马上到进阶篇,关注吧!关注吧!关注吧!关注吧!关注吧!关注吧!关注吧!关注吧!。
熬夜干货,创作不易,动动小手点赞吧!!!!后面会继续输出更多干货给大家,喜欢的请关注小编CSDN:https://blog.csdn.net/qq_41107231 以及掘金:https://juejin.cn/user/3940246036699848
以上是关于全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<指定任务委派人篇>的主要内容,如果未能解决你的问题,请参考以下文章
全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<入门篇>
全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<流程挂起与激活篇>
全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<监听器篇>
全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<监听器篇>