wujingjing
2024-11-05 9f880255e8961cd26c52a87ad40bada377bab98c
src/components/chat/Chat.vue
@@ -10,7 +10,7 @@
               <div
                  class="group flex px-4 py-6 hover:bg-slate-100 rounded-lg relative"
                  :class="{ 'flex-row-reverse': item.role === RoleEnum.user }"
                  v-for="(item, index) of computedMessageList"
                  v-for="(item, msgIndex) of computedMessageList"
                  :key="`${item.historyId}_${item.role}`"
               >
                  <div class="absolute top-0 left-[72px] text-[#8d8e99]">{{ item?.createTime }}</div>
@@ -49,7 +49,10 @@
                                       :title="subItem.title"
                                       :status="stepEnumMap[subItem.status]"
                                    >
                                       <template #icon v-if="index + 1 === item.stepList.length && isTalking">
                                       <template
                                          #icon
                                          v-if="index + 1 === item.stepList.length && isTalking && msgIndex === computedMessageList.length - 1"
                                       >
                                          <span class="ywifont ywicon-loading1 animate-spin !text-[24px]"></span>
                                       </template>
                                       <template #title>
@@ -106,12 +109,12 @@
                              v-if="item.role === RoleEnum.user && item.content?.values"
                              class="absolute flex items-center right-0 mr-4 space-x-2"
                           >
                              <div class="flex items-center justify-center size-[20px]">
                              <!-- <div class="flex items-center justify-center size-[20px]">
                                 <i
                                    class="p-2 ywifont ywicon-copy cursor-pointer hover:text-[#0284ff] font-medium !text-[15px] hover:!text-[18px]"
                                    @click="copyUserClick(item)"
                                 />
                              </div>
                              </div> -->
                              <div class="flex items-center justify-center size-[20px]">
                                 <i
                                    class="p-2 ywifont ywicon-cubelifangti cursor-pointer hover:text-[#0284ff] text-[#000] font-[590] !text-[15px] hover:!text-[18px]"
@@ -203,6 +206,7 @@
               @showUpChatClick="showUpChatClick"
               @showDownChatClick="showDownChatClick"
               :style="{ width: chatWidth }"
               :setCommonQuestionInfo="setCommonQuestionInfo"
            ></PlayBar>
         </div>
      </div>
@@ -213,19 +217,18 @@
<script setup lang="ts">
import _ from 'lodash';
import moment from 'moment';
import { v4 as uuidv4 } from 'uuid';
import { computed, onMounted, ref } from 'vue';
import FeedbackPanel from './components/FeedbackPanel.vue';
import Loding from './components/Loding.vue';
import { useAssistantContentOpt } from './hooks/useAssistantContentOpt';
import { useQueryProcess } from './hooks/useQueryProcess';
import { convertProcessItem, useScrollLoad } from './hooks/useScrollLoad';
import { useScrollToBottom } from './hooks/useScrollToBottom';
import type { ChatContent, StepItem } from './model/types';
import { AnswerState, AnswerType, RoleEnum, answerTypeMapCom, roleImageMap, type ChatMessage, stepEnumMap } from './model/types';
import { QuestionAi, extCallQuery, questionStreamByPost } from '/@/api/ai/chat';
import { AnswerState, AnswerType, RoleEnum, answerTypeMapCom, roleImageMap, stepEnumMap, type ChatMessage } from './model/types';
import { extCallQuery, questionStreamByPost } from '/@/api/ai/chat';
import PlayBar from '/@/components/chat/components/playBar/PlayBar.vue';
import CustomDrawer from '/@/components/drawer/CustomDrawer.vue';
import { Logger } from '/@/model/logger/Logger';
import router from '/@/router';
import {
   activeChatRoom,
@@ -351,7 +354,7 @@
let questionRes = null;
let finalCalcSectionAId = null;
const questionAi = async (text, assistantMsg: ChatMessage) => {
const questionAi = async (text) => {
   let judgeParams = null;
   if (!preQuestion.value) {
      // const aiContent = computedMessageList.value.filter((item) => item.role === RoleEnum.assistant);
@@ -408,6 +411,7 @@
   resetStep();
   let res = null;
   await questionStreamByPost(params, (chunkRes) => {
      Logger.info('chunk response:\n\n' + JSON.stringify(chunkRes));
      if (chunkRes.mode === 'result') {
         res = chunkRes.value;
      } else {
@@ -473,7 +477,7 @@
         questionRes = extRes;
         resMsgContent = parseContent(extRes);
      } else {
         resMsgContent = await questionAi(content.values, assistantItem);
         resMsgContent = await questionAi(content.values);
      }
      nextUserMsgEndIndex.value++;
      if (isNewChat) {
@@ -575,8 +579,9 @@
//显示上一条消息
const showUpChatClick = () => {
   if (computedMessageList.value.length === 0) return;
   if (currentIndex.value === null) {
      currentIndex.value = history_data.value.length - 1;
   if (currentIndex.value == 0) {
      messageContent.value.values = history_data.value[currentIndex.value].content.values;
      return;
   } else {
      currentIndex.value = (currentIndex.value + history_data.value.length - 1) % history_data.value.length;
   }
@@ -585,6 +590,10 @@
//显示下一条消息
const showDownChatClick = () => {
   if (computedMessageList.value.length === 0) return;
   if (currentIndex.value == history_data.value.length - 1) {
      messageContent.value.values = history_data.value[currentIndex.value].content.values;
      return;
   }
   if (currentIndex.value === null) {
      currentIndex.value = 0;
   } else {
@@ -621,10 +630,13 @@
};
//#endregion
//#region ====================== 用户询问的问题设置为常用语 ======================
const setCommonQuestionInfo = ref({});
//用户复制问题
const copyUserClick = () => {};
//用户问题设置为常用语
const setCommonQuestionClick = () => {};
const setCommonQuestionClick = (item) => {
   setCommonQuestionInfo.value = item;
};
//#endregion
</script>