下面將對目前比較主流的三款工作流進行介紹和比較,然后通過三款流程引擎分別設計一個較典型的流程來給大家分別演示這三款創建流程的過程.這三款工作流程引擎分別是 Windows Workflow Foundation,NetBPM, CCFlow.
NetBPM 與 CCFlow 是兩款國內知名的開源軟件,尤其是ccflow在國內的發展勢頭強勁。
這個典型的流程假設:公司有兩級領導,一級為主管Chief,一級為老板Boss
場景描述:
在某公司中,部門員工休假需要主管Chief的批準。
如果休假天數大于10天,則 在部門主管同意后,還必須老板Boss批準。
如果是部門主管請假則直接提交老板批準。
在休假被批準之前,申請人可以撤銷休假申請。
申請批準后,對休假天數進行修改(也可以是其他業務數據處理)。 每次休假申請結束之 后,不管通過未通過或是否取消,都必須記錄下來。
流程結束時,系統要把請假的結果信息Email給申請人。
對于大于10天的申請,如果部門主管已批準同意而上級主管還未批準,這時申請人撤銷申請后,系統應發Email通知部門主管申請已撤銷。
我們這里只是一個模擬,當然現實生活中情況比這個更加復雜一些;
Windows Workflow Foundation
微軟的工作流產品,提供一套工作流引擎和VS解決方案自帶的流程設計器,但是該流程設計器面對的是程序員而非業務人員,所以界面比較專業,流程運行只能創建控制臺應用程序,沒有流程運行界面,沒有表單庫,如需要表單和界面需要二次開發。
使用WWF創建流程:
1. 啟動VS2010,創建一個順序工作流控制臺的程序。
2. 輸入項目名稱,點擊確定,將自動進入流程設計界面。
3. 自動生成的Workflow1.cs是一個工作流組件。
4. 工具箱中拖放一個IfElse活動組件到設計界面上。
5. 此時就需要較多的編碼工作和表單界面設計工作,如在idelseBranchActivitiy1左側分支,用以判斷請假人是否新申請請假還是取消請假,激活Conditiong屬性,并且添加內部事件EvaluateQingJiaNoValidCode,并激活,在內部輸入邏輯代碼根據數據庫記錄判斷請假是否通過,未通過則取消請假。也可以走另一分支EvaluateQingJiaCode繼續申請新的請假;
6. 拖放parallelActivity1組件在IfElse節點后,用以判斷請假人是否為Chief,設置sequenceActivity1中的codeActivity3屬性的ExecuteCode處理程序為EvaluateChiefNoValidCode,并激活,內部代碼用以判斷不是Chief的情況,另一分支sequenceActivity1中則判斷是Chief的情況;
7.如果不是Chief請假,則需要在EvaluateChiefNoValidCode中進行邏輯判斷和表單的設計,填寫請假申請單, 并拖放IfElse組件,實現其中的codeActivity6代碼用以判斷大于10天的情況。
8.F5即可運行控制臺程序,其中的通過未通過或是否取消的數據需要記錄,需要通過代碼和設計數據庫來實現,發送Email也需要代碼實現,WWF沒有提供該功能。
WWF下設計的流程圖如下:
NetBPM
從JBpm1移植到.NET平臺下的開源工作流項目,二次開發有一定的難度,因為其使用的Castle框架有很多子項目,技術點較多,需要一一熟悉后才能進行流程的二次開發。
使用NetBPM創建工作流過程:
1. 使用NetBPM的難點之一是要理解生成配置文件,提交請假單配置如下:
<?xml version="1.0"?> <!-- NOTE:在定義流程時,建議先畫出流程圖,然后再來定義,這樣思維清晰,也不易于出錯 關于processdefiniton.xml如何定義,請嚴格按照nPdl規定 --> <process-definition> <!-- =================================== --> <!-- == PROCESS DEFINITION PROPERTIES == --> <!-- =================================== --> <name>請假DEMO</name> <description>該流程模擬公司的請假流程, </description> <responsible>ae</responsible> <!-- ====================== --> <!-- == START & ENDSTATE == --> <!-- ====================== --> <start-state name="start leave request"> <description>提交請假單</description> <!-- 定義了role,引擎在該start-state節點執行時,就會把執行者信息賦值給角色對應的屬性“requester” --> <role>requester</role> <!-- 在這里定義start-state的field,它表示該filed相關聯的屬性,并且在該state,它對屬性的訪問權利。 如果需要定義其在web表單上的操作界面,如何進行web表單顯示等,需要在webinterface.xml文件對應節點補充該field --> <field attribute="start date" access="write-only-required" /> <field attribute="end date" access="write-only-required" /> <field attribute="leave days" access="write-only-required" /> <field attribute="comment" access="write-only" /> <transition to="Is Cancel Fork" /> </start-state> <!-- 結束節點除名稱外不要定義其他--> <end-state name="end" /> <!-- ====================== --> <!-- == Actions == --> <!-- ====================== --> <!-- 解釋:這里定義process-definition節點的action,有效的事件類型為:process-instance-start, process-instance-end and process-instance-cancel --> <!-- 此處具體為:在流程結束的時候, 發送E-Mail消息給申請者,記錄請假日志 --> <action event="process-instance-end" handler="NetBpm.Example.LeaveOfAbsence.EmailAction, NetBpm.Example.LeaveOfAbsence" on-exception="log"> <!--定義action參數,供委托類實例化類調用方法時獲取使用。如這里的EmailAction的run方法發送郵件,需要知道發給誰,郵件標題等等,那么 參數可以提供輔助--> <parameter name="to">previousActor</parameter> <parameter name="subject">您提交了請假申請</parameter> <parameter name="message">you requested a holiday from ${start date} to ${end date} with comment ${comment}</parameter> </action> <!-- 此處具體為:在流程結束的時候記錄請假日志, 此處Log模擬 注意:每個節點可以定義多個action --> <action event="process-instance-end" handler="NetBpm.Example.LeaveOfAbsence.LogLeaveInfoAction, NetBpm.Example.LeaveOfAbsence" on-exception="log"> <parameter name="LogInfo">記錄請假日志? :) </parameter> </action> <!-- ================ --> <!-- == ATTRIBUTES == --> <!-- ================ --> <!-- 解釋:定義屬性值及其序列化方式。屬性值一般包括3類 --> <!-- one:角色對應的屬性 --> <attribute name="requester" type="actor" /> <attribute name="chief" type="actor" /> <attribute name="boss" type="actor" /> <!-- two:所有acitivity-state(包括start-state)處需要更新的屬性,和用戶表單內容對應 --> <attribute name="start date" type="date" /> <attribute name="end date" type="date" /> <attribute name="leave days" type="integer" /> <attribute name="comment" type="text" initial-value="請假理由或者備注" /> <attribute name="Chief evaluation result" type="evaluation" /> <attribute name="Boss evaluation result" type="evaluation" /> </concurrent-block> </process-definition>
2. 其它配置文件代碼太長就不一一貼出來;
3. 定義委托類:委托類包含在lib文件夾下的程序集中。
因為委托類數目眾多,這里僅貼出幾個典型的委托類:
1. NetBpm.Example.LeaveOfAbsence.AutoSetAttributionsAction:該委托類設計為一個通用委托類,這里用來設置表識屬性,如流程經過用戶取消請假路徑,則把RunTrace屬性設置為requestercancel,供WhichWayDicision作判斷用。
2. NetBpm.Example.LeaveOfAbsence.AnyOneJoin: 該委托主要用來設置激活父flow機制,這里是只要任何一條路徑到達了join,則激活父flow,流程往下流。
3. NetBpm.Example.LeaveOfAbsence.WhichWayDecision:該委托根據流程實際流過路徑,根據標識屬性RunTrace等進行走哪條邊的抉擇。
4. 本文僅僅是一個示例,給大家提供一個運用nPdl定義NetBPM流程的參考,如果要把該流程投入現實中使用顯然還需要做很多優化。其中的代碼量還是很大的。
NetBPM下設計的流程圖如下:
CC Flow
ccflow是一款國產開源工作流。支持SQLServer、Oracle、Access、MySQL數據庫,支持群集計算、支持多國語言。流程設計、表單設計都是可視化的,所見即所得。 ccflow提供了強大的數據分析功能:流程運行的各種報表、圖形、挖掘、賺取,可以對實(時)效性、成本分析(人力、時間、財物),進行全方位的分析、監控。 Ccflow更可與手機+手機短信+短信貓+電子郵件無縫連接,讓您的工作第一時間溝通,第一時間處理。
使用CC Flow創建工作流過程:
1. 在web容器中安裝好程序后,打開流程設計器,建立請假流程,即可生成填寫請假單和結束節點;
2. 拖動Chief審批節點、 Boss審批節點,添加連線以及標簽注明;
3. 設置表單:郵件選擇傻瓜型表單或者自由類型表單,設置表單后,設置每個節點的工作崗位;
4. 設置流程跳轉方向條件,如判斷情人是誰,判斷請假天數等,選擇的數據來源自表單數據。
5. 點擊運行即可運行流程;可打開windows service,即可使用自帶的消息提醒以及郵件發送功能;
CC Flow設計的流程圖如下:
綜上所述,三款的工作流區別如下表:
文章列表