www.icesr.com
IT运维工程师的摇篮

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

这篇博客要给大家介绍一下分配组任务的三种方式:

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

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

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

下面呢将具体介绍这三种不同的方法:

一、流程图:

                  

                   图: 配组任务的三种方式

               

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


     

    

 2.测试代码

public class group {
	
	ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
	
	/**部署流程定义*/  
	@Test
	public void deployementProcessDefinition(){
		
		String resourceNamebpmn = "group.bpmn";
		String resourceNamepng  = "group.png";
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("group.bpmn");
		InputStream inputStreamPng  = this.getClass().getResourceAsStream("group.png");
		/**部署流程定义*/
	    Deployment deployment = processEngine.getRepositoryService()
		                  .createDeployment()//创建部署对象  
		                  .name("组任务")
		                  .addInputStream(resourceNamebpmn, inputStreamBpmn)//部署加载资源文件 
		                  .addInputStream(resourceNamepng, inputStreamPng)
		                  .deploy();
		  System.out.println("部署ID:"+deployment.getId());  
	}
		
	@Test
	public void startProcessInstance() {
		//启动流程实例  
		  String processDefinitionKey ="group";
		 
		  ProcessInstance pi = processEngine.getRuntimeService()
		                                    .startProcessInstanceByKey(processDefinitionKey);
		  System.out.println("流程实例ID:"+pi.getId());  
		  System.out.println("流程定义的ID:"+pi.getProcessDefinitionId()); 
		
	}
	/**查看小A当前的个人任务,未查询出结果*/
	@Test
	public void findPersonTask(){
		String assignee = "小A";
		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("#######################################");  
	        }  
	     }
     }
	
	/**查看小A当前的组任务*/
	@Test
	public void findGroupTask(){
		String candidateUser = "小A";
		List<Task> 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("#######################################");  
	        }  
	     }
		
	/*	
	 * 查询结果:
		任务ID:132504
		任务的办理人:null
		任务名称:审核
		任务的创建时间:Mon Jul 04 14:14:38 GMT+08:00 2016
		流程实例ID:132501
		#######################################
		注意:任务办理人为null的话有两种可能1是没有办理人,2是组任务
	*/
		
     }
	
	/**查询正在执行的任务的办理人*/
	@Test
	public void findRunPersonTask(){
	String taskId ="132504";
	List<IdentityLink>	list = processEngine.getTaskService()
		                                    .getIdentityLinksForTask(taskId);
	if(list!=null && list.size()>0){  
         for(IdentityLink idLink:list){  
            System.out.println("UserID:"+idLink.getUserId());  
            System.out.println("类型(参与者或者候选者):"+idLink.getType());  
            System.out.println("任务ID:"+idLink.getTaskId());  
            System.out.println("流程实例ID:"+idLink.getProcessInstanceId());  
            System.out.println("#######################################");  
         }  
      }
	
	/*
	 *查询结果:
	UserID:小C
	类型(参与者或者候选者):candidate
	任务ID:132504
	流程实例ID:null
	#######################################
	UserID:小B
	类型(参与者或者候选者):candidate
	任务ID:132504
	流程实例ID:null
	#######################################
	UserID:小D
	类型(参与者或者候选者):candidate
	任务ID:132504
	流程实例ID:null
	#######################################
	UserID:小A
	类型(参与者或者候选者):candidate
	任务ID:132504
	流程实例ID:null
	#######################################
*/	
	//注意:由查询结果,我们可以看出组任务的办理人都有两种类型,一种是参与者类型(participant),一种是候选者类型
	//候选者类型(candidate)的记录会指定任务ID,但是不会指定流程实例ID ,参与者类型不会指定任务ID,但是会指定流程实例ID
	//候选者不一定参与了任务
	}
	
	
	/**查询历史任务的办理人表*/
	@Test
	public void findHistoryPersonTask(){
	String processInstanceId ="132501";
	List<HistoricIdentityLink> list= processEngine.getHistoryService()
		                                 .getHistoricIdentityLinksForProcessInstance(processInstanceId);//使用流程实例查(查询的参与者)
			                       //.getHistoricIdentityLinksForTask(taskId);//使用任务ID查询(查询的候选者)
	if(list!=null && list.size()>0){  
        for(HistoricIdentityLink hil:list){  
           System.out.println("UserID:"+hil.getUserId());  
           System.out.println("类型(参与者或者候选者):"+hil.getType());  
           System.out.println("任务ID:"+hil.getTaskId());  
           System.out.println("流程实例ID:"+hil.getProcessInstanceId());  
           System.out.println("#######################################");  
        }  
     }	
	
	/*
	 * 查询结果:
	UserID:小C
	类型(参与者或者候选者):participant
	任务ID:null
	流程实例ID:132501
	#######################################
	UserID:小B
	类型(参与者或者候选者):participant
	任务ID:null
	流程实例ID:132501
	#######################################
	UserID:小D
	类型(参与者或者候选者):participant
	任务ID:null
	流程实例ID:132501
	#######################################
	UserID:小A
	类型(参与者或者候选者):participant
	任务ID:null
	流程实例ID:132501
	#######################################
	*/
	
   // 注意:当使用getHistoricIdentityLinksForProcessInstance()查询的时候查询的是参与者
	}
	
	/**候选者不一定真正的参与任务的办理,所以我们需要拾取任务,将组任务分配给个人任务,即指定任务办理人字段*/
	@Test
	public void cliam(){
		//将组任务分配给个人任务
		//任务ID
		String taskId ="132504";
		//分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员)
		String userId ="大F";
		processEngine.getTaskService()
		             .claim(taskId, userId);
	    //当执行完之后查询正在执行的任务表(act_ru_task)可以发现ASSIGNEE_字段(指定任务办理人字段)值为'大F'
	    //此时任务就指定给了大F,在用小A或者下B等在去查个人组任务的话,就查询不出来任何任务【组任务最终也是需要指定一个人办理的,所以需要拾取任务】
	}
	
	/**将个人任务回退到组任务,前提:之前一定是一个组任务*/
	@Test
	public void setAssigee(){
		//将组任务分配给个人任务
		//任务ID
		String taskId ="132504";
		processEngine.getTaskService()
		             .setAssignee(taskId, null);
		//当执行完之后查询正在执行的任务表(act_ru_task)可以发现ASSIGNEE_字段(指定任务办理人字段)值由'大F'变为了null,
		//将本来指定给大F的任务又回退成为组任务,这时就可以重新拾取任务将任务分配给组成员小A或者小B等
	}
	
	/**向组任务中添加组成员*/
	@Test
	public void addGroupUser(){
		//任务ID
		String taskId ="132504";
		//成员办理人
		String userId ="大H";
		processEngine.getTaskService()
		             .addCandidateUser(taskId, userId);
		//当执行完之后查询正在执行的任务表(act_ru_identitylink`)可以发现大H添加进去了
	}
	/**删除组任务中的成员*/
	@Test
	public void deleteGroupUser(){
		//任务ID
		String taskId ="132504";
		//成员办理人
		String userId ="小B";
		processEngine.getTaskService()
		             .deleteCandidateUser(taskId, userId);
		//当执行完之后查询正在执行的任务表(act_ru_identitylink`)可以发现小B类型为候选者类型(candidate)的那条记录被删除了
	}
	
	/**拾取任务给小A*/
	@Test
	public void cliamA(){
		//将组任务分配给个人任务
		//任务ID
		String taskId ="132504";
		//分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员)
		String userId ="小A ";
		processEngine.getTaskService()
		             .claim(taskId, userId);
		//当执行完之后查询正在执行的任务表(act_ru_task)可以发现ASSIGNEE_字段(指定任务办理人字段)值为'小A'
	    //此时任务就指定给了小A
	}
	
	/**小A完成任务*/
	@Test
	public void completeTask(){
		String taskId ="132504";
		processEngine.getTaskService()
		             .complete(taskId);
	}
	
}

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


     1.在任务节点设置变量

     

                   2、测试代码

public class group {
	
	ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
	
	/**部署流程定义*/  
	@Test
	public void deployementProcessDefinition(){
		
		String resourceNamebpmn = "group.bpmn";
		String resourceNamepng  = "group.png";
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("group.bpmn");
		InputStream inputStreamPng  = this.getClass().getResourceAsStream("group.png");
		/**部署流程定义*/
	    Deployment deployment = processEngine.getRepositoryService()
		                  .createDeployment()//创建部署对象  
		                  .name("组任务")
		                  .addInputStream(resourceNamebpmn, inputStreamBpmn)//部署加载资源文件 
		                  .addInputStream(resourceNamepng, inputStreamPng)
		                  .deploy();
		System.out.println("部署ID:"+deployment.getId());  
	}
	
	 /** 
         * 启动流程实例的同时,设置流程变量,使用流程变量的方式设置下一个任务的办理人 
         *       流程变量的名称,就是在group.bpmn中定义activiti:candidateUsers="#{userIDs}"的userIDs 
         *       流程变量的值,就是任务的办理人(组任务) 
         */  
	@Test
	public void startProcessInstance() {
		 //启动流程实例  
		 String processDefinitionKey ="group";
		 //设置流程变量
		 Map<String, Object> variables = new HashMap<String, Object>();
		 variables.put("userIDs", "大大,小小,中中");
		 //启动流程实例的时候设置流程变量
		 ProcessInstance pi = processEngine.getRuntimeService()
		                                    .startProcessInstanceByKey(processDefinitionKey, variables);//使用流程定义的key的最新版本启动流程  
		  System.out.println("流程实例ID:"+pi.getId());  
		  System.out.println("流程定义的ID:"+pi.getProcessDefinitionId()); 
		
	}
	
	
	/**查看大大当前的组任务*/
	@Test
	public void findGroupTask(){
		String candidateUser = "大大";
		List<Task> 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("#######################################");  
	        }  
	     }
		
	/*	
	 * 查询结果:
		任务ID:162505
                        任务的办理人:null
                        任务名称:审核
                        任务的创建时间:Mon Jul 04 16:53:15 GMT+08:00 2016
                        流程实例ID:162501
        #######################################
		注意:任务办理人为null的话有两种可能1是没有办理人,2是组任务
	*/
		
     }
	

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

 
1.编写类
   

public class TaskListenerImpl implements TaskListener {  
  
    /** 
     * 可以设置任务的办理人(个人组人和组任务) 
     */  
    @Override  
    public void notify(DelegateTask delegateTask) {  
        //指定组任务  
        delegateTask.addCandidateUser("郭靖");  
        delegateTask.addCandidateUser("huangr");  
    }  
  
}  

2.设置任务监听

     

3.测试代码

public class TaskTest {  
      
    //流程引擎对象  
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
      
    /**部署流程定义+启动流程实例*/  
    @Test  
    public void deployementAndStartProcess(){  
        InputStream inputStreamBpmn = this.getClass().getResourceAsStream("group.bpmn");  
        InputStream inputStreampng = this.getClass().getResourceAsStream(group.png");  
        Deployment deployment = processEngine.getRepositoryService()//  
                            .createDeployment()//创建部署对象  
                            .addInputStream("group.bpmn", inputStreamBpmn)//部署加载资源文件  
                            .addInputStream("group.png", inputStreampng)//  
                            .deploy();  
        System.out.println("部署ID:"+deployment.getId());  
        //启动流程实例  
          
        ProcessInstance pi = processEngine.getRuntimeService()//  
                            .startProcessInstanceByKey("group");//使用流程定义的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 findGroupTaskList(){  
        //任务办理人  
        String candidateUser = "郭靖";  
        List<Task> 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<IdentityLink> 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<HistoricIdentityLink> 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);  
    }  
}  

说明:

1)在类中使用delegateTask.addCandidateUser(userId);的方式分配组任务的办理人,此时郭靖和黄蓉是下一个任务的办理人。

2)通过processEngine.getTaskService().claim(taskId,userId);将组任务分配给个人任务,也叫认领任务,即指定某人去办理这个任务,此时有郭靖去办理任务。

注意:认领任务的时候,可以是组任务成员中的人,也可以不是组成员中的人。此时通过type的类型

为participant来指定任务办理人。

3)addCandidateUser()即向组任务添加成员,deleteCandidateUser()即删除组任务成员。

4)在开发中,可以将每一个任务的办理人规定好,例如张三的领导是李四和王五,这样张三

提交任务,由李四或者王五去查询组任务,可以看到对应张三的申请,李四或者王五在通过任务认领(claim)

的方式,由某个人去完成这次任务。
四、总结

                      
           

未经允许不得转载:冰点网络 » Activiti进阶(十一)——分配组任务的三种方式

分享到:更多 ()

评论 抢沙发

评论前必须登录!