From a4ca216c5b215f323b3c439b2f445dad72bbfce1 Mon Sep 17 00:00:00 2001
From: zhangxiao <898441624@qq.com>
Date: 星期一, 26 八月 2024 16:44:31 +0800
Subject: [PATCH] fix: 修改bug

---
 src/views/sessionManager/index.vue |  462 +++++++++++++++++++++++++++++----------------------------
 1 files changed, 235 insertions(+), 227 deletions(-)

diff --git a/src/views/sessionManager/index.vue b/src/views/sessionManager/index.vue
index 31bb72c..d140f21 100644
--- a/src/views/sessionManager/index.vue
+++ b/src/views/sessionManager/index.vue
@@ -1,5 +1,5 @@
 <template>
-  <div class="container">
+  <div class="container" id="container">
     <!--    <AddSession-->
     <!--      :modalObj="modalObj"-->
     <!--      @addSession="addSession"-->
@@ -23,14 +23,16 @@
                 <!--                <span class="title">{{ agentTitle }}</span>-->
 
                 <a-popover position="bottom" trigger="click">
-                  <a-button border
+                  <a-button border>
+                    <span
+                      style="
+                        width: 100px;
+                        overflow: hidden;
+                        text-overflow: ellipsis;
+                        white-space: nowrap;
+                      "
+                      >{{ from.name }}</span
                     >
-                    <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>
@@ -55,12 +57,13 @@
             ref="scrollbar"
             id="home"
             class="chat-list"
-            style="
-              width: 80%;
-              overflow: auto;
-              height: calc(100vh - 380px);
-              margin: 0px auto 20px;
-            "
+            style="width: 80%; overflow: auto; margin: 0px auto 20px"
+            :style="{
+              height:
+                uploaditemList.length > 0
+                  ? 'calc(100vh - 480px)'
+                  : 'calc(100vh - 380px)',
+            }"
           >
             <div
               class="chat-item"
@@ -84,30 +87,68 @@
                 <template #avatar>
                   <img
                     class="icon-user-jpg"
-                    src="../../assets/images/icon-chart.png"
+                    src="../../assets/images/icon-picture.png"
                     alt="鏈湴鍥剧墖"
                   />
                 </template>
                 <template #content>
-                  <!--                  <a-card :class="{ chatItemAnswer: theme === 'light' }">-->
-                  <!--                    <div-->
-                  <!--                      :class="{ light: theme === 'light' }"-->
-                  <!--                      v-html="sessionDetail.content.replace(/\n/g, '<br/>')"-->
-                  <!--                    >-->
-                  <!--                    </div>-->
-                  <!--                  </a-card>-->
-                  <a-textarea
-                    readonly
-                    auto-size
-                    v-model="sessionDetail.content"
-                    :class="{ chatItemAnswer: theme === 'light' }"
-                    :style="{
-                      backgroundColor:
-                        theme === 'light' ? '#ffffff' : '#000000',
-                    }"
-                    style="border: none"
-                  >
-                  </a-textarea>
+                  <a-card v-if="isExistTip(sessionDetail.content)">
+                    <div
+                      :class="{ chatItemAnswer: theme === 'light' }"
+                      :style="{
+                        backgroundColor:
+                          theme === 'light' ? '#ffffff' : '#000000',
+                      }"
+                      style="border: none; display: inline"
+                      v-for="(item, tipIndex) in tipMatch(sessionDetail)"
+                    >
+                      <span v-if="tipIndex == 0">
+                        {{ sessionDetail.content.substring(0, item.index) }}
+                        <a-tooltip
+                          background-color="#3491FA"
+                          :content="
+                            getTipContent(messagenList.reference, index)
+                          "
+                        >
+                          <img
+                            style="width: 20px; height: 20px"
+                            :src="tipImage"
+                          />
+                        </a-tooltip>
+                      </span>
+                      <span v-else>
+                        {{
+                          sessionDetail.content.substring(
+                            item.preIndex + item.item.length,
+                            item.index
+                          )
+                        }}
+                        <a-tooltip
+                          background-color="#3491FA"
+                          :content="
+                            getTipContent(messagenList.reference, index)
+                          "
+                        >
+                          <img
+                            style="width: 20px; height: 20px"
+                            :src="tipImage"
+                          />
+                        </a-tooltip>
+                      </span>
+                    </div>
+                  </a-card>
+                  <a-card v-else>
+                    <div
+                      :class="{ chatItemAnswer: theme === 'light' }"
+                      :style="{
+                        backgroundColor:
+                          theme === 'light' ? '#ffffff' : '#000000',
+                      }"
+                      style="border: none"
+                    >
+                      {{ sessionDetail.content }}
+                    </div>
+                  </a-card>
                 </template>
                 <!-- <div>{{ sessionDetail.role === 'assistant' }}</div> -->
                 <template #actions>
@@ -156,7 +197,7 @@
                 <template #avatar>
                   <img
                     class="icon-user-jpg"
-                    src="../../assets/images/icon-chart.png"
+                    src="../../assets/images/icon-picture.png"
                     alt="鏈湴鍥剧墖"
                   />
                 </template>
@@ -219,7 +260,11 @@
                 v-model="inputMsg"
                 @keydown.shift.enter="handleShiftEnter"
                 @keydown.enter="sendMessage"
-                placeholder="杈撳叆鎮ㄦ兂浜嗚В鐨勫唴瀹癸紝Shift+Enter鎹㈣锛孍nter鍙戦��"
+                :placeholder="
+                  uploaditemList.length > 0
+                    ? '鏁寸悊杩欎簺鏂囦欢鐨勬牳蹇冨唴瀹�'
+                    : '杈撳叆鎮ㄦ兂浜嗚В鐨勫唴瀹癸紝Shift+Enter鎹㈣锛孍nter鍙戦��'
+                "
                 allow-clear
                 show-word-limit
                 :disabled="chatDis"
@@ -233,27 +278,18 @@
                   maxRows: 5,
                 }"
               />
-              <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>
+              <div
+                style="
+                  width: 100%;
+                  display: flex;
+                  justify-content: space-between;
+                "
+              >
+                <updataFile
+                  ref="fileInput"
+                  :sessionId="activeSessionId"
+                  @selectFileCallback="selectFileCallback"
+                ></updataFile>
                 <a-button
                   :disabled="chatDis"
                   @click="sentClick"
@@ -264,62 +300,22 @@
                   <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-->
-            <!--                ref="uploadRef"-->
-            <!--                :file-list="uploadList"-->
-            <!--                :limit="1"-->
-            <!--                multiple-->
-            <!--                :custom-request="customRequest"-->
-            <!--                style="font-size: 24px;margin-bottom: 10px;position: relative;width: 200px">-->
-            <!--                <template #upload-button>-->
-            <!--                  <icon-attachment style="color: #0960bd;position: absolute;top:-50px;left: 20px;z-index: 10000"/>-->
-            <!--                </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>-->
-            <div class="uploadFileList">
+            <div class="uploadFileList" v-if="uploaditemList.length > 0">
               <div
                 class="files"
                 v-for="(item, index) in uploaditemList"
                 :key="index"
-                style="position: relative; width: 200px; margin-top: 10px"
+                style="
+                  position: relative;
+                  width: 200px;
+                  margin-top: 10px;
+                  margin-right: 20px;
+                "
               >
                 <a-comment
                   :author="item.name"
-                  :content="(item.size/1024).toFixed(2) + 'K'"
+                  :content="item.size"
                   style="
                     background: var(--color-bg-2);
                     padding: 10px;
@@ -337,9 +333,10 @@
                       </template>
                     </a-spin>
                     <!--                    <a-button type="text" :loading="onFileSelectedLoading" v-if="onFileSelectedLoading"></a-button>-->
-                    <a-avatar v-if="!onFileSelectedLoading">
-                      <icon-file style="color: #0960bd" />
-                    </a-avatar>
+                    <!--                    <a-avatar v-if="!onFileSelectedLoading">-->
+                    <!--                      <icon-file style="color: #0960bd" />-->
+                    <!--                    </a-avatar>-->
+                    <img :src="getIconByExtension(item.name)" alt="" />
                   </template>
                 </a-comment>
                 <icon-close-circle-fill
@@ -381,6 +378,12 @@
         </div>
       </a-col>
     </a-row>
+    <a-modal title=" " v-model:visible="fileVisible" :footer="false" fullscreen>
+      <!--      <docx  previewSrc="http://192.168.20.116:1080/v1/document/get/405c3efa4d8c11ef97560242ac120006"></docx>-->
+      <docx v-if="documenttype == 'docx'" :previewSrc="previewSrc"></docx>
+      <excel v-if="documenttype == 'excel'" :previewSrc="previewSrc"></excel>
+      <txtPdf v-if="documenttype == 'txtPdf'" :previewSrc="previewSrc"></txtPdf>
+    </a-modal>
     <a-modal
       v-model:visible="visible"
       title="淇敼鍚嶇О"
@@ -389,12 +392,7 @@
       :footer="false"
       title-align="start"
     >
-      <a-form
-        ref="formRef"
-        :rules="rules"
-        :model="from"
-        @submit="handleSubmit"
-      >
+      <a-form ref="formRef" :rules="rules" :model="from" @submit="handleSubmit">
         <a-form-item field="name" label="鍚嶇О">
           <a-input v-model="from.name" placeholder="璇疯緭鍏ュ悕绉�" />
         </a-form-item>
@@ -414,12 +412,7 @@
   </div>
 </template>
 <script setup lang="ts">
-  import {
-    IconClose,
-    IconSearch,
-    IconTiktokColor,
-  } from '@arco-design/web-vue/es/icon';
-  import { useAppStore, useUserStore } from '@/store';
+  import { useAppStore, userModelState, useUserStore } from '@/store';
   import {
     computed,
     nextTick,
@@ -439,7 +432,7 @@
   import agentSession from '@/views/sessionManager/components/agentSession.vue';
   import historySession from '@/views/sessionManager/components/historySession.vue';
   import smartAi from '@/views/sessionManager/components/smartAi.vue';
-  import setName from '@/views/sessionManager/components/setName.vue';
+  import updataFile from '@/views/sessionManager/components/updataFile.vue';
   import EventBus from '@/utils/EventBus';
   import {
     addSessionApi,
@@ -458,10 +451,20 @@
   import pdfImg3 from '@/assets/session/execl.png';
   import pdfImg4 from '@/assets/session/icon-txt.png';
   import pdfImg5 from '@/assets/session/txt.png';
+  import tipImage from '@/assets/session/tip.png';
+
+  import docx from '@/views/dmx/knowledgeLib/components/docx.vue';
+  import excel from '@/views/dmx/knowledgeLib/components/excel.vue';
+  import txtPdf from '@/views/dmx/knowledgeLib/components/txtPdf.vue';
 
   // const url = ref('../../assets/session/PDF.png');
 
-  const sessionDetailList = ref([]); //鏍规嵁浼氳瘽id鍑烘潵鐨勪細璇濊鎯�
+  const sessionDetailList = ref([
+    {
+      content: '浣犲ソ锛� 鎴戞槸浣犵殑鍔╃悊锛屾湁浠�涔堝彲浠ュ府鍒颁綘鐨勫悧锛�',
+      role: 'assistant',
+    },
+  ]); //鏍规嵁浼氳瘽id鍑烘潵鐨勪細璇濊鎯�
   const messagenList = ref({});
   const sessionList = ref([]); //浼氳瘽鍒楄〃
   const modalObj = reactive({ add: false });
@@ -472,7 +475,7 @@
   const agentTitle = ref('鏈懡鍚嶄細璇�');
   let chatObj = reactive({});
   let from = reactive({
-    name:'鏈懡鍚嶄細璇�',
+    name: '鏈懡鍚嶄細璇�',
   });
   const isStopChat = ref(false);
   const currIndex = ref(0);
@@ -496,7 +499,13 @@
   const fileInput = ref(null);
   const chatDataMeg = reactive({});
   const visible = ref(false);
+  const fileVisible = ref(false);
   let toStop = false;
+  let documenttype = ref('docx');
+  let previewSrc = ref('');
+
+  const modelStore = userModelState();
+  const httpUrl = modelStore.hrefUrl;
 
   const rules = {
     name: [
@@ -522,8 +531,28 @@
     }
   };
   let dataItem = [];
-  const getTxt = (data, role, message, index) => {
+  const isExistTip = (message: string): boolean => {
     if (/##[0-9]\$\$/.test(message)) {
+      return true;
+    } else {
+      return false;
+    }
+  };
+
+  const tipMatch = (session: any): any[] => {
+    //match session.content涓殑##[0-9]$$鐨勭储寮�
+    let indexs: any[] = [];
+    let preTip = 0;
+    session.content.match(/##([0-9]+)\$\$/g)?.map((item) => {
+      let i = session.content.indexOf(item);
+      indexs.push({ index: i, item: item, preIndex: preTip });
+      preTip = i;
+    });
+    return indexs;
+  };
+
+  const getTxt = (data, role, message, index) => {
+    if (isExistTip(message)) {
       if (role == 'assistant' && index) {
         let i = index / 2 - 1 > 0 ? index / 2 - 1 : 0;
         dataItem = data[i].doc_aggs;
@@ -535,20 +564,30 @@
     return dataItem;
   };
 
-  const clickHref = (item) => {
-    // return Message.warning('鏆傛棤娉曟煡鐪�');
-    // window.open(`/api/v1/document/get/${item.doc_id}`, '_blank');
-    downloadFile({
-      url: `/api/v1/document/get/${item.doc_id}`,
-      filename: item.doc_name,
+  const getTipContent = (data, index): string => {
+    let maxSimilarityContent = '';
+    let i = index / 2 - 1 > 0 ? index / 2 - 1 : 0;
+    let maxSimilarity = 0;
+    data[i].chunks.forEach((chunk) => {
+      if (chunk.similarity > maxSimilarity) {
+        maxSimilarity = chunk.similarity;
+        maxSimilarityContent = chunk.content_with_weight;
+      }
     });
+    return maxSimilarityContent;
   };
 
-   const downloadFile = ({
-                                 url,
-                                 filename,
-                                 target,
-                               }: {
+  const clickHref = async (item) => {
+    documenttype.value = item.doc_name.split('.').pop();
+    previewSrc.value = httpUrl + `/api/v1/document/get/${item.doc_id}`;
+    fileVisible.value = true;
+  };
+
+  const downloadFile = ({
+    url,
+    filename,
+    target,
+  }: {
     url: string;
     filename?: string;
     target?: string;
@@ -603,74 +642,21 @@
     // formRef.value.resetFields();
   };
 
-  const selectFile = () => {
-    fileInput.value.click();
+  const selectFileCallback = (data) => {
+    console.log(data, 'selectFileCallback');
+    uploaditemList.value = [...uploaditemList.value, ...data];
   };
 
   let onFileSelectedLoading = ref(false);
-  const onFileSelected = (event) => {
-    const file = event.target.files[0];
-    uploaditemList.value = [
-      {
-        name: file.name,
-        size: file.size,
-      },
-    ];
-    if (file) {
-      onFileSelectedLoading.value = true;
-      const formData = new FormData();
-      formData.append('file', file);
-      formData.append('conversation_id', activeSessionId.value);
-      uploadWithoutKb(formData).then((res) => {
-        // console.log(res);
-        if (res.code == 200) {
-          console.log(res);
-          console.log(uploaditemList.value);
-          onFileSelectedLoading.value = false;
-          fileInput.value.value = '';
-          uploaditemList.value = [];
-          Message.success('涓婁紶鎴愬姛');
-        } else {
-          Message.error('涓婁紶澶辫触');
-        }
-      });
-    }
-  };
 
   const deleteFile = (item) => {
     console.log(uploaditemList.value);
-    uploaditemList.value = [];
+    uploaditemList.value.splice(item.index, 1);
   };
 
   const { toClipboard } = useClipboard();
   const copy = async (text) => {
     await toClipboard(text); //鍙傛暟涓鸿澶嶅埗鐨勬枃鏈�
-  };
-
-  const onChange = (fileList) => {
-    // files.value = fileList;
-  };
-
-  // 涓婁紶鏂囦欢
-  const customRequest = async (option) => {
-    const { onProgress, onError, onSuccess, fileItem, name } = option;
-    fileItem.status = 'ready';
-    if (fileItem.file) {
-      const formData = new FormData();
-      formData.append('file', fileItem.file);
-      formData.append('conversation_id', activeSessionId.value);
-      uploadWithoutKb(formData).then((res) => {
-        // console.log(res);
-        if (res.code == 200) {
-          console.log(res);
-          console.log(uploadList.value);
-          fileItem.status = 'done';
-          // uploadList.value = [];
-        } else {
-          fileItem.status = 'error';
-        }
-      });
-    }
   };
 
   const DialogList = async () => {
@@ -739,26 +725,6 @@
     event.preventDefault();
     inputMsg.value += '\n';
   };
-  const dialogChange = (val) => {
-    // 鍒ゆ柇褰撳墠鏄櫤鑳戒綋鎴朼gent
-    // console.log(val, 'val');
-    dialogId.value = val;
-    dialogs.value.forEach((item) => {
-      if (item.id === val) {
-        Object.assign(dialogObj, item);
-      }
-    });
-    console.log(dialogObj.type, 'dialogObj');
-    if (dialogObj.type == 1) {
-      agentType.value = '1';
-      querySessionList();
-    } else {
-      agentType.value = '2';
-      queryAgentSessionList();
-    }
-
-    // querySessionList();
-  };
 
   // 鍙戦��
   const sentClick = () => {
@@ -779,21 +745,39 @@
           event.preventDefault(); // 闃绘榛樿琛屼负锛屽嵆涓嶆崲琛�
         }
 
-        // if (!activeSessionId.value) {
-        //   Message.warning("璇烽�夋嫨浼氳瘽");
-        //   chatDis.value = false;
-        //   loading.value = false;
-        //   return;
-        // }
-
         // if (displayedText.value) {
         //   querySessionList();
         // }
 
         if (inputMsg.value) {
-          startChat(inputMsg.value);
-
-          inputMsg.value = '';
+          if (!activeSessionId.value) {
+            //鏂板缓浼氳瘽
+            // 濡傛灉鏈変細璇漣d
+            console.log(inputMsg.value, '鏂板缓浼氳瘽鍚嶇О');
+            const res = await addSessionApi({
+              dialog_id: '',
+              conversation_desc: inputMsg.value,
+            });
+            // console.log(res, "res");
+            if (res.code == 200) {
+              // console.log(res.data.conversation_id);
+              activeSessionId.value = res.data?.conversation_id;
+              const { code, data } = await getSessionDetailsApi(
+                res.data?.conversation_id
+              );
+              if (code === 200) {
+                console.log(data, '鏂板缓浼氳瘽璇︽儏');
+                Object.assign(chatObj, data);
+                startChat(inputMsg.value);
+                inputMsg.value = '';
+              }
+            } else {
+              Message.error('鍒涘缓浼氳瘽澶辫触锛岃閲嶈瘯');
+            }
+          } else {
+            startChat(inputMsg.value);
+            inputMsg.value = '';
+          }
         } else {
           Message.warning('娑堟伅涓嶈兘涓虹┖');
         }
@@ -899,7 +883,6 @@
     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);
@@ -995,14 +978,24 @@
     querySessionList();
   };
   onBeforeMount(() => {
-    // DialogList();
-    //鏂板缓浼氳瘽
-    createSession('');
+    activeSessionId.value = '';
   });
   onMounted(() => {
+    let container = document.getElementById('container');
+    container.addEventListener('click', () => {
+      fileInput.value.cancel();
+    });
     EventBus.on('newChat', () => {
       agentType.value = '1';
-      createSession('');
+      // createSession('');
+      activeSessionId.value = '';
+      sessionDetailList.value = [
+        {
+          content: '浣犲ソ锛� 鎴戞槸浣犵殑鍔╃悊锛屾湁浠�涔堝彲浠ュ府鍒颁綘鐨勫悧锛�',
+          role: 'assistant',
+        },
+      ];
+      from.name = '鏈懡鍚嶄細璇�';
     });
   });
   onBeforeUnmount(() => {
@@ -1361,4 +1354,19 @@
   :deep(.arco-upload-list-item-operation) {
     //display: none;
   }
+  .uploadFileList {
+    width: 100%;
+    max-height: 140px;
+    overflow-y: auto;
+    padding: 10px;
+    display: flex;
+    flex-wrap: wrap;
+    :deep(.arco-comment-author) {
+      width: 100px;
+      display: inline-block;
+      overflow: hidden; /* 闅愯棌瓒呭嚭鐨勫唴瀹� */
+      text-overflow: ellipsis; /* 浣跨敤鐪佺暐鍙锋潵浠f浛琚殣钘忕殑鏂囧瓧 */
+      white-space: nowrap; /* 涓嶆崲琛岋紝浣垮唴瀹瑰湪涓�琛屽唴鏄剧ず */
+    }
+  }
 </style>

--
Gitblit v1.8.0