介紹什么是工作流設(shè)計(jì)
一、什么是工作流
舉個(gè)很土的例子。程序員出差,回來(lái)后要報(bào)銷票據(jù)。公司規(guī)定票據(jù)需要由員工所屬經(jīng)理審批,然后交由財(cái)務(wù)審批,財(cái)務(wù)審批通過(guò)程序員才可以拿到錢。在這個(gè)過(guò)程中,經(jīng)理可以駁回申請(qǐng),財(cái)務(wù)也可以駁回申請(qǐng),駁回后單據(jù)回到程序員編輯草稿的狀態(tài)。見下圖。
這就是一個(gè)工作流,一個(gè)單據(jù)由多個(gè)角色的用戶審批,不同角色看到的界面是不同的,每一個(gè)狀態(tài)都對(duì)應(yīng)一個(gè)界面,例如程序員能夠看到“開始”和“草稿”的頁(yè)面,能夠編輯報(bào)銷單據(jù)的名稱和金額等信息,可以點(diǎn)擊“保存草稿”和“提交經(jīng)理審批”按鈕;經(jīng)理能夠編輯“經(jīng)理審批理由”,可以點(diǎn)擊“同意”和“駁回”按鈕;財(cái)務(wù)能夠編輯“財(cái)務(wù)審批理由”,可以點(diǎn)擊“同意”和“駁回”按鈕等。
二、為什么要使用工作流
因?yàn)榭蛻舻男枨罂偸窃谧兏?,我們開發(fā)程序編碼到一半的時(shí)候需求就會(huì)有顛覆性的修改。好的設(shè)計(jì)師不是設(shè)計(jì)出多么牛X的構(gòu)架,而是設(shè)計(jì)出的程序易于快速適應(yīng)需求的變更。下面來(lái)看看客戶是如何變更需求的。
以上一節(jié)中的報(bào)銷審批為例??蛻籼岢鲂薷囊螅谐绦騿T的報(bào)銷都提交給經(jīng)理審批,那經(jīng)理每天不用干正事了,時(shí)間都花在審批報(bào)銷上了,以后報(bào)銷這種小事,大于1000元的再來(lái)找經(jīng)理審批,小于等于1000元的直接找財(cái)務(wù)就行了。流程見下圖。
過(guò)兩天可能客戶又說(shuō),還是要經(jīng)理審批500元以上的審批吧,畢竟有些時(shí)候那些500-1000元的報(bào)銷單據(jù)財(cái)務(wù)不能直接做主。這樣的修改倒還好說(shuō),比較只要修改一個(gè)系統(tǒng)常量就搞定,如果客戶再說(shuō),我們不需要經(jīng)理審批了,整個(gè)流程只要財(cái)務(wù)審批即可,那程序的修改可就大了。流程見下圖。
我相信各位肯定見過(guò)比這更狗血的需求變更。牢騷抱怨不能解決問(wèn)題,更合理的設(shè)計(jì)才是王道。所以如果你的需求需要這種不同人員對(duì)一個(gè)單據(jù)進(jìn)行的審批,那么請(qǐng)使用工作流。
三、工作流的組成
本文不具體介紹工作流的編碼,如果各位想落地了解工作流的具體編碼,可以查閱微軟的WF工作流引擎或者JBPM開源工作流引擎。
工作流只要有節(jié)點(diǎn)狀態(tài)和流轉(zhuǎn)事件兩部分組成。
以上面報(bào)銷流程為例,包括“開始”在內(nèi)的所有矩形都是節(jié)點(diǎn)狀態(tài)(“草稿”、“經(jīng)理待審批”、“財(cái)務(wù)待審批”、“財(cái)務(wù)審批通過(guò)”)。所有的節(jié)點(diǎn)狀態(tài)都對(duì)應(yīng)一個(gè)界面。相應(yīng)的人員在對(duì)應(yīng)的節(jié)點(diǎn)狀態(tài)打開報(bào)銷單據(jù)的時(shí)候才能進(jìn)行自己的操作,不然只能進(jìn)行只讀查看。例如當(dāng)前單據(jù)處于“經(jīng)理待審批”狀態(tài),那么如果經(jīng)理打開這個(gè)單據(jù)能夠編輯自己的審批意見,并且可以選擇點(diǎn)擊“通過(guò)”或者“駁回”按鈕。如果程序員進(jìn)入這個(gè)單據(jù),只能看到自己以前編輯過(guò)的內(nèi)容,不能再次編輯,也不能進(jìn)行經(jīng)理和財(cái)務(wù)的操作。
到這里就不難理解流轉(zhuǎn)事件了,流轉(zhuǎn)事件就是一個(gè)狀態(tài)到下一狀態(tài)的觸發(fā)事件。還以報(bào)銷流程為例,圖中由一個(gè)節(jié)點(diǎn)狀態(tài)指向另一個(gè)節(jié)點(diǎn)狀態(tài)的線既為流轉(zhuǎn)事件。程序員點(diǎn)擊“提交”按鈕,就是將當(dāng)前為“草稿”節(jié)點(diǎn)狀態(tài)的單據(jù)流轉(zhuǎn)到了“經(jīng)理待審批”狀態(tài)的事件。
節(jié)點(diǎn)狀態(tài)與流轉(zhuǎn)事件的關(guān)系一般保存在配置文件中,例如JBPM就保存在XML文件中,WF更直觀,它附帶一個(gè)工作流的圖形編輯器,編輯好圖形后自動(dòng)保存到對(duì)應(yīng)的XAML文件中。以上面用戶的需求修改為例,如果客戶要求整個(gè)流程中不需要經(jīng)理審批環(huán)節(jié),那么只需要在配置文件中做修改,講“草稿”狀態(tài)下的“提交審批”流轉(zhuǎn)事件直接指向“財(cái)務(wù)待審批”即可,只是這樣一個(gè)簡(jiǎn)單的修改即可完成客戶那復(fù)雜的修改需求,所以這里就是工作流的精華所在了。
除此之外我們還可以改造工作流引擎,在流轉(zhuǎn)事件中加入一些通用功能,例如郵件提醒、短信提醒等功能。例如增加如下需求,所有報(bào)銷審批操作執(zhí)行成功后都要郵件提醒下一個(gè)狀態(tài)環(huán)節(jié)的負(fù)責(zé)人,程序員提交“草稿”后單據(jù)進(jìn)入“經(jīng)理待審批”狀態(tài),那么就需要郵件通知經(jīng)理,催促他盡快處理這位經(jīng)理名下的報(bào)銷單據(jù)。
四、需要注意的一些事情
我在這里給出一些工作流節(jié)點(diǎn)命名的一些建議。盡量以“待”字開頭,例如“經(jīng)理待審批”、“財(cái)務(wù)待審批”,這樣命名可以體現(xiàn)出當(dāng)前狀態(tài)需要由何種角色的人員來(lái)處理,而且也便于需求的變更。這里強(qiáng)烈不推薦使用“已”字命名,例如“程序員已提交”、“經(jīng)理已審批”等。那么如果這樣設(shè)計(jì),程序員在草稿狀態(tài)提交后就進(jìn)入“程序員已提交”狀態(tài),經(jīng)理審批通過(guò)后進(jìn)入“經(jīng)理已提交”狀態(tài)。
這時(shí)客戶變更需求,要吧“程序員已提交”狀態(tài)刪除,那么這時(shí)候程序員在草稿狀態(tài)提交后就流轉(zhuǎn)到了“經(jīng)理已審批”狀態(tài)。這樣理解起來(lái)就有些混亂了。
這里需要聲明一點(diǎn),圖中的“結(jié)束”狀態(tài)在設(shè)計(jì)程序的時(shí)候不對(duì)應(yīng)具體界面,指向“結(jié)束”的流轉(zhuǎn)事件也就沒有具體的按鈕觸發(fā)。也就是說(shuō)“結(jié)束”狀態(tài)只是一個(gè)虛的狀態(tài),指向“結(jié)束”狀態(tài)的節(jié)點(diǎn)狀態(tài)我們都認(rèn)為它是一種終結(jié)的狀態(tài)。例如“財(cái)務(wù)審批通過(guò)”狀態(tài)就不可能再向其他狀態(tài)流轉(zhuǎn)了,那么它就是一種結(jié)束的狀態(tài)。上面的例子中只有一個(gè)結(jié)束狀態(tài),我們這里再做一次需求的變更,所有的駁回操作不回到“草稿”狀態(tài),都流轉(zhuǎn)到對(duì)應(yīng)的結(jié)束狀態(tài)。如圖所示。
其實(shí)所有的人都希望將工作聚焦在當(dāng)前需要完成的工作,其次是將要進(jìn)行的工作。而那些已經(jīng)完成的工作只有年終總結(jié)的時(shí)候需要統(tǒng)計(jì)一下。例如經(jīng)理最希望看到當(dāng)前待審批的報(bào)銷單,如果經(jīng)理忙完了手頭的工作不免好奇心起會(huì)去關(guān)心一下還處于草稿狀態(tài)的報(bào)銷單,至于“經(jīng)理駁回”狀態(tài)下的報(bào)銷單,可能只是年終總結(jié)的時(shí)候大BOSS需要看一下數(shù)量而已。所以在設(shè)計(jì)經(jīng)理的報(bào)銷單查詢頁(yè)面時(shí),應(yīng)該默認(rèn)查詢出所有“經(jīng)理待審批”狀態(tài)的報(bào)銷單。所有的角色都希望默認(rèn)查詢出自己對(duì)應(yīng)狀態(tài)的報(bào)銷單據(jù)。財(cái)務(wù)的操作也應(yīng)該是如此這里不再冗述。再舉一個(gè)例子,有時(shí)候大BOSS希望知道某一時(shí)間段內(nèi)有多少報(bào)銷單已經(jīng)完成了(這是所說(shuō)的已完成就是已經(jīng)結(jié)束的報(bào)銷單,包括“財(cái)務(wù)審批通過(guò)”、“經(jīng)理駁回”和“財(cái)務(wù)駁回”),那么只需要從工作流中查詢出指向結(jié)束的節(jié)點(diǎn)狀態(tài)報(bào)銷單即可。
我再聲明一點(diǎn),雖然“經(jīng)理駁回”與“財(cái)務(wù)駁回”在某些業(yè)務(wù)上是相同的,但是請(qǐng)不要因?yàn)楣?jié)省編碼而將這兩種狀態(tài)設(shè)計(jì)成一種狀態(tài),比較人家客戶的業(yè)務(wù)人員在提出需求的時(shí)候是分開命名的,這也就意味著這是兩種不同的業(yè)務(wù),誰(shuí)知道哪天客戶心血來(lái)潮需要在“經(jīng)理駁回”狀態(tài)下添加一個(gè)流轉(zhuǎn)事件允許返回到“草稿”狀態(tài)。到那時(shí)候可能我們可憐的程序員就要在某些代碼上瘋狂的加標(biāo)志位了。
五、寫在最后
細(xì)心的人可能會(huì)有這樣的想法,程序員在“草稿”狀態(tài)下可以無(wú)限制的保存當(dāng)前編輯的報(bào)銷單,那么這個(gè)保存事件是不是應(yīng)該也是一種流程,是不是應(yīng)該從“草稿”到“草稿”的流轉(zhuǎn)呢?
本文只是簡(jiǎn)介了一下簡(jiǎn)單工作流的設(shè)計(jì),在實(shí)際的設(shè)計(jì)中還有很多復(fù)雜的流程,例如某些業(yè)務(wù)需要在某個(gè)狀態(tài)節(jié)點(diǎn)由一群人來(lái)審批,這群人審批都通過(guò)了才可以流轉(zhuǎn)到下一個(gè)節(jié)點(diǎn);某些業(yè)務(wù)是由多個(gè)狀態(tài)起始,最后結(jié)束的時(shí)候匯聚到一個(gè)狀態(tài),有點(diǎn)形似Y型流程設(shè)計(jì)。
原文鏈接:http://www.cnblogs.com/lts8989/archive/2012/07/22/2570739.html