From b80da2d616924b5f94c9f7613a55c50f23b1a161 Mon Sep 17 00:00:00 2001 From: opensnail <598092184@qq.com> Date: Wed, 29 May 2024 23:10:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(sj=5F1.0.0):=20=E4=BC=98=E5=8C=96=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E5=9C=BA=E6=99=AF=E7=9A=84=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/GroupConfigController.java | 4 - .../server/web/controller/JobController.java | 13 +- .../web/controller/SceneConfigController.java | 10 +- .../web/model/request/ExportSceneVO.java | 23 +++ .../web/model/request/SceneConfigQueryVO.java | 1 + .../web/service/SceneConfigService.java | 4 +- .../service/impl/GroupConfigServiceImpl.java | 3 +- .../service/impl/SceneConfigServiceImpl.java | 155 +++++++++++------- .../snailjob/server/web/util/ImportUtils.java | 4 + 9 files changed, 132 insertions(+), 85 deletions(-) create mode 100644 snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/ExportSceneVO.java diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/GroupConfigController.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/GroupConfigController.java index 008d5046..eb6b4233 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/GroupConfigController.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/GroupConfigController.java @@ -93,10 +93,6 @@ public class GroupConfigController { @PostMapping(value = "/import", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @LoginRequired(role = RoleEnum.ADMIN) public void importScene(@RequestPart("file") MultipartFile file) throws IOException { - if (file.isEmpty()) { - throw new SnailJobCommonException("请选择一个文件上传"); - } - groupConfigService.importGroup(ImportUtils.parseList(file, GroupConfigRequestVO.class)); } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/JobController.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/JobController.java index ef3710ae..81e951da 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/JobController.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/JobController.java @@ -101,21 +101,16 @@ public class JobController { } @PostMapping(value = "/import", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - @LoginRequired(role = RoleEnum.ADMIN) + @LoginRequired public void importScene(@RequestPart("file") MultipartFile file) throws IOException { - if (file.isEmpty()) { - throw new SnailJobCommonException("请选择一个文件上传"); - } - List requestList = ImportUtils.parseList(file, JobRequestVO.class); - jobService.importJobs(requestList); + jobService.importJobs(ImportUtils.parseList(file, JobRequestVO.class)); } @PostMapping("/export") - @LoginRequired(role = RoleEnum.ADMIN) + @LoginRequired @OriginalControllerReturnValue public ResponseEntity exportGroup(@RequestBody Set jobIds) { - String jobsJson = jobService.exportJobs(jobIds); - return ExportUtils.doExport(jobsJson); + return ExportUtils.doExport(jobService.exportJobs(jobIds)); } } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/SceneConfigController.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/SceneConfigController.java index c20ba8ce..b9ae0b6d 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/SceneConfigController.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/SceneConfigController.java @@ -4,6 +4,7 @@ import com.aizuda.snailjob.common.core.annotation.OriginalControllerReturnValue; import com.aizuda.snailjob.common.core.exception.SnailJobCommonException; import com.aizuda.snailjob.server.web.annotation.LoginRequired; import com.aizuda.snailjob.server.web.model.base.PageResult; +import com.aizuda.snailjob.server.web.model.request.ExportSceneVO; import com.aizuda.snailjob.server.web.model.request.SceneConfigQueryVO; import com.aizuda.snailjob.server.web.model.request.SceneConfigRequestVO; import com.aizuda.snailjob.server.web.model.response.SceneConfigResponseVO; @@ -72,10 +73,6 @@ public class SceneConfigController { @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("请选择一个文件上传"); - } - // 写入数据 sceneConfigService.importSceneConfig(ImportUtils.parseList(file, SceneConfigRequestVO.class)); } @@ -83,9 +80,8 @@ public class SceneConfigController { @LoginRequired @PostMapping("/export") @OriginalControllerReturnValue - public ResponseEntity export(@RequestBody Set sceneIds) { - return ExportUtils.doExport(sceneConfigService.exportSceneConfig(sceneIds)); - + public ResponseEntity export(@RequestBody ExportSceneVO exportSceneVO) { + return ExportUtils.doExport(sceneConfigService.exportSceneConfig(exportSceneVO)); } } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/ExportSceneVO.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/ExportSceneVO.java new file mode 100644 index 00000000..058bb8be --- /dev/null +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/ExportSceneVO.java @@ -0,0 +1,23 @@ +package com.aizuda.snailjob.server.web.model.request; + +import lombok.Data; + +import java.util.Set; + +/** + * @author: opensnail + * @date : 2024-05-29 + * @since : sj_1.0.0 + */ +@Data +public class ExportSceneVO { + + private String groupName; + + private Integer sceneStatus; + + private String sceneName; + + private Set sceneIds; + +} diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/SceneConfigQueryVO.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/SceneConfigQueryVO.java index dcf4014e..11240e13 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/SceneConfigQueryVO.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/SceneConfigQueryVO.java @@ -14,4 +14,5 @@ import lombok.EqualsAndHashCode; public class SceneConfigQueryVO extends BaseQueryVO { private String groupName; private String sceneName; + private Integer sceneStatus; } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/SceneConfigService.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/SceneConfigService.java index c78981c9..54aeb63c 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/SceneConfigService.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/SceneConfigService.java @@ -1,6 +1,7 @@ package com.aizuda.snailjob.server.web.service; import com.aizuda.snailjob.server.web.model.base.PageResult; +import com.aizuda.snailjob.server.web.model.request.ExportSceneVO; import com.aizuda.snailjob.server.web.model.request.SceneConfigQueryVO; import com.aizuda.snailjob.server.web.model.request.SceneConfigRequestVO; import com.aizuda.snailjob.server.web.model.response.SceneConfigResponseVO; @@ -8,7 +9,6 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import java.util.List; -import java.util.Set; /** * @author: opensnail @@ -30,6 +30,6 @@ public interface SceneConfigService { void importSceneConfig(@Valid @NotEmpty(message = "导入数据不能为空") List requests); - String exportSceneConfig(Set sceneIds); + String exportSceneConfig(ExportSceneVO exportSceneVO); } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java index e9853142..d8921349 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java @@ -439,8 +439,7 @@ public class GroupConfigServiceImpl implements GroupConfigService { return groupConfigs.stream().map(GroupConfigPartitionTask::new).toList(); }), partitionTasks -> { List configPartitionTasks = (List) partitionTasks; - List configs = configPartitionTasks.stream().map(GroupConfigPartitionTask::getConfig) - .collect(Collectors.toList()); + List configs = StreamUtils.toList(configPartitionTasks, GroupConfigPartitionTask::getConfig); allRequestList.addAll(GroupConfigConverter.INSTANCE.toGroupConfigRequestVOs(configs)); }, 0); diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/SceneConfigServiceImpl.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/SceneConfigServiceImpl.java index ed5ed842..c1e9797e 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/SceneConfigServiceImpl.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/SceneConfigServiceImpl.java @@ -5,10 +5,13 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import com.aizuda.snailjob.common.core.util.JsonUtil; import com.aizuda.snailjob.common.core.util.StreamUtils; +import com.aizuda.snailjob.server.common.dto.PartitionTask; import com.aizuda.snailjob.server.common.exception.SnailJobServerException; import com.aizuda.snailjob.server.common.strategy.WaitStrategies; import com.aizuda.snailjob.server.common.util.CronUtils; +import com.aizuda.snailjob.server.common.util.PartitionTaskUtils; import com.aizuda.snailjob.server.web.model.base.PageResult; +import com.aizuda.snailjob.server.web.model.request.ExportSceneVO; import com.aizuda.snailjob.server.web.model.request.SceneConfigQueryVO; import com.aizuda.snailjob.server.web.model.request.SceneConfigRequestVO; import com.aizuda.snailjob.server.web.model.request.UserSessionVO; @@ -29,15 +32,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.common.collect.Sets.SetView; +import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import java.util.Set; +import java.util.*; /** * @author: opensnail @@ -53,8 +57,8 @@ public class SceneConfigServiceImpl implements SceneConfigService { private static void checkExecuteInterval(SceneConfigRequestVO requestVO) { if (Lists.newArrayList(WaitStrategies.WaitStrategyEnum.FIXED.getType(), - WaitStrategies.WaitStrategyEnum.RANDOM.getType()) - .contains(requestVO.getBackOff())) { + WaitStrategies.WaitStrategyEnum.RANDOM.getType()) + .contains(requestVO.getBackOff())) { if (Integer.parseInt(requestVO.getTriggerInterval()) < 10) { throw new SnailJobServerException("间隔时间不得小于10"); } @@ -72,14 +76,15 @@ public class SceneConfigServiceImpl implements SceneConfigService { UserSessionVO userSessionVO = UserSessionUtils.currentUserSession(); String namespaceId = userSessionVO.getNamespaceId(); pageDTO = accessTemplate.getSceneConfigAccess().listPage(pageDTO, - new LambdaQueryWrapper() - .eq(RetrySceneConfig::getNamespaceId, namespaceId) - .in(userSessionVO.isUser(), RetrySceneConfig::getGroupName, userSessionVO.getGroupNames()) - .eq(StrUtil.isNotBlank(queryVO.getGroupName()), - RetrySceneConfig::getGroupName, StrUtil.trim(queryVO.getGroupName())) - .eq(StrUtil.isNotBlank(queryVO.getSceneName()), - RetrySceneConfig::getSceneName, StrUtil.trim(queryVO.getSceneName())) - .orderByDesc(RetrySceneConfig::getCreateDt)); + new LambdaQueryWrapper() + .eq(RetrySceneConfig::getNamespaceId, namespaceId) + .in(userSessionVO.isUser(), RetrySceneConfig::getGroupName, userSessionVO.getGroupNames()) + .eq(Objects.nonNull(queryVO.getSceneStatus()), RetrySceneConfig::getSceneStatus, queryVO.getSceneStatus()) + .eq(StrUtil.isNotBlank(queryVO.getGroupName()), + RetrySceneConfig::getGroupName, StrUtil.trim(queryVO.getGroupName())) + .likeRight(StrUtil.isNotBlank(queryVO.getSceneName()), + RetrySceneConfig::getSceneName, StrUtil.trim(queryVO.getSceneName())) + .orderByDesc(RetrySceneConfig::getCreateDt)); return new PageResult<>(pageDTO, SceneConfigResponseVOConverter.INSTANCE.convertList(pageDTO.getRecords())); @@ -91,12 +96,12 @@ public class SceneConfigServiceImpl implements SceneConfigService { String namespaceId = UserSessionUtils.currentUserSession().getNamespaceId(); List retrySceneConfigs = accessTemplate.getSceneConfigAccess() - .list(new LambdaQueryWrapper() - .eq(RetrySceneConfig::getNamespaceId, namespaceId) - .eq(RetrySceneConfig::getGroupName, groupName) - .select(RetrySceneConfig::getSceneName, - RetrySceneConfig::getDescription, RetrySceneConfig::getMaxRetryCount) - .orderByDesc(RetrySceneConfig::getCreateDt)); + .list(new LambdaQueryWrapper() + .eq(RetrySceneConfig::getNamespaceId, namespaceId) + .eq(RetrySceneConfig::getGroupName, groupName) + .select(RetrySceneConfig::getSceneName, + RetrySceneConfig::getDescription, RetrySceneConfig::getMaxRetryCount) + .orderByDesc(RetrySceneConfig::getCreateDt)); return SceneConfigResponseVOConverter.INSTANCE.convertList(retrySceneConfigs); } @@ -108,10 +113,10 @@ public class SceneConfigServiceImpl implements SceneConfigService { String namespaceId = UserSessionUtils.currentUserSession().getNamespaceId(); ConfigAccess sceneConfigAccess = accessTemplate.getSceneConfigAccess(); Assert.isTrue(0 == sceneConfigAccess.count( - new LambdaQueryWrapper() - .eq(RetrySceneConfig::getNamespaceId, namespaceId) - .eq(RetrySceneConfig::getGroupName, requestVO.getGroupName()) - .eq(RetrySceneConfig::getSceneName, requestVO.getSceneName()) + new LambdaQueryWrapper() + .eq(RetrySceneConfig::getNamespaceId, namespaceId) + .eq(RetrySceneConfig::getGroupName, requestVO.getGroupName()) + .eq(RetrySceneConfig::getSceneName, requestVO.getSceneName()) ), () -> new SnailJobServerException("场景名称重复. {}", requestVO.getSceneName())); @@ -123,8 +128,8 @@ public class SceneConfigServiceImpl implements SceneConfigService { } Assert.isTrue(1 == sceneConfigAccess.insert(retrySceneConfig), - () -> new SnailJobServerException("failed to insert scene. retrySceneConfig:[{}]", - JsonUtil.toJsonString(retrySceneConfig))); + () -> new SnailJobServerException("failed to insert scene. retrySceneConfig:[{}]", + JsonUtil.toJsonString(retrySceneConfig))); // 同步配置到客户端 SyncConfigHandler.addSyncTask(requestVO.getGroupName(), namespaceId); @@ -144,14 +149,14 @@ public class SceneConfigServiceImpl implements SceneConfigService { String namespaceId = UserSessionUtils.currentUserSession().getNamespaceId(); retrySceneConfig.setTriggerInterval( - Optional.ofNullable(retrySceneConfig.getTriggerInterval()).orElse(StrUtil.EMPTY)); + Optional.ofNullable(retrySceneConfig.getTriggerInterval()).orElse(StrUtil.EMPTY)); Assert.isTrue(1 == accessTemplate.getSceneConfigAccess().update(retrySceneConfig, - new LambdaUpdateWrapper() - .eq(RetrySceneConfig::getNamespaceId, namespaceId) - .eq(RetrySceneConfig::getGroupName, requestVO.getGroupName()) - .eq(RetrySceneConfig::getSceneName, requestVO.getSceneName())), - () -> new SnailJobServerException("failed to update scene. retrySceneConfig:[{}]", - JsonUtil.toJsonString(retrySceneConfig))); + new LambdaUpdateWrapper() + .eq(RetrySceneConfig::getNamespaceId, namespaceId) + .eq(RetrySceneConfig::getGroupName, requestVO.getGroupName()) + .eq(RetrySceneConfig::getSceneName, requestVO.getSceneName())), + () -> new SnailJobServerException("failed to update scene. retrySceneConfig:[{}]", + JsonUtil.toJsonString(retrySceneConfig))); // 同步配置到客户端 SyncConfigHandler.addSyncTask(requestVO.getGroupName(), namespaceId); @@ -161,8 +166,8 @@ public class SceneConfigServiceImpl implements SceneConfigService { @Override public SceneConfigResponseVO getSceneConfigDetail(Long id) { RetrySceneConfig retrySceneConfig = accessTemplate.getSceneConfigAccess() - .one(new LambdaQueryWrapper() - .eq(RetrySceneConfig::getId, id)); + .one(new LambdaQueryWrapper() + .eq(RetrySceneConfig::getId, id)); return SceneConfigResponseVOConverter.INSTANCE.convert(retrySceneConfig); } @@ -175,9 +180,9 @@ public class SceneConfigServiceImpl implements SceneConfigService { config.setSceneStatus(status); return 1 == accessTemplate.getSceneConfigAccess().update(config, - new LambdaUpdateWrapper() - .eq(RetrySceneConfig::getId, id) - .eq(RetrySceneConfig::getNamespaceId, namespaceId)); + new LambdaUpdateWrapper() + .eq(RetrySceneConfig::getId, id) + .eq(RetrySceneConfig::getNamespaceId, namespaceId)); } @Override @@ -187,18 +192,35 @@ public class SceneConfigServiceImpl implements SceneConfigService { } @Override - public String exportSceneConfig(final Set sceneIds) { - List sceneConfigs = accessTemplate.getSceneConfigAccess() - .list(new LambdaQueryWrapper() - .eq(RetrySceneConfig::getNamespaceId, UserSessionUtils.currentUserSession().getNamespaceId()) - // TODO 若导出全部需要分页查询,避免一次拉取太多数据 - .in(CollUtil.isNotEmpty(sceneIds), RetrySceneConfig::getId, sceneIds) + public String exportSceneConfig(final ExportSceneVO exportSceneVO) { + + List requestList = new ArrayList<>(); + + PartitionTaskUtils.process(startId -> { + List sceneConfigs = accessTemplate.getSceneConfigAccess() + .listPage(new PageDTO<>(0, 500), new LambdaQueryWrapper() + .eq(RetrySceneConfig::getNamespaceId, UserSessionUtils.currentUserSession().getNamespaceId()) + .eq(Objects.nonNull(exportSceneVO.getSceneStatus()), RetrySceneConfig::getSceneStatus, exportSceneVO.getSceneStatus()) + .eq(StrUtil.isNotBlank(exportSceneVO.getGroupName()), + RetrySceneConfig::getGroupName, StrUtil.trim(exportSceneVO.getGroupName())) + .likeRight(StrUtil.isNotBlank(exportSceneVO.getSceneName()), + RetrySceneConfig::getSceneName, StrUtil.trim(exportSceneVO.getSceneName())) + .in(CollUtil.isNotEmpty(exportSceneVO.getSceneIds()), RetrySceneConfig::getId, exportSceneVO.getSceneIds()) + .ge(RetrySceneConfig::getId, startId) + .orderByAsc(RetrySceneConfig::getId) + ).getRecords(); + + return StreamUtils.toList(sceneConfigs, SceneConfigPartitionTask::new); + }, partitionTasks -> { + List partitionTaskList = (List) partitionTasks; + requestList.addAll(SceneConfigConverter.INSTANCE.toSceneConfigRequestVOs( + StreamUtils.toList(partitionTaskList, SceneConfigPartitionTask::getConfig)) ); + }, 0); - return JsonUtil.toJsonString(SceneConfigConverter.INSTANCE.toSceneConfigRequestVOs(sceneConfigs)); + return JsonUtil.toJsonString(requestList); } - private void batchSaveSceneConfig(final List requests, final String namespaceId) { Set groupNameSet = Sets.newHashSet(); @@ -210,28 +232,28 @@ public class SceneConfigServiceImpl implements SceneConfigService { } List groupConfigs = accessTemplate.getGroupConfigAccess() - .list(new LambdaQueryWrapper() - .select(GroupConfig::getGroupName) - .eq(GroupConfig::getNamespaceId, namespaceId) - .in(GroupConfig::getGroupName, groupNameSet) - ); + .list(new LambdaQueryWrapper() + .select(GroupConfig::getGroupName) + .eq(GroupConfig::getNamespaceId, namespaceId) + .in(GroupConfig::getGroupName, groupNameSet) + ); SetView notExistedGroupNameSet = Sets.difference(groupNameSet, - StreamUtils.toSet(groupConfigs, GroupConfig::getGroupName)); + StreamUtils.toSet(groupConfigs, GroupConfig::getGroupName)); Assert.isTrue(CollUtil.isEmpty(notExistedGroupNameSet), - () -> new SnailJobServerException("导入失败. 原因: 组{}不存在", notExistedGroupNameSet)); + () -> new SnailJobServerException("导入失败. 原因: 组{}不存在", notExistedGroupNameSet)); ConfigAccess sceneConfigAccess = accessTemplate.getSceneConfigAccess(); List sceneConfigs = sceneConfigAccess.list( - new LambdaQueryWrapper() - .select(RetrySceneConfig::getSceneName) - .eq(RetrySceneConfig::getNamespaceId, namespaceId) - .in(RetrySceneConfig::getGroupName, groupNameSet) - .in(RetrySceneConfig::getSceneName, sceneNameSet)); + new LambdaQueryWrapper() + .select(RetrySceneConfig::getSceneName) + .eq(RetrySceneConfig::getNamespaceId, namespaceId) + .in(RetrySceneConfig::getGroupName, groupNameSet) + .in(RetrySceneConfig::getSceneName, sceneNameSet)); Assert.isTrue(CollUtil.isEmpty(sceneConfigs), () -> new SnailJobServerException("导入失败. 原因:场景{}已存在", - StreamUtils.toSet(sceneConfigs, RetrySceneConfig::getSceneName))); + StreamUtils.toSet(sceneConfigs, RetrySceneConfig::getSceneName))); LocalDateTime now = LocalDateTime.now(); List retrySceneConfigs = SceneConfigConverter.INSTANCE.toRetrySceneConfigs(requests); @@ -242,11 +264,22 @@ public class SceneConfigServiceImpl implements SceneConfigService { retrySceneConfig.setTriggerInterval(StrUtil.EMPTY); } - // TODO 优化成批量插入 Assert.isTrue(1 == sceneConfigAccess.insert(retrySceneConfig), - () -> new SnailJobServerException("failed to insert scene. retrySceneConfig:[{}]", - JsonUtil.toJsonString(retrySceneConfig))); + () -> new SnailJobServerException("failed to insert scene. retrySceneConfig:[{}]", + JsonUtil.toJsonString(retrySceneConfig))); } } + + @EqualsAndHashCode(callSuper = true) + @Getter + private static class SceneConfigPartitionTask extends PartitionTask { + // 这里就直接放RetrySceneConfig为了后面若加字段不需要再这里在调整了 + private final RetrySceneConfig config; + + public SceneConfigPartitionTask(@NotNull RetrySceneConfig config) { + this.config = config; + setId(config.getId()); + } + } } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/util/ImportUtils.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/util/ImportUtils.java index a7369623..b9610226 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/util/ImportUtils.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/util/ImportUtils.java @@ -15,6 +15,10 @@ public class ImportUtils { private static final List FILE_EXTENSIONS = List.of("json"); public static @NotNull List parseList(MultipartFile file, Class clazz) throws IOException { + if (file.isEmpty()) { + throw new SnailJobCommonException("请选择一个文件上传"); + } + // 保存文件到服务器 String suffix = FileUtil.getSuffix(file.getOriginalFilename()); if (!FILE_EXTENSIONS.contains(suffix)) {