using LiMan.DB; using LiMan.DB.DBModels; using LiMan.DB.DTO; using LiMan.UI.Data; using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using static Core.Enum; namespace LiMan.UI.Components { public partial class InstallInfoStats : IDisposable { #region Public Methods public void Dispose() { LMDService.EnrollMessPipe.EA_NewMessage -= async (sender, e) => await EnrollMessPipe_EA_NewMessage(sender, e); LMDService.TaskMessPipe.EA_NewMessage -= async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e); LMDService.UpdActMessPipe.EA_NewMessage -= async (sender, e) => await UpdActMessPipe_EA_NewMessage(sender, e); MServ.EA_SelCodApp -= async () => await MServ_EA_SelCodApp(); MServ.EA_SelCodImp -= async () => await MServ_EA_SelCodImp(); MServ.EA_SelCodInst -= async () => await MServ_EA_SelCodInst(); } #endregion Public Methods #region Protected Properties /// /// Codice installazione selezionata /// protected string CodInstSel { get => codInstSel; set { if (codInstSel != value) { codInstSel = value; isLoading = true; var pUpd = Task.Run(async () => { await ReloadData(); MServ.UsrParamSet("CodInst", value); MServ.ReportSelCodInst(); }); pUpd.Wait(); isLoading = false; } } } /// /// Tipo app selezionato /// protected string CodTipoApp { get => codTipoApp; set { if (codTipoApp != value) { codTipoApp = value; isLoading = true; var pUpd = Task.Run(async () => { await ReloadData(); // resetto eventuale App MServ.UsrParamSet("CodApp", ""); MServ.ReportSelCodApp(); }); pUpd.Wait(); isLoading = false; } } } [Inject] protected IJSRuntime JSRuntime { get; set; } = null!; [Inject] protected LiManDataService LMDService { get; set; } = null!; [Inject] protected MessageService MServ { get; set; } = null!; #endregion Protected Properties #region Protected Methods protected override async Task OnInitializedAsync() { LMDService.EnrollMessPipe.EA_NewMessage += async (sender, e) => await EnrollMessPipe_EA_NewMessage(sender, e); LMDService.TaskMessPipe.EA_NewMessage += async (sender, e) => await TaskMessPipe_EA_NewMessage(sender, e); LMDService.UpdActMessPipe.EA_NewMessage += async (sender, e) => await UpdActMessPipe_EA_NewMessage(sender, e); MServ.EA_SelCodApp += async () => await MServ_EA_SelCodApp(); MServ.EA_SelCodImp += async () => await MServ_EA_SelCodImp(); MServ.EA_SelCodInst += async () => await MServ_EA_SelCodInst(); await ReloadLicData(); await ReloadData(); } #endregion Protected Methods #region Private Fields private string CodDeviceSel = ""; private string codInstSel = ""; /// /// Secondi di debounce x evitare reload continui /// private int debounceSec = 5; private Dictionary DetailFilt = new Dictionary(); /// /// Ebilitazione editing parametri configurazione x impiango selezionata /// private bool DoEditConfig = false; private bool HasFiltClienti = false; private bool HasFiltImpiego = false; /// /// DataOra ultimo reload /// private DateTime lastReload = DateTime.Now; private List ListInstall; /// /// Lista Task in stato DONE /// private Dictionary TaskDone = new Dictionary(); /// /// Lista Task in stato REQUESTED /// private Dictionary TaskReq = new Dictionary(); /// /// Lista Task in stato RUNNING /// private Dictionary TaskRun = new Dictionary(); /// /// Versione raw serializzata della conf impianto (immutabile x modifica) /// private string TgtListRaw = ""; #endregion Private Fields #region Private Properties /// /// App selezionata /// private string CodAppSel { get; set; } = ""; /// /// Impianto selezionato /// private string CodImpSel { get; set; } = ""; private string codTipoApp { get; set; } = ""; private string cssBtnCli { get => HasFiltClienti ? "btn-info" : "btn-primary"; } private string DevName { get; set; } = ""; private DateTime DtFine { get; set; } = DateTime.Today.AddHours(DateTime.Now.Hour + 1); private DateTime DtInizio { get; set; } = DateTime.Today.AddMonths(-1); private InstallStatusDTO InfoStats { get; set; } = new InstallStatusDTO(); private bool isLoading { get; set; } = false; private Dictionary ListDevices { get; set; } = new Dictionary(); #endregion Private Properties #region Private Methods private string BtnState(int numRec) { return numRec > 0 ? "text-bg-dark" : "text-bg-secondary"; } private async Task CloseDetail() { isLoading = true; await InvokeAsync(StateHasChanged); HasFiltImpiego = false; CodImpSel = ""; DetailFilt.Clear(); isLoading = false; await InvokeAsync(StateHasChanged); } /// /// Ricezione configurazione serializzata da inviare al device /// /// private void ConfigUpdated(string newData) { if (!string.IsNullOrEmpty(newData)) { // invio task update configurazione LMDService.TaskReqAdd(CodImpSel, EgwAccTask.TargetListUpsert, newData); } DoEditConfig = false; } /// /// Evento refresh legato a ricezione evento da MessagePipe di Enroll /// /// /// private async Task EnrollMessPipe_EA_NewMessage(object sender, EventArgs e) { PubSubEventArgs currArgs = (PubSubEventArgs)e; // qualsiasi messaggio fa scattare reload data if (!string.IsNullOrEmpty(currArgs.newMessage)) { isLoading = true; await InvokeAsync(StateHasChanged); await ReloadLicData(); await ReloadData(); isLoading = false; await InvokeAsync(StateHasChanged); } } /// /// Selezionato CodApp (Singola app, molti PC) /// private async Task MServ_EA_SelCodApp() { isLoading = true; // se trovo salvate in preferenze utente le info necessarie... CodAppSel = MServ.UsrParamGet("CodApp"); HasFiltImpiego = !string.IsNullOrEmpty(CodAppSel); DetailFilt.Clear(); DetailFilt.Add("App", CodAppSel); DetailFilt.Add("# Copie", MServ.UsrParamGet("NumApp")); DetailFilt.Add("# Lic.", MServ.UsrParamGet("NumLic")); DetailFilt.Add("vers.", MServ.UsrParamGet("LastVers")); DetailFilt.Add("score", MServ.UsrParamGet("Score")); ReloadTaskStatus(); isLoading = false; await InvokeAsync(StateHasChanged); } /// /// Selezionato CodImp (PC) /// private async Task MServ_EA_SelCodImp() { isLoading = true; // se trovo salvate in preferenze utente le info necessarie... CodImpSel = MServ.UsrParamGet("CodImp"); HasFiltImpiego = !string.IsNullOrEmpty(CodImpSel); DetailFilt.Clear(); DetailFilt.Add("Cliente", MServ.UsrParamGet("Cliente")); DevName = MServ.UsrParamGet("PcInst"); DetailFilt.Add("PC", DevName); DetailFilt.Add("SW ver.", MServ.UsrParamGet("Version")); DetailFilt.Add("IP", MServ.UsrParamGet("PcIP")); DetailFilt.Add("Started", MServ.UsrParamGet("PcRestart")); ReloadTaskStatus(); isLoading = false; await InvokeAsync(StateHasChanged); } /// /// Selezionato CodInstall (Cliente) /// /// private async Task MServ_EA_SelCodInst() { isLoading = true; CodInstSel = MServ.UsrParamGet("CodInst"); HasFiltClienti = !string.IsNullOrEmpty(CodInstSel); ReloadDevices(); isLoading = false; await InvokeAsync(StateHasChanged); } private async Task ReloadData() { isLoading = true; InfoStats = await LMDService.InstallStatusGetInfo(DtInizio, DtFine, CodInstSel, CodTipoApp); ReloadDevices(); isLoading = false; } private void ReloadDevices() { ListDevices = new Dictionary(); if (InfoStats != null) { // se necessario filtro... if (HasFiltClienti) { ListDevices = InfoStats .InstDevices .Where(x => x.Value.CodInst == CodInstSel) .OrderBy(x => x.Value.DevName) .ToDictionary(x => x.Key, x => x.Value); } else { ListDevices = InfoStats .InstDevices .OrderBy(x => x.Value.DevName) .ToDictionary(x => x.Key, x => x.Value); } } } private async Task ReloadLicData() { ListInstall = await LMDService.InstallazioniNextGetAll(); } /// /// Esegue update stato task /// private void ReloadTaskStatus() { TaskReq = new Dictionary(); TaskRun = new Dictionary(); TaskDone = new Dictionary(); TgtListRaw = ""; if (!string.IsNullOrEmpty(CodImpSel)) { TaskReq = LMDService.TaskReqGet(CodImpSel); TaskRun = LMDService.TaskRunGet(CodImpSel); TaskDone = LMDService.TaskDoneGet(CodImpSel); // č uno dei task done l'elenco target... if (TaskDone.ContainsKey("TargetList")) { TgtListRaw = TaskDone["TargetList"]; } } else if (!string.IsNullOrEmpty(CodAppSel)) { TaskReq = LMDService.TaskListReqGet(); TaskRun = LMDService.TaskListRunGet(); TaskDone = LMDService.TaskListDoneGet(); } } /// /// Resetta le richeiste di task x impiango corrente /// private async Task ResetTaskReq() { if (!string.IsNullOrEmpty(CodImpSel)) { // registro la richiesta LMDService.TaskReqReset(CodImpSel); await Task.Delay(5); } else if (!string.IsNullOrEmpty(CodAppSel)) { if (!await JSRuntime.InvokeAsync("confirm", "Sicuro di voler resettare richieste aperte per i devices con l'applicazione selezionata?")) return; // ciclo x tutti i codImp derivati dall'app... var listRecSel = InfoStats .InstallRelList .Where(x => x.CodApp == CodAppSel) .ToList(); foreach (var item in listRecSel) { // registro la richiesta LMDService.TaskReqReset(item.CodImp); await Task.Delay(5); } } // mando notifica con messageservice... MServ.ReportTaskChange(); } /// /// Force reboot applicazione EgwACC /// /// private async Task SendReboot() { if (!await JSRuntime.InvokeAsync("confirm", "Sicuro di voler forzare il riavvio di EgwAppControlCenter sul Device? In caso di update disponibile questo sarā applicato in modo automatico senza conferma utente.")) return; await SendTask(Core.Enum.EgwAccTask.ForceUpdate); } /// /// Invia una richiesta esecuzione task /// /// /// Parametri opzionali x svolgiimento private async Task SendTask(EgwAccTask reqTask, string optPar = "") { // se parametro vuoto metto dataora... optPar = string.IsNullOrEmpty(optPar) ? $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}" : optPar; if (!string.IsNullOrEmpty(CodImpSel)) { // registro la richiesta LMDService.TaskReqAdd(CodImpSel, reqTask, optPar); // aggiorno stato... ReloadTaskStatus(); // mando notifica con messageservice... MServ.ReportTaskChange(); } else if (!string.IsNullOrEmpty(CodAppSel)) { if (!await JSRuntime.InvokeAsync("confirm", "Sicuro di voler inviare il comando a tutti i devices con l'applicazione selezionata? La richiesta sarā inserita in coda di esecuzione e verrā eseguita in modo asyncrono dai vari devices appena possibile.")) return; // ciclo x tutti i codImp derivati dall'app... var listRecSel = InfoStats .InstallRelList .Where(x => x.CodApp == CodAppSel) .ToList(); foreach (var item in listRecSel) { // registro la richiesta LMDService.TaskReqAdd(item.CodImp, reqTask, optPar); } } ReloadTaskStatus(); } /// /// Evento refresh legato a ricezione evento da MessagePipe TASK /// /// /// private async Task TaskMessPipe_EA_NewMessage(object sender, EventArgs e) { PubSubEventArgs currArgs = (PubSubEventArgs)e; // qualsiasi messaggio TASK fa scattare... if (!string.IsNullOrEmpty(currArgs.newMessage)) { isLoading = true; ReloadTaskStatus(); isLoading = false; await InvokeAsync(StateHasChanged); } } private void TglFiltCli() { HasFiltClienti = !HasFiltClienti; if (!HasFiltClienti) { CodInstSel = ""; } } /// /// Toggle modalitā editing parametri confguraziione app /// private void ToggleParamConfig() { if (!string.IsNullOrEmpty(CodImpSel)) { DoEditConfig = !DoEditConfig; } } /// /// Evento refresh legato a ricezione evento da MessagePipe Update /// /// /// private async Task UpdActMessPipe_EA_NewMessage(object sender, EventArgs e) { PubSubEventArgs currArgs = (PubSubEventArgs)e; DateTime adesso = DateTime.Now; // qualsiasi messaggio (dopo debounceSec sec dal precedente) fa scattare reload data if (!string.IsNullOrEmpty(currArgs.newMessage) && adesso.Subtract(lastReload).TotalSeconds > debounceSec) { lastReload = adesso; isLoading = true; #if false InfoStats = null; #endif await ReloadLicData(); await ReloadData(); isLoading = false; await InvokeAsync(StateHasChanged); } } #endregion Private Methods } }