From a14c1d87aacb3787dd31b09bcecdf270618697bc Mon Sep 17 00:00:00 2001 From: jw_mac <163wangjack@gmail.com> Date: Thu, 25 Jun 2026 21:03:11 +0800 Subject: [PATCH] feat(knowledge): add batch reparse capability This commit introduces the Batch Reparse feature for the Knowledge Base. Users can now select multiple documents and trigger a re-parsing pipeline in batches, streamlining the recovery from parse failures. --- frontend/src/api/knowledge-base/index.ts | 10 +- .../src/views/knowledge/KnowledgeBase.vue | 36 ++++++- .../knowledge/components/DocumentBatchBar.vue | 24 ++++- internal/handler/knowledge.go | 102 ++++++++++++++++++ internal/router/router.go | 1 + 5 files changed, 168 insertions(+), 5 deletions(-) diff --git a/frontend/src/api/knowledge-base/index.ts b/frontend/src/api/knowledge-base/index.ts index f4e33459..e532d9b8 100644 --- a/frontend/src/api/knowledge-base/index.ts +++ b/frontend/src/api/knowledge-base/index.ts @@ -120,7 +120,7 @@ export function updateKnowledgeBase(id: string, data: { }; } }) { - return put(`/api/v1/knowledge-bases/${id}` , data); + return put(`/api/v1/knowledge-bases/${id}`, data); } export function rebuildKBIndex(kbId: string) { @@ -481,3 +481,11 @@ export function knowledgeSemanticSearch(data: { }) { return post('/api/v1/knowledge-search', data); } + +export function batchReparseKnowledge(kbId: string, ids: string[], processConfig?: any) { + return post(`/api/v1/knowledge/batch-reparse`, { + kb_id: kbId, + ids, + process_config: processConfig + }); +} \ No newline at end of file diff --git a/frontend/src/views/knowledge/KnowledgeBase.vue b/frontend/src/views/knowledge/KnowledgeBase.vue index cdfe39a8..b1f6deb1 100644 --- a/frontend/src/views/knowledge/KnowledgeBase.vue +++ b/frontend/src/views/knowledge/KnowledgeBase.vue @@ -36,6 +36,7 @@ import { reparseKnowledge, cancelKnowledgeParse, batchDeleteKnowledge, + batchReparseKnowledge, getKnowledgeSpans, getKnowledgeDetails, } from "@/api/knowledge-base/index"; @@ -60,7 +61,7 @@ import { formatFileSize } from '@/utils/files'; import { useMarqueeSelect } from '@/hooks/useMarqueeSelect'; import type { ParserEngineInfo } from '@/api/system'; const route = useRoute(); -const { t } = useI18n(); +const { t, te } = useI18n(); const kbId = computed(() => (route.params as any).kbId as string || ''); const kbInfo = ref(null); const uploadSourceRef = ref | null>(null); @@ -415,6 +416,35 @@ watch(viewMode, (v) => { const selectedIds = ref>(new Set()); let lastSelectedIndex = -1; const batchDeleting = ref(false); +const batchReparsing = ref(false); + +const confirmBatchReparse = async () => { + if (batchReparsing.value || selectedIds.value.size === 0) return; + const ids = Array.from(selectedIds.value); + batchReparsing.value = true; + try { + const res: any = await batchReparseKnowledge(kbId.value, ids); + if (res?.success) { + if (res.partial && res.failed_ids && res.failed_ids.length > 0) { + MessagePlugin.warning(`部分重构任务提交成功,失败 ${res.failed_ids.length} 个`); + } else { + const successMsg = te('knowledgeBase.batchReparseSuccess') + ? t('knowledgeBase.batchReparseSuccess', { count: ids.length }) + : `已提交 ${ids.length} 个重构任务`; + MessagePlugin.success(successMsg); + } + clearSelection(); + batchMode.value = false; + loadKnowledgeFiles(kbId.value); + } else { + MessagePlugin.error(res?.message || '批量重建失败'); + } + } catch (e: any) { + MessagePlugin.error(e?.message || '批量重建失败'); + } finally { + batchReparsing.value = false; + } +}; const selectedTagId = ref(''); const tagList = ref([]); @@ -2607,9 +2637,9 @@ async function createNewSession(value: string): Promise {
- + @delete="confirmBatchDelete" @reparse="confirmBatchReparse" />
diff --git a/frontend/src/views/knowledge/components/DocumentBatchBar.vue b/frontend/src/views/knowledge/components/DocumentBatchBar.vue index 65096596..95dddf4f 100644 --- a/frontend/src/views/knowledge/components/DocumentBatchBar.vue +++ b/frontend/src/views/knowledge/components/DocumentBatchBar.vue @@ -12,9 +12,10 @@ defineProps<{ const emit = defineEmits<{ (e: 'cancel'): void; (e: 'delete'): void; + (e: 'reparse'): void; }>(); -const { t } = useI18n(); +const { t, te } = useI18n();