from pydantic import BaseModel from typing import Optional from datetime import datetime class ConsumptionRecord(BaseModel): """单条消费记录流水""" user_id: str username: str tenant_name: Optional[str] = None order_no: str model_name: str model_code: str amount: str created_at: str invoiced: bool user_discount: str user_actual_price: str tenant_discount: str tenant_actual_price: str super_admin_discount: str super_admin_actual_price: str class UserConsumption(BaseModel): """用户消费数据""" user_id: str username: str nickname: Optional[str] = None total_consumption: str tenant_actual_total: str tenant_name: Optional[str] = None consumption_records: list[ConsumptionRecord] class TenantData(BaseModel): """租户消费数据""" tenant_id: int company_name: Optional[str] = None subdomain: str total_consumption: str total_tenant_charged: str balance: str user_count: int users: list[UserConsumption] class SuperAdminData(BaseModel): """超级管理员消费数据""" super_admin_id: int username: str nickname: Optional[str] = None remark: Optional[str] = None tenant_count: int total_consumption: str total_tenant_charged: str tenants: list[TenantData] class Overview(BaseModel): """平台汇总数据""" total_super_admins: int total_tenants: int total_users: int total_consumption: str total_tenant_charged: str total_balance: str class ConsumptionDetailRecord(BaseModel): """单条消费明细记录(不聚合)""" user_id: str user_name: str tenant_name: str order_no: str model_code: str consumption_date: str # 消费时间 tenant_consumed: str # 企业实际支付金额 user_discount: str # 用户折扣率 user_consumed: str # 用户实际支付金额 tenant_discount: str # 企业折扣率 tenant_actual_price: str # 企业实际被收取金额 super_admin_discount: str # 超管折扣率 super_admin_actual_price: str # 平台向超管收取金额 class DailyTenantStat(BaseModel): """租户按日消费统计""" tenant_name: str date: str consumption: str charged: str class DailySAStat(BaseModel): """超级管理员按日消费统计""" sa_name: str date: str consumption: str charged: str tenants: list[DailyTenantStat] class DailyStatsResponse(BaseModel): """按日消费统计响应""" sa_stats: list[DailySAStat] class ConsumptionDetailResponse(BaseModel): """消费明细列表响应""" total: int records: list[ConsumptionDetailRecord] class DashboardResponse(BaseModel): """监控大屏响应""" overview: Overview super_admins: list[SuperAdminData] start_date: Optional[str] = None end_date: Optional[str] = None