- 為什么要擴展
最近項目打算用activiti工作流中activiti modeler來做模塊的可視化訂閱,但是原生的activiti任務節點,有一些不符合業務需要,比如
-
- 配置項多,屬性暴露。比如service task,配置時就要暴露其Java Degelete方法類,這樣以后實施人員去配置的時候,第一他每次去配個service task都要去配置,第二他不會知道這個任務要配什么委托類,所以這對職責單一的一個service task來說,比如就需要一個解析xml的任務,那么我除了id ,name,其他都是不需要的,內部封裝屬性,不暴露出去。
- 圖標單一,一眼看不出任務職責。
- 子流程內容跟父流程內容在一個面板,流程定制面視覺效果不好,而且固定子流程不能得到復用。
對以上一些不足,其實對activiti來說,他要考慮的當然是多開放配置,更容易兼容場景,或許有些人會認為這都不是事,做這種擴展沒有必要,大題小作。仁者見仁智者見智吧,我認為這種擴展,
對使用會更便捷,用戶友好性也更好,具有一定的業務特色,也不改變原生activiti任務的職能,何樂不為。
- 如何擴展
首先考慮一下可行性,這種擴展以什么為切入點。擴展任務節點,那就得發現service task這個任務的特性,它不想user task,script task的只能那么單一,它可以指定委托處理類,來達到執行目的。
因此,在任務定制這方面,完全可以由service task進行屬性擴展和封閉。具體擴展細節,如下考慮
-
- UI上擴展屬性
-
-
- 擴展stencilset.json文件。propertyPackages對象中增加自定義的package(基本類型直接使用,復雜類型需要擴展),另外stenclis對象的節點中增加package引用
- 針對復雜類型自定義package的擴展。properties.js中增加復雜類型配置(復雜類型的展現及賦值采用angularjs1.2實現)
-
- bpmn中擴展屬性
-
-
- 自定義XSD
- 在extensionElements元素中實現擴展
- 通過repositoryService獲取bpmnModel,進而獲取指定元素的擴展
-
- 解析UI上的擴展到bpmn
-
-
- UI的圖形及屬性信息會解析成JSON,包含自定義擴展
- 從JSON中提取擴展轉換成bpmn中的元素。通過BpmnJsonConverter把Json數據轉換為BpmnModel,把Json中的擴展轉換成BpmnModel對應元素的extensionElements屬性,通過BpmnXmlConverter把BpmnModel轉換為bpmn文件
-

-
- 子流程怎么存儲?
-
-
- 把子流程作為獨立的模型進行編輯和保存,這樣可以使用現有的建模工具及持久化方式
- 部署時怎么組裝子流程?
-
- 由於定制化的模型數據不符合標准,需要在部署前轉換為標准的bpmn
- 將子流程的標識用真正的子流程定義替換掉
- 子流程的標識通過子流程模型ID進行關聯
- 從流程定義查看流程圖時,坐標會有問題,子流程替換后,坐標需要調整(難點)
- 展現設計
-
- 在建模的頁面中添加子流程的下拉框(所有后代子流程,流程樹)
- 擴展一個子流程標識節點,該節點可以設置關聯的子流程
- 雙擊子流程標識節點可以進入以該子流程為根的建模頁面
-
-
- 后端設計
-
- 根據父流程查詢所有后代子流程
-
- 部署時數據的轉換,子流程數據的替換(重點)
- 編后語
在子流程這方面需要考慮的還很多,比如后續的流程跟蹤該如何處理,以及上述部署組裝bpmn文件的坐標問題等。這要繼續看下activiti源碼(ps:activiti 源碼寫的很漂亮,very good,建議去看,
然后一起探討),后續會更新一些現有的實現。