123
This commit is contained in:
@@ -14,3 +14,12 @@ CREATE TABLE `cai_user_login`
|
|||||||
DEFAULT CHARSET = utf8mb4
|
DEFAULT CHARSET = utf8mb4
|
||||||
COLLATE = utf8mb4_general_ci
|
COLLATE = utf8mb4_general_ci
|
||||||
ROW_FORMAT = DYNAMIC COMMENT ='123记录';
|
ROW_FORMAT = DYNAMIC COMMENT ='123记录';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO `cai_prize_info` (`id`, `prize_name`, `prize_desc`, `prize_img`, `win_probability`, `guarantee_draws`,
|
||||||
|
`min_win_draws`, `stock`, `prize_type`, `prize_price`, `auto_give`, `create_time`,
|
||||||
|
`update_time`)
|
||||||
|
VALUES (1, '谢谢惠顾', '谢谢惠顾', 'test/2026/01/06/0d6bafa0bb1841eabd745f0bf495640c.png', 0.0000, 0, 0, 0, 1, 0, 1,
|
||||||
|
'2026-01-06 15:33:11', '2026-01-14 16:53:47');
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.ruoyi.cai.domain.PrizeOnline;
|
|||||||
import com.ruoyi.cai.domain.PrizeWinningRecord;
|
import com.ruoyi.cai.domain.PrizeWinningRecord;
|
||||||
import com.ruoyi.cai.dto.app.draw.resp.*;
|
import com.ruoyi.cai.dto.app.draw.resp.*;
|
||||||
import com.ruoyi.cai.lottery.DrawService;
|
import com.ruoyi.cai.lottery.DrawService;
|
||||||
|
import com.ruoyi.cai.lottery.LotteryService;
|
||||||
import com.ruoyi.cai.service.PrizeOnlineService;
|
import com.ruoyi.cai.service.PrizeOnlineService;
|
||||||
import com.ruoyi.cai.service.PrizeWinningRecordService;
|
import com.ruoyi.cai.service.PrizeWinningRecordService;
|
||||||
import com.ruoyi.common.core.domain.PageQuery;
|
import com.ruoyi.common.core.domain.PageQuery;
|
||||||
@@ -33,6 +34,8 @@ public class DrawController {
|
|||||||
private PrizeOnlineService prizeOnlineService;
|
private PrizeOnlineService prizeOnlineService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private PrizeWinningRecordService prizeWinningRecordService;
|
private PrizeWinningRecordService prizeWinningRecordService;
|
||||||
|
@Autowired
|
||||||
|
private LotteryService lotteryService;
|
||||||
|
|
||||||
@GetMapping("/baseConfig")
|
@GetMapping("/baseConfig")
|
||||||
@Operation(summary = "获取抽奖相关的基础信息")
|
@Operation(summary = "获取抽奖相关的基础信息")
|
||||||
|
|||||||
@@ -83,6 +83,9 @@ public class PrizeInfoController extends BaseController {
|
|||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@PutMapping()
|
@PutMapping()
|
||||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody PrizeInfo bo) {
|
public R<Void> edit(@Validated(EditGroup.class) @RequestBody PrizeInfo bo) {
|
||||||
|
if(bo.getId() == 1){
|
||||||
|
return R.fail("无法编辑系统内置谢谢惠顾");
|
||||||
|
}
|
||||||
return toAjax(prizeInfoService.updateById(bo));
|
return toAjax(prizeInfoService.updateById(bo));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,6 +99,10 @@ public class PrizeInfoController extends BaseController {
|
|||||||
@DeleteMapping("/{ids}")
|
@DeleteMapping("/{ids}")
|
||||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
@PathVariable Long[] ids) {
|
@PathVariable Long[] ids) {
|
||||||
return toAjax(prizeInfoService.removeBatchByIds(Arrays.asList(ids), true));
|
List<Long> idArray = Arrays.asList(ids);
|
||||||
|
if(idArray.contains(1L)){
|
||||||
|
return R.fail("无法删除系统内置谢谢惠顾");
|
||||||
|
}
|
||||||
|
return toAjax(prizeInfoService.removeBatchByIds(idArray, true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,8 +34,6 @@ import java.util.concurrent.locks.ReentrantLock;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class LotteryService {
|
public class LotteryService {
|
||||||
|
|
||||||
// 固定配置
|
|
||||||
private static final Long THANKS_PRIZE_ID = 0L;
|
|
||||||
private static final String USER_DRAW_COUNT_KEY = "user:draw:count:%s";
|
private static final String USER_DRAW_COUNT_KEY = "user:draw:count:%s";
|
||||||
private static final long USER_DRAW_COUNT_EXPIRE = 7 * 24 * 60 * 60; // 用户累计抽数缓存过期时间:7天
|
private static final long USER_DRAW_COUNT_EXPIRE = 7 * 24 * 60 * 60; // 用户累计抽数缓存过期时间:7天
|
||||||
private static final double RANDOM_MAX = 10000; // 概率放大倍数,提升随机数精度
|
private static final double RANDOM_MAX = 10000; // 概率放大倍数,提升随机数精度
|
||||||
@@ -69,14 +67,14 @@ public class LotteryService {
|
|||||||
if(user == null){
|
if(user == null){
|
||||||
throw new ServiceException("用户不存在");
|
throw new ServiceException("用户不存在");
|
||||||
}
|
}
|
||||||
boolean openDraw = drawService.getOpenDraw(user.getGender());
|
|
||||||
if(!openDraw){
|
|
||||||
throw new ServiceException("暂未开启积分抽奖,请等待活动通知");
|
|
||||||
}
|
|
||||||
boolean select = GenderEnum.isSelect(user.getGender());
|
boolean select = GenderEnum.isSelect(user.getGender());
|
||||||
if(select){
|
if(select){
|
||||||
throw new ServiceException("请选择性别后在抽奖");
|
throw new ServiceException("请选择性别后在抽奖");
|
||||||
}
|
}
|
||||||
|
boolean openDraw = drawService.getOpenDraw(user.getGender());
|
||||||
|
if(!openDraw){
|
||||||
|
throw new ServiceException("暂未开启积分抽奖,请等待活动通知");
|
||||||
|
}
|
||||||
Account account = accountService.getByUserId(user.getId());
|
Account account = accountService.getByUserId(user.getId());
|
||||||
Integer drawPoint = drawService.getDrawPoint(user.getGender());
|
Integer drawPoint = drawService.getDrawPoint(user.getGender());
|
||||||
if(account.getPoints() < drawPoint){
|
if(account.getPoints() < drawPoint){
|
||||||
@@ -120,10 +118,23 @@ public class LotteryService {
|
|||||||
int currentContinuousDraws = getContinuousDraws(userId);
|
int currentContinuousDraws = getContinuousDraws(userId);
|
||||||
int newContinuousDraws = currentContinuousDraws + 1;
|
int newContinuousDraws = currentContinuousDraws + 1;
|
||||||
log.info("用户{}当前累计抽数:{},本次抽数:{}", userId, currentContinuousDraws, newContinuousDraws);
|
log.info("用户{}当前累计抽数:{},本次抽数:{}", userId, currentContinuousDraws, newContinuousDraws);
|
||||||
// 步骤2:获取有效奖品列表(启用状态,排除谢谢惠顾)
|
// 步骤2:获取所有奖品列表
|
||||||
List<PrizeOnline> validPrizes = prizeOnlineService.selectPrizeOnlineList(user.getGender());
|
List<PrizeOnline> validPrizes = prizeOnlineService.selectPrizeOnlineList(user.getGender());
|
||||||
if (validPrizes.isEmpty()) {
|
if (validPrizes.isEmpty()) {
|
||||||
throw new ServiceException("无有效奖品,请刷新页面后再次抽奖");
|
throw new ServiceException("无有效奖品,请刷新后再次抽奖");
|
||||||
|
}
|
||||||
|
// 找出系统内置谢谢惠顾
|
||||||
|
PrizeOnline thankPrize = null;
|
||||||
|
for (int i = 0; i < validPrizes.size(); i++) {
|
||||||
|
PrizeOnline validPrize = validPrizes.get(i);
|
||||||
|
if(validPrize.getPrizeId() == 1){
|
||||||
|
thankPrize = validPrize;
|
||||||
|
validPrizes.remove(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(thankPrize == null){
|
||||||
|
throw new ServiceException("奖品库异常,请刷新后再次抽奖");
|
||||||
}
|
}
|
||||||
// 步骤3:执行抽奖规则(保底→最低抽数过滤→概率抽奖)
|
// 步骤3:执行抽奖规则(保底→最低抽数过滤→概率抽奖)
|
||||||
PrizeOnline winPrize = null;
|
PrizeOnline winPrize = null;
|
||||||
@@ -236,13 +247,10 @@ public class LotteryService {
|
|||||||
if (cacheCount != null) {
|
if (cacheCount != null) {
|
||||||
return cacheCount;
|
return cacheCount;
|
||||||
}
|
}
|
||||||
// 2. 缓存未命中,从数据库查询最后一次累计抽数
|
// 3. 存入缓存
|
||||||
// Integer dbCount = userDrawRecordMapper.selectLastContinuousDraws(userId);
|
// bucket.set(0, USER_DRAW_COUNT_EXPIRE, java.util.concurrent.TimeUnit.SECONDS);
|
||||||
Integer dbCount = 0;
|
bucket.set(0);
|
||||||
int finalCount = dbCount == null ? 0 : dbCount;
|
return 0;
|
||||||
// 3. 存入缓存(设置过期时间)
|
|
||||||
bucket.set(finalCount, USER_DRAW_COUNT_EXPIRE, java.util.concurrent.TimeUnit.SECONDS);
|
|
||||||
return finalCount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
|
|||||||
@@ -45,18 +45,25 @@ public class PrizeOnlineServiceImpl extends ServiceImpl<PrizeOnlineMapper,PrizeO
|
|||||||
throw new ServiceException("奖品必须为9个");
|
throw new ServiceException("奖品必须为9个");
|
||||||
}
|
}
|
||||||
boolean hasNone = false;
|
boolean hasNone = false;
|
||||||
|
int bigNum = 0;
|
||||||
List<Long> prizeIds = new ArrayList<>();
|
List<Long> prizeIds = new ArrayList<>();
|
||||||
for (PrizeOnline prizeOnline : bo) {
|
for (PrizeOnline prizeOnline : bo) {
|
||||||
prizeOnline.setGender(gender);
|
prizeOnline.setGender(gender);
|
||||||
if(PrizeTypeEnum.NONE.getCode().equals(prizeOnline.getPrizeType())){
|
if(prizeOnline.getPrizeId() != null && prizeOnline.getPrizeId() == 1){
|
||||||
hasNone = true;
|
hasNone = true;
|
||||||
}
|
}
|
||||||
|
if(PrizeTypeEnum.GOOD.getCode().equals(prizeOnline.getPrizeType())){
|
||||||
|
bigNum++;
|
||||||
|
}
|
||||||
if(prizeOnline.getId() != null){
|
if(prizeOnline.getId() != null){
|
||||||
prizeIds.add(prizeOnline.getId());
|
prizeIds.add(prizeOnline.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!hasNone){
|
if(!hasNone){
|
||||||
throw new ServiceException("奖品必须包含谢谢惠顾");
|
throw new ServiceException("奖品必须包含内置的谢谢惠顾");
|
||||||
|
}
|
||||||
|
if(bigNum > 1){
|
||||||
|
throw new ServiceException("奖品只能有1个大奖");
|
||||||
}
|
}
|
||||||
List<PrizeOnline> dbList = this.selectPrizeOnlineList(gender);
|
List<PrizeOnline> dbList = this.selectPrizeOnlineList(gender);
|
||||||
List<Long> dbIds = dbList.stream().map(PrizeOnline::getId).collect(Collectors.toList());
|
List<Long> dbIds = dbList.stream().map(PrizeOnline::getId).collect(Collectors.toList());
|
||||||
|
|||||||
Reference in New Issue
Block a user