diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/activity/GameKingRewardTask.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/activity/GameKingRewardTask.java index a243c723..11026973 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/activity/GameKingRewardTask.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/activity/GameKingRewardTask.java @@ -1,11 +1,19 @@ package com.red.circle.other.app.scheduler.activity; +import com.alibaba.fastjson.JSON; import com.red.circle.common.business.core.enums.SysOriginPlatformEnum; import com.red.circle.component.redis.annotation.TaskCacheLock; +import com.red.circle.component.redis.service.RedisService; import com.red.circle.framework.core.dto.ReqSysOrigin; +import com.red.circle.mq.business.model.event.GameKingRewardEvent; +import com.red.circle.mq.rocket.business.producer.UserMqMessageService; +import com.red.circle.other.app.command.activity.query.RankingListQryExe; +import com.red.circle.other.app.dto.clientobject.activity.RankingListCO; import com.red.circle.other.app.dto.cmd.activity.RankingListQueryCmd; import com.red.circle.other.app.service.activity.RankingActivityService; import com.red.circle.other.domain.ranking.RankingActivityType; +import com.red.circle.other.domain.ranking.RankingCycleType; +import com.red.circle.tool.core.collection.CollectionUtils; import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -13,6 +21,9 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + /** * 游戏王排名奖励兜底任务. */ @@ -23,6 +34,11 @@ import org.springframework.stereotype.Component; public class GameKingRewardTask { private final RankingActivityService rankingActivityService; + private final RankingListQryExe rankingListQryExe; + private final RedisService redisService; + private static final String RANKING_LIST_CACHE_KEY_PREFIX = "ranking_list:"; + private static final int CACHE_EXPIRE_MINUTES = 10; + private final UserMqMessageService userMqMessageService; /** * 每5分钟执行一次,兜底发送游戏王排名奖励. @@ -39,11 +55,59 @@ public class GameKingRewardTask { cmd.setTemplateId("2001207026499137537"); cmd.setReqSysOrigin(ReqSysOrigin.of("LIKEI")); - rankingActivityService.getTopFourRankingWithReward(cmd); + RankingListQueryCmd top4Cmd = new RankingListQueryCmd(); + top4Cmd.setActivityType(cmd.getActivityType()); + top4Cmd.setCycleKey(cmd.getCycleKey()); + top4Cmd.setCycleType(RankingCycleType.WEEKLY.getCode()); + top4Cmd.setReqUserId(cmd.getReqUserId()); + top4Cmd.setReqSysOrigin(cmd.getReqSysOrigin()); + top4Cmd.setTopN(100); + top4Cmd.setTemplateId(cmd.getTemplateId()); + + RankingListCO result = rankingListQryExe.execute(top4Cmd); + + String cacheKey = buildRankingListCacheKey(cmd); + if (result != null && CollectionUtils.isNotEmpty(result.getRankingList())) { + redisService.setString(cacheKey, JSON.toJSONString(result), CACHE_EXPIRE_MINUTES, TimeUnit.MINUTES); + + result.setRankingList(result.getRankingList().stream().limit(10).toList()); + sendGameKingRewardEvent(cmd, result); + } log.info("游戏王排名奖励兜底任务执行完成"); } catch (Exception e) { log.error("游戏王排名奖励兜底任务执行失败", e); } } + + /** + * 构建排行榜缓存Key. + */ + private String buildRankingListCacheKey(RankingListQueryCmd cmd) { + return RANKING_LIST_CACHE_KEY_PREFIX + RankingActivityType.getByCode(cmd.getActivityType()).name() + ":" + cmd.getCycleKey(); + } + + /** + * 发送游戏王奖励消息. + */ + private void sendGameKingRewardEvent(RankingListQueryCmd cmd, RankingListCO result) { + if (CollectionUtils.isEmpty(result.getRankingList())) { + return; + } + + GameKingRewardEvent event = new GameKingRewardEvent() + .setActivityType(RankingActivityType.getByCode(cmd.getActivityType()).name()) + .setOrigin(cmd.getReqSysOrigin().getOrigin()) + .setCycleKey(cmd.getCycleKey()) + .setTemplateId(cmd.getTemplateId()) + .setRankingUsers(result.getRankingList().stream() + .map(user -> new GameKingRewardEvent.RankingUser() + .setUserId(user.getUserId()) + .setRank(user.getRank())) + .collect(Collectors.toList())); + + userMqMessageService.sendGameKingRewardEvent(event); + } + + } 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 4dbd89d0..435bf55f 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 @@ -47,8 +47,7 @@ public class RankingActivityServiceImpl implements RankingActivityService { private final UserProfileGateway userProfileGateway; 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"; + private static final int CACHE_EXPIRE_MINUTES = 10; @Override public Boolean accumulateRankingData(RankingDataUpdateCmd cmd) { @@ -68,8 +67,8 @@ public class RankingActivityServiceImpl implements RankingActivityService { fillCurrentUserRank(cachedResult, cmd.getReqUserId()); return cachedResult; } - - RankingListCO result = rankingListQryExe.execute(cmd); + + /*RankingListCO result = rankingListQryExe.execute(cmd); if (result != null && CollectionUtils.isNotEmpty(result.getRankingList())) { redisService.setString(cacheKey, JSON.toJSONString(result), CACHE_EXPIRE_MINUTES, TimeUnit.MINUTES); @@ -79,7 +78,8 @@ public class RankingActivityServiceImpl implements RankingActivityService { sendGameKingRewardEvent(cmd, top10Result); } - return result; + return result;*/ + return new RankingListCO(); } @Override @@ -110,7 +110,7 @@ public class RankingActivityServiceImpl implements RankingActivityService { top4Cmd.setTopN(100); top4Cmd.setTemplateId(cmd.getTemplateId()); - RankingListCO result = rankingListQryExe.execute(top4Cmd); + /*RankingListCO result = rankingListQryExe.execute(top4Cmd); if (result != null && CollectionUtils.isNotEmpty(result.getRankingList())) { redisService.setString(cacheKey, JSON.toJSONString(result), CACHE_EXPIRE_MINUTES, TimeUnit.MINUTES); @@ -118,9 +118,9 @@ public class RankingActivityServiceImpl implements RankingActivityService { result.setRankingList(result.getRankingList().stream().limit(10).toList()); sendGameKingRewardEvent(cmd, result); return convertToRankingUserVOList(result); - } - - return null; + }*/ + + return List.of(); } /** diff --git a/rc-service/rc-service-other/other-start/src/test/java/DailTaskTest.java b/rc-service/rc-service-other/other-start/src/test/java/DailTaskTest.java index 03d93cc4..5e3b0217 100644 --- a/rc-service/rc-service-other/other-start/src/test/java/DailTaskTest.java +++ b/rc-service/rc-service-other/other-start/src/test/java/DailTaskTest.java @@ -5,6 +5,7 @@ import com.red.circle.other.app.scheduler.CleanExpiredDismissingCpTask; import com.red.circle.other.app.scheduler.DailyTask; import com.red.circle.other.app.scheduler.RankingActivityRewardTask; import com.red.circle.other.app.scheduler.RocketStatusSyncTask; +import com.red.circle.other.app.scheduler.activity.GameKingRewardTask; import com.red.circle.other.app.service.room.RocketStatusCacheService; import com.red.circle.other.inner.endpoint.activity.PropsActivityClient; import com.red.circle.other.inner.model.cmd.activity.SendActivityRewardCmd; @@ -28,6 +29,13 @@ public class DailTaskTest { private PropsActivityClient propsActivityClient; @Autowired private CleanExpiredDismissingCpTask cleanExpiredDismissingCpTask; + @Autowired + private GameKingRewardTask gameKingRewardTask; + + @Test + public void testGameKing() { + gameKingRewardTask.executeGameKingReward(); + } @Test public void DailTaskTest() {