zoukankan      html  css  js  c++  java
  • 工作流系统之二十六 .net工作流系统之扩展性

    .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获得 和业务表的关联,找到业务表的记录,然后取出业务表中的多列信息,和任务信息 一起返回到页面显示,这样就获得了一个 包含多列具体业务信息的待办任务列表了。

  • 相关阅读:
    local_irq_disable和disable_irq的区别
    linux内核IDR机制详解【转】
    飞秋2013设置后无法保存配置问题
    windows 格式化D盘
    query 中 radio选中小技巧
    磁盘碎片整理
    服务器如何选择备案产品类型?
    虚拟主机需要备案吗?
    操作系统自带的截图工具无法保存问题
    CA210彩分仪校准步骤
  • 原文地址:https://www.cnblogs.com/webreport/p/1827941.html
Copyright © 2011-2022 走看看