fix: mejorar el calculo de ETA usando duracion estimada de la BD y corregir etiquetas de tiempo en la interfaz
This commit is contained in:
@ -90,7 +90,7 @@
|
|||||||
<div class="flex flex-col mt-0.5 gap-0.5">
|
<div class="flex flex-col mt-0.5 gap-0.5">
|
||||||
<span class="text-xs font-semibold text-gray-500 dark:text-gray-400 flex items-center gap-1">
|
<span class="text-xs font-semibold text-gray-500 dark:text-gray-400 flex items-center gap-1">
|
||||||
<span class="material-icons" style="font-size: 14px">schedule</span>
|
<span class="material-icons" style="font-size: 14px">schedule</span>
|
||||||
{{ bus.estado === 'pasó' ? 'Salió a las' : 'Sale a las' }} {{ bus.hora_salida }}
|
{{ (bus.estado === 'en_camino' || bus.estado === 'pasó') ? 'Salió a las' : 'Sale a las' }} {{ bus.hora_salida }}
|
||||||
</span>
|
</span>
|
||||||
<span class="text-[11px] font-medium text-gray-500 dark:text-gray-400 pl-4">
|
<span class="text-[11px] font-medium text-gray-500 dark:text-gray-400 pl-4">
|
||||||
<span v-if="bus.estado === 'pasó'">Pasó por tu parada a las</span>
|
<span v-if="bus.estado === 'pasó'">Pasó por tu parada a las</span>
|
||||||
|
|||||||
@ -78,7 +78,7 @@ export function useETA() {
|
|||||||
const [routeRes, stopsRes] = await Promise.all([
|
const [routeRes, stopsRes] = await Promise.all([
|
||||||
supabase
|
supabase
|
||||||
.from('routes')
|
.from('routes')
|
||||||
.select('distance_km, average_speed_kmh')
|
.select('distance_km, average_speed_kmh, estimated_duration_minutes')
|
||||||
.eq('id', ruta_id)
|
.eq('id', ruta_id)
|
||||||
.single(),
|
.single(),
|
||||||
supabase
|
supabase
|
||||||
@ -107,6 +107,13 @@ export function useETA() {
|
|||||||
}
|
}
|
||||||
distanciaAcumuladaKm *= 1.2;
|
distanciaAcumuladaKm *= 1.2;
|
||||||
const velocidad = routeData.average_speed_kmh || VELOCIDAD_PROMEDIO_KMH;
|
const velocidad = routeData.average_speed_kmh || VELOCIDAD_PROMEDIO_KMH;
|
||||||
|
|
||||||
|
// Si la ruta tiene una duración estimada en BD, la usamos como base para el trayecto total
|
||||||
|
// y calculamos la proporción según la parada.
|
||||||
|
if (routeData.estimated_duration_minutes && routeData.distance_km) {
|
||||||
|
const proporcionDistancia = distanciaAcumuladaKm / (routeData.distance_km * 1.2);
|
||||||
|
minutosHastaParada = routeData.estimated_duration_minutes * proporcionDistancia;
|
||||||
|
} else {
|
||||||
const tiempoViajeMinutos = (distanciaAcumuladaKm / velocidad) * 60;
|
const tiempoViajeMinutos = (distanciaAcumuladaKm / velocidad) * 60;
|
||||||
const numeroParadas = targetStopIndex;
|
const numeroParadas = targetStopIndex;
|
||||||
const tiempoParadasMinutos = (numeroParadas * TIEMPO_PARADA_SEGUNDOS) / 60;
|
const tiempoParadasMinutos = (numeroParadas * TIEMPO_PARADA_SEGUNDOS) / 60;
|
||||||
@ -114,6 +121,7 @@ export function useETA() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// PASO 3: Calcular ETA para cada salida
|
// PASO 3: Calcular ETA para cada salida
|
||||||
const ahora = new Date();
|
const ahora = new Date();
|
||||||
@ -135,16 +143,23 @@ export function useETA() {
|
|||||||
|
|
||||||
// Si ya salió, el trayecto restante es base - transcurrido. Si no ha salido, es el base completo.
|
// Si ya salió, el trayecto restante es base - transcurrido. Si no ha salido, es el base completo.
|
||||||
const minutosTransitoRestante = Math.max(0, minutosTransitoBase - minutosTranscurridosDesdeSalida);
|
const minutosTransitoRestante = Math.max(0, minutosTransitoBase - minutosTranscurridosDesdeSalida);
|
||||||
|
|
||||||
const etaMinutos = minutosEsperaSalida + minutosTransitoRestante;
|
const etaMinutos = minutosEsperaSalida + minutosTransitoRestante;
|
||||||
|
|
||||||
const minutosLlegadaEstablecidos = minutosSalida + minutosTransitoBase;
|
const minutosLlegadaEstablecidos = minutosSalida + minutosTransitoBase;
|
||||||
|
|
||||||
|
// Logging para depuración (solo en desarrollo)
|
||||||
|
if (import.meta.env.DEV) {
|
||||||
|
console.log(`SIBU | Bus ${salida}: Ahora=${minutosAhora}, Salida=${minutosSalida}, Espera=${minutosEsperaSalida}, TransitoRest=${Math.round(minutosTransitoRestante)}, ETA=${Math.round(etaMinutos)}`);
|
||||||
|
}
|
||||||
|
|
||||||
const horaLlegada = format12h(minutosLlegadaEstablecidos);
|
const horaLlegada = format12h(minutosLlegadaEstablecidos);
|
||||||
const horaSalidaFormato = format12h(minutosSalida);
|
const horaSalidaFormato = format12h(minutosSalida);
|
||||||
|
|
||||||
let estado: BusETA['estado'];
|
let estado: BusETA['estado'];
|
||||||
|
const busYaSalio = minutosAhora >= minutosSalida;
|
||||||
|
|
||||||
if (etaMinutos > 5) {
|
if (etaMinutos > 5) {
|
||||||
estado = (minutosAhora >= minutosSalida) ? 'en_camino' : 'próximo';
|
estado = busYaSalio ? 'en_camino' : 'próximo';
|
||||||
} else if (etaMinutos >= -2) {
|
} else if (etaMinutos >= -2) {
|
||||||
estado = 'en_camino';
|
estado = 'en_camino';
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user