工作流系統之二十九 詳解工作流實例的一次流轉

通常在利用流程設計器給業務流程建模之後,會生成一個流程描述的xml文件,業務流程的每個環節步驟,需要執行的操作,自動的,手動的等等信息,都被描述在這個流程建模的xml文件中。xml文件的內容,是一些規則的預先定義的抽象的節點信息,流程引擎負責這些節點的定義,創建,解釋,定位等等,業務流程利用這些節點建模。建模完成的業務流程,掛接上業務表單後,就可以直接運行業務流程了。

業務流程的運行,從啓動流程實例開始,啓動一個流程實例即代表開始了一次業務流程處理。每例業務流程的處理過程,都包含從創建,到激活,到處理,到結束(當然中間也可以人爲的直接終止,或掛起,再恢復),這樣一個過程。流程實例創建後,就按照流程建模的xml文件,按照定義的節點路由順序一步一步的流轉,相應業務也在相應的步驟中處理。


流程實例按照節點路由順序,每執行一次,代表一次流轉。每次的流轉包含流程節點的狀態升遷和辦理業務數據的提交,通過工作流的事務,控制這些狀態升遷和業務數據達到同步和一致性。一旦這個流程實例結束了或意外終止了,都代表業務辦理完成了,就再也不能再次發生流轉了。


工作流實例的一次流轉,會涉及到流程節點狀態的升遷和辦理業務數據的提交。
下面示意圖,抽取流程一次流轉的定義示意:從步驟A環節-》到達步驟B


當流程實例到達步驟A的時候,當前流程實例的狀態=步驟A+步驟A的狀態,當執行動作A的時候,通過 動作A的 結果導向 步驟B。當到達步驟B的時候,當前流程實例的狀態=步驟B + 步驟B的狀態。流程實例的狀態通過執行動作A達到了升遷,當在動作A上面綁定了業務表單,業務數據也隨着動作A的執行一起提交。業務數據的提交和流程狀態的升遷是在同一個事務中的,保證數據的一致性。

從上面的分析可以看出,流程的一次流轉涉及到如下圖中紅色框中選中的部分。爲什麼步驟A和步驟B會分別是一半呢,下面我們來詳細說明,流轉過程中,每個流程基本元素的流轉順序。

 


在工作流系統的基本元素中,有一些前置後置函數,可以掛接到流程的節點上。當流程實例到達這個節點的時候,會觸發前置函數,離開這個節點會觸發後置函數,就象事件一樣。事件的內容是可以自己任意發揮的,就像一個button的點擊函數一樣,點擊後做什麼事情,有編寫程序的人來編寫代碼。這裏的前置後置函數也是一樣,當觸發了前置後置函數後,內容可以是預置的一些系統函數,也可以是業務流程建模者自定義做的一些業務模塊,體現流程的擴展性。

 

 

上圖中只描述了動作的前置後置,步驟的前置後置,實際上動作的結果,也有前置後置函數,便於做擴展用。實際上可以引入業務模塊的不僅是前置後置函數,動作的可執行條件也可以引入業務規則的判斷。例如一個請假的流程,在審覈請假是否通過時,可以引入一個判斷規則,將請假申請人的總年假-已經休的假期=可休年假天數,再和當前申請的天數比較,如果大於則申請通過,否則不通過。

 

 
綜合上面的描述,我們可以看出流程的一次流轉的先後順序爲:

 步驟的後置函數-》動作的前置函數-》完成本步驟的任務-》檢查動作結果中的條件(不成立則無條件結果)-》動作結果的前置-》 創建新的當前步驟(執行新步驟的前置函數)-》  動作結果的後置-》 動作的後置函數
 
 因爲執行動作後,會離開本步驟,所以首先是從本步驟的後置函數開始的。
 其中,創建新的當前步驟,關聯到任務信息,所以也有個處理過程順序:
 
  本步驟標記完成,轉到歷史步驟-》下一步爲當前步驟-》關閉當前步驟的所有未完成的任務-》到達新步驟,先生成新步驟的所有任務-》再執行新的當前步驟的前置函數。

 


業務流程在建模的時候,可以利用一些流程的上下文中的變量等做一些控制,也可以引入一些關鍵的業務數據做判斷用。這涉及到流程的持久變量和臨時變量。


例如,獲取當前流程實例的創建者,作爲一個變量,傳遞給接下來的第一個步驟作爲第一個步驟任務的參與者。
這可以用一個流程的臨時變量來處理:

在流程初始化動作(或動作結果)的前置函數中,將當前流程實例的創建者保存到變量caller中。然後在下一步驟的任務參與人中,就可以引入caller變量,獲取他的值了。

因爲caller變量是個臨時變量,僅存在於流程的一次流轉的中。當流程的這次流轉結束了,這個變量就實效了。就像一個子函數一樣,在子函數的開始,給變量caller賦值,在接下來的代碼中就可以獲取這個變量的值了。

 

所以在用流程的臨時變量時候,通常都是在相應節點的前置函數中,給變量賦值,按照流程的流轉順序,在相應的後置節點中獲取變量的值。

同樣的方式還適用於mostRecentCaller,mostRecentOwner 這兩個變量,獲取指定步驟的執行者和獲取指定步驟的所有者,這兩個變量都屬於發生了的歷史步驟才能獲取到。

流程的持久化變量,就與臨時變量不一樣了,只要流程的任意節點中保存了值,在後續的任意節點中都可以獲取到值。這個不侷限於流程的一次流轉,流程多次流轉都可以。只要在任意一次流轉中保存了變量的值了,後續的任意流轉中就都可以取值了。

 

例如一個報銷流程中,報銷申請是否通過,審覈人將這個結果作爲一個持久化的變量保存到流程中了。則在申請人查看審覈結果的環節,就可以取出這個審覈結果了。審覈的那次流轉,和查看環節,這是流程的兩個環節。不是流程的一次流轉,但是審覈的那次流轉,必須先於查看環節,先將變量的值持久化進去,然後後續的環節就能獲取值了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章