This commit is contained in:
那些花儿
2025-09-29 14:07:19 +08:00
parent 17a31212d2
commit 0bded12010
48 changed files with 1842 additions and 255 deletions
@@ -7,53 +7,128 @@ import com.budwk.app.flow.engine.handlers.IHandler;
import com.budwk.app.flow.engine.model.*;
import com.budwk.app.flow.service.ProcessTaskService;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* 合并分支操作的处理器
*/
public class MergeBranchHandler implements IHandler {
private JoinModel joinModel;
public MergeBranchHandler(JoinModel joinModel) {
this.joinModel = joinModel;
}
@Override
public void handle(Execution execution) {
// 判断是否存在正在执行的任务,存在则不允许合并
execution.setMerged(
execution.getEngine()
.processTaskService()
.getDoingTaskList(execution.getProcessInstanceId(),findActiveNodes()).isEmpty());
.processTaskService()
.getDoingTaskList(execution.getProcessInstanceId(), findActiveNodes()).isEmpty());
}
public static void findForkTaskNames(NodeModel node, StringBuilder buffer, Set<String> visitedNodes) {
if (node == null) return;
String nodeId = node.getName();
if (visitedNodes.contains(nodeId)) return;
visitedNodes.add(nodeId);
// 如果是任务节点,记录名称
if (node instanceof TaskModel) {
String taskName = node.getName();
if (buffer.indexOf(taskName) == -1) {
if (!buffer.isEmpty()) buffer.append(",");
buffer.append(taskName);
}
}
// 继续向上游递归(包括fork节点)
List<TransitionModel> inputs = node.getInputs();
for (TransitionModel tm : inputs) {
findForkTaskNames(tm.getSource(), buffer, visitedNodes);
}
}
/**
* 对join节点的所有输入变迁进行递归,查找join至fork节点的所有中间task元素
*
* @param node
* @param buffer
*/
public static void findForkTaskNames(NodeModel node, StringBuilder buffer) {
if(node instanceof ForkModel) return;
if (node instanceof ForkModel) return;
List<TransitionModel> inputs = node.getInputs();
for(TransitionModel tm : inputs) {
if(tm.getSource() instanceof TaskModel) {
for (TransitionModel tm : inputs) {
if (tm.getSource() instanceof TaskModel) {
buffer.append(tm.getSource().getName()).append(",");
}
findForkTaskNames(tm.getSource(), buffer);
}
}
/**
* 获取join节点的输入变迁中,所有从fork节点开始的任务名称
*
* @param node 当前节点
* @param buffer 存储中间task名称的StringBuilder对象
* @param visited 存储已访问的节点名称的Set对象
* @param foundFork 是否已经找到fork节点
*/
private static void findForkTaskNames(NodeModel node, StringBuilder buffer, Set<String> visited, boolean foundFork) {
// 如果已经访问过这个节点,直接返回避免死循环
if (visited.contains(node.getName())) {
return;
}
// 标记当前节点为已访问
visited.add(node.getName());
List<TransitionModel> inputs = node.getInputs();
for (TransitionModel tm : inputs) {
NodeModel sourceNode = tm.getSource();
// 如果源节点是fork节点,标记找到了fork,但不继续递归这个节点
if (sourceNode instanceof ForkModel) {
foundFork = true;
continue;
}
// 如果源节点是task,记录下来
if (sourceNode instanceof TaskModel) {
buffer.append(sourceNode.getName()).append(",");
}
// 继续递归(除非已经找到了fork节点且当前路径已经完成)
findForkTaskNames(sourceNode, buffer, visited, foundFork);
}
}
/**
* 对join节点的所有输入变迁进行递归,查找join至fork节点的所有中间task元素
*
* @see MergeBranchHandler#findActiveNodes()
*/
public String[] findActiveNodes() {
StringBuilder buffer = new StringBuilder(20);
findForkTaskNames(joinModel, buffer);
findForkTaskNames(joinModel, buffer, new HashSet<>(), false);
// findForkTaskNames(joinModel, buffer, visitedNodes);
// findForkTaskNames(joinModel, buffer);
String[] taskNames = buffer.toString().split(",");
return taskNames;
}
/**
* 判断流程是否可合并
*
* @param processInstanceId
* @param nodeModel
* @return
@@ -64,7 +139,7 @@ public class MergeBranchHandler implements IHandler {
MergeBranchHandler.findForkTaskNames(nodeModel, buffer);
String[] taskNames = buffer.toString().split(",");
ProcessTaskService processTaskService = ServiceContext.find(ProcessTaskService.class);
boolean isMerged = processTaskService.getDoingTaskList(processInstanceId,taskNames).isEmpty();
boolean isMerged = processTaskService.getDoingTaskList(processInstanceId, taskNames).isEmpty();
return isMerged;
}
}