from datetime import datetime from app.core.utils import now_tw from sqlalchemy import Column, Integer, String, DateTime, ForeignKey from sqlalchemy.orm import relationship from app.core.database import Base class Schedule(Base): __tablename__ = "schedules" id = Column(Integer, primary_key=True, index=True, autoincrement=True) name = Column(String(100), unique=True, nullable=False) cron_timer = Column(String(50), nullable=False) # 六碼 cron: 秒 分 時 日 月 週 status = Column(String(10), nullable=False, default="Waiting") # Waiting / Going last_run_at = Column(DateTime) next_run_at = Column(DateTime) last_status = Column(String(10)) # ok / error recorded_at = Column(DateTime, nullable=False, default=now_tw) logs = relationship("ScheduleLog", back_populates="schedule") class ScheduleLog(Base): __tablename__ = "schedule_logs" id = Column(Integer, primary_key=True, index=True, autoincrement=True) schedule_id = Column(Integer, ForeignKey("schedules.id"), nullable=False, index=True) schedule_name = Column(String(100), nullable=False) started_at = Column(DateTime, nullable=False) ended_at = Column(DateTime) status = Column(String(10), nullable=False, default="running") # running / ok / error schedule = relationship("Schedule", back_populates="logs") tenant_results = relationship("TenantScheduleResult", back_populates="schedule_log") account_results = relationship("AccountScheduleResult", back_populates="schedule_log") system_status_logs = relationship("SystemStatusLog", back_populates="schedule_log") server_status_logs = relationship("ServerStatusLog", back_populates="schedule_log")