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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjx86320/article/details/50388157

     用户任务(UserTask)即用户操作的任务, 个人任务是用户任务的一种,这篇博文将简单地介绍下分配个人任务的三种方式。


     一、流程图


                                            

                                               图一   分配用户任务流程图


     二、方式一:直接指定办理人

     1.流程图中配置任务节点


                                 

                                                图二   配置任务节点办理人


     2.测试代码

        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //部署流程定义,启动流程实例
	@Test
	public void testTask() throws Exception {
		
		// 1 发布流程
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("taskProcess.bpmn");
		InputStream inputStreamPng = this.getClass().getResourceAsStream("taskProcess.png");
		processEngine.getRepositoryService()//
						.createDeployment()//
						.addInputStream("userTask.bpmn", inputStreamBpmn)//
						.addInputStream("userTask.png", inputStreamPng)//
						.deploy();
		
		// 2 启动流程
		//启动流程实例的同时,设置流程变量
		ProcessInstance pi = processEngine.getRuntimeService()//
						.startProcessInstanceByKey("taskProcess");
		System.out.println("pid:" + pi.getId());
	}
	
        //查询我的个人任务列表
	@Test
	public void findMyTaskList(){
		String userId = "周江霄";
		List<Task> list = processEngine.getTaskService()//
		                .createTaskQuery()//
		                .taskAssignee(userId)//指定个人任务查询
		                .list();
		for(Task task:list ){
			System.out.println("id="+task.getId());
			System.out.println("name="+task.getName());
			System.out.println("assinee="+task.getAssignee());
			System.out.println("createTime="+task.getCreateTime());
			System.out.println("executionId="+task.getExecutionId());
			
		}
	}
	
        //完成任务
	@Test
	public void completeTask(){
		String taskId = "3209";
		processEngine.getTaskService()//
					.complete(taskId);//
		System.out.println("完成任务");
	}


     说明:在上面的例子中,周江霄是个人任务的办理人;但是这样分配任务的办理人不够灵活,因为项目开发中任

务的办理人不要放置XML文件中。
    


     方式二:直接指定办理人


     1.流程图中配置任务节点变量


                              

                                           图三   配置任务节点变量


     2.测试代码

package cn.gome.k_personTask;

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.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

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)
						.name("个人任务演示")
						.deploy();
		System.out.println("部署ID:"+deployment.getId());
		
		//启动流程实例
		/**
		 * 启动流程实例的同时,设置流程变量,使用流程变量的方式设置下一个任务的办理人
		 *     流程变量的名称,就是在task.bpmn中定义#{userID}的userID
		 *     流程变量的值,就是任务的办理人
		 */
		Map<String, Object> variables = new HashMap<String, Object>();
		variables.put("userID", "周江霄");
		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 = "周江霄";
		List<Task> 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 completeTask(){
		//任务ID
		String taskId = "5209";
		processEngine.getTaskService()
						.complete(taskId);
		System.out.println("完成任务:"+taskId);
	}
}

     方式三:使用类


     1.TaskListenerImpl类,用来设置任务的办理人

package cn.gome.l_personTask;

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

public class TaskListenerImpl implements TaskListener{

	/**设置任务的办理人(个人任务和组任务)*/
	@Override
	public void notify(DelegateTask delegateTask) {
		//指定个人任务
		delegateTask.setAssignee("郭靖");
	}
	
}

     2.流程图中配置任务节点监听


        

                                           图四  流程图中配置任务节点监听


     3.测试代码

package cn.gome.l_personTask;

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

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

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<Task> 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 completeTask(){
		//任务ID
		String taskId = "5408";
		processEngine.getTaskService().complete(taskId);
		System.out.println("完成任务:"+taskId);
	}
	
	/**将个人任务从一个人分配给另一个人*/
	@Test
	public void setAssignee(){
		//指定任务的办理人
		String userId = "黄蓉";
		//任务ID
		String taskId = "5408";
		processEngine.getTaskService()//
				.setAssignee(taskId, userId);
	}
	
}

           总结:

     通过对比,我们发现,分配个人任务的三种方式中,第一种欠灵活,后面两种都还是不错的,可以在项目中灵活的分配个人任务。





     

阅读更多
想对作者说点什么?
相关热词

博主推荐

换一批

没有更多推荐了,返回首页