Files
xiaoxia-saas/apps/worker/worker_app/tasks/classification.py
T
2026-06-21 06:52:19 +08:00

76 lines
2.4 KiB
Python

from worker_app.celery_app import celery_app
from worker_app.db import SessionLocal
from packages.adapters.sqlalchemy_impl.classification_job_repository import (
SQLAlchemyClassificationJobRepository,
)
from packages.domain import (
AssetClassification,
ClassificationJob,
ClassificationJobStatus,
)
@celery_app.task(name="worker.classify_asset")
def classify_asset(job_id: str) -> dict:
"""
Classify asset task.
Steps:
1. Fetch ClassificationJob from repository
2. Fetch Asset from repository
3. Run classification model (placeholder: mock classification)
4. Update ClassificationJob with result
5. Return result
"""
# 创建数据库 session 和 repository
session = SessionLocal()
try:
job_repo = SQLAlchemyClassificationJobRepository(session)
job = job_repo.get(job_id)
if job is None:
return {"status": "failed", "error": "job not found"}
try:
# Update job status to PROCESSING
job.status = ClassificationJobStatus.PROCESSING
job_repo.update(job)
session.commit()
# Mock classification (in real implementation: use ML model, vision API, etc.)
# For now, randomly classify based on asset_id hash
asset_id_hash = sum(ord(c) for c in job.asset_id)
classifications = list(AssetClassification)
classification = classifications[asset_id_hash % len(classifications)]
confidence = 0.85
# Update job status to COMPLETED
job.status = ClassificationJobStatus.COMPLETED
job.classification = classification.value
job.confidence = confidence
job_repo.update(job)
session.commit()
return {
"status": "completed",
"job_id": job.id,
"classification": classification.value,
"confidence": confidence,
}
except Exception as e:
session.rollback()
# Update job status to FAILED
job.status = ClassificationJobStatus.FAILED
job.error_message = str(e)
job_repo.update(job)
session.commit()
return {
"status": "failed",
"job_id": job.id,
"error": str(e),
}
finally:
session.close()