抽奖荣誉id唯一处理

This commit is contained in:
tianfeng 2026-01-19 23:49:26 +08:00
parent a8092e339a
commit 8bb6f3941e
2 changed files with 18 additions and 20 deletions

View File

@ -288,7 +288,7 @@ public class LotteryDrawExe {
List<LotteryPrize> prizes = getPrizesByPool(activityId, stage);
// 3. 过滤用户已中过的BADGE类型奖品
prizes = filterAlreadyWonBadgePrizes(prizes, progress.getUserId());
prizes = filterAlreadyWonBadgePrizes(prizes, progress.getUserId(), activityId);
// 4. 过滤美元奖励充值金额为0的用户不能抽到
prizes = filterMoneyPrizes(prizes, userRechargeAmount);
@ -308,9 +308,9 @@ public class LotteryDrawExe {
// 8. 如果抽中了BADGE类型奖品记录到Redis
if (selectedPrize != null && "BADGE".equals(selectedPrize.getPrizeType())) {
markBadgePrizeAsWon(progress.getUserId(), selectedPrize.getId());
markBadgePrizeAsWon(progress.getUserId(), activityId);
}
return selectedPrize;
}
@ -329,7 +329,7 @@ public class LotteryDrawExe {
}
// 过滤用户已中过的BADGE类型奖品
prizes = filterAlreadyWonBadgePrizes(prizes, userId);
prizes = filterAlreadyWonBadgePrizes(prizes, userId, activityId);
// 过滤美元奖励充值金额为0的用户不能抽到
prizes = filterMoneyPrizes(prizes, userRechargeAmount);
@ -342,7 +342,7 @@ public class LotteryDrawExe {
// 如果抽中了BADGE类型奖品记录到Redis
if (selectedPrize != null && "BADGE".equals(selectedPrize.getPrizeType())) {
markBadgePrizeAsWon(userId, selectedPrize.getId());
markBadgePrizeAsWon(userId, activityId);
}
return selectedPrize;
@ -663,7 +663,7 @@ public class LotteryDrawExe {
* @param userId 用户ID
* @return 过滤后的奖品列表
*/
private List<LotteryPrize> filterAlreadyWonBadgePrizes(List<LotteryPrize> prizes, Long userId) {
private List<LotteryPrize> filterAlreadyWonBadgePrizes(List<LotteryPrize> prizes, Long userId, Long activityId) {
if (prizes == null || prizes.isEmpty()) {
return prizes;
}
@ -676,7 +676,7 @@ public class LotteryDrawExe {
}
// 检查用户是否已经中过这个BADGE
String redisKey = "lottery:badge:won:" + userId + ":" + prize.getId();
String redisKey = "lottery:badge:won:" + userId + ":" + activityId;
String won = redisService.getString(redisKey);
if (won != null) {
@ -731,11 +731,10 @@ public class LotteryDrawExe {
* @param userId 用户ID
* @param prizeId 奖品ID
*/
private void markBadgePrizeAsWon(Long userId, Long prizeId) {
String redisKey = "lottery:badge:won:" + userId + ":" + prizeId;
private void markBadgePrizeAsWon(Long userId, Long activityId) {
String redisKey = "lottery:badge:won:" + userId + ":" + activityId;
// 永久存储表示该用户已经中过这个BADGE
redisService.setString(redisKey, "1");
log.info("Mark BADGE prize as won. userId: {}, prizeId: {}", userId, prizeId);
}
/**

View File

@ -302,7 +302,7 @@ public class LotteryMultiDrawExe {
List<LotteryPrize> prizes = getPrizesByPool(activityId, stage);
// 过滤用户已中过的BADGE类型奖品
prizes = filterAlreadyWonBadgePrizes(prizes, progress.getUserId());
prizes = filterAlreadyWonBadgePrizes(prizes, progress.getUserId(), activityId);
// 过滤美元奖励充值金额为0的用户不能抽到
prizes = filterMoneyPrizes(prizes, userRechargeAmount);
@ -321,7 +321,7 @@ public class LotteryMultiDrawExe {
// 如果抽中了BADGE类型奖品记录到Redis
if (selectedPrize != null && "BADGE".equals(selectedPrize.getPrizeType())) {
markBadgePrizeAsWon(progress.getUserId(), selectedPrize.getId());
markBadgePrizeAsWon(progress.getUserId(), activityId);
}
return selectedPrize;
@ -419,7 +419,7 @@ public class LotteryMultiDrawExe {
}
// 过滤用户已中过的BADGE类型奖品
prizes = filterAlreadyWonBadgePrizes(prizes, userId);
prizes = filterAlreadyWonBadgePrizes(prizes, userId, activityId);
// 过滤美元奖励充值金额为0的用户不能抽到
prizes = filterMoneyPrizes(prizes, userRechargeAmount);
@ -439,7 +439,7 @@ public class LotteryMultiDrawExe {
if (randomValue <= cumulative) {
// 如果抽中了BADGE类型奖品记录到Redis
if ("BADGE".equals(prize.getPrizeType())) {
markBadgePrizeAsWon(userId, prize.getId());
markBadgePrizeAsWon(userId, activityId);
}
return prize;
}
@ -448,7 +448,7 @@ public class LotteryMultiDrawExe {
LotteryPrize lastPrize = prizes.get(prizes.size() - 1);
// 如果抽中了BADGE类型奖品记录到Redis
if (lastPrize != null && "BADGE".equals(lastPrize.getPrizeType())) {
markBadgePrizeAsWon(userId, lastPrize.getId());
markBadgePrizeAsWon(userId, activityId);
}
return lastPrize;
}
@ -650,7 +650,7 @@ public class LotteryMultiDrawExe {
* @param userId 用户ID
* @return 过滤后的奖品列表
*/
private List<LotteryPrize> filterAlreadyWonBadgePrizes(List<LotteryPrize> prizes, Long userId) {
private List<LotteryPrize> filterAlreadyWonBadgePrizes(List<LotteryPrize> prizes, Long userId, Long activityId) {
if (prizes == null || prizes.isEmpty()) {
return prizes;
}
@ -663,7 +663,7 @@ public class LotteryMultiDrawExe {
}
// 检查用户是否已经中过这个BADGE
String redisKey = "lottery:badge:won:" + userId + ":" + prize.getId();
String redisKey = "lottery:badge:won:" + userId + ":" + activityId;
String won = redisService.getString(redisKey);
if (won != null) {
@ -714,11 +714,10 @@ public class LotteryMultiDrawExe {
* @param userId 用户ID
* @param prizeId 奖品ID
*/
private void markBadgePrizeAsWon(Long userId, Long prizeId) {
String redisKey = "lottery:badge:won:" + userId + ":" + prizeId;
private void markBadgePrizeAsWon(Long userId, Long activityId) {
String redisKey = "lottery:badge:won:" + userId + ":" + activityId;
// 永久存储表示该用户已经中过这个BADGE
redisService.setString(redisKey, "1");
log.info("Mark BADGE prize as won in multi-draw. userId: {}, prizeId: {}", userId, prizeId);
}
}