Compare commits

...

31 Commits

Author SHA1 Message Date
Samuele Locatelli 98119d4818 Merge branch 'Release/CloneDossResValueEdit' 2022-11-07 10:16:44 +01:00
Samuele Locatelli ed2c694abd Fix duplicazione x valori edit 2022-11-07 09:34:30 +01:00
Samuele Locatelli c70ce33f26 Merge tag 'FIxArtInsertDelete' into develop
Update reset cache x edit articoli...
2022-11-04 18:11:07 +01:00
Samuele Locatelli 03eb82c7b2 Merge branch 'Release/FIxArtInsertDelete' 2022-11-04 18:10:48 +01:00
Samuele Locatelli 7655e340eb Update gest articoli
- se elimina o insert reset cache
2022-11-04 18:07:34 +01:00
Samuele Locatelli 443a56cc07 Update gestione filtro periodo parametri 2022-11-04 18:01:59 +01:00
Samuele Locatelli 06390295d2 Pulizie minori codice dossier 2022-11-04 17:34:00 +01:00
Samuele Locatelli a3f5855b4a Merge tag 'UpdateDuplicaDossier' into develop
Update gestione duplicazione dossier
2022-11-04 16:49:24 +01:00
Samuele Locatelli bd14fc0502 Merge branch 'Release/UpdateDuplicaDossier' 2022-11-04 16:48:30 +01:00
Samuele Locatelli 6525d7e803 Fix pagina contatti 2022-11-04 16:48:02 +01:00
Samuele Locatelli 140566d81b Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-11-04 16:26:25 +01:00
Samuele Locatelli af0624b9c4 Add pagina Contacts 2022-11-04 16:26:22 +01:00
zaccaria.majid 74856d9831 Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-11-04 16:15:38 +01:00
zaccaria.majid bf654f54e6 resetSelect visibile solo se record selezionato
+ refresh dopo creazione dossier
2022-11-04 16:13:02 +01:00
Samuele Locatelli 8fbfea1f62 COmplreto refresh gestione licenze LAND
- sistemato GC in generale
- controllo e sistemazione calcolo data scadenza
2022-11-04 16:09:26 +01:00
Samuele Locatelli b8dc7dffc4 Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-11-04 15:51:31 +01:00
Samuele Locatelli 2c3feaa4f3 Refresh versione 2022-11-04 15:50:51 +01:00
Samuele Locatelli dbb4fbf9e2 Inizio update LAND x problemi GC 2022-11-04 15:50:40 +01:00
zaccaria.majid d13a1b7833 aggiunta clona dossier 2022-11-04 15:20:35 +01:00
Samuele Locatelli 76c49d1eea Fix scrittura clone dossier 2022-11-04 10:10:56 +01:00
Samuele Locatelli 3f1a3aa2ce Aggiunta navmanager 2022-11-04 09:30:01 +01:00
Samuele Locatelli bbec081cae Separato codice cs x CmpTop 2022-11-04 09:29:43 +01:00
Samuele Locatelli 29fd417499 Merge remote-tracking branch 'origin/develop' into develop 2022-11-04 09:27:54 +01:00
Samuele Locatelli 5380c996ac Refresh DbModel x macchina 2022-11-04 09:27:44 +01:00
zaccaria.majid 4e61028323 Merge branch 'FeaturecloneDossier' into develop 2022-11-04 09:26:38 +01:00
zaccaria.majid 4f7ac21f41 new dossier 2022-11-04 09:20:53 +01:00
zaccaria.majid 55187eda96 dismiss nuovo dossier 2022-11-04 09:11:55 +01:00
Samuele Locatelli d6f7a55a05 update metodo insert dossier 2022-11-04 09:06:43 +01:00
zaccaria.majid c71d7291a2 Prima bozza aggiunta nuovo dossier 2022-11-03 17:21:44 +01:00
Samuele Locatelli 79c73db726 Fix reload apgina 2022-11-03 12:28:06 +01:00
Samuele Locatelli 2608395e5b Merge tag 'UpdateSpecProd' into develop
Vari udpate x fix e ottimizzazioni
2022-11-03 12:17:11 +01:00
46 changed files with 1170 additions and 577 deletions
+13 -12
View File
@@ -110,7 +110,7 @@ namespace MP.Data.Controllers
dbResult = dbCtx dbResult = dbCtx
.DbSetDossiers .DbSetDossiers
.AsNoTracking() .AsNoTracking()
.Select(i => i.OdlNav.CodArticolo) .Select(i => i.CodArticolo)
.Distinct() .Distinct()
.ToList(); .ToList();
} }
@@ -302,7 +302,7 @@ namespace MP.Data.Controllers
/// </summary> /// </summary>
/// <param name="currRec">record dossier da eliminare</param> /// <param name="currRec">record dossier da eliminare</param>
/// <returns></returns> /// <returns></returns>
public async Task<bool> DossiersDeleteRecord(Dossiers currRec) public async Task<bool> DossiersDeleteRecord(DossierModel currRec)
{ {
bool answ = false; bool answ = false;
using (var dbCtx = new MoonProContext(_configuration)) using (var dbCtx = new MoonProContext(_configuration))
@@ -336,18 +336,18 @@ namespace MP.Data.Controllers
/// <param name="DtStart">Data minima per estrazione records</param> /// <param name="DtStart">Data minima per estrazione records</param>
/// <param name="DtEnd">Data Massima per estrazione records</param> /// <param name="DtEnd">Data Massima per estrazione records</param>
/// <returns></returns> /// <returns></returns>
public List<Dossiers> DossiersGetLastFilt(string IdxMacchina, string CodArticolo, DateTime DtStart, DateTime DtEnd) public List<DossierModel> DossiersGetLastFilt(string IdxMacchina, string CodArticolo, DateTime DtStart, DateTime DtEnd)
{ {
List<Dossiers> dbResult = new List<Dossiers>(); List<DossierModel> dbResult = new List<DossierModel>();
using (var dbCtx = new MoonProContext(_configuration)) using (var dbCtx = new MoonProContext(_configuration))
{ {
dbResult = dbCtx dbResult = dbCtx
.DbSetDossiers .DbSetDossiers
.AsNoTracking() .AsNoTracking()
.Where(x => (IdxMacchina == "*" || x.IdxMacchina == IdxMacchina) && (CodArticolo == "*" || x.OdlNav.CodArticolo == CodArticolo) && (x.DtRif >= DtStart && x.DtRif <= DtEnd)) .Where(x => (IdxMacchina == "*" || x.IdxMacchina == IdxMacchina) && (CodArticolo == "*" || x.CodArticolo == CodArticolo) && (x.DtRif >= DtStart && x.DtRif <= DtEnd))
.Include(m => m.MachineNav) .Include(m => m.MachineNav)
.Include(o => o.OdlNav) //.Include(o => o.OdlNav)
.Include(a => a.OdlNav.ArticoloNav) .Include(a => a.ArticoloNav)
.OrderByDescending(x => x.DtRif) .OrderByDescending(x => x.DtRif)
.ToList(); .ToList();
} }
@@ -359,7 +359,7 @@ namespace MP.Data.Controllers
/// </summary> /// </summary>
/// <param name="editRec">record dossier da modificare</param> /// <param name="editRec">record dossier da modificare</param>
/// <returns></returns> /// <returns></returns>
public async Task<bool> DossiersInsert(Dossiers newRec) public async Task<bool> DossiersInsert(DossierModel newRec)
{ {
bool fatto = false; bool fatto = false;
using (var dbCtx = new MoonProContext(_configuration)) using (var dbCtx = new MoonProContext(_configuration))
@@ -431,7 +431,7 @@ namespace MP.Data.Controllers
/// </summary> /// </summary>
/// <param name="editRec">record dossier da modificare</param> /// <param name="editRec">record dossier da modificare</param>
/// <returns></returns> /// <returns></returns>
public async Task<bool> DossiersUpdateValore(Dossiers editRec) public async Task<bool> DossiersUpdateValore(DossierModel editRec)
{ {
bool fatto = false; bool fatto = false;
using (var dbCtx = new MoonProContext(_configuration)) using (var dbCtx = new MoonProContext(_configuration))
@@ -502,12 +502,13 @@ namespace MP.Data.Controllers
/// <summary> /// <summary>
/// Elenco ultimi n record flux log dato macchina e flusso (ordinato x data registrazione) /// Elenco ultimi n record flux log dato macchina e flusso (ordinato x data registrazione)
/// </summary> /// </summary>
/// <param name="DtMax">Data massima (recupera eventi antecedenti)</param> /// <param name="DtMax">Data massima x eventi</param>
/// <param name="DtMin">Data minima x eventi</param>
/// <param name="IdxMacchina">* = tutte, altrimenti solo x una data macchina</param> /// <param name="IdxMacchina">* = tutte, altrimenti solo x una data macchina</param>
/// <param name="CodFlux">*=tutti, altrimenti solo selezionato</param> /// <param name="CodFlux">*=tutti, altrimenti solo selezionato</param>
/// <param name="MaxRec">numero massimo record da restituire</param> /// <param name="MaxRec">numero massimo record da restituire</param>
/// <returns></returns> /// <returns></returns>
public List<FluxLog> FluxLogGetLastFilt(DateTime DtMax, string IdxMacchina, string CodFlux, int MaxRec) public List<FluxLog> FluxLogGetLastFilt(DateTime DtMax, DateTime DtMin, string IdxMacchina, string CodFlux, int MaxRec)
{ {
List<FluxLog> dbResult = new List<FluxLog>(); List<FluxLog> dbResult = new List<FluxLog>();
using (var dbCtx = new MoonProContext(_configuration)) using (var dbCtx = new MoonProContext(_configuration))
@@ -515,7 +516,7 @@ namespace MP.Data.Controllers
dbResult = dbCtx dbResult = dbCtx
.DbSetFluxLog .DbSetFluxLog
.AsNoTracking() .AsNoTracking()
.Where(x => (x.dtEvento <= DtMax) && (IdxMacchina == "*" || x.IdxMacchina == IdxMacchina) && (CodFlux == "*" || x.CodFlux == CodFlux)) .Where(x => (x.dtEvento >= DtMin && x.dtEvento <= DtMax) && (IdxMacchina == "*" || x.IdxMacchina == IdxMacchina) && (CodFlux == "*" || x.CodFlux == CodFlux))
.OrderByDescending(x => x.dtEvento) .OrderByDescending(x => x.dtEvento)
.Take(MaxRec) .Take(MaxRec)
.ToList(); .ToList();
@@ -10,7 +10,7 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
[Table("Dossiers")] [Table("Dossiers")]
public partial class Dossiers public partial class DossierModel
{ {
#region Public Properties #region Public Properties
@@ -31,7 +31,8 @@ namespace MP.Data.DatabaseModels
public string Valore { get; set; } = ""; public string Valore { get; set; } = "";
[MaxLength(50)]
public string KeyRichiesta { get; set; } = "";
/// <summary> /// <summary>
/// Navigazione oggetto Machine /// Navigazione oggetto Machine
@@ -45,6 +46,12 @@ namespace MP.Data.DatabaseModels
[ForeignKey("IdxODL")] [ForeignKey("IdxODL")]
public virtual ODLModel OdlNav { get; set; } = null!; public virtual ODLModel OdlNav { get; set; } = null!;
/// <summary>
/// Navigazione oggetto Articolo
/// </summary>
[ForeignKey("CodArticolo")]
public virtual AnagArticoli ArticoloNav { get; set; } = null!;
#endregion Public Properties #endregion Public Properties
} }
} }
+13 -3
View File
@@ -1,5 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
#nullable disable #nullable disable
@@ -8,14 +10,22 @@ using System.Collections.Generic;
// </Auto-Generated> // </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
[Table("Macchine")]
public partial class Macchine public partial class Macchine
{ {
#region Public Properties #region Public Properties
public string CodMacchina { get; set; } [Key]
public string Descrizione { get; set; }
public string IdxMacchina { get; set; } public string IdxMacchina { get; set; }
public string Nome { get; set; } public string CodMacchina { get; set; } = "";
public string Descrizione { get; set; } = "";
public string Nome { get; set; } = "";
public string Note { get; set; } = "";
public string url { get; set; } = "";
public string locazione { get; set; } = "";
public string css { get; set; } = "";
public int RowNum { get; set; } = 0;
public int ColNum { get; set; } = 0;
#endregion Public Properties #endregion Public Properties
} }
+1 -1
View File
@@ -47,7 +47,7 @@ namespace MP.Data
public virtual DbSet<ODLModel> DbSetODL { get; set; } public virtual DbSet<ODLModel> DbSetODL { get; set; }
public virtual DbSet<PODLModel> DbSetPODL { get; set; } public virtual DbSet<PODLModel> DbSetPODL { get; set; }
public virtual DbSet<FluxLog> DbSetFluxLog { get; set; } public virtual DbSet<FluxLog> DbSetFluxLog { get; set; }
public virtual DbSet<Dossiers> DbSetDossiers { get; set; } public virtual DbSet<DossierModel> DbSetDossiers { get; set; }
public virtual DbSet<StatODLModel> DbSetStatOdl { get; set; } public virtual DbSet<StatODLModel> DbSetStatOdl { get; set; }
public virtual DbSet<StatoProdModel> DbSetStatoProd { get; set; } public virtual DbSet<StatoProdModel> DbSetStatoProd { get; set; }
public virtual DbSet<EventListModel> DbSetEvList { get; set; } public virtual DbSet<EventListModel> DbSetEvList { get; set; }
-55
View File
@@ -22,62 +22,7 @@
</div> </div>
</div> </div>
@code {
//[CascadingParameter]
//private Task<AuthenticationState> AuthenticationStateTask { get; set; }
[CascadingParameter(Name = "ShowSearch")]
private bool ShowSearch { get; set; }
private string userName = "";
private string PageName { get; set; }
private string PageIcon { get; set; }
protected override async Task OnInitializedAsync()
{
await forceReload();
}
protected override void OnInitialized()
{
AppMessages.EA_PageUpdated += OnPageUpdate;
}
public void OnPageUpdate()
{
PageName = AppMessages.PageName;
PageIcon = AppMessages.PageIcon;
InvokeAsync(() =>
{
StateHasChanged();
});
}
public void Dispose()
{
AppMessages.EA_PageUpdated -= OnPageUpdate;
}
private async Task forceReload()
{
userName = "N.A.";
await Task.Delay(1);
#if false
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
userName = $"{user.Identity.Name}";
}
else
{
userName = "N.A.";
}
#endif
}
}
@* // Vedere anche: @* // Vedere anche:
// https://docs.microsoft.com/en-us/aspnet/core/blazor/security/?view=aspnetcore-5.0#:~:text=Blazor%20uses%20the%20existing%20ASP.NET%20Core%20authentication%20mechanisms,all%20client-side%20code%20can%20be%20modified%20by%20users // https://docs.microsoft.com/en-us/aspnet/core/blazor/security/?view=aspnetcore-5.0#:~:text=Blazor%20uses%20the%20existing%20ASP.NET%20Core%20authentication%20mechanisms,all%20client-side%20code%20can%20be%20modified%20by%20users
+83
View File
@@ -0,0 +1,83 @@
using Microsoft.AspNetCore.Components;
using System;
using System.Threading.Tasks;
namespace MP.Land.Components
{
public partial class CmpTop
{
#region Public Methods
public void Dispose()
{
AppMessages.EA_PageUpdated -= OnPageUpdate;
GC.Collect();
}
public void OnPageUpdate()
{
PageName = AppMessages.PageName;
PageIcon = AppMessages.PageIcon;
InvokeAsync(() =>
{
StateHasChanged();
});
}
#endregion Public Methods
#region Protected Methods
protected override void OnInitialized()
{
AppMessages.EA_PageUpdated += OnPageUpdate;
}
protected override async Task OnInitializedAsync()
{
await forceReload();
}
#endregion Protected Methods
#region Private Fields
private string userName = "";
#endregion Private Fields
#region Private Properties
private string PageIcon { get; set; }
private string PageName { get; set; }
[CascadingParameter(Name = "ShowSearch")]
private bool ShowSearch { get; set; }
#endregion Private Properties
#region Private Methods
private async Task forceReload()
{
userName = "N.A.";
await Task.Delay(1);
#if false
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
userName = $"{user.Identity.Name}";
}
else
{
userName = "N.A.";
}
#endif
}
#endregion Private Methods
}
}
-76
View File
@@ -53,79 +53,3 @@ else // disegno box non cliccabile e licenza mancante
</div> </div>
} }
@code {
[Parameter]
public UpdMan CurrItem { get; set; }
protected List<AnagKeyValueModel> AKVList
{
get
{
return LicServ.AKVList;
}
set
{
LicServ.AKVList = value;
}
}
protected override async Task OnInitializedAsync()
{
// check init AKV
if (AKVList == null || AKVList.Count == 0)
{
AKVList = await DataService.AnagKeyValList();
LicServ.InitAkv();
}
}
protected string getAKVString(string nomeVar)
{
string answ = "";
if (AKVList != null)
{
var currRec = AKVList.FirstOrDefault(x => x.NomeVar == nomeVar);
if (currRec != null)
{
answ = currRec.ValString;
}
}
return answ;
}
protected AnagKeyValueModel getAKVRec(string nomeVar)
{
AnagKeyValueModel answ = new AnagKeyValueModel();
if (AKVList != null)
{
answ = AKVList.FirstOrDefault(x => x.NomeVar == nomeVar);
}
return answ;
}
protected bool authOk()
{
bool allOk = !string.IsNullOrEmpty(CurrItem.LicenseKey);
if (allOk)
{
allOk = LicServ.checkLicenseActive(CurrItem.LicenseKey);
}
return allOk;
}
protected string fullUrl(string relUrl)
{
return $"{Configuration["ServerConf:BaseUrl"]}{relUrl}";
}
protected MarkupString traduci(string lemma)
{
MarkupString answ;
string rawHtml = DataService.Traduci(lemma, "IT");
answ = new MarkupString(rawHtml);
return answ;
}
}
+109
View File
@@ -0,0 +1,109 @@
using Microsoft.AspNetCore.Components;
using MP.AppAuth.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MP.Land.Components
{
public partial class HomeLink : IDisposable
{
#region Public Properties
[Parameter]
public UpdMan CurrItem { get; set; }
#endregion Public Properties
#region Public Methods
public void Dispose()
{
GC.Collect();
}
#endregion Public Methods
#region Protected Properties
protected List<AnagKeyValueModel> AKVList
{
get
{
return LicServ.AKVList;
}
set
{
LicServ.AKVList = value;
}
}
#endregion Protected Properties
#region Protected Methods
protected bool authOk()
{
bool allOk = !string.IsNullOrEmpty(CurrItem.LicenseKey);
if (allOk)
{
allOk = LicServ.checkLicenseActive(CurrItem.LicenseKey);
}
return allOk;
}
protected string fullUrl(string relUrl)
{
return $"{Configuration["ServerConf:BaseUrl"]}{relUrl}";
}
protected AnagKeyValueModel getAKVRec(string nomeVar)
{
AnagKeyValueModel answ = new AnagKeyValueModel();
if (AKVList != null)
{
answ = AKVList.FirstOrDefault(x => x.NomeVar == nomeVar);
}
return answ;
}
protected string getAKVString(string nomeVar)
{
string answ = "";
if (AKVList != null)
{
var currRec = AKVList.FirstOrDefault(x => x.NomeVar == nomeVar);
if (currRec != null)
{
answ = currRec.ValString;
}
}
return answ;
}
protected override async Task OnInitializedAsync()
{
// check init AKV
if (AKVList == null || AKVList.Count == 0)
{
AKVList = await DataService.AnagKeyValList();
LicServ.InitAkv();
}
}
protected MarkupString traduci(string lemma)
{
MarkupString answ;
string rawHtml = DataService.Traduci(lemma, "IT");
answ = new MarkupString(rawHtml);
return answ;
}
#endregion Protected Methods
}
}
+29 -1
View File
@@ -372,7 +372,35 @@ namespace MP.Land.Data
} }
else else
{ {
_logger.LogInformation($"Record non trovato per {authKey}"); _logger.LogInformation($"checkLicenseActive | Record non trovato per {authKey}");
}
}
return answ;
}
/// <summary>
/// Verifica scadenza licenza
/// </summary>
/// <param name="authKey"></param>
/// <returns></returns>
public DateTime getLicenseExpiry(string authKey)
{
DateTime answ = DateTime.Today.AddDays(-1);
//cerco anche nelle info AKV
if (AKVList != null)
{
var recLic = AKVList.Where(x => x.ValString == authKey).FirstOrDefault();
int numLic = 0;
//cerco in record
if (recLic != null)
{
numLic = (int)recLic.ValInt;
// verifico scadenza licenza!
DateTime scadenza = licenseManGLS.expiryDateByAuthKey(Installazione, recLic.NomeVar, numLic, authKey);
answ = scadenza;
}
else
{
_logger.LogInformation($"getLicenseExpiry | Record non trovato per {authKey}");
} }
} }
return answ; return answ;
+1 -1
View File
@@ -3,7 +3,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<RootNamespace>MP.Land</RootNamespace> <RootNamespace>MP.Land</RootNamespace>
<Version>6.16.2210.2110</Version> <Version>6.16.2211.0416</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
+30 -33
View File
@@ -1,40 +1,12 @@
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.Land;
using MP.Land.Shared;
using MP.Land.Data;
using NLog; using NLog;
using System;
using System.Threading.Tasks;
namespace MP.Land.Pages namespace MP.Land.Pages
{ {
public partial class About public partial class About
{ {
private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); #region Protected Methods
private string Titolo = "";
private string Messaggio = "";
private string ServerStatus = "SrvState";
private string Installazione = "Inst";
private string Applicazione = "App";
private string Licenze = "#";
private DateTime Scadenza = DateTime.Today;
private string MastKey = "########################";
private string mainCss = "alert alert-info";
private string remSrvCss = "bg-warning text-secondary";
private string expDateCss = "bg-warning text-secondary";
private string licenseCss = "bg-warning text-secondary";
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
@@ -43,9 +15,31 @@ namespace MP.Land.Pages
await reloadLicenseData(); await reloadLicenseData();
} }
#endregion Protected Methods
#region Private Fields
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
private string Applicazione = "App";
private string expDateCss = "bg-warning text-secondary";
private string Installazione = "Inst";
private string licenseCss = "bg-warning text-secondary";
private string Licenze = "#";
private string mainCss = "alert alert-info";
private string MastKey = "########################";
private string Messaggio = "";
private string remSrvCss = "bg-warning text-secondary";
private DateTime Scadenza = DateTime.Today;
private string ServerStatus = "SrvState";
private string Titolo = "";
#endregion Private Fields
#region Private Methods
private async Task reloadLicenseData() private async Task reloadLicenseData()
{ {
int cDelay = 5; int cDelay = 10;
// recupero dati // recupero dati
await Task.Delay(cDelay); await Task.Delay(cDelay);
try try
@@ -56,13 +50,14 @@ namespace MP.Land.Pages
Installazione = LicServ.Installazione; Installazione = LicServ.Installazione;
Applicazione = LicServ.Applicazione; Applicazione = LicServ.Applicazione;
MastKey = LicServ.MasterKey; MastKey = LicServ.MasterKey;
Scadenza = LicServ.getLicenseExpiry(LicServ.MasterKey);
await Task.Delay(cDelay); await Task.Delay(cDelay);
var fatto = await LicServ.RefreshLicense(); var fatto = await LicServ.RefreshLicense();
await Task.Delay(cDelay); await Task.Delay(cDelay);
Licenze = $"{LicServ.NumLicDb}/{LicServ.NumLicRemote}"; Licenze = $"{LicServ.NumLicDb}/{LicServ.NumLicRemote}";
licenseCss = ""; licenseCss = "";
} }
catch(Exception exc) catch (Exception exc)
{ {
licenseCss = "bg-dark text-warning"; licenseCss = "bg-dark text-warning";
Log.Error($"Eccezione in reloadLicenseData:{Environment.NewLine}{exc}"); Log.Error($"Eccezione in reloadLicenseData:{Environment.NewLine}{exc}");
@@ -86,5 +81,7 @@ namespace MP.Land.Pages
AppMService.PageName = "About"; AppMService.PageName = "About";
AppMService.PageIcon = "fas fa-info-circle pr-2"; AppMService.PageIcon = "fas fa-info-circle pr-2";
} }
#endregion Private Methods
} }
} }
-14
View File
@@ -69,17 +69,3 @@
</div> </div>
</div> </div>
@code {
protected string Titolo = "";
protected string Messaggio = "";
protected override void OnInitialized()
{
Titolo = "Mapo MES";
Messaggio = "I nostri contattatti e siti di supporto";
AppMService.ShowSearch = false;
AppMService.PageName = "Contacts";
AppMService.PageIcon = "fas fa-envelope pr-2";
}
}
+36
View File
@@ -0,0 +1,36 @@
using System;
namespace MP.Land.Pages
{
public partial class Contacts : IDisposable
{
#region Public Methods
public void Dispose()
{
GC.Collect();
}
#endregion Public Methods
#region Protected Fields
protected string Messaggio = "";
protected string Titolo = "";
#endregion Protected Fields
#region Protected Methods
protected override void OnInitialized()
{
Titolo = "Mapo MES";
Messaggio = "I nostri contattatti e siti di supporto";
AppMService.ShowSearch = false;
AppMService.PageName = "Contacts";
AppMService.PageIcon = "fas fa-envelope pr-2";
}
#endregion Protected Methods
}
}
+17 -10
View File
@@ -1,22 +1,23 @@
using System; using Microsoft.AspNetCore.Components;
using MP.Land.Data;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using MP.Land.Data;
using MP.Land.Components;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Configuration;
using MP.AppAuth.Models;
namespace MP.Land.Pages namespace MP.Land.Pages
{ {
public partial class Index public partial class Index : IDisposable
{ {
#region Private Fields #region Public Methods
private List<MP.AppAuth.Models.UpdMan> ListRecords; public void Dispose()
{
ListRecords = null;
GC.Collect();
}
#endregion Private Fields #endregion Public Methods
#region Protected Fields #region Protected Fields
@@ -63,5 +64,11 @@ namespace MP.Land.Pages
} }
#endregion Protected Methods #endregion Protected Methods
#region Private Fields
private List<MP.AppAuth.Models.UpdMan> ListRecords;
#endregion Private Fields
} }
} }
+7 -55
View File
@@ -42,25 +42,25 @@
<div class="list-group"> <div class="list-group">
<div class="list-group-item"> <div class="list-group-item">
<div class="d-flex w-100 justify-content-between"> <div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">Environment</h5> <b class="mb-1">Environment</b>
</div> </div>
<p class="mb-1">@Environment</p> <p class="mb-1">@Environment</p>
</div> </div>
<div class="list-group-item"> <div class="list-group-item">
<div class="d-flex w-100 justify-content-between"> <div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">Main DB Conf</h5> <b class="mb-1">Main DB Conf</b>
</div> </div>
<p class="mb-1">@DbNameExample</p> <p class="mb-1">@DbNameExample</p>
</div> </div>
<div class="list-group-item"> <div class="list-group-item">
<div class="d-flex w-100 justify-content-between"> <div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">.net framework</h5> <b class="mb-1">.net framework</b>
</div> </div>
<p class="mb-1">@currHwSwInfo.runtimeImg</p> <p class="mb-1">@currHwSwInfo.runtimeImg</p>
</div> </div>
<div class="list-group-item"> <div class="list-group-item">
<div class="d-flex w-100 justify-content-between"> <div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">Main Assembly</h5> <b class="mb-1">Main Assembly</b>
</div> </div>
<p class="mb-1">@currHwSwInfo.mainAssembly</p> <p class="mb-1">@currHwSwInfo.mainAssembly</p>
</div> </div>
@@ -81,7 +81,7 @@
<div class="list-group"> <div class="list-group">
<div class="list-group-item"> <div class="list-group-item">
<div class="d-flex w-100 justify-content-between"> <div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">Server Stats</h5> <b class="mb-1">Server Stats</b>
</div> </div>
<p class="mb-1"> <p class="mb-1">
<pre>@currHwSwInfo.ServerStats</pre> <pre>@currHwSwInfo.ServerStats</pre>
@@ -89,7 +89,7 @@
</div> </div>
<div class="list-group-item"> <div class="list-group-item">
<div class="d-flex w-100 justify-content-between"> <div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">IIS Stats</h5> <b class="mb-1">IIS Stats</b>
</div> </div>
<p class="mb-1"> <p class="mb-1">
<pre>@currHwSwInfo.IISStats</pre> <pre>@currHwSwInfo.IISStats</pre>
@@ -112,7 +112,7 @@
<div class="list-group"> <div class="list-group">
<div class="list-group-item"> <div class="list-group-item">
<div class="d-flex w-100 justify-content-between"> <div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">Elenco librerie</h5> <b class="mb-1">Elenco librerie</b>
<span>@currHwSwInfo.numLibraries</span> <span>@currHwSwInfo.numLibraries</span>
</div> </div>
<p class="mb-1"> <p class="mb-1">
@@ -133,51 +133,3 @@
</div> </div>
</div> </div>
</div> </div>
@code {
// imposto i vari dati da mostrare a video senza indicare come bypassare...
protected string Titolo = "MAPO System Info";
protected string Messaggio = "HW & SW details";
protected HwSwInfo currHwSwInfo = HwSwInfo.man(System.Reflection.Assembly.GetExecutingAssembly());
protected string masterLic = "";
protected override async Task OnInitializedAsync()
{
await ReloadData();
}
protected async Task ReloadData()
{
var akvList = await DataService.AnagKeyValList();
var licRecord = akvList
.Where(x => x.NomeVar == "MAPO")
.FirstOrDefault();
if (licRecord != null)
{
masterLic = licRecord.ValString;
}
}
protected string DbNameExample
{
get
{
string answ = Configuration["ConnectionStrings:DefaultConnection"];
if (answ.IndexOf(";User ID=") > 0)
{
answ = answ.Substring(0, answ.IndexOf(";User ID="));
}
return answ;
}
}
protected string Environment
{
get
{
string answ = Configuration["Environment"];
return answ;
}
}
}
+72
View File
@@ -0,0 +1,72 @@
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.Land;
using MP.Land.Shared;
using MP.AppAuth;
using MP.Land.Data;
using Microsoft.Extensions.Configuration;
namespace MP.Land.Pages
{
public partial class SysInfo : IDisposable
{
public void Dispose()
{
GC.Collect();
}
// imposto i vari dati da mostrare a video senza indicare come bypassare...
protected string Titolo = "MAPO System Info";
protected string Messaggio = "HW & SW details";
protected HwSwInfo currHwSwInfo = HwSwInfo.man(System.Reflection.Assembly.GetExecutingAssembly());
protected string masterLic = "";
protected override async Task OnInitializedAsync()
{
await ReloadData();
}
protected async Task ReloadData()
{
var akvList = await DataService.AnagKeyValList();
var licRecord = akvList.Where(x => x.NomeVar == "MAPO").FirstOrDefault();
if (licRecord != null)
{
masterLic = licRecord.ValString;
}
}
protected string DbNameExample
{
get
{
string answ = Configuration["ConnectionStrings:DefaultConnection"];
if (answ.IndexOf(";User ID=") > 0)
{
answ = answ.Substring(0, answ.IndexOf(";User ID="));
}
return answ;
}
}
protected string Environment
{
get
{
string answ = Configuration["Environment"];
return answ;
}
}
}
}
+34 -28
View File
@@ -10,22 +10,24 @@ using System.Threading.Tasks;
namespace MP.Land.Pages namespace MP.Land.Pages
{ {
public partial class UpdateManager public partial class UpdateManager : IDisposable
{ {
#region Private Fields #region Public Methods
private List<MP.AppAuth.Models.UpdMan> ListRecords; public void Dispose()
{
ListRecords = null;
GC.Collect();
}
#endregion Private Fields #endregion Public Methods
#region Protected Fields #region Protected Fields
protected int numDone = 0; protected int numDone = 0;
protected int numTot = 0; protected int numTot = 0;
protected int totalCount = 0; protected int totalCount = 0;
protected double TotalMb = 0; protected double TotalMb = 0;
protected UpdateMan updateManAuth = new UpdateMan("SWDownloader", "viaD@nte16"); protected UpdateMan updateManAuth = new UpdateMan("SWDownloader", "viaD@nte16");
#endregion Protected Fields #endregion Protected Fields
@@ -42,34 +44,12 @@ namespace MP.Land.Pages
protected AppAuthService DataService { get; set; } protected AppAuthService DataService { get; set; }
protected string outMessages { get; set; } = ""; protected string outMessages { get; set; } = "";
protected int percLoading { get; set; } = 0; protected int percLoading { get; set; } = 0;
protected bool showProgress { get; set; } = false; protected bool showProgress { get; set; } = false;
protected bool showUpdate { get; set; } = false; protected bool showUpdate { get; set; } = false;
#endregion Protected Properties #endregion Protected Properties
#region Private Methods
private async Task<long> scaricaSingolo(AppAuth.Models.UpdMan item)
{
long size = 0;
if (item.IsAuth)
{
size = updateManAuth.downloadLatest(item.ManifestUrl, localPath(item.LocalRepo), item.PackName);
}
else
{
size = UpdateMan.obj.downloadLatest(item.ManifestUrl, localPath(item.LocalRepo), item.PackName);
}
numDone++;
percLoading = 100 * numDone / numTot;
return await Task.FromResult(size);
}
#endregion Private Methods
#region Protected Methods #region Protected Methods
/// <summary> /// <summary>
@@ -151,5 +131,31 @@ namespace MP.Land.Pages
} }
#endregion Protected Methods #endregion Protected Methods
#region Private Fields
private List<MP.AppAuth.Models.UpdMan> ListRecords;
#endregion Private Fields
#region Private Methods
private async Task<long> scaricaSingolo(AppAuth.Models.UpdMan item)
{
long size = 0;
if (item.IsAuth)
{
size = updateManAuth.downloadLatest(item.ManifestUrl, localPath(item.LocalRepo), item.PackName);
}
else
{
size = UpdateMan.obj.downloadLatest(item.ManifestUrl, localPath(item.LocalRepo), item.PackName);
}
numDone++;
percLoading = 100 * numDone / numTot;
return await Task.FromResult(size);
}
#endregion Private Methods
} }
} }
+3
View File
@@ -16,6 +16,9 @@ namespace MP.Land.Pages
public void Dispose() public void Dispose()
{ {
AppMService.EA_SearchUpdated -= OnSeachUpdated; AppMService.EA_SearchUpdated -= OnSeachUpdated;
AppMService.EA_FilterUpdated -= OnFilterUpdated;
ListRecords = null;
GC.Collect();
} }
#endregion Public Methods #endregion Public Methods
+1 -1
View File
@@ -1,6 +1,6 @@
<body> <body>
<i>Modulo gestione Programmi MAPO</i> <i>Modulo gestione Programmi MAPO</i>
<h4>Versione: 6.16.2210.2110</h4> <h4>Versione: 6.16.2211.0416</h4>
<br /> <br />
Note di rilascio: Note di rilascio:
<ul> <ul>
+1 -1
View File
@@ -1 +1 @@
6.16.2210.2110 6.16.2211.0416
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<item> <item>
<version>6.16.2210.2110</version> <version>6.16.2211.0416</version>
<url>https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/MP.Land.zip</url> <url>https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/MP.Land.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/ChangeLog.html</changelog> <changelog>https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory> <mandatory>false</mandatory>
-32
View File
@@ -26,35 +26,3 @@
</CascadingValue> </CascadingValue>
</div> </div>
@code {
bool ShowSearch { get; set; } = false;
protected override void OnInitialized()
{
AppMService.EA_ShowSearch += OnShowSearch;
AppMService.EA_HideSearch += OnHideSearch;
}
public void OnShowSearch()
{
ShowSearch = true;
InvokeAsync(() =>
{
StateHasChanged();
});
}
public void OnHideSearch()
{
ShowSearch = false;
InvokeAsync(() =>
{
StateHasChanged();
});
}
public void Dispose()
{
AppMService.EA_ShowSearch -= OnShowSearch;
AppMService.EA_ShowSearch -= OnHideSearch;
}
}
+52
View File
@@ -0,0 +1,52 @@
using System;
namespace MP.Land.Shared
{
public partial class MainLayout
{
#region Public Methods
public void Dispose()
{
AppMService.EA_ShowSearch -= OnShowSearch;
AppMService.EA_ShowSearch -= OnHideSearch;
GC.Collect();
}
public void OnHideSearch()
{
ShowSearch = false;
InvokeAsync(() =>
{
StateHasChanged();
});
}
public void OnShowSearch()
{
ShowSearch = true;
InvokeAsync(() =>
{
StateHasChanged();
});
}
#endregion Public Methods
#region Protected Methods
protected override void OnInitialized()
{
AppMService.EA_ShowSearch += OnShowSearch;
AppMService.EA_HideSearch += OnHideSearch;
}
#endregion Protected Methods
#region Private Properties
private bool ShowSearch { get; set; } = false;
#endregion Private Properties
}
}
-59
View File
@@ -24,63 +24,4 @@
</div>*@ </div>*@
</div> </div>
@code {
protected bool ShowSearch
{
get => MService.ShowSearch;
set => MService.ShowSearch = value;
}
private string userName = "";
private string TipoSearch
{
get => MService.TipoSearch;
set => MService.TipoSearch = value;
}
protected override async Task OnInitializedAsync()
{
MService.EA_ShowSearch += MService_EA_ShowSearch;
await forceReload();
}
private async void MService_EA_ShowSearch()
{
await Task.Delay(1);
await InvokeAsync(() => StateHasChanged());
}
private async Task forceReload()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity != null&& user.Identity.IsAuthenticated)
{
userName = $"{user.Identity.Name}";
}
else
{
userName = "N.A.";
}
}
public async Task flushCache()
{
await Task.Delay(1);
await MDService.FlushRedisCache();
await JSRuntime.InvokeAsync<bool>("location.reload");
// rimando a home
//NavManager.NavigateTo("", true);
}
[Inject]
private NavigationManager NavManager { get; set; } = null!;
[Inject]
protected MpDataService MDService { get; set; } = null!;
[Inject]
protected IJSRuntime JSRuntime { get; set; } = null!;
}
+84
View File
@@ -0,0 +1,84 @@
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.JSInterop;
using MP.SPEC.Data;
namespace MP.SPEC.Components
{
public partial class CmpTop
{
#region Public Methods
public async Task flushCache()
{
await Task.Delay(1);
await MDService.FlushRedisCache();
await Task.Delay(1);
// rimando a pagina corrente
NavManager.NavigateTo(NavManager.Uri, true);
}
#endregion Public Methods
#region Protected Properties
[Inject]
protected IJSRuntime JSRuntime { get; set; } = null!;
[Inject]
protected MpDataService MDService { get; set; } = null!;
protected bool ShowSearch { get => MService.ShowSearch; set => MService.ShowSearch = value; }
#endregion Protected Properties
#region Protected Methods
protected override async Task OnInitializedAsync()
{
MService.EA_ShowSearch += MService_EA_ShowSearch;
await forceReload();
}
#endregion Protected Methods
#region Private Fields
private string userName = "";
#endregion Private Fields
#region Private Properties
[Inject]
private NavigationManager NavManager { get; set; } = null!;
private string TipoSearch { get => MService.TipoSearch; set => MService.TipoSearch = value; }
#endregion Private Properties
#region Private Methods
private async Task forceReload()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity != null && user.Identity.IsAuthenticated)
{
userName = $"{user.Identity.Name}";
}
else
{
userName = "N.A.";
}
}
private async void MService_EA_ShowSearch()
{
await Task.Delay(1);
await InvokeAsync(() => StateHasChanged());
}
#endregion Private Methods
}
}
+135 -8
View File
@@ -14,6 +14,7 @@ else if (totalCount == 0)
} }
else else
{ {
<!-- INIZIO: MODIFICA FLUSSO -->
@if (currFluxLogDto != null) @if (currFluxLogDto != null)
{ {
<div class="row"> <div class="row">
@@ -78,13 +79,137 @@ else
</div> </div>
</div> </div>
} }
<!-- FINE: MODIFICA FLUSSO -->
<!-- INIZIO: NUOVO DOSSIER -->
@if (currRecordClone != null)
{
<div class="row">
<div class="col-12">
<div class="card mb-5">
<div class="card-header bg-primary text-light d-flex justify-content-between">
<div>
Nuovo Dossier
</div>
</div>
<div class="card-body">
<!--INIZIO PRIMA RIGA-->
<div class="row">
<div class="col-4 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm">MACCHINA</span>
<select @bind="@currRecordClone.IdxMacchina" class="form-select" id="macchina" title="Selezionare la macchina" @onclick="()=> enableEditing()">
@if (ListMacchine != null)
{
foreach (var item in ListMacchine)
{
@if (item.IdxMacchina == currRecordClone.IdxMacchina)
{
<option value="@item.IdxMacchina" selected>@item.IdxMacchina | @item.Descrizione</option>
}
else
{
<option value="@item.IdxMacchina">@item.IdxMacchina | @item.Descrizione</option>
}
}
}
</select>
</div>
</div>
<div class="col-4 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm">FASE</span>
<select class="form-select" @bind="@currRecordClone.KeyRichiesta" @onclick="()=> enableEditing()" title="Selezionare la fase">
@if (ListStati != null)
{
foreach (var item in ListStati)
{
@if (item.value == currRecordClone.KeyRichiesta)
{
<option value="@item.value" selected>@item.label</option>
}
else
{
<option value="@item.value">@item.label</option>
}
}
}
</select>
</div>
</div>
<div class="col-4 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm" @onclick="()=> enableEditing()">ARTICOLI</span>
<select @bind="@currRecordClone.CodArticolo" class="form-select" id="macchina" title="Selezionare l'articolo">
@if (ListArticoli != null)
{
foreach (var item in ListArticoli)
{
@if (item.CodArticolo == currRecordClone.CodArticolo)
{
<option value="@item.CodArticolo" selected>@item.CodArticolo | @item.DescArticolo</option>
}
else
{
<option value="@item.CodArticolo">@item.CodArticolo | @item.DescArticolo</option>
}
}
}
</select>
</div>
</div>
</div>
<!--FINE PRIMA RIGA-->
<div class="row pt-4">
<div class="col-3 pe-0">
</div>
<div class="col-3 pe-0">
</div>
<div class="col-3 pe-0">
<div class="d-grid gap-2">
<button @onclick="() => cancelNewDoss()" class="btn btn-warning">Annulla <i class="bi bi-x-circle"></i></button>
</div>
</div>
<div class="col-3 pe-0">
<div class="d-grid gap-2">
<button @onclick="() => newDossier(currRecordClone)" class="btn btn-success">Save <i class="bi bi-save"></i></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
}
<!-- FINE: NUOVO DOSSIER -->
<div class="row"> <div class="row">
<div class="d-flex justify justify-content-between"> <div class="d-flex justify justify-content-between">
<table class="table table-sm table-striped small"> <table class="table table-sm table-striped small">
<thead> <thead>
<tr> <tr>
<th> <th>
<button @onclick="() => closeTableFlux()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button> <div class="text-nowrap">
@if (currRecord != null)
{
<button @onclick="() => closeTableFlux()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
<button @onclick="()=> cloneRecord(currRecord)" class="btn btn-info btn-sm" title="Duplica Record"><i class="bi bi-clipboard-check"></i></button>
}
</div>
</th> </th>
<th><i class="fa-solid fa-file"></i> Articolo</th> <th><i class="fa-solid fa-file"></i> Articolo</th>
<th><i class="fa-solid fa-screwdriver-wrench"></i> Fase</th> <th><i class="fa-solid fa-screwdriver-wrench"></i> Fase</th>
@@ -101,8 +226,10 @@ else
<td> <td>
@if (isEditing == false) @if (isEditing == false)
{ {
<!--SEL RECORD PER VISUALIZZAZIONE FLUSSI-->
<button class="btn btn-primary btn-sm" @onclick="() => selRecord(record)"><i class="fa-solid fa-magnifying-glass"></i></button> <button class="btn btn-primary btn-sm" @onclick="() => selRecord(record)"><i class="fa-solid fa-magnifying-glass"></i></button>
<!--SEL RECORD PER CLONA DOSSIER-->
@*<button @onclick="()=> cloneRecord(record)" class="btn btn-info btn-sm" title="Duplica Record"><i class="bi bi-clipboard-check"></i></button>*@
} }
else else
{ {
@@ -110,15 +237,15 @@ else
} }
</td> </td>
<td> <td>
@record.OdlNav.CodArticolo @record.CodArticolo
<div class="small textConsensed text-secondary">@record.OdlNav.ArticoloNav.DescArticolo</div> <div class="small textConsensed text-secondary">@record.ArticoloNav.DescArticolo</div>
</td> </td>
<td> <td>
@tradFase(record.OdlNav.KeyRichiesta) @tradFase(record.KeyRichiesta)
</td> </td>
<td> <td>
@record.IdxMacchina @record.IdxMacchina
<div class="small textConsensed text-secondary">@record.MachineNav.Descrizione</div> @*<div class="small textConsensed text-secondary">@record.MachineNav.Descrizione</div>*@
</td> </td>
<td> <td>
@record.DtRif @record.DtRif
@@ -180,8 +307,8 @@ else
@record.dtEvento @record.dtEvento
</td> </td>
<td> <td>
@record.CodFlux @traduci(record.CodFlux)
<div class="small text-dark" title="Valore Registrato"><i>@traduci(record.CodFlux)</i></div> <div class="small textConsensed text-secondary" title="Valore Registrato">@record.CodFlux</div>
</td> </td>
<td style="text-align: right;"> <td style="text-align: right;">
@if (record.ValoreEdit != record.Valore) @if (record.ValoreEdit != record.Valore)
+206 -94
View File
@@ -1,5 +1,4 @@
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.JSInterop; using Microsoft.JSInterop;
using MP.Data.DatabaseModels; using MP.Data.DatabaseModels;
using MP.Data.DTO; using MP.Data.DTO;
@@ -13,7 +12,7 @@ namespace MP.SPEC.Components
#region Public Properties #region Public Properties
[Parameter] [Parameter]
public EventCallback<Dossiers> RecordSel { get; set; } public EventCallback<DossierModel> RecordSel { get; set; }
[Parameter] [Parameter]
public EventCallback<FluxLogDTO> RecordSelFlux { get; set; } public EventCallback<FluxLogDTO> RecordSelFlux { get; set; }
@@ -28,8 +27,20 @@ namespace MP.SPEC.Components
#region Public Methods #region Public Methods
private FluxLogDTO? currFluxLogDto = null; public string checkSelect(DossierModel recordSel)
{
string answ = "";
if (currRecord != null)
{
try
{
answ = (currRecord.IdxMacchina == recordSel.IdxMacchina && currRecord.DtRif == recordSel.DtRif) ? "table-info" : "";
}
catch
{ }
}
return answ;
}
public string checkSelPar(FluxLogDTO recordSel) public string checkSelPar(FluxLogDTO recordSel)
{ {
@@ -46,21 +57,6 @@ namespace MP.SPEC.Components
return answ; return answ;
} }
public string checkSelect(Dossiers recordSel)
{
string answ = "";
if (currRecord != null)
{
try
{
answ = (currRecord.IdxMacchina == recordSel.IdxMacchina && currRecord.DtRif == recordSel.DtRif) ? "table-info" : "";
}
catch
{ }
}
return answ;
}
public void Dispose() public void Dispose()
{ {
currRecord = null; currRecord = null;
@@ -68,40 +64,82 @@ namespace MP.SPEC.Components
ListRecords = null; ListRecords = null;
GC.Collect(); GC.Collect();
} }
private SelectDossierParams lastFilter { get; set; } = new SelectDossierParams() { CurrPage = -1 };
protected override async Task OnParametersSetAsync() public async Task flushCache()
{ {
if (!lastFilter.Equals(SelFilter)) await Task.Delay(1);
{ await MDService.FlushRedisCache();
lastFilter = SelFilter.clone(); await Task.Delay(1);
await reloadData(true); // rimando a pagina corrente
} NavManager.NavigateTo(NavManager.Uri, true);
} }
#endregion Public Methods #endregion Public Methods
#region Protected Properties #region Protected Properties
private string traduci(string lemma)
{
var answ = MDService.Traduci(lemma, "IT");
return answ;
}
[Inject] [Inject]
protected IJSRuntime JSRuntime { get; set; } = null!; protected IJSRuntime JSRuntime { get; set; } = null!;
[Inject] [Inject]
protected MpDataService MDService { get; set; } = null!; protected MpDataService MDService { get; set; } = null!;
#endregion Protected Properties #endregion Protected Properties
#region Protected Methods #region Protected Methods
protected async Task cancel()
{
var alert = await JSRuntime.InvokeAsync<bool>("confirm", "Confermi di voler annullare TUTTE le modifiche? i dati saranno ricaricati.");
if (alert)
{
currFluxLogDto = null;
isEditing = false;
await Task.Delay(1);
if (currRecord != null)
{
listaFlux = MDService.getFluxLog(currRecord.Valore);
}
StateHasChanged();
}
}
protected async Task cancelNewDoss()
{
var alert = await JSRuntime.InvokeAsync<bool>("confirm", "Confermi di voler annullare l'aggiunta di un nuovo dossier? i dati saranno ricaricati.");
if (alert)
{
currRecordClone = null;
isEditing = false;
await Task.Delay(1);
StateHasChanged();
}
}
protected async Task cloneRecord(DossierModel selRec)
{
// creo record duplicato...
DossierModel newRec = new DossierModel()
{
//IdxDossier = 0,
DataType = selRec.DataType,
KeyRichiesta = selRec.KeyRichiesta,
DtRif = DateTime.Now,
IdxMacchina = selRec.IdxMacchina,
CodArticolo = selRec.CodArticolo,
IdxODL = 0,
Valore = selRec.Valore
};
currRecordClone = newRec;
await Task.Delay(1);
}
/// <summary> /// <summary>
/// Eliminazione record selezionato (previa conferma) /// Eliminazione record selezionato (previa conferma)
/// </summary> /// </summary>
/// <param name="selRec"></param> /// <param name="selRec"></param>
/// <returns></returns> /// <returns></returns>
protected async Task deleteRecord(Dossiers selRec) protected async Task deleteRecord(DossierModel selRec)
{ {
if (!await JSRuntime.InvokeAsync<bool>("confirm", "Eliminazione Dossier: sei sicuro di voler procedere?")) if (!await JSRuntime.InvokeAsync<bool>("confirm", "Eliminazione Dossier: sei sicuro di voler procedere?"))
return; return;
@@ -120,25 +158,96 @@ namespace MP.SPEC.Components
await RecordSelFlux.InvokeAsync(selRec); await RecordSelFlux.InvokeAsync(selRec);
} }
private void enableEditing() protected async Task newDossier(DossierModel selRec)
{ {
isEditing = true; var alert = await JSRuntime.InvokeAsync<bool>("confirm", "Confermi di voler creare un nuovo Dossier per l'impianto/articolo selezionato?");
}
protected async Task cancel()
{
var alert = await JSRuntime.InvokeAsync<bool>("confirm", "Confermi di voler annullare TUTTE le modifiche? i dati saranno ricaricati.");
if (alert) if (alert)
{ {
currFluxLogDto = null;
isEditing = false;
await Task.Delay(1); await Task.Delay(1);
if (currRecord != null) if (currRecordClone != null)
{ {
listaFlux = MDService.getFluxLog(currRecord.Valore); // serializzo valore x flux log...
DossierFluxLogDTO? valoreDeserializzato = JsonConvert.DeserializeObject<DossierFluxLogDTO>(selRec.Valore);
if (valoreDeserializzato != null)
{
listaFlux = valoreDeserializzato
.ODL
.OrderBy(x => x.CodFlux)
.ToList();
}
if (listaFlux != null)
{
foreach (var item in listaFlux)
{
item.IdxMacchina = selRec.IdxMacchina;
item.Valore = "0";
item.ValoreEdit = "0";
item.dtEvento = DateTime.Now;
}
}
DossierFluxLogDTO updatedResult = new DossierFluxLogDTO() { ODL = listaFlux };
string newVal = JsonConvert.SerializeObject(updatedResult);
// preparo x insert
currRecordClone.DtRif = DateTime.Now;
currRecordClone.IdxMacchina = selRec.IdxMacchina;
currRecordClone.CodArticolo = selRec.CodArticolo;
currRecordClone.KeyRichiesta = selRec.KeyRichiesta;
currRecordClone.Valore = newVal;
// METODO PER INSERT DOSSIER + FLUX
await MDService.DossiersInsert(currRecordClone);
//await reloadData(true);
currRecordClone = null;
isEditing = false;
await Task.Delay(1);
await flushCache();
} }
StateHasChanged(); return;
} }
else
{
currRecordClone = null;
await Task.Delay(1);
NavManager.NavigateTo(NavManager.Uri, true);
}
}
protected override async Task OnInitializedAsync()
{
ListGruppiFase = await MDService.ElencoGruppiFase();
ListStati = await MDService.AnagStatiComm();
ListArticoli = await MDService.ArticoliGetSearch(100000, "BAGLIETTO", "");
ListMacchine = await MDService.MacchineGetAll();
await reloadData(true);
}
protected override async Task OnParametersSetAsync()
{
if (!lastFilter.Equals(SelFilter))
{
lastFilter = SelFilter.clone();
await reloadData(true);
}
}
protected async void OnSeachUpdated()
{
await InvokeAsync(() =>
{
currPage = 1;
StateHasChanged();
});
}
protected async Task selRecord(DossierModel selRec)
{
currRecord = selRec;
await RecordSel.InvokeAsync(selRec);
listaFlux = MDService.getFluxLog(selRec.Valore);
await toggleTableFlux();
} }
protected async Task update(FluxLogDTO selRec) protected async Task update(FluxLogDTO selRec)
@@ -147,7 +256,6 @@ namespace MP.SPEC.Components
if (alert) if (alert)
{ {
await Task.Delay(1); await Task.Delay(1);
if (currRecord != null) if (currRecord != null)
{ {
@@ -168,33 +276,9 @@ namespace MP.SPEC.Components
{ {
currFluxLogDto = null; currFluxLogDto = null;
await Task.Delay(1); await Task.Delay(1);
await JSRuntime.InvokeAsync<bool>("location.reload"); // rimando a pagina corrente
NavManager.NavigateTo(NavManager.Uri, true);
} }
}
protected override async Task OnInitializedAsync()
{
ListStati = await MDService.AnagStatiComm();
await reloadData(true);
}
protected async void OnSeachUpdated()
{
await InvokeAsync(() =>
{
currPage = 1;
StateHasChanged();
});
}
protected async Task selRecord(Dossiers selRec)
{
currRecord = selRec;
await RecordSel.InvokeAsync(selRec);
listaFlux = MDService.getFluxLog(selRec.Valore);
await toggleTableFlux();
} }
protected async Task UpdateData() protected async Task UpdateData()
@@ -202,19 +286,6 @@ namespace MP.SPEC.Components
currRecord = null; currRecord = null;
await reloadData(true); await reloadData(true);
} }
private string css()
{
string answ = "";
if (isEditing)
{
answ = "visible";
}
else
{
answ = "hidden";
}
return answ;
}
#endregion Protected Methods #endregion Protected Methods
@@ -222,12 +293,21 @@ namespace MP.SPEC.Components
private int _totalCount = 0; private int _totalCount = 0;
private Dossiers? currRecord = null; private FluxLogDTO? currFluxLogDto = null;
private DossierModel? currRecord = null;
private DossierModel? currRecordClone = null;
private List<AnagArticoli>? ListArticoli;
private List<AnagGruppi>? ListGruppiFase;
private List<Macchine>? ListMacchine;
private List<DossierModel>? ListRecords;
private List<Dossiers>? ListRecords;
private List<ListValues>? ListStati; private List<ListValues>? ListStati;
private List<Dossiers>? SearchRecords; private List<DossierModel>? SearchRecords;
#endregion Private Fields #endregion Private Fields
@@ -247,6 +327,8 @@ namespace MP.SPEC.Components
private bool isLoading { get; set; } = false; private bool isLoading { get; set; } = false;
private SelectDossierParams lastFilter { get; set; } = new SelectDossierParams() { CurrPage = -1 };
private List<FluxLogDTO>? listaFlux { get; set; } = null; private List<FluxLogDTO>? listaFlux { get; set; } = null;
private int MaxRecord private int MaxRecord
@@ -254,6 +336,9 @@ namespace MP.SPEC.Components
get => SelFilter.MaxRecord; get => SelFilter.MaxRecord;
} }
[Inject]
private NavigationManager NavManager { get; set; } = null!;
private int numRecord private int numRecord
{ {
get => SelFilter.NumRec; get => SelFilter.NumRec;
@@ -269,6 +354,7 @@ namespace MP.SPEC.Components
{ {
get => SelFilter.DtEnd; get => SelFilter.DtEnd;
} }
private DateTime SelDtStart private DateTime SelDtStart
{ {
get => SelFilter.DtStart; get => SelFilter.DtStart;
@@ -298,6 +384,36 @@ namespace MP.SPEC.Components
#region Private Methods #region Private Methods
private async Task closeTableFlux()
{
currFluxLogDto = null;
currRecord = null;
currRecordClone = null;
visualizzaFlux = true;
isEditing = false;
await RecordSelFlux.InvokeAsync(currFluxLogDto);
await Task.Delay(1);
}
private string css()
{
string answ = "";
if (isEditing)
{
answ = "visible";
}
else
{
answ = "hidden";
}
return answ;
}
private void enableEditing()
{
isEditing = true;
}
private async Task reloadData(bool setChanged) private async Task reloadData(bool setChanged)
{ {
isLoading = true; isLoading = true;
@@ -332,14 +448,10 @@ namespace MP.SPEC.Components
return answ; return answ;
} }
private async Task closeTableFlux() private string traduci(string lemma)
{ {
currFluxLogDto = null; var answ = MDService.Traduci(lemma, "IT");
currRecord = null; return answ;
visualizzaFlux = true;
isEditing = false;
await RecordSelFlux.InvokeAsync(currFluxLogDto);
await Task.Delay(1);
} }
#endregion Private Methods #endregion Private Methods
+4 -1
View File
@@ -31,7 +31,10 @@ else
<thead> <thead>
<tr> <tr>
<th> <th>
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button> @if (currRecord != null)
{
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
}
</th> </th>
<th><i class="fa-solid fa-file"></i> Articolo</th> <th><i class="fa-solid fa-file"></i> Articolo</th>
<th><i class="fa-solid fa-screwdriver-wrench"></i> Fase</th> <th><i class="fa-solid fa-screwdriver-wrench"></i> Fase</th>
+4 -1
View File
@@ -17,7 +17,10 @@ else
<thead> <thead>
<tr> <tr>
<th> <th>
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button> @if (currRecord != null)
{
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
}
</th> </th>
<th><i class="fa-regular fa-calendar-days"></i> Data</th> <th><i class="fa-regular fa-calendar-days"></i> Data</th>
<th><i class="fa-solid fa-hard-drive"></i> Macchina</th> <th><i class="fa-solid fa-hard-drive"></i> Macchina</th>
+9 -28
View File
@@ -93,12 +93,18 @@ namespace MP.SPEC.Components
public async Task reloadData(bool setChanged) public async Task reloadData(bool setChanged)
{ {
isLoading = true; isLoading = true;
DateTime limitData = DateTime.Now; DateTime dataFrom = DateTime.Today.AddMonths(-1);
DateTime dataTo = DateTime.Now.AddMinutes(5);
if (SelFilter != null && SelFilter.dtMin != null)
{
dataFrom = (DateTime)SelFilter.dtMin;
}
if (SelDtMax != null) if (SelDtMax != null)
{ {
limitData = (DateTime)SelDtMax; dataTo = (DateTime)SelDtMax;
} }
SearchRecords = await MDService.FluxLogGetLastFilt(limitData, SelMacchina, SelFlux, MaxRecord);
SearchRecords = await MDService.FluxLogGetLastFilt(dataTo, dataFrom, SelMacchina, SelFlux, MaxRecord);
totalCount = SearchRecords.Count; totalCount = SearchRecords.Count;
ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList(); ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList();
await Task.Delay(1); await Task.Delay(1);
@@ -157,7 +163,6 @@ namespace MP.SPEC.Components
protected async Task resetSel() protected async Task resetSel()
{ {
currRecord = null; currRecord = null;
setDtMax();
await RecordSel.InvokeAsync(null); await RecordSel.InvokeAsync(null);
} }
@@ -240,31 +245,7 @@ namespace MP.SPEC.Components
get => SelFilter.dtMax; get => SelFilter.dtMax;
set => SelFilter.dtMax = value; set => SelFilter.dtMax = value;
} }
protected void setDtMax()
{
// copio il filtro
var currFilt = SelFilter;
// fermo update
//currFilt.LiveUpdate = true;
currFilt.CurrPage = 0;
currFilt.lastUpdate = $"{DateTime.Now:yyyy/MM/dd HH:mm:ss}";
currFilt.dtMax = RoundDatetime(5);
currFilt.dtMin = RoundDatetime(5).AddHours(-25);
SelFilter = currFilt;
}
/// <summary>
/// Inizializzazione con periodo e arrotondamento
/// </summary>
/// <param name="minRound"></param>
/// <returns></returns>
public static DateTime RoundDatetime(int minRound)
{
TimeSpan DayElapsed = DateTime.Now.Subtract(DateTime.Today);
int minDay = (int)Math.Ceiling((double)(DayElapsed.TotalMinutes / minRound)) * minRound;
DateTime endRounded = DateTime.Today.AddMinutes(minDay);
return endRounded;
}
private int totalCount private int totalCount
{ {
get => _totalCount; get => _totalCount;
+6 -2
View File
@@ -17,7 +17,10 @@ else
<thead> <thead>
<tr> <tr>
<th> <th>
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button> @if (currRecord != null)
{
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
}
</th> </th>
<th><i class="fa-solid fa-file"></i> Articolo</th> <th><i class="fa-solid fa-file"></i> Articolo</th>
<th><i class="fa-solid fa-screwdriver-wrench"></i> Fase</th> <th><i class="fa-solid fa-screwdriver-wrench"></i> Fase</th>
@@ -45,7 +48,8 @@ else
{ {
<button class="btn btn-secondary btn-sm disabled mx-1" title="ODL ancora in corso"> <button class="btn btn-secondary btn-sm disabled mx-1" title="ODL ancora in corso">
<i class="far fa-play-circle"></i> <i class="far fa-play-circle"></i>
</button>} </button>
}
</td> </td>
<td> <td>
@record.CodArticolo @record.CodArticolo
+21 -10
View File
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using MP.Data;
using MP.SPEC.Data; using MP.SPEC.Data;
namespace MP.SPEC.Components namespace MP.SPEC.Components
@@ -24,10 +25,7 @@ namespace MP.SPEC.Components
/// <returns></returns> /// <returns></returns>
public static DateTime RoundDatetime(int minRound) public static DateTime RoundDatetime(int minRound)
{ {
TimeSpan DayElapsed = DateTime.Now.Subtract(DateTime.Today); return Utils.InitDatetime(DateTime.Now, minRound);
int minDay = (int)Math.Ceiling((double)(DayElapsed.TotalMinutes / minRound)) * minRound;
DateTime endRounded = DateTime.Today.AddMinutes(minDay);
return endRounded;
} }
public void Dispose() public void Dispose()
@@ -172,9 +170,9 @@ namespace MP.SPEC.Components
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
SelFilter = new SelectFluxParams(); SelFilter = new SelectFluxParams();
setDtMax(); setDtSnap();
DateTime dtStart = SelFilter.dtMin != null ? (DateTime)SelFilter.dtMin : DateTime.Now.AddDays(-7); DateTime dtStart = SelFilter.dtMin != null ? (DateTime)SelFilter.dtMin : DateTime.Now.AddMonths(-1);
DateTime dtEnd = SelFilter.dtMax != null ? (DateTime)SelFilter.dtMax : DateTime.Now; DateTime dtEnd = SelFilter.dtMax != null ? (DateTime)SelFilter.dtMax : DateTime.Today.AddDays(1);
ListMacchine = await MDService.MacchineWithFlux(dtStart, dtEnd); ListMacchine = await MDService.MacchineWithFlux(dtStart, dtEnd);
ListFlux = await MDService.ParametriGetFilt(selMacchina); ListFlux = await MDService.ParametriGetFilt(selMacchina);
@@ -190,7 +188,7 @@ namespace MP.SPEC.Components
await FilterChanged.InvokeAsync(SelFilter); await FilterChanged.InvokeAsync(SelFilter);
} }
protected void setDtMax() protected void setDtSnap()
{ {
// copio il filtro // copio il filtro
var currFilt = SelFilter; var currFilt = SelFilter;
@@ -199,7 +197,7 @@ namespace MP.SPEC.Components
currFilt.CurrPage = 0; currFilt.CurrPage = 0;
currFilt.lastUpdate = $"{DateTime.Now:yyyy/MM/dd HH:mm:ss}"; currFilt.lastUpdate = $"{DateTime.Now:yyyy/MM/dd HH:mm:ss}";
currFilt.dtMax = RoundDatetime(5); currFilt.dtMax = RoundDatetime(5);
currFilt.dtMin = RoundDatetime(5).AddHours(-numOreAnticipoSnapshot); currFilt.dtSnapMin = RoundDatetime(5).AddHours(-numOreAnticipoSnapshot);
SelFilter = currFilt; SelFilter = currFilt;
} }
@@ -226,7 +224,7 @@ namespace MP.SPEC.Components
liveUpdate = false; liveUpdate = false;
// se non ho data rif uso adesso... // se non ho data rif uso adesso...
DateTime dtMax = selDtMax == null ? RoundDatetime(5) : (DateTime)selDtMax; DateTime dtMax = selDtMax == null ? RoundDatetime(5) : (DateTime)selDtMax;
DateTime dtMin = selDtMin == null ? RoundDatetime(5).AddHours(-numOreAnticipoSnapshot) : (DateTime)selDtMin; DateTime dtMin = selDtSnapMin == null ? RoundDatetime(5).AddHours(-numOreAnticipoSnapshot) : (DateTime)selDtSnapMin;
// aggiungo 15 sec // aggiungo 15 sec
dtMax = dtMax.AddSeconds(15); dtMax = dtMax.AddSeconds(15);
await MDService.DossiersTakeParamsSnapshotLast(selMacchina, dtMin, dtMax); await MDService.DossiersTakeParamsSnapshotLast(selMacchina, dtMin, dtMax);
@@ -314,6 +312,19 @@ namespace MP.SPEC.Components
} }
} }
private DateTime? selDtSnapMin
{
get => SelFilter.dtSnapMin;
set
{
if (SelFilter.dtSnapMin != value)
{
SelFilter.dtSnapMin = value;
reportChange();
}
}
}
private bool showEditPar { get; set; } = false; private bool showEditPar { get; set; } = false;
private string snapMode private string snapMode
+28 -15
View File
@@ -160,7 +160,9 @@ namespace MP.SPEC.Data
/// <returns></returns> /// <returns></returns>
public async Task<bool> ArticoliDeleteRecord(AnagArticoli currRec) public async Task<bool> ArticoliDeleteRecord(AnagArticoli currRec)
{ {
return await dbController.ArticoliDeleteRecord(currRec); bool fatto = await dbController.ArticoliDeleteRecord(currRec);
await resetCacheArticoli();
return fatto;
} }
/// <summary> /// <summary>
@@ -207,7 +209,9 @@ namespace MP.SPEC.Data
/// <returns></returns> /// <returns></returns>
public async Task<bool> ArticoliUpdateRecord(AnagArticoli currRec) public async Task<bool> ArticoliUpdateRecord(AnagArticoli currRec)
{ {
return await dbController.ArticoliUpdateRecord(currRec); bool fatto = await dbController.ArticoliUpdateRecord(currRec);
await resetCacheArticoli();
return fatto;
} }
/// <summary> /// <summary>
@@ -338,7 +342,7 @@ namespace MP.SPEC.Data
/// </summary> /// </summary>
/// <param name="selRecord">record dossier da eliminare</param> /// <param name="selRecord">record dossier da eliminare</param>
/// <returns></returns> /// <returns></returns>
public async Task<bool> DossiersDeleteRecord(Dossiers selRecord) public async Task<bool> DossiersDeleteRecord(DossierModel selRecord)
{ {
bool result = false; bool result = false;
Stopwatch stopWatch = new Stopwatch(); Stopwatch stopWatch = new Stopwatch();
@@ -361,9 +365,9 @@ namespace MP.SPEC.Data
/// <param name="DtStart">Data minima per estrazione records</param> /// <param name="DtStart">Data minima per estrazione records</param>
/// <param name="DtEnd">Data Massima per estrazione records</param> /// <param name="DtEnd">Data Massima per estrazione records</param>
/// <returns></returns> /// <returns></returns>
public async Task<List<Dossiers>> DossiersGetLastFilt(string IdxMacchina, string CodArticolo, DateTime DtStart, DateTime DtEnd) public async Task<List<DossierModel>> DossiersGetLastFilt(string IdxMacchina, string CodArticolo, DateTime DtStart, DateTime DtEnd)
{ {
List<Dossiers>? result = new List<Dossiers>(); List<DossierModel>? result = new List<DossierModel>();
Stopwatch stopWatch = new Stopwatch(); Stopwatch stopWatch = new Stopwatch();
stopWatch.Start(); stopWatch.Start();
string readType = "DB"; string readType = "DB";
@@ -372,7 +376,7 @@ namespace MP.SPEC.Data
RedisValue rawData = redisDb.StringGet(currKey); RedisValue rawData = redisDb.StringGet(currKey);
if (rawData.HasValue) if (rawData.HasValue)
{ {
result = JsonConvert.DeserializeObject<List<Dossiers>>($"{rawData}"); result = JsonConvert.DeserializeObject<List<DossierModel>>($"{rawData}");
readType = "REDIS"; readType = "REDIS";
} }
else else
@@ -384,7 +388,7 @@ namespace MP.SPEC.Data
} }
if (result == null) if (result == null)
{ {
result = new List<Dossiers>(); result = new List<DossierModel>();
} }
stopWatch.Stop(); stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed; TimeSpan ts = stopWatch.Elapsed;
@@ -397,10 +401,10 @@ namespace MP.SPEC.Data
/// </summary> /// </summary>
/// <param name="currDoss"></param> /// <param name="currDoss"></param>
/// <returns></returns> /// <returns></returns>
public async Task<bool> DossiersInsert(Dossiers currDoss) public async Task<bool> DossiersInsert(DossierModel currDoss)
{ {
// aggiorno record sul DB // aggiorno record sul DB
bool answ = await dbController.DossiersUpdateValore(currDoss); bool answ = await dbController.DossiersInsert(currDoss);
return answ; return answ;
} }
@@ -451,7 +455,7 @@ namespace MP.SPEC.Data
/// </summary> /// </summary>
/// <param name="currDoss"></param> /// <param name="currDoss"></param>
/// <returns></returns> /// <returns></returns>
public async Task<bool> DossiersUpdateValore(Dossiers currDoss) public async Task<bool> DossiersUpdateValore(DossierModel currDoss)
{ {
// aggiorno record sul DB // aggiorno record sul DB
bool answ = await dbController.DossiersUpdateValore(currDoss); bool answ = await dbController.DossiersUpdateValore(currDoss);
@@ -505,18 +509,19 @@ namespace MP.SPEC.Data
/// <summary> /// <summary>
/// Elenco ultimi n record flux log dato macchina e flusso (ordinato x data registrazione) /// Elenco ultimi n record flux log dato macchina e flusso (ordinato x data registrazione)
/// </summary> /// </summary>
/// <param name="DtMax">Data massima (recupera eventi antecedenti)</param> /// <param name="DtMax">Data massima x eventi</param>
/// <param name="DtMin">Data minima x eventi</param>
/// <param name="IdxMacchina">* = tutte, altrimenti solo x una data macchina</param> /// <param name="IdxMacchina">* = tutte, altrimenti solo x una data macchina</param>
/// <param name="CodFlux">*=tutti, altrimenti solo selezionato</param> /// <param name="CodFlux">*=tutti, altrimenti solo selezionato</param>
/// <param name="MaxRec">numero massimo record da restituire</param> /// <param name="MaxRec">numero massimo record da restituire</param>
/// <returns></returns> /// <returns></returns>
public async Task<List<FluxLog>> FluxLogGetLastFilt(DateTime DtMax, string IdxMacchina, string CodFlux, int MaxRec) public async Task<List<FluxLog>> FluxLogGetLastFilt(DateTime DtMax, DateTime DtMin, string IdxMacchina, string CodFlux, int MaxRec)
{ {
List<FluxLog>? result = new List<FluxLog>(); List<FluxLog>? result = new List<FluxLog>();
Stopwatch stopWatch = new Stopwatch(); Stopwatch stopWatch = new Stopwatch();
stopWatch.Start(); stopWatch.Start();
string readType = "DB"; string readType = "DB";
string currKey = $"{redisFluxLogFilt}:{IdxMacchina}:{CodFlux}:{MaxRec}:{DtMax:yyyyMMdd}:{DtMax:HHmm}"; string currKey = $"{redisFluxLogFilt}:{IdxMacchina}:{CodFlux}:{MaxRec}:{DtMax:yyyyMMddHHmm}:{DtMin:yyyyMMddHHmm}";
// cerco in redis dato valore sel macchina... // cerco in redis dato valore sel macchina...
RedisValue rawData = redisDb.StringGet(currKey); RedisValue rawData = redisDb.StringGet(currKey);
if (rawData.HasValue) if (rawData.HasValue)
@@ -526,7 +531,7 @@ namespace MP.SPEC.Data
} }
else else
{ {
result = await Task.FromResult(dbController.FluxLogGetLastFilt(DtMax, IdxMacchina, CodFlux, MaxRec)); result = await Task.FromResult(dbController.FluxLogGetLastFilt(DtMax, DtMin, IdxMacchina, CodFlux, MaxRec));
// serializzo e salvo... // serializzo e salvo...
rawData = JsonConvert.SerializeObject(result); rawData = JsonConvert.SerializeObject(result);
redisDb.StringSet(currKey, rawData, TimeSpan.FromSeconds(10)); redisDb.StringSet(currKey, rawData, TimeSpan.FromSeconds(10));
@@ -910,7 +915,7 @@ namespace MP.SPEC.Data
return answ; return answ;
} }
public async Task<bool> updateDossierValue(Dossiers currDoss, FluxLogDTO editFL) public async Task<bool> updateDossierValue(DossierModel currDoss, FluxLogDTO editFL)
{ {
bool answ = false; bool answ = false;
// recupero intero set valori dossier deserializzando... // recupero intero set valori dossier deserializzando...
@@ -1098,6 +1103,14 @@ namespace MP.SPEC.Data
return answ; return answ;
} }
private async Task resetCacheArticoli()
{
RedisValue pattern = new RedisValue($"{redisArtByDossier}:*");
await ExecFlushRedisPattern(pattern);
pattern = new RedisValue($"{redisArtList}:*");
await ExecFlushRedisPattern(pattern);
}
#endregion Private Methods #endregion Private Methods
} }
} }
+23 -5
View File
@@ -5,7 +5,11 @@
#region Public Constructors #region Public Constructors
public SelectFluxParams() public SelectFluxParams()
{ } {
dtMin = DateTime.Today.AddMonths(-1);
dtMax = DateTime.Today.AddDays(1);
dtSnapMin = DateTime.Today.AddDays(-2);
}
#endregion Public Constructors #endregion Public Constructors
@@ -16,6 +20,7 @@
public DateTime? dtRif { get; set; } = null; public DateTime? dtRif { get; set; } = null;
public DateTime? dtMax { get; set; } = null; public DateTime? dtMax { get; set; } = null;
public DateTime? dtMin { get; set; } = null; public DateTime? dtMin { get; set; } = null;
public DateTime? dtSnapMin { get; set; } = null;
public string IdxMacchina { get; set; } = "*"; public string IdxMacchina { get; set; } = "*";
public string lastUpdate { get; set; } = "-"; public string lastUpdate { get; set; } = "-";
public bool LiveUpdate { get; set; } = true; public bool LiveUpdate { get; set; } = true;
@@ -36,6 +41,7 @@
dtRif = this.dtRif, dtRif = this.dtRif,
dtMax = this.dtMax, dtMax = this.dtMax,
dtMin = this.dtMin, dtMin = this.dtMin,
dtSnapMin = this.dtSnapMin,
IdxMacchina = this.IdxMacchina, IdxMacchina = this.IdxMacchina,
lastUpdate = this.lastUpdate, lastUpdate = this.lastUpdate,
LiveUpdate = this.LiveUpdate, LiveUpdate = this.LiveUpdate,
@@ -54,6 +60,18 @@
if (IdxMacchina != item.IdxMacchina) if (IdxMacchina != item.IdxMacchina)
return false; return false;
if (dtMax != item.dtMax)
return false;
if (dtMin != item.dtMin)
return false;
if (dtRif != item.dtRif)
return false;
if (dtSnapMin != item.dtSnapMin)
return false;
if (CodFlux != item.CodFlux) if (CodFlux != item.CodFlux)
return false; return false;
@@ -65,11 +83,11 @@
if (TempoAgg != item.TempoAgg) if (TempoAgg != item.TempoAgg)
return false; return false;
if (NumRec!= item.NumRec) if (NumRec != item.NumRec)
return false; return false;
if (TotCount!= item.TotCount) if (TotCount != item.TotCount)
return false; return false;
if (CurrPage != item.CurrPage) if (CurrPage != item.CurrPage)
+1 -1
View File
@@ -5,7 +5,7 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>MP.SPEC</RootNamespace> <RootNamespace>MP.SPEC</RootNamespace>
<Version>6.16.2211.312</Version> <Version>6.16.2211.709</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
+28 -20
View File
@@ -40,33 +40,21 @@
<div class="card-body"> <div class="card-body">
<div class="row"> <div class="row">
<div class="col-4"> <div class="col-3">
<div class="input-group"> <div class="input-group">
<span class="input-group-text">Codice</span> <span class="input-group-text">Codice</span>
<input type="text" class="form-control" placeholder="Articolo" @bind-value="@currRecord.CodArticolo"> <input type="text" class="form-control" placeholder="Articolo" @bind-value="@currRecord.CodArticolo">
</div> </div>
</div> </div>
<div class="col-4"> <div class="col-5">
<div class="input-group"> <div class="input-group">
<span class="input-group-text">Disegno</span> <span class="input-group-text">Disegno</span>
<input type="text" class="form-control" placeholder="Disegno" @bind-value="@currRecord.Disegno"> <input type="text" class="form-control" placeholder="Disegno" @bind-value="@currRecord.Disegno">
</div> </div>
</div> </div>
<div class="col-1"> <div class="col-4">
<div class="input-group" title="Tipo">
<select @bind="@currRecord.Tipo" class="form-select text-end">
@if (ListTipoArt != null)
{
foreach (var item in ListTipoArt)
{
<option value="@item.value">@item.label</option>
}
}
</select>
</div>
</div>
<div class="col-3">
<div class="input-group" title="Azienda"> <div class="input-group" title="Azienda">
<span class="input-group-text">Azienda</span>
<select @bind="@currRecord.Azienda" class="form-select text-end"> <select @bind="@currRecord.Azienda" class="form-select text-end">
@if (ListAziende != null) @if (ListAziende != null)
{ {
@@ -81,8 +69,25 @@
</div> </div>
</div> </div>
<div class="row mt-2"> <div class="row mt-2">
<div class="col-8"> <div class="col-3">
<input type="text" class="form-control" placeholder="Descrizione Articolo" @bind-value="@currRecord.DescArticolo"> <div class="input-group" title="Tipo">
<span class="input-group-text">Tipo</span>
<select @bind="@currRecord.Tipo" class="form-select text-end">
@if (ListTipoArt != null)
{
foreach (var item in ListTipoArt)
{
<option value="@item.value">@item.label</option>
}
}
</select>
</div>
</div>
<div class="col-5">
<div class="input-group">
<span class="input-group-text">Descrizione</span>
<input type="text" class="form-control" placeholder="Descrizione Articolo" @bind-value="@currRecord.DescArticolo">
</div>
</div> </div>
<div class="col-2"> <div class="col-2">
<div class="d-grid gap-2"> <div class="d-grid gap-2">
@@ -120,7 +125,10 @@
<thead> <thead>
<tr> <tr>
<th> <th>
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button> @if (currRecord != null)
{
<button @onclick="() => resetSel()" class="btn btn-primary btn-sm"><i class="bi bi-arrow-counterclockwise"></i></button>
}
</th> </th>
<th><i class="fa-solid fa-file"></i> Articolo</th> <th><i class="fa-solid fa-file"></i> Articolo</th>
<th><i class="fa-solid fa-compass-drafting"></i> Disegno</th> <th><i class="fa-solid fa-compass-drafting"></i> Disegno</th>
@@ -136,7 +144,7 @@
<tr class="@checkSelect(@record.CodArticolo)"> <tr class="@checkSelect(@record.CodArticolo)">
<td> <td>
<button @onclick="() => selRecord(record)" class="btn btn-primary btn-sm" title="Modifica Record"><i class="bi bi-pencil-square"></i></button> <button @onclick="() => selRecord(record)" class="btn btn-primary btn-sm" title="Modifica Record"><i class="bi bi-pencil-square"></i></button>
<button @onclick="() => cloneRecord(record)" class="btn btn-info btn-sm" title="Duplica Record"><i class="bi bi-clipboard-check"></i></button> <button @onclick="() => cloneRecord(record)" class="btn btn-info btn-sm" title="Duplica Record"><i class="bi bi-clipboard-check"></i></button>
</td> </td>
<td> <td>
<div>@record.CodArticolo</div> <div>@record.CodArticolo</div>
-1
View File
@@ -28,7 +28,6 @@ namespace MP.SPEC.Pages
public void Dispose() public void Dispose()
{ {
//MessageService.EA_SearchUpdated -= OnSeachUpdated;
currRecord = null; currRecord = null;
ListTipoArt = null; ListTipoArt = null;
ListAziende = null; ListAziende = null;
+71
View File
@@ -0,0 +1,71 @@
@page "/Contacts"
@using MP.SPEC.Data
@inject MessageService AppMService
<div class="row mx-2">
<div class="col-12 col-lg-8 offset-lg-2">
<div class="card">
<div class="card-header text-center">
<div class="row">
<div class="col-4"></div>
<div class="col-4">
<h2>@Titolo</h2>
</div>
<div class="col-4">
<div class="badge rounded-pill bg-dark px-4 py-2">
<div class="px-1">
<a class="btn text-light text-decoration-none" href="https://www.egalware.com/" target="_blank">powered by&nbsp;EgalWare <img width="24" class="img-fluid" src="images/LogoEgw.png" /></a>
</div>
</div>
</div>
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-lg-3"></div>
<div class="col-12 col-lg-6 py-3">
<img src="images/LogoMapoFull.png" class="img-fluid" />
</div>
<div class="col-lg-3"></div>
<div class="col-12">
<h4 class="card-title">@Messaggio</h4>
</div>
<div class="col-sm-4">
<h4>Sede Operativa</h4>
<address>
<strong>EgalWare s.r.l.</strong><br />
via Nazionale, 93<br />
24068 Seriate - BG<br />
<abbr title="Phone">P:</abbr>
035.290178<br />
<abbr title="Phone">P:</abbr>
035.460560
</address>
</div>
<div class="col-sm-4">
<h4>Sede Legale</h4>
<address>
<strong>EgalWare s.r.l.</strong><br />
via Nazionale, 93<br />
24068 Seriate - BG<br />
<br />
<abbr title="P.Iva">VAT:</abbr>03985390164
</address>
</div>
<div class="col-sm-4">
<h4>Supporto</h4>
<address>
<strong>Web:</strong><br />
Accedi al supporto dal <a href="https://support.egalware.com/" target="_blank">nostro sito web</a><br />
<br />
<strong>Email:</strong><br />
Scrivi un email a <a href="mailto:info@egalware.com">info at egalware.com</a>
</address>
</div>
</div>
</div>
</div>
</div>
</div>
+32
View File
@@ -0,0 +1,32 @@
namespace MP.SPEC.Pages
{
public partial class Contacts : IDisposable
{
#region Public Methods
public void Dispose()
{
GC.Collect();
}
#endregion Public Methods
#region Protected Fields
protected string Messaggio = "";
protected string Titolo = "";
#endregion Protected Fields
#region Protected Methods
protected override void OnInitialized()
{
Titolo = "MP SPEC";
Messaggio = "I nostri contattatti e siti di supporto";
AppMService.ShowSearch = false;
}
#endregion Protected Methods
}
}
+2 -2
View File
@@ -50,7 +50,7 @@ namespace MP.SPEC.Pages
isFiltering = false; isFiltering = false;
} }
protected async Task selRecordDoss(Dossiers selDoss) protected async Task selRecordDoss(DossierModel selDoss)
{ {
currRecordDoss = selDoss; currRecordDoss = selDoss;
await Task.Delay(1); await Task.Delay(1);
@@ -78,7 +78,7 @@ namespace MP.SPEC.Pages
set => currFilter.CurrPage = value; set => currFilter.CurrPage = value;
} }
private Dossiers? currRecordDoss { get; set; } = null; private DossierModel? currRecordDoss { get; set; } = null;
private bool isEditing private bool isEditing
{ {
+1 -1
View File
@@ -11,7 +11,7 @@
<div class="p-2 align-content-center fs-1"> <div class="p-2 align-content-center fs-1">
<b>MAPO SPEC</b> <b>MAPO SPEC</b>
</div> </div>
<div class="p-2 bg-light"> <div class="p-2">
<img src="images/LogoEgw.png" class="image-fluid" height="64" /> <img src="images/LogoEgw.png" class="image-fluid" height="64" />
</div> </div>
</div> </div>
+1 -1
View File
@@ -1,6 +1,6 @@
<body> <body>
<i>Modulo MAPOSPEC </i> <i>Modulo MAPOSPEC </i>
<h4>Versione: 6.16.2211.312</h4> <h4>Versione: 6.16.2211.709</h4>
<br /> Note di rilascio: <br /> Note di rilascio:
<ul> <ul>
<li> <li>
+1 -1
View File
@@ -1 +1 @@
6.16.2211.312 6.16.2211.709
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<item> <item>
<version>6.16.2211.312</version> <version>6.16.2211.709</version>
<url>https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip</url> <url>https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html</changelog> <changelog>https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory> <mandatory>false</mandatory>
Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB