在一個審批流程中,一次審批對應一個UserTask。正常情況下,一個UserTask只要有一個用戶去complete一下,即一個用戶審批通過就算通過。但是在會簽審批中,需要多方審批,例如需要所有的常務委員都審批通過以后,這個審批節點才算通過。
這個功能需要由Activiti的多實例功能來實現。我們先畫一個正常的審批流程,效果如下圖。
然后需要將這個UserTask轉換為多實例任務,方法是設置“Multi instance”選項中的Collection和Element variable。在這個例子中,Collection設置為assigneeList,而assigneeList表示一個集合,Activiti將為這個集合中的每個元素都創建一個UserTask實例。Element variable設置為assignee,這樣assigneeList集合中的每個元素在UserTask實例中將分別被賦值給assignee變量。
最后將Assignee設置為assignee變量的值,以便於查詢該任務。
流程設計完畢,我們就可以使用了。在進入會簽任務之前,需要設置assigneeList。
ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration() .setJdbcUrl("jdbc:mysql://localhost:3306/activiti") .setJdbcUsername("activiti") .setJdbcPassword("activiti") .setJdbcDriver("com.mysql.jdbc.Driver") .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); ProcessEngine processEngine = cfg.buildProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); Map<String, Object> variables = new HashMap<>(); variables.put("assigneeList", Arrays.asList("Jack", "Ross", "Tom")); runtimeService.startProcessInstanceByKey("multiple", variables);
此時Activiti分別為Jack,Ross和Tom分別創建一個任務。他們各自查詢並完成自己的任務,就完成了會簽。
TaskService taskService = processEngine.getTaskService(); List<Task> taskList = taskService.createTaskQuery().taskAssignee("Jack").list(); taskList.forEach(task -> { taskService.complete(task.getId()); });
默認情況下,所有實例都complete之后,UserTask才算結束,但是用戶可以通過設置Completion condition,來自定義UserTask的完成條件。
點擊查看更多內容
轉自:https://www.imooc.com/article/290052