From a649df4aa1cbadb102692134b7ff4845531b196c Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Tue, 30 Sep 2025 13:06:27 +0800 Subject: [PATCH] fix(ai):修复知识库文件删除逻辑 --- src/main/java/cc/mrbird/febs/ai/service/impl/AiKnowledgeFileServiceImpl.java | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 208 insertions(+), 0 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiKnowledgeFileServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiKnowledgeFileServiceImpl.java index afc19e3..41b0733 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiKnowledgeFileServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiKnowledgeFileServiceImpl.java @@ -1,12 +1,34 @@ package cc.mrbird.febs.ai.service.impl; +import cc.mrbird.febs.ai.entity.AiCompany; import cc.mrbird.febs.ai.entity.AiKnowledgeFile; import cc.mrbird.febs.ai.mapper.AiKnowledgeFileMapper; +import cc.mrbird.febs.ai.service.AiCompanyService; import cc.mrbird.febs.ai.service.AiKnowledgeFileService; +import cc.mrbird.febs.ai.util.KnowledgeBaseUtil; +import cc.mrbird.febs.ai.util.UUID; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.entity.QueryRequest; +import cc.mrbird.febs.common.exception.FebsException; +import cc.mrbird.febs.rabbit.producter.AgentProducer; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.util.stream.Collectors; @Slf4j @Service @@ -14,4 +36,190 @@ public class AiKnowledgeFileServiceImpl extends ServiceImpl<AiKnowledgeFileMapper, AiKnowledgeFile> implements AiKnowledgeFileService { private final AiKnowledgeFileMapper aiKnowledgeFileMapper; + private final AiCompanyService aiCompanyService; + private final AgentProducer agentProducer; + + @Override + public IPage<AiKnowledgeFile> listInPage(AiKnowledgeFile dto, QueryRequest request) { + Page<AiKnowledgeFile> page = new Page<>(request.getPageNum(), request.getPageSize()); + LambdaQueryWrapper<AiKnowledgeFile> query = Wrappers.lambdaQuery(AiKnowledgeFile.class); + if (StrUtil.isNotEmpty(dto.getCompanyId())){ + query.eq(AiKnowledgeFile::getCompanyId, dto.getCompanyId()); + } + query.orderByDesc(AiKnowledgeFile::getCompanyId); + Page<AiKnowledgeFile> pages = aiKnowledgeFileMapper.selectPage(page, query); + List<AiKnowledgeFile> records = pages.getRecords(); + if (CollUtil.isNotEmpty(records)){ + //stream流获取全部的公司ID + Set<String> companyIds = records.stream().map(AiKnowledgeFile::getCompanyId).collect(Collectors.toSet()); + List<String> companyIdList = new ArrayList<>(companyIds); + List<AiCompany> listById = aiCompanyService.getListById((companyIdList)); + Map<String, AiCompany> collect = listById.stream().collect(Collectors.toMap(AiCompany::getId, aiCompany -> aiCompany)); + for (AiKnowledgeFile aiKnowledgeFile : records){ + if (StrUtil.isEmpty(aiKnowledgeFile.getCompanyId())){ + aiKnowledgeFile.setCompanyName("公共"); + }else{ + if (StrUtil.isEmpty(aiKnowledgeFile.getCompanyId())){ + aiKnowledgeFile.setCompanyName("公共"); + }else{ + aiKnowledgeFile.setCompanyName(collect.get(aiKnowledgeFile.getCompanyId()).getName()); + } + } + } + } + return pages; + } + + @Override + @Transactional + public FebsResponse add(AiKnowledgeFile dto) { + AiKnowledgeFile entity = new AiKnowledgeFile(); + entity.setId(UUID.getSimpleUUIDString()); + entity.setCompanyId(dto.getCompanyId()); + entity.setName(dto.getName()); + entity.setState(1); + entity.setSavePath(dto.getSavePath()); + entity.setCreatedTime(new Date()); + this.save(entity); + + agentProducer.sendAddKnowledge( entity.getId()); + return new FebsResponse().success().message("操作成功"); + } + + @Override + public FebsResponse update(AiKnowledgeFile dto) { + return null; + } + + @Override + public void getAddKnowledge(String id) { + AiKnowledgeFile aiKnowledgeFile = this.getById(id); + if (ObjectUtil.isNull(aiKnowledgeFile)){ + return; + } + + String categoryId = null; + String knowledgeId = null; + if (StrUtil.isNotEmpty(aiKnowledgeFile.getCompanyId())){ + AiCompany aiCompany = aiCompanyService.getById(aiKnowledgeFile.getCompanyId()); + if (StrUtil.isNotEmpty(aiCompany.getCategoryId())){ + categoryId = aiCompany.getCategoryId(); + knowledgeId = aiCompany.getKnowledgeId(); + } + }else{ + categoryId = KnowledgeBaseUtil.DEFAULT_CATEGORY_ID; + knowledgeId = KnowledgeBaseUtil.DEFAULT_KNOWLEDGE_ID; + } + + String fileId = KnowledgeBaseUtil.uploadFileToAppData(aiKnowledgeFile.getSavePath(), categoryId); + if (StrUtil.isBlank(fileId)){ + log.info("初始化应用数据失败"); + return ; + } + + String jobId = KnowledgeBaseUtil.updateKnowledgeBase(fileId, knowledgeId, null); + aiKnowledgeFileMapper.update(null, + Wrappers.lambdaUpdate(AiKnowledgeFile.class) + .set(AiKnowledgeFile::getFileId, fileId) + .set(AiKnowledgeFile::getJobId, jobId) + .eq(AiKnowledgeFile::getId, aiKnowledgeFile.getId()) + ); + + } + + @Override + public FebsResponse refresh(String id) { + AiKnowledgeFile aiKnowledgeFile = this.getById(id); + if (ObjectUtil.isNull(aiKnowledgeFile)){ + throw new FebsException("文件不存在"); + } + + Integer state = aiKnowledgeFile.getState(); + + if (state == 1){ + state = KnowledgeBaseUtil.getFileJobStatus(aiKnowledgeFile.getFileId()); + if ( state == 2) { + aiKnowledgeFileMapper.update(null, + Wrappers.lambdaUpdate(AiKnowledgeFile.class) + .set(AiKnowledgeFile::getState, state) + .eq(AiKnowledgeFile::getId, aiKnowledgeFile.getId()) + ); + } + } + + if (state == 2){ + String knowledgeId = null; + if (StrUtil.isNotEmpty(aiKnowledgeFile.getCompanyId())){ + AiCompany aiCompany = aiCompanyService.getById(aiKnowledgeFile.getCompanyId()); + if (StrUtil.isNotEmpty(aiCompany.getCategoryId())){ + knowledgeId = aiCompany.getKnowledgeId(); + } + }else{ + knowledgeId = KnowledgeBaseUtil.DEFAULT_KNOWLEDGE_ID; + } + state = KnowledgeBaseUtil.getIndexKnowledgeJobStatus(aiKnowledgeFile.getJobId(),knowledgeId); + if ( state == 3) { + aiKnowledgeFileMapper.update(null, + Wrappers.lambdaUpdate(AiKnowledgeFile.class) + .set(AiKnowledgeFile::getState, state) + .eq(AiKnowledgeFile::getId, aiKnowledgeFile.getId()) + ); + } + } + return new FebsResponse().success().message("操作成功"); + } + + @Override + public FebsResponse delete(String id) { + //如何从服务器上的位置删除对应的文件 + AiKnowledgeFile aiKnowledgeFile = this.getById(id); + if (ObjectUtil.isNull(aiKnowledgeFile)){ + throw new FebsException("文件不存在"); + } + //服务器删除 + try { + Path filePath = Paths.get(aiKnowledgeFile.getSavePath()); + boolean deleted = Files.deleteIfExists(filePath); + if (!deleted) { + throw new FebsException("文件删除失败"); + } + } catch (Exception e) { + throw new FebsException("删除文件时发生错误: " + e.getMessage()); + } + + aiKnowledgeFileMapper.deleteById(id); + + //知识库删除 + String knowledgeId = null; + if (StrUtil.isNotEmpty(aiKnowledgeFile.getCompanyId())){ + AiCompany aiCompany = aiCompanyService.getById(aiKnowledgeFile.getCompanyId()); + if (StrUtil.isNotEmpty(aiCompany.getCategoryId())){ + knowledgeId = aiCompany.getKnowledgeId(); + } + }else{ + knowledgeId = KnowledgeBaseUtil.DEFAULT_KNOWLEDGE_ID; + } + KnowledgeBaseUtil.knowledgeFileDelete(aiKnowledgeFile.getFileId(), knowledgeId); + + //应用数据删除 + try { + KnowledgeBaseUtil.deleteFile(aiKnowledgeFile.getFileId()); + } catch (Exception e) { + throw new FebsException("应用数据删除时发生错误: " + e.getMessage()); + } + return new FebsResponse().success().message("操作成功"); + } + + @Override + public void refreshEvent() { + LambdaQueryWrapper<AiKnowledgeFile> queryWrapper = Wrappers.lambdaQuery(AiKnowledgeFile.class); + queryWrapper.ne(AiKnowledgeFile::getState, 3); + List<AiKnowledgeFile> list = aiKnowledgeFileMapper.selectList(queryWrapper); + if (CollUtil.isEmpty( list)){ + for (AiKnowledgeFile aiKnowledgeFile : list){ + refresh(aiKnowledgeFile.getId()); + } + } + + } } -- Gitblit v1.9.1