1. 程式人生 > >Winform開發框架中工作流模組的動態處理

Winform開發框架中工作流模組的動態處理

在工作流處理表中,首先我們區分流程模板和流程例項兩個部分,這個其實就是類似模板和具體文件的概念,我們一份模板可以建立很多個類似的文件,文件樣式結構類似的。同理,流程模板例項為流程例項後,就是具體的一個流程表單資訊了,其中流程模板和流程例項表單都包括了各個流程步驟。在流程例項的層次上,我們執行的時候,需要記錄一些日誌方便跟蹤,如流程步驟的處理日誌,流程例項表單的處理日誌等這些資訊。

一旦流程例項根據模板建立後,流程先根據模板初始化後,在處理過程還可以動態增加一些審批步驟,使得我們的處理更加彈性化。如下所示。

我們在系統中動態定義很多業務表單,因此需要動態展示建立表單的入口;另外每種業務表單的建立和檢視也需要實現動態的構建,才能更好的實現我們業務流程的處理規則。

1、動態顯示流程業務入口

我們在工作流模組中,有一個統一的業務建立入口,方便使用者的使用,我們需要建立什麼型別的業務表單,從中選擇建立介面,是一個便利的入口。

我們實現這個展示會相對比較簡單,但是建立業務表單的入口需要動態的處理,是根據使用者配置的引數進行動態的處理的。

 

上述的介面是通過在資料庫裡面動態獲取資訊,並建立不同的按鈕的,因此可以實現流程入口的動態顯示,不需要硬編碼帶來後期的修改。實現的邏輯就是在右側內容區域的流佈局區域,根據表單資訊動態建立按鈕,並實現對應的事件響應即可,實現程式碼如下所示。

        /// <summary>
        ///
繫結表單列表的展示 /// </summary> private void BindData() { //使用流佈局,清空 this.flowLayoutPanel1.Controls.Clear(); //根據條件獲取表單列表,並動態建立按鈕 string where = GetConditionSql(); List<FormInfo> list = BLLFactory<BLL.Form>.Instance.Find(where
); int i = 0; foreach (FormInfo info in list) { //在流佈局中動態加入按鈕 SimpleButton button = CreateButton(info, i++); this.flowLayoutPanel1.Controls.Add(button); } } /// <summary> /// 根據流程模板的表單資訊,動態建立入口按鈕 /// </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; } //所有按鈕統一處理事件 button.Click += new EventHandler(button_Click); return button; }

按鈕的處理有一個統一的事件實現新建業務表單的賦值和顯示窗體。實現的程式碼如下所示。

        /// <summary>
        /// 單擊某個動態生成的按鈕,觸發的申請表單建立介面
        /// </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
                    {
                        //動態構建建立申請單的介面窗體並賦值
                        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 + "暫未開通");
                }
            }
        }

2、動態顯示和建立業務表單的處理

有了上面動態列表的顯示,以及統一的按鈕處理,事情就好辦很多。

我們剛才也涉及到了業務表單的建立呼叫,是通過反射處理實現業務表單建立視窗的賦值和顯示的。

    //動態構建建立申請單的介面窗體並賦值
    var dlg = Assembly.GetExecutingAssembly().CreateInstance(formInfo.ApplyWin) as FrmAddApply;
    dlg.FormID = button.Tag.ToString();
    dlg.ShowDialog();

這其中涉及的配置資訊就是我們建立一個業務視窗所需要的引數的,如下資料表所示。

 

其實通過建立這些業務表,我們在封裝繼承上也做了很多工作,以極大簡化業務表單的處理,以下是業務表單新建、編輯、檢視的處理操作,它們已經繼承自各自的處理類,因此在反射的時候,統一轉換為基類即可實現處理。

首先我們來了解一下業務表單的對應關係,一般建立一個業務流程處理,都需要有一個具體的建立業務表單的介面,以及一個檢視處理表單的介面。

為了方便,我們儘可能減少程式碼編寫,我們需要把大多數的邏輯處理放在基類實現,這樣我們在新增一個業務表單的時候就可以減少很多程式碼編寫及維護了。

 

 例如對於請假申請的業務表單,它們的窗體定義如下所示。

 而檢視請假申請的業務表單則是如下。

從上面關係我們可以看到,其中對於工作流業務表單的窗體介面都可以實現標準的處理了,繼承自某個基類,然後整合相關的資料處理規則即可。

那麼我們提煉業務資訊後,可以使用程式碼生成工具快速生成,這樣可以極大提高我們的開發效率。

下面就是使用我們定製的框架程式碼生成工具 Database2Sharp,就可以極大簡化工作流業務表單的生成處理了。

3、檢視申請單的處理動態化

在我的待辦業務列表裡面,就可以看到剛才的表單了,雙擊可以進行檢視,以及相關的審批處理工作。

對於一個流程處理操作,我們知道一般有審批通過、拒絕、退回到某步驟、轉發到內部閱讀、閱讀等處理步驟,以及包括起草者能撤銷表單呢等操作,當然如果還有一些具體的業務,可能還會有一些流程的處理才操作,不過基本上也可以歸結為上面幾種,只是他們每步處理的資料內容不同而已。因此審批的操作步驟分類如下所示。

除了上面這些基礎的表單處理動作,有時候還會定義多個處理人共同處理的會籤步驟,只有全部通過才算通過的處理流程。

會籤是指建立一個或多個子流程供相關人員進行審批,等待全部人員完成處理後再次回到主流程上,然後決定是否繼續流轉到下一個流程步驟上去,一般的申請單的主流程如下所示。

這裡設定的會籤處理就是其中一個步驟,一旦會籤處理步驟發起會籤,就會構建多個可供審批的子流程了,如下所示。

 針對上面的業務介紹,那麼顯示申請單的處理就必須處理這些步驟是否可用,或者決定進入哪一個流程步驟的了。

對於審批性質的表單,如下是介面的審批操作

而如果是發起【發起會籤】的處理操作,那麼則是把相關的投票權傳送給處理人進行會籤處理。

以上就是工作流表單裡面設計到的幾個動態處理的業務場景,同時我們通過利用動態的資訊處理,可以減少硬編碼的可能性,同時增加系統的彈性處理,非常方便,由於相關工作流的基類設計較為合理,因此在程式碼生成的時候,只需要關注簡單的介面展示調整即可,通過這種處理方式,可以在多個層面降低開發工作流介面的複雜度,同時系統又增加了很多可擴充套件性的處理,如可以動態增加表單、動態增加流程步驟、動態指定不同的業務處理型別等等。

通過這些的介紹,我們就是系統在開發的時候,儘可能提取不變的內容或者規則,從而在實際增量開發的過程中降低開發的時間,減少難度,同時統一處理做法,既可以提高效率,又可以提高穩定性和統一性。