From cfdf588704b194118f1d6a1ed69e01025734bba9 Mon Sep 17 00:00:00 2001
From: yinbangzhong <zhongbangyin@126.com>
Date: 星期五, 13 九月 2024 13:45:07 +0800
Subject: [PATCH] 审计

---
 src/views/sessionManager/index.vue |  458 ++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 341 insertions(+), 117 deletions(-)

diff --git a/src/views/sessionManager/index.vue b/src/views/sessionManager/index.vue
index 2d252ee..f86fb75 100644
--- a/src/views/sessionManager/index.vue
+++ b/src/views/sessionManager/index.vue
@@ -78,9 +78,38 @@
                   />
                 </template>
                 <template #content>
-                  <div :class="{ chartUserText: theme === 'light' }"
-                    >{{ sessionDetail.content }}
+                  <div :class="{ chartUserText: theme === 'light' }">
+                    {{ sessionDetail.content }}
+                    <!-- <a-input
+                      :style="{ width: '100%' }"
+                      v-model="sessionDetail.content"
+                      v-if="isEdit"
+                    />
+
+                    <div v-else>
+                      {{ sessionDetail.content }}
+                    </div> -->
                   </div>
+                  <!-- <div v-if="!isEdit">
+                    <span
+                      class="action"
+                      v-if="index != 0"
+                      @click="copy(sessionDetail.content)"
+                    >
+                      <icon-copy /> 澶嶅埗
+                    </span>
+                    <span class="action" @click="edit()">
+                      <icon-pen /> 缂栬緫
+                    </span>
+                  </div>
+                  <a-space v-else>
+                    <a-button type="outline" size="mini" @click="cancelEdit(1)"
+                      >鍙栨秷</a-button
+                    >
+                    <a-button type="primary" size="mini" @click="cancelEdit(2)"
+                      >纭畾</a-button
+                    >
+                  </a-space> -->
                 </template>
               </a-comment>
               <a-comment v-else-if="sessionDetail.role === 'assistant'">
@@ -92,52 +121,7 @@
                   />
                 </template>
                 <template #content>
-                  <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>
+                  <a-card v-if="isExistTip(sessionDetail.content)" style="padding: 10px">
                     <div
                       :class="{ chatItemAnswer: theme === 'light' }"
                       :style="{
@@ -145,17 +129,121 @@
                           theme === 'light' ? '#ffffff' : '#000000',
                       }"
                       style="border: none"
+                      v-for="(breakContent, breakIndex) in breakLine(
+                        sessionDetail.content
+                      )"
                     >
-                      {{ sessionDetail.content }}
+                      <div
+                        :class="{ chatItemAnswer: theme === 'light' }"
+                        :style="{
+                          backgroundColor:
+                            theme === 'light' ? '#ffffff' : '#000000',
+                        }"
+                        style="border: none"
+                        v-if="isExistTip(breakContent)"
+                      >
+                        <div
+                          :class="{ chatItemAnswer: theme === 'light' }"
+                          :style="{
+                            backgroundColor:
+                              theme === 'light' ? '#ffffff' : '#000000',
+                          }"
+                          style="border: none"
+                          v-for="(item, tipIndex) in tipMatch(breakContent)"
+                        >
+                          <span v-if="tipIndex == 0">
+                            {{ breakContent.substring(0, item.index) }}
+                            <a-tooltip
+                              background-color="#3491FA"
+                              :content="
+                                getTipContent(messagenList.reference, index)
+                              "
+                            >
+                              <img
+                                style="width: 15px; height: 15px"
+                                :src="tipImage"
+                              />
+                            </a-tooltip>
+                            <span v-if="tipIndex == item.len - 1">
+                              {{ breakContent.substring(item.index + 5) }}
+                            </span>
+                          </span>
+                          <span v-else-if="tipIndex == item.len - 1">
+                            {{
+                              breakContent.substring(
+                                item.preIndex + item.item.length,
+                                item.index
+                              )
+                            }}
+                            <a-tooltip
+                              background-color="#3491FA"
+                              :content="
+                                getTipContent(messagenList.reference, index)
+                              "
+                            >
+                              <img
+                                style="width: 15px; height: 15px"
+                                :src="tipImage"
+                              />
+                            </a-tooltip>
+                            {{ breakContent.substring(item.index + 5) }}
+                          </span>
+                          <span v-else>
+                            {{
+                              breakContent.substring(
+                                item.preIndex + item.item.length,
+                                item.index
+                              )
+                            }}
+                            <a-tooltip
+                              background-color="#3491FA"
+                              :content="
+                                getTipContent(messagenList.reference, index)
+                              "
+                            >
+                              <img
+                                style="width: 15px; height: 15px"
+                                :src="tipImage"
+                              />
+                            </a-tooltip>
+                          </span>
+                        </div>
+                      </div>
+                      <div v-else>
+                        {{ breakContent }}
+                      </div>
                     </div>
                   </a-card>
+                  <a-card v-else>
+                    <a-textarea
+                      readonly
+                      auto-size
+                      :default-value="chartText(sessionDetail.content)"
+                      :class="{ chatItemAnswer: theme === 'light' }"
+                      :style="{
+                        backgroundColor:
+                          theme === 'light' ? '#ffffff' : '#000000',
+                      }"
+                      style="border: none"
+                    >
+                    </a-textarea>
+                  </a-card>
+                  <!-- <div class="prompt">
+                    <ul>
+                      <li class="prompt-item" @click="copyText('43234')">
+                        <span>
+                          344343klsdjkjksdjkjksdjk灏卞紑濮嬪ぇ瀹剁湅鏁版嵁搴撶櫥璁板崱鍙楁墦鍑诲嚡鎾掔櫥璁板崱鍙楁墦鍑诲嚡鎾掔櫥璁板崱鍙楁墦鍑诲嚡鎾掔殑43</span
+                        >
+                        <span style="margin-left: 20px">
+                          <icon-right />
+                        </span>
+                      </li>
+                    </ul>
+                  </div> -->
                 </template>
-                <!-- <div>{{ sessionDetail.role === 'assistant' }}</div> -->
+
                 <template #actions>
-                  <!-- <div
-                    v-for="(item, leng) in messagenList.reference"
-                    :key="leng"
-                  > -->
+
                   <div>
                     <div>
                       <template
@@ -191,6 +279,7 @@
                   >
                     <icon-refresh /> 閲嶆柊鐢熸垚
                   </span>
+                  <!-- <span class="action"><icon-to-bottom />涓嬭浇 </span> -->
                 </template>
               </a-comment>
               <a-comment v-else-if="sessionDetail.role === 'last'">
@@ -202,27 +291,24 @@
                   />
                 </template>
                 <template #content>
-                  <a-textarea
-                    readonly
-                    auto-size
-                    v-model="displayedText"
-                    :class="{ chatItemAnswer: theme === 'light' }"
-                    :style="{
-                      backgroundColor:
-                        theme === 'light' ? '#ffffff' : '#000000',
-                    }"
-                    style="border: none"
-                  >
-                  </a-textarea>
+                  <a-spin :loading="chartLoading" dot style="width: 100%">
+                    <a-textarea
+                      readonly
+                      auto-size
+                      v-model="displayedText"
+                      :class="{ chatItemAnswer: theme === 'light' }"
+                      :style="{
+                        backgroundColor:
+                          theme === 'light' ? '#ffffff' : '#000000',
+                      }"
+                      style="border: none"
+                    >
+                    </a-textarea>
+                  </a-spin>
                 </template>
 
                 <template #actions>
-                  <!-- <div class="icon-box">
-                    <div>
-                      <img :src="getIconByExtension('pdf')" alt="" />
-                    </div>
-                    <div class="icon-text"> 鏂囦欢绫诲瀷 </div>
-                  </div> -->
+
                   <div
                     class="action"
                     @click="stopChat"
@@ -238,24 +324,12 @@
                 </template>
               </a-comment>
             </div>
-            <!-- <div class="chartStart" v-if="isStart" @click="startChat"
-              >鍋滄鐢熸垚</div
-            >
-            <div class="chartStart v-else" @click="stopChat">閲嶆柊鐢熸垚</div> -->
+
           </a-scrollbar>
 
           <div class="chat_bottom">
             <div class="center-bottom">
-              <!-- <a-textarea
-              v-model="inputMsg"
-              @keydown.shift.enter="sendMessage"
-              style="height: 180px"
-              placeholder="杈撳叆鎮ㄦ兂浜嗚В鐨勫唴瀹癸紝Shift+Enter鍙戦��"
-              :max-length="500"
-              allow-clear
-              show-word-limit
-            >
-            </a-textarea> -->
+
               <a-textarea
                 v-model="inputMsg"
                 @keydown.shift.enter="handleShiftEnter"
@@ -284,12 +358,15 @@
                   display: flex;
                   justify-content: space-between;
                 "
+                class="uploadFileDis"
               >
                 <updataFile
                   ref="fileInput"
                   :sessionId="activeSessionId"
+                  :hide="hide_upload"
                   @selectFileCallback="selectFileCallback"
                 ></updataFile>
+
                 <a-button
                   :disabled="chatDis"
                   @click="sentClick"
@@ -377,12 +454,17 @@
           ></smartAi>
         </div>
       </a-col>
+      <a-col :span="23" v-show="agentType == '5'">
+        <div class="center">
+          <seniorAgentSession :modalObj="agentObj"></seniorAgentSession>
+        </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>
+      <excel v-if="documenttype == ('xlsx' || 'xls')" :previewSrc="previewSrc"></excel>
+      <Pdf v-if="documenttype == 'pdf'" :previewSrc="previewSrc"></Pdf>
+      <txt  v-if="documenttype == 'txt'" :previewSrc="previewSrc"></txt>
     </a-modal>
     <a-modal
       v-model:visible="visible"
@@ -430,9 +512,11 @@
   import chatMenu from '@/views/sessionManager/components/chatMenu.vue';
   import AddSession from '@/views/sessionManager/components/addSession.vue';
   import agentSession from '@/views/sessionManager/components/agentSession.vue';
+  import seniorAgentSession from '@/views/sessionManager/components/seniorAgentSession.vue';
   import historySession from '@/views/sessionManager/components/historySession.vue';
   import smartAi from '@/views/sessionManager/components/smartAi.vue';
   import updataFile from '@/views/sessionManager/components/updataFile.vue';
+
   import EventBus from '@/utils/EventBus';
   import {
     addSessionApi,
@@ -441,6 +525,9 @@
     getSessionDetailsApi,
     sessionListApi,
     uploadWithoutKb,
+    uploadAndParse,
+    chatInfos,
+    chatRm,
   } from '@/api/session';
   import { getAuthorization } from '@/utils/auth';
   import { queryCanvasList } from '@/api/Agent';
@@ -455,7 +542,10 @@
 
   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';
+  import Pdf from '@/views/dmx/knowledgeLib/components/Pdf.vue';
+  import txt from '@/views/dmx/knowledgeLib/components/txt.vue';
+  import { is } from 'immutable';
+  import uploadFile from './components/uploadFile.vue';
 
   // const url = ref('../../assets/session/PDF.png');
 
@@ -470,6 +560,7 @@
   const modalObj = reactive({ add: false });
   const dialogId = ref('');
   const chatDis = ref(false);
+  const chartLoading = ref(false);
   const loading = ref(false);
   const agentType = ref('1');
   const agentTitle = ref('鏈懡鍚嶄細璇�');
@@ -477,13 +568,14 @@
   let from = reactive({
     name: '鏈懡鍚嶄細璇�',
   });
-  const isStopChat = ref(false);
+
   const currIndex = ref(0);
   const displayedText = ref(''); // 姝e湪鏄剧ず鐨勬枃瀛�
   let timer: number | null = null;
   const streamStr = ref('');
   const inputMsg = ref('');
   const activeSessionId = ref('');
+  const hide_upload=ref(2);
   const fieldNames = { value: 'id', label: 'name' };
   const dialogs = ref([]);
   const dialogObj = reactive({});
@@ -496,7 +588,7 @@
   const uploadRef = ref();
   const files = ref([]);
   const file = ref('');
-  const fileInput = ref(null);
+  const fileInput = ref();
   const chatDataMeg = reactive({});
   const visible = ref(false);
   const fileVisible = ref(false);
@@ -520,13 +612,16 @@
     if (errors) return;
     let chatData = {
       id: chatObj.id,
-      conversation_id: chatObj.id,
-      name: from.name,
+      dialog_id: chatObj.dialog_id,
+      conversation_desc: from.name,
     };
     const { code, data } = await addSessionApi(chatData);
     if (data) {
       Message.success('淇敼鎴愬姛');
       handleCancel();
+      if (data?.id) {
+        activeSessionId.value = data.id;
+      }
       queryNewSessionDetail(activeSessionId.value);
     }
   };
@@ -539,13 +634,32 @@
     }
   };
 
-  const tipMatch = (session: any): any[] => {
+  const breakLine = (message: string): string[] => {
+    //鎸塡n鍒嗗壊瀛楃涓�
+    let arr = message.split('\n');
+    return arr;
+  };
+
+  const chartText = (message: string): string => {
+    //鍘婚櫎鎵�鏈夌殑#鍜�**
+    let arr = message.replace(/\*\*|\#\#\#/g, '');
+    return arr;
+  };
+
+  const tipMatch = (msg: string): 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 });
+    let matches = msg.match(/##([0-9]+)\$\$/g);
+    matches?.map((item) => {
+      let i = msg.indexOf(item);
+      indexs.push({
+        index: i,
+        item: item,
+        preIndex: preTip,
+        len: matches.length,
+      });
       preTip = i;
     });
     return indexs;
@@ -555,6 +669,12 @@
     if (isExistTip(message)) {
       if (role == 'assistant' && index) {
         let i = index / 2 - 1 > 0 ? index / 2 - 1 : 0;
+        if (data.length == 1) {
+          i = 0;
+        }
+        if (data.length == i) {
+          i = data.length-1;
+        }
         dataItem = data[i].doc_aggs;
       }
     } else {
@@ -567,6 +687,12 @@
   const getTipContent = (data, index): string => {
     let maxSimilarityContent = '';
     let i = index / 2 - 1 > 0 ? index / 2 - 1 : 0;
+    if (data.length == 1) {
+      i = 0;
+    }
+    if (data.length == i) {
+      i = data.length-1;
+    }
     let maxSimilarity = 0;
     data[i].chunks.forEach((chunk) => {
       if (chunk.similarity > maxSimilarity) {
@@ -579,7 +705,7 @@
 
   const clickHref = async (item) => {
     documenttype.value = item.doc_name.split('.').pop();
-    previewSrc.value = httpUrl + `/api/v1/document/get/${item.doc_id}`;
+    previewSrc.value = httpUrl + `/api/v1/document/get/${item.doc_id}`+"?t="+new Date().getTime();
     fileVisible.value = true;
   };
 
@@ -642,9 +768,29 @@
     // formRef.value.resetFields();
   };
 
-  const selectFileCallback = (data) => {
-    console.log(data, 'selectFileCallback');
+  const selectFileCallback = (data,conversation_id) => {
     uploaditemList.value = [...uploaditemList.value, ...data];
+    activeSessionId.value = conversation_id;
+  };
+
+
+  //涓婁紶鎴愬姛瑙f瀽getinfo
+  const getInfo = async (id) => {
+    const { code, data } = await chatInfos({
+      doc_ids: activeSessionId.value,
+    });
+    if (code === 200) {
+      uploaditemList.value = data;
+    }
+  };
+  //鍒犻櫎涓婁紶鏂囨。
+  const deleteUpload = async (id) => {
+    const { code, data } = await chatRm({
+      doc_id: id,
+    });
+    if (code === 200) {
+      getInfo();
+    }
   };
 
   let onFileSelectedLoading = ref(false);
@@ -652,11 +798,25 @@
   const deleteFile = (item) => {
     console.log(uploaditemList.value);
     uploaditemList.value.splice(item.index, 1);
+    // EventBus.emit('queryAgent', item);
   };
 
   const { toClipboard } = useClipboard();
   const copy = async (text) => {
     await toClipboard(text); //鍙傛暟涓鸿澶嶅埗鐨勬枃鏈�
+  };
+
+  const isEdit = ref(false);
+  const edit = () => {
+    isEdit.value = !isEdit.value;
+  };
+  const cancelEdit = (val) => {
+    if (val == 1) {
+      isEdit.value = !isEdit.value;
+    } else {
+      //缂栬緫淇濆瓨
+      isEdit.value = !isEdit.value;
+    }
   };
 
   const DialogList = async () => {
@@ -728,6 +888,7 @@
 
   // 鍙戦��
   const sentClick = () => {
+    displayedText.value="";
     sendMessage('click');
     uploaditemList.value = [];
   };
@@ -786,10 +947,14 @@
     }
   };
 
+  let message_stop = [];
+  let message_id = "";
   const startChat = async (valMsg) => {
     chatDis.value = true;
     loading.value = true;
     toStop = false;
+    displayedText.value = '';
+    chartLoading.value = true;
     sessionDetailList.value.push({
       content: valMsg,
       role: 'user',
@@ -818,8 +983,9 @@
     currIndex.value = 0;
     while (true) {
       if (toStop) {
-        displayedText.value = '';
+        message_stop.push(message_id);
         setChatDataMeg(chatDataMeg);
+        //displayedText.value = '';
         break;
       }
       const x = await reader?.read();
@@ -829,9 +995,20 @@
         try {
           const val = JSON.parse(value?.data || '');
           const d = val?.data;
+          if (message_id != d.message_id) {
+            message_id = d.message_id;
+            message_stop = [];
+          } else {
+            //message_stop涓煡鎵緈essage_id
+            const index = message_stop.findIndex(item => item === message_id);
+            if (index > -1) {
+              break;
+            }
+          }
           if (typeof d !== 'boolean') {
             // console.info("data:", d);
             streamStr.value = d.content;
+            chartLoading.value = false;
             startDisplayStr();
           }
         } catch (e) {
@@ -840,12 +1017,9 @@
         if (done) {
           console.info('done');
           displayedText.value = '';
-          if (isStopChat.value) {
-            setChatDataMeg(chatDataMeg);
-          } else {
-            queryNewSessionDetail(activeSessionId.value);
-            EventBus.emit('queryAppUsageList');
-          }
+          chartLoading.value = false;
+          queryNewSessionDetail(activeSessionId.value);
+          EventBus.emit('queryAppUsageList');
           break;
         }
       }
@@ -856,14 +1030,8 @@
   };
 
   const stopChat = async () => {
-    // const { code, data } = await stopChatApi(activeSessionId.value);
-    // if (code === 200) {
-    //   Message.success("宸插仠姝�");
-    //   queryNewSessionDetail(activeSessionId.value);
-    // }
     loading.value = false;
     chatDis.value = false;
-    isStopChat.value = true;
     toStop = true;
     console.log('stopChat');
     console.log(displayedText.value, 'displayedText');
@@ -886,7 +1054,9 @@
       .concat(lastArr);
     console.log(sessionDetailList.value, 'sessionDetailList2');
     console.log(chatObj, 'chatObj瀵硅薄');
-    chatObj.message = chatObj.message.concat(lastArr);
+    if (chatObj?.message) {
+      chatObj.message = chatObj.message.concat(lastArr);
+    }
     Object.assign(chatDataMeg, {
       id: chatObj.id,
       conversation_id: chatObj.id,
@@ -916,11 +1086,12 @@
       agentTitle.value = data.name;
       from.name = data.name;
       refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃�
-      isStopChat.value = false;
     }
   };
 
   const changeAgentType = (val, session) => {
+    hide_upload.value = hide_upload.value+1;
+    uploaditemList.value=[];
     agentType.value = val;
     console.log(val, 'val');
   };
@@ -931,6 +1102,7 @@
     from.name = session.name;
     const { code, data } = await getSessionDetailsApi(session.id);
     if (code === 200) {
+      Object.assign(chatObj, data);
       sessionDetailList.value = data.message;
       messagenList.value = data;
       refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃�
@@ -982,12 +1154,16 @@
     activeSessionId.value = '';
   });
   onMounted(() => {
+    document.getElementsByTagName;
     let container = document.getElementById('container');
     container.addEventListener('click', () => {
-      fileInput.value.cancel();
+      // fileInput.value.cancel();
     });
     EventBus.on('newChat', () => {
+      uploaditemList.value = [];
       agentType.value = '1';
+      chatObj = {};
+      hide_upload.value = hide_upload.value+1;
       // createSession('');
       activeSessionId.value = '';
       sessionDetailList.value = [
@@ -1087,6 +1263,33 @@
             font-size: 12px;
             padding-left: 10px;
           }
+        }
+      }
+    }
+    // .uploadFileDis {
+    //   :deep(.arco-upload-list-type-text) {
+    //     display: none;
+    //   }
+    // }
+    .prompt {
+      ul {
+        margin: 0;
+        padding: 0;
+        display: flex;
+      }
+      ul > li {
+        list-style-type: none;
+      }
+      .prompt-item {
+        display: flex;
+        justify-content: space-between;
+        background-color: #fff;
+        cursor: pointer;
+        border-radius: 8px;
+        padding: 10px;
+        border: #e5e5e5;
+        &:hover {
+          background-color: #eee;
         }
       }
     }
@@ -1223,6 +1426,11 @@
         }
       }
     }
+    .uploadFileDis {
+      :deep(.arco-upload-list-type-text) {
+        display: none;
+      }
+    }
 
     .chat-item {
       padding: 10px 0;
@@ -1232,6 +1440,19 @@
         font-size: 14px;
         color: #333;
         margin-top: 4px;
+      }
+      :deep(.arco-card-body) {
+        padding: 0;
+        border-radius: 10px;
+      }
+      :deep(.arco-textarea) {
+        padding-top: 10px !important;
+      }
+      :deep(.arco-comment-inner-content) {
+        border-radius: 10px;
+      }
+      :deep(.arco-card-bordered) {
+        border-radius: 10px;
       }
 
       .icon-user-jpg {
@@ -1251,6 +1472,9 @@
           margin-left: 10px;
         }
       }
+      :deep(.arco-spin-loading .arco-spin-mask-icon) {
+        left: 10%;
+      }
     }
 
     .right {

--
Gitblit v1.8.0