Activiti6自学之路(七)——个人任务和组任务

Activiti6 任务有个人任务和组任务之分,理解两者的区别并且知道如何操作对应的任务是学习activiti重要一步。

本章承接上文章节,这里就不详细描述了

一、个人任务与组任务区别

个人任务:流程中的某个任务由指定的user来执行

组任务:流程中的某个任务由指定的group来完成,其中group由多个user组成

实例分析
在这里插入图片描述
1、填写请假申请任务:个人任务,比如张三提交请假申请

2、总监审批任务:组任务,这里我简单将总监理解为另一组权限的用户,不和实际意义相关;如 张三提交了请假申请后,总监一、和总监二都具有审批的权限,并且组任务中只要有一人审批了申请,组任务代表完成了,进入了下一个节点

3、经理审批:同2;

4、人力资源审核:同2

二、创建个人任务的三种方式

分配个人任务的三种方式

1、直接指定办理人

选择Main config 可以配置Assignee,可以指定一个用户来执行该任务,但是一般实际项目开发不会这么做,这样分配任务的办理人不够灵活,因为项目开发中任务的办理人不要放置XML文件中。
在这里插入图片描述
在这里插入图片描述

直接启动流程实例即可

    //9、启动流程实例
	@RequestMapping("/startProcessInstance") 
	public void startProcessInstance() {
		// 流程定义的Key
		String processDefinitionKey = "myProcess";
		ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
				.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性
		System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: 
		System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 
	
	}

启动程序,执行启动流程实例方法startProcessInstance()
在这里插入图片描述

流程启动后,会操作如下表

act_ru_execution:执行流程实例表,核心,启动后会生成一个流程实例和待执行的任务节点
在这里插入图片描述

act_ru_task:用户任务表,待执行的任务
在这里插入图片描述

act_ru_identitylink:用户身份关系表,存储待执行任务的用户关系

act_hi_taskinst:历史用户任务表,存储所有已执行或待执行的用户任务历史

act_hi_procinst:历史流程实例表,存储流程实例
在这里插入图片描述

act_hi_actinst:历史活动节点表,存储所有已执行的节点(各类节点)
在这里插入图片描述
act_hi_identitylink:历史用户身份关系表,历史用户任务的关系表

2、使用流程变量

使用动态的流程变量${userId} 来代替静态指定用户。
在这里插入图片描述

//10、启动流程实例--使用流程变量 userId
	@RequestMapping("/startProcessInstance2") 
	public void startProcessInstance2() {
		// 流程定义的Key
		String processDefinitionKey = "myProcess";
		Map<String, Object> variables = new HashMap<String, Object>();
		variables.put("userId", "user1");//这里传入id为user1的用户
		ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
				.startProcessInstanceByKey(processDefinitionKey,variables);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性
		System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: 
		System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 
	
	}

3、使用监听类

流程图中任务节点的配置

Main config不作任何配置
在这里插入图片描述
选择Listeners ,选择TaskListenerImp监听类
在这里插入图片描述

package com.springboot.activiti.eimm.leave.controller;

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

public class TaskListenerImpl implements TaskListener {

	private static final long serialVersionUID = 1L;

	/**
	 * 用来指定任务的办理人
	 */
	@Override
	public void notify(DelegateTask delegateTask) {
		//指定个人任务的办理人,也可以指定组任务的办理人
		//通过类去查询数据库,将下一个任务的办理人查询获取,然后通过setAssignee()的方法指定任务办理人
		delegateTask.setAssignee("user1");
		
	}

}

   //11、启动流程实例--使用监听类
	@RequestMapping("/startProcessInstance3") 
	public void startProcessInstance3() {
		// 流程定义的Key
		String processDefinitionKey = "myProcess";
		ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
				.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性
		System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: 
		System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 
	
	}

执行程序即可

三、查询当前人的个人任务

@RequestMapping("/findMyPersonalTask") 
	public void findMyPersonalTask(){
		String assignee = "user1";
		List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
						.createTaskQuery()//创建任务查询对象
						/**查询条件(where部分)*/
						.taskAssignee(assignee)//指定个人任务查询,指定办理人
//						.taskCandidateUser(candidateUser)//组任务的办理人查询
//						.processDefinitionId(processDefinitionId)//使用流程定义ID查询
//						.processInstanceId(processInstanceId)//使用流程实例ID查询
//						.executionId(executionId)//使用执行对象ID查询
						/**排序*/
						.orderByTaskCreateTime().asc()//使用创建时间的升序排列
						/**返回结果集*/
//						.singleResult()//返回惟一结果集
//						.count()//返回结果集的数量
//						.listPage(firstResult, maxResults);//分页查询
						.list();//返回列表
		if(list!=null && list.size()>0){
			for(Task task:list){
				System.out.println("任务ID:"+task.getId());
				System.out.println("任务名称:"+task.getName());
				System.out.println("任务的创建时间:"+task.getCreateTime());
				System.out.println("任务的办理人:"+task.getAssignee());
				System.out.println("流程实例ID:"+task.getProcessInstanceId());
				System.out.println("执行对象ID:"+task.getExecutionId());
				System.out.println("流程定义ID:"+task.getProcessDefinitionId());
				System.out.println("########################################################");
			}
		}
	}

在这里插入图片描述

四、完成个人任务

上面我们创建了个人任务,所有需要完成当前节点的任务,流程才会自动进入下一节点

前面我们已经启动了流程实例,并且设置了所让人Assignee为user1用户,
在这里插入图片描述

查看act_ru_task 代运行的任务中发现任务id为15,

    //13、完成我的任务
	@RequestMapping("/completeMyPersonalTask")
    public void completeMyPersonalTask() {
        // 任务ID
        String taskId = "15";
       //完成任务的同时,设置流程变量,根据流程变量的结果来节点进入哪一个节点任务
        Map<String, Object> args = new HashMap<>();
        args.put("time", 2);
        
        processEngine.getTaskService()// 与正在执行的任务管理相关的Service
                .complete(taskId,args);
        System.out.println("完成任务:任务ID:" + taskId);
    

这里设置表单变量submitTime=2,根据流程图分支条件知,流程会自动到经理审批任务节点处。

执行程序后,控制台输出
在这里插入图片描述
数据表数据更新

act_ru_execution 所标识的数据更新为usertask3,也就是经理审批任务
在这里插入图片描述
act_ru_task 待执行任务也变为经理审批
在这里插入图片描述

五、创建组任务

创建组任务有多种方式

1、静态配置候选人成员,可以配置一个或多个,多个用户用逗号分隔即可
在这里插入图片描述

	@RequestMapping("/startProcessInstance1") 
	public void startProcessInstance1() {
		// 流程定义的Key
		String processDefinitionKey = "myProcess";
		ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
				.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性
		System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: 
		System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 
	
	}

启动程序即可

2、使用动态变量配置候选人成员

在这里插入图片描述

//10、启动流程实例--使用流程变量 userId和userId3
	@RequestMapping("/startProcessInstance4") 
	public void startProcessInstance4() {
		// 流程定义的Key
		String processDefinitionKey = "myProcess";
		Map<String, Object> variables = new HashMap<String, Object>();
		variables.put("userId", "user1");//这里传入id为user1的用户
		variables.put("userId3", "user2,user3");//这里可以传入多个用户
		ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
				.startProcessInstanceByKey(processDefinitionKey,variables);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性
		System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: 
		System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 
	
	}

3、使用监听类来实现

方法和创建个人任务监听类是一个道理,只是可以添加一个或多个用户

4、配置候选人组来实现

创建候选人中 group3, 对应act_id_group中经理组,表示经理组中的用户都具有【经理审批】任务权限
在这里插入图片描述
在这里插入图片描述

	//10、启动流程实例--使用流程变量 userId
	@RequestMapping("/startProcessInstance2") 
	public void startProcessInstance2() {
		// 流程定义的Key
		String processDefinitionKey = "myProcess";
		Map<String, Object> variables = new HashMap<String, Object>();
		variables.put("userId", "user1");//这里传入id为user1的用户
		ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
				.startProcessInstanceByKey(processDefinitionKey,variables);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性
		System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: 
		System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 
	
	}

其它步骤一样。

六、查询当前人的组任务

//14、查询当前人的组任务
    @RequestMapping("/findMyGroupTask") 
    public void findMyGroupTask() {
        String candidateUser = "user2";
        List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的Service
                .createTaskQuery()// 创建任务查询对象
                /** 查询条件(where部分) */
                .taskCandidateUser(candidateUser)// 组任务的办理人查询
                /** 排序 */
                .orderByTaskCreateTime().asc()// 使用创建时间的升序排列
                /** 返回结果集 */
                .list();// 返回列表
        if (list != null && list.size() > 0) {
            for (Task task : list) {
                System.out.println("任务ID:" + task.getId());
                System.out.println("任务名称:" + task.getName());
                System.out.println("任务的创建时间:" + task.getCreateTime());
                System.out.println("任务的办理人:" + task.getAssignee());
                System.out.println("流程实例ID:" + task.getProcessInstanceId());
                System.out.println("执行对象ID:" + task.getExecutionId());
                System.out.println("流程定义ID:" + task.getProcessDefinitionId());
                System.out.println("########################################################");
            }
        }
    }

在这里插入图片描述

七、查询组用户的任务

@RequestMapping("/findPersonalTask") 
  	public void findPersonalTask(){
  		String candidateUser = "user2";
  		List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
  						.createTaskQuery()//创建任务查询对象
  						/**查询条件(where部分)*/
  						//.taskAssignee(assignee)//指定个人任务查询,指定办理人
  						.taskCandidateUser(candidateUser)//组任务的办理人查询
//  						.processDefinitionId(processDefinitionId)//使用流程定义ID查询
//  						.processInstanceId(processInstanceId)//使用流程实例ID查询
//  						.executionId(executionId)//使用执行对象ID查询
  						/**排序*/
  						.orderByTaskCreateTime().asc()//使用创建时间的升序排列
  						/**返回结果集*/
//  						.singleResult()//返回惟一结果集
//  						.count()//返回结果集的数量
//  						.listPage(firstResult, maxResults);//分页查询
  						.list();//返回列表
  		if(list!=null && list.size()>0){
  			for(Task task:list){
  				System.out.println("任务ID:"+task.getId());
  				System.out.println("任务名称:"+task.getName());
  				System.out.println("任务的创建时间:"+task.getCreateTime());
  				System.out.println("任务的办理人:"+task.getAssignee());
  				System.out.println("流程实例ID:"+task.getProcessInstanceId());
  				System.out.println("执行对象ID:"+task.getExecutionId());
  				System.out.println("流程定义ID:"+task.getProcessDefinitionId());
  				System.out.println("########################################################");
  			}
  		}
  	}

在这里插入图片描述


如果你觉得本篇文章对你有所帮助的话,麻烦请点击头像右边的关注按钮,谢谢!

技术在交流中进步,知识在分享中传播

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值