MaxKB/ui/src/views/knowledge-workflow/component/DebugDrawer.vue
2025-12-03 19:25:53 +08:00

170 lines
4.9 KiB
Vue

<template>
<el-drawer
v-model="drawerVisible"
:title="$t('common.debug')"
size="800px"
direction="rtl"
destroy-on-close
:before-close="close"
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<div style="height: calc(100% - 57px)" v-loading="loading">
<keep-alive :key="key" :include="['data_source', 'knowledge_base']">
<component
ref="ActionRef"
:is="ak[active]"
v-model:loading="loading"
:workflow="_workflow"
:knowledge_id="id"
:id="action_id"
></component>
</keep-alive>
</div>
<template #footer>
<el-button v-if="active == 'result'" @click="continueImporting">
{{ $t('views.document.buttons.continueImporting') }}
</el-button>
<el-button
v-if="base_form_list.length > 0 && active == 'knowledge_base'"
:loading="loading"
@click="up"
>
{{ $t('views.document.buttons.prev') }}</el-button
>
<el-button
v-if="base_form_list.length > 0 && active == 'data_source'"
:loading="loading"
@click="next"
>
{{ $t('views.document.buttons.next') }}
</el-button>
<el-button
v-if="base_form_list.length > 0 ? active == 'knowledge_base' : active == 'data_source'"
@click="upload"
type="primary"
:loading="loading"
>
{{ $t('views.document.buttons.import') }}
</el-button>
<el-button v-if="active == 'result'" type="primary" @click="goDocument">{{
$t('views.knowledge.ResultSuccess.buttons.toDocument')
}}</el-button>
</template>
</el-drawer>
</template>
<script setup lang="ts">
import { computed, ref, provide, type Ref, nextTick } from 'vue'
import DataSource from '@/views/knowledge-workflow/component/action/DataSource.vue'
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 { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import permissionMap from '@/permission'
import { MsgError } from '@/utils/message'
import { t } from '@/locales'
import { useRoute, useRouter } from 'vue-router'
provide('upload', (file: any, loading?: Ref<boolean>) => {
return applicationApi.postUploadFile(file, id, 'KNOWLEDGE', loading)
})
const key = ref<number>(0)
const router = useRouter()
const route = useRoute()
const {
params: { id, folderId },
/*
id 为 knowledge_id
*/
} = route as any
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<boolean>(false)
const action_id = ref<string>()
const ActionRef = ref()
const form_data = ref<any>({})
const active = ref<'data_source' | 'knowledge_base' | 'result'>('data_source')
const drawerVisible = ref<boolean>(false)
const _workflow = ref<any>(null)
const close = () => {
drawerVisible.value = false
_workflow.value = null
active.value = 'data_source'
}
const open = (workflow: any) => {
drawerVisible.value = true
_workflow.value = workflow
}
const base_form_list = computed(() => {
const kBase = _workflow.value?.nodes?.find((n: any) => n.type === WorkflowType.KnowledgeBase)
if (kBase) {
return kBase.properties.user_input_field_list
}
return []
})
const next = () => {
ActionRef.value.validate().then(() => {
form_data.value[active.value] = ActionRef.value.get_data()
active.value = 'knowledge_base'
})
}
const up = () => {
ActionRef.value.validate().then(() => {
active.value = 'data_source'
})
}
const permissionPrecise = computed(() => {
return permissionMap['knowledge'][apiType.value]
})
const upload = () => {
if (permissionPrecise.value.doc_create(id)) {
ActionRef.value.validate().then(() => {
form_data.value[active.value] = ActionRef.value.get_data()
loadSharedApi({ type: 'knowledge', systemType: apiType.value })
.workflowAction(id, form_data.value, loading)
.then((ok: any) => {
action_id.value = ok.data.id
active.value = 'result'
})
})
} else {
MsgError(t('views.application.tip.noDocPermission'))
}
}
const continueImporting = () => {
active.value = 'data_source'
key.value++
action_id.value = undefined
const c_workflow = _workflow.value
_workflow.value = null
form_data.value = {}
nextTick(() => {
_workflow.value = c_workflow
})
}
const goDocument = () => {
const newUrl = router.resolve({
path: `/knowledge/${id}/${folderId}/4/document`,
}).href
window.open(newUrl)
}
defineExpose({ close, open })
</script>
<style lang="scss" scoped></style>