同步平台业务模块能力

This commit is contained in:
baiyanyun
2026-07-13 09:13:30 +08:00
parent e612f5e434
commit a1a38f62d8
224 changed files with 22331 additions and 1224 deletions

View File

@@ -1,16 +1,31 @@
package com.xspaceagi.knowledge.api;
import com.xspaceagi.knowledge.core.spec.enums.KnowledgeDataTypeEnum;
import com.xspaceagi.knowledge.domain.model.KnowledgeDocumentModel;
import com.xspaceagi.knowledge.domain.service.IKnowledgeDocumentDomainService;
import com.xspaceagi.knowledge.domain.service.impl.KnowledgeConfigDomainService;
import com.xspaceagi.knowledge.sdk.enums.KnowledgePubStatusEnum;
import com.xspaceagi.knowledge.sdk.request.KnowledgeDocumentRequestVo;
import com.xspaceagi.knowledge.sdk.response.KnowledgeDocumentResponseVo;
import com.xspaceagi.knowledge.sdk.sevice.IKnowledgeDocumentSearchRpcService;
import com.xspaceagi.knowledge.sdk.vo.DocumentAddRequestVo;
import com.xspaceagi.knowledge.sdk.vo.SegmentConfigModel;
import com.xspaceagi.system.domain.log.LogRecordPrint;
import com.xspaceagi.system.spec.common.UserContext;
import com.xspaceagi.system.spec.exception.BizExceptionCodeEnum;
import com.xspaceagi.system.spec.exception.KnowledgeException;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Objects;
@Slf4j
@Service
public class KnowledgeDocumentSearchRpcService implements IKnowledgeDocumentSearchRpcService {
@@ -18,6 +33,9 @@ public class KnowledgeDocumentSearchRpcService implements IKnowledgeDocumentSear
@Resource
private IKnowledgeDocumentDomainService knowledgeDocumentDomainService;
@Resource
private KnowledgeConfigDomainService knowledgeConfigDomainService;
@LogRecordPrint(content = "[知识库文档]-根据知识库id查询文档")
@Override
@@ -30,4 +48,74 @@ public class KnowledgeDocumentSearchRpcService implements IKnowledgeDocumentSear
responseVo.setDocumentVoList(ans);
return responseVo;
}
@Override
public Long documentAdd(DocumentAddRequestVo documentAddRequestVo) {
// 查询基础配置,补全基础信息
var knowledgeConfig = this.knowledgeConfigDomainService.queryOneInfoById(documentAddRequestVo.getKbId());
if (Objects.isNull(knowledgeConfig)) {
throw KnowledgeException.build(BizExceptionCodeEnum.resourceDataNotFound);
}
KnowledgeDocumentModel knowledgeDocumentModel = new KnowledgeDocumentModel();
knowledgeDocumentModel.setTenantId(knowledgeConfig.getTenantId());
knowledgeDocumentModel.setCreatorId(knowledgeConfig.getCreatorId());
knowledgeDocumentModel.setCreatorName(knowledgeConfig.getCreatorName());
knowledgeDocumentModel.setSpaceId(knowledgeConfig.getSpaceId());
knowledgeDocumentModel.setId(null);
knowledgeDocumentModel.setKbId(documentAddRequestVo.getKbId());
knowledgeDocumentModel.setName(documentAddRequestVo.getName());
knowledgeDocumentModel.setDocUrl(documentAddRequestVo.getDocUrl());
knowledgeDocumentModel.setPubStatus(KnowledgePubStatusEnum.Waiting);
knowledgeDocumentModel.setHasQa(Boolean.FALSE);
knowledgeDocumentModel.setHasEmbedding(Boolean.FALSE);
SegmentConfigModel segmentConfig = SegmentConfigModel.obtainDefaultModel();
segmentConfig.setSegment(documentAddRequestVo.getSegment());
segmentConfig.setWords(documentAddRequestVo.getWords());
segmentConfig.setIsTrim(true);
segmentConfig.setOverlaps(10);
knowledgeDocumentModel.setSegmentConfig(segmentConfig);
//默认 url地址的方式记录存储
knowledgeDocumentModel.setDataType(StringUtils.isNotBlank(documentAddRequestVo.getDocUrl()) ? KnowledgeDataTypeEnum.URL_FILE.getCode() : KnowledgeDataTypeEnum.CUSTOM_TEXT.getCode());
if (KnowledgeDataTypeEnum.URL_FILE.getCode().equals(knowledgeDocumentModel.getDataType())) {
try {
knowledgeDocumentModel.setFileSize(getFileSize(documentAddRequestVo.getDocUrl()));
} catch (Exception e) {
log.warn("获取文件大小失败 {}", documentAddRequestVo.getDocUrl(), e);
}
} else {
knowledgeDocumentModel.setFileContent(documentAddRequestVo.getFileContent());
}
UserContext userContext = UserContext.builder()
.userId(knowledgeConfig.getCreatorId())
.userName(knowledgeConfig.getCreatorName())
.tenantId(knowledgeConfig.getTenantId())
.build();
var id = this.knowledgeDocumentDomainService.customAddInfo(knowledgeDocumentModel, userContext);
// 触发更新知识库文件预估大小值
this.knowledgeDocumentDomainService.triggerUpdateKnowledgeFileSize(knowledgeDocumentModel.getKbId());
return id;
}
/**
* 获取远程文件大小(字节)
*/
public static long getFileSize(String fileUrl) throws IOException, URISyntaxException {
URL url = new URI(fileUrl).toURL();
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("HEAD"); // 只获取头信息,不下载内容
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
int code = conn.getResponseCode();
if (code != HttpURLConnection.HTTP_OK) {
throw new IOException("请求失败HTTP状态码: " + code);
}
long size = conn.getContentLengthLong();
conn.disconnect();
return size;
}
}

View File

@@ -35,8 +35,8 @@ public class FileParseService {
List<String> segments = null;
int words = segmentConfig.getWords();
int overlaps = segmentConfig.getOverlaps();
int words = segmentConfig.getWords() == null ? 800 : segmentConfig.getWords();
int overlaps = segmentConfig.getOverlaps() == null ? 10 : segmentConfig.getOverlaps();
if (segmentConfig.getSegment().equals(SegmentEnum.WORDS)) {
List<String> contents = new ArrayList<>(1);

View File

@@ -2,6 +2,7 @@ package com.xspaceagi.knowledge.sdk.sevice;
import com.xspaceagi.knowledge.sdk.request.KnowledgeDocumentRequestVo;
import com.xspaceagi.knowledge.sdk.response.KnowledgeDocumentResponseVo;
import com.xspaceagi.knowledge.sdk.vo.DocumentAddRequestVo;
/**
* Q&A搜索接口
@@ -15,6 +16,13 @@ public interface IKnowledgeDocumentSearchRpcService {
* @param requestVo 搜索参数
* @return 列表
*/
public KnowledgeDocumentResponseVo documentSearch(KnowledgeDocumentRequestVo requestVo);
KnowledgeDocumentResponseVo documentSearch(KnowledgeDocumentRequestVo requestVo);
/**
* 文档添加
*
* @param documentAddRequestVo 文档添加参数
* @return 文档id
*/
Long documentAdd(DocumentAddRequestVo documentAddRequestVo);
}

View File

@@ -0,0 +1,36 @@
package com.xspaceagi.knowledge.sdk.vo;
import com.xspaceagi.knowledge.sdk.enums.SegmentEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
@Data
public class DocumentAddRequestVo implements Serializable {
@Schema(description = "知识库ID", requiredMode = Schema.RequiredMode.REQUIRED)
private Long kbId;
@Schema(description = "文档名称")
private String name;
@Schema(description = "文件内容")
private String fileContent;
@Schema(description = "文件URL")
private String docUrl;
@Schema(description = "分段类型words: 按照词数分段, delimiter: 按照分隔符分段field: 按照字段分段")
private SegmentEnum segment;
@Schema(description = "分段最大字符数选择words或delimiter时有效")
private Integer words;
@Schema(description = "用户ID")
private Long userId;
@Schema(description = "用户名称")
private String userName;
}