Commit fc432ba073485be7a292557dd8fe1bd492bfae90

Authored by owen
1 parent 497ea2ee

优惠券:新人券使用 MQ 发放

yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/coupon/CouponTemplateMapper.java
... ... @@ -12,6 +12,7 @@ import org.apache.ibatis.annotations.Mapper;
12 12 import org.apache.ibatis.annotations.Param;
13 13  
14 14 import java.time.LocalDateTime;
  15 +import java.util.List;
15 16 import java.util.function.Consumer;
16 17  
17 18 /**
... ... @@ -48,4 +49,7 @@ public interface CouponTemplateMapper extends BaseMapperX<CouponTemplateDO> {
48 49  
49 50 void updateTakeCount(@Param("id") Long id, @Param("incrCount") Integer incrCount);
50 51  
  52 + default List<CouponTemplateDO> selectListByTakeType(Integer takeType) {
  53 + return selectList(CouponTemplateDO::getTakeType, takeType);
  54 + }
51 55 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/mq/consumer/coupon/RegisterCouponSendConsumer.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.mq.consumer.coupon;
  2 +
  3 +import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessageListener;
  4 +import cn.iocoder.yudao.module.member.mq.message.user.RegisterCouponSendMessage;
  5 +import cn.iocoder.yudao.module.promotion.service.coupon.CouponService;
  6 +import lombok.extern.slf4j.Slf4j;
  7 +import org.springframework.stereotype.Component;
  8 +
  9 +import javax.annotation.Resource;
  10 +
  11 +/**
  12 + * 针对 {@link RegisterCouponSendMessage} 的消费者
  13 + *
  14 + * @author owen
  15 + */
  16 +@Component
  17 +@Slf4j
  18 +public class RegisterCouponSendConsumer extends AbstractStreamMessageListener<RegisterCouponSendMessage> {
  19 +
  20 + @Resource
  21 + private CouponService couponService;
  22 +
  23 + @Override
  24 + public void onMessage(RegisterCouponSendMessage message) {
  25 + log.info("[onMessage][消息内容({})]", message);
  26 + couponService.takeCouponByRegister(message.getUserId());
  27 + }
  28 +
  29 +}
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponService.java
... ... @@ -119,12 +119,9 @@ public interface CouponService {
119 119 /**
120 120 * 【系统】给用户发送新人券
121 121 *
122   - * @param templateId 优惠券模板编号
123   - * @param userId 用户编号列表
  122 + * @param userId 用户编号
124 123 */
125   - default void takeCouponByRegister(Long templateId, Long userId) {
126   - takeCoupon(templateId, CollUtil.newHashSet(userId), CouponTakeTypeEnum.REGISTER);
127   - }
  124 + void takeCouponByRegister(Long userId);
128 125  
129 126 /**
130 127 * 获取会员领取指定优惠券的数量
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponServiceImpl.java
... ... @@ -40,7 +40,6 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
40 40 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
41 41 import static java.util.Arrays.asList;
42 42  
43   -// TODO @疯狂:注册时,赠送用户优惠劵;为了解耦,可以考虑注册时发个 MQ 消息;然后营销这里监听后消费;
44 43 /**
45 44 * 优惠劵 Service 实现类
46 45 *
... ... @@ -184,6 +183,14 @@ public class CouponServiceImpl implements CouponService {
184 183 }
185 184  
186 185 @Override
  186 + public void takeCouponByRegister(Long userId) {
  187 + List<CouponTemplateDO> templates = couponTemplateService.getCouponTemplateByTakeType(CouponTakeTypeEnum.REGISTER);
  188 + for (CouponTemplateDO template : templates) {
  189 + takeCoupon(template.getId(), CollUtil.newHashSet(userId), CouponTakeTypeEnum.REGISTER);
  190 + }
  191 + }
  192 +
  193 + @Override
187 194 public List<CouponTakeCountBO> getTakeCountListByTemplateIds(Collection<Long> templateIds, Long userId) {
188 195 if (CollUtil.isEmpty(templateIds)) {
189 196 return ListUtil.empty();
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponTemplateService.java
... ... @@ -5,8 +5,10 @@ import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template.Cou
5 5 import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template.CouponTemplatePageReqVO;
6 6 import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template.CouponTemplateUpdateReqVO;
7 7 import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponTemplateDO;
  8 +import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTakeTypeEnum;
8 9  
9 10 import javax.validation.Valid;
  11 +import java.util.List;
10 12  
11 13 /**
12 14 * 优惠劵模板 Service 接口
... ... @@ -69,4 +71,11 @@ public interface CouponTemplateService {
69 71 */
70 72 void updateCouponTemplateTakeCount(Long id, int incrCount);
71 73  
  74 + /**
  75 + * 获得指定领取方式的优惠券模板
  76 + *
  77 + * @param takeType 领取方式
  78 + * @return 优惠券模板列表
  79 + */
  80 + List<CouponTemplateDO> getCouponTemplateByTakeType(CouponTakeTypeEnum takeType);
72 81 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/coupon/CouponTemplateServiceImpl.java
... ... @@ -8,11 +8,14 @@ import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.template.Cou
8 8 import cn.iocoder.yudao.module.promotion.convert.coupon.CouponTemplateConvert;
9 9 import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponTemplateDO;
10 10 import cn.iocoder.yudao.module.promotion.dal.mysql.coupon.CouponTemplateMapper;
  11 +import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTakeTypeEnum;
11 12 import org.springframework.stereotype.Service;
12 13 import org.springframework.validation.annotation.Validated;
13 14  
14 15 import javax.annotation.Resource;
15 16  
  17 +import java.util.List;
  18 +
16 19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
17 20 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_TEMPLATE_NOT_EXISTS;
18 21 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COUPON_TEMPLATE_TOTAL_COUNT_TOO_SMALL;
... ... @@ -93,4 +96,9 @@ public class CouponTemplateServiceImpl implements CouponTemplateService {
93 96 couponTemplateMapper.updateTakeCount(id, incrCount);
94 97 }
95 98  
  99 + @Override
  100 + public List<CouponTemplateDO> getCouponTemplateByTakeType(CouponTakeTypeEnum takeType) {
  101 + return couponTemplateMapper.selectListByTakeType(takeType.getValue());
  102 + }
  103 +
96 104 }
... ...
yudao-module-member/yudao-module-member-api/pom.xml
... ... @@ -22,6 +22,11 @@
22 22 <artifactId>yudao-common</artifactId>
23 23 </dependency>
24 24  
  25 + <dependency>
  26 + <groupId>cn.iocoder.boot</groupId>
  27 + <artifactId>yudao-spring-boot-starter-mq</artifactId>
  28 + <scope>compile</scope>
  29 + </dependency>
25 30 <!-- 参数校验 -->
26 31 <dependency>
27 32 <groupId>org.springframework.boot</groupId>
... ...
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/mq/message/user/RegisterCouponSendMessage.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.mq.message.user;
  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 RegisterCouponSendMessage extends AbstractStreamMessage {
  17 +
  18 + /**
  19 + * 用户编号
  20 + */
  21 + @NotNull(message = "用户编号不能为空")
  22 + private Long userId;
  23 +
  24 + @Override
  25 + public String getStreamKey() {
  26 + return "member.register-coupon.send";
  27 + }
  28 +
  29 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/mq/producer/user/RegisterCouponProducer.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.mq.producer.user;
  2 +
  3 +import cn.iocoder.yudao.framework.mq.core.RedisMQTemplate;
  4 +import cn.iocoder.yudao.module.member.mq.message.user.RegisterCouponSendMessage;
  5 +import lombok.extern.slf4j.Slf4j;
  6 +import org.springframework.stereotype.Component;
  7 +
  8 +import javax.annotation.Resource;
  9 +
  10 +/**
  11 + * 新人券发放 Producer
  12 + *
  13 + * @author owen
  14 + */
  15 +@Slf4j
  16 +@Component
  17 +public class RegisterCouponProducer {
  18 +
  19 + @Resource
  20 + private RedisMQTemplate redisMQTemplate;
  21 +
  22 + /**
  23 + * 发送 {@link RegisterCouponSendMessage} 消息
  24 + *
  25 + * @param userId 用户编号
  26 + */
  27 + public void sendMailSendMessage(Long userId) {
  28 + redisMQTemplate.send(new RegisterCouponSendMessage().setUserId(userId));
  29 + }
  30 +
  31 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java
... ... @@ -18,6 +18,7 @@ import cn.iocoder.yudao.module.member.convert.auth.AuthConvert;
18 18 import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
19 19 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
20 20 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
  21 +import cn.iocoder.yudao.module.member.mq.producer.user.RegisterCouponProducer;
21 22 import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
22 23 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
23 24 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
... ... @@ -58,6 +59,9 @@ public class MemberUserServiceImpl implements MemberUserService {
58 59 @Resource
59 60 private PasswordEncoder passwordEncoder;
60 61  
  62 + @Resource
  63 + private RegisterCouponProducer registerCouponProducer;
  64 +
61 65 @Override
62 66 public MemberUserDO getUserByMobile(String mobile) {
63 67 return memberUserMapper.selectByMobile(mobile);
... ... @@ -89,6 +93,9 @@ public class MemberUserServiceImpl implements MemberUserService {
89 93 user.setPassword(encodePassword(password)); // 加密密码
90 94 user.setRegisterIp(registerIp);
91 95 memberUserMapper.insert(user);
  96 +
  97 + // 发送 MQ 消息,发放新人券
  98 + registerCouponProducer.sendMailSendMessage(user.getId());
92 99 return user;
93 100 }
94 101  
... ...