⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 workflow_engine.java

📁 用java实现的工作流
💻 JAVA
字号:
package treedoc;

// 流程图引擎类..............请修改和添加功能
// 类似广度优先遍历法...............
// 独立运行,不受其它类的控制,一但开始节点的状态被设置为1,就自动调用该类,直到结束点被设置为1
// 该类是STEPMAIN类的控制类,通过该类调用stepmain类中的方法,向服务器返回流程状态
// 另外一个类似于消息传递的类通过读取本类中的返回数据,向客户端发送消息,要求处理流程
// 中的节点数据..并接收返回消息

/**
 * 名称       : WORKFLOW_ENGINE
 * 描述       : WWW.FANGFA.NET 工作流管理系统--流程图算法处理类
 * 版权信息   : Copyright (c) by COMSCI www.fangfa.net
 * @作者      : COMSCI Sichuan Fangfa Digital
 * @版本      : 0.9 builder 2004091910
 * @日期      : 2004/09/19
 */

//请结合JWFD基础文档(二)中的数据库结构查看

public class workflow_engine {

  private workflow_StepMain stm;
  private String graphid;
  private java.util.ArrayList dfs;

  public workflow_engine(String graph_id) {
    dfs = new java.util.ArrayList();
    graphid = graph_id;
    stm = new workflow_StepMain("");
  }

// 自动遍历图方法,处理发散和汇聚的情况

  public java.util.ArrayList dfs(String graphid, String stepid, int j) {

    java.util.ArrayList step_id = stm.return_nextSteps(graphid, stepid);

    // 取下一个邻节点的ARRAYLIST
    // 访问次数在step_main表中的visited 字段
    // 如果这个节点是最后一个节点,则把所有节点访问状态重新初始化,重新开始遍历

    if (!step_id.isEmpty()) { //如果返回的邻接点不为空,则开始
      for (int i = 0; i < step_id.size(); i++) { // 循环条件是节点的邻接点个数
        // 判断该节点前驱节点数是否大于1,由此进入处理模块,大于1则按路由处理,=1则按
        // 普通处理
        if (stm.return_preSteps(graphid, step_id.get(i).toString()).size() > 1) {

          //   System.out.println("");     //测试用输出

          if (!stm.get_visited(step_id.get(i).toString(), graphid)) { //路由节点未被访问过
            stm.set_visited_time(step_id.get(i).toString(), graphid, 1); //第一次访问设置标记是1
            //     this.dfs.add(step_id.get(i).toString());
            //     System.out.println(step_id.get(i).toString());  //测试用输出
          }
          else if (stm.get_visited_times(step_id.get(i).toString(), graphid) <
                   stm.return_preSteps(graphid, step_id.get(i).toString()).size() &&
                   stm.get_visited(step_id.get(i).toString(), graphid)
                   ) {

            //路由节点第二次被访问到最后一次被访问之前都应该在这里
            stm.set_visited_time(step_id.get(i).toString(), graphid, j + 1); //第二次以后就是J+1
            //     this.dfs.add(step_id.get(i).toString());
            //     System.out.println(step_id.get(i).toString()); //测试用输出
          }
          //路由最后一次被访问...这次的访问不设置访问标记值,完全是个跳转条件
          if (stm.get_visited_times(step_id.get(i).toString(), graphid) ==
              stm.return_preSteps(graphid, step_id.get(i).toString()).size()
              ) {
            System.out.println(step_id.get(i).toString());
            dfs.add(step_id.get(i).toString());
            dfs(graphid, step_id.get(i).toString(), i);  //进入递归方法
          }

        }
        // 普通节点的处理
        else if (stm.return_preSteps(graphid, step_id.get(i).toString()).size() ==
                 1) {

          if (!stm.get_visited(step_id.get(i).toString(), graphid)) {

     //     stm.set_visited(step_id.get(i).toString(), graphid);
    //      System.out.println(step_id.get(i).toString());  //测试用输出

            dfs.add(step_id.get(i).toString());
            dfs(graphid, step_id.get(i).toString(), i);
          }
        }
      }

      /*  伪码描述算法
          前驱路由点: 该点是N个节点的source点(N>1)
          后驱路由点: 该点有N个节点的target点(N>1)
       这个算法基本上可以解决分支和发散,与汇聚的流程图遍历问题
            for(int i =0  i <  当前节点的邻接点个数){
          if (该点是个前驱路由点) {
              if (该点没有被访问过) {
                  设置访问次数加(从递归方法中获得的循环控制变量)
                  返回
              }
              else if( 如果已经访问过,但是访问次数<它的前驱节点总数){
                   设置访问次数加(从递归方法中获得的循环控制变量+1)
                   返回
              }
              else if(总计访问次数=它的前驱节点总数){
                  递归进入下一个节点的访问(把大循环体的,循环变量带进去递归方法中)
              }

              }
              else if(如果是普通节点){
                  设置访问标志
                  递归进入下一个节点的访问(把大循环体的,循环变量带进去递归方法中)
              }
              }
       }
       */

    }
    return dfs;
  }

// 自动弹出流程处理窗口,如果是B/S系统该如何传递这个消息?
//
  /*  public void action_step(String stepid) {
      wcl = new workflow_client();
      wcl.jTextField2.setText(stepid);
      jf.setTitle("流程活动处理界面");
      jf.getContentPane().add(wcl);

      jf.setSize(230, 198);
      jf.setResizable(false);
      jf.show();

    }
   */
// 测试用的主程序
// public static void main(String argv[]) {

  //    WorkFlow_Engine we = new WorkFlow_Engine("test");
  //    we.dfs("tset","node0",0);


//  } //这里的第一个参数是流程图ID,第二个是第一个开始节点ID

  //   设置DFS自动机运行的时间间隔......启动一个线程的时间间隔
  //   创建一个线程
  //   设置线程的时间间隔...运行时间间隔
  //   将数据库中该流程的全部状态初始化为0
  //   if(节点X的活动状态标志为1)
  //   调用处理节点客户端窗口,中断该DFS
  //   if(最后一个节点活动标志为1)
  //   返回流程结束的标志
  //   退出程序

//  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -