轉(zhuǎn)帖|使用教程|編輯:龔雪|2022-05-20 10:45:05.207|閱讀 213 次
概述:本文主要介紹Winform開發(fā)框架中工作流模塊的動態(tài)處理,歡迎點擊收藏分享~
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
在工作流處理表中,首先我們區(qū)分流程模板和流程實例兩個部分,這個其實就是類似模板和具體文檔的概念,我們一份模板可以創(chuàng)建很多個類似的文檔,文檔樣式結(jié)構(gòu)類似的。同理,流程模板實例為流程實例后,就是具體的一個流程表單信息了,其中流程模板和流程實例表單都包括了各個流程步驟。在流程實例的層次上,我們運行的時候,需要記錄一些日志方便跟蹤,如流程步驟的處理日志,流程實例表單的處理日志等這些信息。
一旦流程實例根據(jù)模板創(chuàng)建后,流程先根據(jù)模板初始化后,在處理過程還可以動態(tài)增加一些審批步驟,使得我們的處理更加彈性化。如下所示。
我們在系統(tǒng)中動態(tài)定義很多業(yè)務(wù)表單,因此需要動態(tài)展示創(chuàng)建表單的入口;另外每種業(yè)務(wù)表單的創(chuàng)建和查看也需要實現(xiàn)動態(tài)的構(gòu)建,才能更好的實現(xiàn)我們業(yè)務(wù)流程的處理規(guī)則。
我們在工作流模塊中,有一個統(tǒng)一的業(yè)務(wù)創(chuàng)建入口,方便用戶的使用,我們需要創(chuàng)建什么類型的業(yè)務(wù)表單,從中選擇創(chuàng)建接口,是一個便利的入口。
我們實現(xiàn)這個展示會相對比較簡單,但是創(chuàng)建業(yè)務(wù)表單的入口需要動態(tài)的處理,是根據(jù)用戶配置的參數(shù)進行動態(tài)的處理的。
上述的界面是通過在數(shù)據(jù)庫里面動態(tài)獲取信息,并創(chuàng)建不同的按鈕的,因此可以實現(xiàn)流程入口的動態(tài)顯示,不需要硬編碼帶來后期的修改。實現(xiàn)的邏輯就是在右側(cè)內(nèi)容區(qū)域的流布局區(qū)域,根據(jù)表單信息動態(tài)創(chuàng)建按鈕,并實現(xiàn)對應(yīng)的事件響應(yīng)即可,實現(xiàn)代碼如下所示。
/// <summary> /// 綁定表單列表的展示 /// </summary> private void BindData() { //使用流布局,清空 this.flowLayoutPanel1.Controls.Clear(); //根據(jù)條件獲取表單列表,并動態(tài)創(chuàng)建按鈕 string where = GetConditionSql(); List<FormInfo> list = BLLFactory<BLL.Form>.Instance.Find(where); int i = 0; foreach (FormInfo info in list) { //在流布局中動態(tài)加入按鈕 SimpleButton button = CreateButton(info, i++); this.flowLayoutPanel1.Controls.Add(button); } } /// <summary> /// 根據(jù)流程模板的表單信息,動態(tài)創(chuàng)建入口按鈕 /// </summary> /// <param name="info">模板的表單信息</param> /// <param name="imageIndex">圖標</param> /// <returns></returns> private SimpleButton CreateButton(FormInfo info, int imageIndex) { //定義按鈕,在流布局的圖標、位置、偏移空間、字體顏色等 SimpleButton button = new SimpleButton(); button.ImageList = this.imageCollection1; button.ImageLocation = ImageLocation.TopCenter; button.Padding = new Padding(10, 10, 10, 10); button.Size = new Size(102, 114); button.Margin = new Padding(10, 10, 10, 10); button.ImageIndex = imageIndex; button.Font = new Font("宋體", 9f, FontStyle.Bold); button.ForeColor = Color.Blue; button.Text = info.FormName; button.Tag = info.ID; if (!string.IsNullOrEmpty(info.Remark)) { button.ToolTip = info.Remark; button.ToolTipIconType = DevExpress.Utils.ToolTipIconType.Information; } //所有按鈕統(tǒng)一處理事件 button.Click += new EventHandler(button_Click); return button; }
按鈕的處理有一個統(tǒng)一的事件實現(xiàn)新建業(yè)務(wù)表單的賦值和顯示窗體。實現(xiàn)的代碼如下所示。
/// <summary> /// 單擊某個動態(tài)生成的按鈕,觸發(fā)的申請表單創(chuàng)建界面 /// </summary> void button_Click(object sender, EventArgs e) { SimpleButton button = sender as SimpleButton; if (button != null) { //獲取模板表單必要的信息 var formId = button.Tag.ToString(); var formInfo = BLLFactory<BLL.Form>.Instance.FindByID(formId); if (formInfo != null && !string.IsNullOrEmpty(formInfo.ApplyWin)) { try { //動態(tài)構(gòu)建創(chuàng)建申請單的界面窗體并賦值 var dlg = Assembly.GetExecutingAssembly().CreateInstance(formInfo.ApplyWin) as FrmAddApply; dlg.FormID = button.Tag.ToString(); dlg.ShowDialog(); } catch(Exception ex) { LogHelper.Error(ex); MessageDxUtil.ShowError(ex.Message); } } else { MessageDxUtil.ShowTips(button.Text + "暫未開通"); } } }
有了上面動態(tài)列表的顯示,以及統(tǒng)一的按鈕處理,事情就好辦很多。
我們剛才也涉及到了業(yè)務(wù)表單的創(chuàng)建調(diào)用,是通過反射處理實現(xiàn)業(yè)務(wù)表單創(chuàng)建窗口的賦值和顯示的。
//動態(tài)構(gòu)建創(chuàng)建申請單的界面窗體并賦值 var dlg = Assembly.GetExecutingAssembly().CreateInstance(formInfo.ApplyWin) as FrmAddApply; dlg.FormID = button.Tag.ToString(); dlg.ShowDialog();
這其中涉及的配置信息就是我們創(chuàng)建一個業(yè)務(wù)窗口所需要的參數(shù)的,如下數(shù)據(jù)表所示。
其實通過創(chuàng)建這些業(yè)務(wù)表,我們在封裝繼承上也做了很多工作,以極大簡化業(yè)務(wù)表單的處理,以下是業(yè)務(wù)表單新建、編輯、查看的處理操作,它們已經(jīng)繼承自各自的處理類,因此在反射的時候,統(tǒng)一轉(zhuǎn)換為基類即可實現(xiàn)處理。
首先我們來了解一下業(yè)務(wù)表單的對應(yīng)關(guān)系,一般創(chuàng)建一個業(yè)務(wù)流程處理,都需要有一個具體的創(chuàng)建業(yè)務(wù)表單的界面,以及一個查看處理表單的界面。
為了方便,我們盡可能減少代碼編寫,我們需要把大多數(shù)的邏輯處理放在基類實現(xiàn),這樣我們在新增一個業(yè)務(wù)表單的時候就可以減少很多代碼編寫及維護了。
例如對于請假申請的業(yè)務(wù)表單,它們的窗體定義如下所示。
而查看請假申請的業(yè)務(wù)表單則是如下。
從上面關(guān)系我們可以看到,其中對于工作流業(yè)務(wù)表單的窗體界面都可以實現(xiàn)標準的處理了,繼承自某個基類,然后整合相關(guān)的數(shù)據(jù)處理規(guī)則即可。
那么我們提煉業(yè)務(wù)信息后,可以使用代碼生成工具快速生成,這樣可以極大提高我們的開發(fā)效率。
下面就是使用我們定制的框架代碼生成工具 Database2Sharp,就可以極大簡化工作流業(yè)務(wù)表單的生成處理了。
在我的待辦業(yè)務(wù)列表里面,就可以看到剛才的表單了,雙擊可以進行查看,以及相關(guān)的審批處理工作。
對于一個流程處理操作,我們知道一般有審批通過、拒絕、退回到某步驟、轉(zhuǎn)發(fā)到內(nèi)部閱讀、閱讀等處理步驟,以及包括起草者能撤銷表單呢等操作,當然如果還有一些具體的業(yè)務(wù),可能還會有一些流程的處理才操作,不過基本上也可以歸結(jié)為上面幾種,只是他們每步處理的數(shù)據(jù)內(nèi)容不同而已。因此審批的操作步驟分類如下所示。
除了上面這些基礎(chǔ)的表單處理動作,有時候還會定義多個處理人共同處理的會簽步驟,只有全部通過才算通過的處理流程。
會簽是指創(chuàng)建一個或多個子流程供相關(guān)人員進行審批,等待全部人員完成處理后再次回到主流程上,然后決定是否繼續(xù)流轉(zhuǎn)到下一個流程步驟上去,一般的申請單的主流程如下所示。
這里設(shè)置的會簽處理就是其中一個步驟,一旦會簽處理步驟發(fā)起會簽,就會構(gòu)建多個可供審批的子流程了,如下所示。
針對上面的業(yè)務(wù)介紹,那么顯示申請單的處理就必須處理這些步驟是否可用,或者決定進入哪一個流程步驟的了。
對于審批性質(zhì)的表單,如下是界面的審批操作
而如果是發(fā)起【發(fā)起會簽】的處理操作,那么則是把相關(guān)的投票權(quán)發(fā)送給處理人進行會簽處理。
以上就是工作流表單里面設(shè)計到的幾個動態(tài)處理的業(yè)務(wù)場景,同時我們通過利用動態(tài)的信息處理,可以減少硬編碼的可能性,同時增加系統(tǒng)的彈性處理,非常方便,由于相關(guān)工作流的基類設(shè)計較為合理,因此在代碼生成的時候,只需要關(guān)注簡單的界面展示調(diào)整即可,通過這種處理方式,可以在多個層面降低開發(fā)工作流界面的復(fù)雜度,同時系統(tǒng)又增加了很多可擴展性的處理,如可以動態(tài)增加表單、動態(tài)增加流程步驟、動態(tài)指定不同的業(yè)務(wù)處理類型等等。
通過這些的介紹,我們就是系統(tǒng)在開發(fā)的時候,盡可能提取不變的內(nèi)容或者規(guī)則,從而在實際增量開發(fā)的過程中降低開發(fā)的時間,減少難度,同時統(tǒng)一處理做法,既可以提高效率,又可以提高穩(wěn)定性和統(tǒng)一性。
DevExpress WinForm擁有180+組件和UI庫,能為Windows Forms平臺創(chuàng)建具有影響力的業(yè)務(wù)解決方案。DevExpress WinForms能完美構(gòu)建流暢、美觀且易于使用的應(yīng)用程序,無論是Office風(fēng)格的界面,還是分析處理大批量的業(yè)務(wù)數(shù)據(jù),它都能輕松勝任!
本文轉(zhuǎn)載自:
DevExpress技術(shù)交流群6:600715373 歡迎一起進群討論
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: