Servicio: sequences
Información General
- Propósito: Motor de análisis de dependencias entre bloques constructivos. Calcula secuencias de ejecución, detecta rutas críticas y verifica la ausencia de dependencias circulares.
- Tecnología: Go 1.24.6 / Gin
- Puerto:
:8103 - Módulo:
sequences
Propósito de Negocio
En un proyecto de construcción, los elementos tienen relaciones de precedencia (bloque B no puede empezar hasta que termine bloque A). Este servicio: - Analiza todas las dependencias del proyecto - Calcula el orden óptimo de ejecución (similar a PERT/CPM) - Identifica la ruta crítica (bloques sin holgura de tiempo) - Detecta y rechaza dependencias circulares (A→B→A) - Persiste las secuencias calculadas para uso de otros servicios
Endpoints Expuestos
| Path | Descripción |
|---|---|
GET /sequences/{projectId}/{code} | Secuencias de un bloque específico |
POST /sequences | Crear/regenerar TODAS las secuencias del proyecto |
Parámetros de GET
isCentralized(query): sitrue, usa BD centralizada; sifalse, usa BD por proyecto
Body de POST
{
"projectId": "string",
"code": "string (opcional)"
}Base de Datos
- Motor: MongoDB v1.17.4
- Conexión: Pool dinámico (GetOrAddClient)
- Pool: Min=10, Max=30
- Workers: 8 workers concurrentes, 5000 registros/worker
Colecciones Usadas
| Colección | Base de Datos | Descripción |
|---|---|---|
blockIfc |
{projectId} |
Bloques con array dependence[] |
blockIfc_sequences |
{projectId} |
Secuencias calculadas (resultado) |
free_days |
{projectId} |
Días festivos |
labels |
{projectId} |
Etiquetas (análisis ponderado) |
Estructura de Sequence (resultado)
{
"data": "string (ej: 'BLOCK_A-BLOCK_B-BLOCK_C')"
}Las secuencias se almacenan como strings concatenados con - separador.
Variables de Entorno / Configuración
- Usa
config.jsonestático para configuración base - Workers:
Enable=true,NumWorkers=8,RecordsPerWorker=5000 - Timeouts: ServerSelection=30s, Connect=15s, Socket=60s
Algoritmo PERT/CPM
Forward Pass (inicio temprano)
Para cada bloque en orden topológico:
ES(bloque) = max(EF(predecesores))
EF(bloque) = ES(bloque) + duracion(bloque)
Backward Pass (inicio tardío)
Para cada bloque en orden inverso:
LF(bloque) = min(LS(sucesores))
LS(bloque) = LF(bloque) - duracion(bloque)
Ruta Crítica
slack(bloque) = LS(bloque) - ES(bloque)
Si slack = 0 → bloque en ruta crítica → critical_block = true
Detección de Ciclos
Antes de procesar: 1. Construye grafo dirigido de dependencias 2. Ejecuta algoritmo de detección de ciclos (DFS) 3. Si se detecta ciclo (A→B→A): envía email de error y rechaza la operación 4. Previene bucles infinitos en el cálculo
Streaming y Concurrencia
StreamAllWithDataProjection(): procesa bloques en chunks- 8 goroutines workers concurrentes
- Mutex para agregar resultados thread-safe
- Medición de memoria antes/después del proceso (GC y
MemStats) - Inserción concurrente de secuencias (
InsertSequencesConcurrently)
Dependencias Externas
- Email de error:
gopkg.in/gomail.v2para notificar dependencias circulares - No llama a otros servicios HTTP
Cors
Restringido a dominios específicos: - https://apibt.bimtrazer.com - https://apibt-dev.bimtrazer.com - https://apibt-qa.bimtrazer.com
Rol en Casos de Uso
| Caso de Uso | Rol |
|---|---|
| CU-02: Carga de Modelo IFC | Recibe llamada de ifc para recalcular secuencias |
| CU-08: Cálculo de Desplazamientos | displacements lee blockIfc_sequences calculadas aquí |
| CU-13: Procesamiento de Secuencias | Servicio principal |