Merge branch 'main' of https://gitee.com/wg123/video-gen
This commit is contained in:
@@ -33,6 +33,9 @@ from app.schemas.admin import (
|
||||
SystemConfigOut,
|
||||
AdminUserOut,
|
||||
AdminStatsOut,
|
||||
DailyCreditOut,
|
||||
TeamCreditOut,
|
||||
ModelUsageOut,
|
||||
CreateUserRequest,
|
||||
UpdateMenusRequest,
|
||||
ResetPasswordRequest,
|
||||
@@ -1850,6 +1853,103 @@ async def get_stats(
|
||||
)
|
||||
)).scalar() or 0
|
||||
|
||||
# ── 每日各模块积分消耗(始终返回选中日期往前7天,便于图表展示)
|
||||
from sqlalchemy import Date, cast as sa_cast
|
||||
_day_expr = sa_cast(CreditRecord.created_at, Date)
|
||||
# 图表固定展示 [date_end - 6天, date_end] 共7天
|
||||
_chart_end_dt = date_end
|
||||
_chart_start_dt = _chart_end_dt - timedelta(days=6)
|
||||
_inner = (
|
||||
select(
|
||||
_day_expr.label('date'),
|
||||
CreditRecord.source_module.label('module'),
|
||||
func.coalesce(func.sum(func.abs(CreditRecord.amount)), 0).label('credits'),
|
||||
)
|
||||
.where(
|
||||
CreditRecord.type == "consume",
|
||||
CreditRecord.created_at >= _chart_start_dt,
|
||||
CreditRecord.created_at <= _chart_end_dt,
|
||||
)
|
||||
.group_by(_day_expr, CreditRecord.source_module)
|
||||
.subquery()
|
||||
)
|
||||
daily_credits_rows = (await db.execute(
|
||||
select(
|
||||
_inner.c.date,
|
||||
func.coalesce(_inner.c.module, 'other').label('module'),
|
||||
_inner.c.credits,
|
||||
).order_by(_inner.c.date)
|
||||
)).all()
|
||||
daily_credits_by_module = [
|
||||
DailyCreditOut(date=str(row.date), module=row.module, credits=float(row.credits or 0))
|
||||
for row in daily_credits_rows
|
||||
]
|
||||
|
||||
# ── 选中周期内各模块积分占比(按 source_module 分组,不拆日期)
|
||||
_period_inner = (
|
||||
select(
|
||||
CreditRecord.source_module.label('module'),
|
||||
func.coalesce(func.sum(func.abs(CreditRecord.amount)), 0).label('credits'),
|
||||
)
|
||||
.where(
|
||||
CreditRecord.type == "consume",
|
||||
CreditRecord.created_at >= date_start,
|
||||
CreditRecord.created_at <= date_end,
|
||||
)
|
||||
.group_by(CreditRecord.source_module)
|
||||
.subquery()
|
||||
)
|
||||
period_credits_rows = (await db.execute(
|
||||
select(
|
||||
func.coalesce(_period_inner.c.module, 'other').label('module'),
|
||||
_period_inner.c.credits,
|
||||
).order_by(_period_inner.c.credits.desc())
|
||||
)).all()
|
||||
period_credits_by_module = [
|
||||
DailyCreditOut(date='', module=row.module, credits=float(row.credits or 0))
|
||||
for row in period_credits_rows
|
||||
]
|
||||
|
||||
# ── 各团队积分消耗(有团队 vs 无团队,使用流水中的团队快照)
|
||||
team_credit_rows = (await db.execute(
|
||||
select(
|
||||
func.coalesce(CreditRecord.team_name_snapshot, '未分配团队').label('team_name'),
|
||||
CreditRecord.team_id_snapshot.label('team_id'),
|
||||
func.coalesce(func.sum(func.abs(CreditRecord.amount)), 0).label('credits'),
|
||||
)
|
||||
.where(
|
||||
CreditRecord.type == "consume",
|
||||
CreditRecord.created_at >= date_start,
|
||||
CreditRecord.created_at <= date_end,
|
||||
)
|
||||
.group_by(CreditRecord.team_id_snapshot, CreditRecord.team_name_snapshot)
|
||||
.order_by(func.coalesce(func.sum(func.abs(CreditRecord.amount)), 0).desc())
|
||||
)).all()
|
||||
credits_by_team = [
|
||||
TeamCreditOut(team_name=row.team_name, team_id=row.team_id, credits=float(row.credits or 0))
|
||||
for row in team_credit_rows
|
||||
]
|
||||
|
||||
# ── 各模型使用次数(通过 engine 快照字段统计)
|
||||
model_usage_rows = (await db.execute(
|
||||
select(
|
||||
func.coalesce(CreditRecord.engine_name, '未知').label('model_name'),
|
||||
func.coalesce(CreditRecord.engine_provider, 'unknown').label('provider'),
|
||||
func.count(CreditRecord.id).label('count'),
|
||||
)
|
||||
.where(
|
||||
CreditRecord.type == "consume",
|
||||
CreditRecord.created_at >= date_start,
|
||||
CreditRecord.created_at <= date_end,
|
||||
)
|
||||
.group_by(CreditRecord.engine_name, CreditRecord.engine_provider)
|
||||
.order_by(func.count(CreditRecord.id).desc())
|
||||
)).all()
|
||||
model_usage = [
|
||||
ModelUsageOut(model_name=row.model_name, provider=row.provider, count=int(row.count or 0))
|
||||
for row in model_usage_rows
|
||||
]
|
||||
|
||||
return AdminStatsOut(
|
||||
total_users=total_users,
|
||||
total_projects=total_projects,
|
||||
@@ -1865,6 +1965,10 @@ async def get_stats(
|
||||
last_period_records=last_period_records,
|
||||
last_period_revenue=float(last_period_revenue),
|
||||
last_period_credits_consumed=float(last_period_credits_consumed),
|
||||
daily_credits_by_module=daily_credits_by_module,
|
||||
period_credits_by_module=period_credits_by_module,
|
||||
credits_by_team=credits_by_team,
|
||||
model_usage=model_usage,
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user