进房间VIP等级问题修复

This commit is contained in:
tianfeng 2025-10-30 21:39:48 +08:00
parent 31a2522c64
commit aefcf81c5d
5 changed files with 66 additions and 36 deletions

View File

@ -50,10 +50,7 @@ import com.red.circle.tool.core.sequence.IdWorkerUtils;
import com.red.circle.tool.core.text.StringUtils; import com.red.circle.tool.core.text.StringUtils;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.List; import java.util.*;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
@ -319,23 +316,57 @@ public class RoomEnterCmdExe {
manager.getSetting().setTakeMicRole(RoomTakeMicRoleEnum.ALL.name()); manager.getSetting().setTakeMicRole(RoomTakeMicRoleEnum.ALL.name());
} }
NobleAbilityCO userNobleAbility = userProfileGateway.getUserNobleAbility(manager.getUserId()); List<NobleAbilityCO> nobleAbilityCOList = userProfileGateway.getUserNobleAbility(manager.getUserId());
String mikeType = "";
String oldMikeType = manager.getSetting().getRoomSpecialMikeType(); String oldMikeType = manager.getSetting().getRoomSpecialMikeType();
if (Objects.nonNull(userNobleAbility)) { if (StringUtils.isNotBlank(oldMikeType)) {
RoomSetting setting = manager.getSetting(); RoomSetting setting = manager.getSetting();
mikeType = "TYPE_VIP" + userNobleAbility.getVipLevel(); Integer maxVipLevel = getMaxVipLevel(nobleAbilityCOList);
setting.setRoomSpecialMikeType(mikeType); Integer oldVipLevel = extractVipLevel(oldMikeType);
manager.setSetting(setting);
// 不一样则更新
if (oldVipLevel > maxVipLevel) {
String mikeType = "TYPE_VIP" + maxVipLevel;
setting.setRoomSpecialMikeType(mikeType);
manager.setSetting(setting);
roomProfileManagerService.updateSelectiveSetting(manager.getId(),
roomProfileAppConvertor.toRoomSetting(new UpdateRoomSettingCmd().setRoomId(manager.getId()).setRoomSpecialMikeType(mikeType)));
}
} }
// 不一样则更新 }
if (!mikeType.equals(oldMikeType)) {
roomProfileManagerService.updateSelectiveSetting(manager.getId(), private Integer getMaxVipLevel(List<NobleAbilityCO> nobleAbilityCOList) {
roomProfileAppConvertor.toRoomSetting(new UpdateRoomSettingCmd().setRoomId(manager.getId()).setRoomSpecialMikeType(mikeType))); if (CollectionUtils.isEmpty(nobleAbilityCOList)) {
return 0;
} }
return nobleAbilityCOList.stream()
.filter(Objects::nonNull)
.filter(co -> co.getVipLevel() != null)
.max(Comparator.comparing(NobleAbilityCO::getVipLevel))
.map(NobleAbilityCO::getVipLevel)
.orElse(0);
} }
private Integer extractVipLevel(String mikeType) {
if (StringUtils.isBlank(mikeType)) {
return 0;
}
String numberStr = mikeType.replaceAll(".*?(\\d+)$", "$1");
if (StringUtils.isBlank(numberStr) || numberStr.equals(mikeType)) {
return 0;
}
try {
return Integer.parseInt(numberStr);
} catch (NumberFormatException e) {
return 0;
}
}
public void checkSysOrigin(Long userId, String sysOrigin) { public void checkSysOrigin(Long userId, String sysOrigin) {
SysOriginPlatformEnum reqUserOrigin = SysOriginPlatformEnum.valueOf( SysOriginPlatformEnum reqUserOrigin = SysOriginPlatformEnum.valueOf(
userProfileGateway.getSysOrigin(userId)); userProfileGateway.getSysOrigin(userId));

View File

@ -178,7 +178,7 @@ public interface UserProfileGateway {
* @param userId 用户ID * @param userId 用户ID
* @return 贵族能力信息 * @return 贵族能力信息
*/ */
NobleAbilityCO getUserNobleAbility(Long userId); List<NobleAbilityCO> getUserNobleAbility(Long userId);
/** /**
* 修改用户签名为空. * 修改用户签名为空.

View File

@ -82,7 +82,7 @@ public interface UserCacheService {
/** /**
* 获取用户贵族能力. * 获取用户贵族能力.
*/ */
NobleAbilityCO getUserNobleAbility(Long userId, Function<Long, NobleAbilityCO> orElseGet); List<NobleAbilityCO> getUserNobleAbility(Long userId, Function<Long, List<NobleAbilityCO>> orElseGet);
/** /**
* 移除权益缓存. * 移除权益缓存.

View File

@ -1,6 +1,7 @@
package com.red.circle.other.infra.database.cache.service.user.impl; package com.red.circle.other.infra.database.cache.service.user.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.red.circle.component.redis.service.RedisService; import com.red.circle.component.redis.service.RedisService;
import com.red.circle.other.domain.model.user.NobleAbilityCO; import com.red.circle.other.domain.model.user.NobleAbilityCO;
@ -174,8 +175,8 @@ public class UserCacheServiceImpl implements UserCacheService {
} }
@Override @Override
public NobleAbilityCO getUserNobleAbility(Long userId, public List<NobleAbilityCO> getUserNobleAbility(Long userId,
Function<Long, NobleAbilityCO> orElseGet) { Function<Long, List<NobleAbilityCO>> orElseGet) {
String key = UserKey.NOBLE_ABILITY.getKey(userId); String key = UserKey.NOBLE_ABILITY.getKey(userId);
@ -183,13 +184,17 @@ public class UserCacheServiceImpl implements UserCacheService {
if (StringUtils.isNotBlank(cacheValue)) { if (StringUtils.isNotBlank(cacheValue)) {
try { try {
return JSON.parseObject(cacheValue, NobleAbilityCO.class); JSONArray jsonArray = JSONArray.parseArray(cacheValue);
return jsonArray.stream().map(e -> {
NobleAbilityCO nobleAbilityCO = JSON.parseObject(JSON.toJSONString(e), NobleAbilityCO.class);
return nobleAbilityCO;
}).toList();
} catch (Exception ignored) { } catch (Exception ignored) {
} }
return null; return null;
} }
NobleAbilityCO ability = orElseGet.apply(userId); List<NobleAbilityCO> ability = orElseGet.apply(userId);
if (Objects.nonNull(ability)) { if (Objects.nonNull(ability)) {
redisService.setIfAbsent(key, JSON.toJSONString(ability), 10, TimeUnit.MINUTES); redisService.setIfAbsent(key, JSON.toJSONString(ability), 10, TimeUnit.MINUTES);

View File

@ -47,14 +47,7 @@ import com.red.circle.tool.core.text.StringUtils;
import com.red.circle.tool.core.thread.ThreadPoolManager; import com.red.circle.tool.core.thread.ThreadPoolManager;
import com.red.circle.tool.core.tuple.ImmutableKeyValuePair; import com.red.circle.tool.core.tuple.ImmutableKeyValuePair;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Collection; import java.util.*;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -521,11 +514,11 @@ public class UserProfileGatewayImpl implements UserProfileGateway {
} }
@Override @Override
public NobleAbilityCO getUserNobleAbility(Long userId) { public List<NobleAbilityCO> getUserNobleAbility(Long userId) {
return userCacheService.getUserNobleAbility(userId, this::getNobleAbility); return userCacheService.getUserNobleAbility(userId, this::getNobleAbility);
} }
private NobleAbilityCO getNobleAbility(Long userId) { private List<NobleAbilityCO> getNobleAbility(Long userId) {
UserProfile userProfile = getByUserId(userId); UserProfile userProfile = getByUserId(userId);
if (Objects.isNull(userProfile)) { if (Objects.isNull(userProfile)) {
return null; return null;
@ -542,12 +535,13 @@ public class UserProfileGatewayImpl implements UserProfileGateway {
return null; return null;
} }
PropsNobleVipAbility ability = vipAbilities.get(0); return vipAbilities.stream().map(e -> {
NobleAbilityCO result = new NobleAbilityCO(); NobleAbilityCO result = new NobleAbilityCO();
result.setVipType(ability.getVipType()); result.setVipType(e.getVipType());
result.setVipLevel(ability.getVipLevel()); result.setVipLevel(e.getVipLevel());
result.setRoomMaxMember(ability.getRoomMaxMember()); result.setRoomMaxMember(e.getRoomMaxMember());
return result; return result;
}).toList();
} }
/** /**