用户通过工作流管理系统可以更便捷的进行业务管理,而工作流引擎是工作流管理系统的核心部分,所以有必要对工作流引擎进行设计。用户需要通过工作流系统进行任务流程的定制,包括添加、删除、修改流程,并且可以直观的查看出任务的状态,可以通过任务列表察看未完成任务和已完成任务,可以进行任务指派,任务指派需要确认指派的基准和群体。用户在完成任务后,需要提交任务。
我们把基于工作流引擎的信息系统框架定义为:数据模型和控制模型。其中基于工作流引擎信息系统框架的数据模型又分为框架模型、机构模型和信息模型三类。控制模型将信息模型、机构摩型和框架模型有机的结合在一起,它根据其中定义的业务规则来流转业务流程,控制模型是工作引擎的控制中心。图1是基于工作引擎的信息系统通用框架的结构图。
添加图片注释,不超过 140 字(可选)
其中调度中心接受从个性化界面(外部接口)发送过来流程控制的请求(如业务初始化、获取任务以及结束任务等),根据不同的请求类型调用相应的处理模块完成与本次请求相关的操作并将结果返回。该操作是基于DBMS的并发机制和锁机制来实现工作流引擎的控制模型,不需要诸如请求队列等形式的数据结构。从而实现了多个外部请求之间的独立性。调度中心在收到活动节点状态变化触发之后,根据其后继控制节点的类型,调用不同的算法,计算并设置控制节点后继节点的状态,来生成状态图。所涉及到状态图中活动节点的各种状态,他们之间的转换关系见图2。
添加图片注释,不超过 140 字(可选)
图2状态转换图
任务管理主要根据调度中心的指示完成诸如任务创建、任务状态的转换以及相关数据的维护等工作。每次“结束任务”的外部请求将触发调度中心调用“任务管理”为后继活动(如果存在的话)创建新的实例;同时,其他不同的外部请求也将触发“任务管理”实施任务状态的切换。
任务指派处理只是针对常规交互活动活动,通常情况下,在任务状态由“睡眠状态”切换到“就绪状态”过程中完成任务的指派工作,即处于就绪状态的任务在通常情况下都确定了其执行者。任务指派过程首先根据任务指派基准确定可以执行此任务的群体人员,通常情况下这是一个包含多个人员的集合;然后根据任务指派方法确定由这个群体中的哪些个体来执行任务,执行任务的个体标识记录在相应任务记录的UserID字段中。
任务完成过后,需要将任务提交给调度中心,任务由“执行状态”切换到“处理结束通过状态”或“处理结束未通过状态”,同时激活下一个任务。
授衔做了个登陆界面,以方便测试用,然后添加了一个窗体,使用了一个tabControl控件,将tabPage1、tabPage2、tabPage3、tabPage4、tabPage5分别命名为:公司简介、状态图管理、任务管理、任务指派、提交任务。其中状态图管理、任务管理、任务指派是工作流引擎的核心部分,状态图管理中主要完成的是任务的定制,包括的功能有添加、删除、合并和分支,可以直接察看任务的状态。任务管理部分主要完成的是对任务的添加、删除,同时可以查看任务列表。任务指派部分主要完成的是对指派的基准和指派的群体进行确定。下面我们将主要对状态图管理、任务管理、任务指派进行介绍。
这个窗体主要用来定制工作流程和察看任务状态,包括添加流程,删除流程,流程合并,流程拆分,状态统计以及详细状态显示。
在这个窗体上用了4个ComboBox控件,6个GroupBox控件,17个label控件,5个Button控件,1个DataGridView控件,1个TextBox控件,1个panel控件。添加完毕后的窗体运行后如图8所示:
添加图片注释,不超过 140 字(可选)
在该窗体加载时进行数据库的连接,同时在左边表格中显示出数据。输入流程名,点确认添加。下拉列表将自动读取数据库中的流程名,选中一个流程名,单击确认删除,出现“删除任务流程成功”的对话框,点确定关闭。将鼠标光标移到流程拆分的文本框中,单击选中左边任务,然后确定拆分。先选中左边的任务,点添加流程到列表可以将要合并的任务移到列表中,也可点从列表中删除将任务移出,将要合并的任务移动到列表后,单击确认合并即可。状态图统计和下面的状态显示是根据数据中的信息变化的。点最下面的退出系统按钮可直接退出系统。
部分代码如下:
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]));
链接:https://pan.baidu.com/s/1Xwd0U_KktL0hRFPaggIOGQ?pwd=6688
提取码:6688