"""Celery 任务""" from celery import Task from pathlib import Path import shutil import logging from ..core.celery_app import celery_app from ..core.docker_client import DockerManager from ..database import SessionLocal from ..models.job import Job, JobStatus logger = logging.getLogger(__name__) @celery_app.task(bind=True) def run_bttoxin_analysis( self, job_id: str, input_dir: str, output_dir: str, sequence_type: str = "nucl", scaf_suffix: str = ".fna", threads: int = 4 ): """执行分析任务""" db = SessionLocal() try: job = db.query(Job).filter(Job.id == job_id).first() job.status = JobStatus.RUNNING db.commit() self.update_state( state='PROGRESS', meta={'current': 20, 'total': 100, 'status': 'Running analysis...'} ) docker_manager = DockerManager() result = docker_manager.run_bttoxin_digger( input_dir=Path(input_dir), output_dir=Path(output_dir), sequence_type=sequence_type, scaf_suffix=scaf_suffix, threads=threads ) if result['success']: job.status = JobStatus.COMPLETED job.logs = result.get('logs', '') else: job.status = JobStatus.FAILED job.error_message = result.get('error', 'Analysis failed') db.commit() return {'job_id': job_id, 'status': job.status} except Exception as e: logger.error(f"Task failed: {e}") job.status = JobStatus.FAILED job.error_message = str(e) db.commit() raise finally: db.close()