activiti第二天: 8. 组任务分配(三种方式)

项目: itcast0711 > cn.itcast.l_group
组任务: 即需要由一组人来完成的任务.
组任务的分配和上节个人任务分配类似, 也是三种方式。

方式一: 直接指定具体办理组

  1. 流程图配置
    在这里插入图片描述
  2. 部署启动流程后正在执行的任务表(act_ru_task)变动
    在这里插入图片描述
  3. 正在执行的任务办理人表(包含个人任务, 组任务) act_ru_identitylink
    在这里插入图片描述
  4. 历史任务办理人表(包含个人任务, 组任务) act_hi_identitylink
    在这里插入图片描述
  5. 查询当前人的组任务 (act_ru_task)
	/**查询当前人的组任务 (act_ru_task)*/
	@Test
	public void findMyGroupTask(){
		String candidateUser = "小A";
		List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
						.createTaskQuery()//创建任务查询对象
						/**查询条件(where部分)*/
//						.taskAssignee(assignee)//指定个人任务查询,指定办理人
						.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("########################################################");
			}
		}
	}

在这里插入图片描述
6. 获取正在执行的组任务办理人(act_ru_identitylink)

	/**
	 * 获取正在执行的组任务办理人
	 * 查询正在执行的任务办理人表 act_ru_identitylink
	 */
	@Test
	public void findRunPersonTask(){
		//任务ID
		String taskId = "6204";
		List<IdentityLink> list = processEngine.getTaskService()
					.getIdentityLinksForTask(taskId);
		if(list!=null && list.size()>0){
			for(IdentityLink identityLink:list){
				System.out.println(identityLink.getTaskId()+"   "+identityLink.getType()+"   "+identityLink.getProcessInstanceId()+"   "+identityLink.getUserId());
			}
		}
	}

在这里插入图片描述

  1. 获取历史组任务办理人act_hi_identitylink
	/**
	 * 获取历史组任务办理人
	 * 查询历史任务的办理人表 act_hi_identitylink
	 */
	@Test
	public void findHistoryPersonTask(){
		//流程实例ID
		String processInstanceId = "6201";
		List<HistoricIdentityLink> list = processEngine.getHistoryService()
						// 通过流程实例ID查询, 查询的都是参与者(participant)
						.getHistoricIdentityLinksForProcessInstance(processInstanceId);
						// 通过任务ID查询, 查询的都是候选者(candidate)
//						.getHistoricIdentityLinksForTask(taskId);
		if(list!=null && list.size()>0){
			for(HistoricIdentityLink identityLink:list){
				System.out.println(identityLink.getTaskId()+"   "+
									identityLink.getType()+"   "+
									identityLink.getProcessInstanceId()+"   "+
									identityLink.getUserId());
			}
		}
	}

    :可根据已知情况, 选择使用流程实例processInstanceId 或者 任务ID, 查询历史组任务的办理人。二者查询数据并无区别。

  1. 拾取任务,将组任务分配给个人,指定任务的办理人字段
	/**拾取任务,将组任务分配给个人,指定任务的办理人字段*/
	@Test
	public void claim(){
		//将组任务分配给个人任务
		//任务ID
		String taskId = "6905";
		//分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员)
		String userId = "大F";
		processEngine.getTaskService()//
					.claim(taskId, userId);
	}
  • 正在执行的任务表(act_ru_task
    在这里插入图片描述
  1. 查询当前人的个人任务
	/**查询当前人的个人任务*/
	@Test
	public void findMyPersonalTask(){
		String assignee = "大F";
		List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
						.createTaskQuery()//创建任务查询对象
						/**查询条件(where部分)*/
						.taskAssignee(assignee)//指定个人任务查询,指定办理人
//						.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("########################################################");
			}
		}
	}

在这里插入图片描述
10. 将个人任务回退到组任务,前提:之前一定是个组任务

	/**将个人任务回退到组任务,前提:之前一定是个组任务*/
	@Test
	public void setAssigee(){
		//任务ID
		String taskId = "6204";
		//直接将该任务办理人设置null即可
		processEngine.getTaskService()
					.setAssignee(taskId, null);
	}
  1. 组任务中添加/删除成员
	/**向组任务中添加成员*/
	@Test
	public void addGroupUser(){
		//任务ID
		String taskId = "6204";
		//成员办理人
		String userId = "大H";
		processEngine.getTaskService()
					.addCandidateUser(taskId, userId);
	}
	
	/**从组任务中删除成员*/
	@Test
	public void deleteGroupUser(){
		//任务ID
		String taskId = "6204";
		//成员办理人
		String userId = "小B";
		processEngine.getTaskService()
					.deleteCandidateUser(taskId, userId);
	}
  • 正在执行的任务办理人表(act_ru_identitylink
    在这里插入图片描述

方式二: 使用流程变量

  1. 流程图配置
    在这里插入图片描述
    2.启动流程实例, 设置流程变量
	/**启动流程实例, 设置流程变量*/
	@Test
	public void startProcessInstance(){
		//流程定义的key
		String processDefinitionKey = "task";
		/**启动流程实例的同时,设置流程变量,使用流程变量用来指定组任务的办理人,对应task.pbmn文件中#{userIDs}*/
		Map<String, Object> variables = new HashMap<String, Object>();
		variables.put("userIDs", "大大,中中,小小");
		ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service
						.startProcessInstanceByKey(processDefinitionKey,variables);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
		System.out.println("流程实例ID:"+pi.getId());//流程实例ID  
		System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID   
	}
	

方式三: 使用类

项目: cn.itcast.l_group02
说明: 与上一节个人任务分配的第三种方式一致, 唯一有点变动的是这个Listener监听类.

package cn.itcast.l_group02;

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

@SuppressWarnings("serial")
public class TaskListenerImpl implements TaskListener {

	/**用来指定任务的办理人*/
	@Override
	public void notify(DelegateTask delegateTask) {
		//指定个人任务的办理人,也可以指定组任务的办理人
		//个人任务:通过类去查询数据库,将下一个任务的办理人查询获取,然后通过setAssignee()的方法指定任务的办理人
		//delegateTask.setAssignee("灭绝师太");
		//组任务(添加候选办理人):
		delegateTask.addCandidateUser("洪洗象");
		delegateTask.addCandidateUser("徐脂虎");
	}

}

:使用类分配任务的要点:

  • 流程图任务节点Main config 中的办理人不要配置
  • 创建Listener监听类
  • 流程图任务节点配置Listener属性中监听类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值