大量优化修改扣积分规则

This commit is contained in:
Azmat@qq.com
2026-09-04 17:20:22 +08:00
parent 3e904479d9
commit 15718a60bf
41 changed files with 1590 additions and 429 deletions
+12 -18
View File
@@ -25,7 +25,7 @@ from django.utils import timezone
from apps.assets.models import Asset, AssetFile, FreeAsset, FreeAssetGroup
from apps.assets.storage import TosStorage
from apps.billing.pricing import quote_video_actual, quote_video_estimate, video_reserve_amount
from apps.billing.pricing import settle_video_from_payload, quote_video_estimate, video_quote_payload, video_reserve_amount
from apps.billing.services.ledger import charge_reserved_credit, release_credit, reserve_credit
from .models import AITask, ModelConfig
@@ -530,7 +530,7 @@ def submit_free_video(*, team, user, params: dict) -> AITask:
references=built["snapshots"],
team=team,
)
reserve_amount = video_reserve_amount(quote.points)
reserve_amount = video_reserve_amount(quote.points, rule=quote.meta.get("rule"))
request_payload = {
"feature": feature,
@@ -546,9 +546,8 @@ def submit_free_video(*, team, user, params: dict) -> AITask:
"generate_audio": generate_audio,
"search_mode": search_mode,
"estimated_tokens": tokens,
# 团队价格系数快照:按实结算用它,中途改价不影响在途任务
"price_multiplier": quote.meta.get("price_multiplier", "1"),
"points_per_yuan_snapshot": quote.meta.get("rate", ""),
# 计价快照:挂牌秒价/团队系数下单时钉死,结算只认这些
**video_quote_payload(quote),
"references": built["snapshots"],
"model_routing_v1": True,
}
@@ -646,7 +645,7 @@ def start_pending_free_video(task: AITask) -> AITask:
references=built["snapshots"],
team=task.team,
)
reserve_amount = video_reserve_amount(quote.points)
reserve_amount = video_reserve_amount(quote.points, rule=quote.meta.get("rule"))
with transaction.atomic():
locked = (
@@ -671,6 +670,7 @@ def start_pending_free_video(task: AITask) -> AITask:
next_payload["references"] = built["snapshots"]
next_payload["estimated_tokens"] = tokens
next_payload["review_pending"] = False
next_payload.update(video_quote_payload(quote))
locked.request_payload = next_payload
locked.estimated_cost = quote.points
locked.status = AITask.Status.RESERVED
@@ -991,21 +991,15 @@ def finalize_free_video(*, task: AITask) -> AITask:
total_tokens = int(usage.get("total_tokens") or 0)
except (TypeError, ValueError):
total_tokens = 0
with_video_ref = any((r or {}).get("type") == "video" for r in payload.get("references") or [])
resolution = payload.get("resolution") or "720p"
if total_tokens > 0:
from decimal import Decimal
settle = quote_video_actual(
actual_model, tokens=total_tokens, with_video_ref=with_video_ref, resolution=resolution,
multiplier=Decimal(str(payload.get("price_multiplier") or "1")),
)
settle = settle_video_from_payload(actual_model, payload=payload, tokens=total_tokens)
if settle.meta.get("rule") == "missing_usage":
actual, base_cost = locked.estimated_cost, locked.base_cost
else:
actual, base_cost = settle.points, settle.base_cost_yuan
payload["actual_tokens"] = total_tokens
if total_tokens > 0:
payload["actual_tokens"] = total_tokens
if settle.meta.get("rate"):
payload["points_per_yuan_snapshot"] = settle.meta["rate"]
else:
actual, base_cost = locked.estimated_cost, locked.base_cost
seed_out = response.get("seed")
if seed_out is not None:
payload["seed_used"] = seed_out