using EgwCoreLib.Razor.Data; using LiMan.DB; using LiMan.DB.DTO; using LiMan.UI.Data; using Microsoft.AspNetCore.Components; using Org.BouncyCastle.Ocsp; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using static EgwCoreLib.Razor.Sorter; namespace LiMan.UI.Components { public partial class InstAppPareto : IDisposable { #region Public Properties [Parameter] public List AppDetList { get; set; } = new List(); [Parameter] public AppStatusDTO CurrRecord { get; set; } = null!; #endregion Public Properties #region Public Methods public void Dispose() { LMDService.TaskMessPipe.EA_NewMessage -= async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e); } #endregion Public Methods #region Protected Properties protected List ListRecord { get; set; } = new List(); [Inject] protected LiManDataService LMDService { get; set; } = null!; [Inject] protected MessageService MServ { get; set; } = null!; protected List SearchRecord { get; set; } = new List(); #endregion Protected Properties #region Protected Methods protected override void OnInitialized() { LMDService.TaskMessPipe.EA_NewMessage += async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e); } /// /// Evento refresh legato a ricezione evento da MessagePipe /// /// /// private async Task TaskMessPipe_EA_NewMessage(object sender, EventArgs e) { PubSubEventArgs currArgs = (PubSubEventArgs)e; // qualsiasi messaggio fa scattare reload data if (!string.IsNullOrEmpty(currArgs.newMessage)) { // verifico se sia il cod impianto selezionato, nel faso forzo refreesh... if (!string.IsNullOrEmpty(CodImpSel) && CodImpSel.Equals(currArgs.newMessage)) { isLoading = true; ReloadTaskStatus(); await ReloadTaskResults(); isLoading = false; await InvokeAsync(StateHasChanged); } } } protected override void OnParametersSet() { ReloadData(); ReloadTaskStatus(); ReloadCharts(); } /// /// Reset filtro cliente... /// /// protected void ResetCliente() { HasFlitCli = false; CodInstSel = ""; // salvo nelle preferenze i valori CodImp e PcInst MServ.UsrParamSet("Cliente", ""); MServ.UsrParamSet("CodInst", ""); MServ.UsrParamSet("CodImp", ""); MServ.UsrParamSet("PcInst", ""); // Richiedo azione x gestione dettaglio info MServ.ReportSelCodInst(); } /// /// Reset filtro PC/Impiego... /// /// protected void ResetCodImp() { HasFlitImp = false; CodImpSel = ""; // salvo nelle preferenze i valori CodImp e PcInst MServ.UsrParamSet("CodImp", ""); MServ.UsrParamSet("PcInst", ""); // Richiedo azione x gestione dettaglio info MServ.ReportSelCodImp(); } /// /// Set filtro cliente... /// /// protected void SetCliente(AppRelStatusDTO currRec) { HasFlitCli = true; CodInstSel = currRec.CodInst; // salvo nelle preferenze i valori CodImp e PcInst MServ.UsrParamSet("Cliente", currRec.Cliente); MServ.UsrParamSet("CodInst", currRec.CodInst); MServ.UsrParamSet("CodImp", ""); MServ.UsrParamSet("PcInst", ""); // Richiedo azione x gestione dettaglio info MServ.ReportSelCodInst(); // se era selezionato impianto lo deseleziona... if (HasFlitImp) { CodImpSel = ""; HasFlitImp = false; MServ.ReportSelCodImp(); } } /// /// Set filtro PC/Impiego... /// /// protected void SetCodImp(AppRelStatusDTO currRec) { HasFlitImp = true; CodImpSel = currRec.CodImp; AppInstList = AppDetList .Where(x => x.CodImp == currRec.CodImp) .ToList(); // se era selezionato cliente lo riseleziono... if (HasFlitCli) { CodInstSel = currRec.CodInst; MServ.ReportSelCodInst(); } // salvo nelle preferenze i valori CodImp e PcInst MServ.UsrParamSet("Cliente", currRec.Cliente); MServ.UsrParamSet("CodInst", currRec.CodInst); MServ.UsrParamSet("CodImp", currRec.CodImp); MServ.UsrParamSet("PcInst", currRec.PcInst); // Richiedo azione x gestione dettaglio info MServ.ReportSelCodImp(); } protected void setNumPage(int newNum) { currPage = newNum; ReloadData(); isLoading = false; } protected void setNumRec(int newNum) { numRecord = newNum; ReloadData(); isLoading = false; } protected void SortRequested(SortCallBack e) { isLoading = true; if (sortField == e.ParamName) { sortAsc = e.IsAscending; } sortField = e.ParamName; ReloadData(); isLoading = false; } #endregion Protected Methods #region Private Fields private List AppInstList = new List(); private List ChartColor = new List(); private double[] ChartData = new double[1]; private string[] ChartLabels = new string[1]; private string CodImpSel = ""; private string CodInstSel = ""; private int currPage = 1; private bool HasFlitCli = false; private bool HasFlitImp = false; private bool isLoading = false; private int numRecord = 10; private string sKey = "InstAppPareto"; private Dictionary TaskDone = new Dictionary(); private Dictionary TaskReq = new Dictionary(); private Dictionary TaskRun = new Dictionary(); private int totalCount = 0; #endregion Private Fields private string cssNumPill(int numRec) { return numRec > 0 ? "text-bg-primary" : "text-bg-secondary"; } private bool showDetail = false; private Dictionary DetailData = new Dictionary(); private void showDetReq() { showDetail = true; DetailData = new Dictionary(TaskReq); } private void showDetRun() { showDetail = true; DetailData = new Dictionary(TaskRun); } private void showDetDone() { showDetail = true; DetailData = new Dictionary(TaskDone); } #region Private Properties private string CssDivDetail { get => HasFlitImp ? "col-7" : "col-5"; } private string CssDivMain { get => HasFlitImp ? "col-5" : "col-7"; } private string CssResetCli { get => HasFlitCli ? "" : "disabled"; } private string CssResetImp { get => HasFlitImp ? "" : "disabled"; } private bool sortAsc { get { bool answ = false; var sVal = MServ.UsrParamGet($"{sKey}_sort"); if (!string.IsNullOrEmpty(sVal)) { bool.TryParse(sVal, out answ); } return answ; } set => MServ.UsrParamSet($"{sKey}_sort", $"{value}"); } private string sortField { get => MServ.UsrParamGet($"{sKey}_field"); set => MServ.UsrParamSet($"{sKey}_field", $"{value}"); } #endregion Private Properties #region Private Methods private string CssBtnImp(string CodImp) { return HasFlitImp && CodImpSel == CodImp ? "btn-primary" : "btn-outline-primary"; } private string CssBtnInst(string CodInst) { return HasFlitCli && CodInstSel == CodInst ? "btn-dark" : "btn-outline-dark"; } private string cssVers(AppRelStatusDTO rec) { string answ = ""; switch (rec.UpToDateStatus) { case 4: answ = "text-success fw-bold"; break; case 3: answ = "text-success"; break; case 2: answ = "text-warning"; break; case 1: answ = "text-danger"; break; case 0: answ = "text-danger fw-bold"; break; default: break; } return answ; } private void MServ_EA_TaskUpdate() { } private void ReloadCharts() { // sistemo info x grafico... se ho impieghi uso quello, altrimenti istanze... if (CurrRecord.NumImp > 0) { ChartData = SearchRecord .GroupBy(x => x.VersNumInstall) .Select(g => (double)g.Sum(x => x.NumImp)) .ToArray(); } else { ChartData = SearchRecord .GroupBy(x => x.VersNumInstall) .Select(g => (double)g.Count()) .ToArray(); } ChartLabels = SearchRecord .GroupBy(x => x.VersNumInstall) .Select(g => g.Key) .ToArray(); ChartColor.Clear(); var listStatus = SearchRecord .GroupBy(x => x.VersNumInstall) .Select(g => g.First().UpToDateStatus) .ToList(); foreach (var item in listStatus) { switch (item) { case 4: ChartColor.Add(new DoughnutStyling("#12FF06", "#006900")); break; case 3: ChartColor.Add(new DoughnutStyling("#ABFF69", "#11AA11")); break; case 2: ChartColor.Add(new DoughnutStyling("#FFE493", "#AAFF00")); break; case 1: ChartColor.Add(new DoughnutStyling("#FF6900", "#953500")); break; case 0: ChartColor.Add(new DoughnutStyling("#AA3600", "#AA0000")); break; default: break; } } } private void ReloadData() { SearchRecord = CurrRecord.DetailInstalled; totalCount = SearchRecord.Count; switch (sortField) { case "NumImp": if (sortAsc) { SearchRecord = SearchRecord.OrderBy(x => x.NumImp).ThenByDescending(x => x.VersNumInstall).ToList(); } else { SearchRecord = SearchRecord.OrderByDescending(x => x.NumImp).ThenByDescending(x => x.VersNumInstall).ToList(); } break; case "VersNumInstall": if (sortAsc) { SearchRecord = SearchRecord.OrderBy(x => x.VersNumInstall).ThenBy(x => x.PcInst).ToList(); } else { SearchRecord = SearchRecord.OrderByDescending(x => x.VersNumInstall).ThenBy(x => x.PcInst).ToList(); } break; case "PcInst": if (sortAsc) { SearchRecord = SearchRecord.OrderBy(x => x.PcInst).ThenByDescending(x => x.VersNumInstall).ToList(); } else { SearchRecord = SearchRecord.OrderByDescending(x => x.PcInst).ThenByDescending(x => x.VersNumInstall).ToList(); } break; case "CodInst": if (sortAsc) { SearchRecord = SearchRecord.OrderBy(x => x.CodInst).ThenByDescending(x => x.VersNumInstall).ToList(); } else { SearchRecord = SearchRecord.OrderByDescending(x => x.CodInst).ThenByDescending(x => x.VersNumInstall).ToList(); } break; default: SearchRecord = SearchRecord .OrderByDescending(x => x.VersNumInstall) .ThenBy(x => x.PcInst) .ToList(); break; } // paginazione ListRecord = SearchRecord .Skip((currPage - 1) * numRecord) .Take(numRecord) .ToList(); } /// /// Esegue update stato task /// private void ReloadTaskStatus() { TaskReq = new Dictionary(); TaskRun = new Dictionary(); TaskDone = new Dictionary(); if (!string.IsNullOrEmpty(CodImpSel)) { TaskReq = LMDService.TaskReqGet(CodImpSel); TaskRun = LMDService.TaskRunGet(CodImpSel); TaskDone = LMDService.TaskDoneGet(CodImpSel); } } /// /// Rilegge risultato task come obj specifici in area DONE... /// /// private async Task ReloadTaskResults() { if (TaskDone != null && TaskDone.Count > 0) { await Task.Delay(100); } } #endregion Private Methods } }