diagnosis.py 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from sqlalchemy import Boolean, DateTime, Float, ForeignKey, Integer, JSON, String, Text
  4. from sqlalchemy.orm import Mapped, mapped_column
  5. from app.db.base import Base, TimestampMixin, UUIDPrimaryKeyMixin
  6. class DiagnosisRule(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  7. __tablename__ = "diagnosis_rules"
  8. mine_id: Mapped[str | None] = mapped_column(
  9. String(32), ForeignKey("mines.id", ondelete="CASCADE"), nullable=True, index=True
  10. )
  11. code: Mapped[str] = mapped_column(String(64), unique=True, index=True)
  12. name: Mapped[str] = mapped_column(String(128))
  13. scene: Mapped[str] = mapped_column(String(32), index=True)
  14. defect_type: Mapped[str] = mapped_column(String(64), index=True)
  15. severity: Mapped[str] = mapped_column(String(16), default="medium")
  16. condition: Mapped[dict] = mapped_column(JSON, default=dict)
  17. threshold: Mapped[dict] = mapped_column(JSON, default=dict)
  18. output_template: Mapped[str] = mapped_column(Text, default="")
  19. recommendation: Mapped[str] = mapped_column(Text, default="")
  20. knowledge_refs: Mapped[list] = mapped_column(JSON, default=list)
  21. enabled: Mapped[bool] = mapped_column(Boolean, default=True)
  22. version: Mapped[str] = mapped_column(String(32), default="V1.0")
  23. class DiagnosisTask(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  24. __tablename__ = "diagnosis_tasks"
  25. mine_id: Mapped[str] = mapped_column(
  26. String(32), ForeignKey("mines.id", ondelete="CASCADE"), index=True
  27. )
  28. task_no: Mapped[str] = mapped_column(String(64), unique=True, index=True)
  29. scene: Mapped[str] = mapped_column(String(32), index=True)
  30. trigger_type: Mapped[str] = mapped_column(String(32), default="manual")
  31. status: Mapped[str] = mapped_column(String(32), default="pending", index=True)
  32. started_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  33. finished_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  34. requested_by: Mapped[str] = mapped_column(String(128), default="")
  35. model_name: Mapped[str] = mapped_column(String(128), default="")
  36. input_snapshot: Mapped[dict] = mapped_column(JSON, default=dict)
  37. error: Mapped[str] = mapped_column(Text, default="")
  38. class DiagnosisResult(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  39. __tablename__ = "diagnosis_results"
  40. task_id: Mapped[str] = mapped_column(
  41. String(32), ForeignKey("diagnosis_tasks.id", ondelete="CASCADE"), index=True
  42. )
  43. rule_id: Mapped[str | None] = mapped_column(
  44. String(32), ForeignKey("diagnosis_rules.id", ondelete="SET NULL"), nullable=True
  45. )
  46. defect_code: Mapped[str] = mapped_column(String(64), index=True)
  47. defect_name: Mapped[str] = mapped_column(String(255))
  48. scene: Mapped[str] = mapped_column(String(32), index=True)
  49. severity: Mapped[str] = mapped_column(String(16), index=True)
  50. confidence: Mapped[float] = mapped_column(Float, default=0)
  51. status: Mapped[str] = mapped_column(String(32), default="open", index=True)
  52. root_cause: Mapped[str] = mapped_column(Text, default="")
  53. conclusion: Mapped[str] = mapped_column(Text, default="")
  54. recommendation: Mapped[str] = mapped_column(Text, default="")
  55. related_objects: Mapped[list] = mapped_column(JSON, default=list)
  56. raw_output: Mapped[dict] = mapped_column(JSON, default=dict)
  57. class DiagnosisEvidence(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  58. __tablename__ = "diagnosis_evidence"
  59. result_id: Mapped[str] = mapped_column(
  60. String(32), ForeignKey("diagnosis_results.id", ondelete="CASCADE"), index=True
  61. )
  62. evidence_type: Mapped[str] = mapped_column(String(32), index=True)
  63. source_id: Mapped[str] = mapped_column(String(64), default="")
  64. source_name: Mapped[str] = mapped_column(String(255), default="")
  65. content: Mapped[str] = mapped_column(Text, default="")
  66. confidence: Mapped[float | None] = mapped_column(Float, nullable=True)
  67. occurred_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  68. metadata_json: Mapped[dict] = mapped_column("metadata", JSON, default=dict)