feat: 站点 JSON、语音终端 WebSocket 指派与客户端联调
- 用 OR_SITE_CONFIG_JSON_FILE 统一术间配置(video_rtsp_urls + voice_or_room_bindings) - VoiceTerminalHub:assignment、WS 推送与 HTTP 查询;开录/停录后 notify - 一键联调 orchestrate-and-start 与 /client/surgeries/start 共用指派逻辑,修复 demo 路径不发 WS - 语音桌面端:SIGINT 退出、shutdown 清理、仅 WS 指派、固定 pending 轮询间隔、界面仅保留录音时长 - 新增/调整契约与绑定测试,文档与示例配置同步 Made-with: Cursor
This commit is contained in:
@@ -223,7 +223,17 @@ class CameraSessionManager:
|
||||
await self.stop_surgery(surgery_id, require_active=True)
|
||||
raise
|
||||
|
||||
async def stop_surgery(self, surgery_id: str, *, require_active: bool = True) -> None:
|
||||
def set_voice_terminal_id(self, surgery_id: str, terminal_id: str | None) -> None:
|
||||
"""开录成功后写入,供停录时向对应桌面终端推送 end。"""
|
||||
run = self._registry.get_running(surgery_id)
|
||||
if run is None:
|
||||
return
|
||||
tid = (terminal_id or "").strip()
|
||||
run.state.voice_terminal_id = tid or None
|
||||
|
||||
async def stop_surgery(
|
||||
self, surgery_id: str, *, require_active: bool = True
|
||||
) -> str | None:
|
||||
run = await self._registry.unregister(surgery_id)
|
||||
if run is None:
|
||||
if require_active:
|
||||
@@ -231,8 +241,9 @@ class CameraSessionManager:
|
||||
"RECORDING_NOT_STOPPED",
|
||||
"停录未能完成:当前没有该手术的活跃录制会话。",
|
||||
)
|
||||
return
|
||||
return None
|
||||
|
||||
voice_tid = run.state.voice_terminal_id
|
||||
run.stop_event.set()
|
||||
results = await asyncio.gather(*run.tasks, return_exceptions=True)
|
||||
for res in results:
|
||||
@@ -255,6 +266,7 @@ class CameraSessionManager:
|
||||
append_consumption_log_summary(surgery_id, totals)
|
||||
print_consumption_summary_markdown(totals)
|
||||
await self._archive.persist_or_archive(surgery_id, details)
|
||||
return voice_tid
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# PendingConfirmationStore 协议委托
|
||||
|
||||
Reference in New Issue
Block a user