增加预扣积分

This commit is contained in:
2026-07-22 09:27:33 +08:00
parent 4afda8992c
commit 9b13d01d72
6 changed files with 64 additions and 46 deletions
+20 -5
View File
@@ -10,11 +10,11 @@ from fastapi.responses import RedirectResponse
from sqlalchemy import select, func
from sqlalchemy.ext.asyncio import AsyncSession
from app.config import settings
from app.dependencies import get_db, get_current_user
from app.models.user import User
from app.models.project import Project
from app.models.generation_record import GenerationRecord
from app.models.system_config import SystemConfig
from app.schemas.generation import (
OptimizeParams,
GenerateParams,
@@ -32,7 +32,7 @@ from app.services.generation.pipeline.db_lock_service import (
DatabaseRowLockBusy,
execute_with_lock_timeout,
)
from app.services.credits import deduct_credits, calc_text_credits
from app.services.credits import deduct_credits, add_credits, calc_text_credits
from app.services.llm import optimize_prompt
from app.services.video_url import generate_temp_url, validate_and_get_record_id, get_video_stream_url
from app.services.resource_accounting_service import (
@@ -271,9 +271,17 @@ async def optimize(
db: AsyncSession = Depends(get_db),
):
record = None
# 积分不足直接返回
if (current_user.credits or 0) < 5:
raise HTTPException(status_code=402, detail="积分不足,请充值")
# 预扣积分(SELECT FOR UPDATE 锁行 + 检查 + 扣费,防止并发超卖)
hold_credits = 5
_hold_cfg = await db.execute(select(SystemConfig).where(SystemConfig.key == "optimize_hold_credits").limit(1))
_hold_row = _hold_cfg.scalar_one_or_none()
if _hold_row and _hold_row.value:
try:
hold_credits = int(_hold_row.value)
except (ValueError, TypeError):
hold_credits = 5
await deduct_credits(db, current_user.id, hold_credits, "AI创作预扣积分", biz_key=f"optimize_hold:{req.idempotency_key or 'nokey'}")
await db.commit()
# Validate parameters based on generation type
if req.gen_type == GenerationType.video:
if req.duration not in DURATIONS:
@@ -377,6 +385,13 @@ async def optimize(
db, token_usage["input_tokens"], token_usage["output_tokens"],
)
# 积分结算:预扣金额按实际消耗多退少补
if text_credits < hold_credits:
await add_credits(db, current_user.id, round(hold_credits - text_credits, 2), f"提示词优化积分退还- {project.name}", biz_key=f"optimize_refund:{req.idempotency_key or 'nokey'}")
elif text_credits > hold_credits:
await deduct_credits(db, current_user.id, round(text_credits - hold_credits, 2), f"提示词优化补扣积分 - {project.name}", biz_key=f"optimize_topup:{req.idempotency_key or 'nokey'}")
await db.commit()
failed_record_id = record.id
failed_user_id = current_user.id
try: