Commit 806228be8bcf30d885ae840aac271251f62d540c
Committed by
Gitee
!593 商品评论表增加冗余 SKU 的图片地址, 规格
Merge pull request !593 from 疯狂的世界/owen_dev
Showing
14 changed files
with
149 additions
and
91 deletions
sql/mysql/product_comment.sql
0 → 100644
| 1 | +-- 1.冗余 SKU 图片地址, 规格 | ||
| 2 | +alter table product_comment | ||
| 3 | + add column sku_pic_url varchar(256) not null comment '图片地址' after sku_id; | ||
| 4 | + | ||
| 5 | +alter table product_comment | ||
| 6 | + add column sku_properties varchar(512) null | ||
| 7 | + comment '属性数组,JSON 格式 [{propertId: , valueId: }, {propertId: , valueId: }]' after sku_pic_url; | ||
| 8 | + | ||
| 9 | +-- 2.修复已有数据 | ||
| 10 | +update product_comment pc | ||
| 11 | + join product_sku ps on pc.spu_id = ps.spu_id | ||
| 12 | +set pc.sku_pic_url = ps.pic_url, | ||
| 13 | + pc.sku_properties = ps.properties | ||
| 14 | +where pc.sku_id is not null; | ||
| 0 | \ No newline at end of file | 15 | \ No newline at end of file |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/ProductCommentController.java
| @@ -5,9 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | @@ -5,9 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 5 | import cn.iocoder.yudao.module.product.controller.admin.comment.vo.*; | 5 | import cn.iocoder.yudao.module.product.controller.admin.comment.vo.*; |
| 6 | import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert; | 6 | import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert; |
| 7 | import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO; | 7 | import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO; |
| 8 | -import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; | ||
| 9 | import cn.iocoder.yudao.module.product.service.comment.ProductCommentService; | 8 | import cn.iocoder.yudao.module.product.service.comment.ProductCommentService; |
| 10 | -import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; | ||
| 11 | import io.swagger.v3.oas.annotations.Operation; | 9 | import io.swagger.v3.oas.annotations.Operation; |
| 12 | import io.swagger.v3.oas.annotations.tags.Tag; | 10 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 13 | import org.springframework.security.access.prepost.PreAuthorize; | 11 | import org.springframework.security.access.prepost.PreAuthorize; |
| @@ -16,10 +14,8 @@ import org.springframework.web.bind.annotation.*; | @@ -16,10 +14,8 @@ import org.springframework.web.bind.annotation.*; | ||
| 16 | 14 | ||
| 17 | import javax.annotation.Resource; | 15 | import javax.annotation.Resource; |
| 18 | import javax.validation.Valid; | 16 | import javax.validation.Valid; |
| 19 | -import java.util.List; | ||
| 20 | 17 | ||
| 21 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 18 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 22 | -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | ||
| 23 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; | 19 | import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; |
| 24 | 20 | ||
| 25 | @Tag(name = "管理后台 - 商品评价") | 21 | @Tag(name = "管理后台 - 商品评价") |
| @@ -30,18 +26,13 @@ public class ProductCommentController { | @@ -30,18 +26,13 @@ public class ProductCommentController { | ||
| 30 | 26 | ||
| 31 | @Resource | 27 | @Resource |
| 32 | private ProductCommentService productCommentService; | 28 | private ProductCommentService productCommentService; |
| 33 | - @Resource | ||
| 34 | - private ProductSkuService productSkuService; | ||
| 35 | 29 | ||
| 36 | @GetMapping("/page") | 30 | @GetMapping("/page") |
| 37 | @Operation(summary = "获得商品评价分页") | 31 | @Operation(summary = "获得商品评价分页") |
| 38 | @PreAuthorize("@ss.hasPermission('product:comment:query')") | 32 | @PreAuthorize("@ss.hasPermission('product:comment:query')") |
| 39 | public CommonResult<PageResult<ProductCommentRespVO>> getCommentPage(@Valid ProductCommentPageReqVO pageVO) { | 33 | public CommonResult<PageResult<ProductCommentRespVO>> getCommentPage(@Valid ProductCommentPageReqVO pageVO) { |
| 40 | PageResult<ProductCommentDO> pageResult = productCommentService.getCommentPage(pageVO); | 34 | PageResult<ProductCommentDO> pageResult = productCommentService.getCommentPage(pageVO); |
| 41 | - // 拼接返回 | ||
| 42 | - List<ProductSkuDO> skuList = productSkuService.getSkuList( | ||
| 43 | - convertSet(pageResult.getList(), ProductCommentDO::getSkuId)); | ||
| 44 | - return success(ProductCommentConvert.INSTANCE.convertPage(pageResult, skuList)); | 35 | + return success(ProductCommentConvert.INSTANCE.convertPage2(pageResult)); |
| 45 | } | 36 | } |
| 46 | 37 | ||
| 47 | @PutMapping("/update-visible") | 38 | @PutMapping("/update-visible") |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/comment/ProductCommentConvert.java
| 1 | package cn.iocoder.yudao.module.product.convert.comment; | 1 | package cn.iocoder.yudao.module.product.convert.comment; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.collection.CollUtil; | ||
| 3 | import cn.hutool.core.util.ObjectUtil; | 4 | import cn.hutool.core.util.ObjectUtil; |
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 6 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| @@ -91,7 +92,7 @@ public interface ProductCommentConvert { | @@ -91,7 +92,7 @@ public interface ProductCommentConvert { | ||
| 91 | 92 | ||
| 92 | @Mapping(target = "scores", | 93 | @Mapping(target = "scores", |
| 93 | expression = "java(convertScores(createReqDTO.getDescriptionScores(), createReqDTO.getBenefitScores()))") | 94 | expression = "java(convertScores(createReqDTO.getDescriptionScores(), createReqDTO.getBenefitScores()))") |
| 94 | - default ProductCommentDO convert(ProductCommentCreateReqDTO createReqDTO, ProductSpuDO spuDO, MemberUserRespDTO user) { | 95 | + default ProductCommentDO convert(ProductCommentCreateReqDTO createReqDTO, ProductSpuDO spuDO, ProductSkuDO skuDO, MemberUserRespDTO user) { |
| 95 | ProductCommentDO commentDO = convert(createReqDTO); | 96 | ProductCommentDO commentDO = convert(createReqDTO); |
| 96 | if (user != null) { | 97 | if (user != null) { |
| 97 | commentDO.setUserId(user.getId()); | 98 | commentDO.setUserId(user.getId()); |
| @@ -102,6 +103,10 @@ public interface ProductCommentConvert { | @@ -102,6 +103,10 @@ public interface ProductCommentConvert { | ||
| 102 | commentDO.setSpuId(spuDO.getId()); | 103 | commentDO.setSpuId(spuDO.getId()); |
| 103 | commentDO.setSpuName(spuDO.getName()); | 104 | commentDO.setSpuName(spuDO.getName()); |
| 104 | } | 105 | } |
| 106 | + if (skuDO != null) { | ||
| 107 | + commentDO.setSkuPicUrl(skuDO.getPicUrl()); | ||
| 108 | + commentDO.setSkuProperties(skuDO.getProperties()); | ||
| 109 | + } | ||
| 105 | return commentDO; | 110 | return commentDO; |
| 106 | } | 111 | } |
| 107 | 112 | ||
| @@ -117,27 +122,32 @@ public interface ProductCommentConvert { | @@ -117,27 +122,32 @@ public interface ProductCommentConvert { | ||
| 117 | 122 | ||
| 118 | List<AppProductCommentRespVO> convertList02(List<ProductCommentDO> list); | 123 | List<AppProductCommentRespVO> convertList02(List<ProductCommentDO> list); |
| 119 | 124 | ||
| 120 | - default ProductCommentDO convert(ProductCommentCreateReqVO createReq, ProductSpuDO spu) { | 125 | + default ProductCommentDO convert(ProductCommentCreateReqVO createReq, ProductSpuDO spuDO, ProductSkuDO skuDO) { |
| 121 | ProductCommentDO commentDO = convert(createReq); | 126 | ProductCommentDO commentDO = convert(createReq); |
| 122 | - if (spu != null) { | ||
| 123 | - commentDO.setSpuId(spu.getId()).setSpuName(spu.getName()); | 127 | + if (spuDO != null) { |
| 128 | + commentDO.setSpuId(spuDO.getId()); | ||
| 129 | + commentDO.setSpuName(spuDO.getName()); | ||
| 130 | + } | ||
| 131 | + if (skuDO != null) { | ||
| 132 | + commentDO.setSkuPicUrl(skuDO.getPicUrl()); | ||
| 133 | + commentDO.setSkuProperties(skuDO.getProperties()); | ||
| 124 | } | 134 | } |
| 125 | return commentDO; | 135 | return commentDO; |
| 126 | } | 136 | } |
| 127 | 137 | ||
| 128 | - default PageResult<ProductCommentRespVO> convertPage(PageResult<ProductCommentDO> pageResult, | ||
| 129 | - List<ProductSkuDO> skus) { | 138 | + default PageResult<ProductCommentRespVO> convertPage2(PageResult<ProductCommentDO> pageResult) { |
| 139 | + Map<Long, List<ProductSkuDO.Property>> propertiesMap = convertMap(pageResult.getList(), | ||
| 140 | + ProductCommentDO::getId, | ||
| 141 | + // 这里会有NULL异常, 需要处理一下 | ||
| 142 | + comment -> CollUtil.emptyIfNull(comment.getSkuProperties())); | ||
| 143 | + | ||
| 130 | PageResult<ProductCommentRespVO> result = convertPage(pageResult); | 144 | PageResult<ProductCommentRespVO> result = convertPage(pageResult); |
| 131 | - // 拼接数据 | ||
| 132 | - Map<Long, ProductSkuDO> skuMap = convertMap(skus, ProductSkuDO::getId); | ||
| 133 | for (ProductCommentRespVO vo : result.getList()) { | 145 | for (ProductCommentRespVO vo : result.getList()) { |
| 134 | - findAndThen(skuMap, vo.getSkuId(), sku -> { | ||
| 135 | - String propertyNames = sku.getProperties().stream() | 146 | + findAndThen(propertiesMap, vo.getId(), properties -> { |
| 147 | + String propertyNames = properties.stream() | ||
| 136 | .map(ProductSkuDO.Property::getValueName) | 148 | .map(ProductSkuDO.Property::getValueName) |
| 137 | .filter(Objects::nonNull) | 149 | .filter(Objects::nonNull) |
| 138 | .collect(Collectors.joining(" ")); | 150 | .collect(Collectors.joining(" ")); |
| 139 | - // TODO @疯狂:要不写入评论的时候,把商品图片、商品属性,都冗余进去。因为这种东西有“快照”的需求。商品后续会编辑掉 | ||
| 140 | - vo.setSkuPicUrl(sku.getPicUrl()); | ||
| 141 | vo.setSpuName(vo.getSpuName() + " " + propertyNames); | 151 | vo.setSpuName(vo.getSpuName() + " " + propertyNames); |
| 142 | }); | 152 | }); |
| 143 | } | 153 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/comment/ProductCommentDO.java
| @@ -86,6 +86,15 @@ public class ProductCommentDO extends BaseDO { | @@ -86,6 +86,15 @@ public class ProductCommentDO extends BaseDO { | ||
| 86 | * 关联 {@link ProductSkuDO#getId()} | 86 | * 关联 {@link ProductSkuDO#getId()} |
| 87 | */ | 87 | */ |
| 88 | private Long skuId; | 88 | private Long skuId; |
| 89 | + /** | ||
| 90 | + * 商品 SKU 图片地址 | ||
| 91 | + */ | ||
| 92 | + private String skuPicUrl; | ||
| 93 | + /** | ||
| 94 | + * 属性数组,JSON 格式 | ||
| 95 | + */ | ||
| 96 | + @TableField(typeHandler = ProductSkuDO.PropertyTypeHandler.class) | ||
| 97 | + private List<ProductSkuDO.Property> skuProperties; | ||
| 89 | 98 | ||
| 90 | /** | 99 | /** |
| 91 | * 是否可见 | 100 | * 是否可见 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java
| @@ -53,25 +53,29 @@ public class ProductCommentServiceImpl implements ProductCommentService { | @@ -53,25 +53,29 @@ public class ProductCommentServiceImpl implements ProductCommentService { | ||
| 53 | 53 | ||
| 54 | @Override | 54 | @Override |
| 55 | public void createComment(ProductCommentCreateReqVO createReqVO) { | 55 | public void createComment(ProductCommentCreateReqVO createReqVO) { |
| 56 | - // 校验商品 | ||
| 57 | - ProductSpuDO spu = validateSpuBySkuId(createReqVO.getSkuId()); | 56 | + // 校验 SKU |
| 57 | + ProductSkuDO skuDO = validateSku(createReqVO.getSkuId()); | ||
| 58 | + // 校验 SPU | ||
| 59 | + ProductSpuDO spuDO = validateSpu(skuDO.getSpuId()); | ||
| 58 | 60 | ||
| 59 | // 创建评论 | 61 | // 创建评论 |
| 60 | - ProductCommentDO comment = ProductCommentConvert.INSTANCE.convert(createReqVO, spu); | 62 | + ProductCommentDO comment = ProductCommentConvert.INSTANCE.convert(createReqVO, spuDO, skuDO); |
| 61 | productCommentMapper.insert(comment); | 63 | productCommentMapper.insert(comment); |
| 62 | } | 64 | } |
| 63 | 65 | ||
| 64 | @Override | 66 | @Override |
| 65 | public Long createComment(ProductCommentCreateReqDTO createReqDTO) { | 67 | public Long createComment(ProductCommentCreateReqDTO createReqDTO) { |
| 66 | - // 校验商品 | ||
| 67 | - ProductSpuDO spuDO = validateSpuBySkuId(createReqDTO.getSkuId()); | 68 | + // 校验 SKU |
| 69 | + ProductSkuDO skuDO = validateSku(createReqDTO.getSkuId()); | ||
| 70 | + // 校验 SPU | ||
| 71 | + ProductSpuDO spuDO = validateSpu(skuDO.getSpuId()); | ||
| 68 | // 校验评论 | 72 | // 校验评论 |
| 69 | validateCommentExists(createReqDTO.getUserId(), createReqDTO.getOrderId()); | 73 | validateCommentExists(createReqDTO.getUserId(), createReqDTO.getOrderId()); |
| 70 | // 获取用户详细信息 | 74 | // 获取用户详细信息 |
| 71 | MemberUserRespDTO user = memberUserApi.getUser(createReqDTO.getUserId()); | 75 | MemberUserRespDTO user = memberUserApi.getUser(createReqDTO.getUserId()); |
| 72 | 76 | ||
| 73 | // 创建评论 | 77 | // 创建评论 |
| 74 | - ProductCommentDO comment = ProductCommentConvert.INSTANCE.convert(createReqDTO, spuDO, user); | 78 | + ProductCommentDO comment = ProductCommentConvert.INSTANCE.convert(createReqDTO, spuDO, skuDO, user); |
| 75 | productCommentMapper.insert(comment); | 79 | productCommentMapper.insert(comment); |
| 76 | return comment.getId(); | 80 | return comment.getId(); |
| 77 | } | 81 | } |
| @@ -79,7 +83,7 @@ public class ProductCommentServiceImpl implements ProductCommentService { | @@ -79,7 +83,7 @@ public class ProductCommentServiceImpl implements ProductCommentService { | ||
| 79 | /** | 83 | /** |
| 80 | * 判断当前订单的当前商品用户是否评价过 | 84 | * 判断当前订单的当前商品用户是否评价过 |
| 81 | * | 85 | * |
| 82 | - * @param userId 用户编号 | 86 | + * @param userId 用户编号 |
| 83 | * @param orderItemId 订单项编号 | 87 | * @param orderItemId 订单项编号 |
| 84 | */ | 88 | */ |
| 85 | private void validateCommentExists(Long userId, Long orderItemId) { | 89 | private void validateCommentExists(Long userId, Long orderItemId) { |
| @@ -105,13 +109,6 @@ public class ProductCommentServiceImpl implements ProductCommentService { | @@ -105,13 +109,6 @@ public class ProductCommentServiceImpl implements ProductCommentService { | ||
| 105 | return spu; | 109 | return spu; |
| 106 | } | 110 | } |
| 107 | 111 | ||
| 108 | - private ProductSpuDO validateSpuBySkuId(Long skuId) { | ||
| 109 | - // 通过 sku ID 拿到 spu 相关信息 | ||
| 110 | - ProductSkuDO sku = validateSku(skuId); | ||
| 111 | - // 校验 spu 如果存在返回详情 | ||
| 112 | - return validateSpu(sku.getSpuId()); | ||
| 113 | - } | ||
| 114 | - | ||
| 115 | @Override | 112 | @Override |
| 116 | public void updateCommentVisible(ProductCommentUpdateVisibleReqVO updateReqVO) { | 113 | public void updateCommentVisible(ProductCommentUpdateVisibleReqVO updateReqVO) { |
| 117 | // 校验评论是否存在 | 114 | // 校验评论是否存在 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
| @@ -5,6 +5,7 @@ import cn.hutool.core.lang.Assert; | @@ -5,6 +5,7 @@ import cn.hutool.core.lang.Assert; | ||
| 5 | import cn.hutool.core.util.IdUtil; | 5 | import cn.hutool.core.util.IdUtil; |
| 6 | import cn.hutool.core.util.ObjectUtil; | 6 | import cn.hutool.core.util.ObjectUtil; |
| 7 | import cn.hutool.core.util.StrUtil; | 7 | import cn.hutool.core.util.StrUtil; |
| 8 | +import cn.hutool.extra.spring.SpringUtil; | ||
| 8 | import cn.iocoder.yudao.framework.common.core.KeyValue; | 9 | import cn.iocoder.yudao.framework.common.core.KeyValue; |
| 9 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 10 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 10 | import cn.iocoder.yudao.framework.common.enums.TerminalEnum; | 11 | import cn.iocoder.yudao.framework.common.enums.TerminalEnum; |
| @@ -13,6 +14,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | @@ -13,6 +14,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||
| 13 | import cn.iocoder.yudao.module.member.api.address.AddressApi; | 14 | import cn.iocoder.yudao.module.member.api.address.AddressApi; |
| 14 | import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; | 15 | import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; |
| 15 | import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; | 16 | import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; |
| 17 | +import cn.iocoder.yudao.module.member.api.point.MemberPointApi; | ||
| 16 | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; | 18 | import cn.iocoder.yudao.module.member.api.user.MemberUserApi; |
| 17 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | 19 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; |
| 18 | import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; | 20 | import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; |
| @@ -110,6 +112,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -110,6 +112,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 110 | private MemberUserApi memberUserApi; | 112 | private MemberUserApi memberUserApi; |
| 111 | @Resource | 113 | @Resource |
| 112 | private MemberLevelApi memberLevelApi; | 114 | private MemberLevelApi memberLevelApi; |
| 115 | + @Resource | ||
| 116 | + private MemberPointApi memberPointApi; | ||
| 113 | 117 | ||
| 114 | @Resource | 118 | @Resource |
| 115 | private ProductCommentApi productCommentApi; | 119 | private ProductCommentApi productCommentApi; |
| @@ -346,9 +350,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -346,9 +350,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 346 | // TODO 芋艿:OrderLog | 350 | // TODO 芋艿:OrderLog |
| 347 | 351 | ||
| 348 | // 增加用户积分 | 352 | // 增加用户积分 |
| 349 | - addUserPointAsync(order.getUserId(), order.getPayPrice(), order.getId()); | 353 | + getSelf().addUserPointAsync(order.getUserId(), order.getPayPrice(), order.getId()); |
| 350 | // 增加用户经验 | 354 | // 增加用户经验 |
| 351 | - addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId()); | 355 | + getSelf().addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId()); |
| 352 | } | 356 | } |
| 353 | 357 | ||
| 354 | /** | 358 | /** |
| @@ -617,9 +621,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -617,9 +621,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 617 | // TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效 | 621 | // TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效 |
| 618 | 622 | ||
| 619 | // 扣减用户积分 | 623 | // 扣减用户积分 |
| 620 | - reduceUserPointAsync(order.getUserId(), orderRefundPrice, afterSaleId); | 624 | + getSelf().reduceUserPointAsync(order.getUserId(), orderRefundPrice, afterSaleId); |
| 621 | // 扣减用户经验 | 625 | // 扣减用户经验 |
| 622 | - reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId); | 626 | + getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId); |
| 623 | } | 627 | } |
| 624 | 628 | ||
| 625 | @Override | 629 | @Override |
| @@ -667,7 +671,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -667,7 +671,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 667 | TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus())); | 671 | TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus())); |
| 668 | } | 672 | } |
| 669 | 673 | ||
| 670 | - // TODO @疯狂:直接 this 调用,async 不生效哈。全局搜下 getSelf(); | ||
| 671 | @Async | 674 | @Async |
| 672 | protected void addUserExperienceAsync(Long userId, Integer payPrice, Long orderId) { | 675 | protected void addUserExperienceAsync(Long userId, Integer payPrice, Long orderId) { |
| 673 | int bizType = MemberExperienceBizTypeEnum.ORDER.getType(); | 676 | int bizType = MemberExperienceBizTypeEnum.ORDER.getType(); |
| @@ -683,12 +686,22 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -683,12 +686,22 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 683 | @Async | 686 | @Async |
| 684 | protected void addUserPointAsync(Long userId, Integer payPrice, Long orderId) { | 687 | protected void addUserPointAsync(Long userId, Integer payPrice, Long orderId) { |
| 685 | int bizType = MemberPointBizTypeEnum.ORDER_BUY.getType(); | 688 | int bizType = MemberPointBizTypeEnum.ORDER_BUY.getType(); |
| 686 | - memberUserApi.addPoint(userId, payPrice, bizType, String.valueOf(orderId)); | 689 | + memberPointApi.addPoint(userId, payPrice, bizType, String.valueOf(orderId)); |
| 687 | } | 690 | } |
| 688 | 691 | ||
| 689 | @Async | 692 | @Async |
| 690 | protected void reduceUserPointAsync(Long userId, Integer refundPrice, Long afterSaleId) { | 693 | protected void reduceUserPointAsync(Long userId, Integer refundPrice, Long afterSaleId) { |
| 691 | int bizType = MemberPointBizTypeEnum.ORDER_CANCEL.getType(); | 694 | int bizType = MemberPointBizTypeEnum.ORDER_CANCEL.getType(); |
| 692 | - memberUserApi.addPoint(userId, -refundPrice, bizType, String.valueOf(afterSaleId)); | 695 | + memberPointApi.addPoint(userId, -refundPrice, bizType, String.valueOf(afterSaleId)); |
| 693 | } | 696 | } |
| 697 | + | ||
| 698 | + /** | ||
| 699 | + * 获得自身的代理对象,解决 AOP 生效问题 | ||
| 700 | + * | ||
| 701 | + * @return 自己 | ||
| 702 | + */ | ||
| 703 | + private TradeOrderUpdateServiceImpl getSelf() { | ||
| 704 | + return SpringUtil.getBean(getClass()); | ||
| 705 | + } | ||
| 706 | + | ||
| 694 | } | 707 | } |
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApi.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.member.api.point; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; | ||
| 4 | + | ||
| 5 | +/** | ||
| 6 | + * 用户积分的 API 接口 | ||
| 7 | + * | ||
| 8 | + * @author owen | ||
| 9 | + */ | ||
| 10 | +public interface MemberPointApi { | ||
| 11 | + | ||
| 12 | + /** | ||
| 13 | + * 增加用户积分 | ||
| 14 | + * | ||
| 15 | + * @param userId 用户编号 | ||
| 16 | + * @param point 积分 | ||
| 17 | + * @param bizType 业务类型 {@link MemberPointBizTypeEnum} | ||
| 18 | + * @param bizId 业务编号 | ||
| 19 | + */ | ||
| 20 | + void addPoint(Long userId, Integer point, Integer bizType, String bizId); | ||
| 21 | + | ||
| 22 | +} |
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java
| 1 | package cn.iocoder.yudao.module.member.api.user; | 1 | package cn.iocoder.yudao.module.member.api.user; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | 3 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; |
| 4 | -import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; | ||
| 5 | 4 | ||
| 6 | import java.util.Collection; | 5 | import java.util.Collection; |
| 7 | import java.util.List; | 6 | import java.util.List; |
| @@ -57,16 +56,4 @@ public interface MemberUserApi { | @@ -57,16 +56,4 @@ public interface MemberUserApi { | ||
| 57 | * @return 用户信息 | 56 | * @return 用户信息 |
| 58 | */ | 57 | */ |
| 59 | MemberUserRespDTO getUserByMobile(String mobile); | 58 | MemberUserRespDTO getUserByMobile(String mobile); |
| 60 | - | ||
| 61 | - // TODO @疯狂:是不是新的类,MemberPointApi? | ||
| 62 | - /** | ||
| 63 | - * 增加用户积分 | ||
| 64 | - * | ||
| 65 | - * @param userId 用户编号 | ||
| 66 | - * @param point 积分 | ||
| 67 | - * @param bizType 业务类型 {@link MemberPointBizTypeEnum} | ||
| 68 | - * @param bizId 业务编号 | ||
| 69 | - */ | ||
| 70 | - void addPoint(Long userId, Integer point, Integer bizType, String bizId); | ||
| 71 | - | ||
| 72 | } | 59 | } |
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java
| @@ -18,12 +18,12 @@ public enum MemberExperienceBizTypeEnum { | @@ -18,12 +18,12 @@ public enum MemberExperienceBizTypeEnum { | ||
| 18 | /** | 18 | /** |
| 19 | * 管理员调整、邀请新用户、下单、退单、签到、抽奖 | 19 | * 管理员调整、邀请新用户、下单、退单、签到、抽奖 |
| 20 | */ | 20 | */ |
| 21 | - ADMIN(0, "管理员调整", "管理员调整获得 {} 经验", false), | ||
| 22 | - INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验", false), | ||
| 23 | - ORDER(2, "下单奖励", "下单获得 {} 经验", false), | ||
| 24 | - REFUND(3, "退单扣除", "退单获得 {} 经验", true), | ||
| 25 | - SIGN_IN(4, "签到奖励", "签到获得 {} 经验", false), | ||
| 26 | - LOTTERY(5, "抽奖奖励", "抽奖获得 {} 经验", false), | 21 | + ADMIN(0, "管理员调整", "管理员调整获得 {} 经验", true), |
| 22 | + INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验", true), | ||
| 23 | + ORDER(2, "下单奖励", "下单获得 {} 经验", true), | ||
| 24 | + REFUND(3, "退单扣除", "退单获得 {} 经验", false), | ||
| 25 | + SIGN_IN(4, "签到奖励", "签到获得 {} 经验", true), | ||
| 26 | + LOTTERY(5, "抽奖奖励", "抽奖获得 {} 经验", true), | ||
| 27 | ; | 27 | ; |
| 28 | 28 | ||
| 29 | /** | 29 | /** |
| @@ -41,7 +41,7 @@ public enum MemberExperienceBizTypeEnum { | @@ -41,7 +41,7 @@ public enum MemberExperienceBizTypeEnum { | ||
| 41 | /** | 41 | /** |
| 42 | * 是否为扣减积分 | 42 | * 是否为扣减积分 |
| 43 | */ | 43 | */ |
| 44 | - private final boolean isReduce; | 44 | + private final boolean add; |
| 45 | 45 | ||
| 46 | public static MemberExperienceBizTypeEnum getByType(Integer type) { | 46 | public static MemberExperienceBizTypeEnum getByType(Integer type) { |
| 47 | return EnumUtil.getBy(MemberExperienceBizTypeEnum.class, | 47 | return EnumUtil.getBy(MemberExperienceBizTypeEnum.class, |
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java
| @@ -16,9 +16,9 @@ import java.util.Objects; | @@ -16,9 +16,9 @@ import java.util.Objects; | ||
| 16 | @Getter | 16 | @Getter |
| 17 | public enum MemberPointBizTypeEnum implements IntArrayValuable { | 17 | public enum MemberPointBizTypeEnum implements IntArrayValuable { |
| 18 | 18 | ||
| 19 | - SIGN(1, "签到", "签到获得 {} 积分", false), | ||
| 20 | - ORDER_BUY(10, "订单消费", "下单获得 {} 积分", false), | ||
| 21 | - ORDER_CANCEL(11, "订单取消", "退单获得 {} 积分", true); // 退回积分 | 19 | + SIGN(1, "签到", "签到获得 {} 积分", true), |
| 20 | + ORDER_BUY(10, "订单消费", "下单获得 {} 积分", true), | ||
| 21 | + ORDER_CANCEL(11, "订单取消", "退单获得 {} 积分", false); // 退回积分 | ||
| 22 | 22 | ||
| 23 | /** | 23 | /** |
| 24 | * 类型 | 24 | * 类型 |
| @@ -32,11 +32,10 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable { | @@ -32,11 +32,10 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable { | ||
| 32 | * 描述 | 32 | * 描述 |
| 33 | */ | 33 | */ |
| 34 | private final String description; | 34 | private final String description; |
| 35 | - // TODO @疯狂:改成 add 会好点。一个是属性我们尽量不要 isXXX;另外尽量正向思维,不取反; | ||
| 36 | /** | 35 | /** |
| 37 | * 是否为扣减积分 | 36 | * 是否为扣减积分 |
| 38 | */ | 37 | */ |
| 39 | - private final boolean isReduce; | 38 | + private final boolean add; |
| 40 | 39 | ||
| 41 | @Override | 40 | @Override |
| 42 | public int[] array() { | 41 | public int[] array() { |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApiImpl.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.member.api.point; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; | ||
| 4 | +import cn.iocoder.yudao.module.member.service.point.MemberPointRecordService; | ||
| 5 | +import org.springframework.stereotype.Service; | ||
| 6 | +import org.springframework.validation.annotation.Validated; | ||
| 7 | + | ||
| 8 | +import javax.annotation.Resource; | ||
| 9 | + | ||
| 10 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 11 | +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.POINT_RECORD_BIZ_NOT_SUPPORT; | ||
| 12 | + | ||
| 13 | +/** | ||
| 14 | + * 用户积分的 API 实现类 | ||
| 15 | + * | ||
| 16 | + * @author owen | ||
| 17 | + */ | ||
| 18 | +@Service | ||
| 19 | +@Validated | ||
| 20 | +public class MemberPointApiImpl implements MemberPointApi { | ||
| 21 | + | ||
| 22 | + @Resource | ||
| 23 | + private MemberPointRecordService memberPointRecordService; | ||
| 24 | + | ||
| 25 | + @Override | ||
| 26 | + public void addPoint(Long userId, Integer point, Integer bizType, String bizId) { | ||
| 27 | + MemberPointBizTypeEnum bizTypeEnum = MemberPointBizTypeEnum.getByType(bizType); | ||
| 28 | + if (bizTypeEnum == null) { | ||
| 29 | + throw exception(POINT_RECORD_BIZ_NOT_SUPPORT); | ||
| 30 | + } | ||
| 31 | + memberPointRecordService.createPointRecord(userId, point, bizTypeEnum, bizId); | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | +} |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java
| @@ -3,8 +3,6 @@ package cn.iocoder.yudao.module.member.api.user; | @@ -3,8 +3,6 @@ package cn.iocoder.yudao.module.member.api.user; | ||
| 3 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | 3 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; |
| 4 | import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; | 4 | import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; |
| 5 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; | 5 | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; |
| 6 | -import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; | ||
| 7 | -import cn.iocoder.yudao.module.member.service.point.MemberPointRecordService; | ||
| 8 | import cn.iocoder.yudao.module.member.service.user.MemberUserService; | 6 | import cn.iocoder.yudao.module.member.service.user.MemberUserService; |
| 9 | import org.springframework.stereotype.Service; | 7 | import org.springframework.stereotype.Service; |
| 10 | import org.springframework.validation.annotation.Validated; | 8 | import org.springframework.validation.annotation.Validated; |
| @@ -13,9 +11,6 @@ import javax.annotation.Resource; | @@ -13,9 +11,6 @@ import javax.annotation.Resource; | ||
| 13 | import java.util.Collection; | 11 | import java.util.Collection; |
| 14 | import java.util.List; | 12 | import java.util.List; |
| 15 | 13 | ||
| 16 | -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 17 | -import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.POINT_RECORD_BIZ_NOT_SUPPORT; | ||
| 18 | - | ||
| 19 | /** | 14 | /** |
| 20 | * 会员用户的 API 实现类 | 15 | * 会员用户的 API 实现类 |
| 21 | * | 16 | * |
| @@ -28,9 +23,6 @@ public class MemberUserApiImpl implements MemberUserApi { | @@ -28,9 +23,6 @@ public class MemberUserApiImpl implements MemberUserApi { | ||
| 28 | @Resource | 23 | @Resource |
| 29 | private MemberUserService userService; | 24 | private MemberUserService userService; |
| 30 | 25 | ||
| 31 | - @Resource | ||
| 32 | - private MemberPointRecordService memberPointRecordService; | ||
| 33 | - | ||
| 34 | @Override | 26 | @Override |
| 35 | public MemberUserRespDTO getUser(Long id) { | 27 | public MemberUserRespDTO getUser(Long id) { |
| 36 | MemberUserDO user = userService.getUser(id); | 28 | MemberUserDO user = userService.getUser(id); |
| @@ -52,13 +44,4 @@ public class MemberUserApiImpl implements MemberUserApi { | @@ -52,13 +44,4 @@ public class MemberUserApiImpl implements MemberUserApi { | ||
| 52 | return MemberUserConvert.INSTANCE.convert2(userService.getUserByMobile(mobile)); | 44 | return MemberUserConvert.INSTANCE.convert2(userService.getUserByMobile(mobile)); |
| 53 | } | 45 | } |
| 54 | 46 | ||
| 55 | - @Override | ||
| 56 | - public void addPoint(Long userId, Integer point, Integer bizType, String bizId) { | ||
| 57 | - MemberPointBizTypeEnum bizTypeEnum = MemberPointBizTypeEnum.getByType(bizType); | ||
| 58 | - if (bizTypeEnum == null) { | ||
| 59 | - throw exception(POINT_RECORD_BIZ_NOT_SUPPORT); | ||
| 60 | - } | ||
| 61 | - memberPointRecordService.createPointRecord(userId, point, bizTypeEnum, bizId); | ||
| 62 | - } | ||
| 63 | - | ||
| 64 | } | 47 | } |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java
| @@ -200,7 +200,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { | @@ -200,7 +200,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { | ||
| 200 | if (updateReqVO.getLevelId() == null) { | 200 | if (updateReqVO.getLevelId() == null) { |
| 201 | // 取消用户等级时,需要扣减经验 | 201 | // 取消用户等级时,需要扣减经验 |
| 202 | levelRecord.setExperience(-user.getExperience()); | 202 | levelRecord.setExperience(-user.getExperience()); |
| 203 | - // TODO @疯狂:这里是不是也要设置下 setUserExperience 属性; | 203 | + levelRecord.setUserExperience(0); |
| 204 | levelRecord.setDescription("管理员取消了等级"); | 204 | levelRecord.setDescription("管理员取消了等级"); |
| 205 | } else { | 205 | } else { |
| 206 | // 复制等级配置 | 206 | // 复制等级配置 |
| @@ -232,7 +232,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { | @@ -232,7 +232,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { | ||
| 232 | if (experience == 0) { | 232 | if (experience == 0) { |
| 233 | return; | 233 | return; |
| 234 | } | 234 | } |
| 235 | - if (bizType.isReduce() && experience > 0) { | 235 | + if (!bizType.isAdd() && experience > 0) { |
| 236 | experience = -experience; | 236 | experience = -experience; |
| 237 | } | 237 | } |
| 238 | 238 |
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java
| 1 | package cn.iocoder.yudao.module.member.service.point; | 1 | package cn.iocoder.yudao.module.member.service.point; |
| 2 | 2 | ||
| 3 | -import cn.hutool.core.util.NumberUtil; | ||
| 4 | import cn.hutool.core.util.ObjectUtil; | 3 | import cn.hutool.core.util.ObjectUtil; |
| 5 | import cn.hutool.core.util.StrUtil; | 4 | import cn.hutool.core.util.StrUtil; |
| 6 | import cn.iocoder.yudao.framework.common.pojo.PageParam; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| @@ -75,15 +74,15 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService { | @@ -75,15 +74,15 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService { | ||
| 75 | 74 | ||
| 76 | // 1. 根据配置的比例,换算实际的积分 | 75 | // 1. 根据配置的比例,换算实际的积分 |
| 77 | point = point * pointConfig.getTradeGivePoint(); | 76 | point = point * pointConfig.getTradeGivePoint(); |
| 78 | - if (bizType.isReduce() && point > 0) { | 77 | + if (!bizType.isAdd() && point > 0) { |
| 79 | point = -point; | 78 | point = -point; |
| 80 | } | 79 | } |
| 81 | 80 | ||
| 82 | // 2. 增加积分记录 | 81 | // 2. 增加积分记录 |
| 83 | MemberUserDO user = memberUserService.getUser(userId); | 82 | MemberUserDO user = memberUserService.getUser(userId); |
| 84 | Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0); | 83 | Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0); |
| 85 | - // 用户变动后的积分,防止扣出负数 TODO 疯狂:积分是不是允许扣到负数。因为它是跟有钱有关的东西,不能让商家出现资金损失 | ||
| 86 | - Integer totalPoint = NumberUtil.max(userPoint + point, 0); | 84 | + // 用户变动后的积分 |
| 85 | + Integer totalPoint = userPoint + point; | ||
| 87 | MemberPointRecordDO recordDO = new MemberPointRecordDO() | 86 | MemberPointRecordDO recordDO = new MemberPointRecordDO() |
| 88 | .setUserId(userId) | 87 | .setUserId(userId) |
| 89 | .setBizId(bizId) | 88 | .setBizId(bizId) |