您好,登錄后才能下訂單哦!
平臺使用Activit工作流引擎,其中流程圖的繪制使用BPMN2.0規范,BPMN2.0是一個工作流業界標準,規范了大型廠商和開源工作流產品的實現,Activiti5實現了該標準的大部分圖元定義和執行語義解釋,功能強大,Activiti5可以與IBM、Oracle等大型商用工作流產品流程引擎節點的核心功能媲美,并且為了簡化應用、擴充原有功能,Activiti5又自定義了6個擴展元素和15個擴展屬性,這些元素和屬性能夠與BPMN規范相互組合可以實現更多、更實用的業務功能。
BPMN2.0對流程執行語義定義了三類基本要素,它們是日常業務流程的“三板斧”:
Activities(活動)——在工作流中所有具備生命周期狀態的都可以稱之為“活動”,如原子級的任務(Task)、流向(Sequence Flow),以及子流程(Sub-Process)等
Gateways(網關)——顧名思義,所謂“網關”就是用來決定流程流轉指向的,可能會被用作條件分支或聚合,也可以被用作并行執行或基于事件的排它性條件判斷
Events(事件)——在BPMN2.0執行語義中也是一個非常重要的概念,像啟動、結束、邊界條件以及每個活動的創建、開始、流轉等都是流程事件,利用事件機制,可以通過事件控制器為系統增加輔助功能,如其它業務系統集成、活動預警等
這三類執行語義的定義涵蓋了業務流程常用的Sequence Flow(流程轉向)、Task(任務)、Sub-Process(子流程)、Parallel Gateway(并行執行網關)、ExclusiveGateway(排它型網關)、InclusiveGateway(包容型網關)等常用圖元
現實業務所有的業務環節都離不開Activities、Gateways和Events,無論是簡單的條件審批還是復雜的父子流程循環處理,在一個流程定義描述中,所有的業務環節都離不開Task、Sequence Flow、Exclusive Gateway、Inclusive Gateway,其中Task是一個極具威力的元素,它能描述業務過程中所有能發生工時的行為,它包括User Task、Manual Task、Service Task、Script Task等,可以被用來描述人機交互任務、線下操作任務、服務調用、腳本計算任務等常規功能。
User Task:生成人機交互任務,主要被用來描述需要人為在軟件系統中進行諸如任務明細查閱、填寫審批意見等業務行為的操作,流程引擎流轉到此類節點時,系統會自動生成被動觸發任務,須人工響應后才能繼續向下流轉。常用于審批任務的定義。
Manual Task:線下人為操作任務,常用于為了滿足流程圖對實際業務定義的完整性而進行的與流程驅動無關的線下任務,即此類任務不參與實際工作流流轉。常用于諸如物流系統中的裝貨、運輸等任務的描述。
Service Task:服務任務,通常工作流流轉過程中會涉及到與自身系統服務API調用或與外部服務相互調用的情況,此類任務往往由一個具有特定業務服務功能的Java類承擔,與User Task不同,流程引擎流經此節點會自動調用Java類中定義的方法,方法執行完畢自動向下一流程節點流轉。另外,此類任務還可充當“條件路由”的功能對流程流轉可選分支進行自動判斷。常用于業務邏輯API的調用。
Script Task:腳本任務,在流程流轉期間以“腳本”的聲明或語法參與流程變量的計算,目前支持的腳本類型有三種:juel(即JSP EL)、groovy和javascript。在Activiti5.9中新增了Shell Task,可以處理系統外部定義的Shell腳本文件,也與Script Task有類似的功能。常用于流程變量的處理。
關于Activiti數據庫引擎,請查閱中文文檔:
http://www.mossle.com/docs/activiti/index.html
ProcessEngine是Activiti系統的核心接口,七類基礎服務接口通過ProcessEngine獲取,均采用鏈式API方式,直觀明了,易于使用:
RepositoryService:
流程資源服務的接口,主要用于對流程定義的部署、查詢和刪除操。新流程的部署使用createDeployment().addResourceXXX().deploy()方法;已部署流程的查詢使用createDeploymentQuery()附加查詢條件的方式獲取;另外可以使用deleteDeployment和deleteDeploymentCascade方法進行流程的刪除或級聯刪除。
TaskService :
任務服務接口,該接口暴露了管理人機交互任務的操作,如任務領取(claiming)、任務完成(completing)和任務指派(assigning),還包括對任務的創建、查詢、保存、刪除等。
RuntimeService :
運行時服務主要用于啟動或查詢流程實例,以及流程變量、當前激活狀態活動的查詢、流程實例的刪除等。流程在運行過程中所產生的東西都可以使用該接口進行相關處理。
HistoryService :
流程歷史的服務接口。提供對歷史流程實例、歷史任務的查詢和刪除操作,從提供的API來看,歷史流程的查詢其提供了finished和unfinished流程的查詢,即是說,HistoryService提供了對已完成和當前正在執行流程的活動/任務查詢,這一點似乎與runtimeService提供的查詢有些沖突,但其實是有差別的,運行時的信息僅包含任意時刻活動的實際運行狀態信息(是從流程運行執行性能上考慮的),而歷史信息是對已經固化的信息做簡單查詢而優化的,其所持有的對象是不同的。
IdentityService :
用戶、組管理服務接口,用于管理Group、User的增刪改查,并維護Membership,涉及到的API有newUser、newGroup、saveUser、saveGroup、createMembership以及相關的deleteXXX方法。
FormService :
表單服務用于訪問表單數據以及在啟動新的流程實例時或完成任務時所需的渲染后的表單,提供UI界面輔助用戶填寫相關值以保存至流程變量。該服務在實際業務應用中并不常用,屬于引擎的非核心服務。
ManagementService :
提供流程管理和控制操作的接口服務,和業務流程的運行沒有關聯關系,比如查詢數據庫本身的內容、Activiti的版本及序列生成ID規則等,屬于引擎的非核心服務。
工作流人刷節點配置提供了一下配置選項:
一、當前節點與流程啟動人:
同部門:dept_id相同
同公司:suborg_id相同
屬于上級部門:可選支持級別
二、當前節點與上一節點審批人:
同部門:dept_id相同
同公司:suborg_id相同
屬于上級部門:可選支持級別
三、根據當前單據Bean判斷根據bean.FieldValue指定部門
四、根據當前單據Bean判斷根據bean.FieldValue指定人
五、自定義:提供接口適配器,實現完成后注冊到系統可自動掃描帶出來顯示為列表,用戶可打鉤配置,可選一個
消息抄送實現了在流程節點審批完成時,自動發送消息給指定的人員或用戶組,更多詳細的消息發送機制可以查閱平臺的消息處理模塊文檔
站內消息
站內消息通過平臺內置的websocket消息發送
郵件抄送
郵件消息通過平臺內置的郵件服務器配置接口發送消息
APP消息推送
APP消息當前實現了Jpush的消息發送,詳細文檔資料可以查閱 http://www.jpush.cn
短信
平臺支持實現與短信網關之間的接口,可以通過自定義一個API完成短信消息的發送
在流程業務管理中,任務是通常都是由一個人去處理的,而多個人同時處理一個任務,這種任務我們稱之為會簽任務。
這種業務需求也很常見,如一個請款單,領導審批環節中,就需要多個部門領導簽字。在流程業務中,我們可以把每
個領導簽字的環節都定義為任務,但若這樣,這個流程業務有一點是固定的,就是簽批人是固定的。而任務是由一個
領導簽完再到另一領導,當然也可以由多個領導同時簽字。
圖:串行會簽
傳統的用流程業務來解決可以采用以下的做法:
前者在流程業務中,叫串行會簽,也即是由一個領導簽完再至另一領導簽。后者我們稱之為并行會簽,表示幾個領導
同時進行簽發,而不清楚最終是誰先簽。
圖:并行會簽
以上的解決方式有兩大業務需求下是不能滿足的,若會簽的領導不是固定的,即可以由上一任務審批人提交前隨意進
行選擇,另一種是對于會簽業務中,要求若其中一部分領導審批通過,即直接往下走,不需要全部領導進行審批。另
外,對于這種情況下,統計最終領導會簽的結果也是比較困難的,即對審批單的意見是同意還是否決沒有辦法清楚。
以上兩種業務需求也是很常見的日常需求,但我們若采用了固定的流程節點,則不能實現。在這里,可以采用Activiti
的節點多實例來處理,以上流程則可以簡化為下:
圖:Activiti的多節點實例會簽
圖:activiti工作流的配置
如上圖所示,該流程實現了從配置的會簽節點,結合表單數據動態篩選會簽的用戶功能。
配置多實例類型為并行,指定流程用戶信息來自于一個自定義的表達式,多實例變量名為assignee,同時在多實例節點上可以配置一個用戶角色或
多個用戶,與普通的節點配置類似。
編寫代碼,其中flowHelper為一個聲明的bean
//按用戶部門分組生成會簽需要的collection數據 public List<String> getAssignGroupList(String usersValue) throws Exception { if (!StrTool.isValid(usersValue)) { log.warn("沒有找到對應的流程分配人:" + 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; }
平臺提供了一個統一的已辦待辦入口,如果在工作流內部需要實現一個下拉的已辦待辦功能,在永新巡視平臺項目中,采用了通過SQL構造出查詢結果的方式實現高性能的已辦待辦功能
<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>
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。