Se agregaron estados y update a cada una de las tareas

This commit is contained in:
2025-10-12 07:53:05 -06:00
parent 770e0a4d13
commit 62a7f67b23
17 changed files with 640 additions and 229 deletions

View File

@@ -1,26 +1,87 @@
from celery_app import celery_app
from .services import put_pedimento_data
import asyncio # Necesario para ejecutar funciones async dentro de Celery
import asyncio
import logging
from ..tasks.services import register_task, update_task
logger = logging.getLogger(__name__)
@celery_app.task(bind=True)
def process_pedimento_completo_request(self, pedimento_data: dict):
"""
Tarea de Celery para procesar la descarga de un solo documento edoc.
Tarea de Celery para procesar la descarga de un pedimento completo.
Args:
pedimento_data (dict): Datos del pedimento a procesar
Returns:
dict: Resultado del procesamiento con estado y detalles
"""
loop = asyncio.get_event_loop()
task_id = self.request.id
servicio = 3 # Código para Pedimento Completo
pedimento_id = pedimento_data.get('pedimento', {}).get('id')
organizacion_id = pedimento_data.get('pedimento', {}).get('organizacion')
try:
# Ejecutar la función asíncrona dentro del hilo síncrono de Celery
loop = asyncio.get_event_loop()
# Registrar la tarea primero
loop.run_until_complete(
register_task(
task_id=task_id,
message=f"Iniciando procesamiento del pedimento completo",
status="submitted",
pedimento_id=pedimento_id,
organizacion_id=organizacion_id,
servicio=servicio
)
)
# Luego actualizar estado a processing
loop.run_until_complete(
update_task(
task_id=task_id,
message=f"Iniciando procesamiento del pedimento completo",
status="processing",
pedimento_id=pedimento_id,
organizacion_id=organizacion_id,
servicio=servicio
)
)
# Procesar pedimento
result = loop.run_until_complete(put_pedimento_data(**pedimento_data))
return {"status": "success", "result": result}
except Exception as e:
# Manejo de errores
self.update_state(
state='FAILURE',
meta={'exc_type': type(e).__name__, 'exc_message': str(e)}
# Actualizar estado a completed
loop.run_until_complete(
update_task(
task_id=task_id,
message=f"Pedimento completo procesado exitosamente",
status="completed",
pedimento_id=pedimento_id,
organizacion_id=organizacion_id,
servicio=servicio
)
)
# Es crucial volver a lanzar la excepción para que Celery la marque como fallida
raise e
return {"status": "success", "result": result}
except Exception as e:
logger.error(f"Error procesando pedimento completo: {str(e)}", exc_info=True)
# Actualizar estado a failed
try:
loop.run_until_complete(
update_task(
task_id=task_id,
message=f"Error al procesar pedimento completo: {str(e)}",
status="failed",
pedimento_id=pedimento_id,
organizacion_id=organizacion_id,
servicio=servicio
)
)
except Exception as update_error:
logger.error(f"Error actualizando estado de tarea: {update_error}")
# Re-lanzar la excepción para que Celery la marque como fallida
raise