from __future__ import annotations from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.core.errors import APIError from app.db.repositories import evaluation as evaluation_repo from app.db.repositories.base import create_model from app.db.session import get_db from app.schemas.evaluation import ( EvaluationIndicatorCreate, EvaluationIndicatorRead, EvaluationRunDetail, EvaluationRunRead, EvaluationRunRequest, EvaluationScoreRead, ) from app.services.evaluation_service import run_evaluation router = APIRouter(prefix="/evaluations", tags=["综合评价"]) @router.get( "/indicators", response_model=list[EvaluationIndicatorRead], summary="评价指标列表", ) def indicators( mine_id: str | None = Query(None), db: Session = Depends(get_db), ): return evaluation_repo.list_indicators(db, mine_id=mine_id) @router.post( "/indicators", response_model=EvaluationIndicatorRead, status_code=201, summary="新增评价指标", ) def create_indicator( payload: EvaluationIndicatorCreate, db: Session = Depends(get_db), ): return create_model( db, evaluation_repo.EvaluationIndicator, payload.model_dump(), ) @router.get("/runs", response_model=list[EvaluationRunRead], summary="评价批次列表") def runs( mine_id: str = Query(...), limit: int = Query(50, ge=1, le=500), db: Session = Depends(get_db), ): return evaluation_repo.list_runs(db, mine_id, limit=limit) @router.get( "/runs/{run_id}", response_model=EvaluationRunDetail, summary="评价批次详情", ) def run_detail(run_id: str, db: Session = Depends(get_db)): run = evaluation_repo.get_run(db, run_id) if run is None: raise APIError(404, "evaluation_run_not_found", "评价批次不存在") scores = evaluation_repo.list_scores(db, run_id) return EvaluationRunDetail( **EvaluationRunRead.model_validate(run).model_dump(), scores=[EvaluationScoreRead.model_validate(item) for item in scores], ) @router.post( "/run", response_model=EvaluationRunRead, status_code=201, summary="执行综合评价", ) def run(payload: EvaluationRunRequest, db: Session = Depends(get_db)): return run_evaluation(db, payload)