[patch] 修改适中心跳机制 JD的平台登录抢占 提示弹框优化 并下发连接断开通知 托盘右击提示小标题显示精炼 增加store_name入回调方法做店铺名称定位

This commit is contained in:
2025-10-17 15:21:03 +08:00
parent 90bf763bde
commit c32d326c69
5 changed files with 282 additions and 90 deletions

131
main.py
View File

@@ -613,6 +613,36 @@ class LoginWindow(QMainWindow):
except Exception as e:
self.add_log(f"处理平台连接事件失败: {e}", "ERROR")
def on_platform_kicked(self, platform_name: str, store_name: str, reason: str):
"""处理平台被踢下线 - 显示弹窗警告"""
try:
self.add_log(f"⚠️ {platform_name}平台被踢下线: {store_name}, 原因: {reason}", "WARNING")
# 显示弹窗提示
message_text = (
f"{store_name}】连接已断开\n\n"
f"原因:{reason}\n\n"
f"请确保:\n"
f"1. 关闭网页版{platform_name}客户端\n"
f"2. 关闭其他{platform_name}客户端\n"
f"3. 确认只有本程序连接\n\n"
f"处理完成后,请重新登录平台。"
)
QMessageBox.warning(
self,
f"{platform_name}连接已断开",
message_text,
QMessageBox.Ok
)
# 更新状态显示
self.status_label.setText(f"⚠️ {platform_name}已断开")
self.status_label.setStyleSheet(
"color: #ff6b6b; background: rgba(255, 107, 107, 0.1); border-radius: 12px; padding: 5px 10px;")
except Exception as e:
self.add_log(f"显示平台断开提示失败: {e}", "ERROR")
def on_token_error(self, error_content: str):
"""处理token错误 - 显示红色错误信息并停止所有操作"""
try:
@@ -761,23 +791,16 @@ class LoginWindow(QMainWindow):
self.tray_icon.setIcon(self.style().standardIcon(self.style().SP_ComputerIcon))
# 创建托盘菜单
tray_menu = QMenu()
self.tray_menu = QMenu()
# 显示窗口动作
show_action = QAction("显示主窗口", self)
show_action.triggered.connect(self.show_window)
tray_menu.addAction(show_action)
# 连接菜单显示信号,实时更新状态
self.tray_menu.aboutToShow.connect(self.update_tray_menu)
# 分隔线
tray_menu.addSeparator()
# 退出动作
quit_action = QAction("退出程序", self)
quit_action.triggered.connect(self.quit_application)
tray_menu.addAction(quit_action)
# 初始化菜单内容
self.update_tray_menu()
# 设置托盘菜单
self.tray_icon.setContextMenu(tray_menu)
self.tray_icon.setContextMenu(self.tray_menu)
# 设置托盘提示
self.tray_icon.setToolTip("AI客服智能助手")
@@ -790,6 +813,87 @@ class LoginWindow(QMainWindow):
print("[INFO] 系统托盘已初始化")
def update_tray_menu(self):
"""实时更新托盘菜单,显示连接状态"""
try:
# 清空现有菜单
self.tray_menu.clear()
# 获取WebSocket管理器
ws_manager = get_websocket_manager()
# 1. 显示后端连接状态
if ws_manager and ws_manager.backend_client and ws_manager.backend_client.is_connected:
backend_status = QAction("✅ 后端已连接", self)
backend_status.setEnabled(False) # 不可点击
self.tray_menu.addAction(backend_status)
# 2. 显示已连接的平台信息
platform_listeners = ws_manager.platform_listeners
if platform_listeners:
# 按平台分组店铺
platform_stores = {}
for key, info in platform_listeners.items():
platform = info.get('platform', '')
store_name = info.get('store_name', '')
store_id = info.get('store_id', '')
if platform not in platform_stores:
platform_stores[platform] = []
# 优先显示店铺名称,如果没有则显示 store_id 前8位
if store_name:
display_name = store_name
else:
display_name = store_id[:8] + "..." if len(store_id) > 8 else store_id
platform_stores[platform].append(display_name)
# 显示每个平台的店铺
for platform, stores in platform_stores.items():
stores_text = ", ".join(stores)
platform_info = QAction(f"📊 {platform}: {stores_text}", self)
platform_info.setEnabled(False) # 不可点击
self.tray_menu.addAction(platform_info)
else:
# 后端已连接但没有平台连接
no_platform = QAction("⚠️ 暂无平台连接", self)
no_platform.setEnabled(False)
self.tray_menu.addAction(no_platform)
else:
# 后端未连接
backend_disconnected = QAction("❌ 后端未连接", self)
backend_disconnected.setEnabled(False)
self.tray_menu.addAction(backend_disconnected)
# 添加分隔线
self.tray_menu.addSeparator()
# 3. 显示主窗口
show_action = QAction("显示主窗口", self)
show_action.triggered.connect(self.show_window)
self.tray_menu.addAction(show_action)
# 添加分隔线
self.tray_menu.addSeparator()
# 4. 退出程序
quit_action = QAction("退出程序", self)
quit_action.triggered.connect(self.quit_application)
self.tray_menu.addAction(quit_action)
except Exception as e:
print(f"[ERROR] 更新托盘菜单失败: {e}")
# 如果更新失败,至少保证基本功能可用
self.tray_menu.clear()
show_action = QAction("显示主窗口", self)
show_action.triggered.connect(self.show_window)
self.tray_menu.addAction(show_action)
quit_action = QAction("退出程序", self)
quit_action.triggered.connect(self.quit_application)
self.tray_menu.addAction(quit_action)
def tray_icon_activated(self, reason):
"""托盘图标被激活时的处理"""
if reason == QSystemTrayIcon.DoubleClick:
@@ -898,6 +1002,7 @@ class LoginWindow(QMainWindow):
success=lambda: self.add_log("WebSocket连接管理器连接成功", "SUCCESS"),
error=lambda error: self.add_log(f"WebSocket连接管理器错误: {error}", "ERROR"),
platform_connected=self.on_platform_connected, # 新增:平台连接回调
platform_disconnected=self.on_platform_kicked, # 新增:平台被踢回调
token_error=self.on_token_error, # 新增token错误回调
disconnect=self.on_disconnect # 新增:被踢下线回调
)