生成任务失败积分回退

This commit is contained in:
2026-06-03 16:15:45 +08:00
parent 7c56c02135
commit 1079a5a7d1
14 changed files with 931 additions and 259 deletions
+32 -12
View File
@@ -16,6 +16,7 @@ from app.services.resource_accounting_service import (
)
from app.services.video_cover_service import create_video_cover_for_local_video
from app.config import settings
from app.services.generation_refund_service import mark_generation_record_failed_and_refund_once
logger = logging.getLogger("videogen")
@@ -76,6 +77,7 @@ class TaskQueue:
GenerationRecord.id == record_id,
GenerationRecord.deleted_at.is_(None),
)
.with_for_update()
.limit(1)
)
record = result.scalar_one_or_none()
@@ -92,8 +94,11 @@ class TaskQueue:
record_id = record.id
if not record.seedance_task_id:
record.status = "failed"
record.error_message = "缺少外部任务ID"
await mark_generation_record_failed_and_refund_once(
db,
record=record,
error_message="缺少外部任务ID",
)
await db.commit()
return
@@ -105,8 +110,11 @@ class TaskQueue:
count = self._active.get(record_id, 0) + 1
self._active[record_id] = count
if count >= MAX_POLLS:
record.status = "failed"
record.error_message = f"轮询超时: {e}"
await mark_generation_record_failed_and_refund_once(
db,
record=record,
error_message=f"轮询超时: {e}",
)
await db.commit()
del self._active[record_id]
else:
@@ -166,8 +174,11 @@ class TaskQueue:
logger.info(f"Video task completed: {record_id}")
elif status == "failed":
record.status = "failed"
record.error_message = poll_result.get("error", "视频生成失败")
await mark_generation_record_failed_and_refund_once(
db,
record=record,
error_message=poll_result.get("error", "视频生成失败"),
)
self._active.pop(record_id, None)
await db.commit()
logger.info(f"Video task failed: {record_id}")
@@ -176,8 +187,11 @@ class TaskQueue:
count = self._active.get(record_id, 0) + 1
self._active[record_id] = count
if count >= MAX_POLLS:
record.status = "failed"
record.error_message = "视频生成超时"
await mark_generation_record_failed_and_refund_once(
db,
record=record,
error_message="视频生成超时",
)
self._active.pop(record_id, None)
await db.commit()
logger.info(f"Video task timed out: {record_id}")
@@ -230,15 +244,21 @@ class TaskQueue:
await db.commit()
logger.info(f"Image task completed: {record_id}")
else:
record.status = "failed"
record.error_message = poll_result.get("error", "图片生成失败")
await mark_generation_record_failed_and_refund_once(
db,
record=record,
error_message=poll_result.get("error", "图片生成失败"),
)
await db.commit()
logger.info(f"Image task failed: {record_id}")
_log_image_response(record_id, poll_result)
except Exception as e:
record.status = "failed"
record.error_message = str(e)
await mark_generation_record_failed_and_refund_once(
db,
record=record,
error_message=str(e),
)
_log_image_response(record_id, {}, str(e))
await db.commit()
logger.error(f"Image task failed: {record_id}, error: {e}")