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