執行個體示範如何使用RDIFramework.NET 架構的工作流元件進行業務流程的定義—請假流程
RDIFramework.NET工作流程元件是以RDIFramework.NET架構為支撐,根據我們多年的項目經驗和項目實踐,結合國内各大工作流産品的特點研發的一套流程管理元件。該元件不僅考慮到從零搭建業務系統,也考慮到與現有業務系統的整合。從零搭建系統我們可以使用RDIFramework.NET架構以基礎,來快速搭建業務系統。與現有系統的整合,我們的流程引擎提供了豐富的功能接口,供三方業務系統調用,并提供元件的全部源碼友善使用者進行整合。RDIFramework.NET工作流程元件采用SOA架構模式,流程引擎支援WCF方式通路。支援B/S、C/S系統,同時支援SQLServer、ORACLE等主流資料庫。
執行個體示範使用RDIFramework.NET 架構的工作流元件
進行業務流程的定義—請假申請流程-WinForm
參考文章:
RDIFramework.NET — 基于.NET的快速資訊化系統開發架構 — 系列目錄
RDIFramework.NET ━ .NET快速資訊化系統開發架構 ━ 工作流程元件介紹
RDIFramework.NET ━ .NET快速資訊化系統開發架構 ━ 工作流程元件Web業務平台
RDIFramework.NET ━ .NET快速資訊化系統開發架構 ━ 工作流程元件WinForm業務平台
執行個體示範使用RDIFramework.NET 架構的工作流元件進行業務流程的定義—請假申請流程-Web
RDIFramework.NET工作流程元件是以RDIFramework.NET架構為支撐,根據我們多年的項目經驗和項目實踐,結合國内各大工作流産品的特點研發的一套流程管理元件。該元件不僅考慮到從零搭建業務系統,也考慮到與現有業務系統的整合。從零搭建系統我們可以使用RDIFramework.NET架構以基礎,來快速搭建業務系統。與現有系統的整合,我們的流程引擎提供了豐富的功能接口,供三方業務系統調用,并提供元件的全部源碼友善使用者進行整合。RDIFramework.NET工作流程元件采用SOA架構模式,流程引擎支援WCF方式通路。支援B/S、C/S系統,同時支援SQLServer、ORACLE等主流資料庫。
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”的使用者登入系統,可以看到請假申請已經送出到了分公司總經理處。如下圖所示:
按同樣方式進行任務處理,再送出,流程就可以回到流程啟動使用者了。我們以流程啟動者登入進來看下,檢視下審批清單,如下圖所示:
同時我們可以檢視流程執行情況,如下圖所示:
至此,整個請假申請業務流程完成,目前在流程流轉的過程中還有很多操作,比如:任務的回退、授權、指派、召回等都可以輕易實作。
作者:
RDIFramework.NET
出處:http://www.cnblogs.com/huyong/
Email:[email protected]
QQ:406590790
微信:13005007127(同手機号)
架構官網:http://www.rdiframework.net/
架構官網部落格:http://blog.rdiframework.net/
架構其他部落格:http://blog.csdn.net/chinahuyong
http://www.cnblogs.com/huyong
RDIFramework.NET,基于全新.NET Framework與.NET Core的快速資訊化系統開發、整合架構,為企業快速建構垮平台、企業級的應用提供了強大支援。
關于作者:系統架構師、資訊系統項目管理師、DBA。專注于微軟平台項目架構、管理和企業解決方案,多年項目開發與管理經驗,曾多次組織并開發多個大型項目,在面向對象、面向服務以及資料庫領域有一定的造詣。現主要從事基于
RDIFramework.NET
架構的技術開發、咨詢工作,主要服務于金融、醫療衛生、鐵路、電信、物流、物聯網、制造、零售等行業。
如有問題或建議,請多多賜教!
本文版權歸作者和CNBLOGS部落格共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,如有問題,可以通過微信、郵箱、QQ等聯系我,非常感謝。