Tabla de Contenidos:
Backend web (CAD / Computer-Aided Dispatch) para coordinar servicios de emergencia urbanos (bomberos, ambulancia, policía) con registro de incidentes, asignación/gestión de recursos, monitoreo y reporte diario.
El objetivo principal es crear un programa usando los conceptos aprendidos de POO (Programación Orientada a Objetos), que permita gestionar diferentes tipos de emergencias, asignar recursos según prioridad y evaluar el rendimiento del sistema. Con el ejercio se practican habilidades intermedias de diseño, programación y resolución de problemas en sistemas críticos.
- Modelar el Sistema de Emergencias
- Aplicar Encapsulamiento y Herencia
- Usar Polimorfismo e Interfaces
- Incorporar Patrones de Diseño Básicos.
- Implementar Estrategias Avanzadas
- Integrar Clases Internas y Lambda
- Evaluar y Optimizar el Sistema
Crear clases para los servicios de emergencia (Departamento de Bomberos, Ambulancia, Policia). Cada una con atributos y métodos específicos.
Definir una clase principal "Emergencia" que almacene información como tipo, ubicación, nivel de gravedad y tiempo de respuesta.
Diseñar una jerarquía de clases para diferentes tipos de emergencias (incendio, Accidente Vehicular, Robo).
Proteger datos sensibles como ubicaciones críticas o identidades mediante modificadores de acceso.
Crear una interfaz "Responder" con métodos como "atenderEmergencia" y "evaluarEstado".
Implementar la interfaz en los servicios de emergencia y personalizar su comportamiento según el tipo de emergencia.
Utilizar el patrón "Factory" para crear instancias de emergencias según su tipo.
Aplicar el patrón "Singleton" para centralizar la gestión de recursos disponiblen en un único controlador del sistema.
Usar el patrón "Strategy" para definir cómo se priorizan las emergencias (por ejemplo, gravedad alta vs. cercanía a la base de operaciones).
Implementar el patrón "Observer" para notificar automáticamente a los servicios relevantos cuando ocurre una nueva emergencia.
Implementar clases internas para modelar mapas urbanos, permitiendo verificar la proximidad de los recursos a las emergencias.
Usar expresiones lambda para filtrar listas de recursos disponibles según criterios específicos (distancia, tiempo de respuesta).
Calcular métricas de desempeño, como el tiempo promedio de respuesta, emergencias atendidas y recursos disponibles al final de cada jornada.
Evaluar la eficacia de las decisiones tomadas, optimizando la asignación de recursos según los resultados.
- Registro de Emergencias
- Asignación de Recursos
- Gestión de Recursos
- Monitoreo del Estado de las Emergencias
- Interacción con el Usuario
- Estadísticas y Evaluación de Desempeño
- Cantidad de emergencias atendidas.
- Tiempo promedio de respuesta por tipo de emergencia.
- Recursos gastados vs. recursos disponibles
Presentar un menú con diferentes tipos de emergencias
Solicitar detalles específicos sobre la emergencia, como su ubicación, nivel de gravedad (bajo, medio, alto) y tiempo estimado de atención inicial.
Mostrar un resumen del incidente y confirmar el registro.
Consultar la disponibilidad de recursos de emergencia basados en la ubicación y tipo de emergencia.
Calcular los recursos necesarios según la gravedad del evento
Permitir al usuario confirmar o ajustar la asignación de recursos antes de enviarlos.
Mostrar el estado actual de los recursos, como vehículos disponibles, personal activo y combustible restante.
Permitir al usuario reasignar recursos entre emergencias si se agotan o si se presentan situaciones inesperadas.
Mostrar el progreso de atención de cada emergencia en tiempo real (%)
Indicar si alguna emergencia no fue atendida a tiempo o si se resolvió con éxito.
Proporcionar un resumen al final de la jornada, incluyendo emergencias atendidas, recursos gastados, y tiempo promedio de respuesta.
El sistema debe ogrecer un menú interactivo con opciones claras: Registrar una nueva emergencia, ver el estado actual de los recursos, atender una emergencia, y terminar la jornada.
Validar la entrada del usuario para evitar errores
Calcular y mostrar métricas al final de la jornada, como:
Permitir al usuario analizar los resultados para planificar mejor futuras jornadas.
El flujo del sistema de gestión de emergencias urbanas está diseñado para permitir una gestión eficiente y clara de las emergencias en una ciudad. El sistema sigue un ciclo continuo que permite registrar emergencias, asignar recursos, monitorizar el progreso de las atenciones y evaluar el rendimiento del sistema. Acontinucación, se describe el flujo general del sistema.
- Inicio del Sistema
- Menú de Opciones
- Registrar una nueva emergencia: El usuario puede ingresar información sobre la emergencia, como el tipo (incendio, accidente vehicular, robo, etc.), la ubicación y el nivel gravedad.
- Ver el estado de los recursos disponibles: El sistema muestra el estado actual de los recursos, tales como vehículos, personal y combustible disponible.
- Atender una emergencia: El usuario puede asignar recursos a una emergencia específica basándose en la prioridad determinada por la gravedad del evento y su proximidad.
- Mostrar estadísticas: Al finalizar la jornada o cuando se desee evaluar el desempeño del sistema, el usuario puede ver métricas clave, como el número de emergencias atendidas, tiempo promedio de respuesta , y recursos utilizados.
- Registro y Asignación de Emergencias
- Gestión de Recursos
- Monitoreo de Emergencias
- Evaluación del Desempeño del Sistema
- Cierre del Sistema
El sistema comienza con una configuración inicial en la que se asignan los recursos disponibles, como vehículos, personal y otros elementos necesario para la atención de emergencias. Esta fase garantiza que el sistema tenga toda la información requerida para operar.
Una vez iniciado el sistema, el usuario se enfrenta a un menú interactivo que le permite seleccionar entre diversas opciones:
Cuando se registra una nueva emergencia, el sistema solicita al usuario los detalles sobre el incidente y calcula automáticamente los recursos necesarios para atenderlo, según la gravedad y el tipo de emergencia.
El usuario puede ajustar la asignación de recursos antes de confirmar el envio.
El sistema monitorea constantemente el estado de los recursos. Si los recursos se agotan o se requieren máx unidades, el sistema ofrece la opción de reasignar recursos entre emergencias.
Los recursos son consumidos a medida que se utilizan, por lo que el sistema también simula la progresiva disminución de la disponibilidad a lo largo del día.
A lo largo del día, el sistema muestra el progreso de las emergencias en tiempo real, indicándole al usuario el porcentaje de resolución de cada incidente.
El sistema también avisa cuando una emergencia no se atiende dentro del tiempo esperado, o si se resuelve exitosamente.
Al final de ciclo de trabajo o jornada, el sistema ofrece un resumen de las emergencias atendidas, los recursos gastados, y el tiempo promedio de respuesta.
Las métricas son generadas y mostradas al usuario para su análisis y reflexión. El sistema permite comparar los recursos gastados versus los disponibles, ofreciendo una visión clara de la eficiencia operativa del sistema.
Una vez finalizada la jornada, el sistema guarda un registro de las operaciones realizadas, que incluye las estadísticas y cualquier detalle relevante sobre las emergencias atendidas.
El sistema se prepara para el siguiente ciclo, garantizando que los datos y recursos estén listos para ser utilizados nuevamente.
Para ejecutar este programa es necesario tener el JDK 21 de Java. Este se puede descargar desde el sitio de Oracle
Instrucciones para configurar el proyecto localmente:
- IDE (IntelliJ, Eclipse, NetBeans, VSCode, etc).
- JDK 21+
- Podman (para ejecutar PostgreSQL)
Nota: Este es un proyecto de uso estudiantil, no debe utilizarse para uso comercial.
# Inicia PostgreSQL con Podman (compose)
podman compose up -d
# Ejecuta el backend (Spring Boot)
cd backend
./mvnw spring-boot:run# Crea una estación
curl -X POST localhost:8080/api/stations \
-H 'Content-Type: application/json' \
-d '{"name":"Central Station","location":{"addressLine":"Av. Principal 123","city":"Ciudad","zone":"Z1","latitude":10.0,"longitude":-84.0}}'
# Crea una unidad
curl -X POST localhost:8080/api/units \
-H 'Content-Type: application/json' \
-d '{"agency":"FIRE","callsign":"F-01","homeStationId":"<uuid>","status":"AVAILABLE","activePersonnel":4,"fuelPercent":100}'
# Registra una emergencia
curl -X POST localhost:8080/api/emergencies \
-H 'Content-Type: application/json' \
-H 'X-Actor: operator-1' \
-d '{"type":"FIRE","severity":"HIGH","location":{"addressLine":"Calle 5","city":"Ciudad","zone":"Z1","latitude":10.1,"longitude":-84.1},"estimatedInitialResponseMinutes":7,"notes":"Humo visible"}'
Autor: Samuel Rivera
GitHub: https://github.com/dnbsammie
