From 1fce66590068a3ecbcfc320697eca93aa9d5f705 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Thu, 2 Jan 2025 14:10:59 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E4=BC=9A=E5=91=98=E4=B8=AD?= =?UTF-8?q?=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mcwl/McWlApplication.java | 9 ++ .../myInvitation/ConsumeController.java | 12 +- .../myInvitation/InvitationController.java | 3 + .../rabbitmq/config/CodeMQConfig.java | 11 ++ mcwl-admin/src/main/resources/application.yml | 2 + .../com/mcwl/memberCenter/MemberTest.java | 34 ++++++ .../mcwl/common/constant/QueueConstants.java | 11 ++ .../mcwl/common/core/domain/BaseEntity.java | 4 + .../java/com/mcwl/common/domain/IdsParam.java | 8 ++ .../com/mcwl/common/utils/ShareCodeUtils.java | 101 ++++++++++++++++ mcwl-memberCenter/pom.xml | 12 ++ .../consumer/EmptyPointsRemindConsumer.java | 40 +++++++ .../com/mcwl/memberCenter/domain/Member.java | 17 ++- .../mcwl/memberCenter/domain/UserMember.java | 5 +- .../mcwl/memberCenter/enums/MemberMenu.java | 2 + .../service/UserMemberService.java | 10 ++ .../service/impl/UserMemberServiceImpl.java | 99 ++++++++++++++++ .../memberCenter/task/UserMemberTask.java | 109 ++++++++++++++++++ .../mcwl/myInvitation/domain/Commission.java | 3 + .../com/mcwl/myInvitation/domain/Consume.java | 3 + .../mcwl/myInvitation/domain/Invitation.java | 3 + .../service/impl/InvitationServiceImpl.java | 5 +- 22 files changed, 493 insertions(+), 10 deletions(-) create mode 100644 mcwl-common/src/main/java/com/mcwl/common/domain/IdsParam.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/utils/ShareCodeUtils.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/consumer/EmptyPointsRemindConsumer.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/task/UserMemberTask.java diff --git a/mcwl-admin/src/main/java/com/mcwl/McWlApplication.java b/mcwl-admin/src/main/java/com/mcwl/McWlApplication.java index 4dd82af..5ac0012 100644 --- a/mcwl-admin/src/main/java/com/mcwl/McWlApplication.java +++ b/mcwl-admin/src/main/java/com/mcwl/McWlApplication.java @@ -1,9 +1,12 @@ package com.mcwl; +import com.fasterxml.jackson.databind.SerializationFeature; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.context.annotation.Bean; /** * 启动程序 @@ -28,4 +31,10 @@ public class McWlApplication " | | \\ / \\ / \n" + " ''-' `'-' `-..-' "); } + + // 序列化枚举值为前端返回值 + @Bean + public Jackson2ObjectMapperBuilderCustomizer customizer() { + return builder -> builder.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + } } diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/ConsumeController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/ConsumeController.java index dbec591..d6e54dd 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/ConsumeController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/ConsumeController.java @@ -1,13 +1,21 @@ package com.mcwl.web.controller.myInvitation; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.mcwl.common.annotation.Anonymous; +import com.mcwl.common.domain.IdsParam; +import org.springframework.web.bind.annotation.*; @RestController() @RequestMapping("/consume") public class ConsumeController { + @PostMapping() + @Anonymous + public void removeByIds(@RequestBody IdsParam ids){ + System.out.println(ids); + + } + diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java index 1d09926..c09cf2a 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java @@ -27,6 +27,9 @@ public class InvitationController { public AjaxResult getInvitationCode() { // 获取当前用户 Long userId = SecurityUtils.getUserId(); + if (userId == null) { + return AjaxResult.warn("用户未登录"); + } String invitationCode = invitationService.getInvitationCode(userId); return success("操作成功", invitationCode); } diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/rabbitmq/config/CodeMQConfig.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/rabbitmq/config/CodeMQConfig.java index 1c6ac0e..7939ce9 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/rabbitmq/config/CodeMQConfig.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/rabbitmq/config/CodeMQConfig.java @@ -20,4 +20,15 @@ public class CodeMQConfig { public Queue queue() { return new Queue(QueueConstants.CODE_QUEUE, true); } + + @Bean + public Queue emptyPointsRemindQueue() { + return new Queue(QueueConstants.EMPTY_POINTS_REMIND_QUEUE, true); + } + + @Bean + public Queue memberBillingQueue() { + return new Queue(QueueConstants.MEMBER_BILLING_QUEUE, true); + } + } diff --git a/mcwl-admin/src/main/resources/application.yml b/mcwl-admin/src/main/resources/application.yml index 4988aad..7196b61 100644 --- a/mcwl-admin/src/main/resources/application.yml +++ b/mcwl-admin/src/main/resources/application.yml @@ -121,6 +121,8 @@ mybatis-plus: # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl logImpl: org.apache.ibatis.logging.slf4j.Slf4jImpl + # 枚举处理器 + default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler global-config: # 是否打印 Logo banner banner: false diff --git a/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberTest.java b/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberTest.java index 88b9416..8b12b1d 100644 --- a/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberTest.java +++ b/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberTest.java @@ -1,7 +1,12 @@ package com.mcwl.memberCenter; import com.mcwl.McWlApplication; +import com.mcwl.common.utils.ShareCodeUtils; +import com.mcwl.memberCenter.consumer.EmptyPointsRemindConsumer; +import com.mcwl.memberCenter.domain.UserMember; import com.mcwl.memberCenter.service.MemberService; +import com.mcwl.memberCenter.service.UserMemberService; +import com.mcwl.memberCenter.task.UserMemberTask; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -16,6 +21,35 @@ public class MemberTest { @Autowired private MemberService memberService; + @Autowired + private UserMemberService userMemberService; + + @Autowired + private UserMemberTask userMemberTask; + + @Autowired + private EmptyPointsRemindConsumer emptyPointsRemindConsumer; + @Test + public void createUserMember() { + System.out.println(userMemberService.createUserMember(1L, 1013L, "wechat")); + } + + @Test + public void emptyPointsTaskTest() { + userMemberTask.emptyPointsTsk(); + } + + @Test + public void updateSubscriptionStatusTaskTest() { + userMemberTask.updateSubscriptionStatusTask(); + } + + @Test + public void emptyPointsRemindTaskTst() { + + userMemberTask.emptyPointsRemindTask(); + } + @Test public void memberServiceTest() { System.out.println(memberService.list()); diff --git a/mcwl-common/src/main/java/com/mcwl/common/constant/QueueConstants.java b/mcwl-common/src/main/java/com/mcwl/common/constant/QueueConstants.java index f1449ed..4b3b90d 100644 --- a/mcwl-common/src/main/java/com/mcwl/common/constant/QueueConstants.java +++ b/mcwl-common/src/main/java/com/mcwl/common/constant/QueueConstants.java @@ -12,4 +12,15 @@ public class QueueConstants { //发送手机号验证码短信的mq队列 public static final String CODE_QUEUE = "codeQueue"; + + // 积分清零提醒队列 + public static final String EMPTY_POINTS_REMIND_QUEUE = "emptyPointsRemindQueue"; + + // 会员账单队列 + public static final String MEMBER_BILLING_QUEUE = "memberBillingQueue"; + + + + + } diff --git a/mcwl-common/src/main/java/com/mcwl/common/core/domain/BaseEntity.java b/mcwl-common/src/main/java/com/mcwl/common/core/domain/BaseEntity.java index 3b6064a..b3ab226 100644 --- a/mcwl-common/src/main/java/com/mcwl/common/core/domain/BaseEntity.java +++ b/mcwl-common/src/main/java/com/mcwl/common/core/domain/BaseEntity.java @@ -4,6 +4,8 @@ import java.io.Serializable; import java.util.Date; import java.util.HashMap; import java.util.Map; + +import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; @@ -19,6 +21,7 @@ public class BaseEntity implements Serializable /** 搜索值 */ @JsonIgnore + @TableField(exist = false) private String searchValue; /** 创建者 */ @@ -40,6 +43,7 @@ public class BaseEntity implements Serializable /** 请求参数 */ @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) private Map params; public String getSearchValue() diff --git a/mcwl-common/src/main/java/com/mcwl/common/domain/IdsParam.java b/mcwl-common/src/main/java/com/mcwl/common/domain/IdsParam.java new file mode 100644 index 0000000..213047f --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/domain/IdsParam.java @@ -0,0 +1,8 @@ +package com.mcwl.common.domain; + +import lombok.Data; + +@Data +public class IdsParam { + private Long[] ids; +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/utils/ShareCodeUtils.java b/mcwl-common/src/main/java/com/mcwl/common/utils/ShareCodeUtils.java new file mode 100644 index 0000000..8715c20 --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/utils/ShareCodeUtils.java @@ -0,0 +1,101 @@ +package com.mcwl.common.utils; + +/** + */ + +import java.util.Random; + +/** + * 邀请码生成器,基本原理:
+ * 1)入参用户ID:1
+ * 2)使用自定义进制转换之后为:V
+ * 3)转换未字符串,并在后面添加'A':VA
+ * 4)在VA后面再随机补足4位,得到:VAHKHE
+ * 5)反向转换时以'A'为分界线,'A'后面的不再解析
+ * + * @author zzs + */ +public class ShareCodeUtils { + /** + * 自定义进制(0,1没有加入,容易与o,l混淆),数组顺序可进行调整增加反推难度,A用来补位因此此数组不包含A,共31个字符。 + */ + private static final char[] BASE = new char[]{'H', 'V', 'E', '8', 'S', '2', 'D', 'Z', 'X', '9', 'C', '7', 'P', + '5', 'I', 'K', '3', 'M', 'J', 'U', 'F', 'R', '4', 'W', 'Y', 'L', 'T', 'N', '6', 'B', 'G', 'Q'}; + /** + * A补位字符,不能与自定义重复 + */ + private static final char SUFFIX_CHAR = 'A'; + /** + * 进制长度 + */ + private static final int BIN_LEN = BASE.length; + /** + * 生成邀请码最小长度 + */ + private static final int CODE_LEN = 8; + + /** + * ID转换为邀请码 + * + * @param id + * @return + */ + public static String idToCode(Long id) { + char[] buf = new char[BIN_LEN]; + int charPos = BIN_LEN; + // 当id除以数组长度结果大于0,则进行取模操作,并以取模的值作为数组的坐标获得对应的字符 + while (id / BIN_LEN > 0) { + int index = (int) (id % BIN_LEN); + buf[--charPos] = BASE[index]; + id /= BIN_LEN; + } + buf[--charPos] = BASE[(int) (id % BIN_LEN)]; + // 将字符数组转化为字符串 + String result = new String(buf, charPos, BIN_LEN - charPos); + // 长度不足指定长度则随机补全 + int len = result.length(); + if (len < CODE_LEN) { + StringBuilder sb = new StringBuilder(); + sb.append(SUFFIX_CHAR); + Random random = new Random(); + // 去除SUFFIX_CHAR本身占位之后需要补齐的位数 + for (int i = 0; i < CODE_LEN - len - 1; i++) { + sb.append(BASE[random.nextInt(BIN_LEN)]); + } + result += sb.toString(); + } + return result; + } + + /** + * 邀请码解析出ID
+ * 基本操作思路恰好与idToCode反向操作。 + * + * @param code + * @return + */ + public static Long codeToId(String code) { + char[] charArray = code.toCharArray(); + long result = 0L; + for (int i = 0; i < charArray.length; i++) { + int index = 0; + for (int j = 0; j < BIN_LEN; j++) { + if (charArray[i] == BASE[j]) { + index = j; + break; + } + } + if (charArray[i] == SUFFIX_CHAR) { + break; + } + if (i > 0) { + result = result * BIN_LEN + index; + } else { + result = index; + } + } + return result; + } + + +} diff --git a/mcwl-memberCenter/pom.xml b/mcwl-memberCenter/pom.xml index 4992997..fabd5b2 100644 --- a/mcwl-memberCenter/pom.xml +++ b/mcwl-memberCenter/pom.xml @@ -31,11 +31,23 @@ test + + com.mcwl + mcwl-system + + com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} + + + + org.springframework.boot + spring-boot-starter-amqp + 3.1.2 + \ No newline at end of file diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/consumer/EmptyPointsRemindConsumer.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/consumer/EmptyPointsRemindConsumer.java new file mode 100644 index 0000000..1d4bee4 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/consumer/EmptyPointsRemindConsumer.java @@ -0,0 +1,40 @@ +package com.mcwl.memberCenter.consumer; + +import com.mcwl.common.constant.QueueConstants; +import com.mcwl.memberCenter.domain.UserMember; +import com.mcwl.memberCenter.service.UserMemberService; +import com.mcwl.memberCenter.task.UserMemberTask; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + + +@Slf4j +@Component +@RequiredArgsConstructor +public class EmptyPointsRemindConsumer { + + private final UserMemberService userMemberService; + + @RabbitListener(queues = QueueConstants.EMPTY_POINTS_REMIND_QUEUE) + public void emptyPointsRemind(List userMemberList) { + // TODO 发送短信提醒用户积分即将清零 + log.info("消费者获取到积分清零提醒的数据:{}", userMemberList); + } + + + @RabbitListener(queues = QueueConstants.MEMBER_BILLING_QUEUE) + public void memberBillingQueue(UserMember userMember) { + // TODO 发送短信提醒用户会员账单,如果支付成功,更新last_payment_date,并重新计算end_date(start_date + 1个月) + log.info("消费者获取到会员账单的数据:{}", userMember); + } + + + + + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/Member.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/Member.java index 735803a..3ee9333 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/Member.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/Member.java @@ -17,17 +17,26 @@ public class Member extends BaseEntity { private Long id; // 会员类型 - private String member_type; + private String memberType; // 会员名称 - private String member_name; + private String memberName; // 会员价格 - private Double unit_price; + private Double unitPrice; // 会员原价 - private Double original_price; + private Double originalPrice; + + // 会员积分 + private Integer points; + + // 订阅周期(天) + private Integer subscriptionPeriod; // 删除标志(0代表存在 2代表删除) private String delFlag; + + // 备注 + private String remark; } diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/UserMember.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/UserMember.java index 6ec452f..7dca9ea 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/UserMember.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/UserMember.java @@ -13,7 +13,7 @@ import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) -@TableName("mem_member") +@TableName("mem_user_member") public class UserMember extends BaseEntity { @TableId @@ -56,4 +56,7 @@ public class UserMember extends BaseEntity { // 删除标志(0代表存在 2代表删除) private String delFlag; + // 备注 + private String remark; + } diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberMenu.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberMenu.java index aabb0f9..b127cc0 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberMenu.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberMenu.java @@ -1,5 +1,6 @@ package com.mcwl.memberCenter.enums; +import com.baomidou.mybatisplus.annotation.EnumValue; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,5 +14,6 @@ public enum MemberMenu { private final String name; + @EnumValue private final String value; } diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/UserMemberService.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/UserMemberService.java index c079952..9298702 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/UserMemberService.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/UserMemberService.java @@ -4,4 +4,14 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.mcwl.memberCenter.domain.UserMember; public interface UserMemberService extends IService { + + /** + * 创建用户会员 + * @param userId 用户id + * @param memberId 会员id + * @return 用户会员 + */ + UserMember createUserMember(Long userId, Long memberId, String paymentMethod); + + } diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/UserMemberServiceImpl.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/UserMemberServiceImpl.java index 2f9f891..5bd6436 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/UserMemberServiceImpl.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/UserMemberServiceImpl.java @@ -1,11 +1,110 @@ package com.mcwl.memberCenter.service.impl; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mcwl.common.core.domain.entity.SysUser; +import com.mcwl.common.exception.ServiceException; +import com.mcwl.common.utils.SecurityUtils; +import com.mcwl.memberCenter.domain.Member; import com.mcwl.memberCenter.domain.UserMember; +import com.mcwl.memberCenter.enums.MemberMenu; import com.mcwl.memberCenter.mapper.UserMemberMapper; +import com.mcwl.memberCenter.service.MemberService; import com.mcwl.memberCenter.service.UserMemberService; +import com.mcwl.system.service.ISysUserService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.*; + @Service +@RequiredArgsConstructor public class UserMemberServiceImpl extends ServiceImpl implements UserMemberService { + + private final MemberService memberService; + + private final ISysUserService sysUserService; + + + public void aaa() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + + Member member = new Member(); + memberService.update(lqw); + } + + @Override + public UserMember createUserMember(Long userId, Long memberId, String paymentMethod) { + if (userId == null) { + throw new ServiceException("用户不能为空"); + } + SysUser user = sysUserService.selectUserById(userId); + if (user == null) { + throw new ServiceException("用户不存在"); + } + if (memberId == null) { + throw new ServiceException("会员不能为空"); + } + Member member = memberService.getById(memberId); + if (member == null) { + throw new ServiceException("会员不存在"); + } + // 查询用户是否已经存在会员 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(UserMember::getUserId, userId) + // subscriptionStatus不为expired + .ne(UserMember::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_EXPIRED) + .orderBy(true, false, UserMember::getEndDate); + List userMemberList = baseMapper.selectList(lqw); + UserMember userMember = new UserMember(); + // 设置用户id + userMember.setUserId(userId); + // 设置会员id + userMember.setMemberId(memberId); + if (userMemberList != null && !userMemberList.isEmpty()) { + UserMember lastUserMember = userMemberList.get(0); + Date endDate = lastUserMember.getEndDate(); + // 设置会员开始时间和结束时间 + Date startDate = new Date(endDate.getTime() + 1000L * 60L * 60L * 24L); + userMember.setStartDate(startDate); + userMember.setEndDate(new Date(startDate.getTime() + member.getSubscriptionPeriod() * 1000L * 60L * 60L * 24L)); + } else { + // 用户不存在会员 + // 设置会员开始时间和结束时间 + Date startDate = new Date(); + userMember.setStartDate(startDate); + userMember.setEndDate(new Date(startDate.getTime() + member.getSubscriptionPeriod() * 1000L * 60L * 60L * 24L)); + } + + // 设置积分 + userMember.setPoints(member.getPoints()); + // 设置订阅状态 + if (member.getSubscriptionPeriod() == null) { + // 连续包月,会员状态为活跃 + userMember.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_ACTIVE); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(userMember.getEndDate()); + calendar.add(Calendar.MONTH, 1); + userMember.setNextBillingDate(calendar.getTime()); + } else { + userMember.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_INACTIVE); + } + // 设置支付时间 + userMember.setLastPaymentDate(new Date()); + // 设置支付方式 + userMember.setPaymentMethod(paymentMethod); + // 设置创建者 + SysUser sysUser = sysUserService.selectUserById(userId); + userMember.setCreateBy(sysUser.getUserName()); + userMember.setCreateTime(new Date()); + userMember.setUpdateBy(sysUser.getUserName()); + userMember.setUpdateTime(new Date()); + + baseMapper.insert(userMember); + + + return userMember; + } } diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/task/UserMemberTask.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/task/UserMemberTask.java new file mode 100644 index 0000000..f2f13a0 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/task/UserMemberTask.java @@ -0,0 +1,109 @@ +package com.mcwl.memberCenter.task; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.mcwl.common.constant.QueueConstants; +import com.mcwl.memberCenter.domain.UserMember; +import com.mcwl.memberCenter.enums.MemberMenu; +import com.mcwl.memberCenter.service.UserMemberService; +import lombok.RequiredArgsConstructor; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +@Component("userMemberTask") +@RequiredArgsConstructor +public class UserMemberTask { + + private final UserMemberService userMemberService; + + private final RabbitTemplate rabbitTemplate; + + + /** + * 积分清零提醒 月底前五天 + */ + public void emptyPointsRemindTask() { + List userMemberList = this.getUseUserMember(); + + // 发送积分清零消息 + rabbitTemplate.convertAndSend(QueueConstants.EMPTY_POINTS_REMIND_QUEUE, userMemberList); + + } + + + /** + * 清空积分 每月月底前两天 + */ + public void emptyPointsTsk() { + List userMemberList = this.getUseUserMember(); + if (userMemberList == null || userMemberList.isEmpty()) { + return; + } + for (UserMember userMember : userMemberList) { + userMember.setPoints(0); + userMember.setUpdateTime(new Date()); + } + userMemberService.updateBatchById(userMemberList); + } + + /** + * 更新会员状态 间隔1h检查 + */ + public void updateSubscriptionStatusTask() { + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + // endDate大于当前时间, subscriptionStatus不为过期 + qw.gt(UserMember::getEndDate, System.currentTimeMillis()) + .ne(UserMember::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_EXPIRED); + List userMemberList = userMemberService.list(qw); + if (userMemberList == null || userMemberList.isEmpty()) { + return; + } + + System.out.println("userMemberList = " + userMemberList); + + for (UserMember userMember : userMemberList) { + MemberMenu subscriptionStatus = userMember.getSubscriptionStatus(); + if (subscriptionStatus == MemberMenu.MEMBER_CENTER_ACTIVE) { + // 如果subscriptionStatus是活跃的,表示连续包月。订阅状态改为"待支付" + userMember.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_PENDING); + // nextBillingDate设置为当前会员结束日期的下个月的同一天,发送账单通知 + Calendar calendar = Calendar.getInstance(); + calendar.setTime(userMember.getEndDate()); + calendar.add(Calendar.MONTH, 1); + userMember.setNextBillingDate(calendar.getTime()); + userMemberService.updateById(userMember); + // 发送会员账单消息,如果支付成功,更新last_payment_date,并重新计算end_date(start_date + 1个月) + rabbitTemplate.convertAndSend(QueueConstants.MEMBER_BILLING_QUEUE, userMember); + } else if (subscriptionStatus == MemberMenu.MEMBER_CENTER_INACTIVE){ + // 不是连续包月,会员状态改为过期,状态改为"1" + userMember.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_EXPIRED); + userMember.setStatus("1"); + userMember.setUpdateTime(new Date()); + } + } + } + + + // 获取正常使用的会员 + private List getUseUserMember() { + // startDate 小于等于当前时间、endDate 大于等于当前时间 + // subscriptionStatus 不为 "过期" 或 "待支付" + // status 为 0 的 + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.le(UserMember::getStartDate, System.currentTimeMillis()) + .ge(UserMember::getEndDate, System.currentTimeMillis()) + .ne(UserMember::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_EXPIRED) + .ne(UserMember::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_PENDING) + .eq(UserMember::getStatus, '0'); + return userMemberService.list(); + } + + +} diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Commission.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Commission.java index 6d3307e..7cb2dac 100644 --- a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Commission.java +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Commission.java @@ -30,6 +30,9 @@ public class Commission extends BaseEntity { // 删除标志(0代表存在 2代表删除) private String delFlag; + // 备注 + private String remark; + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Consume.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Consume.java index 4b661ac..626cc26 100644 --- a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Consume.java +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Consume.java @@ -28,6 +28,9 @@ public class Consume extends BaseEntity { // 删除标志(0代表存在 2代表删除) private String delFlag; + // 备注 + private String remark; + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Invitation.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Invitation.java index 5460377..c4b917a 100644 --- a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Invitation.java +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Invitation.java @@ -28,6 +28,9 @@ public class Invitation extends BaseEntity { // 删除标志(0代表存在 2代表删除) private String delFlag; + // 备注 + private String remark; + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/InvitationServiceImpl.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/InvitationServiceImpl.java index 7fb977b..32abe1c 100644 --- a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/InvitationServiceImpl.java +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/InvitationServiceImpl.java @@ -3,6 +3,7 @@ package com.mcwl.myInvitation.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mcwl.common.constant.JwtConstants; import com.mcwl.common.utils.JwtUtils; +import com.mcwl.common.utils.ShareCodeUtils; import com.mcwl.myInvitation.domain.Invitation; import com.mcwl.myInvitation.mapper.InvitationMapper; import com.mcwl.myInvitation.service.InvitationService; @@ -20,9 +21,7 @@ public class InvitationServiceImpl extends ServiceImpl claims = new HashMap<>() ; - claims.put(JwtConstants.DETAILS_USER_ID, userId); - String invitationCode = JwtUtils.createToken(claims); + String invitationCode = ShareCodeUtils.idToCode(userId); return invitationCode; } }