新增项目创建/更新时,添加项目目录
This commit is contained in:
@@ -46,4 +46,5 @@ public interface AiCloudDocService extends IService<AiCloudDoc> {
|
||||
*/
|
||||
List<AiCloudDoc> getSelfAndChildren(Integer docId);
|
||||
|
||||
Boolean createDocDirectories(Integer companyId, Integer userId, Integer projectId);
|
||||
}
|
||||
|
||||
@@ -80,12 +80,12 @@ public interface AiCloudFileService extends IService<AiCloudFile> {
|
||||
String getFileExtension(String filename);
|
||||
|
||||
/**
|
||||
* 获取公司知识库ID
|
||||
* 获取知识库ID
|
||||
*
|
||||
* @param docId 文档ID
|
||||
* @return 知识库ID
|
||||
*/
|
||||
String getCompanyKbId(Integer docId);
|
||||
String getKbId(Integer docId);
|
||||
|
||||
/**
|
||||
* 提交文档到知识库
|
||||
|
||||
@@ -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<AiCloudDocMapper, AiCloudDoc> 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<AiCloudDoc> pageRel(AiCloudDocParam param) {
|
||||
PageParam<AiCloudDoc, AiCloudDocParam> page = new PageParam<>(param);
|
||||
@@ -87,4 +127,138 @@ public class AiCloudDocServiceImpl extends ServiceImpl<AiCloudDocMapper, AiCloud
|
||||
getChildrenRecursive(allDocs, child.getId(), result);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean createDocDirectories(Integer companyId, Integer userId, Integer projectId) {
|
||||
if (companyId == null && projectId != null && projectId > 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<AiCloudDoc>()
|
||||
.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<String> directoryNames = getDirectoryNames();
|
||||
|
||||
// 3. 查询已存在的子目录,只添加不存在的名称
|
||||
Set<String> existingNames = this.list(new LambdaQueryWrapper<AiCloudDoc>()
|
||||
.eq(AiCloudDoc::getParentId, topDirId)
|
||||
.eq(AiCloudDoc::getCompanyId, companyId)
|
||||
.eq(AiCloudDoc::getProjectId, projectId))
|
||||
.stream()
|
||||
.map(AiCloudDoc::getName)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
List<AiCloudDoc> 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<String> getDirectoryNames() {
|
||||
List<String> defaultNames = Arrays.asList(
|
||||
"1.基本情况", "2.企业领导人员任职情况", "3.任期内年度总结报告", "4.公司章程及议事规则",
|
||||
"5.领导班子分工", "6.任期内会议纪要与会议记录", "7.内部控制制度", "8.企业发展规划及战略",
|
||||
"9.目标责任", "10-11.重大经济事项决策及执行(项目)", "12.固定资产、资产处置资料",
|
||||
"13.财务数据", "14.以前年度审计"
|
||||
);
|
||||
try {
|
||||
Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>().eq(Dict::getDictCode, "documentCategory"));
|
||||
if (dict != null) {
|
||||
DictDataParam param = new DictDataParam();
|
||||
param.setDictId(dict.getDictId());
|
||||
List<DictData> 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<AiCloudDoc>()
|
||||
.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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<AiCloudFileMapper, AiClo
|
||||
@Resource
|
||||
private AiCloudDocService aiCloudDocService;
|
||||
|
||||
@Resource
|
||||
private PwlProjectService pwlProjectService;
|
||||
|
||||
@Resource
|
||||
@Lazy
|
||||
private OaCompanyService oaCompanyService;
|
||||
@@ -168,7 +173,7 @@ public class AiCloudFileServiceImpl extends ServiceImpl<AiCloudFileMapper, AiClo
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCompanyKbId(Integer docId) {
|
||||
public String getKbId(Integer docId) {
|
||||
if (docId == null) {
|
||||
return "";
|
||||
}
|
||||
@@ -176,6 +181,12 @@ public class AiCloudFileServiceImpl extends ServiceImpl<AiCloudFileMapper, AiClo
|
||||
if (aiCloudDoc == null || aiCloudDoc.getCompanyId() == null) {
|
||||
return "";
|
||||
}
|
||||
//优先判断目录是否为项目资料库
|
||||
if (aiCloudDoc.getProjectId() != null && aiCloudDoc.getProjectId() > 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<AiCloudFileMapper, AiClo
|
||||
if (docId == null || fileIds == null || fileIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
String kbId = getCompanyKbId(docId);
|
||||
String kbId = getKbId(docId);
|
||||
if (kbId == null || kbId.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
@@ -210,7 +221,7 @@ public class AiCloudFileServiceImpl extends ServiceImpl<AiCloudFileMapper, AiClo
|
||||
}
|
||||
|
||||
// 同时删除默认知识库文件
|
||||
String kbId = getCompanyKbId(aiCloudFile.getDocId());
|
||||
String kbId = getKbId(aiCloudFile.getDocId());
|
||||
if (!kbId.isEmpty()) {
|
||||
try {
|
||||
String workspaceId = config.getWorkspaceId();
|
||||
|
||||
@@ -12,6 +12,7 @@ import com.gxwebsoft.common.core.web.PageResult;
|
||||
import com.gxwebsoft.common.core.web.PageParam;
|
||||
import com.gxwebsoft.common.core.web.BatchParam;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.gxwebsoft.ai.service.AiCloudDocService;
|
||||
import com.gxwebsoft.ai.service.KnowledgeBaseService;
|
||||
import com.gxwebsoft.common.core.annotation.OperationLog;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -39,6 +40,9 @@ public class OaCompanyController extends BaseController {
|
||||
|
||||
@Autowired
|
||||
private KnowledgeBaseService knowledgeBaseService;
|
||||
|
||||
@Autowired
|
||||
private AiCloudDocService aiCloudDocService;
|
||||
|
||||
@Operation(summary = "分页查询企业信息")
|
||||
@GetMapping("/page")
|
||||
@@ -82,8 +86,9 @@ public class OaCompanyController extends BaseController {
|
||||
// 绑定知识库
|
||||
oaCompany.setKbId(kbId);
|
||||
oaCompanyService.updateById(oaCompany);
|
||||
// 初始化11个目录 - 调用Service层方法
|
||||
oaCompanyService.initCompanyDocDirectories(oaCompany, getLoginUserId());
|
||||
// 初始化公司库目录,创建阿里云文件管理目录
|
||||
// oaCompanyService.initCompanyDocDirectories(oaCompany, getLoginUserId());
|
||||
aiCloudDocService.createDocDirectories(oaCompany.getCompanyId(), getLoginUserId(), 0);
|
||||
} catch (Exception e) {
|
||||
return fail("添加失败:"+e.getMessage());
|
||||
}
|
||||
|
||||
@@ -89,6 +89,7 @@ public class OaCompanyServiceImpl extends ServiceImpl<OaCompanyMapper, OaCompany
|
||||
return param.getOne(baseMapper.selectListRel(param));
|
||||
}
|
||||
|
||||
// 弃用,改用aiCloudDocService.createDocDirectories,后续删除
|
||||
@Override
|
||||
public void initCompanyDocDirectories(OaCompany oaCompany, Integer userId) {
|
||||
String workspaceId = config.getWorkspaceId();
|
||||
|
||||
@@ -7,6 +7,7 @@ import cn.hutool.core.util.RandomUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.gxwebsoft.ai.service.AiCloudDocService;
|
||||
import com.gxwebsoft.ai.service.KnowledgeBaseService;
|
||||
import com.gxwebsoft.cms.entity.CmsArticle;
|
||||
import com.gxwebsoft.cms.entity.CmsArticleContent;
|
||||
@@ -59,6 +60,9 @@ public class PwlProjectController extends BaseController {
|
||||
|
||||
@Autowired
|
||||
private KnowledgeBaseService knowledgeBaseService;
|
||||
|
||||
@Autowired
|
||||
private AiCloudDocService aiCloudDocService;
|
||||
|
||||
@PreAuthorize("hasAuthority('pwl:pwlProject:list')")
|
||||
@Operation(summary = "分页查询卫兰的项目项目系统")
|
||||
@@ -118,6 +122,8 @@ public class PwlProjectController extends BaseController {
|
||||
}
|
||||
}
|
||||
if (pwlProjectService.save(pwlProject)) {
|
||||
aiCloudDocService.createDocDirectories(pwlProject.getCompanyId(), getLoginUserId(), pwlProject.getId());
|
||||
createKbId(pwlProject);
|
||||
createAnalysisLib(pwlProject);
|
||||
createProjectLib(pwlProject);
|
||||
pwlProjectService.updateById(pwlProject);
|
||||
@@ -126,6 +132,21 @@ public class PwlProjectController extends BaseController {
|
||||
return fail("添加失败");
|
||||
}
|
||||
|
||||
//创建项目资料库
|
||||
private void createKbId(PwlProject pwlProject) {
|
||||
if(StrUtil.isEmpty(pwlProject.getCode())) {
|
||||
return ;
|
||||
}
|
||||
try {
|
||||
String name = "项目-"+pwlProject.getName();
|
||||
String code = "PID-" + StrUtil.padPre(pwlProject.getId().toString(), 11, '0');
|
||||
String kbId = knowledgeBaseService.createKnowledgeBase(name, code);
|
||||
pwlProject.setKbId(kbId);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
//创建材料分析库
|
||||
private void createAnalysisLib(PwlProject pwlProject) {
|
||||
if(StrUtil.isEmpty(pwlProject.getCode())) {
|
||||
@@ -173,6 +194,10 @@ public class PwlProjectController extends BaseController {
|
||||
if(StrUtil.isEmpty(pwlProject.getProjectLibrary())) {
|
||||
createProjectLib(pwlProject);
|
||||
}
|
||||
if(StrUtil.isEmpty(pwlProject.getKbId())) {
|
||||
aiCloudDocService.createDocDirectories(pwlProject.getCompanyId(), getLoginUserId(), pwlProject.getId());
|
||||
createKbId(pwlProject);
|
||||
}
|
||||
if (pwlProjectService.updateById(pwlProject)) {
|
||||
return success("修改成功");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user