1. 程式人生 > >Activiti 工作流表單設計及開發

Activiti 工作流表單設計及開發

一、前言

        Activiti 5對錶單的支援目前還是比較弱的,表現在對錶單的開發還需要寫Freemark模板,並且它的模板還需要跟class檔案一起打包釋出。這使得流程的表單設計必須由開發人員來開發處理。因而,開發一套易用性強的流程表單功能就顯得很有必要。

二、需求

        使用者一般都希望能有如Microsoft的Office套件中的InfoPath那樣,可以自己進行設計,並且能與工作流程綁在一起進行流轉處理。如下所示:

        表單中每個欄位有固定的資料型別,並由不同的資料控制元件展示,如日期、數字、單選或多選、下拉、多行文字甚至富文字編輯器。在實現更強的功能上,我們還允許控制元件能實現指令碼互動。

三、設計實現思路

在表單與流程的整合中,我們一般不建議把表單的所有資料都儲存在流程中,僅需要把參與流程跳轉的資料才存到流程變數中去。如請假出差的流程,如下所示:

        如申請出差金額則需要參與流程的處理中去,因而在進入這個判斷節點之前,流程變數中需要存在這個變數,並且通過判斷這個變數值來讓流程自動跳轉。

1.        流程例項與業務表單關聯

基於以上設計的原則,流程中則不儲存業務表單的資料,那麼流程與業務表單又如何關聯?在Activiti 5 則比Jbpm4考慮了這塊,他在流程例項表及任務例項表相關執行表中增加了一個欄位(BusinessKey),用來關聯業務表單的資料,我們一般把這個欄位稱為業務主鍵。其關聯關係如下所示:

                 

        那麼流程表單的資料如何儲存及如何展示,從上圖可以看到,我們對自定義的表單提供了生成物理表的方式,那麼表單的儲存則通過線上生成的頁面獲取物理表必需要的資料,然後儲存至物理表中。這需要我們在設計表單時,生成一套表單資料規範,在審批時,能夠進行頁面表單的資料驗證及儲存。另外,還需要對在執行過程中的表單進行許可權控制,如同一節點上審批相同的表單,不同角色的人員對錶單的欄位的讀寫許可權是不一樣的。

2.        線上表單設計功能要求

     我們把以上的需求進行了用例描述,則得到如下示例

<IGNORE_JS_OP style="WORD-WRAP: break-word">

1.        設計表單模板

允許使用者預先設定好一些帶有漂亮格式的表單,如包括表頭、表腳及樣式。方便使用者調整表單。

2.        設計表單佈局

允許使用者線上進行線上佈局,目前一般來說都是基於表格的佈局方式。

3.        設計表單欄位控制元件、資料型別、資料驗證

設計表單欄位的輸入控制元件型別及資料型別,用於保證使用者輸入的資料的正確性

4.        設定表單欄位許可權

用於控制表單的欄位的讀寫許可權,結合工作流的審批,可以更有效顯示資料。

5.        支援表單動態指令碼

允許對錶單控制元件加上互動指令碼,以實現如一些級聯更新等的資料互動等。

6.        表單預覽

可以線上實時顯示錶單的顯示效果

7.        預設流程變數

把參與流程運算的表單欄位標識為流程變數。

3.        線上流程表單設計邏輯結構分析

生成流程表單的流程如下所示:

說明:

表單設計可以先設計物理表再根據模板生成線上表單

也可以先設計表單的樣式再生成物理表

        以上兩種方式最終的目標均需要生成物理表,物理表的結構及資料展示控制元件等我們則需要用表來記錄。因此,以下為他們大體上的資料結構模型:

        表單生成物理表後,表單頁面需要跟物理表單的資料對應起來,在提交頁面表單時,我們採用了Json的資料結構來提交,在後臺獲取可以有效轉存為物理表的資料。如下格式:

表單資料分為3部分:

1.        主表資料。

2.        子表資料

3.        意見資料

資料格式如:

{"main":{"tableId":"tableId","fields":{"itemSubject":"出差深圳兩天","total":"230","creatorID":"1340762352749","creator":"張小軍","descp":"出差深圳兩天"}},"sub":[],"opinion":[]}

        線上表單的控制元件展示,需要按欄位及結構來解析最終顯示及資料驗證。

        流程啟動後,需要把業務主鍵傳至流程例項中去,幸好,activiti已經提供了比較完整的API介面,如下:

Java程式碼   [url=]  [/url]

  • ProcessInstance processInstance=runtimeService.startProcessInstanceById(porcessDefId, businessKey, variables);  

        以上方法會把業務表單中需要參與流程執行的欄位放到variables作為流程變數。

4.        流程定義與業務表單繫結

        流程定義允許繫結多種業務表單,目前我們可以簡單分為三種模式,線上表單、同系統的定製業務表單、第三方業務表單。

        線上表單可以用全域性表單,則整個流程用同一個表單,如果每個流程節點的表單不一樣,則可以通過設計表單。 表單資料結構如下所示:

        

        所以在啟動流程時及在任務進行跳轉時,均可以獲取流程節點的表單設定,從而在啟動流程或執行任務處理時能進行正確的表單展示。

        流程在完成整個審批後,還可以通過流程執行歷史,能通過該以下該表可以查詢當時每個節點審批時的表單情況。