""" 平台统计和日志路由 提供调用统计和费用明细的API端点 需求: 11.1, 12.1 """ from datetime import date from typing import Optional from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.database import get_db from app.dependencies.auth import get_current_user from app.models.user import User from app.services.api_call_log_service import ApiCallLogService from app.schemas.platform_stats import StatsResponse, CallLogResponse from app.schemas.model_schema import ApiResponse, PaginatedResponse router = APIRouter(prefix="/api/platform", tags=["平台统计"]) @router.get("/stats", response_model=ApiResponse[StatsResponse]) def get_stats( trend_days: int = Query(default=7, ge=1, le=30, description="趋势数据天数"), key_type: Optional[str] = Query(None, description="密钥类型: public 或 local"), current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): """ 获取调用统计 需求 11.1: 显示今日调用次数、本月调用次数、总调用次数 需求 11.2: 显示今日消费金额、本月消费金额 需求 11.3: 显示调用趋势图 需求 11.4: 显示各模型调用占比饼图 """ service = ApiCallLogService(db) stats = service.get_user_stats(current_user.id, trend_days, key_type) return ApiResponse(code=200, message="success", data=stats) @router.get("/call-logs", response_model=ApiResponse[PaginatedResponse[CallLogResponse]]) def get_call_logs( start_date: Optional[date] = Query(None, description="开始日期"), end_date: Optional[date] = Query(None, description="结束日期"), model_id: Optional[int] = Query(None, description="模型ID"), api_key_id: Optional[int] = Query(None, description="API Key ID"), key_type: Optional[str] = Query(None, description="密钥类型: public 或 local"), page: int = Query(default=1, ge=1, description="页码"), page_size: int = Query(default=20, ge=1, le=100, description="每页数量"), current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): """ 获取调用日志 需求 12.1: 支持按时间范围、模型、API Key进行筛选 需求 12.2: 显示调用时间、模型名称、Token用量、费用金额、使用的API Key 需求 12.4: 支持分页查询 """ service = ApiCallLogService(db) logs, total = service.get_call_logs( user_id=current_user.id, start_date=start_date, end_date=end_date, model_id=model_id, api_key_id=api_key_id, key_type=key_type, page=page, page_size=page_size ) return ApiResponse( code=200, message="success", data=PaginatedResponse( items=logs, total=total, page=page, page_size=page_size, total_pages=(total + page_size - 1) // page_size ) )