123
This commit is contained in:
207
ruoyi-cai/src/main/java/com/ruoyi/cai/lottery/PointManager.java
Normal file
207
ruoyi-cai/src/main/java/com/ruoyi/cai/lottery/PointManager.java
Normal file
@@ -0,0 +1,207 @@
|
||||
package com.ruoyi.cai.lottery;
|
||||
|
||||
import com.ruoyi.cai.domain.*;
|
||||
import com.ruoyi.cai.enums.SystemConfigEnum;
|
||||
import com.ruoyi.cai.enums.point.PointChangeLogActionTypeEnum;
|
||||
import com.ruoyi.cai.enums.point.PointChangeTraceTypeEnum;
|
||||
import com.ruoyi.cai.manager.SystemConfigManager;
|
||||
import com.ruoyi.cai.mapper.AccountMapper;
|
||||
import com.ruoyi.cai.service.PointChangeLogService;
|
||||
import com.ruoyi.cai.service.PointRecordLogService;
|
||||
import com.ruoyi.cai.service.UserService;
|
||||
import com.ruoyi.cai.ws.constant.RedisConstant;
|
||||
import com.ruoyi.common.exception.ServiceException;
|
||||
import com.ruoyi.common.utils.ServletUtils;
|
||||
import lombok.Data;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.redisson.api.RAtomicLong;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class PointManager {
|
||||
|
||||
@Autowired
|
||||
private SystemConfigManager systemConfigManager;
|
||||
@Autowired
|
||||
private RedissonClient redissonClient;
|
||||
@Resource
|
||||
private AccountMapper accountMapper;
|
||||
@Autowired
|
||||
private PointChangeLogService pointChangeLogService;
|
||||
@Autowired
|
||||
private PointRecordLogService pointRecordLogService;
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
public String getRedisKey(Long userId){
|
||||
LocalDate date = LocalDate.now();
|
||||
String dateStr = date.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
|
||||
return String.format(RedisConstant.POINT_DAYS_USER, dateStr, userId);
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class CheckPointIncr{
|
||||
private boolean allowPoint;
|
||||
private Long givePoint;
|
||||
private String remark;
|
||||
|
||||
}
|
||||
|
||||
public CheckPointIncr checkPointIncr(Long userId,Long givePoint){
|
||||
CheckPointIncr result = new CheckPointIncr();
|
||||
Long maxPointDays = systemConfigManager.getSystemConfigOfLong(SystemConfigEnum.MAX_POINT_DAY);
|
||||
if(maxPointDays == null || maxPointDays <= 0){ // 未开启
|
||||
result.setAllowPoint(true);
|
||||
result.setGivePoint(givePoint);
|
||||
return result;
|
||||
}
|
||||
String redisKey = getRedisKey(userId);
|
||||
RAtomicLong atomicLong = redissonClient.getAtomicLong(redisKey);
|
||||
Long userDaysPoint = atomicLong.get();
|
||||
if(userDaysPoint >= maxPointDays){ // 今日获取积分已超过每日最大积分
|
||||
result.setAllowPoint(false);
|
||||
return result;
|
||||
}
|
||||
if(givePoint + userDaysPoint >= maxPointDays) { // 算上这次已经超过每日最大积分
|
||||
Long currentGivePoint = maxPointDays - userDaysPoint;
|
||||
String remark = String.format("实际需赠送%s,今日已超过上限%s,只需赠送%s", givePoint,maxPointDays,currentGivePoint);
|
||||
result.setAllowPoint(true);
|
||||
result.setGivePoint(currentGivePoint);
|
||||
result.setRemark(remark);
|
||||
return result;
|
||||
}
|
||||
result.setAllowPoint(true);
|
||||
result.setGivePoint(givePoint);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void adminChange(Long userId, Long givePoint){
|
||||
accountMapper.incrPoint(userId, givePoint);
|
||||
User user = userService.getById(userId);
|
||||
PointChangeLog pointChangeLog = new PointChangeLog();
|
||||
pointChangeLog.setUserId(userId);
|
||||
pointChangeLog.setUsercode(user.getUsercode());
|
||||
pointChangeLog.setActionType(PointChangeLogActionTypeEnum.SYSTEM.getCode());
|
||||
String message = String.format("系统调整:%s%s积分", givePoint > 0 ? "新增" : "减少", givePoint);
|
||||
pointChangeLog.setMessage(message);
|
||||
pointChangeLog.setChangeValue(givePoint);
|
||||
pointChangeLog.setIsAdmin(true);
|
||||
pointChangeLog.setTraceLinkType(PointChangeTraceTypeEnum.SYSTEM.getCode());
|
||||
pointChangeLogService.save(pointChangeLog);
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void adminInvite(Long userId, Long givePoint, Long inviteUserId, String traceId){
|
||||
CheckPointIncr checkPointIncr = this.checkPointIncr(userId, givePoint);
|
||||
if(checkPointIncr.isAllowPoint()){
|
||||
User user = userService.getById(userId);
|
||||
User inviteUser = userService.getById(inviteUserId);
|
||||
PointChangeLog pointChangeLog = new PointChangeLog();
|
||||
pointChangeLog.setUserId(userId);
|
||||
pointChangeLog.setUsercode(user.getUsercode());
|
||||
pointChangeLog.setActionType(PointChangeLogActionTypeEnum.SYSTEM.getCode());
|
||||
String message = String.format("从【%s】的充值中获得%s积分", inviteUser.getNickname(), givePoint);
|
||||
pointChangeLog.setMessage(message);
|
||||
pointChangeLog.setTarUserId(inviteUser.getId());
|
||||
pointChangeLog.setTarUsercode(inviteUser.getUsercode());
|
||||
pointChangeLog.setTarName(inviteUser.getNickname());
|
||||
pointChangeLog.setTarImg(inviteUser.getAvatar());
|
||||
pointChangeLog.setChangeValue(givePoint);
|
||||
pointChangeLog.setIsAdmin(true);
|
||||
pointChangeLog.setRemark(checkPointIncr.getRemark());
|
||||
pointChangeLog.setTraceLinkType(PointChangeTraceTypeEnum.INVITE.getCode());
|
||||
pointChangeLog.setTraceId(traceId);
|
||||
pointChangeLogService.save(pointChangeLog);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public PointRecordLog rechargePoint(RechargeOrder rechargeOrder, User user){
|
||||
if(rechargeOrder.getGivePoint() == null || rechargeOrder.getGivePoint() == 0){
|
||||
return null;
|
||||
}
|
||||
log.info("开始赠送积分 orderNo={}", rechargeOrder.getOrderNo());
|
||||
CheckPointIncr checkPointIncr = this.checkPointIncr(user.getId(), rechargeOrder.getGivePoint());
|
||||
if(!checkPointIncr.isAllowPoint()){ // 不参与分销
|
||||
PointRecordLog pointRecordLog = pointRecordLogService.initOrder(rechargeOrder, user);
|
||||
return pointRecordLog;
|
||||
}
|
||||
accountMapper.incrPoint(user.getId(), checkPointIncr.getGivePoint());
|
||||
PointChangeLog pointChangeLog = new PointChangeLog();
|
||||
pointChangeLog.setUserId(user.getId());
|
||||
pointChangeLog.setUsercode(user.getUsercode());
|
||||
pointChangeLog.setActionType(PointChangeLogActionTypeEnum.PAY.getCode());
|
||||
pointChangeLog.setMessage("充值赠送"+checkPointIncr.getGivePoint()+"积分");
|
||||
pointChangeLog.setChangeValue(checkPointIncr.getGivePoint());
|
||||
pointChangeLog.setIsAdmin(false);
|
||||
pointChangeLog.setTraceLinkType(PointChangeTraceTypeEnum.PAY.getCode());
|
||||
pointChangeLog.setTraceId(rechargeOrder.getOrderNo());
|
||||
pointChangeLogService.save(pointChangeLog);
|
||||
PointRecordLog pointRecordLog = pointRecordLogService.initOrder(rechargeOrder, user);
|
||||
String redisKey = getRedisKey(user.getId());
|
||||
RAtomicLong atomicLong = redissonClient.getAtomicLong(redisKey);
|
||||
atomicLong.addAndGet(checkPointIncr.getGivePoint());
|
||||
return pointRecordLog;
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单分销分成
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void rechargeOrderInviteChange(Long userId, Long givePoint, Long inviteUserId, String traceId){
|
||||
CheckPointIncr checkPointIncr = this.checkPointIncr(userId, givePoint);
|
||||
if(checkPointIncr.isAllowPoint()){ // 参与积分
|
||||
User user = userService.getById(userId);
|
||||
User inviteUser = userService.getById(inviteUserId);
|
||||
PointChangeLog pointChangeLog = new PointChangeLog();
|
||||
pointChangeLog.setUserId(userId);
|
||||
pointChangeLog.setUsercode(user.getUsercode());
|
||||
pointChangeLog.setActionType(PointChangeLogActionTypeEnum.INVITE.getCode());
|
||||
String message = String.format("从【%s】中充值分成新增%s积分", inviteUser.getNickname(), givePoint);
|
||||
pointChangeLog.setMessage(message);
|
||||
pointChangeLog.setTarUserId(inviteUser.getId());
|
||||
pointChangeLog.setTarUsercode(inviteUser.getUsercode());
|
||||
pointChangeLog.setTarName(inviteUser.getNickname());
|
||||
pointChangeLog.setTarImg(inviteUser.getAvatar());
|
||||
pointChangeLog.setChangeValue(givePoint);
|
||||
pointChangeLog.setRemark(checkPointIncr.getRemark());
|
||||
pointChangeLog.setIsAdmin(false);
|
||||
pointChangeLog.setTraceLinkType(PointChangeTraceTypeEnum.INVITE.getCode());
|
||||
pointChangeLog.setTraceId(traceId);
|
||||
pointChangeLogService.save(pointChangeLog);
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public PointChangeLog drawPoint(PrizeOnline prizeOnline, User user, Integer drawPoint, String traceId){
|
||||
boolean bb = accountMapper.decrPoint(user.getId(), Long.valueOf(drawPoint));
|
||||
if(!bb){
|
||||
throw new ServiceException("积分不足");
|
||||
}
|
||||
PointChangeLog pointChangeLog = new PointChangeLog();
|
||||
pointChangeLog.setActionType(PointChangeLogActionTypeEnum.USE.getCode());
|
||||
pointChangeLog.setUserId(user.getId());
|
||||
pointChangeLog.setUsercode(user.getUsercode());
|
||||
String message = String.format("抽中【%s】", prizeOnline.getPrizeName());
|
||||
pointChangeLog.setMessage(message);
|
||||
pointChangeLog.setChangeValue(Long.valueOf(drawPoint));
|
||||
pointChangeLog.setOperateIp(ServletUtils.getClientIP());
|
||||
pointChangeLog.setIsAdmin(false);
|
||||
pointChangeLog.setTraceLinkType(PointChangeTraceTypeEnum.USE.getCode());
|
||||
pointChangeLog.setTraceId(traceId);
|
||||
pointChangeLogService.save(pointChangeLog);
|
||||
return pointChangeLog;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user