""" 儀表板警示 Model """ from datetime import datetime from typing import Optional, TYPE_CHECKING from sqlalchemy import String, Integer, Boolean, DateTime, Text, ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from app.core.database import Base if TYPE_CHECKING: from app.models.employee import Employee from app.models.kpi_sheet import KPISheet class DashboardAlert(Base): """儀表板警示""" __tablename__ = "KPI_D_alerts" id: Mapped[int] = mapped_column(primary_key=True) alert_type: Mapped[str] = mapped_column(String(50), nullable=False) # deadline_approaching, overdue, weight_invalid severity: Mapped[str] = mapped_column(String(20), default="warning") # info, warning, error title: Mapped[str] = mapped_column(String(200), nullable=False) description: Mapped[Optional[str]] = mapped_column(Text) related_sheet_id: Mapped[Optional[int]] = mapped_column(ForeignKey("KPI_D_sheets.id", ondelete="CASCADE")) related_employee_id: Mapped[Optional[int]] = mapped_column(ForeignKey("KPI_D_employees.id")) is_resolved: Mapped[bool] = mapped_column(Boolean, default=False) resolved_at: Mapped[Optional[datetime]] = mapped_column(DateTime) resolved_by: Mapped[Optional[int]] = mapped_column(ForeignKey("KPI_D_employees.id")) created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow) # Relationships related_sheet: Mapped[Optional["KPISheet"]] = relationship("KPISheet") related_employee: Mapped[Optional["Employee"]] = relationship("Employee", foreign_keys=[related_employee_id]) resolver: Mapped[Optional["Employee"]] = relationship("Employee", foreign_keys=[resolved_by]) def __repr__(self) -> str: return f""