51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
"""任务模型"""
|
|
from sqlalchemy import Column, String, Integer, DateTime, JSON, Enum, Text
|
|
from sqlalchemy.sql import func
|
|
import enum
|
|
|
|
from ..database import Base
|
|
|
|
|
|
class JobStatus(str, enum.Enum):
|
|
"""任务状态"""
|
|
PENDING = "pending" # 等待进入队列
|
|
QUEUED = "queued" # 已排队,等待执行
|
|
RUNNING = "running" # 正在执行
|
|
COMPLETED = "completed" # 执行完成
|
|
FAILED = "failed" # 执行失败
|
|
|
|
|
|
class Job(Base):
|
|
__tablename__ = "jobs"
|
|
|
|
id = Column(String, primary_key=True, index=True)
|
|
celery_task_id = Column(String, nullable=True, index=True)
|
|
status = Column(Enum(JobStatus), default=JobStatus.PENDING, index=True)
|
|
|
|
input_files = Column(JSON)
|
|
sequence_type = Column(String, default="nucl")
|
|
scaf_suffix = Column(String, default=".fna")
|
|
threads = Column(Integer, default=4)
|
|
|
|
# 分析参数
|
|
min_identity = Column(Integer, default=80) # 存储为百分比 (0-100)
|
|
min_coverage = Column(Integer, default=60)
|
|
allow_unknown_families = Column(Integer, default=0) # 0 = False, 1 = True
|
|
require_index_hit = Column(Integer, default=1)
|
|
|
|
result_url = Column(String, nullable=True)
|
|
logs = Column(Text, nullable=True)
|
|
error_message = Column(Text, nullable=True)
|
|
|
|
# 队列位置
|
|
queue_position = Column(Integer, nullable=True)
|
|
|
|
# 进度信息
|
|
current_stage = Column(String, nullable=True) # digger, shoter, plots, bundle
|
|
progress_percent = Column(Integer, default=0)
|
|
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now(), index=True)
|
|
started_at = Column(DateTime(timezone=True), nullable=True)
|
|
completed_at = Column(DateTime(timezone=True), nullable=True)
|
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|