from __future__ import annotations from datetime import datetime from sqlalchemy import DateTime, Float, ForeignKey, Integer, JSON, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.db.base import Base, TimestampMixin, UUIDPrimaryKeyMixin class Alarm(UUIDPrimaryKeyMixin, TimestampMixin, Base): __tablename__ = "alarms" mine_id: Mapped[str] = mapped_column( String(32), ForeignKey("mines.id", ondelete="CASCADE"), index=True ) sensor_id: Mapped[str | None] = mapped_column( String(32), ForeignKey("sensors.id", ondelete="SET NULL"), nullable=True ) alarm_no: Mapped[str] = mapped_column(String(64), unique=True, index=True) alarm_type: Mapped[str] = mapped_column(String(64), index=True) level: Mapped[str] = mapped_column(String(16), index=True) title: Mapped[str] = mapped_column(String(255)) content: Mapped[str] = mapped_column(Text, default="") value: Mapped[float | None] = mapped_column(Float, nullable=True) threshold: Mapped[float | None] = mapped_column(Float, nullable=True) status: Mapped[str] = mapped_column(String(32), default="open", index=True) occurred_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), index=True) acknowledged_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) closed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) metadata_json: Mapped[dict] = mapped_column("metadata", JSON, default=dict) class WorkOrder(UUIDPrimaryKeyMixin, TimestampMixin, Base): __tablename__ = "work_orders" mine_id: Mapped[str] = mapped_column( String(32), ForeignKey("mines.id", ondelete="CASCADE"), index=True ) alarm_id: Mapped[str | None] = mapped_column( String(32), ForeignKey("alarms.id", ondelete="SET NULL"), nullable=True ) diagnosis_result_id: Mapped[str | None] = mapped_column( String(32), ForeignKey("diagnosis_results.id", ondelete="SET NULL"), nullable=True ) order_no: Mapped[str] = mapped_column(String(64), unique=True, index=True) title: Mapped[str] = mapped_column(String(255)) content: Mapped[str] = mapped_column(Text, default="") priority: Mapped[str] = mapped_column(String(16), default="medium", index=True) status: Mapped[str] = mapped_column(String(32), default="pending", index=True) assignee_id: Mapped[str] = mapped_column(String(64), default="") assignee_name: Mapped[str] = mapped_column(String(128), default="") department: Mapped[str] = mapped_column(String(128), default="") due_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) verified_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) closed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) result: Mapped[str] = mapped_column(Text, default="") attachments: Mapped[list] = mapped_column(JSON, default=list) metadata_json: Mapped[dict] = mapped_column("metadata", JSON, default=dict) class WorkOrderEvent(UUIDPrimaryKeyMixin, Base): __tablename__ = "work_order_events" work_order_id: Mapped[str] = mapped_column( String(32), ForeignKey("work_orders.id", ondelete="CASCADE"), index=True ) event_type: Mapped[str] = mapped_column(String(32), index=True) from_status: Mapped[str] = mapped_column(String(32), default="") to_status: Mapped[str] = mapped_column(String(32), default="") operator_id: Mapped[str] = mapped_column(String(64), default="") operator_name: Mapped[str] = mapped_column(String(128), default="") comment: Mapped[str] = mapped_column(Text, default="") attachments: Mapped[list] = mapped_column(JSON, default=list) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), index=True)