Activiti进阶(十一)——分配组任务的三种方式

     上一篇博客我们讲了分配个人任务的三种方式,这篇博客我们来介绍一下分配组任务的三种方式。


     一、流程图


                                           Activiti进阶(十一)——分配组任务的三种方式_第1张图片

                                            图一  分配组任务的三种方式  



     二、分配组任务方式一:直接指定办理人


     1.在任务节点设置办理人


     


     2.测试代码

package cn.gome.m_groupTask;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricIdentityLink;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class TaskTest {

	// 流程引擎对象
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

	/**部署流程定义+启动流程实例:3905*/
	@Test
	public void deployementAndStartProcess() {
		//1.发布流程
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream(
				"task.bpmn");
		InputStream inputStreamPng = this.getClass().getResourceAsStream(
				"task.png");
		processEngine.getRepositoryService()//
				.createDeployment()//
				.addInputStream("task.bpmn", inputStreamBpmn)//
				.addInputStream("task.png", inputStreamPng)//
				.deploy();
		//2.启动流程
		ProcessInstance pi = processEngine.getRuntimeService()//
				.startProcessInstanceByKey("task");
		System.out.println("pid:" + pi.getId());

	}

	/**查询我的个人任务,没有执行结果*/
	@Test
	public void findPersonalTaskList() {
		// 任务办理人
		String assignee = "小A";
		List list = processEngine.getTaskService()//
				.createTaskQuery()//
				.taskAssignee(assignee)// 个人任务的查询
				.list();
		if (list != null && list.size() > 0) {
			for (Task task : list) {
				System.out.println("任务ID:" + task.getId());
				System.out.println("任务的办理人:" + task.getAssignee());
				System.out.println("任务名称:" + task.getName());
				System.out.println("任务的创建时间:" + task.getCreateTime());
				System.out.println("流程实例ID:" + task.getProcessInstanceId());
				System.out.println("#######################################");
			}
		}
	}

	/**查询组任务*/
	@Test
	public void findGroupTaskList() {
		// 任务办理人
		String candidateUser = "小A";
		List list = processEngine.getTaskService()//
				.createTaskQuery()//
				.taskCandidateUser(candidateUser)// 参与者,组任务查询
				.list();
		if (list != null && list.size() > 0) {
			for (Task task : list) {
				System.out.println("任务ID:" + task.getId());
				System.out.println("任务的办理人:" + task.getAssignee());
				System.out.println("任务名称:" + task.getName());
				System.out.println("任务的创建时间:" + task.getCreateTime());
				System.out.println("流程实例ID:" + task.getProcessInstanceId());
				System.out.println("#######################################");
			}
		}
	}

	/**完成任务*/
	@Test
	public void completeTask() {
		// 任务ID
		String taskId = "3708";
		processEngine.getTaskService()//
				.complete(taskId);
		System.out.println("完成任务:" + taskId);
	}

	/**查询正在执行的组任务列表*/
	@Test
	public void findGroupCandidate() {
		// 任务ID
		String taskId = "3708";
		List list = processEngine.getTaskService()//
				.getIdentityLinksForTask(taskId);
		if (list != null && list.size() > 0) {
			for (IdentityLink identityLink : list) {
				System.out.println("任务ID:" + identityLink.getTaskId());
				System.out.println("流程实例ID:"
						+ identityLink.getProcessInstanceId());
				System.out.println("用户ID:" + identityLink.getUserId());
				System.out.println("工作流角色ID:" + identityLink.getGroupId());
				System.out.println("#########################################");
			}
		}
	}

	/**查询历史的组任务列表*/
	@Test
	public void findHistoryGroupCandidate() {
		// 流程实例ID
		String processInstanceId = "3705";
		List list = processEngine.getHistoryService()
				.getHistoricIdentityLinksForProcessInstance(processInstanceId);
		if (list != null && list.size() > 0) {
			for (HistoricIdentityLink identityLink : list) {
				System.out.println("任务ID:" + identityLink.getTaskId());
				System.out.println("流程实例ID:"
						+ identityLink.getProcessInstanceId());
				System.out.println("用户ID:" + identityLink.getUserId());
				System.out.println("工作流角色ID:" + identityLink.getGroupId());
				System.out.println("#########################################");
			}
		}
	}
}


     说明:

     1)小A,小B,小C,小D是组任务的办理人

     2)但是这样分配组任务的办理人不够灵活,因为项目开发中任务的办理人不要放置XML文件中。

     3)act_ru_identitylink表存放组任务的办理人,表示正在执行的任务

     4)act_hi_identitylink表存放所有任务的办理人,包括个人任务和组任务表示历史任务


            三、分配组任务方式二:使用流程变量


     1.在任务节点设置变量

     


     2.测试代码

public class TaskTest {
	
	//流程引擎对象
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**部署流程定义+启动流程实例*/
	@Test
	public void deployementAndStartProcess(){
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
		InputStream inputStreampng = this.getClass().getResourceAsStream("task.png");
		//部署流程定义
		Deployment deployment = processEngine.getRepositoryService()//
						.createDeployment()//创建部署对象
						.addInputStream("task.bpmn", inputStreamBpmn)//部署加载资源文件
						.addInputStream("task.png", inputStreampng)//
						.deploy();
		System.out.println("部署ID:"+deployment.getId());
		//启动流程实例
		/**
		 * 启动流程实例的同时,设置流程变量,使用流程变量的方式设置下一个任务的办理人
		 *		 流程变量的名称,就是在task.bpmn中定义activiti:candidateUsers="#{userIDs}"的userIDs
		 * 		 流程变量的值,就是任务的办理人(组任务)
		 */
		Map variables = new HashMap();
		variables.put("userIDs", "大大,中中,小小");
		ProcessInstance pi = processEngine.getRuntimeService()//
							.startProcessInstanceByKey("task",variables);//使用流程定义的key的最新版本启动流程
		System.out.println("流程实例ID:"+pi.getId());
		System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());
	}
	
	/**查询我的个人任务*/
	@Test
	public void findPersonalTaskList(){
		//任务办理人
		String assignee = "小A";
		List list = processEngine.getTaskService()//
						.createTaskQuery()//
						.taskAssignee(assignee)//个人任务的查询
						.list();
		if(list!=null && list.size()>0){
			for(Task task:list){
				System.out.println("任务ID:"+task.getId());
				System.out.println("任务的办理人:"+task.getAssignee());
				System.out.println("任务名称:"+task.getName());
				System.out.println("任务的创建时间:"+task.getCreateTime());
				System.out.println("流程实例ID:"+task.getProcessInstanceId());
				System.out.println("#######################################");
			}
		}
	}
	
	/**查询组任务*/
	@Test
	public void findGroupTaskList(){
		//任务办理人
		String candidateUser = "小A";
		List list = processEngine.getTaskService()//
						.createTaskQuery()//
						.taskCandidateUser(candidateUser)//参与者,组任务查询
						.list();
		if(list!=null && list.size()>0){
			for(Task task:list){
				System.out.println("任务ID:"+task.getId());
				System.out.println("任务的办理人:"+task.getAssignee());
				System.out.println("任务名称:"+task.getName());
				System.out.println("任务的创建时间:"+task.getCreateTime());
				System.out.println("流程实例ID:"+task.getProcessInstanceId());
				System.out.println("#######################################");
			}
		}
	}
	
	/**完成任务*/
	@Test
	public void completeTask(){
		//任务ID
		String taskId = "5909";
		processEngine.getTaskService()//
						.complete(taskId);
		System.out.println("完成任务:"+taskId);
	}
	
	/**查询正在执行的组任务列表*/
	@Test
	public void findGroupCandidate(){
		//任务ID
		String taskId = "5909";
		List list = processEngine.getTaskService()//
						.getIdentityLinksForTask(taskId);

		if(list!=null && list.size()>0){
			for(IdentityLink identityLink:list){
				System.out.println("任务ID:"+identityLink.getTaskId());
				System.out.println("流程实例ID:"+identityLink.getProcessInstanceId());
				System.out.println("用户ID:"+identityLink.getUserId());
				System.out.println("工作流角色ID:"+identityLink.getGroupId());
				System.out.println("#########################################");
			}
		}
	}
	
	/**查询历史的组任务列表*/
	@Test
	public void findHistoryGroupCandidate(){
		//流程实例ID
		String processInstanceId = "5905";
		List list = processEngine.getHistoryService()
						.getHistoricIdentityLinksForProcessInstance(processInstanceId);
		if(list!=null && list.size()>0){
			for(HistoricIdentityLink identityLink:list){
				System.out.println("任务ID:"+identityLink.getTaskId());
				System.out.println("流程实例ID:"+identityLink.getProcessInstanceId());
				System.out.println("用户ID:"+identityLink.getUserId());
				System.out.println("工作流角色ID:"+identityLink.getGroupId());
				System.out.println("#########################################");
			}
		}
	}	
}

              四、分配组任务方式三:使用类


     1.编写类

public class TaskListenerImpl implements TaskListener {

	/**
	 * 可以设置任务的办理人(个人组人和组任务)
	 */
	@Override
	public void notify(DelegateTask delegateTask) {
		//指定组任务
		delegateTask.addCandidateUser("孙悟空");
		delegateTask.addCandidateUser("猪八戒");
	}

}


     2.设置任务监听

     


     3.测试代码

public class TaskTest {
	
	//流程引擎对象
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**部署流程定义+启动流程实例*/
	@Test
	public void deployementAndStartProcess(){
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
		InputStream inputStreampng = this.getClass().getResourceAsStream("task.png");
		//部署流程定义
		Deployment deployment = processEngine.getRepositoryService()//
							.createDeployment()//创建部署对象
							.addInputStream("task.bpmn", inputStreamBpmn)//部署加载资源文件
							.addInputStream("task.png", inputStreampng)//
							.deploy();
		System.out.println("部署ID:"+deployment.getId());
		//启动流程实例
		
		ProcessInstance pi = processEngine.getRuntimeService()//
							.startProcessInstanceByKey("task");//使用流程定义的key的最新版本启动流程
		System.out.println("流程实例ID:"+pi.getId());
		System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());
	}
	
	/**查询我的个人任务*/
	@Test
	public void findPersonalTaskList(){
		//任务办理人
		String assignee = "唐僧";
		List list = processEngine.getTaskService()//
						.createTaskQuery()//
						.taskAssignee(assignee)//个人任务的查询
						.list();
		if(list!=null && list.size()>0){
			for(Task task:list){
				System.out.println("任务ID:"+task.getId());
				System.out.println("任务的办理人:"+task.getAssignee());
				System.out.println("任务名称:"+task.getName());
				System.out.println("任务的创建时间:"+task.getCreateTime());
				System.out.println("流程实例ID:"+task.getProcessInstanceId());
				System.out.println("#######################################");
			}
		}
	}
	
	/**查询组任务*/
	@Test
	public void findGroupTaskList(){
		//任务办理人
		String candidateUser = "猪八戒";
		List list = processEngine.getTaskService()//
						.createTaskQuery()//
						.taskCandidateUser(candidateUser)//参与者,组任务查询
						.list();
		if(list!=null && list.size()>0){
			for(Task task:list){
				System.out.println("任务ID:"+task.getId());
				System.out.println("任务的办理人:"+task.getAssignee());
				System.out.println("任务名称:"+task.getName());
				System.out.println("任务的创建时间:"+task.getCreateTime());
				System.out.println("流程实例ID:"+task.getProcessInstanceId());
				System.out.println("#######################################");
			}
		}
	}
	
	/**完成任务*/
	@Test
	public void completeTask(){
		//任务ID
		String taskId = "6308";
		processEngine.getTaskService()//
						.complete(taskId);
		System.out.println("完成任务:"+taskId);
	}
	
	/**查询正在执行的组任务列表*/
	@Test
	public void findGroupCandidate(){
		//任务ID
		String taskId = "5909";
		List list = processEngine.getTaskService()//
						.getIdentityLinksForTask(taskId);
		if(list!=null && list.size()>0){
			for(IdentityLink identityLink:list){
				System.out.println("任务ID:"+identityLink.getTaskId());
				System.out.println("流程实例ID:"+identityLink.getProcessInstanceId());
				System.out.println("用户ID:"+identityLink.getUserId());
				System.out.println("工作流角色ID:"+identityLink.getGroupId());
				System.out.println("#########################################");
			}
		}
	}
	
	/**查询历史的组任务列表*/
	@Test
	public void findHistoryGroupCandidate(){
		//流程实例ID
		String processInstanceId = "5905";
		List list = processEngine.getHistoryService()
						.getHistoricIdentityLinksForProcessInstance(processInstanceId);
		if(list!=null && list.size()>0){
			for(HistoricIdentityLink identityLink:list){
				System.out.println("任务ID:"+identityLink.getTaskId());
				System.out.println("流程实例ID:"+identityLink.getProcessInstanceId());
				System.out.println("用户ID:"+identityLink.getUserId());
				System.out.println("工作流角色ID:"+identityLink.getGroupId());
				System.out.println("#########################################");
			}
		}
	}
	
	/**将组任务指定个人任务(拾取任务)*/
	@Test
	public void claim(){
		//任务ID
		String taskId = "6308";
		//个人任务的办理人
		String userId = "唐僧";
		processEngine.getTaskService()//
					.claim(taskId, userId);
	}
	
	/**将个人任务再回退到组任务(前提:之前这个任务是组任务)*/
	@Test
	public void setAssignee(){
		//任务ID
		String taskId = "6308";
		processEngine.getTaskService()//
						.setAssignee(taskId, null);
	}
	
	/**向组任务中添加成员*/
	@Test
	public void addGroupUser(){
		//任务ID
		String taskId = "6308";
		//新增组任务的成员
		String userId = "如来";
		processEngine.getTaskService()//
					.addCandidateUser(taskId, userId);
	}
	
	/**向组任务中删除成员*/
	@Test
	public void deleteGroupUser(){
		//任务ID
		String taskId = "6308";
		//新增组任务的成员
		String userId = "猪八戒";
		processEngine.getTaskService()//
					.deleteCandidateUser(taskId, userId);
	}
}

            总结:

     以上就是分配组任务的三种方式,和分配个人任务相对应,同样有三种方式,与个人任务的操作相比,组任务操

作增加了组任务分配个人任务(认领任务),个人任务分配给组任务,以及向组任务添加人员和向组任务删除人员的

操作。




你可能感兴趣的:(Activiti)