webreport

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

.net工作流系统之扩展性

最近为用户做工作流实施时,都无一例外的提出工作流系统的扩展性问题。


事件一:eworkflow工作流系统预置了一些系统的条件,前置后置函数等。如果这些不能满足业务需要,用户需要定制自己的业务规则,业务过程,该如何做?

解决方案:eworkflow系统预置了很多系统的条件类,前置后置函数类。简单一些的业务规则,可以直接用自定义脚本,写个表达式的方式来实现。

 如条件类的:判断用户是否有某个角色  cn.com.fcsoft.workflow.util.UserHasRoleCondition 
             判断是否是竞争型任务的签收人 cn.com.fcsoft.workflow.util.CompetitionTaskCondition
             ....
            
    事件类:将指定步骤的执行人保存到mostRecentCaller变量中 cn.com.fcsoft.workflow.util.MostRecentCaller
        ...

        
 打开我们的任意一个条件类 ,可以看到,条件类必须实现Condition接口,实现passesCondition()方法
 
 
 /// <summary> 判断调用者caller是否属于role参数所指的角色
 /// caller: userid  role: roleid
 /// </summary>
 public class UserHasRoleCondition : Condition
 {
  //~ Methods ////////////////////////////////////////////////////////////////
  
  public virtual bool passesCondition(System.Collections.IDictionary transientVars, System.Collections.IDictionary args, PropertySet ps)
  ....
 
 流程的上下文、相关的业务参数、数据库连接、当前操作员id等,均可以在passesCondition的三个参数中获得。
 
 因此在需要扩展业务规则的时候,可以扩展这种条件类,只需要在用户的应用系统中引用eworkflow.dll(java版的就是引入eworkflow.jar),新建业务规则类,实现Condition接口,在passesCondition方法中写业务规则就可以了,所有和流程相关的信息,节点定义的属性,业务参数,均可以从passesCondition方法的三个参数中获得。
  将写好的条件类注册到 WF_DSN_CLASS表中,在流程定义的时候,从节点的属性页中选择出这些扩展的业务规则,挂接到流程的节点上。在流程实例运行到此节点的时候,就会执行这些节点上定义的业务规则类,作出规则判断。
  
  下面是一个判断 当前操作员用户,是否属于某个区域的业务规则的判断
  
  
    
 

 -----------------------------------------条件和事件的分隔线-----------------------------------------------


  打开任意一个事件函数类,可以看到,事件函数类的,必须实现FunctionProvider接口,实现execute()方法
   public class MostRecentCaller : FunctionProvider
 {
  //~ Methods ////////////////////////////////////////////////////////////////
  
  public virtual void  execute(System.Collections.IDictionary transientVars, System.Collections.IDictionary args, PropertySet ps)
  
  和条件类的接口一样,流程的上下文、相关的业务参数、数据库连接、当前操作员id等,均可以在execute的三个参数中获得。集成开发文档中会有这三个参数的详细描述。
  
  在需要扩展业务事件,业务过程的时候,只需要在用户的应用系统中引用eworkflow项目或者eworkflow.dll((java版的就是引入eworkflow.jar),新建这种事件类,实现FunctionProvider接口,在execute()方法中写业务实现,所有和流程相关的信息,节点定义的属性,业务参数,均可以从execute方法的三个参数中获得。
  将写好的类注册到 WF_DSN_CLASS 表中,在流程定义的时候,从节点的属性页中选择出这些扩展的业务事件类,挂接到流程上。这样流程实例运行的时候,流转到相应的节点,就会执行节点上定义的这些业务事件。
  
  例如将当前操作员信息保存到流程的上下文中:
  

 

事件二:我们的eworkflow工作流系统的 待办任务列表 只有流程相关的信息,业务信息部分较少,集成到用户系统时,用户希望能自定义一些业务列信息。

解决方案:
 eworkflow工作流系统的任务表中,任务名称,是支持表达式的,在表达式中可以引入业务信息。例如任务名称为:审核 业务部 李明 的报销单。  业务部 李明 这两个信息均来自表达式,获取的是报销单中的记录信息。
 
 如果这样还是不能满足用户的需要,用户需要扩展列出多列业务表中的记录值。那就只能通过调用流程的获取待办任务列表的api函数来做了。

 具体过程如下:
 先通过调用工作流的api函数,获取待办任务列表
 
 ArrayList getCurrentTasks(System.String type, System.String wfId, System.String stepId);
 
 得到的是一个list,list的每一条是对应一条任务表的一个 IDictionary对象(java版的就是map对象),任务表的字段名为key,记录值为value。
 任务表中会记录任务信息关联的流程实例id, 通过流程实例id获得 和业务表的关联,找到业务表的记录,然后取出业务表中的多列信息,和任务信息 一起返回到页面显示,这样就获得了一个 包含多列具体业务信息的待办任务列表了。

posted on 2010-09-16 11:36  web报表  阅读(4257)  评论(4编辑  收藏  举报