Commit 7fdd36d97978be36d0ea45dcb5e840b1cf76c865

Authored by owen
1 parent 0c1f5c95

Review代码修改

Showing 10 changed files with 67 additions and 44 deletions
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/mq/consumer/coupon/RegisterCouponSendConsumer.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/mq/consumer/coupon/UserCreateConsumer.java
1 package cn.iocoder.yudao.module.promotion.mq.consumer.coupon; 1 package cn.iocoder.yudao.module.promotion.mq.consumer.coupon;
2 2
3 import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener; 3 import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener;
4 -import cn.iocoder.yudao.module.member.mq.message.user.RegisterCouponSendMessage; 4 +import cn.iocoder.yudao.module.promotion.mq.message.coupon.UserCreateMessage;
5 import cn.iocoder.yudao.module.promotion.service.coupon.CouponService; 5 import cn.iocoder.yudao.module.promotion.service.coupon.CouponService;
6 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
7 import org.springframework.stereotype.Component; 7 import org.springframework.stereotype.Component;
@@ -9,19 +9,19 @@ import org.springframework.stereotype.Component; @@ -9,19 +9,19 @@ import org.springframework.stereotype.Component;
9 import javax.annotation.Resource; 9 import javax.annotation.Resource;
10 10
11 /** 11 /**
12 - * 针对 {@link RegisterCouponSendMessage} 的消费者 12 + * 针对 {@link UserCreateMessage} 的消费者
13 * 13 *
14 * @author owen 14 * @author owen
15 */ 15 */
16 @Component 16 @Component
17 @Slf4j 17 @Slf4j
18 -public class RegisterCouponSendConsumer extends AbstractStreamMessageListener<RegisterCouponSendMessage> { 18 +public class UserCreateConsumer extends AbstractStreamMessageListener<UserCreateMessage> {
19 19
20 @Resource 20 @Resource
21 private CouponService couponService; 21 private CouponService couponService;
22 22
23 @Override 23 @Override
24 - public void onMessage(RegisterCouponSendMessage message) { 24 + public void onMessage(UserCreateMessage message) {
25 log.info("[onMessage][消息内容({})]", message); 25 log.info("[onMessage][消息内容({})]", message);
26 couponService.takeCouponByRegister(message.getUserId()); 26 couponService.takeCouponByRegister(message.getUserId());
27 } 27 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/mq/message/coupon/UserCreateMessage.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.mq.message.coupon;
  2 +
  3 +import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessage;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +
  7 +import javax.validation.constraints.NotNull;
  8 +
  9 +/**
  10 + * 会员用户创建消息
  11 + *
  12 + * @author owen
  13 + */
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +public class UserCreateMessage extends AbstractStreamMessage {
  17 +
  18 + /**
  19 + * 用户编号
  20 + */
  21 + @NotNull(message = "用户编号不能为空")
  22 + private Long userId;
  23 +
  24 + @Override
  25 + public String getStreamKey() {
  26 + return "member.create.send";
  27 + }
  28 +
  29 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java
@@ -178,7 +178,7 @@ public class CouponServiceImpl implements CouponService { @@ -178,7 +178,7 @@ public class CouponServiceImpl implements CouponService {
178 } 178 }
179 179
180 @Override 180 @Override
181 - // TODO @疯狂:搞个事务; 181 + @Transactional(rollbackFor = Exception.class)
182 public void takeCouponByRegister(Long userId) { 182 public void takeCouponByRegister(Long userId) {
183 List<CouponTemplateDO> templates = couponTemplateService.getCouponTemplateListByTakeType(CouponTakeTypeEnum.REGISTER); 183 List<CouponTemplateDO> templates = couponTemplateService.getCouponTemplateListByTakeType(CouponTakeTypeEnum.REGISTER);
184 for (CouponTemplateDO template : templates) { 184 for (CouponTemplateDO template : templates) {
yudao-module-member/yudao-module-member-api/pom.xml
@@ -22,13 +22,6 @@ @@ -22,13 +22,6 @@
22 <artifactId>yudao-common</artifactId> 22 <artifactId>yudao-common</artifactId>
23 </dependency> 23 </dependency>
24 24
25 - <!-- TODO @疯狂:biz 引入哈;api 保持低依赖 -->  
26 - <dependency>  
27 - <groupId>cn.iocoder.boot</groupId>  
28 - <artifactId>yudao-spring-boot-starter-mq</artifactId>  
29 - <scope>compile</scope>  
30 - </dependency>  
31 -  
32 <!-- 参数校验 --> 25 <!-- 参数校验 -->
33 <dependency> 26 <dependency>
34 <groupId>org.springframework.boot</groupId> 27 <groupId>org.springframework.boot</groupId>
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java
@@ -38,11 +38,9 @@ public interface ErrorCodeConstants { @@ -38,11 +38,9 @@ public interface ErrorCodeConstants {
38 //========== 签到配置 1-004-009-000 ========== 38 //========== 签到配置 1-004-009-000 ==========
39 ErrorCode SIGN_IN_CONFIG_NOT_EXISTS = new ErrorCode(1_004_009_000, "签到天数规则不存在"); 39 ErrorCode SIGN_IN_CONFIG_NOT_EXISTS = new ErrorCode(1_004_009_000, "签到天数规则不存在");
40 ErrorCode SIGN_IN_CONFIG_EXISTS = new ErrorCode(1_004_009_001, "签到天数规则已存在"); 40 ErrorCode SIGN_IN_CONFIG_EXISTS = new ErrorCode(1_004_009_001, "签到天数规则已存在");
41 - // TODO @疯狂:这个可以用 validator 去做;通过在 BaseVO 里,增加一个 @AssertTrue 注解的方式  
42 - ErrorCode SIGN_IN_CONFIG_AWARD_EMPTY = new ErrorCode(1_004_009_002, "签到奖励积分和经验不能同时为空");  
43 41
44 //========== 签到配置 1-004-010-000 ========== 42 //========== 签到配置 1-004-010-000 ==========
45 - ErrorCode SIGN_IN_RECORD_TODAY_EXISTS = new ErrorCode(1_004_010_000,"今日已签到,请勿重复签到"); 43 + ErrorCode SIGN_IN_RECORD_TODAY_EXISTS = new ErrorCode(1_004_010_000, "今日已签到,请勿重复签到");
46 44
47 //========== 用户等级 1-004-011-000 ========== 45 //========== 用户等级 1-004-011-000 ==========
48 ErrorCode LEVEL_NOT_EXISTS = new ErrorCode(1_004_011_000, "用户等级不存在"); 46 ErrorCode LEVEL_NOT_EXISTS = new ErrorCode(1_004_011_000, "用户等级不存在");
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/vo/config/MemberSignInConfigBaseVO.java
1 package cn.iocoder.yudao.module.member.controller.admin.signin.vo.config; 1 package cn.iocoder.yudao.module.member.controller.admin.signin.vo.config;
2 2
  3 +import cn.hutool.core.util.ObjUtil;
3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.common.validation.InEnum; 5 import cn.iocoder.yudao.framework.common.validation.InEnum;
  6 +import com.fasterxml.jackson.annotation.JsonIgnore;
5 import io.swagger.v3.oas.annotations.media.Schema; 7 import io.swagger.v3.oas.annotations.media.Schema;
6 import lombok.Data; 8 import lombok.Data;
7 9
  10 +import javax.validation.constraints.AssertTrue;
8 import javax.validation.constraints.NotNull; 11 import javax.validation.constraints.NotNull;
9 import javax.validation.constraints.PositiveOrZero; 12 import javax.validation.constraints.PositiveOrZero;
10 13
@@ -34,4 +37,9 @@ public class MemberSignInConfigBaseVO { @@ -34,4 +37,9 @@ public class MemberSignInConfigBaseVO {
34 @InEnum(CommonStatusEnum.class) 37 @InEnum(CommonStatusEnum.class)
35 private Integer status; 38 private Integer status;
36 39
  40 + @AssertTrue(message = "签到奖励积分和经验不能同时为空")
  41 + @JsonIgnore
  42 + public boolean isConfigAward() {
  43 + return ObjUtil.notEqual(point, 0) || ObjUtil.notEqual(experience, 0);
  44 + }
37 } 45 }
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/mq/message/user/RegisterCouponSendMessage.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/mq/message/user/UserCreateMessage.java
@@ -7,13 +7,13 @@ import lombok.EqualsAndHashCode; @@ -7,13 +7,13 @@ import lombok.EqualsAndHashCode;
7 import javax.validation.constraints.NotNull; 7 import javax.validation.constraints.NotNull;
8 8
9 /** 9 /**
10 - * 新人券发放消息 10 + * 会员用户创建消息
11 * 11 *
12 * @author owen 12 * @author owen
13 */ 13 */
14 @Data 14 @Data
15 @EqualsAndHashCode(callSuper = true) 15 @EqualsAndHashCode(callSuper = true)
16 -public class RegisterCouponSendMessage extends AbstractStreamMessage { 16 +public class UserCreateMessage extends AbstractStreamMessage {
17 17
18 /** 18 /**
19 * 用户编号 19 * 用户编号
@@ -23,7 +23,7 @@ public class RegisterCouponSendMessage extends AbstractStreamMessage { @@ -23,7 +23,7 @@ public class RegisterCouponSendMessage extends AbstractStreamMessage {
23 23
24 @Override 24 @Override
25 public String getStreamKey() { 25 public String getStreamKey() {
26 - return "member.register-coupon.send"; 26 + return "member.create.send";
27 } 27 }
28 28
29 } 29 }
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/mq/producer/user/RegisterCouponProducer.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/mq/producer/user/UserCreateProducer.java
1 package cn.iocoder.yudao.module.member.mq.producer.user; 1 package cn.iocoder.yudao.module.member.mq.producer.user;
2 2
3 import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate; 3 import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
4 -import cn.iocoder.yudao.module.member.mq.message.user.RegisterCouponSendMessage; 4 +import cn.iocoder.yudao.module.member.mq.message.user.UserCreateMessage;
5 import lombok.extern.slf4j.Slf4j; 5 import lombok.extern.slf4j.Slf4j;
6 import org.springframework.stereotype.Component; 6 import org.springframework.stereotype.Component;
7 7
8 import javax.annotation.Resource; 8 import javax.annotation.Resource;
9 9
10 -// TODO @疯狂:发 UserCreateMessage;解耦,然后优惠劵监听到,去发卷;  
11 /** 10 /**
12 - * 新人券发放 Producer 11 + * 会员用户创建 Producer
13 * 12 *
14 * @author owen 13 * @author owen
15 */ 14 */
16 @Slf4j 15 @Slf4j
17 @Component 16 @Component
18 -public class RegisterCouponProducer { 17 +public class UserCreateProducer {
19 18
20 @Resource 19 @Resource
21 private RedisMQTemplate redisMQTemplate; 20 private RedisMQTemplate redisMQTemplate;
22 21
23 /** 22 /**
24 - * 发送 {@link RegisterCouponSendMessage} 消息 23 + * 发送 {@link UserCreateMessage} 消息
25 * 24 *
26 * @param userId 用户编号 25 * @param userId 用户编号
27 */ 26 */
28 - public void sendMailSendMessage(Long userId) {  
29 - redisMQTemplate.send(new RegisterCouponSendMessage().setUserId(userId)); 27 + public void sendUserCreateMessage(Long userId) {
  28 + redisMQTemplate.send(new UserCreateMessage().setUserId(userId));
30 } 29 }
31 30
32 } 31 }
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/signin/MemberSignInConfigServiceImpl.java
@@ -11,10 +11,10 @@ import org.springframework.validation.annotation.Validated; @@ -11,10 +11,10 @@ import org.springframework.validation.annotation.Validated;
11 import javax.annotation.Resource; 11 import javax.annotation.Resource;
12 import java.util.Comparator; 12 import java.util.Comparator;
13 import java.util.List; 13 import java.util.List;
14 -import java.util.Objects;  
15 14
16 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 15 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
17 -import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*; 16 +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.SIGN_IN_CONFIG_EXISTS;
  17 +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.SIGN_IN_CONFIG_NOT_EXISTS;
18 18
19 /** 19 /**
20 * 签到规则 Service 实现类 20 * 签到规则 Service 实现类
@@ -30,8 +30,6 @@ public class MemberSignInConfigServiceImpl implements MemberSignInConfigService @@ -30,8 +30,6 @@ public class MemberSignInConfigServiceImpl implements MemberSignInConfigService
30 30
31 @Override 31 @Override
32 public Long createSignInConfig(MemberSignInConfigCreateReqVO createReqVO) { 32 public Long createSignInConfig(MemberSignInConfigCreateReqVO createReqVO) {
33 - // 校验奖励积分、奖励经验  
34 - validatePointAndExperience(createReqVO.getPoint(), createReqVO.getExperience());  
35 // 判断是否重复插入签到天数 33 // 判断是否重复插入签到天数
36 validateSignInConfigDayDuplicate(createReqVO.getDay(), null); 34 validateSignInConfigDayDuplicate(createReqVO.getDay(), null);
37 35
@@ -44,8 +42,6 @@ public class MemberSignInConfigServiceImpl implements MemberSignInConfigService @@ -44,8 +42,6 @@ public class MemberSignInConfigServiceImpl implements MemberSignInConfigService
44 42
45 @Override 43 @Override
46 public void updateSignInConfig(MemberSignInConfigUpdateReqVO updateReqVO) { 44 public void updateSignInConfig(MemberSignInConfigUpdateReqVO updateReqVO) {
47 - // 校验奖励积分、奖励经验  
48 - validatePointAndExperience(updateReqVO.getPoint(), updateReqVO.getExperience());  
49 // 校验存在 45 // 校验存在
50 validateSignInConfigExists(updateReqVO.getId()); 46 validateSignInConfigExists(updateReqVO.getId());
51 // 判断是否重复插入签到天数 47 // 判断是否重复插入签到天数
@@ -88,13 +84,6 @@ public class MemberSignInConfigServiceImpl implements MemberSignInConfigService @@ -88,13 +84,6 @@ public class MemberSignInConfigServiceImpl implements MemberSignInConfigService
88 } 84 }
89 } 85 }
90 86
91 - private void validatePointAndExperience(Integer point, Integer experience) {  
92 - // 奖励积分、经验 至少要配置一个,否则没有意义  
93 - if (Objects.equals(point, 0) && Objects.equals(experience, 0)) {  
94 - throw exception(SIGN_IN_CONFIG_AWARD_EMPTY);  
95 - }  
96 - }  
97 -  
98 @Override 87 @Override
99 public MemberSignInConfigDO getSignInConfig(Long id) { 88 public MemberSignInConfigDO getSignInConfig(Long id) {
100 return memberSignInConfigMapper.selectById(id); 89 return memberSignInConfigMapper.selectById(id);
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.member.service.user; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.member.service.user;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.ListUtil; 4 import cn.hutool.core.collection.ListUtil;
  5 +import cn.hutool.core.util.BooleanUtil;
5 import cn.hutool.core.util.IdUtil; 6 import cn.hutool.core.util.IdUtil;
6 import cn.hutool.core.util.ObjectUtil; 7 import cn.hutool.core.util.ObjectUtil;
7 import cn.hutool.core.util.StrUtil; 8 import cn.hutool.core.util.StrUtil;
@@ -18,7 +19,7 @@ import cn.iocoder.yudao.module.member.convert.auth.AuthConvert; @@ -18,7 +19,7 @@ import cn.iocoder.yudao.module.member.convert.auth.AuthConvert;
18 import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert; 19 import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
19 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; 20 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
20 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; 21 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
21 -import cn.iocoder.yudao.module.member.mq.producer.user.RegisterCouponProducer; 22 +import cn.iocoder.yudao.module.member.mq.producer.user.UserCreateProducer;
22 import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; 23 import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
23 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; 24 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
24 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; 25 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
@@ -27,6 +28,7 @@ import lombok.extern.slf4j.Slf4j; @@ -27,6 +28,7 @@ import lombok.extern.slf4j.Slf4j;
27 import org.springframework.security.crypto.password.PasswordEncoder; 28 import org.springframework.security.crypto.password.PasswordEncoder;
28 import org.springframework.stereotype.Service; 29 import org.springframework.stereotype.Service;
29 import org.springframework.transaction.annotation.Transactional; 30 import org.springframework.transaction.annotation.Transactional;
  31 +import org.springframework.transaction.support.TransactionTemplate;
30 32
31 import javax.annotation.Resource; 33 import javax.annotation.Resource;
32 import javax.validation.Valid; 34 import javax.validation.Valid;
@@ -60,7 +62,10 @@ public class MemberUserServiceImpl implements MemberUserService { @@ -60,7 +62,10 @@ public class MemberUserServiceImpl implements MemberUserService {
60 private PasswordEncoder passwordEncoder; 62 private PasswordEncoder passwordEncoder;
61 63
62 @Resource 64 @Resource
63 - private RegisterCouponProducer registerCouponProducer; 65 + private UserCreateProducer registerCouponProducer;
  66 +
  67 + @Resource
  68 + private TransactionTemplate transactionTemplate;
64 69
65 @Override 70 @Override
66 public MemberUserDO getUserByMobile(String mobile) { 71 public MemberUserDO getUserByMobile(String mobile) {
@@ -92,11 +97,13 @@ public class MemberUserServiceImpl implements MemberUserService { @@ -92,11 +97,13 @@ public class MemberUserServiceImpl implements MemberUserService {
92 user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启 97 user.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 默认开启
93 user.setPassword(encodePassword(password)); // 加密密码 98 user.setPassword(encodePassword(password)); // 加密密码
94 user.setRegisterIp(registerIp); 99 user.setRegisterIp(registerIp);
95 - memberUserMapper.insert(user);  
96 100
97 - // 发送 MQ 消息,发放新人券  
98 - // TODO @疯狂:事务结束后,在发送 MQ 消息;避免出现消息已经发了,事务没提交,或者回滚了  
99 - registerCouponProducer.sendMailSendMessage(user.getId()); 101 + Boolean success = transactionTemplate.execute(status -> memberUserMapper.insert(user) > 0);
  102 + if (BooleanUtil.isTrue(success)) {
  103 + // 发送 MQ 消息:用户创建
  104 + registerCouponProducer.sendUserCreateMessage(user.getId());
  105 + }
  106 +
100 return user; 107 return user;
101 } 108 }
102 109