Activiti7之組任務


Candidate-users 候選人

 

在流程定義中在任務結點的  assignee  固定設置任務負責人,在流程定義時將參與者固定設置在.bpmn 文件中,如果臨時任務負責人變更則需要修改流程定義,系統可擴展性差。

 

針對這種情況可以給任務設置多個候選人,可以從候選人中選擇參與者來完成任務

設置任務候選人

 

在流程圖中任務節點的配置中設置candidate-users(候選人),多個候選人之間用逗號分開。

 

 

 

改成xml形式查看

 

 

 

 

可以看到總經理的審核人已經設置為 wangwu,qingqi這樣的一組候選人,可以使用

activiti:candiateUsers=”用戶1,用戶 2,用戶 3”的這種方式來實現設置一組候選人。

 

組任務辦理流程

 

  • 第一步:查詢組任務
    • 指定候選人,查詢該候選人當前的待辦任務。候選人不能辦理任務。
  • 第二步:拾取(claim)任務
    • 該組任務的所有候選人都能拾取。
    • 將候選人的組任務,變成個人任務。原來候選人就變成了該任務的負責人。
    • 如果拾取后不想辦理該任務?
      • 需要將已經拾取的個人任務歸還到組里邊,將個人任務變成了組任務。
  • 第三步:查詢個人任務第四步:辦理個人任務
    • 查詢方式同個人任務部分,根據assignee 查詢用戶負責的個人任務。

用戶查詢組任務

 

根據候選人查詢組任務,前提是你到這一步了,如我的到‘總經理審批’這一步才能查到

 

 

 1  @Test  2     public void findGroupTaskList() {  3 
 4         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  5         // 流程定義key
 6         String processDefinitionKey = "groupTask";  7         // 任務候選人
 8         String candidateUser = "wangwu";  9         // 創建TaskService
10         TaskService taskService = processEngine.getTaskService(); 11         //查詢組任務
12         List<Task> list = taskService.createTaskQuery()// 13                 .processDefinitionKey(processDefinitionKey)// 14                 .taskCandidateUser(candidateUser)//根據候選人查詢
15  .list(); 16         for (Task task : list) { 17             System.out.println("    "); 18             System.out.println("流程實例id:" + task.getProcessInstanceId()); System.out.println(" 任 務 id:" + task.getId()); System.out.println(" 任 務 負 責 人 :" + task.getAssignee()); System.out.println("任務名稱:" + task.getName()); 19 
20  } 21     }
用戶查詢組任務

 

 

 

 

 

 

用戶拾取組任務

候選人員拾取組任務后該任務變為自己的個人任務。

 1  @Test  2     public void claimTask(){  3         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  4         TaskService taskService = processEngine.getTaskService();  5         //要拾取的任務id
 6         String taskId = "5002";  7         //任務候選人id
 8         String userId = "qingqi";  9         //拾取任務 10         //即使該用戶不是候選人也能拾取(建議拾取時校驗是否有資格) 11 
12         //校驗該用戶有沒有拾取任務的資格
13         Task task = taskService.createTaskQuery()// 14  .taskId(taskId) 15                 .taskCandidateUser(userId)//根據候選人查詢
16  .singleResult(); 17         if(task!=null){ taskService.claim(taskId, userId); System.out.println("任務拾取成功"); 18  } 19     }
用戶拾取組任務

 

 

 

查看數據庫的任務,可以看到總經理審批這個任務的負責人就是qingqi了

 

 

說明:即使該用戶不是候選人也能拾取,建議拾取時校驗是否有資格組任務拾取后,該任務已有負責人,通過候選人將查詢不到該任務

 

 

用戶查詢個人待辦任務

查詢方式同個人任務查詢

 

 1 @Test  2     public void findPersonalTaskList() {  3         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  4         // 流程定義key
 5         String processDefinitionKey = "groupTask";  6         // 任務負責人
 7         String assignee = "qingqi";  8         // 創建TaskService
 9         TaskService taskService = processEngine.getTaskService(); 10         List<Task> list = taskService.createTaskQuery()// 11                 .processDefinitionKey(processDefinitionKey)// 12  .taskAssignee(assignee).list(); 13 
14         for (Task task : list) { 15             System.out.println("--------------"); 16             System.out.println("流程實例ID:"+task.getProcessInstanceId()); 17             System.out.println("任務id:" + task.getId()); 18             System.out.println("任務負責人:" + task.getAssignee()); System.out.println("任務名稱:" + task.getName()); 19  } 20     }
用戶查詢個人任務

 

 

查詢可以看到總經理審批這個任務的負責人是qingqi

 

 

用戶辦理個人任務

1    /**完成任務*/ 
2  @Test 3     public void completeTask(){ 4         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();; 5         //任務ID
6         String taskId = "5002"; 7         processEngine.getTaskService().complete(taskId); System.out.println("完成任務:"+taskId); 8     }
用戶辦理個人任務

說明:建議完成任務前校驗該用戶是否是該任務的負責人。

 

歸還組任務

如果個人不想辦理該組任務,可以歸還組任務,歸還后該用戶不再是該任務的負責人

 

 1     // 歸還組任務,由個人任務變為組任務,還可以進行任務交接
 2  @Test  3     public void setAssigneeToGroupTask() {  4         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  5         // 查詢任務使用TaskService
 6         TaskService taskService = processEngine.getTaskService();  7         // 當前待辦任務
 8         String taskId = "5002";  9         // 任務負責人
10         String userId = "qingqi"; 11 
12         // 校驗userId是否是taskId的負責人,如果是負責人才可以歸還組任務
13         Task task = taskService.createTaskQuery().taskId(taskId) 14  .taskAssignee(userId).singleResult(); 15 
16         if (task != null) { 17             // 如果設置為null,歸還組任務,該 任務沒有負責人
18             taskService.setAssignee(taskId, null); 19 
20  } 21 
22     }
歸還組任務

 

 

程序沒有報錯

 

 

查看數據庫的總經理審批的負責人還是不是qingqi

 

可以看到總經理審批的負責人已經變為空了,說明歸還任務成功,這個時候就可以從新選擇負責人

 

任務交接

任務交接,任務負責人將任務交給其它候選人辦理該任務

可以看到現在是qingqi,我現在想把這個任務交接個wangwu

 

 

 

 1     /**
 2      * 任務交接
 3      */
 4     @Test
 5     public void taskReturn(){
 6         //獲取ProcessEngine對象
 7         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
 8         //獲取TaskService對象
 9         TaskService taskService = processEngine.getTaskService();
10         //查詢到自己的任務,然后通過任務ID進行提交
11         Task task = taskService.createTaskQuery().processDefinitionKey("groupTask").taskAssignee("qingqi").singleResult();
12 
13         if(task!=null){
14             //任務退回  任務ID    null代表沒有處理人執行,需要后續再次拾取任務
15             //任務交接 任務ID     如果第二個參數,處理人不為空代表將該任務交給次處理人
16             taskService.setAssignee(task.getId(),"wangnan");
17             System.out.println("任務退回");
18         }
19     }
任務交接

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM