From c8d8046bf454261937576ee77c400ab2e9ef8cc7 Mon Sep 17 00:00:00 2001 From: ziin Date: Wed, 28 Jan 2026 15:50:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai-companion):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=94=A8=E6=88=B7=E8=81=8A=E8=BF=87=E5=A4=A9?= =?UTF-8?q?=E7=9A=84AI=E8=A7=92=E8=89=B2=E5=88=97=E8=A1=A8=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AiCompanionController.java | 8 +++ .../service/KeyboardAiChatMessageService.java | 8 +++ .../service/KeyboardAiCompanionService.java | 8 +++ .../KeyboardAiChatMessageServiceImpl.java | 16 +++++ .../impl/KeyboardAiCompanionServiceImpl.java | 63 +++++++++++++++++++ 5 files changed, 103 insertions(+) diff --git a/src/main/java/com/yolo/keyborad/controller/AiCompanionController.java b/src/main/java/com/yolo/keyborad/controller/AiCompanionController.java index e2e2cf2..7e344b7 100644 --- a/src/main/java/com/yolo/keyborad/controller/AiCompanionController.java +++ b/src/main/java/com/yolo/keyborad/controller/AiCompanionController.java @@ -62,4 +62,12 @@ public class AiCompanionController { List result = aiCompanionService.getLikedCompanions(userId); return ResultUtils.success(result); } + + @GetMapping("/chatted") + @Operation(summary = "获取当前用户聊过天的AI角色列表", description = "查询当前用户聊过天的所有AI角色,返回角色详细信息") + public BaseResponse> getChattedCompanions() { + Long userId = StpUtil.getLoginIdAsLong(); + List result = aiCompanionService.getChattedCompanions(userId); + return ResultUtils.success(result); + } } diff --git a/src/main/java/com/yolo/keyborad/service/KeyboardAiChatMessageService.java b/src/main/java/com/yolo/keyborad/service/KeyboardAiChatMessageService.java index fc9f443..0f818ae 100644 --- a/src/main/java/com/yolo/keyborad/service/KeyboardAiChatMessageService.java +++ b/src/main/java/com/yolo/keyborad/service/KeyboardAiChatMessageService.java @@ -33,4 +33,12 @@ public interface KeyboardAiChatMessageService extends IService getRecentMessages(Long userId, Long companionId, int limit); + + /** + * 获取用户聊过天的所有AI角色ID列表 + * + * @param userId 用户ID + * @return 聊过天的AI角色ID列表(按最近聊天时间倒序) + */ + List getChattedCompanionIds(Long userId); } diff --git a/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionService.java b/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionService.java index e7e48ce..bfeeb70 100644 --- a/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionService.java +++ b/src/main/java/com/yolo/keyborad/service/KeyboardAiCompanionService.java @@ -47,4 +47,12 @@ public interface KeyboardAiCompanionService extends IService getLikedCompanions(Long userId); + + /** + * 获取用户聊过天的AI角色列表 + * + * @param userId 用户ID + * @return 聊过天的AI角色列表 + */ + List getChattedCompanions(Long userId); } diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiChatMessageServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiChatMessageServiceImpl.java index 10ffe55..9e37efe 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiChatMessageServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiChatMessageServiceImpl.java @@ -44,4 +44,20 @@ public class KeyboardAiChatMessageServiceImpl extends ServiceImpl getChattedCompanionIds(Long userId) { + // 使用原生SQL查询用户聊过天的所有角色ID,按最近聊天时间倒序 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(KeyboardAiChatMessage::getUserId, userId) + .select(KeyboardAiChatMessage::getCompanionId) + .groupBy(KeyboardAiChatMessage::getCompanionId) + .orderByDesc(KeyboardAiChatMessage::getCompanionId); + + List messages = this.list(queryWrapper); + return messages.stream() + .map(KeyboardAiChatMessage::getCompanionId) + .distinct() + .collect(java.util.stream.Collectors.toList()); + } } diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java index 09eca3a..8989f77 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardAiCompanionServiceImpl.java @@ -11,6 +11,7 @@ import com.yolo.keyborad.model.entity.KeyboardAiCompanionLike; import com.yolo.keyborad.model.vo.AiCompanionVO; import com.yolo.keyborad.service.KeyboardAiCompanionCommentService; import com.yolo.keyborad.service.KeyboardAiCompanionLikeService; +import com.yolo.keyborad.service.KeyboardAiChatMessageService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -36,6 +37,9 @@ public class KeyboardAiCompanionServiceImpl extends ServiceImpl pageList(Integer pageNum, Integer pageSize) { Page page = new Page<>(pageNum, pageSize); @@ -199,4 +203,63 @@ public class KeyboardAiCompanionServiceImpl extends ServiceImpl getChattedCompanions(Long userId) { + // 获取用户聊过天的所有AI角色ID + List chattedCompanionIds = chatMessageService.getChattedCompanionIds(userId); + if (chattedCompanionIds.isEmpty()) { + return List.of(); + } + + // 查询这些AI角色的详细信息(只返回已上线且可见的) + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(KeyboardAiCompanion::getId, chattedCompanionIds) + .eq(KeyboardAiCompanion::getStatus, 1) + .eq(KeyboardAiCompanion::getVisibility, 1); + List companions = this.list(queryWrapper); + + if (companions.isEmpty()) { + return List.of(); + } + + // 获取实际查询到的角色ID + List companionIds = companions.stream() + .map(KeyboardAiCompanion::getId) + .collect(Collectors.toList()); + + // 批量统计点赞数 + LambdaQueryWrapper likeWrapper = new LambdaQueryWrapper<>(); + likeWrapper.in(KeyboardAiCompanionLike::getCompanionId, companionIds) + .eq(KeyboardAiCompanionLike::getStatus, (short) 1); + List likes = companionLikeService.list(likeWrapper); + Map likeCountMap = likes.stream() + .collect(Collectors.groupingBy(KeyboardAiCompanionLike::getCompanionId, Collectors.counting())); + + // 批量统计评论数 + LambdaQueryWrapper commentWrapper = new LambdaQueryWrapper<>(); + commentWrapper.in(KeyboardAiCompanionComment::getCompanionId, companionIds) + .eq(KeyboardAiCompanionComment::getStatus, (short) 1); + List comments = companionCommentService.list(commentWrapper); + Map commentCountMap = comments.stream() + .collect(Collectors.groupingBy(KeyboardAiCompanionComment::getCompanionId, Collectors.counting())); + + // 获取当前用户已点赞的角色ID + Set likedCompanionIds = companionLikeService.getLikedCompanionIds(userId, companionIds); + + // 转换为VO并填充统计数据,保持原有顺序(按最近聊天时间) + Map companionMap = companions.stream() + .collect(Collectors.toMap(KeyboardAiCompanion::getId, c -> c)); + + return chattedCompanionIds.stream() + .filter(companionMap::containsKey) + .map(id -> { + KeyboardAiCompanion entity = companionMap.get(id); + AiCompanionVO vo = BeanUtil.copyProperties(entity, AiCompanionVO.class); + vo.setLikeCount(likeCountMap.getOrDefault(entity.getId(), 0L).intValue()); + vo.setCommentCount(commentCountMap.getOrDefault(entity.getId(), 0L).intValue()); + vo.setLiked(likedCompanionIds.contains(entity.getId())); + return vo; + }).collect(Collectors.toList()); + } }