📄 workflow_engine.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 + -