activiti實現員工請假流程解析
原始碼下載:
http://xiazai.jb51.net/202007/yuanma/FirstActiviti_jb51.rar
連結: https://pan.baidu.com/s/1tCN7SDAdEUerZxcTr_9cqA
提取碼: twmp
在開始之前,先說一下剛開始學習工作流的時候遇到的問題,感覺比較困惑,經過這兩天的學習,也算有所收穫
1.部署了多個流程變數,如何準確開啟特定的流程
2. 在一個流程的執行過程中,怎麼確定執行到哪一步,即執行到哪個任務了
3. 在有多種情況的條件下,怎麼判斷要去的方向
先不急著解決,來看看我的工程
工程模擬情況
員工請假流程
- 員工發起申請,附帶請假資訊(請假幾天)單位領導審批,如果通過,交付經理審批,不通過,重新申請經理審批,如果請假天數不超過三天,經理1審批
- 如果請假天數在3-5天,經理3審批
- 超過5天,經理2審批經理審批通過,流程結束,經理審批不通過,員工重新申請
流程圖
領導意見和經理意見,用0和1表示,0表示未通過,1表示通過
多種執行情況
一.不超過3天,經理1審批,同意申請
二.3-5天,經理3審批,同意申請
三. 5天以上,經理2審批,同意申請
四. 任一環節設定不同意,陷入死迴圈
情況:請假天數超過5天,領導同意申請,且不同意申請
我的流程中,是一次執行完所有任務,直到流程結束,剛開始學習的小夥伴肯定很苦惱於這個問題,怎麼讓流程自己執行下去,我前兩天一直在想這個問題
要解決這個問題,隨之而來的第一個問題是,怎麼獲取當前任務,換句話說,就是怎麼跟蹤流程
每個流程執行時,都會產生一個程序例項.這是一個ProcessInstance物件,相當於一個實體類,在資料庫中有他的資訊,而且在這個流程執行完之前,這個例項流程會一直存在,並且id值不會變.
那麼,我們可不可以在每次啟動流程時都將這個ProcessInstance物件儲存記錄下來,然後再通過他的id值來查詢當前任務,也就是來跟蹤流程的執行情況
給出獲取程式碼
//開啟流程 ProcessInstance processInstance = runtimeService .startProcessInstanceByKey(processKey,variables); processInstanceId = processInstance.getId();
然後,通過id值來獲取當前任務
Task task = taskService.createTaskQuery()//建立查詢物件 .processInstanceId(processInstanceId)//通過流程例項id來查詢當前任務 .singleResult();//獲取單個查詢結果
這樣就可以跟蹤流程啦!!!
這時候,問題又來了,怎麼確定流程執行完了呢?怎麼讓程式自己找下一個任務?
還是用到ProcessInstance物件,前面說過,這個程序例項物件在流程執行完之前會一直存在,也就是說,流程執行完,這個物件就消失了,資料庫自動就給他刪除了.所以可以根據processInstanceId來查詢ProcessInstance物件,如果為空,說明流程已經走完了,否則,沒有走完
獲取ProcessInstance物件的程式碼
this.processEngine.getRuntimeService() .createProcessInstanceQuery()//獲取查詢物件 .processInstanceId(processInstanceId)//根據id查詢流程例項 .singleResult();//獲取查詢結果,說明這個流程已經執行完畢,獲取任務並執行
這樣就可以判斷流程是否結束了
那麼,接下來,就是如何讓流程自己找下一個任務,這裡我用了一個while迴圈來解決,直接給出我的程式碼
//開始進行流程 while(this.processEngine.getRuntimeService() .createProcessInstanceQuery()//獲取查詢物件 .processInstanceId(processInstanceId)//根據id查詢流程例項 .singleResult()//獲取查詢結果,獲取任務並執行 !=null){ Task task = taskService.createTaskQuery()//建立查詢物件 .processInstanceId(processInstanceId)//通過流程例項id來查詢當前任務 .singleResult();//獲取單個查詢結果 String taskName = task.getName(); if(taskName.equals("發起申請")){//職員節點 completeEmployeeTask(task); }else if(taskName.equals("領導審批")){//領導節點 completeLeaderTask(task); }else{//經理節點 completeJingliTask(task); } }
我的處理是把每個任務的完成,都封裝成一個方法,要完成該任務時直接呼叫該方法就行,傳入的引數是當前的任務的Task物件.
任務完成函式
//職員提交申請 public void completeEmployeeTask(Task task){ //獲取任務id String taskId = task.getId(); //完成任務 this.processEngine.getTaskService().complete(taskId); System.out.println("職員已經提交申請......."); } //領導審批 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("領導稽核完畢........"); } //經理審批 public void completeJingliTask(Task task){ //獲取任務id String taskId = task.getId(); String name = task.getName(); //經理意見 Map<String,Object>(); variables.put("result",0); //完成任務 this.processEngine.getTaskService().complete(taskId,variables); System.out.println("經理稽核完畢........,稽核經理:"+name); }
有的小夥伴就要問,明明經理稽核時有三個經理,為什麼只寫了一個經理審批函式呢?
在經理稽核之前,是一個排他閘道器,閘道器後面出來的連線線中可以設定篩選條件,滿足誰就去誰那裡,設定見圖
這裡的變數是在領導審批這個任務完成之後傳過來的,引數傳遞方法見上篇博文:https://blog.csdn.net/fly_fly_fly_pig/article/details/81699318
這樣,就實現了這個流程的基本運轉啦!!
哦,對,還有一個問題,部署了多個流程變數,如何準確開啟特定的流程
每個流程在定義的時候,都有一個id值,啟動時便通過這個id值來啟動,所以記住你設定的id值就可以啦!!!
到此這篇關於activiti實現員工請假流程解析的文章就介紹到這了,更多相關activiti請假流程內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!