Winform開(kāi)發(fā)框架之簡(jiǎn)易工作流設(shè)計(jì)

一講到工作流筐付,很多人第一反應(yīng)就是這個(gè)東西很深?yuàn)W奥秆,有時(shí)候又覺(jué)得離我們較為遙遠(yuǎn),確實(shí)完善的工作流設(shè)計(jì)很多方面傅是,而正是由于需要兼顧很多方面匪燕,一般通用的工作流都難做到盡善盡美。微軟也提供了幾個(gè)版本的WF框架支持喧笔,也有一些廠家是基于這個(gè)框架基礎(chǔ)上開(kāi)發(fā)的工作流應(yīng)用帽驯。
以前由于項(xiàng)目的需要,參與過(guò)一些工作流的項(xiàng)目開(kāi)發(fā)溃斋,其中有些是基于我簡(jiǎn)易工作流的原理上進(jìn)行拓展的界拦,包括一個(gè)廣州市各區(qū)縣使用的行業(yè)審批業(yè)務(wù)平臺(tái),由于基于自己的流程處理梗劫,界面設(shè)計(jì)、流程流轉(zhuǎn)等方面可以很好符合客戶需求截碴,定制的彈性較好梳侨,缺點(diǎn)是不夠通用,也需要編寫表單部分代碼日丹。
后面由于業(yè)務(wù)的需要走哺,工作流方面的業(yè)務(wù)逐漸顯得迫切,公司是想采用一個(gè)較為通用工作流框架來(lái)組織目前的業(yè)務(wù)哲虾,因此找了廣州一家做工作流的公司丙躏,購(gòu)買了他們的產(chǎn)品择示,雖然號(hào)稱完全通過(guò)后臺(tái)配置,零代碼實(shí)現(xiàn)工作流業(yè)務(wù)表單的處理晒旅,但是由于客戶對(duì)表單的設(shè)計(jì)要求比較多栅盲,有時(shí)候需要結(jié)合一些外部的數(shù)據(jù)接口,流程處理方面也有著進(jìn)一步的需要废恋,這樣可能就打破了他們?cè)瓉?lái)的格局谈秫,導(dǎo)致無(wú)論在表單設(shè)計(jì)、流程配置等方面鱼鼓,都需要購(gòu)買他們工程師的現(xiàn)場(chǎng)服務(wù)拟烫,來(lái)進(jìn)一步完善整個(gè)項(xiàng)目的內(nèi)容,導(dǎo)致整個(gè)項(xiàng)目進(jìn)展緩慢迄本,遭遇水土不服的處境硕淑。
因此感覺(jué),一個(gè)工作流模塊嘉赎,號(hào)稱再?gòu)?qiáng)大置媳,如果不能很好結(jié)合項(xiàng)目應(yīng)用,即使零代碼的功能配置曹阔,也可能使你處于尷尬的境況之中半开,因?yàn)橥ㄟ^(guò)配置,可能在代碼里面平常很容易實(shí)現(xiàn)的表單功能赃份,要通過(guò)零代碼配置寂拆,花費(fèi)的時(shí)間更多更難掌握,因?yàn)榱愦a是有代價(jià)的抓韩,需要您很好利用他們的API纠永,他們的業(yè)務(wù)對(duì)象,有時(shí)候還需要很曲折的摸索參數(shù)谒拴,而這一切可能就是非常致命的弱點(diǎn)尝江。

1、簡(jiǎn)易工作流的設(shè)計(jì)模型

在沒(méi)有第三方工作流模塊的情況下英上,簡(jiǎn)易工作流就是利用數(shù)據(jù)庫(kù)和業(yè)務(wù)對(duì)象之間的協(xié)作關(guān)系炭序,構(gòu)建的一個(gè)半模塊化的流程引擎,它能通過(guò)整合到項(xiàng)目代碼中進(jìn)行更好的融合以便實(shí)現(xiàn)工作流的相關(guān)功能苍日。
首先我們知道惭聂,我們?cè)贠ffice里面創(chuàng)建任何文檔,都有一個(gè)模板的概念相恃,這樣我們方便利用一些現(xiàn)成的數(shù)據(jù)和布局辜纲,工作流也一樣,有一個(gè)流程模板的概念,如下所示耕腾。



然后每個(gè)流程模板见剩,本身會(huì)預(yù)定義了一系列的處理流程,以便在流程實(shí)例里面進(jìn)行不同的處理扫俺,因此流程模板還包含了多個(gè)流程步驟對(duì)象苍苞,他們的關(guān)系構(gòu)成如下。



每個(gè)流程實(shí)例牵舵,除了他們自己的流程數(shù)據(jù)和字段信息外柒啤,它本身還有一個(gè)表單設(shè)計(jì)的問(wèn)題,如費(fèi)用審批畸颅,可能包含填寫的費(fèi)用清單數(shù)據(jù)等担巩,所以流程實(shí)例還應(yīng)該包含了流程的業(yè)務(wù)表單對(duì)象。
這樣他們構(gòu)成了一個(gè)完整的流程業(yè)務(wù)對(duì)象關(guān)系没炒,如下所示涛癌。

2、流程審批的操作

對(duì)于一個(gè)流程處理操作送火,我們知道一般有審批通過(guò)拳话、拒絕、退回到某步驟种吸、轉(zhuǎn)發(fā)到內(nèi)部閱讀弃衍、閱讀,以及包括起草者能撤銷表單呢等操作坚俗,當(dāng)然如果還有一些具體的業(yè)務(wù)镜盯,可能還會(huì)有一些流程的處理才操作,不過(guò)基本上也可以歸結(jié)為上面幾種猖败,只是他們每步處理的數(shù)據(jù)內(nèi)容不同而已速缆。因此審批的操作步驟分類如下所示。


這些操作我們都可以通過(guò)一些界面操作的封裝實(shí)現(xiàn)恩闻,因?yàn)樗麄兓旧隙际峭ㄓ玫囊彰樱覀儌魅胍恍┝鞒蘄D等相關(guān)標(biāo)識(shí)后,就能交給這些標(biāo)準(zhǔn)的操作界面完成了幢尚。
如審批界面如下所示破停,里面包含了通過(guò)、拒絕尉剩,跳回到某步驟辱挥,增加步驟等功能集合。



上面的界面是審批過(guò)程中边涕,對(duì)于某一個(gè)流程處理人員實(shí)現(xiàn)的操作,而有時(shí)候,我們可能需要針對(duì)多個(gè)人進(jìn)行某個(gè)步驟的處理功蜓,如傳遞給內(nèi)部人員進(jìn)行分閱操作园爷,那么就應(yīng)該選定多個(gè)人員進(jìn)行處理,大概的處理界面效果如下所示式撼。



當(dāng)然童社,若申請(qǐng)人的申請(qǐng)單填寫錯(cuò)誤,需要撤銷的話著隆,那么也應(yīng)該有這個(gè)操作扰楼,撤銷表單后,就可以重新填寫表單美浦,然后再次提交進(jìn)行流程弦赖。

3、流程審批的表單處理

在表單的動(dòng)態(tài)設(shè)計(jì)和顯示方面浦辨,一直沒(méi)有好的思路蹬竖,因此我覺(jué)得把流程模塊作為半模塊化即可,把部分界面通過(guò)代碼編寫方式進(jìn)行整合流酬,因此把表單的填寫币厕,表單查看做到用戶控件里面,然后在界面里面引用即可芽腾。
如下面的表單填寫操作界面如下所示旦装,對(duì)不同的流程表單,在項(xiàng)目中增加一個(gè)表單的填寫界面和保存操作即可摊滔。



查看并處理的表單操作阴绢,我們可以先做一個(gè)查看表單信息的界面,然后整合流程的處理工具欄惭载,組合成一個(gè)查看旱函、處理操作一體化的流程操作。



當(dāng)然描滔,如果是能夠有動(dòng)態(tài)設(shè)計(jì)表單棒妨,然后進(jìn)行無(wú)縫整合當(dāng)然更加完美,不過(guò)這樣的操作含长,界面設(shè)計(jì)上也不會(huì)很麻煩券腔,一般普通的開(kāi)發(fā)人員都能勝任,因此拘泞,對(duì)于其他流程表單纷纫,依葫蘆畫瓢就可以完成不同的表單了。
而且里面的工具欄代碼都是可以操作的陪腌,雖然可能集成了不同業(yè)務(wù)的處理方式辱魁,但是我們還是動(dòng)態(tài)進(jìn)行處理烟瞧,處理代碼如下所示。
private void InitToolBar()
{
    //如果流程是可以撤銷染簇,且表單狀態(tài)為處理中参滴,那么可以“撤銷”操作可用
    bool mayCancel = BLLFactory<AppApply>.Instance.IsApplyMayCancel(ApplyId, base.LoginUserInfo.ID);
    this.btnCancel.ToVisibility(mayCancel);

    //可退回重新編輯
    bool mayBackToEdit = BLLFactory<AppApply>.Instance.IsApplyMayBackEdit(ApplyId, base.LoginUserInfo.ID);
    this.btnEdit.ToVisibility(mayBackToEdit);

    //判斷是否需要顯示閱辦狀態(tài)
    bool isReadStatus = BLLFactory<ApplyRead>.Instance.IsReadSatus(ApplyId, base.LoginUserInfo.ID);
    this.btnRead.ToVisibility(isReadStatus);

    //如果不是當(dāng)前審批人隱藏審批按鈕
    bool canDeal = BLLFactory<BLL.ApplyUser>.Instance.IsCheckPermission(ApplyId, base.LoginUserInfo.ID);
    if (canDeal)
    {
        ApplyFlowInfo flowInfo = BLLFactory<ApplyFlow>.Instance.GetFirstUnHandledFlow(ApplyId);
        if (flowInfo != null)
        {
            string procTypeName = BLLFactory<AppProc>.Instance.GetProcType(flowInfo.ProcType);
            BarButtonItem button = new BarButtonItem();
            button.Caption = procTypeName;
            button.Name = procTypeName;
            button.Tag = flowInfo;//綁定流程內(nèi)容
            button.ImageIndex = 3;
            button.LargeImageIndex = 3;
            button.PaintStyle = BarItemPaintStyle.CaptionGlyph;
            button.ItemClick += new ItemClickEventHandler(button_ItemClick);
            this.bar1.AddItem(button);
        }
    }
}

上面對(duì)于流程步驟的處理,就交給一個(gè)獨(dú)立的按鈕事件進(jìn)行判斷處理即可锻弓,根據(jù)不同的業(yè)務(wù)步驟名稱進(jìn)行不同的處理砾赔,這樣就能夠進(jìn)行很好的控制處理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末青灼,一起剝皮案震驚了整個(gè)濱河市暴心,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杂拨,老刑警劉巖专普,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異扳躬,居然都是意外死亡脆诉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門贷币,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)击胜,“玉大人,你說(shuō)我怎么就攤上這事役纹∨妓ぃ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵促脉,是天一觀的道長(zhǎng)辰斋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)瘸味,這世上最難降的妖魔是什么宫仗? 我笑而不...
    開(kāi)封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮旁仿,結(jié)果婚禮上藕夫,老公的妹妹穿的比我還像新娘。我一直安慰自己枯冈,他們只是感情好毅贮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著尘奏,像睡著了一般滩褥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炫加,一...
    開(kāi)封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天瑰煎,我揣著相機(jī)與錄音铺然,去河邊找鬼。 笑死丢间,一個(gè)胖子當(dāng)著我的面吹牛探熔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烘挫,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柬甥!你這毒婦竟也來(lái)了饮六?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤苛蒲,失蹤者是張志新(化名)和其女友劉穎卤橄,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體臂外,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窟扑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漏健。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚎货。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蔫浆,靈堂內(nèi)的尸體忽然破棺而出殖属,到底是詐尸還是另有隱情,我是刑警寧澤瓦盛,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布洗显,位于F島的核電站,受9級(jí)特大地震影響原环,放射性物質(zhì)發(fā)生泄漏挠唆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一嘱吗、第九天 我趴在偏房一處隱蔽的房頂上張望玄组。 院中可真熱鬧,春花似錦柜与、人聲如沸巧勤。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颅悉。三九已至,卻和暖如春迁匠,著一層夾襖步出監(jiān)牢的瞬間剩瓶,已是汗流浹背驹溃。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留延曙,地道東北人豌鹤。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像枝缔,于是被迫代替她去往敵國(guó)和親布疙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容