diff --git a/ai_knowledge_base_v2/apps/admin-web/src/components/KnowledgeContentPreview.vue b/ai_knowledge_base_v2/apps/admin-web/src/components/KnowledgeContentPreview.vue index 675d013..7868ce9 100644 --- a/ai_knowledge_base_v2/apps/admin-web/src/components/KnowledgeContentPreview.vue +++ b/ai_knowledge_base_v2/apps/admin-web/src/components/KnowledgeContentPreview.vue @@ -57,9 +57,11 @@ function selectVersion(value: number) { function versionStatus(version: KnowledgeVersion) { const labels: Record = { published: "正式版本", - pending_review: "待审核", - approved: "待发布", - rejected: "已拒绝", + processing: "同步处理中", + pending_review: "未生效版本", + approved: "未生效版本", + rejected: "未生效版本", + discarded: "已废弃版本", superseded: "历史版本", }; return labels[version.status] ?? version.status; @@ -136,7 +138,6 @@ function versionStatus(version: KnowledgeVersion) { - diff --git a/ai_knowledge_base_v2/apps/admin-web/src/components/KnowledgeManagementView.vue b/ai_knowledge_base_v2/apps/admin-web/src/components/KnowledgeManagementView.vue index 74fa8c3..4eb82d7 100644 --- a/ai_knowledge_base_v2/apps/admin-web/src/components/KnowledgeManagementView.vue +++ b/ai_knowledge_base_v2/apps/admin-web/src/components/KnowledgeManagementView.vue @@ -34,19 +34,18 @@ const batchSaving = ref(false); const resolvingNode = ref(false); const nodeResolved = ref(false); const sourceTitle = ref(""); -const filter = reactive({ keyword: "", type: "", open: "", source: "", pending: "" }); +const filter = reactive({ keyword: "", type: "", open: "", source: "" }); const pager = reactive({ page: 1, pageSize: 20, total: 0 }); const form = reactive({ name: "", feishuSpaceId: "", feishuNodeId: "", knowledgeType: "general", - reviewMode: "manual", status: 0, remark: "", }); -const editForm = reactive({ id: 0, name: "", knowledgeType: "general", reviewMode: "manual" }); -const batchForm = reactive({ knowledgeType: "", reviewMode: "" }); +const editForm = reactive({ id: 0, name: "", knowledgeType: "general" }); +const batchForm = reactive({ knowledgeType: "" }); onMounted(load); @@ -55,7 +54,7 @@ async function load(page = pager.page, pageSize = pager.pageSize) { try { const result = await api.knowledge({ keyword: filter.keyword, knowledgeType: filter.type, openStatus: filter.open, - sourceStatus: filter.source, pending: filter.pending === "" ? undefined : filter.pending === "yes", + sourceStatus: filter.source, page, pageSize, }); rows.value = result.items; @@ -74,7 +73,6 @@ function openEdit() { id: detail.value.knowledge.id, name: detail.value.knowledge.name, knowledgeType: detail.value.knowledge.knowledgeType, - reviewMode: detail.value.knowledge.reviewMode, }); editOpen.value = true; } @@ -87,7 +85,7 @@ async function saveMetadata() { editSaving.value = true; try { await api.updateKnowledgeMetadata(editForm.id, { - name: editForm.name.trim(), knowledgeType: editForm.knowledgeType, reviewMode: editForm.reviewMode, + name: editForm.name.trim(), knowledgeType: editForm.knowledgeType, }); ElMessage.success("知识库基本信息已更新"); editOpen.value = false; @@ -104,13 +102,13 @@ function openBatchEdit() { ElMessage.warning("请先勾选需要修改的知识库"); return; } - Object.assign(batchForm, { knowledgeType: "", reviewMode: "" }); + Object.assign(batchForm, { knowledgeType: "" }); batchOpen.value = true; } async function saveBatchMetadata() { - if (!batchForm.knowledgeType && !batchForm.reviewMode) { - ElMessage.warning("请至少选择一个修改项"); + if (!batchForm.knowledgeType) { + ElMessage.warning("请选择知识库类型"); return; } if (!await confirmAction( @@ -123,7 +121,6 @@ async function saveBatchMetadata() { const result = await api.batchUpdateKnowledgeMetadata({ knowledgeIds: selectedRows.value.map((item) => item.id), knowledgeType: batchForm.knowledgeType || undefined, - reviewMode: batchForm.reviewMode || undefined, }); ElMessage[result.failed ? "warning" : "success"](`批量修改完成:成功 ${result.success} 个,失败 ${result.failed} 个`); batchOpen.value = false; @@ -168,9 +165,9 @@ async function createKnowledge() { } try { await api.createKnowledge({ ...form }); - Object.assign(form, { name: "", feishuSpaceId: "", feishuNodeId: "", knowledgeType: "general", reviewMode: "manual", status: 0, remark: "" }); + Object.assign(form, { name: "", feishuSpaceId: "", feishuNodeId: "", knowledgeType: "general", status: 0, remark: "" }); nodeResolved.value = false; sourceTitle.value = ""; - ElMessage.success("知识库已新增,请进行首次同步"); + ElMessage.success("知识库已新增,首次同步成功后将自动生效"); await load(); } catch (error) { ElMessage.error(errorMessage(error, "知识库新增失败")); @@ -216,15 +213,15 @@ async function refreshDetail(id: number) { return nextDetail; } -async function sync(item: KnowledgeItem, mode: "review" | "replace") { +async function sync(item: KnowledgeItem) { operatingId.value = item.id; try { - const result = await api.syncKnowledge(item.id, mode); + const result = await api.syncKnowledge(item.id); const message = result.status === "unchanged" ? "飞书内容未变化,未生成新版本" : result.status === "published" - ? "同步、质检和自动发布已完成" - : "同步处理完成,已生成待审核版本"; + ? "同步完成,最新版本已自动生效" + : "同步完成"; ElMessage.success(message); await load(); if (detailOpen.value) await refreshDetail(item.id); @@ -237,7 +234,7 @@ async function sync(item: KnowledgeItem, mode: "review" | "replace") { async function runMigration() { if (!await confirmAction( - "将依次重新读取全部现有飞书文章并生成待审核版本。迁移审核完成前,新检索链路不会使用这些知识库。", + "将依次重新读取全部飞书文章。每个知识库同步成功后会立即替换为最新版本,原版本仍可回滚。", "开始知识迁移", { confirmButtonText: "开始迁移", cancelButtonText: "取消", type: "warning" }, )) return; @@ -253,58 +250,6 @@ async function runMigration() { } } -async function confirmManifest() { - if (!detail.value?.pendingVersion) return; - try { - await api.confirmKnowledgeManifest(detail.value.knowledge.id, detail.value.pendingVersion.id); - ElMessage.success("知识库说明卡已确认"); - await refreshDetail(detail.value.knowledge.id); - } catch (error) { - ElMessage.error(errorMessage(error, "说明卡确认失败")); - } -} - -async function review(action: "approve" | "reject") { - if (!detail.value?.pendingVersion) return; - let reason = ""; - if (action === "reject") { - try { - const result = await ElMessageBox.prompt( - "请记录拒绝原因。知识内容不能在后台修改,请前往飞书源文章修改后重新同步。", - "拒绝版本", - { confirmButtonText: "确认拒绝", cancelButtonText: "取消", inputValidator: (value) => Boolean(value?.trim()) || "请填写拒绝原因" }, - ); - reason = result.value; - } catch { - return; - } - } - try { - await api.reviewKnowledgeVersion(detail.value.knowledge.id, detail.value.pendingVersion.id, action, reason); - ElMessage.success(action === "approve" ? "版本已审核通过" : "版本已拒绝"); - await refreshDetail(detail.value.knowledge.id); - } catch (error) { - ElMessage.error(errorMessage(error, "版本审核失败")); - } -} - -async function publish(keepOpen: boolean) { - if (!detail.value?.pendingVersion) return; - if (!await confirmAction( - `将发布 V${detail.value.pendingVersion.versionNo},从用户下一条消息开始生效;发布后知识库将${keepOpen ? "保持开放" : "处于关闭状态"}。`, - "发布知识版本", - { confirmButtonText: "确认发布", cancelButtonText: "取消", type: "warning" }, - )) return; - try { - await api.publishKnowledgeVersion(detail.value.knowledge.id, detail.value.pendingVersion.id, keepOpen); - ElMessage.success("正式版本已发布"); - await load(); - await refreshDetail(detail.value.knowledge.id); - } catch (error) { - ElMessage.error(errorMessage(error, "版本发布失败")); - } -} - async function rollback(version: KnowledgeVersion) { if (!detail.value) return; if (!await confirmAction( @@ -399,14 +344,13 @@ async function confirmAction(