|
@@ -6,11 +6,16 @@ import java.util.List;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import com.xzl.common.core.domain.TreeSelect;
|
|
|
+import com.xzl.common.core.domain.entity.KnowledgeFile;
|
|
|
import com.xzl.common.core.domain.entity.SysFileFolder;
|
|
|
import com.xzl.common.utils.DateUtils;
|
|
|
import com.xzl.common.utils.SecurityUtils;
|
|
|
import com.xzl.common.utils.StringUtils;
|
|
|
+import com.xzl.framework.web.domain.server.KnowledgeBaseFile;
|
|
|
+import com.xzl.framework.web.domain.server.KnowledgeBaseNode;
|
|
|
+import com.xzl.web.mapper.KnowledgeFileMapper;
|
|
|
import com.xzl.web.service.ISysFileFolderService;
|
|
|
+import org.apache.commons.collections.CollectionUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import com.xzl.web.mapper.SysFileFolderMapper;
|
|
@@ -24,6 +29,10 @@ import com.xzl.web.mapper.SysFileFolderMapper;
|
|
|
*/
|
|
|
@Service
|
|
|
public class SysFileFolderServiceImpl implements ISysFileFolderService {
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private KnowledgeFileMapper KnowledgeFileMapper;
|
|
|
private final SysFileFolderMapper sysFileFolderMapper;
|
|
|
|
|
|
@Autowired
|
|
@@ -162,7 +171,7 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
|
|
|
|
|
|
/**
|
|
|
* 查询文件夹树结构
|
|
|
- *
|
|
|
+ *
|
|
|
* @param sysFileFolder 查询条件对象,包含文件夹相关筛选条件
|
|
|
* @return 返回构建好的树形结构选择组件列表
|
|
|
* 每个元素包含节点ID、标签和子节点列表
|
|
@@ -253,4 +262,172 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
|
|
|
return sysFileFolderMapper.selectDeptIdByFolderId(folderId);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取知识库目录结构(Markdown格式)
|
|
|
+ */
|
|
|
+ public String getKnowledgeBaseStructure(Long folderId) {
|
|
|
+ // 获取指定文件夹及其所有子文件夹
|
|
|
+ List<SysFileFolder> allFolders = getFolderTree(folderId);
|
|
|
+
|
|
|
+ // 获取所有相关文件
|
|
|
+ List<Long> folderIds = allFolders.stream()
|
|
|
+ .map(SysFileFolder::getFolderId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ List<KnowledgeFile> allFiles = CollectionUtils.isEmpty(folderIds) ?
|
|
|
+ new ArrayList<>() :
|
|
|
+ KnowledgeFileMapper.selectFilesByFolderIds(folderIds);
|
|
|
+
|
|
|
+ // 构建树形结构
|
|
|
+ KnowledgeBaseNode root = buildKnowledgeBaseTree(allFolders, allFiles);
|
|
|
+
|
|
|
+ // 生成Markdown内容
|
|
|
+ return generateMarkdownContent(root);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 递归获取文件夹树
|
|
|
+ */
|
|
|
+ private List<SysFileFolder> getFolderTree(Long folderId) {
|
|
|
+ List<SysFileFolder> result = new ArrayList<>();
|
|
|
+
|
|
|
+ // 获取当前文件夹
|
|
|
+ SysFileFolder currentFolder = sysFileFolderMapper.selectSysFileFolderByFolderId(folderId);
|
|
|
+ if (currentFolder != null && "0".equals(currentFolder.getDelFlag()) && "0".equals(currentFolder.getStatus())) {
|
|
|
+ result.add(currentFolder);
|
|
|
+
|
|
|
+ // 递归获取子文件夹
|
|
|
+ List<SysFileFolder> children = sysFileFolderMapper.selectChildrenFolders(folderId);
|
|
|
+ for (SysFileFolder child : children) {
|
|
|
+ result.addAll(getFolderTree(child.getFolderId()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建知识库树形结构
|
|
|
+ */
|
|
|
+ private KnowledgeBaseNode buildKnowledgeBaseTree(List<SysFileFolder> folders, List<KnowledgeFile> files) {
|
|
|
+ if (CollectionUtils.isEmpty(folders)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 找出根文件夹
|
|
|
+ SysFileFolder rootFolder = folders.stream()
|
|
|
+ .filter(folder -> folder.getParentId() == 0)
|
|
|
+ .findFirst()
|
|
|
+ .orElse(folders.get(0));
|
|
|
+
|
|
|
+ KnowledgeBaseNode rootNode = new KnowledgeBaseNode(rootFolder);
|
|
|
+
|
|
|
+ // 构建树形结构
|
|
|
+ buildTreeRecursive(rootNode, folders, files);
|
|
|
+
|
|
|
+ return rootNode;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 递归构建树形结构
|
|
|
+ */
|
|
|
+ private void buildTreeRecursive(KnowledgeBaseNode parentNode, List<SysFileFolder> folders, List<KnowledgeFile> files) {
|
|
|
+ // 找出当前节点的子文件夹
|
|
|
+ List<SysFileFolder> childFolders = folders.stream()
|
|
|
+ .filter(folder -> folder.getParentId().equals(parentNode.getFolderId()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ for (SysFileFolder childFolder : childFolders) {
|
|
|
+ KnowledgeBaseNode childNode = new KnowledgeBaseNode(childFolder);
|
|
|
+ parentNode.getChildren().add(childNode);
|
|
|
+ buildTreeRecursive(childNode, folders, files);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加文件到当前节点
|
|
|
+ List<KnowledgeBaseFile> nodeFiles = files.stream()
|
|
|
+ .filter(file -> file.getFolderId().equals(parentNode.getFolderId()))
|
|
|
+ .map(this::convertToKnowledgeBaseFile)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ parentNode.getFiles().addAll(nodeFiles);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换SysFile到KnowledgeBaseFile
|
|
|
+ */
|
|
|
+ private KnowledgeBaseFile convertToKnowledgeBaseFile(KnowledgeFile file) {
|
|
|
+ KnowledgeBaseFile knowledgeBaseFile = new KnowledgeBaseFile();
|
|
|
+ knowledgeBaseFile.setFileId(file.getFileId());
|
|
|
+ knowledgeBaseFile.setFileName(file.getFileName());
|
|
|
+ knowledgeBaseFile.setFileType(file.getFileType());
|
|
|
+ knowledgeBaseFile.setFileSize(file.getFileSize());
|
|
|
+ knowledgeBaseFile.setFilePath(file.getFilePath());
|
|
|
+ knowledgeBaseFile.setFolderId(file.getFolderId());
|
|
|
+ return knowledgeBaseFile;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成Markdown内容
|
|
|
+ */
|
|
|
+ private String generateMarkdownContent(KnowledgeBaseNode root) {
|
|
|
+ StringBuilder markdown = new StringBuilder();
|
|
|
+ generateMarkdownRecursive(root, markdown, 0);
|
|
|
+ return markdown.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 递归生成Markdown内容
|
|
|
+ */
|
|
|
+ private void generateMarkdownRecursive(KnowledgeBaseNode node, StringBuilder markdown, int depth) {
|
|
|
+ if (node == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 使用自定义的 repeat 方法
|
|
|
+ String indent = repeatString(" ", depth);
|
|
|
+ markdown.append(indent).append("- ").append(node.getFolderName()).append("\n");
|
|
|
+
|
|
|
+ // 添加文件列表
|
|
|
+ for (KnowledgeBaseFile file : node.getFiles()) {
|
|
|
+ String fileIndent = repeatString(" ", depth + 1);
|
|
|
+ markdown.append(fileIndent).append("- ");
|
|
|
+ markdown.append(file.getFileName());
|
|
|
+// if (file.getFileType() != null && !file.getFileType().isEmpty()) {
|
|
|
+// markdown.append(" (.").append(file.getFileType()).append(")");
|
|
|
+// }
|
|
|
+ markdown.append("\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 递归处理子文件夹
|
|
|
+ for (KnowledgeBaseNode child : node.getChildren()) {
|
|
|
+ generateMarkdownRecursive(child, markdown, depth + 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取知识库树形结构(用于前端展示)
|
|
|
+ */
|
|
|
+ public KnowledgeBaseNode getKnowledgeBaseTree(Long folderId) {
|
|
|
+ List<SysFileFolder> allFolders = getFolderTree(folderId);
|
|
|
+ List<Long> folderIds = allFolders.stream()
|
|
|
+ .map(SysFileFolder::getFolderId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ List<KnowledgeFile> allFiles = CollectionUtils.isEmpty(folderIds) ?
|
|
|
+ new ArrayList<>() :
|
|
|
+ KnowledgeFileMapper.selectFilesByFolderIds(folderIds);
|
|
|
+
|
|
|
+ return buildKnowledgeBaseTree(allFolders, allFiles);
|
|
|
+ }
|
|
|
+
|
|
|
+ private String repeatString(String str, int count) {
|
|
|
+ if (count <= 0) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ StringBuilder result = new StringBuilder();
|
|
|
+ for (int i = 0; i < count; i++) {
|
|
|
+ result.append(str);
|
|
|
+ }
|
|
|
+ return result.toString();
|
|
|
+ }
|
|
|
}
|