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