南亚区国家区分处理

This commit is contained in:
tianfeng 2026-03-20 12:19:18 +08:00
parent 8eff471204
commit 6a1385fc99
4 changed files with 17 additions and 12 deletions

View File

@ -10,8 +10,10 @@ import com.red.circle.other.app.common.room.RoomVoiceProfileCommon;
import com.red.circle.other.app.dto.clientobject.room.RoomVoiceProfileCO; import com.red.circle.other.app.dto.clientobject.room.RoomVoiceProfileCO;
import com.red.circle.other.app.service.game.GameLudoService; import com.red.circle.other.app.service.game.GameLudoService;
import com.red.circle.other.app.service.room.RocketStatusCacheService; import com.red.circle.other.app.service.room.RocketStatusCacheService;
import com.red.circle.other.domain.gateway.user.UserProfileGateway;
import com.red.circle.other.domain.gateway.user.ability.UserRegionGateway; import com.red.circle.other.domain.gateway.user.ability.UserRegionGateway;
import com.red.circle.other.domain.gateway.user.ability.UserSVipGateway; import com.red.circle.other.domain.gateway.user.ability.UserSVipGateway;
import com.red.circle.other.domain.model.user.UserProfile;
import com.red.circle.other.domain.rocket.RocketStatus; import com.red.circle.other.domain.rocket.RocketStatus;
import com.red.circle.other.infra.database.cache.service.user.RegionRoomCacheService; import com.red.circle.other.infra.database.cache.service.user.RegionRoomCacheService;
import com.red.circle.other.infra.database.mongo.entity.live.ActiveVoiceRoom; import com.red.circle.other.infra.database.mongo.entity.live.ActiveVoiceRoom;
@ -60,6 +62,7 @@ public class RoomVoiceDiscoverQryExe {
private final RedisTemplate<String, Object> redisTemplate; private final RedisTemplate<String, Object> redisTemplate;
private final RocketStatusCacheService rocketStatusCacheService; private final RocketStatusCacheService rocketStatusCacheService;
private final GameLudoService gameLudoService; private final GameLudoService gameLudoService;
private final UserProfileGateway userProfileGateway;
private static final String EMPTY_ROOM_CACHE_KEY = "empty_room_cache:*"; private static final String EMPTY_ROOM_CACHE_KEY = "empty_room_cache:*";
@ -71,6 +74,7 @@ public class RoomVoiceDiscoverQryExe {
public List<RoomVoiceProfileCO> execute(AppExtCommand cmd) { public List<RoomVoiceProfileCO> execute(AppExtCommand cmd) {
String region = cmd.isAllRegion() ? "ALL" : userRegionGateway.getRegionCode(cmd.requiredReqUserId()); String region = cmd.isAllRegion() ? "ALL" : userRegionGateway.getRegionCode(cmd.requiredReqUserId());
UserProfile userProfile = userProfileGateway.getByUserId(cmd.requiredReqUserId());
String key = cmd.requireReqSysOrigin() + region; String key = cmd.requireReqSysOrigin() + region;
String regionsRoom = regionRoomCacheService.getRegionsRoom(key); String regionsRoom = regionRoomCacheService.getRegionsRoom(key);
@ -79,28 +83,24 @@ public class RoomVoiceDiscoverQryExe {
return roomList; return roomList;
} }
List<ActiveVoiceRoom> activeVoiceRooms = activeVoiceRoomService.listDiscover(cmd.requireReqSysOrigin(), cmd.isAllRegion(), region, 50); String userCountryCode = userProfile != null ? userProfile.getCountryCode() : null;
List<ActiveVoiceRoom> activeVoiceRooms = activeVoiceRoomService.listDiscover(cmd.requireReqSysOrigin(), cmd.isAllRegion(), region, userCountryCode, 50);
// 查询没人的房间缓存加入进去 // 查询没人的房间缓存加入进去
List<ActiveVoiceRoom> emptyRooms = getEmptyRoomsFromCache(); List<ActiveVoiceRoom> emptyRooms = getEmptyRoomsFromCache();
if (CollectionUtils.isNotEmpty(emptyRooms)) { if (CollectionUtils.isNotEmpty(emptyRooms)) {
// 按照listDiscover的过滤规则过滤空房间 List<ActiveVoiceRoom> matchedEmptyRooms = filterEmptyRoomsByRegion(emptyRooms, cmd.requireReqSysOrigin(), cmd.isAllRegion(), region, userCountryCode);
List<ActiveVoiceRoom> matchedEmptyRooms = filterEmptyRoomsByRegion(emptyRooms, cmd.requireReqSysOrigin(), cmd.isAllRegion(), region);
if (CollectionUtils.isNotEmpty(matchedEmptyRooms)) { if (CollectionUtils.isNotEmpty(matchedEmptyRooms)) {
// 创建新的可修改列表合并活跃房间和空房间并去重
List<ActiveVoiceRoom> allRooms = new ArrayList<>(activeVoiceRooms); List<ActiveVoiceRoom> allRooms = new ArrayList<>(activeVoiceRooms);
// 获取已存在的房间ID
Set<Long> existingRoomIds = activeVoiceRooms.stream() Set<Long> existingRoomIds = activeVoiceRooms.stream()
.map(ActiveVoiceRoom::getId) .map(ActiveVoiceRoom::getId)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
// 只添加不存在的空房间
matchedEmptyRooms.stream() matchedEmptyRooms.stream()
.filter(room -> !existingRoomIds.contains(room.getId())) .filter(room -> !existingRoomIds.contains(room.getId()))
.forEach(allRooms::add); .forEach(allRooms::add);
activeVoiceRooms = allRooms; activeVoiceRooms = allRooms;
} }
} }
log.info("activeVoiceRooms:{}", JSON.toJSONString(activeVoiceRooms));
List<RoomVoiceProfileCO> roomList = roomVoiceProfileCommon.toListRoomVoiceProfileCO(activeVoiceRooms); List<RoomVoiceProfileCO> roomList = roomVoiceProfileCommon.toListRoomVoiceProfileCO(activeVoiceRooms);
if (CollectionUtils.isEmpty(roomList)) { if (CollectionUtils.isEmpty(roomList)) {
@ -249,10 +249,11 @@ public class RoomVoiceDiscoverQryExe {
} }
} }
private List<ActiveVoiceRoom> filterEmptyRoomsByRegion(List<ActiveVoiceRoom> emptyRooms, String sysOrigin, boolean isAllRegion, String region) { private List<ActiveVoiceRoom> filterEmptyRoomsByRegion(List<ActiveVoiceRoom> emptyRooms, String sysOrigin, boolean isAllRegion, String region, String userCountryCode) {
return emptyRooms.stream() return emptyRooms.stream()
.filter(room -> Objects.equals(sysOrigin, room.getSysOrigin()) && .filter(room -> Objects.equals(sysOrigin, room.getSysOrigin()) &&
(isAllRegion || shouldShowRoom(region, room.getRegion()))) (isAllRegion || shouldShowRoom(region, room.getRegion())) &&
(!SA_REGIONS.contains(region) || userCountryCode == null || userCountryCode.equals(room.getCountryCode())))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

View File

@ -37,7 +37,7 @@ public class EmptyRoomCleanTask {
public void cleanEmptyRooms() { public void cleanEmptyRooms() {
try { try {
// 获取所有活跃房间 // 获取所有活跃房间
List<ActiveVoiceRoom> allRooms = activeVoiceRoomService.listDiscover(SysOriginPlatformEnum.LIKEI.name(),true,"",200); List<ActiveVoiceRoom> allRooms = activeVoiceRoomService.listDiscover(SysOriginPlatformEnum.LIKEI.name(),true,"",null,200);
if (CollectionUtils.isEmpty(allRooms)) { if (CollectionUtils.isEmpty(allRooms)) {
return; return;
} }

View File

@ -65,7 +65,7 @@ public interface ActiveVoiceRoomService {
/** /**
* 获取发现页数据. * 获取发现页数据.
*/ */
List<ActiveVoiceRoom> listDiscover(String sysOrigin, boolean isAllRegion, String region, Integer limit); List<ActiveVoiceRoom> listDiscover(String sysOrigin, boolean isAllRegion, String region, String countryCode, Integer limit);
/** /**
* 获取区域房间. * 获取区域房间.

View File

@ -133,7 +133,7 @@ public class ActiveVoiceRoomServiceImpl implements ActiveVoiceRoomService {
@Override @Override
public List<ActiveVoiceRoom> listDiscover(String sysOrigin, boolean isAllRegion, String region, Integer limit) { public List<ActiveVoiceRoom> listDiscover(String sysOrigin, boolean isAllRegion, String region, String countryCode, Integer limit) {
// 区域隔离 // 区域隔离
Set<String> userRegionGroup = getRegionGroup(region); Set<String> userRegionGroup = getRegionGroup(region);
Set<String> excludeRegions = userRegionGroup == null ? ALL_SPECIAL_REGIONS : getExcludeRegionsForGroup(userRegionGroup); Set<String> excludeRegions = userRegionGroup == null ? ALL_SPECIAL_REGIONS : getExcludeRegionsForGroup(userRegionGroup);
@ -148,6 +148,10 @@ public class ActiveVoiceRoomServiceImpl implements ActiveVoiceRoomService {
if (userRegionGroup == null && !isAllRegion) { if (userRegionGroup == null && !isAllRegion) {
criteria.and("region").nin(excludeRegions); criteria.and("region").nin(excludeRegions);
} }
// SA_REGIONS 用户只能看到相同国家的房间
if (SA_REGIONS.contains(region) && !isAllRegion && StringUtils.isNotBlank(countryCode)) {
criteria.and("countryCode").is(countryCode);
}
Aggregation aggregation = Aggregation.newAggregation( Aggregation aggregation = Aggregation.newAggregation(
// 1. 匹配国家可选条件 // 1. 匹配国家可选条件
Aggregation.match(criteria), Aggregation.match(criteria),