当前工作中需要手动实现一个简易的审批流,如下
在审批的过程中,如果到了最后一步,发现问题,要一步步回退,在回退的过程中,如何找到需要回退的节点。
从看图可看出
1、 流程是一个有序图,可以按照序号往回查找
2、流程的节点可以跳跃,往回查找时,就不能按照序号了
3、极端情况下流程可以按不同的路径来来回回审批退回好几次
这里需要把执行过的记录都记录到已办列表,每一条数据就是一个节点执行的记录。
这个过程,是不是就像一个栈,我们可以使用stack来查找下一步处理节点
public class ProcessNode {
String processId;
int index;
String name;
String code;
Result result;
String handleUser;
public static enum Result {
PASS,
REFUSE;
}
}
/**
* 如果正向的就是取下一步节点,或直接从前端传过来下一步,如果是拒绝,则从执行历史中找最后一步处理节点
* @return
*/
public ProcessNode getNextNodeWhenRefuse(String processApplyId) {
List<ProcessNode> nodes = new ArrayList<>(); // 从数据库中按申请流程的Id查出所有已办,以时间先后顺序排序
Stack<ProcessNode> stack = new Stack<>();
for (ProcessNode node : nodes) {
if (node.getResult() == ProcessNode.Result.PASS) {
stack.push(node);
} else {
if (!stack.empty()) {
stack.pop();
}
}
}
return stack.empty() ? null : stack.pop();
}