diff --git a/MP.INVENTORY/Components/DataPager.razor.cs b/MP.INVENTORY/Components/DataPager.razor.cs new file mode 100644 index 00000000..3122ffb8 --- /dev/null +++ b/MP.INVENTORY/Components/DataPager.razor.cs @@ -0,0 +1,198 @@ +using Microsoft.AspNetCore.Components; + +namespace MP.INVENTORY.Components +{ + public partial class DataPager : ComponentBase + { + #region Public Properties + + [Parameter] + public int currPage + { + get + { + return _numPage; + } + set + { + bool doReport = !_numPage.Equals(value); + if (doReport) + { + _numPage = value; + reportChangePage(); + } + } + } + + [Parameter] + public EventCallback numPageChanged { get; set; } + + [Parameter] + public EventCallback numRecordChanged { get; set; } + + [Parameter] + public int PageSize + { + get + { + return _numRecord; + } + set + { + bool doReport = !_numRecord.Equals(value); + if (doReport) + { + _numRecord = value; + reportChange(); + resetCurrPage(); + } + } + } + + [Parameter] + public bool showLoading + { + get + { + return _showLoading; + } + set + { + if (value) + { + Random random = new Random(); + percLoading = random.Next(30, 90); + } + else + { + percLoading = 5; + } + _showLoading = value; + } + } + + [Parameter] + public int totalCount { get; set; } = 0; + + #endregion Public Properties + + #region Public Methods + + public void resetCurrPage() + { + //await Task.Delay(1); + currPage = 1; + } + + #endregion Public Methods + + #region Protected Fields + + protected bool _showLoading = false; + + #endregion Protected Fields + + #region Protected Properties + + protected int _numPage { get; set; } = 1; + + protected int _numRecord { get; set; } = 10; + + protected int percLoading { get; set; } = 0; + + #endregion Protected Properties + + #region Protected Methods + + protected string cssActive(int numPage) + { + string answ = ""; + if (numPage == currPage) + { + answ = "active"; + } + return answ; + } + + protected override async Task OnInitializedAsync() + { + await Task.Run(() => showLoading = false); + } + + protected void PaginationItemClick(int page) + { + currPage = page; + } + + #endregion Protected Methods + + #region Private Properties + + private int endPage + { + get + { + int answ = (int)(currPage / numPages) * numPages + numPages; + answ = answ < LastPage ? answ : LastPage; + return answ; + } + } + + private int LastPage + { + get + { + return Math.Max((int)Math.Ceiling(totalCount / (double)PageSize), 1); + } + } + + private int nextBlock + { + get + { + int answ = currPage + numPages; + answ = answ < LastPage ? answ : LastPage; + return answ; + } + } + + private int numPages { get; set; } = 10; + + private int prevBlock + { + get + { + int answ = currPage - numPages; + answ = answ > 0 ? answ : 1; + return answ; + } + } + + // calcola un set 1 .. numPages centrato sulla pagina corrente... + private int startPage + { + get + { + int answ = (int)(currPage / numPages) * numPages; + answ = answ > 0 ? answ : 1; + return answ; + } + } + + #endregion Private Properties + + #region Private Methods + + private void reportChange() + { + numRecordChanged.InvokeAsync(PageSize); + } + + private void reportChangePage() + { + numPageChanged.InvokeAsync(currPage); + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/MP.INVENTORY/Components/DossiersFilter.razor.cs b/MP.INVENTORY/Components/DossiersFilter.razor.cs new file mode 100644 index 00000000..bc066b9c --- /dev/null +++ b/MP.INVENTORY/Components/DossiersFilter.razor.cs @@ -0,0 +1,173 @@ +using Microsoft.AspNetCore.Components; +using MP.INVENTORY.Data; + +namespace MP.INVENTORY.Components +{ + public partial class DossiersFilter + { + #region Public Properties + + [Parameter] + public EventCallback FilterChanged { get; set; } + + [Parameter] + public SelectDossierParams SelFilterDossier { get; set; } = null!; + + #endregion Public Properties + + #region Protected Properties + + [Inject] + protected MpDataService MDService { get; set; } = null!; + + protected string selArticolo + { + get + { + return SelFilterDossier.CodArticolo; + } + set + { + if (!SelFilterDossier.CodArticolo.Equals(value)) + { + SelFilterDossier.CurrPage = 1; + SelFilterDossier.CodArticolo = value; + StateHasChanged(); + Task.Delay(1); + reportChange(); + } + } + } + private bool filtActive + { + get => selMacchina != "*" || selArticolo != "*"; + } + protected void resetMacchina() + { + selMacchina = "*"; + } + protected void resetArticolo() + { + selArticolo = "*"; + } + protected DateTime selDtMax + { + get + { + return SelFilterDossier.DtEnd; + } + + set + { + if (!SelFilterDossier.DtEnd.Equals(value)) + { + SelFilterDossier.DtEnd = value; + reportChange(); + } + } + } + + protected DateTime selDtMin + { + get + { + return SelFilterDossier.DtStart; + } + + set + { + if (!SelFilterDossier.DtStart.Equals(value)) + { + SelFilterDossier.DtStart = value; + reportChange(); + } + } + } + + protected string selMacchina + { + get + { + return SelFilterDossier.IdxMacchina; + } + set + { + if (!SelFilterDossier.IdxMacchina.Equals(value)) + { + SelFilterDossier.CurrPage = 1; + SelFilterDossier.IdxMacchina = value; + StateHasChanged(); + Task.Delay(1); + reportChange(); + } + } + } + + protected int selMaxRecord + { + get + { + return SelFilterDossier.MaxRecord; + } + + set + { + if (!SelFilterDossier.MaxRecord.Equals(value)) + { + SelFilterDossier.MaxRecord = value; + reportChange(); + } + } + } + + protected bool showParam { get; set; } = false; + + #endregion Protected Properties + + #region Protected Methods + + protected override async Task OnInitializedAsync() + { + SelFilterDossier = new SelectDossierParams(); + DateTime dtEnd = SelFilterDossier.DtEnd; + DateTime dtStart = dtEnd.Subtract(SelFilterDossier.DtStart).TotalDays < 15 ? SelFilterDossier.DtStart : dtEnd.AddDays(-14); + ListMacchine = await MDService.MacchineWithFlux(dtStart, dtEnd); + ListArticoli = await MDService.ArticleWithDossier(); + await FilterChanged.InvokeAsync(SelFilterDossier); + } + + protected void toggleParams() + { + showEditPar = !showEditPar; + } + + #endregion Protected Methods + + #region Private Fields + + private List? ListArticoli = null; + private List? ListMacchine = null; + + #endregion Private Fields + + #region Private Properties + + private bool showEditPar { get; set; } = false; + + #endregion Private Properties + + #region Private Methods + + private void reportChange() + { + FilterChanged.InvokeAsync(SelFilterDossier); + } + + private void toggleShowParams() + { + showParam = !showParam; + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/MP.INVENTORY/Components/ListODL.razor.cs b/MP.INVENTORY/Components/ListODL.razor.cs new file mode 100644 index 00000000..57fcd34b --- /dev/null +++ b/MP.INVENTORY/Components/ListODL.razor.cs @@ -0,0 +1,448 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; +using MP.Data.DatabaseModels; +using MP.INVENTORY.Data; +using MP.INVENTORY.Services; +using NLog; + +namespace MP.INVENTORY.Components +{ + public partial class ListODL : IDisposable + { + #region Public Properties + + [Parameter] + public SelectOdlParams currFilter { get; set; } = null!; + + [Parameter] + public EventCallback PagerResetReq { get; set; } + + [Parameter] + public EventCallback updateRecordCount { get; set; } + + #endregion Public Properties + + #region Public Methods + + public string checkSelect(int IdxOdl) + { + string answ = ""; + if (currRecord != null) + { + try + { + answ = (currRecord.IdxOdl == IdxOdl) ? "table-info" : ""; + } + catch + { } + } + return answ; + } + + public void Dispose() + { + currRecord = null; + SearchRecords = null; + ListRecords = null; + ListStati = null; + ListOdlStats = null; + ListOdlStatsNetto = null; + statRecord = null; + GC.Collect(); + } + + public string formDurata(double durataMin) + { + return MP.Data.Utils.FormDurata(durataMin); + } + + #endregion Public Methods + + #region Protected Properties + + [Inject] + protected IJSRuntime JSRuntime { get; set; } = null!; + + [Inject] + protected MpDataService MDService { get; set; } = null!; + + [Inject] + protected IOApiService MpIoApiCall { get; set; } = null!; + + #endregion Protected Properties + + #region Protected Methods + + /// + /// Registra chiusura ODL alla data indicata + /// + /// + protected async Task chiudiOdl() + { + if (!await JSRuntime.InvokeAsync("confirm", "Sei sicuro di voler chiudere l'ODL corrente?")) + return; + + if (currRecord != null) + { + // effettua chiusura sul DB + await MDService.ODLClose(currRecord.IdxOdl, currRecord.IdxMacchina, 0, true); + Log.Info($"Effettuata chiusura ODL {currRecord.IdxOdl}"); + // ricarica... + await selRecord(null); + } + await reloadData(); + } + + protected string colorChanger(string colorCSS) + { + string answ = ""; + if (colorCSS == "yellow") + { + answ = "text-dark"; + } + return answ; + } + + /// + /// Richiesta invio sync all'IOB-WIN + /// + /// + protected async Task forceSyncDb() + { + if (!await JSRuntime.InvokeAsync("confirm", "Sei sicuro di voler reinviare i dati (Articoli, PODL) all'impianto?")) + return; + + if (currRecord != null) + { + await callSyncDb(currRecord.IdxMacchina); + Log.Info($"Richiesto forceSyncDb per idxMacc {currRecord.IdxMacchina}"); + // ricarica... + await selRecord(null); + } + await reloadData(); + } + + protected override async Task OnInitializedAsync() + { + ListStati = await MDService.AnagStatiComm(); + } + + protected override async Task OnParametersSetAsync() + { + await reloadData(); + } + + protected async void OnSeachUpdated() + { + await InvokeAsync(() => + { + PagerResetReq.InvokeAsync(true); + Task task = UpdateData(); + StateHasChanged(); + }); + } + + protected async Task resetSel() + { + await selRecord(null); + await reloadData(); + } + + protected async Task selectStatRecord(ODLModel? currRec) + { + showStats = true; + await Task.Delay(1); + statRecord = currRec; + if (currRec != null) + { + await reloadStatsData(currRec); + } + else + { + showStats = false; + ListOdlStats = null; + } + } + + protected async Task selRecord(ODLModel? currRec) + { + await Task.Delay(1); + selDtFine = DateTime.Now; + currRecord = currRec; + showStats = false; + ListOdlStats = null; + ListOdlStatsNetto = null; + } + + protected async Task toggleSpenta() + { + hideSpenta = !hideSpenta; + await Task.Delay(1); + if (statRecord != null) + { + await reloadStatsData(statRecord); + } + } + + protected async Task UpdateData() + { + await selRecord(null); + await reloadData(); + } + + #endregion Protected Methods + + #region Private Fields + + private static Logger Log = LogManager.GetCurrentClassLogger(); + + private ODLModel? currRecord = null; + + private List? ListOdlStats; + + private List? ListOdlStatsNetto; + + private List? ListRecords; + + private List? ListStati; + + private List? SearchRecords; + + private ODLModel? statRecord = null; + + #endregion Private Fields + + #region Private Properties + + private int _totalCount { get; set; } = 0; + + private int currPage + { + get => currFilter.CurrPage; + set => currFilter.CurrPage = value; + } + + private string durataFilt + { + get + { + string answ = "ND"; + if (statRecord != null) + { + if (hideSpenta) + { + if (ListOdlStatsNetto != null) + { + var tsDurata = TimeSpan.FromMinutes(ListOdlStatsNetto.Sum(x => x.TotDurata)); + if (tsDurata.TotalDays < 1) + { + answ = $"{tsDurata.Hours:00}h {tsDurata.Minutes:00}'"; + } + else + { + answ = $"{tsDurata.Days}gg {tsDurata.Hours:00}h"; + } + } + } + else + { + answ = statRecord.DurataMinuti; + } + } + return answ; + } + } + + protected int getPodl(int idxOdl) + { + int answ = 0; + var pOdlData = MDService.PODL_getByOdl(idxOdl); + if (pOdlData != null) + { + answ = pOdlData.IdxPromessa; + } + return answ; + } + + private bool hideSpenta { get; set; } = false; + + /// + /// Indica se si tratti di ODL correnti + /// + private bool isCurrOdl + { + get => currFilter.IsActive; + } + + private bool isLoading { get; set; } = false; + + private string leftStringCSS + { + get => hideSpenta ? "text-secondary" : "text-dark fw-bold"; + } + + private List? ListOdlStatsAct + { + get + { + List? answ = new List(); + if (hideSpenta) + { + answ = ListOdlStatsNetto; + } + else + { + answ = ListOdlStats; + } + return answ; + } + } + + private int numRecord + { + get => currFilter.NumRec; + set => currFilter.NumRec = value; + } + + private string rightStringCSS + { + get => hideSpenta ? "text-dark fw-bold" : "text-secondary"; + } + + private DateTime selDtFine { get; set; } = DateTime.Now; + + private bool showStats { get; set; } = false; + + private int totalCount + { + get => _totalCount; + set + { + if (_totalCount != value) + { + _totalCount = value; + updateRecordCount.InvokeAsync(value); + } + } + } + + #endregion Private Properties + + #region Private Methods + + /// + /// Chiama metodo x chiedere sync DB + /// + /// + /// + private async Task addTask2Exe(string idxMacc, string taskName, string taskVal) + { + // compongo URL e chiamo + string restUrl = $"IOB/addTask2Exe/{idxMacc}?taskName={taskName}&taskVal={taskVal}"; + try + { + var response = await MpIoApiCall.callMpIoUrlGet(restUrl); + } + catch (Exception exc) + { + Log.Error($"Errore durante chiamata: {Environment.NewLine}{exc}"); + } + } + + private double calcolaPerc(double durata) + { + double answ = 0; + + double tot = 0; + if (ListOdlStatsAct != null) + { + tot = ListOdlStatsAct.Sum(x => x.TotDurata); + + double perc = (durata / tot) * 100; + if (perc > 1) + { + answ = Math.Round(perc, 2); + } + else + { + answ = Math.Round(perc, 4); + } + } + return answ; + } + + /// + /// Chiama metodo x chiedere sync DB + /// + /// + /// + private async Task callSyncDb(string IdxMacc) + { + // chiamo aggiunta task SyncDb... + await addTask2Exe(IdxMacc, "syncDbData", ""); + } + + private string pbStyle(string css) + { + string answ = ""; + if (ListOdlStats != null) + { + if (css == "yellow") + { + answ = "orange"; + } + else if (css == "blue") + { + answ = "#2874A6"; + } + else + { + answ = css; + } + } + return answ; + } + + private async Task reloadData() + { + isLoading = true; + SearchRecords = await MDService.ListODLFilt(currFilter.IsActive, currFilter.SearchVal, currFilter.CodStato, currFilter.IdxMacchina, currFilter.DtStart, currFilter.DtEnd); + totalCount = SearchRecords.Count; + ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList(); + await Task.Delay(1); + await InvokeAsync(() => StateHasChanged()); + isLoading = false; + } + + private async Task reloadStatsData(ODLModel? currRec) + { + showStats = true; + if (currRec != null) + { + ListOdlStats = await MDService.StatOdl(currRec.IdxOdl); + ListOdlStatsNetto = ListOdlStats.Where(x => x.Semaforo != "sGr").ToList(); + } + else + { + ListOdlStats = null; + ListOdlStatsNetto = null; + } + } + + private string tradFase(string codFase) + { + string answ = codFase; + if (ListStati != null && ListStati.Count > 0) + { + var recSel = ListStati.FirstOrDefault(x => x.value == codFase); + if (recSel != null) + { + answ = recSel.label; + } + } + return answ; + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/MP.INVENTORY/Components/ToggleMode.razor.cs b/MP.INVENTORY/Components/ToggleMode.razor.cs new file mode 100644 index 00000000..52dfd1ff --- /dev/null +++ b/MP.INVENTORY/Components/ToggleMode.razor.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using System.Net.Http; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.AspNetCore.Components.Forms; +using Microsoft.AspNetCore.Components.Routing; +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.Web.Virtualization; +using Microsoft.JSInterop; +using MP.INVENTORY; +using MP.INVENTORY.Shared; +using MP.INVENTORY.Components; +using MP.INVENTORY.Data; + +namespace MP.INVENTORY.Components +{ + public partial class ToggleMode + { + [Parameter] + public EventCallback FilterChanged { get; set; } + + [Parameter] + public SelectGlobalToggle SelFilter { get; set; } = new SelectGlobalToggle(); + + protected bool isActive + { + get => SelFilter.isActive; + set + { + if (SelFilter.isActive != value) + { + SelFilter.isActive = value; + reportChange(); + } + } + } + + protected string leftString + { + get => SelFilter.leftString; + set + { + if (SelFilter.leftString != value) + { + SelFilter.leftString = value; + reportChange(); + } + } + } + protected string leftStringCSS + { + get => SelFilter.leftStringCSS; + set + { + if (SelFilter.leftStringCSS != value) + { + SelFilter.leftStringCSS = value; + reportChange(); + } + } + } + protected string rightString + { + get => SelFilter.rightString; + set + { + if (SelFilter.rightString != value) + { + SelFilter.rightString = value; + reportChange(); + } + } + } + protected string rightStringCSS + { + get => SelFilter.rightStringCSS; + set + { + if (SelFilter.rightStringCSS != value) + { + SelFilter.rightStringCSS = value; + reportChange(); + } + } + } + + protected void toggle() + { + var currFilt = SelFilter; + currFilt.isActive = !currFilt.isActive; + SelFilter = currFilt; + if (isActive) + { + rightStringCSS = "fw-bold"; + leftStringCSS = "text-secondary"; + } + else + { + leftStringCSS = "fw-bold"; + rightStringCSS = "text-secondary"; + } + } + protected override async Task OnInitializedAsync() + { + if (isActive) + { + rightStringCSS = "fw-bold"; + leftStringCSS = "text-secondary"; + } + else + { + leftStringCSS = "fw-bold"; + rightStringCSS = "text-secondary"; + } + await FilterChanged.InvokeAsync(SelFilter); + } + + private void reportChange() + { + FilterChanged.InvokeAsync(SelFilter); + } + } +} \ No newline at end of file