From 7ce0a4fbcb3eadca2aac2706cff684c3e26e4962 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Fri, 3 Jan 2025 12:53:44 +0800 Subject: [PATCH 1/2] =?UTF-8?q?modify=EF=BC=9A=E7=B1=BB=E5=90=8D=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=8C=E6=96=B9=E4=BE=BF=E5=90=8E=E7=BB=AD=E6=89=A9?= =?UTF-8?q?=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memberCenter/MemberController.java | 84 +++++++++++++ .../{MemberTest.java => MemberLevelTest.java} | 27 +++-- .../mcwl/common/core/domain/BaseEntity.java | 12 ++ .../consumer/EmptyPointsRemindConsumer.java | 17 ++- .../com/mcwl/memberCenter/domain/Member.java | 41 ++++--- .../memberCenter/domain/MemberConsume.java | 33 ++++++ .../mcwl/memberCenter/domain/MemberLevel.java | 31 +++++ .../mcwl/memberCenter/domain/UserMember.java | 59 ---------- .../mcwl/memberCenter/dto/UserMemberDto.java | 17 +++ .../mapper/MemberConsumeMapper.java | 9 ++ ...mberMapper.java => MemberLevelMapper.java} | 8 +- .../memberCenter/mapper/MemberMapper.java | 4 +- .../service/MemberConsumeService.java | 10 ++ .../service/MemberLevelService.java | 9 ++ .../memberCenter/service/MemberService.java | 22 ++++ .../service/UserMemberService.java | 17 --- .../impl/MemberConsumeServiceImpl.java | 16 +++ .../service/impl/MemberLevelServiceImpl.java | 12 ++ .../service/impl/MemberServiceImpl.java | 109 ++++++++++++++++- .../service/impl/UserMemberServiceImpl.java | 110 ------------------ .../memberCenter/task/UserMemberTask.java | 81 +++++-------- .../MemberLevelMapper.xml} | 2 +- .../mcwl/myInvitation/domain/Commission.java | 3 - .../com/mcwl/myInvitation/domain/Consume.java | 3 - .../mcwl/myInvitation/domain/Invitation.java | 2 - 25 files changed, 453 insertions(+), 285 deletions(-) create mode 100644 mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberController.java rename mcwl-admin/src/test/java/com/mcwl/memberCenter/{MemberTest.java => MemberLevelTest.java} (66%) create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberConsume.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberLevel.java delete mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/UserMember.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/dto/UserMemberDto.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberConsumeMapper.java rename mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/{UserMemberMapper.java => MemberLevelMapper.java} (52%) create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberConsumeService.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberLevelService.java delete mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/UserMemberService.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberConsumeServiceImpl.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberLevelServiceImpl.java delete mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/UserMemberServiceImpl.java rename mcwl-memberCenter/src/main/resources/mapper/{MemberMapper.xml => memberCenter/MemberLevelMapper.xml} (68%) diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberController.java new file mode 100644 index 0000000..39fa465 --- /dev/null +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberController.java @@ -0,0 +1,84 @@ +package com.mcwl.web.controller.memberCenter; + +import com.mcwl.common.core.domain.AjaxResult; +import com.mcwl.common.core.domain.entity.SysUser; +import com.mcwl.memberCenter.domain.MemberConsume; +import com.mcwl.memberCenter.domain.Member; +import com.mcwl.memberCenter.dto.UserMemberDto; +import com.mcwl.memberCenter.service.MemberConsumeService; +import com.mcwl.memberCenter.service.MemberService; +import com.mcwl.system.service.ISysUserService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("member") +@RequiredArgsConstructor +public class MemberController { + + private final MemberService memberService; + + private final ISysUserService sysUserService; + + private final MemberConsumeService memberConsumeService; + + + /** + * 创建用户会员 + * + * @param userMemberDto 参数 + * @return 用户会员 + */ + @PostMapping("createMember") + public AjaxResult createMemberCenter(@RequestBody UserMemberDto userMemberDto) { + Long userId = userMemberDto.getUserId(); + if (userId == null) { + return AjaxResult.warn("用户未登录"); + } + Long memberLevelId = userMemberDto.getMemberLevelId(); + if (memberLevelId == null) { + return AjaxResult.warn("会员等级未选择"); + } + String paymentMethod = userMemberDto.getPaymentMethod(); + if (paymentMethod == null) { + return AjaxResult.warn("支付方式错误,请重新支付"); + } + Member member = memberService.createUserMember(userId, memberLevelId, paymentMethod); + return AjaxResult.success(member); + } + + + /** + * 积分查询 + * @param userId 用户id + * @return 用户积分 + */ + @GetMapping("getPoints/{id}") + public AjaxResult getPoints(@PathVariable("id") Long userId) { + if (userId == null) { + return AjaxResult.warn("用户未登录"); + } + + SysUser sysUser = sysUserService.selectUserById(userId); + if (sysUser == null) { + return AjaxResult.warn("用户不存在"); + } + + List member = memberService.getUseUserMemberByUserId(userId); + if (member == null || member.isEmpty()) { + return AjaxResult.warn("用户未开通会员"); + } + + List memberConsumeList = memberConsumeService + .lambdaQuery() + .eq(MemberConsume::getUserId, userId) + .list(); + + + return AjaxResult.success(memberConsumeList); + } + + +} diff --git a/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberTest.java b/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberLevelTest.java similarity index 66% rename from mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberTest.java rename to mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberLevelTest.java index 8b12b1d..adee648 100644 --- a/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberTest.java +++ b/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberLevelTest.java @@ -1,12 +1,12 @@ package com.mcwl.memberCenter; import com.mcwl.McWlApplication; -import com.mcwl.common.utils.ShareCodeUtils; +import com.mcwl.common.core.domain.AjaxResult; import com.mcwl.memberCenter.consumer.EmptyPointsRemindConsumer; -import com.mcwl.memberCenter.domain.UserMember; +import com.mcwl.memberCenter.service.MemberLevelService; import com.mcwl.memberCenter.service.MemberService; -import com.mcwl.memberCenter.service.UserMemberService; import com.mcwl.memberCenter.task.UserMemberTask; +import com.mcwl.web.controller.memberCenter.MemberController; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -15,15 +15,18 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes = McWlApplication.class) -public class MemberTest { +public class MemberLevelTest { + @Autowired + private MemberLevelService memberLevelService; + + @Autowired + private MemberController memberController; + @Autowired private MemberService memberService; - @Autowired - private UserMemberService userMemberService; - @Autowired private UserMemberTask userMemberTask; @@ -31,7 +34,7 @@ public class MemberTest { private EmptyPointsRemindConsumer emptyPointsRemindConsumer; @Test public void createUserMember() { - System.out.println(userMemberService.createUserMember(1L, 1013L, "wechat")); + System.out.println(memberService.createUserMember(1L, 1013L, "wechat")); } @Test @@ -52,7 +55,13 @@ public class MemberTest { @Test public void memberServiceTest() { - System.out.println(memberService.list()); + System.out.println(memberLevelService.list()); + } + + @Test + public void getPointsTest() { + AjaxResult points = memberController.getPoints(1L); + System.out.println("points = " + points); } } 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 9a637aa..73d7409 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 @@ -101,6 +101,18 @@ public class BaseEntity implements Serializable this.updateTime = updateTime; } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getRemark() { return remark; 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 index c8ee908..98b261d 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/consumer/EmptyPointsRemindConsumer.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/consumer/EmptyPointsRemindConsumer.java @@ -1,19 +1,16 @@ 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 com.mcwl.memberCenter.domain.Member; +import com.mcwl.memberCenter.service.MemberService; import com.rabbitmq.client.Channel; import org.springframework.amqp.core.Message; 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.io.IOException; -import java.util.List; @Slf4j @@ -21,13 +18,13 @@ import java.util.List; @RequiredArgsConstructor public class EmptyPointsRemindConsumer { - private final UserMemberService userMemberService; + private final MemberService memberService; @RabbitListener(queues = QueueConstants.EMPTY_POINTS_REMIND_QUEUE, ackMode = "MANUAL") - public void emptyPointsRemind(UserMember UserMember, Channel channel, Message message) { + public void emptyPointsRemind(Member Member, Channel channel, Message message) { try { // TODO 发送短信提醒用户积分即将清零 - log.info("获取到积分清零提醒的数据:{}", UserMember); + log.info("获取到积分清零提醒的数据:{}", Member); channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); } catch (Exception e) { log.error("处理积分清零提醒消息时出错: {}", e.getMessage(), e); @@ -41,10 +38,10 @@ public class EmptyPointsRemindConsumer { @RabbitListener(queues = QueueConstants.MEMBER_BILLING_QUEUE, ackMode = "MANUAL") - public void memberBillingQueue(UserMember userMember, Channel channel, Message message) { + public void memberBillingQueue(Member member, Channel channel, Message message) { try { // TODO 发送短信提醒用户会员账单,如果支付成功,更新last_payment_date,并重新计算end_date(start_date + 1个月) - log.info("获取到会员账单的数据:{}", userMember); + log.info("获取到会员账单的数据:{}", member); } catch (Exception e) { log.error("处理会员账单消息时出错: {}", e.getMessage(), e); try { 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 bbe83db..513aa42 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 @@ -1,12 +1,14 @@ package com.mcwl.memberCenter.domain; + import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.mcwl.common.core.domain.BaseEntity; +import com.mcwl.memberCenter.enums.MemberMenu; import lombok.Data; import lombok.EqualsAndHashCode; -import java.util.Objects; +import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) @@ -16,24 +18,37 @@ public class Member extends BaseEntity { @TableId private Long id; - // 会员类型 - private String memberType; + // 用户ID + private Long userId; - // 会员名称 - private String memberName; + // 会员等级ID + private Long memberLevelId; - // 会员价格 - private Double unitPrice; + // 会员开始时间 + private Date startDate; - // 会员原价 - private Double originalPrice; + // 会员结束时间 + private Date endDate; // 会员积分 private Integer points; - // 订阅周期(天) - private Integer subscriptionPeriod; + // 订阅状态 active(活跃,连续包月)、inactive(非活跃,不连续包月)、pending(待支付)和expired(过期) + private MemberMenu subscriptionStatus; + + // 支付方式 + private String paymentMethod; + + // 上次支付时间 + private Date lastPaymentDate; + + // 下次计费时间 + private Date nextBillingDate; + + // 上次登录时间 + private Date lastLoginDate; + + // 状态(0:正常 1:禁用) + private String status; - // 备注 - private String remark; } diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberConsume.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberConsume.java new file mode 100644 index 0000000..17123d3 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberConsume.java @@ -0,0 +1,33 @@ +package com.mcwl.memberCenter.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mcwl.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("mem_member_consume") +public class MemberConsume extends BaseEntity { + + @TableId + private Long id; + + // 用户id + private Long userId; + + // 消费积分 + private Integer consumePoints; + + // 剩余积分 + private Integer remainingPoints; + + // 消费时间 + private Date consumeTime; + + + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberLevel.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberLevel.java new file mode 100644 index 0000000..5a27f67 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberLevel.java @@ -0,0 +1,31 @@ +package com.mcwl.memberCenter.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mcwl.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("mem_member_level") +public class MemberLevel extends BaseEntity { + + @TableId + private Long id; + + // 会员名称 + private String memberName; + + // 会员价格 + private Double unitPrice; + + // 会员原价 + private Double originalPrice; + + // 会员积分 + private Integer points; + + // 订阅周期(天) + private Integer subscriptionPeriod; +} 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 deleted file mode 100644 index bb95be5..0000000 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/UserMember.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.mcwl.memberCenter.domain; - - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import com.mcwl.common.core.domain.BaseEntity; -import com.mcwl.memberCenter.enums.MemberMenu; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.Date; - -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("mem_user_member") -public class UserMember extends BaseEntity { - - @TableId - private Long id; - - // 用户ID - private Long userId; - - // 会员ID - private Long memberId; - - // 会员开始时间 - private Date startDate; - - // 会员结束时间 - private Date endDate; - - // 会员积分 - private Integer points; - - // 订阅状态 active(活跃,连续包月)、inactive(非活跃,不连续包月)、pending(待支付)和expired(过期) - private MemberMenu subscriptionStatus; - - // 支付方式 - private String paymentMethod; - - // 上次支付时间 - private Date lastPaymentDate; - - // 下次计费时间 - private Date nextBillingDate; - - // 上次登录时间 - private Date lastLoginDate; - - // 状态(0:正常 1:禁用) - private String status; - - // 备注 - private String remark; - -} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/dto/UserMemberDto.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/dto/UserMemberDto.java new file mode 100644 index 0000000..ee8ad44 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/dto/UserMemberDto.java @@ -0,0 +1,17 @@ +package com.mcwl.memberCenter.dto; + +import lombok.Data; + +@Data +public class UserMemberDto { + + // 用户ID + private Long userId; + + // 会员ID + private Long memberLevelId; + + // 支付方式 + private String paymentMethod; + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberConsumeMapper.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberConsumeMapper.java new file mode 100644 index 0000000..218d1a3 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberConsumeMapper.java @@ -0,0 +1,9 @@ +package com.mcwl.memberCenter.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mcwl.memberCenter.domain.MemberConsume; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MemberConsumeMapper extends BaseMapper { +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/UserMemberMapper.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberLevelMapper.java similarity index 52% rename from mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/UserMemberMapper.java rename to mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberLevelMapper.java index 80311c6..13c0730 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/UserMemberMapper.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberLevelMapper.java @@ -1,9 +1,11 @@ package com.mcwl.memberCenter.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.mcwl.memberCenter.domain.UserMember; +import com.mcwl.memberCenter.domain.MemberLevel; import org.apache.ibatis.annotations.Mapper; -//@Mapper -public interface UserMemberMapper extends BaseMapper { +@Mapper +public interface MemberLevelMapper extends BaseMapper { + + } diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberMapper.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberMapper.java index c127692..61f0d66 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberMapper.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberMapper.java @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mcwl.memberCenter.domain.Member; import org.apache.ibatis.annotations.Mapper; -//@Mapper +@Mapper public interface MemberMapper extends BaseMapper { - - } diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberConsumeService.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberConsumeService.java new file mode 100644 index 0000000..79d564f --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberConsumeService.java @@ -0,0 +1,10 @@ +package com.mcwl.memberCenter.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mcwl.memberCenter.domain.MemberConsume; + +public interface MemberConsumeService extends IService { + + + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberLevelService.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberLevelService.java new file mode 100644 index 0000000..5852b7d --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberLevelService.java @@ -0,0 +1,9 @@ +package com.mcwl.memberCenter.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mcwl.memberCenter.domain.MemberLevel; + +public interface MemberLevelService extends IService { + + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberService.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberService.java index 41aaeaf..932f5a5 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberService.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberService.java @@ -7,5 +7,27 @@ import java.util.List; public interface MemberService extends IService { + /** + * 创建用户会员 + * + * @param userId 用户id + * @param memberLevelId 会员等级id + * @return 用户会员 + */ + Member createUserMember(Long userId, Long memberLevelId, String paymentMethod); + + /** + * + * @return 获取正常的正在使用的用户会员集合 + */ + List getUseUserMember(); + + /** + * 根据用户id获取正常的正在使用的用户会员 + * @param userId 用户id + * @return 用户会员 + */ + List getUseUserMemberByUserId(Long userId); + } 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 deleted file mode 100644 index 9298702..0000000 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/UserMemberService.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.mcwl.memberCenter.service; - -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/MemberConsumeServiceImpl.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberConsumeServiceImpl.java new file mode 100644 index 0000000..aad3310 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberConsumeServiceImpl.java @@ -0,0 +1,16 @@ +package com.mcwl.memberCenter.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mcwl.memberCenter.domain.MemberConsume; +import com.mcwl.memberCenter.mapper.MemberConsumeMapper; +import com.mcwl.memberCenter.service.MemberConsumeService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MemberConsumeServiceImpl extends ServiceImpl implements MemberConsumeService { + + + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberLevelServiceImpl.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberLevelServiceImpl.java new file mode 100644 index 0000000..b974b0f --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberLevelServiceImpl.java @@ -0,0 +1,12 @@ +package com.mcwl.memberCenter.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mcwl.memberCenter.domain.MemberLevel; +import com.mcwl.memberCenter.mapper.MemberLevelMapper; +import com.mcwl.memberCenter.service.MemberLevelService; +import org.springframework.stereotype.Service; + +@Service +public class MemberLevelServiceImpl extends ServiceImpl implements MemberLevelService { + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberServiceImpl.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberServiceImpl.java index 13dda34..d798621 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberServiceImpl.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberServiceImpl.java @@ -1,14 +1,121 @@ package com.mcwl.memberCenter.service.impl; +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.memberCenter.domain.MemberLevel; import com.mcwl.memberCenter.domain.Member; +import com.mcwl.memberCenter.enums.MemberMenu; import com.mcwl.memberCenter.mapper.MemberMapper; +import com.mcwl.memberCenter.service.MemberLevelService; import com.mcwl.memberCenter.service.MemberService; +import com.mcwl.system.service.ISysUserService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import java.util.List; +import java.util.*; @Service +@RequiredArgsConstructor public class MemberServiceImpl extends ServiceImpl implements MemberService { + private final MemberLevelService memberLevelService; + + private final ISysUserService sysUserService; + + @Override + public Member createUserMember(Long userId, Long memberLevelId, String paymentMethod) { + if (userId == null) { + throw new ServiceException("用户不能为空"); + } + SysUser user = sysUserService.selectUserById(userId); + if (user == null) { + throw new ServiceException("用户不存在"); + } + if (memberLevelId == null) { + throw new ServiceException("会员等级不能为空"); + } + MemberLevel memberLevel = memberLevelService.getById(memberLevelId); + if (memberLevel == null) { + throw new ServiceException("会员等级不存在"); + } + // 查询用户是否已经存在会员 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(Member::getUserId, userId) + // subscriptionStatus不为expired + .ne(Member::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_EXPIRED) + .orderBy(true, false, Member::getEndDate); + List memberList = baseMapper.selectList(lqw); + Member member = new Member(); + // 设置用户id + member.setUserId(userId); + // 设置会员id + member.setMemberLevelId(memberLevelId); + if (memberList != null && !memberList.isEmpty()) { + Member lastMember = memberList.get(0); + Date endDate = lastMember.getEndDate(); + // 设置会员开始时间和结束时间 + Date startDate = new Date(endDate.getTime() + 1000L * 60L * 60L * 24L); + member.setStartDate(startDate); + member.setEndDate(new Date(startDate.getTime() + memberLevel.getSubscriptionPeriod() * 1000L * 60L * 60L * 24L)); + } else { + // 用户不存在会员 + // 设置会员开始时间和结束时间 + Date startDate = new Date(); + member.setStartDate(startDate); + member.setEndDate(new Date(startDate.getTime() + memberLevel.getSubscriptionPeriod() * 1000L * 60L * 60L * 24L)); + } + + // 设置积分 + member.setPoints(memberLevel.getPoints()); + // 设置订阅状态 + if (memberLevel.getSubscriptionPeriod() == null) { + // 连续包月,会员状态为活跃 + member.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_ACTIVE); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(member.getEndDate()); + calendar.add(Calendar.MONTH, 1); + member.setNextBillingDate(calendar.getTime()); + } else { + member.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_INACTIVE); + } + // 设置支付时间 + member.setLastPaymentDate(new Date()); + // 设置支付方式 + member.setPaymentMethod(paymentMethod); + // 设置创建者 + SysUser sysUser = sysUserService.selectUserById(userId); + member.setCreateBy(sysUser.getUserName()); + member.setCreateTime(new Date()); + member.setUpdateBy(sysUser.getUserName()); + member.setUpdateTime(new Date()); + + baseMapper.insert(member); + + + return member; + } + + + @Override + public List getUseUserMember() { + return this.getUseUserMemberByUserId(null); + } + + @Override + public List getUseUserMemberByUserId(Long userId) { + // startDate 小于等于当前时间、endDate 大于等于当前时间 + // subscriptionStatus 不为 "过期" 或 "待支付" + // status 为 0 的 + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.le(Member::getStartDate, new Date()) + .ge(Member::getEndDate, new Date()) + .ne(Member::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_EXPIRED) + .ne(Member::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_PENDING) + .eq(Member::getStatus, "0") + .eq(userId != null, Member::getUserId, userId); + return baseMapper.selectList(qw); + } + } 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 deleted file mode 100644 index 5bd6436..0000000 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/UserMemberServiceImpl.java +++ /dev/null @@ -1,110 +0,0 @@ -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 index 11cc3f4..9add30f 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/task/UserMemberTask.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/task/UserMemberTask.java @@ -1,17 +1,13 @@ 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.domain.Member; import com.mcwl.memberCenter.enums.MemberMenu; -import com.mcwl.memberCenter.service.UserMemberService; +import com.mcwl.memberCenter.service.MemberService; 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; @@ -21,7 +17,7 @@ import java.util.List; @RequiredArgsConstructor public class UserMemberTask { - private final UserMemberService userMemberService; + private final MemberService memberService; private final RabbitTemplate rabbitTemplate; @@ -30,13 +26,13 @@ public class UserMemberTask { * 积分清零提醒 月底前五天 */ public void emptyPointsRemindTask() { - List userMemberList = this.getUseUserMember(); - if (userMemberList == null || userMemberList.isEmpty()) { + List memberList = memberService.getUseUserMember(); + if (memberList == null || memberList.isEmpty()) { return; } // 发送积分清零消息 - for (UserMember userMember : userMemberList) { - rabbitTemplate.convertAndSend(QueueConstants.EMPTY_POINTS_REMIND_QUEUE, userMember); + for (Member member : memberList) { + rabbitTemplate.convertAndSend(QueueConstants.EMPTY_POINTS_REMIND_QUEUE, member); } } @@ -46,71 +42,54 @@ public class UserMemberTask { * 清空积分 每月月底前两天 */ public void emptyPointsTsk() { - List userMemberList = this.getUseUserMember(); - if (userMemberList == null || userMemberList.isEmpty()) { + List memberList = memberService.getUseUserMember(); + if (memberList == null || memberList.isEmpty()) { return; } - for (UserMember userMember : userMemberList) { - userMember.setPoints(0); - userMember.setUpdateTime(new Date()); + for (Member member : memberList) { + member.setPoints(0); + member.setUpdateTime(new Date()); } - userMemberService.updateBatchById(userMemberList); + memberService.updateBatchById(memberList); } /** * 更新会员状态 间隔1h检查 */ public void updateSubscriptionStatusTask() { - LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); // endDate大于当前时间, subscriptionStatus不为过期 - qw.gt(UserMember::getEndDate, System.currentTimeMillis()) - .ne(UserMember::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_EXPIRED) - .ne(UserMember::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_PENDING); - List userMemberList = userMemberService.list(qw); - if (userMemberList == null || userMemberList.isEmpty()) { + qw.gt(Member::getEndDate, System.currentTimeMillis()) + .ne(Member::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_EXPIRED) + .ne(Member::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_PENDING); + List memberList = memberService.list(qw); + if (memberList == null || memberList.isEmpty()) { return; } - System.out.println("userMemberList = " + userMemberList); + System.out.println("userMemberList = " + memberList); - for (UserMember userMember : userMemberList) { - MemberMenu subscriptionStatus = userMember.getSubscriptionStatus(); + for (Member member : memberList) { + MemberMenu subscriptionStatus = member.getSubscriptionStatus(); if (subscriptionStatus == MemberMenu.MEMBER_CENTER_ACTIVE) { // 如果subscriptionStatus是活跃的,表示连续包月。订阅状态改为"待支付" - userMember.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_PENDING); + member.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_PENDING); // nextBillingDate设置为当前会员结束日期的下个月的同一天,发送账单通知 Calendar calendar = Calendar.getInstance(); - calendar.setTime(userMember.getEndDate()); + calendar.setTime(member.getEndDate()); calendar.add(Calendar.MONTH, 1); - userMember.setNextBillingDate(calendar.getTime()); - userMemberService.updateById(userMember); + member.setNextBillingDate(calendar.getTime()); + memberService.updateById(member); // 发送会员账单消息,如果支付成功,更新last_payment_date,并重新计算end_date(start_date + 1个月) - rabbitTemplate.convertAndSend(QueueConstants.MEMBER_BILLING_QUEUE, userMember); + rabbitTemplate.convertAndSend(QueueConstants.MEMBER_BILLING_QUEUE, member); } else if (subscriptionStatus == MemberMenu.MEMBER_CENTER_INACTIVE) { // 不是连续包月,会员状态改为过期,状态改为"1" - userMember.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_EXPIRED); - userMember.setStatus("1"); - userMember.setUpdateTime(new Date()); + member.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_EXPIRED); + member.setStatus("1"); + member.setUpdateTime(new Date()); } } } - // 获取正常使用的会员 - private List getUseUserMember() { - // startDate 小于等于当前时间、endDate 大于等于当前时间 - // subscriptionStatus 不为 "过期" 或 "待支付" - // status 为 0 的 - LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); - qw.le(UserMember::getStartDate, new Date()) - .ge(UserMember::getEndDate, new Date()) - .ne(UserMember::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_EXPIRED) - .ne(UserMember::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_PENDING) - .eq(UserMember::getStatus, "0"); - // 对应的sql为 - System.out.println("sql = " + qw.getSqlSegment()); - return userMemberService.list(qw); - } - - } diff --git a/mcwl-memberCenter/src/main/resources/mapper/MemberMapper.xml b/mcwl-memberCenter/src/main/resources/mapper/memberCenter/MemberLevelMapper.xml similarity index 68% rename from mcwl-memberCenter/src/main/resources/mapper/MemberMapper.xml rename to mcwl-memberCenter/src/main/resources/mapper/memberCenter/MemberLevelMapper.xml index ea8093a..6b9c5d8 100644 --- a/mcwl-memberCenter/src/main/resources/mapper/MemberMapper.xml +++ b/mcwl-memberCenter/src/main/resources/mapper/memberCenter/MemberLevelMapper.xml @@ -2,7 +2,7 @@ - + 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 05d127d..bb7cd4a 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 @@ -27,9 +27,6 @@ public class Commission extends BaseEntity { // 支付状态 private Integer payStatus; - // 备注 - 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 6d9cc5a..1cd9935 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 @@ -25,9 +25,6 @@ public class Consume extends BaseEntity { // 消费时间 private Date consumeDate; - // 备注 - 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 06b237f..9b22e83 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 @@ -25,8 +25,6 @@ public class Invitation extends BaseEntity { // 邀请码 private String invitationCode; - // 备注 - private String remark; @Override public boolean equals(Object o) { From 79bfa1a981bc189364ecd7bf6d831cf7c9361e2a Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Fri, 3 Jan 2025 18:45:45 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(memberCenter):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BC=9A=E5=91=98=E6=9D=83=E7=9B=8A=E5=8A=9F=E8=83=BD=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BC=9A=E5=91=98=E7=A7=AF=E5=88=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 MemberBenefit 类用于定义会员权益 - 创建 MemberBenefitMapper、MemberBenefitService 和 MemberBenefitServiceImpl - 添加 MemberBenefitTypeEnum 枚举定义权益类型 - 新增会员等级和权益列表接口及实现 - 修改 Member 类,将积分类型改为 Double- 优化会员创建和积分充值逻辑 - 更新会员任务处理,重置积分逻辑 --- .../memberCenter/MemberController.java | 65 ++++++++++- .../memberCenter/MemberLevelController.java | 63 ++++++++++ .../pojo/dto/RechargePointsDto.java | 14 +++ .../memberCenter/pojo}/dto/UserMemberDto.java | 2 +- .../memberCenter/pojo/vo/MemberBenefitVO.java | 20 ++++ .../memberCenter/pojo/vo/PointsVO.java | 20 ++++ ...erLevelTest.java => MemberCenterTest.java} | 11 +- .../com/mcwl/memberCenter/domain/Member.java | 6 +- .../memberCenter/domain/MemberBenefit.java | 34 ++++++ .../memberCenter/domain/MemberConsume.java | 4 +- .../mcwl/memberCenter/domain/MemberLevel.java | 8 +- .../enums/MemberBenefitTypeEnum.java | 26 +++++ .../{MemberMenu.java => MemberEnum.java} | 2 +- .../enums/MemberPeriodicEnum.java | 19 +++ .../mapper/MemberBenefitMapper.java | 9 ++ .../service/MemberBenefitService.java | 10 ++ .../memberCenter/service/MemberService.java | 3 +- .../impl/MemberBenefitServiceImpl.java | 14 +++ .../service/impl/MemberServiceImpl.java | 110 ++++++++++++++---- .../memberCenter/task/UserMemberTask.java | 18 +-- 20 files changed, 406 insertions(+), 52 deletions(-) create mode 100644 mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberLevelController.java create mode 100644 mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/dto/RechargePointsDto.java rename {mcwl-memberCenter/src/main/java/com/mcwl/memberCenter => mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo}/dto/UserMemberDto.java (78%) create mode 100644 mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/vo/MemberBenefitVO.java create mode 100644 mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/vo/PointsVO.java rename mcwl-admin/src/test/java/com/mcwl/memberCenter/{MemberLevelTest.java => MemberCenterTest.java} (83%) create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberBenefit.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberBenefitTypeEnum.java rename mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/{MemberMenu.java => MemberEnum.java} (94%) create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberPeriodicEnum.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberBenefitMapper.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberBenefitService.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberBenefitServiceImpl.java diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberController.java index 39fa465..f10f65f 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberController.java @@ -4,10 +4,15 @@ import com.mcwl.common.core.domain.AjaxResult; import com.mcwl.common.core.domain.entity.SysUser; import com.mcwl.memberCenter.domain.MemberConsume; import com.mcwl.memberCenter.domain.Member; -import com.mcwl.memberCenter.dto.UserMemberDto; +import com.mcwl.memberCenter.domain.MemberLevel; +import com.mcwl.memberCenter.service.MemberBenefitService; +import com.mcwl.memberCenter.service.MemberLevelService; +import com.mcwl.web.controller.memberCenter.pojo.dto.RechargePointsDto; +import com.mcwl.web.controller.memberCenter.pojo.dto.UserMemberDto; import com.mcwl.memberCenter.service.MemberConsumeService; import com.mcwl.memberCenter.service.MemberService; import com.mcwl.system.service.ISysUserService; +import com.mcwl.web.controller.memberCenter.pojo.vo.PointsVO; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -24,6 +29,8 @@ public class MemberController { private final MemberConsumeService memberConsumeService; + private final MemberBenefitService memberBenefitService; + /** * 创建用户会员 @@ -46,14 +53,17 @@ public class MemberController { return AjaxResult.warn("支付方式错误,请重新支付"); } Member member = memberService.createUserMember(userId, memberLevelId, paymentMethod); + if (member == null) { + return AjaxResult.warn("创建会员失败"); + } return AjaxResult.success(member); } /** - * 积分查询 + * 获取积分余额和历史记录 * @param userId 用户id - * @return 用户积分 + * @return 积分余额和历史记录 */ @GetMapping("getPoints/{id}") public AjaxResult getPoints(@PathVariable("id") Long userId) { @@ -66,18 +76,61 @@ public class MemberController { return AjaxResult.warn("用户不存在"); } - List member = memberService.getUseUserMemberByUserId(userId); - if (member == null || member.isEmpty()) { + Member member = memberService.getUseUserMemberByUserId(userId); + if (member == null) { return AjaxResult.warn("用户未开通会员"); } + PointsVO pointsVO = new PointsVO(); + + // 会员消费记录 List memberConsumeList = memberConsumeService .lambdaQuery() .eq(MemberConsume::getUserId, userId) .list(); + pointsVO.setPoints(member.getPoints()); + pointsVO.setMemberConsumeList(memberConsumeList); - return AjaxResult.success(memberConsumeList); + return AjaxResult.success(pointsVO); + } + + + /** + * 会员积分充值 + */ + @PostMapping("rechargePoints") + public AjaxResult rechargePoints(@RequestBody RechargePointsDto rechargePointsDto) { + Long userId = rechargePointsDto.getUserId(); + Double points = rechargePointsDto.getPoints(); + + if (userId == null) { + return AjaxResult.warn("用户未登录"); + } + + SysUser sysUser = sysUserService.selectUserById(userId); + if (sysUser == null) { + return AjaxResult.warn("用户不存在"); + } + + if (points == null) { + return AjaxResult.warn("充值积分为空"); + } + + if (points <= 0) { + return AjaxResult.warn("充值积分必须大于0"); + } + + Member member = memberService.rechargePoints(userId, points); + + // 返回充值积分 + if (member == null) { + return AjaxResult.warn("充值积分失败"); + } + + rechargePointsDto.setPoints(member.getPoints()); + + return AjaxResult.success(rechargePointsDto); } diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberLevelController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberLevelController.java new file mode 100644 index 0000000..9ac70f2 --- /dev/null +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/MemberLevelController.java @@ -0,0 +1,63 @@ +package com.mcwl.web.controller.memberCenter; + +import com.mcwl.common.core.domain.AjaxResult; +import com.mcwl.memberCenter.domain.MemberBenefit; +import com.mcwl.memberCenter.domain.MemberLevel; +import com.mcwl.memberCenter.service.MemberBenefitService; +import com.mcwl.memberCenter.service.MemberLevelService; +import com.mcwl.web.controller.memberCenter.pojo.vo.MemberBenefitVO; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("memberLevel") +@RequiredArgsConstructor +public class MemberLevelController { + + private final MemberLevelService memberLevelService; + + private final MemberBenefitService memberBenefitService; + + /** + * 获取会员等级列表 + * + * @return 会员等级列表 + */ + @GetMapping("list") + public AjaxResult list() { + + List memberLevelList = memberLevelService.list(); + + return AjaxResult.success(memberLevelList); + } + + + /** + * 获取会员等级及权益列表 + */ + @GetMapping("getMemberBenefitList") + public AjaxResult getMemberBenefitList() { + + List memberBenefitVOList = new ArrayList<>(); + + List memberLevelList = memberLevelService.list(); + for (MemberLevel memberLevel : memberLevelList) { + MemberBenefitVO memberBenefitVO = new MemberBenefitVO(); + memberBenefitVO.setMemberLevel(memberLevel); + // 获取会员等级对应的权益 + List memberBenefitList = memberBenefitService.lambdaQuery() + .eq(MemberBenefit::getMemberLevelId, memberLevel.getId()) + .list(); + memberBenefitVO.setMemberBenefitList(memberBenefitList); + memberBenefitVOList.add(memberBenefitVO); + } + + return AjaxResult.success(memberBenefitVOList); + } + +} diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/dto/RechargePointsDto.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/dto/RechargePointsDto.java new file mode 100644 index 0000000..f3e9d81 --- /dev/null +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/dto/RechargePointsDto.java @@ -0,0 +1,14 @@ +package com.mcwl.web.controller.memberCenter.pojo.dto; + +import lombok.Data; + +@Data +public class RechargePointsDto { + + // 用户ID + private Long userId; + + // 充值积分 + private Double points; + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/dto/UserMemberDto.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/dto/UserMemberDto.java similarity index 78% rename from mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/dto/UserMemberDto.java rename to mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/dto/UserMemberDto.java index ee8ad44..c5c517d 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/dto/UserMemberDto.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/dto/UserMemberDto.java @@ -1,4 +1,4 @@ -package com.mcwl.memberCenter.dto; +package com.mcwl.web.controller.memberCenter.pojo.dto; import lombok.Data; diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/vo/MemberBenefitVO.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/vo/MemberBenefitVO.java new file mode 100644 index 0000000..d9a6a66 --- /dev/null +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/vo/MemberBenefitVO.java @@ -0,0 +1,20 @@ +package com.mcwl.web.controller.memberCenter.pojo.vo; + +import com.mcwl.memberCenter.domain.MemberBenefit; +import com.mcwl.memberCenter.domain.MemberLevel; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class MemberBenefitVO { + + // 会员等级 + private MemberLevel memberLevel; + + // 会员权益 + private List memberBenefitList = new ArrayList<>(); + + +} diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/vo/PointsVO.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/vo/PointsVO.java new file mode 100644 index 0000000..3c902cd --- /dev/null +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/memberCenter/pojo/vo/PointsVO.java @@ -0,0 +1,20 @@ +package com.mcwl.web.controller.memberCenter.pojo.vo; + +import com.mcwl.memberCenter.domain.MemberConsume; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * 积分余额和历史记录 + */ +@Data +public class PointsVO { + // 积分余额 + private Double points; + + // 积分消费记录 + private List memberConsumeList = new ArrayList<>(); + +} diff --git a/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberLevelTest.java b/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberCenterTest.java similarity index 83% rename from mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberLevelTest.java rename to mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberCenterTest.java index adee648..bf2a1d8 100644 --- a/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberLevelTest.java +++ b/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberCenterTest.java @@ -7,6 +7,7 @@ import com.mcwl.memberCenter.service.MemberLevelService; import com.mcwl.memberCenter.service.MemberService; import com.mcwl.memberCenter.task.UserMemberTask; import com.mcwl.web.controller.memberCenter.MemberController; +import com.mcwl.web.controller.memberCenter.MemberLevelController; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -15,7 +16,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes = McWlApplication.class) -public class MemberLevelTest { +public class MemberCenterTest { @Autowired @@ -30,6 +31,9 @@ public class MemberLevelTest { @Autowired private UserMemberTask userMemberTask; + @Autowired + private MemberLevelController memberLevelController; + @Autowired private EmptyPointsRemindConsumer emptyPointsRemindConsumer; @Test @@ -64,4 +68,9 @@ public class MemberLevelTest { System.out.println("points = " + points); } + @Test + public void getMemberLevelListTest() { + System.out.println("memberLevelController.getMemberBenefitList() = " + memberLevelController.getMemberBenefitList()); + } + } 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 513aa42..8443633 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 @@ -4,7 +4,7 @@ package com.mcwl.memberCenter.domain; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.mcwl.common.core.domain.BaseEntity; -import com.mcwl.memberCenter.enums.MemberMenu; +import com.mcwl.memberCenter.enums.MemberEnum; import lombok.Data; import lombok.EqualsAndHashCode; @@ -31,10 +31,10 @@ public class Member extends BaseEntity { private Date endDate; // 会员积分 - private Integer points; + private Double points; // 订阅状态 active(活跃,连续包月)、inactive(非活跃,不连续包月)、pending(待支付)和expired(过期) - private MemberMenu subscriptionStatus; + private MemberEnum subscriptionStatus; // 支付方式 private String paymentMethod; diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberBenefit.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberBenefit.java new file mode 100644 index 0000000..4458531 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberBenefit.java @@ -0,0 +1,34 @@ +package com.mcwl.memberCenter.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mcwl.common.core.domain.BaseEntity; +import com.mcwl.memberCenter.enums.MemberBenefitTypeEnum; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("mem_member_benefit") +public class MemberBenefit extends BaseEntity { + + @TableId + private Long id; + + // 会员等级id + private Long memberLevelId; + + // 权益名称 + private String benefitName; + + // 权益描述 + private String benefitDesc; + + // 权益类型 + private MemberBenefitTypeEnum benefitType; + + // 权益折扣 当权益类型为折扣时,记录折扣的具体数值,如0.9代表9折 + private Double benefitDiscount; + + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberConsume.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberConsume.java index 17123d3..c2f3aa3 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberConsume.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberConsume.java @@ -20,10 +20,10 @@ public class MemberConsume extends BaseEntity { private Long userId; // 消费积分 - private Integer consumePoints; + private Double consumePoints; // 剩余积分 - private Integer remainingPoints; + private Double remainingPoints; // 消费时间 private Date consumeTime; diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberLevel.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberLevel.java index 5a27f67..12ec9ed 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberLevel.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/MemberLevel.java @@ -3,6 +3,7 @@ package com.mcwl.memberCenter.domain; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.mcwl.common.core.domain.BaseEntity; +import com.mcwl.memberCenter.enums.MemberPeriodicEnum; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,9 +24,6 @@ public class MemberLevel extends BaseEntity { // 会员原价 private Double originalPrice; - // 会员积分 - private Integer points; - - // 订阅周期(天) - private Integer subscriptionPeriod; + // 订阅周期(年,季度,月,包月) + private MemberPeriodicEnum subscriptionPeriod; } diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberBenefitTypeEnum.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberBenefitTypeEnum.java new file mode 100644 index 0000000..39f4d6f --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberBenefitTypeEnum.java @@ -0,0 +1,26 @@ +package com.mcwl.memberCenter.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum MemberBenefitTypeEnum { + + DISCOUNT("discount", "折扣"), + + POINTS("points", "积分"), + + CASH("cash", "现金"), + + FREE("free", "免费"); + + private final String name; + + @EnumValue + private final String value; + + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberMenu.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberEnum.java similarity index 94% rename from mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberMenu.java rename to mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberEnum.java index b127cc0..6d27779 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberMenu.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberEnum.java @@ -6,7 +6,7 @@ import lombok.Getter; @Getter @AllArgsConstructor -public enum MemberMenu { +public enum MemberEnum { MEMBER_CENTER_ACTIVE("active", "活跃"), MEMBER_CENTER_INACTIVE("inactive", "非活跃"), MEMBER_CENTER_PENDING("pending", "待支付"), diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberPeriodicEnum.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberPeriodicEnum.java new file mode 100644 index 0000000..fc2de7d --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberPeriodicEnum.java @@ -0,0 +1,19 @@ +package com.mcwl.memberCenter.enums; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum MemberPeriodicEnum { + YEAR("year", "年"), + QUARTER("quarter", "季度"), + MONTH("month", "月"), + CONTINUE_MONTH("continueMonth", "包月"); + + + private final String name; + @EnumValue + private final String value; +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberBenefitMapper.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberBenefitMapper.java new file mode 100644 index 0000000..1be22b0 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberBenefitMapper.java @@ -0,0 +1,9 @@ +package com.mcwl.memberCenter.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mcwl.memberCenter.domain.MemberBenefit; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MemberBenefitMapper extends BaseMapper { +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberBenefitService.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberBenefitService.java new file mode 100644 index 0000000..d7154e4 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberBenefitService.java @@ -0,0 +1,10 @@ +package com.mcwl.memberCenter.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mcwl.memberCenter.domain.MemberBenefit; + +public interface MemberBenefitService extends IService { + + + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberService.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberService.java index 932f5a5..59783f6 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberService.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberService.java @@ -27,7 +27,8 @@ public interface MemberService extends IService { * @param userId 用户id * @return 用户会员 */ - List getUseUserMemberByUserId(Long userId); + Member getUseUserMemberByUserId(Long userId); + Member rechargePoints(Long userId, Double points); } diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberBenefitServiceImpl.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberBenefitServiceImpl.java new file mode 100644 index 0000000..a469f2e --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberBenefitServiceImpl.java @@ -0,0 +1,14 @@ +package com.mcwl.memberCenter.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mcwl.memberCenter.domain.MemberBenefit; +import com.mcwl.memberCenter.mapper.MemberBenefitMapper; +import com.mcwl.memberCenter.service.MemberBenefitService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MemberBenefitServiceImpl extends ServiceImpl implements MemberBenefitService { + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberServiceImpl.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberServiceImpl.java index d798621..5411b11 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberServiceImpl.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberServiceImpl.java @@ -4,16 +4,21 @@ 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.memberCenter.domain.MemberBenefit; import com.mcwl.memberCenter.domain.MemberLevel; import com.mcwl.memberCenter.domain.Member; -import com.mcwl.memberCenter.enums.MemberMenu; +import com.mcwl.memberCenter.enums.MemberBenefitTypeEnum; +import com.mcwl.memberCenter.enums.MemberEnum; +import com.mcwl.memberCenter.enums.MemberPeriodicEnum; import com.mcwl.memberCenter.mapper.MemberMapper; +import com.mcwl.memberCenter.service.MemberBenefitService; import com.mcwl.memberCenter.service.MemberLevelService; import com.mcwl.memberCenter.service.MemberService; import com.mcwl.system.service.ISysUserService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import javax.validation.constraints.NotNull; import java.util.*; @Service @@ -24,27 +29,26 @@ public class MemberServiceImpl extends ServiceImpl impleme private final ISysUserService sysUserService; + private final MemberBenefitService memberBenefitService; + @Override public Member createUserMember(Long userId, Long memberLevelId, String paymentMethod) { if (userId == null) { - throw new ServiceException("用户不能为空"); + return null; } SysUser user = sysUserService.selectUserById(userId); - if (user == null) { - throw new ServiceException("用户不存在"); - } - if (memberLevelId == null) { - throw new ServiceException("会员等级不能为空"); + if (user == null || memberLevelId == null) { + return null; } MemberLevel memberLevel = memberLevelService.getById(memberLevelId); if (memberLevel == null) { - throw new ServiceException("会员等级不存在"); + return null; } // 查询用户是否已经存在会员 LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(Member::getUserId, userId) // subscriptionStatus不为expired - .ne(Member::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_EXPIRED) + .ne(Member::getSubscriptionStatus, MemberEnum.MEMBER_CENTER_EXPIRED) .orderBy(true, false, Member::getEndDate); List memberList = baseMapper.selectList(lqw); Member member = new Member(); @@ -56,29 +60,38 @@ public class MemberServiceImpl extends ServiceImpl impleme Member lastMember = memberList.get(0); Date endDate = lastMember.getEndDate(); // 设置会员开始时间和结束时间 - Date startDate = new Date(endDate.getTime() + 1000L * 60L * 60L * 24L); - member.setStartDate(startDate); - member.setEndDate(new Date(startDate.getTime() + memberLevel.getSubscriptionPeriod() * 1000L * 60L * 60L * 24L)); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(endDate); + calendar.add(Calendar.DAY_OF_MONTH, 1); + member.setStartDate(calendar.getTime()); + member.setEndDate(this.getEndDate(memberLevel.getSubscriptionPeriod(), calendar)); } else { // 用户不存在会员 // 设置会员开始时间和结束时间 - Date startDate = new Date(); - member.setStartDate(startDate); - member.setEndDate(new Date(startDate.getTime() + memberLevel.getSubscriptionPeriod() * 1000L * 60L * 60L * 24L)); + Calendar calendar = Calendar.getInstance(); + member.setStartDate(calendar.getTime()); + member.setEndDate(this.getEndDate(memberLevel.getSubscriptionPeriod(), calendar)); } // 设置积分 - member.setPoints(memberLevel.getPoints()); + MemberBenefit memberBenefit = memberBenefitService.lambdaQuery() + .eq(MemberBenefit::getMemberLevelId, memberLevelId) + .eq(MemberBenefit::getBenefitType, MemberBenefitTypeEnum.POINTS) + .one(); + if (memberBenefit != null) { + member.setPoints(memberBenefit.getBenefitDiscount()); + } + // 设置订阅状态 - if (memberLevel.getSubscriptionPeriod() == null) { + if (memberLevel.getSubscriptionPeriod() == MemberPeriodicEnum.CONTINUE_MONTH) { // 连续包月,会员状态为活跃 - member.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_ACTIVE); + member.setSubscriptionStatus(MemberEnum.MEMBER_CENTER_ACTIVE); Calendar calendar = Calendar.getInstance(); calendar.setTime(member.getEndDate()); calendar.add(Calendar.MONTH, 1); member.setNextBillingDate(calendar.getTime()); } else { - member.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_INACTIVE); + member.setSubscriptionStatus(MemberEnum.MEMBER_CENTER_INACTIVE); } // 设置支付时间 member.setLastPaymentDate(new Date()); @@ -100,22 +113,73 @@ public class MemberServiceImpl extends ServiceImpl impleme @Override public List getUseUserMember() { - return this.getUseUserMemberByUserId(null); + return this.getUseUserMember(null); } @Override - public List getUseUserMemberByUserId(Long userId) { + public Member getUseUserMemberByUserId(Long userId) { + + List memberList = this.getUseUserMember(userId); + if (memberList == null || memberList.isEmpty()) { + return null; + } + return memberList.get(0); + } + + @Override + public Member rechargePoints(Long userId, Double points) { + if (userId == null) { + return null; + } + if (points == null) { + return null; + } + Member member = getUseUserMemberByUserId(userId); + if (member != null) { + member.setPoints(member.getPoints() + points); + baseMapper.updateById(member); + return member; + } + return null; + } + + private List getUseUserMember(Long userId) { // startDate 小于等于当前时间、endDate 大于等于当前时间 // subscriptionStatus 不为 "过期" 或 "待支付" // status 为 0 的 LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); qw.le(Member::getStartDate, new Date()) .ge(Member::getEndDate, new Date()) - .ne(Member::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_EXPIRED) - .ne(Member::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_PENDING) + .ne(Member::getSubscriptionStatus, MemberEnum.MEMBER_CENTER_EXPIRED) + .ne(Member::getSubscriptionStatus, MemberEnum.MEMBER_CENTER_PENDING) .eq(Member::getStatus, "0") .eq(userId != null, Member::getUserId, userId); return baseMapper.selectList(qw); } + + /** + * 根据订阅周期和开始时间 计算结束时间 + * @param subscriptionPeriod 订阅周期 + * @param calendar 结束时间(日历) + * @return 结束时间 + */ + private Date getEndDate(MemberPeriodicEnum subscriptionPeriod, Calendar calendar) { + switch (subscriptionPeriod) { + case YEAR: + calendar.add(Calendar.YEAR, 1); + break; + case QUARTER: + calendar.add(Calendar.MONTH, 3); + break; + case MONTH: + case CONTINUE_MONTH: + calendar.add(Calendar.MONTH, 1); + break; + default: + break; + } + return calendar.getTime(); + } + } 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 index 9add30f..a2dcadf 100644 --- a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/task/UserMemberTask.java +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/task/UserMemberTask.java @@ -3,7 +3,7 @@ package com.mcwl.memberCenter.task; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.mcwl.common.constant.QueueConstants; import com.mcwl.memberCenter.domain.Member; -import com.mcwl.memberCenter.enums.MemberMenu; +import com.mcwl.memberCenter.enums.MemberEnum; import com.mcwl.memberCenter.service.MemberService; import lombok.RequiredArgsConstructor; import org.springframework.amqp.rabbit.core.RabbitTemplate; @@ -47,7 +47,7 @@ public class UserMemberTask { return; } for (Member member : memberList) { - member.setPoints(0); + member.setPoints(0.0); member.setUpdateTime(new Date()); } memberService.updateBatchById(memberList); @@ -60,8 +60,8 @@ public class UserMemberTask { LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); // endDate大于当前时间, subscriptionStatus不为过期 qw.gt(Member::getEndDate, System.currentTimeMillis()) - .ne(Member::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_EXPIRED) - .ne(Member::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_PENDING); + .ne(Member::getSubscriptionStatus, MemberEnum.MEMBER_CENTER_EXPIRED) + .ne(Member::getSubscriptionStatus, MemberEnum.MEMBER_CENTER_PENDING); List memberList = memberService.list(qw); if (memberList == null || memberList.isEmpty()) { return; @@ -70,10 +70,10 @@ public class UserMemberTask { System.out.println("userMemberList = " + memberList); for (Member member : memberList) { - MemberMenu subscriptionStatus = member.getSubscriptionStatus(); - if (subscriptionStatus == MemberMenu.MEMBER_CENTER_ACTIVE) { + MemberEnum subscriptionStatus = member.getSubscriptionStatus(); + if (subscriptionStatus == MemberEnum.MEMBER_CENTER_ACTIVE) { // 如果subscriptionStatus是活跃的,表示连续包月。订阅状态改为"待支付" - member.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_PENDING); + member.setSubscriptionStatus(MemberEnum.MEMBER_CENTER_PENDING); // nextBillingDate设置为当前会员结束日期的下个月的同一天,发送账单通知 Calendar calendar = Calendar.getInstance(); calendar.setTime(member.getEndDate()); @@ -82,9 +82,9 @@ public class UserMemberTask { memberService.updateById(member); // 发送会员账单消息,如果支付成功,更新last_payment_date,并重新计算end_date(start_date + 1个月) rabbitTemplate.convertAndSend(QueueConstants.MEMBER_BILLING_QUEUE, member); - } else if (subscriptionStatus == MemberMenu.MEMBER_CENTER_INACTIVE) { + } else if (subscriptionStatus == MemberEnum.MEMBER_CENTER_INACTIVE) { // 不是连续包月,会员状态改为过期,状态改为"1" - member.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_EXPIRED); + member.setSubscriptionStatus(MemberEnum.MEMBER_CENTER_EXPIRED); member.setStatus("1"); member.setUpdateTime(new Date()); }