From d09b13c0386c47b6afb57a8d0392abbf3f4d07ae Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Fri, 24 Apr 2026 14:50:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E6=8E=92=E8=A1=8C=E6=A6=9C?= =?UTF-8?q?=E6=96=B0=E5=A2=9EregionId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 9ef4d79a32724dfd082393d47dae7c2859684a69) --- .../activity/query/RankingListQryExe.java | 99 +++++++------------ .../activity/RankingActivityRecord.java | 5 + .../RankingActivityRecordRepository.java | 41 ++++++++ .../infra/gateway/RankingActivityGateway.java | 8 +- .../gateway/RankingActivityGatewayImpl.java | 48 +++++---- 5 files changed, 114 insertions(+), 87 deletions(-) diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/RankingListQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/RankingListQryExe.java index d9cb5773..8d46e92d 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/RankingListQryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/RankingListQryExe.java @@ -9,6 +9,7 @@ import com.red.circle.other.app.dto.clientobject.activity.UserRankInfoCO; import com.red.circle.other.app.dto.cmd.activity.RankingListQueryCmd; import com.red.circle.other.domain.enums.VipAbilityType; 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.model.user.UserProfile; import com.red.circle.other.domain.ranking.RankingActivityType; import com.red.circle.other.infra.utils.UserIdEncryptUtils; @@ -51,6 +52,7 @@ public class RankingListQryExe { private final UserProfileAppConvertor userProfileAppConvertor; private final SysActivityConfigClient sysActivityConfigClient; private final EnumConfigCacheService enumConfigCacheService; + private final UserRegionGateway userRegionGateway; public RankingListCO execute(RankingListQueryCmd cmd) { // 获取枚举 @@ -64,13 +66,15 @@ public class RankingListQryExe { } // 查询排行榜列表 + String regionId = cmd.getReqUserId() != null ? userRegionGateway.getRegionId(cmd.getReqUserId()) : null; List records = rankingActivityGateway.getRankingList( cmd.getReqSysOrigin().getOrigin(), activityType, cycleType, cmd.getCycleKey(), null, - cmd.getTopN() + cmd.getTopN(), + regionId ); Set userIds = getUserIds(records); @@ -106,7 +110,7 @@ public class RankingListQryExe { // 查询当前用户排名(如果需要) UserRankInfoCO currentUserRank = null; if (cmd.getIncludeCurrentUser() && cmd.getReqUserId() != null) { - currentUserRank = queryCurrentUserRank(cmd, rankingList); + currentUserRank = queryCurrentUserRank(cmd, rankingList, cycleType, regionId); UserProfile userProfile = userProfileGateway.getByUserId(cmd.getReqUserId()); if (userProfile != null) { currentUserRank.setAccount(userProfile.getActualAccount()); @@ -142,17 +146,22 @@ public class RankingListQryExe { return result; } + private Set getUserIds(List records) { + return records.stream().map(RankingActivityRecord::getUserId).collect(Collectors.toSet()); + } + /** - * 从排行榜列表中查询当前用户排名 + * 查询当前用户排名 */ private UserRankInfoCO queryCurrentUserRank( RankingListQueryCmd cmd, - List rankingList) { + List rankingList, + RankingCycleType cycleType, + String regionId) { UserRankInfoCO rankInfo = new UserRankInfoCO(); rankInfo.setUserId(cmd.getReqUserId()); - // 从排行榜列表中查找当前用户 Optional userInList = rankingList.stream() .filter(record -> cmd.getReqUserId().equals(record.getUserId()) || (record.getUserId() == null @@ -161,18 +170,14 @@ public class RankingListQryExe { .findFirst(); if (userInList.isPresent()) { - // 用户在榜单中 RankingActivityRecordCO userRecord = userInList.get(); rankInfo.setRank(userRecord.getRank()); rankInfo.setQuantity(userRecord.getQuantity()); rankInfo.setIsRanked(true); - } else { - // 用户不在榜单中,显示为0 - rankInfo.setRank(0); - rankInfo.setQuantity("0"); - rankInfo.setIsRanked(false); + return rankInfo; } + // 用户不在榜单中,单独查询其记录和排名 Optional userRecord = rankingActivityGateway.getUserRecord( cmd.getReqSysOrigin().getOrigin(), cmd.getReqUserId(), @@ -180,64 +185,30 @@ public class RankingListQryExe { cmd.getCycleKey() ); - userRecord.ifPresent(rankingActivityRecord -> rankInfo.setQuantity(NumUtils.formatLong(rankingActivityRecord.getQuantity()))); + if (userRecord.isEmpty()) { + rankInfo.setRank(0); + rankInfo.setQuantity("0"); + rankInfo.setIsRanked(false); + return rankInfo; + } + RankingActivityRecord record = userRecord.get(); + Integer rank = rankingActivityGateway.calculateUserRank( + cmd.getReqSysOrigin().getOrigin(), + RankingActivityType.getByCode(cmd.getActivityType()), + cycleType, + cmd.getCycleKey(), + null, + record.getQuantity(), + regionId + ); + rankInfo.setRank(rank); + rankInfo.setQuantity(NumUtils.formatLong(record.getQuantity())); + rankInfo.setIsRanked(rank <= cmd.getTopN()); return rankInfo; } - private Set getUserIds(List weekStarGiftCounts) { - - return weekStarGiftCounts.stream().map(RankingActivityRecord::getUserId) - .collect(Collectors.toSet()); - } - - /** - * 查询当前用户排名 - */ - private UserRankInfoCO queryCurrentUserRank( - RankingListQueryCmd cmd, - RankingActivityType activityType, - RankingCycleType cycleType) { - - Optional userRecord = rankingActivityGateway.getUserRecord( - cmd.getReqSysOrigin().getOrigin(), - cmd.getReqUserId(), - activityType, - cmd.getCycleKey() - ); - - if (userRecord.isEmpty()) { - // 用户未参与 - UserRankInfoCO rankInfo = new UserRankInfoCO(); - rankInfo.setUserId(cmd.getReqUserId()); - rankInfo.setRank(0); - rankInfo.setQuantity("0"); - rankInfo.setIsRanked(false); - return rankInfo; - } - - RankingActivityRecord record = userRecord.get(); - - // 计算排名 - Integer rank = rankingActivityGateway.calculateUserRank( - cmd.getReqSysOrigin().getOrigin(), - activityType, - cycleType, - cmd.getCycleKey(), - null, - record.getQuantity() - ); - - UserRankInfoCO rankInfo = new UserRankInfoCO(); - rankInfo.setUserId(record.getUserId()); - rankInfo.setRank(rank); - rankInfo.setQuantity(NumUtils.formatLong(record.getQuantity())); - rankInfo.setIsRanked(rank <= cmd.getTopN()); - - return rankInfo; - } - /** * 格式化周期显示文本 */ diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/activity/RankingActivityRecord.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/activity/RankingActivityRecord.java index 77f97be8..f204712f 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/activity/RankingActivityRecord.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/entity/activity/RankingActivityRecord.java @@ -125,6 +125,11 @@ public class RankingActivityRecord implements Serializable { @Transient Integer rank; + /** + * 区域ID + */ + String regionId; + /** * 扩展数据(JSON 格式) * diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/RankingActivityRecordRepository.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/RankingActivityRecordRepository.java index 663ce8dc..a6578e4e 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/RankingActivityRecordRepository.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/mongo/service/activity/RankingActivityRecordRepository.java @@ -109,6 +109,47 @@ public interface RankingActivityRecordRepository extends MongoRepository findBySysOriginAndActivityTypeAndCycleTypeAndCycleKeyAndRegionIdAndDeletedOrderByQuantityDescCreateTimeAsc( + String sysOrigin, + RankingActivityType activityType, + RankingCycleType cycleType, + String cycleKey, + String regionId, + Integer deleted, + Pageable pageable + ); + + /** + * 查询指定活动和周期的排行榜列表(按区域 + 性别) + */ + List findBySysOriginAndActivityTypeAndCycleTypeAndCycleKeyAndUserSexAndRegionIdAndDeletedOrderByQuantityDescCreateTimeAsc( + String sysOrigin, + RankingActivityType activityType, + RankingCycleType cycleType, + String cycleKey, + Integer userSex, + String regionId, + Integer deleted, + Pageable pageable + ); + + /** + * 统计指定活动和周期中,数量大于指定值的记录数(按区域) + */ + @Query(value = "{'sysOrigin': ?0, 'activityType': ?1, 'cycleType': ?2, 'cycleKey': ?3, 'deleted': ?4, 'regionId': ?5, 'quantity': {'$gt': ?6}}", count = true) + Long countByQuantityGreaterThanWithRegion( + String sysOrigin, + RankingActivityType activityType, + RankingCycleType cycleType, + String cycleKey, + Integer deleted, + String regionId, + Long quantity + ); + /** * 删除过期数据 */ diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/RankingActivityGateway.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/RankingActivityGateway.java index 7ab0dfcd..e002618f 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/RankingActivityGateway.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/RankingActivityGateway.java @@ -46,6 +46,7 @@ public interface RankingActivityGateway { * @param cycleKey 周期标识 * @param userSex 用户性别(null 表示不限) * @param topN 查询数量 + * @param regionId 区域ID(null 表示不限) * @return 排行榜列表 */ List getRankingList( @@ -54,7 +55,8 @@ public interface RankingActivityGateway { RankingCycleType cycleType, String cycleKey, Integer userSex, - Integer topN + Integer topN, + String regionId ); /** @@ -66,6 +68,7 @@ public interface RankingActivityGateway { * @param cycleKey 周期标识 * @param userSex 用户性别(null 表示不限) * @param quantity 用户数值 + * @param regionId 区域ID(null 表示不限) * @return 排名(1表示第一名) */ Integer calculateUserRank( @@ -74,7 +77,8 @@ public interface RankingActivityGateway { RankingCycleType cycleType, String cycleKey, Integer userSex, - Long quantity + Long quantity, + String regionId ); /** diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/RankingActivityGatewayImpl.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/RankingActivityGatewayImpl.java index 9b322ee7..bca23ee3 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/RankingActivityGatewayImpl.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/gateway/RankingActivityGatewayImpl.java @@ -86,20 +86,27 @@ public class RankingActivityGatewayImpl implements RankingActivityGateway { RankingCycleType cycleType, String cycleKey, Integer userSex, - Integer topN) { - + Integer topN, + String regionId) { + PageRequest pageRequest = PageRequest.of(0, topN); - + + if (regionId != null) { + if (userSex == null) { + return repository.findBySysOriginAndActivityTypeAndCycleTypeAndCycleKeyAndRegionIdAndDeletedOrderByQuantityDescCreateTimeAsc( + sysOrigin, activityType, cycleType, cycleKey, regionId, NOT_DELETED, pageRequest); + } else { + return repository.findBySysOriginAndActivityTypeAndCycleTypeAndCycleKeyAndUserSexAndRegionIdAndDeletedOrderByQuantityDescCreateTimeAsc( + sysOrigin, activityType, cycleType, cycleKey, userSex, regionId, NOT_DELETED, pageRequest); + } + } + if (userSex == null) { - // 不限性别 return repository.findBySysOriginAndActivityTypeAndCycleTypeAndCycleKeyAndDeletedOrderByQuantityDescCreateTimeAsc( - sysOrigin, activityType, cycleType, cycleKey, NOT_DELETED, pageRequest - ); + sysOrigin, activityType, cycleType, cycleKey, NOT_DELETED, pageRequest); } else { - // 按性别筛选 return repository.findBySysOriginAndActivityTypeAndCycleTypeAndCycleKeyAndUserSexAndDeletedOrderByQuantityDescCreateTimeAsc( - sysOrigin, activityType, cycleType, cycleKey, userSex, NOT_DELETED, pageRequest - ); + sysOrigin, activityType, cycleType, cycleKey, userSex, NOT_DELETED, pageRequest); } } @@ -110,23 +117,22 @@ public class RankingActivityGatewayImpl implements RankingActivityGateway { RankingCycleType cycleType, String cycleKey, Integer userSex, - Long quantity) { - + Long quantity, + String regionId) { + Long countGreater; - - if (userSex == null) { - // 不限性别 + + if (regionId != null) { + countGreater = repository.countByQuantityGreaterThanWithRegion( + sysOrigin, activityType, cycleType, cycleKey, NOT_DELETED, regionId, quantity); + } else if (userSex == null) { countGreater = repository.countByQuantityGreaterThanWithoutSex( - sysOrigin, activityType, cycleType, cycleKey, NOT_DELETED, quantity - ); + sysOrigin, activityType, cycleType, cycleKey, NOT_DELETED, quantity); } else { - // 按性别筛选 countGreater = repository.countByQuantityGreaterThan( - sysOrigin, activityType, cycleType, cycleKey, userSex, NOT_DELETED, quantity - ); + sysOrigin, activityType, cycleType, cycleKey, userSex, NOT_DELETED, quantity); } - - // 排名 = 比我多的人数 + 1 + return Math.toIntExact((countGreater == null ? 0 : countGreater) + 1); }