From 02abe86253527b1b39414e00e7fd00f1a91beab5 Mon Sep 17 00:00:00 2001 From: owen Date: Sat, 26 Aug 2023 13:52:20 +0800 Subject: [PATCH 1/2] =?UTF-8?q?member:=201.=E7=94=A8=E6=88=B7=E7=A7=AF?= =?UTF-8?q?=E5=88=86=E5=8F=98=E5=8A=A8=E6=96=B9=E6=B3=95,=20=E6=8F=90?= =?UTF-8?q?=E5=8F=96=E5=88=B0=E5=8D=95=E7=8B=AC=E7=9A=84=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=B8=AD=202.=E8=A7=84=E8=8C=83=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/TradeOrderUpdateServiceImpl.java | 27 +++++++++++---- .../member/api/point/MemberPointApi.java | 22 ++++++++++++ .../module/member/api/user/MemberUserApi.java | 13 ------- .../enums/MemberExperienceBizTypeEnum.java | 14 ++++---- .../enums/point/MemberPointBizTypeEnum.java | 9 +++-- .../member/api/point/MemberPointApiImpl.java | 34 +++++++++++++++++++ .../member/api/user/MemberUserApiImpl.java | 17 ---------- .../service/level/MemberLevelServiceImpl.java | 2 +- .../point/MemberPointRecordServiceImpl.java | 7 ++-- 9 files changed, 91 insertions(+), 54 deletions(-) create mode 100644 yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApi.java create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApiImpl.java diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java index 85e35f78a..87092b4a6 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java +++ b/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; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; import cn.iocoder.yudao.framework.common.core.KeyValue; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.TerminalEnum; @@ -13,6 +14,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.module.member.api.address.AddressApi; import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; +import cn.iocoder.yudao.module.member.api.point.MemberPointApi; import cn.iocoder.yudao.module.member.api.user.MemberUserApi; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; @@ -110,6 +112,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { private MemberUserApi memberUserApi; @Resource private MemberLevelApi memberLevelApi; + @Resource + private MemberPointApi memberPointApi; @Resource private ProductCommentApi productCommentApi; @@ -346,9 +350,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { // TODO 芋艿:OrderLog // 增加用户积分 - addUserPointAsync(order.getUserId(), order.getPayPrice(), order.getId()); + getSelf().addUserPointAsync(order.getUserId(), order.getPayPrice(), order.getId()); // 增加用户经验 - addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId()); + getSelf().addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId()); } /** @@ -617,9 +621,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { // TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效 // 扣减用户积分 - reduceUserPointAsync(order.getUserId(), orderRefundPrice, afterSaleId); + getSelf().reduceUserPointAsync(order.getUserId(), orderRefundPrice, afterSaleId); // 扣减用户经验 - reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId); + getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId); } @Override @@ -667,7 +671,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus())); } - // TODO @疯狂:直接 this 调用,async 不生效哈。全局搜下 getSelf(); @Async protected void addUserExperienceAsync(Long userId, Integer payPrice, Long orderId) { int bizType = MemberExperienceBizTypeEnum.ORDER.getType(); @@ -683,12 +686,22 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @Async protected void addUserPointAsync(Long userId, Integer payPrice, Long orderId) { int bizType = MemberPointBizTypeEnum.ORDER_BUY.getType(); - memberUserApi.addPoint(userId, payPrice, bizType, String.valueOf(orderId)); + memberPointApi.addPoint(userId, payPrice, bizType, String.valueOf(orderId)); } @Async protected void reduceUserPointAsync(Long userId, Integer refundPrice, Long afterSaleId) { int bizType = MemberPointBizTypeEnum.ORDER_CANCEL.getType(); - memberUserApi.addPoint(userId, -refundPrice, bizType, String.valueOf(afterSaleId)); + memberPointApi.addPoint(userId, -refundPrice, bizType, String.valueOf(afterSaleId)); } + + /** + * 获得自身的代理对象,解决 AOP 生效问题 + * + * @return 自己 + */ + private TradeOrderUpdateServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } + } diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApi.java new file mode 100644 index 000000000..5181211f2 --- /dev/null +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApi.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.member.api.point; + +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; + +/** + * 用户积分的 API 接口 + * + * @author owen + */ +public interface MemberPointApi { + + /** + * 增加用户积分 + * + * @param userId 用户编号 + * @param point 积分 + * @param bizType 业务类型 {@link MemberPointBizTypeEnum} + * @param bizId 业务编号 + */ + void addPoint(Long userId, Integer point, Integer bizType, String bizId); + +} diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java index 296868709..3d2130e18 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.member.api.user; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; -import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; import java.util.Collection; import java.util.List; @@ -57,16 +56,4 @@ public interface MemberUserApi { * @return 用户信息 */ MemberUserRespDTO getUserByMobile(String mobile); - - // TODO @疯狂:是不是新的类,MemberPointApi? - /** - * 增加用户积分 - * - * @param userId 用户编号 - * @param point 积分 - * @param bizType 业务类型 {@link MemberPointBizTypeEnum} - * @param bizId 业务编号 - */ - void addPoint(Long userId, Integer point, Integer bizType, String bizId); - } diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java index a287b0cdc..c719ab79f 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java +++ b/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 { /** * 管理员调整、邀请新用户、下单、退单、签到、抽奖 */ - ADMIN(0, "管理员调整", "管理员调整获得 {} 经验", false), - INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验", false), - ORDER(2, "下单奖励", "下单获得 {} 经验", false), - REFUND(3, "退单扣除", "退单获得 {} 经验", true), - SIGN_IN(4, "签到奖励", "签到获得 {} 经验", false), - LOTTERY(5, "抽奖奖励", "抽奖获得 {} 经验", false), + ADMIN(0, "管理员调整", "管理员调整获得 {} 经验", true), + INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验", true), + ORDER(2, "下单奖励", "下单获得 {} 经验", true), + REFUND(3, "退单扣除", "退单获得 {} 经验", false), + SIGN_IN(4, "签到奖励", "签到获得 {} 经验", true), + LOTTERY(5, "抽奖奖励", "抽奖获得 {} 经验", true), ; /** @@ -41,7 +41,7 @@ public enum MemberExperienceBizTypeEnum { /** * 是否为扣减积分 */ - private final boolean isReduce; + private final boolean add; public static MemberExperienceBizTypeEnum getByType(Integer type) { return EnumUtil.getBy(MemberExperienceBizTypeEnum.class, diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java index e5f7839d8..3d314a4a2 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java +++ b/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; @Getter public enum MemberPointBizTypeEnum implements IntArrayValuable { - SIGN(1, "签到", "签到获得 {} 积分", false), - ORDER_BUY(10, "订单消费", "下单获得 {} 积分", false), - ORDER_CANCEL(11, "订单取消", "退单获得 {} 积分", true); // 退回积分 + SIGN(1, "签到", "签到获得 {} 积分", true), + ORDER_BUY(10, "订单消费", "下单获得 {} 积分", true), + ORDER_CANCEL(11, "订单取消", "退单获得 {} 积分", false); // 退回积分 /** * 类型 @@ -32,11 +32,10 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable { * 描述 */ private final String description; - // TODO @疯狂:改成 add 会好点。一个是属性我们尽量不要 isXXX;另外尽量正向思维,不取反; /** * 是否为扣减积分 */ - private final boolean isReduce; + private final boolean add; @Override public int[] array() { diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApiImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApiImpl.java new file mode 100644 index 000000000..81eec0782 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApiImpl.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.member.api.point; + +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; +import cn.iocoder.yudao.module.member.service.point.MemberPointRecordService; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.POINT_RECORD_BIZ_NOT_SUPPORT; + +/** + * 用户积分的 API 实现类 + * + * @author owen + */ +@Service +@Validated +public class MemberPointApiImpl implements MemberPointApi { + + @Resource + private MemberPointRecordService memberPointRecordService; + + @Override + public void addPoint(Long userId, Integer point, Integer bizType, String bizId) { + MemberPointBizTypeEnum bizTypeEnum = MemberPointBizTypeEnum.getByType(bizType); + if (bizTypeEnum == null) { + throw exception(POINT_RECORD_BIZ_NOT_SUPPORT); + } + memberPointRecordService.createPointRecord(userId, point, bizTypeEnum, bizId); + } + +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java index 898b7fe9c..8da857c6d 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java +++ b/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; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; -import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; -import cn.iocoder.yudao.module.member.service.point.MemberPointRecordService; import cn.iocoder.yudao.module.member.service.user.MemberUserService; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -13,9 +11,6 @@ import javax.annotation.Resource; import java.util.Collection; import java.util.List; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.POINT_RECORD_BIZ_NOT_SUPPORT; - /** * 会员用户的 API 实现类 * @@ -28,9 +23,6 @@ public class MemberUserApiImpl implements MemberUserApi { @Resource private MemberUserService userService; - @Resource - private MemberPointRecordService memberPointRecordService; - @Override public MemberUserRespDTO getUser(Long id) { MemberUserDO user = userService.getUser(id); @@ -52,13 +44,4 @@ public class MemberUserApiImpl implements MemberUserApi { return MemberUserConvert.INSTANCE.convert2(userService.getUserByMobile(mobile)); } - @Override - public void addPoint(Long userId, Integer point, Integer bizType, String bizId) { - MemberPointBizTypeEnum bizTypeEnum = MemberPointBizTypeEnum.getByType(bizType); - if (bizTypeEnum == null) { - throw exception(POINT_RECORD_BIZ_NOT_SUPPORT); - } - memberPointRecordService.createPointRecord(userId, point, bizTypeEnum, bizId); - } - } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java index f8bd8b82a..6d4f713dc 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java @@ -232,7 +232,7 @@ public class MemberLevelServiceImpl implements MemberLevelService { if (experience == 0) { return; } - if (bizType.isReduce() && experience > 0) { + if (!bizType.isAdd() && experience > 0) { experience = -experience; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java index d3699aff6..a107cabe3 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.member.service.point; -import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageParam; @@ -75,15 +74,15 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService { // 1. 根据配置的比例,换算实际的积分 point = point * pointConfig.getTradeGivePoint(); - if (bizType.isReduce() && point > 0) { + if (!bizType.isAdd() && point > 0) { point = -point; } // 2. 增加积分记录 MemberUserDO user = memberUserService.getUser(userId); Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0); - // 用户变动后的积分,防止扣出负数 TODO 疯狂:积分是不是允许扣到负数。因为它是跟有钱有关的东西,不能让商家出现资金损失 - Integer totalPoint = NumberUtil.max(userPoint + point, 0); + // 用户变动后的积分 + Integer totalPoint = userPoint + point; MemberPointRecordDO recordDO = new MemberPointRecordDO() .setUserId(userId) .setBizId(bizId) From 1e2c83d90f2fa6e4c95c9541559b00eae5efa772 Mon Sep 17 00:00:00 2001 From: owen Date: Sat, 26 Aug 2023 14:40:16 +0800 Subject: [PATCH 2/2] =?UTF-8?q?mall:=20=E5=95=86=E5=93=81=E8=AF=84?= =?UTF-8?q?=E8=AE=BA=E8=A1=A8=E5=A2=9E=E5=8A=A0=E5=86=97=E4=BD=99=20SKU=20?= =?UTF-8?q?=E7=9A=84=E5=9B=BE=E7=89=87=E5=9C=B0=E5=9D=80,=20=E8=A7=84?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql/product_comment.sql | 14 ++++++++ .../comment/ProductCommentController.java | 11 +----- .../comment/ProductCommentConvert.java | 34 ++++++++++++------- .../dataobject/comment/ProductCommentDO.java | 9 +++++ .../comment/ProductCommentServiceImpl.java | 25 ++++++-------- .../service/level/MemberLevelServiceImpl.java | 2 +- 6 files changed, 58 insertions(+), 37 deletions(-) create mode 100644 sql/mysql/product_comment.sql diff --git a/sql/mysql/product_comment.sql b/sql/mysql/product_comment.sql new file mode 100644 index 000000000..f567e2923 --- /dev/null +++ b/sql/mysql/product_comment.sql @@ -0,0 +1,14 @@ +-- 1.冗余 SKU 图片地址, 规格 +alter table product_comment + add column sku_pic_url varchar(256) not null comment '图片地址' after sku_id; + +alter table product_comment + add column sku_properties varchar(512) null + comment '属性数组,JSON 格式 [{propertId: , valueId: }, {propertId: , valueId: }]' after sku_pic_url; + +-- 2.修复已有数据 +update product_comment pc + join product_sku ps on pc.spu_id = ps.spu_id +set pc.sku_pic_url = ps.pic_url, + pc.sku_properties = ps.properties +where pc.sku_id is not null; \ No newline at end of file diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/ProductCommentController.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/ProductCommentController.java index d8a779aa3..f44acd4ab 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/ProductCommentController.java +++ b/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; import cn.iocoder.yudao.module.product.controller.admin.comment.vo.*; import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert; import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO; -import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; import cn.iocoder.yudao.module.product.service.comment.ProductCommentService; -import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.security.access.prepost.PreAuthorize; @@ -16,10 +14,8 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; -import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "管理后台 - 商品评价") @@ -30,18 +26,13 @@ public class ProductCommentController { @Resource private ProductCommentService productCommentService; - @Resource - private ProductSkuService productSkuService; @GetMapping("/page") @Operation(summary = "获得商品评价分页") @PreAuthorize("@ss.hasPermission('product:comment:query')") public CommonResult> getCommentPage(@Valid ProductCommentPageReqVO pageVO) { PageResult pageResult = productCommentService.getCommentPage(pageVO); - // 拼接返回 - List skuList = productSkuService.getSkuList( - convertSet(pageResult.getList(), ProductCommentDO::getSkuId)); - return success(ProductCommentConvert.INSTANCE.convertPage(pageResult, skuList)); + return success(ProductCommentConvert.INSTANCE.convertPage2(pageResult)); } @PutMapping("/update-visible") diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/comment/ProductCommentConvert.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/comment/ProductCommentConvert.java index 94edc20bf..6fac8823c 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/comment/ProductCommentConvert.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/comment/ProductCommentConvert.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.product.convert.comment; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -91,7 +92,7 @@ public interface ProductCommentConvert { @Mapping(target = "scores", expression = "java(convertScores(createReqDTO.getDescriptionScores(), createReqDTO.getBenefitScores()))") - default ProductCommentDO convert(ProductCommentCreateReqDTO createReqDTO, ProductSpuDO spuDO, MemberUserRespDTO user) { + default ProductCommentDO convert(ProductCommentCreateReqDTO createReqDTO, ProductSpuDO spuDO, ProductSkuDO skuDO, MemberUserRespDTO user) { ProductCommentDO commentDO = convert(createReqDTO); if (user != null) { commentDO.setUserId(user.getId()); @@ -102,6 +103,10 @@ public interface ProductCommentConvert { commentDO.setSpuId(spuDO.getId()); commentDO.setSpuName(spuDO.getName()); } + if (skuDO != null) { + commentDO.setSkuPicUrl(skuDO.getPicUrl()); + commentDO.setSkuProperties(skuDO.getProperties()); + } return commentDO; } @@ -117,27 +122,32 @@ public interface ProductCommentConvert { List convertList02(List list); - default ProductCommentDO convert(ProductCommentCreateReqVO createReq, ProductSpuDO spu) { + default ProductCommentDO convert(ProductCommentCreateReqVO createReq, ProductSpuDO spuDO, ProductSkuDO skuDO) { ProductCommentDO commentDO = convert(createReq); - if (spu != null) { - commentDO.setSpuId(spu.getId()).setSpuName(spu.getName()); + if (spuDO != null) { + commentDO.setSpuId(spuDO.getId()); + commentDO.setSpuName(spuDO.getName()); + } + if (skuDO != null) { + commentDO.setSkuPicUrl(skuDO.getPicUrl()); + commentDO.setSkuProperties(skuDO.getProperties()); } return commentDO; } - default PageResult convertPage(PageResult pageResult, - List skus) { + default PageResult convertPage2(PageResult pageResult) { + Map> propertiesMap = convertMap(pageResult.getList(), + ProductCommentDO::getId, + // 这里会有NULL异常, 需要处理一下 + comment -> CollUtil.emptyIfNull(comment.getSkuProperties())); + PageResult result = convertPage(pageResult); - // 拼接数据 - Map skuMap = convertMap(skus, ProductSkuDO::getId); for (ProductCommentRespVO vo : result.getList()) { - findAndThen(skuMap, vo.getSkuId(), sku -> { - String propertyNames = sku.getProperties().stream() + findAndThen(propertiesMap, vo.getId(), properties -> { + String propertyNames = properties.stream() .map(ProductSkuDO.Property::getValueName) .filter(Objects::nonNull) .collect(Collectors.joining(" ")); - // TODO @疯狂:要不写入评论的时候,把商品图片、商品属性,都冗余进去。因为这种东西有“快照”的需求。商品后续会编辑掉 - vo.setSkuPicUrl(sku.getPicUrl()); vo.setSpuName(vo.getSpuName() + " " + propertyNames); }); } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/comment/ProductCommentDO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/comment/ProductCommentDO.java index 366b237a2..ff4e78468 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/comment/ProductCommentDO.java +++ b/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 { * 关联 {@link ProductSkuDO#getId()} */ private Long skuId; + /** + * 商品 SKU 图片地址 + */ + private String skuPicUrl; + /** + * 属性数组,JSON 格式 + */ + @TableField(typeHandler = ProductSkuDO.PropertyTypeHandler.class) + private List skuProperties; /** * 是否可见 diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java index fe2a01a93..934946109 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java +++ b/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 { @Override public void createComment(ProductCommentCreateReqVO createReqVO) { - // 校验商品 - ProductSpuDO spu = validateSpuBySkuId(createReqVO.getSkuId()); + // 校验 SKU + ProductSkuDO skuDO = validateSku(createReqVO.getSkuId()); + // 校验 SPU + ProductSpuDO spuDO = validateSpu(skuDO.getSpuId()); // 创建评论 - ProductCommentDO comment = ProductCommentConvert.INSTANCE.convert(createReqVO, spu); + ProductCommentDO comment = ProductCommentConvert.INSTANCE.convert(createReqVO, spuDO, skuDO); productCommentMapper.insert(comment); } @Override public Long createComment(ProductCommentCreateReqDTO createReqDTO) { - // 校验商品 - ProductSpuDO spuDO = validateSpuBySkuId(createReqDTO.getSkuId()); + // 校验 SKU + ProductSkuDO skuDO = validateSku(createReqDTO.getSkuId()); + // 校验 SPU + ProductSpuDO spuDO = validateSpu(skuDO.getSpuId()); // 校验评论 validateCommentExists(createReqDTO.getUserId(), createReqDTO.getOrderId()); // 获取用户详细信息 MemberUserRespDTO user = memberUserApi.getUser(createReqDTO.getUserId()); // 创建评论 - ProductCommentDO comment = ProductCommentConvert.INSTANCE.convert(createReqDTO, spuDO, user); + ProductCommentDO comment = ProductCommentConvert.INSTANCE.convert(createReqDTO, spuDO, skuDO, user); productCommentMapper.insert(comment); return comment.getId(); } @@ -79,7 +83,7 @@ public class ProductCommentServiceImpl implements ProductCommentService { /** * 判断当前订单的当前商品用户是否评价过 * - * @param userId 用户编号 + * @param userId 用户编号 * @param orderItemId 订单项编号 */ private void validateCommentExists(Long userId, Long orderItemId) { @@ -105,13 +109,6 @@ public class ProductCommentServiceImpl implements ProductCommentService { return spu; } - private ProductSpuDO validateSpuBySkuId(Long skuId) { - // 通过 sku ID 拿到 spu 相关信息 - ProductSkuDO sku = validateSku(skuId); - // 校验 spu 如果存在返回详情 - return validateSpu(sku.getSpuId()); - } - @Override public void updateCommentVisible(ProductCommentUpdateVisibleReqVO updateReqVO) { // 校验评论是否存在 diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java index 6d4f713dc..d42f86ec0 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java +++ b/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 { if (updateReqVO.getLevelId() == null) { // 取消用户等级时,需要扣减经验 levelRecord.setExperience(-user.getExperience()); - // TODO @疯狂:这里是不是也要设置下 setUserExperience 属性; + levelRecord.setUserExperience(0); levelRecord.setDescription("管理员取消了等级"); } else { // 复制等级配置