Commit 7c69a675 authored by liuhan's avatar liuhan

会员等级定时任务

parent d6d1b851
package cn.iocoder.yudao.module.member.job; package cn.iocoder.yudao.module.member.job;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQuery; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQuery;
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler; import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberUserLevelConfigDO; import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberUserLevelConfigDO;
import cn.iocoder.yudao.module.member.dal.dataobject.score.MemberUserScoreDO; import cn.iocoder.yudao.module.member.dal.dataobject.levelOperatLog.MemberUserLevelOperateLogDO;
import cn.iocoder.yudao.module.member.dal.dataobject.memberUserLevelDetail.MemberUserLevelDetailsDO;
import cn.iocoder.yudao.module.member.dal.dataobject.scoreLog.MemberUserScoreLogDO; import cn.iocoder.yudao.module.member.dal.dataobject.scoreLog.MemberUserScoreLogDO;
import cn.iocoder.yudao.module.member.dal.dataobject.scoreRule.ScoreRuleDO;
import cn.iocoder.yudao.module.member.dal.redis.scoreRule.ScoreRuleRedisDao;
import cn.iocoder.yudao.module.member.enums.MemberLevelStatusEnum; import cn.iocoder.yudao.module.member.enums.MemberLevelStatusEnum;
import cn.iocoder.yudao.module.member.enums.ScoreRuleStatusEnum;
import cn.iocoder.yudao.module.member.service.level.MemberUserLevelConfigService; import cn.iocoder.yudao.module.member.service.level.MemberUserLevelConfigService;
import cn.iocoder.yudao.module.member.service.score.MemberUserScoreService; import cn.iocoder.yudao.module.member.service.levelDetails.MemberUserLevelDetailsService;
import cn.iocoder.yudao.module.member.service.levelOperateLog.MemberUserLevelOperateLogService;
import cn.iocoder.yudao.module.member.service.scoreLog.MemberUserScoreLogService; import cn.iocoder.yudao.module.member.service.scoreLog.MemberUserScoreLogService;
import cn.iocoder.yudao.module.member.service.scoreRule.ScoreRuleService;
import cn.iocoder.yudao.module.member.service.user.MemberUserService; import cn.iocoder.yudao.module.member.service.user.MemberUserService;
import cn.iocoder.yudao.module.member.vo.memberUserScoreLog.MemberUserScoreLogBackVO;
import cn.iocoder.yudao.module.member.vo.memberUserScoreLog.MemberUserScoreLogQueryVO;
import cn.iocoder.yudao.module.member.vo.userLevelDetails.MemberUserLevelDetailsBackVO;
import cn.iocoder.yudao.module.member.vo.userLevelDetails.MemberUserLevelDetailsQueryVO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -22,6 +27,8 @@ import org.springframework.stereotype.Component; ...@@ -22,6 +27,8 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* 会员等级详情定时任务 * 会员等级详情定时任务
...@@ -42,6 +49,12 @@ public class userLevelDetailsTask implements JobHandler { ...@@ -42,6 +49,12 @@ public class userLevelDetailsTask implements JobHandler {
private MemberUserService userService; private MemberUserService userService;
@Resource @Resource
private MemberUserScoreLogService memberUserScoreLogService; private MemberUserScoreLogService memberUserScoreLogService;
@Resource
private MemberUserLevelDetailsService memberUserLevelDetailsService;
@Resource
private AdminUserApi adminUserApi;
@Resource
private MemberUserLevelOperateLogService memberUserLevelOperateService;
@Override @Override
public String execute(String param) throws Exception { public String execute(String param) throws Exception {
log.info("level config expire task running"); log.info("level config expire task running");
...@@ -53,15 +66,194 @@ public class userLevelDetailsTask implements JobHandler { ...@@ -53,15 +66,194 @@ public class userLevelDetailsTask implements JobHandler {
return "success"; return "success";
} else { } else {
todoList.forEach(userLevelConfigDO -> { todoList.forEach(userLevelConfigDO -> {
log.info("规则名称:{}",userLevelConfigDO.getRuleNumber());
MemberUserScoreLogQueryVO memberUserScoreLogQueryVO=new MemberUserScoreLogQueryVO();
LambdaQuery<MemberUserScoreLogDO> memberUserScoreLogDoLambdaQuery = new LambdaQuery<>(); LambdaQuery<MemberUserScoreLogDO> memberUserScoreLogDoLambdaQuery = new LambdaQuery<>();
//获取满足条件的所有用户 //获取满足条件的所有用户
//查找左侧,创建是大于等于积分累计开始日期或者大于现在时间减去积分累计周期,查找右侧 创建时间小于积分开始累计日期+积分累计周期或者小于现在
if (userLevelConfigDO.getStartDate()!=null){ if (userLevelConfigDO.getStartDate()!=null){
memberUserScoreLogDoLambdaQuery.ge(MemberUserScoreLogDO::getCreateTime, userLevelConfigDO.getStartDate()); memberUserScoreLogQueryVO.setStartTime(userLevelConfigDO.getStartDate());
memberUserScoreLogQueryVO.setEndTime(DateUtils.getNextNDayStart(userLevelConfigDO.getStartDate(), userLevelConfigDO.getAccumulationPeriod()));
}else{ }else{
memberUserScoreLogDoLambdaQuery.ge(MemberUserScoreLogDO::getCreateTime, DateUtils.getNextNDayStart(new Date(), -(userLevelConfigDO.getAccumulationPeriod()))); memberUserScoreLogQueryVO.setStartTime(DateUtils.getNextNDayStart(new Date(), -(userLevelConfigDO.getAccumulationPeriod())));
memberUserScoreLogQueryVO.setEndTime(new Date());
}
memberUserScoreLogQueryVO.setPageSize(Integer.MAX_VALUE);
//查出所有的符合条件的积分列表
PageResult<MemberUserScoreLogBackVO> page = memberUserScoreLogService.getPage(memberUserScoreLogQueryVO);
List<MemberUserScoreLogBackVO> memberUserScoreLogList = page.getList();
if (CollectionUtils.isEmpty(memberUserScoreLogList)){
return;
}
Map<Long,List<MemberUserScoreLogBackVO>> memberUserMap=memberUserScoreLogList.stream().collect(Collectors.groupingBy(MemberUserScoreLogBackVO::getMemberId));
for (Map.Entry<Long, List<MemberUserScoreLogBackVO>> entry : memberUserMap.entrySet()) {
Long memberId = entry.getKey(); // 获取键(key)
List<MemberUserScoreLogBackVO> scoreLogs = entry.getValue(); // 获取值(value)
// 打印会员ID和积分记录数量
log.info("会员ID: {}, 积分记录数量: {}", memberId, scoreLogs.size());
//定义两个变量存储积分,一个是增加积分,一个是减少积分
int addScore = 0;
int reduceScore = 0;
// 遍历积分记录列表
for (MemberUserScoreLogBackVO scoreLog : scoreLogs) {
// 打印每个积分记录的详细信息
if (scoreLog.getExpireTime()!= null && scoreLog.getExpireTime().before(new Date())){
continue;
}
//增加积分
if (scoreLog.getOperateType()==1){
addScore+=scoreLog.getScoreCount();
}else {
reduceScore+=scoreLog.getScoreCount();
}
}
if (addScore>reduceScore){
int score = addScore - reduceScore;
log.info("符合规则积分数量: {}", score);
if (score>userLevelConfigDO.getLowerCount()){
//进入积分规则设置方法
//大于最低分,符合规则,查看是否有规则详情
Boolean b = setConfigDetails(memberId, userLevelConfigDO);
if (b){
log.info("符合规则,规则名称:{},用户id:{}",userLevelConfigDO.getRuleNumber(),memberId);
}else {
log.info("不符合规则,规则名称:{},用户id:{}",userLevelConfigDO.getRuleNumber(),memberId);
}
}
}
} }
log.info("定时任务完成");
}); });
} }
return "success"; return "success";
} }
private Boolean setConfigDetails(Long memberId,MemberUserLevelConfigDO memberUserLevelConfigDO){
//获取用户是否有详情
MemberUserLevelDetailsQueryVO queryVO=new MemberUserLevelDetailsQueryVO();
queryVO.setMemberId(memberId);
PageResult<MemberUserLevelDetailsBackVO> page = memberUserLevelDetailsService.getPage(queryVO);
AdminUserRespDTO user = adminUserApi.getUser(1L);
List<MemberUserLevelDetailsBackVO> list = page.getList();
if (CollectionUtils.isEmpty(list)){
//没有详情,新增一条
MemberUserLevelDetailsDO memberUserLevelDetailsDO=new MemberUserLevelDetailsDO();
memberUserLevelDetailsDO.setMemberId(memberId);
memberUserLevelDetailsDO.setLevel(memberUserLevelConfigDO.getLevel());
memberUserLevelDetailsDO.setSpecificSettings(false);
memberUserLevelDetailsDO.setValidityPeriod(memberUserLevelConfigDO.getValidityPeriod());
memberUserLevelDetailsDO.setRemarks(memberUserLevelConfigDO.getDescription());
memberUserLevelDetailsDO.setConfigId(memberUserLevelConfigDO.getId());
memberUserLevelDetailsDO.setCreator(String.valueOf(user.getId()));
memberUserLevelDetailsDO.setUpdater(String.valueOf(user.getId()));
memberUserLevelDetailsService.save(memberUserLevelDetailsDO);
log.info("客户没有等级详情,增加等级详情进入升级操作,规则id:{},用户id:{}",memberUserLevelConfigDO.getRuleNumber(),memberId);
//设置用户为admin
//插入一条日志 升级日志
MemberUserLevelOperateLogDO memberUserLevelOperateLogDo = MemberUserLevelOperateLogDO.builder()
.configId(memberUserLevelDetailsDO.getConfigId())
.configName(memberUserLevelConfigDO.getName())
.memberId(memberUserLevelDetailsDO.getMemberId())
.operator(user.getNickname())
.remarks(memberUserLevelDetailsDO.getRemarks())
.level(memberUserLevelDetailsDO.getLevel())
.operateType(1)
.build();
memberUserLevelOperateService.save(memberUserLevelOperateLogDo);
return true;
}else{
//1.用户等级是否设置不降级
MemberUserLevelDetailsBackVO memberUserLevelDetailsBackVO = list.get(0);
if (!memberUserLevelDetailsBackVO.getSpecificSettings()){
//查看等级大小比较
if (memberUserLevelDetailsBackVO.getLevel()<memberUserLevelConfigDO.getLevel()){
//升级流程
//设置用户为admin
MemberUserLevelDetailsDO memberUserLevelDetailsDO=new MemberUserLevelDetailsDO();
memberUserLevelDetailsDO.setId(memberUserLevelDetailsBackVO.getId());
memberUserLevelDetailsDO.setMemberId(memberUserLevelDetailsBackVO.getMemberId());
memberUserLevelDetailsDO.setLevel(memberUserLevelConfigDO.getLevel());
memberUserLevelDetailsDO.setSpecificSettings(memberUserLevelDetailsBackVO.getSpecificSettings());
memberUserLevelDetailsDO.setValidityPeriod(memberUserLevelConfigDO.getValidityPeriod());
memberUserLevelDetailsDO.setRemarks(memberUserLevelConfigDO.getDescription());
memberUserLevelDetailsDO.setConfigId(memberUserLevelConfigDO.getId());
memberUserLevelDetailsDO.setUpdater(String.valueOf(user.getId()));
memberUserLevelDetailsService.updateById(memberUserLevelDetailsDO);
//插入一条日志 升级日志
MemberUserLevelOperateLogDO memberUserLevelOperateLogDo = MemberUserLevelOperateLogDO.builder()
.configId(memberUserLevelDetailsDO.getConfigId())
.configName(memberUserLevelConfigDO.getName())
.memberId(memberUserLevelDetailsDO.getMemberId())
.operator(user.getNickname())
.remarks(memberUserLevelDetailsDO.getRemarks())
.level(memberUserLevelConfigDO.getLevel())
.operateType(1)
.build();
memberUserLevelOperateService.save(memberUserLevelOperateLogDo);
log.info("客户等级小于当前等级,等级详情进入升级操作,规则id:{},用户id:{}",memberUserLevelConfigDO.getRuleNumber(),memberId);
return true;
}else if(memberUserLevelDetailsBackVO.getLevel()==memberUserLevelConfigDO.getLevel()&&!memberUserLevelDetailsBackVO.getRuleNumber().equals(memberUserLevelConfigDO.getRuleNumber())){
//级别相同比较sort顺序
MemberUserLevelConfigDO memberUserLevelConfigOldDo = memberUserLevelConfigService.getById(memberUserLevelDetailsBackVO.getConfigId());
if (memberUserLevelConfigOldDo.getSort()<memberUserLevelConfigDO.getSort()){
//降级流程
//设置用户为admin
MemberUserLevelDetailsDO memberUserLevelDetailsDO=new MemberUserLevelDetailsDO();
memberUserLevelDetailsDO.setId(memberUserLevelDetailsBackVO.getId());
memberUserLevelDetailsDO.setMemberId(memberUserLevelDetailsBackVO.getMemberId());
memberUserLevelDetailsDO.setLevel(memberUserLevelConfigDO.getLevel());
memberUserLevelDetailsDO.setSpecificSettings(memberUserLevelDetailsBackVO.getSpecificSettings());
memberUserLevelDetailsDO.setValidityPeriod(memberUserLevelConfigDO.getValidityPeriod());
memberUserLevelDetailsDO.setRemarks(memberUserLevelConfigDO.getDescription());
memberUserLevelDetailsDO.setConfigId(memberUserLevelConfigDO.getId());
memberUserLevelDetailsDO.setUpdater(String.valueOf(user.getId()));
memberUserLevelDetailsService.updateById(memberUserLevelDetailsDO);
//插入一条日志 升级日志
MemberUserLevelOperateLogDO memberUserLevelOperateLogDo = MemberUserLevelOperateLogDO.builder()
.configId(memberUserLevelDetailsDO.getConfigId())
.configName(memberUserLevelConfigDO.getName())
.memberId(memberUserLevelDetailsDO.getMemberId())
.operator(user.getNickname())
.remarks(memberUserLevelDetailsDO.getRemarks())
.level(memberUserLevelConfigDO.getLevel())
.operateType(2)
.build();
memberUserLevelOperateService.save(memberUserLevelOperateLogDo);
}
}else{
//查看创建时间加上有效期是否小于于当前时间,进行降级
if (memberUserLevelDetailsBackVO.getValidityPeriod()!=null&&memberUserLevelDetailsBackVO.getCreateTime().getTime()+memberUserLevelDetailsBackVO.getValidityPeriod()*24*60*60*1000<new Date().getTime()){
//设置用户为admin
//设置降级等级
MemberUserLevelDetailsDO memberUserLevelDetailsDO=new MemberUserLevelDetailsDO();
memberUserLevelDetailsDO.setId(memberUserLevelDetailsBackVO.getId());
memberUserLevelDetailsDO.setMemberId(memberUserLevelDetailsBackVO.getMemberId());
memberUserLevelDetailsDO.setLevel(memberUserLevelConfigDO.getLevel());
memberUserLevelDetailsDO.setSpecificSettings(memberUserLevelDetailsBackVO.getSpecificSettings());
memberUserLevelDetailsDO.setValidityPeriod(memberUserLevelConfigDO.getValidityPeriod());
memberUserLevelDetailsDO.setRemarks(memberUserLevelConfigDO.getDescription());
memberUserLevelDetailsDO.setConfigId(memberUserLevelConfigDO.getId());
memberUserLevelDetailsDO.setUpdater(String.valueOf(user.getId()));
memberUserLevelDetailsService.updateById(memberUserLevelDetailsDO);
log.info("客户等级大于当前等级,当等级有效期失效,等级详情进入降级操作,规则id:{},用户id:{}",memberUserLevelConfigDO.getRuleNumber(),memberId);
//插入一条日志 降级日志
MemberUserLevelOperateLogDO memberUserLevelOperateLogDo = MemberUserLevelOperateLogDO.builder()
.configId(memberUserLevelDetailsDO.getConfigId())
.configName(memberUserLevelConfigDO.getName())
.memberId(memberUserLevelDetailsDO.getMemberId())
.operator(user.getNickname())
.remarks(memberUserLevelDetailsDO.getRemarks())
.level(memberUserLevelConfigDO.getLevel())
.operateType(2)
.build();
memberUserLevelOperateService.save(memberUserLevelOperateLogDo);
return true;
}
}
}
}
return false;
}
} }
...@@ -45,6 +45,10 @@ public class MemberUserLevelDetailsBackVO { ...@@ -45,6 +45,10 @@ public class MemberUserLevelDetailsBackVO {
@ApiModelProperty(value = "最后更新时间", required = true) @ApiModelProperty(value = "最后更新时间", required = true)
private Date updateTime; private Date updateTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
@ApiModelProperty(value = "最后更新人") @ApiModelProperty(value = "最后更新人")
private String updater; private String updater;
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
muld.updater as updater, muld.updater as updater,
muld.remarks as remarks, muld.remarks as remarks,
muld.update_time as updateTime , muld.update_time as updateTime ,
muld.create_time as createTime ,
muld.`level` as level, muld.`level` as level,
muld.validity_period as validityPeriod, muld.validity_period as validityPeriod,
muld.specific_settings as specificSettings muld.specific_settings as specificSettings
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment