""" 缓存任务模型 """ from datetime import datetime, date from sqlalchemy import Column, Integer, BigInteger, String, Numeric, Text, Date, DateTime, ForeignKey, Boolean from sqlalchemy.orm import relationship from app.db.base import Base class CacheTask(Base): """缓存任务表""" __tablename__ = "cache_tasks" id = Column(Integer, primary_key=True, index=True) task_name = Column(String(200), nullable=False) task_type = Column(String(50), nullable=False) # detect_missing, cache_data, sync_data security_type = Column(String(20), nullable=False) # stock, future, index period_type = Column(String(10)) # daily, min1, min5, etc. start_date = Column(Date, nullable=False) end_date = Column(Date, nullable=False) code_list = Column(Text) # 逗号分隔的代码列表 status = Column(String(20), default="pending") # pending, running, completed, failed, cancelled progress = Column(Numeric(5, 2), default=0) total_count = Column(Integer, default=0) success_count = Column(Integer, default=0) error_count = Column(Integer, default=0) error_message = Column(Text) created_by = Column(Integer, ForeignKey("users.id")) created_at = Column(DateTime(timezone=True), default=datetime.utcnow) started_at = Column(DateTime(timezone=True)) completed_at = Column(DateTime(timezone=True)) details = relationship("CacheTaskDetail", back_populates="task", cascade="all, delete-orphan") class CacheTaskDetail(Base): """缓存任务详情表""" __tablename__ = "cache_task_details" id = Column(BigInteger, primary_key=True, index=True) task_id = Column(Integer, ForeignKey("cache_tasks.id", ondelete="CASCADE"), nullable=False, index=True) code = Column(String(20), nullable=False, index=True) trade_date = Column(Date, nullable=False) expected_count = Column(Integer, default=0) actual_count = Column(Integer, default=0) is_missing = Column(Boolean, default=False) status = Column(String(20), default="pending") # pending, success, failed, skipped error_message = Column(Text) processed_at = Column(DateTime(timezone=True)) created_at = Column(DateTime(timezone=True), default=datetime.utcnow) task = relationship("CacheTask", back_populates="details")