您的位置:首页 > 编程语言 > ASP

如何实现一个简单的工作流审批引擎

2010-01-16 04:35 543 查看
如何实现一个简单的工作流审批引擎——请看 收藏
 
一直在探索一个可以灵活流转的OA工作流机制。以前听说都是用什么domino来做的,用ASP的时候很少有人去探求这个机制的实现方法。到了ASP.NET的时候好像大家都醒悟了,认识了工作流引擎,公司老板、CTO等都嚷嚷要上工作流引擎实现企业信息审批流程化。我公司也在去年引进了深信通的工作流引擎,作为公司其他系统开发调用的工作流审批组件,基本是符合WFMC标准的定义的。这个验收我也去了,看起来是很适合我们公司用的。它设计的思路如下:
首先定义每个操做,就是定义流程步,定义流程步主要包括:操作的接口地址、操作参数、操作类型(起始操作、中间操作等)。定义操作的目的是接着为每个操作设置关系和定义流程时选用这些定义好的操作步。
第二定义操作的参数,有了接口地址外,还需要定义操作参数。
第三是定义操作步之间的关系。就是定义一个流程中每个操作步的前驱、后继的操作步。
第四是定义流程了,必要的信息是流程名称等基本信息和定义流程的各个操作步以及流转规则。流程基本信息就不用说了。流程步定义比较复杂,设置定义步骤类型(起始、中间、终结),入口步骤、出口步骤、通知模式(邮件?短信),人员(以人员优先)、角色、发送通知的内容。
第五是涉及跳步情况的定义,比如需要根据参数的不同提交到不同的步骤进行审批,这里叫做流程步骤变迁规则设置。设置的内容需要:原步骤、目标步骤、变迁方向(正/负)、条件规则(判断参数时用与还是用或)。接着设置参数和参数值及比较条件。
第六是授权管理。这个比较简单了。判断被提交的人是否处于授权状态,是进行授权处理。
上面介绍的是一种商业组件,没MONEY可用不到。下面来说说本人的“小土枪”。
我的小土枪在行家的眼里可能不屑一顾,请不吝赐教.
首先我的思路是:一个流程有多个流程步组成,一个系统模块有多个流程组成.在流程步里定义该步的审批人或审批的角色以及入口页面和参数、下一步可以提交的步骤等等。
所以流程定义的就两个表,一个流程表,一个流程步表。流程表在定义流程时需要定义所属模块,其他都是简单的描述等. 这是一个表.表结构如下:
PKID,流程名称\流程描述\启用时间\停用时间\停启用标志\所属模块
流程步表包括如下信息:
流程步ID、所属流程、流程步描述、流程步的审批人、流程步的审批角色、入口URL,出口URL,可提交的流程步(比如这步骤能提交到第4和第5步,这里就保存这个4,5)、可退回的流程步、还设置了一个是否可以选择全部人的标志,用于在如果提交下一步时如果不能明确事前制定某个审批人,就可以在在所有人中按部门筛选待办人员。还有一些待阅入口URL和查看的URL。下表可以看一下。
FlowStepID int 4
FlowID varchar 10
FlowStepDescript varchar 60
FlowStepCheckMan varchar 40
FlowStepCheckRole varchar 40
FlowStepTask varchar 100
FlowStepUrl varchar 250
FlowSltNext varchar 100
SltOtherPsn bit 1
FlowSltBack varchar 100
FlowStepReadUrl varchar 250
FlowViewURl varchar 250
FlowNextNotes varchar 100
FlowBackNotes varchar 100

定义就是这样了。
下面就要说怎么用了。
先说一下背景,企业里的公文、各种单据流转实质上就是给“特定”人看某个页面,说的更白一点就是给那个审批人的待办工作模块增加一条记录,给他进去看的窗口。接着是他进行审批,这时有两种可能:退回跟通过(当然有些步骤还有编辑)。那么如何用上面设计的数据字典实现这些功能呢?首先看一个页面:
这是一个提交审批的流程,首先有一个下一流程步的列表框,这个列表框是用来显示可以提交的那几个流程步,就是按照数据表中的字段:FlowSltNext,这个字段里可以放几个流程步,中间用逗号隔开,所以下一流程步去数据就是先取出这个当前流程步的FlowSltNext值,然后再select ………WHERE PKID IN (FlowSltNext).这样就出来可选的流程步。如果下一流程步是可选的,还要根据用户所选的流程列出候选人,所以这个列表框应该自动回传服务器的。
然后就是填写意见,这个没什么说的了。
最后就是选择候选人,把他加入到待办人员去,同样可以做出待阅的效果。
如何列出候选人呢,根据用户选择的下一流程,查找FlowStepCheckMan(审批人)和FlowStepCheckRole(审批角色)内容,先找FlowStepCheckMan的内容,如果存在就不看FlowStepCheckRole的内容,已审批人优先,就按照审批人的内容列出获选人人名。如果FlowStepCheckMan没有内容,再看FlowStepCheckRole内容,按照FlowStepCheckRole内容选择属于这个角色的人名。
对了还有如何记录审批人的审批动作问题,这里用了一个审批记录表,表结构是:
CheckInstance varchar 被审批实体的唯一标号
sysID int 流水号
DealResult varchar 处理结果(退回、通过)
DealPsn varchar 处理人(审批人)
DealSDate datetime 审批开始时间
DealEDate datetime 审批结束时间
Idear varchar 意见
FlowStep varchar 流程步
UseFlow varchar 流程

然后还要生成待办记录、更新审批实体的流程信息等等。
上面说完了提交流程的实现,那么如果选择退回呢,这个很简单,在流程记录表中查找出所有已审批过的流程步并且是属于流程步规定的可退回步骤,即FlowSltBack字段的内容。候选人按所选那一步的处理人列表就可以了。
大概就这样吧,自己写得好辛苦。越写越没耐心。
 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/torcher/archive/2007/03/02/1518895.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐