From 9e3b16c3ceb1015597caa772c29d46922e01742c Mon Sep 17 00:00:00 2001 From: CaptainB Date: Mon, 1 Dec 2025 12:19:36 +0800 Subject: [PATCH 1/6] feat: add success message for document replacement in multiple languages --- ui/src/locales/lang/en-US/views/document.ts | 1 + ui/src/locales/lang/zh-CN/views/document.ts | 1 + ui/src/locales/lang/zh-Hant/views/document.ts | 1 + ui/src/views/document/index.vue | 1 + 4 files changed, 4 insertions(+) diff --git a/ui/src/locales/lang/en-US/views/document.ts b/ui/src/locales/lang/en-US/views/document.ts index bedaa7a2a..b6322301b 100644 --- a/ui/src/locales/lang/en-US/views/document.ts +++ b/ui/src/locales/lang/en-US/views/document.ts @@ -22,6 +22,7 @@ export default { nameMessage: 'Document name cannot be empty!', importMessage: 'Successful', migrationSuccess: 'Successful', + replaceSuccess: 'Successful', fileLimitCountTip1: 'Maximum upload per time', fileLimitCountTip2: 'files', fileLimitSizeTip1: 'each file must not exceed', diff --git a/ui/src/locales/lang/zh-CN/views/document.ts b/ui/src/locales/lang/zh-CN/views/document.ts index f9470c26f..13be4c11c 100644 --- a/ui/src/locales/lang/zh-CN/views/document.ts +++ b/ui/src/locales/lang/zh-CN/views/document.ts @@ -22,6 +22,7 @@ export default { nameMessage: '文件名称不能为空!', importMessage: '导入成功', migrationSuccess: '迁移成功', + replaceSuccess: '替换成功', fileLimitCountTip1: '每次最多上传', fileLimitCountTip2: '个文件', fileLimitSizeTip1: '每个文件不超过', diff --git a/ui/src/locales/lang/zh-Hant/views/document.ts b/ui/src/locales/lang/zh-Hant/views/document.ts index f7e7793c3..36d0fa16a 100644 --- a/ui/src/locales/lang/zh-Hant/views/document.ts +++ b/ui/src/locales/lang/zh-Hant/views/document.ts @@ -21,6 +21,7 @@ export default { nameMessage: '文件名稱不能为空!', importMessage: '導入成功', migrationSuccess: '遷移成功', + replaceSuccess: '替換成功', fileLimitCountTip1: '每次最多上傳', fileLimitCountTip2: '個文件', fileLimitSizeTip1: '每個文件不超過', diff --git a/ui/src/views/document/index.vue b/ui/src/views/document/index.vue index 2f907dce3..08d3f8004 100644 --- a/ui/src/views/document/index.vue +++ b/ui/src/views/document/index.vue @@ -1142,6 +1142,7 @@ function replaceDocument(file: any, row: any) { loadSharedApi({ type: 'document', systemType: apiType.value }) .postReplaceSourceFile(id, row.id, formData, loading) .then(() => { + MsgSuccess(t('views.document.tip.replaceSuccess')) getList() }) .catch((e: any) => {}) From 769790a768b3993cd3129e823b14910f5616af88 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Mon, 1 Dec 2025 12:40:15 +0800 Subject: [PATCH 2/6] fix: Fix table rendering errors --- ui/src/components/app-table/index.vue | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ui/src/components/app-table/index.vue b/ui/src/components/app-table/index.vue index 302737e7b..4ce0b6253 100644 --- a/ui/src/components/app-table/index.vue +++ b/ui/src/components/app-table/index.vue @@ -94,9 +94,8 @@ const appTableRef = ref() const loading = ref(false) const showInput = ref(false) const inputValue = ref('') -const tableHeight = ref(300) - -watch(showInput, (bool) => { +const tableHeight = ref(null) +watch(showInput, (bool: boolean) => { if (!bool) { inputValue.value = '' } From f08a9c53d46130a2cc19621cdfb07623f60fdbef Mon Sep 17 00:00:00 2001 From: CaptainB Date: Mon, 1 Dec 2025 13:19:35 +0800 Subject: [PATCH 3/6] feat: add knowledge workflow management endpoints and related functionality --- .../system-resource-management/knowledge.ts | 64 ++++++++++++++++++- ui/src/api/system-shared/knowledge.ts | 64 ++++++++++++++++++- 2 files changed, 124 insertions(+), 4 deletions(-) diff --git a/ui/src/api/system-resource-management/knowledge.ts b/ui/src/api/system-resource-management/knowledge.ts index 3ae6d1efd..20489ebe9 100644 --- a/ui/src/api/system-resource-management/knowledge.ts +++ b/ui/src/api/system-resource-management/knowledge.ts @@ -1,7 +1,7 @@ import { Result } from '@/request/Result' import { get, post, del, put, exportFile, exportExcel } from '@/request/index' import { type Ref } from 'vue' -import type { pageRequest } from '@/api/type/common' +import type { Dict, pageRequest } from '@/api/type/common' const prefix = '/system/resource/knowledge' @@ -254,6 +254,62 @@ const delMulTag: (knowledge_id: string, tags: any, loading?: Ref) => Pr ) => { return put(`${prefix}/${knowledge_id}/tags/batch_delete`, tags, null, loading) } +const getKnowledgeWorkflowFormList: ( + knowledge_id: string, + type: 'loacl' | 'tool', + id: string, + node: any, + loading?: Ref, +) => Promise> = ( + knowledge_id: string, + type: 'loacl' | 'tool', + id: string, + node, + loading, +) => { + return post( + `${prefix}/${knowledge_id}/datasource/${type}/${id}/form_list`, + { node }, + {}, + loading, + ) +} +const getKnowledgeWorkflowDatasourceDetails: ( + knowledge_id: string, + type: 'loacl' | 'tool', + id: string, + params: any, + function_name: string, + loading?: Ref, +) => Promise> = ( + knowledge_id: string, + type: 'loacl' | 'tool', + id: string, + params, + function_name, + loading, +) => { + return post( + `${prefix}/${knowledge_id}/datasource/${type}/${id}/${function_name}`, + params, + {}, + loading, + ) +} +const workflowAction: ( + knowledge_id: string, + instance: Dict, + loading?: Ref, +) => Promise> = (knowledge_id: string, instance, loading) => { + return post(`${prefix}/${knowledge_id}/action`, instance, {}, loading) +} +const getWorkflowAction: ( + knowledge_id: string, + knowledge_action_id: string, + loading?: Ref, +) => Promise> = (knowledge_id: string, knowledge_action_id, loading) => { + return get(`${prefix}/${knowledge_id}/action/${knowledge_action_id}`, {}, loading) +} export default { @@ -275,7 +331,11 @@ export default { postTags, putTag, delTag, - delMulTag + delMulTag, + getKnowledgeWorkflowFormList, + getKnowledgeWorkflowDatasourceDetails, + workflowAction, + getWorkflowAction, } as { [key: string]: any } diff --git a/ui/src/api/system-shared/knowledge.ts b/ui/src/api/system-shared/knowledge.ts index fe6a4e211..73edf8d1e 100644 --- a/ui/src/api/system-shared/knowledge.ts +++ b/ui/src/api/system-shared/knowledge.ts @@ -1,7 +1,7 @@ import { Result } from '@/request/Result' import { get, post, del, put, exportFile, exportExcel } from '@/request/index' import { type Ref } from 'vue' -import type { pageRequest } from '@/api/type/common' +import type { Dict, pageRequest } from '@/api/type/common' import type { knowledgeData } from '@/api/type/knowledge' const prefix = '/system/shared/knowledge' @@ -310,6 +310,62 @@ const delMulTag: (knowledge_id: string, tags: any, loading?: Ref) => Pr ) => { return put(`${prefix}/${knowledge_id}/tags/batch_delete`, tags, null, loading) } +const getKnowledgeWorkflowFormList: ( + knowledge_id: string, + type: 'loacl' | 'tool', + id: string, + node: any, + loading?: Ref, +) => Promise> = ( + knowledge_id: string, + type: 'loacl' | 'tool', + id: string, + node, + loading, +) => { + return post( + `${prefix}/${knowledge_id}/datasource/${type}/${id}/form_list`, + { node }, + {}, + loading, + ) +} +const getKnowledgeWorkflowDatasourceDetails: ( + knowledge_id: string, + type: 'loacl' | 'tool', + id: string, + params: any, + function_name: string, + loading?: Ref, +) => Promise> = ( + knowledge_id: string, + type: 'loacl' | 'tool', + id: string, + params, + function_name, + loading, +) => { + return post( + `${prefix}/${knowledge_id}/datasource/${type}/${id}/${function_name}`, + params, + {}, + loading, + ) +} +const workflowAction: ( + knowledge_id: string, + instance: Dict, + loading?: Ref, +) => Promise> = (knowledge_id: string, instance, loading) => { + return post(`${prefix}/${knowledge_id}/action`, instance, {}, loading) +} +const getWorkflowAction: ( + knowledge_id: string, + knowledge_action_id: string, + loading?: Ref, +) => Promise> = (knowledge_id: string, knowledge_action_id, loading) => { + return get(`${prefix}/${knowledge_id}/action/${knowledge_action_id}`, {}, loading) +} export default { getKnowledgeList, @@ -334,7 +390,11 @@ export default { postTags, putTag, delTag, - delMulTag + delMulTag, + getWorkflowAction, + getKnowledgeWorkflowFormList, + getKnowledgeWorkflowDatasourceDetails, + workflowAction, } as { [key: string]: any } From 056f79a8b86294caac038758e090cc1c4c44a7e8 Mon Sep 17 00:00:00 2001 From: CaptainB Date: Mon, 1 Dec 2025 13:30:05 +0800 Subject: [PATCH 4/6] feat: update shared knowledge workflow API and adjust data source handling --- .../component/DebugDrawer.vue | 22 ++++++++++++++----- .../component/action/DataSource.vue | 4 +++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/ui/src/views/knowledge-workflow/component/DebugDrawer.vue b/ui/src/views/knowledge-workflow/component/DebugDrawer.vue index dae795954..04d82659d 100644 --- a/ui/src/views/knowledge-workflow/component/DebugDrawer.vue +++ b/ui/src/views/knowledge-workflow/component/DebugDrawer.vue @@ -53,15 +53,26 @@ import Result from '@/views/knowledge-workflow/component/action/Result.vue' import applicationApi from '@/api/application/application' import KnowledgeBase from '@/views/knowledge-workflow/component/action/KnowledgeBase.vue' import { WorkflowType } from '@/enums/application' -import KnowledgeApi from '@/api/knowledge/knowledge' +import { loadSharedApi } from "@/utils/dynamics-api/shared-api.ts"; +import { useRoute } from "vue-router"; provide('upload', (file: any, loading?: Ref) => { return applicationApi.postUploadFile(file, _knowledge_id.value, 'KNOWLEDGE', loading) }) +const route = useRoute() const ak = { data_source: DataSource, knowledge_base: KnowledgeBase, result: Result, } +const apiType = computed(() => { + if (route.path.includes('shared')) { + return 'systemShare' + } else if (route.path.includes('resource-management')) { + return 'systemManage' + } else { + return 'workspace' + } +}) const loading = ref(false) const action_id = ref() const ActionRef = ref() @@ -103,10 +114,11 @@ const up = () => { const upload = () => { ActionRef.value.validate().then(() => { form_data.value[active.value] = ActionRef.value.get_data() - KnowledgeApi.workflowAction(_knowledge_id.value, form_data.value, loading).then((ok) => { - action_id.value = ok.data.id - active.value = 'result' - }) + loadSharedApi({ type: 'knowledge', systemType: apiType.value }) + .workflowAction(_knowledge_id.value, form_data.value, loading).then((ok: any) => { + action_id.value = ok.data.id + active.value = 'result' + }) }) } defineExpose({ close, open }) diff --git a/ui/src/views/knowledge-workflow/component/action/DataSource.vue b/ui/src/views/knowledge-workflow/component/action/DataSource.vue index b8ab40a2e..160ccbe05 100644 --- a/ui/src/views/knowledge-workflow/component/action/DataSource.vue +++ b/ui/src/views/knowledge-workflow/component/action/DataSource.vue @@ -56,7 +56,9 @@ const { user } = useStore() const route = useRoute() const apiType = computed(() => { - if (route.path.includes('resource-management')) { + if (route.path.includes('shared')) { + return 'systemShare' + } else if (route.path.includes('resource-management')) { return 'systemManage' } else { return 'workspace' From c2658fa7356294a59ddbdca3ed0ea9df7c72ef96 Mon Sep 17 00:00:00 2001 From: CaptainB Date: Mon, 1 Dec 2025 14:36:36 +0800 Subject: [PATCH 5/6] feat: update file name for existing records based on sha256_hash and knowledge/document IDs --- apps/knowledge/serializers/document.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/knowledge/serializers/document.py b/apps/knowledge/serializers/document.py index c7e5ec6e1..21c47e5b6 100644 --- a/apps/knowledge/serializers/document.py +++ b/apps/knowledge/serializers/document.py @@ -1569,6 +1569,11 @@ class DocumentSerializers(serializers.Serializer): # 读取新文件内容 file_content = file.read() + QuerySet(File).filter( + sha256_hash=original_hash, + source_id__in=[self.data.get('knowledge_id'), self.data.get('document_id')] + ).update(file_name=file.name) + # 查找所有具有相同sha256_hash的文件 files_to_update = QuerySet(File).filter( sha256_hash=original_hash, From e3c36b3476d49679baaf2cbf954a18332b1424c2 Mon Sep 17 00:00:00 2001 From: liqiang-fit2cloud Date: Mon, 1 Dec 2025 14:52:05 +0800 Subject: [PATCH 6/6] refactor: catch more exception details. --- apps/common/utils/tool_code.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/common/utils/tool_code.py b/apps/common/utils/tool_code.py index 87f219afd..233bafbe5 100644 --- a/apps/common/utils/tool_code.py +++ b/apps/common/utils/tool_code.py @@ -105,8 +105,8 @@ except Exception as e: subprocess_result = self._exec_sandbox(_exec_code) else: subprocess_result = self._exec(_exec_code) - if subprocess_result.returncode == 1: - raise Exception(subprocess_result.stderr) + if subprocess_result.returncode != 0: + raise Exception(subprocess_result.stderr or subprocess_result.stdout or "Unknown exception occurred") lines = subprocess_result.stdout.splitlines() result_line = [line for line in lines if line.startswith(_id)] if not result_line: