from __future__ import annotations from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.db.repositories import diagnosis as diagnosis_repo from app.db.session import get_db from app.schemas.diagnosis import ( DiagnosisEvidenceRead, DiagnosisResultRead, DiagnosisRuleRead, DiagnosisRunRequest, DiagnosisTaskDetail, DiagnosisTaskRead, ) from app.services.diagnosis_service import run_diagnosis router = APIRouter(prefix="/diagnosis", tags=["缺陷诊断"]) @router.get("/rules", response_model=list[DiagnosisRuleRead], summary="诊断规则库") def rules( mine_id: str | None = Query(None), scene: str | None = Query(None), db: Session = Depends(get_db), ): return diagnosis_repo.list_rules(db, mine_id=mine_id, scene=scene) @router.get("/tasks", response_model=list[DiagnosisTaskRead], summary="诊断任务列表") def tasks( mine_id: str = Query(...), scene: str | None = Query(None), status: str | None = Query(None), limit: int = Query(100, ge=1, le=500), db: Session = Depends(get_db), ): return diagnosis_repo.list_tasks( db, mine_id, scene=scene, status=status, limit=limit, ) @router.get( "/tasks/{task_id}", response_model=DiagnosisTaskDetail, summary="诊断任务详情", ) def task_detail(task_id: str, db: Session = Depends(get_db)): task = diagnosis_repo.get_task(db, task_id) if task is None: from app.core.errors import APIError raise APIError(404, "diagnosis_task_not_found", "诊断任务不存在") results = diagnosis_repo.list_results(db, task_id) evidence = diagnosis_repo.list_evidence_for_results( db, [result.id for result in results] ) return DiagnosisTaskDetail( **DiagnosisTaskRead.model_validate(task).model_dump(), results=[DiagnosisResultRead.model_validate(item) for item in results], evidence=[DiagnosisEvidenceRead.model_validate(item) for item in evidence], ) @router.post( "/run", response_model=DiagnosisTaskRead, status_code=201, summary="执行规则诊断", ) def run(payload: DiagnosisRunRequest, db: Session = Depends(get_db)): return run_diagnosis(db, payload)