From 220e4fab27b7f419b3e89e2f2d28ae789aac09d7 Mon Sep 17 00:00:00 2001
From: wangzhibo <wangzhibo@shsening.com>
Date: 星期四, 08 十月 2026 16:29:55 +0800
Subject: [PATCH] 5种场景模式家长端ok
---
xiaozhi-esp32-server/main/xiaozhi-server/core/app_runtime/session.py | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 54 insertions(+), 0 deletions(-)
diff --git a/xiaozhi-esp32-server/main/xiaozhi-server/core/app_runtime/session.py b/xiaozhi-esp32-server/main/xiaozhi-server/core/app_runtime/session.py
index 33fb816..8d79cd6 100644
--- a/xiaozhi-esp32-server/main/xiaozhi-server/core/app_runtime/session.py
+++ b/xiaozhi-esp32-server/main/xiaozhi-server/core/app_runtime/session.py
@@ -240,6 +240,7 @@
logger.bind(tag=TAG).info(
f"TaskSession 缁撴潫 {session.task_session_id} status={session.status} reason={reason}"
)
+ _schedule_close_parent_matching(conn, session, reason)
def current_session(conn: "ConnectionHandler") -> Optional[TaskSession]:
@@ -249,6 +250,59 @@
return None
+def schedule_close_parent_except(
+ conn: "ConnectionHandler",
+ reason: str,
+ except_app: str = "",
+ except_task: str = "",
+) -> None:
+ device_id = str(getattr(conn, "device_id", "") or "")
+ if not device_id:
+ return
+ payload: Dict[str, Any] = {
+ "device_id": device_id,
+ "reason": reason or "server",
+ "except_app_id": except_app or "",
+ "except_task_id": except_task or "",
+ }
+ _schedule_close_parent(payload)
+
+
+def _schedule_close_parent_matching(
+ conn: "ConnectionHandler",
+ session: TaskSession,
+ reason: str,
+) -> None:
+ device_id = str(getattr(conn, "device_id", "") or getattr(session, "device_id", "") or "")
+ if not device_id:
+ return
+ status = "done" if getattr(session, "status", "") == "completed" else "cancelled"
+ payload: Dict[str, Any] = {
+ "device_id": device_id,
+ "reason": reason or "",
+ "status": status,
+ "match_app_id": session.app_id or "",
+ "match_task_id": session.task_id or "",
+ }
+ _schedule_close_parent(payload)
+
+
+def _schedule_close_parent(payload: Dict[str, Any]) -> None:
+ async def _run():
+ try:
+ from config.manage_api_client import close_parent_immediate_tasks
+
+ await close_parent_immediate_tasks(payload)
+ except Exception as exc:
+ logger.bind(tag=TAG).warning(f"鍏抽棴瀹堕暱鍗虫椂浠诲姟澶辫触: {exc}")
+
+ try:
+ loop = asyncio.get_running_loop()
+ except RuntimeError:
+ return
+ loop.create_task(_run())
+
+
async def _upsert_task_instance(payload: Dict[str, Any]) -> bool:
from config.manage_api_client import upsert_task_instance
--
Gitblit v1.9.1