實例演示使用RDIFramework.NET 框架的工做流組件html
進行業務流程的定義—請假申請流程-WinFormsql
參考文章:數據庫
RDIFramework.NET — 基於.NET的快速信息化系統開發框架 — 系列目錄架構
RDIFramework.NET ━ .NET快速信息化系統開發框架 ━ 工做流程組件介紹框架
RDIFramework.NET ━ .NET快速信息化系統開發框架 ━ 工做流程組件Web業務平臺ide
RDIFramework.NET ━ .NET快速信息化系統開發框架 ━ 工做流程組件WinForm業務平臺ui
實例演示使用RDIFramework.NET 框架的工做流組件進行業務流程的定義—請假申請流程-Webthis
RDIFramework.NET工做流程組件是以RDIFramework.NET框架爲支撐,根據咱們多年的項目經驗和項目實踐,結合國內各大工做流產品的特色研發的一套流程管理組件。該組件不只考慮到從零搭建業務系統,也考慮到與現有業務系統的整合。從零搭建系統咱們可使用RDIFramework.NET框架以基礎,來快速搭建業務系統。與現有系統的整合,咱們的流程引擎提供了豐富的功能接口,供三方業務系統調用,並提供組件的所有源碼方便用戶進行整合。RDIFramework.NET工做流程組件採用SOA架構模式,流程引擎支持WCF方式訪問。支持B/S、C/S系統,同時支持SQLServer、ORACLE等主流數據庫。spa
RDIFramework.NET━工做流組件主要涵蓋工做流的設計與定義、流程實例的發起與運行、業務流程的監控與管理、工做流組件與業務系統的集成與協做等內容。設計
員工請假流程在企業各大信息化系統中基本都會涉及到,本文我將向你們展現使用RDIFramework.NET工做流組件來自定義員工請假流程。目前的請假業務流程要求是這樣的:
員工請假首先要提交至請假人所在部門的「部分經理」審批,若是請假天數小於等於3天則「部門經理」有權直接審批,不然須要提交至「分公司總經理」審批。
請假申請業務流程咱們已經清晰,如今咱們使用RDIFramework.NET框架進行請假申請的定義。最終提供的請假流程以下圖所示:
如今請假申請的整個流程的定義咱們算完成了,下面咱們就開始開發請假表單,表單開發很是簡單,咱們能夠按常規的開發表單的方式進行開發,再加載到框架下便可。開發表單前咱們須要在數據庫中創建請假單這個數據表。同時表中須要包含如下四個字段:WorkFlowId(工做流主鍵)、WorkFlowInsId(工做流實例主鍵)、WorkTaskId(工做任務主鍵)、WorkTaskInsId(工做任務實例主鍵)。以下圖所示:
表定義好了,如今咱們就要進行業務表單的開發了,打開VS,開發請假申請表單,以下圖所示:
再編寫表單代碼,在代碼中能夠自由實現表單的業務邏輯,很是的靈活。同時流程的業務表單只須要繼承自咱們已經實現的基類(FrmBaseBizeForm)便可,再重載相應的方法。下面給了整個請假申請的業務表單實現代碼以供參考,以下所示:
using System; using System.Data; namespace RDIFramework.WorkFlow { using RDIFramework.BizLogic; using RDIFramework.Utilities; using RDIFramework.WinForm.Utilities; /// <summary> /// 請假申請 /// </summary> public partial class FrmQingJia : FrmBaseBizeForm { public FrmQingJia() { InitializeComponent(); } private void FrmQingJia_Load(object sender, EventArgs e) { base.Form_Load(); this.SetControlState(); this.ShowEntity(); } public override void SetControlState() { if (!string.IsNullOrEmpty(this.PageState)) { this.pnlTool.Enabled = this.PageState != WorkConst.STATE_VIEW; } if (!string.IsNullOrEmpty(this.CtrlState)) { gbMain.Enabled = btnSave.Enabled = this.CtrlState != "查看"; } else { gbMain.Enabled = btnSave.Enabled = false; } } public override void ShowEntity() { string sql = "select * from testQingjia where workflowinsId=@workflowinsId"; var sqlBuilder = new SQLBuilder(this.WorkFlowDbProvider); sqlBuilder.BeginSelect("testQingjia"); sqlBuilder.SetWhere("workflowinsId", WorkFlowInsId); DataTable dt = sqlBuilder.EndSelect(); if (dt != null && dt.Rows.Count > 0)//判斷是否有數據,有數據讀取數據庫中的值 { txtUserId.Text = dt.Rows[0]["userid"].ToString(); txtUserName.Text = dt.Rows[0]["userName"].ToString(); txtDuty.Text = dt.Rows[0]["dutyCaption"].ToString(); txtDepartment.Text = dt.Rows[0]["archCaption"].ToString(); dtBeginTime.Text = dt.Rows[0]["beginTime"].ToString(); dtEndTime.Text = dt.Rows[0]["endTime"].ToString(); txtDays.Text = dt.Rows[0]["Days"].ToString(); txtQingJia.Text = dt.Rows[0]["QingJia"].ToString(); cboQingJiaType.Text = dt.Rows[0]["QingJiaType"].ToString(); } else//若是沒有數據,初始化默認值 { txtUserId.Text = UserId; txtUserName.Text = UserName; txtDuty.Text = DutyCaption; txtDepartment.Text = ArchCaption; dtBeginTime.Text = DateTime.Now.ToShortDateString(); dtEndTime.Text = DateTime.Now.ToShortDateString(); } } public override void SaveFormData(bool isDraft) { base.SaveFormData(isDraft); var sqlBuilder = new SQLBuilder(this.WorkFlowDbProvider); string sql = "DELETE TESTQINGJIA WHERE WORKFLOWINSID=@WORKFLOWINSID";//先刪除原有數據 sqlBuilder.BeginDelete("testQingjia"); sqlBuilder.SetWhere("WORKFLOWINSID", WorkFlowInsId); sqlBuilder.EndDelete(); sqlBuilder.BeginInsert("testQingjia"); sqlBuilder.SetValue("WorkFlowId", WorkFlowId); sqlBuilder.SetValue("WorkTaskId", WorkTaskId); sqlBuilder.SetValue("WorkFlowInsId", WorkFlowInsId); sqlBuilder.SetValue("WorkTaskInsId", WorkTaskInsId); sqlBuilder.SetValue("ID", BusinessLogic.NewGuid()); sqlBuilder.SetValue("userId", txtUserId.Text); sqlBuilder.SetValue("userName", txtUserName.Text); sqlBuilder.SetValue("dutyCaption", txtDuty.Text); sqlBuilder.SetValue("archCaption", txtDepartment.Text); if (this.WorkFlowDbProvider.CurrentDbType == CurrentDbType.Oracle) { sqlBuilder.SetValue("BeginTime", !string.IsNullOrEmpty(dtBeginTime.Text) ? BusinessLogic.GetOracleDateFormat(DateTimeHelper.ToDate(dtBeginTime.Text)) : BusinessLogic.ConvertToDateToString(dtBeginTime.Text)); sqlBuilder.SetValue("EndTime", !string.IsNullOrEmpty(dtEndTime.Text) ? BusinessLogic.GetOracleDateFormat(DateTimeHelper.ToDate(dtEndTime.Text)) : BusinessLogic.ConvertToDateToString(dtEndTime.Text)); } else { sqlBuilder.SetValue("BeginTime", BusinessLogic.ConvertToDateToString(dtBeginTime.Text)); sqlBuilder.SetValue("EndTime", BusinessLogic.ConvertToDateToString(dtEndTime.Text)); } sqlBuilder.SetValue("Days", txtDays.Text); sqlBuilder.SetValue("QingJiaType", BusinessLogic.ConvertToString(cboQingJiaType.SelectedItem)); sqlBuilder.SetValue("QingJia", txtQingJia.Text); sqlBuilder.EndInsert(); } private bool CheckInput() { if (string.IsNullOrEmpty(BusinessLogic.ConvertToString(cboQingJiaType.SelectedItem))) { MessageBoxHelper.ShowWarningMsg("請選擇請假類型!"); cboQingJiaType.Focus(); return false; } if (string.IsNullOrEmpty(txtDays.Text)) { MessageBoxHelper.ShowWarningMsg("請假天數不能爲空!"); txtDays.Focus(); return false; } if(!MathHelper.IsDecimal(txtDays.Text)) { MessageBoxHelper.ShowWarningMsg("請假天數必須爲數值型!"); txtDays.Focus(); return false; } if (string.IsNullOrEmpty(txtQingJia.Text)) { MessageBoxHelper.ShowWarningMsg("請假事由不能爲空!"); txtQingJia.Focus(); return false; } return true; } private void btnSave_Click(object sender, EventArgs e) { if (!CheckInput()) { return; } this.SaveFormData(false); MessageBoxHelper.ShowSuccessMsg("保存成功!"); } } }
表單開發完成後,咱們須要在RDIFramework.NET框架中對錶單進行綁定,以下圖所示:
具體各項的說明能夠參考RDIFramework.NET工做流部分的介紹文檔。表單在框架中定義好後,咱們再在請假申請各任務節點對錶單進行綁定,須要說明的是,咱們是以主表單以基礎進行綁定的,這就表明一個任務節點能夠擁有多個表單,這對複雜的業務很是有用。下面看下請假流程中部門經理對錶單的綁定以下圖所示,在「表單名」後面的按鈕「...」就能夠打開選擇咱們已經定義的主表單,來做爲當前任務節點的表單列表。
請假申請是每一個登陸系統的人都應該可使用的業務流程,所以咱們把「請假申請」的啓動節點的處理才指定爲「全部人」,這就表明只要能登陸系統,就可使用「請假申請」流程。以下圖所示:
打開「平常業務」功能模塊,能夠看到當前用戶可使用的業務流程,以下圖所示:
在「可用業務」中選擇「行政部」,右側列出所選節點當前用戶有權限啓動的全部業務流程,咱們選擇「員工請假流程」,單擊「開始任務」,打開啓動任務主界面,以下圖所示。假設請假4天,則應由當前用戶所在部門經理審批的同時還須要分公司總經理審批。
單擊提交後,流程提交到部門經理「wikstone」處,以wikstone用戶登陸,在未認領任務界面,能夠看到請假申請已經提交給「部門經理處了,以下圖所示:
RDIFramework.NET工做流組件約定全部任務提交後都會進入對方未認領任務列表,這樣作的好處是:若是當前提交後想反悔,只要對方沒有認領,就能夠撤回任務。選擇「認領任務」後,進行待辦任務窗體,以下圖所示:
選擇一條待辦任務後,咱們能夠「處理任務」,放棄對當前任務的認領、查看當前任務的執行流程圖,當前任務的「處理記錄」等。咱們選擇「處理任務」按鈕,對當前任務進行處理,以下圖所示:
在「處理任務」主界面,咱們能夠作不少的操做,具體能夠參考RDIFramework.NET工做流組件的相關說明,這兒就不一一闡述了。填寫好審批意見後,單擊「提交」按鈕,便可根據流程定義(當前請假天數大於3天)提交到「分公司總經理」處審批。下面咱們以分公司總經理「lsx」的用戶登陸系統,能夠看到請假申請已經提交到了分公司總經理處。以下圖所示:
按一樣方式進行任務處理,再提交,流程就能夠回到流程啓動用戶了。咱們以流程啓動者登陸進來看下,查看下審批列表,以下圖所示:
同時咱們能夠查看流程執行狀況,以下圖所示:
至此,整個請假申請業務流程完成,當前在流程流轉的過程當中還有不少操做,好比:任務的回退、受權、指派、召回等均可以輕易實現。