133_基于工作流引擎的系统框架
以下是资料介绍,如需要完整的请充值下载.
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
资料介绍:
4.2 功能描述
这个系统主要涉及到状态图管理、任务管理、任务指派、任务提交。
状态图管理:包括添加、删除、修改流程。对流程进行控制,包括无条件转移、与分支控制、与合并控制、或分支控制、或合并控制、投票合并控制。查看任务的状态,包括了睡眠状态、就绪状态、执行状态、完成通过状态以及完成未通过状态,不同的任务状态显示为不同的颜色。
任务管理:从数据库中读取出任务列表,其中包括未完成任务和已完成任务,任务列表中包括了任务建立的时间,预计完成任务的时间,完成任务人员,任务完成时间。同时可以添加新任务。
任务指派:包括等待指派的任务,任务指派的基准以及任务指派的人群。其中任务指派的基准包括基于部门进行任务指派、基于团队进行任务指派、基于角色进行任务指派、基于自定义的方式进行任务指派。任务指派的人群包括将任务分配指定的所有人员,将任务分配给指定群体中的工作量最少的人员,将任务队列中最早创建的任务分配给相应群体中最先提出执行任务请求的个体,基于优先数分配。
任务提交:任务结束后提交系统。
4.3 工作流引擎的详细设计
根据工作流引擎的工作流程,综合上述的各功能模块,设计出的系统模块图如图5所示:
copyright think58
[资料来源:THINK58.com]
图5系统模块图
状态图管理如图6:
图6状态图管理
用户通过对活动节点进行操作,主要操作动作有以下表1所示:
表1控制节点类型
控制类型名 中文名 说明
DIRECT 无条件转移 不做任何动作,直接激活下一个节点。
AND_BRANCH 与分支控制 流经此处的任务将进行与分支,通过查找TaskStatus表来决定下一动作。
AND_MERGE 与合并控制 流经此处的任务将进行与合并同步,通过查找TaskStatus表来决定下一动作。
OR_BRANCH 或分支控制 流经此处的任务将进行或分支,通过查找TaskStatus表来决定下一动作。
OR_MERGE 或合并控制 流经此处的任务将进行或合并同步,通过查找TaskStatus表来决定下一动作。
VOTE_MERGE 投票合并控制 通过查找TaskStatus表来决定投票结果。
上面所定义的6种控制类型的节点,若不能满足业务要求,可以自定义其他的控制节点类型。
一个流程实例产生之时一并产生所有活动节点的初始状态,生成以后则由控制节点来动态修改其状态。任务状态主要有6种:睡眠状态、就绪状态、执行状态、完成通过状态以及完成未通过状态。睡眠状态:流程实例创建时统一设置所有活动节点为该状态,等待唤醒。就绪状态:前趋控制节点将活动唤醒,等待人工处理。执行状态:表示正在进行人工处理,等待处理结果。完成通过状态:表示人工处理结束,移交给控制节点继续下一步处理。完成未通过状态:表示人工处理结束,处理意见为“否决”,同时移交给控制节点继续下一步处理。 本文来自think58
[资料来源:http://think58.com]
任务列表用于记录那些已经创建但尚未完成的任务以及已完成的任务,它们之间用CompletionFlag标记。
任务指派是指依照某种规则将任务分配给具体人员来执行。只有常规交互活动才涉及到任务指派的问题;其他活动要么在前台不具备实际的应用逻辑,要么由工作流引擎自动调用,因此与任务指派无关。任务指派的基准是:基于部门进行任务指派、基于团队进行任务指派、基于角色进行任务指派、基于自定义的方式进行任务指派。任务指派的基准确定以后,再确定执行任务的群体,具体指派到哪些实际人员还取决于任务指派方法。指派方法有四种:ALL:表示任务将分配给由BasedOn指定的群体中的所有人员。LEAST_WORKING_LIST:表示任务将分配给指定群体中的工作量最少的人员,工作量的多少可以通过ToDoTaskList的统计数据得到。FCFA:表示先来先分配, 即将任务队列中最早创建的任务分配给相应群体中最先提出执行任务请求的个体,任务的创建时间由DateCreated指示。PRIORITY:表示基于优先数分配, 只适合于ROLE_BASED任务指派基准。在表UserInRole中有个字段PriorityNo用于指定相应人员的优先级。用户也可以根据具体需要来添加新的任务指派方法。
4.4 数据库结构的设计
根据前面的模块功能设计,系统所需要的数据库应包括“活动节点表”,“业务过程表”,“控制节点表”,“任务指派规则表”,“任务状态表”,“任务列表”等,各部分各自作为一个表存在。
think58好,好think58
[版权所有:http://think58.com]
具体设计如下:
1.活动节点表
用于存放活动节点信息,具体设计如表2所示:
表2 活动节点表
字段名 数据类型 说明
ActID Int 活动编号
ProcID Int 业务编号
ActName Varchar(20) 活动名称
ActType Varchar(20) 活动类型
TimeAllowed Datatime 接受时间
PreCtrNodelist varchar(20) 前面的控制结点表
NextCtrNodelist varchar(20) 后面的控制结点表
2.业务过程表
用于存放业务过程,具体设计如表3所示:
表3业务过程表
字段名 数据类型 说明
ProcID Int 业务编号
ProcName varchar(20) 业务名称
ProcDesc varchar(20)
3.控制节点表
用于存放控制节点,具体设计如表4所示:
表4 控制节点表
字段名 数据类型 说明
CtrNodeID Int 控制节点编号
ActID Int 活动编号
ProcID Int 项目编号
CtrNodeName varchar(20) 控制节点名
CtrNodeType Varchar(20) 控制节点类型
CtrNodeDesc varchar(20)
PreActNodelist varchar(20) 前次的活动结点目录
NextActNodelist varchar(20) 下次的活动结点目录
ExecCtrFunc varchar(20) 实行的控制关系 think58.com
[来源:http://www.think58.com]
PassedPercentage float 通过的百分率
Parameterlist varchar(20) 参数目录
4.任务指派规则表
用于存放任务指派规则,具体设计如表5所示:
表5 任务指派规则表
字段名 数据类型 说明
TeamID Int 团队编号
DeptID Int 部门编号
ActID Int 活动编号
BasedON varchar(20) 任务指派的基准
Method Varchar(20) 任务指派的群体
ExeFuncID Int 可执行的关系编号
5.任务状态表
用于存放任务状态,具体设计如表6所示:
表6 任务状态表
字段名 数据类型 说明
SerialNo Int 流水号
TaskID Int 任务编号
ActID Int 活动编号
ProcID Int 业务编号
TaskStatus varchar(20) 任务状态
EntityID Int 实体编号
6. 任务列表
用于存放为完成任务和已完成任务,具体设计如表7所示:
表7 任务列表
字段名 数据类型 说明
SerialNo Int 流水号
TaskID Int 任务编号
EntityID Int 实体编号
UserID Int 用户号
TaskStatus varchar(20) 任务状态
DateCreated Datatime 创建时间
DateAccepted Datatime 开始执行时间 copyright think58
[来源:http://think58.com]
DateCompleted Datatime 完成时间
CompletionFlag Int 任务的状态
数据库关系图如图7所示:
图7数据库关系图
总结: 对整个工作六引擎系统的功能模快的详细设计和所运用的Microsoft SQL Server2000数据库表的详细介绍。
5 工作流引擎的实现
授衔做了个登陆界面,以方便测试用,然后添加了一个窗体,使用了一个tabControl控件,将tabPage1、tabPage2、tabPage3、tabPage4、tabPage5分别命名为:公司简介、状态图管理、任务管理、任务指派、提交任务。其中状态图管理、任务管理、任务指派是工作流引擎的核心部分,状态图管理中主要完成的是任务的定制,包括的功能有添加、删除、合并和分支,可以直接察看任务的状态。任务管理部分主要完成的是对任务的添加、删除,同时可以查看任务列表。任务指派部分主要完成的是对指派的基准和指派的群体进行确定。下面我们将主要对状态图管理、任务管理、任务指派进行介绍。
5.1 状态图管理的设计
5.1.1 功能描述
这个窗体主要用来定制工作流程和察看任务状态,包括添加流程,删除流程,流程合并,流程拆分,状态统计以及详细状态显示。
5.1.2 界面设计
在这个窗体上用了4个ComboBox控件,6个GroupBox控件,17个label控件,5个Button控件,1个DataGridView控件,1个TextBox控件,1个panel控件。添加完毕后的窗体运行后如图8所示:
[来源:http://www.think58.com]
图8 状态图管理页面截图
5.1.3 工作流程和部分代码
在该窗体加载时进行数据库的连接,同时在左边表格中显示出数据。输入流程名,点确认添加。下拉列表将自动读取数据库中的流程名,选中一个流程名,单击确认删除,出现“删除任务流程成功”的对话框,点确定关闭。将鼠标光标移到流程拆分的文本框中,单击选中左边任务,然后确定拆分。先选中左边的任务,点添加流程到列表可以将要合并的任务移到列表中,也可点从列表中删除将任务移出,将要合并的任务移动到列表后,单击确认合并即可。状态图统计和下面的状态显示是根据数据中的信息变化的。点最下面的退出系统按钮可直接退出系统。
部分代码如下:
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";
copyright think58
[资料来源:http://www.THINK58.com]
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() + "个"; 内容来自think58 [资料来源:http://think58.com]
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])); think58好,好think58 [资料来源:http://think58.com]
}
copyright think58 [资料来源:THINK58.com]
[来源:http://www.think58.com]