一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - activiti實現員工請假流程解析

activiti實現員工請假流程解析

2020-07-28 12:20fly_fly_fly_pig Java教程

這篇文章主要介紹了activiti實現員工請假流程解析,本文通過實例代碼圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

源碼下載:

鏈接: https://pan.baidu.com/s/1tCN7SDAdEUerZxcTr_9cqA

提取碼: twmp

在開始之前,先說一下剛開始學習工作流的時候遇到的問題,感覺比較困惑,經過這兩天的學習,也算有所收獲

1.部署了多個流程變量,如何準確開啟特定的流程
2. 在一個流程的執行過程中,怎么確定執行到哪一步,即執行到哪個任務了
3. 在有多種情況的條件下,怎么判斷要去的方向

先不急著解決,來看看我的工程

工程模擬情況

員工請假流程

  • 員工發起申請,附帶請假信息(請假幾天)單位領導審批,如果通過,交付經理審批,不通過,重新申請經理審批,如果請假天數不超過三天,經理1審批
  • 如果請假天數在3-5天,經理3審批
  • 超過5天,經理2審批經理審批通過,流程結束,經理審批不通過,員工重新申請

流程圖

activiti實現員工請假流程解析

領導意見和經理意見,用0和1表示,0表示未通過,1表示通過

多種執行情況

一.不超過3天,經理1審批,同意申請

activiti實現員工請假流程解析

二.3-5天,經理3審批,同意申請

activiti實現員工請假流程解析

三. 5天以上,經理2審批,同意申請

activiti實現員工請假流程解析

四. 任一環節設置不同意,陷入死循環
情況:請假天數超過5天,領導同意申請,經理2審批,且不同意申請

activiti實現員工請假流程解析

我的流程中,是一次執行完所有任務,直到流程結束,剛開始學習的小伙伴肯定很苦惱于這個問題,怎么讓流程自己執行下去,我前兩天一直在想這個問題

要解決這個問題,隨之而來的第一個問題是,怎么獲取當前任務,換句話說,就是怎么跟蹤流程

每個流程運行時,都會產生一個進程實例.這是一個ProcessInstance對象,相當于一個實體類,在數據庫中有他的信息,而且在這個流程執行完之前,這個實例流程會一直存在,并且id值不會變.

那么,我們可不可以在每次啟動流程時都將這個ProcessInstance對象保存記錄下來,然后再通過他的id值來查詢當前任務,也就是來跟蹤流程的執行情況
給出獲取代碼

?
1
2
3
4
//開啟流程
        ProcessInstance processInstance = runtimeService
        .startProcessInstanceByKey(processKey, variables);
        processInstanceId = processInstance.getId();

然后,通過id值來獲取當前任務

?
1
2
3
Task task = taskService.createTaskQuery()//創建查詢對象
                .processInstanceId(processInstanceId)//通過流程實例id來查詢當前任務
                .singleResult();//獲取單個查詢結果

這樣就可以跟蹤流程啦!!!

這時候,問題又來了,怎么確定流程執行完了呢?怎么讓程序自己找下一個任務?

還是用到ProcessInstance對象,前面說過,這個進程實例對象在流程執行完之前會一直存在,也就是說,流程執行完,這個對象就消失了,數據庫自動就給他刪除了.所以可以根據processInstanceId來查詢ProcessInstance對象,如果為空,說明流程已經走完了,否則,沒有走完

獲取ProcessInstance對象的代碼

?
1
2
3
4
this.processEngine.getRuntimeService()
                .createProcessInstanceQuery()//獲取查詢對象
                .processInstanceId(processInstanceId)//根據id查詢流程實例
                .singleResult();//獲取查詢結果,如果為空,說明這個流程已經執行完畢,否則,獲取任務并執行

這樣就可以判斷流程是否結束了

那么,接下來,就是如何讓流程自己找下一個任務,這里我用了一個while循環來解決,直接給出我的代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//開始進行流程
        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對象.

任務完成函數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//職員提交申請
    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 = new HashMap<String, Object>();
        variables.put("result", 0);
        //完成任務
        this.processEngine.getTaskService().complete(taskId, variables);
        System.out.println("經理審核完畢........,審核經理:"+name);
        
    }

有的小伙伴就要問,明明經理審核時有三個經理,為什么只寫了一個經理審批函數呢?

在經理審核之前,是一個排他網關,網關后面出來的連接線中可以設置篩選條件,滿足誰就去誰那里,設置見圖

activiti實現員工請假流程解析

這里的變量是在領導審批這個任務完成之后傳過來的,參數傳遞方法見上篇博文:https://blog.csdn.net/fly_fly_fly_pig/article/details/81699318

這樣,就實現了這個流程的基本運轉啦!!

哦,對,還有一個問題,部署了多個流程變量,如何準確開啟特定的流程
每個流程在定義的時候,都有一個id值,啟動時便通過這個id值來啟動,所以記住你設置的id值就可以啦!!!

到此這篇關于activiti實現員工請假流程解析的文章就介紹到這了,更多相關activiti請假流程內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/fly_fly_fly_pig/article/details/81700820

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产欧美一区二区三区精品 | www.亚洲视频.com | 国产成人久久 | 久久一本岛在免费线观看2020 | 亚洲女性色尼古综合网 | 欧美多gayxxxx| 国产成人在线影院 | 欧美特欧美特级一片 | 国产一区二区视频在线观看 | 亚洲成色爱我久久 | 色视频久久 | 亚洲欧美日韩另类在线 | 丝袜爆操| 肉大捧一进一出视频免费播放 | 精品国产91久久久久久久a | 99久久国产综合精麻豆 | 美式禁忌在线 | 青青色在线观看 | 国产在线精品一区二区高清不卡 | 亚洲 欧美 中文 日韩欧美 | 色先锋av资源中文字幕 | 亚洲精品久久久久久婷婷 | 亚洲高清中文字幕 | 欧美老人与小伙子性生交 | 欧美久久久久久久一区二区三区 | 国产精品久久一区 | 亚洲理论视频 | 亚洲AVAV天堂AV在线网爱情 | 青草免费在线观看 | 成年人免费观看的视频 | 四虎永久在线精品免费影视 | japonensis日本护士18 | 动漫在线观看h | 国产a免费| 青青草精品 | 亚洲AV国产精品无码精 | 91一个人的在线观看www | 国产9191精品免费观看 | 日韩免费高清完整版 | 四虎永久在线精品免费影视 | 91极品在线观看 |