from typing import Any, Optional, List from datetime import datetime, timedelta, timezone from fastapi import APIRouter, Query, Depends, Body from sqlalchemy import select, func from sqlalchemy.ext.asyncio import AsyncSession from app.models.user import User from app.models.resources_material import ResourcesMaterial from app.models.material_cost import MaterialCost from app.models.user_oauth import UserOAuth from app.models.user_oauth_account import UserOAuthAccount from app.models.pre_test_template import PreTestTemplate from app.models.upload_task import UploadTask from app.dependencies import get_current_user, get_db, get_admin_user from app.services.material_consumption_queue import sync_all_advertisers_consumption, _fetch_and_save_consumption from app.services.material_consumption_service import get_consumption_list, format_consumption_response from app.services.material_admin_service import get_oauth_list, get_material_list, get_pre_test_template_list, get_upload_task_list router = APIRouter(prefix="/material-admin", tags=["material-admin"]) @router.get("/oauth-list", summary="管理员查看所有授权列表") async def admin_get_oauth_list( id: Optional[str] = Query(None, description="主键id"), phone: Optional[str] = Query(None, description="用户登录手机号"), account_id: Optional[str] = Query(None, description="授权账户id"), account_userid: Optional[str] = Query(None, description="授权登录账号id"), created_at: Optional[List[datetime]] = Query(None, description="授权时间"), appid: Optional[str] = Query(None, description="应用id"), open_type: Optional[int] = Query(None, description="开户方式"), page: int = Query(1, ge=1, description="页码"), page_size: int = Query(10, ge=1, le=3000, description="每页数量"), db: AsyncSession = Depends(get_db), admin_user: User = Depends(get_admin_user), ) -> Any | dict: try: oauth_list, total = await get_oauth_list( id=id, db=db, phone=phone, account_id=account_id, account_userid=account_userid, created_at=created_at, appid=appid, open_type=open_type, page=page, page_size=page_size, ) return { "code": 0, "data": oauth_list, "pagination": { "page": page, "page_size": page_size, "total": total, }, } except Exception as e: return { "code": 1, "msg": str(e), "data": None, } @router.get("/material-list", summary="管理员查看所有素材资源列表") async def admin_get_material_list( phone: Optional[str] = Query(None, description="用户登录手机号"), id: Optional[str] = Query(None, description="主键id"), resource_type: Optional[str] = Query(None, description="素材资源类型"), advertiser_id: Optional[str] = Query(None, description="广告主id"), material_id: Optional[str] = Query(None, description="素材id"), upload_id: Optional[str] = Query(None, description="平台id【视频id/图片id】"), created_at: Optional[List[datetime]] = Query(None, description="创建时间"), status: Optional[str] = Query(None, description="前测状态"), page: int = Query(1, ge=1, description="页码"), page_size: int = Query(10, ge=1, le=3000, description="每页数量"), db: AsyncSession = Depends(get_db), admin_user: User = Depends(get_admin_user), ) -> Any | dict: materials, total = await get_material_list( db=db, phone=phone, id=id, resource_type=resource_type, advertiser_id=advertiser_id, material_id=material_id, upload_id=upload_id, created_at=created_at, status=status, page=page, page_size=page_size, ) return { "code": 0, "data": materials, "pagination": { "page": page, "page_size": page_size, "total": total, }, } @router.get("/pre-test-template-list", summary="管理员查看所有前测模板列表") async def admin_get_pre_test_template_list( phone: Optional[str] = Query(None, description="用户登录手机号"), id: Optional[str] = Query(None, description="主键id"), created_at: Optional[datetime] = Query(None, description="创建时间"), page: int = Query(1, ge=1, description="页码"), page_size: int = Query(10, ge=1, le=3000, description="每页数量"), db: AsyncSession = Depends(get_db), admin_user: User = Depends(get_admin_user), ) -> Any | dict: templates, total = await get_pre_test_template_list( db=db, phone=phone, id=id, created_at=created_at, page=page, page_size=page_size, ) return { "code": 0, "data": templates, "pagination": { "page": page, "page_size": page_size, "total": total, }, } @router.get("/upload-task-list", summary="管理员查看推送任务列表") async def admin_get_upload_task_list( phone: Optional[str] = Query(None, description="用户登录手机号"), id: Optional[str] = Query(None, description="主键id"), created_at: Optional[List[str]] = Query(None, description="创建时间范围,示例: ['2023-01-01', '2023-03-01']"), advertiser_id: Optional[str] = Query(None, description="广告主id"), status: Optional[int] = Query(None, description="前测状态"), resource_id: Optional[str] = Query(None, description="资源id"), page: int = Query(1, ge=1, description="页码"), page_size: int = Query(10, ge=1, le=3000, description="每页数量"), db: AsyncSession = Depends(get_db), admin_user: User = Depends(get_admin_user), ) -> Any | dict: tasks, total = await get_upload_task_list( db=db, phone=phone, id=id, created_at=created_at, advertiser_id=advertiser_id, status=status, resource_id=resource_id, page=page, page_size=page_size, ) return { "code": 0, "data": tasks, "pagination": { "page": page, "page_size": page_size, "total": total, }, }