diagnosis.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. from __future__ import annotations
  2. from sqlalchemy import func, select
  3. from sqlalchemy.orm import Session
  4. from app.db.models.diagnosis import (
  5. DiagnosisEvidence,
  6. DiagnosisResult,
  7. DiagnosisRule,
  8. DiagnosisTask,
  9. )
  10. from app.db.repositories.base import create_model, update_model
  11. def list_rules(
  12. db: Session,
  13. *,
  14. mine_id: str | None = None,
  15. scene: str | None = None,
  16. ) -> list[DiagnosisRule]:
  17. statement = select(DiagnosisRule).where(DiagnosisRule.enabled.is_(True))
  18. if mine_id:
  19. statement = statement.where(
  20. (DiagnosisRule.mine_id == mine_id) | (DiagnosisRule.mine_id.is_(None))
  21. )
  22. if scene and scene != "all":
  23. statement = statement.where(DiagnosisRule.scene == scene)
  24. return list(db.scalars(statement.order_by(DiagnosisRule.scene, DiagnosisRule.code)).all())
  25. def get_rule(db: Session, rule_id: str) -> DiagnosisRule | None:
  26. return db.get(DiagnosisRule, rule_id)
  27. def list_tasks(
  28. db: Session,
  29. mine_id: str,
  30. *,
  31. scene: str | None = None,
  32. status: str | None = None,
  33. limit: int = 100,
  34. ) -> list[DiagnosisTask]:
  35. statement = select(DiagnosisTask).where(DiagnosisTask.mine_id == mine_id)
  36. if scene and scene != "all":
  37. statement = statement.where(DiagnosisTask.scene == scene)
  38. if status:
  39. statement = statement.where(DiagnosisTask.status == status)
  40. return list(
  41. db.scalars(
  42. statement.order_by(DiagnosisTask.created_at.desc()).limit(limit)
  43. ).all()
  44. )
  45. def get_task(db: Session, task_id: str) -> DiagnosisTask | None:
  46. return db.get(DiagnosisTask, task_id)
  47. def list_results(db: Session, task_id: str) -> list[DiagnosisResult]:
  48. return list(
  49. db.scalars(
  50. select(DiagnosisResult)
  51. .where(DiagnosisResult.task_id == task_id)
  52. .order_by(DiagnosisResult.confidence.desc())
  53. ).all()
  54. )
  55. def list_evidence_for_results(
  56. db: Session,
  57. result_ids: list[str],
  58. ) -> list[DiagnosisEvidence]:
  59. if not result_ids:
  60. return []
  61. return list(
  62. db.scalars(
  63. select(DiagnosisEvidence)
  64. .where(DiagnosisEvidence.result_id.in_(result_ids))
  65. .order_by(DiagnosisEvidence.created_at)
  66. ).all()
  67. )
  68. def result_summary(db: Session, mine_id: str) -> dict:
  69. task_ids = select(DiagnosisTask.id).where(DiagnosisTask.mine_id == mine_id)
  70. rows = db.execute(
  71. select(DiagnosisResult.severity, func.count(DiagnosisResult.id))
  72. .where(DiagnosisResult.task_id.in_(task_ids))
  73. .group_by(DiagnosisResult.severity)
  74. ).all()
  75. counts = {"high": 0, "medium": 0, "low": 0}
  76. for severity, count in rows:
  77. counts[str(severity)] = int(count)
  78. return counts
  79. def create_task(db: Session, data: dict) -> DiagnosisTask:
  80. return create_model(db, DiagnosisTask, data)
  81. def update_task(db: Session, task: DiagnosisTask, data: dict) -> DiagnosisTask:
  82. return update_model(db, task, data)
  83. def create_result(db: Session, data: dict) -> DiagnosisResult:
  84. return create_model(db, DiagnosisResult, data)
  85. def create_evidence(db: Session, data: dict) -> DiagnosisEvidence:
  86. return create_model(db, DiagnosisEvidence, data)