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 |  141 ++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 121 insertions(+), 20 deletions(-)

diff --git a/src/components/chat/hooks/useScrollLoad.ts b/src/components/chat/hooks/useScrollLoad.ts
index c8fc721..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 } 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;
+	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,11 +131,54 @@
 	};
 
 	/**
+	 * 鍔犺浇鍒嗕韩鏁版嵁
+	 */
+	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: historyGroupId,
+			history_group_id: unref(historyGroupId),
 			last_end: lastEnd,
 			last_count: LOAD_CHAT_LIMIT,
 		});
@@ -97,8 +196,6 @@
 	//婊氬姩鐩戝惉
 	async function onChatListScroll() {
 		if (container.value.scrollTop == 0) {
-			console.log('婊氬姩鍒伴《閮ㄤ簡');
-
 			// 鏇村鏁版嵁姝e湪鍔犺浇鏃�
 			if (moreIsLoading.value) {
 				return;
@@ -108,19 +205,23 @@
 				return;
 			}
 
-			let h1 = container.value.scrollHeight;
+			const h1 = container.value.scrollHeight;
 			moreIsLoading.value = true;
 			await loadRangeData(nextUserMsgEndIndex.value).finally(() => {
 				moreIsLoading.value = false;
 			});
 			//鏇存柊鍚庯紝绛夊緟椤甸潰娓叉煋瀹屾瘯鍐嶅幓鎷縮crollHeight,鍚﹀垯鎷垮埌鐨勬槸涔嬪墠鐨�
 			nextTick(() => {
-				let h2 = container.value.scrollHeight;
-
-				//椤堕儴鍦ㄥ師鍏堝熀纭�涓婂線涓嬫粴鍔�50px锛岄湶鍑烘柊鍔犺浇鏁版嵁鐨勪竴鐐�
-				container.value.scrollTo({
-					top: h2 - h1 - 50,
-					behavior: 'instant', //auto-鑷姩婊氬姩 instant-鐬棿婊氬姩 smooth-骞虫粦婊氬姩
+				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