Commit 03d3ebdf05f2f95c68b7e25c1e4d5b46d373ee52
1 parent
bcd6ed4c
review:【INFRA 基础设施】批量删除接口
Showing
12 changed files
with
30 additions
and
112 deletions
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenColumnMapper.java
| ... | ... | @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 5 | 5 | import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO; |
| 6 | 6 | import org.apache.ibatis.annotations.Mapper; |
| 7 | 7 | |
| 8 | +import java.util.Collection; | |
| 8 | 9 | import java.util.List; |
| 9 | 10 | |
| 10 | 11 | @Mapper |
| ... | ... | @@ -17,8 +18,12 @@ public interface CodegenColumnMapper extends BaseMapperX<CodegenColumnDO> { |
| 17 | 18 | } |
| 18 | 19 | |
| 19 | 20 | default void deleteListByTableId(Long tableId) { |
| 21 | + delete(CodegenColumnDO::getTableId, tableId); | |
| 22 | + } | |
| 23 | + | |
| 24 | + default void deleteListByTableId(Collection<Long> tableIds) { | |
| 20 | 25 | delete(new LambdaQueryWrapperX<CodegenColumnDO>() |
| 21 | - .eq(CodegenColumnDO::getTableId, tableId)); | |
| 26 | + .in(CodegenColumnDO::getTableId, tableIds)); | |
| 22 | 27 | } |
| 23 | 28 | |
| 24 | 29 | } | ... | ... |
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java
| ... | ... | @@ -225,20 +225,10 @@ public class CodegenServiceImpl implements CodegenService { |
| 225 | 225 | @Override |
| 226 | 226 | @Transactional(rollbackFor = Exception.class) |
| 227 | 227 | public void deleteCodegenList(List<Long> tableIds) { |
| 228 | - if (CollUtil.isEmpty(tableIds)) { | |
| 229 | - return; | |
| 230 | - } | |
| 231 | - | |
| 232 | - // 校验是否都存在 | |
| 233 | - List<CodegenTableDO> tables = codegenTableMapper.selectByIds(tableIds); | |
| 234 | - if (tables.size() != tableIds.size()) { | |
| 235 | - throw exception(CODEGEN_TABLE_NOT_EXISTS); | |
| 236 | - } | |
| 237 | - | |
| 238 | 228 | // 批量删除 table 表定义 |
| 239 | 229 | codegenTableMapper.deleteByIds(tableIds); |
| 240 | 230 | // 批量删除 column 字段定义 |
| 241 | - tableIds.forEach(tableId -> codegenColumnMapper.deleteListByTableId(tableId)); | |
| 231 | + codegenColumnMapper.deleteListByTableId(tableIds); | |
| 242 | 232 | } |
| 243 | 233 | |
| 244 | 234 | @Override | ... | ... |
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/config/ConfigServiceImpl.java
| 1 | 1 | package cn.iocoder.yudao.module.infra.service.config; |
| 2 | 2 | |
| 3 | -import cn.hutool.core.collection.CollUtil; | |
| 4 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | 4 | import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigPageReqVO; |
| 6 | 5 | import cn.iocoder.yudao.module.infra.controller.admin.config.vo.ConfigSaveReqVO; |
| ... | ... | @@ -68,21 +67,13 @@ public class ConfigServiceImpl implements ConfigService { |
| 68 | 67 | |
| 69 | 68 | @Override |
| 70 | 69 | public void deleteConfigList(List<Long> ids) { |
| 71 | - if (CollUtil.isEmpty(ids)) { | |
| 72 | - return; | |
| 73 | - } | |
| 74 | - // 校验配置存在 | |
| 75 | - List<ConfigDO> configs = configMapper.selectByIds(ids); | |
| 76 | - if (configs.size() != ids.size()) { | |
| 77 | - throw exception(CONFIG_NOT_EXISTS); | |
| 78 | - } | |
| 79 | - | |
| 80 | 70 | // 校验是否有内置配置 |
| 81 | - for (ConfigDO config : configs) { | |
| 71 | + List<ConfigDO> configs = configMapper.selectByIds(ids); | |
| 72 | + configs.forEach(config -> { | |
| 82 | 73 | if (ConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { |
| 83 | 74 | throw exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); |
| 84 | 75 | } |
| 85 | - } | |
| 76 | + }); | |
| 86 | 77 | |
| 87 | 78 | // 批量删除 |
| 88 | 79 | configMapper.deleteByIds(ids); | ... | ... |
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImpl.java
| 1 | 1 | package cn.iocoder.yudao.module.infra.service.db; |
| 2 | 2 | |
| 3 | -import cn.hutool.core.collection.CollUtil; | |
| 4 | 3 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 5 | 4 | import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils; |
| 6 | 5 | import cn.iocoder.yudao.module.infra.controller.admin.db.vo.DataSourceConfigSaveReqVO; |
| ... | ... | @@ -66,12 +65,6 @@ public class DataSourceConfigServiceImpl implements DataSourceConfigService { |
| 66 | 65 | |
| 67 | 66 | @Override |
| 68 | 67 | public void deleteDataSourceConfigList(List<Long> ids) { |
| 69 | - if (CollUtil.isEmpty(ids)) { | |
| 70 | - return; | |
| 71 | - } | |
| 72 | - // 校验存在 | |
| 73 | - ids.forEach(this::validateDataSourceConfigExists); | |
| 74 | - // 批量删除 | |
| 75 | 68 | dataSourceConfigMapper.deleteByIds(ids); |
| 76 | 69 | } |
| 77 | 70 | ... | ... |
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileConfigServiceImpl.java
| 1 | 1 | package cn.iocoder.yudao.module.infra.service.file; |
| 2 | 2 | |
| 3 | -import cn.hutool.core.collection.CollUtil; | |
| 4 | 3 | import cn.hutool.core.io.resource.ResourceUtil; |
| 5 | 4 | import cn.hutool.core.util.IdUtil; |
| 6 | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| ... | ... | @@ -138,17 +137,8 @@ public class FileConfigServiceImpl implements FileConfigService { |
| 138 | 137 | |
| 139 | 138 | @Override |
| 140 | 139 | public void deleteFileConfigList(List<Long> ids) { |
| 141 | - if (CollUtil.isEmpty(ids)) { | |
| 142 | - return; | |
| 143 | - } | |
| 144 | - | |
| 145 | - // 校验存在 | |
| 146 | - List<FileConfigDO> configs = fileConfigMapper.selectByIds(ids); | |
| 147 | - if (configs.size() != ids.size()) { | |
| 148 | - throw exception(FILE_CONFIG_NOT_EXISTS); | |
| 149 | - } | |
| 150 | - | |
| 151 | 140 | // 校验是否有主配置 |
| 141 | + List<FileConfigDO> configs = fileConfigMapper.selectByIds(ids); | |
| 152 | 142 | for (FileConfigDO config : configs) { |
| 153 | 143 | if (Boolean.TRUE.equals(config.getMaster())) { |
| 154 | 144 | throw exception(FILE_CONFIG_DELETE_FAIL_MASTER); |
| ... | ... | @@ -159,9 +149,7 @@ public class FileConfigServiceImpl implements FileConfigService { |
| 159 | 149 | fileConfigMapper.deleteByIds(ids); |
| 160 | 150 | |
| 161 | 151 | // 清空缓存 |
| 162 | - for (Long id : ids) { | |
| 163 | - clearCache(id, null); | |
| 164 | - } | |
| 152 | + ids.forEach(id -> clearCache(id, null)); | |
| 165 | 153 | } |
| 166 | 154 | |
| 167 | 155 | /** | ... | ... |
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java
| 1 | 1 | package cn.iocoder.yudao.module.infra.service.file; |
| 2 | 2 | |
| 3 | -import cn.hutool.core.collection.CollUtil; | |
| 4 | 3 | import cn.hutool.core.date.LocalDateTimeUtil; |
| 5 | 4 | import cn.hutool.core.io.FileUtil; |
| 6 | 5 | import cn.hutool.core.lang.Assert; |
| ... | ... | @@ -22,8 +21,6 @@ import lombok.SneakyThrows; |
| 22 | 21 | import org.springframework.stereotype.Service; |
| 23 | 22 | |
| 24 | 23 | import java.util.List; |
| 25 | -import java.util.Map; | |
| 26 | -import java.util.stream.Collectors; | |
| 27 | 24 | |
| 28 | 25 | import static cn.hutool.core.date.DatePattern.PURE_DATE_PATTERN; |
| 29 | 26 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| ... | ... | @@ -162,29 +159,16 @@ public class FileServiceImpl implements FileService { |
| 162 | 159 | } |
| 163 | 160 | |
| 164 | 161 | @Override |
| 165 | - public void deleteFileList(List<Long> ids) throws Exception { | |
| 166 | - if (CollUtil.isEmpty(ids)) { | |
| 167 | - return; | |
| 168 | - } | |
| 169 | - | |
| 170 | - // 校验存在 | |
| 162 | + @SneakyThrows | |
| 163 | + public void deleteFileList(List<Long> ids) { | |
| 164 | + // 删除文件 | |
| 171 | 165 | List<FileDO> files = fileMapper.selectByIds(ids); |
| 172 | - if (files.size() != ids.size()) { | |
| 173 | - throw exception(FILE_NOT_EXISTS); | |
| 174 | - } | |
| 175 | - | |
| 176 | - // 按照配置分组,批量删除 | |
| 177 | - Map<Long, List<FileDO>> configFiles = files.stream() | |
| 178 | - .collect(Collectors.groupingBy(FileDO::getConfigId)); | |
| 179 | - for (Map.Entry<Long, List<FileDO>> entry : configFiles.entrySet()) { | |
| 166 | + for (FileDO file : files) { | |
| 180 | 167 | // 获取客户端 |
| 181 | - FileClient client = fileConfigService.getFileClient(entry.getKey()); | |
| 182 | - Assert.notNull(client, "客户端({}) 不能为空", entry.getKey()); | |
| 183 | - | |
| 184 | - // 批量删除文件 | |
| 185 | - for (FileDO file : entry.getValue()) { | |
| 186 | - client.delete(file.getPath()); | |
| 187 | - } | |
| 168 | + FileClient client = fileConfigService.getFileClient(file.getConfigId()); | |
| 169 | + Assert.notNull(client, "客户端({}) 不能为空", file.getPath()); | |
| 170 | + // 删除文件 | |
| 171 | + client.delete(file.getPath()); | |
| 188 | 172 | } |
| 189 | 173 | |
| 190 | 174 | // 删除记录 | ... | ... |
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobServiceImpl.java
| ... | ... | @@ -172,17 +172,8 @@ public class JobServiceImpl implements JobService { |
| 172 | 172 | @Override |
| 173 | 173 | @Transactional(rollbackFor = Exception.class) |
| 174 | 174 | public void deleteJobList(List<Long> ids) throws SchedulerException { |
| 175 | - if (ids == null || ids.isEmpty()) { | |
| 176 | - return; | |
| 177 | - } | |
| 178 | - | |
| 179 | - // 校验存在 | |
| 180 | - List<JobDO> jobs = jobMapper.selectByIds(ids); | |
| 181 | - if (jobs.size() != ids.size()) { | |
| 182 | - throw exception(JOB_NOT_EXISTS); | |
| 183 | - } | |
| 184 | - | |
| 185 | 175 | // 批量删除 |
| 176 | + List<JobDO> jobs = jobMapper.selectByIds(ids); | |
| 186 | 177 | jobMapper.deleteByIds(ids); |
| 187 | 178 | |
| 188 | 179 | // 删除 Job 到 Quartz 中 | ... | ... |
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java
| ... | ... | @@ -100,13 +100,6 @@ public class DictDataServiceImpl implements DictDataService { |
| 100 | 100 | |
| 101 | 101 | @Override |
| 102 | 102 | public void deleteDictDataList(List<Long> ids) { |
| 103 | - if (CollUtil.isEmpty(ids)) { | |
| 104 | - return; | |
| 105 | - } | |
| 106 | - // 校验是否存在 | |
| 107 | - ids.forEach(this::validateDictDataExists); | |
| 108 | - | |
| 109 | - // 批量删除字典数据 | |
| 110 | 103 | dictDataMapper.deleteByIds(ids); |
| 111 | 104 | } |
| 112 | 105 | ... | ... |
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java
| ... | ... | @@ -89,21 +89,15 @@ public class DictTypeServiceImpl implements DictTypeService { |
| 89 | 89 | |
| 90 | 90 | @Override |
| 91 | 91 | public void deleteDictTypeList(List<Long> ids) { |
| 92 | - if (ids == null || ids.isEmpty()) { | |
| 93 | - return; | |
| 94 | - } | |
| 95 | - // 校验是否存在 | |
| 96 | - ids.forEach(this::validateDictTypeExists); | |
| 97 | - | |
| 98 | - // 校验是否有字典数据 | |
| 92 | + // 1. 校验是否有字典数据 | |
| 99 | 93 | List<DictTypeDO> dictTypes = dictTypeMapper.selectByIds(ids); |
| 100 | - for (DictTypeDO dictType : dictTypes) { | |
| 94 | + dictTypes.forEach(dictType -> { | |
| 101 | 95 | if (dictDataService.getDictDataCountByDictType(dictType.getType()) > 0) { |
| 102 | 96 | throw exception(DICT_TYPE_HAS_CHILDREN); |
| 103 | 97 | } |
| 104 | - } | |
| 98 | + }); | |
| 105 | 99 | |
| 106 | - // 批量删除字典类型 | |
| 100 | + // 2. 批量删除字典类型 | |
| 107 | 101 | LocalDateTime now = LocalDateTime.now(); |
| 108 | 102 | ids.forEach(id -> dictTypeMapper.updateToDelete(id, now)); |
| 109 | 103 | } | ... | ... |
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java
| ... | ... | @@ -106,22 +106,15 @@ public class MenuServiceImpl implements MenuService { |
| 106 | 106 | |
| 107 | 107 | @Override |
| 108 | 108 | @Transactional(rollbackFor = Exception.class) |
| 109 | - @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, allEntries = true) | |
| 109 | + @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, | |
| 110 | + allEntries = true) // allEntries 清空所有缓存,因为 Spring Cache 不支持按照 ids 批量删除 | |
| 110 | 111 | public void deleteMenuList(List<Long> ids) { |
| 111 | - if (CollUtil.isEmpty(ids)) { | |
| 112 | - return; | |
| 113 | - } | |
| 114 | 112 | // 校验是否还有子菜单 |
| 115 | - for (Long id : ids) { | |
| 113 | + ids.forEach(id -> { | |
| 116 | 114 | if (menuMapper.selectCountByParentId(id) > 0) { |
| 117 | 115 | throw exception(MENU_EXISTS_CHILDREN); |
| 118 | 116 | } |
| 119 | - } | |
| 120 | - // 校验删除的菜单是否存在 | |
| 121 | - List<MenuDO> menus = menuMapper.selectByIds(ids); | |
| 122 | - if (menus.size() != ids.size()) { | |
| 123 | - throw exception(MENU_NOT_EXISTS); | |
| 124 | - } | |
| 117 | + }); | |
| 125 | 118 | |
| 126 | 119 | // 标记删除 |
| 127 | 120 | menuMapper.deleteByIds(ids); | ... | ... |
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java
| ... | ... | @@ -125,10 +125,7 @@ public class RoleServiceImpl implements RoleService { |
| 125 | 125 | @Override |
| 126 | 126 | @Transactional(rollbackFor = Exception.class) |
| 127 | 127 | public void deleteRoleList(List<Long> ids) { |
| 128 | - if (CollUtil.isEmpty(ids)) { | |
| 129 | - return; | |
| 130 | - } | |
| 131 | - // 1. 校验是否可以更新 | |
| 128 | + // 1. 校验是否可以删除 | |
| 132 | 129 | ids.forEach(this::validateRoleForUpdate); |
| 133 | 130 | |
| 134 | 131 | // 2.1 标记删除 | ... | ... |