錢維平,王 堅(jiān)
(同濟(jì)大學(xué) CIMS 研究中心,上海 201804)
Windows Workflow Foundation(WF)是關(guān)于工作流的架構(gòu),它提供了可視化的界面工具,并且支持在ASP.NET 應(yīng)用程序中直接執(zhí)行工作流[1]。這些優(yōu)點(diǎn)使得開發(fā)者可以在WF 中建模并定義規(guī)則來描述系統(tǒng)的處理過程,從而能夠有效地實(shí)現(xiàn)業(yè)務(wù)的自動(dòng)化處理。
本文以企業(yè)日常工作管理系統(tǒng)為例,以ASP.NET為開發(fā)平臺(tái),通過分析工作業(yè)務(wù)處理過程中所要經(jīng)歷的步驟,然后在WF 工作流的設(shè)計(jì)平臺(tái)下使用工作流模型模擬相關(guān)業(yè)務(wù)的處理過程,從而有效地解決了傳統(tǒng)日常工作管理系統(tǒng)由于流程變化所帶來的許多問題。
本系統(tǒng)采用的是基于MVC 的三層體系架構(gòu)。它將整個(gè)系統(tǒng)業(yè)務(wù)的處理按照Model(模型)、View(視圖)、Controller(控制器)的方式進(jìn)行分離,三個(gè)核心部件處理各自的任務(wù)[2]。MVC 三層體系架構(gòu)設(shè)計(jì)模式如圖1 所示。
圖1 MVC 三層體系架構(gòu)設(shè)計(jì)模式Fig.1 MVC three-layer architecture design pattern
模型封裝了系統(tǒng)數(shù)據(jù)庫(kù)中的字段及相應(yīng)的業(yè)務(wù)規(guī)則和邏輯關(guān)系,并包含了數(shù)據(jù)驗(yàn)證等相關(guān)的業(yè)務(wù)操作。
視圖代表用戶交互界面,如本系統(tǒng)中發(fā)布人發(fā)布工作頁(yè)面等,視圖頁(yè)沒有任何邏輯代碼,用于將用戶動(dòng)作傳遞給控制器,并以可視化界面的形式將相應(yīng)模型中的數(shù)據(jù)顯示出來[3]。
控制器將數(shù)據(jù)發(fā)送給模型,執(zhí)行模型中的操作,最后呈現(xiàn)合適的工作管理系統(tǒng)頁(yè)面。
本系統(tǒng)需建立日常工作數(shù)據(jù)庫(kù)(DailyWork)和持久化服務(wù)數(shù)據(jù)庫(kù)(WorkflowPersistence)。日常工作數(shù)據(jù)庫(kù)(DailyWork)用來存儲(chǔ)和管理系統(tǒng)中的數(shù)據(jù),該數(shù)據(jù)庫(kù)中有總公司日常工作記錄表、子公司日常工作記錄表、企業(yè)信息表以及企業(yè)職員信息表。持久化服務(wù)數(shù)據(jù)庫(kù)保存了未完成的工作流實(shí)例。系統(tǒng)數(shù)據(jù)表詳見表1。
表1 系統(tǒng)數(shù)據(jù)表Tab.1System datasheet
工作流實(shí)例的執(zhí)行按照預(yù)先定義好的規(guī)則進(jìn)行,工作流實(shí)例執(zhí)行時(shí)的環(huán)境由工作流運(yùn)行時(shí)提供[4]。宿主應(yīng)用程序承載工作流運(yùn)行時(shí)類的實(shí)例,并由工作流引擎實(shí)現(xiàn)和管理工作流運(yùn)行。
通信Service 服務(wù)實(shí)現(xiàn)宿主程序與工作流之間的數(shù)據(jù)交換。開發(fā)者也可以設(shè)計(jì)通信信道,并定義接口,使宿主程序與活動(dòng)之間通過事件傳遞參數(shù)的方式進(jìn)行通信并完成數(shù)據(jù)交換。
工作流管理系統(tǒng)[5,6]是一種人機(jī)交互的系統(tǒng)。未完成的工作流實(shí)例不能一直保存在內(nèi)存當(dāng)中,需要進(jìn)行工作流持久化操作。工作流的持久化就是在持久化存儲(chǔ)(如SQL數(shù)據(jù)庫(kù))里,保存工作流的一些狀態(tài)信息,如實(shí)例Id。
WF 中的工作流類型有順序工作流和狀態(tài)機(jī)工作流。順序工作流按照一定的順序和過程執(zhí)行各項(xiàng)定義的活動(dòng)。狀態(tài)機(jī)工作流從初始狀態(tài)開始到終止?fàn)顟B(tài)結(jié)束由宿主應(yīng)用程序觸發(fā)的外部事件驅(qū)動(dòng)。
日常工作管理系統(tǒng)業(yè)務(wù)過程涉及到提交和回退動(dòng)作,且開發(fā)者無法事先知道業(yè)務(wù)的執(zhí)行順序。順序工作流的思想會(huì)將這種業(yè)務(wù)類型的處理變得很復(fù)雜,根據(jù)狀態(tài)機(jī)工作流的思想來建模卻可以高效地完成業(yè)務(wù)的處理[7]:通過在業(yè)務(wù)實(shí)體之間建立若干個(gè)狀態(tài)(其中必須建立一個(gè)起始狀態(tài)和終止?fàn)顟B(tài),分別代表工作流的開始與結(jié)束),每個(gè)狀態(tài)包括多個(gè)活動(dòng)用來對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行處理。在狀態(tài)發(fā)生變化時(shí),通過事件驅(qū)動(dòng)實(shí)現(xiàn)一系列復(fù)雜的操作。
本系統(tǒng)業(yè)務(wù)流程為:安環(huán)處發(fā)布一項(xiàng)工作,責(zé)任人填寫并提交工作,安環(huán)處對(duì)責(zé)任人提交的工作進(jìn)行審核,若審核通過,則流程結(jié)束,若退回責(zé)任人提交的工作,則責(zé)任人需要重新提交工作直到審核通過為止。相關(guān)業(yè)務(wù)流程如圖2 所示。
圖2 日常工作管理業(yè)務(wù)流程Fig.2 Business process of daily work management
在Visual Studio 2010 中,使用“狀態(tài)機(jī)工作流”模板新建WorkPlanWorkflows項(xiàng)目。在項(xiàng)目中新建一個(gè)名為 IDaily-WorkPlan 的 C# 接口,在接口中定義本地服務(wù)公開給工作流的事件和方法[8]。
在工作流設(shè)計(jì)界面添加“PublisherState”、“ResponsiblePersonState”、“DoneWithWorkState”等State 活動(dòng),分別對(duì)應(yīng)發(fā)布人狀態(tài)、責(zé)任人狀態(tài)和工作流結(jié)束三個(gè)狀態(tài)。然后按照業(yè)務(wù)流程向各個(gè)State 狀態(tài)中添加所需要的EventDriven 活動(dòng),并且需要為個(gè)EventDriven 活動(dòng)添加一個(gè)HandleExternalEvent 子活動(dòng),用來將活動(dòng)與IDaily-WorkPlan 接口中的事件綁定起來,并通過各個(gè)Handle-ExternalEvent 活動(dòng)的Invoked 屬性創(chuàng)建相關(guān)的事件。最后,將添加好的狀態(tài)之間的關(guān)系進(jìn)行關(guān)聯(lián),如圖3 所示。
圖3 日常工作計(jì)劃管理業(yè)務(wù)邏輯圖Fig.3 Business logic of daily work management
當(dāng)發(fā)布人發(fā)布一條工作時(shí),PublisherPublishEvent 事件指向ResponsiblePersonState 狀態(tài),責(zé)任人提交工作后,PersonSubmitEvent 事件指向PublisherState 狀態(tài),若發(fā)布人對(duì)工作審核通過,即PublisherPassEvent 事件,則轉(zhuǎn)向DoneWithWorkState 狀態(tài),代表工作流結(jié)束。若對(duì)工作進(jìn)行退回操作,即PublisherRetreatedEvent 事件,則再次返回到ResponsiblePersonState 狀態(tài)。
完成了工作流持久化數(shù)據(jù)庫(kù)的配置及狀態(tài)機(jī)工作流的實(shí)現(xiàn)后,需要實(shí)現(xiàn)MVC 設(shè)計(jì)模式下的ASP.NET Web宿主應(yīng)用程序。
首先,需要在模型中封裝工作計(jì)劃(WorkPlan)類的屬性,并實(shí)現(xiàn)對(duì)日常工作數(shù)據(jù)庫(kù)中數(shù)據(jù)的添加、查詢、更新等操作方法。其次,在控制器中實(shí)現(xiàn)工作流運(yùn)行時(shí)初始化,然后通過工作流類型啟動(dòng)工作流實(shí)例。
安環(huán)處對(duì)應(yīng)的頁(yè)面有“添加工作”、“審核工作”等多個(gè)頁(yè)面。責(zé)任人對(duì)應(yīng)有“填寫工作”,“編輯工作”“提交工作”等頁(yè)面。其中“添加工作”頁(yè)面中的“發(fā)布”按鈕的Click 事件處理程序包含了啟動(dòng)工作流實(shí)例的代碼。責(zé)任人“填寫工作”頁(yè)面的“提交”按鈕的Click 事件會(huì)觸發(fā)工作流的HandleExternal 類型的活動(dòng),未完成的工作流實(shí)例被重新加載后安環(huán)處就可以執(zhí)行審核通過和退回的操作。責(zé)任人填寫工作頁(yè)面如圖4 所示。
圖4 責(zé)任人填寫工作頁(yè)面Fig.4 Page for the responsible to fill out a job
目前該系統(tǒng)在企業(yè)使用,可以解決流程變化和軟件維護(hù)所帶來的很多問題。
本文首先分析了WF 基本工作原理及模型,然后以企業(yè)日常工作管理系統(tǒng)為例,并建立狀態(tài)機(jī)工作流模型,實(shí)現(xiàn)了完整的工作流管理系統(tǒng)。MVC 設(shè)計(jì)模式將模型、視圖、控制器分離,使得軟件層次分明,真正意義上實(shí)現(xiàn)了工作流系統(tǒng)的靈活性和重用率。
[1]Dharma Shukla,Bob Schmidt;周健(譯).WF 本質(zhì)論/(美)[M].北京:機(jī)械工業(yè)出版社,2007.
[2]林舒萍,等.設(shè)計(jì)模式的應(yīng)用研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2005,11.
[3]張麗君,齊建卓,吳宏波.基于MVC 模式的Struts 框架在Web 系統(tǒng)開發(fā)中的應(yīng)用[J].內(nèi)蒙古大學(xué)學(xué)報(bào),2005,1.
[4]Bruce Bukovics;柴曉偉(譯).WF 高級(jí)程序設(shè)計(jì)/(美)[M].北京:人民郵電出版社,2009.
[5]業(yè)寧,張愛珍,董逸生.一種可視化OA 工作流設(shè)計(jì)工具[J].計(jì)算機(jī)應(yīng)用,2003,5.
[6]Holling Sworth D.WorkFlow Manamgement Coalition Specifieation:Terminology&Glossary.Doeument Number WFMC-TC-1011,Brussels,1996.
[7]陳誼,侯堃,新吉樂,等.基于XML 和關(guān)系數(shù)據(jù)庫(kù)的可視化工作流系統(tǒng)[J].系統(tǒng)仿真學(xué)報(bào),2012,1.
[8]楊琦. 工作流技術(shù)在高校教務(wù)管理系統(tǒng)中的應(yīng)用與研究[J].IT 技術(shù)論壇,2008,16.