Commit b75d777670d6f4fdd9c1b4e381f8aa57a4219532

Authored by YunaiV
1 parent f8952f8e

code review:订单评论、订单积分的变更

Showing 11 changed files with 105 additions and 113 deletions
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/ProductCommentController.java
@@ -38,10 +38,9 @@ public class ProductCommentController { @@ -38,10 +38,9 @@ public class ProductCommentController {
38 @PreAuthorize("@ss.hasPermission('product:comment:query')") 38 @PreAuthorize("@ss.hasPermission('product:comment:query')")
39 public CommonResult<PageResult<ProductCommentRespVO>> getCommentPage(@Valid ProductCommentPageReqVO pageVO) { 39 public CommonResult<PageResult<ProductCommentRespVO>> getCommentPage(@Valid ProductCommentPageReqVO pageVO) {
40 PageResult<ProductCommentDO> pageResult = productCommentService.getCommentPage(pageVO); 40 PageResult<ProductCommentDO> pageResult = productCommentService.getCommentPage(pageVO);
41 - 41 + // 拼接返回
42 List<ProductSkuDO> skuList = productSkuService.getSkuList( 42 List<ProductSkuDO> skuList = productSkuService.getSkuList(
43 convertSet(pageResult.getList(), ProductCommentDO::getSkuId)); 43 convertSet(pageResult.getList(), ProductCommentDO::getSkuId));
44 -  
45 return success(ProductCommentConvert.INSTANCE.convertPage(pageResult, skuList)); 44 return success(ProductCommentConvert.INSTANCE.convertPage(pageResult, skuList));
46 } 45 }
47 46
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/comment/ProductCommentConvert.java
@@ -117,26 +117,26 @@ public interface ProductCommentConvert { @@ -117,26 +117,26 @@ public interface ProductCommentConvert {
117 117
118 List<AppProductCommentRespVO> convertList02(List<ProductCommentDO> list); 118 List<AppProductCommentRespVO> convertList02(List<ProductCommentDO> list);
119 119
120 - default ProductCommentDO convert(ProductCommentCreateReqVO createReq, ProductSpuDO spuDO) { 120 + default ProductCommentDO convert(ProductCommentCreateReqVO createReq, ProductSpuDO spu) {
121 ProductCommentDO commentDO = convert(createReq); 121 ProductCommentDO commentDO = convert(createReq);
122 - if (spuDO != null) {  
123 - commentDO.setSpuId(spuDO.getId());  
124 - commentDO.setSpuName(spuDO.getName()); 122 + if (spu != null) {
  123 + commentDO.setSpuId(spu.getId()).setSpuName(spu.getName());
125 } 124 }
126 return commentDO; 125 return commentDO;
127 } 126 }
128 127
129 - default PageResult<ProductCommentRespVO> convertPage(PageResult<ProductCommentDO> pageResult, List<ProductSkuDO> skuList) {  
130 - Map<Long, ProductSkuDO> skuMap = convertMap(skuList, ProductSkuDO::getId);  
131 - 128 + default PageResult<ProductCommentRespVO> convertPage(PageResult<ProductCommentDO> pageResult,
  129 + List<ProductSkuDO> skus) {
132 PageResult<ProductCommentRespVO> result = convertPage(pageResult); 130 PageResult<ProductCommentRespVO> result = convertPage(pageResult);
  131 + // 拼接数据
  132 + Map<Long, ProductSkuDO> skuMap = convertMap(skus, ProductSkuDO::getId);
133 for (ProductCommentRespVO vo : result.getList()) { 133 for (ProductCommentRespVO vo : result.getList()) {
134 findAndThen(skuMap, vo.getSkuId(), sku -> { 134 findAndThen(skuMap, vo.getSkuId(), sku -> {
135 String propertyNames = sku.getProperties().stream() 135 String propertyNames = sku.getProperties().stream()
136 .map(ProductSkuDO.Property::getValueName) 136 .map(ProductSkuDO.Property::getValueName)
137 .filter(Objects::nonNull) 137 .filter(Objects::nonNull)
138 .collect(Collectors.joining(" ")); 138 .collect(Collectors.joining(" "));
139 - 139 + // TODO @疯狂:要不写入评论的时候,把商品图片、商品属性,都冗余进去。因为这种东西有“快照”的需求。商品后续会编辑掉
140 vo.setSkuPicUrl(sku.getPicUrl()); 140 vo.setSkuPicUrl(sku.getPicUrl());
141 vo.setSpuName(vo.getSpuName() + " " + propertyNames); 141 vo.setSpuName(vo.getSpuName() + " " + propertyNames);
142 }); 142 });
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/comment/ProductCommentMapper.java
1 package cn.iocoder.yudao.module.product.dal.mysql.comment; 1 package cn.iocoder.yudao.module.product.dal.mysql.comment;
2 2
3 -  
4 import cn.hutool.core.util.ObjectUtil; 3 import cn.hutool.core.util.ObjectUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageParam; 4 import cn.iocoder.yudao.framework.common.pojo.PageParam;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -54,11 +53,10 @@ public interface ProductCommentMapper extends BaseMapperX&lt;ProductCommentDO&gt; { @@ -54,11 +53,10 @@ public interface ProductCommentMapper extends BaseMapperX&lt;ProductCommentDO&gt; {
54 return selectPage(reqVO, queryWrapper); 53 return selectPage(reqVO, queryWrapper);
55 } 54 }
56 55
57 - default ProductCommentDO selectByUserIdAndOrderItemIdAndSpuId(Long userId, Long orderItemId, Long skuId) { 56 + default ProductCommentDO selectByUserIdAndOrderItemId(Long userId, Long orderItemId) {
58 return selectOne(new LambdaQueryWrapperX<ProductCommentDO>() 57 return selectOne(new LambdaQueryWrapperX<ProductCommentDO>()
59 .eq(ProductCommentDO::getUserId, userId) 58 .eq(ProductCommentDO::getUserId, userId)
60 - .eq(ProductCommentDO::getOrderItemId, orderItemId)  
61 - .eq(ProductCommentDO::getSpuId, skuId)); 59 + .eq(ProductCommentDO::getOrderItemId, orderItemId));
62 } 60 }
63 61
64 default Long selectCountBySpuId(Long spuId, Boolean visible, Integer type) { 62 default Long selectCountBySpuId(Long spuId, Boolean visible, Integer type) {
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentService.java
@@ -25,12 +25,21 @@ import java.util.List; @@ -25,12 +25,21 @@ import java.util.List;
25 public interface ProductCommentService { 25 public interface ProductCommentService {
26 26
27 /** 27 /**
28 - * 获得商品评价分页 28 + * 创建商品评论
  29 + * 后台管理员创建评论使用
29 * 30 *
30 - * @param pageReqVO 分页查询  
31 - * @return 商品评价分页 31 + * @param createReqVO 商品评价创建 Request VO 对象
32 */ 32 */
33 - PageResult<ProductCommentDO> getCommentPage(ProductCommentPageReqVO pageReqVO); 33 + void createComment(ProductCommentCreateReqVO createReqVO);
  34 +
  35 + /**
  36 + * 创建评论
  37 + * 创建商品评论 APP 端创建商品评论使用
  38 + *
  39 + * @param createReqDTO 创建请求 dto
  40 + * @return 返回评论 id
  41 + */
  42 + Long createComment(ProductCommentCreateReqDTO createReqDTO);
34 43
35 /** 44 /**
36 * 修改评论是否可见 45 * 修改评论是否可见
@@ -43,35 +52,26 @@ public interface ProductCommentService { @@ -43,35 +52,26 @@ public interface ProductCommentService {
43 * 商家回复 52 * 商家回复
44 * 53 *
45 * @param replyVO 商家回复 54 * @param replyVO 商家回复
46 - * @param loginUserId 管理后台商家登陆人 ID 55 + * @param userId 管理后台商家登陆人 ID
47 */ 56 */
48 - void replyComment(ProductCommentReplyReqVO replyVO, Long loginUserId); 57 + void replyComment(ProductCommentReplyReqVO replyVO, Long userId);
49 58
50 /** 59 /**
51 - * 获得商品评价分页 60 + * 【管理员】获得商品评价分页
52 * 61 *
53 - * @param pageVO 分页查询  
54 - * @param visible 是否可见 62 + * @param pageReqVO 分页查询
55 * @return 商品评价分页 63 * @return 商品评价分页
56 */ 64 */
57 - PageResult<ProductCommentDO> getCommentPage(AppCommentPageReqVO pageVO, Boolean visible); 65 + PageResult<ProductCommentDO> getCommentPage(ProductCommentPageReqVO pageReqVO);
58 66
59 /** 67 /**
60 - * 创建商品评论  
61 - * 后台管理员创建评论使用 68 + * 【会员】获得商品评价分页
62 * 69 *
63 - * @param createReqVO 商品评价创建 Request VO 对象  
64 - */  
65 - void createComment(ProductCommentCreateReqVO createReqVO);  
66 -  
67 - /**  
68 - * 创建评论  
69 - * 创建商品评论 APP 端创建商品评论使用  
70 - *  
71 - * @param createReqDTO 创建请求 dto  
72 - * @return 返回评论 id 70 + * @param pageVO 分页查询
  71 + * @param visible 是否可见
  72 + * @return 商品评价分页
73 */ 73 */
74 - Long createComment(ProductCommentCreateReqDTO createReqDTO); 74 + PageResult<ProductCommentDO> getCommentPage(AppCommentPageReqVO pageVO, Boolean visible);
75 75
76 /** 76 /**
77 * 获得商品的评价统计 77 * 获得商品的评价统计
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java
@@ -20,7 +20,6 @@ import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; @@ -20,7 +20,6 @@ import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
20 import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; 20 import cn.iocoder.yudao.module.product.service.spu.ProductSpuService;
21 import org.springframework.context.annotation.Lazy; 21 import org.springframework.context.annotation.Lazy;
22 import org.springframework.stereotype.Service; 22 import org.springframework.stereotype.Service;
23 -import org.springframework.transaction.annotation.Transactional;  
24 import org.springframework.validation.annotation.Validated; 23 import org.springframework.validation.annotation.Validated;
25 24
26 import javax.annotation.Resource; 25 import javax.annotation.Resource;
@@ -53,71 +52,43 @@ public class ProductCommentServiceImpl implements ProductCommentService { @@ -53,71 +52,43 @@ public class ProductCommentServiceImpl implements ProductCommentService {
53 private MemberUserApi memberUserApi; 52 private MemberUserApi memberUserApi;
54 53
55 @Override 54 @Override
56 - @Transactional(rollbackFor = Exception.class)  
57 - public void updateCommentVisible(ProductCommentUpdateVisibleReqVO updateReqVO) {  
58 - // 校验评论是否存在  
59 - ProductCommentDO productCommentDO = validateCommentExists(updateReqVO.getId());  
60 - productCommentDO.setVisible(updateReqVO.getVisible());  
61 -  
62 - // 更新可见状态  
63 - productCommentMapper.updateById(productCommentDO);  
64 - }  
65 -  
66 - @Override  
67 - @Transactional(rollbackFor = Exception.class)  
68 - public void replyComment(ProductCommentReplyReqVO replyVO, Long loginUserId) {  
69 - // 校验评论是否存在  
70 - ProductCommentDO productCommentDO = validateCommentExists(replyVO.getId());  
71 - productCommentDO.setReplyTime(LocalDateTime.now());  
72 - productCommentDO.setReplyUserId(loginUserId);  
73 - productCommentDO.setReplyStatus(Boolean.TRUE);  
74 - productCommentDO.setReplyContent(replyVO.getReplyContent());  
75 -  
76 - // 回复评论  
77 - productCommentMapper.updateById(productCommentDO);  
78 - }  
79 -  
80 - @Override  
81 - @Transactional(rollbackFor = Exception.class)  
82 public void createComment(ProductCommentCreateReqVO createReqVO) { 55 public void createComment(ProductCommentCreateReqVO createReqVO) {
83 // 校验商品 56 // 校验商品
84 - ProductSpuDO spuDO = validateProduct(createReqVO.getSkuId()); 57 + ProductSpuDO spu = validateSpuBySkuId(createReqVO.getSkuId());
85 58
86 - ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqVO, spuDO);  
87 - productCommentMapper.insert(commentDO); 59 + // 创建评论
  60 + ProductCommentDO comment = ProductCommentConvert.INSTANCE.convert(createReqVO, spu);
  61 + productCommentMapper.insert(comment);
88 } 62 }
89 63
90 @Override 64 @Override
91 - @Transactional(rollbackFor = Exception.class)  
92 public Long createComment(ProductCommentCreateReqDTO createReqDTO) { 65 public Long createComment(ProductCommentCreateReqDTO createReqDTO) {
93 // 校验商品 66 // 校验商品
94 - ProductSpuDO spuDO = validateProduct(createReqDTO.getSkuId()); 67 + ProductSpuDO spuDO = validateSpuBySkuId(createReqDTO.getSkuId());
95 // 校验评论 68 // 校验评论
96 - validateComment(spuDO.getId(), createReqDTO.getUserId(), createReqDTO.getOrderId()); 69 + validateCommentExists(createReqDTO.getUserId(), createReqDTO.getOrderId());
97 // 获取用户详细信息 70 // 获取用户详细信息
98 MemberUserRespDTO user = memberUserApi.getUser(createReqDTO.getUserId()); 71 MemberUserRespDTO user = memberUserApi.getUser(createReqDTO.getUserId());
99 72
100 // 创建评论 73 // 创建评论
101 - ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqDTO, spuDO, user);  
102 - productCommentMapper.insert(commentDO);  
103 - return commentDO.getId(); 74 + ProductCommentDO comment = ProductCommentConvert.INSTANCE.convert(createReqDTO, spuDO, user);
  75 + productCommentMapper.insert(comment);
  76 + return comment.getId();
104 } 77 }
105 78
106 - private void validateComment(Long skuId, Long userId, Long orderItemId) {  
107 - // 判断当前订单的当前商品用户是否评价过  
108 - ProductCommentDO exist = productCommentMapper.selectByUserIdAndOrderItemIdAndSpuId(userId, orderItemId, skuId);  
109 - if (null != exist) { 79 + /**
  80 + * 判断当前订单的当前商品用户是否评价过
  81 + *
  82 + * @param userId 用户编号
  83 + * @param orderItemId 订单项编号
  84 + */
  85 + private void validateCommentExists(Long userId, Long orderItemId) {
  86 + ProductCommentDO exist = productCommentMapper.selectByUserIdAndOrderItemId(userId, orderItemId);
  87 + if (exist != null) {
110 throw exception(COMMENT_ORDER_EXISTS); 88 throw exception(COMMENT_ORDER_EXISTS);
111 } 89 }
112 } 90 }
113 91
114 - private ProductSpuDO validateProduct(Long skuId) {  
115 - // 通过 sku ID 拿到 spu 相关信息  
116 - ProductSkuDO sku = validateSku(skuId);  
117 - // 校验 spu 如果存在返回详情  
118 - return validateSpu(sku.getSpuId());  
119 - }  
120 -  
121 private ProductSkuDO validateSku(Long skuId) { 92 private ProductSkuDO validateSku(Long skuId) {
122 ProductSkuDO sku = productSkuService.getSku(skuId); 93 ProductSkuDO sku = productSkuService.getSku(skuId);
123 if (sku == null) { 94 if (sku == null) {
@@ -134,6 +105,33 @@ public class ProductCommentServiceImpl implements ProductCommentService { @@ -134,6 +105,33 @@ public class ProductCommentServiceImpl implements ProductCommentService {
134 return spu; 105 return spu;
135 } 106 }
136 107
  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
  116 + public void updateCommentVisible(ProductCommentUpdateVisibleReqVO updateReqVO) {
  117 + // 校验评论是否存在
  118 + validateCommentExists(updateReqVO.getId());
  119 +
  120 + // 更新可见状态
  121 + productCommentMapper.updateById(new ProductCommentDO().setId(updateReqVO.getId())
  122 + .setVisible(true));
  123 + }
  124 +
  125 + @Override
  126 + public void replyComment(ProductCommentReplyReqVO replyVO, Long userId) {
  127 + // 校验评论是否存在
  128 + validateCommentExists(replyVO.getId());
  129 + // 回复评论
  130 + productCommentMapper.updateById(new ProductCommentDO().setId(replyVO.getId())
  131 + .setReplyTime(LocalDateTime.now()).setReplyUserId(userId)
  132 + .setReplyStatus(Boolean.TRUE).setReplyContent(replyVO.getReplyContent()));
  133 + }
  134 +
137 private ProductCommentDO validateCommentExists(Long id) { 135 private ProductCommentDO validateCommentExists(Long id) {
138 ProductCommentDO productComment = productCommentMapper.selectById(id); 136 ProductCommentDO productComment = productCommentMapper.selectById(id);
139 if (productComment == null) { 137 if (productComment == null) {
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
@@ -667,6 +667,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -667,6 +667,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
667 TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus())); 667 TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus()));
668 } 668 }
669 669
  670 + // TODO @疯狂:直接 this 调用,async 不生效哈。全局搜下 getSelf();
670 @Async 671 @Async
671 protected void addUserExperienceAsync(Long userId, Integer payPrice, Long orderId) { 672 protected void addUserExperienceAsync(Long userId, Integer payPrice, Long orderId) {
672 int bizType = MemberExperienceBizTypeEnum.ORDER.getType(); 673 int bizType = MemberExperienceBizTypeEnum.ORDER.getType();
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java
@@ -58,6 +58,7 @@ public interface MemberUserApi { @@ -58,6 +58,7 @@ public interface MemberUserApi {
58 */ 58 */
59 MemberUserRespDTO getUserByMobile(String mobile); 59 MemberUserRespDTO getUserByMobile(String mobile);
60 60
  61 + // TODO @疯狂:是不是新的类,MemberPointApi?
61 /** 62 /**
62 * 增加用户积分 63 * 增加用户积分
63 * 64 *
@@ -67,4 +68,5 @@ public interface MemberUserApi { @@ -67,4 +68,5 @@ public interface MemberUserApi {
67 * @param bizId 业务编号 68 * @param bizId 业务编号
68 */ 69 */
69 void addPoint(Long userId, Integer point, Integer bizType, String bizId); 70 void addPoint(Long userId, Integer point, Integer bizType, String bizId);
  71 +
70 } 72 }
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java
@@ -32,6 +32,7 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable { @@ -32,6 +32,7 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable {
32 * 描述 32 * 描述
33 */ 33 */
34 private final String description; 34 private final String description;
  35 + // TODO @疯狂:改成 add 会好点。一个是属性我们尽量不要 isXXX;另外尽量正向思维,不取反;
35 /** 36 /**
36 * 是否为扣减积分 37 * 是否为扣减积分
37 */ 38 */
@@ -42,7 +43,6 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable { @@ -42,7 +43,6 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable {
42 return new int[0]; 43 return new int[0];
43 } 44 }
44 45
45 -  
46 public static MemberPointBizTypeEnum getByType(Integer type) { 46 public static MemberPointBizTypeEnum getByType(Integer type) {
47 return EnumUtil.getBy(MemberPointBizTypeEnum.class, 47 return EnumUtil.getBy(MemberPointBizTypeEnum.class,
48 e -> Objects.equals(type, e.getType())); 48 e -> Objects.equals(type, e.getType()));
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java
@@ -99,7 +99,6 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -99,7 +99,6 @@ public class MemberLevelServiceImpl implements MemberLevelService {
99 if (ObjUtil.notEqual(levelDO.getName(), name)) { 99 if (ObjUtil.notEqual(levelDO.getName(), name)) {
100 continue; 100 continue;
101 } 101 }
102 -  
103 if (id == null || !id.equals(levelDO.getId())) { 102 if (id == null || !id.equals(levelDO.getId())) {
104 throw exception(LEVEL_NAME_EXISTS, levelDO.getName()); 103 throw exception(LEVEL_NAME_EXISTS, levelDO.getName());
105 } 104 }
@@ -151,7 +150,6 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -151,7 +150,6 @@ public class MemberLevelServiceImpl implements MemberLevelService {
151 validateExperienceOutRange(list, id, level, experience); 150 validateExperienceOutRange(list, id, level, experience);
152 } 151 }
153 152
154 - // TODO 有 Service 提供接口哈,不直接调用对方的 memberUserMapper  
155 @VisibleForTesting 153 @VisibleForTesting
156 void validateLevelHasUser(Long id) { 154 void validateLevelHasUser(Long id) {
157 Long count = memberUserService.getUserCountByLevelId(id); 155 Long count = memberUserService.getUserCountByLevelId(id);
@@ -195,37 +193,36 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -195,37 +193,36 @@ public class MemberLevelServiceImpl implements MemberLevelService {
195 return; 193 return;
196 } 194 }
197 195
198 - // 记录等级变动 196 + // 1. 记录等级变动
199 MemberLevelRecordDO levelRecord = new MemberLevelRecordDO() 197 MemberLevelRecordDO levelRecord = new MemberLevelRecordDO()
200 - .setUserId(user.getId())  
201 - .setRemark(updateReqVO.getReason()); 198 + .setUserId(user.getId()).setRemark(updateReqVO.getReason());
202 MemberLevelDO memberLevel = null; 199 MemberLevelDO memberLevel = null;
203 if (updateReqVO.getLevelId() == null) { 200 if (updateReqVO.getLevelId() == null) {
204 - // 取消用户等级时,为扣减经验 201 + // 取消用户等级时,需要扣减经验
205 levelRecord.setExperience(-user.getExperience()); 202 levelRecord.setExperience(-user.getExperience());
  203 + // TODO @疯狂:这里是不是也要设置下 setUserExperience 属性;
206 levelRecord.setDescription("管理员取消了等级"); 204 levelRecord.setDescription("管理员取消了等级");
207 } else { 205 } else {
208 - memberLevel = validateLevelExists(updateReqVO.getLevelId());  
209 // 复制等级配置 206 // 复制等级配置
  207 + memberLevel = validateLevelExists(updateReqVO.getLevelId());
210 MemberLevelRecordConvert.INSTANCE.copyTo(memberLevel, levelRecord); 208 MemberLevelRecordConvert.INSTANCE.copyTo(memberLevel, levelRecord);
211 // 变动经验值 = 等级的升级经验 - 会员当前的经验;正数为增加经验,负数为扣减经验 209 // 变动经验值 = 等级的升级经验 - 会员当前的经验;正数为增加经验,负数为扣减经验
212 levelRecord.setExperience(memberLevel.getExperience() - user.getExperience()); 210 levelRecord.setExperience(memberLevel.getExperience() - user.getExperience());
213 - // 会员当前的经验 = 等级的升级经验  
214 - levelRecord.setUserExperience(memberLevel.getExperience()); 211 + levelRecord.setUserExperience(memberLevel.getExperience()); // 会员当前的经验 = 等级的升级经验
215 levelRecord.setDescription("管理员调整为:" + memberLevel.getName()); 212 levelRecord.setDescription("管理员调整为:" + memberLevel.getName());
216 } 213 }
217 memberLevelRecordService.createLevelRecord(levelRecord); 214 memberLevelRecordService.createLevelRecord(levelRecord);
218 215
219 - // 记录会员经验变动 216 + // 2. 记录会员经验变动
220 memberExperienceRecordService.createExperienceRecord(user.getId(), 217 memberExperienceRecordService.createExperienceRecord(user.getId(),
221 levelRecord.getExperience(), levelRecord.getUserExperience(), 218 levelRecord.getExperience(), levelRecord.getUserExperience(),
222 MemberExperienceBizTypeEnum.ADMIN, String.valueOf(MemberExperienceBizTypeEnum.ADMIN.getType())); 219 MemberExperienceBizTypeEnum.ADMIN, String.valueOf(MemberExperienceBizTypeEnum.ADMIN.getType()));
223 220
224 - // 更新会员表上的等级编号、经验值 221 + // 3. 更新会员表上的等级编号、经验值
225 memberUserService.updateUserLevel(user.getId(), updateReqVO.getLevelId(), 222 memberUserService.updateUserLevel(user.getId(), updateReqVO.getLevelId(),
226 levelRecord.getUserExperience()); 223 levelRecord.getUserExperience());
227 224
228 - // 给会员发送等级变动消息 225 + // 4. 给会员发送等级变动消息
229 notifyMemberLevelChange(user.getId(), memberLevel); 226 notifyMemberLevelChange(user.getId(), memberLevel);
230 } 227 }
231 228
@@ -239,31 +236,27 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -239,31 +236,27 @@ public class MemberLevelServiceImpl implements MemberLevelService {
239 experience = -experience; 236 experience = -experience;
240 } 237 }
241 238
  239 + // 1. 创建经验记录
242 MemberUserDO user = memberUserService.getUser(userId); 240 MemberUserDO user = memberUserService.getUser(userId);
243 -  
244 - int userExperience = NumberUtil.max(user.getExperience() + experience, 0); 241 + int userExperience = NumberUtil.max(user.getExperience() + experience, 0); // 防止扣出负数
245 MemberLevelRecordDO levelRecord = new MemberLevelRecordDO() 242 MemberLevelRecordDO levelRecord = new MemberLevelRecordDO()
246 .setUserId(user.getId()) 243 .setUserId(user.getId())
247 .setExperience(experience) 244 .setExperience(experience)
248 - // 防止扣出负数  
249 .setUserExperience(userExperience); 245 .setUserExperience(userExperience);
250 -  
251 - // 创建经验记录  
252 memberExperienceRecordService.createExperienceRecord(userId, experience, userExperience, 246 memberExperienceRecordService.createExperienceRecord(userId, experience, userExperience,
253 bizType, bizId); 247 bizType, bizId);
254 248
255 - // 计算会员等级 249 + // 2.1 保存等级变更记录
256 MemberLevelDO newLevel = calculateNewLevel(user, userExperience); 250 MemberLevelDO newLevel = calculateNewLevel(user, userExperience);
257 if (newLevel != null) { 251 if (newLevel != null) {
258 - // 复制等级配置  
259 MemberLevelRecordConvert.INSTANCE.copyTo(newLevel, levelRecord); 252 MemberLevelRecordConvert.INSTANCE.copyTo(newLevel, levelRecord);
260 - // 保存等级变更记录  
261 memberLevelRecordService.createLevelRecord(levelRecord); 253 memberLevelRecordService.createLevelRecord(levelRecord);
262 - // 给会员发送等级变动消息 254 +
  255 + // 2.2 给会员发送等级变动消息
263 notifyMemberLevelChange(userId, newLevel); 256 notifyMemberLevelChange(userId, newLevel);
264 } 257 }
265 258
266 - // 更新会员表上的等级编号、经验值 259 + // 3. 更新会员表上的等级编号、经验值
267 memberUserService.updateUserLevel(user.getId(), levelRecord.getLevelId(), userExperience); 260 memberUserService.updateUserLevel(user.getId(), levelRecord.getLevelId(), userExperience);
268 } 261 }
269 262
@@ -301,4 +294,5 @@ public class MemberLevelServiceImpl implements MemberLevelService { @@ -301,4 +294,5 @@ public class MemberLevelServiceImpl implements MemberLevelService {
301 private void notifyMemberLevelChange(Long userId, MemberLevelDO level) { 294 private void notifyMemberLevelChange(Long userId, MemberLevelDO level) {
302 //todo: 给会员发消息 295 //todo: 给会员发消息
303 } 296 }
  297 +
304 } 298 }
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/point/MemberPointRecordServiceImpl.java
@@ -72,22 +72,22 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService { @@ -72,22 +72,22 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService {
72 public void createPointRecord(Long userId, Integer point, MemberPointBizTypeEnum bizType, String bizId) { 72 public void createPointRecord(Long userId, Integer point, MemberPointBizTypeEnum bizType, String bizId) {
73 MemberPointConfigDO pointConfig = memberPointConfigService.getPointConfig(); 73 MemberPointConfigDO pointConfig = memberPointConfigService.getPointConfig();
74 if (pointConfig == null || pointConfig.getTradeGivePoint() == null) { 74 if (pointConfig == null || pointConfig.getTradeGivePoint() == null) {
75 - log.warn("增加积分失败:积分配置”1 元赠送多少分“未设置, userId={}, point={}, bizType={}, bizId={}", 75 + log.error("[createPointRecord][增加积分失败:tradeGivePoint 未配置,userId({}) point({}) bizType({}) bizId({})]",
76 userId, point, bizType.getType(), bizId); 76 userId, point, bizType.getType(), bizId);
77 return; 77 return;
78 } 78 }
79 79
80 - // 根据配置的比例,换算实际的积分 80 + // 1. 根据配置的比例,换算实际的积分
81 point = point * pointConfig.getTradeGivePoint(); 81 point = point * pointConfig.getTradeGivePoint();
82 if (bizType.isReduce() && point > 0) { 82 if (bizType.isReduce() && point > 0) {
83 point = -point; 83 point = -point;
84 } 84 }
85 85
  86 + // 2. 增加积分记录
86 MemberUserDO user = memberUserService.getUser(userId); 87 MemberUserDO user = memberUserService.getUser(userId);
87 Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0); 88 Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0);
88 - // 用户变动后的积分,防止扣出负数 89 + // 用户变动后的积分,防止扣出负数 TODO 疯狂:积分是不是允许扣到负数。因为它是跟有钱有关的东西,不能让商家出现资金损失
89 Integer totalPoint = NumberUtil.max(userPoint + point, 0); 90 Integer totalPoint = NumberUtil.max(userPoint + point, 0);
90 - // 增加积分记录  
91 MemberPointRecordDO recordDO = new MemberPointRecordDO() 91 MemberPointRecordDO recordDO = new MemberPointRecordDO()
92 .setUserId(userId) 92 .setUserId(userId)
93 .setBizId(bizId) 93 .setBizId(bizId)
@@ -98,7 +98,7 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService { @@ -98,7 +98,7 @@ public class MemberPointRecordServiceImpl implements MemberPointRecordService {
98 .setTotalPoint(totalPoint); 98 .setTotalPoint(totalPoint);
99 recordMapper.insert(recordDO); 99 recordMapper.insert(recordDO);
100 100
101 - // 更新用户积分 101 + // 3. 更新用户积分
102 memberUserService.updateUserPoint(userId, totalPoint); 102 memberUserService.updateUserPoint(userId, totalPoint);
103 } 103 }
104 104
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java
@@ -162,7 +162,7 @@ public interface MemberUserService { @@ -162,7 +162,7 @@ public interface MemberUserService {
162 /** 162 /**
163 * 更新用户的积分 163 * 更新用户的积分
164 * 164 *
165 - * @param userId 用户ID 165 + * @param userId 用户编号
166 * @param point 积分数量 166 * @param point 积分数量
167 */ 167 */
168 void updateUserPoint(Long userId, Integer point); 168 void updateUserPoint(Long userId, Integer point);