(一)Candidate-users候選人
在流程定義中在任務結點的assignee固定設置任務負責人,在流程定義時將參與者固定設置在.bpmn文件中,如果臨時任務負責人變更則需要修改流程定義,系統可擴展性差。針對這種情況可以給任務設置多個候選人,可以從候選人中選擇參與者來完成任務。
在流程圖中任務節點的配置中設置candidate-users(候選人),多個候選人之間用逗號分開。
(二)辦理組任務
1)啟動任務
/** * 啟動一個實例 */ @Test public void startProcessInstance() { //啟動流程實例,同時還要設置流程定義的變量值 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1"); System.out.println("流程實例id:" + processInstance.getProcessInstanceId()); }
數據庫里生成下一個執行任務
2)執行填寫請假單任務
/** * 填請假單任務執行 */ @Test public void step1(){ Task task = taskService.createTaskQuery() .processDefinitionKey("myProcess_1") .taskAssignee("張三") .singleResult(); if(task!=null){ taskService.complete(task.getId()); System.out.println("用戶任務執行完畢..."); } }
查看下一步任務, 可以看出都還未指定執行人。
3)用戶查詢組任務
/** * 用戶查詢組任務 */ @Test public void findGroupTaskList() { String processDefinitionKey = "myProcess_1"; String candidateUser = "李四"; List<Task> list = taskService.createTaskQuery() .processDefinitionKey(processDefinitionKey) .taskCandidateUser(candidateUser)//設置候選用戶 .list(); for (Task task : list) { System.out.println("---------------------"); System.out.println("流程實例id:" + task.getProcessInstanceId()); System.out.println("任務id:" + task.getId()); System.out.println("任務負責人:" + task.getAssignee()); System.out.println("任務名稱:" + task.getName()); } }
4)用戶拾取組任務
/** * 用戶拾取組任務,該任務變為自己的個人任務 */ @Test public void claimTask() { String taskId = "61184f94-390e-11ea-af99-30b49ec7161f"; String userId = "李四"; //校驗該用戶有沒有拾取任務的資格 Task task = taskService.createTaskQuery().taskId(taskId) .taskCandidateUser(userId).singleResult();//根據候選人查詢 if (task != null) { taskService.claim(taskId, userId); System.out.println("任務拾取成功"); } }
查看數據庫,該任務的執行人已經變更為李四
5)處理個人任務
/** * 部門經理完成審批 */ @Test public void step2() { Task task = taskService.createTaskQuery().processDefinitionKey("myProcess_1") .taskAssignee("李四").singleResult(); if (task != null) { Holiday holiday = new Holiday(); holiday.setDays(4F); //初始化一些參數 Map<String, Object> map = new HashMap<>(); map.put("holiday", holiday); taskService.complete(task.getId(), map);//完成任務時,設置流程變量的值 System.out.println("用戶任務執行完畢..."); } }
請假天數大於3天,所以任務流轉到總經理審批
6)歸還組任務
/** * 歸還組任務,由個人任務變為組任務,還可以進行任務交接 */ @Test public void setAssigneeToGroupTask() { String taskId = "61184f94-390e-11ea-af99-30b49ec7161f"; String userId = "李四"; //校驗userId是否是taskId的負責人,如果是負責人才可以歸還組任務 Task task = taskService.createTaskQuery().taskId(taskId) .taskAssignee(userId).singleResult(); if (task != null) { //如果設置為null,歸還組任務,該任務沒有負責人 taskService.setAssignee(taskId, null); } }
也可以通過 setAssignee 方法將任務委托給其它用戶負責,注意被委托的用戶可以不是候選人(不建議這樣使用)
7)任務交接
/** * 任務交接,前提要保證當前用戶是這個任務的負責人,這時候他才可以有權限去將任務交接給其他候選人 */ @Test public void setAssigneeToCandidateUser() { String taskId = "61184f94-390e-11ea-af99-30b49ec7161f"; String userId = "李四"; //校驗userId是否是taskId的負責人,如果是負責人才可以歸還組任務 Task task = taskService.createTaskQuery().taskId(taskId) .taskAssignee(userId).singleResult(); if (task != null) { //將此任務交給其它候選人辦理該任務 String candidateUser = "王五"; //根據候選人和組任務id查詢,如果有記錄說明該候選人有資格拾取該任務 Task task1 = taskService.createTaskQuery().taskCandidateUser(candidateUser).singleResult(); if (task1 != null) { taskService.setAssignee(taskId, candidateUser); } } }
源碼 https://download.csdn.net/download/zsg88/12109868