From f6332b4b2f0e497a6e7e4f98a6ddc6602e3534fc Mon Sep 17 00:00:00 2001 From: OG T Date: Mon, 6 Apr 2026 11:53:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(telegram):=20=E4=BF=AE=E6=AD=A3=20approval?= =?UTF-8?q?=5Fid=20UUID=20=E8=BD=89=E6=8F=9B=E9=8C=AF=E8=AA=A4=20=E2=80=94?= =?UTF-8?q?=20=E6=94=AF=E6=8F=B4=20INC-xxx=20=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _execute_approval_action 用 UUID(approval_id) 但 approval_id 是 INC-xxx, 導致 'badly formed hexadecimal UUID string' 錯誤,簽核無法執行。 修正: 先嘗試 UUID 轉換,失敗則用 incident_id 查出對應的 pending approval UUID。 Co-Authored-By: Claude Sonnet 4.6 --- apps/api/src/services/telegram_gateway.py | 34 +++++++++++++---------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/apps/api/src/services/telegram_gateway.py b/apps/api/src/services/telegram_gateway.py index aded4358..8887dd29 100644 --- a/apps/api/src/services/telegram_gateway.py +++ b/apps/api/src/services/telegram_gateway.py @@ -3456,10 +3456,27 @@ class TelegramGateway: try: service = get_approval_service() + # approval_id 可能是 INC-xxx (incident_id) 格式,需查出真正的 UUID + # 2026-04-06 Claude Code: decision_manager 傳入的是 incident.incident_id + approval_uuid: UUID | None = None + try: + approval_uuid = UUID(approval_id) + except ValueError: + # 非 UUID 格式,嘗試用 incident_id 查出 pending approval + pending_list = await service.get_all_approvals(incident_id=approval_id) + if pending_list: + approval_uuid = UUID(pending_list[0].id) if isinstance(pending_list[0].id, str) else pending_list[0].id + else: + logger.warning( + "telegram_approval_not_found_by_incident", + approval_id=approval_id, + ) + return + if action == "approve": # 2026-03-29 ogt: 正確呼叫 sign_approval (返回 tuple) approval, message, execution_triggered = await service.sign_approval( - approval_id=UUID(approval_id), + approval_id=approval_uuid, signer_id=f"tg_{user_id}", signer_name=username, comment="Telegram 簽核 (Long Polling)", @@ -3473,19 +3490,11 @@ class TelegramGateway: status=approval.status.value, execution_triggered=execution_triggered, ) - print(f"\n{'='*60}") - print("✅ 統帥已授權執行!") - print(f"簽核單: {approval_id}") - print(f"簽核者: @{username} (ID: {user_id})") - print(f"狀態: {approval.status.value}") - print(f"執行觸發: {execution_triggered}") - print(f"時間: {datetime.now(UTC).isoformat()}") - print(f"{'='*60}\n") elif action == "reject": # 2026-03-29 ogt: 正確呼叫 reject_approval (返回 tuple) approval, message = await service.reject_approval( - approval_id=UUID(approval_id), + approval_id=approval_uuid, rejector_id=f"tg_{user_id}", rejector_name=username, reason="Telegram 拒絕 (Long Polling)", @@ -3497,11 +3506,6 @@ class TelegramGateway: approval_id=approval_id, user_id=user_id, ) - print(f"\n{'='*60}") - print("❌ 統帥已拒絕執行!") - print(f"簽核單: {approval_id}") - print(f"拒絕者: @{username}") - print(f"{'='*60}\n") elif action == "tune": # 自動調優已在 handle_callback 中處理