This commit is contained in:
777
2026-01-08 17:38:41 +08:00
parent 20c5908f34
commit 432743addf
27 changed files with 825 additions and 170 deletions

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