diff --git a/src/main/java/com/gxwebsoft/ai/service/AiCloudDocService.java b/src/main/java/com/gxwebsoft/ai/service/AiCloudDocService.java index d21997e..1f2d77a 100644 --- a/src/main/java/com/gxwebsoft/ai/service/AiCloudDocService.java +++ b/src/main/java/com/gxwebsoft/ai/service/AiCloudDocService.java @@ -46,4 +46,5 @@ public interface AiCloudDocService extends IService { */ List getSelfAndChildren(Integer docId); + Boolean createDocDirectories(Integer companyId, Integer userId, Integer projectId); } diff --git a/src/main/java/com/gxwebsoft/ai/service/AiCloudFileService.java b/src/main/java/com/gxwebsoft/ai/service/AiCloudFileService.java index 743a5b2..3cfa1b1 100644 --- a/src/main/java/com/gxwebsoft/ai/service/AiCloudFileService.java +++ b/src/main/java/com/gxwebsoft/ai/service/AiCloudFileService.java @@ -80,12 +80,12 @@ public interface AiCloudFileService extends IService { String getFileExtension(String filename); /** - * 获取公司知识库ID + * 获取知识库ID * * @param docId 文档ID * @return 知识库ID */ - String getCompanyKbId(Integer docId); + String getKbId(Integer docId); /** * 提交文档到知识库 diff --git a/src/main/java/com/gxwebsoft/ai/service/impl/AiCloudDocServiceImpl.java b/src/main/java/com/gxwebsoft/ai/service/impl/AiCloudDocServiceImpl.java index a3924f2..02597ab 100644 --- a/src/main/java/com/gxwebsoft/ai/service/impl/AiCloudDocServiceImpl.java +++ b/src/main/java/com/gxwebsoft/ai/service/impl/AiCloudDocServiceImpl.java @@ -1,16 +1,38 @@ package com.gxwebsoft.ai.service.impl; +import com.aliyun.bailian20231229.Client; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.ai.mapper.AiCloudDocMapper; import com.gxwebsoft.ai.service.AiCloudDocService; +import com.gxwebsoft.ai.util.AiCloudDataCenterUtil; +import com.gxwebsoft.ai.config.KnowledgeBaseConfig; import com.gxwebsoft.ai.entity.AiCloudDoc; +import com.gxwebsoft.ai.factory.KnowledgeBaseClientFactory; import com.gxwebsoft.ai.param.AiCloudDocParam; import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.system.entity.Dict; +import com.gxwebsoft.common.system.entity.DictData; +import com.gxwebsoft.common.system.param.DictDataParam; +import com.gxwebsoft.common.system.service.DictDataService; +import com.gxwebsoft.common.system.service.DictService; +import com.gxwebsoft.oa.entity.OaCompany; +import com.gxwebsoft.oa.service.OaCompanyService; +import com.gxwebsoft.pwl.entity.PwlProject; +import com.gxwebsoft.pwl.service.PwlProjectService; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; /** @@ -21,6 +43,24 @@ import java.util.stream.Collectors; @Service public class AiCloudDocServiceImpl extends ServiceImpl implements AiCloudDocService { + @Autowired + private KnowledgeBaseConfig config; + + @Autowired + private KnowledgeBaseClientFactory clientFactory; + + @Autowired + private DictService dictService; + + @Autowired + private DictDataService dictDataService; + + @Autowired + private PwlProjectService pwlProjectService; + + @Autowired + private OaCompanyService oaCompanyService; + @Override public PageResult pageRel(AiCloudDocParam param) { PageParam page = new PageParam<>(param); @@ -87,4 +127,138 @@ public class AiCloudDocServiceImpl extends ServiceImpl 0) { + PwlProject project = pwlProjectService.getById(projectId); + if (project != null) { + companyId = project.getCompanyId(); + } + } + + OaCompany oaCompany = oaCompanyService.getById(companyId); + if (oaCompany == null) { + return false; + } + String categoryId = getDocCategoryId(companyId, oaCompany.getCompanyName(), projectId); + if (StrUtil.isBlank(categoryId)) { + return false; + } + + // 1. 查询或创建顶级目录(避免重复) + AiCloudDoc topDirectory = this.getOne(new LambdaQueryWrapper() + .eq(AiCloudDoc::getCompanyId, companyId) + .eq(AiCloudDoc::getProjectId, projectId) + .eq(AiCloudDoc::getParentId, 0)); + if (topDirectory == null) { + topDirectory = new AiCloudDoc(); + topDirectory.setCategoryId(categoryId); + topDirectory.setProjectId(projectId); + topDirectory.setCompanyId(oaCompany.getCompanyId()); + topDirectory.setParentId(0); + topDirectory.setName(oaCompany.getCompanyName()); + topDirectory.setSortNumber(0); + topDirectory.setStatus(0); + topDirectory.setDeleted(0); + topDirectory.setUserId(userId); + topDirectory.setTenantId(oaCompany.getTenantId()); + topDirectory.setCreateTime(LocalDateTime.now()); + topDirectory.setUpdateTime(LocalDateTime.now()); + this.save(topDirectory); + } + Integer topDirId = topDirectory.getId(); + + // 2. 获取目录名称列表(优先字典) + List directoryNames = getDirectoryNames(); + + // 3. 查询已存在的子目录,只添加不存在的名称 + Set existingNames = this.list(new LambdaQueryWrapper() + .eq(AiCloudDoc::getParentId, topDirId) + .eq(AiCloudDoc::getCompanyId, companyId) + .eq(AiCloudDoc::getProjectId, projectId)) + .stream() + .map(AiCloudDoc::getName) + .collect(Collectors.toSet()); + + List newDirectories = new ArrayList<>(); + for (int i = 0; i < directoryNames.size(); i++) { + String name = directoryNames.get(i); + if (!existingNames.contains(name)) { + AiCloudDoc doc = new AiCloudDoc(); + doc.setCategoryId(categoryId); + doc.setProjectId(projectId); + doc.setCompanyId(oaCompany.getCompanyId()); + doc.setParentId(topDirId); + doc.setName(name); + doc.setSortNumber(i + 1); + doc.setStatus(0); + doc.setDeleted(0); + doc.setUserId(userId); + doc.setTenantId(oaCompany.getTenantId()); + doc.setCreateTime(LocalDateTime.now()); + doc.setUpdateTime(LocalDateTime.now()); + newDirectories.add(doc); + } + } + + if (!newDirectories.isEmpty()) { + return this.saveBatch(newDirectories); + } + return true; + } + + // 提取字典读取逻辑 + private List getDirectoryNames() { + List defaultNames = Arrays.asList( + "1.基本情况", "2.企业领导人员任职情况", "3.任期内年度总结报告", "4.公司章程及议事规则", + "5.领导班子分工", "6.任期内会议纪要与会议记录", "7.内部控制制度", "8.企业发展规划及战略", + "9.目标责任", "10-11.重大经济事项决策及执行(项目)", "12.固定资产、资产处置资料", + "13.财务数据", "14.以前年度审计" + ); + try { + Dict dict = dictService.getOne(new LambdaQueryWrapper().eq(Dict::getDictCode, "documentCategory")); + if (dict != null) { + DictDataParam param = new DictDataParam(); + param.setDictId(dict.getDictId()); + List dictDataList = dictDataService.listRel(param); + if (CollectionUtil.isNotEmpty(dictDataList)) { + return dictDataList.stream() + .map(DictData::getDictDataCode) + .collect(Collectors.toList()); + } + } + } catch (Exception e) { + // 忽略异常,使用默认列表 + e.printStackTrace(); + } + return defaultNames; + } + + // 修正获取 categoryId 的逻辑,避免空指针 + private String getDocCategoryId(Integer companyId, String companyName, Integer projectId) { + // 查询公司顶级目录(projectId=0, parentId=0) + AiCloudDoc docTop = this.getOne(new LambdaQueryWrapper() + .eq(AiCloudDoc::getCompanyId, companyId) + .eq(AiCloudDoc::getProjectId, 0) + .eq(AiCloudDoc::getParentId, 0)); + if (docTop != null) { + return docTop.getCategoryId(); + } + // 如果是项目目录,公司顶级目录必须已存在,否则返回空 + if (projectId != null && projectId > 0) { + return ""; + } + // 否则为公司创建新的远程分类 + String workspaceId = config.getWorkspaceId(); + String topCategoryId = config.getTopCategoryId(); + try { + Client client = clientFactory.createClient(); + return AiCloudDataCenterUtil.addCategory(client, workspaceId, topCategoryId, companyName) + .getBody().getData().getCategoryId(); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } } diff --git a/src/main/java/com/gxwebsoft/ai/service/impl/AiCloudFileServiceImpl.java b/src/main/java/com/gxwebsoft/ai/service/impl/AiCloudFileServiceImpl.java index c38d5a3..828d325 100644 --- a/src/main/java/com/gxwebsoft/ai/service/impl/AiCloudFileServiceImpl.java +++ b/src/main/java/com/gxwebsoft/ai/service/impl/AiCloudFileServiceImpl.java @@ -27,6 +27,8 @@ import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.oa.entity.OaCompany; import com.gxwebsoft.oa.service.OaCompanyService; +import com.gxwebsoft.pwl.entity.PwlProject; +import com.gxwebsoft.pwl.service.PwlProjectService; import javax.annotation.Resource; import java.time.LocalDateTime; @@ -53,6 +55,9 @@ public class AiCloudFileServiceImpl extends ServiceImpl 0) { + PwlProject project = pwlProjectService.getById(aiCloudDoc.getProjectId()); + return project != null && project.getKbId() != null ? project.getKbId() : ""; + } + //不为项目资料库则为公司库 OaCompany oaCompany = oaCompanyService.getById(aiCloudDoc.getCompanyId()); return oaCompany != null && oaCompany.getKbId() != null ? oaCompany.getKbId() : ""; } @@ -185,7 +196,7 @@ public class AiCloudFileServiceImpl extends ServiceImpl