ha'ha
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user