monitoring.py 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 DataSource(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  7. __tablename__ = "data_sources"
  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. source_type: Mapped[str] = mapped_column(String(32), index=True)
  14. protocol: Mapped[str] = mapped_column(String(64), default="REST")
  15. endpoint: Mapped[str] = mapped_column(String(512), default="")
  16. status: Mapped[str] = mapped_column(String(32), default="offline", index=True)
  17. last_sync_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  18. point_count: Mapped[int] = mapped_column(Integer, default=0)
  19. latency_ms: Mapped[int | None] = mapped_column(Integer, nullable=True)
  20. config: Mapped[dict] = mapped_column(JSON, default=dict)
  21. class Sensor(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  22. __tablename__ = "sensors"
  23. mine_id: Mapped[str] = mapped_column(
  24. String(32), ForeignKey("mines.id", ondelete="CASCADE"), index=True
  25. )
  26. area_id: Mapped[str | None] = mapped_column(
  27. String(32), ForeignKey("mine_areas.id", ondelete="SET NULL"), nullable=True
  28. )
  29. data_source_id: Mapped[str | None] = mapped_column(
  30. String(32), ForeignKey("data_sources.id", ondelete="SET NULL"), nullable=True, index=True
  31. )
  32. code: Mapped[str] = mapped_column(String(64), index=True)
  33. name: Mapped[str] = mapped_column(String(128))
  34. sensor_type: Mapped[str] = mapped_column(String(32), index=True)
  35. unit: Mapped[str] = mapped_column(String(32), default="")
  36. location: Mapped[str] = mapped_column(String(255), default="")
  37. status: Mapped[str] = mapped_column(String(32), default="online", index=True)
  38. warning_threshold: Mapped[float | None] = mapped_column(Float, nullable=True)
  39. alarm_threshold: Mapped[float | None] = mapped_column(Float, nullable=True)
  40. upper_bound: Mapped[float | None] = mapped_column(Float, nullable=True)
  41. lower_bound: Mapped[float | None] = mapped_column(Float, nullable=True)
  42. last_value: Mapped[float | None] = mapped_column(Float, nullable=True)
  43. last_seen_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  44. properties: Mapped[dict] = mapped_column(JSON, default=dict)
  45. class SensorReading(UUIDPrimaryKeyMixin, Base):
  46. __tablename__ = "sensor_readings"
  47. sensor_id: Mapped[str] = mapped_column(
  48. String(32), ForeignKey("sensors.id", ondelete="CASCADE"), index=True
  49. )
  50. measured_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), index=True)
  51. value: Mapped[float] = mapped_column(Float)
  52. quality: Mapped[int] = mapped_column(Integer, default=100)
  53. is_alarm: Mapped[bool] = mapped_column(Boolean, default=False, index=True)
  54. source: Mapped[str] = mapped_column(String(64), default="")
  55. meta: Mapped[dict] = mapped_column(JSON, default=dict)
  56. class VentilationFacility(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  57. __tablename__ = "ventilation_facilities"
  58. mine_id: Mapped[str] = mapped_column(
  59. String(32), ForeignKey("mines.id", ondelete="CASCADE"), index=True
  60. )
  61. area_id: Mapped[str | None] = mapped_column(
  62. String(32), ForeignKey("mine_areas.id", ondelete="SET NULL"), nullable=True
  63. )
  64. roadway_id: Mapped[str | None] = mapped_column(
  65. String(32), ForeignKey("roadways.id", ondelete="SET NULL"), nullable=True
  66. )
  67. code: Mapped[str] = mapped_column(String(64), index=True)
  68. name: Mapped[str] = mapped_column(String(128))
  69. facility_type: Mapped[str] = mapped_column(String(32), index=True)
  70. location: Mapped[str] = mapped_column(String(255), default="")
  71. status: Mapped[str] = mapped_column(String(32), default="normal", index=True)
  72. open_state: Mapped[str] = mapped_column(String(32), default="")
  73. sensor_value: Mapped[float | None] = mapped_column(Float, nullable=True)
  74. video_confidence: Mapped[float | None] = mapped_column(Float, nullable=True)
  75. last_checked_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  76. properties: Mapped[dict] = mapped_column(JSON, default=dict)