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,319 +1,287 @@
<!-- 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) {
try {
const response = await getAplicacion(id);
paraderoData = response;
nombreParadero = response.NombreParadero
console.log({ nombreParadero })
} catch (error) {
console.error("Error de red: ", error);
}
} }
});
async function fetchParaderoData(id) { let buses = [
try { { numero: 10, color: "green" },
{ numero: 10, color: "turquoise" },
const response = await getAplicacion(id); { numero: 10, color: "violet" },
console.log(response) { numero: 10, color: "orange" },
{ numero: 10, color: "blue" },
paraderoData = response; { numero: 10, color: "red" },
];
} catch (error) {
console.error('Error de red: ', error); function getCircleColor(numero) {
// Puedes personalizar esta función para asignar colores según tus preferencias
switch (numero) {
case 10:
return "darkorange";
default:
return "gray";
}
} }
}
const colores = [
let buses = [ "#5fbabe",
{ numero: 10, color: 'green' }, "#f05eb1",
{ numero: 10, color: 'turquoise' }, "#5fab88",
{ numero: 10, color: 'violet' }, "#f7646c",
{ numero: 10, color: 'orange' }, "#5e66b5",
{ numero: 10, color: 'blue' }, "#73776e",
{ numero: 10, color: 'red' }, ];
];
function getCircleColor(numero) { // Función para obtener un color aleatorio de la lista
// Puedes personalizar esta función para asignar colores según tus preferencias function getColorAleatorio(index) {
switch (numero) { return colores[index % 6];
case 10:
return 'darkorange';
default:
return 'gray';
} }
}
const colores = ["#5fbabe", "#f05eb1", " #5fab88", "#f7646c", "#5e66b5", "#73776e"]; // Función para calcular la diferencia en minutos entre la hora actual y la hora planificada
function calcularDiferenciaMinutos(horaPlanificada) {
const horaActual = new Date();
// Función para obtener un color aleatorio de la lista const horaPlanificadaArray = horaPlanificada.split(":");
function getColorAleatorio(index) { const horaPlanificadaDate = new Date(
return colores[index%6]; horaActual.getFullYear(),
} horaActual.getMonth(),
horaActual.getDate(),
horaPlanificadaArray[0],
horaPlanificadaArray[1],
);
// Función para calcular la diferencia en minutos entre la hora actual y la hora planificada const diferenciaMilisegundos =
function calcularDiferenciaMinutos(horaPlanificada) { horaPlanificadaDate.getTime() - horaActual.getTime();
const horaActual = new Date(); const diferenciaMinutos = Math.abs(
Math.floor(diferenciaMilisegundos / (1000 * 60)),
const horaPlanificadaArray = horaPlanificada.split(':'); );
const horaPlanificadaDate = new Date(
horaActual.getFullYear(),
horaActual.getMonth(),
horaActual.getDate(),
horaPlanificadaArray[0],
horaPlanificadaArray[1]
);
const diferenciaMilisegundos = horaPlanificadaDate.getTime() - horaActual.getTime(); return diferenciaMinutos;
const diferenciaMinutos = Math.abs(Math.floor(diferenciaMilisegundos / (1000 * 60)));
console.log(diferenciaMinutos)
return diferenciaMinutos;
}
// Función para determinar el texto de la hora según la diferencia en minutos
function obtenerTextoHora(horaPlanificada) {
const diferenciaMinutos = calcularDiferenciaMinutos(horaPlanificada);
if (diferenciaMinutos <= 3) {
return "< a 3 Minutos";
} else if (diferenciaMinutos <= 5) {
return "3-5 Minutos";
} else if (diferenciaMinutos <= 10) {
return "Menos de 10 minutos";
} else {
return "Más de 10 minutos";
} }
}
function LetraoNumeroMicro(cadena, flag) {
if (!cadena || (flag !== 0 && flag !== 1)) {
return "Error: Entrada no válida";
}
// Extraer el número y la letra // Función para determinar el texto de la hora según la diferencia en minutos
let numero = ""; function formatTimeMinutes({ EstimadaGPS: horaPlanificada, patente }) {
let letra = ""; // const diferenciaMinutos = calcularDiferenciaMinutos(horaPlanificada);
let i = 0; const horaActual = new Date();
// Caso en el que la cadena tenga un numero primero const horaUtc = horaActual.toISOString().substring(0,10) + 'T' + horaPlanificada + 'Z'
if(!isNaN(parseInt(cadena[i]))) { const horaTrayecto = new Date(horaUtc);
// Obtener el número const diferenciaMinutos = (horaTrayecto.getTime() - horaActual.getTime()) / (1000 * 60)
while (i < cadena.length && !isNaN(parseInt(cadena[i]))) {
numero += cadena[i];
i++;
}
// Obtener la letra (si hay) console.log({ patente, horaActual, horaTrayecto, horaPlanificada, diferenciaMinutos })
while (i < cadena.length) {
letra += cadena[i];
i++;
}
if (flag === 0) { if (diferenciaMinutos <= 3) {
return numero ? numero : "Error: No se encontró un número"; return "< a 3 Minutos";
} else if (flag === 1) { } else if (diferenciaMinutos <= 5) {
return letra ? letra : "Error: No se encontró una letra"; return "3-5 Minutos";
} } else if (diferenciaMinutos <= 10) {
} return "Menos de 10 minutos";
else { } else {
// Obtener la letra (si hay) return "Más de 10 minutos";
while (i < cadena.length && isNaN(parseInt(cadena[i]))) { }
letra += cadena[i]; }
i++; function LetraoNumeroMicro(cadena, flag) {
} if (!cadena || (flag !== 0 && flag !== 1)) {
return "Error: Entrada no válida";
}
// Obtener el número // Extraer el número y la letra
while (i < cadena.length ) { let numero = "";
numero += cadena[i]; let letra = "";
i++; let i = 0;
} // Caso en el que la cadena tenga un numero primero
if (!isNaN(parseInt(cadena[i]))) {
// Obtener el número
while (i < cadena.length && !isNaN(parseInt(cadena[i]))) {
numero += cadena[i];
i++;
}
if (flag === 1) { // Obtener la letra (si hay)
return numero ? numero : "Error: No se encontró un número"; while (i < cadena.length) {
} else if (flag === 0) { letra += cadena[i];
return letra ? letra : "Error: No se encontró una letra"; i++;
} }
} if (flag === 0) {
} return numero ? numero : "Error: No se encontró un número";
} else if (flag === 1) {
return letra ? letra : "Error: No se encontró una letra";
}
} else {
// Obtener la letra (si hay)
while (i < cadena.length && isNaN(parseInt(cadena[i]))) {
letra += cadena[i];
i++;
}
// Obtener el número
while (i < cadena.length) {
numero += cadena[i];
i++;
}
if (flag === 1) {
return numero ? numero : "Error: No se encontró un número";
} else if (flag === 0) {
return letra ? letra : "Error: No se encontró una letra";
}
}
}
</script> </script>
<!-- Resto del componente para mostrar los datos -->
<!--
<main>
<h1>Información del Paradero</h1>
<p>Detalles del paradero:</p>
{#if paraderoData}
<pre>{JSON.stringify(paraderoData, null, 2)}</pre>
{:else}
<p>Cargando datos...</p>
{/if}
</main> -->
<style>
/* Estilos generales */
.contenedor {
display: flex;
flex-direction: column;
align-items: center;
width: 800px;
margin: 0 auto; /* Centra el contenedor en la pantalla */
}
.rectangulo-naranja {
/* Ancho máximo para que no se vea excesivamente ancho */
width: 800px;
height: 200px;
background-color: #ffa976;
border-radius: 20px 20px 0 0;
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px;
}
.nombre-paradero {
font-size: 28px;
font-weight: bold;
color:#fff;
margin-right: 10px;
margin-left: 120px;
}
.rectangulo-gris {
/* Ancho máximo */
width: 820px;
height: 40px;
background-color: #8c8b8d;
display: flex;
align-items: center;
padding-left:20px;
color:#fff
}
.cuadricula {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 1fr);
gap: 5px;
margin-top: 10px;
/* Ancho máximo */
}
.rectangulo-pequeno {
position: relative;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
width: 266px;
height: 120px;
border: 1px solid #000000;
overflow: hidden;
}
.numero-micro {
font-size: 60px;
font-weight: bold;
margin-right: 80px;
color: #8c8b8d;
}
.circulo-letra {
width: 45px;
height: 45px;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 14px;
font-weight: bold;
color: #fff;
position: absolute;
bottom: 10px;
right: 10px;
margin-bottom: 35px;
margin-right: 60px;
}
.hora {
margin-top: 5px;
background-color: #2196f3;
color: #fff;
width: 266px;
}
</style>
<div class="contenedor"> <div class="contenedor">
<div class="rectangulo-naranja"> <div class="rectangulo-naranja">
<img src={ImagenBus} alt="Bus" width="200" /> <img src={ImagenBus} alt="Bus" width="200" />
<div class="nombre-paradero">Nombre de Paradero</div> <div class="nombre-paradero">{nombreParadero}</div>
</div> </div>
<div class="rectangulo-gris">Buses que se detienen en esta parada</div> <div class="rectangulo-gris">Buses que se detienen en esta parada</div>
<div class="cuadricula"> <div class="cuadricula">
{#if paraderoData} {#if paraderoData}
{#each paraderoData.DetalleLineas as linea, index}
<!-- <div class="rectangulo-pequeno">
{#each paraderoData.DetalleLineas as linea} <div style="position: relative;">
{#each linea.Llegadas as llegada,index} <div class="numero-micro">
<div class="rectangulo-pequeno" > {LetraoNumeroMicro(linea.Descripcion, 0)}
<div class="numero-micro">{llegada.Patente.split('-')[1]}</div> </div>
<div class="circulo-letra" style="background-color: {getColorAleatorio(index)}">{llegada.Patente.charAt(0)}</div> <div class="circulo-letra" style="background-color: #{linea.colorFondo || '#5fbabe'}">
<div class="hora" style="background-color: {getColorAleatorio(index)}">{obtenerTextoHora(llegada.Planificada)} </div> {LetraoNumeroMicro(linea.Descripcion, 1)}
</div> </div>
{/each}colorFondo </div>
{/each} <div class="hora" style="background-color: #{linea.colorFondo || '#5fbabe'}">
--> <div>{linea.Linea}</div>
{#each paraderoData.DetalleLineas as linea,index} {#if linea.Llegadas[0]?.EstimadaGPS}
<div class="rectangulo-pequeno" > {formatTimeMinutes(linea.Llegadas[0])}
<div class="numero-micro">{LetraoNumeroMicro(linea.Descripcion,0)}</div> ({linea.Llegadas[0].patente})
{#if linea.colorFondo} {:else}
<div class="circulo-letra" style="background-color: #{linea.colorFondo}">{LetraoNumeroMicro(linea.Descripcion,1)}</div> Sin información
<div class="hora" style="background-color: #{linea.colorFondo}">{obtenerTextoHora(linea.Llegadas[0].EstimadaGPS)} </div> {/if}
</div>
</div>
{/each}
{:else} {:else}
<div class="circulo-letra" style="background-color: #5fbabe">{LetraoNumeroMicro(linea.Descripcion,1)}</div> <p>Cargando datos...</p>
<div class="hora" style="background-color: #5fbabe">{obtenerTextoHora(linea.Llegadas[0].EstimadaGPS)} </div> {/if}
{/if} </div>
</div>
{/each}
{:else}
<p>Cargando datos...</p>
{/if}
</div>
</div> </div>
<style>
/* Estilos generales */
.contenedor {
display: flex;
flex-direction: column;
align-items: center;
width: 800px;
margin: 0 auto; /* Centra el contenedor en la pantalla */
}
.rectangulo-naranja {
/* Ancho máximo para que no se vea excesivamente ancho */
width: 800px;
height: 200px;
background-color: #ffa976;
border-radius: 20px 20px 0 0;
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px;
}
.nombre-paradero {
font-size: 28px;
font-weight: bold;
color: #fff;
margin-right: 10px;
margin-left: 120px;
}
.rectangulo-gris {
/* Ancho máximo */
width: 820px;
height: 40px;
background-color: #8c8b8d;
display: flex;
align-items: center;
padding-left: 20px;
color: #fff;
}
.cuadricula {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 1fr);
gap: 5px;
margin-top: 10px;
/* Ancho máximo */
}
.rectangulo-pequeno {
position: relative;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
width: 266px;
min-height: 120px;
border: 1px solid #000000;
overflow: hidden;
}
.numero-micro {
font-size: 60px;
font-weight: bold;
margin-right: 100px;
color: #8c8b8d;
}
.circulo-letra {
width: 45px;
height: 45px;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 14px;
font-weight: bold;
color: #fff;
position: absolute;
top: 25px;
right: 10px;
}
.hora {
margin-top: 5px;
background-color: #2196f3;
color: #fff;
width: 266px;
}
</style>