webreport

博客园 首页 新随笔 联系 订阅 管理

在工作流软件产品中,产品的扩展性和易用性是衡量软件产品的重要指标。

大家都知道,工作流软件系统会包含流程引擎,流程管理中心,流程设计器,任务调度,定时器管理等等......,其中流程引擎是核心,流程引擎完成对所有业务流程的抽象,建模,以及抽象的业务流程节点的定义、流转。但是流程引擎完成的是抽象的业务流程节点的流转,当给一个具体的业务流程建模后,启动这个业务流程,才开始一个具体的应用。在具体业务流程中,常常会伴随有一些具体的业务规则和业务过程的实现,这些是流程引擎中不包含的,流程引擎只负责通用的抽象的节点的流转和实现,具体的业务规则和过程,是和具体的应用系统紧密关联的。例如,审核月终报销的时候,要引入一些相应的规则来做判断,如部门经理引入部门经理级别的每月通讯费报销范围,餐费报销范围,交通费报销范围,等等,通过这些数据来判断报销申请是否审批通过。这个判断过程是和具体的应用紧密关联的。

 

 

在工作流引擎在设计之初,就应该考虑好如何方便的引入具体的业务规则和业务过程,当然这些业务规则和过程是需要有具体的实现的,不是流程引擎能做到的。
如何引入这些具体的业务规则和业务过程,常用的处理方案有3种。

 

1、在流程节点中挂接的业务模块中实现
2、在流程节点的前置后置事件和规则判断中引入
3、利用流程的变量表达式来实现

 


下面详解每种处理过程:

1、在流程节点中挂接的业务模块中实现
 
    工作流引擎给业务流程建模后,业务流程就按照定义的流程节点来流转,到达节点后,节点上挂接有业务模块,业务的办理就在业务模块中实现,工作流引擎是不负责具体的业务模块的实现。业务模块我们通常会利用开发工具做成一个页面或者是一个业务表单来实现,在业务表单中实现业务数据的录入,修改,甚至是和其它数据的关联交互等等。这种的业务表单,可以是利用开发工具定制的表单,如具体开发的jsp页面,aspx页面;也可以是利用表单工具可视化的画出的业务表单,如eform自定义表单通过拖拉的方式建立的htm页面。
    在业务表单中,可以方便的引入一些业务过程或者业务规则判断,如在提交产品入库单之后,更新产品库存表的库存数量,就可以在保存入库单的数据之后,再更新一下库存数据。

 



  
  
     在业务模块业务表单中实现的业务过程和业务规则,通常都是和流程上下文关联不是很紧密的,只是业务处理过程。这种的就可以直接在业务模块中实现。
 


2、在流程节点的前置后置事件和规则判断中引入

      工作流引擎抽象的节点,一般都会提供有前置后置事件函数,便于流程做业务过程的扩展。当流程运行到此节点的时候,会触发前置函数,离开此节点会执行后置函数,至于函数的内容,就是具体的业务过程了。
      在前置后置函数中,只需要实现固定的函数接口,如FunctionProvider,FunctionProvider接口有一个execute()方法,方法中包含3个参数(当函数运行时,通过execute()函数的3个参数,可以获得流程的相关信息,数据库链接,事务等等),业务过程就可以在此方法中实现。
 
 .net的FunctionProvider接口:
 void  execute(System.Collections.IDictionary transientVars, System.Collections.IDictionary args, PropertySet ps);
 
 java的FunctionProvider接口:
 public void execute(Map transientVars, Map args, PropertySet ps) throws WorkflowException;
 
 
      业务规则的引入通常是在流程节点的条件判断中引入,例如审核加班单,需要引入加班当天的指纹打卡考勤记录,加班的时间段,是否在指纹打卡考勤记录的时间段中,是则审核通过。这个过程判断,就可以实现一个规则判断接口,如Condition接口,提供一个passesCondition()函数,返回true,或false.  在passesCondition()函数中写具体的规则判断,流程的相关信息,等等都通过passesCondition()函数的三个参数来获取。
 
 .net的Condition接口:
  bool passesCondition(System.Collections.IDictionary transientVars, System.Collections.IDictionary args, PropertySet ps);
 
 java的Condition接口:
  public boolean passesCondition(Map transientVars, Map args, PropertySet ps) throws WorkflowException;

 


3、利用流程的变量表达式来实现 
 
 有些业务规则和过程常常会每个流程实例都不一样,这通常就需要在流程建模时引入变量或表达式,当流程实例运行时,给变量赋值。每流程实例赋的值可能不一样,这样来达到每个流程实例的不一样。
 例如;费用报销单的一审人,需要是报销单填写人的直接上级。而可以填写费用报销单人,可能是各个部门或所有员工都能填写。这样的话,就可以给一审的审核人定义一个变量,例如${xx_leader},当费用报销单填写完成后,就通过前置函数的业务过程,查找到当前申请人的直接上级,将上级的用户id,存到变量xx_leader中,当到达一审节点时,这个变量就有值了。


 


 变量又分为临时变量和持久化变量,临时变量仅存在于流程的一次流转当中,前面过程中给变量赋值,后面的过程就能获取到值了。
 持久化变量,只要保存了值了,后面的所有过程就都能使用了。
 
 
 利用流程的变量表达式的过程来实现业务规则和过程,常常还是需要辅助1,2两种方法来实现。
 
 
 在工作流软件产品中不需要包含具体的业务规则和业务过程的实现,但是一定要能方便的引入业务规则和业务过程,便于扩展。而通常工作流软件产品中,变量表达式,节点的前置后置事件等等都是为了方便做业务规则的扩展,合理的利用这些使得工作流软件系统和应用系统结合的更完美。
  
 

posted on 2011-05-03 11:16  web报表  阅读(3570)  评论(2编辑  收藏  举报