王舒揚(yáng),柳虹亮
(長(zhǎng)春工業(yè)大學(xué) 軟件職業(yè)技術(shù)學(xué)院,吉林 長(zhǎng)春 130022)
工作流管理技術(shù)是一種快速發(fā)展的技術(shù),正在被越來(lái)越多的企業(yè)所應(yīng)用。企業(yè)的日常活動(dòng)中,約有70%是屬于流程類(lèi)活動(dòng),如訂單出貨流程、生產(chǎn)流程、企業(yè)內(nèi)各類(lèi)申請(qǐng)表單、公文簽審、信息傳遞與簽收、公司各類(lèi)支出與收付等[1]。設(shè)備管理(包括設(shè)備采購(gòu)的審批、設(shè)備維修等)也屬于流程類(lèi)活動(dòng)[2]。但與普通流程類(lèi)活動(dòng)相比,設(shè)備管理具有用戶層面廣泛、一次性購(gòu)買(mǎi)量大、審批周期長(zhǎng)、生命周期內(nèi)維護(hù)頻繁等特點(diǎn)[3]。對(duì)大型企業(yè)來(lái)說(shuō),類(lèi)似電腦等設(shè)備的審批周期(包括招標(biāo)、采購(gòu)到最終投入使用)可長(zhǎng)達(dá)2~3個(gè)月左右,生命周期更是長(zhǎng)達(dá)4~6a,期間持續(xù)增加的數(shù)據(jù)量會(huì)對(duì)工作流系統(tǒng)造成很大的壓力[4]。
OSWorkflow是完全用Java語(yǔ)言編寫(xiě)的開(kāi)放源代碼的工作流引擎,具有顯著的靈活性及完全面向有技術(shù)背景用戶的特點(diǎn)[5]。用戶可以根據(jù)自身的需求,利用這款開(kāi)源軟件設(shè)計(jì)簡(jiǎn)單或是復(fù)雜的工作流。通過(guò)使用,用戶就可以把工作中心放在業(yè)務(wù)和規(guī)則的定義上,而不需通過(guò)硬編碼的方式實(shí)現(xiàn)一個(gè)Petri網(wǎng)或是一個(gè)有窮自動(dòng)機(jī)[6]。用戶可以最小代價(jià)把OSWorkflow整合到自己的程序中來(lái)。
文中設(shè)計(jì)實(shí)現(xiàn)了一個(gè)基于OSWorkflow的設(shè)備管理系統(tǒng),并解決了采用Oracle數(shù)據(jù)庫(kù)時(shí)大量數(shù)據(jù)查詢等關(guān)鍵問(wèn)題。
OSWorkflow是三大主流開(kāi)源工作流引擎之一,它基于FSM(有限狀態(tài)自動(dòng)機(jī),F(xiàn)initeState Machine)理論[7]。每一個(gè)state都是由step 和status聯(lián)合體現(xiàn)出來(lái)的,一個(gè)state到另一個(gè)state的狀態(tài)躍遷transition依賴(lài)于action的執(zhí)行,在action執(zhí)行前需要判斷動(dòng)作的執(zhí)行條件是否滿足,在動(dòng)作執(zhí)行改變狀態(tài)前后都可以調(diào)用function來(lái)執(zhí)行一些其它操作,動(dòng)作執(zhí)行完成后通過(guò)判定條件來(lái)確定執(zhí)行結(jié)果result[8]。每一個(gè)流程都至少有一個(gè)或者多個(gè)活動(dòng)的state,流程中至少有一個(gè)起始狀態(tài),一個(gè)或者多個(gè)終止?fàn)顟B(tài)。OSWorkflow的基本元素及其相互關(guān)系如圖1所示。

圖1 OSWorkflow基本元素關(guān)系圖
基于OSWorkflow的設(shè)備管理系統(tǒng)采用J2EE技術(shù)、Spring框架和Oracle數(shù)據(jù)庫(kù)設(shè)計(jì)并實(shí)現(xiàn),主要分為如下幾個(gè)模塊。
對(duì)系統(tǒng)內(nèi)的用戶基本信息進(jìn)行增、刪、改、查操作,或?qū)τ脩舻牟僮鳈?quán)限及所屬部門(mén)進(jìn)行變更。
對(duì)用戶的角色信息進(jìn)行增、刪、改、查操作。
對(duì)用戶所屬的組織信息進(jìn)行增、刪、改、查操作。
對(duì)設(shè)備申請(qǐng)流程生成的設(shè)備采購(gòu)明細(xì)進(jìn)行采購(gòu)。
針對(duì)已經(jīng)建賬的計(jì)算機(jī)設(shè)備,由財(cái)務(wù)人員進(jìn)行固定資產(chǎn)卡片的財(cái)務(wù)信息填報(bào)。
設(shè)備管理系統(tǒng)的核心。一個(gè)完整的設(shè)備申請(qǐng)流程如下:
1)由“部門(mén)提報(bào)用戶”填報(bào)需要的計(jì)算機(jī)設(shè)備申請(qǐng)單,申請(qǐng)單上的內(nèi)容為提報(bào)部門(mén)、提報(bào)人、提報(bào)計(jì)算機(jī)設(shè)備的類(lèi)型、提報(bào)理由。個(gè)人申請(qǐng)結(jié)束承接2)。
2)由“部門(mén)管理用戶”進(jìn)行審批,結(jié)果為同意/不同意,同時(shí)輸入詳細(xì)的審批意見(jiàn)。如果不同意則申請(qǐng)流程結(jié)束;如果同意則進(jìn)入3)。
3)由“設(shè)備管理用戶”進(jìn)行初審,結(jié)果為同意/不同意,同時(shí)輸入詳細(xì)的審批意見(jiàn)。如果不同意則有兩種情況:申請(qǐng)流程結(jié)束,或準(zhǔn)備進(jìn)行設(shè)備在庫(kù)分配,進(jìn)入設(shè)備分配流程;如果同意則進(jìn)入4)。
4)由“設(shè)備管理領(lǐng)導(dǎo)用戶”進(jìn)行復(fù)審,結(jié)果為同意/不同意,同時(shí)輸入詳細(xì)的審批意見(jiàn)。如果不同意則申請(qǐng)流程結(jié)束;如果同意則進(jìn)入5)。
5)由計(jì)算機(jī)設(shè)備申請(qǐng)人所在部門(mén)的“分管領(lǐng)導(dǎo)用戶”進(jìn)行審批,結(jié)果為同意/不同意,同時(shí)輸入詳細(xì)的審批意見(jiàn)。如果不同意則申請(qǐng)流程結(jié)束;如果同意則進(jìn)入6)。
6)由“項(xiàng)目管理用戶”進(jìn)行計(jì)算機(jī)設(shè)備詳細(xì)配置清單的填報(bào),然后由“項(xiàng)目管理領(lǐng)導(dǎo)用戶”對(duì)配置清單進(jìn)行審核,如果不同意則返回“項(xiàng)目管理用戶”進(jìn)行重新配置;如果同意則申請(qǐng)流程結(jié)束。
7)“設(shè)備管理用戶”可以根據(jù)申請(qǐng)?jiān)O(shè)備清單進(jìn)行選擇是否招標(biāo)采購(gòu),如果“設(shè)備管理領(lǐng)導(dǎo)用戶”同意招標(biāo)采購(gòu),則生成招標(biāo)申請(qǐng)書(shū)。
8)保存完整的計(jì)算機(jī)設(shè)備申請(qǐng)的記錄。
此模塊采用了OSWorkflow技術(shù),具體流程如圖2所示。

圖2 申請(qǐng)模塊流程
設(shè)備管理系統(tǒng)主要有以下關(guān)鍵問(wèn)題需要解決:一是過(guò)長(zhǎng)的申請(qǐng)審批流程造成的大量數(shù)據(jù)查詢失敗;二是OSWorkflow僅負(fù)責(zé)流程的運(yùn)轉(zhuǎn),對(duì)流程流轉(zhuǎn)中產(chǎn)生的數(shù)據(jù),例如審批意見(jiàn)的保存需要做額外的操作。
為了確保工作流程的正確性,OSWorkflow并沒(méi)有采用直接連接數(shù)據(jù)庫(kù)使用sql語(yǔ)句進(jìn)行流程數(shù)據(jù)處理的方式,而是使用 WorkflowExpressionQuery對(duì)象對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。一個(gè)工作流查詢語(yǔ)句的處理流程如下:
1)使用FieldExpression對(duì)象對(duì)可操作項(xiàng)進(jìn)行映射。FieldExpression繼承了Expression類(lèi),將工作流表中的字段以及基本操作映射為int型常量,例如public final static int ACTION=4。
2)使用NestedExpression對(duì)象創(chuàng)建復(fù)合表達(dá)式。NestedExpression同樣繼承了Expression類(lèi),其構(gòu)造函數(shù)需要兩個(gè)參數(shù)。一是Expression數(shù)組對(duì)象,對(duì)象中的每個(gè)元素可以是另外一個(gè)NestedExpression對(duì)象,以此形成復(fù)合關(guān)系,也可是由FieldExpression具體實(shí)現(xiàn)的單獨(dú)的表達(dá)式。二是表示各個(gè)Expression表達(dá)式之間“和”與“或”關(guān)系的操作符expressionOperator。
3)使用 WorkflowExpressionQuery創(chuàng)建工作流查詢對(duì)象。WorkflowExpressionQuery以NestedExpression對(duì)象作為參數(shù)構(gòu)建,還定義了表示排序的常量,例如public static final int SORT_DESC=-1。
4)調(diào)用AbstractWorkflow類(lèi)中的getPersistence方法獲取 WorkflowStore實(shí)例。將 WorkflowExpressionQuery對(duì)象作為參數(shù)傳遞,在WorkflowStore接口的具體實(shí)現(xiàn)類(lèi)JDBCWorkflowStore的query方法中對(duì)其進(jìn)行解析并完成sql語(yǔ)句的創(chuàng)建。
5)將創(chuàng)建好的sql語(yǔ)句作為參數(shù)傳入doExpressionQuery方法中執(zhí)行,從結(jié)果中取出id列放入List對(duì)象中,將List對(duì)象返回,以返回的id為條件即可與業(yè)務(wù)表中的設(shè)備數(shù)據(jù)進(jìn)行關(guān)聯(lián)查詢。
因?yàn)閺脑O(shè)備申報(bào)到審批完成進(jìn)入購(gòu)買(mǎi)環(huán)節(jié)的時(shí)間很長(zhǎng),且購(gòu)買(mǎi)數(shù)量為公司規(guī)模,數(shù)據(jù)庫(kù)內(nèi)可能存在大量未完成的工作流流程數(shù)據(jù)。在最終返回的List結(jié)果中可能包含超過(guò)1 000條流程id數(shù)據(jù),而Oracle不支持IN子句中List的個(gè)數(shù)超過(guò)1000,從而導(dǎo)致查詢失敗。為解決這個(gè)問(wèn)題,在OSWorkflow中新增一個(gè)數(shù)據(jù)庫(kù)表OS_QUERYENTRY,建立JDBCWorkflowStore類(lèi)的子類(lèi)并重寫(xiě)其中的doExpressionQuery方法,將原來(lái)放入List中的id寫(xiě)入到新增的表OS_QUERYENTRY中。具體步驟如下:
1)組合語(yǔ)句,將結(jié)果插入到OS_QUERYENTRY表中。


2)查詢序號(hào)。

3)刪除冗余查詢數(shù)據(jù)。

新增表后的OSWorkflow數(shù)據(jù)庫(kù)結(jié)構(gòu)如圖3所示。

圖3 OSWorkflow數(shù)據(jù)庫(kù)結(jié)構(gòu)
實(shí)際應(yīng)用中一個(gè)典型查詢過(guò)程如下:1)準(zhǔn)備查詢條件集合對(duì)象。

2)根據(jù)頁(yè)面選擇條件匹配查詢條件。


3)裝配查詢條件。

最終查詢效果如圖4所示。
在OSWorkflow中,函數(shù)function是用來(lái)定義(引用)并執(zhí)行外部的商業(yè)邏輯和服務(wù),實(shí)現(xiàn)OSWorkflow與外部具體的應(yīng)用之間交互[9]。系統(tǒng)需要保存設(shè)備審批過(guò)程中的審批意見(jiàn),只要擴(kuò)展function接口就可以。function有兩種類(lèi)型:pre function(預(yù)處理函數(shù))和post function(后處理函數(shù))。pre function在工作流的一個(gè)轉(zhuǎn)變操作執(zhí)行之前調(diào)用,post function在工作流的一個(gè)轉(zhuǎn)變操作執(zhí)行完之后調(diào)用[10]。審批意見(jiàn)的保存應(yīng)在流程流轉(zhuǎn)后,因此,采用post function方式處理。同時(shí),因?yàn)榱鞒踢\(yùn)轉(zhuǎn)周期長(zhǎng)度不定,審批意見(jiàn)應(yīng)該依附于當(dāng)前環(huán)節(jié)的審批動(dòng)作(action),而不應(yīng)該依附于整個(gè)當(dāng)前審批環(huán)節(jié)(step),function在action級(jí)別的應(yīng)用如圖5所示。

圖4 系統(tǒng)查詢效果

圖5 function在action級(jí)別的應(yīng)用
具體實(shí)現(xiàn)代碼如下:


針對(duì)設(shè)備管理流程用戶層面廣泛、一次性購(gòu)買(mǎi)量大、審批周期長(zhǎng)、生命周期內(nèi)維護(hù)頻繁等特點(diǎn),采用OSWorkflow作為工作流引擎,在此基礎(chǔ)上設(shè)計(jì)了某電力公司設(shè)備管理系統(tǒng),并解決了Oracle數(shù)據(jù)庫(kù)平臺(tái)下大量數(shù)據(jù)查詢等問(wèn)題。實(shí)際應(yīng)用結(jié)果表明,文中設(shè)計(jì)的設(shè)備管理系統(tǒng)滿足企業(yè)要求,簡(jiǎn)化了設(shè)備申報(bào)流程,大大提高了企業(yè)的工作效率。
[1]范玉順.工作流管理技術(shù)基礎(chǔ)[M].北京:清華大學(xué)出版社,2001.
[2]史美林,楊光信,向勇,等.WFMS:工作流管理系統(tǒng)[J].計(jì)算機(jī)學(xué)報(bào),1999(3):326-328.
[3]李紅巖.基于工作流技術(shù)的OA系統(tǒng)研究[J].長(zhǎng)春工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2008,29(3):352-355.
[4]黃世秀,高飛,胡小華.基于工作流的電子政務(wù)系統(tǒng)[J].合肥工業(yè)大學(xué)學(xué)報(bào),2004,27(2):140-143.
[5]夏冬,白樹(shù)仁,鄧惠建.基于J2EE的工作流管理系統(tǒng)模型[J].計(jì)算機(jī)工程與科學(xué),2006,28(3):123-125.
[6]侯秀萍,邵春明,鄭虹.基于工作流網(wǎng)的過(guò)程模型的合理性分析[J].長(zhǎng)春工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2006,27(2):162-164.
[7]陳傳波,劉黎志.一個(gè)基于 Web的工作流引擎及其實(shí)現(xiàn)[J].計(jì)算機(jī)工程與科學(xué),2004,26(11):18-22.
[8]李宏初,馮艷蕾.基于P2P的工作流管理系統(tǒng)研究與應(yīng)用[J].長(zhǎng)春工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2007,28(4):435-437.
[9]黃麗梅,李佳林,李瑞然.子流程技術(shù)在工作流設(shè)計(jì)中的應(yīng)用[J].長(zhǎng)春工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2010,31(1):62-65.
[10]唐文忠.基于工作流技術(shù)的構(gòu)件模型研究[J].計(jì)算機(jī)應(yīng)用研究,2008,25(7):2057-2059.