Compare commits

...

57 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
Samuele Locatelli c9c57208bf Merge branch 'Release/UpdateSpecProd' 2022-11-03 12:16:55 +01:00
Samuele Locatelli af314cd578 Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-11-03 12:16:34 +01:00
Samuele Locatelli 788bd6d730 Fix warnings (rimossi in blocco) + fix live parametri 2022-11-03 12:16:29 +01:00
zaccaria.majid e1eb5c6cdf aggiunta traduzione fase pagina dossier 2022-11-03 12:09:31 +01:00
Samuele Locatelli 1bf5cfc0be Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-11-03 11:46:49 +01:00
Samuele Locatelli 491365e8df Vocabolario
- aggiunto modello
- aggiunta metori recupero DB/REDIS
- aggiunto metodo traduzione lemmi (pag parametri)
2022-11-03 11:46:09 +01:00
zaccaria.majid 40b16d2e83 spostato bottone flush cache in top 2022-11-03 11:28:15 +01:00
zaccaria.majid 39cf45869c fix order 2022-10-26 17:27:45 +02:00
zaccaria.majid ea930b308d fix richiesti pagina PODL 2022-10-26 17:25:09 +02:00
zaccaria.majid b07c610edd fix pagina params 2022-10-21 15:40:26 +02:00
zaccaria.majid 185e27f31d fix bottone liveupdate 2022-10-21 14:14:12 +02:00
zaccaria.majid 6a44e7b0c9 Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-10-21 12:53:05 +02:00
zaccaria.majid eb11533338 display filtri attivi fine 2022-10-21 12:51:52 +02:00
Samuele Locatelli 8b91210115 fix copia script x cambio vers num 2022-10-21 10:42:08 +02:00
Samuele Locatelli 9f9f44f604 Bozza display filtri attivi 2022-10-21 10:20:08 +02:00
Samuele Locatelli dee4b63ca4 Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-10-21 09:31:29 +02:00
Samuele Locatelli bb19bb02c4 Fix rimozione message pipe MON da SPEC 2022-10-21 09:30:56 +02:00
zaccaria.majid fd69a196d2 fix date snapshot 2022-10-21 09:24:13 +02:00
Samuele Locatelli dcfaa6257a Merge tag 'FixOreAnticipo' into develop
Fix ore anticipo: default a 50h
2022-10-20 17:28:36 +02:00
Samuele Locatelli 1271b44b15 Merge branch 'Release/FixOreAnticipo' 2022-10-20 17:28:21 +02:00
Samuele Locatelli 132f5966dd Forzato default anticipo a 50h... 2022-10-20 17:28:01 +02:00
Samuele Locatelli 02c46c99db Merge tag 'UpdateSearchArt' into develop
Fix ricerca articoli
2022-10-20 16:53:17 +02:00
Samuele Locatelli 485808e8d4 Merge branch 'Release/UpdateSearchArt' 2022-10-20 16:53:09 +02:00
Samuele Locatelli d78c2d3173 Fix ricerca articoli 2022-10-20 16:52:47 +02:00
Samuele Locatelli 2a1602c5b9 Update metodi dossier 2022-10-20 16:33:48 +02:00
Samuele Locatelli a096f6a13e Merge tag 'UpdateModuloDoss' into develop
Update modulo dossier in blocco
2022-10-20 14:54:28 +02:00
75 changed files with 1766 additions and 786 deletions
+4
View File
@@ -0,0 +1,4 @@
[*.cs]
# CS8765: Nullability of type of parameter doesn't match overridden member (possibly because of nullability attributes).
dotnet_diagnostic.CS8765.severity = none
+5
View File
@@ -7,6 +7,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MP.Data", "MP.Data\MP.Data.
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MP.SPEC", "MP.SPEC\MP.SPEC.csproj", "{C777A098-6F91-45AF-A85E-0AD08CBCAC52}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MP.SPEC", "MP.SPEC\MP.SPEC.csproj", "{C777A098-6F91-45AF-A85E-0AD08CBCAC52}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1B6A7550-F6C9-468E-B3B4-C30FF6FE8933}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
EndProjectSection
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
+64 -19
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();
} }
@@ -183,11 +183,11 @@ namespace MP.Data.Controllers
{ {
dbResult = dbCtx dbResult = dbCtx
.DbSetArticoli .DbSetArticoli
.AsNoTracking() .AsNoTracking()
.Where(x => (x.Azienda == azienda || azienda == "*") && (x.CodArticolo.Contains(searchVal) || x.DescArticolo.Contains(searchVal) || x.Disegno.Contains(searchVal) || string.IsNullOrEmpty(searchVal))) .Where(x => (x.Azienda == azienda || azienda == "*") && (x.CodArticolo.Contains(searchVal) || x.DescArticolo.Contains(searchVal) || x.Disegno.Contains(searchVal) || string.IsNullOrEmpty(searchVal)))
.OrderBy(x => x.CodArticolo) .OrderBy(x => x.CodArticolo)
.Take(numRecord) .Take(numRecord)
.ToList(); .ToList();
} }
return dbResult; return dbResult;
} }
@@ -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,24 +336,50 @@ 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();
} }
return dbResult; return dbResult;
} }
/// <summary>
/// insert di un record Dossier
/// </summary>
/// <param name="editRec">record dossier da modificare</param>
/// <returns></returns>
public async Task<bool> DossiersInsert(DossierModel newRec)
{
bool fatto = false;
using (var dbCtx = new MoonProContext(_configuration))
{
try
{
dbCtx
.DbSetDossiers
.Add(newRec);
await dbCtx.SaveChangesAsync();
fatto = true;
}
catch (Exception exc)
{
Log.Error($"Eccezione durante DossiersInsert{Environment.NewLine}{exc}");
}
}
return fatto;
}
/// <summary> /// <summary>
/// Effettua salvataggio snapshot parametri (con stored) + svuota eventuale cache redis /// Effettua salvataggio snapshot parametri (con stored) + svuota eventuale cache redis
/// </summary> /// </summary>
@@ -401,11 +427,11 @@ namespace MP.Data.Controllers
} }
/// <summary> /// <summary>
/// Update ddel campo VALORE di un dossier (che contiene json flux log serializzati) /// Update del campo VALORE di un dossier (che contiene json flux log serializzati)
/// </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))
@@ -476,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))
@@ -489,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();
@@ -555,7 +582,7 @@ namespace MP.Data.Controllers
.AsNoTracking() .AsNoTracking()
.Include(m => m.MachineNav) .Include(m => m.MachineNav)
.Include(a => a.ArticoloNav) .Include(a => a.ArticoloNav)
.OrderBy(x => x.InsertDate) .OrderByDescending(x => x.InsertDate)
.ToList(); .ToList();
} }
return dbResult; return dbResult;
@@ -744,7 +771,7 @@ namespace MP.Data.Controllers
} }
/// <summary> /// <summary>
/// Recupero Odl CORRENTI /// Recupero Odl CORRENTI
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public List<ODLModel> OdlGetCurrent() public List<ODLModel> OdlGetCurrent()
@@ -1001,6 +1028,24 @@ namespace MP.Data.Controllers
return dbResult; return dbResult;
} }
/// <summary>
/// Elenco Vocabolario (completo)
/// </summary>
/// <returns></returns>
public List<VocabolarioModel> VocabolarioGetAll()
{
List<VocabolarioModel> dbResult = new List<VocabolarioModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetVocabolario
.AsNoTracking()
.OrderBy(x => x.Lemma)
.ToList();
}
return dbResult;
}
#endregion Public Methods #endregion Public Methods
#region Private Fields #region Private Fields
@@ -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
} }
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels
{
[Table("Vocabolario")]
public partial class VocabolarioModel
{
#region Public Properties
public string Lingua { get; set; }
public string Lemma { get; set; }
public string Traduzione { get; set; }
#endregion Public Properties
}
}
+4
View File
@@ -11,6 +11,10 @@
<Compile Remove="DatabaseModels\TurniParetoOdl.cs" /> <Compile Remove="DatabaseModels\TurniParetoOdl.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="..\.editorconfig" Link=".editorconfig" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.9" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.9" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.9" />
+2 -2
View File
@@ -69,7 +69,7 @@ namespace MP.Data
private bool enableLog = false; private bool enableLog = false;
private IConnectionMultiplexer redis; private IConnectionMultiplexer redis;
private IDatabase? redisDb; private IDatabase redisDb;
#endregion Private Fields #endregion Private Fields
@@ -90,7 +90,7 @@ namespace MP.Data
//Subscribe to the channel named messages //Subscribe to the channel named messages
sub.Subscribe(_channel, (channel, message) => sub.Subscribe(_channel, (channel, message) =>
{ {
Log.Trace($"ch {channel} | {message}"); Log.Trace($"req setup ch {channel} | {message}");
// messaggio // messaggio
PubSubEventArgs mea = new PubSubEventArgs(message); PubSubEventArgs mea = new PubSubEventArgs(message);
// se qualcuno ascolta sollevo evento nuovo valore... // se qualcuno ascolta sollevo evento nuovo valore...
+8 -2
View File
@@ -47,10 +47,11 @@ 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; }
public virtual DbSet<VocabolarioModel> DbSetVocabolario { get; set; }
#endregion Public Properties #endregion Public Properties
@@ -303,7 +304,12 @@ namespace MP.Data
modelBuilder.Entity<EventListModel>(entity => modelBuilder.Entity<EventListModel>(entity =>
{ {
entity.HasKey(e => new { e.IdxMacchina, e.InizioStato, e.IdxTipo}); entity.HasKey(e => new { e.IdxMacchina, e.InizioStato, e.IdxTipo });
});
modelBuilder.Entity<VocabolarioModel>(entity =>
{
entity.HasKey(e => new { e.Lingua, e.Lemma });
}); });
-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;
+7 -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.2209.2118</Version> <Version>6.16.2211.0416</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@@ -60,6 +60,12 @@
<ProjectReference Include="..\MP.AppAuth\MP.AppAuth.csproj" /> <ProjectReference Include="..\MP.AppAuth\MP.AppAuth.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Update="post-build.ps1">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="powershell.exe -ExecutionPolicy Unrestricted -NoProfile -NonInteractive -File $(ProjectDir)\post-build.ps1 -ProjectDir $(ProjectDir) -ProjectPath $(ProjectPath)" /> <Exec Command="powershell.exe -ExecutionPolicy Unrestricted -NoProfile -NonInteractive -File $(ProjectDir)\post-build.ps1 -ProjectDir $(ProjectDir) -ProjectPath $(ProjectPath)" />
</Target> </Target>
+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.2209.2118</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.2209.2118 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.2209.2118</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
}
}
+3
View File
@@ -48,6 +48,9 @@
<None Update="logs\.placeholder"> <None Update="logs\.placeholder">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
<None Update="post-build.ps1">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup> </ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="powershell.exe -ExecutionPolicy Unrestricted -NoProfile -NonInteractive -File $(ProjectDir)\post-build.ps1 -ProjectDir $(ProjectDir) -ProjectPath $(ProjectPath)" /> <Exec Command="powershell.exe -ExecutionPolicy Unrestricted -NoProfile -NonInteractive -File $(ProjectDir)\post-build.ps1 -ProjectDir $(ProjectDir) -ProjectPath $(ProjectPath)" />
+4 -5
View File
@@ -26,13 +26,12 @@ namespace MP.SPEC.Components.Chart
public ChartType Type { get; set; } public ChartType Type { get; set; }
[Parameter] [Parameter]
public double[] Data { get; set; } public double[] Data { get; set; } = null!;
[Parameter]
public List<DoughnutStyling> BackgroundColor { get; set; } = null!;
[Parameter] [Parameter]
public List<DoughnutStyling> BackgroundColor { get; set; } public string[] Labels { get; set; } = null!;
[Parameter]
public string[] Labels { get; set; }
protected override async Task OnAfterRenderAsync(bool firstRender) protected override async Task OnAfterRenderAsync(bool firstRender)
{ {
+2 -1
View File
@@ -39,7 +39,8 @@ namespace MP.SPEC.Components
protected override void OnInitialized() protected override void OnInitialized()
{ {
version = typeof(Program).Assembly.GetName().Version; var rawVers = typeof(Program).Assembly.GetName().Version; ;
version = rawVers != null ? rawVers : new Version("0.0.0.0");
} }
#endregion Protected Methods #endregion Protected Methods
+5 -43
View File
@@ -10,7 +10,10 @@
<div class="px-2"> <div class="px-2">
<i class="fas fa-user-alt"></i> <b>@userName</b> <i class="fas fa-user-alt"></i> <b>@userName</b>
</div> </div>
<div class="px-2 flex-grow-1 text-end"> <div class="pe-2">
<button class="btn btn-primary" @onclick="() => flushCache()" title="Forza Refresh Dati correnti"> Force Reload </button>
</div>
@* <div class="px-2 flex-grow-1 text-end">
<span class="text-secondary">@TipoSearch</span> <span class="text-secondary">@TipoSearch</span>
</div> </div>
<div class="px-2 text-end"> <div class="px-2 text-end">
@@ -18,48 +21,7 @@
{ {
<SearchMod></SearchMod> <SearchMod></SearchMod>
} }
</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.";
}
}
}
+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
}
}
+2 -2
View File
@@ -78,9 +78,9 @@ namespace MP.SPEC.Components
#region Public Methods #region Public Methods
public async Task resetCurrPage() public void resetCurrPage()
{ {
await Task.Delay(1); //await Task.Delay(1);
currPage = 1; currPage = 1;
} }
+29 -18
View File
@@ -1,7 +1,25 @@
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<a class="pt-2 text-dark" data-bs-toggle="offcanvas" data-bs-target="#paramsFilterExample" aria-controls="paramsFilterExample"> <div class="d-flex justify-content-between pt-2">
<i class="fa-solid fa-bars"></i> @if (filtActive)
</a> {
<div class=" rounded small d-flex justify-content-between" title="Filtri attivi">
@*<i class="fas fa-exclamation text-warning"></i>*@
@if (selMacchina != "*")
{
<button class="btn btn-outline-primary btn-sm mx-2" @onclick="()=>resetMacchina()" title="Rimuovi Filtro Impianto"><i class="fa-solid fa-hard-drive"></i> &nbsp <i class="fa-solid fa-xmark text-warning"></i></button>
}
@if (selArticolo != "*")
{
<button class="btn btn-outline-primary btn-sm mx-2" @onclick="()=>resetArticolo()" title="Rimuovi Filtro Articolo"><i class="fa-solid fa-sliders"></i> &nbsp <i class="fa-solid fa-xmark text-warning"></i></button>
}
</div>
}
<div class="p-2">
<a class="" data-bs-toggle="offcanvas" data-bs-target="#paramsFilterExample" aria-controls="paramsFilterExample">
<i class="fa-solid fa-bars text-dark"></i>
</a>
</div>
</div>
<div class="offcanvas offcanvas-end" tabindex="-1" id="paramsFilterExample" aria-labelledby="paramsFilterExampleLabel"> <div class="offcanvas offcanvas-end" tabindex="-1" id="paramsFilterExample" aria-labelledby="paramsFilterExampleLabel">
<div class="offcanvas-header"> <div class="offcanvas-header">
<h3 class="offcanvas-title" id="paramsFilterExampleLabel"><b>FILTRI</b></h3> <h3 class="offcanvas-title" id="paramsFilterExampleLabel"><b>FILTRI</b></h3>
@@ -11,7 +29,10 @@
<div> <div>
Seleziona i filtri per: Seleziona i filtri per:
</div> </div>
<div class="input-group p-2"> <div class="small mt-2">
<label class="px-2" for="dtMin" title="Selezionare inizio periodo">Articolo</label>
</div>
<div class="input-group px-2">
<label class="input-group-text" for="macchina" title="Selezionare l'articolo"><i class="fa-solid fa-file"></i></label> <label class="input-group-text" for="macchina" title="Selezionare l'articolo"><i class="fa-solid fa-file"></i></label>
<select @bind="@selArticolo" class="form-select" id="macchina" title="Selezionare la macchina"> <select @bind="@selArticolo" class="form-select" id="macchina" title="Selezionare la macchina">
<option value="*">--- Tutti ---</option> <option value="*">--- Tutti ---</option>
@@ -24,7 +45,10 @@
} }
</select> </select>
</div> </div>
<div class="input-group p-2"> <div class="small mt-2">
<label class="px-2" for="dtMin" title="Selezionare inizio periodo">Macchina</label>
</div>
<div class="input-group px-2">
<label class="input-group-text" for="macchina" title="Selezionare la macchina"><i class="fa-solid fa-hard-drive"></i></label> <label class="input-group-text" for="macchina" title="Selezionare la macchina"><i class="fa-solid fa-hard-drive"></i></label>
<select @bind="@selMacchina" class="form-select" id="macchina" title="Selezionare la macchina"> <select @bind="@selMacchina" class="form-select" id="macchina" title="Selezionare la macchina">
<option value="*">--- Tutti ---</option> <option value="*">--- Tutti ---</option>
@@ -52,19 +76,6 @@
<label class="input-group-text" for="dtMax" title="Selezionare fine periodo"><i class="fa-regular fa-calendar-plus"></i></label> <label class="input-group-text" for="dtMax" title="Selezionare fine periodo"><i class="fa-regular fa-calendar-plus"></i></label>
<input class="form-control" @bind="@selDtMax" id="dtMax" type="datetime-local" title="Selezionare fine periodo"> <input class="form-control" @bind="@selDtMax" id="dtMax" type="datetime-local" title="Selezionare fine periodo">
</div> </div>
@*<div class="input-group p-2">
<label class="input-group-text" for="DtMin" title="Selezionare la data da visualizzare"><i class="fa-solid fa-calendar-check"></i></label>
<input @bind="@selDtRef" id="DtMin" class="form-control" type="datetime-local" title="Selezionare la data minima da visualizzare" />
</div>
<div class="input-group p-2">
<label class="input-group-text" for="maxRecord" title="Selezionare il numero massimo di record da visualizzare"><i class="fa-solid fa-list-ol"></i></label>
<select @bind="@selMaxRecord" class="form-select" id="maxRecord" title="Selezionare il numero massimo di record da visualizzare">
<option value="50">50</option>
<option value="100">100</option>
<option value="250">250</option>
<option value="500">500</option>
</select>
</div>*@
</div> </div>
</div> </div>
</div> </div>
+12 -1
View File
@@ -38,7 +38,18 @@ namespace MP.SPEC.Components
} }
} }
} }
private bool filtActive
{
get => selMacchina != "*" || selArticolo != "*";
}
protected void resetMacchina()
{
selMacchina = "*";
}
protected void resetArticolo()
{
selArticolo = "*";
}
protected DateTime selDtMax protected DateTime selDtMax
{ {
get get
+135 -7
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,7 +307,8 @@ else
@record.dtEvento @record.dtEvento
</td> </td>
<td> <td>
@record.CodFlux @traduci(record.CodFlux)
<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)
+208 -88
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,15 +64,16 @@ 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
@@ -86,16 +83,63 @@ namespace MP.SPEC.Components
[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;
@@ -114,22 +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);
listaFlux = MDService.getFluxLog(currRecord.Valore); if (currRecordClone != null)
StateHasChanged(); {
// 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();
}
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)
@@ -138,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)
{ {
@@ -159,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()
@@ -193,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
@@ -213,13 +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 FluxLogDTO? currRecordFlux;
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
@@ -239,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
@@ -246,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;
@@ -261,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;
@@ -290,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;
@@ -324,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>
+1 -1
View File
@@ -274,7 +274,7 @@ namespace MP.SPEC.Components
{ {
get get
{ {
List<StatODLModel> answ = new List<StatODLModel>(); List<StatODLModel>? answ = new List<StatODLModel>();
if (hideSpenta) if (hideSpenta)
{ {
answ = ListOdlStatsNetto; answ = ListOdlStatsNetto;
+8 -1
View File
@@ -17,11 +17,15 @@ 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>
<th><i class="fa-solid fa-sliders"></i> Parametro</th> <th><i class="fa-solid fa-sliders"></i> Parametro</th>
<th><i class="fa-solid fa-sliders"></i> Nome</th>
<th style="text-align: right">Valore</th> <th style="text-align: right">Valore</th>
</tr> </tr>
</thead> </thead>
@@ -41,6 +45,9 @@ else
<td> <td>
@record.CodFlux @record.CodFlux
</td> </td>
<td>
@traduci(record.CodFlux)
</td>
<td style="text-align: right"> <td style="text-align: right">
<b>@record.Valore</b> <b>@record.Valore</b>
</td> </td>
+24 -4
View File
@@ -3,6 +3,7 @@ using Microsoft.JSInterop;
using MP.Data.DatabaseModels; using MP.Data.DatabaseModels;
using MP.SPEC.Data; using MP.SPEC.Data;
using System.Diagnostics; using System.Diagnostics;
using MP.Data;
namespace MP.SPEC.Components namespace MP.SPEC.Components
{ {
@@ -92,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);
@@ -135,7 +142,7 @@ namespace MP.SPEC.Components
#region Protected Methods #region Protected Methods
protected override async Task OnInitializedAsync() protected override void OnInitialized()
{ {
StartTimer(); StartTimer();
} }
@@ -163,8 +170,13 @@ namespace MP.SPEC.Components
{ {
currRecord = selRec; currRecord = selRec;
SelFilter.IdxMacchina = selRec.IdxMacchina; SelFilter.IdxMacchina = selRec.IdxMacchina;
SelDtMax = selRec.dtEvento;
// imposto pag 1 filtro
SelFilter.CurrPage = 1;
//selDtMin = RoundDatetime(5).AddHours(-25);
await reloadData(false); await reloadData(false);
await RecordSel.InvokeAsync(selRec); await RecordSel.InvokeAsync(selRec);
await PagerResetReq.InvokeAsync(true);
} }
protected async Task UpdateData() protected async Task UpdateData()
@@ -175,6 +187,13 @@ namespace MP.SPEC.Components
#endregion Protected Methods #endregion Protected Methods
private string traduci(string lemma)
{
var answ = MDService.Traduci(lemma, "IT");
return answ;
}
#region Private Fields #region Private Fields
private static System.Timers.Timer aTimer = null!; private static System.Timers.Timer aTimer = null!;
@@ -224,6 +243,7 @@ namespace MP.SPEC.Components
private DateTime? SelDtMax private DateTime? SelDtMax
{ {
get => SelFilter.dtMax; get => SelFilter.dtMax;
set => SelFilter.dtMax = value;
} }
private int totalCount private int totalCount
+9 -5
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>
@@ -37,15 +40,16 @@ else
<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>
@if (canStartOdl(record.IdxMacchina)) @if (canStartOdl(record.IdxMacchina))
{ {
<button @onclick="() => startOdl(record)" class="btn btn-success btn-sm" title="Avvia PODL"> <button @onclick="() => startOdl(record)" class="btn btn-success btn-sm mx-1" title="Avvia PODL">
<i class="far fa-play-circle"></i> <i class="far fa-play-circle"></i>
</button> </button>
} }
else else
{ {
<button class="btn btn-secondary btn-sm disabled" 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
+97 -80
View File
@@ -3,13 +3,13 @@
<div class="px-2"> <div class="px-2">
@if (!liveUpdate) @if (!liveUpdate)
{ {
<button class="btn btn-secondary" type="button" @onclick="() => toggleUpdate()" title="Click per tornare a Valori Live"> <button class="btn btn-secondary" type="button" @onclick="() => live()" title="Click per tornare a Valori Live">
<small>@lastUpdate</small> <small>@lastUpdate</small>
</button> </button>
} }
else else
{ {
<button class="btn btn-primary" type="button" @onclick="() => toggleUpdate()"> <button class="btn btn-primary" type="button" @onclick="() => notLive()">
<span class="spinner-grow spinner-grow-sm" role="status" aria-hidden="true"></span> <span class="spinner-grow spinner-grow-sm" role="status" aria-hidden="true"></span>
Valori live Valori live
</button> </button>
@@ -38,89 +38,106 @@
</div> </div>
</div> </div>
<a class="pt-2" data-bs-toggle="offcanvas" data-bs-target="#paramsFilterExample" aria-controls="paramsFilterExample" @onclick="setDtMax"> <div class="d-flex justify-content-between pt-2">
<i class="fa-solid fa-bars text-dark"></i> @if (filtActive)
</a> {
<div class="offcanvas offcanvas-end" tabindex="-1" id="paramsFilterExample" aria-labelledby="paramsFilterExampleLabel"> @*<i class="fas fa-exclamation text-warning"></i>*@
<div class="offcanvas-header"> @if (selMacchina != "*")
<h3 class="offcanvas-title" id="paramsFilterExampleLabel"><b>FILTRI</b></h3> {
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button> <button class="btn btn-outline-primary btn-sm mx-2" @onclick="()=>resetMacchina()" title="Rimuovi Filtro Impianto"><i class="fa-solid fa-hard-drive"></i> &nbsp <i class="fa-solid fa-xmark text-warning"></i></button>
}
@if (selFlux != "*")
{
<button class="btn btn-outline-primary btn-sm mx-2" @onclick="()=>resetFase()" title="Rimuovi Filtro Parametro"><i class="fa-solid fa-sliders"></i> &nbsp <i class="fa-solid fa-xmark text-warning"></i></button>
}
}
<div class="p-2">
<a class="" data-bs-toggle="offcanvas" data-bs-target="#paramsFilterExample" aria-controls="paramsFilterExample">
<i class="fa-solid fa-bars text-dark"></i>
</a>
</div> </div>
<div class="offcanvas-body"> </div>
<div class="small"> </div>
<label class="px-2" for="macchina" title="Selezionare impianto">Impianto</label> <div class="offcanvas offcanvas-end" tabindex="-1" id="paramsFilterExample" aria-labelledby="paramsFilterExampleLabel">
</div> <div class="offcanvas-header">
<div class="px-2 input-group"> <h3 class="offcanvas-title" id="paramsFilterExampleLabel"><b>FILTRI</b></h3>
<label class="input-group-text" for="macchina" title="Selezionare impianto"><i class="fa-solid fa-hard-drive"></i></label> <button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button>
<select @bind="@selMacchina" class="form-select" id="macchina" title="Selezionare impianto"> </div>
<option value="*">--- Tutti ---</option> <div class="offcanvas-body">
@if (ListMacchine != null) <div class="small">
<label class="px-2" for="macchina" title="Selezionare impianto">Impianto</label>
</div>
<div class="px-2 input-group">
<label class="input-group-text" for="macchina" title="Selezionare impianto"><i class="fa-solid fa-hard-drive"></i></label>
<select @bind="@selMacchina" class="form-select" id="macchina" title="Selezionare impianto">
<option value="*">--- Tutti ---</option>
@if (ListMacchine != null)
{
foreach (var item in ListMacchine)
{ {
foreach (var item in ListMacchine) <option value="@item">@item</option>
{
<option value="@item">@item</option>
}
} }
</select> }
</div> </select>
<div class="small mt-2"> </div>
<label class="px-2" for="flusso" title="Selezionare il parametro">Parametro</label> <div class="small mt-2">
</div> <label class="px-2" for="flusso" title="Selezionare il parametro">Parametro</label>
<div class="px-2 input-group"> </div>
<label class="input-group-text" for="flusso" title="Selezionare il parametro"><i class="fa-solid fa-sliders"></i></label> <div class="px-2 input-group">
<select @bind="@selFlux" class="form-select" id="flusso" title="Selezionare il parametro"> <label class="input-group-text" for="flusso" title="Selezionare il parametro"><i class="fa-solid fa-sliders"></i></label>
<option value="*">--- Tutti ---</option> <select @bind="@selFlux" class="form-select" id="flusso" title="Selezionare il parametro">
@if (ListFlux != null) <option value="*">--- Tutti ---</option>
@if (ListFlux != null)
{
foreach (var item in ListFlux)
{ {
foreach (var item in ListFlux) <option value="@item">@item</option>
{
<option value="@item">@item</option>
}
} }
</select> }
</div> </select>
<div class="small mt-2"> </div>
<label class="px-2" for="dtMin" title="Selezionare inizio periodo">Inizio Periodo</label> <div class="small mt-2">
</div> <label class="px-2" for="dtMin" title="Selezionare inizio periodo">Inizio Periodo</label>
<div class="px-2 input-group"> </div>
<label class="input-group-text" for="dtMin" title="Selezionare inizio periodo"><i class="fa-regular fa-calendar-minus"></i></label> <div class="px-2 input-group">
<input class="form-control" @bind="@selDtMin" id="dtMin" type="datetime-local" title="Data minima eventi da visualizzare"> <label class="input-group-text" for="dtMin" title="Selezionare inizio periodo"><i class="fa-regular fa-calendar-minus"></i></label>
</div> <input class="form-control" @bind="@selDtMin" id="dtMin" type="datetime-local" title="Data minima eventi da visualizzare">
<div class="small mt-2"> </div>
<label class="px-2" for="dtMax" title="Selezionare fine periodo">Fine Periodo</label> <div class="small mt-2">
</div> <label class="px-2" for="dtMax" title="Selezionare fine periodo">Fine Periodo</label>
<div class="px-2 input-group"> </div>
<label class="input-group-text" for="dtMax" title="Selezionare fine periodo"><i class="fa-regular fa-calendar-plus"></i></label> <div class="px-2 input-group">
<input class="form-control" @bind="@selDtMax" id="dtMax" type="datetime-local" title="Selezionare fine periodo"> <label class="input-group-text" for="dtMax" title="Selezionare fine periodo"><i class="fa-regular fa-calendar-plus"></i></label>
</div> <input class="form-control" @bind="@selDtMax" id="dtMax" type="datetime-local" title="Selezionare fine periodo">
<div class="small mt-2"> </div>
<label class="px-2" for="tempoAgg" title="Selezionare refresh rate (sec) periodo">Refresh rate (sec)</label> <div class="small mt-2">
</div> <label class="px-2" for="tempoAgg" title="Selezionare refresh rate (sec) periodo">Refresh rate (sec)</label>
<div class="px-2 input-group"> </div>
<label class="input-group-text" for="tempoAgg" title="Selezionare refresh rate (sec)"><i class="fa-solid fa-clock"></i></label> <div class="px-2 input-group">
<select @bind="@selTempoAgg" class="form-select" id="tempoAgg" title="Selezionare refresh rate (sec)" style="width: 3em;"> <label class="input-group-text" for="tempoAgg" title="Selezionare refresh rate (sec)"><i class="fa-solid fa-clock"></i></label>
<option value="2">2</option> <select @bind="@selTempoAgg" class="form-select" id="tempoAgg" title="Selezionare refresh rate (sec)" style="width: 3em;">
<option value="5">5</option> <option value="2">2</option>
<option value="10">10</option> <option value="5">5</option>
<option value="30">30</option> <option value="10">10</option>
<option value="60">60</option> <option value="30">30</option>
</select> <option value="60">60</option>
</div> </select>
<div class="small mt-2"> </div>
<label class="px-2" for="maxRecord" title="Numero massimo record da mostrare">Max Record</label> <div class="small mt-2">
</div> <label class="px-2" for="maxRecord" title="Numero massimo record da mostrare">Max Record</label>
<div class="px-2 input-group"> </div>
<label class="input-group-text" for="maxRecord" title="Numero massimo record da mostrare"><i class="fa-solid fa-list-ol"></i></label> <div class="px-2 input-group">
<select @bind="@selMaxRecord" class="form-select" id="maxRecord" title="Numero massimo record da mostrare"> <label class="input-group-text" for="maxRecord" title="Numero massimo record da mostrare"><i class="fa-solid fa-list-ol"></i></label>
<option value="50">50</option> <select @bind="@selMaxRecord" class="form-select" id="maxRecord" title="Numero massimo record da mostrare">
<option value="100">100</option> <option value="50">50</option>
<option value="250">250</option> <option value="100">100</option>
<option value="500">500</option> <option value="250">250</option>
<option value="1000">1000</option> <option value="500">500</option>
<option value="2500">2500</option> <option value="1000">1000</option>
<option value="5000">5000</option> <option value="2500">2500</option>
</select> <option value="5000">5000</option>
</div> </select>
</div> </div>
</div> </div>
</div> </div>
+44 -18
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()
@@ -165,12 +163,16 @@ namespace MP.SPEC.Components
NavManager.NavigateTo("DOSS", true); NavManager.NavigateTo("DOSS", true);
} }
private bool filtActive
{
get => selMacchina != "*" || selFlux != "*";
}
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);
@@ -178,13 +180,15 @@ namespace MP.SPEC.Components
var currRec = configData.FirstOrDefault(x => x.Chiave == "numOreAnticipoSnapshot"); var currRec = configData.FirstOrDefault(x => x.Chiave == "numOreAnticipoSnapshot");
if (currRec != null) if (currRec != null)
{ {
int.TryParse(currRec.Valore, out numOreAnticipoSnapshot); var newInt = 40;
int.TryParse(currRec.Valore, out newInt);
numOreAnticipoSnapshot = newInt;
} }
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;
@@ -193,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;
} }
@@ -205,6 +209,14 @@ namespace MP.SPEC.Components
aTimer.Enabled = true; aTimer.Enabled = true;
aTimer.Start(); aTimer.Start();
} }
protected void resetMacchina()
{
selMacchina = "*";
}
protected void resetFase()
{
selFlux = "*";
}
protected async Task takeSnapshot() protected async Task takeSnapshot()
{ {
@@ -212,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);
@@ -228,18 +240,19 @@ namespace MP.SPEC.Components
selDtMax = null; selDtMax = null;
} }
protected async Task toggleUpdate() protected async Task notLive()
{ {
liveUpdate = !liveUpdate; liveUpdate = false;
await Task.Delay(1); await Task.Delay(1);
if (!liveUpdate) if (!liveUpdate)
{ {
lastUpdate = $"{DateTime.Now:yyyy/MM/dd HH:mm:ss}"; lastUpdate = $"{DateTime.Now:yyyy/MM/dd HH:mm:ss}";
} }
else }
{ protected async Task live()
selDtMax = null; {
} liveUpdate = true;
await Task.Delay(1);
} }
#endregion Protected Methods #endregion Protected Methods
@@ -249,7 +262,7 @@ namespace MP.SPEC.Components
private static System.Timers.Timer aTimer = new System.Timers.Timer(); private static System.Timers.Timer aTimer = new System.Timers.Timer();
private List<string>? ListFlux = null; private List<string>? ListFlux = null;
private List<string>? ListMacchine = null; private List<string>? ListMacchine = null;
private int numOreAnticipoSnapshot = 5; private int numOreAnticipoSnapshot { get; set; } = 50;
private bool snapshotDone = false; private bool snapshotDone = false;
#endregion Private Fields #endregion Private Fields
@@ -299,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
+4 -4
View File
@@ -4,13 +4,13 @@
{ {
#region Public Events #region Public Events
public event Action EA_PageUpdated; public event Action EA_PageUpdated = null!;
public event Action EA_SearchUpdated; public event Action EA_SearchUpdated = null!;
public event Action EA_ShowSearch; public event Action EA_ShowSearch = null!;
public event Action EA_StatoSearch; public event Action EA_StatoSearch = null!;
#endregion Public Events #endregion Public Events
+166 -50
View File
@@ -29,10 +29,6 @@ namespace MP.SPEC.Data
_logger.LogInformation("Redis INIT"); _logger.LogInformation("Redis INIT");
// setup canali pub/sub
dataPipe = new MessagePipe(redisConn, Constants.ACT_MSE_DATA_KEY);
blinkPipe = new MessagePipe(redisConn, Constants.ACT_BLINK_KEY);
// conf DB // conf DB
string connStr = _configuration.GetConnectionString("Mp.Data"); string connStr = _configuration.GetConnectionString("Mp.Data");
if (string.IsNullOrEmpty(connStr)) if (string.IsNullOrEmpty(connStr))
@@ -52,15 +48,11 @@ namespace MP.SPEC.Data
public static MP.Data.Controllers.MpSpecController dbController { get; set; } = null!; public static MP.Data.Controllers.MpSpecController dbController { get; set; } = null!;
public MessagePipe blinkPipe { get; set; } = null!;
/// <summary> /// <summary>
/// Dizionario dei tag configurati per IOB /// Dizionario dei tag configurati per IOB
/// </summary> /// </summary>
public Dictionary<string, List<TagData>> currTagConf { get; set; } = new Dictionary<string, List<TagData>>(); public Dictionary<string, List<TagData>> currTagConf { get; set; } = new Dictionary<string, List<TagData>>();
public MessagePipe dataPipe { get; set; } = null!;
#endregion Public Properties #endregion Public Properties
#region Public Methods #region Public Methods
@@ -100,15 +92,14 @@ namespace MP.SPEC.Data
{ {
Stopwatch stopWatch = new Stopwatch(); Stopwatch stopWatch = new Stopwatch();
stopWatch.Start(); stopWatch.Start();
string source = "DB";
List<ListValues>? result = new List<ListValues>(); List<ListValues>? result = new List<ListValues>();
// cerco in redis... // cerco in redis...
RedisValue rawData = await redisDb.StringGetAsync(redisTipoArt); RedisValue rawData = await redisDb.StringGetAsync(redisTipoArt);
if (!string.IsNullOrEmpty($"{rawData}")) if (!string.IsNullOrEmpty($"{rawData}"))
{ {
result = JsonConvert.DeserializeObject<List<ListValues>>($"{rawData}"); result = JsonConvert.DeserializeObject<List<ListValues>>($"{rawData}");
stopWatch.Stop(); source = "REDIS";
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"AnagTipoArtLV Read from REDIS: {ts.TotalMilliseconds}ms");
} }
else else
{ {
@@ -116,10 +107,10 @@ namespace MP.SPEC.Data
// serializzo e salvo... // serializzo e salvo...
rawData = JsonConvert.SerializeObject(result); rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(redisTipoArt, rawData, getRandTOut(redisLongTimeCache)); await redisDb.StringSetAsync(redisTipoArt, rawData, getRandTOut(redisLongTimeCache));
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"AnagTipoArtLV Read from DB: {ts.TotalMilliseconds}ms");
} }
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"AnagTipoArtLV Read from {source}: {ts.TotalMilliseconds}ms");
if (result == null) if (result == null)
{ {
result = new List<ListValues>(); result = new List<ListValues>();
@@ -169,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>
@@ -180,7 +173,33 @@ namespace MP.SPEC.Data
/// <returns></returns> /// <returns></returns>
public async Task<List<AnagArticoli>> ArticoliGetSearch(int numRecord, string azienda, string searchVal) public async Task<List<AnagArticoli>> ArticoliGetSearch(int numRecord, string azienda, string searchVal)
{ {
return await Task.FromResult(dbController.ArticoliGetSearch(numRecord, azienda, searchVal)); List<AnagArticoli>? result = new List<AnagArticoli>();
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
string readType = "DB";
string currKey = $"{redisArtList}:{azienda}";
// cerco in redis dato valore sel macchina...
RedisValue rawData = redisDb.StringGet(currKey);
if (rawData.HasValue)
{
result = JsonConvert.DeserializeObject<List<AnagArticoli>>($"{rawData}");
readType = "REDIS";
}
else
{
result = await Task.FromResult(dbController.ArticoliGetSearch(numRecord, azienda, searchVal));
// serializzo e salvo...
rawData = JsonConvert.SerializeObject(result);
redisDb.StringSet(currKey, rawData, getRandTOut(redisLongTimeCache / 5));
}
if (result == null)
{
result = new List<AnagArticoli>();
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"ArticoliGetSearch | Read from {readType}: {ts.TotalMilliseconds}ms");
return result;
} }
/// <summary> /// <summary>
@@ -190,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>
@@ -221,7 +242,7 @@ namespace MP.SPEC.Data
{ {
// cerco in cache se ci sia la tabella con gli articoli impiegati... // cerco in cache se ci sia la tabella con gli articoli impiegati...
string rawTable = redisDb.StringGet(redKeyTabCheckArt); string rawTable = redisDb.StringGet(redKeyTabCheckArt);
List<string> artList = new List<string>(); List<string>? artList = new List<string>();
if (!string.IsNullOrEmpty(rawTable)) if (!string.IsNullOrEmpty(rawTable))
{ {
artList = JsonConvert.DeserializeObject<List<string>>(rawTable); artList = JsonConvert.DeserializeObject<List<string>>(rawTable);
@@ -321,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();
@@ -344,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";
@@ -355,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
@@ -367,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;
@@ -375,6 +396,19 @@ namespace MP.SPEC.Data
return result; return result;
} }
/// <summary>
/// Inserimento nuovo record dossier
/// </summary>
/// <param name="currDoss"></param>
/// <returns></returns>
public async Task<bool> DossiersInsert(DossierModel currDoss)
{
// aggiorno record sul DB
bool answ = await dbController.DossiersInsert(currDoss);
return answ;
}
/// <summary> /// <summary>
/// Effettua salvataggio snapshot parametri (con stored) + svuota eventuale cache redis /// Effettua salvataggio snapshot parametri (con stored) + svuota eventuale cache redis
/// </summary> /// </summary>
@@ -388,11 +422,10 @@ namespace MP.SPEC.Data
await Task.Delay(1); await Task.Delay(1);
// chiamo stored x salvare parametri // chiamo stored x salvare parametri
dbController.DossiersTakeParamsSnapshot(IdxMacchina, MaxSec, DtRif); dbController.DossiersTakeParamsSnapshot(IdxMacchina, MaxSec, DtRif);
// svuoto cache redis x macchina // elimino cache redis...
string currKey = $"{redisDossByMac}:{IdxMacchina}"; RedisValue pattern = new RedisValue($"{redisDossByMac}:*");
redisDb.StringSet(currKey, "", TimeSpan.FromSeconds(1)); answ = await ExecFlushRedisPattern(pattern);
currKey = $"{redisDossByMac}:*"; Log.Info($"Svuotata cache dossier | {pattern}");
redisDb.StringSet(currKey, "", TimeSpan.FromSeconds(1));
return answ; return answ;
} }
@@ -407,13 +440,26 @@ namespace MP.SPEC.Data
{ {
bool answ = false; bool answ = false;
await Task.Delay(1); await Task.Delay(1);
Log.Info($"Richiesta snapshot per macchina {IdxMacchina} | periodo {dtMin} --> {dtMax}");
// chiamo stored x salvare parametri // chiamo stored x salvare parametri
dbController.DossiersTakeParamsSnapshotLast(IdxMacchina, dtMin, dtMax); dbController.DossiersTakeParamsSnapshotLast(IdxMacchina, dtMin, dtMax);
// svuoto cache redis x macchina // elimino cache redis...
string currKey = $"{redisDossByMac}:{IdxMacchina}"; RedisValue pattern = new RedisValue($"{redisDossByMac}:*");
redisDb.StringSet(currKey, "", TimeSpan.FromSeconds(1)); answ = await ExecFlushRedisPattern(pattern);
currKey = $"{redisDossByMac}:*"; Log.Info($"Svuotata cache dossier | {pattern}");
redisDb.StringSet(currKey, "", TimeSpan.FromSeconds(1)); return answ;
}
/// <summary>
/// Update valore dossier
/// </summary>
/// <param name="currDoss"></param>
/// <returns></returns>
public async Task<bool> DossiersUpdateValore(DossierModel currDoss)
{
// aggiorno record sul DB
bool answ = await dbController.DossiersUpdateValore(currDoss);
return answ; return answ;
} }
@@ -455,24 +501,27 @@ namespace MP.SPEC.Data
await Task.Delay(1); await Task.Delay(1);
RedisValue pattern = new RedisValue($"{redisBaseAddr}*"); RedisValue pattern = new RedisValue($"{redisBaseAddr}*");
bool answ = await ExecFlushRedisPattern(pattern); bool answ = await ExecFlushRedisPattern(pattern);
// rileggo vocabolario.,..
ObjVocabolario = VocabolarioGetAll();
return answ; return answ;
} }
/// <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)
@@ -482,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));
@@ -593,8 +642,6 @@ namespace MP.SPEC.Data
TimeSpan ts = stopWatch.Elapsed; TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"ListPODLFilt | Read from {readType}: {ts.TotalMilliseconds}ms"); Log.Debug($"ListPODLFilt | Read from {readType}: {ts.TotalMilliseconds}ms");
return result; return result;
} }
/// <summary> /// <summary>
@@ -721,7 +768,7 @@ namespace MP.SPEC.Data
/// <returns></returns> /// <returns></returns>
public List<string> OdlGetCurrent() public List<string> OdlGetCurrent()
{ {
List<string> dbResult = new List<string>(); List<string>? dbResult = new List<string>();
Stopwatch stopWatch = new Stopwatch(); Stopwatch stopWatch = new Stopwatch();
stopWatch.Start(); stopWatch.Start();
string readType = "DB"; string readType = "DB";
@@ -752,7 +799,6 @@ namespace MP.SPEC.Data
TimeSpan ts = stopWatch.Elapsed; TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"OdlGetCurrent | Read from {readType}: {ts.TotalMilliseconds}ms"); Log.Debug($"OdlGetCurrent | Read from {readType}: {ts.TotalMilliseconds}ms");
return dbResult; return dbResult;
} }
@@ -846,7 +892,30 @@ namespace MP.SPEC.Data
return dbController.OdlStart(IdxOdl); return dbController.OdlStart(IdxOdl);
} }
public async Task<bool> updateDossierValue(Dossiers currDoss, FluxLogDTO editFL) /// <summary>
/// Esegue traduzione dato vocabolario da Lingua + Lemma
/// </summary>
/// <param name="lemma"></param>
/// <param name="lingua"></param>
/// <returns></returns>
public string Traduci(string lemma, string lingua)
{
string answ = $"[{lemma}]";
// verifico se ho qualcosa nell'obj vocabolario...
if (ObjVocabolario == null || ObjVocabolario.Count == 0)
{
// inizializzo il vocabolario...
ObjVocabolario = VocabolarioGetAll();
}
var record = ObjVocabolario.Where(x => x.Lingua == lingua && x.Lemma == lemma).FirstOrDefault();
if (record != null)
{
answ = record.Traduzione;
}
return answ;
}
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...
@@ -886,13 +955,38 @@ namespace MP.SPEC.Data
return answ; return answ;
} }
/// <summary>
public async Task<bool> DossiersUpdateValore(Dossiers currDoss) /// Elenco completo tabella Vocabolario
/// </summary>
/// <returns></returns>
public List<VocabolarioModel> VocabolarioGetAll()
{ {
// aggiorno record sul DB Stopwatch stopWatch = new Stopwatch();
bool answ = await dbController.DossiersUpdateValore(currDoss); stopWatch.Start();
List<VocabolarioModel>? result = new List<VocabolarioModel>();
return answ; string source = "REDIS";
// cerco in redis...
RedisValue rawData = redisDb.StringGet(redisVocabolario);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<VocabolarioModel>>($"{rawData}");
}
else
{
result = dbController.VocabolarioGetAll();
// serializzo e salvo...
rawData = JsonConvert.SerializeObject(result);
redisDb.StringSet(redisVocabolario, rawData, getRandTOut(redisLongTimeCache / 5));
source = "DB";
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"VocabolarioGetAll Read from {source}: {ts.TotalMilliseconds}ms");
if (result == null)
{
result = new List<VocabolarioModel>();
}
return result;
} }
#endregion Public Methods #endregion Public Methods
@@ -921,6 +1015,9 @@ namespace MP.SPEC.Data
#region Private Fields #region Private Fields
private const string redisArtByDossier = redisBaseAddr + "SPEC:Cache:ArtByDossier"; private const string redisArtByDossier = redisBaseAddr + "SPEC:Cache:ArtByDossier";
private const string redisArtList = redisBaseAddr + "SPEC:Cache:ArtList";
private const string redisBaseAddr = "MP:"; private const string redisBaseAddr = "MP:";
private const string redisConfKey = redisBaseAddr + "SPEC:Cache:Config"; private const string redisConfKey = redisBaseAddr + "SPEC:Cache:Config";
@@ -928,23 +1025,34 @@ namespace MP.SPEC.Data
private const string redisDossByMac = redisBaseAddr + "SPEC:Cache:DossByMac"; private const string redisDossByMac = redisBaseAddr + "SPEC:Cache:DossByMac";
private const string redisFluxByMac = redisBaseAddr + "SPEC:Cache:FluxByMac"; private const string redisFluxByMac = redisBaseAddr + "SPEC:Cache:FluxByMac";
private const string redisOdlCurrByMac = redisBaseAddr + "SPEC:Cache:OdlByMac";
private const string redisFluxLogFilt = redisBaseAddr + "SPEC:Cache:FluxLogFilt";
private const string redisMacByFlux = redisBaseAddr + "SPEC:Cache:MacByFlux"; private const string redisMacByFlux = redisBaseAddr + "SPEC:Cache:MacByFlux";
private const string redisMacList = redisBaseAddr + "SPEC:Cache:MacList"; private const string redisMacList = redisBaseAddr + "SPEC:Cache:MacList";
private const string redisOdlCurrByMac = redisBaseAddr + "SPEC:Cache:OdlByMac";
private const string redisPOdlList = redisBaseAddr + "SPEC:Cache:POdlList"; private const string redisPOdlList = redisBaseAddr + "SPEC:Cache:POdlList";
private const string redisFluxLogFilt = redisBaseAddr + "SPEC:Cache:FluxLogFilt";
private const string redisStatoCom = redisBaseAddr + "SPEC:Cache:StatoCom"; private const string redisStatoCom = redisBaseAddr + "SPEC:Cache:StatoCom";
private const string redisTipoArt = redisBaseAddr + "SPEC:Cache:TipoArt"; private const string redisTipoArt = redisBaseAddr + "SPEC:Cache:TipoArt";
private const string redisVocabolario = redisBaseAddr + "SPEC:Cache:Vocabolario";
private static IConfiguration _configuration = null!; private static IConfiguration _configuration = null!;
private static ILogger<MpDataService> _logger = null!; private static ILogger<MpDataService> _logger = null!;
private static Logger Log = LogManager.GetCurrentClassLogger(); private static Logger Log = LogManager.GetCurrentClassLogger();
/// <summary>
/// Oggetto vocabolario x uso continuo traduzione
/// </summary>
private List<VocabolarioModel> ObjVocabolario = new List<VocabolarioModel>();
/// <summary> /// <summary>
/// Oggetto per connessione a REDIS /// Oggetto per connessione a REDIS
/// </summary> /// </summary>
@@ -995,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
} }
} }
+2 -2
View File
@@ -15,9 +15,9 @@ namespace MP.SPEC.Data
public int CurrPage { get; set; } = 1; public int CurrPage { get; set; } = 1;
public DateTime DtEnd { get; set; } = Utils.InitDatetime(DateTime.Now, 5); public DateTime DtEnd { get; set; } = Utils.InitDatetime(DateTime.Now, 15);
public DateTime DtStart { get; set; } = Utils.InitDatetime(DateTime.Now, 5).AddDays(-730); public DateTime DtStart { get; set; } = Utils.InitDatetime(DateTime.Now, 15).AddDays(-730);
public string IdxMacchina { get; set; } = "*"; public string IdxMacchina { get; set; } = "*";
+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
@@ -19,7 +19,7 @@ namespace MP.SPEC.Data
public int NumRec { get; set; } = 10; public int NumRec { get; set; } = 10;
public int TotCount { get; set; } = 0; public int TotCount { get; set; } = 0;
public DateTime DtEnd { get; set; } = Utils.InitDatetime(DateTime.Now, 5); public DateTime DtEnd { get; set; } = Utils.InitDatetime(DateTime.Now, 5);
public DateTime DtStart { get; set; } = Utils.InitDatetime(DateTime.Now, 5).AddDays(-7); public DateTime DtStart { get; set; } = Utils.InitDatetime(DateTime.Now, 5).AddDays(-10);
public int MaxRecord { get; set; } = 100; public int MaxRecord { get; set; } = 100;
public bool IsActive { get; set; } = true; public bool IsActive { get; set; } = true;
public string SearchVal { get; set; } = "*"; public string SearchVal { get; set; } = "*";
+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.2210.2014</Version> <Version>6.16.2211.709</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
+1 -1
View File
@@ -39,7 +39,7 @@
Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f" Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f"
<logger name="*" minlevel="Debug" writeTo="f" /> <logger name="*" minlevel="Debug" writeTo="f" />
--> -->
<logger name="*" minlevel="Debug" writeTo="consoleTarget" /> <logger name="*" minlevel="Trace" writeTo="consoleTarget" />
<!--<logger name="Microsoft.*" maxlevel="Info" final="true" />--> <!--<logger name="Microsoft.*" maxlevel="Info" final="true" />-->
<logger name="*" minlevel="Info" writeTo="fileTarget" /> <logger name="*" minlevel="Info" writeTo="fileTarget" />
</rules> </rules>
+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>
+2 -3
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;
@@ -58,7 +57,7 @@ namespace MP.SPEC.Pages
protected MpDataService MDService { get; set; } = null!; protected MpDataService MDService { get; set; } = null!;
[Inject] [Inject]
protected NavigationManager NavManager { get; set; } protected NavigationManager NavManager { get; set; } = null!;
protected int totalCount protected int totalCount
{ {
@@ -290,7 +289,7 @@ namespace MP.SPEC.Pages
private async Task reloadData() private async Task reloadData()
{ {
isLoading = true; isLoading = true;
SearchRecords = await MDService.ArticoliGetSearch(100000, selAzienda, "*"); SearchRecords = await MDService.ArticoliGetSearch(100000, selAzienda, "");
ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList(); ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList();
isLoading = false; isLoading = false;
} }
+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
}
}
+52 -57
View File
@@ -1,7 +1,6 @@
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop; using Microsoft.JSInterop;
using MP.Data.DatabaseModels; using MP.Data.DatabaseModels;
using MP.Data.DTO;
using MP.SPEC.Components; using MP.SPEC.Components;
using MP.SPEC.Data; using MP.SPEC.Data;
@@ -11,7 +10,7 @@ namespace MP.SPEC.Pages
{ {
#region Protected Fields #region Protected Fields
protected DataPager pagerODL = null!; protected DataPager? pagerODL = null!;
#endregion Protected Fields #endregion Protected Fields
@@ -23,7 +22,6 @@ namespace MP.SPEC.Pages
[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
@@ -52,12 +50,62 @@ 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);
} }
protected void updateTotal(int newTotCount)
{
totalCount = newTotCount;
}
protected void UpdateTotCount(int newTotCount)
{
totalCount = newTotCount;
}
#endregion Protected Methods
#region Private Properties
private SelectDossierParams currFilter { get; set; } = new SelectDossierParams();
private int currPage
{
get => currFilter.CurrPage;
set => currFilter.CurrPage = value;
}
private DossierModel? currRecordDoss { get; set; } = null;
private bool isEditing
{
get => currFilter.isEditing;
set => currFilter.isEditing = value;
}
private bool isFiltering { get; set; } = false;
private bool isLoading { get; set; } = true;
private int numRecord
{
get => currFilter.NumRec;
set => currFilter.NumRec = value;
}
private int totalCount
{
get => currFilter.TotCount;
set => currFilter.TotCount = value;
}
#endregion Private Properties
#region Private Methods
private string css() private string css()
{ {
string answ = ""; string answ = "";
@@ -77,55 +125,6 @@ namespace MP.SPEC.Pages
isEditing = true; isEditing = true;
} }
protected void updateTotal(int newTotCount)
{
totalCount = newTotCount;
}
#endregion Protected Methods
#region Private Fields
private FluxLogDTO? _currDetFluxLogRecord = null;
#endregion Private Fields
#region Private Properties
private SelectDossierParams currFilter { get; set; } = new SelectDossierParams();
private int currPage
{
get => currFilter.CurrPage;
set => currFilter.CurrPage = value;
}
private Dossiers? currRecordDoss { get; set; } = null;
private bool isFiltering { get; set; } = false;
private bool isLoading { get; set; } = true;
private int numRecord
{
get => currFilter.NumRec;
set => currFilter.NumRec = value;
}
private bool isEditing
{
get => currFilter.isEditing;
set => currFilter.isEditing = value;
}
private int totalCount
{
get => currFilter.TotCount;
set => currFilter.TotCount = value;
}
#endregion Private Properties
#region Private Methods
private async Task updateFilter(SelectDossierParams newParams) private async Task updateFilter(SelectDossierParams newParams)
{ {
isFiltering = false; isFiltering = false;
@@ -137,10 +136,6 @@ namespace MP.SPEC.Pages
currFilter = newParams; currFilter = newParams;
isLoading = false; isLoading = false;
} }
protected void UpdateTotCount(int newTotCount)
{
totalCount = newTotCount;
}
#endregion Private Methods #endregion Private Methods
} }
+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
@@ -18,7 +18,7 @@ namespace MP.SPEC.Pages
protected MpDataService MDService { get; set; } = null!; protected MpDataService MDService { get; set; } = null!;
[Inject] [Inject]
protected MessageService MessageService { get; set; } protected MessageService MessageService { get; set; } = null!;
#endregion Protected Properties #endregion Protected Properties
+21 -3
View File
@@ -20,9 +20,27 @@
</div> </div>
</div> </div>
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<a class="pt-2 text-dark" data-bs-toggle="offcanvas" data-bs-target="#paramsFilterExample" aria-controls="paramsFilterExample" @onclick="setDtMax"> <div class="d-flex justify-content-between">
<i class="fa-solid fa-bars"></i> @if (filtActive)
</a> {
<div class=" rounded small d-flex justify-content-between" title="Filtri attivi">
@*<i class="fas fa-exclamation text-warning"></i>*@
@if (selMacchina != "*")
{
<button class="btn btn-outline-primary btn-sm mx-2" @onclick="()=>resetMacchina()" title="Rimuovi Filtro Impianto"><i class="fa-solid fa-hard-drive"></i> &nbsp <i class="fa-solid fa-xmark text-warning"></i></button>
}
@if (selStato != "*")
{
<button class="btn btn-outline-primary btn-sm mx-2" @onclick="()=>resetFase()" title="Rimuovi Filtro Parametro"><i class="fa-solid fa-sliders"></i> &nbsp <i class="fa-solid fa-xmark text-warning"></i></button>
}
</div>
}
<div class="p-2">
<a class="pt-2 text-dark" data-bs-toggle="offcanvas" data-bs-target="#paramsFilterExample" aria-controls="paramsFilterExample" @onclick="setDtMax">
<i class="fa-solid fa-bars"></i>
</a>
</div>
</div>
<div class="offcanvas offcanvas-end" tabindex="-1" id="paramsFilterExample" aria-labelledby="paramsFilterExampleLabel"> <div class="offcanvas offcanvas-end" tabindex="-1" id="paramsFilterExample" aria-labelledby="paramsFilterExampleLabel">
<div class="offcanvas-header"> <div class="offcanvas-header">
<h3 class="offcanvas-title" id="paramsFilterExampleLabel"><b>FILTRI</b></h3> <h3 class="offcanvas-title" id="paramsFilterExampleLabel"><b>FILTRI</b></h3>
+19 -3
View File
@@ -26,7 +26,7 @@ namespace MP.SPEC.Pages
#region Protected Fields #region Protected Fields
protected DataPager pagerODL = null!; protected DataPager? pagerODL = null!;
#endregion Protected Fields #endregion Protected Fields
@@ -71,7 +71,19 @@ namespace MP.SPEC.Pages
#endregion Protected Properties #endregion Protected Properties
#region Protected Methods #region Protected Methods
private bool filtActive
{
get => selMacchina != "*" || selStato != "*";
}
protected void resetMacchina()
{
selMacchina = "*";
}
protected void resetFase()
{
selStato = "*";
}
protected void ForceReload(int newNum) protected void ForceReload(int newNum)
{ {
numRecord = newNum; numRecord = newNum;
@@ -92,7 +104,11 @@ namespace MP.SPEC.Pages
{ {
if (doReset) if (doReset)
{ {
await pagerODL.resetCurrPage(); await Task.Delay(1);
if (pagerODL != null)
{
pagerODL.resetCurrPage();
}
} }
} }
@@ -100,7 +116,7 @@ namespace MP.SPEC.Pages
{ {
// copio il filtro // copio il filtro
currFilter.DtEnd = RoundDatetime(5); currFilter.DtEnd = RoundDatetime(5);
currFilter.DtStart = RoundDatetime(5).AddDays(-1); currFilter.DtStart = RoundDatetime(5).AddDays(-10);
} }
protected void UpdateTotCount(int newTotCount) protected void UpdateTotCount(int newTotCount)
+9 -4
View File
@@ -9,7 +9,7 @@ namespace MP.SPEC.Pages
{ {
#region Protected Fields #region Protected Fields
protected DataPager pagerODL = null!; protected DataPager? pagerODL = null!;
#endregion Protected Fields #endregion Protected Fields
@@ -30,7 +30,8 @@ namespace MP.SPEC.Pages
currPage = newNum; currPage = newNum;
DateTime adesso = DateTime.Now.AddSeconds(1); DateTime adesso = DateTime.Now.AddSeconds(1);
var updFilter = currFilter; var updFilter = currFilter;
updFilter.LiveUpdate = (currPage == 1); //updFilter.LiveUpdate = (currPage == 1);
updFilter.LiveUpdate = (currFilter.CurrPage == 1);
updFilter.lastUpdate = updFilter.LiveUpdate ? "-" : $"{adesso:yyyy/MM/dd HH:mm:ss}"; updFilter.lastUpdate = updFilter.LiveUpdate ? "-" : $"{adesso:yyyy/MM/dd HH:mm:ss}";
// salvo filtro // salvo filtro
currFilter = updFilter; currFilter = updFilter;
@@ -55,7 +56,11 @@ namespace MP.SPEC.Pages
{ {
if (doReset) if (doReset)
{ {
await pagerODL.resetCurrPage(); await Task.Delay(1);
if (pagerODL != null)
{
pagerODL.resetCurrPage();
}
} }
} }
@@ -127,7 +132,7 @@ namespace MP.SPEC.Pages
} }
else else
{ {
newParams.LiveUpdate = (currPage == 1); //newParams.LiveUpdate = (currPage == 1);
} }
await Task.Delay(1); await Task.Delay(1);
await InvokeAsync(() => StateHasChanged()); await InvokeAsync(() => StateHasChanged());
+17 -9
View File
@@ -12,7 +12,7 @@
<div class="px-2"> <div class="px-2">
@if (addEnabled) @if (addEnabled)
{ {
<button class="btn btn-success" @onclick="() => reqNewPODL()">@btnNewText <i class="bi bi-plus-square"></i></button> <button class="btn btn-success" @onclick="() => reqNewPODL()">Nuovo PODL <i class="bi bi-plus-square"></i></button>
} }
</div> </div>
</div> </div>
@@ -21,19 +21,20 @@
<div class="input-group input-group-sm"> <div class="input-group input-group-sm">
@*<label class="input-group-text" for="maxRecord" title="Selezionare l'azienda da visualizzare"><i class="fa-solid fa-industry"></i></label> @*<label class="input-group-text" for="maxRecord" title="Selezionare l'azienda da visualizzare"><i class="fa-solid fa-industry"></i></label>
<select @bind="@currAzienda" class="form-select" title="Selezionare l'azienda da visualizzare"> <select @bind="@currAzienda" class="form-select" title="Selezionare l'azienda da visualizzare">
@if (ListAziende != null) @if (ListAziende != null)
{ {
foreach (var item in ListAziende) foreach (var item in ListAziende)
{ {
<option value="@item.CodGruppo">@item.DescrGruppo</option> <option value="@item.CodGruppo">@item.DescrGruppo</option>
} }
} }
</select>*@ </select>*@
<label class="input-group-text" for="maxRecord" title="Selezionare la fase da visualizzare"><i class="fa-solid fa-screwdriver-wrench"></i></label> <label class="input-group-text" for="maxRecord" title="Selezionare la fase da visualizzare"><i class="fa-solid fa-screwdriver-wrench"></i></label>
<select @bind="@currFase" class="form-select" title="Selezionare la fase da visualizzare"> <select @bind="@currFase" class="form-select" title="Selezionare la fase da visualizzare">
<option value="*">--- Tutti ---</option> <option value="*">--- Tutti ---</option>
@if (ListStati != null) @if (ListStati != null)
{ {
foreach (var item in ListStati) foreach (var item in ListStati)
{ {
<option value="@item.value">@item.label</option> <option value="@item.value">@item.label</option>
@@ -126,7 +127,14 @@
{ {
foreach (var item in ListMacchine) foreach (var item in ListMacchine)
{ {
<option value="@item.IdxMacchina">@item.IdxMacchina | @item.Descrizione</option> if (selectFirst(item.IdxMacchina) == true)
{
<option selected value="@item.IdxMacchina">@item.IdxMacchina | @item.Descrizione</option>
}
else
{
<option value="@item.IdxMacchina">@item.IdxMacchina | @item.Descrizione</option>
}
} }
} }
</select> </select>
+18 -1
View File
@@ -87,7 +87,8 @@ namespace MP.SPEC.Pages
{ {
if (doReset) if (doReset)
{ {
await pagerODL.resetCurrPage(); await Task.Delay(1);
pagerODL.resetCurrPage();
} }
} }
@@ -203,6 +204,22 @@ namespace MP.SPEC.Pages
} }
} }
private bool selectFirst(string idxMacchina)
{
string firstMacchina="";
bool answ = false;
if (ListMacchine != null)
{
var rawData = ListMacchine.Select(x => x.IdxMacchina).FirstOrDefault();
firstMacchina = rawData != null ? rawData : "";
}
if (firstMacchina == idxMacchina)
{
answ = true;
}
return answ;
}
private string btnNewText private string btnNewText
{ {
get => currArticolo == "" ? "Sel Articolo" : "Nuovo PODL"; get => currArticolo == "" ? "Sel Articolo" : "Nuovo PODL";
+1 -1
View File
@@ -1,6 +1,6 @@
<body> <body>
<i>Modulo MAPOSPEC </i> <i>Modulo MAPOSPEC </i>
<h4>Versione: 6.16.2210.2014</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.2210.2014 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.2210.2014</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>
+1
View File
@@ -38,6 +38,7 @@
{ {
foreach (var item in ElencoLink) foreach (var item in ElencoLink)
{ {
<div class="nav-item px-2 col-12"> <div class="nav-item px-2 col-12">
<NavLink class="nav-link px-2" href="@item.NavigateUrl"> <NavLink class="nav-link px-2" href="@item.NavigateUrl">
<div class="col-2"> <div class="col-2">
+2 -2
View File
@@ -14,8 +14,8 @@
}, },
"ServerConf": { "ServerConf": {
"maxAge": "2000", "maxAge": "2000",
"cacheCheckArtUsato": 2, "cacheCheckArtUsato": "2",
"redisLongTimeCache": 15, "redisLongTimeCache": "15",
"MpIoBaseUrl": "http://localhost:20967/" "MpIoBaseUrl": "http://localhost:20967/"
} }
} }
Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

+4 -1
View File
@@ -4,7 +4,7 @@
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
<RootNamespace>MP.Stats</RootNamespace> <RootNamespace>MP.Stats</RootNamespace>
<UserSecretsId>826e877c-ba70-4253-84cb-d0b1cafd4440</UserSecretsId> <UserSecretsId>826e877c-ba70-4253-84cb-d0b1cafd4440</UserSecretsId>
<Version>6.16.2210.1708</Version> <Version>6.16.2210.2110</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@@ -203,6 +203,9 @@
<None Update="logs\.placeholder"> <None Update="logs\.placeholder">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
<None Update="post-build.ps1">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="temp\.placeholder"> <None Update="temp\.placeholder">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
+1 -1
View File
@@ -1,6 +1,6 @@
<body> <body>
<i>Modulo statistiche MAPO</i> <i>Modulo statistiche MAPO</i>
<h4>Versione: 6.16.2210.1708</h4> <h4>Versione: 6.16.2210.2110</h4>
<br /> <br />
Note di rilascio: Note di rilascio:
<ul> <ul>
+1 -1
View File
@@ -1 +1 @@
6.16.2210.1708 6.16.2210.2110
+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.1708</version> <version>6.16.2210.2110</version>
<url>https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/MP.Stats.zip</url> <url>https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/MP.Stats.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/ChangeLog.html</changelog> <changelog>https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory> <mandatory>false</mandatory>