這是我們(東方易維)工作流產(chǎn)品設(shè)計過程中采取的設(shè)計:
一、流程實例的狀態(tài)
狀態(tài)分為5種:實例化、執(zhí)行中、掛起、手工結(jié)束、正常結(jié)束。
狀態(tài)的變遷如下圖:
二、節(jié)點實例的狀態(tài)
狀態(tài)分為5種:實例化、執(zhí)行中、掛起、手工結(jié)束、正常結(jié)束。
狀態(tài)的變遷如下圖:
三、具體節(jié)點的狀態(tài)
細(xì)分:
A、人工節(jié)點、等待節(jié)點
這兩個節(jié)點被觸發(fā)后存在一個執(zhí)行等待的過程,所以可以被用戶直接掛起和手工結(jié)束。人工節(jié)點的掛起意味著所有未完成工作項的掛起,同時相應(yīng)時間服務(wù)的時間計算的掛起。手工結(jié)束會使流程跳過該節(jié)點(所有工作項手工結(jié)束),繼續(xù)往后流轉(zhuǎn)。
B、開始節(jié)點、結(jié)束節(jié)點、分支節(jié)點、自動節(jié)點
這些節(jié)點的特點在于被觸發(fā)后立刻執(zhí)行和流轉(zhuǎn),所以不會存在掛起和手工結(jié)束的狀態(tài)。
C、并發(fā)節(jié)點、匯聚節(jié)點
并發(fā)節(jié)點和匯聚節(jié)點不存在掛起的狀態(tài),同時不能被用戶直接手工結(jié)束,它們的狀態(tài)受流程實例狀態(tài)和相關(guān)節(jié)點實例狀態(tài)的影響。
并發(fā)節(jié)點和匯聚節(jié)點的情況復(fù)雜一些,分模式討論
圖1
1、同步匯聚(圖1)
根據(jù)情況觸發(fā)節(jié)點0、節(jié)點1、節(jié)點2中的一個或多個,匯聚節(jié)點等待所有實際觸發(fā)的節(jié)點完成后再執(zhí)行流轉(zhuǎn)。中間匯聚節(jié)點只會產(chǎn)生一個實例。
1.1、正常流轉(zhuǎn)時的處理策略
當(dāng)匯聚節(jié)點未被觸發(fā)時(即節(jié)點0、節(jié)點1、節(jié)點2都未執(zhí)行結(jié)束),并發(fā)節(jié)點處于執(zhí)行狀態(tài),一旦匯聚節(jié)點被觸發(fā)(即節(jié)點0、節(jié)點1、節(jié)點2有一個執(zhí)行結(jié)束),并發(fā)節(jié)點正常結(jié)束并且匯聚節(jié)點處于執(zhí)行狀態(tài),所有并發(fā)出的節(jié)點實例執(zhí)行結(jié)束后,匯聚節(jié)點正常結(jié)束,流程繼續(xù)流轉(zhuǎn)。
1.2、用戶掛起、手工結(jié)束相關(guān)節(jié)點的處理策略
1.2.1、匯聚節(jié)點未激活時
節(jié)點0、節(jié)點1、節(jié)點2的掛起和恢復(fù)執(zhí)行不會影響并發(fā)節(jié)點的狀態(tài)(依舊處于執(zhí)行狀態(tài));節(jié)點0、節(jié)點1、節(jié)點2的任一手工結(jié)束都會觸發(fā)匯聚節(jié)點,使并發(fā)節(jié)點正常結(jié)束,如果所有并發(fā)的節(jié)點實例都結(jié)束(包括手工結(jié)束和正常結(jié)束),匯聚節(jié)點正常結(jié)束,觸發(fā)流程流轉(zhuǎn)。
1.2.2、匯聚節(jié)點已激活時
節(jié)點0、節(jié)點1、節(jié)點2的掛起和恢復(fù)執(zhí)行不會影響匯聚節(jié)點的狀態(tài)(依舊處于執(zhí)行狀態(tài));節(jié)點0、節(jié)點1、節(jié)點2的手工結(jié)束會影響匯聚節(jié)點的狀態(tài),每個節(jié)點實例的手工結(jié)束會引起匯聚節(jié)點的判斷,如果所有并發(fā)的節(jié)點實例(包括正常結(jié)束和手工結(jié)束)都結(jié)束,匯聚節(jié)點正常結(jié)束,觸發(fā)流程流轉(zhuǎn)。
1.3、用戶掛起、手工結(jié)束流程的處理策略
1.3.1、匯聚節(jié)點未激活時
流程的掛起和恢復(fù)執(zhí)行不會影響并發(fā)節(jié)點的狀態(tài)(依舊處于執(zhí)行狀態(tài)),節(jié)點0、節(jié)點1、節(jié)點2會被全部掛起或恢復(fù);流程的手工結(jié)束會引起所有節(jié)點的手工結(jié)束。
1.3.2、匯聚節(jié)點已激活時
流程的掛起和恢復(fù)執(zhí)行不會影響匯聚節(jié)點的狀態(tài)(依舊處于執(zhí)行狀態(tài)),節(jié)點0、節(jié)點1、節(jié)點2未執(zhí)行結(jié)束的實例會被全部掛起或恢復(fù);流程的手工結(jié)束會引起所有節(jié)點的手工結(jié)束。
2、nOutOfM匯聚(圖1)
根據(jù)情況觸發(fā)節(jié)點0、節(jié)點1、節(jié)點2中的一個或多個,匯聚節(jié)點等待N個實際觸發(fā)的節(jié)點完成后即執(zhí)行流轉(zhuǎn)(N>0且N<M,M為實際觸發(fā)的節(jié)點個數(shù)),在N<=0和N>=M的情況下即為同步匯聚。中間匯聚節(jié)點只會產(chǎn)生一個實例。
2.1、正常流轉(zhuǎn)時的處理策略
當(dāng)匯聚節(jié)點未被觸發(fā)時(即節(jié)點0、節(jié)點1、節(jié)點2都未執(zhí)行結(jié)束),并發(fā)節(jié)點處于執(zhí)行狀態(tài),一旦匯聚節(jié)點被觸發(fā)(即節(jié)點0、節(jié)點1、節(jié)點2有一個執(zhí)行結(jié)束),并發(fā)節(jié)點正常結(jié)束并且匯聚節(jié)點處于執(zhí)行狀態(tài),N個并發(fā)出的節(jié)點實例執(zhí)行結(jié)束后,匯聚節(jié)點正常結(jié)束,流程繼續(xù)流轉(zhuǎn),M-N的節(jié)點實例被手工結(jié)束。
2.2、用戶掛起、手工結(jié)束相關(guān)節(jié)點的處理策略
2.2.1、匯聚節(jié)點未激活時
節(jié)點0、節(jié)點1、節(jié)點2的掛起和恢復(fù)執(zhí)行不會影響并發(fā)節(jié)點的狀態(tài)(依舊處于執(zhí)行狀態(tài));節(jié)點0、節(jié)點1、節(jié)點2的任一手工結(jié)束都會觸發(fā)匯聚節(jié)點,使并發(fā)節(jié)點正常結(jié)束,如果N個并發(fā)的節(jié)點實例都手工結(jié)束,并發(fā)節(jié)點正常結(jié)束,觸發(fā)匯聚節(jié)點,匯聚節(jié)點正常結(jié)束,觸發(fā)流程流轉(zhuǎn),M-N的節(jié)點實例被手工結(jié)束。
2.2.2、匯聚節(jié)點已激活時
節(jié)點0、節(jié)點1、節(jié)點2的掛起和恢復(fù)執(zhí)行不會影響匯聚節(jié)點的狀態(tài)(依舊處于執(zhí)行狀態(tài));節(jié)點0、節(jié)點1、節(jié)點2的手工結(jié)束會影響匯聚節(jié)點的狀態(tài),每個節(jié)點實例的手工結(jié)束會引起匯聚節(jié)點的判斷,如果N個并發(fā)的節(jié)點實例(包括正常結(jié)束和手工結(jié)束)都結(jié)束,匯聚節(jié)點正常結(jié)束,觸發(fā)流程流轉(zhuǎn),M-N的節(jié)點實例被手工結(jié)束。
2.3、用戶掛起、手工結(jié)束流程的處理策略
2.3.1、匯聚節(jié)點未激活時
流程的掛起和恢復(fù)執(zhí)行不會影響并發(fā)節(jié)點的狀態(tài)(依舊處于執(zhí)行狀態(tài)),節(jié)點0、節(jié)點1、節(jié)點2會被全部掛起或恢復(fù);流程的手工結(jié)束會引起所有節(jié)點的手工結(jié)束。
2.3.2、匯聚節(jié)點已激活時
流程的掛起和恢復(fù)執(zhí)行不會影響匯聚節(jié)點的狀態(tài)(依舊處于執(zhí)行狀態(tài)),節(jié)點0、節(jié)點1、節(jié)點2未執(zhí)行結(jié)束的實例會被全部掛起或恢復(fù);流程的手工結(jié)束會引起所有節(jié)點的手工結(jié)束。
3、辨別匯聚(圖1)
是nOutOfM匯聚的特例,N=1
4、多實例匯聚(圖2)
圖2
根據(jù)情況觸發(fā)節(jié)點0、節(jié)點1中的一個或多個,節(jié)點0和節(jié)點1任意一個執(zhí)行結(jié)束后都會觸發(fā)匯聚節(jié)點產(chǎn)生一個新的實例,匯聚節(jié)點實例緊接著觸發(fā)節(jié)點2,節(jié)點2也會產(chǎn)生多個實例。
4.1、正常流轉(zhuǎn)時的處理策略
當(dāng)匯聚節(jié)點未被觸發(fā)時(即節(jié)點0、節(jié)點1都未執(zhí)行結(jié)束),并發(fā)節(jié)點處于執(zhí)行狀態(tài),一旦匯聚節(jié)點被觸發(fā)(即節(jié)點0、節(jié)點1有一個執(zhí)行結(jié)束),匯聚節(jié)點會緊接著觸發(fā)節(jié)點2,匯聚節(jié)點正常結(jié)束。所有并發(fā)出的節(jié)點實例執(zhí)行結(jié)束后,并發(fā)節(jié)點正常結(jié)束。
4.2、用戶掛起、手工結(jié)束相關(guān)節(jié)點的處理策略
節(jié)點0、節(jié)點1的掛起和恢復(fù)執(zhí)行不會影響并發(fā)節(jié)點的狀態(tài)(依舊處于執(zhí)行狀態(tài));節(jié)點0、節(jié)點1的手工結(jié)束會影響并發(fā)節(jié)點和匯聚節(jié)點的狀態(tài),每個節(jié)點實例的手工結(jié)束會引起匯聚節(jié)點產(chǎn)生新的實例并觸發(fā)節(jié)點2,同時會引起并發(fā)節(jié)點的判斷,如果所有并發(fā)的節(jié)點實例都手工結(jié)束,并發(fā)節(jié)點正常結(jié)束。
4.3、用戶掛起、手工結(jié)束流程的處理策略
流程的掛起和恢復(fù)執(zhí)行不會影響并發(fā)節(jié)點的狀態(tài)(依舊處于執(zhí)行狀態(tài)),節(jié)點0、節(jié)點1、節(jié)點2會被全部掛起或恢復(fù);流程的手工結(jié)束會引起所有未結(jié)束節(jié)點的手工結(jié)束。
5、隱式結(jié)束,沒有匯聚節(jié)點與并發(fā)節(jié)點對應(yīng)(圖3)
圖3
所有節(jié)點結(jié)束時(正常結(jié)束或手工結(jié)束),并發(fā)節(jié)點正常結(jié)束。流程的手工結(jié)束會引起所有未結(jié)束節(jié)點的手工結(jié)束。
四、流程實例狀態(tài)變化對節(jié)點實例狀態(tài)造成的影響
1、流程實例的掛起
A類節(jié)點掛起,B、C類節(jié)點不受影響。同時在流程實例恢復(fù)執(zhí)行之前,A類節(jié)點不允許用戶直接恢復(fù)執(zhí)行。
2、流程實例的手工結(jié)束
所有節(jié)點全部手工結(jié)束。
五、節(jié)點實例狀態(tài)變化對流程實例狀態(tài)造成的影響
隱式結(jié)束的情況下,節(jié)點的手工結(jié)束或正常結(jié)束都會觸發(fā)流程的判斷,如果所有的節(jié)點都已結(jié)束則流程結(jié)束。
http://www.aygfsteel.com/ronghao 榮浩原創(chuàng),轉(zhuǎn)載請注明出處:)