`
eworkflow
  • 浏览: 220284 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

工作流系统之三十六 晒自由流实现代码,欢迎多提改进意见

阅读更多

工作流系统的自由流实现了不按照流程预定义的轨迹流转,即需要在节点之间任意的跳转。上一篇自由流的实现主要说明了跳转规律,如果是单节点间的跳转,只要有当前的节点,以及跳转到的节点,就ok了。但是当当前节点和任意跳转到的节点之间有分支并发线路后,就不是简单的跳转了,当分支套分支,分支主干等之间的跳转就更复杂了。



 
如果是这种串行路由,就很简单了。



 

但是这样的多路分支,分支嵌套分支的,就很复杂了。

因此在实现的时候,必需找出,当前节点到跳转到的节点之间的轨迹线路。又因为分支之间是可以嵌套的,所以必需用递归来遍历这之间的轨迹。

由当前节点开始,查找这个节点的动作结果节点是否为跳转到的节点,如果是,则找到之间的轨迹,返回。
如果不是,则将当前这个节点的动作结果节点作为当前节点,继续调用这个函数,查找,直到找到后退出。

因为流程定义的轨迹,可以是循环的轨迹,即一个节点的动作结果可以返回到前面的节点,如:



 

当返回到前面的节点时,用递归调用的话,就永远也退不出循环了。因此,将处理过的节点放到traceNodeList中,每次调用递归函数前,均判断一下,此节点是否在traceNodeList中,如果在,就不用处理了。不在的继续处理。


eworkflow自定义工作流系统有.net版和java版,两个版本的实现过程完全一样,只是一个是c#语言的一个是java语言的。


c#的递归函数:

  private ArrayList getJoinsAndSplitsBwteenStep(WorkflowDescriptor wd,IDictionary orgNodeMap,ResultDescriptor theResult,ArrayList traceNodeList)
  {                                
   ArrayList tagList = new ArrayList();
   string nodeType =(System.String)orgNodeMap["node_type"];
   AbstractDescriptor node = (AbstractDescriptor)orgNodeMap["node"];
     
   ArrayList results = new ArrayList();
   if (nodeType.Equals("join"))
   {  
    JoinDescriptor join = (JoinDescriptor)node;
    results.Add(join.Result);
   }
   if (nodeType.Equals("split"))
   {
    SplitDescriptor split = (SplitDescriptor)node;
    results.AddRange(split.Results);
   }
   if (nodeType.Equals("subflow"))
   {
    SubflowDescriptor subflow = (SubflowDescriptor)node;
    results.Add(subflow.unconditionalResult);
    results.AddRange(subflow.conditionalResults);
   }
   if (nodeType.Equals("step"))
   {
    StepDescriptor step = (StepDescriptor)node;
    ArrayList actions = step.actions;
    for (IEnumerator iter = actions.GetEnumerator();iter.MoveNext();)
    {
     ActionDescriptor action =(ActionDescriptor)iter.Current;
     ResultDescriptor result = action.UnconditionalResult;
     results.Add(result);
     results.AddRange(action.ConditionalResults);
    }       
   }
   bool bFind=false;
   for (IEnumerator it = results.GetEnumerator();it.MoveNext();)
   {
    ResultDescriptor result = (ResultDescriptor)it.Current;
    if (result.Id==theResult.Id)
    {//找到跳转到的节点,退出
     bFind = true;
     break;
    }
   }
   if (bFind) return tagList;
   //将当前处理节点 存入traceNodeList中
   traceNodeList.Add(node);
        
   for (IEnumerator iterator = results.GetEnumerator();iterator.MoveNext();)
   {
      
    ResultDescriptor resultDesc = (ResultDescriptor)iterator.Current;
    int joinid = resultDesc.join;
    int splitid = resultDesc.Split;
    int stepid = resultDesc.Step;
    int subflowid = resultDesc.subflow;
    int traceid = 0;
    IDictionary orgMap = new Hashtable();//记录节点信息
    if (joinid>0)
    {
     IDictionary m = new Hashtable();
     m["join"] = joinid;//new Integer(joinid);
     tagList.Add(m);
     JoinDescriptor join = wd.getJoin(joinid);
        
     orgMap["node_type"] = "join";
     orgMap["node"] = join;
     traceid = joinid;
    }
    if (splitid>0)
    {
     SplitDescriptor split = wd.getSplit(splitid);
     orgMap["node_type"] = "split";
     orgMap["node"] = split;
     IDictionary m = new Hashtable();
     m["split"] = splitid;// new Integer(splitid));
    
     for (int i=0;i<split.Results.Count;i++)
     {
      tagList.Add(m);    
     }
     traceid = splitid;
    }
    if (stepid>0)
    {
     StepDescriptor step = wd.getStep(stepid);
     orgMap["node_type"] = "step";
     orgMap["node"] = step;
     traceid = stepid;
    }
    if (subflowid>0)
    {
     SubflowDescriptor subflow = wd.getSubflow(subflowid);
     orgMap["node_type"] = "subflow";
     orgMap["node"] = subflow;   
     traceid = subflowid;
    }
    //判断 关联到的节点 是否处理过
    bool inTrace = false;
    for (IEnumerator itrace=traceNodeList.GetEnumerator();itrace.MoveNext();)
    {
     AbstractDescriptor trace = (AbstractDescriptor)itrace.Current;
     if (trace.Id==traceid)
     {//已经处理过的了
      inTrace = true;
      break;
     }    
    }
    if (!inTrace)
     tagList.AddRange(getJoinsAndSplitsBwteenStep(wd,orgMap,theResult,traceNodeList));
      
   }

   return tagList;

 


java的递归函数:

    private List getJoinsAndSplitsBwteenStep(WorkflowDescriptor wd,Map orgNodeMap,ResultDescriptor theResult,List traceNodeList) throws WorkflowException{

     List tagList =new ArrayList();
     String nodeType =(String)orgNodeMap.get("node_type");
     AbstractDescriptor node = (AbstractDescriptor)orgNodeMap.get("node");
     
     List results = new ArrayList();
     if (nodeType.equals("join")){
      JoinDescriptor join = (JoinDescriptor)node;
      results.add(join.getResult());
     }
     if (nodeType.equals("split")){
      SplitDescriptor split = (SplitDescriptor)node;
      results.addAll(split.getResults());
     }
     if (nodeType.equals("subflow")){
      SubflowDescriptor subflow = (SubflowDescriptor)node;
      results.add(subflow.getUnconditionalResult());
      results.addAll(subflow.getConditionalResults());
     }
     if (nodeType.equals("step")){
      StepDescriptor step = (StepDescriptor)node;
      List actions = step.getActions();
         for (Iterator iter = actions.iterator();iter.hasNext();){
          ActionDescriptor action =(ActionDescriptor)iter.next();
          ResultDescriptor result = action.getUnconditionalResult();
          results.add(result);
          results.addAll(action.getConditionalResults());
         }       
     }
     boolean bFind=false;
     for (Iterator it = results.iterator();it.hasNext();){
      ResultDescriptor result = (ResultDescriptor)it.next();
      if (result.getId()==theResult.getId()){//找到跳转到的节点,退出
       bFind = true;
       break;
       //return tagList;
      }
     }
     if (bFind) return tagList;
     //将当前处理节点 存入traceNodeList中
     traceNodeList.add(node);
     
  for (Iterator iterator = results.iterator();iterator.hasNext();){
   
   ResultDescriptor resultDesc = (ResultDescriptor)iterator.next();
   int joinid = resultDesc.getJoin();
   int splitid = resultDesc.getSplit();
   int stepid = resultDesc.getStep();
   int subflowid = resultDesc.getSubflow();
   int traceid = 0;
   Map orgMap = new HashMap();//记录节点信息
   if (joinid>0){
    Map m = new HashMap();
    m.put("join", new Integer(joinid));
    tagList.add(m);
    JoinDescriptor join = wd.getJoin(joinid);
    
    orgMap.put("node_type", "join");
    orgMap.put("node", join);    
    traceid = joinid;
   }
   if (splitid>0){
    SplitDescriptor split = wd.getSplit(splitid);
    orgMap.put("node_type", "split");
    orgMap.put("node", split);
    Map m = new HashMap();
    m.put("split", new Integer(splitid));
    //tagList.add(m);
    for (int i=0;i<split.getResults().size();i++){
     tagList.add(m);    
    }
    traceid = splitid;
   }
   if (stepid>0){
    StepDescriptor step = wd.getStep(stepid);
    orgMap.put("node_type", "step");
    orgMap.put("node", step);
    traceid = stepid;
   }
   if (subflowid>0){
    SubflowDescriptor  subflow = wd.getSubflow(subflowid);
    orgMap.put("node_type", "subflow");
    orgMap.put("node", subflow);   
    traceid = subflowid;
   }
   //判断 关联到的节点 是否处理过
   boolean inTrace = false;
   for (Iterator itrace=traceNodeList.iterator();itrace.hasNext();){
    AbstractDescriptor trace = (AbstractDescriptor)itrace.next();
    if (trace.getId()==traceid){//已经处理过的了
     inTrace = true;
     break;
    }    
   }
   if (!inTrace)
    tagList.addAll(getJoinsAndSplitsBwteenStep(wd,orgMap,theResult,traceNodeList));
   
  }

     return tagList;
    }

 


欢迎大家多提改进意见,或者有更好的解决方案共享 ^_^

 

 

<script type="text/javascript"></script>

  • 大小: 16 KB
  • 大小: 30.6 KB
  • 大小: 13.7 KB
0
0
分享到:
评论

相关推荐

    开源.NET工作流源代码NetBpm.rar

    对于开发者而言,掌握NetBpm的源代码意味着可以更自由地定制工作流功能,例如,添加新的流程节点类型,改进现有的任务分配算法,或者增强系统的监控和报告功能。通过这种方式,开发者可以打造出更加贴近实际业务场景...

    开源工作流系统 JWFD

    开源工作流系统 JWFD 是一个基于开放源代码的流程自动化工具,旨在帮助企业或组织实现高效、灵活的工作流程管理。在本文中,我们将深入探讨 JWFD 的核心特性、工作原理、优势以及如何使用它来优化业务流程。 一、...

    基于Java的开源工作流系统 JWFD.zip

    Java工作流定义(JWFD)是一个开源的工作流管理系统,专门设计用于在Java环境中实现灵活、可扩展和高效的工作流程自动化。该系统的核心理念是提供一个强大而易用的框架,帮助开发者快速构建符合业务需求的工作流程...

    基于工作流网的过程挖掘算法

    在实际应用中,"基于工作流网的过程挖掘算法.nh"这个文件可能包含了具体实现这些算法的代码、数据结构、实验结果和案例分析等。深入理解和掌握这些内容,对于从事工作流管理、业务流程优化或相关IT领域的专业人士来...

    jBPM详解_工作流管理系统详细文档

    ### jBPM详解_工作流管理系统详细文档 #### 一、jBPM入门简介与重要性 ##### 1.1 概述 jBPM,全称为Java Business Process Management(业务流程管理),是一款开放源码的业务流程管理、工作流管理和服务协作领域...

    Java开源工作流 Flow4j

    3. **工作流执行**:生成的Java代码可以直接运行,实现设计的工作流。Flow4j支持动态执行和调试,使得测试和优化流程变得更加便捷。 4. **可扩展性**:Flow4j具有良好的扩展性,允许开发者添加自定义的活动节点,以...

    dotnet-Wexflow一个具有跨平台管理器和设计器的可扩展工作流引擎

    这个工具的独特之处在于它提供了一个管理器和设计器,使得工作流的创建、管理和监控变得更加直观和便捷。在.NET开发领域,工作流引擎常用于构建复杂的业务流程,将一系列任务按特定顺序组织起来,实现自动化处理。 ...

    Anderson CFD 代码 matlab

    《Anderson CFD 代码 MATLAB》是一份专注于计算流体力学(CFD)的资源,它包含基于MATLAB语言实现的代码示例。这些代码源于Anderson的知名书籍,为读者提供了深入理解和应用CFD理论的实际操作平台。MATLAB作为一种...

    oa办公系统开源

    3. **工作流引擎**:OA的核心组件之一是工作流引擎,它负责定义、执行和监控业务流程,自动化审批流程。 4. **文档管理**:强大的文档管理系统是OA的重要组成部分,它应支持多种格式的文件存储、版本控制、预览和...

    Docflow:简单的工作流系统

    通过Apache许可证v.2.0,Docflow遵循开源原则,允许自由使用、修改和分发源代码,鼓励社区参与开发和改进。 综上所述,Docflow是一个使用C#和Windows Workflow Foundation构建的简单工作流系统,旨在简化组织内部的...

    FlowDesigner:一个用H5实现的工作流引擎的可视化编辑器。This is a UI for workflow

    2. 工作流引擎:工作流引擎是一种软件系统,它负责执行定义好的工作流程,包括任务分配、状态转移和审批流程等。FlowDesigner的工作流引擎允许用户以可视化的方式设计这些流程,然后将它们转换为可执行的逻辑。 3. ...

    管理系统系列--Open Source BMS 后台管理系统.zip

    6. **流程审批**:BMS支持自定义工作流,用户可以根据业务需求创建和配置审批流程,如请假申请、报销审批等,自动化处理日常事务,减少人为错误。 7. **数据管理**:系统需要具备强大的数据管理能力,包括数据存储...

    [JWFD开源工作流]最新版实时编译器(支持三角函数)

    【标题】"JWFD开源工作流"涉及的是一个最新的实时编译器,该编译器具有对三角函数的支持。这表明它可能是一个专为处理数学计算和算法优化的编程工具,尤其适合需要进行大量科学计算或者图形处理的场景。在IT领域,...

    JWFD开源工作流矩阵引擎升级代码包

    经过对60个节点和105个连接的流程图test119的矩阵数据的测试,发现,目前这个算法还存在问题,还需要改进和升级,暂时修改一下计划在JG的设计器的基础上,把矩阵引擎这块继续完善下去,不着急做自己的设计器,把引擎...

    H.264码流分析器(程序+源代码)

    雷神的H.264码流分析器是一款开源软件,这意味着其源代码对公众开放,用户可以自由查看、学习和改进。开源软件的一大优势在于促进技术交流与创新,用户可以根据自己的需求对其进行定制,或者参考其设计思路解决类似...

    信呼OA系统2.1.7版源码

    数据库则用于存储系统数据,如用户信息、工作流、文档等。 在功能方面,信呼OA系统涵盖了企业日常办公的多个关键模块。例如,它提供了人事管理,包括员工档案、考勤记录、薪资福利等功能,帮助企业管理员工信息;...

    Lassalle AddFlow.rar

    同时,它支持与数据库、Web服务和其他系统集成,实现了工作流与其他业务系统的协同工作,进一步提升了工作效率。 标签"C#FlowAddFlow"表明这个压缩包包含了与C#语言、工作流(Flow)和Lassalle AddFlow相关的资源。...

    2017-3-25最新Notepad++源代码

    Notepad++是一款非常受欢迎的免费源代码编辑器,尤其在编程社区中被广泛使用。它基于Windows操作系统,支持多种编程语言,并且具有丰富的自定义功能。2017年3月25日的Notepad++源代码更新是该软件发展历史上的一个...

    基于PHP的网上办公系统实现与安全设计.pdf

    该系统架构通常由七个子系统构成,包括用户管理子系统、文件管理子系统、邮件管理子系统、日程安排子系统、通讯录管理子系统、会议管理子系统和信息发布子系统等,每个子系统都具有不同的功能和作用。例如,用户管理...

    全新开源版本二开IPTV管理系统源码

    "全新开源版本二开IPTV管理系统源码" 文件名直接对应了整个项目的源代码,包含了系统的核心逻辑和结构,开发者可以通过阅读和修改这些代码来理解系统的工作原理,实现定制化需求。 **详细知识点** 1. **IPTV技术**...

Global site tag (gtag.js) - Google Analytics