Propósito: Motor de cálculo de desplazamientos de cronograma. Determina el impacto de retrasos en bloques sobre sus dependientes, calcula nuevas fechas estimadas y cuantifica días de atraso.
Tecnología: Go 1.24.1 / Gorilla Mux v1.8.1 (único servicio que NO usa Gin)
Puerto::8105
Módulo:displacements
CI/CD: GitLab CI/CD
Propósito de Negocio
En un proyecto de construcción, si un bloque A se retrasa, todos los bloques que dependen de A también se desplazan en el tiempo. Este servicio: - Analiza cadenas de dependencias (secuencias) - Determina la nueva fecha estimada de cada bloque afectado - Calcula los días de atraso acumulados - Actualiza masivamente los bloques en MongoDB
Endpoints Expuestos
Path
Descripción
PUT /workprogress
Calcular y persistir desplazamientos del proyecto
Parámetros del Endpoint
Query:isCentralized (boolean) — determina si usa BD centralizada o por proyecto
Algoritmo de Desplazamientos (Núcleo del Servicio)
Frame de Estado (7 bits)
Para cada bloque en una secuencia, se construye un frame binario:
frame[0]: ¿El bloque ancla está certificado (executed=true)?
frame[1]: ¿El bloque tiene sucesor en la secuencia?
frame[2]: ¿Fecha scheduled >= hoy?
frame[3]: ¿Fecha displacement >= hoy?
frame[4]: ¿Ejecutado Y fecha_ejecución >= hoy?
frame[5]: (usado en casos específicos)
frame[6]: (usado en casos específicos)
Ejemplo: "0101001"
Mapeo a Casos
El frame se mapea a uno de N casos predefinidos de desplazamiento. Cada caso tiene una regla específica que determina: - La nueva displacement_date - Los days_late
Flujo Completo del Motor
1. Fetch bloques activos (ordenados por código)
2. Fetch días festivos
3. Fetch secuencias de dependencias
4. Para cada secuencia:
a. Invertir secuencia (análisis backwards)
b. Encontrar "execution anchor" (punto de ejecución)
c. Construir frame de 7 bits para cada bloque
d. Mapear frame → caso de desplazamiento
e. Aplicar regla del caso
f. Calcular displacement_date y days_late
5. Calcular gráficos (goroutines concurrentes)
6. BulkWrite en MongoDB (dos operaciones)
Optimizaciones Técnicas
Optimización
Descripción
Pre-computación O(1)
Mapas hash para búsqueda rápida de bloques por código
BulkWrite
Dos operaciones masivas en lugar de N updates individuales
Concurrencia
Goroutines independientes para cálculo de gráficos
Pool dinámico
Min/Max pool size parametrizable en config.json
Graceful Shutdown
Manejo de SIGINT, SIGTERM
Entidades Principales
Block
code string
description string
status bool
executed bool
val_executed float64
start_date time.Time
end_date time.Time
displacement_date time.Time
exec_date time.Time
dependence []string
critical_block bool
duration int
days_late int
in_progress bool
labels []string