WinForm應用實戰開發指南 - 如何開發工作流模塊的申請單草稿?

在我們開發工作流模塊的時候,有時候填寫申請單過程中,暫時不想提交審批,那麼可以暫存爲草稿,以供下次繼續填寫或者提交處理,那麼這個草稿的功能是比較實用的,否則對於一些填寫內容比較多的申請單,每次要重填寫很多數據,那會被用戶罵的,從用戶的角度上來講,提供草稿保存的功能是比較友好的。本文介紹在工作流模塊中使用一種通用的存儲方式來存儲及顯示申請單草稿的信息。

PS:給大家推薦一個C#開發可以用到的界面組件——DevExpress WinForms,它能完美構建流暢、美觀且易於使用的應用程序,無論是Office風格的界面,還是分析處理大批量的業務數據,它都能輕鬆勝任!

 

一、申請單填寫

在我們提交申請前,我們一般是需要填寫一些相關的資料,如下界面所示。

WinForm應用實戰開發指南

這個表單記錄的信息不多,不過提供存爲草稿的功能也是要的,我們所有申請單都提供這個標準功能。

或者複雜一點的申請單:

WinForm應用實戰開發指南

以往做過草稿保存,把記錄複製在正式的申請單裏面,設置它爲草稿狀態即可,這種方式可以實現,不過不好統一處理,本篇隨筆介紹的是所有草稿存儲在一個表裏面,我們定義一些字段用來存儲對應信息的JSON數據,然後需要的時候,把它們逐一解析爲對應的對象即可,這種我們可以在基類窗體裏面封裝它的【存爲草稿】的邏輯處理了。

二、草稿功能實現

首先我們定義一個存儲草稿信息,可以對單表,也可以對主從表的數據,我們把它存儲爲對應的JSON字段即可,設計草稿的數據表如下所示。

WinForm應用實戰開發指南

在申請單填寫的基類窗體裏面,我們定義界面如下所示。

WinForm應用實戰開發指南

然後我們在基類提供一個通用的業務草稿保存處理函數,供子類進行調用即可。

/// <summary>
/// 保存草稿
/// </summary>
/// <param name="title">草稿標題</param>
/// <param name="mainJson">主業務表單數據</param>
/// <param name="detailJson">從表業務表單數據(如無則爲null)</param>
/// <param name="detailJson2">從表業務表單數據(如無則爲null)</param>
/// <param name="detailJson3">從表業務表單數據(如無則爲null)</param>
/// <returns></returns>
protected virtual void SaveDraft(string title, string mainJson, string detailJson = null,
string detailJson2 = null, string detailJson3 = null)
{
var formInfo = BLLFactory<BLL.Form>.Instance.FindByID(this.FormID);
ArgumentCheck.Begin().NotNull(formInfo, "表單對象");

var infoDraft = new ApplyDraftInfo();
if(!string.IsNullOrEmpty(this.DraftId))
{
infoDraft.ID = this.DraftId;//如果已有的則更新
}
infoDraft.BizDraftJson = mainJson;
infoDraft.BizDraftJson2 = detailJson;
infoDraft.BizDraftJson3 = detailJson2;
infoDraft.BizDraftJson4 = detailJson3;
infoDraft.Form_ID = this.FormID;
infoDraft.FormName = formInfo.FormName;
infoDraft.Category = formInfo.Category;
infoDraft.Title = title;
infoDraft.Creator = LoginUserInfo.ID;
infoDraft.CreateTime = DateTime.Now;
var flag = BLLFactory<ApplyDraft>.Instance.InsertUpdate(infoDraft, infoDraft.ID);

MessageDxUtil.ShowTips("保存草稿-" + (flag ? "成功" : "失敗"));
if (flag)
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
}

我們可以看到,草稿可以新增或者更新,如果對於已經存在的草稿,我們再次編輯的時候,不會新增另外一條記錄,而是修改原來的記錄。

對於普通單表的申請單處理,如下界面所示。

WinForm應用實戰開發指南

那麼它的保存草稿的功能代碼是如何實現的?

/// <summary>
/// 保存草稿處理
/// </summary>
private void btnSaveDraft_Click(object sender, EventArgs e)
{
string title = string.Format("{0}的付款申請單【{1}】(草稿)", LoginUserInfo.FullName, DateTime.Now.ToShortDateString());

var info = tempInfo;//必須使用存在的局部變量,因爲部分信息可能被附件使用
SetInfo(info);
info.Creator = base.LoginUserInfo.ID;
info.CreateTime = DateTime.Now;

//保存草稿:對象信息轉換爲JSON進行保存
SaveDraft(title, info.ToJson());
}

這裏保存實際上就是獲取對應的表單信息轉換爲JSON存儲即可。

例如對於費用及費用明細的報銷處理界面,如下所示。

WinForm應用實戰開發指南

那麼我們的草稿處理有什麼不同呢?

在填寫申請單的子類我們實現按鈕【存爲草稿】的單擊事件處理,代碼如下所示。

/// <summary>
/// 保存申請單草稿的處理
/// </summary>
private void btnSaveDraft_Click(object sender, EventArgs e)
{
string title = string.Format("{0}的{1}報銷申請單【{2}】(草稿)", LoginUserInfo.FullName, this.txtCategory.Text, DateTime.Now.ToShortDateString());
var info = tempInfo;//必須使用存在的局部變量,因爲部分信息可能被附件使用
SetInfo(info);
info.Creator = base.LoginUserInfo.ID;
info.CreateTime = DateTime.Now;

//獲取費用明細
var list = GetDetailList();

//保存草稿處理:如果有多個明細,可以增加在後面
SaveDraft(title, info.ToJson(), list.ToJson());
}

我們這裏需要把費用信息、明細信息的對象轉換爲JSON對象,然後統一調用基類的保存草稿函數即可。

而對於草稿信息加載,還原爲實際表單的信息顯示,我們處理代碼就是先解析JSON對象,轉換爲實際表單對象,然後進行界面賦值展示即可,如下代碼所示。

WinForm應用實戰開發指南

完成這些,我們就可以在實際申請單業務中進行草稿的存儲和顯示了。

WinForm應用實戰開發指南

三、界面代碼生成

以上代碼相對都比較簡單,不過我們爲了開發工作流模塊更加高效,統一使用代碼生成工具Database2Sharp進行界面的代碼生成即可,同時保存草稿、附件處理等代碼都一併生成,直接使用即可。

WinForm應用實戰開發指南

對於主從表表的界面,我們依舊也可以使用代碼生成工具進行快速的工作流界面生成。

WinForm應用實戰開發指南

本文轉載自:博客園 - 伍華聰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章