From e9b359b4fb4f01240ecf5f222869a9b4a0cfae7e Mon Sep 17 00:00:00 2001 From: ddrwode Date: Mon, 2 Mar 2026 00:51:20 +0800 Subject: [PATCH] ha'ha --- server/core/task_dispatcher.py | 32 ++++++++++++++++++++++++++++++-- server/ws/consumers.py | 5 +++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/server/core/task_dispatcher.py b/server/core/task_dispatcher.py index 537919d..60d146b 100644 --- a/server/core/task_dispatcher.py +++ b/server/core/task_dispatcher.py @@ -42,6 +42,32 @@ class TaskDispatcher: return task return None + @staticmethod + def _infer_failure_reason(result, error) -> Optional[str]: + """ + 从 Worker 上报中推断失败原因。 + 规则: + 1) 只要显式上报了 error(即便是空串)就视为失败; + 2) 若 result 明确包含 success=false / ok=false / status=failed|error|fail,也视为失败。 + """ + if error is not None: + msg = str(error).strip() + return msg or "任务执行失败" + + if isinstance(result, dict): + if result.get("success") is False: + msg = str(result.get("error", "")).strip() + return msg or "任务执行失败" + if result.get("ok") is False: + msg = str(result.get("error", "")).strip() + return msg or "任务执行失败" + status_text = str(result.get("status", "")).strip().lower() + if status_text in {"failed", "error", "fail"}: + msg = str(result.get("error", "")).strip() + return msg or "任务执行失败" + + return None + # ─── 创建任务 ─── def create_task(self, req: TaskCreate) -> TaskInfo: @@ -114,12 +140,14 @@ class TaskDispatcher: task = self._tasks.get(task_id) if not task: return - if error: + failure_reason = self._infer_failure_reason(result, error) + if failure_reason: task.status = TaskStatus.FAILED - task.error = error + task.error = failure_reason else: task.status = TaskStatus.SUCCESS task.result = result + task.error = None task.updated_at = time.time() logger.info("任务 %s 完成: status=%s", task_id, task.status) diff --git a/server/ws/consumers.py b/server/ws/consumers.py index 2a27845..706d979 100644 --- a/server/ws/consumers.py +++ b/server/ws/consumers.py @@ -123,12 +123,13 @@ class WorkerConsumer(AsyncWebsocketConsumer): task_info = task_dispatcher.get_task(task_id) if task_info: final_status = task_info.status.value if hasattr(task_info.status, "value") else str(task_info.status) - await self._save_task_log(task_id, task_info, result, error, final_status) + final_error = task_info.error if getattr(task_info, "error", None) else error + await self._save_task_log(task_id, task_info, result, final_error, final_status) await self._update_account_task_status(task_id, final_status) logger.info("任务 %s 最终状态已更新: %s", task_id, final_status) # check_login 任务:更新账号登录状态 task_type_val = task_info.task_type.value if hasattr(task_info.task_type, "value") else str(task_info.task_type) - if task_type_val == TaskType.CHECK_LOGIN.value and result and not error: + if task_type_val == TaskType.CHECK_LOGIN.value and result and final_status == TaskStatus.SUCCESS.value: await self._upsert_account_status(result) except Exception as db_err: logger.error("任务 %s 写入数据库失败: %s", task_id, db_err)