游戏排行新增regions字段

This commit is contained in:
tianfeng 2026-05-29 18:42:03 +08:00
parent 4f9fe9c664
commit cab174318a
10 changed files with 45 additions and 4 deletions

View File

@ -9,12 +9,14 @@ import com.red.circle.other.app.dto.cmd.game.GameRankingQry;
import com.red.circle.other.domain.game.GameRankingPeriodType; import com.red.circle.other.domain.game.GameRankingPeriodType;
import com.red.circle.other.domain.game.GameRankingRecord; import com.red.circle.other.domain.game.GameRankingRecord;
import com.red.circle.other.domain.gateway.game.GameRankingGateway; import com.red.circle.other.domain.gateway.game.GameRankingGateway;
import com.red.circle.other.domain.gateway.user.ability.UserRegionGateway;
import com.red.circle.other.infra.database.cache.key.GameRankingKeys; import com.red.circle.other.infra.database.cache.key.GameRankingKeys;
import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils; import com.red.circle.tool.core.date.ZonedDateTimeAsiaRiyadhUtils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.IntStream; import java.util.stream.IntStream;
@ -31,6 +33,7 @@ public class GameRankingQryExe {
private final GameRankingGateway gameRankingGateway; private final GameRankingGateway gameRankingGateway;
private final GameRankingConvertor gameRankingConvertor; private final GameRankingConvertor gameRankingConvertor;
private final RedisService redisService; private final RedisService redisService;
private final UserRegionGateway userRegionGateway;
private static final long CACHE_EXPIRE_SECONDS = 300; private static final long CACHE_EXPIRE_SECONDS = 300;
@ -40,7 +43,8 @@ public class GameRankingQryExe {
Integer pageNum = qry.getCurrent().intValue(); Integer pageNum = qry.getCurrent().intValue();
Integer pageSize = qry.getSize().intValue(); Integer pageSize = qry.getSize().intValue();
String cacheKey = buildCacheKey(periodType, periodKey, pageNum, pageSize); String regionId = userRegionGateway.getRegionId(qry.requiredReqUserId());
String cacheKey = buildCacheKey(periodType, periodKey, regionId, pageNum, pageSize);
PageResult<GameRankingCO> cachedResult = redisService.getStringToObject(cacheKey, PageResult.class); PageResult<GameRankingCO> cachedResult = redisService.getStringToObject(cacheKey, PageResult.class);
if (cachedResult != null) { if (cachedResult != null) {
@ -59,8 +63,19 @@ public class GameRankingQryExe {
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
// 区域过滤regions 有值时只保留包含当前用户 regionId 的游戏
List<GameRankingCO> filtered = coList.stream()
.filter(co -> {
String regions = co.getRegions();
if (regions == null || regions.isBlank()) {
return true;
}
return Objects.nonNull(regionId) && List.of(regions.split(",")).contains(regionId);
})
.collect(Collectors.toList());
// latest 排前 latest 保持原 totalPrizeAmount 排序 // latest 排前 latest 保持原 totalPrizeAmount 排序
List<GameRankingCO> sorted = coList.stream() List<GameRankingCO> sorted = filtered.stream()
.sorted((a, b) -> { .sorted((a, b) -> {
boolean aLatest = a.isLatest(); boolean aLatest = a.isLatest();
boolean bLatest = b.isLatest(); boolean bLatest = b.isLatest();
@ -96,7 +111,7 @@ public class GameRankingQryExe {
return null; return null;
} }
private String buildCacheKey(String periodType, String periodKey, Integer pageNum, Integer pageSize) { private String buildCacheKey(String periodType, String periodKey, String regionId, Integer pageNum, Integer pageSize) {
return GameRankingKeys.RANKING_PAGE.getKey(periodType, periodKey, pageNum, pageSize); return GameRankingKeys.RANKING_PAGE.getKey(periodType, periodKey, regionId, pageNum, pageSize);
} }
} }

View File

@ -31,6 +31,7 @@ public class GameRankingConvertor {
co.setTotalPrizeAmount(record.getTotalPrizeAmount()); co.setTotalPrizeAmount(record.getTotalPrizeAmount());
co.setPeriodType(record.getPeriodType()); co.setPeriodType(record.getPeriodType());
co.setGameCreateTime(record.getGameCreateTime()); co.setGameCreateTime(record.getGameCreateTime());
co.setRegions(record.getRegions());
return co; return co;
} }
} }

View File

@ -56,6 +56,7 @@ public class GameRankingInitTask {
.gameUrl(config.getGameCode()) .gameUrl(config.getGameCode())
.gameCreateTime(config.getCreateTime()) .gameCreateTime(config.getCreateTime())
.showcase(config.getShowcase()) .showcase(config.getShowcase())
.regions(config.getRegions())
.periodType(GameRankingPeriodType.WEEK.getCode()) .periodType(GameRankingPeriodType.WEEK.getCode())
.periodKey(weekKey) .periodKey(weekKey)
.amount(0L) .amount(0L)

View File

@ -167,6 +167,7 @@ public class GameEventService {
.sysOrigin(gameConfig.getSysOrigin()) .sysOrigin(gameConfig.getSysOrigin())
.amount(gold) .amount(gold)
.showcase(gameConfig.getShowcase()) .showcase(gameConfig.getShowcase())
.regions(gameConfig.getRegions())
.periodType(GameRankingPeriodType.WEEK.getCode()) .periodType(GameRankingPeriodType.WEEK.getCode())
.periodKey(ZonedDateTimeAsiaRiyadhUtils.nowWeekMondayToInt().toString()) .periodKey(ZonedDateTimeAsiaRiyadhUtils.nowWeekMondayToInt().toString())
.gameCreateTime(gameConfig.getCreateTime()) .gameCreateTime(gameConfig.getCreateTime())

View File

@ -61,6 +61,11 @@ public class GameRankingCO {
*/ */
private Timestamp gameCreateTime; private Timestamp gameCreateTime;
/**
* 区域ID列表逗号分隔为空代表全区域
*/
private String regions;
public boolean isLatest() { public boolean isLatest() {
if (gameCreateTime == null) { if (gameCreateTime == null) {
return false; return false;

View File

@ -71,4 +71,9 @@ public class GameRankingIncrementCmd {
* 是否上架 * 是否上架
*/ */
private Boolean showcase; private Boolean showcase;
/**
* 区域ID列表逗号分隔为空代表全区域
*/
private String regions;
} }

View File

@ -64,4 +64,9 @@ public class GameRankingRecord {
* 游戏创建时间 * 游戏创建时间
*/ */
private Timestamp gameCreateTime; private Timestamp gameCreateTime;
/**
* 区域ID列表逗号分隔为空代表全区域
*/
private String regions;
} }

View File

@ -82,6 +82,11 @@ public class GameRanking {
*/ */
private Boolean showcase; private Boolean showcase;
/**
* 区域ID列表逗号分隔为空代表全区域
*/
private String regions;
/** /**
* 游戏创建时间 * 游戏创建时间
*/ */

View File

@ -82,6 +82,7 @@ public class GameRankingGatewayImpl implements GameRankingGateway {
update.inc("totalPrizeAmount", cmd.getAmount()); update.inc("totalPrizeAmount", cmd.getAmount());
update.set("updateTime", LocalDateTime.now()); update.set("updateTime", LocalDateTime.now());
update.set("showcase", cmd.getShowcase()); update.set("showcase", cmd.getShowcase());
update.set("regions", cmd.getRegions());
update.setOnInsert("createTime", LocalDateTime.now()); update.setOnInsert("createTime", LocalDateTime.now());
update.setOnInsert("sysOrigin", cmd.getSysOrigin()); update.setOnInsert("sysOrigin", cmd.getSysOrigin());
update.setOnInsert("gameOrigin", cmd.getGameOrigin()); update.setOnInsert("gameOrigin", cmd.getGameOrigin());
@ -111,6 +112,7 @@ public class GameRankingGatewayImpl implements GameRankingGateway {
record.setPeriodKey(entity.getPeriodKey()); record.setPeriodKey(entity.getPeriodKey());
record.setTotalPrizeAmount(entity.getTotalPrizeAmount()); record.setTotalPrizeAmount(entity.getTotalPrizeAmount());
record.setGameCreateTime(entity.getGameCreateTime()); record.setGameCreateTime(entity.getGameCreateTime());
record.setRegions(entity.getRegions());
return record; return record;
} }
} }

View File

@ -101,6 +101,7 @@ public class SysGameListConfigClientServiceImpl implements SysGameListConfigClie
.gameUrl(config.getGameCode()) .gameUrl(config.getGameCode())
.gameCreateTime(config.getCreateTime()) .gameCreateTime(config.getCreateTime())
.showcase(config.getShowcase()) .showcase(config.getShowcase())
.regions(config.getRegions())
.periodType(GameRankingPeriodType.WEEK.getCode()) .periodType(GameRankingPeriodType.WEEK.getCode())
.periodKey(ZonedDateTimeAsiaRiyadhUtils.nowWeekMondayToInt().toString()) .periodKey(ZonedDateTimeAsiaRiyadhUtils.nowWeekMondayToInt().toString())
.amount(0L) .amount(0L)