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