From 7bad740af7e845ba10368dadbc0da5ad3da890df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E9=A3=9E=E6=B4=8B?= <15778543+xufeiyang6017@user.noreply.gitee.com> Date: Mon, 22 Dec 2025 17:01:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=81=8A=E5=A4=A9=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E6=9C=AA=E8=AF=BB=E7=8A=B6=E6=80=81=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9A=E8=87=AA=E5=B7=B1=E5=8F=91=E9=80=81=E7=9A=84=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E4=B8=8D=E6=98=BE=E7=A4=BA=E7=BA=A2=E7=82=B9=EF=BC=8C?= =?UTF-8?q?=E8=BF=9B=E5=85=A5/=E9=80=80=E5=87=BA=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=A0=87=E8=AE=B0=E5=B7=B2=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/chat-detail/index.js | 36 +++++++++ pages/chat/index.js | 154 +++++++++++++++++++++++++------------ 2 files changed, 141 insertions(+), 49 deletions(-) diff --git a/pages/chat-detail/index.js b/pages/chat-detail/index.js index ea88c6c..97efe75 100644 --- a/pages/chat-detail/index.js +++ b/pages/chat-detail/index.js @@ -412,6 +412,20 @@ Page({ } console.log('消息发送成功:', res); + + // 发送消息成功后,立即将该聊天标记为已查看 + const viewedChats = wx.getStorageSync('viewedChats') || {}; + // 获取消息ID(如果服务器返回了消息ID) + const messageId = res && res.id ? res.id : Date.now().toString(); + + viewedChats[managerPhone] = { + hasViewed: true, + lastViewedMessageId: messageId, + viewedTime: Date.now() + }; + + wx.setStorageSync('viewedChats', viewedChats); + console.log('消息发送成功后,自动标记聊天为已查看:', managerPhone); }).catch(error => { // 检查页面是否已卸载 if (this.isUnloaded) { @@ -458,5 +472,27 @@ Page({ clearInterval(this.data.timer); this.setData({ timer: null }); } + + // 用户退出页面时,自动将该聊天标记为已查看 + const managerPhone = this.data.managerPhone; + if (managerPhone) { + const viewedChats = wx.getStorageSync('viewedChats') || {}; + + // 获取最后一条消息的ID + let lastMessageId = Date.now().toString(); + if (this.data.messages && this.data.messages.length > 0) { + const lastMessage = this.data.messages[this.data.messages.length - 1]; + lastMessageId = lastMessage.id || Date.now().toString(); + } + + viewedChats[managerPhone] = { + hasViewed: true, + lastViewedMessageId: lastMessageId, + viewedTime: Date.now() + }; + + wx.setStorageSync('viewedChats', viewedChats); + console.log('用户退出聊天详情页,自动标记聊天为已查看:', managerPhone); + } } }); \ No newline at end of file diff --git a/pages/chat/index.js b/pages/chat/index.js index 4df1e22..626eb46 100644 --- a/pages/chat/index.js +++ b/pages/chat/index.js @@ -266,64 +266,110 @@ Page({ const chatId = chatItem.manager_phone; // 获取最新消息内容和时间 - let lastMessage = null; - try { - const cacheKey = chatId; - const cache = this.data.chatContentCache[cacheKey]; - const now = Date.now(); - - // 每次刷新列表时都尝试获取最新消息,确保消息实时性 - const messages = await API.getChatMessages(chatId, userPhone, { limit: 1 }); - if (messages.length > 0) { - lastMessage = messages[0]; - chatItem.content = lastMessage.content || '暂无消息内容'; - // 同时更新时间为最新消息的时间 - chatItem.time = lastMessage.created_at || null; + let lastMessage = null; + try { + const cacheKey = chatId; + const cache = this.data.chatContentCache[cacheKey]; + const now = Date.now(); - // 更新缓存 - const newCache = { - ...this.data.chatContentCache, - [cacheKey]: { - content: chatItem.content, - time: chatItem.time, - timestamp: now, - messageId: lastMessage.id || lastMessage.message_id || null - } - }; - this.setData({ chatContentCache: newCache }); - console.log('更新聊天内容缓存:', cacheKey); - } else if (!chatItem.content) { - chatItem.content = '暂无消息内容'; - } - } catch (error) { - console.error('获取聊天消息失败:', error); - // 如果获取失败,尝试使用缓存内容 - const cacheKey = chatId; - const cache = this.data.chatContentCache[cacheKey]; - if (cache && !chatItem.content) { - chatItem.content = cache.content; - chatItem.time = cache.time; - console.log('获取最新消息失败,使用缓存内容:', cacheKey); - } else if (!chatItem.content) { - chatItem.content = '暂无消息内容'; + // 每次刷新列表时都尝试获取最新消息,确保消息实时性 + const messages = await API.getChatMessages(chatId, userPhone, { limit: 1 }); + if (messages.length > 0) { + lastMessage = messages[0]; + chatItem.content = lastMessage.content || '暂无消息内容'; + // 同时更新时间为最新消息的时间 + chatItem.time = lastMessage.created_at || null; + + // 更新缓存 + const newCache = { + ...this.data.chatContentCache, + [cacheKey]: { + content: chatItem.content, + time: chatItem.time, + timestamp: now, + messageId: lastMessage.id || lastMessage.message_id || null, + senderPhone: lastMessage.sender_phone || null // 保存发送者手机号 + } + }; + this.setData({ chatContentCache: newCache }); + console.log('更新聊天内容缓存:', cacheKey); + } else if (!chatItem.content) { + chatItem.content = '暂无消息内容'; + } + } catch (error) { + console.error('获取聊天消息失败:', error); + // 如果获取失败,尝试使用缓存内容 + const cacheKey = chatId; + const cache = this.data.chatContentCache[cacheKey]; + if (cache && !chatItem.content) { + chatItem.content = cache.content; + chatItem.time = cache.time; + console.log('获取最新消息失败,使用缓存内容:', cacheKey); + } else if (!chatItem.content) { + chatItem.content = '暂无消息内容'; + } } - } // 格式化时间 chatItem.time = this.formatDateTime(chatItem.time || null); - // 未读状态判断:基于用户是否查看过该聊天 - // 只在用户未查看过时显示未读红点 + // 未读状态判断:基于用户查看时的最新消息ID console.log('当前已查看的聊天:', viewedChats); console.log('当前聊天ID:', chatId); - // 检查该聊天是否已被查看过 - const isViewed = viewedChats[chatId] === true; - console.log('是否已查看:', isViewed); + // 获取当前聊天的最后一条消息ID和发送者 + const currentMessageId = lastMessage ? (lastMessage.id || lastMessage.message_id) : null; + const currentMessageSender = lastMessage ? (lastMessage.sender_phone) : null; + console.log('当前最新消息ID:', currentMessageId); + console.log('当前最新消息发送者:', currentMessageSender); + console.log('当前用户手机号:', userPhone); + + // 检查该聊天的查看记录 + const chatViewRecord = viewedChats[chatId] || {}; + const lastViewedMessageId = chatViewRecord.lastViewedMessageId; + console.log('上次查看时的消息ID:', lastViewedMessageId); + + // 检查是否是用户自己发送的消息 + const isMyMessage = currentMessageSender === userPhone; + console.log('是否是自己发送的消息:', isMyMessage); - // 设置未读状态:未查看过则显示未读 - chatItem.unread = !isViewed; + // 如果最后一条消息是用户自己发送的,自动标记为已查看 + if (isMyMessage && !chatViewRecord.hasViewed) { + console.log('最后一条消息是自己发送的,自动标记为已查看:', chatId); + viewedChats[chatId] = { + hasViewed: true, + lastViewedMessageId: currentMessageId, + viewedTime: Date.now() + }; + // 立即更新本地存储 + wx.setStorageSync('viewedChats', viewedChats); + // 重新获取更新后的查看记录 + chatViewRecord.hasViewed = true; + chatViewRecord.lastViewedMessageId = currentMessageId; + } + + // 设置未读状态: + // 1. 如果是自己发送的消息,不显示未读 + // 2. 如果从未查看过且不是自己发送的,显示未读 + // 3. 如果有新消息(当前消息ID不同且不是自己发送的),显示未读 + // 4. 否则不显示未读 + let unread = false; + if (!isMyMessage) { + if (!chatViewRecord.hasViewed) { + // 从未查看过,显示未读 + unread = true; + } else if (currentMessageId && lastViewedMessageId && currentMessageId !== lastViewedMessageId) { + // 有新消息,显示未读 + unread = true; + } else if (currentMessageId && !lastViewedMessageId) { + // 之前没有消息,现在有新消息,显示未读 + unread = true; + } + } + + chatItem.unread = unread; console.log('设置unread的值:', chatItem.unread); + chatItem.lastMessageId = currentMessageId; // 保存当前消息ID供点击事件使用 // 保存最后一条消息的ID或内容作为标识(可选) if (lastMessage) { @@ -444,9 +490,19 @@ Page({ } } - // 1. 更新localStorage中的viewedChats,标记为已查看 + // 1. 更新localStorage中的viewedChats,标记为已查看并记录当前最新消息ID const viewedChats = wx.getStorageSync('viewedChats') || {}; - viewedChats[chatId] = true; + + // 获取当前聊天项的最新消息ID + const currentMessageId = chatItem.lastMessageId; + + // 更新查看记录:包含是否已查看和查看时的最新消息ID + viewedChats[chatId] = { + hasViewed: true, + lastViewedMessageId: currentMessageId, + viewedTime: Date.now() + }; + wx.setStorageSync('viewedChats', viewedChats); console.log('更新localStorage中的viewedChats:', chatId, viewedChats[chatId]);