activiti實(shí)現(xiàn)員工請(qǐng)假流程解析
源碼下載:
http://xiazai.jb51.net/202007/yuanma/FirstActiviti_jb51.rar
鏈接: https://pan.baidu.com/s/1tCN7SDAdEUerZxcTr_9cqA
提取碼: twmp
在開(kāi)始之前,先說(shuō)一下剛開(kāi)始學(xué)習(xí)工作流的時(shí)候遇到的問(wèn)題,感覺(jué)比較困惑,經(jīng)過(guò)這兩天的學(xué)習(xí),也算有所收獲
1.部署了多個(gè)流程變量,如何準(zhǔn)確開(kāi)啟特定的流程
2. 在一個(gè)流程的執(zhí)行過(guò)程中,怎么確定執(zhí)行到哪一步,即執(zhí)行到哪個(gè)任務(wù)了
3. 在有多種情況的條件下,怎么判斷要去的方向
先不急著解決,來(lái)看看我的工程
工程模擬情況
員工請(qǐng)假流程
- 員工發(fā)起申請(qǐng),附帶請(qǐng)假信息(請(qǐng)假幾天)單位領(lǐng)導(dǎo)審批,如果通過(guò),交付經(jīng)理審批,不通過(guò),重新申請(qǐng)經(jīng)理審批,如果請(qǐng)假天數(shù)不超過(guò)三天,經(jīng)理1審批
- 如果請(qǐng)假天數(shù)在3-5天,經(jīng)理3審批
- 超過(guò)5天,經(jīng)理2審批經(jīng)理審批通過(guò),流程結(jié)束,經(jīng)理審批不通過(guò),員工重新申請(qǐng)
流程圖

領(lǐng)導(dǎo)意見(jiàn)和經(jīng)理意見(jiàn),用0和1表示,0表示未通過(guò),1表示通過(guò)
多種執(zhí)行情況
一.不超過(guò)3天,經(jīng)理1審批,同意申請(qǐng)

二.3-5天,經(jīng)理3審批,同意申請(qǐng)

三. 5天以上,經(jīng)理2審批,同意申請(qǐng)

四. 任一環(huán)節(jié)設(shè)置不同意,陷入死循環(huán)
情況:請(qǐng)假天數(shù)超過(guò)5天,領(lǐng)導(dǎo)同意申請(qǐng),經(jīng)理2審批,且不同意申請(qǐng)

我的流程中,是一次執(zhí)行完所有任務(wù),直到流程結(jié)束,剛開(kāi)始學(xué)習(xí)的小伙伴肯定很苦惱于這個(gè)問(wèn)題,怎么讓流程自己執(zhí)行下去,我前兩天一直在想這個(gè)問(wèn)題
要解決這個(gè)問(wèn)題,隨之而來(lái)的第一個(gè)問(wèn)題是,怎么獲取當(dāng)前任務(wù),換句話(huà)說(shuō),就是怎么跟蹤流程
每個(gè)流程運(yùn)行時(shí),都會(huì)產(chǎn)生一個(gè)進(jìn)程實(shí)例.這是一個(gè)ProcessInstance對(duì)象,相當(dāng)于一個(gè)實(shí)體類(lèi),在數(shù)據(jù)庫(kù)中有他的信息,而且在這個(gè)流程執(zhí)行完之前,這個(gè)實(shí)例流程會(huì)一直存在,并且id值不會(huì)變.
那么,我們可不可以在每次啟動(dòng)流程時(shí)都將這個(gè)ProcessInstance對(duì)象保存記錄下來(lái),然后再通過(guò)他的id值來(lái)查詢(xún)當(dāng)前任務(wù),也就是來(lái)跟蹤流程的執(zhí)行情況
給出獲取代碼
//開(kāi)啟流程 ProcessInstance processInstance = runtimeService .startProcessInstanceByKey(processKey, variables); processInstanceId = processInstance.getId();
然后,通過(guò)id值來(lái)獲取當(dāng)前任務(wù)
Task task = taskService.createTaskQuery()//創(chuàng)建查詢(xún)對(duì)象 .processInstanceId(processInstanceId)//通過(guò)流程實(shí)例id來(lái)查詢(xún)當(dāng)前任務(wù) .singleResult();//獲取單個(gè)查詢(xún)結(jié)果
這樣就可以跟蹤流程啦!!!
這時(shí)候,問(wèn)題又來(lái)了,怎么確定流程執(zhí)行完了呢?怎么讓程序自己找下一個(gè)任務(wù)?
還是用到ProcessInstance對(duì)象,前面說(shuō)過(guò),這個(gè)進(jìn)程實(shí)例對(duì)象在流程執(zhí)行完之前會(huì)一直存在,也就是說(shuō),流程執(zhí)行完,這個(gè)對(duì)象就消失了,數(shù)據(jù)庫(kù)自動(dòng)就給他刪除了.所以可以根據(jù)processInstanceId來(lái)查詢(xún)ProcessInstance對(duì)象,如果為空,說(shuō)明流程已經(jīng)走完了,否則,沒(méi)有走完
獲取ProcessInstance對(duì)象的代碼
this.processEngine.getRuntimeService() .createProcessInstanceQuery()//獲取查詢(xún)對(duì)象 .processInstanceId(processInstanceId)//根據(jù)id查詢(xún)流程實(shí)例 .singleResult();//獲取查詢(xún)結(jié)果,如果為空,說(shuō)明這個(gè)流程已經(jīng)執(zhí)行完畢,否則,獲取任務(wù)并執(zhí)行
這樣就可以判斷流程是否結(jié)束了
那么,接下來(lái),就是如何讓流程自己找下一個(gè)任務(wù),這里我用了一個(gè)while循環(huán)來(lái)解決,直接給出我的代碼
//開(kāi)始進(jìn)行流程
while(this.processEngine.getRuntimeService()
.createProcessInstanceQuery()//獲取查詢(xún)對(duì)象
.processInstanceId(processInstanceId)//根據(jù)id查詢(xún)流程實(shí)例
.singleResult()//獲取查詢(xún)結(jié)果,如果為空,說(shuō)明這個(gè)流程已經(jīng)執(zhí)行完畢,否則,獲取任務(wù)并執(zhí)行
!=null){
Task task = taskService.createTaskQuery()//創(chuàng)建查詢(xún)對(duì)象
.processInstanceId(processInstanceId)//通過(guò)流程實(shí)例id來(lái)查詢(xún)當(dāng)前任務(wù)
.singleResult();//獲取單個(gè)查詢(xún)結(jié)果
String taskName = task.getName();
if(taskName.equals("發(fā)起申請(qǐng)")){//職員節(jié)點(diǎn)
completeEmployeeTask(task);
}else if(taskName.equals("領(lǐng)導(dǎo)審批")){//領(lǐng)導(dǎo)節(jié)點(diǎn)
completeLeaderTask(task);
}else{//經(jīng)理節(jié)點(diǎn)
completeJingliTask(task);
}
}
我的處理是把每個(gè)任務(wù)的完成,都封裝成一個(gè)方法,要完成該任務(wù)時(shí)直接調(diào)用該方法就行,傳入的參數(shù)是當(dāng)前的任務(wù)的Task對(duì)象.
任務(wù)完成函數(shù)
//職員提交申請(qǐng)
public void completeEmployeeTask(Task task){
//獲取任務(wù)id
String taskId = task.getId();
//完成任務(wù)
this.processEngine.getTaskService().complete(taskId);
System.out.println("職員已經(jīng)提交申請(qǐng).......");
}
//領(lǐng)導(dǎo)審批
public void completeLeaderTask(Task task){
//獲取任務(wù)id
String taskId = task.getId();
//領(lǐng)導(dǎo)意見(jiàn)
Map<String, Object> variables = new HashMap<String, Object>();
//variables.put("day",4);
variables.put("leaderResult", 1);
//完成任務(wù)
this.processEngine.getTaskService().complete(taskId, variables);
System.out.println("領(lǐng)導(dǎo)審核完畢........");
}
//經(jīng)理審批
public void completeJingliTask(Task task){
//獲取任務(wù)id
String taskId = task.getId();
String name = task.getName();
//經(jīng)理意見(jiàn)
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("result", 0);
//完成任務(wù)
this.processEngine.getTaskService().complete(taskId, variables);
System.out.println("經(jīng)理審核完畢........,審核經(jīng)理:"+name);
}
有的小伙伴就要問(wèn),明明經(jīng)理審核時(shí)有三個(gè)經(jīng)理,為什么只寫(xiě)了一個(gè)經(jīng)理審批函數(shù)呢?
在經(jīng)理審核之前,是一個(gè)排他網(wǎng)關(guān),網(wǎng)關(guān)后面出來(lái)的連接線中可以設(shè)置篩選條件,滿(mǎn)足誰(shuí)就去誰(shuí)那里,設(shè)置見(jiàn)圖

這里的變量是在領(lǐng)導(dǎo)審批這個(gè)任務(wù)完成之后傳過(guò)來(lái)的,參數(shù)傳遞方法見(jiàn)上篇博文:http://www.dbjr.com.cn/article/182226.htm
這樣,就實(shí)現(xiàn)了這個(gè)流程的基本運(yùn)轉(zhuǎn)啦!!
哦,對(duì),還有一個(gè)問(wèn)題,部署了多個(gè)流程變量,如何準(zhǔn)確開(kāi)啟特定的流程
每個(gè)流程在定義的時(shí)候,都有一個(gè)id值,啟動(dòng)時(shí)便通過(guò)這個(gè)id值來(lái)啟動(dòng),所以記住你設(shè)置的id值就可以啦!!!
到此這篇關(guān)于activiti實(shí)現(xiàn)員工請(qǐng)假流程解析的文章就介紹到這了,更多相關(guān)activiti請(qǐng)假流程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot整合Activiti7的實(shí)現(xiàn)代碼
- SpringBoot2整合activiti6環(huán)境搭建過(guò)程解析
- 解決Springboot2.1.x配置Activiti7單獨(dú)數(shù)據(jù)源問(wèn)題
- spring boot activiti工作流的搭建與簡(jiǎn)單使用
- Android開(kāi)發(fā)之a(chǎn)ctiviti節(jié)點(diǎn)跳轉(zhuǎn)
- Android實(shí)現(xiàn)Activities之間進(jìn)行數(shù)據(jù)傳遞的方法
- activiti獲取流程圖實(shí)例
- Activiti流程圖查看實(shí)例
相關(guān)文章
基于resty orm的ActiveRecord操作數(shù)據(jù)指南
這篇文章主要為大家介紹了基于resty orm的ActiveRecord操作數(shù)據(jù)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
java集合Collection實(shí)現(xiàn)類(lèi)解析ArrayList?LinkedList及Vector
這篇文章主要為大家介紹了java集合Collection實(shí)現(xiàn)類(lèi)解析ArrayList?LinkedList及Vector,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03
SpringBoot實(shí)現(xiàn)RabbitMQ監(jiān)聽(tīng)消息的四種方式
本文介紹了在Spring Boot中實(shí)現(xiàn)RabbitMQ監(jiān)聽(tīng)消息的幾種方式,包括使用@RabbitListener注解、MessageListenerAdapter、配置連接工廠和隊(duì)列等方式,感興趣的可以了解一下2024-07-07
Java實(shí)現(xiàn)超市會(huì)員管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)超市會(huì)員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
解決springboot jpa @Column columnDefinition等屬性失效問(wèn)題
這篇文章主要介紹了解決springboot jpa @Column columnDefinition等屬性失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
SpringBoot+ECharts是如何實(shí)現(xiàn)數(shù)據(jù)可視化的
今天帶大家學(xué)習(xí)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著SpringBoot+ECharts怎么實(shí)現(xiàn)數(shù)據(jù)可視化展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Maven項(xiàng)目部署到Jboss出現(xiàn)Failed to create a new SAX parser
這篇文章主要為大家詳細(xì)介紹了Maven項(xiàng)目部署到Jboss出現(xiàn)Failed to create a new SAX parser的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
Java EE中的編碼問(wèn)題及解決方案(總結(jié))
在JavaEE開(kāi)發(fā)中,處理字符編碼問(wèn)題是確保數(shù)據(jù)準(zhǔn)確傳輸和顯示的關(guān)鍵,常見(jiàn)的編碼問(wèn)題包括表單提交亂碼、JSP頁(yè)面編碼、請(qǐng)求參數(shù)編碼不一致等,本文給大家介紹Java EE中的編碼問(wèn)題及解決方案,感興趣的朋友一起看看吧2024-10-10

