Servicios Go/Gin

Servicio: displacements

Información General


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

PathDescripción
PUT /workprogressCalcular y persistir desplazamientos del proyecto

Parámetros del Endpoint

Respuesta

{
  "success": boolean,
  "code": integer,
  "message": "string"
}

Base de Datos

Colecciones Usadas

Colección Base de Datos Descripción
blockIfc {projectId} Bloques del proyecto (lectura/escritura masiva)
blockIfc_sequences {projectId} Secuencias de dependencias precalculadas
free_days {projectId} Días festivos/no laborales
labels {projectId} Etiquetas (lectura)
Project {projectId} Configuración del proyecto

Variables de Entorno

Variable Descripción
ENVIRONMENT Ambiente: dev, qa, prod, local
{ENV}_PORT Puerto HTTP (:8105)
{ENV}_API_URL URL de la API central
{ENV}_DISPLACEMENTS_URL URL propia del servicio
{ENV}_LABELS_URL URL del servicio labels
{ENV}_DB_USER Usuario MongoDB (sensible)
{ENV}_DB_PASSWORD Contraseña MongoDB (sensible)
{ENV}_DB_HOST Host MongoDB
{ENV}_DB_PORT Puerto MongoDB

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

Sequence

data   string  // "BLOCK1-BLOCK2-BLOCK3..."

Holiday

date   time.Time

Arquitectura Interna

Componente Archivo Responsabilidad
Orchestrator engine/orchestrator.go Coordina el flujo completo
Persistence engine/persistence.go BulkWrite en MongoDB
Algorithm displacements/algorithm.go Motor de cálculo de desplazamientos
Logic displacements/logic.go Reglas de negocio por caso
Repositories database/repositories/ Acceso a datos por colección

Middlewares


Dependencias Clave

Librería Propósito
gorilla/mux Router HTTP
gorilla/handlers CORS middleware
gopkg.in/gomail.v2 Email de notificación cuando hay secuencias sin regla

Rol en Casos de Uso

Caso de Uso Rol
CU-08: Cálculo de Desplazamientos Servicio principal
CU-07: Gemelo Digital digitaltwin referencia este servicio en su configuración