diagnosis.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from __future__ import annotations
  2. from fastapi import APIRouter, Depends, Query
  3. from sqlalchemy.orm import Session
  4. from app.db.repositories import diagnosis as diagnosis_repo
  5. from app.db.session import get_db
  6. from app.schemas.diagnosis import (
  7. DiagnosisEvidenceRead,
  8. DiagnosisResultRead,
  9. DiagnosisRuleRead,
  10. DiagnosisRunRequest,
  11. DiagnosisTaskDetail,
  12. DiagnosisTaskRead,
  13. )
  14. from app.services.diagnosis_service import run_diagnosis
  15. router = APIRouter(prefix="/diagnosis", tags=["缺陷诊断"])
  16. @router.get("/rules", response_model=list[DiagnosisRuleRead], summary="诊断规则库")
  17. def rules(
  18. mine_id: str | None = Query(None),
  19. scene: str | None = Query(None),
  20. db: Session = Depends(get_db),
  21. ):
  22. return diagnosis_repo.list_rules(db, mine_id=mine_id, scene=scene)
  23. @router.get("/tasks", response_model=list[DiagnosisTaskRead], summary="诊断任务列表")
  24. def tasks(
  25. mine_id: str = Query(...),
  26. scene: str | None = Query(None),
  27. status: str | None = Query(None),
  28. limit: int = Query(100, ge=1, le=500),
  29. db: Session = Depends(get_db),
  30. ):
  31. return diagnosis_repo.list_tasks(
  32. db,
  33. mine_id,
  34. scene=scene,
  35. status=status,
  36. limit=limit,
  37. )
  38. @router.get(
  39. "/tasks/{task_id}",
  40. response_model=DiagnosisTaskDetail,
  41. summary="诊断任务详情",
  42. )
  43. def task_detail(task_id: str, db: Session = Depends(get_db)):
  44. task = diagnosis_repo.get_task(db, task_id)
  45. if task is None:
  46. from app.core.errors import APIError
  47. raise APIError(404, "diagnosis_task_not_found", "诊断任务不存在")
  48. results = diagnosis_repo.list_results(db, task_id)
  49. evidence = diagnosis_repo.list_evidence_for_results(
  50. db, [result.id for result in results]
  51. )
  52. return DiagnosisTaskDetail(
  53. **DiagnosisTaskRead.model_validate(task).model_dump(),
  54. results=[DiagnosisResultRead.model_validate(item) for item in results],
  55. evidence=[DiagnosisEvidenceRead.model_validate(item) for item in evidence],
  56. )
  57. @router.post(
  58. "/run",
  59. response_model=DiagnosisTaskRead,
  60. status_code=201,
  61. summary="执行规则诊断",
  62. )
  63. def run(payload: DiagnosisRunRequest, db: Session = Depends(get_db)):
  64. return run_diagnosis(db, payload)