diff --git a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java index 0fba4ddb..0ca763d2 100644 --- a/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PortfolioServiceImpl.java @@ -421,9 +421,13 @@ public class PortfolioServiceImpl extends ServiceImpl page(QueryPortfolioPageDTO query) { AuthPrincipalVo userHolder = UserContext.getUserHolder(); QueryWrapper qw = new QueryWrapper<>(); + + // 查询用户的作品集 if (query.getGetMyPortfolio() == 1) { qw.lambda().eq(Portfolio::getAccountId, userHolder.getId()); } + + // 查询用户喜欢的作品集 if (query.getGetLikePortfolio() == 1) { List likedPortfolioIdList = redisUtil.getLikedPortfolios(userHolder.getId()); if (!CollectionUtils.isEmpty(likedPortfolioIdList)) { @@ -432,31 +436,54 @@ public class PortfolioServiceImpl extends ServiceImpl()); } } - List topThree = new ArrayList<>(); - if (query.getPage() == 1 && - (query.getGetMyPortfolio() != 1 || query.getGetLikePortfolio() != 1)) { + List topThree = new ArrayList<>(); + List excludeIds = new ArrayList<>(); // 存放需要排除的 ID 列表 + + // 获取前三点赞和前三浏览的作品集,并将其排除在分页查询之外 + if (query.getPage() == 1 && (query.getGetMyPortfolio() != 1 || query.getGetLikePortfolio() != 1)) { + // 获取前三点赞的作品集 ID List topThreeLike = getTopThreeLikeFromRedis(RedisUtil.PORTFOLIO_LIKE_KEY); - log.info("top three like 的作品集的id : {}", topThreeLike); - List topThreeView = getTopThreeViewFromRedis(RedisUtil.PORTFOLIO_VIEW_KEY); - log.info("top three view 的作品集的id : {}", topThreeView); - QueryWrapper queryLike = new QueryWrapper<>(); - queryLike.in("id", topThreeLike); - QueryWrapper queryView = new QueryWrapper<>(); - queryView.in("id", topThreeView); - List topThreeLikePortfolio = baseMapper.selectList(queryLike); - List topThreeViewPortfolio = baseMapper.selectList(queryView); - topThree.addAll(topThreeLikePortfolio); - topThree.addAll(topThreeViewPortfolio); + List topThreeView = getTopThreeViewFromRedis(RedisUtil.PORTFOLIO_VIEW_KEY, topThreeLike); + + // 获取前三点赞的作品集 + if (!CollectionUtils.isEmpty(topThreeLike)) { + QueryWrapper queryLike = new QueryWrapper<>(); + queryLike.in("id", topThreeLike); + List topThreeLikePortfolio = baseMapper.selectList(queryLike); + topThree.addAll(topThreeLikePortfolio); + excludeIds.addAll(topThreeLike); // 添加到排除 ID 列表 + } + + // 获取前三浏览的作品集 + if (!CollectionUtils.isEmpty(topThreeView)) { + QueryWrapper queryView = new QueryWrapper<>(); + queryView.in("id", topThreeView); + List topThreeViewPortfolio = baseMapper.selectList(queryView); + topThree.addAll(topThreeViewPortfolio); + excludeIds.addAll(topThreeView); // 添加到排除 ID 列表 + } } + // 在正常分页查询中排除前三点赞和前三浏览的作品集 + if (!CollectionUtils.isEmpty(excludeIds)) { + qw.lambda().notIn(Portfolio::getId, excludeIds); + } + + // 按更新时间排序 qw.lambda().orderByDesc(Portfolio::getUpdateDate); + + // 执行分页查询 IPage page = portfolioMapper.selectPage(new Page<>(query.getPage(), query.getSize()), qw); + + // 如果前三点赞和浏览不为空,将它们添加到分页查询的结果最前面 if (!topThree.isEmpty()) { List records = page.getRecords(); - records.addAll(0, topThree); + records.addAll(0, topThree); // 添加到查询结果的开头 page.setRecords(records); } + + // 将 Portfolio 转换为 PortfolioVO 并进行相关处理 IPage convert = page.convert((Function) portfolio -> { if (portfolio != null) { PortfolioVO vo = CopyUtil.copyObject(portfolio, PortfolioVO.class); @@ -473,9 +500,11 @@ public class PortfolioServiceImpl extends ServiceImpl getTopThreeViewFromRedis(String prefix) { + private List getTopThreeViewFromRedis(String prefix, List excludeIds) { // Step 1: Get all keys with the specific prefix Set keys = redisUtil.getKeysFromString(prefix + "*"); -// Step 2: Create a map to store portfolioId and its corresponding value + + // Step 2: Create a map to store portfolioId and its corresponding value Map portfolioViews = new HashMap<>(); if (keys != null) { for (String key : keys) { @@ -992,11 +1022,15 @@ public class PortfolioServiceImpl extends ServiceImpl top3PortfolioIds = portfolioViews.entrySet().stream() .sorted(Map.Entry.comparingByValue().reversed()) @@ -1004,7 +1038,7 @@ public class PortfolioServiceImpl extends ServiceImpl