您好,登錄后才能下訂單哦!
平臺(tái)使用Activit工作流引擎,其中流程圖的繪制使用BPMN2.0規(guī)范,BPMN2.0是一個(gè)工作流業(yè)界標(biāo)準(zhǔn),規(guī)范了大型廠商和開(kāi)源工作流產(chǎn)品的實(shí)現(xiàn),Activiti5實(shí)現(xiàn)了該標(biāo)準(zhǔn)的大部分圖元定義和執(zhí)行語(yǔ)義解釋,功能強(qiáng)大,Activiti5可以與IBM、Oracle等大型商用工作流產(chǎn)品流程引擎節(jié)點(diǎn)的核心功能媲美,并且為了簡(jiǎn)化應(yīng)用、擴(kuò)充原有功能,Activiti5又自定義了6個(gè)擴(kuò)展元素和15個(gè)擴(kuò)展屬性,這些元素和屬性能夠與BPMN規(guī)范相互組合可以實(shí)現(xiàn)更多、更實(shí)用的業(yè)務(wù)功能。
BPMN2.0對(duì)流程執(zhí)行語(yǔ)義定義了三類基本要素,它們是日常業(yè)務(wù)流程的“三板斧”:
Activities(活動(dòng))——在工作流中所有具備生命周期狀態(tài)的都可以稱之為“活動(dòng)”,如原子級(jí)的任務(wù)(Task)、流向(Sequence Flow),以及子流程(Sub-Process)等
Gateways(網(wǎng)關(guān))——顧名思義,所謂“網(wǎng)關(guān)”就是用來(lái)決定流程流轉(zhuǎn)指向的,可能會(huì)被用作條件分支或聚合,也可以被用作并行執(zhí)行或基于事件的排它性條件判斷
Events(事件)——在BPMN2.0執(zhí)行語(yǔ)義中也是一個(gè)非常重要的概念,像啟動(dòng)、結(jié)束、邊界條件以及每個(gè)活動(dòng)的創(chuàng)建、開(kāi)始、流轉(zhuǎn)等都是流程事件,利用事件機(jī)制,可以通過(guò)事件控制器為系統(tǒng)增加輔助功能,如其它業(yè)務(wù)系統(tǒng)集成、活動(dòng)預(yù)警等
這三類執(zhí)行語(yǔ)義的定義涵蓋了業(yè)務(wù)流程常用的Sequence Flow(流程轉(zhuǎn)向)、Task(任務(wù))、Sub-Process(子流程)、Parallel Gateway(并行執(zhí)行網(wǎng)關(guān))、ExclusiveGateway(排它型網(wǎng)關(guān))、InclusiveGateway(包容型網(wǎng)關(guān))等常用圖元
現(xiàn)實(shí)業(yè)務(wù)所有的業(yè)務(wù)環(huán)節(jié)都離不開(kāi)Activities、Gateways和Events,無(wú)論是簡(jiǎn)單的條件審批還是復(fù)雜的父子流程循環(huán)處理,在一個(gè)流程定義描述中,所有的業(yè)務(wù)環(huán)節(jié)都離不開(kāi)Task、Sequence Flow、Exclusive Gateway、Inclusive Gateway,其中Task是一個(gè)極具威力的元素,它能描述業(yè)務(wù)過(guò)程中所有能發(fā)生工時(shí)的行為,它包括User Task、Manual Task、Service Task、Script Task等,可以被用來(lái)描述人機(jī)交互任務(wù)、線下操作任務(wù)、服務(wù)調(diào)用、腳本計(jì)算任務(wù)等常規(guī)功能。
User Task:生成人機(jī)交互任務(wù),主要被用來(lái)描述需要人為在軟件系統(tǒng)中進(jìn)行諸如任務(wù)明細(xì)查閱、填寫(xiě)審批意見(jiàn)等業(yè)務(wù)行為的操作,流程引擎流轉(zhuǎn)到此類節(jié)點(diǎn)時(shí),系統(tǒng)會(huì)自動(dòng)生成被動(dòng)觸發(fā)任務(wù),須人工響應(yīng)后才能繼續(xù)向下流轉(zhuǎn)。常用于審批任務(wù)的定義。
Manual Task:線下人為操作任務(wù),常用于為了滿足流程圖對(duì)實(shí)際業(yè)務(wù)定義的完整性而進(jìn)行的與流程驅(qū)動(dòng)無(wú)關(guān)的線下任務(wù),即此類任務(wù)不參與實(shí)際工作流流轉(zhuǎn)。常用于諸如物流系統(tǒng)中的裝貨、運(yùn)輸?shù)热蝿?wù)的描述。
Service Task:服務(wù)任務(wù),通常工作流流轉(zhuǎn)過(guò)程中會(huì)涉及到與自身系統(tǒng)服務(wù)API調(diào)用或與外部服務(wù)相互調(diào)用的情況,此類任務(wù)往往由一個(gè)具有特定業(yè)務(wù)服務(wù)功能的Java類承擔(dān),與User Task不同,流程引擎流經(jīng)此節(jié)點(diǎn)會(huì)自動(dòng)調(diào)用Java類中定義的方法,方法執(zhí)行完畢自動(dòng)向下一流程節(jié)點(diǎn)流轉(zhuǎn)。另外,此類任務(wù)還可充當(dāng)“條件路由”的功能對(duì)流程流轉(zhuǎn)可選分支進(jìn)行自動(dòng)判斷。常用于業(yè)務(wù)邏輯API的調(diào)用。
Script Task:腳本任務(wù),在流程流轉(zhuǎn)期間以“腳本”的聲明或語(yǔ)法參與流程變量的計(jì)算,目前支持的腳本類型有三種:juel(即JSP EL)、groovy和javascript。在Activiti5.9中新增了Shell Task,可以處理系統(tǒng)外部定義的Shell腳本文件,也與Script Task有類似的功能。常用于流程變量的處理。
關(guān)于Activiti數(shù)據(jù)庫(kù)引擎,請(qǐng)查閱中文文檔:
http://www.mossle.com/docs/activiti/index.html
ProcessEngine是Activiti系統(tǒng)的核心接口,七類基礎(chǔ)服務(wù)接口通過(guò)ProcessEngine獲取,均采用鏈?zhǔn)紸PI方式,直觀明了,易于使用:
RepositoryService:
流程資源服務(wù)的接口,主要用于對(duì)流程定義的部署、查詢和刪除操。新流程的部署使用createDeployment().addResourceXXX().deploy()方法;已部署流程的查詢使用createDeploymentQuery()附加查詢條件的方式獲取;另外可以使用deleteDeployment和deleteDeploymentCascade方法進(jìn)行流程的刪除或級(jí)聯(lián)刪除。
TaskService :
任務(wù)服務(wù)接口,該接口暴露了管理人機(jī)交互任務(wù)的操作,如任務(wù)領(lǐng)?。╟laiming)、任務(wù)完成(completing)和任務(wù)指派(assigning),還包括對(duì)任務(wù)的創(chuàng)建、查詢、保存、刪除等。
RuntimeService :
運(yùn)行時(shí)服務(wù)主要用于啟動(dòng)或查詢流程實(shí)例,以及流程變量、當(dāng)前激活狀態(tài)活動(dòng)的查詢、流程實(shí)例的刪除等。流程在運(yùn)行過(guò)程中所產(chǎn)生的東西都可以使用該接口進(jìn)行相關(guān)處理。
HistoryService :
流程歷史的服務(wù)接口。提供對(duì)歷史流程實(shí)例、歷史任務(wù)的查詢和刪除操作,從提供的API來(lái)看,歷史流程的查詢其提供了finished和unfinished流程的查詢,即是說(shuō),HistoryService提供了對(duì)已完成和當(dāng)前正在執(zhí)行流程的活動(dòng)/任務(wù)查詢,這一點(diǎn)似乎與runtimeService提供的查詢有些沖突,但其實(shí)是有差別的,運(yùn)行時(shí)的信息僅包含任意時(shí)刻活動(dòng)的實(shí)際運(yùn)行狀態(tài)信息(是從流程運(yùn)行執(zhí)行性能上考慮的),而歷史信息是對(duì)已經(jīng)固化的信息做簡(jiǎn)單查詢而優(yōu)化的,其所持有的對(duì)象是不同的。
IdentityService :
用戶、組管理服務(wù)接口,用于管理Group、User的增刪改查,并維護(hù)Membership,涉及到的API有newUser、newGroup、saveUser、saveGroup、createMembership以及相關(guān)的deleteXXX方法。
FormService :
表單服務(wù)用于訪問(wèn)表單數(shù)據(jù)以及在啟動(dòng)新的流程實(shí)例時(shí)或完成任務(wù)時(shí)所需的渲染后的表單,提供UI界面輔助用戶填寫(xiě)相關(guān)值以保存至流程變量。該服務(wù)在實(shí)際業(yè)務(wù)應(yīng)用中并不常用,屬于引擎的非核心服務(wù)。
ManagementService :
提供流程管理和控制操作的接口服務(wù),和業(yè)務(wù)流程的運(yùn)行沒(méi)有關(guān)聯(lián)關(guān)系,比如查詢數(shù)據(jù)庫(kù)本身的內(nèi)容、Activiti的版本及序列生成ID規(guī)則等,屬于引擎的非核心服務(wù)。
工作流人刷節(jié)點(diǎn)配置提供了一下配置選項(xiàng):
一、當(dāng)前節(jié)點(diǎn)與流程啟動(dòng)人:
同部門(mén):dept_id相同
同公司:suborg_id相同
屬于上級(jí)部門(mén):可選支持級(jí)別
二、當(dāng)前節(jié)點(diǎn)與上一節(jié)點(diǎn)審批人:
同部門(mén):dept_id相同
同公司:suborg_id相同
屬于上級(jí)部門(mén):可選支持級(jí)別
三、根據(jù)當(dāng)前單據(jù)Bean判斷根據(jù)bean.FieldValue指定部門(mén)
四、根據(jù)當(dāng)前單據(jù)Bean判斷根據(jù)bean.FieldValue指定人
五、自定義:提供接口適配器,實(shí)現(xiàn)完成后注冊(cè)到系統(tǒng)可自動(dòng)掃描帶出來(lái)顯示為列表,用戶可打鉤配置,可選一個(gè)
消息抄送實(shí)現(xiàn)了在流程節(jié)點(diǎn)審批完成時(shí),自動(dòng)發(fā)送消息給指定的人員或用戶組,更多詳細(xì)的消息發(fā)送機(jī)制可以查閱平臺(tái)的消息處理模塊文檔
站內(nèi)消息
站內(nèi)消息通過(guò)平臺(tái)內(nèi)置的websocket消息發(fā)送
郵件抄送
郵件消息通過(guò)平臺(tái)內(nèi)置的郵件服務(wù)器配置接口發(fā)送消息
APP消息推送
APP消息當(dāng)前實(shí)現(xiàn)了Jpush的消息發(fā)送,詳細(xì)文檔資料可以查閱 http://www.jpush.cn
短信
平臺(tái)支持實(shí)現(xiàn)與短信網(wǎng)關(guān)之間的接口,可以通過(guò)自定義一個(gè)API完成短信消息的發(fā)送
在流程業(yè)務(wù)管理中,任務(wù)是通常都是由一個(gè)人去處理的,而多個(gè)人同時(shí)處理一個(gè)任務(wù),這種任務(wù)我們稱之為會(huì)簽任務(wù)。
這種業(yè)務(wù)需求也很常見(jiàn),如一個(gè)請(qǐng)款單,領(lǐng)導(dǎo)審批環(huán)節(jié)中,就需要多個(gè)部門(mén)領(lǐng)導(dǎo)簽字。在流程業(yè)務(wù)中,我們可以把每
個(gè)領(lǐng)導(dǎo)簽字的環(huán)節(jié)都定義為任務(wù),但若這樣,這個(gè)流程業(yè)務(wù)有一點(diǎn)是固定的,就是簽批人是固定的。而任務(wù)是由一個(gè)
領(lǐng)導(dǎo)簽完再到另一領(lǐng)導(dǎo),當(dāng)然也可以由多個(gè)領(lǐng)導(dǎo)同時(shí)簽字。
圖:串行會(huì)簽
傳統(tǒng)的用流程業(yè)務(wù)來(lái)解決可以采用以下的做法:
前者在流程業(yè)務(wù)中,叫串行會(huì)簽,也即是由一個(gè)領(lǐng)導(dǎo)簽完再至另一領(lǐng)導(dǎo)簽。后者我們稱之為并行會(huì)簽,表示幾個(gè)領(lǐng)導(dǎo)
同時(shí)進(jìn)行簽發(fā),而不清楚最終是誰(shuí)先簽。
圖:并行會(huì)簽
以上的解決方式有兩大業(yè)務(wù)需求下是不能滿足的,若會(huì)簽的領(lǐng)導(dǎo)不是固定的,即可以由上一任務(wù)審批人提交前隨意進(jìn)
行選擇,另一種是對(duì)于會(huì)簽業(yè)務(wù)中,要求若其中一部分領(lǐng)導(dǎo)審批通過(guò),即直接往下走,不需要全部領(lǐng)導(dǎo)進(jìn)行審批。另
外,對(duì)于這種情況下,統(tǒng)計(jì)最終領(lǐng)導(dǎo)會(huì)簽的結(jié)果也是比較困難的,即對(duì)審批單的意見(jiàn)是同意還是否決沒(méi)有辦法清楚。
以上兩種業(yè)務(wù)需求也是很常見(jiàn)的日常需求,但我們?nèi)舨捎昧斯潭ǖ牧鞒坦?jié)點(diǎn),則不能實(shí)現(xiàn)。在這里,可以采用Activiti
的節(jié)點(diǎn)多實(shí)例來(lái)處理,以上流程則可以簡(jiǎn)化為下:
圖:Activiti的多節(jié)點(diǎn)實(shí)例會(huì)簽
圖:activiti工作流的配置
如上圖所示,該流程實(shí)現(xiàn)了從配置的會(huì)簽節(jié)點(diǎn),結(jié)合表單數(shù)據(jù)動(dòng)態(tài)篩選會(huì)簽的用戶功能。
配置多實(shí)例類型為并行,指定流程用戶信息來(lái)自于一個(gè)自定義的表達(dá)式,多實(shí)例變量名為assignee,同時(shí)在多實(shí)例節(jié)點(diǎn)上可以配置一個(gè)用戶角色或
多個(gè)用戶,與普通的節(jié)點(diǎn)配置類似。
編寫(xiě)代碼,其中flowHelper為一個(gè)聲明的bean
//按用戶部門(mén)分組生成會(huì)簽需要的collection數(shù)據(jù) public List<String> getAssignGroupList(String usersValue) throws Exception { if (!StrTool.isValid(usersValue)) { log.warn("沒(méi)有找到對(duì)應(yīng)的流程分配人:" + usersValue); return null; } HashMap<String, String> ht = new HashMap<>(); List<String> uids = new ArrayList<>(); String[] users = usersValue.split(","); for (String user : users) { List<IUserDept> list = OrgUtil.getUserDeptList(user); IUserDept dept = list.get(0); String deptid = dept.getDeptId(); String userDeptId = dept.getUserDeptId(); if (ht.containsKey(deptid)) { String data = ht.get(deptid) + "," + userDeptId; ht.put(deptid, data); } else ht.put(deptid, userDeptId); } Iterator iter = ht.entrySet().iterator(); while (iter.hasNext()) { Map.Entry<String, String> entry = (Map.Entry) iter.next(); uids.add(entry.getValue()); } return uids; }
平臺(tái)提供了一個(gè)統(tǒng)一的已辦待辦入口,如果在工作流內(nèi)部需要實(shí)現(xiàn)一個(gè)下拉的已辦待辦功能,在永新巡視平臺(tái)項(xiàng)目中,采用了通過(guò)SQL構(gòu)造出查詢結(jié)果的方式實(shí)現(xiàn)高性能的已辦待辦功能
<div class="btn-group"> <i class="fa fa-filter" style="color: #7e7f93"></i> <a aria-expanded="false" aria-haspopup="true" role="button" data-toggle="dropdown" class="dropdown-toggle" href="#" id="filterRangertag"> <judp:i18n key="@fliterTable" text="我的待辦"/> <span class="caret"></span> </a> <ul class="dropdown-menu" id="filterRanger"> <li><a href="${url}/pageQueryTodoListForWorkType?workflowType=safeckplan&format=json&queryName=queryList&filterQuery=true&queryType=page">我的待辦</a></li> <li><a href="${url}/query?format=json&queryName=queryList&filterQuery=true&queryType=page">所有記錄 </a></li> </ul> </div>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。