新增项目创建/更新时,添加项目目录

This commit is contained in:
2026-05-21 11:10:30 +08:00
parent d129029178
commit ab93c46f64
7 changed files with 224 additions and 7 deletions

View File

@@ -46,4 +46,5 @@ public interface AiCloudDocService extends IService<AiCloudDoc> {
*/
List<AiCloudDoc> getSelfAndChildren(Integer docId);
Boolean createDocDirectories(Integer companyId, Integer userId, Integer projectId);
}

View File

@@ -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);
/**
* 提交文档到知识库

View File

@@ -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 "";
}
}
}

View File

@@ -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();

View File

@@ -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());
}

View File

@@ -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();

View File

@@ -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("修改成功");
}