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)

的方式,由某個人去完成這次任務。
四、總結

                                  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章