南亚区国家区分处理

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.service.game.GameLudoService;
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.UserSVipGateway;
import com.red.circle.other.domain.model.user.UserProfile;
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.mongo.entity.live.ActiveVoiceRoom;
@ -60,6 +62,7 @@ public class RoomVoiceDiscoverQryExe {
private final RedisTemplate<String, Object> redisTemplate;
private final RocketStatusCacheService rocketStatusCacheService;
private final GameLudoService gameLudoService;
private final UserProfileGateway userProfileGateway;
private static final String EMPTY_ROOM_CACHE_KEY = "empty_room_cache:*";
@ -71,6 +74,7 @@ public class RoomVoiceDiscoverQryExe {
public List<RoomVoiceProfileCO> execute(AppExtCommand cmd) {
String region = cmd.isAllRegion() ? "ALL" : userRegionGateway.getRegionCode(cmd.requiredReqUserId());
UserProfile userProfile = userProfileGateway.getByUserId(cmd.requiredReqUserId());
String key = cmd.requireReqSysOrigin() + region;
String regionsRoom = regionRoomCacheService.getRegionsRoom(key);
@ -79,28 +83,24 @@ public class RoomVoiceDiscoverQryExe {
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();
if (CollectionUtils.isNotEmpty(emptyRooms)) {
// 按照listDiscover的过滤规则过滤空房间
List<ActiveVoiceRoom> matchedEmptyRooms = filterEmptyRoomsByRegion(emptyRooms, cmd.requireReqSysOrigin(), cmd.isAllRegion(), region);
List<ActiveVoiceRoom> matchedEmptyRooms = filterEmptyRoomsByRegion(emptyRooms, cmd.requireReqSysOrigin(), cmd.isAllRegion(), region, userCountryCode);
if (CollectionUtils.isNotEmpty(matchedEmptyRooms)) {
// 创建新的可修改列表合并活跃房间和空房间并去重
List<ActiveVoiceRoom> allRooms = new ArrayList<>(activeVoiceRooms);
// 获取已存在的房间ID
Set<Long> existingRoomIds = activeVoiceRooms.stream()
.map(ActiveVoiceRoom::getId)
.collect(Collectors.toSet());
// 只添加不存在的空房间
matchedEmptyRooms.stream()
.filter(room -> !existingRoomIds.contains(room.getId()))
.forEach(allRooms::add);
activeVoiceRooms = allRooms;
}
}
log.info("activeVoiceRooms:{}", JSON.toJSONString(activeVoiceRooms));
List<RoomVoiceProfileCO> roomList = roomVoiceProfileCommon.toListRoomVoiceProfileCO(activeVoiceRooms);
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()
.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());
}

View File

@ -37,7 +37,7 @@ public class EmptyRoomCleanTask {
public void cleanEmptyRooms() {
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)) {
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
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> excludeRegions = userRegionGroup == null ? ALL_SPECIAL_REGIONS : getExcludeRegionsForGroup(userRegionGroup);
@ -148,6 +148,10 @@ public class ActiveVoiceRoomServiceImpl implements ActiveVoiceRoomService {
if (userRegionGroup == null && !isAllRegion) {
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(
// 1. 匹配国家可选条件
Aggregation.match(criteria),