生成任务失败积分回退
This commit is contained in:
@@ -9,6 +9,7 @@ from app.models.base import async_session
|
||||
from app.models.chat_generation_task import ChatGenerationTask
|
||||
from app.services.error_codes import extract_error_message
|
||||
from app.services.generation_log_service import log_task_event, log_provider_call
|
||||
from app.services.generation_refund_service import mark_chat_generation_task_failed_and_refund_once
|
||||
from app.services.generation_provider_service import poll_provider_task
|
||||
from app.tasks.celery_app import celery_app
|
||||
|
||||
@@ -41,7 +42,7 @@ async def _reload_task(db, task_id: str) -> ChatGenerationTask | None:
|
||||
select(ChatGenerationTask).where(
|
||||
ChatGenerationTask.id == task_id,
|
||||
ChatGenerationTask.deleted_at.is_(None),
|
||||
).limit(1)
|
||||
).with_for_update().limit(1)
|
||||
)
|
||||
return result.scalar_one_or_none()
|
||||
|
||||
@@ -51,7 +52,7 @@ async def _run(task_id: str):
|
||||
result = await db.execute(select(ChatGenerationTask).where(
|
||||
ChatGenerationTask.id == task_id,
|
||||
ChatGenerationTask.deleted_at.is_(None),
|
||||
).limit(1))
|
||||
).with_for_update().limit(1))
|
||||
task = result.scalar_one_or_none()
|
||||
if not task or task.generation_mode != "chatapi_async":
|
||||
return
|
||||
@@ -61,17 +62,23 @@ async def _run(task_id: str):
|
||||
return
|
||||
|
||||
if task.deadline_at and datetime.now(timezone.utc) > task.deadline_at:
|
||||
task.status = "failed"
|
||||
task.pipeline_stage = "timeout"
|
||||
task.error_message = "任务轮询超时"
|
||||
await mark_chat_generation_task_failed_and_refund_once(
|
||||
db,
|
||||
task=task,
|
||||
error_message="任务轮询超时",
|
||||
pipeline_stage="timeout",
|
||||
)
|
||||
await db.commit()
|
||||
await log_task_event(task, event_type="TASK_TIMEOUT", to_status="failed", to_stage="timeout")
|
||||
return
|
||||
|
||||
if not (task.seedance_task_id or task.provider_task_id):
|
||||
task.status = "failed"
|
||||
task.pipeline_stage = "failed"
|
||||
task.error_message = "缺少外部任务ID"
|
||||
await mark_chat_generation_task_failed_and_refund_once(
|
||||
db,
|
||||
task=task,
|
||||
error_message="缺少外部任务ID",
|
||||
pipeline_stage="failed",
|
||||
)
|
||||
await db.commit()
|
||||
await log_task_event(task, event_type="POLL_FAILED", message=task.error_message)
|
||||
return
|
||||
@@ -117,9 +124,12 @@ async def _run(task_id: str):
|
||||
task.provider_response_json = response_data
|
||||
|
||||
if not task.remote_result_url:
|
||||
task.status = "failed"
|
||||
task.pipeline_stage = "failed"
|
||||
task.error_message = "供应商任务成功但未返回结果URL"
|
||||
await mark_chat_generation_task_failed_and_refund_once(
|
||||
db,
|
||||
task=task,
|
||||
error_message="供应商任务成功但未返回结果URL",
|
||||
pipeline_stage="failed",
|
||||
)
|
||||
await db.commit()
|
||||
await log_task_event(task, event_type="POLL_FAILED", message=task.error_message)
|
||||
return
|
||||
@@ -135,10 +145,13 @@ async def _run(task_id: str):
|
||||
return
|
||||
|
||||
if _is_failed(status):
|
||||
task.status = "failed"
|
||||
task.pipeline_stage = "failed"
|
||||
task.error_message = poll_result.get("error") or f"供应商任务失败: {status}"
|
||||
task.provider_response_json = response_data
|
||||
await mark_chat_generation_task_failed_and_refund_once(
|
||||
db,
|
||||
task=task,
|
||||
error_message=poll_result.get("error") or f"供应商任务失败: {status}",
|
||||
pipeline_stage="failed",
|
||||
)
|
||||
await db.commit()
|
||||
await log_task_event(task, event_type="POLL_FAILED", message=task.error_message, detail=poll_result)
|
||||
return
|
||||
@@ -173,9 +186,13 @@ async def _run(task_id: str):
|
||||
task.retry_count = (task.retry_count or 0) + 1
|
||||
|
||||
if task.retry_count > settings.CHATAPI_ASYNC_MAX_RETRIES:
|
||||
task.status = "failed"
|
||||
task.pipeline_stage = "failed"
|
||||
task.error_message = extract_error_message(exc, "轮询") if callable(extract_error_message) else str(exc)
|
||||
error_message = extract_error_message(exc, "轮询") if callable(extract_error_message) else str(exc)
|
||||
await mark_chat_generation_task_failed_and_refund_once(
|
||||
db,
|
||||
task=task,
|
||||
error_message=error_message,
|
||||
pipeline_stage="failed",
|
||||
)
|
||||
await db.commit()
|
||||
await log_task_event(task, event_type="POLL_FAILED", message=task.error_message)
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user