feat(ai-companion): 新增获取用户聊过天的AI角色列表接口

This commit is contained in:
2026-01-28 15:50:15 +08:00
parent 0e863288c8
commit c8d8046bf4
5 changed files with 103 additions and 0 deletions

View File

@@ -62,4 +62,12 @@ public class AiCompanionController {
List<AiCompanionVO> result = aiCompanionService.getLikedCompanions(userId); List<AiCompanionVO> result = aiCompanionService.getLikedCompanions(userId);
return ResultUtils.success(result); return ResultUtils.success(result);
} }
@GetMapping("/chatted")
@Operation(summary = "获取当前用户聊过天的AI角色列表", description = "查询当前用户聊过天的所有AI角色返回角色详细信息")
public BaseResponse<List<AiCompanionVO>> getChattedCompanions() {
Long userId = StpUtil.getLoginIdAsLong();
List<AiCompanionVO> result = aiCompanionService.getChattedCompanions(userId);
return ResultUtils.success(result);
}
} }

View File

@@ -33,4 +33,12 @@ public interface KeyboardAiChatMessageService extends IService<KeyboardAiChatMes
* @return 聊天记录列表(时间正序) * @return 聊天记录列表(时间正序)
*/ */
List<KeyboardAiChatMessage> getRecentMessages(Long userId, Long companionId, int limit); List<KeyboardAiChatMessage> getRecentMessages(Long userId, Long companionId, int limit);
/**
* 获取用户聊过天的所有AI角色ID列表
*
* @param userId 用户ID
* @return 聊过天的AI角色ID列表按最近聊天时间倒序
*/
List<Long> getChattedCompanionIds(Long userId);
} }

View File

@@ -47,4 +47,12 @@ public interface KeyboardAiCompanionService extends IService<KeyboardAiCompanion
* @return 点赞过的AI角色列表 * @return 点赞过的AI角色列表
*/ */
List<AiCompanionVO> getLikedCompanions(Long userId); List<AiCompanionVO> getLikedCompanions(Long userId);
/**
* 获取用户聊过天的AI角色列表
*
* @param userId 用户ID
* @return 聊过天的AI角色列表
*/
List<AiCompanionVO> getChattedCompanions(Long userId);
} }

View File

@@ -44,4 +44,20 @@ public class KeyboardAiChatMessageServiceImpl extends ServiceImpl<KeyboardAiChat
Collections.reverse(messages); Collections.reverse(messages);
return messages; return messages;
} }
@Override
public List<Long> getChattedCompanionIds(Long userId) {
// 使用原生SQL查询用户聊过天的所有角色ID按最近聊天时间倒序
LambdaQueryWrapper<KeyboardAiChatMessage> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(KeyboardAiChatMessage::getUserId, userId)
.select(KeyboardAiChatMessage::getCompanionId)
.groupBy(KeyboardAiChatMessage::getCompanionId)
.orderByDesc(KeyboardAiChatMessage::getCompanionId);
List<KeyboardAiChatMessage> messages = this.list(queryWrapper);
return messages.stream()
.map(KeyboardAiChatMessage::getCompanionId)
.distinct()
.collect(java.util.stream.Collectors.toList());
}
} }

View File

@@ -11,6 +11,7 @@ import com.yolo.keyborad.model.entity.KeyboardAiCompanionLike;
import com.yolo.keyborad.model.vo.AiCompanionVO; import com.yolo.keyborad.model.vo.AiCompanionVO;
import com.yolo.keyborad.service.KeyboardAiCompanionCommentService; import com.yolo.keyborad.service.KeyboardAiCompanionCommentService;
import com.yolo.keyborad.service.KeyboardAiCompanionLikeService; import com.yolo.keyborad.service.KeyboardAiCompanionLikeService;
import com.yolo.keyborad.service.KeyboardAiChatMessageService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -36,6 +37,9 @@ public class KeyboardAiCompanionServiceImpl extends ServiceImpl<KeyboardAiCompan
@Resource @Resource
private KeyboardAiCompanionCommentService companionCommentService; private KeyboardAiCompanionCommentService companionCommentService;
@Resource
private KeyboardAiChatMessageService chatMessageService;
@Override @Override
public IPage<AiCompanionVO> pageList(Integer pageNum, Integer pageSize) { public IPage<AiCompanionVO> pageList(Integer pageNum, Integer pageSize) {
Page<KeyboardAiCompanion> page = new Page<>(pageNum, pageSize); Page<KeyboardAiCompanion> page = new Page<>(pageNum, pageSize);
@@ -199,4 +203,63 @@ public class KeyboardAiCompanionServiceImpl extends ServiceImpl<KeyboardAiCompan
return vo; return vo;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
@Override
public List<AiCompanionVO> getChattedCompanions(Long userId) {
// 获取用户聊过天的所有AI角色ID
List<Long> chattedCompanionIds = chatMessageService.getChattedCompanionIds(userId);
if (chattedCompanionIds.isEmpty()) {
return List.of();
}
// 查询这些AI角色的详细信息只返回已上线且可见的
LambdaQueryWrapper<KeyboardAiCompanion> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(KeyboardAiCompanion::getId, chattedCompanionIds)
.eq(KeyboardAiCompanion::getStatus, 1)
.eq(KeyboardAiCompanion::getVisibility, 1);
List<KeyboardAiCompanion> companions = this.list(queryWrapper);
if (companions.isEmpty()) {
return List.of();
}
// 获取实际查询到的角色ID
List<Long> companionIds = companions.stream()
.map(KeyboardAiCompanion::getId)
.collect(Collectors.toList());
// 批量统计点赞数
LambdaQueryWrapper<KeyboardAiCompanionLike> likeWrapper = new LambdaQueryWrapper<>();
likeWrapper.in(KeyboardAiCompanionLike::getCompanionId, companionIds)
.eq(KeyboardAiCompanionLike::getStatus, (short) 1);
List<KeyboardAiCompanionLike> likes = companionLikeService.list(likeWrapper);
Map<Long, Long> likeCountMap = likes.stream()
.collect(Collectors.groupingBy(KeyboardAiCompanionLike::getCompanionId, Collectors.counting()));
// 批量统计评论数
LambdaQueryWrapper<KeyboardAiCompanionComment> commentWrapper = new LambdaQueryWrapper<>();
commentWrapper.in(KeyboardAiCompanionComment::getCompanionId, companionIds)
.eq(KeyboardAiCompanionComment::getStatus, (short) 1);
List<KeyboardAiCompanionComment> comments = companionCommentService.list(commentWrapper);
Map<Long, Long> commentCountMap = comments.stream()
.collect(Collectors.groupingBy(KeyboardAiCompanionComment::getCompanionId, Collectors.counting()));
// 获取当前用户已点赞的角色ID
Set<Long> likedCompanionIds = companionLikeService.getLikedCompanionIds(userId, companionIds);
// 转换为VO并填充统计数据保持原有顺序按最近聊天时间
Map<Long, KeyboardAiCompanion> 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());
}
} }