cp周榜发送指定性别礼物处理

This commit is contained in:
tianfeng 2026-01-19 12:04:19 +08:00
parent a6502cc90d
commit 557e231b12
2 changed files with 88 additions and 5 deletions

View File

@ -279,7 +279,7 @@ public enum SendPropsOrigin {
/** /**
* 每赛季CP相互赠送礼物榜单. * 每赛季CP相互赠送礼物榜单.
*/ */
SEASON_CP_GIFT(""), SEASON_CP_GIFT("Season cp gift"),
/** /**
* 签到奖励 * 签到奖励

View File

@ -5,12 +5,17 @@ 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.other.infra.common.activity.PropsActivitySendCommon; import com.red.circle.other.infra.common.activity.PropsActivitySendCommon;
import com.red.circle.other.infra.common.activity.send.SendRewardGroup; import com.red.circle.other.infra.common.activity.send.SendRewardGroup;
import com.red.circle.other.infra.common.props.PropsSendCommon;
import com.red.circle.other.infra.database.mongo.entity.user.count.WeekCpValueCount; import com.red.circle.other.infra.database.mongo.entity.user.count.WeekCpValueCount;
import com.red.circle.other.infra.database.mongo.service.user.count.WeekCpValueCountService; import com.red.circle.other.infra.database.mongo.service.user.count.WeekCpValueCountService;
import com.red.circle.other.infra.database.rds.entity.activity.PropsActivityRewardConfig;
import com.red.circle.other.infra.database.rds.entity.activity.PropsActivityRuleConfig; import com.red.circle.other.infra.database.rds.entity.activity.PropsActivityRuleConfig;
import com.red.circle.other.infra.database.rds.service.activity.PropsActivityRewardConfigService;
import com.red.circle.other.infra.database.rds.service.activity.PropsActivityRuleConfigService; import com.red.circle.other.infra.database.rds.service.activity.PropsActivityRuleConfigService;
import com.red.circle.other.infra.utils.SeasonUtils; import com.red.circle.other.infra.utils.SeasonUtils;
import com.red.circle.other.inner.enums.activity.PropsActivityTypeEnum; import com.red.circle.other.inner.enums.activity.PropsActivityTypeEnum;
import com.red.circle.other.inner.model.cmd.material.PrizeDescribe;
import com.red.circle.other.inner.model.cmd.material.PrizeDescribeRewardCmd;
import com.red.circle.tool.core.collection.CollectionUtils; import com.red.circle.tool.core.collection.CollectionUtils;
import com.red.circle.tool.core.date.DateFormatConstant; import com.red.circle.tool.core.date.DateFormatConstant;
import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils; import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils;
@ -33,6 +38,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/** /**
* CP排行榜奖励发送管理器. * CP排行榜奖励发送管理器.
@ -47,6 +53,8 @@ public class CpRankingRewardManager {
private final PropsActivitySendCommon sendPropsManager; private final PropsActivitySendCommon sendPropsManager;
private final WalletGoldClient walletGoldClient; private final WalletGoldClient walletGoldClient;
private final StringRedisTemplate stringRedisTemplate; private final StringRedisTemplate stringRedisTemplate;
private final PropsActivityRewardConfigService propsActivityRewardConfigService;
private final PropsSendCommon propsSendCommon;
/** /**
* 发送上周周榜前三名奖励 * 发送上周周榜前三名奖励
@ -161,7 +169,7 @@ public class CpRankingRewardManager {
String eventIdOne = String.format("WK_CP_RW_%s_%d_%d", weekDate, userOne, rank); String eventIdOne = String.format("WK_CP_RW_%s_%d_%d", weekDate, userOne, rank);
if (checkAndSetIdempotent(eventIdOne, 15)) { if (checkAndSetIdempotent(eventIdOne, 15)) {
sendGoldAndProps(sysOrigin, userOne, goldReward, rewardConfig.getResourceGroupId(), sendGoldAndProps(sysOrigin, userOne, goldReward, rewardConfig.getResourceGroupId(),
rewardConfig.getId(), SendPropsOrigin.WEEK_CP_GIFT, eventIdOne); rewardConfig.getId(), SendPropsOrigin.WEEK_CP_GIFT, eventIdOne, 0);
log.info("[CP周榜] 排名 {} 用户 {} 奖励发放成功, 金币: {}, 道具组: {}", log.info("[CP周榜] 排名 {} 用户 {} 奖励发放成功, 金币: {}, 道具组: {}",
rank, userOne, goldReward, rewardConfig.getResourceGroupId()); rank, userOne, goldReward, rewardConfig.getResourceGroupId());
} }
@ -170,7 +178,7 @@ public class CpRankingRewardManager {
String eventIdTwo = String.format("WK_CP_RW_%s_%d_%d", weekDate, userTwo, rank); String eventIdTwo = String.format("WK_CP_RW_%s_%d_%d", weekDate, userTwo, rank);
if (checkAndSetIdempotent(eventIdTwo, 15)) { if (checkAndSetIdempotent(eventIdTwo, 15)) {
sendGoldAndProps(sysOrigin, userTwo, goldReward, rewardConfig.getResourceGroupId(), sendGoldAndProps(sysOrigin, userTwo, goldReward, rewardConfig.getResourceGroupId(),
rewardConfig.getId(), SendPropsOrigin.WEEK_CP_GIFT, eventIdTwo); rewardConfig.getId(), SendPropsOrigin.WEEK_CP_GIFT, eventIdTwo, 0);
log.info("[CP周榜] 排名 {} 用户 {} 奖励发放成功, 金币: {}, 道具组: {}", log.info("[CP周榜] 排名 {} 用户 {} 奖励发放成功, 金币: {}, 道具组: {}",
rank, userTwo, goldReward, rewardConfig.getResourceGroupId()); rank, userTwo, goldReward, rewardConfig.getResourceGroupId());
} }
@ -217,12 +225,87 @@ public class CpRankingRewardManager {
Long resourceGroupId, Long resourceGroupId,
Long trackId, Long trackId,
SendPropsOrigin origin, SendPropsOrigin origin,
String eventId) { String eventId,
int sendIndex) {
// 发送金币 // 发送金币
addUserGold(userId, sysOrigin.name(), goldAmount, eventId); addUserGold(userId, sysOrigin.name(), goldAmount, eventId);
SendRewardGroup param = SendRewardGroup.builder()
.trackId(trackId)
.sysOrigin(sysOrigin)
.acceptUserId(userId)
.resourceGroupId(resourceGroupId)
.origin(origin)
.build();
// 发送道具 // 发送道具
sendProps(sysOrigin, userId, resourceGroupId, trackId, origin); List<PropsActivityRewardConfig> configs = propsActivityRewardConfigService.listByGroupId(
param.getResourceGroupId());
if (CollectionUtils.isEmpty(configs)) {
return;
}
// 根据 sendIndex 筛选要发送的配置
List<PropsActivityRewardConfig> filteredConfigs = filterConfigsBySendIndex(configs, sendIndex);
if (CollectionUtils.isEmpty(filteredConfigs)) {
log.warn("根据 sendIndex={} 筛选后没有可发送的配置, resourceGroupId={}", sendIndex, resourceGroupId);
return;
}
propsSendCommon.send(new PrizeDescribeRewardCmd()
.setTrackId(param.getTrackId())
.setAcceptUserId(param.getAcceptUserId())
.setOrigin(param.getOrigin())
.setSysOrigin(param.getSysOrigin())
.setPrizes(toListPrizeDescribe(filteredConfigs))
);
}
/**
* 根据 sendIndex 筛选配置
* AVATAR_FRAME 类型根据 sendIndex 只保留第 sendIndex 其他类型正常返回
* 例如: configs = [AVATAR_FRAME, AVATAR_FRAME, CHAT_BUBBLE]
* sendIndex = 0 -> 返回 [第一个 AVATAR_FRAME, CHAT_BUBBLE]
* sendIndex = 1 -> 返回 [第二个 AVATAR_FRAME, CHAT_BUBBLE]
*/
private List<PropsActivityRewardConfig> filterConfigsBySendIndex(
List<PropsActivityRewardConfig> configs, int sendIndex) {
if (sendIndex < 0 || CollectionUtils.isEmpty(configs)) {
return configs;
}
List<PropsActivityRewardConfig> result = Lists.newArrayList();
String avatarFrameType = "AVATAR_FRAME";
int avatarFrameCount = 0;
for (PropsActivityRewardConfig config : configs) {
if (Objects.equals(avatarFrameType, config.getType())) {
// AVATAR_FRAME 类型只保留第 sendIndex
if (avatarFrameCount == sendIndex) {
result.add(config);
}
avatarFrameCount++;
} else {
// 其他类型正常添加
result.add(config);
}
}
return result;
}
private List<PrizeDescribe> toListPrizeDescribe(List<PropsActivityRewardConfig> configs) {
return configs.stream().map(this::toPrizeDescribe).collect(Collectors.toList());
}
private PrizeDescribe toPrizeDescribe(PropsActivityRewardConfig config) {
return new PrizeDescribe()
.setTrackId(config.getGroupId())
.setType(config.getType())
.setDetailType(config.getDetailType())
.setContent(config.getContent())
.setQuantity(config.getQuantity());
} }
/** /**