correccion de tiempo llegada

master
Francisco Sandoval 2024-03-02 19:09:35 -03:00
parent e28bc5fb7e
commit a3d09bde97
1 changed files with 253 additions and 285 deletions

View File

@ -1,59 +1,61 @@
<!-- frontend/src/ParaderoInfo.svelte --> <!-- frontend/src/ParaderoInfo.svelte -->
<script> <script>
import { onMount } from 'svelte'; import { onMount } from "svelte";
import { getAplicacion } from "../services/getinfodevice"; import { getAplicacion } from "../services/getinfodevice";
import ImagenBus from '../assets/zyro-image.png' import ImagenBus from "../assets/zyro-image.png";
let paraderoData = null; let paraderoData = null;
let nombreParadero = 'Cargando información'
onMount(() => { onMount(() => {
const urlParams = new URLSearchParams(window.location.search); const urlParams = new URLSearchParams(window.location.search);
const id = urlParams.get('id'); const id = urlParams.get("id");
if (id) { if (id) {
fetchParaderoData(id); fetchParaderoData(id);
} else { } else {
console.error('ID no encontrado en la URL.'); console.error("ID no encontrado en la URL.");
} }
}); });
async function fetchParaderoData(id) { async function fetchParaderoData(id) {
try { try {
const response = await getAplicacion(id); const response = await getAplicacion(id);
console.log(response)
paraderoData = response; paraderoData = response;
nombreParadero = response.NombreParadero
console.log({ nombreParadero })
} catch (error) { } catch (error) {
console.error('Error de red: ', error); console.error("Error de red: ", error);
} }
} }
let buses = [ let buses = [
{ numero: 10, color: 'green' }, { numero: 10, color: "green" },
{ numero: 10, color: 'turquoise' }, { numero: 10, color: "turquoise" },
{ numero: 10, color: 'violet' }, { numero: 10, color: "violet" },
{ numero: 10, color: 'orange' }, { numero: 10, color: "orange" },
{ numero: 10, color: 'blue' }, { numero: 10, color: "blue" },
{ numero: 10, color: 'red' }, { numero: 10, color: "red" },
]; ];
function getCircleColor(numero) { function getCircleColor(numero) {
// Puedes personalizar esta función para asignar colores según tus preferencias // Puedes personalizar esta función para asignar colores según tus preferencias
switch (numero) { switch (numero) {
case 10: case 10:
return 'darkorange'; return "darkorange";
default: default:
return 'gray'; return "gray";
} }
} }
const colores = ["#5fbabe", "#f05eb1", " #5fab88", "#f7646c", "#5e66b5", "#73776e"]; const colores = [
"#5fbabe",
"#f05eb1",
"#5fab88",
"#f7646c",
"#5e66b5",
"#73776e",
];
// Función para obtener un color aleatorio de la lista // Función para obtener un color aleatorio de la lista
function getColorAleatorio(index) { function getColorAleatorio(index) {
@ -64,25 +66,34 @@
function calcularDiferenciaMinutos(horaPlanificada) { function calcularDiferenciaMinutos(horaPlanificada) {
const horaActual = new Date(); const horaActual = new Date();
const horaPlanificadaArray = horaPlanificada.split(':'); const horaPlanificadaArray = horaPlanificada.split(":");
const horaPlanificadaDate = new Date( const horaPlanificadaDate = new Date(
horaActual.getFullYear(), horaActual.getFullYear(),
horaActual.getMonth(), horaActual.getMonth(),
horaActual.getDate(), horaActual.getDate(),
horaPlanificadaArray[0], horaPlanificadaArray[0],
horaPlanificadaArray[1] horaPlanificadaArray[1],
); );
const diferenciaMilisegundos = horaPlanificadaDate.getTime() - horaActual.getTime(); const diferenciaMilisegundos =
const diferenciaMinutos = Math.abs(Math.floor(diferenciaMilisegundos / (1000 * 60))); horaPlanificadaDate.getTime() - horaActual.getTime();
console.log(diferenciaMinutos) const diferenciaMinutos = Math.abs(
Math.floor(diferenciaMilisegundos / (1000 * 60)),
);
return diferenciaMinutos; return diferenciaMinutos;
} }
// Función para determinar el texto de la hora según la diferencia en minutos // Función para determinar el texto de la hora según la diferencia en minutos
function obtenerTextoHora(horaPlanificada) { function formatTimeMinutes({ EstimadaGPS: horaPlanificada, patente }) {
const diferenciaMinutos = calcularDiferenciaMinutos(horaPlanificada); // const diferenciaMinutos = calcularDiferenciaMinutos(horaPlanificada);
const horaActual = new Date();
const horaUtc = horaActual.toISOString().substring(0,10) + 'T' + horaPlanificada + 'Z'
const horaTrayecto = new Date(horaUtc);
const diferenciaMinutos = (horaTrayecto.getTime() - horaActual.getTime()) / (1000 * 60)
console.log({ patente, horaActual, horaTrayecto, horaPlanificada, diferenciaMinutos })
if (diferenciaMinutos <= 3) { if (diferenciaMinutos <= 3) {
return "< a 3 Minutos"; return "< a 3 Minutos";
@ -105,7 +116,6 @@
let i = 0; let i = 0;
// Caso en el que la cadena tenga un numero primero // Caso en el que la cadena tenga un numero primero
if (!isNaN(parseInt(cadena[i]))) { if (!isNaN(parseInt(cadena[i]))) {
// Obtener el número // Obtener el número
while (i < cadena.length && !isNaN(parseInt(cadena[i]))) { while (i < cadena.length && !isNaN(parseInt(cadena[i]))) {
numero += cadena[i]; numero += cadena[i];
@ -123,8 +133,7 @@
} else if (flag === 1) { } else if (flag === 1) {
return letra ? letra : "Error: No se encontró una letra"; return letra ? letra : "Error: No se encontró una letra";
} }
} } else {
else {
// Obtener la letra (si hay) // Obtener la letra (si hay)
while (i < cadena.length && isNaN(parseInt(cadena[i]))) { while (i < cadena.length && isNaN(parseInt(cadena[i]))) {
letra += cadena[i]; letra += cadena[i];
@ -142,30 +151,44 @@ else {
} else if (flag === 0) { } else if (flag === 0) {
return letra ? letra : "Error: No se encontró una letra"; return letra ? letra : "Error: No se encontró una letra";
} }
} }
} }
</script> </script>
<!-- Resto del componente para mostrar los datos --> <div class="contenedor">
<!-- <div class="rectangulo-naranja">
<main> <img src={ImagenBus} alt="Bus" width="200" />
<h1>Información del Paradero</h1> <div class="nombre-paradero">{nombreParadero}</div>
<p>Detalles del paradero:</p> </div>
<div class="rectangulo-gris">Buses que se detienen en esta parada</div>
<div class="cuadricula">
{#if paraderoData} {#if paraderoData}
<pre>{JSON.stringify(paraderoData, null, 2)}</pre> {#each paraderoData.DetalleLineas as linea, index}
<div class="rectangulo-pequeno">
<div style="position: relative;">
<div class="numero-micro">
{LetraoNumeroMicro(linea.Descripcion, 0)}
</div>
<div class="circulo-letra" style="background-color: #{linea.colorFondo || '#5fbabe'}">
{LetraoNumeroMicro(linea.Descripcion, 1)}
</div>
</div>
<div class="hora" style="background-color: #{linea.colorFondo || '#5fbabe'}">
<div>{linea.Linea}</div>
{#if linea.Llegadas[0]?.EstimadaGPS}
{formatTimeMinutes(linea.Llegadas[0])}
({linea.Llegadas[0].patente})
{:else}
Sin información
{/if}
</div>
</div>
{/each}
{:else} {:else}
<p>Cargando datos...</p> <p>Cargando datos...</p>
{/if} {/if}
</main> --> </div>
</div>
<style> <style>
@ -197,11 +220,9 @@ else {
color: #fff; color: #fff;
margin-right: 10px; margin-right: 10px;
margin-left: 120px; margin-left: 120px;
} }
.rectangulo-gris { .rectangulo-gris {
/* Ancho máximo */ /* Ancho máximo */
width: 820px; width: 820px;
height: 40px; height: 40px;
@ -209,8 +230,7 @@ else {
display: flex; display: flex;
align-items: center; align-items: center;
padding-left: 20px; padding-left: 20px;
color:#fff color: #fff;
} }
.cuadricula { .cuadricula {
@ -231,7 +251,7 @@ else {
align-items: center; align-items: center;
text-align: center; text-align: center;
width: 266px; width: 266px;
height: 120px; min-height: 120px;
border: 1px solid #000000; border: 1px solid #000000;
overflow: hidden; overflow: hidden;
} }
@ -239,7 +259,7 @@ else {
.numero-micro { .numero-micro {
font-size: 60px; font-size: 60px;
font-weight: bold; font-weight: bold;
margin-right: 80px; margin-right: 100px;
color: #8c8b8d; color: #8c8b8d;
} }
@ -254,10 +274,8 @@ else {
font-weight: bold; font-weight: bold;
color: #fff; color: #fff;
position: absolute; position: absolute;
bottom: 10px; top: 25px;
right: 10px; right: 10px;
margin-bottom: 35px;
margin-right: 60px;
} }
.hora { .hora {
@ -265,55 +283,5 @@ else {
background-color: #2196f3; background-color: #2196f3;
color: #fff; color: #fff;
width: 266px; width: 266px;
} }
</style> </style>
<div class="contenedor">
<div class="rectangulo-naranja">
<img src={ImagenBus} alt="Bus" width="200" />
<div class="nombre-paradero">Nombre de Paradero</div>
</div>
<div class="rectangulo-gris">Buses que se detienen en esta parada</div>
<div class="cuadricula">
{#if paraderoData}
<!--
{#each paraderoData.DetalleLineas as linea}
{#each linea.Llegadas as llegada,index}
<div class="rectangulo-pequeno" >
<div class="numero-micro">{llegada.Patente.split('-')[1]}</div>
<div class="circulo-letra" style="background-color: {getColorAleatorio(index)}">{llegada.Patente.charAt(0)}</div>
<div class="hora" style="background-color: {getColorAleatorio(index)}">{obtenerTextoHora(llegada.Planificada)} </div>
</div>
{/each}colorFondo
{/each}
-->
{#each paraderoData.DetalleLineas as linea,index}
<div class="rectangulo-pequeno" >
<div class="numero-micro">{LetraoNumeroMicro(linea.Descripcion,0)}</div>
{#if linea.colorFondo}
<div class="circulo-letra" style="background-color: #{linea.colorFondo}">{LetraoNumeroMicro(linea.Descripcion,1)}</div>
<div class="hora" style="background-color: #{linea.colorFondo}">{obtenerTextoHora(linea.Llegadas[0].EstimadaGPS)} </div>
{:else}
<div class="circulo-letra" style="background-color: #5fbabe">{LetraoNumeroMicro(linea.Descripcion,1)}</div>
<div class="hora" style="background-color: #5fbabe">{obtenerTextoHora(linea.Llegadas[0].EstimadaGPS)} </div>
{/if}
</div>
{/each}
{:else}
<p>Cargando datos...</p>
{/if}
</div>
</div>