package com.emotion.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.emotion.common.BasePageRequest; import com.emotion.entity.Message; import com.emotion.mapper.MessageMapper; import com.emotion.service.MessageService; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.time.LocalDateTime; import java.util.List; /** * 消息服务实现类 * * @author emotion-museum * @date 2025-07-24 */ @Service public class MessageServiceImpl extends ServiceImpl implements MessageService { @Override public IPage getPage(BasePageRequest request) { Page page = new Page<>(request.getCurrent(), request.getSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (StringUtils.hasText(request.getKeyword())) { wrapper.like(Message::getContent, request.getKeyword()); } wrapper.eq(Message::getIsDeleted, 0).orderByDesc(Message::getCreateTime); return this.page(page, wrapper); } @Override public IPage getPageByConversationId(BasePageRequest request, String conversationId) { Page page = new Page<>(request.getCurrent(), request.getSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Message::getConversationId, conversationId) .eq(Message::getIsDeleted, 0) .orderByDesc(Message::getCreateTime); return this.page(page, wrapper); } @Override public List getByConversationId(String conversationId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Message::getConversationId, conversationId) .eq(Message::getIsDeleted, 0) .orderByAsc(Message::getCreateTime); return this.list(wrapper); } @Override public List getBySender(String sender) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Message::getSender, sender) .eq(Message::getIsDeleted, 0) .orderByDesc(Message::getCreateTime); return this.list(wrapper); } @Override public List getByTimeRange(String conversationId, LocalDateTime startTime, LocalDateTime endTime) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Message::getConversationId, conversationId) .between(Message::getCreateTime, startTime, endTime) .eq(Message::getIsDeleted, 0) .orderByAsc(Message::getCreateTime); return this.list(wrapper); } @Override public Message getLastMessageByConversationId(String conversationId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Message::getConversationId, conversationId) .eq(Message::getIsDeleted, 0) .orderByDesc(Message::getCreateTime) .last("LIMIT 1"); return this.getOne(wrapper); } @Override public List getRepliesByParentId(String parentMessageId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Message::getParentMessageId, parentMessageId) .eq(Message::getIsDeleted, 0) .orderByAsc(Message::getCreateTime); return this.list(wrapper); } @Override public Long countByConversationId(String conversationId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Message::getConversationId, conversationId) .eq(Message::getIsDeleted, 0); return this.count(wrapper); } @Override public Long countBySender(String sender) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Message::getSender, sender) .eq(Message::getIsDeleted, 0); return this.count(wrapper); } @Override public Long countUnreadMessages(String conversationId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Message::getConversationId, conversationId) .eq(Message::getIsRead, 0) .eq(Message::getIsDeleted, 0); return this.count(wrapper); } @Override public boolean updateStatus(String messageId, String status) { Message message = new Message(); message.setId(messageId); message.setStatus(status); return this.updateById(message); } @Override public boolean updateReadStatus(String messageId, Integer isRead) { Message message = new Message(); message.setId(messageId); message.setIsRead(isRead); return this.updateById(message); } @Override public boolean markConversationMessagesAsRead(String conversationId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Message::getConversationId, conversationId) .eq(Message::getIsRead, 0) .eq(Message::getIsDeleted, 0); Message updateMessage = new Message(); updateMessage.setIsRead(1); return this.update(updateMessage, wrapper); } @Override public Message createMessage(Message message) { // 设置默认值 if (message.getTimestamp() == null) { message.setTimestamp(LocalDateTime.now()); } if (message.getStatus() == null) { message.setStatus("sent"); } if (message.getIsRead() == null) { message.setIsRead(0); } this.save(message); return message; } @Override public boolean markAsRead(String messageId) { return updateReadStatus(messageId, 1); } @Override public List getByUserIdAndTimeRange(String userId, LocalDateTime startTime, LocalDateTime endTime) { // 由于Message表没有直接的userId字段,需要通过conversation表关联查询 // 这里先通过conversationService获取用户的所有对话ID,然后查询这些对话的消息 return this.baseMapper.getByUserIdAndTimeRange(userId, startTime, endTime); } @Override public IPage getByUserIdWithPage(String userId, Integer current, Integer size) { // 手动实现分页 Integer offset = (current - 1) * size; List records = this.baseMapper.getByUserIdWithPageList(userId, offset, size); Long total = this.baseMapper.countByUserId(userId); Page page = new Page<>(current, size); page.setRecords(records); page.setTotal(total); return page; } @Override public List searchByUserIdAndKeyword(String userId, String keyword, Integer limit) { // 通过conversation表关联查询用户的消息,根据关键词搜索 return this.baseMapper.searchByUserIdAndKeyword(userId, keyword, limit); } }