知识库初始化

This commit is contained in:
2025-12-20 12:03:26 +08:00
parent 566d03491b
commit 1498b91bcf
9 changed files with 3562 additions and 34 deletions

View File

@@ -65,7 +65,7 @@ INSERT INTO config.tb_sys_config (
-- Dify AI 配置 -- Dify AI 配置
-- Dify 基础配置 -- Dify 基础配置
('CFG-0450', 'cfg_dify_api_base', 'dify.apiBaseUrl', 'Dify API地址', 'http://localhost:8000/v1', 'String', 'input', 'Dify API基础地址', NULL, NULL, 'dify', 'mod_agent', 10, 1, 'Dify服务的API基础地址如 http://localhost/dify/api', 'system', NULL, NULL, now(), NULL, NULL, false), ('CFG-0450', 'cfg_dify_api_base', 'dify.apiBaseUrl', 'Dify API地址', 'http://localhost:8000/v1', 'String', 'input', 'Dify API基础地址', NULL, NULL, 'dify', 'mod_agent', 10, 1, 'Dify服务的API基础地址如 http://localhost/dify/api', 'system', NULL, NULL, now(), NULL, NULL, false),
('CFG-0452', 'cfg_dify_knowledge_key','dify.knowledgeApiKey', '知识库API密钥', 'dataset-nupqKP4LONpzdXmGthIrbjeJ', 'String', 'password', '知识库API密钥', NULL, NULL, 'dify', 'mod_agent', 30, 1, '用于访问Dify知识库的API密钥', 'system', NULL, NULL, now(), NULL, NULL, false), ('CFG-0452', 'cfg_dify_knowledge_key','dify.knowledgeApiKey', '知识库API密钥', 'dataset-LepcmgOE95n2S7yweNhQzNoB', 'String', 'password', '知识库API密钥', NULL, NULL, 'dify', 'mod_agent', 30, 1, '用于访问Dify知识库的API密钥', 'system', NULL, NULL, now(), NULL, NULL, false),
('CFG-0453', 'cfg_dify_timeout', 'dify.timeout', '请求超时时间', '60', 'INTEGER', 'input', '请求超时时间(秒)', NULL, NULL, 'dify', 'mod_agent', 40, 1, 'API请求的超时时间10-600秒', 'system', NULL, NULL, now(), NULL, NULL, false), ('CFG-0453', 'cfg_dify_timeout', 'dify.timeout', '请求超时时间', '60', 'INTEGER', 'input', '请求超时时间(秒)', NULL, NULL, 'dify', 'mod_agent', 40, 1, 'API请求的超时时间10-600秒', 'system', NULL, NULL, now(), NULL, NULL, false),
('CFG-0454', 'cfg_dify_conn_timeout','dify.connectTimeout', '连接超时时间', '10', 'INTEGER', 'input', '连接超时时间(秒)', NULL, NULL, 'dify', 'mod_agent', 50, 1, 'API连接的超时时间5-60秒', 'system', NULL, NULL, now(), NULL, NULL, false), ('CFG-0454', 'cfg_dify_conn_timeout','dify.connectTimeout', '连接超时时间', '10', 'INTEGER', 'input', '连接超时时间(秒)', NULL, NULL, 'dify', 'mod_agent', 50, 1, 'API连接的超时时间5-60秒', 'system', NULL, NULL, now(), NULL, NULL, false),
('CFG-0455', 'cfg_dify_read_timeout','dify.readTimeout', '读取超时时间', '60', 'INTEGER', 'input', '读取超时时间(秒)', NULL, NULL, 'dify', 'mod_agent', 60, 1, 'API读取响应的超时时间10-600秒', 'system', NULL, NULL, now(), NULL, NULL, false), ('CFG-0455', 'cfg_dify_read_timeout','dify.readTimeout', '读取超时时间', '60', 'INTEGER', 'input', '读取超时时间(秒)', NULL, NULL, 'dify', 'mod_agent', 60, 1, 'API读取响应的超时时间10-600秒', 'system', NULL, NULL, now(), NULL, NULL, false),
@@ -76,8 +76,14 @@ INSERT INTO config.tb_sys_config (
('CFG-0461', 'cfg_dify_upload_max', 'dify.upload.maxSize', '最大文件大小', '50', 'INTEGER', 'input', '最大文件大小MB', NULL, NULL, 'dify', 'mod_agent', 90, 1, '单个文件上传的最大大小限制1-500MB', 'system', NULL, NULL, now(), NULL, NULL, false), ('CFG-0461', 'cfg_dify_upload_max', 'dify.upload.maxSize', '最大文件大小', '50', 'INTEGER', 'input', '最大文件大小MB', NULL, NULL, 'dify', 'mod_agent', 90, 1, '单个文件上传的最大大小限制1-500MB', 'system', NULL, NULL, now(), NULL, NULL, false),
-- Dify 知识库配置 -- Dify 知识库配置
('CFG-0470', 'cfg_dify_index_tech', 'dify.dataset.defaultIndexingTechnique','默认索引方式', 'high_quality', 'String', 'select', '默认索引方式', NULL, '["high_quality", "economy"]'::json, 'dify', 'mod_agent', 100, 1, '知识库文档的默认索引方式high_quality高质量或 economy经济', 'system', NULL, NULL, now(), NULL, NULL, false), ('CFG-0470', 'cfg_dify_index_tech', 'dify.knowledge.indexing.tchnique','默认索引方式', 'high_quality', 'String', 'select', '默认索引方式', NULL, '["high_quality", "economy"]'::json, 'dify', 'mod_agent', 100, 1, '知识库文档的默认索引方式high_quality高质量或 economy经济', 'system', NULL, NULL, now(), NULL, NULL, false),
('CFG-0471', 'cfg_dify_embed_model', 'dify.dataset.defaultEmbeddingModel','默认Embedding模型', 'text-embedding-ada-002', 'String', 'input', '默认Embedding模型', NULL, NULL, 'dify', 'mod_agent', 110, 1, '知识库使用的默认Embedding模型名称', 'system', NULL, NULL, now(), NULL, NULL, false), ('CFG-0471', 'cfg_dify_embed_model', 'dify.knowledge.embedding.model','默认Embedding模型', 'Qwen/Qwen3-Embedding-8B', 'String', 'input', '默认Embedding模型', NULL, NULL, 'dify', 'mod_agent', 110, 1, '知识库使用的默认Embedding模型名称', 'system', NULL, NULL, now(), NULL, NULL, false),
('CFG-0472', 'cfg_dify_embed_provider', 'dify.knowledge.embedding.model.provider','Embedding模型供应商', 'langgenius/siliconflow/siliconflow', 'String', 'input', 'Embedding模型供应商', NULL, NULL, 'dify', 'mod_agent', 120, 1, 'Embedding模型的供应商标识', 'system', NULL, NULL, now(), NULL, NULL, false),
('CFG-0473', 'cfg_dify_rerank_enable', 'dify.knowledge.reranking.enable','启用Rerank', 'true', 'BOOLEAN', 'switch', '是否启用Rerank重排序', NULL, NULL, 'dify', 'mod_agent', 130, 1, '启用后会对检索结果进行重排序提升相关性', 'system', NULL, NULL, now(), NULL, NULL, false),
('CFG-0474', 'cfg_dify_rerank_model', 'dify.knowledge.rerank.model','Rerank模型', 'Qwen/Qwen3-Reranker-8B', 'String', 'input', 'Rerank重排序模型', NULL, NULL, 'dify', 'mod_agent', 140, 1, '知识库使用的Rerank模型名称', 'system', NULL, NULL, now(), NULL, NULL, false),
('CFG-0475', 'cfg_dify_rerank_provider', 'dify.knowledge.rerank.model.provider','Rerank模型供应商', 'langgenius/siliconflow/siliconflow', 'String', 'input', 'Rerank模型供应商', NULL, NULL, 'dify', 'mod_agent', 150, 1, 'Rerank模型的供应商标识', 'system', NULL, NULL, now(), NULL, NULL, false),
('CFG-0476', 'cfg_dify_retrieval_topk', 'dify.knowledge.retrieval.top.k','检索TopK', '5', 'INTEGER', 'input', '检索返回的最大文档数', NULL, NULL, 'dify', 'mod_agent', 160, 1, '知识库检索时返回的最相关文档数量1-20', 'system', NULL, NULL, now(), NULL, NULL, false),
('CFG-0477', 'cfg_dify_retrieval_threshold', 'dify.knowledge.retrieval.score.threshold','相似度阈值', '0.5', 'DOUBLE', 'input', '检索相似度阈值', NULL, NULL, 'dify', 'mod_agent', 170, 1, '低于此阈值的文档将被过滤0.0-1.0', 'system', NULL, NULL, now(), NULL, NULL, false),
-- 日志与审计 -- 日志与审计
('CFG-0501', 'cfg_log_level', 'log.level', '日志级别', 'INFO', 'String', 'select', '系统日志级别', NULL, '["DEBUG", "INFO", "WARN", "ERROR"]'::json, 'log', 'mod_system', 10, 0, 'DEBUG/INFO/WARN/ERROR', 'system', NULL, NULL, now(), NULL, NULL, false), ('CFG-0501', 'cfg_log_level', 'log.level', '日志级别', 'INFO', 'String', 'select', '系统日志级别', NULL, '["DEBUG", "INFO", "WARN", "ERROR"]'::json, 'log', 'mod_system', 10, 0, 'DEBUG/INFO/WARN/ERROR', 'system', NULL, NULL, now(), NULL, NULL, false),

View File

@@ -20,6 +20,7 @@ import org.xyzh.api.ai.service.AIFileUploadService;
import org.xyzh.api.ai.service.KnowledgeService; import org.xyzh.api.ai.service.KnowledgeService;
import org.xyzh.api.file.dto.TbSysFileDTO; import org.xyzh.api.file.dto.TbSysFileDTO;
import org.xyzh.api.file.service.FileService; import org.xyzh.api.file.service.FileService;
import org.xyzh.common.core.domain.LoginDomain;
import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageParam; import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.utils.id.IdUtil; import org.xyzh.common.utils.id.IdUtil;
@@ -75,12 +76,14 @@ public class KnowledgeServiceImpl implements KnowledgeService {
} }
// 2. 获取当前用户 // 2. 获取当前用户
String userId = LoginUtil.getCurrentUserId(); LoginDomain loginDomain = LoginUtil.getCurrentLogin();
if (!StringUtils.hasText(userId)) { if (loginDomain == null || !StringUtils.hasText(loginDomain.getUser().getUserId())) {
return ResultDomain.failure("用户未登录"); return ResultDomain.failure("用户未登录");
} }
String userId = loginDomain.getUser().getUserId();
// 3. 生成ID // 3. 生成ID
knowledge.setDeptPath(loginDomain.getUserDepts().get(0).getDeptPath());
knowledge.setOptsn(IdUtil.getOptsn()); knowledge.setOptsn(IdUtil.getOptsn());
knowledge.setKnowledgeId(IdUtil.getSnowflakeId()); knowledge.setKnowledgeId(IdUtil.getSnowflakeId());
knowledge.setCreator(userId); knowledge.setCreator(userId);
@@ -126,6 +129,73 @@ public class KnowledgeServiceImpl implements KnowledgeService {
return ResultDomain.failure("创建知识库失败"); return ResultDomain.failure("创建知识库失败");
} }
/**
* @description 内部创建知识库(不检查登录状态,用于系统初始化)
* 注意调用方需要自行设置knowledgeId和creator
* @param knowledge 知识库信息
* @return ResultDomain<TbKnowledge> 创建结果
* @author yslg
* @since 2025-12-20
*/
@Override
public ResultDomain<TbKnowledge> createKnowledgeInternal(TbKnowledge knowledge) {
// 1. 参数校验
if (!StringUtils.hasText(knowledge.getTitle())) {
return ResultDomain.failure("知识库标题不能为空");
}
if (!StringUtils.hasText(knowledge.getKnowledgeId())) {
return ResultDomain.failure("知识库ID不能为空");
}
// 2. 设置默认值
if (!StringUtils.hasText(knowledge.getOptsn())) {
knowledge.setOptsn(IdUtil.getOptsn());
}
if (!StringUtils.hasText(knowledge.getCreator())) {
knowledge.setCreator("system");
}
// 3. 创建Dify知识库
String difyDatasetId = null;
try {
DatasetCreateRequest createRequest = new DatasetCreateRequest();
createRequest.setName(knowledge.getTitle());
createRequest.setDescription(knowledge.getDescription());
if (StringUtils.hasText(knowledge.getDifyIndexingTechnique())) {
createRequest.setIndexingTechnique(knowledge.getDifyIndexingTechnique());
}
DatasetCreateResponse difyResponse = difyApiClient.createDataset(createRequest);
if (difyResponse != null && StringUtils.hasText(difyResponse.getId())) {
difyDatasetId = difyResponse.getId();
knowledge.setDifyDatasetId(difyDatasetId);
} else {
return ResultDomain.failure("创建Dify知识库失败");
}
} catch (Exception e) {
logger.error("创建Dify知识库异常: {}", e.getMessage(), e);
return ResultDomain.failure("创建Dify知识库异常: " + e.getMessage());
}
// 4. 插入数据库
int rows = knowledgeMapper.insertKnowledge(knowledge);
if (rows > 0) {
logger.info("内部创建知识库成功: knowledgeId={}, title={}", knowledge.getKnowledgeId(), knowledge.getTitle());
return ResultDomain.success("创建知识库成功", knowledge);
}
// 数据库保存失败补偿删除Dify知识库
if (StringUtils.hasText(difyDatasetId)) {
try {
difyApiClient.deleteDataset(difyDatasetId);
logger.info("补偿删除Dify知识库成功: difyDatasetId={}", difyDatasetId);
} catch (Exception e) {
logger.warn("补偿删除Dify知识库失败: {}", e.getMessage());
}
}
return ResultDomain.failure("创建知识库失败");
}
/** /**
* @description 更新知识库包含dify知识库各种参数的配置 * @description 更新知识库包含dify知识库各种参数的配置
* @param knowledge 知识库信息 * @param knowledge 知识库信息

View File

@@ -14,7 +14,7 @@
<result column="embedding_model_provider" property="embeddingModelProvider" jdbcType="VARCHAR"/> <result column="embedding_model_provider" property="embeddingModelProvider" jdbcType="VARCHAR"/>
<result column="rerank_model" property="rerankModel" jdbcType="VARCHAR"/> <result column="rerank_model" property="rerankModel" jdbcType="VARCHAR"/>
<result column="rerank_model_provider" property="rerankModelProvider" jdbcType="VARCHAR"/> <result column="rerank_model_provider" property="rerankModelProvider" jdbcType="VARCHAR"/>
<result column="reranking_enable" property="rerankingEnable" jdbcType="INTEGER"/> <result column="reranking_enable" property="rerankingEnable" jdbcType="BOOLEAN"/>
<result column="retrieval_top_k" property="retrievalTopK" jdbcType="INTEGER"/> <result column="retrieval_top_k" property="retrievalTopK" jdbcType="INTEGER"/>
<result column="retrieval_score_threshold" property="retrievalScoreThreshold" jdbcType="DECIMAL"/> <result column="retrieval_score_threshold" property="retrievalScoreThreshold" jdbcType="DECIMAL"/>
<result column="document_count" property="documentCount" jdbcType="INTEGER"/> <result column="document_count" property="documentCount" jdbcType="INTEGER"/>

View File

@@ -40,8 +40,8 @@ public class TbKnowledge extends BaseDTO{
@Schema(description = "Rerank模型提供商") @Schema(description = "Rerank模型提供商")
private String rerankModelProvider; private String rerankModelProvider;
@Schema(description = "是否启用Rerank0否 1是)") @Schema(description = "是否启用Rerankfalse否 true是)")
private Integer rerankingEnable; private Boolean rerankingEnable;
@Schema(description = "检索Top K返回前K个结果") @Schema(description = "检索Top K返回前K个结果")
private Integer retrievalTopK; private Integer retrievalTopK;

View File

@@ -24,6 +24,15 @@ public interface KnowledgeService {
*/ */
ResultDomain<TbKnowledge> createKnowledge(TbKnowledge knowledge); ResultDomain<TbKnowledge> createKnowledge(TbKnowledge knowledge);
/**
* @description 内部创建知识库(不检查登录状态,用于系统初始化)
* @param knowledge 知识库信息需要包含knowledgeId和creator
* @return ResultDomain<TbKnowledge> 创建结果
* @author yslg
* @since 2025-12-20
*/
ResultDomain<TbKnowledge> createKnowledgeInternal(TbKnowledge knowledge);
/** /**
* @description 更新知识库包含dify知识库各种参数的配置 * @description 更新知识库包含dify知识库各种参数的配置
* @param knowledge 知识库信息 * @param knowledge 知识库信息

View File

@@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.bouncycastle.jcajce.provider.asymmetric.EXTERNAL;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
@@ -14,6 +13,7 @@ import org.xyzh.api.ai.dto.TbKnowledge;
import org.xyzh.api.ai.service.KnowledgeService; import org.xyzh.api.ai.service.KnowledgeService;
import org.xyzh.api.system.service.SysConfigService; import org.xyzh.api.system.service.SysConfigService;
import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.utils.id.IdUtil;
/** /**
* @description 初始化客服系统必须的8个知识库4个内部知识库4个外部知识库运行结束即销毁 * @description 初始化客服系统必须的8个知识库4个内部知识库4个外部知识库运行结束即销毁
@@ -44,17 +44,14 @@ public class KnowledgeInit {
List<TbKnowledge> knowledges = buildKnowledgeConfigs(); List<TbKnowledge> knowledges = buildKnowledgeConfigs();
int successCount = 0; int successCount = 0;
int skipCount = 0; int skipCount = 0;
for(TbKnowledge knowledge : knowledges){
for (TbKnowledge knowledge : knowledges) { if(!checkKnowledgeExists(knowledge.getKnowledgeId())){
if (checkKnowledgeExists(knowledge)) { if(createKnowledge(knowledge)){
logger.info("知识库已存在,跳过: {}", knowledge.getTitle());
skipCount++;
continue;
}
if (createKnowledge(knowledge)) {
successCount++; successCount++;
} }
}else{
skipCount++;
}
} }
logger.info("客服系统知识库初始化完成: 成功创建{}个,跳过{}个", successCount, skipCount); logger.info("客服系统知识库初始化完成: 成功创建{}个,跳过{}个", successCount, skipCount);
@@ -66,6 +63,18 @@ public class KnowledgeInit {
*/ */
private List<TbKnowledge> buildKnowledgeConfigs() { private List<TbKnowledge> buildKnowledgeConfigs() {
List<TbKnowledge> knowledges = new ArrayList<>(); List<TbKnowledge> knowledges = new ArrayList<>();
// 从数据库获取知识库配置默认信息
TbKnowledge baseKnowledge = new TbKnowledge();
baseKnowledge.setDifyIndexingTechnique(sysConfigService.getStringConfig("dify.knowledge.indexing.tchnique"));
baseKnowledge.setEmbeddingModel(sysConfigService.getStringConfig("dify.knowledge.embedding.model"));
baseKnowledge.setEmbeddingModelProvider(sysConfigService.getStringConfig("dify.knowledge.embedding.model.provider"));
baseKnowledge.setRerankingEnable(sysConfigService.getBooleanConfig("dify.knowledge.reranking.enable"));
baseKnowledge.setRerankModel(sysConfigService.getStringConfig("dify.knowledge.rerank.model"));
baseKnowledge.setRerankModelProvider(sysConfigService.getStringConfig("dify.knowledge.rerank.model.provider"));
baseKnowledge.setRetrievalTopK(sysConfigService.getIntConfig("dify.knowledge.retrieval.top.k"));
baseKnowledge.setRetrievalScoreThreshold(sysConfigService.getDoubleConfig("dify.knowledge.retrieval.score.threshold"));
// 外部知识库 // 外部知识库
TbKnowledge outerDevOperKnowledge = new TbKnowledge(); TbKnowledge outerDevOperKnowledge = new TbKnowledge();
outerDevOperKnowledge.setKnowledgeId("workcase_outer_device_operate"); outerDevOperKnowledge.setKnowledgeId("workcase_outer_device_operate");
@@ -125,20 +134,37 @@ public class KnowledgeInit {
knowledges.add(innerServChatKnowledge); knowledges.add(innerServChatKnowledge);
// 统一设置dify知识库相关参数,并设置service为workcase // 统一设置dify知识库相关参数,并设置service为workcase
for(TbKnowledge knowledge: knowledges){
knowledge.setService(SERVICE_WORKCASE);
knowledge.setOptsn(IdUtil.getOptsn());
// 从baseKnowledge同步知识库默认配置
knowledge.setDifyIndexingTechnique(baseKnowledge.getDifyIndexingTechnique());
knowledge.setEmbeddingModel(baseKnowledge.getEmbeddingModel());
knowledge.setEmbeddingModelProvider(baseKnowledge.getEmbeddingModelProvider());
knowledge.setRerankingEnable(baseKnowledge.getRerankingEnable());
knowledge.setRerankModel(baseKnowledge.getRerankModel());
knowledge.setRerankModelProvider(baseKnowledge.getRerankModelProvider());
knowledge.setRetrievalTopK(baseKnowledge.getRetrievalTopK());
knowledge.setRetrievalScoreThreshold(baseKnowledge.getRetrievalScoreThreshold());
}
return knowledges; return knowledges;
} }
private boolean checkKnowledgeExists(TbKnowledge knowledge){ private boolean checkKnowledgeExists(String knowledgeId){
ResultDomain<TbKnowledge> knowledge = knowledgeService.getKnowledgeById(knowledgeId);
if(knowledge.getSuccess() && knowledge.getData() != null){
return true; return true;
} }
return false;
}
/** /**
* 创建知识库 * 创建知识库
*/ */
private boolean createKnowledge(TbKnowledge knowledge) { private boolean createKnowledge(TbKnowledge knowledge) {
ResultDomain<TbKnowledge> result = knowledgeService.createKnowledge(knowledge); ResultDomain<TbKnowledge> result = knowledgeService.createKnowledgeInternal(knowledge);
if (result.getSuccess()) { if (result.getSuccess()) {
logger.info("创建知识库成功: {} [{}]", knowledge.getTitle(), knowledge.getCategory()); logger.info("创建知识库成功: {} [{}]", knowledge.getTitle(), knowledge.getCategory());

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,72 @@
.kb-categories {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 16px;
margin-bottom: 24px;
.kb-category-card {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
padding: 20px 16px;
background: #f5f7fa;
border: 2px solid transparent;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s ease;
&:hover {
background: #ecf5ff;
border-color: #b3d8ff;
}
&.active {
background: #ecf5ff;
border-color: #409eff;
}
.el-icon {
font-size: 32px;
}
.cat-name {
font-size: 14px;
font-weight: 500;
color: #303133;
text-align: center;
}
.cat-count {
font-size: 12px;
color: #909399;
}
}
}
.kb-files-section {
.section-toolbar {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
h3 {
margin: 0;
font-size: 16px;
font-weight: 500;
color: #303133;
}
}
.file-name-cell {
display: flex;
align-items: center;
gap: 8px;
.file-icon {
color: #409eff;
font-size: 18px;
}
}
}

View File

@@ -157,10 +157,8 @@ const currentTabDesc = computed(() => currentTabConfig.value.desc)
const currentTabLabel = computed(() => currentTabConfig.value.label) const currentTabLabel = computed(() => currentTabConfig.value.label)
const currentTabColor = computed(() => currentTabConfig.value.color) const currentTabColor = computed(() => currentTabConfig.value.color)
// 当前 Tab 下的知识库列表 // 当前 Tab 下的知识库列表(直接使用查询结果,不再前端过滤)
const currentKnowledges = computed(() => const currentKnowledges = computed(() => knowledges.value)
knowledges.value.filter((kb: TbKnowledge) => kb.category === activeTab.value)
)
// 当前选中的知识库名称 // 当前选中的知识库名称
const currentKnowledgeName = computed(() => { const currentKnowledgeName = computed(() => {
@@ -176,16 +174,18 @@ const filteredDocuments = computed(() => {
) )
}) })
// 获取知识库列表 // 获取知识库列表(根据当前 Tab 的 category 查询)
const fetchKnowledges = async () => { const fetchKnowledges = async () => {
loading.value = true loading.value = true
try { try {
const result = await aiKnowledgeAPI.listKnowledges({ service: 'workcase' }) const result = await aiKnowledgeAPI.listKnowledges({
if (result.success && Array.isArray(result.data)) { service: 'workcase',
knowledges.value = result.data category: activeTab.value
// 默认选中当前 Tab 下的第一个知识库 })
console.log('知识库列表响应:', result)
// API 返回的是 dataList 字段
knowledges.value = result.dataList || []
selectFirstKnowledge() selectFirstKnowledge()
}
} catch (error) { } catch (error) {
console.error('获取知识库列表失败:', error) console.error('获取知识库列表失败:', error)
ElMessage.error('获取知识库列表失败') ElMessage.error('获取知识库列表失败')
@@ -236,10 +236,13 @@ const fetchDocuments = async (knowledgeId: string) => {
} }
} }
// Tab 切换 // Tab 切换时重新查询对应类别的知识库
const handleTabChange = () => { const handleTabChange = () => {
searchKeyword.value = '' searchKeyword.value = ''
selectFirstKnowledge() knowledges.value = []
activeKnowledgeId.value = ''
documents.value = []
fetchKnowledges()
} }
// 选择知识库 // 选择知识库