From ae6f427d893d6be4a229030aa70f26a0de3a4996 Mon Sep 17 00:00:00 2001 From: wodeyangzipingpingwuqi Date: Wed, 29 May 2024 17:34:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(dev=5F1.0.0=5Fbeta3):=201=E3=80=81?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/WorkflowController.java | 26 ++++++++++ .../server/web/service/WorkflowService.java | 7 +++ .../web/service/impl/WorkflowServiceImpl.java | 52 +++++++++++++++++-- 3 files changed, 81 insertions(+), 4 deletions(-) diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/WorkflowController.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/WorkflowController.java index 7411ab877..e3eb409e3 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/WorkflowController.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/WorkflowController.java @@ -1,6 +1,8 @@ package com.aizuda.snailjob.server.web.controller; import cn.hutool.core.lang.Pair; +import com.aizuda.snailjob.common.core.annotation.OriginalControllerReturnValue; +import com.aizuda.snailjob.common.core.exception.SnailJobCommonException; import com.aizuda.snailjob.server.common.dto.DecisionConfig; import com.aizuda.snailjob.server.web.annotation.LoginRequired; import com.aizuda.snailjob.server.web.annotation.RoleEnum; @@ -10,12 +12,18 @@ import com.aizuda.snailjob.server.web.model.request.WorkflowRequestVO; import com.aizuda.snailjob.server.web.model.response.WorkflowDetailResponseVO; import com.aizuda.snailjob.server.web.model.response.WorkflowResponseVO; import com.aizuda.snailjob.server.web.service.WorkflowService; +import com.aizuda.snailjob.server.web.util.ExportUtils; +import com.aizuda.snailjob.server.web.util.ImportUtils; import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; +import java.util.Set; /** * @author xiaowoniu @@ -85,4 +93,22 @@ public class WorkflowController { return workflowService.checkNodeExpression(decisionConfig); } + @LoginRequired + @PostMapping(value = "/import", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public void importScene(@RequestPart("file") MultipartFile file) throws IOException { + if (file.isEmpty()) { + throw new SnailJobCommonException("请选择一个文件上传"); + } + + // 写入数据 + workflowService.importWorkflowTask(ImportUtils.parseList(file, WorkflowRequestVO.class)); + } + + @LoginRequired + @PostMapping("/export") + @OriginalControllerReturnValue + public ResponseEntity export(@RequestBody Set workflowIds) { + return ExportUtils.doExport(workflowService.exportWorkflowTask(workflowIds)); + } + } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/WorkflowService.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/WorkflowService.java index ad3e79b85..5a94ec951 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/WorkflowService.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/WorkflowService.java @@ -7,9 +7,12 @@ import com.aizuda.snailjob.server.web.model.request.WorkflowQueryVO; import com.aizuda.snailjob.server.web.model.request.WorkflowRequestVO; import com.aizuda.snailjob.server.web.model.response.WorkflowDetailResponseVO; import com.aizuda.snailjob.server.web.model.response.WorkflowResponseVO; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; import java.io.IOException; import java.util.List; +import java.util.Set; /** * @author xiaowoniu @@ -35,4 +38,8 @@ public interface WorkflowService { List getWorkflowNameList(String keywords, Long workflowId); Pair checkNodeExpression(DecisionConfig decisionConfig); + + void importWorkflowTask(@Valid @NotEmpty(message = "导入数据不能为空") List requests); + + String exportWorkflowTask(Set workflowIds); } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/WorkflowServiceImpl.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/WorkflowServiceImpl.java index a447188a0..68353feae 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/WorkflowServiceImpl.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/WorkflowServiceImpl.java @@ -1,5 +1,6 @@ package com.aizuda.snailjob.server.web.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Pair; import cn.hutool.core.util.HashUtil; @@ -27,6 +28,7 @@ import com.aizuda.snailjob.server.job.task.support.WorkflowPrePareHandler; import com.aizuda.snailjob.server.job.task.support.WorkflowTaskConverter; import com.aizuda.snailjob.server.job.task.support.expression.ExpressionInvocationHandler; import com.aizuda.snailjob.server.web.model.base.PageResult; +import com.aizuda.snailjob.server.web.model.request.SceneConfigRequestVO; import com.aizuda.snailjob.server.web.model.request.UserSessionVO; import com.aizuda.snailjob.server.web.model.request.WorkflowQueryVO; import com.aizuda.snailjob.server.web.model.request.WorkflowRequestVO; @@ -34,20 +36,20 @@ import com.aizuda.snailjob.server.web.model.request.WorkflowRequestVO.NodeConfig import com.aizuda.snailjob.server.web.model.response.WorkflowDetailResponseVO; import com.aizuda.snailjob.server.web.model.response.WorkflowResponseVO; import com.aizuda.snailjob.server.web.service.WorkflowService; +import com.aizuda.snailjob.server.web.service.convert.SceneConfigConverter; import com.aizuda.snailjob.server.web.service.convert.WorkflowConverter; import com.aizuda.snailjob.server.web.service.handler.WorkflowHandler; import com.aizuda.snailjob.server.web.util.UserSessionUtils; import com.aizuda.snailjob.template.datasource.access.AccessTemplate; +import com.aizuda.snailjob.template.datasource.access.ConfigAccess; import com.aizuda.snailjob.template.datasource.persistence.mapper.JobMapper; import com.aizuda.snailjob.template.datasource.persistence.mapper.WorkflowMapper; import com.aizuda.snailjob.template.datasource.persistence.mapper.WorkflowNodeMapper; -import com.aizuda.snailjob.template.datasource.persistence.po.GroupConfig; -import com.aizuda.snailjob.template.datasource.persistence.po.Job; -import com.aizuda.snailjob.template.datasource.persistence.po.Workflow; -import com.aizuda.snailjob.template.datasource.persistence.po.WorkflowNode; +import com.aizuda.snailjob.template.datasource.persistence.po.*; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import com.google.common.graph.ElementOrder; import com.google.common.graph.GraphBuilder; import com.google.common.graph.MutableGraph; @@ -57,6 +59,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.LinkedBlockingDeque; import java.util.stream.Collectors; @@ -339,4 +342,45 @@ public class WorkflowServiceImpl implements WorkflowService { return Pair.of(StatusEnum.YES.getStatus(), StrUtil.EMPTY); } + @Override + @Transactional(rollbackFor = Exception.class) + public void importWorkflowTask(List requests) { + batchSaveWorkflowTask(requests, UserSessionUtils.currentUserSession().getNamespaceId()); + } + + @Override + public String exportWorkflowTask(Set workflowIds) { + List workflowList = workflowMapper.selectList(new LambdaQueryWrapper() + .eq(Workflow::getNamespaceId, UserSessionUtils.currentUserSession().getNamespaceId()) + .eq(Workflow::getDeleted, StatusEnum.NO.getStatus()) + // TODO 若导出全部需要分页查询,避免一次拉取太多数据 + .in(CollUtil.isNotEmpty(workflowIds), Workflow::getId, workflowIds) + ); + + List workflowDetailResponseVOList = workflowList.stream().map(i -> getWorkflowDetail(i.getId())).collect(Collectors.toList()); + return JsonUtil.toJsonString(workflowDetailResponseVOList); + } + + private void batchSaveWorkflowTask(final List workflowRequestVOList, final String namespaceId) { + + Set groupNameSet = workflowRequestVOList.stream().map(i -> i.getGroupName()).collect(Collectors.toSet()); + List groupConfigs = accessTemplate.getGroupConfigAccess() + .list(new LambdaQueryWrapper() + .select(GroupConfig::getGroupName) + .eq(GroupConfig::getNamespaceId, namespaceId) + .in(GroupConfig::getGroupName, groupNameSet) + ); + + Sets.SetView notExistedGroupNameSet = Sets.difference(groupNameSet, + StreamUtils.toSet(groupConfigs, GroupConfig::getGroupName)); + + Assert.isTrue(CollUtil.isEmpty(notExistedGroupNameSet), + () -> new SnailJobServerException("导入失败. 原因: 组{}不存在", notExistedGroupNameSet)); + + for (final WorkflowRequestVO workflowRequestVO : workflowRequestVOList) { + checkExecuteInterval(workflowRequestVO); + workflowRequestVO.setId(null); + saveWorkflow(workflowRequestVO); + } + } }