全网最新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企业实战教程<监听器篇>

全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<流程挂起与激活篇>

全网最新Spring Boot2.5.1整合Activiti5.22.0企业实战教程<指定任务委派人篇>