|
|
@@ -76,7 +76,7 @@
|
|
|
>
|
|
|
</div>
|
|
|
<div class="ai-dialog-content">
|
|
|
- <div class="ai-message-history" ref="messageContainer">
|
|
|
+ <div class="ai-message-history" ref="messageContainer" @scroll="handleScroll">
|
|
|
<div
|
|
|
v-for="(message, index) in messageList"
|
|
|
:key="index"
|
|
|
@@ -154,6 +154,7 @@ const messageList = ref([])
|
|
|
const prompt = ref('')
|
|
|
const messageContainer = ref(null)
|
|
|
const aiQuestionCount = ref(0)
|
|
|
+const userScrolled = ref(false)//是否用户手动滚动
|
|
|
const xZAiData = ref({})
|
|
|
const activeConversationId = ref(null)
|
|
|
const conversationInProgress = ref(false)
|
|
|
@@ -164,7 +165,7 @@ const inputTimeout = ref()
|
|
|
const enableContext = ref(true)
|
|
|
|
|
|
//tts
|
|
|
-import { useAudioPlayer } from '@/components/TTS/useAudioPlayer';
|
|
|
+import { useAudioPlayer } from '@/api/tts/useAudioPlayer';
|
|
|
const { playAudioChunk } = useAudioPlayer();
|
|
|
|
|
|
// 处理选择的默认消息
|
|
|
@@ -189,18 +190,27 @@ const handleSubmitAnswer = () => {
|
|
|
}
|
|
|
|
|
|
// 处理 AI 助手点击事件
|
|
|
-const handleAIClick = () => {
|
|
|
+const handleAIClick = async () => {
|
|
|
// 清空输入框
|
|
|
messageList.value = []
|
|
|
- if (props.currentQuestion.ccQuestContent) {
|
|
|
- prompt.value = props.currentQuestion.ccQuestContent
|
|
|
- sendMessage()
|
|
|
- prompt.value = ''
|
|
|
- }
|
|
|
showAIDialog.value = true
|
|
|
|
|
|
//创建对话
|
|
|
- createAiChart()
|
|
|
+ await createAiChart()
|
|
|
+
|
|
|
+ if (props.currentQuestion.ccQuestContent) {
|
|
|
+ // prompt.value = props.currentQuestion.ccQuestContent
|
|
|
+ // sendMessage()
|
|
|
+
|
|
|
+ prompt.value = ''
|
|
|
+ // 执行发送
|
|
|
+ await doSendMessageStream({
|
|
|
+ conversationId: activeConversationId.value,
|
|
|
+ content: props.currentQuestion.ccQuestContent,
|
|
|
+ contentAnswer: props.currentQuestion.ccAiAnswer,
|
|
|
+ })
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 数字人接口
|
|
|
@@ -235,8 +245,9 @@ const createAiChart = async () => {
|
|
|
await getXzAi()
|
|
|
|
|
|
// 智能问答
|
|
|
- CreateDialogue({ roleId: xZAiData.value.id })
|
|
|
+ await CreateDialogue({ roleId: xZAiData.value.id })
|
|
|
.then(res => {
|
|
|
+ console.log("创建会话:", res);
|
|
|
activeConversationId.value = res.data
|
|
|
})
|
|
|
.catch(error => {
|
|
|
@@ -267,12 +278,12 @@ const sendMessage = async () => {
|
|
|
console.error('保存AI问答次数失败:', error)
|
|
|
}
|
|
|
|
|
|
- // 模拟 AI 回复
|
|
|
- const aiResponse = await simulateAIResponse(prompt.value)
|
|
|
- messageList.value.push({
|
|
|
- type: 'ai',
|
|
|
- content: aiResponse
|
|
|
- })
|
|
|
+ // // 模拟 AI 回复
|
|
|
+ // const aiResponse = await simulateAIResponse(prompt.value)
|
|
|
+ // messageList.value.push({
|
|
|
+ // type: 'ai',
|
|
|
+ // content: aiResponse
|
|
|
+ // })
|
|
|
|
|
|
// 清空输入框
|
|
|
prompt.value = ''
|
|
|
@@ -341,7 +352,8 @@ const doSendMessage = async content => {
|
|
|
// 执行发送
|
|
|
await doSendMessageStream({
|
|
|
conversationId: activeConversationId.value,
|
|
|
- content: content
|
|
|
+ content: content,
|
|
|
+ contentAnswer: null,
|
|
|
})
|
|
|
}
|
|
|
|
|
|
@@ -373,10 +385,11 @@ const doSendMessageStream = async userMessage => {
|
|
|
|
|
|
// 2. 发送 event stream
|
|
|
let isFirstChunk = true // 是否是第一个 chunk 消息段
|
|
|
-
|
|
|
+ console.log("userMessage", userMessage)
|
|
|
await sendChatMessageStream(
|
|
|
userMessage.conversationId,
|
|
|
userMessage.content,
|
|
|
+ userMessage.contentAnswer,
|
|
|
conversationInAbortController.value,
|
|
|
enableContext.value,
|
|
|
async res => {
|
|
|
@@ -487,8 +500,20 @@ watch(messageList, () => {
|
|
|
scrollToBottom()
|
|
|
}, { deep: true })
|
|
|
|
|
|
+//处理滚动事件,判断用户是否手动滚动
|
|
|
+const handleScroll = () => {
|
|
|
+ if (messageContainer.value) {
|
|
|
+ const { scrollTop, scrollHeight, clientHeight } = messageContainer.value
|
|
|
+ // 当用户滚动距离底部超过50px时,认为是手动滚动
|
|
|
+ userScrolled.value = scrollTop + clientHeight < scrollHeight - 50
|
|
|
+ }
|
|
|
+}
|
|
|
// 单独的滚动到底部函数
|
|
|
const scrollToBottom = () => {
|
|
|
+
|
|
|
+ // 如果用户手动滚动过,不自动滚动
|
|
|
+ if (userScrolled.value) return
|
|
|
+
|
|
|
nextTick(() => {
|
|
|
if (messageContainer.value) {
|
|
|
// 强制重排以确保获取最新高度
|