diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/SeasonCpTop1QueryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/SeasonCpTop1QueryExe.java index 7b66787c..167acb57 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/SeasonCpTop1QueryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/SeasonCpTop1QueryExe.java @@ -52,6 +52,7 @@ public class SeasonCpTop1QueryExe { List results = weekCpValueCounts.stream().map(weekCpValueCount -> { WeekCpUserIdDTO userIdPair = UserCpUtils.parseUserIdPair(weekCpValueCount.getId()); return new ActivityCpUserRankingCO() + .setRank(1) .setUserId(userIdPair.getUserIdOne()) .setCpUserId(userIdPair.getUserIdTwo()) .setTotalNumber(weekCpValueCount.getQuantity()) diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/WeekCpUserGiftQueryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/WeekCpUserGiftQueryExe.java index 17b9cb84..2524b4d3 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/WeekCpUserGiftQueryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/WeekCpUserGiftQueryExe.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -31,6 +32,9 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class WeekCpUserGiftQueryExe { + private static final int TOP_SIZE = 50; + private static final int OUT_OF_RANK = 99; + private final UserProfileGateway userProfileGateway; private final CpRelationshipService cpRelationshipService; private final WeekCpValueCountService weekCpValueCountService; @@ -45,75 +49,122 @@ public class WeekCpUserGiftQueryExe { } private ActivityWeekCpGiftCO getWeekRanking(CpRankingQueryCmd cmd) { + List topList = getThisWeekUser(cmd); + ActivityCpUserRankingCO currentUser = getThisWeekCurrentUser(cmd, topList); + return new ActivityWeekCpGiftCO() - .setThisWeekUserTop(getThisWeekUser(cmd)) - .setThisUser(getThisWeekCurrentUser(cmd)); + .setThisWeekUserTop(topList) + .setThisUser(currentUser); } private ActivityWeekCpGiftCO getSeasonRanking(CpRankingQueryCmd cmd) { + List topList = getThisSeasonUser(cmd); + ActivityCpUserRankingCO currentUser = getThisSeasonCurrentUser(cmd, topList); + return new ActivityWeekCpGiftCO() - .setThisWeekUserTop(getThisSeasonUser(cmd)) - .setThisUser(getThisSeasonCurrentUser(cmd)); + .setThisWeekUserTop(topList) + .setThisUser(currentUser); } - private ActivityCpUserRankingCO getThisWeekCurrentUser(CpRankingQueryCmd cmd) { + private ActivityCpUserRankingCO getThisWeekCurrentUser(CpRankingQueryCmd cmd, + List topList) { List cpUserIdList = cpRelationshipService.getCpUserId(cmd.getReqUserId()); if (cpUserIdList.isEmpty()) { return new ActivityCpUserRankingCO(); } Long cpUserId = cpUserIdList.get(0); + + // 先在Top榜单中查找 + ActivityCpUserRankingCO userInTop = findUserInTopList(cmd.getReqUserId(), cpUserId, topList); + if (Objects.nonNull(userInTop)) { + return userInTop; + } + + // 不在Top榜单,单独查询并设置排名为99 WeekCpValueCount thisUser = weekCpValueCountService.getUserThisWeekCount( cmd.getReqSysOrigin().getOrigin(), cmd.getReqUserId(), cpUserId); if (Objects.isNull(thisUser)) { return new ActivityCpUserRankingCO(); } - List users = assemble(Lists.newArrayList(thisUser)); + + List users = assemble(Lists.newArrayList(thisUser), OUT_OF_RANK); if (CollectionUtils.isEmpty(users)) { return new ActivityCpUserRankingCO(); } return users.get(0); } - private ActivityCpUserRankingCO getThisSeasonCurrentUser(CpRankingQueryCmd cmd) { + private ActivityCpUserRankingCO getThisSeasonCurrentUser(CpRankingQueryCmd cmd, + List topList) { List cpUserIdList = cpRelationshipService.getCpUserId(cmd.getReqUserId()); if (cpUserIdList.isEmpty()) { return new ActivityCpUserRankingCO(); } Long cpUserId = cpUserIdList.get(0); + + // 先在Top榜单中查找 + ActivityCpUserRankingCO userInTop = findUserInTopList(cmd.getReqUserId(), cpUserId, topList); + if (Objects.nonNull(userInTop)) { + return userInTop; + } + + // 不在Top榜单,单独查询并设置排名为99 WeekCpValueCount thisSeason = weekCpValueCountService.getUserThisSeasonCount( cmd.getReqSysOrigin().getOrigin(), cmd.getReqUserId(), cpUserId); if (Objects.isNull(thisSeason)) { return new ActivityCpUserRankingCO(); } - List users = assemble(Lists.newArrayList(thisSeason)); + + List users = assemble(Lists.newArrayList(thisSeason), OUT_OF_RANK); if (CollectionUtils.isEmpty(users)) { return new ActivityCpUserRankingCO(); } return users.get(0); } + private ActivityCpUserRankingCO findUserInTopList(Long userId, Long cpUserId, + List topList) { + if (CollectionUtils.isEmpty(topList)) { + return null; + } + + return topList.stream() + .filter(ranking -> + (ranking.getUserId().equals(userId) && ranking.getCpUserId().equals(cpUserId)) || + (ranking.getUserId().equals(cpUserId) && ranking.getCpUserId().equals(userId)) + ) + .findFirst() + .orElse(null); + } + private List getThisWeekUser(CpRankingQueryCmd cmd) { - return assemble(weekCpValueCountService.listThisWeekTop(cmd.getReqSysOrigin().getOrigin(), 20) - ); + List topList = weekCpValueCountService.listThisWeekTop( + cmd.getReqSysOrigin().getOrigin(), TOP_SIZE); + return assemble(topList, 1); } private List getThisSeasonUser(CpRankingQueryCmd cmd) { - return assemble(weekCpValueCountService.listThisSeasonTop(cmd.getReqSysOrigin().getOrigin(), 20) - ); + List topList = weekCpValueCountService.listThisSeasonTop( + cmd.getReqSysOrigin().getOrigin(), TOP_SIZE); + return assemble(topList, 1); } - private List assemble(List weekCpValueCounts) { + private List assemble(List weekCpValueCounts, + int startRank) { if (CollectionUtils.isEmpty(weekCpValueCounts)) { return Lists.newArrayList(); } + AtomicInteger rankCounter = new AtomicInteger(startRank); + List results = weekCpValueCounts.stream().map(weekCpValueCount -> { WeekCpUserIdDTO userIdPair = UserCpUtils.parseUserIdPair(weekCpValueCount.getId()); return new ActivityCpUserRankingCO() + .setRank(rankCounter.getAndIncrement()) .setUserId(userIdPair.getUserIdOne()) .setCpUserId(userIdPair.getUserIdTwo()) .setTotalNumber(weekCpValueCount.getQuantity()) @@ -122,8 +173,7 @@ public class WeekCpUserGiftQueryExe { ).toList(); Map userProfileMap = userProfileAppConvertor.toMapUserProfileDTO( - userProfileGateway.mapByUserIds( - getAllUserIds(results)) + userProfileGateway.mapByUserIds(getAllUserIds(results)) ); return results.stream().map(ranking -> { diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/activity/ActivityCpUserRankingCO.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/activity/ActivityCpUserRankingCO.java index defcc7b5..680cdda6 100644 --- a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/activity/ActivityCpUserRankingCO.java +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/activity/ActivityCpUserRankingCO.java @@ -24,6 +24,11 @@ public class ActivityCpUserRankingCO implements Serializable { private static final long serialVersionUID = 1L; + /** + * 排名. + */ + private Integer rank; + /** * ID. */