每日总结

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);
}

}
image

posted @ 2025-10-15 19:01  李蕊lr  阅读(1)  评论(0)    收藏  举报