天天看點

淺談Activiti Modeler 的擴充

為什麼要擴充

        最近項目打算用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,建議去看,

        然後一起探讨),後續會更新一些現有的實作。

本文轉自帥氣的頭頭部落格51CTO部落格,原文連結http://blog.51cto.com/12902932/1927609如需轉載請自行聯系原作者

sshpp