@page "/ordenes" @attribute [Authorize] @inject IWorkshopService WorkshopSvc @inject NavigationManager Nav @inject IDialogService DialogSvc @inject ISnackbar Snackbar Órdenes de Trabajo - AutoTaller ERP
@foreach (var col in columnasKanban) {
@col.Titulo @OrdenesEnEstado(col.Estado).Count()
@foreach (var ot in OrdenesEnEstado(col.Estado)) {
@ot.Numero @if (ot.Prioridad == PrioridadOT.Urgente) { }
@ot.Vehiculo · @ot.Placa @ot.Cliente @if (!string.IsNullOrEmpty(ot.Tecnico)) {
@ot.Tecnico
}
@ot.FechaIngreso.ToString("dd/MM HH:mm") S/. @ot.Total.ToString("N0")
} @if (!OrdenesEnEstado(col.Estado).Any()) {
Sin OTs
}
}
Todos Recibido En diagnóstico En reparación En espera de repuesto Control de calidad Listo Entregado Cancelado @total OT(s)
N° OT Fecha Cliente Vehículo Estado Técnico Prioridad Total Acciones @context.Numero @context.FechaIngreso.ToString("dd/MM/yyyy HH:mm") @context.Cliente @context.Vehiculo @context.Placa @EstadoTexto(context.Estado) @(context.Tecnico ?? "—") @context.Prioridad S/. @context.Total.ToString("N2") No hay órdenes para los filtros aplicados @if (totalPages > 1) {
}
@code { private record ColumnaKanban(EstadoOT Estado, string Titulo, Color Color); private readonly ColumnaKanban[] columnasKanban = new[] { new ColumnaKanban(EstadoOT.Recibido, "Recibido", Color.Default), new ColumnaKanban(EstadoOT.EnDiagnostico, "Diagnóstico", Color.Info), new ColumnaKanban(EstadoOT.EnReparacion, "Reparación", Color.Primary), new ColumnaKanban(EstadoOT.EnEsperaRepuesto, "Esperando", Color.Warning), new ColumnaKanban(EstadoOT.ControlCalidad, "QC", Color.Tertiary), new ColumnaKanban(EstadoOT.Listo, "Listo", Color.Success), }; private List ordenesActivas = new(); private List ordenesTabla = new(); private bool cargando = true; private string? buscar; private EstadoOT? estadoFiltro; private int page = 1; private const int pageSize = 15; private int total = 0; private int totalPages = 0; private CancellationTokenSource? _debounceCts; protected override async Task OnInitializedAsync() { await CargarKanbanAsync(); await CargarTablaAsync(); } private async Task CargarKanbanAsync() { ordenesActivas = await WorkshopSvc.ListarTodasOrdenesAsync(); } private async Task CargarTablaAsync() { cargando = true; var resultado = await WorkshopSvc.ListarOrdenesAsync(buscar, estadoFiltro, page, pageSize); ordenesTabla = resultado.Items; total = resultado.Total; totalPages = resultado.TotalPages; cargando = false; } private async Task OnBuscarChanged() { _debounceCts?.Cancel(); _debounceCts = new CancellationTokenSource(); var token = _debounceCts.Token; try { await Task.Delay(350, token); page = 1; await CargarTablaAsync(); } catch (TaskCanceledException) { } } private async Task OnPageChanged(int p) { page = p; await CargarTablaAsync(); } private IEnumerable OrdenesEnEstado(EstadoOT estado) => ordenesActivas.Where(o => o.Estado == estado); private void VerDetalle(int id) => Nav.NavigateTo($"/ordenes/{id}"); private async Task CambiarEstado(OrdenTrabajoListDto ot) { var parametros = new DialogParameters { ["OT"] = ot }; var opciones = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true }; var dialog = await DialogSvc.ShowAsync("Cambiar estado", parametros, opciones); var r = await dialog.Result; if (r is { Canceled: false }) { Snackbar.Add("Estado actualizado", Severity.Success); await CargarKanbanAsync(); await CargarTablaAsync(); } } private static Color EstadoColor(EstadoOT e) => e switch { EstadoOT.Recibido => Color.Default, EstadoOT.EnDiagnostico => Color.Info, EstadoOT.EnReparacion => Color.Primary, EstadoOT.EnEsperaRepuesto => Color.Warning, EstadoOT.ControlCalidad => Color.Tertiary, EstadoOT.Listo => Color.Success, EstadoOT.Entregado => Color.Success, EstadoOT.Cancelado => Color.Error, _ => Color.Default }; private static string EstadoTexto(EstadoOT e) => e switch { EstadoOT.EnDiagnostico => "Diagnóstico", EstadoOT.EnReparacion => "Reparación", EstadoOT.EnEsperaRepuesto => "Esp. repuesto", EstadoOT.ControlCalidad => "Control calidad", _ => e.ToString() }; private static Color PrioridadColor(PrioridadOT p) => p switch { PrioridadOT.Urgente => Color.Error, PrioridadOT.Alta => Color.Warning, PrioridadOT.Normal => Color.Info, PrioridadOT.Baja => Color.Default, _ => Color.Default }; }