package com.smartreview.service.impl; import com.smartreview.po.Block; import com.smartreview.po.Conversation; import com.smartreview.repository.*; import com.smartreview.service.DocumentCleanupService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * 文档清理服务实现 */ @Slf4j @Service @RequiredArgsConstructor public class DocumentCleanupServiceImpl implements DocumentCleanupService { private final BlockRepository blockRepository; private final ChapterRepository chapterRepository; private final KnowledgePointRepository knowledgePointRepository; private final QuestionRepository questionRepository; private final UserAnswerRepository userAnswerRepository; private final QuestionGenerationTaskRepository questionGenerationTaskRepository; private final ConversationRepository conversationRepository; private final ReviewChatMessageRepository reviewChatMessageRepository; @Override @Transactional public void cleanOldDocumentData(String documentId) { log.info("开始清理文档旧数据: {}", documentId); // 删除所有Block下的知识点 List oldBlocks = blockRepository.findByDocumentIdOrderBySortOrder(documentId); for (Block oldBlock : oldBlocks) { knowledgePointRepository.deleteByBlockId(oldBlock.getId()); } // 删除所有Block blockRepository.deleteByDocumentId(documentId); // 删除所有章节 chapterRepository.deleteByDocumentId(documentId); log.info("文档旧数据清理完成: {}", documentId); } @Override @Transactional public void cleanAllDocumentData(String documentId) { log.info("开始完全清理文档所有关联数据: {}", documentId); // 获取所有Block List blocks = blockRepository.findByDocumentIdOrderBySortOrder(documentId); List blockIds = blocks.stream().map(Block::getId).toList(); if (!blockIds.isEmpty()) { // 1. 删除用户答案 for (Long blockId : blockIds) { userAnswerRepository.deleteByBlockId(blockId); } log.debug("已删除文档相关的用户答案: documentId={}", documentId); // 2. 删除题目 for (Long blockId : blockIds) { questionRepository.deleteByBlockId(blockId); } log.debug("已删除文档相关的题目: documentId={}", documentId); // 3. 删除题目生成任务 for (Long blockId : blockIds) { questionGenerationTaskRepository.deleteByBlockId(blockId); } log.debug("已删除文档相关的题目生成任务: documentId={}", documentId); // 4. 删除知识点 for (Long blockId : blockIds) { knowledgePointRepository.deleteByBlockId(blockId); } log.debug("已删除文档相关的知识点: documentId={}", documentId); } // 5. 删除对话和聊天记录 List conversations = conversationRepository.findByDocumentId(documentId); for (Conversation conversation : conversations) { reviewChatMessageRepository.deleteByConversationId(conversation.getId()); } conversationRepository.deleteByDocumentId(documentId); log.debug("已删除文档相关的对话和聊天记录: documentId={}", documentId); // 6. 删除所有Block blockRepository.deleteByDocumentId(documentId); log.debug("已删除文档的所有Block: documentId={}", documentId); // 7. 删除所有章节 chapterRepository.deleteByDocumentId(documentId); log.debug("已删除文档的所有章节: documentId={}", documentId); log.info("文档所有关联数据清理完成: {}", documentId); } }