package com.hanserwei.airobot.service.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.hanserwei.airobot.domain.dos.ChatDO; import com.hanserwei.airobot.domain.dos.ChatMessageDO; import com.hanserwei.airobot.domain.mapper.ChatMapper; import com.hanserwei.airobot.domain.mapper.ChatMessageMapper; import com.hanserwei.airobot.enums.ResponseCodeEnum; import com.hanserwei.airobot.exception.BizException; import com.hanserwei.airobot.model.vo.chat.*; import com.hanserwei.airobot.service.ChatService; import com.hanserwei.airobot.utils.PageResponse; import com.hanserwei.airobot.utils.Response; import com.hanserwei.airobot.utils.StringUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @Service public class ChatServiceImpl implements ChatService { @Resource private ChatMapper chatMapper; @Resource private ChatMessageMapper chatMessageMapper; @Override public Response newChat(NewChatReqVO newChatReqVO) { // 用户发来的消息 String message = newChatReqVO.getMessage(); // 生成对话的UUID String uuid = UUID.randomUUID().toString(); // 截取用户发送的消息,作为对话的摘要 String summary = StringUtil.truncate(message, 20); // 存储对话记录到数据库中 chatMapper.insert(ChatDO.builder() .summary(summary) .uuid(uuid) .createTime(LocalDateTime.now()) .updateTime(LocalDateTime.now()) .build()); // 将摘要、UUID 返回给前端 return Response.success(NewChatRspVO.builder() .uuid(uuid) .summary(summary) .build()); } @Override public PageResponse findChatHistoryMessagePageList(FindChatHistoryMessagePageListReqVO findChatHistoryMessagePageListReqVO) { // 获取当前页、以及每页需要展示的数据数量 Long current = findChatHistoryMessagePageListReqVO.getCurrent(); Long size = findChatHistoryMessagePageListReqVO.getSize(); String chatId = findChatHistoryMessagePageListReqVO.getChatId(); // 执行分页查询 Page chatMessageDOPage = chatMessageMapper.selectPageList(current, size, chatId); List chatMessageDOS = chatMessageDOPage.getRecords(); // DO 转 VO List vos = null; if (CollUtil.isNotEmpty(chatMessageDOS)) { vos = chatMessageDOS.stream() .map(chatMessageDO -> FindChatHistoryMessagePageListRspVO.builder() // 构建返参 VO 实体类 .id(chatMessageDO.getId()) .chatId(chatMessageDO.getChatUuid()) .content(chatMessageDO.getContent()) .role(chatMessageDO.getRole()) .createTime(chatMessageDO.getCreateTime()) .build()) // 升序排序 .sorted(Comparator.comparing(FindChatHistoryMessagePageListRspVO::getCreateTime)) .collect(Collectors.toList()); } return PageResponse.success(chatMessageDOPage, vos); } @Override public PageResponse findChatHistoryPageList(FindChatHistoryPageListReqVO findChatHistoryPageListReqVO) { // 获取当前页、以及每页需要展示的数据数量 Long current = findChatHistoryPageListReqVO.getCurrent(); Long size = findChatHistoryPageListReqVO.getSize(); // 执行分页查询 Page chatDOPage = chatMapper.selectPageList(current, size); // 获取查询结果 List chatDOS = chatDOPage.getRecords(); // DO 转 VO List vos = null; if (CollUtil.isNotEmpty(chatDOS)) { vos = chatDOS.stream() .map(chatDO -> FindChatHistoryPageListRspVO.builder() // 构建返参 VO .id(chatDO.getId()) .uuid(chatDO.getUuid()) .summary(chatDO.getSummary()) .updateTime(chatDO.getUpdateTime()) .build()) .collect(Collectors.toList()); } return PageResponse.success(chatDOPage, vos); } @Override public Response renameChatSummary(RenameChatReqVO renameChatReqVO) { // 对话 ID Long chatId = renameChatReqVO.getId(); // 摘要 String summary = renameChatReqVO.getSummary(); // 根据主键 ID 更新摘要 chatMapper.updateById(ChatDO.builder() .id(chatId) .summary(summary) .build()); return Response.success(); } @Override @Transactional(rollbackFor = Exception.class) public Response deleteChat(DeleteChatReqVO deleteChatReqVO) { // 对话 UUID String uuid = deleteChatReqVO.getUuid(); // 删除对话 int count = chatMapper.delete(Wrappers.lambdaQuery() .eq(ChatDO::getUuid, uuid)); // 如果删除操作影响的行数为 0,说明想要删除的对话不存在 if (count == 0) { throw new BizException(ResponseCodeEnum.CHAT_NOT_EXISTED); } // 批量删除对话下的所有消息 chatMessageMapper.delete(Wrappers.lambdaQuery() .eq(ChatMessageDO::getChatUuid, uuid)); return Response.success(); } }