Merge branch 'preview' of https://gitea.qinmian.online/CY/mcwl-ai into preview

feature/comment
ChenYan 2025-01-04 17:11:04 +08:00
commit 11b42f5fe2
36 changed files with 811 additions and 289 deletions

View File

@ -0,0 +1,137 @@
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.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.*;
import java.util.List;
@RestController
@RequestMapping("member")
@RequiredArgsConstructor
public class MemberController {
private final MemberService memberService;
private final ISysUserService sysUserService;
private final MemberConsumeService memberConsumeService;
private final MemberBenefitService memberBenefitService;
/**
*
*
* @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);
if (member == null) {
return AjaxResult.warn("创建会员失败");
}
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("用户不存在");
}
Member member = memberService.getUseUserMemberByUserId(userId);
if (member == null) {
return AjaxResult.warn("用户未开通会员");
}
PointsVO pointsVO = new PointsVO();
// 会员消费记录
List<MemberConsume> memberConsumeList = memberConsumeService
.lambdaQuery()
.eq(MemberConsume::getUserId, userId)
.list();
pointsVO.setPoints(member.getPoints());
pointsVO.setMemberConsumeList(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);
}
}

View File

@ -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<MemberLevel> memberLevelList = memberLevelService.list();
return AjaxResult.success(memberLevelList);
}
/**
*
*/
@GetMapping("getMemberBenefitList")
public AjaxResult getMemberBenefitList() {
List<MemberBenefitVO> memberBenefitVOList = new ArrayList<>();
List<MemberLevel> memberLevelList = memberLevelService.list();
for (MemberLevel memberLevel : memberLevelList) {
MemberBenefitVO memberBenefitVO = new MemberBenefitVO();
memberBenefitVO.setMemberLevel(memberLevel);
// 获取会员等级对应的权益
List<MemberBenefit> memberBenefitList = memberBenefitService.lambdaQuery()
.eq(MemberBenefit::getMemberLevelId, memberLevel.getId())
.list();
memberBenefitVO.setMemberBenefitList(memberBenefitList);
memberBenefitVOList.add(memberBenefitVO);
}
return AjaxResult.success(memberBenefitVOList);
}
}

View File

@ -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;
}

View File

@ -0,0 +1,17 @@
package com.mcwl.web.controller.memberCenter.pojo.dto;
import lombok.Data;
@Data
public class UserMemberDto {
// 用户ID
private Long userId;
// 会员ID
private Long memberLevelId;
// 支付方式
private String paymentMethod;
}

View File

@ -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<MemberBenefit> memberBenefitList = new ArrayList<>();
}

View File

@ -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<MemberConsume> memberConsumeList = new ArrayList<>();
}

View File

@ -1,12 +1,13 @@
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 com.mcwl.web.controller.memberCenter.MemberLevelController;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
@ -15,23 +16,29 @@ import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = McWlApplication.class)
public class MemberTest {
public class MemberCenterTest {
@Autowired
private MemberLevelService memberLevelService;
@Autowired
private MemberController memberController;
@Autowired
private MemberService memberService;
@Autowired
private UserMemberService userMemberService;
private UserMemberTask userMemberTask;
@Autowired
private UserMemberTask userMemberTask;
private MemberLevelController memberLevelController;
@Autowired
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 +59,18 @@ 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);
}
@Test
public void getMemberLevelListTest() {
System.out.println("memberLevelController.getMemberBenefitList() = " + memberLevelController.getMemberBenefitList());
}
}

View File

@ -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;

View File

@ -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_datestart_date + 1个月
log.info("获取到会员账单的数据:{}", userMember);
log.info("获取到会员账单的数据:{}", member);
} catch (Exception e) {
log.error("处理会员账单消息时出错: {}", e.getMessage(), e);
try {

View File

@ -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.MemberEnum;
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 Double points;
// 订阅周期(天)
private Integer subscriptionPeriod;
// 订阅状态 active活跃连续包月、inactive非活跃不连续包月、pending待支付和expired过期
private MemberEnum subscriptionStatus;
// 支付方式
private String paymentMethod;
// 上次支付时间
private Date lastPaymentDate;
// 下次计费时间
private Date nextBillingDate;
// 上次登录时间
private Date lastLoginDate;
// 状态(0:正常 1:禁用)
private String status;
// 备注
private String remark;
}

View File

@ -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;
}

View File

@ -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 Double consumePoints;
// 剩余积分
private Double remainingPoints;
// 消费时间
private Date consumeTime;
}

View File

@ -0,0 +1,29 @@
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;
@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 MemberPeriodicEnum subscriptionPeriod;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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", "待支付"),

View File

@ -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;
}

View File

@ -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<MemberBenefit> {
}

View File

@ -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<MemberConsume> {
}

View File

@ -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<UserMember> {
@Mapper
public interface MemberLevelMapper extends BaseMapper<MemberLevel> {
}

View File

@ -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<Member> {
}

View File

@ -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<MemberBenefit> {
}

View File

@ -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<MemberConsume> {
}

View File

@ -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<MemberLevel> {
}

View File

@ -7,5 +7,28 @@ import java.util.List;
public interface MemberService extends IService<Member> {
/**
*
*
* @param userId id
* @param memberLevelId id
* @return
*/
Member createUserMember(Long userId, Long memberLevelId, String paymentMethod);
/**
*
* @return 使
*/
List<Member> getUseUserMember();
/**
* id使
* @param userId id
* @return
*/
Member getUseUserMemberByUserId(Long userId);
Member rechargePoints(Long userId, Double points);
}

View File

@ -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<UserMember> {
/**
*
* @param userId id
* @param memberId id
* @return
*/
UserMember createUserMember(Long userId, Long memberId, String paymentMethod);
}

View File

@ -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<MemberBenefitMapper, MemberBenefit> implements MemberBenefitService {
}

View File

@ -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<MemberConsumeMapper, MemberConsume> implements MemberConsumeService {
}

View File

@ -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<MemberLevelMapper, MemberLevel> implements MemberLevelService {
}

View File

@ -1,14 +1,185 @@
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.MemberBenefit;
import com.mcwl.memberCenter.domain.MemberLevel;
import com.mcwl.memberCenter.domain.Member;
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 java.util.List;
import javax.validation.constraints.NotNull;
import java.util.*;
@Service
@RequiredArgsConstructor
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {
private final MemberLevelService memberLevelService;
private final ISysUserService sysUserService;
private final MemberBenefitService memberBenefitService;
@Override
public Member createUserMember(Long userId, Long memberLevelId, String paymentMethod) {
if (userId == null) {
return null;
}
SysUser user = sysUserService.selectUserById(userId);
if (user == null || memberLevelId == null) {
return null;
}
MemberLevel memberLevel = memberLevelService.getById(memberLevelId);
if (memberLevel == null) {
return null;
}
// 查询用户是否已经存在会员
LambdaQueryWrapper<Member> lqw = new LambdaQueryWrapper<>();
lqw.eq(Member::getUserId, userId)
// subscriptionStatus不为expired
.ne(Member::getSubscriptionStatus, MemberEnum.MEMBER_CENTER_EXPIRED)
.orderBy(true, false, Member::getEndDate);
List<Member> 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();
// 设置会员开始时间和结束时间
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 {
// 用户不存在会员
// 设置会员开始时间和结束时间
Calendar calendar = Calendar.getInstance();
member.setStartDate(calendar.getTime());
member.setEndDate(this.getEndDate(memberLevel.getSubscriptionPeriod(), calendar));
}
// 设置积分
MemberBenefit memberBenefit = memberBenefitService.lambdaQuery()
.eq(MemberBenefit::getMemberLevelId, memberLevelId)
.eq(MemberBenefit::getBenefitType, MemberBenefitTypeEnum.POINTS)
.one();
if (memberBenefit != null) {
member.setPoints(memberBenefit.getBenefitDiscount());
}
// 设置订阅状态
if (memberLevel.getSubscriptionPeriod() == MemberPeriodicEnum.CONTINUE_MONTH) {
// 连续包月,会员状态为活跃
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(MemberEnum.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<Member> getUseUserMember() {
return this.getUseUserMember(null);
}
@Override
public Member getUseUserMemberByUserId(Long userId) {
List<Member> 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<Member> getUseUserMember(Long userId) {
// startDate 小于等于当前时间、endDate 大于等于当前时间
// subscriptionStatus 不为 "过期" 或 "待支付"
// status 为 0 的
LambdaQueryWrapper<Member> qw = new LambdaQueryWrapper<>();
qw.le(Member::getStartDate, new Date())
.ge(Member::getEndDate, new Date())
.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();
}
}

View File

@ -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<UserMemberMapper, UserMember> implements UserMemberService {
private final MemberService memberService;
private final ISysUserService sysUserService;
public void aaa() {
LambdaQueryWrapper<Member> 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<UserMember> lqw = new LambdaQueryWrapper<>();
lqw.eq(UserMember::getUserId, userId)
// subscriptionStatus不为expired
.ne(UserMember::getSubscriptionStatus, MemberMenu.MEMBER_CENTER_EXPIRED)
.orderBy(true, false, UserMember::getEndDate);
List<UserMember> 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;
}
}

View File

@ -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.enums.MemberMenu;
import com.mcwl.memberCenter.service.UserMemberService;
import com.mcwl.memberCenter.domain.Member;
import com.mcwl.memberCenter.enums.MemberEnum;
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<UserMember> userMemberList = this.getUseUserMember();
if (userMemberList == null || userMemberList.isEmpty()) {
List<Member> 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<UserMember> userMemberList = this.getUseUserMember();
if (userMemberList == null || userMemberList.isEmpty()) {
List<Member> 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.0);
member.setUpdateTime(new Date());
}
userMemberService.updateBatchById(userMemberList);
memberService.updateBatchById(memberList);
}
/**
* 1h
*/
public void updateSubscriptionStatusTask() {
LambdaQueryWrapper<UserMember> qw = new LambdaQueryWrapper<>();
LambdaQueryWrapper<Member> 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<UserMember> userMemberList = userMemberService.list(qw);
if (userMemberList == null || userMemberList.isEmpty()) {
qw.gt(Member::getEndDate, System.currentTimeMillis())
.ne(Member::getSubscriptionStatus, MemberEnum.MEMBER_CENTER_EXPIRED)
.ne(Member::getSubscriptionStatus, MemberEnum.MEMBER_CENTER_PENDING);
List<Member> 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();
if (subscriptionStatus == MemberMenu.MEMBER_CENTER_ACTIVE) {
for (Member member : memberList) {
MemberEnum subscriptionStatus = member.getSubscriptionStatus();
if (subscriptionStatus == MemberEnum.MEMBER_CENTER_ACTIVE) {
// 如果subscriptionStatus是活跃的表示连续包月。订阅状态改为"待支付"
userMember.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_PENDING);
member.setSubscriptionStatus(MemberEnum.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_datestart_date + 1个月
rabbitTemplate.convertAndSend(QueueConstants.MEMBER_BILLING_QUEUE, userMember);
} else if (subscriptionStatus == MemberMenu.MEMBER_CENTER_INACTIVE) {
rabbitTemplate.convertAndSend(QueueConstants.MEMBER_BILLING_QUEUE, member);
} else if (subscriptionStatus == MemberEnum.MEMBER_CENTER_INACTIVE) {
// 不是连续包月,会员状态改为过期,状态改为"1"
userMember.setSubscriptionStatus(MemberMenu.MEMBER_CENTER_EXPIRED);
userMember.setStatus("1");
userMember.setUpdateTime(new Date());
member.setSubscriptionStatus(MemberEnum.MEMBER_CENTER_EXPIRED);
member.setStatus("1");
member.setUpdateTime(new Date());
}
}
}
// 获取正常使用的会员
private List<UserMember> getUseUserMember() {
// startDate 小于等于当前时间、endDate 大于等于当前时间
// subscriptionStatus 不为 "过期" 或 "待支付"
// status 为 0 的
LambdaQueryWrapper<UserMember> 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);
}
}

View File

@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mcwl.memberCenter.mapper.MemberMapper">
<mapper namespace="com.mcwl.memberCenter.mapper.MemberLevelMapper">

View File

@ -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;

View File

@ -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;

View File

@ -25,8 +25,6 @@ public class Invitation extends BaseEntity {
// 邀请码
private String invitationCode;
// 备注
private String remark;
@Override
public boolean equals(Object o) {