..
This commit is contained in:
@@ -17,6 +17,7 @@ import com.budwk.app.flow.entity.ProcessDefine;
|
||||
import com.budwk.app.flow.entity.ProcessInstance;
|
||||
import com.budwk.app.flow.entity.ProcessTask;
|
||||
import com.budwk.app.flow.enums.ProcessEventTypeEnum;
|
||||
import com.budwk.app.flow.enums.ProcessTaskPerformTypeEnum;
|
||||
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
|
||||
import com.budwk.app.flow.service.FlowCommonService;
|
||||
import com.budwk.app.flow.vo.HighLightVO;
|
||||
@@ -245,20 +246,30 @@ public class FlowCommonController {
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
@ApiOperation("撤销任务")
|
||||
public Result revokeTask(@Param("taskId") Long taskId) {
|
||||
// 1.撤销任务
|
||||
// 自己任务
|
||||
ProcessTask selfTask = dao.fetch(ProcessTask.class, taskId);
|
||||
selfTask.setTaskState(ProcessTaskStateEnum.DOING.getCode());
|
||||
|
||||
// 撤销任务
|
||||
List<ProcessTask> taskList = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getTaskParentId, "=", taskId));
|
||||
for (ProcessTask processTask : taskList) {
|
||||
processTask.setTaskState(ProcessTaskStateEnum.WITHDRAW.getCode());
|
||||
dao.update(processTask);
|
||||
for (ProcessTask task : taskList) {
|
||||
task.setTaskState(ProcessTaskStateEnum.WITHDRAW.getCode());
|
||||
dao.update(task);
|
||||
}
|
||||
// 会签并行任务 撤销后续任务
|
||||
if (selfTask.getPerformType().equals(ProcessTaskPerformTypeEnum.COUNTERSIGN.getCode())) {
|
||||
List<ProcessTask> doingTasks = dao.query(ProcessTask.class, Cnd.where(ProcessTask::getTaskState, "=", ProcessTaskStateEnum.DOING.getCode())
|
||||
.and(ProcessTask::getProcessInstanceId, "=", selfTask.getProcessInstanceId()));
|
||||
for (ProcessTask doingTask : doingTasks) {
|
||||
doingTask.setTaskState(ProcessTaskStateEnum.WITHDRAW.getCode());
|
||||
dao.update(doingTask);
|
||||
}
|
||||
}
|
||||
|
||||
// 2.再次激活自己任务
|
||||
ProcessTask processTask = dao.fetch(ProcessTask.class, taskId);
|
||||
processTask.setTaskState(ProcessTaskStateEnum.DOING.getCode());
|
||||
dao.update(processTask);
|
||||
// 激活
|
||||
dao.update(selfTask);
|
||||
|
||||
|
||||
// 3.发送任务撤回事件 确保上面执行成功
|
||||
// 发送任务撤回事件 确保上面执行成功
|
||||
for (ProcessTask task : taskList) {
|
||||
ProcessPublisher.notify(ProcessEvent.builder().eventType(ProcessEventTypeEnum.PROCESS_TASK_REVOKE).sourceId(task.getId()).build());
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,6 +197,7 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl<ProcessTask> impleme
|
||||
System.out.println("创建任务:" + processTask.getTaskName() + "," + processTask.getDisplayName());
|
||||
processTaskList.add(processTask);
|
||||
addTaskActor(processTask.getId(), getTaskActors(taskModel, execution));
|
||||
|
||||
return processTaskList;
|
||||
}
|
||||
|
||||
@@ -392,11 +393,6 @@ public class ProcessTaskServiceImpl extends BaseServiceImpl<ProcessTask> impleme
|
||||
|
||||
// 增加是否为第一个任务节点标识
|
||||
execution.getArgs().put(FlowConst.IS_FIRST_TASK_NODE, FlowUtil.isFistTaskName(execution.getProcessModel(), taskModel.getName()));
|
||||
//过滤上个任务的表单数据 避免造成污染 每个任务只保存自己的表单数据
|
||||
// List<String> removeKeys = execution.getArgs().keySet().stream().filter(k -> k.startsWith(FlowConst.TASK_FORM_DATA_PREFIX) || k.equals(FlowConst.SUBMIT_TYPE)).toList();
|
||||
// for (String key : removeKeys) {
|
||||
// execution.getArgs().remove(key);
|
||||
// }
|
||||
|
||||
processTask.setVariable(JSONUtil.toJsonStr(execution.getArgs()));
|
||||
processTask.setCreatedAt(now);
|
||||
|
||||
Reference in New Issue
Block a user