下面將對(duì)目前比較主流的三款工作流進(jìn)行介紹和比較,然后通過(guò)三款流程引擎分別設(shè)計(jì)一個(gè)較典型的流程來(lái)給大家分別演示這三款創(chuàng)建流程的過(guò)程.這三款工作流程引擎分別是 Windows Workflow Foundation,NetBPM, CCFlow.
NetBPM 與 CCFlow 是兩款國(guó)內(nèi)知名的開(kāi)源軟件,尤其是ccflow在國(guó)內(nèi)的發(fā)展勢(shì)頭強(qiáng)勁。
這個(gè)典型的流程假設(shè):公司有兩級(jí)領(lǐng)導(dǎo),一級(jí)為主管Chief,一級(jí)為老板Boss
場(chǎng)景描述:
在某公司中,部門員工休假需要主管Chief的批準(zhǔn)。
如果休假天數(shù)大于10天,則 在部門主管同意后,還必須老板Boss批準(zhǔn)。
如果是部門主管請(qǐng)假則直接提交老板批準(zhǔn)。
在休假被批準(zhǔn)之前,申請(qǐng)人可以撤銷休假申請(qǐng)。
申請(qǐng)批準(zhǔn)后,對(duì)休假天數(shù)進(jìn)行修改(也可以是其他業(yè)務(wù)數(shù)據(jù)處理)。 每次休假申請(qǐng)結(jié)束之 后,不管通過(guò)未通過(guò)或是否取消,都必須記錄下來(lái)。
流程結(jié)束時(shí),系統(tǒng)要把請(qǐng)假的結(jié)果信息Email給申請(qǐng)人。
對(duì)于大于10天的申請(qǐng),如果部門主管已批準(zhǔn)同意而上級(jí)主管還未批準(zhǔn),這時(shí)申請(qǐng)人撤銷申請(qǐng)后,系統(tǒng)應(yīng)發(fā)Email通知部門主管申請(qǐng)已撤銷。
我們這里只是一個(gè)模擬,當(dāng)然現(xiàn)實(shí)生活中情況比這個(gè)更加復(fù)雜一些;
Windows Workflow Foundation
微軟的工作流產(chǎn)品,提供一套工作流引擎和VS解決方案自帶的流程設(shè)計(jì)器,但是該流程設(shè)計(jì)器面對(duì)的是程序員而非業(yè)務(wù)人員,所以界面比較專業(yè),流程運(yùn)行只能創(chuàng)建控制臺(tái)應(yīng)用程序,沒(méi)有流程運(yùn)行界面,沒(méi)有表單庫(kù),如需要表單和界面需要二次開(kāi)發(fā)。
使用WWF創(chuàng)建流程:
1. 啟動(dòng)VS2010,創(chuàng)建一個(gè)順序工作流控制臺(tái)的程序。
2. 輸入項(xiàng)目名稱,點(diǎn)擊確定,將自動(dòng)進(jìn)入流程設(shè)計(jì)界面。
3. 自動(dòng)生成的Workflow1.cs是一個(gè)工作流組件。
4. 工具箱中拖放一個(gè)IfElse活動(dòng)組件到設(shè)計(jì)界面上。
5. 此時(shí)就需要較多的編碼工作和表單界面設(shè)計(jì)工作,如在idelseBranchActivitiy1左側(cè)分支,用以判斷請(qǐng)假人是否新申請(qǐng)請(qǐng)假還是取消請(qǐng)假,激活Conditiong屬性,并且添加內(nèi)部事件EvaluateQingJiaNoValidCode,并激活,在內(nèi)部輸入邏輯代碼根據(jù)數(shù)據(jù)庫(kù)記錄判斷請(qǐng)假是否通過(guò),未通過(guò)則取消請(qǐng)假。也可以走另一分支EvaluateQingJiaCode繼續(xù)申請(qǐng)新的請(qǐng)假;
6. 拖放parallelActivity1組件在IfElse節(jié)點(diǎn)后,用以判斷請(qǐng)假人是否為Chief,設(shè)置sequenceActivity1中的codeActivity3屬性的ExecuteCode處理程序?yàn)镋valuateChiefNoValidCode,并激活,內(nèi)部代碼用以判斷不是Chief的情況,另一分支sequenceActivity1中則判斷是Chief的情況;
7.如果不是Chief請(qǐng)假,則需要在EvaluateChiefNoValidCode中進(jìn)行邏輯判斷和表單的設(shè)計(jì),填寫請(qǐng)假申請(qǐng)單, 并拖放IfElse組件,實(shí)現(xiàn)其中的codeActivity6代碼用以判斷大于10天的情況。
8.F5即可運(yùn)行控制臺(tái)程序,其中的通過(guò)未通過(guò)或是否取消的數(shù)據(jù)需要記錄,需要通過(guò)代碼和設(shè)計(jì)數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn),發(fā)送Email也需要代碼實(shí)現(xiàn),WWF沒(méi)有提供該功能。
WWF下設(shè)計(jì)的流程圖如下:
NetBPM
從JBpm1移植到.NET平臺(tái)下的開(kāi)源工作流項(xiàng)目,二次開(kāi)發(fā)有一定的難度,因?yàn)槠涫褂玫腃astle框架有很多子項(xiàng)目,技術(shù)點(diǎn)較多,需要一一熟悉后才能進(jìn)行流程的二次開(kāi)發(fā)。
使用NetBPM創(chuàng)建工作流過(guò)程:
1. 使用NetBPM的難點(diǎn)之一是要理解生成配置文件,提交請(qǐng)假單配置如下:
09 | < name >請(qǐng)假DEMO</ name > |
10 | < description >該流程模擬公司的請(qǐng)假流程, </ description > |
11 | < responsible >ae</ responsible > |
16 | < start-state name = "start leave request" > |
17 | < description >提交請(qǐng)假單</ description > |
19 | < role >requester</ role > |
22 | < field attribute = "start date" access = "write-only-required" /> |
23 | < field attribute = "end date" access = "write-only-required" /> |
24 | < field attribute = "leave days" access = "write-only-required" /> |
25 | < field attribute = "comment" access = "write-only" /> |
26 | < transition to = "Is Cancel Fork" /> |
30 | < end-state name = "end" /> |
39 | < action event = "process-instance-end" |
40 | handler = "NetBpm.Example.LeaveOfAbsence.EmailAction, NetBpm.Example.LeaveOfAbsence" on-exception = "log" > |
43 | < parameter name = "to" >previousActor</ parameter > |
44 | < parameter name = "subject" >您提交了請(qǐng)假申請(qǐng)</ parameter > |
45 | < parameter name = "message" >you requested a holiday from ${start date} to ${end date} with comment ${comment}</ parameter > |
48 | < action event = "process-instance-end" |
49 | handler = "NetBpm.Example.LeaveOfAbsence.LogLeaveInfoAction, NetBpm.Example.LeaveOfAbsence" on-exception = "log" > |
50 | < parameter name = "LogInfo" >記錄請(qǐng)假日志? :) </ parameter > |
58 | < attribute name = "requester" type = "actor" /> |
59 | < attribute name = "chief" type = "actor" /> |
60 | < attribute name = "boss" type = "actor" /> |
63 | < attribute name = "start date" type = "date" /> |
64 | < attribute name = "end date" type = "date" /> |
65 | < attribute name = "leave days" type = "integer" /> |
66 | < attribute name = "comment" type = "text" initial-value = "請(qǐng)假理由或者備注" /> |
67 | < attribute name = "Chief evaluation result" type = "evaluation" /> |
68 | < attribute name = "Boss evaluation result" type = "evaluation" /> |
2. 其它配置文件代碼太長(zhǎng)就不一一貼出來(lái);
3. 定義委托類:委托類包含在lib文件夾下的程序集中。
因?yàn)槲蓄悢?shù)目眾多,這里僅貼出幾個(gè)典型的委托類:
1. NetBpm.Example.LeaveOfAbsence.AutoSetAttributionsAction:該委托類設(shè)計(jì)為一個(gè)通用委托類,這里用來(lái)設(shè)置表識(shí)屬性,如流程經(jīng)過(guò)用戶取消請(qǐng)假路徑,則把RunTrace屬性設(shè)置為requestercancel,供WhichWayDicision作判斷用。
2. NetBpm.Example.LeaveOfAbsence.AnyOneJoin: 該委托主要用來(lái)設(shè)置激活父flow機(jī)制,這里是只要任何一條路徑到達(dá)了join,則激活父flow,流程往下流。
3. NetBpm.Example.LeaveOfAbsence.WhichWayDecision:該委托根據(jù)流程實(shí)際流過(guò)路徑,根據(jù)標(biāo)識(shí)屬性RunTrace等進(jìn)行走哪條邊的抉擇。
4. 本文僅僅是一個(gè)示例,給大家提供一個(gè)運(yùn)用nPdl定義NetBPM流程的參考,如果要把該流程投入現(xiàn)實(shí)中使用顯然還需要做很多優(yōu)化。其中的代碼量還是很大的。
NetBPM下設(shè)計(jì)的流程圖如下:
CC Flow
ccflow是一款國(guó)產(chǎn)開(kāi)源工作流。支持SQLServer、Oracle、Access、MySQL數(shù)據(jù)庫(kù),支持群集計(jì)算、支持多國(guó)語(yǔ)言。流程設(shè)計(jì)、表單設(shè)計(jì)都是可視化的,所見(jiàn)即所得。 ccflow提供了強(qiáng)大的數(shù)據(jù)分析功能:流程運(yùn)行的各種報(bào)表、圖形、挖掘、賺取,可以對(duì)實(shí)(時(shí))效性、成本分析(人力、時(shí)間、財(cái)物),進(jìn)行全方位的分析、監(jiān)控。 Ccflow更可與手機(jī)+手機(jī)短信+短信貓+電子郵件無(wú)縫連接,讓您的工作第一時(shí)間溝通,第一時(shí)間處理。
使用CC Flow創(chuàng)建工作流過(guò)程:
1. 在web容器中安裝好程序后,打開(kāi)流程設(shè)計(jì)器,建立請(qǐng)假流程,即可生成填寫請(qǐng)假單和結(jié)束節(jié)點(diǎn);
2. 拖動(dòng)Chief審批節(jié)點(diǎn)、 Boss審批節(jié)點(diǎn),添加連線以及標(biāo)簽注明;
3. 設(shè)置表單:郵件選擇傻瓜型表單或者自由類型表單,設(shè)置表單后,設(shè)置每個(gè)節(jié)點(diǎn)的工作崗位;
4. 設(shè)置流程跳轉(zhuǎn)方向條件,如判斷情人是誰(shuí),判斷請(qǐng)假天數(shù)等,選擇的數(shù)據(jù)來(lái)源自表單數(shù)據(jù)。
5. 點(diǎn)擊運(yùn)行即可運(yùn)行流程;可打開(kāi)windows service,即可使用自帶的消息提醒以及郵件發(fā)送功能;
CC Flow設(shè)計(jì)的流程圖如下:
綜上所述,三款的工作流區(qū)別如下表:
本文相關(guān)軟件鏈接:
CCFlow: http://www.oschina.net/p/ccflow 使用中的問(wèn)題可與 @ccflow 聯(lián)系
NetBPM: http://www.oschina.net/p/netbpm
jBPM: http://www.oschina.net/p/jbpm
WWF: http://msdn.microsoft.com/zh-cn/library/aa480214.aspx