榜单完善 增加排名和分页

This commit is contained in:
tianfeng 2025-09-12 11:54:16 +08:00
parent 4e27be35c2
commit 3f14fa244e
9 changed files with 127 additions and 11 deletions

View File

@ -1,6 +1,7 @@
package com.red.circle.other.adapter.app.activity.room; package com.red.circle.other.adapter.app.activity.room;
import com.red.circle.common.business.dto.cmd.AppExtCommand; import com.red.circle.common.business.dto.cmd.AppExtCommand;
import com.red.circle.framework.dto.PageResult;
import com.red.circle.framework.web.controller.BaseController; import com.red.circle.framework.web.controller.BaseController;
import com.red.circle.other.app.dto.clientobject.activity.UserCharmWealthContributeCO; import com.red.circle.other.app.dto.clientobject.activity.UserCharmWealthContributeCO;
import com.red.circle.other.app.dto.clientobject.activity.UserRankCO; import com.red.circle.other.app.dto.clientobject.activity.UserRankCO;
@ -8,6 +9,7 @@ import com.red.circle.other.app.dto.cmd.activity.WeekKingQueenRankingQueryCmd;
import com.red.circle.other.app.service.activity.WeekKingQueenService; import com.red.circle.other.app.service.activity.WeekKingQueenService;
import java.util.List; import java.util.List;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -37,7 +39,7 @@ public class WeekKingQueenController extends BaseController {
* @eo.request-type formdata * @eo.request-type formdata
*/ */
@GetMapping("/ranking") @GetMapping("/ranking")
public List<UserRankCO> listRanking(@Validated WeekKingQueenRankingQueryCmd cmd) { public PageResult<UserRankCO> listRanking(@Validated WeekKingQueenRankingQueryCmd cmd) {
return weekKingQueenService.listRanking(cmd); return weekKingQueenService.listRanking(cmd);
} }

View File

@ -1,6 +1,7 @@
package com.red.circle.other.app.command.activity.query; package com.red.circle.other.app.command.activity.query;
import com.red.circle.common.business.enums.WeekLeaderboardEnum; import com.red.circle.common.business.enums.WeekLeaderboardEnum;
import com.red.circle.framework.dto.PageResult;
import com.red.circle.other.app.convertor.user.UserProfileAppConvertor; import com.red.circle.other.app.convertor.user.UserProfileAppConvertor;
import com.red.circle.other.app.dto.clientobject.activity.UserRankCO; import com.red.circle.other.app.dto.clientobject.activity.UserRankCO;
import com.red.circle.other.app.dto.cmd.activity.WeekKingQueenRankingQueryCmd; import com.red.circle.other.app.dto.cmd.activity.WeekKingQueenRankingQueryCmd;
@ -17,6 +18,10 @@ import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
@ -32,27 +37,44 @@ public class WeekKingQueenRankingQueryExe {
private final UserProfileAppConvertor userProfileAppConvertor; private final UserProfileAppConvertor userProfileAppConvertor;
private final WeekKingQueenCountService weekKingQueenCountService; private final WeekKingQueenCountService weekKingQueenCountService;
public List<UserRankCO> execute(WeekKingQueenRankingQueryCmd cmd) { public PageResult<UserRankCO> execute(WeekKingQueenRankingQueryCmd cmd) {
List<WeekKingQueenCount> weekKingQueens = listLeaderboard(cmd); Page<WeekKingQueenCount> kingQueenCountPage = pageWeekTop(cmd.getReqSysOrigin().getOrigin(),
KingQueenType.valueOf(cmd.getKingQueenType()),
Objects.equals(cmd.getType(), WeekLeaderboardEnum.THIS_WEEK) ? 0 : 1,
PageRequest.of(cmd.getCurrent().intValue() - 1, cmd.getSize().intValue()));
List<WeekKingQueenCount> weekKingQueens = kingQueenCountPage.getContent();
if (CollectionUtils.isEmpty(weekKingQueens)) { if (CollectionUtils.isEmpty(weekKingQueens)) {
return CollectionUtils.newArrayList(); return null;
} }
Map<Long, UserProfileDTO> userProfileMap = userProfileAppConvertor.toMapUserProfileDTO( Map<Long, UserProfileDTO> userProfileMap = userProfileAppConvertor.toMapUserProfileDTO(
userProfileGateway userProfileGateway
.mapByUserIds(getUserIds(weekKingQueens))); .mapByUserIds(getUserIds(weekKingQueens)));
return weekKingQueens.stream() List<UserRankCO> userRankList = weekKingQueens.stream()
.map(item -> { .map(item -> {
UserProfileDTO userProfile = userProfileMap.get(item.getUserId()); UserProfileDTO userProfile = userProfileMap.get(item.getUserId());
return new UserRankCO() return new UserRankCO()
.setUserId(userProfile.getId()) .setUserId(userProfile.getId())
.setAccount(userProfile.getAccount())
.setUserAvatar(userProfile.getUserAvatar()) .setUserAvatar(userProfile.getUserAvatar())
.setUserNickname(userProfile.getUserNickname()) .setUserNickname(userProfile.getUserNickname())
.setQuantity(NumUtils.formatLong(item.getQuantity())) .setQuantity(NumUtils.formatLong(item.getQuantity()))
.setRank(item.getRank())
.setCountryName(userProfile.getCountryName()) .setCountryName(userProfile.getCountryName())
.setCountryCode(userProfile.getCountryCode()); .setCountryCode(userProfile.getCountryCode());
}).toList(); }).toList();
PageResult<UserRankCO> result = new PageResult<>();
result.setTotal(kingQueenCountPage.getTotalElements());
result.setCurrent(kingQueenCountPage.getNumber());
result.setSize(kingQueenCountPage.getSize());
result.setRecords(userRankList);
return result;
} }
@ -74,6 +96,11 @@ public class WeekKingQueenRankingQueryExe {
return CollectionUtils.newArrayList(); return CollectionUtils.newArrayList();
} }
private Page<WeekKingQueenCount> pageWeekTop(String sysOrigin, KingQueenType type,
Integer weekType, Pageable pageable) {
return weekKingQueenCountService.pageWeekTop(sysOrigin, type, weekType, pageable);
}
private Set<Long> getUserIds(List<WeekKingQueenCount> weekStarGiftCounts) { private Set<Long> getUserIds(List<WeekKingQueenCount> weekStarGiftCounts) {
return weekStarGiftCounts.stream().map(WeekKingQueenCount::getUserId) return weekStarGiftCounts.stream().map(WeekKingQueenCount::getUserId)

View File

@ -1,6 +1,7 @@
package com.red.circle.other.app.service.activity; package com.red.circle.other.app.service.activity;
import com.red.circle.common.business.dto.cmd.AppExtCommand; import com.red.circle.common.business.dto.cmd.AppExtCommand;
import com.red.circle.framework.dto.PageResult;
import com.red.circle.other.app.command.activity.query.ActivityRewardQueryExe; import com.red.circle.other.app.command.activity.query.ActivityRewardQueryExe;
import com.red.circle.other.app.command.activity.query.WeekKingQueenCountDownQueryExe; import com.red.circle.other.app.command.activity.query.WeekKingQueenCountDownQueryExe;
import com.red.circle.other.app.command.activity.query.WeekKingQueenRankingQueryExe; import com.red.circle.other.app.command.activity.query.WeekKingQueenRankingQueryExe;
@ -10,6 +11,7 @@ import com.red.circle.other.app.dto.clientobject.activity.UserRankCO;
import com.red.circle.other.app.dto.cmd.activity.WeekKingQueenRankingQueryCmd; import com.red.circle.other.app.dto.cmd.activity.WeekKingQueenRankingQueryCmd;
import java.util.List; import java.util.List;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
@ -27,7 +29,7 @@ public class WeekKingQueenServiceImpl implements WeekKingQueenService {
private final WeekKingQueenUserContributeQueryExe weekKingQueenUserContributeQueryExe; private final WeekKingQueenUserContributeQueryExe weekKingQueenUserContributeQueryExe;
@Override @Override
public List<UserRankCO> listRanking(WeekKingQueenRankingQueryCmd cmd) { public PageResult<UserRankCO> listRanking(WeekKingQueenRankingQueryCmd cmd) {
return weekKingQueenRankingQueryExe.execute(cmd); return weekKingQueenRankingQueryExe.execute(cmd);
} }

View File

@ -25,6 +25,11 @@ public class UserRankCO extends ClientObject {
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
private Long userId; private Long userId;
/**
* 账号
*/
private String account;
/** /**
* 用户头像. * 用户头像.
*/ */
@ -40,6 +45,11 @@ public class UserRankCO extends ClientObject {
*/ */
private String quantity; private String quantity;
/**
* 排名
*/
Integer rank;
/** /**
* 国家名称. * 国家名称.
*/ */

View File

@ -1,5 +1,6 @@
package com.red.circle.other.app.dto.cmd.activity; package com.red.circle.other.app.dto.cmd.activity;
import com.red.circle.common.business.dto.PageQueryCmd;
import com.red.circle.common.business.dto.cmd.AppExtCommand; import com.red.circle.common.business.dto.cmd.AppExtCommand;
import com.red.circle.common.business.enums.WeekLeaderboardEnum; import com.red.circle.common.business.enums.WeekLeaderboardEnum;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@ -13,7 +14,7 @@ import lombok.EqualsAndHashCode;
*/ */
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class WeekKingQueenRankingQueryCmd extends AppExtCommand { public class WeekKingQueenRankingQueryCmd extends PageQueryCmd {
/** /**
* 类型. * 类型.
@ -30,6 +31,6 @@ public class WeekKingQueenRankingQueryCmd extends AppExtCommand {
/** /**
* 获取数量. * 获取数量.
*/ */
@NotNull(message = "topSize {not.null}") // @NotNull(message = "topSize {not.null}")
private Integer topSize; private Integer topSize;
} }

View File

@ -1,6 +1,7 @@
package com.red.circle.other.app.service.activity; package com.red.circle.other.app.service.activity;
import com.red.circle.common.business.dto.cmd.AppExtCommand; import com.red.circle.common.business.dto.cmd.AppExtCommand;
import com.red.circle.framework.dto.PageResult;
import com.red.circle.other.app.dto.clientobject.activity.UserCharmWealthContributeCO; import com.red.circle.other.app.dto.clientobject.activity.UserCharmWealthContributeCO;
import com.red.circle.other.app.dto.clientobject.activity.UserRankCO; import com.red.circle.other.app.dto.clientobject.activity.UserRankCO;
import com.red.circle.other.app.dto.cmd.activity.WeekKingQueenRankingQueryCmd; import com.red.circle.other.app.dto.cmd.activity.WeekKingQueenRankingQueryCmd;
@ -13,7 +14,7 @@ import java.util.List;
*/ */
public interface WeekKingQueenService { public interface WeekKingQueenService {
List<UserRankCO> listRanking(WeekKingQueenRankingQueryCmd cmd); PageResult<UserRankCO> listRanking(WeekKingQueenRankingQueryCmd cmd);
String countDown(); String countDown();

View File

@ -10,6 +10,7 @@ import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
/** /**
@ -43,6 +44,12 @@ public class WeekKingQueenCount implements Serializable {
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
Long userId; Long userId;
/**
* 排名
*/
@Transient
Integer rank;
/** /**
* 类型. * 类型.
*/ */

View File

@ -2,6 +2,9 @@ package com.red.circle.other.infra.database.mongo.service.activity;
import com.red.circle.other.infra.database.mongo.entity.activity.WeekKingQueenCount; import com.red.circle.other.infra.database.mongo.entity.activity.WeekKingQueenCount;
import com.red.circle.other.inner.enums.activity.KingQueenType; import com.red.circle.other.inner.enums.activity.KingQueenType;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.List; import java.util.List;
/** /**
@ -31,6 +34,12 @@ public interface WeekKingQueenCountService {
*/ */
List<WeekKingQueenCount> listLastWeekTop(String sysOrigin, KingQueenType type, Integer size); List<WeekKingQueenCount> listLastWeekTop(String sysOrigin, KingQueenType type, Integer size);
/**
* 分页本周和上周的top
*/
Page<WeekKingQueenCount> pageWeekTop(String sysOrigin, KingQueenType type,
Integer weekType, Pageable pageable);
/** /**
* 矫正数据. * 矫正数据.
*/ */

View File

@ -13,6 +13,9 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.DuplicateKeyException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
@ -56,23 +59,77 @@ public class WeekKingQueenCountServiceImpl implements WeekKingQueenCountService
@Override @Override
public List<WeekKingQueenCount> listThisWeekTop(String sysOrigin, KingQueenType type, public List<WeekKingQueenCount> listThisWeekTop(String sysOrigin, KingQueenType type,
Integer size) { Integer size) {
return mongoTemplate List<WeekKingQueenCount> results = mongoTemplate
.find(Query.query(Criteria.where("sysOrigin").is(sysOrigin) .find(Query.query(Criteria.where("sysOrigin").is(sysOrigin)
.and("group").is(getThisWeekDate()) .and("group").is(getThisWeekDate())
.and("type").is(type)) .and("type").is(type))
.with(Sort.by(Sort.Order.desc("quantity"))) .with(Sort.by(Sort.Order.desc("quantity")))
.limit(size), WeekKingQueenCount.class); .limit(size), WeekKingQueenCount.class);
// 给结果赋值 rank
for (int i = 0; i < results.size(); i++) {
results.get(i).setRank(i + 1); // rank 1 开始
}
return results;
} }
@Override @Override
public List<WeekKingQueenCount> listLastWeekTop(String sysOrigin, KingQueenType type, public List<WeekKingQueenCount> listLastWeekTop(String sysOrigin, KingQueenType type,
Integer size) { Integer size) {
return mongoTemplate List<WeekKingQueenCount> results = mongoTemplate
.find(Query.query(Criteria.where("sysOrigin").is(sysOrigin) .find(Query.query(Criteria.where("sysOrigin").is(sysOrigin)
.and("group").is(getLastWeekDate()) .and("group").is(getLastWeekDate())
.and("type").is(type)) .and("type").is(type))
.with(Sort.by(Sort.Order.desc("quantity"))) .with(Sort.by(Sort.Order.desc("quantity")))
.limit(size), WeekKingQueenCount.class); .limit(size), WeekKingQueenCount.class);
// 给结果赋值 rank
for (int i = 0; i < results.size(); i++) {
results.get(i).setRank(i + 1); // rank 1 开始
}
return results;
}
@Override
public Page<WeekKingQueenCount> pageWeekTop(String sysOrigin, KingQueenType type,
Integer weekType, Pageable pageable) {
// 根据weekType确定查询的周期
String weekGroup = getWeekDateByType(weekType);
// 构建查询条件
Query query = Query.query(Criteria.where("sysOrigin").is(sysOrigin)
.and("group").is(weekGroup)
.and("type").is(type))
.with(Sort.by(Sort.Order.desc("quantity")));
// 查询总数
long total = mongoTemplate.count(query, WeekKingQueenCount.class);
// 分页查询
query.with(pageable);
List<WeekKingQueenCount> results = mongoTemplate.find(query, WeekKingQueenCount.class);
// 计算rank考虑分页偏移量
int startRank = (int) (pageable.getOffset() + 1);
for (int i = 0; i < results.size(); i++) {
results.get(i).setRank(startRank + i);
}
return new PageImpl<>(results, pageable, total);
}
/**
* 根据周类型获取对应的日期组
* @param weekType 0-本周1-上周
* @return 周期标识
*/
private String getWeekDateByType(Integer weekType) {
if (weekType != null && weekType == 1) {
return getLastWeekDate();
}
return getThisWeekDate();
} }
@Override @Override