From cb625d11bbf1a7ee2e7c45090d1610e4850504e1 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 17 Jun 2026 00:48:44 +0800 Subject: [PATCH] =?UTF-8?q?fix(im):=20=E4=BF=AE=E5=A4=8D=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E6=9C=AA=E8=AF=BB=E4=BC=9A=E8=AF=9D=E5=90=8E=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=9C=AA=E8=AF=BB=E5=9B=9E=E6=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 点击会话时,消息列表可能尚未加载完成,导致已读上报只能从空列表算出 messageId = 0,并跳过服务端已读接口。此时本地未读已清零,但服务端读位置未推进,重新登录后会按服务端状态恢复未读。 已读上报时改为取已加载消息最大编号和会话末条服务端消息编号的较大值,确保消息列表尚未加载时也能使用 lastMessageId 推进服务端读位置。 --- src/views/im/home/composables/useMessageSender.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/views/im/home/composables/useMessageSender.ts b/src/views/im/home/composables/useMessageSender.ts index 820f7889b..edc9c7efe 100644 --- a/src/views/im/home/composables/useMessageSender.ts +++ b/src/views/im/home/composables/useMessageSender.ts @@ -222,7 +222,7 @@ export const useMessageSender = () => { /** * 触发当前会话的已读上报(切会话 / 进入页面时调用) * 1. 本端立刻清未读数;服务端回包成功后再做持久化 - * 2. 已读位置取会话内最大真实消息 id(本地发送中消息跳过) + * 2. 已读位置取已加载消息和会话末条消息的最大服务端 id */ const readActive = async () => { const conversation = conversationStore.activeConversation @@ -231,13 +231,14 @@ export const useMessageSender = () => { } // 本地标记已读:未读数清零(UI 立刻响应) conversationStore.markConversationRead(conversation.type, conversation.targetId) - const maxMessageId = messageStore + const loadedMaxMessageId = messageStore .getMessages(getClientConversationId(conversation.type, conversation.targetId)) .reduce( (maxMessageId, message) => message.id && message.id > maxMessageId ? message.id : maxMessageId, 0 ) + const maxMessageId = Math.max(loadedMaxMessageId, conversation.lastMessageId || 0) if (!maxMessageId) { return }