from __future__ import annotations from sqlalchemy import Boolean, Float, ForeignKey, Integer, JSON, String, Text from sqlalchemy.orm import Mapped, mapped_column from app.db.base import Base, TimestampMixin, UUIDPrimaryKeyMixin class Mine(UUIDPrimaryKeyMixin, TimestampMixin, Base): __tablename__ = "mines" code: Mapped[str] = mapped_column(String(64), unique=True, index=True) name: Mapped[str] = mapped_column(String(128), index=True) short_name: Mapped[str] = mapped_column(String(64), default="") province: Mapped[str] = mapped_column(String(64), default="") city: Mapped[str] = mapped_column(String(64), default="") status: Mapped[str] = mapped_column(String(32), default="active", index=True) production_capacity: Mapped[float | None] = mapped_column(Float, nullable=True) design_capacity: Mapped[float | None] = mapped_column(Float, nullable=True) ventilation_method: Mapped[str] = mapped_column(String(64), default="") description: Mapped[str] = mapped_column(Text, default="") settings: Mapped[dict] = mapped_column(JSON, default=dict) is_default: Mapped[bool] = mapped_column(Boolean, default=False, index=True) class MineArea(UUIDPrimaryKeyMixin, TimestampMixin, Base): __tablename__ = "mine_areas" mine_id: Mapped[str] = mapped_column( String(32), ForeignKey("mines.id", ondelete="CASCADE"), index=True ) code: Mapped[str] = mapped_column(String(64), index=True) name: Mapped[str] = mapped_column(String(128)) area_type: Mapped[str] = mapped_column(String(32), default="采区") depth: Mapped[float | None] = mapped_column(Float, nullable=True) status: Mapped[str] = mapped_column(String(32), default="active") description: Mapped[str] = mapped_column(Text, default="") class WorkFace(UUIDPrimaryKeyMixin, TimestampMixin, Base): __tablename__ = "work_faces" mine_id: Mapped[str] = mapped_column( String(32), ForeignKey("mines.id", ondelete="CASCADE"), index=True ) area_id: Mapped[str | None] = mapped_column( String(32), ForeignKey("mine_areas.id", ondelete="SET NULL"), nullable=True, index=True ) code: Mapped[str] = mapped_column(String(64), index=True) name: Mapped[str] = mapped_column(String(128)) face_type: Mapped[str] = mapped_column(String(32), default="采煤工作面") status: Mapped[str] = mapped_column(String(32), default="active") planned_air_volume: Mapped[float | None] = mapped_column(Float, nullable=True) actual_air_volume: Mapped[float | None] = mapped_column(Float, nullable=True) gas_limit: Mapped[float | None] = mapped_column(Float, nullable=True) dust_limit: Mapped[float | None] = mapped_column(Float, nullable=True) location: Mapped[dict] = mapped_column(JSON, default=dict) class Roadway(UUIDPrimaryKeyMixin, TimestampMixin, Base): __tablename__ = "roadways" mine_id: Mapped[str] = mapped_column( String(32), ForeignKey("mines.id", ondelete="CASCADE"), index=True ) area_id: Mapped[str | None] = mapped_column( String(32), ForeignKey("mine_areas.id", ondelete="SET NULL"), nullable=True, index=True ) code: Mapped[str] = mapped_column(String(64), index=True) name: Mapped[str] = mapped_column(String(128)) roadway_type: Mapped[str] = mapped_column(String(32), default="回风巷") start_node: Mapped[str] = mapped_column(String(128), default="") end_node: Mapped[str] = mapped_column(String(128), default="") length: Mapped[float | None] = mapped_column(Float, nullable=True) cross_section_area: Mapped[float | None] = mapped_column(Float, nullable=True) resistance: Mapped[float | None] = mapped_column(Float, nullable=True) airflow: Mapped[float | None] = mapped_column(Float, nullable=True) status: Mapped[str] = mapped_column(String(32), default="normal", index=True) properties: Mapped[dict] = mapped_column(JSON, default=dict)