From 272000b000564f5e4ed7c5562fe72a206c8a48f9 Mon Sep 17 00:00:00 2001 From: yangyin <1850366751@qq.com> Date: 星期二, 12 十一月 2024 10:51:02 +0800 Subject: [PATCH] 修改知识库编辑的内容 --- src/views/project/yw/dataManage/knowledge/Knowledge.vue | 238 +++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 172 insertions(+), 66 deletions(-) diff --git a/src/views/project/yw/dataManage/knowledge/Knowledge.vue b/src/views/project/yw/dataManage/knowledge/Knowledge.vue index ddf6d4a..553d08f 100644 --- a/src/views/project/yw/dataManage/knowledge/Knowledge.vue +++ b/src/views/project/yw/dataManage/knowledge/Knowledge.vue @@ -1,60 +1,95 @@ <template> - <div class="h100 overflow-y-auto p-[16px]"> + <div class="h100 overflow-y-auto"> <div class="flex flex-col h100"> - <div class="text-[16px] font-[500] h-[22px]">鐭ヨ瘑搴撶鐞�</div> - <div class="mx-0 mt-[12px] mb-[16px] flex justify-between items-center"> - <div class="flex-col"> - <el-input - v-model="knowledgeBaseForm.title" - style="width: 230px; margin-right: 10px; background: #ffffff; border-radius: 6px; transition: all 0.2s" - placeholder="鎼滅储鐭ヨ瘑搴撳悕绉�" - clearable - ></el-input> - <el-button type="primary" icon="ele-Search" @click="handleQueryTable"> 鏌ヨ </el-button> - <el-button icon="ele-Refresh" @click="resetQuery">閲嶇疆 </el-button> - </div> - <el-button icon="ele-Plus" @click="createKnowledgeBase()" type="primary"> 鍒涘缓鐭ヨ瘑搴� </el-button> - </div> - <div class="flex flex-wrap gap-[12px]"> - <div class="flex flex-wrap gap-3 overflow-x-auto set_item_jel" v-for="item in displayTableData" :key="item.id"> - <img :src="knowledgeLeft" class="set_item_img" /> - <div class="set_item_content"> - <div class="flex items-center"> - <div class="mr-[10px] text-[14px] font-[500] h-[22px]">{{ item.title }}</div> - <span class="set_desc_text"> - <span class="set_desc_icon ywifont ywicon-wendang"> </span> - 1涓煡璇� - </span> - <span class="set_desc_text"> - <span class="set_desc_icon ywifont ywicon-fenshu_an"> </span> - {{ item.scope }} - </span> - <span class="set_desc_text"> - <span class="set_desc_icon ywifont ywicon-cshy-shizhong"> </span> - {{ item.create_time }}鏇存柊 - </span> - <span - :class="{ - 'text-orange-500': item.publish === SupervisorPublished.N, - 'text-green-500': item.publish === SupervisorPublished.Y, - }" - class="text-[12px]" - > - {{ supervisorPublishedMap[item.publish] }} - </span> + <el-row class="h100"> + <el-col :span="4" class="h100 px-[10px]"> + <LeftTreeByMgr + v-loading="treeLoading" + class="h100 p-[20px]" + ref="leftTreeRef" + :defaultProps="{ + id: 'group_id', + label: 'group_name', + children: 'children', + }" + :treedata="listTreeData" + title-name="鍒嗙粍鍒楄〃" + :show-more-operate="false" + :show-add="false" + defaultExpandAll + :current-node-key="currentListID" + :node-icon="() => 'ele-Document'" + @click="handleClickNode" + > + </LeftTreeByMgr> + </el-col> + <el-col :span="20" class="h100 p-[10px]"> + <div class="text-[16px] font-[500] h-[22px]">鐭ヨ瘑搴撶鐞�</div> + <div class="mx-0 mt-[12px] mb-[16px] flex justify-between items-center"> + <div class="flex-col"> + <el-input + v-model="knowledgeBaseForm.title" + style="width: 230px; margin-right: 10px; background: #ffffff; border-radius: 6px; transition: all 0.2s" + placeholder="鎼滅储鐭ヨ瘑搴撳悕绉�" + clearable + ></el-input> + <el-button type="primary" icon="ele-Search" @click="handleQueryTable"> 鏌ヨ </el-button> + <el-button icon="ele-Refresh" @click="resetQuery">閲嶇疆 </el-button> + </div> + <el-button icon="ele-Plus" @click="createKnowledgeBase()" type="primary"> 鍒涘缓鐭ヨ瘑搴� </el-button> + </div> + <div class="flex flex-wrap gap-[12px]"> + <div class="flex flex-wrap gap-3 overflow-x-auto set_item_jel" v-for="item in displayTableData" :key="item.id"> + <img :src="knowledgeLeft" class="set_item_img" /> + <div class="set_item_content"> + <div class="flex items-center"> + <div class="mr-[10px] text-[14px] font-[500] w-[100px]">{{ item.title }}</div> + <div class="flex flex-wrap gap-1"> + <span class="set_desc_text"> + <span class="set_desc_icon ywifont ywicon-wendang"> </span> + 1涓煡璇� + </span> + <span class="set_desc_text"> + <span class="set_desc_icon ywifont ywicon-fenshu_an"> </span> + {{ item.scope }} + </span> + <span class="set_desc_text"> + <span class="set_desc_icon ywifont ywicon-cshy-shizhong"> </span> + {{ item.create_time }}鏇存柊 + </span> + <span + :class="{ + 'text-orange-500': item.publish === SupervisorPublished.N, + 'text-green-500': item.publish === SupervisorPublished.Y, + }" + class="text-[12px]" + > + {{ supervisorPublishedMap[item.publish] }} + </span> + </div> + </div> + </div> + <div class="set_btn_group"> + <el-button + link + class="text-[12px]" + @click="publishKnowledgeBase(item)" + :style="{ color: item.publish === SupervisorPublished.Y ? '#f97316' : '#22c55e' }" + >{{ item.publish === SupervisorPublished.Y ? '涓嬫灦' : '鍙戝竷' }} + </el-button> + <el-divider direction="vertical" /> + <el-button link class="text-[12px] text-[#686682]" @click="viewKnowledgeBase(item)">鏌ョ湅 </el-button> + <el-divider direction="vertical" /> + <el-button link class="text-[12px] text-[#686682]" @click="openChatTest(item)">瀵硅瘽娴嬭瘯 </el-button> + <el-divider direction="vertical" /> + <el-button link class="text-[12px] text-[#686682]" @click="editKnowledgeBase(item)">缂栬緫 </el-button> + <el-divider direction="vertical" /> + <el-button link class="text-[12px]" @click="deleteKnowledgeBase(item)" style="color: #f00">鍒犻櫎 </el-button> + </div> </div> </div> - <div class="set_btn_group"> - <el-button link class="text-[12px] text-[#686682]" @click="viewKnowledgeBase(item)">鏌ョ湅 </el-button> - <el-divider direction="vertical" /> - <el-button link class="text-[12px] text-[#686682]" @click="openChatTest(item)">瀵硅瘽娴嬭瘯 </el-button> - <el-divider direction="vertical" /> - <el-button link class="text-[12px] text-[#686682]" @click="editKnowledgeBase(item)">缂栬緫 </el-button> - <el-divider direction="vertical" /> - <el-button link class="text-[12px]" @click="deleteKnowledgeBase(item)" style="color: #f00">鍒犻櫎 </el-button> - </div> - </div> - </div> + </el-col> + </el-row> </div> <div v-if="chatTestIsShow" @@ -75,26 +110,78 @@ </div> </div> </template> - <script setup lang="ts"> import { useDraggable } from '@vueuse/core'; +import axios, { CancelTokenSource } from 'axios'; import { ElMessage, ElMessageBox } from 'element-plus'; -import { nextTick, onMounted, ref } from 'vue'; +import { computed, nextTick, onMounted, ref } from 'vue'; import { useRouter } from 'vue-router'; -import { check_docvector_validate, delete_docvector_name, get_docvector_list } from '/@/api/knowledge/docvector'; +import * as agentGroupApi from '/@/api/ai/agentGroup'; +import { + check_docvector_validate, + delete_docvector_name, + get_docvector_list, + publish_docvector_name, +} from '/@/api/knowledge/docvector'; import Chat from '/@/components/chat/Chat.vue'; +import LeftTreeByMgr from '/@/components/tree/leftTreeByMgr.vue'; import { useQueryTable } from '/@/hooks/useQueryTable'; import mittBus from '/@/utils/mitt'; import { useCompRef } from '/@/utils/types'; +import { convertListToTree } from '/@/utils/util'; import { SupervisorPublished, supervisorPublishedMap } from '/@/views/project/yw/lowCode/sqlAmis/types'; +import { OptClassificationMap, classificationEnum } from '/@/views/types/metrics'; import knowledgeLeft from '/static/images/knowledge/data_type_1.png'; const router = useRouter(); +//#region ====================== 宸︿晶鏍戞暟鎹紝tree init ====================== +const leftTreeRef = useCompRef(LeftTreeByMgr); +const treeLoading = ref(false); +const listData = ref([]); +const currentListID = computed(() => currentNode.value?.group_id); +const currentNode = ref(null); +const listTreeData = computed(() => { + const byParentData = convertListToTree(listData.value, { + ID: 'group_id', + ParentID: 'p_group_id', + Children: 'children', + }); + const result = []; + byParentData.forEach((item) => { + if (item.group_type == OptClassificationMap[classificationEnum.Knowledge]) { + result.push(item); + } + }); + return result; +}); +const handleClickNode = (data) => { + nextTick(() => { + leftTreeRef.value?.treeRef.setCurrentKey(data.group_id); + }); + currentNode.value = data; + docvectorList(); +}; + +const getListTreeData = async () => { + const res = await agentGroupApi.getSceneGroupTreeByPost(); + listData.value = res.groups || []; + const firstListTreeNode = listTreeData.value[0]; + if (firstListTreeNode) { + handleClickNode(firstListTreeNode); + } else { + knowledgeBaseList.value = []; + currentNode.value = null; + } +}; +//#endregion //#region ====================== 鑾峰彇鐭ヨ瘑搴搒heet鍒楄〃 ====================== const knowledgeBaseList = ref([]); //鍒涘缓鐭ヨ瘑搴� const createKnowledgeBase = () => { router.push({ name: 'AddKnowledge', + query: { + group_id: currentListID.value, + }, }); }; //鑾峰彇鐭ヨ瘑搴撳垪琛� @@ -104,7 +191,8 @@ res.values.forEach((item) => { item.create_time = new Date(item.create_time).toLocaleString(); }); - knowledgeBaseList.value = res.values; + const filterDocData = res.values.filter((item) => item.group_id === currentListID.value); + knowledgeBaseList.value = filterDocData; } else { return ElMessage.error('鑾峰彇鍒楄〃绱㈠紩澶辫触' + (res?.json_msg ? `锛�${JSON.stringify(res.json_msg)}` : '')); } @@ -136,6 +224,7 @@ knowledge_desc: row.desc, knowledge_prompt: row.prompt, knowledge_scope: row.scope, + knowledge_publish: row.publish, }, }); }; @@ -148,6 +237,17 @@ }, }); }; +//鍙戝竷 +const publishKnowledgeBase = async (row) => { + const res = await publish_docvector_name({ + knowlg_id: row.id, + publish: row.publish === SupervisorPublished.Y ? SupervisorPublished.N : SupervisorPublished.Y, + }); + if (res.json_ok) { + row.publish = row.publish === SupervisorPublished.Y ? SupervisorPublished.N : SupervisorPublished.Y; + ElMessage.success('鍚屾鎴愬姛'); + } +}; //#endregion //#region ====================== 鎼滅储琛ㄦ牸锛屽琛ㄦ牸鎺掑簭 ====================== @@ -159,7 +259,6 @@ }); //#endregion //#region ====================== Chat 娴嬭瘯 ====================== - const chatRef = useCompRef(Chat); const chatTestMapRow = ref(null); const chatTestIsShow = ref(false); @@ -168,20 +267,15 @@ chatTestIsShow.value = true; nextTick(() => { chatRef.value.clear(); - chatRef.value.autoSend(row.prompt); }); }; - const closeChatTest = () => { chatTestMapRow.value = null; chatTestIsShow.value = false; }; - const draggableChatRef = ref<HTMLElement | null>(null); const chatDragHandlerRef = ref<HTMLDivElement>(null); const chatDragContainerRef = ref<HTMLDivElement>(null); - -// `style` will be a helper computed for `left: ?px; top: ?px;` const { x, y, style } = useDraggable(draggableChatRef, { handle: chatDragHandlerRef, initialValue: { @@ -189,8 +283,9 @@ y: document.body.clientHeight / 2 - 400, }, }); - -const questionAi = async (text) => { +const questionAi = async (text, sourceObj: { source: CancelTokenSource }) => { + const currentSource = axios.CancelToken.source(); + sourceObj.source = currentSource; const res = await check_docvector_validate( { knowlg_id: chatTestMapRow.value.id, @@ -198,15 +293,26 @@ }, { loading: false, + cancelToken: currentSource.token, } ); return res; }; +//#endregion onMounted(() => { - docvectorList(); + getListTreeData(); mittBus.on('addKnowledgeBaseObj', (obj) => { knowledgeBaseList.value.push(obj); }); + mittBus.on('updateKnowledgeBaseObj', (formValue) => { + const foundIndex = knowledgeBaseList.value.findIndex((item) => item.id === formValue.id); + if (foundIndex > -1) { + knowledgeBaseList.value[foundIndex] = { + ...knowledgeBaseList.value[foundIndex], + ...formValue, + }; + } + }); }); </script> <style scoped lang="scss"> -- Gitblit v1.9.3