package com.ruoyi.approve.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.dto.KnowledgeBaseVectorVO; import com.ruoyi.approve.mapper.KnowledgeBaseVectorMapper; import com.ruoyi.approve.pojo.KnowledgeBase; import com.ruoyi.approve.pojo.KnowledgeBaseVector; import com.ruoyi.approve.service.KnowledgeBaseService; import com.ruoyi.approve.service.KnowledgeBaseVectorService; import com.ruoyi.ai.service.KnowledgeRagService; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * 知识库文件向量记录 Service实现 */ @Slf4j @Service public class KnowledgeBaseVectorServiceImpl extends ServiceImpl implements KnowledgeBaseVectorService { private final KnowledgeBaseService knowledgeBaseService; private final KnowledgeRagService knowledgeRagService; public KnowledgeBaseVectorServiceImpl( KnowledgeBaseService knowledgeBaseService, @Lazy KnowledgeRagService knowledgeRagService) { this.knowledgeBaseService = knowledgeBaseService; this.knowledgeRagService = knowledgeRagService; } @Override public List getVectorStatusByKnowledgeBaseId(Long knowledgeBaseId) { return baseMapper.selectByKnowledgeBaseId(knowledgeBaseId); } @Override public KnowledgeBaseVector createVectorRecord(Long knowledgeBaseId, Long storageBlobId, String fileName, String fileType) { KnowledgeBase knowledgeBase = knowledgeBaseService.getById(knowledgeBaseId); if (knowledgeBase == null) { throw new RuntimeException("知识库不存在: " + knowledgeBaseId); } KnowledgeBaseVector vector = new KnowledgeBaseVector(); vector.setKnowledgeBaseId(knowledgeBaseId); vector.setStorageBlobId(storageBlobId); vector.setFileName(fileName); vector.setFileType(fileType); vector.setVectorStatus(KnowledgeBaseVector.STATUS_PENDING); vector.setNamespace("kb-" + knowledgeBaseId); vector.setChunkCount(0); save(vector); // 异步触发向量化处理 knowledgeRagService.processVectorAsync(vector.getId()); return vector; } @Override public void updateVectorStatus(Long id, Integer status, Integer chunkCount, String error) { KnowledgeBaseVector vector = getById(id); if (vector == null) { return; } vector.setVectorStatus(status); if (chunkCount != null) { vector.setChunkCount(chunkCount); } if (error != null) { vector.setVectorError(error); } updateById(vector); // 如果完成,更新知识库统计 if (status == KnowledgeBaseVector.STATUS_COMPLETED) { updateKnowledgeBaseStats(vector.getKnowledgeBaseId()); } } @Override @Transactional(rollbackFor = Exception.class) public void reprocessVector(Long id) { KnowledgeBaseVector vector = getById(id); if (vector == null) { throw new RuntimeException("向量记录不存在: " + id); } vector.setVectorStatus(KnowledgeBaseVector.STATUS_PENDING); vector.setVectorError(null); vector.setChunkCount(0); updateById(vector); // 异步重新处理 knowledgeRagService.processVectorAsync(id); } @Override @Transactional(rollbackFor = Exception.class) public void deleteVector(Long id) { KnowledgeBaseVector vector = getById(id); if (vector == null) { return; } // 删除向量库中的数据 try { knowledgeRagService.deleteEmbeddings(vector.getNamespace(), vector.getStorageBlobId()); } catch (Exception e) { log.error("删除向量库数据失败", e); } // 删除记录 removeById(id); // 更新知识库统计 updateKnowledgeBaseStats(vector.getKnowledgeBaseId()); } @Override @Transactional(rollbackFor = Exception.class) public void deleteVectors(List ids) { for (Long id : ids) { deleteVector(id); } } private void updateKnowledgeBaseStats(Long knowledgeBaseId) { KnowledgeBase knowledgeBase = knowledgeBaseService.getById(knowledgeBaseId); if (knowledgeBase == null) { return; } int fileCount = baseMapper.countByKnowledgeBaseId(knowledgeBaseId); int totalChunkCount = baseMapper.sumChunkCountByKnowledgeBaseId(knowledgeBaseId); knowledgeBase.setFileCount(fileCount); knowledgeBase.setTotalChunkCount(totalChunkCount); knowledgeBaseService.updateById(knowledgeBase); } }