From 1476d27514874e9c95002451a81878bd9bec8382 Mon Sep 17 00:00:00 2001 From: wujingjing <gersonwu@qq.com> Date: 星期六, 14 十二月 2024 15:36:53 +0800 Subject: [PATCH] 多轮对话 --- src/components/chat/hooks/useScrollLoad.ts | 80 ++++++++++++++++++++++++++++++++++++---- 1 files changed, 72 insertions(+), 8 deletions(-) diff --git a/src/components/chat/hooks/useScrollLoad.ts b/src/components/chat/hooks/useScrollLoad.ts index f95a1af..63be29d 100644 --- a/src/components/chat/hooks/useScrollLoad.ts +++ b/src/components/chat/hooks/useScrollLoad.ts @@ -1,8 +1,10 @@ import moment from 'moment'; import { Ref, ShallowRef, computed, nextTick, onBeforeUnmount, ref, unref } from 'vue'; import { LOAD_CHAT_LIMIT } from '../constants'; -import { AnswerType, ChatContent, ChatMessage, RoleEnum, StepEnum, StepItem } from '../model/types'; -import { GetHistoryAnswer, QueryHistoryDetail } from '/@/api/ai/chat'; +import { AnswerType, ChatContent, ChatMessage, MultiChatType, RoleEnum, StepEnum, StepItem } 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>; @@ -20,14 +22,29 @@ return { status: StepEnum.Success, title: processItem.value, - }; + } as StepItem; }; export const convertProcessToStep = (process: any[]) => { - const stepList = (process??[]).map<StepItem>((item) => { - return convertProcessItem(item); - }); + 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; }; + /** * 婊氬姩鍔犺浇鏁版嵁 * @returns @@ -65,6 +82,7 @@ type: AnswerType.Text, values: item.question, }, + isChecked: false, } as ChatMessage; }); const resList = await Promise.all( @@ -79,7 +97,8 @@ const currentUserMsg = tmpMessageList[insertIndex - 1]; currentUserMsg.content.values = item?.answer?.question ?? currentUserMsg.content.values; - const mapUser = userItemIdMap.get(item.answer.history_id); + const mapUser = userItemIdMap.get(item.answer?.history_id); + const answerTime = formatShowTimeYear.value(mapUser?.create_time); tmpMessageList.splice( insertIndex, @@ -94,7 +113,11 @@ sectionAId: mapUser?.section_a_id, createTime: answerTime, stepList: convertProcessToStep(item?.answer?.exec_process), - stepIsShow:false + stepIsShow: false, + isStopMsg: false, + + conclusion: item?.answer?.conclusion ?? [], + isChecked: false, } ); i++; @@ -104,9 +127,50 @@ }; /** + * 鍔犺浇鍒嗕韩鏁版嵁 + */ + 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), + stepList: convertProcessToStep(msgValue.exec_process), + stepIsShow: 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, -- Gitblit v1.9.3