| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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)
|