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