在介紹activiti的基礎的時候說到了工作流的使用場景之請假,請假的天數不同,可能需要不同的領導簽字,本篇文章講介紹工作流的網關實現這類場景。
activiti中的網關包含以下幾種,這里只做下簡單的介紹,具體的細節信息可以參考網上資料。
(1)ParallelGeteway:並行網關/異或網關 (多人會簽完成,才能啟動下一流程)
(2)ExclusiveGateway排他網關(多人之中只能有一個人進行審批,哪個條件為true,則走對應的邏輯)
(3)InclusiveGateway包含網關(集成了並行與排他網關)
(4)EventGateway事件網關(只能連接中間捕獲事件)
話不多說,開始案例。步驟還是和我上一篇的文章一樣,繪畫流程圖、配置屬性--->部署流程--->啟動流程--->執行任務
繪畫流程圖:相信只要你有點流程圖的基礎,都能看懂流程走向
配置(重要)
(1)每個節點配置辦理人,我這邊從上到下,從左到右,分別配置的張三、李四、王二、麻子四個人。
(2)事件到底走哪個分支,這個是需要我們配置的,點擊連線,properties下面的main config,找到condition,如圖所示,在里面配置條件。注意:這里面是個條件表達式,這個day是可以自行定義的,你也可以取別的參數,在你完成請假申請的時候,傳這個參數值就可以了。用專業術語來說,就是配置參數變量的值。
同樣的,另外兩條線,也需要配置下Condition的值,最后點擊空白處,給該流程起個key和name。我這里起的key是applyLeave,就不做截圖展示了。
接下來部署流程和啟動流程我就一起上代碼了。
@Test public void ExclusiveGateWay(){ //發布流程 Deployment deployment = processEngine.getRepositoryService() .createDeployment() .name("排他網關") .addClasspathResource("diagrams/exclusiveWay.bpmn") .addClasspathResource("diagrams/exclusiveWay.png") .deploy(); System.out.println("部署ID:"+deployment.getId()); System.out.println("部署名稱:"+deployment.getName()); //啟動流程 ProcessInstance pi = processEngine.getRuntimeService() .startProcessInstanceByKey("applyLeave"); }
查詢任務
public void MyPersonalTask(){ String assignee = "張三"; List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service .createTaskQuery()//創建任務查詢對象 /**排序*/ .orderByTaskCreateTime().asc()//使用創建時間的升序排列 /**返回結果集*/ .list();//返回列表 for(Task task:list){ System.out.println("任務ID:"+task.getId()); System.out.println("任務名稱:"+task.getName()); System.out.println("任務的辦理人:"+task.getAssignee()); System.out.println("流程實例ID:"+task.getProcessInstanceId()); System.out.println("執行對象ID:"+task.getExecutionId()); System.out.println("流程定義ID:"+task.getProcessDefinitionId()); } }
完成任務
@Test public void completeeTask() { TaskService taskService = processEngine.getTaskService(); String taskId = "2408"; //這里的id就是我們上一步通過查看任務,獲取的任務id Map<String, Object> variables = new HashMap<String, Object>(); variables.put("day", 7); //這里設置我們剛才配置參數對應的值,這里設置的7,那么應該到總經理審批 Task task = taskService.createTaskQuery() .taskId(taskId) .singleResult(); taskService.addComment(taskId, task.getProcessInstanceId(), "7天假期審核通過"); //在這里我們可以對任務添加評論 taskService.complete(taskId, variables); }
測試:先是張三提交了7天的申請,現在我們來驗證接下來是否到總經理審批,通過截圖,證明了我們流程中的排他網關是成功的。
並行網關我就不做測試了,感興趣的朋友可以自己畫圖配置測試看看,其實通過這篇和上一篇的案例我們可以發現到,工作流只要你流程畫好了,配置好了,剩下的都是一樣的操作了,部署啟動流程,查看任務,完成流程等。
最后做下補充:關於上面提到的變量
在實際過程中,我們常常會運用到變量的配置以及值獲取等問題。可以通過runtimeService或者taskService來設置變量和獲取變量,變量可以設置一個或者多個。對應的表act_ru_variable:正在執行的流程變量表 ; act_hi_varinst:流程變量歷史表
runtimeService.setVariable(executionId, variableName, value)//表示使用執行對象ID,和流程變量的名稱,設置流程變量的值(一次只能設置一個值) // runtimeService.setVariables(executionId, variables)//表示使用執行對象ID,和Map集合設置流程變量,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值(一次設置多個值) // taskService.setVariable(taskId, variableName, value)//表示使用任務ID,和流程變量的名稱,設置流程變量的值(一次只能設置一個值) // taskService.setVariables(taskId, variables)//表示使用任務ID,和Map集合設置流程變量,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值(一次設置多個值) runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);//啟動流程實例的同時,可以設置流程變量,用Map集合
流程變量的賦值:可以在啟動流程的時候賦值,也可以在某個節點完成任務的時候賦值,這個都是可以的,具體情況看你的業務需求。
下一篇我們會講到另一個常用的點-->監聽器。