后端生成闸+多项修复;前端全站更新;QA 审计与报告
后端: - 新增 celery_health 生成前置闸——无 worker 在线时图片/视频生成入口 一律 503,防"提交到 ARK 后无人轮询、结果悬空+额度冻结"的数据丢失 - 拼接导出:帧率跟随源众数、字幕逐句重映射、原声/BGM 混音修复 - 资金核算审计脚本 + genesis 账目回填 + 滞留预留清理命令 - 接入 yunqi provider 与豆包 TTS 模型(catalog/migrations/bootstrap 命令) 前端:全站页面更新(pipeline/library/products/projects/team/account 等), 新增共享 pager 分页组件 QA:刷新 function-audit 全量输出,新增 full-qa 报告 文档:BP 产品介绍资料、design/CLAUDE.md Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from apps.billing.models import CreditAccount
|
||||
from apps.billing.models import CreditAccount, CreditLedger
|
||||
|
||||
from .models import LoginSession, Team, TeamMember, User, UserPreference
|
||||
|
||||
@@ -82,10 +82,19 @@ class RegisterSerializer(serializers.Serializer):
|
||||
owner=user,
|
||||
)
|
||||
TeamMember.objects.create(team=team, user=user, role=TeamMember.Role.OWNER)
|
||||
CreditAccount.objects.create(
|
||||
team=team,
|
||||
balance=Decimal(str(settings.DEFAULT_TRIAL_CREDITS)),
|
||||
)
|
||||
trial = Decimal(str(settings.DEFAULT_TRIAL_CREDITS))
|
||||
CreditAccount.objects.create(team=team, balance=trial)
|
||||
# 开户赠送额度必须进流水,否则这笔钱在账单里查无凭证、无法对账(余额从第一条起就可追溯)
|
||||
if trial > 0:
|
||||
CreditLedger.objects.create(
|
||||
team=team,
|
||||
user=user,
|
||||
ledger_type=CreditLedger.Type.RECHARGE,
|
||||
amount=trial,
|
||||
balance_after=trial,
|
||||
reason="新用户试用额度赠送",
|
||||
metadata={"kind": "trial_grant"},
|
||||
)
|
||||
return {"user": user, "team": team}
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
from decimal import Decimal
|
||||
|
||||
from django.conf import settings
|
||||
from django.test import TestCase
|
||||
from rest_framework.test import APIClient
|
||||
|
||||
from apps.accounts.models import Team, TeamMember, User
|
||||
from apps.billing.models import CreditAccount
|
||||
from apps.billing.models import CreditAccount, CreditLedger
|
||||
|
||||
|
||||
class AuthApiTests(TestCase):
|
||||
@@ -27,3 +30,20 @@ class AuthApiTests(TestCase):
|
||||
self.assertTrue(TeamMember.objects.filter(team=team, user=user, role=TeamMember.Role.OWNER).exists())
|
||||
self.assertTrue(CreditAccount.objects.filter(team=team).exists())
|
||||
|
||||
def test_register_trial_grant_is_recorded_in_ledger(self):
|
||||
"""开户赠送额度必须进流水:余额=赠送额,且有一条 balance_after=赠送额的 genesis 流水,账目从第一条起可对账。"""
|
||||
client = APIClient()
|
||||
client.post(
|
||||
"/api/auth/register/",
|
||||
{"username": "ledger-owner", "password": "strong-password", "team_name": "Ledger Team"},
|
||||
format="json",
|
||||
)
|
||||
team = Team.objects.get(name="Ledger Team")
|
||||
trial = Decimal(str(settings.DEFAULT_TRIAL_CREDITS))
|
||||
account = CreditAccount.objects.get(team=team)
|
||||
self.assertEqual(account.balance, trial)
|
||||
genesis = CreditLedger.objects.filter(team=team, ledger_type=CreditLedger.Type.RECHARGE)
|
||||
self.assertEqual(genesis.count(), 1)
|
||||
self.assertEqual(genesis.first().amount, trial)
|
||||
self.assertEqual(genesis.first().balance_after, trial) # 流水终点 == 账户余额,可对账
|
||||
|
||||
|
||||
Reference in New Issue
Block a user