大量优化修改扣积分规则

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
+27 -3
View File
@@ -4,6 +4,7 @@ from rest_framework import serializers
from apps.accounts.models import Team, TeamMember, User
from apps.ai.model_routing import model_metadata_errors, provider_metadata_errors
from apps.billing.points_rules import normalize_points_pricing_for_save, points_pricing_errors
from apps.ai.models import AIModelAttempt, AITask, ModelConfig, ModelProvider, PromptTemplate, QualityWord
from apps.assets.models import Asset
from apps.billing.models import CreditLedger, QuotaPolicy
@@ -247,12 +248,35 @@ class AdminModelConfigSerializer(serializers.ModelSerializer):
def validate(self, attrs):
attrs = super().validate(attrs)
if self.instance is None or "metadata" in attrs or "capability" in attrs:
if self.instance is None or "metadata" in attrs or "capability" in attrs or "unit_price" in attrs:
capability = attrs.get("capability", getattr(self.instance, "capability", ""))
metadata = attrs.get("metadata", getattr(self.instance, "metadata", {}))
errors = model_metadata_errors(capability, metadata)
if not isinstance(metadata, dict):
metadata = {}
metadata = normalize_points_pricing_for_save(capability, metadata)
# 图片/文本:表单 unit_price 与挂牌积分同步
if "unit_price" in attrs and capability in {"image", "text", "vision"}:
from decimal import Decimal
try:
pts = int(Decimal(str(attrs.get("unit_price") or 0)))
except Exception:
pts = 0
pricing = dict(metadata.get("points_pricing") or {})
if capability == "image":
pricing.update({"mode": "per_image", "points_per_image": max(pts, 0)})
else:
pricing.update({"mode": "per_call", "points_per_call": max(pts, 0)})
metadata["points_pricing"] = pricing
attrs["metadata"] = metadata
# 视频有挂牌秒价时,把展示用 unit_price 写成最低档秒积分,列表更好读
if capability == "video":
tiers = (metadata.get("points_pricing") or {}).get("tiers") or []
secs = [t.get("points_per_second") for t in tiers if isinstance(t, dict) and t.get("points_per_second") is not None]
if secs:
attrs["unit_price"] = min(int(x) for x in secs)
errors = list(model_metadata_errors(capability, metadata)) + list(points_pricing_errors(capability, metadata))
if errors:
raise serializers.ValidationError({"metadata": list(errors)})
raise serializers.ValidationError({"metadata": errors})
return attrs