using EgwControlCenter.Core; using EgwControlCenter.Core.DTO; using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; using System.Diagnostics; namespace EgwControlCenter.App.Components.Compo { public partial class ApplicationCheck : IDisposable { #region Public Properties [Parameter] public EventCallback EC_GotoSetup { get; set; } #endregion Public Properties #region Public Methods private string ComputerName { get => Environment.MachineName; } private string UserName { get => Environment.UserName; } private string DomainName { get => Environment.UserDomainName; } public void Dispose() { ACService.EA_StatusUpdated -= ACService_EA_StatusUpdated; ACService.EA_RemoteCalling -= ACService_EA_RemoteCalling; } #endregion Public Methods #region Protected Properties [Inject] protected AppControlService ACService { get; set; } = null!; [Inject] protected IJSRuntime JSRuntime { get; set; } = null!; protected bool RemoteCallActive { get; set; } = false; protected bool ShowOnlyUpdate { get => showOnlyUpdate; set { showOnlyUpdate = value; currPage = 1; ForceReload(); } } protected string UpdateCss { get => isUpdating ? "btn-outline-success disabled" : "btn-success"; } #endregion Protected Properties #region Protected Methods /// /// Esegue step x update app /// /// protected async void DoUpdate(VersStatusDTO ReqApp) { if (!await JSRuntime.InvokeAsync("confirm", $"{ReqApp.CodApp} | Sicuro di voler procedere con l'aggiornamento? Verrà eseguito un backup della configurazione e dell'applicativo prima di installare il nuovo, ma l'eventuale ripristino dovrà essere condotto manualmente.")) return; isUpdating = true; await InvokeAsync(StateHasChanged); await Task.Delay(50); // verifico il TIPO di oggetto gestito x la procedura di update... switch (ReqApp.ApplicationType) { case CoreEnum.AppType.None: break; case CoreEnum.AppType.Cli: break; case CoreEnum.AppType.EgwACC: // sollevo richiesta riavvio! ACService.RaiseRestartReq(); break; case CoreEnum.AppType.Machine: break; case CoreEnum.AppType.WebApp: break; case CoreEnum.AppType.WinApp: await ExecWinAppUpdate(ReqApp); break; default: break; } isUpdating = false; await InvokeAsync(StateHasChanged); // check finale await ACService.DoFullCheckAsync(true); await ACService.DoTaskCheckAsync(true); ForceReload(); await InvokeAsync(StateHasChanged); } /// /// Esecuzione step update x WinApp (tipicamente IOB-WIN-*) /// /// /// private async Task ExecWinAppUpdate(VersStatusDTO ReqApp) { // esegue update delle app Iob-* Stopwatch sw = new Stopwatch(); sw.Start(); UpdateMsg = "Backup Config"; currVal = 0; nextVal = 60; await InvokeAsync(StateHasChanged); await ACService.IobWinUpdateStep(ReqApp, 1); currStats.RecordExeData("Step01_Backup", sw.Elapsed); sw.Restart(); UpdateMsg = "Download update"; currVal = 60; nextVal = 90; await InvokeAsync(StateHasChanged); await ACService.IobWinUpdateStep(ReqApp, 2); currStats.RecordExeData("Step02_Download", sw.Elapsed); sw.Restart(); UpdateMsg = "Unzip software"; currVal = 90; nextVal = 96; await InvokeAsync(StateHasChanged); await ACService.IobWinUpdateStep(ReqApp, 3); currStats.RecordExeData("Step03_UnZip", sw.Elapsed); sw.Restart(); UpdateMsg = "Config Restore"; currVal = 96; nextVal = 100; await InvokeAsync(StateHasChanged); await ACService.IobWinUpdateStep(ReqApp, 4); currStats.RecordExeData("Step04_Restore", sw.Elapsed); currStats.SaveToDisk(); UpdateMsg = "Completed!"; currVal = 100; ACService.ReportStatusUpd(); await InvokeAsync(StateHasChanged); } protected async Task ForceCheck() { isLoading = true; ListRecords = new List(); await ACService.DoFullCheckAsync(true); await ACService.DoTaskCheckAsync(true); isLoading = false; } protected override void OnInitialized() { ACService.EA_StatusUpdated += ACService_EA_StatusUpdated; ACService.EA_RemoteCalling += ACService_EA_RemoteCalling; currStats = new TaskRunStats(ACService.DataDir, "Stats.json"); } protected override void OnParametersSet() { ForceReload(); } protected void SetNumRec(int newNum) { numRecord = newNum; currPage = 1; ForceReload(); } protected void SetPage(int newNum) { currPage = newNum; ForceReload(); } protected async void ToggleSetup() { await EC_GotoSetup.InvokeAsync(true); } #endregion Protected Methods #region Private Fields private int currVal = 100; private int expTotalTimeMSec = 12000; private int maxVal = 100; private int nextVal = 100; private string UpdateMsg = "Updating..."; #endregion Private Fields #region Private Properties private int currPage { get; set; } = 1; private List CurrRecords { get => ACService.ListAppStatus; } /// /// Oggetto gestione statistiche /// private TaskRunStats currStats { get; set; } = new TaskRunStats(); private int expTimeMSec { get => expTotalTimeMSec * (nextVal - currVal) / 100; } private bool isLoading { get; set; } = false; private bool isUpdating { get; set; } = false; private List? ListRecords { get; set; } = null; private int numRecord { get; set; } = 5; private List? SearchRecords { get; set; } = null; private bool showOnlyUpdate { get; set; } = true; private int totalCount { get; set; } = 0; #endregion Private Properties #region Private Methods /// /// Gestione evento chiamata verso server /// private async void ACService_EA_RemoteCalling() { RemoteCallActive = ACService.CloudCallActive; await InvokeAsync(StateHasChanged); } private void ACService_EA_StatusUpdated() { ForceReload(); } private void ForceReload() { isLoading = true; SearchRecords = CurrRecords .Where(x => x.HasUpdate || !ShowOnlyUpdate) .ToList(); totalCount = SearchRecords.Count; ListRecords = SearchRecords .Skip(numRecord * (currPage - 1)) .Take(numRecord) .ToList(); isLoading = false; } #endregion Private Methods } }