如何实现一个简单的工作流审批引擎——请看
2007-03-02 10:44
776 查看
[align=left]一直在探索一个可以灵活流转的OA工作流机制。以前听说都是用什么domino来做的,用ASP的时候很少有人去探求这个机制的实现方法。到了ASP.NET的时候好像大家都醒悟了,认识了工作流引擎,公司老板、CTO等都嚷嚷要上工作流引擎实现企业信息审批流程化。我公司也在去年引进了深信通的工作流引擎,作为公司其他系统开发调用的工作流审批组件,基本是符合WFMC标准的定义的。这个验收我也去了,看起来是很适合我们公司用的。它设计的思路如下:[/align]
[align=left]首先定义每个操做,就是定义流程步,定义流程步主要包括:操作的接口地址、操作参数、操作类型(起始操作、中间操作等)。定义操作的目的是接着为每个操作设置关系和定义流程时选用这些定义好的操作步。[/align]
[align=left]第二定义操作的参数,有了接口地址外,还需要定义操作参数。[/align]
[align=left]第三是定义操作步之间的关系。就是定义一个流程中每个操作步的前驱、后继的操作步。[/align]
[align=left]第四是定义流程了,必要的信息是流程名称等基本信息和定义流程的各个操作步以及流转规则。流程基本信息就不用说了。流程步定义比较复杂,设置定义步骤类型(起始、中间、终结),入口步骤、出口步骤、通知模式(邮件?短信),人员(以人员优先)、角色、发送通知的内容。[/align]
[align=left]第五是涉及跳步情况的定义,比如需要根据参数的不同提交到不同的步骤进行审批,这里叫做流程步骤变迁规则设置。设置的内容需要:原步骤、目标步骤、变迁方向(正/负)、条件规则(判断参数时用与还是用或)。接着设置参数和参数值及比较条件。[/align]
[align=left]第六是授权管理。这个比较简单了。判断被提交的人是否处于授权状态,是进行授权处理。[/align]
[align=left]上面介绍的是一种商业组件,没MONEY可用不到。下面来说说本人的“小土枪”。[/align]
[align=left]我的小土枪在行家的眼里可能不屑一顾,请不吝赐教.[/align]
[align=left]首先我的思路是:一个流程有多个流程步组成,一个系统模块有多个流程组成.在流程步里定义该步的审批人或审批的角色以及入口页面和参数、下一步可以提交的步骤等等。[/align]
[align=left]所以流程定义的就两个表,一个流程表,一个流程步表。流程表在定义流程时需要定义所属模块,其他都是简单的描述等. 这是一个表.表结构如下:[/align]
[align=left]PKID,流程名称\流程描述\启用时间\停用时间\停启用标志\所属模块[/align]
[align=left]流程步表包括如下信息:[/align]
[align=left]流程步ID、所属流程、流程步描述、流程步的审批人、流程步的审批角色、入口URL,出口URL,可提交的流程步(比如这步骤能提交到第4和第5步,这里就保存这个4,5)、可退回的流程步、还设置了一个是否可以选择全部人的标志,用于在如果提交下一步时如果不能明确事前制定某个审批人,就可以在在所有人中按部门筛选待办人员。还有一些待阅入口URL和查看的URL。下表可以看一下。[/align]
[align=left]FlowStepID[/align] | [align=left]int[/align] | [align=left]4[/align] |
[align=left]FlowID[/align] | [align=left]varchar[/align] | [align=left]10[/align] |
[align=left]FlowStepDescript[/align] | [align=left]varchar[/align] | [align=left]60[/align] |
[align=left]FlowStepCheckMan[/align] | [align=left]varchar[/align] | [align=left]40[/align] |
[align=left]FlowStepCheckRole[/align] | [align=left]varchar[/align] | [align=left]40[/align] |
[align=left]FlowStepTask[/align] | [align=left]varchar[/align] | [align=left]100[/align] |
[align=left]FlowStepUrl[/align] | [align=left]varchar[/align] | [align=left]250[/align] |
[align=left]FlowSltNext[/align] | [align=left]varchar[/align] | [align=left]100[/align] |
[align=left]SltOtherPsn[/align] | [align=left]bit[/align] | [align=left]1[/align] |
[align=left]FlowSltBack[/align] | [align=left]varchar[/align] | [align=left]100[/align] |
[align=left]FlowStepReadUrl[/align] | [align=left]varchar[/align] | [align=left]250[/align] |
[align=left]FlowViewURl[/align] | [align=left]varchar[/align] | [align=left]250[/align] |
[align=left]FlowNextNotes[/align] | [align=left]varchar[/align] | [align=left]100[/align] |
[align=left]FlowBackNotes[/align] | [align=left]varchar[/align] | [align=left]100[/align] |
[align=left]下面就要说怎么用了。[/align]
[align=left]先说一下背景,企业里的公文、各种单据流转实质上就是给“特定”人看某个页面,说的更白一点就是给那个审批人的待办工作模块增加一条记录,给他进去看的窗口。接着是他进行审批,这时有两种可能:退回跟通过(当然有些步骤还有编辑)。那么如何用上面设计的数据字典实现这些功能呢?首先看一个页面:[/align]
[align=left][/align]
[align=left]这是一个提交审批的流程,首先有一个下一流程步的列表框,这个列表框是用来显示可以提交的那几个流程步,就是按照数据表中的字段:FlowSltNext,这个字段里可以放几个流程步,中间用逗号隔开,所以下一流程步去数据就是先取出这个当前流程步的FlowSltNext值,然后再select ………WHERE PKID IN (FlowSltNext).这样就出来可选的流程步。如果下一流程步是可选的,还要根据用户所选的流程列出候选人,所以这个列表框应该自动回传服务器的。[/align]
[align=left]然后就是填写意见,这个没什么说的了。 [/align]
[align=left]最后就是选择候选人,把他加入到待办人员去,同样可以做出待阅的效果。[/align]
[align=left]如何列出候选人呢,根据用户选择的下一流程,查找FlowStepCheckMan(审批人)和FlowStepCheckRole(审批角色)内容,先找FlowStepCheckMan的内容,如果存在就不看FlowStepCheckRole的内容,已审批人优先,就按照审批人的内容列出获选人人名。如果FlowStepCheckMan没有内容,再看FlowStepCheckRole内容,按照FlowStepCheckRole内容选择属于这个角色的人名。[/align]
[align=left]对了还有如何记录审批人的审批动作问题,这里用了一个审批记录表,表结构是:[/align]
[align=left]CheckInstance[/align] | [align=left]varchar[/align] | [align=left]被审批实体的唯一标号[/align] |
[align=left]sysID[/align] | [align=left]int[/align] | [align=left]流水号[/align] |
[align=left]DealResult[/align] | [align=left]varchar[/align] | [align=left]处理结果(退回、通过)[/align] |
[align=left]DealPsn[/align] | [align=left]varchar[/align] | [align=left]处理人(审批人)[/align] |
[align=left]DealSDate[/align] | [align=left]datetime[/align] | [align=left]审批开始时间[/align] |
[align=left]DealEDate[/align] | [align=left]datetime[/align] | [align=left]审批结束时间[/align] |
[align=left]Idear[/align] | [align=left]varchar[/align] | [align=left]意见[/align] |
[align=left]FlowStep[/align] | [align=left]varchar[/align] | [align=left]流程步[/align] |
[align=left]UseFlow[/align] | [align=left]varchar[/align] | [align=left]流程[/align] |
[align=left]上面说完了提交流程的实现,那么如果选择退回呢,这个很简单,在流程记录表中查找出所有已审批过的流程步并且是属于流程步规定的可退回步骤,即FlowSltBack字段的内容。候选人按所选那一步的处理人列表就可以了。[/align]
[align=left]大概就这样吧,自己写得好辛苦。越写越没耐心。[/align]
[align=left] [/align]
[align=left] [/align]
相关文章推荐
- 如何实现一个简单的工作流审批引擎
- 【远程调用框架】如何实现一个简单的RPC框架(二)实现与使用
- C++多态是如何实现的——一个简单明晰的例子告诉你!
- JBPM学习(一):实现一个简单的工作流例子全过程
- 如何用phototype框架实现一个简单的ajax验证
- 详解如何实现一个简单的Node.js脚手架
- 工作流中实现一个节点多个节点的顺序审批
- 【远程调用框架】如何实现一个简单的RPC框架(一)想法与设计
- 中级JavaScript例子, 如何实现一个简单实用的模板套用机制, GXTemplate , 第一章(估计要写9章)
- 如何用viewpager写一个简单易用的安卓Bannner实现轮播
- 如何实现一个HTML5 RPG游戏引擎——第四章,实现情景对话
- Windows Sharepoint Services v3.0,一个简单的审批工作流
- 如何用java 5分钟实现一个最简单的mysql代理服务器?
- 如何做一个简单的开放接口(3)-核心引擎(下)
- 一个简单RPC框架是如何炼成的(III)——实现带参数的RPC调用
- 【Android】如何用MediaPlayer实现一个简单的音视频播放器
- 自行控制loadrunner的socket协议性能测试 (转) 一前言 二任务的提出 三实现方案讨论 四技术要点讲解 如何开始录制一个最简单的收发数据包脚本 写日志文件 一行一行读数据包文件 字
- linux设备驱动第三篇:如何实现一个简单的字符设备驱动
- 【远程调用框架】如何实现一个简单的RPC框架(三)优化一:利用动态代理改变用户服务调用方式
- 中级JavaScript例子, 如何实现一个简单实用的模板套用机制, GXTemplate , 第4章(估计要写9章)