[patch] 修改适中心跳机制 JD的平台登录抢占 提示弹框优化 并下发连接断开通知 托盘右击提示小标题显示精炼 增加store_name入回调方法做店铺名称定位
This commit is contained in:
@@ -59,7 +59,8 @@ class WebSocketManager:
|
||||
}
|
||||
|
||||
def set_callbacks(self, log: Callable = None, success: Callable = None, error: Callable = None,
|
||||
platform_connected: Callable = None, token_error: Callable = None, disconnect: Callable = None):
|
||||
platform_connected: Callable = None, platform_disconnected: Callable = None,
|
||||
token_error: Callable = None, disconnect: Callable = None):
|
||||
"""设置回调函数"""
|
||||
if log:
|
||||
self.callbacks['log'] = log
|
||||
@@ -69,6 +70,8 @@ class WebSocketManager:
|
||||
self.callbacks['error'] = error
|
||||
if platform_connected: # ← 新增
|
||||
self.callbacks['platform_connected'] = platform_connected
|
||||
if platform_disconnected:
|
||||
self.callbacks['platform_disconnected'] = platform_disconnected
|
||||
if token_error:
|
||||
self.callbacks['token_error'] = token_error
|
||||
if disconnect:
|
||||
@@ -101,6 +104,35 @@ class WebSocketManager:
|
||||
except Exception as e:
|
||||
self._log(f"通知平台连接失败: {e}", "ERROR")
|
||||
|
||||
def notify_platform_kicked(self, platform_name: str, store_name: str, reason: str = "账号在其他设备登录", store_id: str = None):
|
||||
"""通知GUI平台被踢下线(供平台监听器调用)"""
|
||||
try:
|
||||
self._log(f"⚠️ 平台被踢下线: {platform_name} - {store_name}, 原因: {reason}", "WARNING")
|
||||
|
||||
# 从连接列表中移除
|
||||
if platform_name in self.connected_platforms:
|
||||
self.connected_platforms.remove(platform_name)
|
||||
|
||||
# 🔥 发送平台断开消息给后端(status=false)
|
||||
if store_id and self.backend_client:
|
||||
try:
|
||||
disconnect_message = {
|
||||
"type": "connect_message",
|
||||
"store_id": store_id,
|
||||
"status": False,
|
||||
"cookies": ""
|
||||
}
|
||||
self.backend_client.send_message(disconnect_message)
|
||||
self._log(f"✅ 已通知后端 {platform_name} 平台断开: {store_id}", "INFO")
|
||||
except Exception as send_error:
|
||||
self._log(f"❌ 发送平台断开消息失败: {send_error}", "ERROR")
|
||||
|
||||
# 通知GUI显示弹窗
|
||||
if self.callbacks['platform_disconnected']:
|
||||
self.callbacks['platform_disconnected'](platform_name, store_name, reason)
|
||||
except Exception as e:
|
||||
self._log(f"通知平台断开失败: {e}", "ERROR")
|
||||
|
||||
def connect_backend(self, token: str) -> bool:
|
||||
"""连接后端WebSocket"""
|
||||
try:
|
||||
@@ -139,11 +171,12 @@ class WebSocketManager:
|
||||
except Exception as e:
|
||||
self._log(f"成功回调执行失败: {e}", "ERROR")
|
||||
|
||||
def _on_backend_login(platform_name: str, store_id: str, cookies: str):
|
||||
def _on_backend_login(platform_name: str, store_id: str, cookies: str, store_name: str = ""):
|
||||
store_display = store_name or store_id
|
||||
self._log(
|
||||
f"收到后端登录指令: 平台={platform_name}, 店铺={store_id}, cookies_len={len(cookies) if cookies else 0}",
|
||||
f"收到后端登录指令: 平台={platform_name}, 店铺={store_display}, cookies_len={len(cookies) if cookies else 0}",
|
||||
"INFO")
|
||||
self._handle_platform_login(platform_name, store_id, cookies)
|
||||
self._handle_platform_login(platform_name, store_id, cookies, store_name)
|
||||
|
||||
def _on_token_error(error_content: str):
|
||||
self._log(f"Token验证失败: {error_content}", "ERROR")
|
||||
@@ -175,11 +208,12 @@ class WebSocketManager:
|
||||
|
||||
backend = BackendClient.from_exe_token(token)
|
||||
|
||||
def _on_backend_login(platform_name: str, store_id: str, cookies: str):
|
||||
def _on_backend_login(platform_name: str, store_id: str, cookies: str, store_name: str = ""):
|
||||
store_display = store_name or store_id
|
||||
self._log(
|
||||
f"收到后端登录指令: 平台={platform_name}, 店铺={store_id}, cookies_len={len(cookies) if cookies else 0}",
|
||||
f"收到后端登录指令: 平台={platform_name}, 店铺={store_display}, cookies_len={len(cookies) if cookies else 0}",
|
||||
"INFO")
|
||||
self._handle_platform_login(platform_name, store_id, cookies)
|
||||
self._handle_platform_login(platform_name, store_id, cookies, store_name)
|
||||
|
||||
def _on_backend_success():
|
||||
try:
|
||||
@@ -221,7 +255,7 @@ class WebSocketManager:
|
||||
self.callbacks['error'](str(e))
|
||||
return False
|
||||
|
||||
def _handle_platform_login(self, platform_name: str, store_id: str, cookies: str):
|
||||
def _handle_platform_login(self, platform_name: str, store_id: str, cookies: str, store_name: str = ""):
|
||||
"""处理平台登录请求"""
|
||||
try:
|
||||
# 🔥 检查并断开当前店铺的旧连接(策略B:先断开旧连接,再建立新连接)
|
||||
@@ -335,16 +369,16 @@ class WebSocketManager:
|
||||
if cookies == "login_success":
|
||||
self._log("⚠️ 千牛平台收到空cookies,但允许启动监听器", "WARNING")
|
||||
cookies = "" # 清空cookies,千牛不需要真实cookies
|
||||
self._start_qianniu_listener(store_id, cookies)
|
||||
self._start_qianniu_listener(store_id, cookies, store_name)
|
||||
|
||||
elif normalized_platform == "京东":
|
||||
self._start_jd_listener(store_id, cookies)
|
||||
self._start_jd_listener(store_id, cookies, store_name)
|
||||
|
||||
elif normalized_platform == "抖音":
|
||||
self._start_douyin_listener(store_id, cookies)
|
||||
self._start_douyin_listener(store_id, cookies, store_name)
|
||||
|
||||
elif normalized_platform == "拼多多":
|
||||
self._start_pdd_listener(store_id, cookies)
|
||||
self._start_pdd_listener(store_id, cookies, store_name)
|
||||
|
||||
else:
|
||||
self._log(f"❌ 不支持的平台: {platform_name}", "ERROR")
|
||||
@@ -382,7 +416,7 @@ class WebSocketManager:
|
||||
import traceback
|
||||
self._log(f"详细错误: {traceback.format_exc()}", "ERROR")
|
||||
|
||||
def _start_jd_listener(self, store_id: str, cookies: str):
|
||||
def _start_jd_listener(self, store_id: str, cookies: str, store_name: str = ""):
|
||||
"""启动京东平台监听"""
|
||||
try:
|
||||
def _runner():
|
||||
@@ -400,7 +434,8 @@ class WebSocketManager:
|
||||
self.platform_listeners[f"京东:{store_id}"] = {
|
||||
'thread': thread,
|
||||
'platform': '京东',
|
||||
'store_id': store_id
|
||||
'store_id': store_id,
|
||||
'store_name': store_name # 保存店铺名称
|
||||
}
|
||||
|
||||
# 上报连接状态给后端
|
||||
@@ -431,7 +466,7 @@ class WebSocketManager:
|
||||
except Exception as send_e:
|
||||
self._log(f"失败状态下报连接状态也失败: {send_e}", "ERROR")
|
||||
|
||||
def _start_douyin_listener(self, store_id: str, cookies: str):
|
||||
def _start_douyin_listener(self, store_id: str, cookies: str, store_name: str = ""):
|
||||
"""启动抖音平台监听"""
|
||||
try:
|
||||
def _runner():
|
||||
@@ -502,6 +537,7 @@ class WebSocketManager:
|
||||
'thread': thread,
|
||||
'platform': '抖音',
|
||||
'store_id': store_id,
|
||||
'store_name': store_name # 保存店铺名称
|
||||
}
|
||||
|
||||
# 更新监听器状态
|
||||
@@ -519,7 +555,7 @@ class WebSocketManager:
|
||||
# 🔥 移除:确保失败时也不在这里上报状态
|
||||
# 失败状态应该在DyLogin中处理,与拼多多保持一致
|
||||
|
||||
def _start_qianniu_listener(self, store_id: str, cookies: str):
|
||||
def _start_qianniu_listener(self, store_id: str, cookies: str, store_name: str = ""):
|
||||
"""启动千牛平台监听(单连接多店铺架构)"""
|
||||
try:
|
||||
# 获取用户token(从后端客户端获取)
|
||||
@@ -548,6 +584,7 @@ class WebSocketManager:
|
||||
'thread': thread,
|
||||
'platform': '千牛',
|
||||
'store_id': store_id,
|
||||
'store_name': store_name, # 保存店铺名称
|
||||
'exe_token': exe_token
|
||||
}
|
||||
|
||||
@@ -579,7 +616,7 @@ class WebSocketManager:
|
||||
except Exception as send_e:
|
||||
self._log(f"失败状态下报千牛平台连接状态也失败: {send_e}", "ERROR")
|
||||
|
||||
def _start_pdd_listener(self, store_id: str, data: str):
|
||||
def _start_pdd_listener(self, store_id: str, data: str, store_name: str = ""):
|
||||
"""启动拼多多平台监听"""
|
||||
try:
|
||||
def _runner():
|
||||
@@ -671,6 +708,7 @@ class WebSocketManager:
|
||||
'thread': thread,
|
||||
'platform': '拼多多',
|
||||
'store_id': store_id,
|
||||
'store_name': store_name # 保存店铺名称
|
||||
}
|
||||
|
||||
# ✅ 临时方案:启动后立即通知(因为 PDD 监听器会阻塞,无法通过返回值判断)
|
||||
|
||||
Reference in New Issue
Block a user