实时荣誉发放处理

This commit is contained in:
tianfeng 2026-02-10 18:57:16 +08:00
parent 049a267482
commit f19456ca9d
2 changed files with 109 additions and 15 deletions

View File

@ -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.infra.gateway.RankingActivityGateway;
import com.red.circle.other.inner.enums.material.BadgeBackpackExpireType; import com.red.circle.other.inner.enums.material.BadgeBackpackExpireType;
import com.red.circle.tool.core.date.TimestampUtils; import com.red.circle.tool.core.date.TimestampUtils;
import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
@ -30,17 +31,18 @@ public class RamadanRankingBadgeTask {
private final UserMqMessageService userMqMessageService; private final UserMqMessageService userMqMessageService;
private final RankingActivityGateway rankingActivityGateway; private final RankingActivityGateway rankingActivityGateway;
// 排名徽章ID数组[第一名, 第二名, 第三名] // 排名徽章ID数组[第一名, 第二名, 第三名, 第四至十名]
private final static Long[] BADGE_IDS = new Long[]{ private final static Long[] BADGE_IDS = new Long[]{
2012070776778235906L, // 第一名 2021136719126454273L, // 第一名
2012070846403682305L, // 第二名 2021136775078469633L, // 第二名
2012070905480708098L // 第三名 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) @TaskCacheLock(key = "RAMADAN_RANKING_BADGE_TASK", expireSecond = 20)
public void sendWeekRankingReward() { public void sendWeekRankingReward() {
try { try {
@ -48,8 +50,8 @@ public class RamadanRankingBadgeTask {
List<RankingActivityRecord> top10 = rankingActivityGateway.getRankingList( List<RankingActivityRecord> top10 = rankingActivityGateway.getRankingList(
SysOriginPlatformEnum.LIKEI.name(), SysOriginPlatformEnum.LIKEI.name(),
RankingActivityType.RAMADAN, RankingActivityType.RAMADAN,
RankingCycleType.MONTHLY, RankingCycleType.WEEKLY,
"2026-02-17", ZonedDateTimeAsiaRiyadhUtils.nowWeekMondayToInt().toString(),
null, null,
10 10
); );
@ -67,7 +69,7 @@ public class RamadanRankingBadgeTask {
for (int rank = 0; rank < top10.size() && rank < 10; rank++) { for (int rank = 0; rank < top10.size() && rank < 10; rank++) {
RankingActivityRecord rankingData = top10.get(rank); RankingActivityRecord rankingData = top10.get(rank);
Long badgeId = BADGE_IDS[rank]; Long badgeId = getBadgeIdByRank(rank);
userShouldHaveBadgesMap.computeIfAbsent(rankingData.getUserId(), k -> new HashSet<>()).add(badgeId); userShouldHaveBadgesMap.computeIfAbsent(rankingData.getUserId(), k -> new HashSet<>()).add(badgeId);
} }
@ -88,8 +90,8 @@ public class RamadanRankingBadgeTask {
for (Long badgeId : shouldHaveBadges) { for (Long badgeId : shouldHaveBadges) {
if (!currentBadges.contains(badgeId)) { if (!currentBadges.contains(badgeId)) {
grantBadge(userId, badgeId); grantBadge(userId, badgeId);
int rank = Arrays.asList(BADGE_IDS).indexOf(badgeId) + 1; log.info("排名徽章发放userId={}, badgeId={}, badgeName={}",
log.info("排名徽章发放rank={}, userId={}, badgeId={}", rank, userId, badgeId); userId, badgeId, getBadgeNameById(badgeId));
} }
} }
} }
@ -104,9 +106,8 @@ public class RamadanRankingBadgeTask {
for (Long badgeId : currentBadges) { for (Long badgeId : currentBadges) {
if (!shouldHaveBadges.contains(badgeId)) { if (!shouldHaveBadges.contains(badgeId)) {
revokeBadge(userId, badgeId); revokeBadge(userId, badgeId);
int rank = Arrays.asList(BADGE_IDS).indexOf(badgeId) + 1; log.info("排名徽章收回userId={}, badgeId={}, badgeName={} (用户不在该排名中)",
log.info("排名徽章收回rank={}, userId={}, badgeId={} (用户不在该排名中)", userId, badgeId, getBadgeNameById(badgeId));
rank, userId, 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); userMqMessageService.sendBadgeOperateEvent(event);
} }
} }

View File

@ -1,17 +1,29 @@
import com.red.circle.OtherServiceApplication; import com.red.circle.OtherServiceApplication;
import com.red.circle.common.business.core.enums.SysOriginPlatformEnum; import com.red.circle.common.business.core.enums.SysOriginPlatformEnum;
import com.red.circle.common.business.enums.SendPropsOrigin; 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.RankingActivityRewardTask;
import com.red.circle.other.app.scheduler.RocketStatusSyncTask; 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.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.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.other.inner.model.cmd.activity.SendActivityRewardCmd;
import com.red.circle.tool.core.date.TimestampUtils;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner; 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) @SpringBootTest(classes = OtherServiceApplication.class)
@RunWith(SpringRunner.class) @RunWith(SpringRunner.class)
public class DailTaskTest { public class DailTaskTest {
@ -24,8 +36,21 @@ public class DailTaskTest {
private PropsActivityClient propsActivityClient; private PropsActivityClient propsActivityClient;
@Autowired @Autowired
private CleanExpiredDismissingCpTask cleanExpiredDismissingCpTask; private CleanExpiredDismissingCpTask cleanExpiredDismissingCpTask;
@Autowired
private UserMqMessageService userMqMessageService;
// @Autowired // @Autowired
// private GameKingRewardTask gameKingRewardTask; // private GameKingRewardTask gameKingRewardTask;
@Autowired
private BadgeBackpackService badgeBackpackService;
private final static Long[] BADGE_IDS = new Long[]{
2021136719126454273L, // 第一名
2021136775078469633L, // 第二名
2021136820859297793L, // 第三名
2021136863104327681L, // 第四名
};
@Test @Test
public void testGameKing() { public void testGameKing() {
@ -34,9 +59,44 @@ public class DailTaskTest {
@Test @Test
public void DailTaskTest() { public void DailTaskTest() {
// dailyTask. nobleDailyGoldRewardTask(); // 2. 查询所有持有排名徽章的用户
List<BadgeBackpack> 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 @Test
public void DailTaskTest2() { public void DailTaskTest2() {
rankingActivityRewardTask.sendRankingActivityReward(); rankingActivityRewardTask.sendRankingActivityReward();