This commit is contained in:
ddrwode
2026-03-02 00:51:20 +08:00
parent 57ee9a6cda
commit e9b359b4fb
2 changed files with 33 additions and 4 deletions

View File

@@ -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)

View File

@@ -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)