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 }