diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/activity/RankingActivityServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/activity/RankingActivityServiceImpl.java index 87ee48d3..ead89bd7 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/activity/RankingActivityServiceImpl.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/activity/RankingActivityServiceImpl.java @@ -16,6 +16,7 @@ import com.red.circle.mq.rocket.business.producer.UserMqMessageService; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -45,8 +46,9 @@ public class RankingActivityServiceImpl implements RankingActivityService { private final UserMqMessageService userMqMessageService; private final UserProfileGateway userProfileGateway; - private static final String RANKING_TOP4_CACHE_KEY_PREFIX = "ranking_top4:"; + private static final String RANKING_LIST_CACHE_KEY_PREFIX = "ranking_list:"; private static final int CACHE_EXPIRE_MINUTES = 5; + private static final String GAME_KING_TEMPLATE_ID = "2001207026499137537"; @Override public Boolean accumulateRankingData(RankingDataUpdateCmd cmd) { @@ -55,7 +57,24 @@ public class RankingActivityServiceImpl implements RankingActivityService { @Override public RankingListCO getRankingList(RankingListQueryCmd cmd) { - return rankingListQryExe.execute(cmd); + if (!Objects.equals(GAME_KING_TEMPLATE_ID, cmd.getTemplateId())) { + return rankingListQryExe.execute(cmd); + } + + String cacheKey = buildRankingListCacheKey(cmd); + + RankingListCO cachedResult = redisService.getStringToObject(cacheKey, RankingListCO.class); + if (cachedResult != null) { + return cachedResult; + } + + RankingListCO result = rankingListQryExe.execute(cmd); + + if (result != null) { + redisService.setString(cacheKey, JSON.toJSONString(result), CACHE_EXPIRE_MINUTES, TimeUnit.MINUTES); + } + + return result; } @Override @@ -70,11 +89,11 @@ public class RankingActivityServiceImpl implements RankingActivityService { @Override public List getTopFourRankingWithReward(RankingListQueryCmd cmd) { - String cacheKey = buildCacheKey(cmd); - - String cachedJson = redisService.getString(cacheKey); - if (cachedJson != null) { - return JSON.parseArray(cachedJson, RankingUserVO.class); + String cacheKey = buildRankingListCacheKey(cmd); + + RankingListCO cachedResult = redisService.getStringToObject(cacheKey, RankingListCO.class); + if (cachedResult != null) { + return convertToRankingUserVOList(cachedResult); } RankingListQueryCmd top4Cmd = new RankingListQueryCmd(); @@ -84,42 +103,54 @@ public class RankingActivityServiceImpl implements RankingActivityService { top4Cmd.setReqUserId(cmd.getReqUserId()); top4Cmd.setReqSysOrigin(cmd.getReqSysOrigin()); top4Cmd.setTopN(10); + top4Cmd.setTemplateId(cmd.getTemplateId()); RankingListCO result = rankingListQryExe.execute(top4Cmd); - List rankingUsers = null; if (result != null && CollectionUtils.isNotEmpty(result.getRankingList())) { - Set userIds = result.getRankingList().stream() - .map(RankingActivityRecordCO::getUserId) - .collect(Collectors.toSet()); - - Map userProfileMap = userProfileGateway.mapByUserIds(userIds); - - rankingUsers = result.getRankingList().stream() - .limit(4) - .map(user -> { - UserProfile profile = userProfileMap.get(user.getUserId()); - RankingUserVO vo = new RankingUserVO(); - vo.setUserId(user.getUserId()); - vo.setRank(user.getRank()); - vo.setQuantity(String.valueOf(user.getQuantity())); - - if (profile != null) { - vo.setAccount(profile.getAccount()); - vo.setNickname(profile.getUserNickname()); - vo.setAvatar(profile.getUserAvatar()); - } - - return vo; - }) - .collect(Collectors.toList()); - - redisService.setString(cacheKey, JSON.toJSONString(rankingUsers), CACHE_EXPIRE_MINUTES, TimeUnit.MINUTES); - + redisService.setString(cacheKey, JSON.toJSONString(result), CACHE_EXPIRE_MINUTES, TimeUnit.MINUTES); sendGameKingRewardEvent(cmd, result); + return convertToRankingUserVOList(result); } - return rankingUsers; + return null; + } + + /** + * 转换RankingListCO为RankingUserVO列表(只取前4个). + */ + private List convertToRankingUserVOList(RankingListCO result) { + if (result == null || CollectionUtils.isEmpty(result.getRankingList())) { + return null; + } + + List top4Users = result.getRankingList().stream() + .limit(4) + .toList(); + + Set userIds = top4Users.stream() + .map(RankingActivityRecordCO::getUserId) + .collect(Collectors.toSet()); + + Map userProfileMap = userProfileGateway.mapByUserIds(userIds); + + return top4Users.stream() + .map(user -> { + UserProfile profile = userProfileMap.get(user.getUserId()); + RankingUserVO vo = new RankingUserVO(); + vo.setUserId(user.getUserId()); + vo.setRank(user.getRank()); + vo.setQuantity(String.valueOf(user.getQuantity())); + + if (profile != null) { + vo.setAccount(profile.getAccount()); + vo.setNickname(profile.getUserNickname()); + vo.setAvatar(profile.getUserAvatar()); + } + + return vo; + }) + .collect(Collectors.toList()); } /** @@ -145,9 +176,9 @@ public class RankingActivityServiceImpl implements RankingActivityService { } /** - * 构建缓存Key. + * 构建排行榜缓存Key. */ - private String buildCacheKey(RankingListQueryCmd cmd) { - return RANKING_TOP4_CACHE_KEY_PREFIX + RankingActivityType.getByCode(cmd.getActivityType()).name() + ":" + cmd.getCycleKey(); + private String buildRankingListCacheKey(RankingListQueryCmd cmd) { + return RANKING_LIST_CACHE_KEY_PREFIX + RankingActivityType.getByCode(cmd.getActivityType()).name() + ":" + cmd.getCycleKey(); } }