evaluation.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from __future__ import annotations
  2. from fastapi import APIRouter, Depends, Query
  3. from sqlalchemy.orm import Session
  4. from app.core.errors import APIError
  5. from app.db.repositories import evaluation as evaluation_repo
  6. from app.db.repositories.base import create_model
  7. from app.db.session import get_db
  8. from app.schemas.evaluation import (
  9. EvaluationIndicatorCreate,
  10. EvaluationIndicatorRead,
  11. EvaluationRunDetail,
  12. EvaluationRunRead,
  13. EvaluationRunRequest,
  14. EvaluationScoreRead,
  15. )
  16. from app.services.evaluation_service import run_evaluation
  17. router = APIRouter(prefix="/evaluations", tags=["综合评价"])
  18. @router.get(
  19. "/indicators",
  20. response_model=list[EvaluationIndicatorRead],
  21. summary="评价指标列表",
  22. )
  23. def indicators(
  24. mine_id: str | None = Query(None),
  25. db: Session = Depends(get_db),
  26. ):
  27. return evaluation_repo.list_indicators(db, mine_id=mine_id)
  28. @router.post(
  29. "/indicators",
  30. response_model=EvaluationIndicatorRead,
  31. status_code=201,
  32. summary="新增评价指标",
  33. )
  34. def create_indicator(
  35. payload: EvaluationIndicatorCreate,
  36. db: Session = Depends(get_db),
  37. ):
  38. return create_model(
  39. db,
  40. evaluation_repo.EvaluationIndicator,
  41. payload.model_dump(),
  42. )
  43. @router.get("/runs", response_model=list[EvaluationRunRead], summary="评价批次列表")
  44. def runs(
  45. mine_id: str = Query(...),
  46. limit: int = Query(50, ge=1, le=500),
  47. db: Session = Depends(get_db),
  48. ):
  49. return evaluation_repo.list_runs(db, mine_id, limit=limit)
  50. @router.get(
  51. "/runs/{run_id}",
  52. response_model=EvaluationRunDetail,
  53. summary="评价批次详情",
  54. )
  55. def run_detail(run_id: str, db: Session = Depends(get_db)):
  56. run = evaluation_repo.get_run(db, run_id)
  57. if run is None:
  58. raise APIError(404, "evaluation_run_not_found", "评价批次不存在")
  59. scores = evaluation_repo.list_scores(db, run_id)
  60. return EvaluationRunDetail(
  61. **EvaluationRunRead.model_validate(run).model_dump(),
  62. scores=[EvaluationScoreRead.model_validate(item) for item in scores],
  63. )
  64. @router.post(
  65. "/run",
  66. response_model=EvaluationRunRead,
  67. status_code=201,
  68. summary="执行综合评价",
  69. )
  70. def run(payload: EvaluationRunRequest, db: Session = Depends(get_db)):
  71. return run_evaluation(db, payload)