From 01bf7ee2711399bd5923f188db773eb4a90f256a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E8=80=81=E7=99=BD=E5=85=94?= Date: Fri, 14 Nov 2025 15:30:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0WebSocket=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=B8=AD=E7=9A=84=E6=B4=BB=E8=B7=83=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E8=AF=B7=E6=B1=82=E9=80=BB=E8=BE=91=EF=BC=8C=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=E9=A2=91=E7=B9=81=E8=AF=B7=E6=B1=82=E3=80=82=E5=BC=95?= =?UTF-8?q?=E5=85=A5=E6=96=B0=E7=9A=84=E7=8A=B6=E6=80=81=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E4=BB=A5=E8=B7=9F=E8=B8=AA=E6=9C=80=E5=90=8E=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E6=97=B6=E9=97=B4=EF=BC=8C=E5=B9=B6=E5=9C=A8=E5=8F=91=E9=80=81?= =?UTF-8?q?=E6=B4=BB=E8=B7=83=E7=8A=B6=E6=80=81=E8=AF=B7=E6=B1=82=E6=97=B6?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E6=97=B6=E9=97=B4=E9=97=B4=E9=9A=94=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E3=80=82=E6=B8=85=E7=90=86=E7=9B=B8=E5=85=B3=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E4=BB=A5=E7=A1=AE=E4=BF=9D=E4=B8=80=E8=87=B4=E6=80=A7?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/store/module/websocket/websocket.ts | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/Touchkebao/src/store/module/websocket/websocket.ts b/Touchkebao/src/store/module/websocket/websocket.ts index 51134cc2..57ed7f15 100644 --- a/Touchkebao/src/store/module/websocket/websocket.ts +++ b/Touchkebao/src/store/module/websocket/websocket.ts @@ -53,6 +53,7 @@ interface WebSocketState { reconnectTimer: NodeJS.Timeout | null; aliveStatusTimer: NodeJS.Timeout | null; // 客服用户状态查询定时器 aliveStatusUnsubscribe: (() => void) | null; + aliveStatusLastRequest: number | null; // 方法 connect: (config: Partial) => void; @@ -88,6 +89,8 @@ const DEFAULT_CONFIG: WebSocketConfig = { maxReconnectAttempts: 5, }; +const ALIVE_STATUS_MIN_INTERVAL = 5 * 1000; // ms + export const useWebSocketStore = createPersistStore( (set, get) => ({ status: WebSocketStatus.DISCONNECTED, @@ -99,6 +102,7 @@ export const useWebSocketStore = createPersistStore( reconnectTimer: null, aliveStatusTimer: null, aliveStatusUnsubscribe: null, + aliveStatusLastRequest: null, // 连接WebSocket connect: (config: Partial) => { @@ -234,11 +238,6 @@ export const useWebSocketStore = createPersistStore( currentState.status !== WebSocketStatus.CONNECTED || !currentState.ws ) { - // Toast.show({ - // content: "WebSocket未连接,正在重新连接...", - // position: "top", - // }); - // 重置连接状态并发起重新连接 set({ status: WebSocketStatus.DISCONNECTED }); if (currentState.config) { @@ -485,6 +484,14 @@ export const useWebSocketStore = createPersistStore( return; } + const now = Date.now(); + if ( + state.aliveStatusLastRequest && + now - state.aliveStatusLastRequest < ALIVE_STATUS_MIN_INTERVAL + ) { + return; + } + const { customerList } = useCustomerStore.getState(); const { kfUserList } = useCkChatStore.getState(); const targets = @@ -498,6 +505,7 @@ export const useWebSocketStore = createPersistStore( state.sendCommand("CmdRequestWechatAccountsAliveStatus", { wechatAccountIds: targets.map(v => v.id), }); + set({ aliveStatusLastRequest: now }); } }; @@ -556,7 +564,11 @@ export const useWebSocketStore = createPersistStore( if (currentState.aliveStatusTimer) { clearInterval(currentState.aliveStatusTimer); } - set({ aliveStatusTimer: null, aliveStatusUnsubscribe: null }); + set({ + aliveStatusTimer: null, + aliveStatusUnsubscribe: null, + aliveStatusLastRequest: null, + }); }, }), { @@ -568,6 +580,7 @@ export const useWebSocketStore = createPersistStore( messages: state.messages.slice(-100), // 只保留最近100条消息 unreadCount: state.unreadCount, reconnectAttempts: state.reconnectAttempts, + aliveStatusLastRequest: state.aliveStatusLastRequest, // 注意:定时器不需要持久化,重新连接时会重新创建 }), onRehydrateStorage: () => state => {