From f19456ca9d42d40ada4689e5bfa55ca56f223238 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Tue, 10 Feb 2026 18:57:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E6=97=B6=E8=8D=A3=E8=AA=89=E5=8F=91?= =?UTF-8?q?=E6=94=BE=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/RamadanRankingBadgeTask.java | 62 ++++++++++++++----- .../src/test/java/DailTaskTest.java | 62 ++++++++++++++++++- 2 files changed, 109 insertions(+), 15 deletions(-) diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/activity/RamadanRankingBadgeTask.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/activity/RamadanRankingBadgeTask.java index ed5c2cb3..c03b0051 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/activity/RamadanRankingBadgeTask.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/scheduler/activity/RamadanRankingBadgeTask.java @@ -12,6 +12,7 @@ import com.red.circle.other.infra.database.rds.service.badge.BadgeBackpackServic import com.red.circle.other.infra.gateway.RankingActivityGateway; import com.red.circle.other.inner.enums.material.BadgeBackpackExpireType; import com.red.circle.tool.core.date.TimestampUtils; +import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; @@ -30,17 +31,18 @@ public class RamadanRankingBadgeTask { private final UserMqMessageService userMqMessageService; private final RankingActivityGateway rankingActivityGateway; - // 排名徽章ID数组:[第一名, 第二名, 第三名] + // 排名徽章ID数组:[第一名, 第二名, 第三名, 第四至十名] private final static Long[] BADGE_IDS = new Long[]{ - 2012070776778235906L, // 第一名 - 2012070846403682305L, // 第二名 - 2012070905480708098L // 第三名 + 2021136719126454273L, // 第一名 + 2021136775078469633L, // 第二名 + 2021136820859297793L, // 第三名 + 2021136863104327681L, // 第四至十名 }; /** * 每分钟发放和收回排名徽章 */ -// @Scheduled(cron = "0 0/1 * * * *", zone = "Asia/Riyadh") + @Scheduled(cron = "0 0/1 * * * *", zone = "Asia/Riyadh") @TaskCacheLock(key = "RAMADAN_RANKING_BADGE_TASK", expireSecond = 20) public void sendWeekRankingReward() { try { @@ -48,8 +50,8 @@ public class RamadanRankingBadgeTask { List top10 = rankingActivityGateway.getRankingList( SysOriginPlatformEnum.LIKEI.name(), RankingActivityType.RAMADAN, - RankingCycleType.MONTHLY, - "2026-02-17", + RankingCycleType.WEEKLY, + ZonedDateTimeAsiaRiyadhUtils.nowWeekMondayToInt().toString(), null, 10 ); @@ -67,7 +69,7 @@ public class RamadanRankingBadgeTask { for (int rank = 0; rank < top10.size() && rank < 10; rank++) { RankingActivityRecord rankingData = top10.get(rank); - Long badgeId = BADGE_IDS[rank]; + Long badgeId = getBadgeIdByRank(rank); userShouldHaveBadgesMap.computeIfAbsent(rankingData.getUserId(), k -> new HashSet<>()).add(badgeId); } @@ -88,8 +90,8 @@ public class RamadanRankingBadgeTask { for (Long badgeId : shouldHaveBadges) { if (!currentBadges.contains(badgeId)) { grantBadge(userId, badgeId); - int rank = Arrays.asList(BADGE_IDS).indexOf(badgeId) + 1; - log.info("排名徽章发放:rank={}, userId={}, badgeId={}", rank, userId, badgeId); + log.info("排名徽章发放:userId={}, badgeId={}, badgeName={}", + userId, badgeId, getBadgeNameById(badgeId)); } } } @@ -104,9 +106,8 @@ public class RamadanRankingBadgeTask { for (Long badgeId : currentBadges) { if (!shouldHaveBadges.contains(badgeId)) { revokeBadge(userId, badgeId); - int rank = Arrays.asList(BADGE_IDS).indexOf(badgeId) + 1; - log.info("排名徽章收回:rank={}, userId={}, badgeId={} (用户不在该排名中)", - rank, userId, badgeId); + log.info("排名徽章收回:userId={}, badgeId={}, badgeName={} (用户不在该排名中)", + userId, badgeId, getBadgeNameById(badgeId)); } } } @@ -116,6 +117,39 @@ public class RamadanRankingBadgeTask { } } + /** + * 根据排名获取徽章ID + * @param rank 排名索引(0-9对应第1-10名) + * @return 徽章ID + */ + private Long getBadgeIdByRank(int rank) { + if (rank == 0) { + return BADGE_IDS[0]; // 第1名 + } else if (rank == 1) { + return BADGE_IDS[1]; // 第2名 + } else if (rank == 2) { + return BADGE_IDS[2]; // 第3名 + } else { + return BADGE_IDS[3]; // 第4-10名 + } + } + + /** + * 根据徽章ID获取徽章名称(用于日志) + */ + private String getBadgeNameById(Long badgeId) { + if (badgeId.equals(BADGE_IDS[0])) { + return "第1名徽章"; + } else if (badgeId.equals(BADGE_IDS[1])) { + return "第2名徽章"; + } else if (badgeId.equals(BADGE_IDS[2])) { + return "第3名徽章"; + } else if (badgeId.equals(BADGE_IDS[3])) { + return "第4-10名徽章"; + } + return "未知徽章"; + } + /** * 检查用户是否已持有该徽章 */ @@ -157,4 +191,4 @@ public class RamadanRankingBadgeTask { userMqMessageService.sendBadgeOperateEvent(event); } -} +} \ No newline at end of file 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 5917901a..be8f12db 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 @@ -1,17 +1,29 @@ import com.red.circle.OtherServiceApplication; import com.red.circle.common.business.core.enums.SysOriginPlatformEnum; import com.red.circle.common.business.enums.SendPropsOrigin; +import com.red.circle.mq.business.model.event.BadgeOperateEvent; +import com.red.circle.mq.rocket.business.producer.UserMqMessageService; import com.red.circle.other.app.scheduler.RankingActivityRewardTask; import com.red.circle.other.app.scheduler.RocketStatusSyncTask; +import com.red.circle.other.app.scheduler.activity.RamadanRankingBadgeTask; import com.red.circle.other.app.scheduler.cp.CleanExpiredDismissingCpTask; +import com.red.circle.other.infra.database.rds.entity.badge.BadgeBackpack; +import com.red.circle.other.infra.database.rds.service.badge.BadgeBackpackService; import com.red.circle.other.inner.endpoint.activity.PropsActivityClient; +import com.red.circle.other.inner.enums.material.BadgeBackpackExpireType; import com.red.circle.other.inner.model.cmd.activity.SendActivityRewardCmd; +import com.red.circle.tool.core.date.TimestampUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + @SpringBootTest(classes = OtherServiceApplication.class) @RunWith(SpringRunner.class) public class DailTaskTest { @@ -24,8 +36,21 @@ public class DailTaskTest { private PropsActivityClient propsActivityClient; @Autowired private CleanExpiredDismissingCpTask cleanExpiredDismissingCpTask; + + @Autowired + private UserMqMessageService userMqMessageService; // @Autowired // private GameKingRewardTask gameKingRewardTask; + @Autowired + private BadgeBackpackService badgeBackpackService; + + private final static Long[] BADGE_IDS = new Long[]{ + 2021136719126454273L, // 第一名 + 2021136775078469633L, // 第二名 + 2021136820859297793L, // 第三名 + 2021136863104327681L, // 第四名 + }; + @Test public void testGameKing() { @@ -34,9 +59,44 @@ public class DailTaskTest { @Test public void DailTaskTest() { -// dailyTask. nobleDailyGoldRewardTask(); + // 2. 查询所有持有排名徽章的用户 + List allBackpackList = badgeBackpackService.query() + .in(BadgeBackpack::getBadgeId, Arrays.asList(BADGE_IDS)) + .list() + .stream() + .filter(DailTaskTest::filterAvailable) + .collect(Collectors.toList()); + + allBackpackList.forEach(backpack -> { + revokeBadge(backpack.getUserId(), backpack.getBadgeId()); + }); + + } + + /** + * 收回徽章 + */ + private void revokeBadge(Long userId, Long badgeId) { + BadgeOperateEvent event = new BadgeOperateEvent() + .setUserId(userId) + .setBadgeId(badgeId) + .setDays(1L) + .setOperationType(BadgeOperateEvent.OperationType.REMOVE.name()); + + userMqMessageService.sendBadgeOperateEvent(event); + } + + private static boolean filterAvailable(BadgeBackpack badgeBackpack) { + return Objects.equals(badgeBackpack.getExpireType(), + BadgeBackpackExpireType.PERMANENT.name()) + || badgeBackpack.getExpireTime().after(TimestampUtils.now()); + } + + + + @Test public void DailTaskTest2() { rankingActivityRewardTask.sendRankingActivityReward();