ASP.NET基于工作流引擎的系统框架设计开发
本文主要讲述了工作流引擎的基本功能及设计方法,介绍工作流引擎的基本原理,具体分析了工作流引擎所包含的内容,详细介绍了相关的信息模型和控制模型。系统采用关系结构的理念来设计工作流引擎,给出了用Microsoft Visual Studio 2005和Microsoft SQL Server2000实现系统的方法。论文中利用本工作流引擎构建系统能适应大多数业务流程的扭转,大大缩短常见信息系统的项目开发
摘 要
工作流就是一系列相互衔接、自动进行的业务活动或任务。工作流引擎是工作流管理系统的核心,它的主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互。
本文主要讲述了工作流引擎的基本功能及设计方法,介绍工作流引擎的基本原理,具体分析了工作流引擎所包含的内容,详细介绍了相关的信息模型和控制模型。系统采用关系结构的理念来设计工作流引擎,给出了用Microsoft Visual Studio 2005和Microsoft SQL Server2000实现系统的方法。论文中利用本工作流引擎构建系统能适应大多数业务流程的扭转,大大缩短常见信息系统的项目开发周期,提高效率。
关键词:工作流引擎;关键业务;关系
2.1 Visual C# 语言概述
Visual C#(读作“C sharp”)是 Visual Studio .NET 中引入的一种新的编程语言。C# 从 C 和 C++ 演变而来,是一种简单、现代、类型安全和面向对象的语言。设计 C# 是为了建立运行于 .NET 平台上的、范围广泛的企业级应用程序。用 Visual C# 编写的代码被编译为托管代码,这意味着它将受益于公共语言运行库的服务。这些服务包括:语言互操作性、垃圾回收、增强的安全性以及改进的版本支持。 在 Visual Studio .NET 中,Visual C# 完全得到项目模板、设计器、属性页、代码助理、对象模型和其他开发环境功能的支持。Visual C# 编程的库是 .NET Framework。
工作流引擎(Workflow Engine, WfE)的主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互。工作流需要依靠工作流引擎来调度、实现。作为工作流的核心应能提供以下几个方面的功能支持:解释过程定义;创建过程实例并控制其执行;调度各项活动;为用户工作表添加工作项;通过应用程序接口(API)调用应用程序;提供监督和管理功能等。
国际工作流管理联盟对工作流的过程模型提出了8种基本单元和6种控制结构。
8种基本单元分别是:开始活动、结束活动、原子活动、子过程、活动块、或节点、与节点、弧。
6种控制结构分别是:顺序结构、与分叉、与合并、或分叉、或合并、重复。
对于8种基本单元中,开始活动和结束活动本身没有实际意义,只是用来标识过程的开始和结束;子过程和活动块也可以分解为原子活动和各种控制结构的组合。这样下来,8种基本活动单元可以提炼出核心的是原子活动节点、与节点、或节点和弧四个基本单元。而6种控制结构,则可以看成是原子活动节点、与节点、或节点和弧的各种组合关系。进一步分析可以得出:6种控制结构是两个原子活动节点之间,由与节点、或节点和弧构成的控制单元。
所以,可以将原子活动单元单独提出来,我们把它称之为活动节点(Activity),将原子活动之间的各种连接方式(与节点、或节点和弧的组合)称之为基于计算机算法控制的由计算机自主完成的控制节点(ControlNode)。
近一步,我们可以在两个相邻的控制节点之间插入“哑活动”节点(是虚拟的,不做任何动作,但在计算机中创建活动实例)。这样任何一个工作流图就可以分解为活动节点和控制节点的前后连接。
这样,在一个流程实例的所有节点的状态图中,活动节点(包括“哑活动”节点)就是控制节点的流转算法的输入条件,控制节点查询状态图,与预制条件对比,就可以激活它的后续节点,从而达到工作流流转。
综上所述,它构建了一般信息系统的框架,在传统的关系数据库基础之上定义工作流数据模型;它利用DBMS内嵌的编程语言来实现工作流引擎的控制逻辑;开发者可以在此框架的基础上搭建自己的具有工作流特性的信息系统。基于工作流引擎的信息系统框架的适用对象并非应用系统的最终用户,而是利用专用开发工具构造相应应用系统的专业开发人员。
随着社会生产的流程化,工作流(Workflow)起着越来越重要的作业,工作流管理系统的核心是工作流引擎。对于企业来说,其生产经营活动就是由各种各样业务流程交织在一起组成的。然而,在企业管理中,许多流程在日常操作过程中已被习惯,而不被人们所重视,更不能被有效的管理起来。另外,客户的需求瞬息万变,而产品的生命周期也是在不断缩短,技术在不断创新。企业要在这样一个竞争和变换的外部环境中求得生存,就必须要有随需而变的能力,不断地调整和优化自身的各种业务流程,对流程进行重构和再造。
总结:先说明工作流管理系统的对当今企业的重要性,然后再说明工作流管理系统的核心是工作流引擎,最后分析目前我国企业管理的现状,更体现出有一套完善的工作流引擎系统对企业管理的重要性。
5.1.1 功能描述
这个窗体主要用来定制工作流程和察看任务状态,包括添加流程,删除流程,流程合并,流程拆分,状态统计以及详细状态显示。
在这个窗体上用了4个ComboBox控件,6个GroupBox控件,17个label控件,5个Button控件,1个DataGridView控件,1个TextBox控件,1个panel控件。添加完毕后的窗体运行后如图8所示:
图8 状态图管理页面截图
在该窗体加载时进行数据库的连接,同时在左边表格中显示出数据。输入流程名,点确认添加。下拉列表将自动读取数据库中的流程名,选中一个流程名,单击确认删除,出现“删除任务流程成功”的对话框,点确定关闭。将鼠标光标移到流程拆分的文本框中,单击选中左边任务,然后确定拆分。先选中左边的任务,点添加流程到列表可以将要合并的任务移到列表中,也可点从列表中删除将任务移出,将要合并的任务移动到列表后,单击确认合并即可。状态图统计和下面的状态显示是根据数据中的信息变化的。点最下面的退出系统按钮可直接退出系统。
部分代码如下:
string sql = "select top 1 count0=(select count(*) from TaskList where CompletionFlag=0 ),count1=(select count(*) from TaskList where CompletionFlag=1 ),count2=(select count(*) from TaskList where CompletionFlag=2 ),count3=(select count(*) from TaskList where CompletionFlag=3 ),count8=(select count(*) from TaskList where CompletionFlag=8 ),count9=(select count(*) from TaskList where CompletionFlag=9 ),maxcount=(select count(*) from TaskList) from TaskList";
read = SqlHelper.SqlHelpDao.ExecuteReader(ContClass.Constants.ConnectionString, CommandType.Text, sql);
while (read.Read())
{
this.Fettle[0] = double.Parse(read[0].ToString());
this.Fettle[1] = double.Parse(read[1].ToString());
this.Fettle[2] = double.Parse(read[2].ToString());
this.Fettle[3] = double.Parse(read[3].ToString());
this.Fettle[4] = double.Parse(read[4].ToString());
this.Fettle[5] = double.Parse(read[5].ToString());
this.Fettle[6] = double.Parse(read[6].ToString());
this.label13.Text = "任务流程未通过的有:" + Fettle[0].ToString() + "个";
this.label14.Text = "任务流程处理中的有:" + Fettle[1].ToString() + "个";
this.label15.Text = "任务流程已通过的有:" + Fettle[2].ToString() + "个";
this.label16.Text = "任务流程哑状态的有:" + Fettle[3].ToString() + "个";
this.label17.Text = "任务流程睡眠状态有:" + Fettle[4].ToString() + "个";
this.label18.Text = "任务流程等待状态有:" + Fettle[5].ToString() + "个";
this.label19.Text = "合计任务流程数共有:" + Fettle[6].ToString() + "个"
this.lbl0.Height = ((int)(this.lbl0.Height * (Fettle[0] / Fettle[6])) <= 1) ? 2 : (int)(this.lbl0.Height * (Fettle[0] / Fettle[6]));
this.lbl1.Height = ((int)(this.lbl1.Height * (Fettle[1] / Fettle[6])) <= 1) ? 2 : (int)(this.lbl1.Height * (Fettle[1] / Fettle[6]));
this.lbl2.Height = ((int)(this.lbl2.Height * (Fettle[2] / Fettle[6])) <= 1) ? 2 : (int)(this.lbl2.Height * (Fettle[2] / Fettle[6]));
this.lbl3.Height = ((int)(this.lbl3.Height * (Fettle[3] / Fettle[6])) <= 1) ? 2 : (int)(this.lbl3.Height * (Fettle[3] / Fettle[6]));
this.lbl4.Height = ((int)(this.lbl4.Height * (Fettle[4] / Fettle[6])) <= 1) ? 2 : (int)(this.lbl4.Height * (Fettle[4] / Fettle[6]));
this.lbl5.Height = ((int)(this.lbl5.Height * (Fettle[5] / Fettle[6])) <= 1) ? 2 : (int)(this.lbl5.Height * (Fettle[5] / Fettle[6]));
}
5.2 任务管理窗体
这个窗体主要用来显示未完成任务以及已完成任务,同时添加和删除任务。
在这个窗体上用了一个DataGridView控件,2个label控件,1个ComboBox控件,1个TextBox控件,3个Button控件。添加完毕后的窗体运行后如图9所示:
图9任务管理页面截图
在该窗体加载时进行数据库的连接,同时在上边表格中显示出数据库中的数据。选择任务的名称,输入预计完成任务的时间,点添加可以添加任务,成功会弹出“添加任务成功!!”。选中上面表中的数据,点击删除,会弹出提示“删除任务成功!!”。点击系统退出按钮可直接退出系统。
部分代码如下:
显示任务列表:
void GetTaskList()
{
string sql = "select 流水帐号=taskListID,任务类别编号=workNumber,任务人编号=UserID,任务指派人=TaskStatus,创建任务的时间=DateCreated,完成任务需要的时间=DateAccepted,任务完成的时间=dateCompleted,任务的状态=CompletionFlag from TaskList";
ds = SqlHelper.SqlHelpDao.ExecuteDataSet(ContClass.Constants.ConnectionString, CommandType.Text, sql, "TaskList");
this.dgTaskList.DataSource = ds.Tables["TaskList"];
}
添加任务:
private void btnListAdd_Click(object sender, EventArgs e)
{
if (this.cmbWorkName.SelectedIndex == -1)
{
MessageBox.Show("请选择任务名称!!");
}
else
{
if (this.txtListTime.Text.ToString().Trim() != string.Empty)
{
if (EntityDao.CheckStrToNo.IsNumeric(this.txtListTime.Text.ToString().Trim()) == false)
{
MessageBox.Show("请正确输入预计完成任务的时间!可以是整数或小数。");
}
else
{
EntityClass.TaskList task = new WorkBuffered.EntityClass.TaskList();
task.WorkName = this.cmbWorkName.SelectedItem.ToString().Trim();
task.DateAccepted = float.Parse(this.txtListTime.Text.ToString().Trim());
if (EntityDao.TaskListDao.TaskListAdd(task) == true)
{
MessageBox.Show("添加任务成功!!");
GetTaskList();
}
else { MessageBox.Show("操作错误!!"); }
}
}
}
}
5.3 任务指派窗体
这个窗体主要用来进行任务指派,首先选中要指派的任务,然后选择指派的基准,最后选择指派的群体。
在这个窗体上用了1个DataGridView控件,1个GroupBox控件,1个panel控件,2个ComboBox控件,4个Button控件,8个RadioButton控件。添加完毕后的窗体运行后如图10所示:
图10任务指派截图
在该窗体加载时进行数据库的连接,同时在左边表格中显示出数据。选中任务,点右移键将任务移到等待指派的任务列表中,也可点左移键将列表中的任务移出。然后选择指派的基准,即部门、团队、个人或自定义,右边的成员列表将自动给出相应的名称列表,然后选择指派的人群,最后点击确定即可。点击右下角的系统退出键可以直接退出系统。
部分代码如下:
获取未指派任务列表:
void GetWorkList()
{
this.cmbWorkUserList.Items.Clear();
this.cmbWorkList.Items.Clear();
string sql = "select 任务编号=TaskList.TaskListID,任务名称=WorkClassInfo.WorkName from WorkClassInfo,TaskList where WorkClassInfo.WorkNumber = TaskList.WorkNumber And CompletionFlag=8";
ds = SqlHelper.SqlHelpDao.ExecuteDataSet(ContClass.Constants.ConnectionString, CommandType.Text, sql, "WorkList");
this.dgWorkList.DataSource = ds.Tables["WorkList"];
System.Collections.ArrayList UserList = EntityDao.SysUserDao.GetUserName();
foreach (string str in UserList)
{
this.cmbWorkUserList.Items.Add(str);
}
UserList.Clear();
UserList = EntityDao.WorkListDao.GetWorkWait();
foreach (string str1 in UserList)
{
this.cmbWorkList.Items.Add(str1);
}
}
删除任务的方法:
private void btnWorkListDel_Click(object sender, EventArgs e)
{
//MessageBox.Show(this.cmbWorkList.SelectedItem.ToString().Trim());
if (this.cmbWorkList.Items.Count != 0)
{
int i = this.cmbWorkList.SelectedItem.ToString().Trim().IndexOf("-");
string str=this.cmbWorkList.SelectedItem.ToString().Trim().Substring(0, i);
if (EntityDao.WorkListDao.UpdateWorkListDel(int.Parse(str)) == true)
{
this.cmbWorkList.Items.Remove(this.cmbWorkList.Text);
}
MessageBox.Show(i.ToString());
}
this.cmbWorkUserList.Items.Clear();
this.cmbWorkList.Items.Clear();
GetWorkList();
}

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)