每日总结
package com.mentalhealth.service;
import com.mentalhealth.entity.Message;
import com.mentalhealth.entity.MessageType;
import com.mentalhealth.entity.MessageStatus;
import com.mentalhealth.entity.User;
import com.mentalhealth.repository.MessageRepository;
import com.mentalhealth.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
@Service
@RequiredArgsConstructor
public class MessageService {
private final MessageRepository messageRepository;
private final UserRepository userRepository;
@Transactional
public Message sendMessage(Long senderId, Long receiverId, String content, MessageType messageType) {
Message message = new Message();
message.setSenderId(senderId);
message.setReceiverId(receiverId);
message.setContent(content);
message.setType(messageType);
message.setSendTime(LocalDateTime.now());
message.setIsRead(false);
message.setStatus(MessageStatus.SENT);
return messageRepository.save(message);
}
// 发送文本消息
@Transactional
public Message sendTextMessage(Long senderId, Long receiverId, String content) {
return sendMessage(senderId, receiverId, content, MessageType.TEXT);
}
// 发送系统消息
@Transactional
public Message sendSystemMessage(Long senderId, Long receiverId, String content) {
return sendMessage(senderId, receiverId, content, MessageType.SYSTEM);
}
// 发送图片消息
@Transactional
public Message sendImageMessage(Long senderId, Long receiverId, String imageUrl) {
return sendMessage(senderId, receiverId, imageUrl, MessageType.IMAGE);
}
// 发送文件消息
@Transactional
public Message sendFileMessage(Long senderId, Long receiverId, String fileUrl) {
return sendMessage(senderId, receiverId, fileUrl, MessageType.FILE);
}
// 获取两个用户之间的对话
public List<Message> getConversation(Long user1Id, Long user2Id) {
return messageRepository.findConversation(user1Id, user2Id);
}
// 根据ID获取消息
public Message getMessageById(Long messageId) {
return messageRepository.findById(messageId).orElse(null);
}
// 标记消息为已读
@Transactional
public void markMessageAsRead(Long messageId) {
Message message = messageRepository.findById(messageId)
.orElseThrow(() -> new RuntimeException("消息不存在"));
message.setIsRead(true);
message.setReadTime(LocalDateTime.now());
message.setStatus(MessageStatus.READ);
messageRepository.save(message);
}
// 批量标记消息为已读
@Transactional
public void markMessagesAsRead(List<Long> messageIds) {
List<Message> messages = messageRepository.findAllById(messageIds);
LocalDateTime now = LocalDateTime.now();
messages.forEach(message -> {
message.setIsRead(true);
message.setReadTime(now);
message.setStatus(MessageStatus.READ);
});
messageRepository.saveAll(messages);
}
// 获取用户的未读消息
public List<Message> getUnreadMessages(Long userId) {
return messageRepository.findByReceiverIdAndIsReadFalse(userId);
}
// 获取用户收到的所有消息
public List<Message> getReceivedMessages(Long userId) {
return messageRepository.findByReceiverIdOrderBySendTimeDesc(userId);
}
// 获取用户发送的所有消息
public List<Message> getSentMessages(Long userId) {
return messageRepository.findBySenderIdOrderBySendTimeDesc(userId);
}
// 获取未读消息数量
public long getUnreadMessageCount(Long userId) {
return messageRepository.countByReceiverIdAndIsReadFalse(userId);
}
// 删除消息(软删除或硬删除)
@Transactional
public void deleteMessage(Long messageId) {
Message message = messageRepository.findById(messageId)
.orElseThrow(() -> new RuntimeException("消息不存在"));
messageRepository.delete(message);
}
// 获取用户最近的联系人
public List<User> getRecentContacts(Long userId) {
// 使用最近30天有消息往来的联系人
LocalDateTime sinceDate = LocalDateTime.now().minusDays(30);
return userRepository.findRecentContactsSince(userId, sinceDate);
}
// 获取所有联系人(不限时间)
public List<User> getAllContacts(Long userId) {
return userRepository.findRecentContacts(userId);
}
// 备用方法:使用原生查询
public List<User> getRecentContactsNative(Long userId) {
LocalDateTime sinceDate = LocalDateTime.now().minusDays(30);
return userRepository.findRecentContactsSinceNative(userId, sinceDate);
}
// 获取用户与特定联系人的未读消息数量
public long getUnreadMessageCountWithContact(Long userId, Long contactId) {
return messageRepository.countByReceiverIdAndSenderIdAndIsReadFalse(userId, contactId);
}
// 获取用户与特定联系人的最后一条消息 - 修改为处理可能的空值
public Message getLastMessageWithContact(Long user1Id, Long user2Id) {
Message lastMessage = messageRepository.findLastMessageBetweenUsers(user1Id, user2Id);
if (lastMessage == null) {
// 如果没有找到消息,返回null或抛出异常,根据业务需求决定
return null;
}
return lastMessage;
}
// 备用方法:使用JPA方式获取最后一条消息
public Message getLastMessageWithContactAlternative(Long user1Id, Long user2Id) {
List<Message> messages = messageRepository.findConversationBetweenUsersOrderBySendTimeDesc(user1Id, user2Id);
if (messages.isEmpty()) {
return null;
}
return messages.get(0);
}
// 标记与特定联系人的所有消息为已读
@Transactional
public void markAllMessagesAsReadWithContact(Long userId, Long contactId) {
List<Message> unreadMessages = messageRepository.findByReceiverIdAndSenderIdAndIsReadFalse(userId, contactId);
LocalDateTime now = LocalDateTime.now();
unreadMessages.forEach(message -> {
message.setIsRead(true);
message.setReadTime(now);
message.setStatus(MessageStatus.READ);
});
messageRepository.saveAll(unreadMessages);
}
// 获取用户与特定联系人的所有消息(按时间倒序)
public List<Message> getConversationWithContact(Long user1Id, Long user2Id) {
return messageRepository.findConversationBetweenUsersOrderBySendTimeDesc(user1Id, user2Id);
}
}


浙公网安备 33010602011771号