新增家族成员总榜top100接口
This commit is contained in:
parent
085f9aeba9
commit
9c80625799
@ -127,13 +127,21 @@ public class FamilyRestController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 家族排行榜.
|
* 家族成员Top10周排行榜
|
||||||
*/
|
*/
|
||||||
@GetMapping("/leaderboard")
|
@GetMapping("/member-top10")
|
||||||
public FamilyLeaderboardCO getLeaderboard(AppExtCommand cmd) {
|
public FamilyLeaderboardCO getMemberTop10(FamilyBaseInfoQueryCmd cmd) {
|
||||||
return familyService.getLeaderboard(cmd);
|
return familyService.getLeaderboard(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 家族成员Top100总排行榜
|
||||||
|
*/
|
||||||
|
@GetMapping("/member-top100")
|
||||||
|
public FamilyLeaderboardCO getMemberTop100(FamilyBaseInfoQueryCmd cmd) {
|
||||||
|
return familyService.getMemberTop100(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 家族等级配置
|
* 家族等级配置
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import com.red.circle.common.business.dto.cmd.AppExtCommand;
|
|||||||
import com.red.circle.live.inner.endpoint.LiveMicClient;
|
import com.red.circle.live.inner.endpoint.LiveMicClient;
|
||||||
import com.red.circle.other.app.dto.clientobject.family.FamilyLeaderboardCO;
|
import com.red.circle.other.app.dto.clientobject.family.FamilyLeaderboardCO;
|
||||||
import com.red.circle.other.app.dto.clientobject.family.FamilyMemberWeekRankCO;
|
import com.red.circle.other.app.dto.clientobject.family.FamilyMemberWeekRankCO;
|
||||||
|
import com.red.circle.other.app.dto.cmd.family.FamilyBaseInfoQueryCmd;
|
||||||
import com.red.circle.other.domain.gateway.user.UserProfileGateway;
|
import com.red.circle.other.domain.gateway.user.UserProfileGateway;
|
||||||
import com.red.circle.other.domain.model.user.UserProfile;
|
import com.red.circle.other.domain.model.user.UserProfile;
|
||||||
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamMember;
|
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamMember;
|
||||||
@ -39,18 +40,19 @@ public class FamilyLeaderboardExe {
|
|||||||
private final FamilyMemberInfoService familyMemberInfoService;
|
private final FamilyMemberInfoService familyMemberInfoService;
|
||||||
private final FamilyMemberWeekExpService familyMemberWeekExpService;
|
private final FamilyMemberWeekExpService familyMemberWeekExpService;
|
||||||
|
|
||||||
public FamilyLeaderboardCO execute(AppExtCommand cmd) {
|
public FamilyLeaderboardCO execute(FamilyBaseInfoQueryCmd cmd) {
|
||||||
FamilyMemberInfo member = familyMemberInfoService.getFamilyMemberByUserId(cmd.getReqUserId());
|
Map<Long, FamilyMemberInfo> map = familyMemberInfoService.mapUserIdBaseInfo(cmd.getFamilyId(), Set.of(cmd.getReqUserId()));
|
||||||
|
FamilyMemberInfo member = map.get(cmd.getReqUserId());
|
||||||
if (Objects.isNull(member)) {
|
if (Objects.isNull(member)) {
|
||||||
return new FamilyLeaderboardCO();
|
return new FamilyLeaderboardCO();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<FamilyMemberWeekExp> top200Exp = getTop200WeekExp(member.getFamilyId());
|
List<FamilyMemberWeekExp> top100Exp = getTop100WeekExp(member.getFamilyId());
|
||||||
if (CollectionUtils.isEmpty(top200Exp)) {
|
if (CollectionUtils.isEmpty(top100Exp)) {
|
||||||
return new FamilyLeaderboardCO();
|
return new FamilyLeaderboardCO();
|
||||||
}
|
}
|
||||||
|
|
||||||
Set<Long> userIds = top200Exp.stream()
|
Set<Long> userIds = top100Exp.stream()
|
||||||
.map(FamilyMemberWeekExp::getFamilyMemberId)
|
.map(FamilyMemberWeekExp::getFamilyMemberId)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
@ -60,19 +62,19 @@ public class FamilyLeaderboardExe {
|
|||||||
List<FamilyMemberWeekRankCO> hostRank = new ArrayList<>();
|
List<FamilyMemberWeekRankCO> hostRank = new ArrayList<>();
|
||||||
List<FamilyMemberWeekRankCO> supporterRank = new ArrayList<>();
|
List<FamilyMemberWeekRankCO> supporterRank = new ArrayList<>();
|
||||||
|
|
||||||
for (FamilyMemberWeekExp exp : top200Exp) {
|
for (FamilyMemberWeekExp exp : top100Exp) {
|
||||||
Long userId = exp.getFamilyMemberId();
|
Long userId = exp.getFamilyMemberId();
|
||||||
boolean isHost = hostUserIds.contains(userId);
|
boolean isHost = hostUserIds.contains(userId);
|
||||||
|
|
||||||
FamilyMemberWeekRankCO rankCO = buildRankCO(exp, userProfileMap.get(userId), isHost);
|
FamilyMemberWeekRankCO rankCO = buildRankCO(exp, userProfileMap.get(userId), isHost);
|
||||||
|
|
||||||
if (isHost && hostRank.size() < 100) {
|
if (isHost && hostRank.size() < 10) {
|
||||||
hostRank.add(rankCO);
|
hostRank.add(rankCO);
|
||||||
} else if (!isHost && supporterRank.size() < 100) {
|
} else if (!isHost && supporterRank.size() < 10) {
|
||||||
supporterRank.add(rankCO);
|
supporterRank.add(rankCO);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hostRank.size() >= 100 && supporterRank.size() >= 100) {
|
if (hostRank.size() >= 10 && supporterRank.size() >= 10) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -82,11 +84,11 @@ public class FamilyLeaderboardExe {
|
|||||||
.setSupporterWeekRank(supporterRank);
|
.setSupporterWeekRank(supporterRank);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<FamilyMemberWeekExp> getTop200WeekExp(Long familyId) {
|
private List<FamilyMemberWeekExp> getTop100WeekExp(Long familyId) {
|
||||||
return familyMemberWeekExpService.query()
|
return familyMemberWeekExpService.query()
|
||||||
.eq(FamilyMemberWeekExp::getFamilyId, familyId)
|
.eq(FamilyMemberWeekExp::getFamilyId, familyId)
|
||||||
.orderByDesc(FamilyMemberWeekExp::getExp)
|
.orderByDesc(FamilyMemberWeekExp::getExp)
|
||||||
.last("LIMIT 200")
|
.last("LIMIT 100")
|
||||||
.list();
|
.list();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,110 @@
|
|||||||
|
package com.red.circle.other.app.command.family;
|
||||||
|
|
||||||
|
import com.red.circle.other.app.dto.clientobject.family.FamilyLeaderboardCO;
|
||||||
|
import com.red.circle.other.app.dto.clientobject.family.FamilyMemberWeekRankCO;
|
||||||
|
import com.red.circle.other.app.dto.cmd.family.FamilyBaseInfoQueryCmd;
|
||||||
|
import com.red.circle.other.domain.gateway.user.UserProfileGateway;
|
||||||
|
import com.red.circle.other.domain.model.user.UserProfile;
|
||||||
|
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamMember;
|
||||||
|
import com.red.circle.other.infra.database.mongo.service.team.team.TeamMemberService;
|
||||||
|
import com.red.circle.other.infra.database.rds.entity.family.FamilyMemberInfo;
|
||||||
|
import com.red.circle.other.infra.database.rds.entity.family.FamilyMemberTotalExp;
|
||||||
|
import com.red.circle.other.infra.database.rds.service.family.FamilyMemberInfoService;
|
||||||
|
import com.red.circle.other.infra.database.rds.service.family.FamilyMemberTotalExpService;
|
||||||
|
import com.red.circle.other.inner.model.dto.user.UserProfileDTO;
|
||||||
|
import com.red.circle.tool.core.collection.CollectionUtils;
|
||||||
|
import com.red.circle.tool.core.num.NumUtils;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 家族成员Top100总排行榜
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class FamilyMemberTop100Exe {
|
||||||
|
|
||||||
|
private final TeamMemberService teamMemberService;
|
||||||
|
private final UserProfileGateway userProfileGateway;
|
||||||
|
private final FamilyMemberInfoService familyMemberInfoService;
|
||||||
|
private final FamilyMemberTotalExpService familyMemberTotalExpService;
|
||||||
|
|
||||||
|
public FamilyLeaderboardCO execute(FamilyBaseInfoQueryCmd cmd) {
|
||||||
|
Map<Long, FamilyMemberInfo> map = familyMemberInfoService.mapUserIdBaseInfo(cmd.getFamilyId(), Set.of(cmd.getReqUserId()));
|
||||||
|
FamilyMemberInfo member = map.get(cmd.getReqUserId());
|
||||||
|
if (Objects.isNull(member)) {
|
||||||
|
return new FamilyLeaderboardCO();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<FamilyMemberTotalExp> top200Exp = getTop200TotalExp(member.getFamilyId());
|
||||||
|
if (CollectionUtils.isEmpty(top200Exp)) {
|
||||||
|
return new FamilyLeaderboardCO();
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<Long> userIds = top200Exp.stream()
|
||||||
|
.map(FamilyMemberTotalExp::getFamilyMemberId)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
|
Set<Long> hostUserIds = getHostUserIds(userIds);
|
||||||
|
Map<Long, UserProfile> userProfileMap = userProfileGateway.mapByUserIds(userIds);
|
||||||
|
|
||||||
|
List<FamilyMemberWeekRankCO> hostRank = new ArrayList<>();
|
||||||
|
List<FamilyMemberWeekRankCO> supporterRank = new ArrayList<>();
|
||||||
|
|
||||||
|
for (FamilyMemberTotalExp exp : top200Exp) {
|
||||||
|
Long userId = exp.getFamilyMemberId();
|
||||||
|
boolean isHost = hostUserIds.contains(userId);
|
||||||
|
|
||||||
|
FamilyMemberWeekRankCO rankCO = buildRankCO(exp, userProfileMap.get(userId), isHost);
|
||||||
|
|
||||||
|
if (isHost && hostRank.size() < 100) {
|
||||||
|
hostRank.add(rankCO);
|
||||||
|
} else if (!isHost && supporterRank.size() < 100) {
|
||||||
|
supporterRank.add(rankCO);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hostRank.size() >= 100 && supporterRank.size() >= 100) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new FamilyLeaderboardCO()
|
||||||
|
.setHostWeekRank(hostRank)
|
||||||
|
.setSupporterWeekRank(supporterRank);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<FamilyMemberTotalExp> getTop200TotalExp(Long familyId) {
|
||||||
|
return familyMemberTotalExpService.query()
|
||||||
|
.eq(FamilyMemberTotalExp::getFamilyId, familyId)
|
||||||
|
.orderByDesc(FamilyMemberTotalExp::getExp)
|
||||||
|
.last("LIMIT 200")
|
||||||
|
.list();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<Long> getHostUserIds(Set<Long> userIds) {
|
||||||
|
if (CollectionUtils.isEmpty(userIds)) {
|
||||||
|
return Set.of();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Long> hostIds = teamMemberService.listMemberIds(userIds);
|
||||||
|
return CollectionUtils.isEmpty(hostIds) ? Set.of() : Set.copyOf(hostIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
private FamilyMemberWeekRankCO buildRankCO(FamilyMemberTotalExp exp,
|
||||||
|
UserProfile profile, boolean isHost) {
|
||||||
|
return new FamilyMemberWeekRankCO()
|
||||||
|
.setUserId(exp.getFamilyMemberId())
|
||||||
|
.setNickname(Objects.nonNull(profile) ? profile.getUserNickname() : "")
|
||||||
|
.setAvatar(Objects.nonNull(profile) ? profile.getUserAvatar() : "")
|
||||||
|
.setExp(NumUtils.formatLong(exp.getExp()))
|
||||||
|
.setIsHost(isHost);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -32,6 +32,7 @@ import com.red.circle.other.app.command.family.FamilyListExe;
|
|||||||
import com.red.circle.other.app.command.family.FamilyBoxContributeExe;
|
import com.red.circle.other.app.command.family.FamilyBoxContributeExe;
|
||||||
import com.red.circle.other.app.command.family.FamilyBoxClaimExe;
|
import com.red.circle.other.app.command.family.FamilyBoxClaimExe;
|
||||||
import com.red.circle.other.app.command.family.FamilyHomeListExe;
|
import com.red.circle.other.app.command.family.FamilyHomeListExe;
|
||||||
|
import com.red.circle.other.app.command.family.FamilyMemberTop100Exe;
|
||||||
import com.red.circle.other.app.dto.clientobject.family.*;
|
import com.red.circle.other.app.dto.clientobject.family.*;
|
||||||
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.dto.cmd.family.*;
|
import com.red.circle.other.app.dto.cmd.family.*;
|
||||||
@ -86,8 +87,9 @@ public class FamilyServiceImpl implements FamilyService {
|
|||||||
private final FamilyListExe familyListExe;
|
private final FamilyListExe familyListExe;
|
||||||
private final FamilyBoxContributeExe familyBoxContributeExe;
|
private final FamilyBoxContributeExe familyBoxContributeExe;
|
||||||
private final FamilyBoxClaimExe familyBoxClaimExe;
|
private final FamilyBoxClaimExe familyBoxClaimExe;
|
||||||
private final DistributedLockUtil distributedLockUtil;
|
|
||||||
private final FamilyHomeListExe familyHomeListExe;
|
private final FamilyHomeListExe familyHomeListExe;
|
||||||
|
private final FamilyMemberTop100Exe familyMemberTop100Exe;
|
||||||
|
private final DistributedLockUtil distributedLockUtil;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long create(FamilyCreateCmd cmd) {
|
public Long create(FamilyCreateCmd cmd) {
|
||||||
@ -128,10 +130,15 @@ public class FamilyServiceImpl implements FamilyService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FamilyLeaderboardCO getLeaderboard(AppExtCommand cmd) {
|
public FamilyLeaderboardCO getLeaderboard(FamilyBaseInfoQueryCmd cmd) {
|
||||||
return familyLeaderboardExe.execute(cmd);
|
return familyLeaderboardExe.execute(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FamilyLeaderboardCO getMemberTop100(FamilyBaseInfoQueryCmd cmd) {
|
||||||
|
return familyMemberTop100Exe.execute(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<FamilyLevelCO> listLevelConfig(AppExtCommand cmd) {
|
public List<FamilyLevelCO> listLevelConfig(AppExtCommand cmd) {
|
||||||
return familyLevelListExe.execute(cmd);
|
return familyLevelListExe.execute(cmd);
|
||||||
|
|||||||
@ -52,9 +52,14 @@ public interface FamilyService {
|
|||||||
void grantUserRole(FamilyGrantUserRoleCmd cmd);
|
void grantUserRole(FamilyGrantUserRoleCmd cmd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 家族排行榜 周榜、月榜、自己家族信息.
|
* 家族成员Top10周排行榜.
|
||||||
*/
|
*/
|
||||||
FamilyLeaderboardCO getLeaderboard(AppExtCommand cmd);
|
FamilyLeaderboardCO getLeaderboard(FamilyBaseInfoQueryCmd cmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 家族成员Top100总排行榜.
|
||||||
|
*/
|
||||||
|
FamilyLeaderboardCO getMemberTop100(FamilyBaseInfoQueryCmd cmd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 全部等级配置集合.
|
* 全部等级配置集合.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user