SV全開源工作流設(shè)計(jì)器
介紹
SV工作流分為工作流設(shè)計(jì)器和工作流引擎兩大組成部分。都是基于Visual Studio 2012 + FramWork4.5進(jìn)行開發(fā)完成的。其中工作流設(shè)計(jì)器是基于Silverlight5 開發(fā)的全可視化操作模式。工作流引擎則是基于C#語言開發(fā)完成的獨(dú)立引擎類庫。結(jié)合asp.net MVC4框架,更好的完成了整個(gè)工作流的設(shè)計(jì)和使用。以下將詳細(xì)介紹工作流設(shè)計(jì)器及引擎的工作原理及使用情況。
概況
市面上已經(jīng)有很多成型的,而且功能很強(qiáng)大的工作流設(shè)計(jì)器,很多都是基于腳本或者插件來完成相應(yīng)的設(shè)計(jì)操作。作者本人也試用過一些工作流設(shè)計(jì)器,幾乎都對運(yùn)行環(huán)境有著挺苛刻的要求,這個(gè)對使用者來說,無疑是個(gè)噩夢,因?yàn)椴煌臑g覽器或者不同的PC,環(huán)境都會(huì)有所不一樣,光是要顯示完整的設(shè)計(jì)器頁面,就要做很多的設(shè)置或安裝一些未經(jīng)認(rèn)證的插件。所以作者選擇了微軟的Silverlight。類似于flash,只需安裝一次Silverlight運(yùn)行時(shí)即可。并且是幾乎所有瀏覽器都可運(yùn)行,大大簡化了用戶的使用要求。
原理
整個(gè)工作流是基于活動(dòng)節(jié)點(diǎn)和路由設(shè)置來組成的。節(jié)點(diǎn)之間的流轉(zhuǎn)是根據(jù)路由的設(shè)置來實(shí)現(xiàn)邏輯流轉(zhuǎn)的;節(jié)點(diǎn)與路由的數(shù)據(jù)是通過工作流的變量來定義的。
這里也可以倒過來理解,就是先創(chuàng)建一個(gè)工作流,然后定義工作流里用到的變量,通過活動(dòng)節(jié)點(diǎn)的設(shè)置,來控制每個(gè)節(jié)點(diǎn)的可用變量。在引擎進(jìn)行節(jié)點(diǎn)推進(jìn)的時(shí)候,根據(jù)判斷路由設(shè)置的變量值來選擇推進(jìn)到的下個(gè)活動(dòng)節(jié)點(diǎn)。這個(gè)我們稍后將以一個(gè)實(shí)例來進(jìn)行演示說明,這里先說明工作原理。
工作流的活動(dòng)節(jié)點(diǎn)是基于系統(tǒng)角色的。作者拋棄了以往綁定到人的觀點(diǎn),因?yàn)楦鱾€(gè)企業(yè)或單位,基礎(chǔ)職務(wù)是基本固定的,變動(dòng)的只是人,而我們講的系統(tǒng)角色,又可以包含多個(gè)職務(wù),這樣無論人員的職務(wù)如何變化,都不會(huì)影響流轉(zhuǎn)的邏輯。這樣就可以大大降低工作流的維護(hù)工作。這里要做的,就是把系統(tǒng)角色與職務(wù)的關(guān)系做好就行,當(dāng)然這個(gè)是需要我們費(fèi)些心細(xì)和工作量的,對我們的工作流而言,這個(gè)必須要有,但我們這里不講這個(gè),因?yàn)檫@個(gè)涉及到整個(gè)系統(tǒng)的基礎(chǔ),而且有很多的實(shí)現(xiàn)方法,并且各不相同。
工作流設(shè)計(jì)器的主界面如下:
設(shè)計(jì)工作流的參考圖如下:
使用
我們打開工作流設(shè)計(jì)器,會(huì)看到以下界面:
包括六個(gè)功能按鈕,和一個(gè)空的設(shè)計(jì)界面。我們可以通過點(diǎn)擊“新建工作流”或“打開工作流”來載入工作流的內(nèi)容。這里,假設(shè)我們要建立一個(gè)請假的流程,其中涉及兩個(gè)活動(dòng)節(jié)點(diǎn),一個(gè)是請假人填寫的請假單數(shù)據(jù)節(jié)點(diǎn),一個(gè)是對請假單進(jìn)行審核的節(jié)點(diǎn)。我們點(diǎn)擊“新建工作流”,將出現(xiàn)以下界面:
設(shè)置頁面中出現(xiàn)了一個(gè)綠色和紅色的節(jié)點(diǎn),我們稱綠色的節(jié)點(diǎn)為開始節(jié)點(diǎn),紅色的節(jié)點(diǎn)為結(jié)束節(jié)點(diǎn),所有的工作流都會(huì)包含此兩個(gè)節(jié)點(diǎn),一切工作都是從開始節(jié)點(diǎn)開始,從結(jié)束節(jié)點(diǎn)結(jié)束。開始節(jié)點(diǎn)中的灰色小點(diǎn)為拖拽點(diǎn),通過拖拽進(jìn)行路由設(shè)置的創(chuàng)建。
一個(gè)還沒有活動(dòng)節(jié)點(diǎn)的工作流已經(jīng)創(chuàng)建完畢,接下來我們要做的就是對工作流里涉及的變量進(jìn)行定義,我們要?jiǎng)?chuàng)建的是一個(gè)請假的流程,涉及的數(shù)據(jù)就應(yīng)該有:請假人、請假事由、請假起始日期、請假結(jié)束日期和審核情況。鼠標(biāo)移到設(shè)計(jì)器內(nèi)的空白處,點(diǎn)擊鼠標(biāo)右鍵,將彈出工作流的設(shè)置頁面如下:
這里我們可以設(shè)置此工作流的名稱及說明,還有定義工作流里涉及到的各個(gè)變量,變量的類型包括:單行字符類型、多行字符類型、 Html 格式字符型、整數(shù)型、數(shù)值型、日期型、日期時(shí)間型、選擇型。
針對我們的請假單,我們創(chuàng)建以下變量:請假人(單行字符類型)、請假事由(多行字符類型)、請假起始日期(日期型)、請假結(jié)束日期(日期型)、是否允許(選擇型)、審核說明(多行字符類型)。其中除了審核說明,其他的變量都是不允許為空,當(dāng)變量類型為選擇型的時(shí)候,我們還要點(diǎn)擊后面的“…”按鈕,進(jìn)行選擇內(nèi)容的設(shè)置,是否允許變量,我們設(shè)置了兩個(gè)選項(xiàng),一個(gè)是允許,一個(gè)是不允許。變量列表中的變量順序,是可以隨便調(diào)整的,此變量的順序,將會(huì)影響到用戶在填寫表單的時(shí)候的字段排序。如下圖:
點(diǎn)擊確定按鈕,一個(gè)擁有工作流名稱和變量的工作流框架就已經(jīng)完成了。接下來的工作,就是要?jiǎng)?chuàng)建相關(guān)的節(jié)點(diǎn)和進(jìn)行節(jié)點(diǎn)間的路由設(shè)置。
我們繼續(xù)點(diǎn)擊“添加活動(dòng)”按鈕,此時(shí),設(shè)置界面中會(huì)多出一個(gè)長方形的節(jié)點(diǎn),此長方形節(jié)點(diǎn),就是我們的活動(dòng)節(jié)點(diǎn),可以通過鼠標(biāo)對此活動(dòng)節(jié)點(diǎn)進(jìn)行移動(dòng),鼠標(biāo)移到長方形邊框和拖拽點(diǎn)之間的空白區(qū)域,按住鼠標(biāo)左鍵可對此活動(dòng)節(jié)點(diǎn)進(jìn)行移動(dòng)。開始和結(jié)束節(jié)點(diǎn)同樣可以進(jìn)行移動(dòng)處理。我們添加兩個(gè)活動(dòng)節(jié)點(diǎn),并移動(dòng)這些節(jié)點(diǎn),如下圖:
按照我們的流程設(shè)計(jì),第一個(gè)活動(dòng)節(jié)點(diǎn)應(yīng)該就是請假人填寫請假單的數(shù)據(jù),第二個(gè)節(jié)點(diǎn)是經(jīng)理對請假單的審核動(dòng)作,我們從開始節(jié)點(diǎn)開始,通過拖拽點(diǎn),把這些節(jié)點(diǎn)的關(guān)系創(chuàng)建起來,鼠標(biāo)按住拖拽點(diǎn),拖到下一個(gè)節(jié)點(diǎn)上面,松開,即可建立節(jié)點(diǎn)之間的路由關(guān)系,我們需要建立的路由關(guān)系如下,從開始節(jié)點(diǎn)到填寫請假表單到審核表單到流程結(jié)束。如下圖:
此時(shí)我們工作流的大致流程就已經(jīng)定好,接下來,就要對活動(dòng)節(jié)點(diǎn)和路由進(jìn)行設(shè)置,來實(shí)現(xiàn)我們的流轉(zhuǎn)邏輯。我們先來設(shè)置活動(dòng)節(jié)點(diǎn),鼠標(biāo)移到第一個(gè)節(jié)點(diǎn),右鍵單擊第一個(gè)節(jié)點(diǎn),彈出設(shè)置框如下:
活動(dòng)節(jié)點(diǎn)的設(shè)置,有4個(gè)大項(xiàng):屬性、執(zhí)行角色、變量、提醒。
屬性:設(shè)置活動(dòng)節(jié)點(diǎn)的名稱 和 節(jié)點(diǎn)的提交方式,提交方式有兩種,一種是“角色中的任意一人處理后提交”,另一種是“角色中的所有人處理后提交”。
角色中的任意一人處理后提交:在執(zhí)行角色項(xiàng)中指定的所有角色中,只要其中的任何一人處理了就進(jìn)行提交操作。
角色中的所有人處理后提交:在執(zhí)行角色項(xiàng)中指定的所有角色中,所有的人都要處理完后才進(jìn)行提交操作。
此選項(xiàng)中,我們設(shè)置活動(dòng)節(jié)點(diǎn)名稱為:填寫請假單;提交節(jié)點(diǎn)方式為:角色中的任意一人處理后提交。
選擇執(zhí)行角色項(xiàng),出現(xiàn)的設(shè)置頁面如下:
在指定執(zhí)行角色頁面,我們可以設(shè)置對此活動(dòng)節(jié)點(diǎn)進(jìn)行操作的角色類型。
由發(fā)起人對此活動(dòng)進(jìn)行處理:一旦選擇了此項(xiàng),下面的角色列表將不允許再進(jìn)行選擇,意思就是此節(jié)點(diǎn)將只能由工作流的發(fā)起人來進(jìn)行操作。
由上一活動(dòng)中動(dòng)態(tài)指定的人員對此活動(dòng)進(jìn)行處理:一旦選擇了此項(xiàng),角色列表將不允許再進(jìn)行選擇,意思是在工作流的處理當(dāng)中,此節(jié)點(diǎn)的處理人員是由上一個(gè)節(jié)點(diǎn)的執(zhí)行人員進(jìn)行動(dòng)態(tài)指定的,選擇此項(xiàng)后,還可以進(jìn)行一個(gè)設(shè)置,是否一次性指定。意思就是,如果該節(jié)點(diǎn)在整個(gè)工作流程中會(huì)有多次執(zhí)行的機(jī)會(huì),那么是每次執(zhí)行的時(shí)候都要上一節(jié)點(diǎn)的執(zhí)行人進(jìn)行動(dòng)態(tài)指定,還是只需要指定一次,然后后面的都會(huì)采取第一次指定的人員來執(zhí)行。
系統(tǒng)角色選擇列表:選擇可以執(zhí)行該節(jié)點(diǎn)的角色,然后點(diǎn)擊“>”按鈕,添加到右邊的當(dāng)前節(jié)點(diǎn)執(zhí)行角色當(dāng)中。在當(dāng)前節(jié)點(diǎn)執(zhí)行角色列表中,還可以進(jìn)行當(dāng)前角色與發(fā)起人的機(jī)構(gòu)或部門關(guān)系的設(shè)置,有三項(xiàng),無指定、同機(jī)構(gòu)、同部門。無指定的意思就是不加判斷,只要是在此角色列表中的人都可以進(jìn)行處理;同機(jī)構(gòu)是指此執(zhí)行角色列表中的處理人必須要和發(fā)起人在同一個(gè)機(jī)構(gòu)內(nèi)才能進(jìn)行處理;同部門是指此執(zhí)行角色列表中的處理人必須要和發(fā)起人在同一個(gè)機(jī)構(gòu)內(nèi)和同一個(gè)部門內(nèi)才能進(jìn)行處理。此關(guān)系設(shè)定可以大大提高我們工作流的適應(yīng)范圍。
此選項(xiàng)中,我們選擇:由發(fā)起人對此活動(dòng)進(jìn)行處理。
選擇變量項(xiàng)出現(xiàn)的設(shè)置頁面如下:
在這里,我們可以看到在工作流里設(shè)置的所有變量,把此活動(dòng)節(jié)點(diǎn)需要處理的變量添加到右邊的當(dāng)前活動(dòng)變量列表中即可。當(dāng)變量添加到當(dāng)前活動(dòng)變量列表中時(shí),還可以對變量進(jìn)行是否只讀的設(shè)置,如果在只讀的復(fù)選框上打上勾后,此變量在此活動(dòng)節(jié)點(diǎn)的屬性為只讀,就是只允許讀,不允許進(jìn)行修改操作。
此選項(xiàng),我們把請假人、請假事由、請假起始日期、請假結(jié)束日期 添加到當(dāng)前活動(dòng)變量中,并且都是可以編輯的變量。
選擇提醒選項(xiàng),出現(xiàn)以下界面:
此選項(xiàng)卡的作用,是當(dāng)工作流流轉(zhuǎn)到此活動(dòng)節(jié)點(diǎn)時(shí),是否需要對此節(jié)點(diǎn)的處理人進(jìn)行一些信息提醒的設(shè)置。
提醒類型:包括從不提醒、馬上提醒、延時(shí)提醒。從不提醒就是不需要提醒此節(jié)點(diǎn)的處理人員;馬上提醒,就是指一旦流程執(zhí)行到該節(jié)點(diǎn),就馬上對此節(jié)點(diǎn)的處理人員進(jìn)行提醒操作;延時(shí)提醒,當(dāng)選擇了此項(xiàng),后面的延時(shí)值為必填項(xiàng),意思是當(dāng)執(zhí)行到該節(jié)點(diǎn)的時(shí)候,如果在指定的延時(shí)時(shí)間內(nèi),還沒有處理,就開始對該節(jié)點(diǎn)的處理人進(jìn)行提醒操作。
重復(fù)提醒類型:當(dāng)提醒類型除從不提醒外的選項(xiàng)時(shí),此項(xiàng)可以進(jìn)行設(shè)置,可以設(shè)置為不重復(fù)和重復(fù),當(dāng)選擇重復(fù)提醒時(shí),需要設(shè)置后面的重復(fù)時(shí)間間隔。
我們選擇從不提醒。
設(shè)置好此活動(dòng)節(jié)點(diǎn)的相關(guān)項(xiàng)后,我們點(diǎn)擊確定,以完成該節(jié)點(diǎn)的設(shè)置。
此時(shí),設(shè)計(jì)器中的第一個(gè)活動(dòng)節(jié)點(diǎn)有了一個(gè)“填寫請假單”的下標(biāo)如圖:
接下來,我們用同樣的方法對第二個(gè)活動(dòng)節(jié)點(diǎn)進(jìn)行設(shè)置,我們設(shè)置它的名稱為“審核請假單”,活動(dòng)節(jié)點(diǎn)提交方式,我們同樣選擇“角色中的任意一人處理后提交”。
選擇執(zhí)行角色的時(shí)候,我們選擇經(jīng)理角色,并設(shè)置當(dāng)前角色與發(fā)起人的機(jī)構(gòu)或部門關(guān)系為“同部門”,如下圖:
意思就是,只有與請假單的發(fā)起人是同一個(gè)部門,并且是經(jīng)理角色的人才能對此節(jié)點(diǎn)進(jìn)行處理操作。
變量選項(xiàng)卡中,我們把所有的變量都添加到當(dāng)前活動(dòng)變量列表中,不過要對
請假人、請假事由、請假起始日期、請假結(jié)束日期這四個(gè)變量設(shè)置為只讀,如下圖:
意思就是說,經(jīng)理審核的時(shí)候,對這四個(gè)只讀的變量,他只有查看的權(quán)利,沒有修改的權(quán)利,他只能對是否允許和審核說明這兩個(gè)變量進(jìn)行設(shè)置。
提醒選項(xiàng)卡中,我們依然選擇從不提醒。點(diǎn)擊確定,完成第二個(gè)活動(dòng)節(jié)點(diǎn)的設(shè)置,如下圖:
到此為止,我們已經(jīng)對工作流和工作流的活動(dòng)節(jié)點(diǎn)進(jìn)行了相應(yīng)的設(shè)置,此時(shí),已經(jīng)是一個(gè)可以執(zhí)行的工作流了,但這樣的工作流,是沒有邏輯分析能力的,我們還需要對路由進(jìn)行設(shè)置,才能讓流程按照我們的意圖去進(jìn)行流轉(zhuǎn)。
我們看當(dāng)前的工作流,總共有三個(gè)路由,一個(gè)箭頭代表一個(gè)路由,我們大概來分析一下,第一個(gè)路由,很明確,從流程開始,就直接到第一個(gè)節(jié)點(diǎn),就是要發(fā)起人來填寫請假單數(shù)據(jù),填寫完請假單數(shù)據(jù)后,就直接提交到了審核請假單的節(jié)點(diǎn),流程一直到這里,都沒什么問題,我們再看最后一個(gè)路由,審核請假單處理完畢后,就直接到流程完畢節(jié)點(diǎn)。整個(gè)過程好像還缺少了點(diǎn)什么。是的,缺少了發(fā)起人與審核人的交互環(huán)節(jié),如果是直接通過了審核,就直接到流程完畢,也無異議。但是如果是審核沒通過呢? 需要把審核的意見反饋到請假人哪里呢,怎么辦?
好,我們此時(shí)需要對流程再加入一個(gè)路由,就是從審核請假單節(jié)點(diǎn)返回到填寫請假單節(jié)點(diǎn)的路由。我們鼠標(biāo)按住審核請假單的拖拽點(diǎn),拖到填寫請假單節(jié)點(diǎn)后放下,此時(shí)我們的流程圖變成了以下,如圖:
在兩個(gè)活動(dòng)節(jié)點(diǎn)之間,有了兩個(gè)路由,由此可以看出,基本可以實(shí)現(xiàn)兩個(gè)節(jié)點(diǎn)間的信息交流了。
這里需要說明一下:路由是可以進(jìn)行設(shè)置或不用設(shè)置的,如果涉及到節(jié)點(diǎn)間的邏輯性流轉(zhuǎn),則需要對路由進(jìn)行設(shè)置,如果是簡單的一條線型的流程,則可以不用對路由進(jìn)行設(shè)置,流程就會(huì)按步驟,一個(gè)節(jié)點(diǎn)一個(gè)節(jié)點(diǎn)的執(zhí)行下去。
針對我們的流程,我們也只需要對審核請假單節(jié)點(diǎn)出來的兩個(gè)節(jié)點(diǎn)進(jìn)行路由的設(shè)置,我們先來設(shè)置從審核請假單節(jié)點(diǎn)到流程結(jié)束節(jié)點(diǎn)的路由。鼠標(biāo)移到路由上,右鍵單擊,彈出路由設(shè)置框如下:
路由名稱:我們填入“審核通過并結(jié)束流程”。
路由的規(guī)則,是通過對工作流的變量值來進(jìn)行對比形成的,這里可以添加多個(gè)變量對比規(guī)則來形成一個(gè)路由規(guī)則。多個(gè)變量規(guī)則的關(guān)系是 && (并且)的關(guān)系,意思是符合了所有的變量對比規(guī)則,才會(huì)去執(zhí)行此路由。設(shè)置路由的時(shí)候,我們需要對此工作流有比較透徹的理解,才能準(zhǔn)確的設(shè)置路由規(guī)則。
針對我們的請假流程,我們這里只設(shè)置是否允許變量等于允許,此條規(guī)則。意思就是一旦審核的時(shí)候,是否允許變量如果為允許,則此工作流就將直接結(jié)束。如下圖:
點(diǎn)擊確定按鈕,再看我們的流程設(shè)計(jì)圖,此時(shí),此路由上會(huì)顯示出該路由的名稱。
同樣,我們設(shè)置從審核請假單到填寫請假單的路由如下:
意思是,當(dāng)審核為不允許的時(shí)候,數(shù)據(jù)將返回到填寫請假單的節(jié)點(diǎn),讓填寫請假單的人可以看到審核的結(jié)果,如果仍需要進(jìn)行提交,則繼續(xù)提交,如果不需要再進(jìn)行提交,則自己結(jié)束該流程即可。
設(shè)置好后,點(diǎn)擊確定按鈕,我們看看最后的整個(gè)流程圖:
我們再來按著這個(gè)流程圖來理解一遍整個(gè)流程。
由流程發(fā)起人填寫請假單,提交到經(jīng)理審核,如果經(jīng)理審核允許請假,則直接結(jié)束流程,如果經(jīng)理審核不允許請假,則審核信息反饋到請假人的手里,請假人可以對請假信息進(jìn)行修改然后再進(jìn)行提交審核處理,然后再去經(jīng)過經(jīng)理審核;或者結(jié)束該流程。
如此,我們就已經(jīng)完成了一個(gè)請假流程的制作。點(diǎn)擊“保存工作路”功能按鈕,即可完成此工作流的保存,以后可隨時(shí)調(diào)出此工作流進(jìn)行修改或刪除操作。
源碼下載:
工作流設(shè)計(jì)器.rar
