From 41b17d4faf69eb7ea5a1cb7b06683324901c6b0e Mon Sep 17 00:00:00 2001 From: Ken Date: Tue, 20 May 2025 12:57:33 +0800 Subject: [PATCH 01/14] =?UTF-8?q?fix(=E5=BE=AE=E4=BF=A1=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E7=A1=AE=E8=AE=A4=E6=94=B6=E8=B4=A7=E6=8F=90=E9=86=92?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3):=20=E4=BF=AE=E5=A4=8D=20#839=20-=20received?= =?UTF-8?q?=5Ftime=20=E6=97=B6=E9=97=B4=E6=88=B3=E5=8D=95=E4=BD=8D?= =?UTF-8?q?=E9=94=99=E8=AF=AF=EF=BC=88=E5=BA=94=E4=B8=BA=E7=A7=92=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根据微信小程序接口要求,订单签收时间 received_time 应为秒级时间戳,但现有实现传入了毫秒,导致微信接口返回错误代码 10060029(签收时间不合理)。 新增 LocalDateUtils.toEpochSecond 方法,统一将 LocalDateTime 转换为秒级时间戳,用于接口参数转换。 BREAKING CHANGE: 无 Closes #839 --- .../common/util/date/LocalDateTimeUtils.java | 15 ++++++++++++++- .../service/social/SocialClientServiceImpl.java | 3 ++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java index 6d19a3cc75..8d18479c81 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.common.util.date; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.date.TemporalAccessorUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.enums.DateIntervalEnum; @@ -19,7 +20,7 @@ import static cn.hutool.core.date.DatePattern.UTC_MS_WITH_XXX_OFFSET_PATTERN; import static cn.hutool.core.date.DatePattern.createFormatter; /** - * 时间工具类,用于 {@link java.time.LocalDateTime} + * 时间工具类,用于 {@link LocalDateTime} * * @author 芋道源码 */ @@ -312,4 +313,16 @@ public class LocalDateTimeUtils { } } + /** + * 将给定的 {@link LocalDateTime} 转换为自 Unix 纪元时间(1970-01-01T00:00:00Z)以来的秒数。 + * + * @param sourceDateTime 需要转换的本地日期时间,不能为空 + * @return 自 1970-01-01T00:00:00Z 起的秒数(epoch second) + * @throws NullPointerException 如果 {@code sourceDateTime} 为 {@code null} + * @throws DateTimeException 如果转换过程中发生时间超出范围或其他时间处理异常 + */ + public static Long toEpochSecond(LocalDateTime sourceDateTime) { + return TemporalAccessorUtil.toInstant(sourceDateTime).getEpochSecond(); + } + } diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index b5c9d88a71..6ff2a28616 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -68,6 +68,7 @@ import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.UTC_MS_WITH_XXX_OFFSET_FORMATTER; +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.toEpochSecond; import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; import static java.util.Collections.singletonList; @@ -379,7 +380,7 @@ public class SocialClientServiceImpl implements SocialClientService { WxMaService service = getWxMaService(userType); WxMaOrderShippingInfoNotifyConfirmRequest request = WxMaOrderShippingInfoNotifyConfirmRequest.builder() .transactionId(reqDTO.getTransactionId()) - .receivedTime(LocalDateTimeUtil.toEpochMilli(reqDTO.getReceivedTime())) + .receivedTime(toEpochSecond(reqDTO.getReceivedTime())) .build(); try { WxMaOrderShippingInfoBaseResponse response = service.getWxMaOrderShippingService().notifyConfirmReceive(request); From 37884accc3d6dfce92cb1b406b30b510163fbc3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E7=A8=8D=E8=91=9B?= <415233722@qq.com> Date: Thu, 22 May 2025 10:36:36 +0800 Subject: [PATCH 02/14] =?UTF-8?q?Excel=E5=AF=BC=E5=87=BA=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E4=B8=8B=E6=8B=89=E9=80=89=E6=8B=A9=E5=88=97=E9=94=99=E4=BD=8D?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/handler/SelectSheetWriteHandler.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java index ef1eb65bcd..6c55f382f0 100644 --- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java +++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java @@ -10,6 +10,8 @@ import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils; import cn.iocoder.yudao.framework.excel.core.annotations.ExcelColumnSelect; import cn.iocoder.yudao.framework.excel.core.function.ExcelColumnSelectFunction; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.write.handler.SheetWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; @@ -20,6 +22,7 @@ import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddressList; import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -56,7 +59,17 @@ public class SelectSheetWriteHandler implements SheetWriteHandler { public SelectSheetWriteHandler(Class head) { // 解析下拉数据 int colIndex = 0; + boolean ignoreUnannotated = head.isAnnotationPresent(ExcelIgnoreUnannotated.class); for (Field field : head.getDeclaredFields()) { + // 忽略 static final 或 transient 的字段 + if(isStaticFinalOrTransient(field) ) { + continue; + } + // 忽略的字段跳过 + if((ignoreUnannotated && !field.isAnnotationPresent(ExcelProperty.class)) + || field.isAnnotationPresent(ExcelIgnore.class)){ + continue; + } if (field.isAnnotationPresent(ExcelColumnSelect.class)) { ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); if (excelProperty != null && excelProperty.index() != -1) { @@ -68,6 +81,18 @@ public class SelectSheetWriteHandler implements SheetWriteHandler { } } + /** + * 判断字段是否是静态的、最终的、 transient 的 + * ExcelExcel 默认是忽略 static final 或 transient 的字段,所以需要判断 + * @param field 字段 + * @return 是否是静态的、最终的、 transient 的 + */ + private boolean isStaticFinalOrTransient(Field field) { + return (Modifier.isStatic(field.getModifiers()) && Modifier.isFinal(field.getModifiers())) + || Modifier.isTransient(field.getModifiers()); + } + + /** * 获得下拉数据,并添加到 {@link #selectMap} 中 * From b17015db09a73905a3b07a9021f2a84049cfdefc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E7=A8=8D=E8=91=9B?= <415233722@qq.com> Date: Thu, 22 May 2025 10:44:37 +0800 Subject: [PATCH 03/14] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/excel/core/handler/SelectSheetWriteHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java index 6c55f382f0..0dac0c6c1d 100644 --- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java +++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java @@ -83,7 +83,7 @@ public class SelectSheetWriteHandler implements SheetWriteHandler { /** * 判断字段是否是静态的、最终的、 transient 的 - * ExcelExcel 默认是忽略 static final 或 transient 的字段,所以需要判断 + * EasyExcel 默认是忽略 static final 或 transient 的字段,所以需要判断 * @param field 字段 * @return 是否是静态的、最终的、 transient 的 */ From 20241b8bcc221db9cd62cacd3c064c78a1826370 Mon Sep 17 00:00:00 2001 From: SuchJack <2640808535@qq.com> Date: Sat, 24 May 2025 20:04:07 +0800 Subject: [PATCH 04/14] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D"=E5=95=86=E5=93=81?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E8=81=9A=E5=90=88=E5=87=BD=E6=95=B0=E7=9A=84?= =?UTF-8?q?=E5=88=AB=E5=90=8D=E4=B8=8E=E6=8E=92=E5=BA=8F=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E4=B8=8D=E7=AC=A6"=E5=AF=BC=E8=87=B4=E7=9A=84SQL=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/ProductStatisticsMapper.java | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/yudao-module-mall/yudao-module-statistics/src/main/java/cn/iocoder/yudao/module/statistics/dal/mysql/product/ProductStatisticsMapper.java b/yudao-module-mall/yudao-module-statistics/src/main/java/cn/iocoder/yudao/module/statistics/dal/mysql/product/ProductStatisticsMapper.java index 4cf10f102d..56029131d8 100644 --- a/yudao-module-mall/yudao-module-statistics/src/main/java/cn/iocoder/yudao/module/statistics/dal/mysql/product/ProductStatisticsMapper.java +++ b/yudao-module-mall/yudao-module-statistics/src/main/java/cn/iocoder/yudao/module/statistics/dal/mysql/product/ProductStatisticsMapper.java @@ -1,16 +1,20 @@ package cn.iocoder.yudao.module.statistics.dal.mysql.product; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.SortablePageParam; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; import cn.iocoder.yudao.module.statistics.controller.admin.product.vo.ProductStatisticsReqVO; import cn.iocoder.yudao.module.statistics.controller.admin.product.vo.ProductStatisticsRespVO; import cn.iocoder.yudao.module.statistics.dal.dataobject.product.ProductStatisticsDO; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import org.dromara.hutool.core.func.LambdaUtil; import java.time.LocalDateTime; import java.util.List; @@ -49,16 +53,31 @@ public interface ProductStatisticsMapper extends BaseMapperX buildWrapper(ProductStatisticsReqVO reqVO) { return new MPJLambdaWrapperX() .betweenIfPresent(ProductStatisticsDO::getTime, reqVO.getTimes()) - .selectSum(ProductStatisticsDO::getBrowseCount) - .selectSum(ProductStatisticsDO::getBrowseUserCount) - .selectSum(ProductStatisticsDO::getFavoriteCount) - .selectSum(ProductStatisticsDO::getCartCount) - .selectSum(ProductStatisticsDO::getOrderCount) - .selectSum(ProductStatisticsDO::getOrderPayCount) - .selectSum(ProductStatisticsDO::getOrderPayPrice) - .selectSum(ProductStatisticsDO::getAfterSaleCount) - .selectSum(ProductStatisticsDO::getAfterSaleRefundPrice) - .selectAvg(ProductStatisticsDO::getBrowseConvertPercent); + .selectSum(ProductStatisticsDO::getBrowseCount,toUnderlineCase(ProductStatisticsDO::getBrowseCount)) + .selectSum(ProductStatisticsDO::getBrowseUserCount,toUnderlineCase(ProductStatisticsDO::getBrowseUserCount)) + .selectSum(ProductStatisticsDO::getFavoriteCount,toUnderlineCase(ProductStatisticsDO::getFavoriteCount)) + .selectSum(ProductStatisticsDO::getCartCount,toUnderlineCase(ProductStatisticsDO::getCartCount)) + .selectSum(ProductStatisticsDO::getOrderCount,toUnderlineCase(ProductStatisticsDO::getOrderCount)) + .selectSum(ProductStatisticsDO::getOrderPayCount,toUnderlineCase(ProductStatisticsDO::getOrderPayCount)) + .selectSum(ProductStatisticsDO::getOrderPayPrice,toUnderlineCase(ProductStatisticsDO::getOrderPayPrice)) + .selectSum(ProductStatisticsDO::getAfterSaleCount,toUnderlineCase(ProductStatisticsDO::getAfterSaleCount)) + .selectSum(ProductStatisticsDO::getAfterSaleRefundPrice,toUnderlineCase(ProductStatisticsDO::getAfterSaleRefundPrice)) + .selectAvg(ProductStatisticsDO::getBrowseConvertPercent,toUnderlineCase(ProductStatisticsDO::getBrowseConvertPercent)); + } + + /** + * 将驼峰命名转换为下划线命名 + * + * @param func 字段名函数(驼峰命名) + * @return 字段名(下划线命名) + * @param 泛型 + *

+ * fix:排序时排序字段被 {@link MyBatisUtils#buildPage} 由驼峰命名被转为下划线命名, + * 因此聚合函数的别名也做统一,统一为下划线命名,解决排序时找不到字段的问题。 + */ + private static String toUnderlineCase(SFunction func) { + String fieldName = LambdaUtil.getFieldName(func); + return StrUtil.toUnderlineCase(fieldName); } /** From bed36f684f591115325b7ed69401ebef3cee2147 Mon Sep 17 00:00:00 2001 From: SuchJack <2640808535@qq.com> Date: Sun, 1 Jun 2025 18:15:24 +0800 Subject: [PATCH 05/14] =?UTF-8?q?fix(mall)=EF=BC=9A=E6=8B=BC=E5=9B=A2?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=88=9B=E5=BB=BA=E6=97=B6=EF=BC=8C=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E8=AE=BE=E7=BD=AE=E6=8B=BC=E5=9B=A2=E5=95=86=E5=93=81?= =?UTF-8?q?=E7=9A=84=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/combination/CombinationRecordServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java b/yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java index 58a8907536..664d9e8982 100644 --- a/yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java @@ -167,6 +167,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { ProductSpuRespDTO spu = productSpuApi.getSpu(reqDTO.getSpuId()); ProductSkuRespDTO sku = productSkuApi.getSku(reqDTO.getSkuId()); CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO, keyValue.getKey(), user, spu, sku); + record.setPicUrl(spu.getPicUrl()); // fix:拼团记录创建时,需要设置拼团商品的图片 // 2.1. 如果是团长需要设置 headId 为 CombinationRecordDO#HEAD_ID_GROUP if (record.getHeadId() == null) { record.setStartTime(LocalDateTime.now()) From 4b8048ff593726f918af21f0a22e39f2b9c88772 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 15 Jun 2025 10:47:58 +0800 Subject: [PATCH 06/14] =?UTF-8?q?!1352=20fix(bpm):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E6=9C=AA=E6=8B=BC=E6=8E=A5=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=97=B6=E7=9B=B4=E6=8E=A5=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/bpm/service/task/BpmProcessInstanceServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java index 319f7bd8a8..a42a3ecd4b 100644 --- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java +++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java @@ -270,7 +270,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService .setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(node)) .setCandidateUserIds(getTaskCandidateUserList(bpmnModel, node.getId(), loginUserId, historicProcessInstance.getProcessDefinitionId(), processVariables))); - if (CollUtil.isNotEmpty(nextActivityNodes)) { + if (CollUtil.isEmpty(nextActivityNodes)) { return nextActivityNodes; } From 39d1954ec9422156382e28cf77959e4065463ccc Mon Sep 17 00:00:00 2001 From: puhui999 Date: Sun, 15 Jun 2025 12:25:24 +0800 Subject: [PATCH 07/14] =?UTF-8?q?feat:=20system=20=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/dict/DictDataController.java | 13 ++++++++-- .../admin/dict/DictTypeController.java | 9 +++++++ .../admin/permission/MenuController.java | 13 ++++++++-- .../admin/permission/RoleController.java | 13 +++++++++- .../system/service/dept/PostService.java | 7 ++++++ .../system/service/dict/DictDataService.java | 7 ++++++ .../service/dict/DictDataServiceImpl.java | 12 +++++++++ .../system/service/dict/DictTypeService.java | 7 ++++++ .../service/dict/DictTypeServiceImpl.java | 23 ++++++++++++++++- .../service/permission/MenuService.java | 9 ++++++- .../service/permission/MenuServiceImpl.java | 25 +++++++++++++++++++ .../service/permission/RoleService.java | 9 ++++++- .../service/permission/RoleServiceImpl.java | 15 +++++++++++ 13 files changed, 154 insertions(+), 8 deletions(-) diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java index c05de995e8..ac44bc1e54 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java @@ -58,11 +58,20 @@ public class DictDataController { @Operation(summary = "删除字典数据") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('system:dict:delete')") - public CommonResult deleteDictData(Long id) { + public CommonResult deleteDictData(@RequestParam("id") Long id) { dictDataService.deleteDictData(id); return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除字典数据") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('system:dict:delete')") + public CommonResult deleteDictDataList(@RequestParam("ids") List ids) { + dictDataService.deleteDictDataList(ids); + return success(true); + } + @GetMapping(value = {"/list-all-simple", "simple-list"}) @Operation(summary = "获得全部字典数据列表", description = "一般用于管理后台缓存字典数据在本地") // 无需添加权限认证,因为前端全局都需要 @@ -73,7 +82,7 @@ public class DictDataController { } @GetMapping("/page") - @Operation(summary = "/获得字典类型的分页列表") + @Operation(summary = "获得字典类型的分页") @PreAuthorize("@ss.hasPermission('system:dict:query')") public CommonResult> getDictTypePage(@Valid DictDataPageReqVO pageReqVO) { PageResult pageResult = dictDataService.getDictDataPage(pageReqVO); diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java index c40980cfc5..8247f13253 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java @@ -62,6 +62,15 @@ public class DictTypeController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除字典类型") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('system:dict:delete')") + public CommonResult deleteDictTypeList(@RequestParam("ids") List ids) { + dictTypeService.deleteDictTypeList(ids); + return success(true); + } + @GetMapping("/page") @Operation(summary = "获得字典类型的分页列表") @PreAuthorize("@ss.hasPermission('system:dict:query')") diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java index 824fe41048..e19e28500e 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java @@ -12,12 +12,12 @@ import cn.iocoder.yudao.module.system.service.permission.MenuService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; import java.util.Comparator; import java.util.List; @@ -57,6 +57,15 @@ public class MenuController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除菜单") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('system:menu:delete')") + public CommonResult deleteMenuList(@RequestParam("ids") List ids) { + menuService.deleteMenuList(ids); + return success(true); + } + @GetMapping("/list") @Operation(summary = "获取菜单列表", description = "用于【菜单管理】界面") @PreAuthorize("@ss.hasPermission('system:menu:query')") diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java index cf22687529..5109d9e7dd 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.java @@ -7,7 +7,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.*; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleRespVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.service.permission.RoleService; import io.swagger.v3.oas.annotations.Operation; @@ -61,6 +63,15 @@ public class RoleController { return success(true); } + @DeleteMapping("/delete-list") + @Operation(summary = "批量删除角色") + @Parameter(name = "ids", description = "编号列表", required = true) + @PreAuthorize("@ss.hasPermission('system:role:delete')") + public CommonResult deleteRoleList(@RequestParam("ids") List ids) { + roleService.deleteRoleList(ids); + return success(true); + } + @GetMapping("/get") @Operation(summary = "获得角色信息") @PreAuthorize("@ss.hasPermission('system:role:query')") diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java index 25604ceb33..7fd6699b30 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostService.java @@ -38,6 +38,13 @@ public interface PostService { */ void deletePost(Long id); + /** + * 批量删除岗位信息 + * + * @param ids 岗位编号数组 + */ + void deletePostList(List ids); + /** * 获得岗位列表 * diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java index fc2498f1b8..3f4a3b9d0c 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataService.java @@ -38,6 +38,13 @@ public interface DictDataService { */ void deleteDictData(Long id); + /** + * 批量删除字典数据 + * + * @param ids 字典数据编号列表 + */ + void deleteDictDataList(List ids); + /** * 获得字典数据列表 * diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java index b15fd506a3..9248d2043e 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java @@ -98,6 +98,18 @@ public class DictDataServiceImpl implements DictDataService { dictDataMapper.deleteById(id); } + @Override + public void deleteDictDataList(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 校验是否存在 + ids.forEach(this::validateDictDataExists); + + // 批量删除字典数据 + dictDataMapper.deleteByIds(ids); + } + @Override public long getDictDataCountByDictType(String dictType) { return dictDataMapper.selectCountByDictType(dictType); diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeService.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeService.java index 40911891c5..5f617e7542 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeService.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeService.java @@ -36,6 +36,13 @@ public interface DictTypeService { */ void deleteDictType(Long id); + /** + * 批量删除字典类型 + * + * @param ids 字典类型编号列表 + */ + void deleteDictTypeList(List ids); + /** * 获得字典类型分页列表 * diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java index 21d2b4f745..953ed5abfe 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java @@ -9,9 +9,9 @@ import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeSave import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; import cn.iocoder.yudao.module.system.dal.mysql.dict.DictTypeMapper; import com.google.common.annotations.VisibleForTesting; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; -import jakarta.annotation.Resource; import java.time.LocalDateTime; import java.util.List; @@ -87,6 +87,27 @@ public class DictTypeServiceImpl implements DictTypeService { dictTypeMapper.updateToDelete(id, LocalDateTime.now()); } + @Override + public void deleteDictTypeList(List ids) { + if (ids == null || ids.isEmpty()) { + return; + } + // 校验是否存在 + ids.forEach(this::validateDictTypeExists); + + // 校验是否有字典数据 + List dictTypes = dictTypeMapper.selectByIds(ids); + for (DictTypeDO dictType : dictTypes) { + if (dictDataService.getDictDataCountByDictType(dictType.getType()) > 0) { + throw exception(DICT_TYPE_HAS_CHILDREN); + } + } + + // 批量删除字典类型 + LocalDateTime now = LocalDateTime.now(); + ids.forEach(id -> dictTypeMapper.updateToDelete(id, now)); + } + @Override public List getDictTypeList() { return dictTypeMapper.selectList(); diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java index d74dc61340..0d5f0fd841 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.system.service.permission; -import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuSaveVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuListReqVO; +import cn.iocoder.yudao.module.system.controller.admin.permission.vo.menu.MenuSaveVO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import java.util.Collection; @@ -36,6 +36,13 @@ public interface MenuService { */ void deleteMenu(Long id); + /** + * 批量删除菜单 + * + * @param ids 菜单编号数组 + */ + void deleteMenuList(List ids); + /** * 获得所有菜单列表 * diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java index 51de2daba7..e79c3afa1f 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java @@ -104,6 +104,31 @@ public class MenuServiceImpl implements MenuService { permissionService.processMenuDeleted(id); } + @Override + @Transactional(rollbackFor = Exception.class) + @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, allEntries = true) + public void deleteMenuList(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 校验是否还有子菜单 + for (Long id : ids) { + if (menuMapper.selectCountByParentId(id) > 0) { + throw exception(MENU_EXISTS_CHILDREN); + } + } + // 校验删除的菜单是否存在 + List menus = menuMapper.selectByIds(ids); + if (menus.size() != ids.size()) { + throw exception(MENU_NOT_EXISTS); + } + + // 标记删除 + menuMapper.deleteByIds(ids); + // 删除授予给角色的权限 + ids.forEach(id -> permissionService.processMenuDeleted(id)); + } + @Override public List getMenuList() { return menuMapper.selectList(); diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java index 6de8b515b0..7426d981a6 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleService.java @@ -4,8 +4,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; - import jakarta.validation.Valid; + import java.util.Collection; import java.util.List; import java.util.Set; @@ -40,6 +40,13 @@ public interface RoleService { */ void deleteRole(Long id); + /** + * 批量删除角色 + * + * @param ids 角色编号数组 + */ + void deleteRoleList(List ids); + /** * 设置角色的数据权限 * diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java index c7cf847dc2..7a60d7819f 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java @@ -122,6 +122,21 @@ public class RoleServiceImpl implements RoleService { LogRecordContext.putVariable("role", role); } + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteRoleList(List ids) { + if (CollUtil.isEmpty(ids)) { + return; + } + // 1. 校验是否可以更新 + ids.forEach(this::validateRoleForUpdate); + + // 2.1 标记删除 + roleMapper.deleteByIds(ids); + // 2.2 删除相关数据 + ids.forEach(id -> permissionService.processRoleDeleted(id)); + } + /** * 校验角色的唯一字段是否重复 * From 777d64f065b0501c76e447fa3660d48c7a536ce3 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Sun, 15 Jun 2025 13:55:24 +0800 Subject: [PATCH 08/14] =?UTF-8?q?feat:=20infra=20=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/codegen/CodegenController.java | 9 +++++ .../admin/config/ConfigController.java | 9 +++++ .../admin/db/DataSourceConfigController.java | 9 +++++ .../admin/file/FileConfigController.java | 11 ++++++ .../controller/admin/file/FileController.java | 11 ++++++ .../controller/admin/job/JobController.java | 10 ++++++ .../infra/service/codegen/CodegenService.java | 7 ++++ .../service/codegen/CodegenServiceImpl.java | 19 ++++++++++ .../infra/service/config/ConfigService.java | 9 +++++ .../service/config/ConfigServiceImpl.java | 25 +++++++++++++ .../service/db/DataSourceConfigService.java | 7 ++++ .../db/DataSourceConfigServiceImpl.java | 12 +++++++ .../infra/service/file/FileConfigService.java | 9 +++++ .../service/file/FileConfigServiceImpl.java | 30 ++++++++++++++++ .../infra/service/file/FileService.java | 9 +++++ .../infra/service/file/FileServiceImpl.java | 35 +++++++++++++++++++ .../module/infra/service/job/JobService.java | 9 +++++ .../infra/service/job/JobServiceImpl.java | 22 ++++++++++++ 18 files changed, 252 insertions(+) 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 93d47f517f..26dda89433 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 43e64c02a9..d4b8efd78c 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 ba952c9e93..a5e9737031 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 a2e12c4e11..c593f4bb6a 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 119774b71e..d5611b7a06 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 bf4506d34f..1ae53e3c9a 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 7adc9f7f1c..ca22021a8f 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 be3ce5b0fc..adeb417346 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 0087b83b92..854d13a998 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 b0e5c53bef..14b93654c1 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 bb741660e8..8382b48cef 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 3e9ed4ff3c..254176079a 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 b2bf491441..6c69c6ed96 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 4e7bf47cc1..f3347d3624 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 01c2bba720..5b15ad8739 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 4a0faadaa6..822be3fe96 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 bce2a95570..b830b08c48 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 982e39ba43..85ea76a8c9 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) { From ce69fd8ab257d89751ac91a496855dcb1faece46 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Sun, 15 Jun 2025 13:57:08 +0800 Subject: [PATCH 09/14] =?UTF-8?q?feat:=20system=20=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/system/service/dept/PostServiceImpl.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java index f6901c45e4..aa5619080e 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java @@ -8,10 +8,10 @@ import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqV import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO; import cn.iocoder.yudao.module.system.dal.mysql.dept.PostMapper; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; -import jakarta.annotation.Resource; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -58,10 +58,16 @@ public class PostServiceImpl implements PostService { public void deletePost(Long id) { // 校验是否存在 validatePostExists(id); - // 删除部门 + // 删除岗位 postMapper.deleteById(id); } + @Override + public void deletePostList(List ids) { + // 删除岗位 + postMapper.deleteByIds(ids); + } + private void validatePostForCreateOrUpdate(Long id, String name, String code) { // 校验自己存在 validatePostExists(id); From 39fcac4d5fb3c7d4d4217653f52863573e46fd86 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 15 Jun 2025 15:05:27 +0800 Subject: [PATCH 10/14] =?UTF-8?q?!1357=20fix:=E4=BF=AE=E5=A4=8D"=E5=95=86?= =?UTF-8?q?=E5=93=81=E7=BB=9F=E8=AE=A1=E8=81=9A=E5=90=88=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E7=9A=84=E5=88=AB=E5=90=8D=E4=B8=8E=E6=8E=92=E5=BA=8F=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E4=B8=8D=E7=AC=A6"=E5=AF=BC=E8=87=B4=E7=9A=84SQL?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/core/util/MyBatisUtils.java | 16 ++++++++ .../CombinationRecordServiceImpl.java | 1 - .../product/ProductStatisticsMapper.java | 41 ++++++------------- 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java index ccd9412a48..784f699e44 100644 --- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java +++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.framework.mybatis.core.util; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.func.Func1; +import cn.hutool.core.lang.func.LambdaUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.SortingField; @@ -103,4 +105,18 @@ public class MyBatisUtils { .replace("#{value}", StrUtil.toString(value)); } + /** + * 将驼峰命名转换为下划线命名 + * + * 使用场景: + * 1. fix:修复"商品统计聚合函数的别名与排序字段不符"导致的 SQL 异常 + * + * @param func 字段名函数(驼峰命名) + * @return 字段名(下划线命名) + */ + public static String toUnderlineCase(Func1 func) { + String fieldName = LambdaUtil.getFieldName(func); + return StrUtil.toUnderlineCase(fieldName); + } + } diff --git a/yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java b/yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java index 113f7d0c9f..862e130742 100644 --- a/yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java +++ b/yudao-module-mall/yudao-module-promotion/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java @@ -165,7 +165,6 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { ProductSpuRespDTO spu = productSpuApi.getSpu(reqDTO.getSpuId()); ProductSkuRespDTO sku = productSkuApi.getSku(reqDTO.getSkuId()); CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO, keyValue.getKey(), user, spu, sku); - record.setPicUrl(spu.getPicUrl()); // fix:拼团记录创建时,需要设置拼团商品的图片 // 2.1. 如果是团长需要设置 headId 为 CombinationRecordDO#HEAD_ID_GROUP if (record.getHeadId() == null) { record.setStartTime(LocalDateTime.now()) diff --git a/yudao-module-mall/yudao-module-statistics/src/main/java/cn/iocoder/yudao/module/statistics/dal/mysql/product/ProductStatisticsMapper.java b/yudao-module-mall/yudao-module-statistics/src/main/java/cn/iocoder/yudao/module/statistics/dal/mysql/product/ProductStatisticsMapper.java index 56029131d8..26d19d792b 100644 --- a/yudao-module-mall/yudao-module-statistics/src/main/java/cn/iocoder/yudao/module/statistics/dal/mysql/product/ProductStatisticsMapper.java +++ b/yudao-module-mall/yudao-module-statistics/src/main/java/cn/iocoder/yudao/module/statistics/dal/mysql/product/ProductStatisticsMapper.java @@ -1,24 +1,22 @@ package cn.iocoder.yudao.module.statistics.dal.mysql.product; -import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.SortablePageParam; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; -import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; import cn.iocoder.yudao.module.statistics.controller.admin.product.vo.ProductStatisticsReqVO; import cn.iocoder.yudao.module.statistics.controller.admin.product.vo.ProductStatisticsRespVO; import cn.iocoder.yudao.module.statistics.dal.dataobject.product.ProductStatisticsDO; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; -import org.dromara.hutool.core.func.LambdaUtil; import java.time.LocalDateTime; import java.util.List; +import static cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils.toUnderlineCase; + /** * 商品统计 Mapper * @@ -53,31 +51,16 @@ public interface ProductStatisticsMapper extends BaseMapperX buildWrapper(ProductStatisticsReqVO reqVO) { return new MPJLambdaWrapperX() .betweenIfPresent(ProductStatisticsDO::getTime, reqVO.getTimes()) - .selectSum(ProductStatisticsDO::getBrowseCount,toUnderlineCase(ProductStatisticsDO::getBrowseCount)) - .selectSum(ProductStatisticsDO::getBrowseUserCount,toUnderlineCase(ProductStatisticsDO::getBrowseUserCount)) - .selectSum(ProductStatisticsDO::getFavoriteCount,toUnderlineCase(ProductStatisticsDO::getFavoriteCount)) - .selectSum(ProductStatisticsDO::getCartCount,toUnderlineCase(ProductStatisticsDO::getCartCount)) - .selectSum(ProductStatisticsDO::getOrderCount,toUnderlineCase(ProductStatisticsDO::getOrderCount)) - .selectSum(ProductStatisticsDO::getOrderPayCount,toUnderlineCase(ProductStatisticsDO::getOrderPayCount)) - .selectSum(ProductStatisticsDO::getOrderPayPrice,toUnderlineCase(ProductStatisticsDO::getOrderPayPrice)) - .selectSum(ProductStatisticsDO::getAfterSaleCount,toUnderlineCase(ProductStatisticsDO::getAfterSaleCount)) - .selectSum(ProductStatisticsDO::getAfterSaleRefundPrice,toUnderlineCase(ProductStatisticsDO::getAfterSaleRefundPrice)) - .selectAvg(ProductStatisticsDO::getBrowseConvertPercent,toUnderlineCase(ProductStatisticsDO::getBrowseConvertPercent)); - } - - /** - * 将驼峰命名转换为下划线命名 - * - * @param func 字段名函数(驼峰命名) - * @return 字段名(下划线命名) - * @param 泛型 - *

- * fix:排序时排序字段被 {@link MyBatisUtils#buildPage} 由驼峰命名被转为下划线命名, - * 因此聚合函数的别名也做统一,统一为下划线命名,解决排序时找不到字段的问题。 - */ - private static String toUnderlineCase(SFunction func) { - String fieldName = LambdaUtil.getFieldName(func); - return StrUtil.toUnderlineCase(fieldName); + .selectSum(ProductStatisticsDO::getBrowseCount, toUnderlineCase(ProductStatisticsDO::getBrowseCount)) + .selectSum(ProductStatisticsDO::getBrowseUserCount, toUnderlineCase(ProductStatisticsDO::getBrowseUserCount)) + .selectSum(ProductStatisticsDO::getFavoriteCount, toUnderlineCase(ProductStatisticsDO::getFavoriteCount)) + .selectSum(ProductStatisticsDO::getCartCount, toUnderlineCase(ProductStatisticsDO::getCartCount)) + .selectSum(ProductStatisticsDO::getOrderCount, toUnderlineCase(ProductStatisticsDO::getOrderCount)) + .selectSum(ProductStatisticsDO::getOrderPayCount, toUnderlineCase(ProductStatisticsDO::getOrderPayCount)) + .selectSum(ProductStatisticsDO::getOrderPayPrice, toUnderlineCase(ProductStatisticsDO::getOrderPayPrice)) + .selectSum(ProductStatisticsDO::getAfterSaleCount, toUnderlineCase(ProductStatisticsDO::getAfterSaleCount)) + .selectSum(ProductStatisticsDO::getAfterSaleRefundPrice, toUnderlineCase(ProductStatisticsDO::getAfterSaleRefundPrice)) + .selectAvg(ProductStatisticsDO::getBrowseConvertPercent, toUnderlineCase(ProductStatisticsDO::getBrowseConvertPercent)); } /** From f7245e484f3c3a37340b6399de54f9d77300dde8 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 15 Jun 2025 15:17:26 +0800 Subject: [PATCH 11/14] =?UTF-8?q?fix=EF=BC=9A=E3=80=90INFRA=20=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E8=AE=BE=E6=96=BD=E3=80=91DataSourceConfigRespVO=20?= =?UTF-8?q?=E7=9A=84=20id=20=E7=B1=BB=E5=9E=8B=E4=B8=8D=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infra/controller/admin/db/vo/DataSourceConfigRespVO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java index f979528734..def8ce0cfe 100755 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java @@ -10,7 +10,7 @@ import java.time.LocalDateTime; public class DataSourceConfigRespVO { @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer id; + private Long id; @Schema(description = "数据源名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") private String name; From 62e83eaef5e247777970ec971ce3fa2cc7e161f2 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 15 Jun 2025 15:22:19 +0800 Subject: [PATCH 12/14] =?UTF-8?q?Excel=E5=AF=BC=E5=87=BA=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E4=B8=8B=E6=8B=89=E9=80=89=E6=8B=A9=E5=88=97=E9=94=99=E4=BD=8D?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9=20#853?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/handler/SelectSheetWriteHandler.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java index 0dac0c6c1d..8e3e28eb44 100644 --- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java +++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/handler/SelectSheetWriteHandler.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.excel.core.handler; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.poi.excel.ExcelUtil; @@ -61,15 +62,18 @@ public class SelectSheetWriteHandler implements SheetWriteHandler { int colIndex = 0; boolean ignoreUnannotated = head.isAnnotationPresent(ExcelIgnoreUnannotated.class); for (Field field : head.getDeclaredFields()) { - // 忽略 static final 或 transient 的字段 - if(isStaticFinalOrTransient(field) ) { + // 关联 https://github.com/YunaiV/ruoyi-vue-pro/pull/853 + // 1.1 忽略 static final 或 transient 的字段 + if (isStaticFinalOrTransient(field) ) { continue; } - // 忽略的字段跳过 - if((ignoreUnannotated && !field.isAnnotationPresent(ExcelProperty.class)) - || field.isAnnotationPresent(ExcelIgnore.class)){ + // 1.2 忽略的字段跳过 + if ((ignoreUnannotated && !field.isAnnotationPresent(ExcelProperty.class)) + || field.isAnnotationPresent(ExcelIgnore.class)) { continue; } + + // 2. 核心:处理有 ExcelColumnSelect 注解的字段 if (field.isAnnotationPresent(ExcelColumnSelect.class)) { ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); if (excelProperty != null && excelProperty.index() != -1) { @@ -83,13 +87,14 @@ public class SelectSheetWriteHandler implements SheetWriteHandler { /** * 判断字段是否是静态的、最终的、 transient 的 - * EasyExcel 默认是忽略 static final 或 transient 的字段,所以需要判断 + * 原因:EasyExcel 默认是忽略 static final 或 transient 的字段,所以需要判断 + * * @param field 字段 - * @return 是否是静态的、最终的、 transient 的 + * @return 是否是静态的、最终的、transient 的 */ private boolean isStaticFinalOrTransient(Field field) { - return (Modifier.isStatic(field.getModifiers()) && Modifier.isFinal(field.getModifiers())) - || Modifier.isTransient(field.getModifiers()); + return (Modifier.isStatic(field.getModifiers()) && Modifier.isFinal(field.getModifiers())) + || Modifier.isTransient(field.getModifiers()); } From 03d3ebdf05f2f95c68b7e25c1e4d5b46d373ee52 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 15 Jun 2025 18:43:50 +0800 Subject: [PATCH 13/14] =?UTF-8?q?review=EF=BC=9A=E3=80=90INFRA=20=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E8=AE=BE=E6=96=BD=E3=80=91=E6=89=B9=E9=87=8F=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mysql/codegen/CodegenColumnMapper.java | 7 +++- .../service/codegen/CodegenServiceImpl.java | 12 +------ .../service/config/ConfigServiceImpl.java | 15 ++------- .../db/DataSourceConfigServiceImpl.java | 7 ---- .../service/file/FileConfigServiceImpl.java | 16 ++-------- .../infra/service/file/FileServiceImpl.java | 32 +++++-------------- .../infra/service/job/JobServiceImpl.java | 11 +------ .../system/service/dept/PostServiceImpl.java | 1 - .../service/dict/DictDataServiceImpl.java | 7 ---- .../service/dict/DictTypeServiceImpl.java | 14 +++----- .../service/permission/MenuServiceImpl.java | 15 +++------ .../service/permission/RoleServiceImpl.java | 5 +-- 12 files changed, 30 insertions(+), 112 deletions(-) diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenColumnMapper.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenColumnMapper.java index ea5a9bb631..28a705ffea 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenColumnMapper.java +++ b/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; import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO; import org.apache.ibatis.annotations.Mapper; +import java.util.Collection; import java.util.List; @Mapper @@ -17,8 +18,12 @@ public interface CodegenColumnMapper extends BaseMapperX { } default void deleteListByTableId(Long tableId) { + delete(CodegenColumnDO::getTableId, tableId); + } + + default void deleteListByTableId(Collection tableIds) { delete(new LambdaQueryWrapperX() - .eq(CodegenColumnDO::getTableId, tableId)); + .in(CodegenColumnDO::getTableId, 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 adeb417346..01efb65ca7 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 @@ -225,20 +225,10 @@ public class CodegenServiceImpl implements CodegenService { @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)); + codegenColumnMapper.deleteListByTableId(tableIds); } @Override 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 14b93654c1..d9005802ca 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,6 +1,5 @@ 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; @@ -68,21 +67,13 @@ public class ConfigServiceImpl implements ConfigService { @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) { + List configs = configMapper.selectByIds(ids); + configs.forEach(config -> { if (ConfigTypeEnum.SYSTEM.getType().equals(config.getType())) { throw exception(CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE); } - } + }); // 批量删除 configMapper.deleteByIds(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 254176079a..b39e21c405 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,6 +1,5 @@ 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; @@ -66,12 +65,6 @@ public class DataSourceConfigServiceImpl implements DataSourceConfigService { @Override public void deleteDataSourceConfigList(List ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 校验存在 - ids.forEach(this::validateDataSourceConfigExists); - // 批量删除 dataSourceConfigMapper.deleteByIds(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 f3347d3624..4e3bf80044 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,6 +1,5 @@ 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; @@ -138,17 +137,8 @@ public class FileConfigServiceImpl implements FileConfigService { @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); - } - // 校验是否有主配置 + List configs = fileConfigMapper.selectByIds(ids); for (FileConfigDO config : configs) { if (Boolean.TRUE.equals(config.getMaster())) { throw exception(FILE_CONFIG_DELETE_FAIL_MASTER); @@ -159,9 +149,7 @@ public class FileConfigServiceImpl implements FileConfigService { fileConfigMapper.deleteByIds(ids); // 清空缓存 - for (Long id : ids) { - clearCache(id, null); - } + ids.forEach(id -> clearCache(id, null)); } /** 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 822be3fe96..98447fb370 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,6 +1,5 @@ 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; @@ -22,8 +21,6 @@ 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; @@ -162,29 +159,16 @@ public class FileServiceImpl implements FileService { } @Override - public void deleteFileList(List ids) throws Exception { - if (CollUtil.isEmpty(ids)) { - return; - } - - // 校验存在 + @SneakyThrows + public void deleteFileList(List ids) { + // 删除文件 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()) { + for (FileDO file : files) { // 获取客户端 - FileClient client = fileConfigService.getFileClient(entry.getKey()); - Assert.notNull(client, "客户端({}) 不能为空", entry.getKey()); - - // 批量删除文件 - for (FileDO file : entry.getValue()) { - client.delete(file.getPath()); - } + FileClient client = fileConfigService.getFileClient(file.getConfigId()); + Assert.notNull(client, "客户端({}) 不能为空", file.getPath()); + // 删除文件 + client.delete(file.getPath()); } // 删除记录 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 85ea76a8c9..10debe7f7c 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 @@ -172,17 +172,8 @@ public class JobServiceImpl implements JobService { @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); - } - // 批量删除 + List jobs = jobMapper.selectByIds(ids); jobMapper.deleteByIds(ids); // 删除 Job 到 Quartz 中 diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java index aa5619080e..c90308a11b 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java @@ -64,7 +64,6 @@ public class PostServiceImpl implements PostService { @Override public void deletePostList(List ids) { - // 删除岗位 postMapper.deleteByIds(ids); } diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java index 9248d2043e..8ff9d26d9a 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictDataServiceImpl.java @@ -100,13 +100,6 @@ public class DictDataServiceImpl implements DictDataService { @Override public void deleteDictDataList(List ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 校验是否存在 - ids.forEach(this::validateDictDataExists); - - // 批量删除字典数据 dictDataMapper.deleteByIds(ids); } diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java index 953ed5abfe..1da442ea84 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/dict/DictTypeServiceImpl.java @@ -89,21 +89,15 @@ public class DictTypeServiceImpl implements DictTypeService { @Override public void deleteDictTypeList(List ids) { - if (ids == null || ids.isEmpty()) { - return; - } - // 校验是否存在 - ids.forEach(this::validateDictTypeExists); - - // 校验是否有字典数据 + // 1. 校验是否有字典数据 List dictTypes = dictTypeMapper.selectByIds(ids); - for (DictTypeDO dictType : dictTypes) { + dictTypes.forEach(dictType -> { if (dictDataService.getDictDataCountByDictType(dictType.getType()) > 0) { throw exception(DICT_TYPE_HAS_CHILDREN); } - } + }); - // 批量删除字典类型 + // 2. 批量删除字典类型 LocalDateTime now = LocalDateTime.now(); ids.forEach(id -> dictTypeMapper.updateToDelete(id, now)); } diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java index e79c3afa1f..0d7536a1a7 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java @@ -106,22 +106,15 @@ public class MenuServiceImpl implements MenuService { @Override @Transactional(rollbackFor = Exception.class) - @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, allEntries = true) + @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, + allEntries = true) // allEntries 清空所有缓存,因为 Spring Cache 不支持按照 ids 批量删除 public void deleteMenuList(List ids) { - if (CollUtil.isEmpty(ids)) { - return; - } // 校验是否还有子菜单 - for (Long id : ids) { + ids.forEach(id -> { if (menuMapper.selectCountByParentId(id) > 0) { throw exception(MENU_EXISTS_CHILDREN); } - } - // 校验删除的菜单是否存在 - List menus = menuMapper.selectByIds(ids); - if (menus.size() != ids.size()) { - throw exception(MENU_NOT_EXISTS); - } + }); // 标记删除 menuMapper.deleteByIds(ids); diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java index 7a60d7819f..576739ad5c 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java @@ -125,10 +125,7 @@ public class RoleServiceImpl implements RoleService { @Override @Transactional(rollbackFor = Exception.class) public void deleteRoleList(List ids) { - if (CollUtil.isEmpty(ids)) { - return; - } - // 1. 校验是否可以更新 + // 1. 校验是否可以删除 ids.forEach(this::validateRoleForUpdate); // 2.1 标记删除 From 0fbffdc1d38e820f220127eba23ee56d810cdf43 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 16 Jun 2025 08:30:00 +0800 Subject: [PATCH 14/14] =?UTF-8?q?reactor=EF=BC=9A=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E7=9A=84=20url=20=E9=83=BD=E6=98=AF=20export?= =?UTF-8?q?-excel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/infra/controller/admin/config/ConfigController.java | 2 +- .../product/controller/admin/spu/ProductSpuController.java | 2 +- .../module/system/controller/admin/dept/PostController.java | 2 +- .../module/system/controller/admin/dict/DictDataController.java | 2 +- .../module/system/controller/admin/dict/DictTypeController.java | 2 +- .../system/controller/admin/logger/LoginLogController.java | 2 +- .../system/controller/admin/logger/OperateLogController.java | 2 +- .../module/system/controller/admin/user/UserController.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) 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 d4b8efd78c..af3973fd34 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 @@ -101,7 +101,7 @@ public class ConfigController { return success(ConfigConvert.INSTANCE.convertPage(page)); } - @GetMapping("/export") + @GetMapping("/export-excel") @Operation(summary = "导出参数配置") @PreAuthorize("@ss.hasPermission('infra:config:export')") @ApiAccessLog(operateType = EXPORT) diff --git a/yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java b/yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java index 076170138e..8e5ea71efe 100755 --- a/yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java +++ b/yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/ProductSpuController.java @@ -124,7 +124,7 @@ public class ProductSpuController { return success(productSpuService.getTabsCount()); } - @GetMapping("/export") + @GetMapping("/export-excel") @Operation(summary = "导出商品") @PreAuthorize("@ss.hasPermission('product:spu:export')") @ApiAccessLog(operateType = EXPORT) diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java index 897cea267c..0f1b957f18 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dept/PostController.java @@ -91,7 +91,7 @@ public class PostController { return success(BeanUtils.toBean(pageResult, PostRespVO.class)); } - @GetMapping("/export") + @GetMapping("/export-excel") @Operation(summary = "岗位管理") @PreAuthorize("@ss.hasPermission('system:post:export')") @ApiAccessLog(operateType = EXPORT) diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java index ac44bc1e54..c49d078060 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictDataController.java @@ -98,7 +98,7 @@ public class DictDataController { return success(BeanUtils.toBean(dictData, DictDataRespVO.class)); } - @GetMapping("/export") + @GetMapping("/export-excel") @Operation(summary = "导出字典数据") @PreAuthorize("@ss.hasPermission('system:dict:export')") @ApiAccessLog(operateType = EXPORT) diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java index 8247f13253..3bb279dc02 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/DictTypeController.java @@ -97,7 +97,7 @@ public class DictTypeController { } @Operation(summary = "导出数据类型") - @GetMapping("/export") + @GetMapping("/export-excel") @PreAuthorize("@ss.hasPermission('system:dict:query')") @ApiAccessLog(operateType = EXPORT) public void export(HttpServletResponse response, @Valid DictTypePageReqVO exportReqVO) throws IOException { diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java index f2ff3a4f0f..b55d0643a7 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/LoginLogController.java @@ -44,7 +44,7 @@ public class LoginLogController { return success(BeanUtils.toBean(pageResult, LoginLogRespVO.class)); } - @GetMapping("/export") + @GetMapping("/export-excel") @Operation(summary = "导出登录日志 Excel") @PreAuthorize("@ss.hasPermission('system:login-log:export')") @ApiAccessLog(operateType = EXPORT) diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java index 57b9b619bd..71b45d346e 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/logger/OperateLogController.java @@ -46,7 +46,7 @@ public class OperateLogController { } @Operation(summary = "导出操作日志") - @GetMapping("/export") + @GetMapping("/export-excel") @PreAuthorize("@ss.hasPermission('system:operate-log:export')") @ApiAccessLog(operateType = EXPORT) public void exportOperateLog(HttpServletResponse response, @Valid OperateLogPageReqVO exportReqVO) throws IOException { diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java index a562ab4387..9a90117cf4 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java @@ -136,7 +136,7 @@ public class UserController { return success(UserConvert.INSTANCE.convert(user, dept)); } - @GetMapping("/export") + @GetMapping("/export-excel") @Operation(summary = "导出用户") @PreAuthorize("@ss.hasPermission('system:user:export')") @ApiAccessLog(operateType = EXPORT)