Activiti進階之組任務(wù)實現(xiàn)示例詳解
1.組任務(wù)
1.1、需求
在流程定義中在任務(wù)結(jié)點的 assignee 固定設(shè)置任務(wù)負責人,在流程定義時將參與者固定設(shè)置在.bpmn 文件中,如果臨時任務(wù)負責人變更則需要修改流程定義,系統(tǒng)可擴展性差。
針對這種情況可以給任務(wù)設(shè)置多個候選人,可以從候選人中選擇參與者來完成任務(wù)。
1.2、設(shè)置任務(wù)候選人
在流程圖中任務(wù)節(jié)點的配置中設(shè)置 candidate-users(候選人),多個候選人之間用逗號分開。
查看bpmn文件
<userTask activiti:candidateUsers="lisi,wangwu" activiti:exclusive="true" id="_3" name="經(jīng)理審批"/>
我們可以看到部門經(jīng)理的審核人已經(jīng)設(shè)置為 lisi,wangwu 這樣的一組候選人,可以使用
activiti:candiateUsers=”用戶 1,用戶 2,用戶 3”的這種方式來實現(xiàn)設(shè)置一組候選人
1.3、組任務(wù)
1.3.1、組任務(wù)辦理流程
- a、查詢組任務(wù)
指定候選人,查詢該候選人當前的待辦任務(wù)。
候選人不能立即辦理任務(wù)。
- b、拾取(claim)任務(wù)
該組任務(wù)的所有候選人都能拾取。
將候選人的組任務(wù),變成個人任務(wù)。原來候選人就變成了該任務(wù)的負責人。
如果拾取后不想辦理該任務(wù)?
需要將已經(jīng)拾取的個人任務(wù)歸還到組里邊,將個人任務(wù)變成了組任務(wù)。
- c、查詢個人任務(wù)
查詢方式同個人任務(wù)部分,根據(jù)assignee查詢用戶負責的個人任務(wù)。
- d、辦理個人任務(wù)
1.3.2、 查詢組任務(wù)
根據(jù)候選人查詢組任務(wù)
/** * 查詢組任務(wù) */ @Test public void test03(){ String key = "evection1"; String candidateUser = "lisi"; ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = engine.getTaskService(); List<Task> list = taskService.createTaskQuery() .processDefinitionKey(key) .taskCandidateUser(candidateUser) .list(); for (Task task : list) { System.out.println("流程實例Id:" + task.getProcessInstanceId()); System.out.println("任務(wù)ID:" + task.getId()); System.out.println("負責人:" + task.getAssignee()); System.out.println("任務(wù)名稱:" + task.getName()); } }
1.3.3 、 拾取組任務(wù)
候選人員拾取組任務(wù)后該任務(wù)變?yōu)樽约旱膫€人任務(wù)。
/** * 候選人 拾取任務(wù) */ @Test public void test04(){ ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = engine.getTaskService(); String taskId = "72505"; // 候選人 String userId = "lisi"; // 拾取任務(wù) Task task = taskService.createTaskQuery() .taskId(taskId) .taskCandidateUser(userId) // 根據(jù)候選人查詢 .singleResult(); if(task != null){ // 可以拾取任務(wù) taskService.claim(taskId,userId); System.out.println("拾取成功"); } }
1.3.4、 查詢個人待辦任務(wù)
查詢方式同個人任務(wù)查詢
@Test public void test03(){ String key = "evection1"; String candidateUser = "lisi"; ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = engine.getTaskService(); List<Task> list = taskService.createTaskQuery() .processDefinitionKey(key) //.taskCandidateUser(candidateUser) //.taskCandidateOrAssigned(candidateUser) .taskAssignee(candidateUser) .list(); for (Task task : list) { System.out.println("流程實例Id:" + task.getProcessInstanceId()); System.out.println("任務(wù)ID:" + task.getId()); System.out.println("負責人:" + task.getAssignee()); System.out.println("任務(wù)名稱:" + task.getName()); } }
1.3.5、 辦理個人任務(wù)
同個人任務(wù)辦理
/** * 完成個人任務(wù) */ @Test public void test05(){ String taskId = "72505"; ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = engine.getTaskService(); taskService.complete(taskId); System.out.println("完成任務(wù):" + taskId); }
1.3.6、 歸還組任務(wù)
如果個人不想辦理該組任務(wù),可以歸還組任務(wù),歸還后該用戶不再是該任務(wù)的負責人
/** * 歸還任務(wù) */ @Test public void test06(){ ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = engine.getTaskService(); String taskId = "75002"; String userId= "zhangsan"; Task task = taskService.createTaskQuery() .taskId(taskId) .taskAssignee(userId) .singleResult(); if(task != null){ // 如果設(shè)置為null,歸還組任務(wù),任務(wù)沒有負責人 taskService.setAssignee(taskId,null); } }
1.3.7、 任務(wù)交接
任務(wù)負責人將任務(wù)交給其他負責人來處理
/** * 任務(wù)交接 */ @Test public void test07(){ ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = engine.getTaskService(); String taskId = "75002"; String userId= "zhangsan"; Task task = taskService.createTaskQuery() .taskId(taskId) .taskAssignee(userId) .singleResult(); if(task != null){ // 設(shè)置該任務(wù)的新的負責人 taskService.setAssignee(taskId,"趙六"); } }
1.3.8、 數(shù)據(jù)庫表操作
查詢當前任務(wù)執(zhí)行表
SELECT * FROM act_ru_task
任務(wù)執(zhí)行表,記錄當前執(zhí)行的任務(wù),由于該任務(wù)當前是組任務(wù),所有assignee為空,當拾取任務(wù)后該字段就是拾取用戶的id
查詢?nèi)蝿?wù)參與者
SELECT * FROM act_ru_identitylink
任務(wù)參與者,記錄當前參考任務(wù)用戶或組,當前任務(wù)如果設(shè)置了候選人,會向該表插入候選人記錄,有幾個候選就插入幾個
與act_ru_identitylink對應的還有一張歷史表act_hi_identitylink,向act_ru_identitylink插入記錄的同時也會向歷史表插入記錄。任務(wù)完成
以上就是Activiti進階之組任務(wù)實現(xiàn)示例詳解的詳細內(nèi)容,更多關(guān)于Activiti進階組任務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java使用BeanUtils.copyProperties踩坑經(jīng)歷
最近在做個項目,踩了個坑特此記錄一下,本文主要介紹了使用BeanUtils.copyProperties踩坑經(jīng)歷,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05Java8新特性之空指針異常的克星Optional類的實現(xiàn)
這篇文章主要介紹了Java8新特性之空指針異常的克星Optional類的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10