from fastapi import APIRouter, Query from app.core.config import settings from app.scheduler.manager import scheduler from app.services.demand_pool_service import ( query_demand_pool_records, query_strategy_options, ) router = APIRouter() @router.get("/health") async def health_check() -> dict[str, str]: return {"status": "ok", "service": settings.app_name, "env": settings.app_env} @router.get("/scheduler/status") async def scheduler_status() -> dict[str, object]: jobs = scheduler.get_jobs() return { "running": scheduler.running, "job_count": len(jobs), "jobs": [job.id for job in jobs], } @router.get("/demand-pool") async def query_demand_pool( strategy: list[str] | None = Query(default=None, description="策略,支持多选"), start_dt: str | None = Query(default=None, description="开始日期: yyyymmdd 或 yyyy-mm-dd"), end_dt: str | None = Query(default=None, description="结束日期: yyyymmdd 或 yyyy-mm-dd"), min_weight: float | None = Query(default=None, description="最小权重"), max_weight: float | None = Query(default=None, description="最大权重"), sort_by: str | None = Query(default="weight", description="排序字段"), sort_order: str | None = Query(default="desc", description="排序方向: asc 或 desc"), page: int = Query(default=1, ge=1, description="页码,从 1 开始"), page_size: int = Query(default=20, ge=1, le=200, description="每页条数"), ) -> dict[str, object]: return query_demand_pool_records( strategies=strategy, start_dt=start_dt, end_dt=end_dt, min_weight=min_weight, max_weight=max_weight, sort_by=sort_by, sort_order=sort_order, page=page, page_size=page_size, ) @router.get("/demand-pool/strategies") async def get_demand_pool_strategies( start_dt: str | None = Query(default=None, description="开始日期: yyyymmdd 或 yyyy-mm-dd"), end_dt: str | None = Query(default=None, description="结束日期: yyyymmdd 或 yyyy-mm-dd"), min_weight: float | None = Query(default=None, description="最小权重"), max_weight: float | None = Query(default=None, description="最大权重"), ) -> dict[str, object]: return query_strategy_options( start_dt=start_dt, end_dt=end_dt, min_weight=min_weight, max_weight=max_weight, )