fix: 解决消息重复问题
This commit is contained in:
@@ -19,10 +19,11 @@ class MessageRepository(
|
|||||||
return messageDao.getMessagesByConversationId(conversationId)
|
return messageDao.getMessagesByConversationId(conversationId)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 从 [conversationApi] 拉取消息并写入本地数据库 */
|
/** 从 [conversationApi] 拉取消息并写入本地数据库,以服务端为准替换该会话的本地消息,避免与本地临时消息重复显示 */
|
||||||
suspend fun syncMessages(conversationId: String) {
|
suspend fun syncMessages(conversationId: String) {
|
||||||
val result = conversationApi.getMessages(conversationId)
|
val result = conversationApi.getMessages(conversationId)
|
||||||
result.getOrNull()?.let { messages ->
|
result.getOrNull()?.let { messages ->
|
||||||
|
messageDao.deleteMessagesByConversationId(conversationId)
|
||||||
val dbMessages = messages.map { dto ->
|
val dbMessages = messages.map { dto ->
|
||||||
Message(
|
Message(
|
||||||
id = dto.id,
|
id = dto.id,
|
||||||
|
|||||||
@@ -658,12 +658,26 @@ class CreateMemoryViewModel(
|
|||||||
isTyping.value = false
|
isTyping.value = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 用 [SPLIT] 拼接多条,与后端约定一致,便于 UI 按 [SPLIT] 拆成多个气泡
|
||||||
|
if (index == 0) {
|
||||||
|
agentResponse.value = text
|
||||||
|
} else {
|
||||||
|
agentResponse.value += "[SPLIT]$text"
|
||||||
|
}
|
||||||
|
|
||||||
|
// 仅在完整收到一条 AI 回复时插入一次,避免按 index 多次插入导致同一条显示多遍
|
||||||
|
if (index >= total - 1) {
|
||||||
|
isStreaming.value = false
|
||||||
|
streamingText.value = ""
|
||||||
|
isTyping.value = false
|
||||||
|
conversationRealtime.setGenerating(false)
|
||||||
conversationId.value?.let { id ->
|
conversationId.value?.let { id ->
|
||||||
val messageTimestamp = System.currentTimeMillis()
|
val messageTimestamp = System.currentTimeMillis()
|
||||||
|
val fullContent = agentResponse.value
|
||||||
val aiMessage = Message(
|
val aiMessage = Message(
|
||||||
id = "ai_${System.currentTimeMillis()}_$index",
|
id = "ai_${System.currentTimeMillis()}",
|
||||||
conversationId = id,
|
conversationId = id,
|
||||||
content = text,
|
content = fullContent,
|
||||||
senderType = "assistant",
|
senderType = "assistant",
|
||||||
timestamp = messageTimestamp,
|
timestamp = messageTimestamp,
|
||||||
messageType = "text"
|
messageType = "text"
|
||||||
@@ -672,23 +686,11 @@ class CreateMemoryViewModel(
|
|||||||
messageRepository.insertMessage(aiMessage)
|
messageRepository.insertMessage(aiMessage)
|
||||||
updateConversationLatestMessage(
|
updateConversationLatestMessage(
|
||||||
conversationId = id,
|
conversationId = id,
|
||||||
messagePreview = text,
|
messagePreview = fullContent,
|
||||||
timestamp = messageTimestamp,
|
timestamp = messageTimestamp,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index == 0) {
|
|
||||||
agentResponse.value = text
|
|
||||||
} else {
|
|
||||||
agentResponse.value += "\n\n$text"
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index >= total - 1) {
|
|
||||||
isStreaming.value = false
|
|
||||||
streamingText.value = ""
|
|
||||||
isTyping.value = false
|
|
||||||
conversationRealtime.setGenerating(false)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MessageType.agent_response_start -> {
|
MessageType.agent_response_start -> {
|
||||||
|
|||||||
Reference in New Issue
Block a user