From af9f5d64bb0667b63477b2e5c66dc6d788a4b3c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=91=E5=B9=B4=E6=A2=A6=E4=B8=8E=E7=A0=96?= <2847127106@qq.com> Date: Sun, 1 Sep 2024 16:47:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=BB=E5=8A=A1=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=BB=9F=E4=B8=80=E5=A4=84=E7=90=86,=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=B7=A5=E5=85=B7=E7=B1=BB,=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../muyu/quest/domain/NodeDisposition.java | 8 +- .../com/muyu/quest/advice/TaskAdvice.java | 33 ++++++++ .../muyu/quest/exception/TaskException.java | 43 ++++++++++ .../quest/service/impl/TaskServiceImpl.java | 64 +++++++++++++-- .../java/com/muyu/quest/utils/DispUtils.java | 21 +++++ .../java/com/muyu/quest/utils/NodeUtils.java | 80 +++++++++++++++++++ 6 files changed, 239 insertions(+), 10 deletions(-) create mode 100644 muyu-quest-server/src/main/java/com/muyu/quest/advice/TaskAdvice.java create mode 100644 muyu-quest-server/src/main/java/com/muyu/quest/exception/TaskException.java create mode 100644 muyu-quest-server/src/main/java/com/muyu/quest/utils/DispUtils.java create mode 100644 muyu-quest-server/src/main/java/com/muyu/quest/utils/NodeUtils.java diff --git a/muyu-quest-common/src/main/java/com/muyu/quest/domain/NodeDisposition.java b/muyu-quest-common/src/main/java/com/muyu/quest/domain/NodeDisposition.java index aec309f..bfe29c5 100644 --- a/muyu-quest-common/src/main/java/com/muyu/quest/domain/NodeDisposition.java +++ b/muyu-quest-common/src/main/java/com/muyu/quest/domain/NodeDisposition.java @@ -1,16 +1,14 @@ package com.muyu.quest.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.muyu.common.core.annotation.Excel; -import com.muyu.common.core.validation.custom.IsSysFieldsType; import com.muyu.common.core.validation.custom.IsSysNodeType; -import com.muyu.common.core.web.domain.BaseEntity; import lombok.*; import lombok.experimental.SuperBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.annotation.IdType; /** * 节点配置对象 node_disposition diff --git a/muyu-quest-server/src/main/java/com/muyu/quest/advice/TaskAdvice.java b/muyu-quest-server/src/main/java/com/muyu/quest/advice/TaskAdvice.java new file mode 100644 index 0000000..8a52f47 --- /dev/null +++ b/muyu-quest-server/src/main/java/com/muyu/quest/advice/TaskAdvice.java @@ -0,0 +1,33 @@ +package com.muyu.quest.advice; + +/** + * @Author: 胡杨 + * @Name: TaskAdvice + * @Description: 任务统一异常处理 + * @CreatedDate: 2024/9/1 下午4:12 + * @FilePath: com.muyu.quest.advice + */ + + +import com.alibaba.nacos.api.model.v2.Result; +import com.muyu.quest.exception.TaskException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.ExceptionHandler; + +/** + * @Author: 胡杨 + * @Name: TaskAdvice + * @Description: 任务统一异常处理 + * @CreatedDate: 2024/9/1 下午4:12 + * @FilePath: com.muyu.quest.advice + */ +@Slf4j +@Component +public class TaskAdvice { + @ExceptionHandler(TaskException.class) + public Result commonException(TaskException e) { + log.error("任务异常处理,异常信息:[{}]",e.toString()); + return Result.failure(e.getMessage()); + } +} diff --git a/muyu-quest-server/src/main/java/com/muyu/quest/exception/TaskException.java b/muyu-quest-server/src/main/java/com/muyu/quest/exception/TaskException.java new file mode 100644 index 0000000..2b51861 --- /dev/null +++ b/muyu-quest-server/src/main/java/com/muyu/quest/exception/TaskException.java @@ -0,0 +1,43 @@ +package com.muyu.quest.exception; + +/** + * @Author: 胡杨 + * @Name: TaskException + * @Description: 任务统一异常 + * @CreatedDate: 2024/9/1 下午4:11 + * @FilePath: com.muyu.quest.exception + */ + + +import org.springframework.stereotype.Component; + +/** + * @Author: 胡杨 + * @Name: TaskException + * @Description: 任务统一异常 + * @CreatedDate: 2024/9/1 下午4:11 + * @FilePath: com.muyu.quest.exception + */ + +@Component +public class TaskException extends RuntimeException { + public TaskException() { + super(); + } + + public TaskException(String message) { + super(message); + } + + public TaskException(String message, Throwable cause) { + super(message, cause); + } + + public TaskException(Throwable cause) { + super(cause); + } + + protected TaskException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/muyu-quest-server/src/main/java/com/muyu/quest/service/impl/TaskServiceImpl.java b/muyu-quest-server/src/main/java/com/muyu/quest/service/impl/TaskServiceImpl.java index d1e5b6b..0c3c716 100644 --- a/muyu-quest-server/src/main/java/com/muyu/quest/service/impl/TaskServiceImpl.java +++ b/muyu-quest-server/src/main/java/com/muyu/quest/service/impl/TaskServiceImpl.java @@ -1,13 +1,22 @@ package com.muyu.quest.service.impl; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Objects; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.muyu.common.core.utils.StringUtils; +import com.muyu.quest.domain.Node; +import com.muyu.quest.domain.NodeDisposition; +import com.muyu.quest.exception.TaskException; +import com.muyu.quest.req.NodeReq; import com.muyu.quest.req.TaskReq; import com.muyu.quest.resp.TaskResp; +import com.muyu.quest.service.INodeDispositionService; import com.muyu.quest.service.INodeService; +import com.muyu.quest.utils.NodeUtils; import org.springframework.stereotype.Service; import com.muyu.quest.mapper.TaskMapper; import com.muyu.quest.domain.Task; @@ -26,6 +35,11 @@ import javax.annotation.Resource; public class TaskServiceImpl extends ServiceImpl implements TaskService { + @Resource + private INodeService nodeService; + @Resource + private INodeDispositionService dispositionService; + /** * 查询任务 * @@ -80,11 +94,6 @@ public class TaskServiceImpl extends ServiceImpl this.removeBatchByIds(list); } - @Override - public String execute(String taskCode) { - return ""; - } - /** * 查询任务列表 * @@ -110,5 +119,50 @@ public class TaskServiceImpl extends ServiceImpl .toList(); } + /** + * 执行任务 + * 获取任务所有节点配置信息 拼接sql语句 + * @param taskCode 任务编码 + * @return 成功与否 + */ + @Override + public String execute(String taskCode) { + NodeReq nodeReq = new NodeReq(); + nodeReq.setTaskCode(taskCode); + List nodes = nodeService.selectNodeList(nodeReq); + HashMap> nodeMap = NodeUtils.nodeInit(nodes); + // 从开始节点 开始执行 + // 1.获取开始节点编码 + Node startNode = nodeMap.get("start").get(0); + // 2.查询上一级节点为开始节点的节点 + List nextNode = NodeUtils.getNextNode(startNode, nodes); + if (nextNode == null || nextNode.isEmpty()){ + throw new TaskException("任务无意义"); + } + // 3.处理节点 + nextNode.forEach(node -> { + // 3.1 查询节点配置信息 + NodeDisposition nodeDisposition = new NodeDisposition(); + nodeDisposition.setNodeCode(node.getNodeCode()); + List dispList = dispositionService.selectNodeDispositionList(nodeDisposition); + if (dispList.isEmpty()){ + throw new TaskException("节点 "+node.getNodeName()+" 配置信息为空"); + } + String type = node.getNodeType(); + if (StringUtils.equals(type,"table")) { + HashMap> dispMap = new HashMap<>(); + // 整理所有配置 + dispList.forEach(disp -> { + List dispositions = dispMap.get(disp.getDispKey()); + if (dispositions == null || dispositions.isEmpty()) { + dispositions = new ArrayList<>(); + } + dispositions.add(disp); + dispMap.put(disp.getDispKey(), dispositions); + }); + } + }); + return ""; + } } diff --git a/muyu-quest-server/src/main/java/com/muyu/quest/utils/DispUtils.java b/muyu-quest-server/src/main/java/com/muyu/quest/utils/DispUtils.java new file mode 100644 index 0000000..048bdcb --- /dev/null +++ b/muyu-quest-server/src/main/java/com/muyu/quest/utils/DispUtils.java @@ -0,0 +1,21 @@ +package com.muyu.quest.utils; + +/** + * @Author: 胡杨 + * @Name: DispUtils + * @Description: 节点配置工具 + * @CreatedDate: 2024/9/1 下午4:27 + * @FilePath: com.muyu.quest.utils + */ + + +/** + * @Author: 胡杨 + * @Name: DispUtils + * @Description: 节点配置工具 + * @CreatedDate: 2024/9/1 下午4:27 + * @FilePath: com.muyu.quest.utils + */ + +public class DispUtils { +} diff --git a/muyu-quest-server/src/main/java/com/muyu/quest/utils/NodeUtils.java b/muyu-quest-server/src/main/java/com/muyu/quest/utils/NodeUtils.java new file mode 100644 index 0000000..30b825e --- /dev/null +++ b/muyu-quest-server/src/main/java/com/muyu/quest/utils/NodeUtils.java @@ -0,0 +1,80 @@ +package com.muyu.quest.utils; + +/** + * @Author: 胡杨 + * @Name: NodeUtils + * @Description: 节点处理工具 + * @CreatedDate: 2024/9/1 下午4:27 + * @FilePath: com.muyu.quest.utils + */ + + +import com.muyu.common.core.utils.StringUtils; +import com.muyu.quest.domain.Node; +import com.muyu.quest.exception.TaskException; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * @Author: 胡杨 + * @Name: NodeUtils + * @Description: 节点处理工具 + * @CreatedDate: 2024/9/1 下午4:27 + * @FilePath: com.muyu.quest.utils + */ + +public class NodeUtils { + /** + * 节点初始化 + * 将所有节点按节点类型分类 + * 并判断任务流程是否完整 + * @param nodes 节点列表 + * @return 节点Map + */ + public static HashMap> nodeInit(List nodes){ + if (nodes == null || nodes.isEmpty()){ + throw new TaskException("节点列表为空"); + } + HashMap> nodeMap = new HashMap<>(); + // 整理所有节点 + nodes.forEach(node -> { + List nodeList = nodeMap.get(node.getNodeType()); + if (nodeList == null || nodeList.isEmpty()) { + nodeList = new ArrayList<>(); + } + nodeList.add(node); + nodeMap.put(node.getNodeType(), nodeList); + }); + List start = nodeMap.get("start"); + List end = nodeMap.get("end"); + System.out.println(nodeMap); + if (start == null || start.isEmpty()){ + throw new TaskException("未找到开始节点"); + } + if (end == null || end.isEmpty()){ + throw new TaskException("未找到结束节点"); + } + return nodeMap; + } + + /** + * 获取下级节点 + * @param node 当前节点 + * @param nodes 所有节点 + * @return 下级节点列表 + */ + public static List getNextNode(Node node, List nodes){ + if (nodes == null || nodes.isEmpty()){ + throw new TaskException("节点列表为空"); + }else if (node == null){ + throw new TaskException("当前节点为空"); + } + return nodes + .stream() + .filter(nodeIndex -> StringUtils.equals(node.getNodeCode() ,nodeIndex.getNodePreCode())) + .filter(nodeIndex -> !StringUtils.equals(node.getNodeType() , "end")) + .toList(); + } +}