From df0a461ea2018f99ccbc82148f8ae3f6cddaf23b Mon Sep 17 00:00:00 2001 From: wujingjing <gersonwu@qq.com> Date: 星期四, 19 十二月 2024 16:49:02 +0800 Subject: [PATCH] 意图分析拆分 --- src/components/chat/hooks/useScrollLoad.ts | 135 ++++++++++++++++++++++++++++++++++++++------ 1 files changed, 116 insertions(+), 19 deletions(-) diff --git a/src/components/chat/hooks/useScrollLoad.ts b/src/components/chat/hooks/useScrollLoad.ts index 457bfc1..a9fbb78 100644 --- a/src/components/chat/hooks/useScrollLoad.ts +++ b/src/components/chat/hooks/useScrollLoad.ts @@ -1,13 +1,50 @@ -import { Ref, ShallowRef, nextTick, onBeforeUnmount, ref, unref } from 'vue'; +import moment from 'moment'; +import type { Ref, ShallowRef } from 'vue'; +import { computed, nextTick, onBeforeUnmount, ref, unref } from 'vue'; import { LOAD_CHAT_LIMIT } from '../constants'; -import { AnswerType, ChatContent, ChatMessage, RoleEnum } from '../model/types'; -import { GetHistoryAnswer, QueryHistoryDetail } from '/@/api/ai/chat'; - +import type { ChatContent, ChatMessage, StepItem } from '../model/types'; +import { AnswerType, MultiChatType, RoleEnum, StepEnum } from '../model/types'; +import { GetHistoryAnswer, QueryHistoryDetail, getShareChatJsonByPost } from '/@/api/ai/chat'; +import router from '/@/router'; +import { isSharePage } from '/@/stores/chatRoom'; type UseScrollLoadOption = { container: ShallowRef<HTMLDivElement>; historyGroupId: string | Ref<string>; messageList: Ref<ChatMessage[]>; parseAnswerContent: (res: any) => ChatContent; +}; + +export const convertProcessItem = (processItem: any) => { + switch (processItem.mode) { + case 'begin': + break; + case 'end': + break; + } + return { + status: StepEnum.Success, + title: processItem.value, + } as StepItem; +}; +export const convertProcessToStep = (process: any[]) => { + const stepList = (process ?? []).reduce((preVal, curVal) => { + if (curVal.mode === 'question') { + const last = preVal.at(-1); + if (!last.subStep) { + last.subStep = []; + } + const sub = { + data: curVal.value, + type: MultiChatType.Select, + }; + last.subStep.push(sub); + } else { + const cur = convertProcessItem(curVal); + preVal.push(cur); + } + return preVal; + }, []); + return stepList; }; /** @@ -28,12 +65,17 @@ history_id: historyId, }); }; - + const formatShowTimeYear = computed(() => { + return (str) => { + return moment(str).format('MM鏈圖D鏃� HH:mm:ss'); + }; + }); /** * 鑾峰彇鐢ㄦ埛鍥炲鏁版嵁锛屽苟鎻掑叆鍒板璇濆綋涓幓 */ const loadReplyData = async (userMsg: any[]) => { - const sectionAIdMap = new Map(); + const userItemIdMap = new Map(); + // 鐢ㄦ埛娑堟伅 const tmpMessageList: ChatMessage[] = userMsg.map((item) => { return { historyId: item.history_id, @@ -42,11 +84,12 @@ type: AnswerType.Text, values: item.question, }, + isChecked: false, } as ChatMessage; }); const resList = await Promise.all( (userMsg ?? []).map((item) => { - sectionAIdMap.set(item.history_id, item.section_a_id); + userItemIdMap.set(item.history_id, item); return getAnswerById(item.history_id); }) ); @@ -55,6 +98,10 @@ const insertIndex = index + 1 + i; const currentUserMsg = tmpMessageList[insertIndex - 1]; currentUserMsg.content.values = item?.answer?.question ?? currentUserMsg.content.values; + + const mapUser = userItemIdMap.get(item.answer?.history_id); + + const answerTime = formatShowTimeYear.value(mapUser?.create_time); tmpMessageList.splice( insertIndex, 0, @@ -63,9 +110,18 @@ : { historyId: item.answer?.history_id, role: RoleEnum.assistant, - content: parseAnswerContent(item.answer), + content: parseAnswerContent(item?.answer), state: item.answer_state, - sectionAId: sectionAIdMap.get(item.answer.history_id), + sectionAId: mapUser?.section_a_id, + createTime: answerTime, + isStopMsg: false, + stepGroup: (item?.answer?.reports ?? []).map((item) => ({ + value: convertProcessToStep(item?.exec_process), + isShow: false, + })), + + conclusion: item?.answer?.conclusion ?? [], + isChecked: false, } ); i++; @@ -75,9 +131,52 @@ }; /** + * 鍔犺浇鍒嗕韩鏁版嵁 + */ + const loadShareData = async () => { + const res = await getShareChatJsonByPost({ + share_id: router.currentRoute.value.query.id as string, + }); + + const msgValue = res?.values; + if (!msgValue) { + messageList.value = []; + return; + } + const userMsg: ChatMessage = { + historyId: msgValue.history_id, + role: RoleEnum.user, + content: { + type: AnswerType.Text, + values: msgValue.question, + }, + isChecked: false, + }; + + const assistantMsg: ChatMessage = { + historyId: msgValue.history_id, + role: RoleEnum.assistant, + content: parseAnswerContent(msgValue), + stepGroup: (msgValue?.reports ?? []).map((item) => ({ + value: convertProcessToStep(item?.exec_process), + isShow: false, + })), + isStopMsg: false, + + conclusion: msgValue.conclusion ?? [], + isChecked: false, + }; + messageList.value = [userMsg, assistantMsg]; + }; + + /** * 鍔犺浇婊氬姩鑼冨洿鏁版嵁 */ const loadRangeData = async (lastEnd = nextUserMsgEndIndex.value) => { + if (isSharePage.value) { + await loadShareData(); + return; + } const res = await QueryHistoryDetail({ history_group_id: unref(historyGroupId), last_end: lastEnd, @@ -97,7 +196,6 @@ //婊氬姩鐩戝惉 async function onChatListScroll() { if (container.value.scrollTop == 0) { - // 鏇村鏁版嵁姝e湪鍔犺浇鏃� if (moreIsLoading.value) { return; @@ -107,26 +205,25 @@ return; } - let h1 = container.value.scrollHeight; + const h1 = container.value.scrollHeight; moreIsLoading.value = true; await loadRangeData(nextUserMsgEndIndex.value).finally(() => { moreIsLoading.value = false; }); //鏇存柊鍚庯紝绛夊緟椤甸潰娓叉煋瀹屾瘯鍐嶅幓鎷縮crollHeight,鍚﹀垯鎷垮埌鐨勬槸涔嬪墠鐨� - nextTick(()=>{ - nextTick(()=>{ - nextTick(()=>{ - let h2 = container.value.scrollHeight; + nextTick(() => { + nextTick(() => { + nextTick(() => { + const h2 = container.value.scrollHeight; container.value.scrollTo({ //椤堕儴鍦ㄥ師鍏堝熀纭�涓婂線涓嬫粴鍔�50px锛岄湶鍑烘柊鍔犺浇鏁版嵁鐨勪竴鐐� // top: h2 - h1 - 50, top: h2 - h1, behavior: 'instant', //auto-鑷姩婊氬姩 instant-鐬棿婊氬姩 smooth-骞虫粦婊氬姩 }); - }) - }) - }) - + }); + }); + }); } } -- Gitblit v1.9.3