Sistema completo para monitoreo y gestion de flotas de vehiculos con: - Backend FastAPI con PostgreSQL/TimescaleDB - Frontend React con TypeScript y TailwindCSS - App movil React Native con Expo - Soporte para dispositivos GPS, Meshtastic y celulares - Video streaming en vivo con MediaMTX - Geocercas, alertas, viajes y reportes - Autenticacion JWT y WebSockets en tiempo real Documentacion completa y guias de usuario incluidas.
218 lines
5.1 KiB
Python
218 lines
5.1 KiB
Python
"""
|
|
Schemas Pydantic para Reportes y Dashboard.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
from pydantic import Field
|
|
|
|
from app.schemas.base import BaseSchema
|
|
|
|
|
|
class DashboardResumen(BaseSchema):
|
|
"""Schema para datos del dashboard principal."""
|
|
|
|
# Contadores
|
|
total_vehiculos: int
|
|
vehiculos_activos: int
|
|
vehiculos_en_movimiento: int
|
|
vehiculos_detenidos: int
|
|
vehiculos_sin_señal: int
|
|
|
|
total_conductores: int
|
|
conductores_activos: int
|
|
|
|
# Alertas
|
|
alertas_pendientes: int
|
|
alertas_criticas: int
|
|
alertas_hoy: int
|
|
|
|
# Viajes de hoy
|
|
viajes_hoy: int
|
|
distancia_hoy_km: float
|
|
|
|
# Mantenimiento
|
|
mantenimientos_vencidos: int
|
|
mantenimientos_proximos: int
|
|
|
|
# Última actualización
|
|
actualizado_en: datetime
|
|
|
|
|
|
class DashboardGrafico(BaseSchema):
|
|
"""Schema para datos de gráficos del dashboard."""
|
|
|
|
# Distancia por día (últimos 7 días)
|
|
distancia_diaria: List[dict] # [{fecha, km}]
|
|
|
|
# Viajes por día (últimos 7 días)
|
|
viajes_diarios: List[dict] # [{fecha, cantidad}]
|
|
|
|
# Alertas por tipo (últimos 7 días)
|
|
alertas_por_tipo: List[dict] # [{tipo, cantidad}]
|
|
|
|
# Consumo de combustible (últimos 30 días)
|
|
consumo_combustible: List[dict] # [{fecha, litros}]
|
|
|
|
|
|
class ReporteRequest(BaseSchema):
|
|
"""Schema para solicitar generación de reporte."""
|
|
|
|
tipo: str = Field(
|
|
...,
|
|
pattern="^(viajes|alertas|combustible|mantenimiento|ubicaciones|resumen)$"
|
|
)
|
|
formato: str = Field(default="pdf", pattern="^(pdf|excel|csv)$")
|
|
fecha_inicio: datetime
|
|
fecha_fin: datetime
|
|
vehiculos_ids: Optional[List[int]] = None # None = todos
|
|
conductores_ids: Optional[List[int]] = None
|
|
parametros: Optional[Dict[str, Any]] = None
|
|
|
|
|
|
class ReporteResponse(BaseSchema):
|
|
"""Schema de respuesta de generación de reporte."""
|
|
|
|
id: str # UUID del reporte
|
|
tipo: str
|
|
formato: str
|
|
estado: str # pendiente, procesando, completado, error
|
|
archivo_url: Optional[str] = None
|
|
creado_en: datetime
|
|
completado_en: Optional[datetime] = None
|
|
error: Optional[str] = None
|
|
|
|
|
|
class ReporteViajesResumen(BaseSchema):
|
|
"""Schema para reporte de viajes."""
|
|
|
|
periodo_inicio: datetime
|
|
periodo_fin: datetime
|
|
total_viajes: int
|
|
distancia_total_km: float
|
|
tiempo_total_conduccion: str
|
|
velocidad_promedio: float
|
|
|
|
por_vehiculo: List[dict]
|
|
por_conductor: List[dict]
|
|
viajes: List[dict]
|
|
|
|
|
|
class ReporteAlertasResumen(BaseSchema):
|
|
"""Schema para reporte de alertas."""
|
|
|
|
periodo_inicio: datetime
|
|
periodo_fin: datetime
|
|
total_alertas: int
|
|
atendidas: int
|
|
pendientes: int
|
|
|
|
por_tipo: List[dict]
|
|
por_severidad: List[dict]
|
|
por_vehiculo: List[dict]
|
|
alertas: List[dict]
|
|
|
|
|
|
class ReporteCombustibleResumen(BaseSchema):
|
|
"""Schema para reporte de combustible."""
|
|
|
|
periodo_inicio: datetime
|
|
periodo_fin: datetime
|
|
total_litros: float
|
|
total_costo: float
|
|
rendimiento_promedio: float
|
|
|
|
por_vehiculo: List[dict]
|
|
cargas: List[dict]
|
|
|
|
|
|
class ReporteMantenimientoResumen(BaseSchema):
|
|
"""Schema para reporte de mantenimiento."""
|
|
|
|
periodo_inicio: datetime
|
|
periodo_fin: datetime
|
|
total_mantenimientos: int
|
|
completados: int
|
|
pendientes: int
|
|
vencidos: int
|
|
costo_total: float
|
|
|
|
por_tipo: List[dict]
|
|
por_vehiculo: List[dict]
|
|
mantenimientos: List[dict]
|
|
|
|
|
|
class ReporteUbicacionesResumen(BaseSchema):
|
|
"""Schema para reporte de ubicaciones/recorridos."""
|
|
|
|
periodo_inicio: datetime
|
|
periodo_fin: datetime
|
|
vehiculo_id: int
|
|
vehiculo_nombre: str
|
|
total_puntos: int
|
|
distancia_km: float
|
|
|
|
# Ruta en GeoJSON
|
|
ruta_geojson: dict
|
|
|
|
|
|
class EstadisticasFlota(BaseSchema):
|
|
"""Schema para estadísticas generales de la flota."""
|
|
|
|
periodo: str # diario, semanal, mensual
|
|
|
|
# Distancia
|
|
distancia_total_km: float
|
|
distancia_promedio_vehiculo_km: float
|
|
|
|
# Tiempo
|
|
tiempo_conduccion_total_horas: float
|
|
tiempo_ocioso_total_horas: float
|
|
|
|
# Combustible
|
|
combustible_total_litros: float
|
|
costo_combustible_total: float
|
|
rendimiento_promedio: float
|
|
|
|
# Alertas
|
|
alertas_total: int
|
|
alertas_por_vehiculo_promedio: float
|
|
|
|
# Mantenimiento
|
|
costo_mantenimiento_total: float
|
|
|
|
# Top vehículos
|
|
top_distancia: List[dict] # [{vehiculo_id, nombre, km}]
|
|
top_alertas: List[dict] # [{vehiculo_id, nombre, cantidad}]
|
|
top_combustible: List[dict] # [{vehiculo_id, nombre, litros}]
|
|
|
|
|
|
class KPIsFlota(BaseSchema):
|
|
"""Schema para KPIs de la flota."""
|
|
|
|
# Utilización
|
|
porcentaje_utilizacion: float # % de vehículos en uso
|
|
horas_promedio_uso_diario: float
|
|
|
|
# Eficiencia
|
|
km_por_litro_flota: float
|
|
costo_por_km: float
|
|
|
|
# Seguridad
|
|
alertas_por_1000km: float
|
|
excesos_velocidad_por_1000km: float
|
|
|
|
# Mantenimiento
|
|
porcentaje_mantenimientos_a_tiempo: float
|
|
costo_mantenimiento_por_km: float
|
|
|
|
# Disponibilidad
|
|
porcentaje_disponibilidad: float # % de tiempo operativo
|
|
|
|
# Comparación con periodo anterior
|
|
variacion_km: float # % vs periodo anterior
|
|
variacion_combustible: float
|
|
variacion_alertas: float
|
|
variacion_costo: float
|