diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/CodegenController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/CodegenController.java index 93d47f517..26dda8943 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/CodegenController.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/CodegenController.java @@ -122,6 +122,15 @@ public class CodegenController { return success(true); } + @Operation(summary = "批量删除数据库的表和字段定义") + @DeleteMapping("/delete-list") + @Parameter(name = "tableIds", description = "表编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:codegen:delete')") + public CommonResult deleteCodegenList(@RequestParam("tableIds") List tableIds) { + codegenService.deleteCodegenList(tableIds); + return success(true); + } + @Operation(summary = "预览生成代码") @GetMapping("/preview") @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java index 43e64c02a..d4b8efd78 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/ConfigController.java @@ -62,6 +62,15 @@ public class ConfigController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除参数配置") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:config:delete')") + public CommonResult deleteConfigList(@RequestParam("ids") List ids) { + configService.deleteConfigList(ids); + return success(true); + } + @GetMapping(value = "/get") @Operation(summary = "获得参数配置") @Parameter(name = "id", description = "编号", required = true, example = "1024") diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/DataSourceConfigController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/DataSourceConfigController.java index ba952c9e9..a5e973703 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/DataSourceConfigController.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/DataSourceConfigController.java @@ -52,6 +52,15 @@ public class DataSourceConfigController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除数据源配置") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:data-source-config:delete')") + public CommonResult deleteDataSourceConfigList(@RequestParam("ids") List ids) { + dataSourceConfigService.deleteDataSourceConfigList(ids); + return success(true); + } + @GetMapping("/get") @Operation(summary = "获得数据源配置") @Parameter(name = "id", description = "编号", required = true, example = "1024") diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileConfigController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileConfigController.java index a2e12c4e1..c593f4bb6 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileConfigController.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileConfigController.java @@ -17,6 +17,8 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 文件配置") @@ -60,6 +62,15 @@ public class FileConfigController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除文件配置") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:file-config:delete')") + public CommonResult deleteFileConfigList(@RequestParam("ids") List ids) { + fileConfigService.deleteFileConfigList(ids); + return success(true); + } + @GetMapping("/get") @Operation(summary = "获得文件配置") @Parameter(name = "id", description = "编号", required = true, example = "1024") diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java index 119774b71..d5611b7a0 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/FileController.java @@ -26,6 +26,8 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.util.List; + import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.module.infra.framework.file.core.utils.FileTypeUtils.writeAttachment; @@ -75,6 +77,15 @@ public class FileController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除文件") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:file:delete')") + public CommonResult deleteFileList(@RequestParam("ids") List ids) throws Exception { + fileService.deleteFileList(ids); + return success(true); + } + @GetMapping("/{configId}/get/**") @PermitAll @TenantIgnore diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.java index bf4506d34..1ae53e3c9 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/job/JobController.java @@ -81,6 +81,16 @@ public class JobController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除定时任务") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('infra:job:delete')") + public CommonResult deleteJobList(@RequestParam("ids") List ids) + throws SchedulerException { + jobService.deleteJobList(ids); + return success(true); + } + @PutMapping("/trigger") @Operation(summary = "触发定时任务") @Parameter(name = "id", description = "编号", required = true, example = "1024") diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java index 7adc9f7f1..ca22021a8 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java @@ -48,6 +48,13 @@ public interface CodegenService { */ void deleteCodegen(Long tableId); + /** + * 批量删除数据库的表和字段定义 + * + * @param tableIds 数据编号列表 + */ + void deleteCodegenList(List tableIds); + /** * 获得表定义列表 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java index be3ce5b0f..adeb41734 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java @@ -222,6 +222,25 @@ public class CodegenServiceImpl implements CodegenService { codegenColumnMapper.deleteListByTableId(tableId); } + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCodegenList(List tableIds) { + if (CollUtil.isEmpty(tableIds)) { + return; + } + + // 校验是否都存在 + List tables = codegenTableMapper.selectByIds(tableIds); + if (tables.size() != tableIds.size()) { + throw exception(CODEGEN_TABLE_NOT_EXISTS); + } + + // 批量删除 table 表定义 + codegenTableMapper.deleteByIds(tableIds); + // 批量删除 column 字段定义 + tableIds.forEach(tableId -> codegenColumnMapper.deleteListByTableId(tableId)); + } + @Override public List getCodegenTableList(Long dataSourceConfigId) { return codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId); diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigService.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigService.java index 0087b83b9..854d13a99 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigService.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigService.java @@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigSaveReqVO; import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO; import jakarta.validation.Valid; +import java.util.List; + /** * 参数配置 Service 接口 * @@ -35,6 +37,13 @@ public interface ConfigService { */ void deleteConfig(Long id); + /** + * 批量删除参数配置 + * + * @param ids 配置编号列表 + */ + void deleteConfigList(List ids); + /** * 获得参数配置 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java index b0e5c53be..14b93654c 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.infra.service.config; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigPageReqVO; import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigSaveReqVO; @@ -13,6 +14,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.util.List; + import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*; @@ -63,6 +66,28 @@ public class ConfigServiceImpl implements ConfigService { configMapper.deleteById(id); } + @Override + public void deleteConfigList(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 校验配置存在 + List configs = configMapper.selectByIds(ids); + if (configs.size() != ids.size()) { + throw exception(CONFIG_NOT_EXISTS); + } + + // 校验是否有内置配置 + for (ConfigDO config : configs) { + if (ConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { + throw exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); + } + } + + // 批量删除 + configMapper.deleteByIds(ids); + } + @Override public ConfigDO getConfig(Long id) { return configMapper.selectById(id); diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigService.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigService.java index bb741660e..8382b48ce 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigService.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigService.java @@ -35,6 +35,13 @@ public interface DataSourceConfigService { */ void deleteDataSourceConfig(Long id); + /** + * 批量删除数据源配置 + * + * @param ids 编号列表 + */ + void deleteDataSourceConfigList(List ids); + /** * 获得数据源配置 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImpl.java index 3e9ed4ff3..254176079 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.infra.service.db; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils; import cn.iocoder.yudao.module.infra.controller.admin.db.vo.DataSourceConfigSaveReqVO; @@ -63,6 +64,17 @@ public class DataSourceConfigServiceImpl implements DataSourceConfigService { dataSourceConfigMapper.deleteById(id); } + @Override + public void deleteDataSourceConfigList(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 校验存在 + ids.forEach(this::validateDataSourceConfigExists); + // 批量删除 + dataSourceConfigMapper.deleteByIds(ids); + } + private void validateDataSourceConfigExists(Long id) { if (dataSourceConfigMapper.selectById(id) == null) { throw exception(DATA_SOURCE_CONFIG_NOT_EXISTS); diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigService.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigService.java index b2bf49144..6c69c6ed9 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigService.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigService.java @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileConfigDO; import cn.iocoder.yudao.module.infra.framework.file.core.client.FileClient; import jakarta.validation.Valid; +import java.util.List; + /** * 文件配置 Service 接口 * @@ -43,6 +45,13 @@ public interface FileConfigService { */ void deleteFileConfig(Long id); + /** + * 批量删除文件配置 + * + * @param ids 编号列表 + */ + void deleteFileConfigList(List ids); + /** * 获得文件配置 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImpl.java index 4e7bf47cc..f3347d362 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.infra.service.file; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.util.IdUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -25,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.time.Duration; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -134,6 +136,34 @@ public class FileConfigServiceImpl implements FileConfigService { clearCache(id, null); } + @Override + public void deleteFileConfigList(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + + // 校验存在 + List configs = fileConfigMapper.selectByIds(ids); + if (configs.size() != ids.size()) { + throw exception(FILE_CONFIG_NOT_EXISTS); + } + + // 校验是否有主配置 + for (FileConfigDO config : configs) { + if (Boolean.TRUE.equals(config.getMaster())) { + throw exception(FILE_CONFIG_DELETE_FAIL_MASTER); + } + } + + // 批量删除 + fileConfigMapper.deleteByIds(ids); + + // 清空缓存 + for (Long id : ids) { + clearCache(id, null); + } + } + /** * 清空指定文件配置 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileService.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileService.java index 01c2bba72..5b15ad873 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileService.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileService.java @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePresigned import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; import jakarta.validation.constraints.NotEmpty; +import java.util.List; + /** * 文件 Service 接口 * @@ -59,6 +61,13 @@ public interface FileService { */ void deleteFile(Long id) throws Exception; + /** + * 批量删除文件 + * + * @param ids 编号列表 + */ + void deleteFileList(List ids) throws Exception; + /** * 获得文件内容 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java index 4a0faadaa..822be3fe9 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.infra.service.file; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; @@ -20,6 +21,10 @@ import jakarta.annotation.Resource; import lombok.SneakyThrows; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + import static cn.hutool.core.date.DatePattern.PURE_DATE_PATTERN; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; @@ -156,6 +161,36 @@ public class FileServiceImpl implements FileService { fileMapper.deleteById(id); } + @Override + public void deleteFileList(List ids) throws Exception { + if (CollUtil.isEmpty(ids)) { + return; + } + + // 校验存在 + List files = fileMapper.selectByIds(ids); + if (files.size() != ids.size()) { + throw exception(FILE_NOT_EXISTS); + } + + // 按照配置分组,批量删除 + Map> configFiles = files.stream() + .collect(Collectors.groupingBy(FileDO::getConfigId)); + for (Map.Entry> entry : configFiles.entrySet()) { + // 获取客户端 + FileClient client = fileConfigService.getFileClient(entry.getKey()); + Assert.notNull(client, "客户端({}) 不能为空", entry.getKey()); + + // 批量删除文件 + for (FileDO file : entry.getValue()) { + client.delete(file.getPath()); + } + } + + // 删除记录 + fileMapper.deleteByIds(ids); + } + private FileDO validateFileExists(Long id) { FileDO fileDO = fileMapper.selectById(id); if (fileDO == null) { diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobService.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobService.java index bce2a9557..b830b08c4 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobService.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobService.java @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobDO; import jakarta.validation.Valid; import org.quartz.SchedulerException; +import java.util.List; + /** * 定时任务 Service 接口 * @@ -58,6 +60,13 @@ public interface JobService { */ void deleteJob(Long id) throws SchedulerException; + /** + * 批量删除定时任务 + * + * @param ids 编号列表 + */ + void deleteJobList(List ids) throws SchedulerException; + /** * 获得定时任务 * diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java index 982e39ba4..85ea76a8c 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java @@ -169,6 +169,28 @@ public class JobServiceImpl implements JobService { schedulerManager.deleteJob(job.getHandlerName()); } + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobList(List ids) throws SchedulerException { + if (ids == null || ids.isEmpty()) { + return; + } + + // 校验存在 + List jobs = jobMapper.selectByIds(ids); + if (jobs.size() != ids.size()) { + throw exception(JOB_NOT_EXISTS); + } + + // 批量删除 + jobMapper.deleteByIds(ids); + + // 删除 Job 到 Quartz 中 + for (JobDO job : jobs) { + schedulerManager.deleteJob(job.getHandlerName()); + } + } + private JobDO validateJobExists(Long id) { JobDO job = jobMapper.selectById(id); if (job == null) {