work_order.py 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from sqlalchemy import 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 Alarm(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  7. __tablename__ = "alarms"
  8. mine_id: Mapped[str] = mapped_column(
  9. String(32), ForeignKey("mines.id", ondelete="CASCADE"), index=True
  10. )
  11. sensor_id: Mapped[str | None] = mapped_column(
  12. String(32), ForeignKey("sensors.id", ondelete="SET NULL"), nullable=True
  13. )
  14. alarm_no: Mapped[str] = mapped_column(String(64), unique=True, index=True)
  15. alarm_type: Mapped[str] = mapped_column(String(64), index=True)
  16. level: Mapped[str] = mapped_column(String(16), index=True)
  17. title: Mapped[str] = mapped_column(String(255))
  18. content: Mapped[str] = mapped_column(Text, default="")
  19. value: Mapped[float | None] = mapped_column(Float, nullable=True)
  20. threshold: Mapped[float | None] = mapped_column(Float, nullable=True)
  21. status: Mapped[str] = mapped_column(String(32), default="open", index=True)
  22. occurred_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), index=True)
  23. acknowledged_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  24. closed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  25. metadata_json: Mapped[dict] = mapped_column("metadata", JSON, default=dict)
  26. class WorkOrder(UUIDPrimaryKeyMixin, TimestampMixin, Base):
  27. __tablename__ = "work_orders"
  28. mine_id: Mapped[str] = mapped_column(
  29. String(32), ForeignKey("mines.id", ondelete="CASCADE"), index=True
  30. )
  31. alarm_id: Mapped[str | None] = mapped_column(
  32. String(32), ForeignKey("alarms.id", ondelete="SET NULL"), nullable=True
  33. )
  34. diagnosis_result_id: Mapped[str | None] = mapped_column(
  35. String(32), ForeignKey("diagnosis_results.id", ondelete="SET NULL"), nullable=True
  36. )
  37. order_no: Mapped[str] = mapped_column(String(64), unique=True, index=True)
  38. title: Mapped[str] = mapped_column(String(255))
  39. content: Mapped[str] = mapped_column(Text, default="")
  40. priority: Mapped[str] = mapped_column(String(16), default="medium", index=True)
  41. status: Mapped[str] = mapped_column(String(32), default="pending", index=True)
  42. assignee_id: Mapped[str] = mapped_column(String(64), default="")
  43. assignee_name: Mapped[str] = mapped_column(String(128), default="")
  44. department: Mapped[str] = mapped_column(String(128), default="")
  45. due_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  46. completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  47. verified_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  48. closed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
  49. result: Mapped[str] = mapped_column(Text, default="")
  50. attachments: Mapped[list] = mapped_column(JSON, default=list)
  51. metadata_json: Mapped[dict] = mapped_column("metadata", JSON, default=dict)
  52. class WorkOrderEvent(UUIDPrimaryKeyMixin, Base):
  53. __tablename__ = "work_order_events"
  54. work_order_id: Mapped[str] = mapped_column(
  55. String(32), ForeignKey("work_orders.id", ondelete="CASCADE"), index=True
  56. )
  57. event_type: Mapped[str] = mapped_column(String(32), index=True)
  58. from_status: Mapped[str] = mapped_column(String(32), default="")
  59. to_status: Mapped[str] = mapped_column(String(32), default="")
  60. operator_id: Mapped[str] = mapped_column(String(64), default="")
  61. operator_name: Mapped[str] = mapped_column(String(128), default="")
  62. comment: Mapped[str] = mapped_column(Text, default="")
  63. attachments: Mapped[list] = mapped_column(JSON, default=list)
  64. created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), index=True)