activiti實現(xiàn)員工請假流程解析
源碼下載:
http://xiazai.jb51.net/202007/yuanma/FirstActiviti_jb51.rar
鏈接: https://pan.baidu.com/s/1tCN7SDAdEUerZxcTr_9cqA
提取碼: twmp
在開始之前,先說一下剛開始學習工作流的時候遇到的問題,感覺比較困惑,經(jīng)過這兩天的學習,也算有所收獲
1.部署了多個流程變量,如何準確開啟特定的流程
2. 在一個流程的執(zhí)行過程中,怎么確定執(zhí)行到哪一步,即執(zhí)行到哪個任務了
3. 在有多種情況的條件下,怎么判斷要去的方向
先不急著解決,來看看我的工程
工程模擬情況
員工請假流程
- 員工發(fā)起申請,附帶請假信息(請假幾天)單位領導審批,如果通過,交付經(jīng)理審批,不通過,重新申請經(jīng)理審批,如果請假天數(shù)不超過三天,經(jīng)理1審批
- 如果請假天數(shù)在3-5天,經(jīng)理3審批
- 超過5天,經(jīng)理2審批經(jīng)理審批通過,流程結束,經(jīng)理審批不通過,員工重新申請
流程圖
領導意見和經(jīng)理意見,用0和1表示,0表示未通過,1表示通過
多種執(zhí)行情況
一.不超過3天,經(jīng)理1審批,同意申請
二.3-5天,經(jīng)理3審批,同意申請
三. 5天以上,經(jīng)理2審批,同意申請
四. 任一環(huán)節(jié)設置不同意,陷入死循環(huán)
情況:請假天數(shù)超過5天,領導同意申請,經(jīng)理2審批,且不同意申請
我的流程中,是一次執(zhí)行完所有任務,直到流程結束,剛開始學習的小伙伴肯定很苦惱于這個問題,怎么讓流程自己執(zhí)行下去,我前兩天一直在想這個問題
要解決這個問題,隨之而來的第一個問題是,怎么獲取當前任務,換句話說,就是怎么跟蹤流程
每個流程運行時,都會產(chǎn)生一個進程實例.這是一個ProcessInstance對象,相當于一個實體類,在數(shù)據(jù)庫中有他的信息,而且在這個流程執(zhí)行完之前,這個實例流程會一直存在,并且id值不會變.
那么,我們可不可以在每次啟動流程時都將這個ProcessInstance對象保存記錄下來,然后再通過他的id值來查詢當前任務,也就是來跟蹤流程的執(zhí)行情況
給出獲取代碼
//開啟流程 ProcessInstance processInstance = runtimeService .startProcessInstanceByKey(processKey, variables); processInstanceId = processInstance.getId();
然后,通過id值來獲取當前任務
Task task = taskService.createTaskQuery()//創(chuàng)建查詢對象 .processInstanceId(processInstanceId)//通過流程實例id來查詢當前任務 .singleResult();//獲取單個查詢結果
這樣就可以跟蹤流程啦!!!
這時候,問題又來了,怎么確定流程執(zhí)行完了呢?怎么讓程序自己找下一個任務?
還是用到ProcessInstance對象,前面說過,這個進程實例對象在流程執(zhí)行完之前會一直存在,也就是說,流程執(zhí)行完,這個對象就消失了,數(shù)據(jù)庫自動就給他刪除了.所以可以根據(jù)processInstanceId來查詢ProcessInstance對象,如果為空,說明流程已經(jīng)走完了,否則,沒有走完
獲取ProcessInstance對象的代碼
this.processEngine.getRuntimeService() .createProcessInstanceQuery()//獲取查詢對象 .processInstanceId(processInstanceId)//根據(jù)id查詢流程實例 .singleResult();//獲取查詢結果,如果為空,說明這個流程已經(jīng)執(zhí)行完畢,否則,獲取任務并執(zhí)行
這樣就可以判斷流程是否結束了
那么,接下來,就是如何讓流程自己找下一個任務,這里我用了一個while循環(huán)來解決,直接給出我的代碼
//開始進行流程 while(this.processEngine.getRuntimeService() .createProcessInstanceQuery()//獲取查詢對象 .processInstanceId(processInstanceId)//根據(jù)id查詢流程實例 .singleResult()//獲取查詢結果,如果為空,說明這個流程已經(jīng)執(zhí)行完畢,否則,獲取任務并執(zhí)行 !=null){ Task task = taskService.createTaskQuery()//創(chuàng)建查詢對象 .processInstanceId(processInstanceId)//通過流程實例id來查詢當前任務 .singleResult();//獲取單個查詢結果 String taskName = task.getName(); if(taskName.equals("發(fā)起申請")){//職員節(jié)點 completeEmployeeTask(task); }else if(taskName.equals("領導審批")){//領導節(jié)點 completeLeaderTask(task); }else{//經(jīng)理節(jié)點 completeJingliTask(task); } }
我的處理是把每個任務的完成,都封裝成一個方法,要完成該任務時直接調(diào)用該方法就行,傳入的參數(shù)是當前的任務的Task對象.
任務完成函數(shù)
//職員提交申請 public void completeEmployeeTask(Task task){ //獲取任務id String taskId = task.getId(); //完成任務 this.processEngine.getTaskService().complete(taskId); System.out.println("職員已經(jīng)提交申請......."); } //領導審批 public void completeLeaderTask(Task task){ //獲取任務id String taskId = task.getId(); //領導意見 Map<String, Object> variables = new HashMap<String, Object>(); //variables.put("day",4); variables.put("leaderResult", 1); //完成任務 this.processEngine.getTaskService().complete(taskId, variables); System.out.println("領導審核完畢........"); } //經(jīng)理審批 public void completeJingliTask(Task task){ //獲取任務id String taskId = task.getId(); String name = task.getName(); //經(jīng)理意見 Map<String, Object> variables = new HashMap<String, Object>(); variables.put("result", 0); //完成任務 this.processEngine.getTaskService().complete(taskId, variables); System.out.println("經(jīng)理審核完畢........,審核經(jīng)理:"+name); }
有的小伙伴就要問,明明經(jīng)理審核時有三個經(jīng)理,為什么只寫了一個經(jīng)理審批函數(shù)呢?
在經(jīng)理審核之前,是一個排他網(wǎng)關,網(wǎng)關后面出來的連接線中可以設置篩選條件,滿足誰就去誰那里,設置見圖
這里的變量是在領導審批這個任務完成之后傳過來的,參數(shù)傳遞方法見上篇博文:http://www.dbjr.com.cn/article/182226.htm
這樣,就實現(xiàn)了這個流程的基本運轉啦!!
哦,對,還有一個問題,部署了多個流程變量,如何準確開啟特定的流程
每個流程在定義的時候,都有一個id值,啟動時便通過這個id值來啟動,所以記住你設置的id值就可以啦!!!
到此這篇關于activiti實現(xiàn)員工請假流程解析的文章就介紹到這了,更多相關activiti請假流程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于resty orm的ActiveRecord操作數(shù)據(jù)指南
這篇文章主要為大家介紹了基于resty orm的ActiveRecord操作數(shù)據(jù)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03java集合Collection實現(xiàn)類解析ArrayList?LinkedList及Vector
這篇文章主要為大家介紹了java集合Collection實現(xiàn)類解析ArrayList?LinkedList及Vector,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03SpringBoot實現(xiàn)RabbitMQ監(jiān)聽消息的四種方式
本文介紹了在Spring Boot中實現(xiàn)RabbitMQ監(jiān)聽消息的幾種方式,包括使用@RabbitListener注解、MessageListenerAdapter、配置連接工廠和隊列等方式,感興趣的可以了解一下2024-07-07解決springboot jpa @Column columnDefinition等屬性失效問題
這篇文章主要介紹了解決springboot jpa @Column columnDefinition等屬性失效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10SpringBoot+ECharts是如何實現(xiàn)數(shù)據(jù)可視化的
今天帶大家學習的是關于Java的相關知識,文章圍繞著SpringBoot+ECharts怎么實現(xiàn)數(shù)據(jù)可視化展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06Maven項目部署到Jboss出現(xiàn)Failed to create a new SAX parser
這篇文章主要為大家詳細介紹了Maven項目部署到Jboss出現(xiàn)Failed to create a new SAX parser的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11