Commit 39fcac4d5fb3c7d4d4217653f52863573e46fd86
1 parent
69b896a6
!1357 fix:修复"商品统计聚合函数的别名与排序字段不符"导致的SQL异常
Showing
3 changed files
with
28 additions
and
30 deletions
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java
| 1 | 1 | package cn.iocoder.yudao.framework.mybatis.core.util; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollectionUtil; |
| 4 | +import cn.hutool.core.lang.func.Func1; | |
| 5 | +import cn.hutool.core.lang.func.LambdaUtil; | |
| 4 | 6 | import cn.hutool.core.util.StrUtil; |
| 5 | 7 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 6 | 8 | import cn.iocoder.yudao.framework.common.pojo.SortingField; |
| ... | ... | @@ -103,4 +105,18 @@ public class MyBatisUtils { |
| 103 | 105 | .replace("#{value}", StrUtil.toString(value)); |
| 104 | 106 | } |
| 105 | 107 | |
| 108 | + /** | |
| 109 | + * 将驼峰命名转换为下划线命名 | |
| 110 | + * | |
| 111 | + * 使用场景: | |
| 112 | + * 1. <a href="https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/1357/files">fix:修复"商品统计聚合函数的别名与排序字段不符"导致的 SQL 异常</a> | |
| 113 | + * | |
| 114 | + * @param func 字段名函数(驼峰命名) | |
| 115 | + * @return 字段名(下划线命名) | |
| 116 | + */ | |
| 117 | + public static <T> String toUnderlineCase(Func1<T, ?> func) { | |
| 118 | + String fieldName = LambdaUtil.getFieldName(func); | |
| 119 | + return StrUtil.toUnderlineCase(fieldName); | |
| 120 | + } | |
| 121 | + | |
| 106 | 122 | } | ... | ... |
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 { |
| 165 | 165 | ProductSpuRespDTO spu = productSpuApi.getSpu(reqDTO.getSpuId()); |
| 166 | 166 | ProductSkuRespDTO sku = productSkuApi.getSku(reqDTO.getSkuId()); |
| 167 | 167 | CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO, keyValue.getKey(), user, spu, sku); |
| 168 | - record.setPicUrl(spu.getPicUrl()); // fix:拼团记录创建时,需要设置拼团商品的图片 | |
| 169 | 168 | // 2.1. 如果是团长需要设置 headId 为 CombinationRecordDO#HEAD_ID_GROUP |
| 170 | 169 | if (record.getHeadId() == null) { |
| 171 | 170 | record.setStartTime(LocalDateTime.now()) | ... | ... |
yudao-module-mall/yudao-module-statistics/src/main/java/cn/iocoder/yudao/module/statistics/dal/mysql/product/ProductStatisticsMapper.java
| 1 | 1 | package cn.iocoder.yudao.module.statistics.dal.mysql.product; |
| 2 | 2 | |
| 3 | -import cn.hutool.core.util.StrUtil; | |
| 4 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | 4 | import cn.iocoder.yudao.framework.common.pojo.SortablePageParam; |
| 6 | 5 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 7 | 6 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 8 | 7 | import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; |
| 9 | -import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; | |
| 10 | 8 | import cn.iocoder.yudao.module.statistics.controller.admin.product.vo.ProductStatisticsReqVO; |
| 11 | 9 | import cn.iocoder.yudao.module.statistics.controller.admin.product.vo.ProductStatisticsRespVO; |
| 12 | 10 | import cn.iocoder.yudao.module.statistics.dal.dataobject.product.ProductStatisticsDO; |
| 13 | 11 | import com.baomidou.mybatisplus.core.metadata.IPage; |
| 14 | -import com.baomidou.mybatisplus.core.toolkit.support.SFunction; | |
| 15 | 12 | import org.apache.ibatis.annotations.Mapper; |
| 16 | 13 | import org.apache.ibatis.annotations.Param; |
| 17 | -import org.dromara.hutool.core.func.LambdaUtil; | |
| 18 | 14 | |
| 19 | 15 | import java.time.LocalDateTime; |
| 20 | 16 | import java.util.List; |
| 21 | 17 | |
| 18 | +import static cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils.toUnderlineCase; | |
| 19 | + | |
| 22 | 20 | /** |
| 23 | 21 | * 商品统计 Mapper |
| 24 | 22 | * |
| ... | ... | @@ -53,31 +51,16 @@ public interface ProductStatisticsMapper extends BaseMapperX<ProductStatisticsDO |
| 53 | 51 | private static MPJLambdaWrapperX<ProductStatisticsDO> buildWrapper(ProductStatisticsReqVO reqVO) { |
| 54 | 52 | return new MPJLambdaWrapperX<ProductStatisticsDO>() |
| 55 | 53 | .betweenIfPresent(ProductStatisticsDO::getTime, reqVO.getTimes()) |
| 56 | - .selectSum(ProductStatisticsDO::getBrowseCount,toUnderlineCase(ProductStatisticsDO::getBrowseCount)) | |
| 57 | - .selectSum(ProductStatisticsDO::getBrowseUserCount,toUnderlineCase(ProductStatisticsDO::getBrowseUserCount)) | |
| 58 | - .selectSum(ProductStatisticsDO::getFavoriteCount,toUnderlineCase(ProductStatisticsDO::getFavoriteCount)) | |
| 59 | - .selectSum(ProductStatisticsDO::getCartCount,toUnderlineCase(ProductStatisticsDO::getCartCount)) | |
| 60 | - .selectSum(ProductStatisticsDO::getOrderCount,toUnderlineCase(ProductStatisticsDO::getOrderCount)) | |
| 61 | - .selectSum(ProductStatisticsDO::getOrderPayCount,toUnderlineCase(ProductStatisticsDO::getOrderPayCount)) | |
| 62 | - .selectSum(ProductStatisticsDO::getOrderPayPrice,toUnderlineCase(ProductStatisticsDO::getOrderPayPrice)) | |
| 63 | - .selectSum(ProductStatisticsDO::getAfterSaleCount,toUnderlineCase(ProductStatisticsDO::getAfterSaleCount)) | |
| 64 | - .selectSum(ProductStatisticsDO::getAfterSaleRefundPrice,toUnderlineCase(ProductStatisticsDO::getAfterSaleRefundPrice)) | |
| 65 | - .selectAvg(ProductStatisticsDO::getBrowseConvertPercent,toUnderlineCase(ProductStatisticsDO::getBrowseConvertPercent)); | |
| 66 | - } | |
| 67 | - | |
| 68 | - /** | |
| 69 | - * 将驼峰命名转换为下划线命名 | |
| 70 | - * | |
| 71 | - * @param func 字段名函数(驼峰命名) | |
| 72 | - * @return 字段名(下划线命名) | |
| 73 | - * @param <T> 泛型 | |
| 74 | - * <p> | |
| 75 | - * fix:排序时排序字段被 {@link MyBatisUtils#buildPage} 由驼峰命名被转为下划线命名, | |
| 76 | - * 因此聚合函数的别名也做统一,统一为下划线命名,解决排序时找不到字段的问题。 | |
| 77 | - */ | |
| 78 | - private static <T> String toUnderlineCase(SFunction<T, ?> func) { | |
| 79 | - String fieldName = LambdaUtil.getFieldName(func); | |
| 80 | - return StrUtil.toUnderlineCase(fieldName); | |
| 54 | + .selectSum(ProductStatisticsDO::getBrowseCount, toUnderlineCase(ProductStatisticsDO::getBrowseCount)) | |
| 55 | + .selectSum(ProductStatisticsDO::getBrowseUserCount, toUnderlineCase(ProductStatisticsDO::getBrowseUserCount)) | |
| 56 | + .selectSum(ProductStatisticsDO::getFavoriteCount, toUnderlineCase(ProductStatisticsDO::getFavoriteCount)) | |
| 57 | + .selectSum(ProductStatisticsDO::getCartCount, toUnderlineCase(ProductStatisticsDO::getCartCount)) | |
| 58 | + .selectSum(ProductStatisticsDO::getOrderCount, toUnderlineCase(ProductStatisticsDO::getOrderCount)) | |
| 59 | + .selectSum(ProductStatisticsDO::getOrderPayCount, toUnderlineCase(ProductStatisticsDO::getOrderPayCount)) | |
| 60 | + .selectSum(ProductStatisticsDO::getOrderPayPrice, toUnderlineCase(ProductStatisticsDO::getOrderPayPrice)) | |
| 61 | + .selectSum(ProductStatisticsDO::getAfterSaleCount, toUnderlineCase(ProductStatisticsDO::getAfterSaleCount)) | |
| 62 | + .selectSum(ProductStatisticsDO::getAfterSaleRefundPrice, toUnderlineCase(ProductStatisticsDO::getAfterSaleRefundPrice)) | |
| 63 | + .selectAvg(ProductStatisticsDO::getBrowseConvertPercent, toUnderlineCase(ProductStatisticsDO::getBrowseConvertPercent)); | |
| 81 | 64 | } |
| 82 | 65 | |
| 83 | 66 | /** | ... | ... |