Files
yingqing/core/qa/backfill_genesis_ledger.py
T
zycandClaude Fable 5 216a711291 后端生成闸+多项修复;前端全站更新;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>
2026-06-15 10:06:15 +08:00

51 lines
2.3 KiB
Python

"""一次性回填:给历史账户补开户赠送的 genesis 流水(只补凭证,不改任何余额)。
对每个 account,若"首条流水之前的隐含余额">0 且尚无 trial_grant 流水,补一条 RECHARGE,
created_at 设为开户时间(早于所有流水),balance_after=该隐含开户额度。幂等可重跑。
跑法:cd backend && DJANGO_SETTINGS_MODULE=airshelf.settings.development .venv/bin/python ../qa/backfill_genesis_ledger.py
"""
import os, sys
from decimal import Decimal
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "backend"))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "airshelf.settings.development")
import django # noqa: E402
django.setup()
from django.db import transaction # noqa: E402
from apps.billing.models import CreditAccount, CreditLedger # noqa: E402
Z = Decimal("0")
fixed = 0
for acct in CreditAccount.objects.select_related("team").all():
led = CreditLedger.objects.filter(team=acct.team)
if led.filter(metadata__kind="trial_grant").exists():
continue # 已有 genesis
first = led.order_by("created_at", "id").first()
if first is None:
# 纯开户无任何流水:开户额度即 balance
opening = acct.balance
genesis_time = acct.created_at
else:
delta = first.amount if first.ledger_type in ("recharge", "refund", "adjustment") else (-first.amount if first.ledger_type == "charge" else Z)
opening = first.balance_after - delta
genesis_time = acct.created_at if acct.created_at < first.created_at else first.created_at
if opening <= Z:
continue
with transaction.atomic():
g = CreditLedger.objects.create(
team=acct.team,
user=acct.team.owner,
ledger_type=CreditLedger.Type.RECHARGE,
amount=opening,
balance_after=opening,
reason="新用户试用额度赠送(历史回填)",
metadata={"kind": "trial_grant", "backfilled": True},
)
# created 字段由 auto_now_add 控制,需手动回拨到开户时刻,保证它排在所有流水之前
CreditLedger.objects.filter(id=g.id).update(created_at=genesis_time)
fixed += 1
print(f" + {acct.team} 补 genesis ¥{opening} @ {genesis_time:%Y-%m-%d %H:%M}")
print(f"\n回填完成:{fixed} 个账户补齐 genesis 流水(余额未变动)")