SV全开源工作流设计器
介绍
SV工作流分为工作流设计器和工作流引擎两大组成部分。都是基于Visual Studio 2012 + FramWork4.5进行开发完成的。其中工作流设计器是基于Silverlight5 开发的全可视化操作模式。工作流引擎则是基于C#语言开发完成的独立引擎类库。结合asp.net MVC4框架,更好的完成了整个工作流的设计和使用。以下将详细介绍工作流设计器及引擎的工作原理及使用情况。
概况
市面上已经有很多成型的,而且功能很强大的工作流设计器,很多都是基于脚本或者插件来完成相应的设计操作。作者本人也试用过一些工作流设计器,几乎都对运行环境有着挺苛刻的要求,这个对使用者来说,无疑是个噩梦,因为不同的浏览器或者不同的PC,环境都会有所不一样,光是要显示完整的设计器页面,就要做很多的设置或安装一些未经认证的插件。所以作者选择了微软的Silverlight。类似于flash,只需安装一次Silverlight运行时即可。并且是几乎所有浏览器都可运行,大大简化了用户的使用要求。
原理
整个工作流是基于活动节点和路由设置来组成的。节点之间的流转是根据路由的设置来实现逻辑流转的;节点与路由的数据是通过工作流的变量来定义的。
这里也可以倒过来理解,就是先创建一个工作流,然后定义工作流里用到的变量,通过活动节点的设置,来控制每个节点的可用变量。在引擎进行节点推进的时候,根据判断路由设置的变量值来选择推进到的下个活动节点。这个我们稍后将以一个实例来进行演示说明,这里先说明工作原理。
工作流的活动节点是基于系统角色的。作者抛弃了以往绑定到人的观点,因为各个企业或单位,基础职务是基本固定的,变动的只是人,而我们讲的系统角色,又可以包含多个职务,这样无论人员的职务如何变化,都不会影响流转的逻辑。这样就可以大大降低工作流的维护工作。这里要做的,就是把系统角色与职务的关系做好就行,当然这个是需要我们费些心细和工作量的,对我们的工作流而言,这个必须要有,但我们这里不讲这个,因为这个涉及到整个系统的基础,而且有很多的实现方法,并且各不相同。
工作流设计器的主界面如下:
设计工作流的参考图如下:
使用
我们打开工作流设计器,会看到以下界面:
包括六个功能按钮,和一个空的设计界面。我们可以通过点击“新建工作流”或“打开工作流”来载入工作流的内容。这里,假设我们要建立一个请假的流程,其中涉及两个活动节点,一个是请假人填写的请假单数据节点,一个是对请假单进行审核的节点。我们点击“新建工作流”,将出现以下界面:
设置页面中出现了一个绿色和红色的节点,我们称绿色的节点为开始节点,红色的节点为结束节点,所有的工作流都会包含此两个节点,一切工作都是从开始节点开始,从结束节点结束。开始节点中的灰色小点为拖拽点,通过拖拽进行路由设置的创建。
一个还没有活动节点的工作流已经创建完毕,接下来我们要做的就是对工作流里涉及的变量进行定义,我们要创建的是一个请假的流程,涉及的数据就应该有:请假人、请假事由、请假起始日期、请假结束日期和审核情况。鼠标移到设计器内的空白处,点击鼠标右键,将弹出工作流的设置页面如下:
这里我们可以设置此工作流的名称及说明,还有定义工作流里涉及到的各个变量,变量的类型包括:单行字符类型、多行字符类型、 Html 格式字符型、整数型、数值型、日期型、日期时间型、选择型。
针对我们的请假单,我们创建以下变量:请假人(单行字符类型)、请假事由(多行字符类型)、请假起始日期(日期型)、请假结束日期(日期型)、是否允许(选择型)、审核说明(多行字符类型)。其中除了审核说明,其他的变量都是不允许为空,当变量类型为选择型的时候,我们还要点击后面的“…”按钮,进行选择内容的设置,是否允许变量,我们设置了两个选项,一个是允许,一个是不允许。变量列表中的变量顺序,是可以随便调整的,此变量的顺序,将会影响到用户在填写表单的时候的字段排序。如下图:
点击确定按钮,一个拥有工作流名称和变量的工作流框架就已经完成了。接下来的工作,就是要创建相关的节点和进行节点间的路由设置。
我们继续点击“添加活动”按钮,此时,设置界面中会多出一个长方形的节点,此长方形节点,就是我们的活动节点,可以通过鼠标对此活动节点进行移动,鼠标移到长方形边框和拖拽点之间的空白区域,按住鼠标左键可对此活动节点进行移动。开始和结束节点同样可以进行移动处理。我们添加两个活动节点,并移动这些节点,如下图:
按照我们的流程设计,第一个活动节点应该就是请假人填写请假单的数据,第二个节点是经理对请假单的审核动作,我们从开始节点开始,通过拖拽点,把这些节点的关系创建起来,鼠标按住拖拽点,拖到下一个节点上面,松开,即可建立节点之间的路由关系,我们需要建立的路由关系如下,从开始节点到填写请假表单到审核表单到流程结束。如下图:
此时我们工作流的大致流程就已经定好,接下来,就要对活动节点和路由进行设置,来实现我们的流转逻辑。我们先来设置活动节点,鼠标移到第一个节点,右键单击第一个节点,弹出设置框如下:
活动节点的设置,有4个大项:属性、执行角色、变量、提醒。
属性:设置活动节点的名称 和 节点的提交方式,提交方式有两种,一种是“角色中的任意一人处理后提交”,另一种是“角色中的所有人处理后提交”。
角色中的任意一人处理后提交:在执行角色项中指定的所有角色中,只要其中的任何一人处理了就进行提交操作。
角色中的所有人处理后提交:在执行角色项中指定的所有角色中,所有的人都要处理完后才进行提交操作。
此选项中,我们设置活动节点名称为:填写请假单;提交节点方式为:角色中的任意一人处理后提交。
选择执行角色项,出现的设置页面如下:
在指定执行角色页面,我们可以设置对此活动节点进行操作的角色类型。
由发起人对此活动进行处理:一旦选择了此项,下面的角色列表将不允许再进行选择,意思就是此节点将只能由工作流的发起人来进行操作。
由上一活动中动态指定的人员对此活动进行处理:一旦选择了此项,角色列表将不允许再进行选择,意思是在工作流的处理当中,此节点的处理人员是由上一个节点的执行人员进行动态指定的,选择此项后,还可以进行一个设置,是否一次性指定。意思就是,如果该节点在整个工作流程中会有多次执行的机会,那么是每次执行的时候都要上一节点的执行人进行动态指定,还是只需要指定一次,然后后面的都会采取第一次指定的人员来执行。
系统角色选择列表:选择可以执行该节点的角色,然后点击“>”按钮,添加到右边的当前节点执行角色当中。在当前节点执行角色列表中,还可以进行当前角色与发起人的机构或部门关系的设置,有三项,无指定、同机构、同部门。无指定的意思就是不加判断,只要是在此角色列表中的人都可以进行处理;同机构是指此执行角色列表中的处理人必须要和发起人在同一个机构内才能进行处理;同部门是指此执行角色列表中的处理人必须要和发起人在同一个机构内和同一个部门内才能进行处理。此关系设定可以大大提高我们工作流的适应范围。
此选项中,我们选择:由发起人对此活动进行处理。
选择变量项出现的设置页面如下:
在这里,我们可以看到在工作流里设置的所有变量,把此活动节点需要处理的变量添加到右边的当前活动变量列表中即可。当变量添加到当前活动变量列表中时,还可以对变量进行是否只读的设置,如果在只读的复选框上打上勾后,此变量在此活动节点的属性为只读,就是只允许读,不允许进行修改操作。
此选项,我们把请假人、请假事由、请假起始日期、请假结束日期 添加到当前活动变量中,并且都是可以编辑的变量。
选择提醒选项,出现以下界面:
此选项卡的作用,是当工作流流转到此活动节点时,是否需要对此节点的处理人进行一些信息提醒的设置。
提醒类型:包括从不提醒、马上提醒、延时提醒。从不提醒就是不需要提醒此节点的处理人员;马上提醒,就是指一旦流程执行到该节点,就马上对此节点的处理人员进行提醒操作;延时提醒,当选择了此项,后面的延时值为必填项,意思是当执行到该节点的时候,如果在指定的延时时间内,还没有处理,就开始对该节点的处理人进行提醒操作。
重复提醒类型:当提醒类型除从不提醒外的选项时,此项可以进行设置,可以设置为不重复和重复,当选择重复提醒时,需要设置后面的重复时间间隔。
我们选择从不提醒。
设置好此活动节点的相关项后,我们点击确定,以完成该节点的设置。
此时,设计器中的第一个活动节点有了一个“填写请假单”的下标如图:
接下来,我们用同样的方法对第二个活动节点进行设置,我们设置它的名称为“审核请假单”,活动节点提交方式,我们同样选择“角色中的任意一人处理后提交”。
选择执行角色的时候,我们选择经理角色,并设置当前角色与发起人的机构或部门关系为“同部门”,如下图:
意思就是,只有与请假单的发起人是同一个部门,并且是经理角色的人才能对此节点进行处理操作。
变量选项卡中,我们把所有的变量都添加到当前活动变量列表中,不过要对
请假人、请假事由、请假起始日期、请假结束日期这四个变量设置为只读,如下图:
意思就是说,经理审核的时候,对这四个只读的变量,他只有查看的权利,没有修改的权利,他只能对是否允许和审核说明这两个变量进行设置。
提醒选项卡中,我们依然选择从不提醒。点击确定,完成第二个活动节点的设置,如下图:
到此为止,我们已经对工作流和工作流的活动节点进行了相应的设置,此时,已经是一个可以执行的工作流了,但这样的工作流,是没有逻辑分析能力的,我们还需要对路由进行设置,才能让流程按照我们的意图去进行流转。
我们看当前的工作流,总共有三个路由,一个箭头代表一个路由,我们大概来分析一下,第一个路由,很明确,从流程开始,就直接到第一个节点,就是要发起人来填写请假单数据,填写完请假单数据后,就直接提交到了审核请假单的节点,流程一直到这里,都没什么问题,我们再看最后一个路由,审核请假单处理完毕后,就直接到流程完毕节点。整个过程好像还缺少了点什么。是的,缺少了发起人与审核人的交互环节,如果是直接通过了审核,就直接到流程完毕,也无异议。但是如果是审核没通过呢? 需要把审核的意见反馈到请假人哪里呢,怎么办?
好,我们此时需要对流程再加入一个路由,就是从审核请假单节点返回到填写请假单节点的路由。我们鼠标按住审核请假单的拖拽点,拖到填写请假单节点后放下,此时我们的流程图变成了以下,如图:
在两个活动节点之间,有了两个路由,由此可以看出,基本可以实现两个节点间的信息交流了。
这里需要说明一下:路由是可以进行设置或不用设置的,如果涉及到节点间的逻辑性流转,则需要对路由进行设置,如果是简单的一条线型的流程,则可以不用对路由进行设置,流程就会按步骤,一个节点一个节点的执行下去。
针对我们的流程,我们也只需要对审核请假单节点出来的两个节点进行路由的设置,我们先来设置从审核请假单节点到流程结束节点的路由。鼠标移到路由上,右键单击,弹出路由设置框如下:
路由名称:我们填入“审核通过并结束流程”。
路由的规则,是通过对工作流的变量值来进行对比形成的,这里可以添加多个变量对比规则来形成一个路由规则。多个变量规则的关系是 && (并且)的关系,意思是符合了所有的变量对比规则,才会去执行此路由。设置路由的时候,我们需要对此工作流有比较透彻的理解,才能准确的设置路由规则。
针对我们的请假流程,我们这里只设置是否允许变量等于允许,此条规则。意思就是一旦审核的时候,是否允许变量如果为允许,则此工作流就将直接结束。如下图:
点击确定按钮,再看我们的流程设计图,此时,此路由上会显示出该路由的名称。
同样,我们设置从审核请假单到填写请假单的路由如下:
意思是,当审核为不允许的时候,数据将返回到填写请假单的节点,让填写请假单的人可以看到审核的结果,如果仍需要进行提交,则继续提交,如果不需要再进行提交,则自己结束该流程即可。
设置好后,点击确定按钮,我们看看最后的整个流程图:
我们再来按着这个流程图来理解一遍整个流程。
由流程发起人填写请假单,提交到经理审核,如果经理审核允许请假,则直接结束流程,如果经理审核不允许请假,则审核信息反馈到请假人的手里,请假人可以对请假信息进行修改然后再进行提交审核处理,然后再去经过经理审核;或者结束该流程。
如此,我们就已经完成了一个请假流程的制作。点击“保存工作路”功能按钮,即可完成此工作流的保存,以后可随时调出此工作流进行修改或删除操作。
源码下载:
工作流设计器.rar