cp发送礼物推送消息

(cherry picked from commit c98d91a22cd5be1b36ef25f44e16dd451f28cec4)
This commit is contained in:
tianfeng 2026-04-28 18:07:42 +08:00
parent 8265016692
commit 767d3d0f71
3 changed files with 136 additions and 0 deletions

View File

@ -151,4 +151,9 @@ public enum GroupMessageTypeEnum {
*/
ROOM_RED_PACKET,
/**
* CP礼物飘窗推送等级1/2/3送礼时触发
*/
CP_GIFT_WINDOW,
}

View File

@ -37,6 +37,7 @@ import com.red.circle.other.infra.database.rds.entity.user.user.CpRelationship;
import com.red.circle.other.infra.database.rds.entity.user.user.CpGiftRecord;
import com.red.circle.other.infra.database.rds.service.user.user.CpGiftRecordService;
import com.red.circle.other.infra.database.rds.service.user.user.CpRelationshipService;
import com.red.circle.other.app.service.user.CpGiftWindowBroadcastService;
import com.red.circle.other.infra.database.rds.service.user.user.CpValueService;
import com.red.circle.other.inner.enums.activity.KingQueenType;
import com.red.circle.other.inner.enums.material.GiftCurrencyType;
@ -89,6 +90,7 @@ public class RankCountStrategy implements GiftStrategy {
private final RankingActivityService rankingActivityService;
private final CpRelationshipCacheService cpRelationshipCacheService;
private final ActivityConfigCacheService activityConfigCacheService;
private final CpGiftWindowBroadcastService cpGiftWindowBroadcastService;
@Override
public void processor(OfflineProcessGiftEvent event) {
@ -313,6 +315,9 @@ public class RankCountStrategy implements GiftStrategy {
// 写入CP道具赠送记录
saveCpGiftRecord(runningWater, cp, acceptAmount);
// CP礼物飘窗推送incrValue之后调用等级计算准确
cpGiftWindowBroadcastService.sendIfNeeded(runningWater, cp);
// 排序CP用户ID
ImmutablePair<Long, Long> sortedPair = sortCpUserIds(cp.getUserId(), cp.getCpUserId());
Long orderedUserOne = sortedPair.getLeft();

View File

@ -0,0 +1,126 @@
package com.red.circle.other.app.service.user;
import com.red.circle.common.business.core.enums.SysOriginPlatformEnum;
import com.red.circle.external.inner.endpoint.message.ImGroupClient;
import com.red.circle.external.inner.model.cmd.message.BroadcastGroupMsgBodyCmd;
import com.red.circle.external.inner.model.enums.message.GroupMessageTypeEnum;
import com.red.circle.other.domain.gateway.user.UserProfileGateway;
import com.red.circle.other.domain.model.user.UserProfile;
import com.red.circle.other.infra.database.mongo.entity.gift.GiftGiveRunningWater;
import com.red.circle.other.infra.database.rds.entity.user.user.CpLevelConfig;
import com.red.circle.other.infra.database.rds.entity.user.user.CpRelationship;
import com.red.circle.other.infra.database.cache.service.other.GiftCacheService;
import com.red.circle.other.infra.database.rds.service.user.user.CpValueService;
import com.red.circle.other.inner.model.dto.material.GiftConfigDTO;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* CP礼物飘窗广播服务.
*
* <p>在CP送礼CP值累加后调用根据当前CP等级决定是否推送飘窗消息
* 以及推送哪个等级的飘窗样式1/2/3
*
* @author pengliang
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class CpGiftWindowBroadcastService {
private final CpValueService cpValueService;
private final UserProfileGateway userProfileGateway;
private final GiftCacheService giftCacheService;
private final ImGroupClient imGroupClient;
/**
* 判断是否需要推送飘窗满足条件则发送广播.
*
* <p>必须在 {@code cpValueService.incrValue()} 之后调用保证取到的是累加后最新CP值
*
* @param runningWater 礼物流水
* @param cp CP关系
*/
public void sendIfNeeded(GiftGiveRunningWater runningWater, CpRelationship cp) {
try {
// 1. 查最新CP值incrValue之后取累加后结果
BigDecimal cpVal = cpValueService.getCpVal(cp.getCpValId());
CpLevelConfig levelConfig = CpLevelConfig.of(cpVal);
int giftWindowLevel = levelConfig.getGiftWindowLevel();
// 2. 等级0不推送
if (giftWindowLevel <= 0) {
return;
}
// 3. 批量查送礼人收礼人用户信息
Set<Long> userIds = Set.of(runningWater.getUserId(), cp.getCpUserId());
Map<Long, UserProfile> profileMap = userProfileGateway.mapByUserIds(userIds);
UserProfile sender = profileMap.get(runningWater.getUserId());
UserProfile receiver = profileMap.get(cp.getCpUserId());
// 4. 查礼物配置走缓存
GiftConfigDTO giftConfig = giftCacheService.getById(runningWater.getGiftId());
// 5. 组装并发送广播
Map<Object, Object> data = buildData(runningWater, sender, receiver, giftConfig,
giftWindowLevel, levelConfig.getLevel());
imGroupClient.sendMessageBroadcast(
BroadcastGroupMsgBodyCmd.builder()
.toPlatform(SysOriginPlatformEnum.valueOf(runningWater.getSysOrigin()))
.type(GroupMessageTypeEnum.CP_GIFT_WINDOW)
.data(data)
.build()
);
log.info("【CP飘窗推送】发送成功, senderUserId={}, receiverUserId={}, cpLevel={}, windowLevel={}",
runningWater.getUserId(), cp.getCpUserId(), levelConfig.getLevel(), giftWindowLevel);
} catch (Exception e) {
log.warn("【CP飘窗推送】发送失败, runningWaterId={}, cpValId={}, error={}",
runningWater.getId(), cp.getCpValId(), e.getMessage(), e);
}
}
private Map<Object, Object> buildData(GiftGiveRunningWater runningWater,
UserProfile sender, UserProfile receiver,
GiftConfigDTO giftConfig, int giftWindowLevel, int cpLevel) {
Map<Object, Object> data = new HashMap<>();
data.put("runningWaterId", String.valueOf(runningWater.getId()));
data.put("giftWindowLevel", giftWindowLevel);
data.put("cpLevel", cpLevel);
if (sender != null) {
data.put("senderUserId", String.valueOf(sender.getId()));
data.put("senderNickname", sender.getUserNickname());
data.put("senderAvatar", sender.getUserAvatar());
data.put("senderAccount", sender.getDisplayAccount());
}
if (receiver != null) {
data.put("receiverUserId", String.valueOf(receiver.getId()));
data.put("receiverNickname", receiver.getUserNickname());
data.put("receiverAvatar", receiver.getUserAvatar());
data.put("receiverAccount", receiver.getDisplayAccount());
}
if (giftConfig != null) {
data.put("giftId", String.valueOf(giftConfig.getId()));
data.put("giftName", giftConfig.getGiftName());
data.put("giftIcon", giftConfig.getGiftPhoto());
}
Integer quantity = runningWater.getGiftValue().getQuantity();
data.put("giftCount", quantity != null ? quantity : 1);
return data;
}
}