diff --git a/pages/message/index.vue b/pages/message/index.vue index d74ca56..a2fac16 100644 --- a/pages/message/index.vue +++ b/pages/message/index.vue @@ -769,6 +769,13 @@ onShow(() => { checkLoginAndInitTIM(); } else if (timChatManager.tim && !timChatManager.isLoggedIn) { timChatManager.ensureIMConnection(); + } else if (timChatManager.tim && timChatManager.isLoggedIn && chatInfo.value.conversationID) { + // 页面从后台返回时,重新加载消息列表 + console.log("页面从后台返回,重新加载消息列表"); + messageList.value = []; + isCompleted.value = false; + lastFirstMessageId.value = ""; + loadMessageList(); } startIMMonitoring(30000); diff --git a/pages/message/message.vue b/pages/message/message.vue index bfd156a..5adc1f9 100644 --- a/pages/message/message.vue +++ b/pages/message/message.vue @@ -67,10 +67,7 @@ 医生信息未获取,请稍后重试 @@ -165,12 +162,78 @@ const handleAddPatient = withInfo(() => { }); }); +// 立即更新未读徽章 +const updateUnreadBadgeImmediately = async () => { + try { + if (!globalTimChatManager || !globalTimChatManager.tim) { + console.warn("TIM实例不存在,无法更新徽章"); + return; + } + + const response = await globalTimChatManager.tim.getConversationList(); + + if (!response || !response.data || !response.data.conversationList) { + console.warn("获取会话列表返回数据异常"); + return; + } + + // 计算群聊总未读数 + const totalUnreadCount = response.data.conversationList + .filter( + (conv) => conv.conversationID && conv.conversationID.startsWith("GROUP") + ) + .reduce((sum, conv) => sum + (conv.unreadCount || 0), 0); + + // 更新 tabBar 徽章 - 添加错误处理,防止在非TabBar页面调用时出错 + try { + if (totalUnreadCount > 0) { + uni.setTabBarBadge({ + index: 1, + text: totalUnreadCount > 99 ? "99+" : String(totalUnreadCount), + }); + console.log("已更新 tabBar 徽章:", totalUnreadCount); + } else { + uni.removeTabBarBadge({ + index: 1, + }); + console.log("已移除 tabBar 徽章"); + } + } catch (badgeError) { + // 在非TabBar页面上调用时会出错,这是正常的,不需要处理 + if (badgeError.errMsg && badgeError.errMsg.includes("not TabBar page")) { + console.log("当前不是TabBar页面,跳过徽章更新"); + } else { + console.error("更新TabBar徽章失败:", badgeError); + } + } + } catch (error) { + console.error("更新未读徽章失败:", error); + } +}; + // 初始化IM const initIM = async () => { - if (!isIMInitialized.value) { + // 关键修复:不仅检查 isIMInitialized,还要检查实际连接状态 + const needsInit = + !isIMInitialized.value || + !globalTimChatManager || + !globalTimChatManager.isLoggedIn; + + if (needsInit) { uni.showLoading({ title: "连接中...", }); + + // 如果已初始化但连接断开,先清理旧实例 + if ( + isIMInitialized.value && + globalTimChatManager && + !globalTimChatManager.isLoggedIn + ) { + console.log("IM已初始化但连接已断开,清理旧实例后重新初始化"); + await globalTimChatManager.cleanupOldInstance(); + } + const success = await initIMAfterLogin(); uni.hideLoading(); @@ -191,30 +254,6 @@ const initIM = async () => { }); return false; } - } else if (globalTimChatManager && !globalTimChatManager.isLoggedIn) { - uni.showLoading({ - title: "重连中...", - }); - const reconnected = await globalTimChatManager.ensureIMConnection(); - uni.hideLoading(); - - if (!reconnected) { - // 显示重试提示 - uni.showModal({ - title: "IM连接失败", - content: - "连接失败,请检查网络后重试。如果IM连接失败,请重新登陆IM再连接", - confirmText: "重新登陆", - cancelText: "取消", - success: (res) => { - if (res.confirm) { - // 重新登陆 - handleReloginIM(); - } - }, - }); - return false; - } } return true; }; @@ -281,7 +320,7 @@ const loadConversationList = async () => { } } - // 检查是否已登录 + // 检查是否已登录 - 这是关键检查 if (!globalTimChatManager.isLoggedIn) { console.warn("IM未登录,尝试重新连接"); const reconnected = await globalTimChatManager.ensureIMConnection(); @@ -294,7 +333,19 @@ const loadConversationList = async () => { throw new Error("IM管理器方法不可用"); } - const result = await globalTimChatManager.getGroupList(); + // 添加超时控制,防止永久等待 + const timeoutPromise = new Promise((_, reject) => { + setTimeout( + () => reject(new Error("加载会话列表超时,请检查网络连接")), + 35000 + ); + }); + + const result = await Promise.race([ + globalTimChatManager.getGroupList(), + timeoutPromise, + ]); + if (result && result.success && result.groupList) { // 合并后端群组详细信息(已包含格式化和排序) conversationList.value = await mergeConversationWithGroupDetails( @@ -317,17 +368,26 @@ const loadConversationList = async () => { ); } else { console.error("加载群聊列表失败:", result); - uni.showToast({ - title: "加载失败,请重试", - icon: "none", - }); + throw new Error(result?.message || "加载失败,请重试"); } } catch (error) { console.error("加载会话列表失败:", error); - uni.showToast({ - title: error.message || "加载失败,请重试", - icon: "none", - }); + + // 如果是超时或连接错误,提示用户重试 + if ( + error.message && + (error.message.includes("超时") || error.message.includes("连接")) + ) { + uni.showToast({ + title: "网络连接不稳定,请重试", + icon: "none", + }); + } else { + uni.showToast({ + title: error.message || "加载失败,请重试", + icon: "none", + }); + } } finally { loading.value = false; } @@ -605,7 +665,7 @@ onShow(async () => { // 加载团队列表 await getTeams(); - // 初始化IM + // 初始化IM - 关键修复:确保IM连接状态正确 const imReady = await initIM(); if (!imReady) { console.error("IM初始化失败"); diff --git a/pages/work/team/invite/invite-teammate.vue b/pages/work/team/invite/invite-teammate.vue index 73ad092..363b906 100644 --- a/pages/work/team/invite/invite-teammate.vue +++ b/pages/work/team/invite/invite-teammate.vue @@ -1,118 +1,141 @@ - - - \ No newline at end of file diff --git a/utils/tim-chat.js b/utils/tim-chat.js index 158e904..14d8ed4 100644 --- a/utils/tim-chat.js +++ b/utils/tim-chat.js @@ -1032,6 +1032,8 @@ class TimChatManager { return new Promise((resolve, reject) => { // 检查userId是否存在,不存在则不需要初始化 if (!this.currentUserID) { + console.error('currentUserID不存在,无法获取群聊列表') + reject(new Error('用户ID不存在')) return } @@ -1076,12 +1078,13 @@ class TimChatManager { if (timeoutHandle) clearTimeout(timeoutHandle) this.getGroupListInternal().then(resolve).catch(reject) } else if (waitTime >= maxWaitTime) { - console.error('等待SDK就绪超时') + console.error('等待SDK就绪超时,当前isLoggedIn:', this.isLoggedIn) if (timeoutHandle) clearTimeout(timeoutHandle) + // 超时时返回错误而不是继续等待 reject(new Error('SDK初始化超时,请检查网络连接')) } else { waitTime += checkInterval - console.log(`等待SDK就绪... (${Math.floor(waitTime / 1000)}/${Math.floor(maxWaitTime / 1000)}秒)`) + console.log(`等待SDK就绪... (${Math.floor(waitTime / 1000)}/${Math.floor(maxWaitTime / 1000)}秒, isLoggedIn: ${this.isLoggedIn})`) timeoutHandle = setTimeout(checkSDKReady, checkInterval) } } @@ -2758,6 +2761,7 @@ class TimChatManager { // 标记会话为已读 markConversationAsRead(conversationID) { + if (!this.tim || !this.isLoggedIn) { console.log('⚠️ TIM未初始化或未登录,无法标记会话已读'); return; @@ -2777,6 +2781,7 @@ class TimChatManager { } } + // 更新会话列表 updateConversationListOnNewMessage(message) { try {