From b3b34fa409762b44e6fd3c89e651f8c465556a48 Mon Sep 17 00:00:00 2001
From: zhangxiao <898441624@qq.com>
Date: 星期五, 23 八月 2024 19:25:05 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.5.5:10010/r/web/flow_web

---
 src/views/authority/role/index.vue                     |   31 ++++
 src/views/sessionManager/components/agentSession.vue   |  132 ++++++++++++---------
 src/views/sessionManager/index.vue                     |  147 ++++++++++++++++++------
 src/api/authority.ts                                   |    4 
 src/views/sessionManager/components/historySession.vue |    1 
 src/views/dmx/knowledgeLib/config.vue                  |    6 
 src/views/login/components/login-form.vue              |    4 
 7 files changed, 224 insertions(+), 101 deletions(-)

diff --git a/src/api/authority.ts b/src/api/authority.ts
index 697a8b3..8f855da 100644
--- a/src/api/authority.ts
+++ b/src/api/authority.ts
@@ -175,9 +175,9 @@
 }
 
 export function KnowledgeList() {
-  return axios.get<Result<Knowledge>>('/base/system/knowledge/list');
+  return axios.get<Result<Knowledge>>('/api/v1/kb/list');
 }
 
 export function DialogList() {
-  return axios.get<Result<Knowledge>>('/base/system/dialog/list');
+  return axios.get<Result<Knowledge>>('/api/v1/dialog/list');
 }
diff --git a/src/views/authority/role/index.vue b/src/views/authority/role/index.vue
index 300fc72..f049890 100644
--- a/src/views/authority/role/index.vue
+++ b/src/views/authority/role/index.vue
@@ -285,6 +285,8 @@
   import Authheader from '@/views/authority/components/authheader.vue';
   import router from "@/router";
   import { queryCanvasList } from "@/api/Agent";
+  import { getUserResources } from "@/utils/auth";
+  import { forEach } from "lodash";
 
   let treeDataMenu = ref([]);
   let checkedKeysMenu = ref([]);
@@ -667,18 +669,43 @@
   };
 
 
+  let userResources = JSON.parse(getUserResources());
+  const isExist = (val): boolean => {
+    let isok = false;
+    userResources.forEach((r) => {
+      if (val == r.menuId) {
+        isok = true;
+      }
+    });
+    return isok;
+  };
+  const removeChild = (nodes,newT) => {
+    nodes.forEach((child) => {
+      if (isExist(child.menuId)){
+        newT.push(child);
+        let nt = [];
+        if (child.children?.length > 0) {
+          removeChild(child.children, nt);
+          child.children = nt;
+        }
+      }
+    });
+  };
+
   const MenuData = async (key) => {
     await ResourceList(key).then((res) => {
+      let newTree=[]
+      removeChild(res.rows,newTree)
       treeDataMenu.value = [...res.rows];
     });
   };
 
   KnowledgeList().then((res) => {
-    knowledgeList.value = res.rows;
+    knowledgeList.value = res.data;
   });
 
   DialogList().then((res) => {
-    DialogsList.value = res.rows;
+    DialogsList.value = res.data;
   });
   queryCanvasList(null).then((canvas) => {
     AgentList= canvas.data
diff --git a/src/views/dmx/knowledgeLib/config.vue b/src/views/dmx/knowledgeLib/config.vue
index 48c6b6a..088b890 100644
--- a/src/views/dmx/knowledgeLib/config.vue
+++ b/src/views/dmx/knowledgeLib/config.vue
@@ -47,7 +47,7 @@
             </a-select>
           </a-form-item>
           <a-form-item field="parser_id" label="瑙f瀽鏂规硶">
-            <a-select v-model="form.parser_id" placeholder="璇烽�夋嫨" :disabled="kbObj.chunk_num  && kbObj.token_num " >
+            <a-select v-model="form.parser_id" placeholder="璇烽�夋嫨" :disabled="!!(kbObj.chunk_num  && kbObj.token_num)" >
               <a-option v-for="item in parser_ids" :key="item.value" :label="item.name" :value="item.value"></a-option>
             </a-select>
           </a-form-item>
@@ -314,7 +314,7 @@
   Object.assign(form,{
 
   });
-  formRef.value.resetFields();
+  // formRef.value.resetFields();
 }
 
 const queryModel = async (params) => {
@@ -331,7 +331,7 @@
 
 const changekbObj = (value) => {
   nextTick(()=>{
-    formRef.value.resetFields();
+    // formRef.value.resetFields();
     kbObj = value;
     console.log(kbObj, 'kbObj');
     let configObj = {
diff --git a/src/views/login/components/login-form.vue b/src/views/login/components/login-form.vue
index e615cf8..8656e4a 100644
--- a/src/views/login/components/login-form.vue
+++ b/src/views/login/components/login-form.vue
@@ -12,11 +12,11 @@
     >
       <a-form-item
         field="email"
-        :rules="[{ required: true, message: '璇疯緭鍏ラ偖绠�' }]"
+        :rules="[{ required: true, message: '璇疯緭鍏ョ敤鎴峰悕' }]"
         :validate-trigger="['change', 'blur']"
         hide-label
       >
-        <a-input v-model="userInfo.email" placeholder="璇疯緭鍏ラ偖绠�">
+        <a-input v-model="userInfo.email" placeholder="璇疯緭鍏ョ敤鎴峰悕">
           <template #prefix>
             <icon-user />
           </template>
diff --git a/src/views/sessionManager/components/agentSession.vue b/src/views/sessionManager/components/agentSession.vue
index 0c25dda..9c70b48 100644
--- a/src/views/sessionManager/components/agentSession.vue
+++ b/src/views/sessionManager/components/agentSession.vue
@@ -9,7 +9,13 @@
           trigger="click"
         >
           <a-button border
-          >{{agentTitle}}
+          >
+            <span style="
+                       width: 100px;
+                      overflow: hidden;
+                      text-overflow: ellipsis;
+                      white-space: nowrap;
+                    ">{{ from.name }}</span>
             <icon-down style="margin-left: 4px" />
           </a-button>
           <template #content>
@@ -75,7 +81,7 @@
             auto-size
             v-model="sessionDetail.content"
             :class="{ chatItemAnswer: theme === 'light' }"
-            :style="{backgroundColor: theme === 'light' ? '#ffffff' : '#000000'}"
+            :style="{ backgroundColor: theme === 'light' ? '#ffffff' : '#000000'}"
             style="border: none"
           >
           </a-textarea>
@@ -108,14 +114,14 @@
           >
           </a-textarea>
         </template>
-<!--        <template #actions>-->
-<!--          <div class="action"-->
-<!--               @click="stopChat"-->
-<!--               style="background: var(&#45;&#45;color-bg-2);color: var(&#45;&#45;color-primary-light-4);" v-if="displayedText != ''">-->
-<!--            <icon-record-stop />-->
-<!--            鍋滄鐢熸垚-->
-<!--          </div>-->
-<!--        </template>-->
+        <template #actions>
+          <div class="action"
+               @click="stopChat"
+               style="background: var(--color-bg-2);color: var(--color-primary-light-4);" v-if="displayedText != ''">
+            <icon-record-stop />
+            鍋滄鐢熸垚
+          </div>
+        </template>
       </a-comment>
     </div>
     <!-- <div class="chartStart" v-if="isStart" @click="startChat"
@@ -141,9 +147,8 @@
                   maxRows: 5,
                 }"
       />
-      <div style="height: 40px"></div>
-      <div class="btn-send">
-        <!-- <icon-send size="32" /> -->
+      <div style="width: 100%;display: flex;justify-content: space-between">
+        <span></span>
         <a-button
           :disabled="chatDis"
           @click="sentClick"
@@ -155,11 +160,24 @@
         </a-button
         >
       </div>
+<!--      <div class="btn-send">-->
+<!--        &lt;!&ndash; <icon-send size="32" /> &ndash;&gt;-->
+<!--        <a-button-->
+<!--          :disabled="chatDis"-->
+<!--          @click="sentClick"-->
+<!--          type="text"-->
+<!--          style="border-radius: 24px"-->
+<!--          :loading="loading"-->
+<!--        >-->
+<!--          <icon-send size="32" style="color: #0960bd;"/>-->
+<!--        </a-button-->
+<!--        >-->
+<!--      </div>-->
     </div>
     <a-modal v-model:visible="visible" title="淇敼鍚嶇О" @before-open="handleOpened" @cancel="handleCancel" :footer="false" title-align="start">
-      <a-form ref="formRef" :rules="rules" :model="agentObj" @submit="handleSubmit" >
+      <a-form ref="formRef" :rules="rules" :model="from" @submit="handleSubmit" >
         <a-form-item field="name" label="鍚嶇О">
-          <a-input v-model="agentTitle" placeholder="璇疯緭鍏ュ悕绉�"/>
+          <a-input v-model="from.name" placeholder="璇疯緭鍏ュ悕绉�"/>
         </a-form-item>
         <a-form-item>
           <div style="width: 100%;text-align: right">
@@ -214,11 +232,14 @@
 const theme = computed(() => {
   return appStore.theme;
 });
+let from = reactive({
+  name:'鏈懡鍚嶄細璇�',
+});
 
 const visible = ref(false);
 let isHistory = ref(false);//鏄惁鏄巻鍙茶褰�
 let dsl = reactive({});
-
+const chatDataMeg = reactive({});
 
 
 const rules = {
@@ -232,19 +253,16 @@
 
 const handleSubmit = async({values, errors}) => {
   if(errors) return;
-  // agentObj.name = agentTitle.value;
-  // agentObj.conversation_id = agentObj.id;
   console.log(agentObj, 'agentObj');
   let chatData = {
-    id:activeSessionId.value,
-    conversation_id:activeSessionId.value,
-    name: agentTitle.value
+    id:agentObj.id,
+    conversation_id:agentObj.id,
+    name: from.name
   }
   const { code, data } = await addSessionApi(chatData);
   if (data) {
     Message.success("淇敼鎴愬姛");
     handleCancel()
-    // queryAgentSessionDetail(agentObj.id);
   }
 }
 
@@ -269,15 +287,11 @@
 };
 
 const createNewAgent = async (session) => {
+  console.log(session,'鏂板缓agent浼氳瘽瀵硅薄');
   Object.assign(agentObj, session);
   isHistory.value = false;
   initPage();
-
-
 }
-
-
-
 // 璋冪敤set鏂规硶
 const agentSet = async () => {
   const res = await agentSetApi({
@@ -285,10 +299,8 @@
     title: agentObj.title,
     dsl: agentObj.dsl,
   });
-  console.log(res,'agentSet');
+  // console.log(res,'agentSet');
   if (res.code == 0) {
-    // sessionDetailList.value = res.data.dsl.messages;
-    // Message.success('淇敼鎴愬姛');
     agentReset();
   }
 }
@@ -352,30 +364,30 @@
   inputMsg.value = '';
 }
 // 璋冪敤get鏂规硶
-
 const queryAgentSessionDetail = async (id) => {
   const { code, data } = await getAgentSessionDetailsApi(id);
   if (code == 0) {
-    console.log(data,'浼氳瘽璇︽儏');
+    console.log(data,'agent浼氳瘽璇︽儏');
+    Object.assign(chatObj, data);
     sessionDetailList.value = data.dsl.messages;
-    agentTitle.value = `鍜�${data.title}鐨勪細璇漙 || '鏈懡鍚嶄細璇�';
+    agentTitle.value = `${data.title}` || '鏈懡鍚嶄細璇�';
+    from.name = `${data.title}` || '鏈懡鍚嶄細璇�';
     refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃�
   }
 };
 
-// 鑾峰彇agent浼氳瘽璇︽儏
+// 鍘嗗彶璁板綍璺宠浆鑾峰彇agent浼氳瘽璇︽儏
 const querySessionDetail = async (session) => {
-  Object.assign(agentObj, session);
-  agentObj.id = session.dialog_id;
   activeSessionId.value = session.id;
-  agentTitle.value = session.name;
-  console.log(agentTitle.value, '浼氳瘽鍚嶇О');
+  from.name = session.name;
   const { code, data } = await getSessionDetailsApi(session.id);
   if (code == 200) {
     sessionDetailList.value = data.message.messages;
     const res = await getAgentSessionDetailsApi(session.dialog_id);
     if (res.code == 0) {
-      console.log(res.data,'浼氳瘽璇︽儏');
+      console.log(res.data,'agent浼氳瘽璇︽儏');
+      Object.assign(agentObj, res.data);
+      Object.assign(chatObj, res.data);
       Object.assign(dsl, res.data.dsl);
       refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃�
     }
@@ -483,8 +495,13 @@
       if (done) {
         console.info('done');
         displayedText.value = '';
-        queryAgentSessionDetail(agentObj.id);
-        EventBus.emit('queryAppUsageList');
+        if (isStopChat.value) {
+          isStopChat.value = false;
+          setChatDataMeg(chatDataMeg);
+        } else {
+          queryAgentSessionDetail(agentObj.id);
+          EventBus.emit('queryAppUsageList');
+        }
         break;
       }
     }
@@ -494,10 +511,9 @@
 }
 
 const stopChat=async()=>{
-  // const { code, data } = await stopChatApi(activeSessionId.value);
+  // const { code, data } = await stopChatApi(agentObj.id);
   // if (code === 200) {
   //   Message.success("宸插仠姝�");
-  //   queryNewSessionDetail(activeSessionId.value);
   // }
   loading.value = false;
   chatDis.value = false;
@@ -517,21 +533,27 @@
   sessionDetailList.value = sessionDetailList.value.splice(0, sessionDetailList.value.length-2).concat(lastArr);
   console.log(sessionDetailList.value, 'sessionDetailList2');
   console.log(chatObj, 'chatObj瀵硅薄');
-  chatObj.message = chatObj.message.concat(lastArr);
-  // clearTimeout(timer!);
-  // timer = null;
-  // const { code, data } = await addSessionApi(chatObj);
-  // if (data) {
-  //   //鍋滄瀹氭椂鍣�
-  //   clearTimeout(timer!);
-  //   timer = null;
-  //   displayedText.value = "";
-  //   queryNewSessionDetail(activeSessionId.value);
-  // }
-
+  chatObj.dsl.messages = chatObj.dsl.messages.concat(lastArr);
+  Object.assign(chatDataMeg, {
+    id: chatObj.id,
+    conversation_id: chatObj.id,
+    message: sessionDetailList.value,
+  });
 
 }
 
+
+const setChatDataMeg = async (chatData) => {
+  const { code, data } = await addSessionApi(chatData);
+  if (data) {
+    //鍋滄瀹氭椂鍣�
+    clearTimeout(timer!);
+    timer = null;
+    // displayedText.value = "";
+    queryAgentSessionDetail(chatObj.id);
+  }
+};
+
 const handleShiftEnter = (event) => {
   event.preventDefault();
   inputMsg.value += '\n';
diff --git a/src/views/sessionManager/components/historySession.vue b/src/views/sessionManager/components/historySession.vue
index 58e0bb1..76a948f 100644
--- a/src/views/sessionManager/components/historySession.vue
+++ b/src/views/sessionManager/components/historySession.vue
@@ -308,6 +308,7 @@
 })
 
 onMounted(() => {
+  console.log(httpUrl,'褰撳墠鍦板潃');
   EventBus.on("history", () => {
     emit('changeAgentType','3');
     // DialogList()
diff --git a/src/views/sessionManager/index.vue b/src/views/sessionManager/index.vue
index 3404ffb..31bb72c 100644
--- a/src/views/sessionManager/index.vue
+++ b/src/views/sessionManager/index.vue
@@ -24,7 +24,13 @@
 
                 <a-popover position="bottom" trigger="click">
                   <a-button border
-                    >{{ agentTitle }}
+                    >
+                    <span style="
+                       width: 100px;
+                      overflow: hidden;
+                      text-overflow: ellipsis;
+                      white-space: nowrap;
+                    ">{{ from.name }}</span>
                     <icon-down style="margin-left: 4px" />
                   </a-button>
                   <template #content>
@@ -227,8 +233,27 @@
                   maxRows: 5,
                 }"
               />
-
-              <div class="btn-send">
+              <div style="width: 100%;display: flex;justify-content: space-between">
+                <a-button
+                  :disabled="onFileSelectedLoading"
+                  @click="selectFile"
+                  type="text"
+                  style="border-radius: 24px"
+                >
+                  <icon-attachment
+                    size="28"
+                    style="color: #0960bd"
+                  />
+                  <input
+                    ref="fileInput"
+                    type="file"
+                    style="display: none"
+                    @change="onFileSelected"
+                  />
+                </a-button>
+                  <span
+                    style="cursor: pointer;margin-left: 20px;">
+                </span>
                 <a-button
                   :disabled="chatDis"
                   @click="sentClick"
@@ -239,6 +264,17 @@
                   <icon-send size="32" style="color: #0960bd" />
                 </a-button>
               </div>
+<!--              <div class="btn-send">-->
+<!--                <a-button-->
+<!--                  :disabled="chatDis"-->
+<!--                  @click="sentClick"-->
+<!--                  type="text"-->
+<!--                  style="border-radius: 24px"-->
+<!--                  :loading="loading"-->
+<!--                >-->
+<!--                  <icon-send size="32" style="color: #0960bd" />-->
+<!--                </a-button>-->
+<!--              </div>-->
             </div>
             <!--            <div style="margin-top: 0px">-->
             <!--              <a-upload-->
@@ -253,27 +289,27 @@
             <!--                </template>-->
             <!--              </a-upload>-->
             <!--            </div>-->
-            <span
-              style="
-                position: absolute;
-                top: 94px;
-                left: 20px;
-                z-index: 999;
-                cursor: pointer;
-              "
-            >
-              <icon-attachment
-                size="28"
-                @click="selectFile"
-                style="color: #0960bd"
-              />
-              <input
-                ref="fileInput"
-                type="file"
-                style="display: none"
-                @change="onFileSelected"
-              />
-            </span>
+<!--            <span-->
+<!--              style="-->
+<!--                position: absolute;-->
+<!--                top: 94px;-->
+<!--                left: 20px;-->
+<!--                z-index: 999;-->
+<!--                cursor: pointer;-->
+<!--              "-->
+<!--            >-->
+<!--              <icon-attachment-->
+<!--                size="28"-->
+<!--                @click="selectFile"-->
+<!--                style="color: #0960bd"-->
+<!--              />-->
+<!--              <input-->
+<!--                ref="fileInput"-->
+<!--                type="file"-->
+<!--                style="display: none"-->
+<!--                @change="onFileSelected"-->
+<!--              />-->
+<!--            </span>-->
             <div class="uploadFileList">
               <div
                 class="files"
@@ -283,11 +319,12 @@
               >
                 <a-comment
                   :author="item.name"
-                  :content="item.size + ''"
+                  :content="(item.size/1024).toFixed(2) + 'K'"
                   style="
                     background: var(--color-bg-2);
                     padding: 10px;
                     border-radius: 10px;
+                    font-size: 12px;
                   "
                 >
                   <template #avatar>
@@ -355,11 +392,11 @@
       <a-form
         ref="formRef"
         :rules="rules"
-        :model="chatObj"
+        :model="from"
         @submit="handleSubmit"
       >
         <a-form-item field="name" label="鍚嶇О">
-          <a-input v-model="agentTitle" placeholder="璇疯緭鍏ュ悕绉�" />
+          <a-input v-model="from.name" placeholder="璇疯緭鍏ュ悕绉�" />
         </a-form-item>
         <a-form-item>
           <div style="width: 100%; text-align: right">
@@ -434,6 +471,9 @@
   const agentType = ref('1');
   const agentTitle = ref('鏈懡鍚嶄細璇�');
   let chatObj = reactive({});
+  let from = reactive({
+    name:'鏈懡鍚嶄細璇�',
+  });
   const isStopChat = ref(false);
   const currIndex = ref(0);
   const displayedText = ref(''); // 姝e湪鏄剧ず鐨勬枃瀛�
@@ -456,6 +496,7 @@
   const fileInput = ref(null);
   const chatDataMeg = reactive({});
   const visible = ref(false);
+  let toStop = false;
 
   const rules = {
     name: [
@@ -468,12 +509,10 @@
 
   const handleSubmit = async ({ values, errors }) => {
     if (errors) return;
-    // chatObj.name = agentTitle.value;
-    // chatObj.conversation_id = chatObj.id;
     let chatData = {
       id: chatObj.id,
       conversation_id: chatObj.id,
-      name: agentTitle.value,
+      name: from.name,
     };
     const { code, data } = await addSessionApi(chatData);
     if (data) {
@@ -484,13 +523,10 @@
   };
   let dataItem = [];
   const getTxt = (data, role, message, index) => {
-    if (/##0\$\$/.test(message)) {
+    if (/##[0-9]\$\$/.test(message)) {
       if (role == 'assistant' && index) {
-        data.forEach((item) => {
-          if (Object.keys(item).length !== 0 && item?.doc_aggs.length > 0) {
-            dataItem = item.doc_aggs;
-          }
-        });
+        let i = index / 2 - 1 > 0 ? index / 2 - 1 : 0;
+        dataItem = data[i].doc_aggs;
       }
     } else {
       dataItem = [];
@@ -501,7 +537,35 @@
 
   const clickHref = (item) => {
     // return Message.warning('鏆傛棤娉曟煡鐪�');
-    window.open(`/api/v1/document/show/${item.doc_id}`, '_blank');
+    // window.open(`/api/v1/document/get/${item.doc_id}`, '_blank');
+    downloadFile({
+      url: `/api/v1/document/get/${item.doc_id}`,
+      filename: item.doc_name,
+    });
+  };
+
+   const downloadFile = ({
+                                 url,
+                                 filename,
+                                 target,
+                               }: {
+    url: string;
+    filename?: string;
+    target?: string;
+  }) => {
+    const downloadElement = document.createElement('a');
+    downloadElement.style.display = 'none';
+    downloadElement.href = url;
+    if (target) {
+      downloadElement.target = '_blank';
+    }
+    downloadElement.rel = 'noopener noreferrer';
+    if (filename) {
+      downloadElement.download = filename;
+    }
+    document.body.appendChild(downloadElement);
+    downloadElement.click();
+    document.body.removeChild(downloadElement);
   };
 
   const getIconByExtension = computed(() => (extension) => {
@@ -740,6 +804,7 @@
   const startChat = async (valMsg) => {
     chatDis.value = true;
     loading.value = true;
+    toStop = false;
     sessionDetailList.value.push({
       content: valMsg,
       role: 'user',
@@ -767,6 +832,11 @@
       .getReader();
     currIndex.value = 0;
     while (true) {
+      if (toStop) {
+        displayedText.value = '';
+        setChatDataMeg(chatDataMeg);
+        break;
+      }
       const x = await reader?.read();
       if (x) {
         const { done, value } = x;
@@ -809,6 +879,7 @@
     loading.value = false;
     chatDis.value = false;
     isStopChat.value = true;
+    toStop = true;
     console.log('stopChat');
     console.log(displayedText.value, 'displayedText');
     console.log(sessionDetailList.value, 'sessionDetailList');
@@ -859,6 +930,7 @@
       sessionDetailList.value = data.message;
       messagenList.value = data;
       agentTitle.value = data.name;
+      from.name = data.name;
       refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃�
       isStopChat.value = false;
     }
@@ -872,6 +944,7 @@
   const querySessionDetail = async (session) => {
     sectionList.value = session;
     activeSessionId.value = session.id;
+    from.name = session.name;
     const { code, data } = await getSessionDetailsApi(session.id);
     if (code === 200) {
       sessionDetailList.value = data.message;

--
Gitblit v1.8.0