Compare commits

...

50 Commits

Author SHA1 Message Date
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
Samuele Locatelli 1cae70c244 Merge branch 'Release/UpdateModuloDoss' 2022-10-20 14:54:22 +02:00
Samuele Locatelli 18ee183b05 Pulizia codice DOSS x spostamento modulo update 2022-10-20 14:54:03 +02:00
Samuele Locatelli d88c4cc2bd Update comportamento edit dossier 2022-10-20 13:16:07 +02:00
zaccaria.majid 67922520b8 fix edit mode label 'PENDING CHANGES' 2022-10-20 11:42:10 +02:00
zaccaria.majid c5b5b54586 fix edit mode 2022-10-20 11:21:01 +02:00
zaccaria.majid ae3864a614 fix salva solo quando finito 2022-10-20 11:08:31 +02:00
zaccaria.majid f878f1c496 Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-10-20 09:42:27 +02:00
zaccaria.majid d453c1d944 modifiche comportamento editing 2022-10-20 09:42:19 +02:00
Samuele Locatelli 921bf52659 Filtro eventi macchina spenta
- preso da semaforo (no idxStato)
2022-10-20 09:31:42 +02:00
Samuele Locatelli e948ae31af Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-10-19 20:07:36 +02:00
Samuele Locatelli b344180da2 Fix gestione HideSpenta da statistiche 2022-10-19 20:07:33 +02:00
zaccaria.majid 4b885d780c Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-10-19 17:47:48 +02:00
zaccaria.majid 01e181a4fc inizio modifiche editing 2022-10-19 17:47:07 +02:00
Samuele Locatelli 56f342a488 refresh test 2022-10-19 17:30:26 +02:00
Samuele Locatelli ed72bdfa24 Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-10-19 17:14:20 +02:00
Samuele Locatelli 5e6924f0fe Inizio gestione nascondi spenta 2022-10-19 17:13:43 +02:00
zaccaria.majid cae7e50cbd cleanUp 2022-10-19 17:11:27 +02:00
zaccaria.majid e769227bb3 fix not update if "annulla" 2022-10-19 17:10:56 +02:00
zaccaria.majid 60f757965e CleanUp 2022-10-19 13:07:05 +02:00
zaccaria.majid 603ed3782f Cleanup 2022-10-19 13:02:59 +02:00
zaccaria.majid 71177e04c7 Merge branch 'develop' of https://gitlab.steamware.net/steamware/mapo-core into develop 2022-10-19 13:01:28 +02:00
zaccaria.majid 1a211ebca5 delete msgService da PARAMS 2022-10-19 13:01:21 +02:00
zaccaria.majid 591b66b52d delete msgService da dossier 2022-10-19 12:49:13 +02:00
Samuele Locatelli 96f4bb3b4c Merge tag 'UpdateLogCall' into develop
Fix log chaimate MP/IO
2022-10-19 11:02:23 +02:00
55 changed files with 1126 additions and 453 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
+46 -2
View File
@@ -354,6 +354,32 @@ namespace MP.Data.Controllers
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(Dossiers 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,7 +427,7 @@ 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>
@@ -555,7 +581,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;
@@ -1001,6 +1027,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
@@ -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...
+6
View File
@@ -51,6 +51,7 @@ namespace MP.Data
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
@@ -305,6 +306,11 @@ namespace MP.Data
{ {
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 });
}); });
OnModelCreatingPartial(modelBuilder); OnModelCreatingPartial(modelBuilder);
+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.2210.2110</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>
+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.2210.2110</h4>
<br /> <br />
Note di rilascio: Note di rilascio:
<ul> <ul>
+1 -1
View File
@@ -1 +1 @@
6.16.2209.2118 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.2209.2118</version> <version>6.16.2210.2110</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>
+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
+23 -2
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,7 +21,7 @@
{ {
<SearchMod></SearchMod> <SearchMod></SearchMod>
} }
</div> </div>*@
</div> </div>
@code { @code {
@@ -62,4 +65,22 @@
userName = "N.A."; userName = "N.A.";
} }
} }
public async Task flushCache()
{
await Task.Delay(1);
await MDService.FlushRedisCache();
await JSRuntime.InvokeAsync<bool>("location.reload");
// rimando a home
//NavManager.NavigateTo("", true);
}
[Inject]
private NavigationManager NavManager { get; set; } = null!;
[Inject]
protected MpDataService MDService { get; set; } = null!;
[Inject]
protected IJSRuntime JSRuntime { get; set; } = null!;
} }
+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;
} }
+28 -17
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)
{
<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> </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
+87 -8
View File
@@ -1,6 +1,9 @@
@using MP.SPEC.Components @using MP.SPEC.Components
@using MP.SPEC.Data @using MP.SPEC.Data
@if (ListRecords == null) @if (ListRecords == null)
{ {
<LoadingData></LoadingData> <LoadingData></LoadingData>
@@ -11,6 +14,70 @@ else if (totalCount == 0)
} }
else else
{ {
@if (currFluxLogDto != 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>
Modifica Parametro
</div>
<div>
@if (isEditing)
{
<span class="text-light">PENDING CHANGES...</span>
}
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-3 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm">MACCHINA</span>
<input type="text" class="form-control" disabled aria-label="Art search" aria-describedby="inputGroup-sizing-sm" @bind-value="@currFluxLogDto.IdxMacchina">
</div>
</div>
<div class="col-3 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm">DATA</span>
<input type="text" class="form-control" disabled aria-label="Art search" aria-describedby="inputGroup-sizing-sm" @bind-value="@currFluxLogDto.dtEvento">
</div>
</div>
<div class="col-3 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm">DATA TYPE</span>
<input type="text" class="form-control" disabled aria-label="Art search" aria-describedby="inputGroup-sizing-sm" @bind-value="@currFluxLogDto.CodFlux">
</div>
</div>
<div class="col-3 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm">VALORE</span>
<input type="text" class="form-control" aria-label="Art search" aria-describedby="inputGroup-sizing-sm" @bind-value="@currFluxLogDto.ValoreEdit" @onclick="()=> enableEditing()">
</div>
</div>
</div>
<div class="row pt-4" style="visibility: @css()">
<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="() => cancel()" 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="() => update(currFluxLogDto)" class="btn btn-success">Save <i class="bi bi-save"></i></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
}
<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">
@@ -24,7 +91,6 @@ else
<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-regular fa-calendar-days"></i> Data Snap</th> <th><i class="fa-regular fa-calendar-days"></i> Data Snap</th>
<th><i class="fa-solid fa-sliders"></i> ODL</th> <th><i class="fa-solid fa-sliders"></i> ODL</th>
@*<th><i class="fa-solid fa-circle-info"></i> DATA TYPE</th>*@
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
@@ -33,7 +99,15 @@ else
{ {
<tr class="@checkSelect(@record)"> <tr class="@checkSelect(@record)">
<td> <td>
@if (isEditing == false)
{
<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>
}
else
{
<button class="btn btn-secondary btn-sm disabled"><i class="fa-solid fa-magnifying-glass"></i></button>
}
</td> </td>
<td> <td>
@record.OdlNav.CodArticolo @record.OdlNav.CodArticolo
@@ -52,11 +126,17 @@ else
<td> <td>
@record.IdxODL @record.IdxODL
</td> </td>
@*<td>
@record.DataType
</td>*@
<td> <td>
@if (isEditing == false)
{
<button @onclick="() => deleteRecord(record)" class="btn btn-danger btn-sm"><i class="bi bi-trash-fill"></i></button> <button @onclick="() => deleteRecord(record)" class="btn btn-danger btn-sm"><i class="bi bi-trash-fill"></i></button>
}
else
{
<button class="btn btn-secondary btn-sm disabled"><i class="bi bi-trash-fill"></i></button>
}
</td> </td>
</tr> </tr>
} }
@@ -81,10 +161,8 @@ else
<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-regular fa-calendar-days"></i> Data</th> <th><i class="fa-regular fa-calendar-days"></i> Data</th>
<th><i class="fa-solid fa-sliders"></i> Data Type</th> <th><i class="fa-solid fa-sliders"></i> Data Type</th>
<th> <th style="text-align: right;">
<div class="d-flex justify-content-between col-12"> <span class="col-11"> Valore </span>
<span class="col-11" style="text-align: right;"> Valore </span>
</div>
</th> </th>
</tr> </tr>
</thead> </thead>
@@ -103,6 +181,7 @@ else
</td> </td>
<td> <td>
@record.CodFlux @record.CodFlux
<div class="small text-dark" title="Valore Registrato"><i>@traduci(record.CodFlux)</i></div>
</td> </td>
<td style="text-align: right;"> <td style="text-align: right;">
@if (record.ValoreEdit != record.Valore) @if (record.ValoreEdit != record.Valore)
+95 -20
View File
@@ -4,6 +4,7 @@ using Microsoft.JSInterop;
using MP.Data.DatabaseModels; using MP.Data.DatabaseModels;
using MP.Data.DTO; using MP.Data.DTO;
using MP.SPEC.Data; using MP.SPEC.Data;
using Newtonsoft.Json;
namespace MP.SPEC.Components namespace MP.SPEC.Components
{ {
@@ -53,6 +54,7 @@ namespace MP.SPEC.Components
try try
{ {
answ = (currRecord.IdxMacchina == recordSel.IdxMacchina && currRecord.DtRif == recordSel.DtRif) ? "table-info" : ""; answ = (currRecord.IdxMacchina == recordSel.IdxMacchina && currRecord.DtRif == recordSel.DtRif) ? "table-info" : "";
} }
catch catch
{ } { }
@@ -61,28 +63,35 @@ namespace MP.SPEC.Components
} }
public void Dispose() public void Dispose()
{ {
MessageService.EA_PageUpdated -= MessageService_EA_PageUpdated;
MessageService.EA_SearchUpdated -= OnSeachUpdated;
currRecord = null; currRecord = null;
SearchRecords = null; SearchRecords = null;
ListRecords = null; ListRecords = null;
GC.Collect(); GC.Collect();
} }
private SelectDossierParams lastFilter { get; set; } = new SelectDossierParams() { CurrPage = -1 };
protected override async Task OnParametersSetAsync()
{
if (!lastFilter.Equals(SelFilter))
{
lastFilter = SelFilter.clone();
await reloadData(true);
}
}
#endregion Public Methods #endregion Public Methods
#region Protected Properties #region Protected Properties
private string traduci(string lemma)
{
var answ = MDService.Traduci(lemma, "IT");
return answ;
}
[Inject] [Inject]
protected IJSRuntime JSRuntime { get; set; } = null!; protected IJSRuntime JSRuntime { get; set; } = null!;
[Inject] [Inject]
protected MpDataService MDService { get; set; } = null!; protected MpDataService MDService { get; set; } = null!;
[Inject]
protected MessageService MessageService { get; set; } = null!;
#endregion Protected Properties #endregion Protected Properties
#region Protected Methods #region Protected Methods
@@ -111,10 +120,62 @@ namespace MP.SPEC.Components
await RecordSelFlux.InvokeAsync(selRec); await RecordSelFlux.InvokeAsync(selRec);
} }
private void enableEditing()
{
isEditing = true;
}
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 update(FluxLogDTO selRec)
{
var alert = await JSRuntime.InvokeAsync<bool>("confirm", "Confermi di voler salvare TUTTE le modifiche? queste saranno parte del dossier inviato all'impianto");
if (alert)
{
await Task.Delay(1);
if (currRecord != null)
{
// serializzo valore x flux log...
DossierFluxLogDTO updatedResult = new DossierFluxLogDTO() { ODL = listaFlux };
string newVal = JsonConvert.SerializeObject(updatedResult);
currRecord.Valore = newVal;
// METODO PER UPDATE FLUX
await MDService.DossiersUpdateValore(currRecord);
currFluxLogDto = null;
isEditing = false;
await Task.Delay(1);
StateHasChanged();
}
return;
}
else
{
currFluxLogDto = null;
await Task.Delay(1);
await JSRuntime.InvokeAsync<bool>("location.reload");
}
}
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
MessageService.EA_PageUpdated += MessageService_EA_PageUpdated;
MessageService.EA_SearchUpdated += OnSeachUpdated;
ListStati = await MDService.AnagStatiComm(); ListStati = await MDService.AnagStatiComm();
await reloadData(true); await reloadData(true);
} }
@@ -141,6 +202,19 @@ 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
@@ -150,7 +224,6 @@ namespace MP.SPEC.Components
private Dossiers? currRecord = null; private Dossiers? currRecord = null;
private FluxLogDTO? currRecordFlux;
private List<Dossiers>? ListRecords; private List<Dossiers>? ListRecords;
private List<ListValues>? ListStati; private List<ListValues>? ListStati;
@@ -162,8 +235,14 @@ namespace MP.SPEC.Components
private int currPage private int currPage
{ {
get => MessageService.currPage; get => SelFilter.CurrPage;
set => MessageService.currPage = value; set => SelFilter.CurrPage = value;
}
private bool isEditing
{
get => SelFilter.isEditing;
set => SelFilter.isEditing = value;
} }
private bool isLoading { get; set; } = false; private bool isLoading { get; set; } = false;
@@ -177,8 +256,8 @@ namespace MP.SPEC.Components
private int numRecord private int numRecord
{ {
get => MessageService.numRecord; get => SelFilter.NumRec;
set => MessageService.numRecord = value; set => SelFilter.NumRec = value;
} }
private string SelArticolo private string SelArticolo
@@ -219,11 +298,6 @@ namespace MP.SPEC.Components
#region Private Methods #region Private Methods
private async void MessageService_EA_PageUpdated()
{
await reloadData(true);
}
private async Task reloadData(bool setChanged) private async Task reloadData(bool setChanged)
{ {
isLoading = true; isLoading = true;
@@ -263,6 +337,7 @@ namespace MP.SPEC.Components
currFluxLogDto = null; currFluxLogDto = null;
currRecord = null; currRecord = null;
visualizzaFlux = true; visualizzaFlux = true;
isEditing = false;
await RecordSelFlux.InvokeAsync(currFluxLogDto); await RecordSelFlux.InvokeAsync(currFluxLogDto);
await Task.Delay(1); await Task.Delay(1);
} }
+16 -5
View File
@@ -198,6 +198,17 @@ else
</div> </div>
} }
</td> </td>
<td>
<div class="input-group input-group-sm">
<div class="input-group-text">
<span class="me-1 @leftStringCSS">Tutti gli Stati</span>
<span class="form-check form-check-sm form-switch py-1" title="Mostra/Nascondi macchina spenta">
<input class="form-check-input" type="checkbox" id="switchSpenta" @onchange="() => toggleSpenta()" value="@hideSpenta">
</span>
<span class="@rightStringCSS">Nascondi Spenta</span>
</div>
</div>
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@@ -205,10 +216,9 @@ else
<div> <div>
@if (statRecord != null) @if (statRecord != null)
{ {
@if (ListOdlStatsAct != null)
@if (ListOdlStats != null)
{ {
@foreach (var stat in ListOdlStats) @foreach (var stat in ListOdlStatsAct)
{ {
<div class="p-1"> <div class="p-1">
<div class="d-flex justify-content-between"> <div class="d-flex justify-content-between">
@@ -234,11 +244,12 @@ else
@if (statRecord != null && ListOdlStats != null) @if (statRecord != null && ListOdlStats != null)
{ {
<div class="dcBox"> <div class="dcBox">
<ODLPlot SelectedOdl="@statRecord.IdxOdl"></ODLPlot> <ODLPlot SelectedOdl="@statRecord.IdxOdl" hideSpenta="@hideSpenta"></ODLPlot>
</div> </div>
<div class="dcBox dcOverlay d-flex"> <div class="dcBox dcOverlay d-flex">
<div class="align-self-center text-center w-100"> <div class="align-self-center text-center w-100">
<b class="fs-3">@statRecord.DurataMinuti</b> <b class="fs-3">@durataFilt</b>
@*<b class="fs-3">@statRecord.DurataMinuti</b>*@
</div> </div>
</div> </div>
} }
+97 -28
View File
@@ -46,6 +46,7 @@ namespace MP.SPEC.Components
ListRecords = null; ListRecords = null;
ListStati = null; ListStati = null;
ListOdlStats = null; ListOdlStats = null;
ListOdlStatsNetto = null;
statRecord = null; statRecord = null;
GC.Collect(); GC.Collect();
} }
@@ -87,7 +88,7 @@ namespace MP.SPEC.Components
await MDService.ODLClose(currRecord.IdxOdl, currRecord.IdxMacchina, 0, true); await MDService.ODLClose(currRecord.IdxOdl, currRecord.IdxMacchina, 0, true);
Log.Info($"Effettuata chiusura ODL {currRecord.IdxOdl}"); Log.Info($"Effettuata chiusura ODL {currRecord.IdxOdl}");
// ricarica... // ricarica...
await selectRecord(null); await selRecord(null);
} }
await reloadData(); await reloadData();
} }
@@ -116,7 +117,7 @@ namespace MP.SPEC.Components
await callSyncDb(currRecord.IdxMacchina); await callSyncDb(currRecord.IdxMacchina);
Log.Info($"Richiesto forceSyncDb per idxMacc {currRecord.IdxMacchina}"); Log.Info($"Richiesto forceSyncDb per idxMacc {currRecord.IdxMacchina}");
// ricarica... // ricarica...
await selectRecord(null); await selRecord(null);
} }
await reloadData(); await reloadData();
} }
@@ -143,27 +144,10 @@ namespace MP.SPEC.Components
protected async Task resetSel() protected async Task resetSel()
{ {
await selectRecord(null); await selRecord(null);
await reloadData(); await reloadData();
} }
protected async Task selectRecord(ODLModel? currRec)
{
showStats = true;
await Task.Delay(1);
currRecord = currRec;
if (currRec != null)
{
showStats = true;
ListOdlStats = await MDService.StatOdl(currRec.IdxOdl);
}
else
{
showStats = false;
ListOdlStats = null;
}
}
protected async Task selectStatRecord(ODLModel? currRec) protected async Task selectStatRecord(ODLModel? currRec)
{ {
showStats = true; showStats = true;
@@ -171,8 +155,7 @@ namespace MP.SPEC.Components
statRecord = currRec; statRecord = currRec;
if (currRec != null) if (currRec != null)
{ {
showStats = true; await reloadStatsData(currRec);
ListOdlStats = await MDService.StatOdl(currRec.IdxOdl);
} }
else else
{ {
@@ -188,11 +171,22 @@ namespace MP.SPEC.Components
currRecord = currRec; currRecord = currRec;
showStats = false; showStats = false;
ListOdlStats = null; ListOdlStats = null;
ListOdlStatsNetto = null;
}
protected async Task toggleSpenta()
{
hideSpenta = !hideSpenta;
await Task.Delay(1);
if (statRecord != null)
{
await reloadStatsData(statRecord);
}
} }
protected async Task UpdateData() protected async Task UpdateData()
{ {
await selectRecord(null); await selRecord(null);
await reloadData(); await reloadData();
} }
@@ -201,10 +195,13 @@ namespace MP.SPEC.Components
#region Private Fields #region Private Fields
private static Logger Log = LogManager.GetCurrentClassLogger(); private static Logger Log = LogManager.GetCurrentClassLogger();
private ODLModel? currRecord = null; private ODLModel? currRecord = null;
private List<StatODLModel>? ListOdlStats; private List<StatODLModel>? ListOdlStats;
private List<StatODLModel>? ListOdlStatsNetto;
private List<ODLModel>? ListRecords; private List<ODLModel>? ListRecords;
private List<ListValues>? ListStati; private List<ListValues>? ListStati;
@@ -225,6 +222,39 @@ namespace MP.SPEC.Components
set => currFilter.CurrPage = value; set => currFilter.CurrPage = value;
} }
private string durataFilt
{
get
{
string answ = "ND";
if (statRecord != null)
{
if (hideSpenta)
{
if (ListOdlStatsNetto != null)
{
var tsDurata = TimeSpan.FromMinutes(ListOdlStatsNetto.Sum(x => x.TotDurata));
if (tsDurata.TotalDays < 1)
{
answ = $"{tsDurata.Hours:00}h {tsDurata.Minutes:00}'";
}
else
{
answ = $"{tsDurata.Days}gg {tsDurata.Hours:00}h";
}
}
}
else
{
answ = statRecord.DurataMinuti;
}
}
return answ;
}
}
private bool hideSpenta { get; set; } = false;
/// <summary> /// <summary>
/// Indica se si tratti di ODL correnti /// Indica se si tratti di ODL correnti
/// </summary> /// </summary>
@@ -235,12 +265,39 @@ namespace MP.SPEC.Components
private bool isLoading { get; set; } = false; private bool isLoading { get; set; } = false;
private string leftStringCSS
{
get => hideSpenta ? "text-secondary" : "text-dark fw-bold";
}
private List<StatODLModel>? ListOdlStatsAct
{
get
{
List<StatODLModel>? answ = new List<StatODLModel>();
if (hideSpenta)
{
answ = ListOdlStatsNetto;
}
else
{
answ = ListOdlStats;
}
return answ;
}
}
private int numRecord private int numRecord
{ {
get => currFilter.NumRec; get => currFilter.NumRec;
set => currFilter.NumRec = value; set => currFilter.NumRec = value;
} }
private string rightStringCSS
{
get => hideSpenta ? "text-dark fw-bold" : "text-secondary";
}
private DateTime selDtFine { get; set; } = DateTime.Now; private DateTime selDtFine { get; set; } = DateTime.Now;
private bool showStats { get; set; } = false; private bool showStats { get; set; } = false;
@@ -286,12 +343,9 @@ namespace MP.SPEC.Components
double answ = 0; double answ = 0;
double tot = 0; double tot = 0;
if (ListOdlStats != null) if (ListOdlStatsAct != null)
{ {
foreach (var item in ListOdlStats) tot = ListOdlStatsAct.Sum(x => x.TotDurata);
{
tot += item.TotDurata;
}
double perc = (durata / tot) * 100; double perc = (durata / tot) * 100;
if (perc > 1) if (perc > 1)
@@ -349,6 +403,21 @@ namespace MP.SPEC.Components
isLoading = false; isLoading = false;
} }
private async Task reloadStatsData(ODLModel? currRec)
{
showStats = true;
if (currRec != null)
{
ListOdlStats = await MDService.StatOdl(currRec.IdxOdl);
ListOdlStatsNetto = ListOdlStats.Where(x => x.Semaforo != "sGr").ToList();
}
else
{
ListOdlStats = null;
ListOdlStatsNetto = null;
}
}
private string tradFase(string codFase) private string tradFase(string codFase)
{ {
string answ = codFase; string answ = codFase;
+4
View File
@@ -22,6 +22,7 @@ else
<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 +42,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>
+48 -21
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
{ {
@@ -25,7 +26,7 @@ namespace MP.SPEC.Components
#endregion Public Properties #endregion Public Properties
#region Public Methods #region Public Methods
private SelectFluxParams lastFilter { get; set; } = new SelectFluxParams() { CurrPage = -1 };
public string checkSelect(FluxLog selRecord) public string checkSelect(FluxLog selRecord)
{ {
string answ = ""; string answ = "";
@@ -45,10 +46,10 @@ namespace MP.SPEC.Components
{ {
await Task.Delay(1); await Task.Delay(1);
// se sono cambiati --> rileggo... // se sono cambiati --> rileggo...
if (LastFilter==null || !SelFilter.Equals(LastFilter)) if (!lastFilter.Equals(SelFilter))
{ {
await reloadData(false); lastFilter = SelFilter.clone();
LastFilter = SelFilter; await reloadData(true);
} }
} }
@@ -58,8 +59,6 @@ namespace MP.SPEC.Components
public void Dispose() public void Dispose()
{ {
aTimer.Elapsed -= ElapsedTimer; aTimer.Elapsed -= ElapsedTimer;
MessageService.EA_PageUpdated -= MessageService_EA_PageUpdated;
MessageService.EA_SearchUpdated -= OnSeachUpdated;
aTimer.Stop(); aTimer.Stop();
aTimer.Dispose(); aTimer.Dispose();
currRecord = null; currRecord = null;
@@ -128,9 +127,6 @@ namespace MP.SPEC.Components
[Inject] [Inject]
protected MpDataService MDService { get; set; } = null!; protected MpDataService MDService { get; set; } = null!;
[Inject]
protected MessageService MessageService { get; set; } = null!;
protected int RefreshPeriod protected int RefreshPeriod
{ {
get => SelFilter.TempoAgg; get => SelFilter.TempoAgg;
@@ -140,10 +136,8 @@ namespace MP.SPEC.Components
#region Protected Methods #region Protected Methods
protected override async Task OnInitializedAsync() protected override void OnInitialized()
{ {
MessageService.EA_PageUpdated += MessageService_EA_PageUpdated;
MessageService.EA_SearchUpdated += OnSeachUpdated;
StartTimer(); StartTimer();
} }
@@ -163,6 +157,7 @@ namespace MP.SPEC.Components
protected async Task resetSel() protected async Task resetSel()
{ {
currRecord = null; currRecord = null;
setDtMax();
await RecordSel.InvokeAsync(null); await RecordSel.InvokeAsync(null);
} }
@@ -170,8 +165,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()
@@ -182,6 +182,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!;
@@ -197,8 +204,8 @@ namespace MP.SPEC.Components
private int currPage private int currPage
{ {
get => MessageService.currPage; get => SelFilter.CurrPage;
set => MessageService.currPage = value; set => SelFilter.CurrPage = value;
} }
private bool isLoading { get; set; } = false; private bool isLoading { get; set; } = false;
@@ -215,8 +222,8 @@ namespace MP.SPEC.Components
private int numRecord private int numRecord
{ {
get => MessageService.numRecord; get => SelFilter.NumRec;
set => MessageService.numRecord = value; set => SelFilter.NumRec = value;
} }
private string SelFlux private string SelFlux
@@ -231,8 +238,33 @@ namespace MP.SPEC.Components
private DateTime? SelDtMax private DateTime? SelDtMax
{ {
get => SelFilter.dtMax; get => SelFilter.dtMax;
set => SelFilter.dtMax = value;
}
protected void setDtMax()
{
// copio il filtro
var currFilt = SelFilter;
// fermo update
//currFilt.LiveUpdate = true;
currFilt.CurrPage = 0;
currFilt.lastUpdate = $"{DateTime.Now:yyyy/MM/dd HH:mm:ss}";
currFilt.dtMax = RoundDatetime(5);
currFilt.dtMin = RoundDatetime(5).AddHours(-25);
SelFilter = currFilt;
} }
/// <summary>
/// Inizializzazione con periodo e arrotondamento
/// </summary>
/// <param name="minRound"></param>
/// <returns></returns>
public static DateTime RoundDatetime(int minRound)
{
TimeSpan DayElapsed = DateTime.Now.Subtract(DateTime.Today);
int minDay = (int)Math.Ceiling((double)(DayElapsed.TotalMinutes / minRound)) * minRound;
DateTime endRounded = DateTime.Today.AddMinutes(minDay);
return endRounded;
}
private int totalCount private int totalCount
{ {
get => _totalCount; get => _totalCount;
@@ -250,11 +282,6 @@ namespace MP.SPEC.Components
#region Private Methods #region Private Methods
private async void MessageService_EA_PageUpdated()
{
await reloadData(true);
}
#endregion Private Methods #endregion Private Methods
} }
} }
+2 -2
View File
@@ -37,13 +37,13 @@ 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>
+34 -16
View File
@@ -1,15 +1,26 @@
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using MP.Data.DatabaseModels; using MP.Data.DatabaseModels;
using MP.SPEC.Components;
using MP.SPEC.Data; using MP.SPEC.Data;
namespace MP.SPEC.Components namespace MP.SPEC.Components
{ {
public partial class ODLPlot public partial class ODLPlot
{ {
#region Public Fields
public List<DoughnutStyling> colors = new List<DoughnutStyling>();
public List<double> Data = new List<double>();
public List<string> Labels = new List<string>();
#endregion Public Fields
#region Public Properties #region Public Properties
[Parameter]
public bool hideSpenta { get; set; }
public int OdlId public int OdlId
{ {
get => _selParam; get => _selParam;
@@ -29,34 +40,36 @@ namespace MP.SPEC.Components
//protected DataLogFilter _SelFilter { get; set; } = new DataLogFilter(); //protected DataLogFilter _SelFilter { get; set; } = new DataLogFilter();
protected int _selParam { get; set; } = -1; protected int _selParam { get; set; } = -1;
[Inject]
protected MpDataService MDService { get; set; } = null!;
#endregion Protected Properties #endregion Protected Properties
#region Protected Methods #region Protected Methods
private bool isLoading { get; set; } = false;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
isLoading = true; isLoading = true;
await Task.Delay(1); await Task.Delay(1);
} }
private List<StatODLModel>? ListRecords = null;
protected override async Task OnParametersSetAsync() protected override async Task OnParametersSetAsync()
{ {
await ReloadData(); await ReloadData();
await Task.Delay(1); await Task.Delay(1);
} }
public List<double> Data = new List<double>();
public List<string> Labels = new List<string>();
public List<DoughnutStyling> colors = new List<DoughnutStyling>();
protected async Task ReloadData() protected async Task ReloadData()
{ {
Data.Clear(); Data.Clear();
Labels.Clear(); Labels.Clear();
colors.Clear(); colors.Clear();
ListRecords = await MDService.StatOdl(SelectedOdl); ListRecords = await MDService.StatOdl(SelectedOdl);
// se hideSpenta --> filtro stato 11 = spenta...
if (hideSpenta)
{
ListRecords = ListRecords.Where(x => x.Semaforo != "sGr").ToList();
}
foreach (var record in ListRecords) foreach (var record in ListRecords)
{ {
Data.Add(record.TotDurata); Data.Add(record.TotDurata);
@@ -73,18 +86,23 @@ namespace MP.SPEC.Components
{ {
colors.Add(new DoughnutStyling(record.Css, "ccc")); colors.Add(new DoughnutStyling(record.Css, "ccc"));
} }
} }
await Task.Delay(1); await Task.Delay(1);
isLoading = false; isLoading = false;
} }
[Inject]
protected MpDataService MDService { get; set; } = null!;
#endregion Protected Methods #endregion Protected Methods
#region Private Fields
private List<StatODLModel>? ListRecords = null;
#endregion Private Fields
#region Private Properties
private bool isLoading { get; set; } = false;
#endregion Private Properties
} }
} }
+21 -4
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,9 +38,27 @@
</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">
@if (filtActive)
{
@*<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 (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> <i class="fa-solid fa-bars text-dark"></i>
</a> </a>
</div>
</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>
@@ -123,5 +141,4 @@
</div> </div>
</div> </div>
</div> </div>
</div>
+22 -7
View File
@@ -165,6 +165,10 @@ 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();
@@ -178,7 +182,9 @@ 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);
@@ -205,6 +211,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()
{ {
@@ -228,18 +242,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
{
selDtMax = null;
} }
protected async Task live()
{
liveUpdate = true;
await Task.Delay(1);
} }
#endregion Protected Methods #endregion Protected Methods
@@ -249,7 +264,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
+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
+143 -31
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(); stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed; TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"AnagTipoArtLV Read from DB: {ts.TotalMilliseconds}ms"); Log.Debug($"AnagTipoArtLV Read from {source}: {ts.TotalMilliseconds}ms");
}
if (result == null) if (result == null)
{ {
result = new List<ListValues>(); result = new List<ListValues>();
@@ -180,7 +171,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>
@@ -221,7 +238,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);
@@ -375,6 +392,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(Dossiers currDoss)
{
// aggiorno record sul DB
bool answ = await dbController.DossiersUpdateValore(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 +418,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 +436,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(Dossiers currDoss)
{
// aggiorno record sul DB
bool answ = await dbController.DossiersUpdateValore(currDoss);
return answ; return answ;
} }
@@ -455,6 +497,8 @@ 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;
} }
@@ -593,8 +637,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 +763,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 +794,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,6 +887,29 @@ namespace MP.SPEC.Data
return dbController.OdlStart(IdxOdl); return dbController.OdlStart(IdxOdl);
} }
/// <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(Dossiers currDoss, FluxLogDTO editFL) public async Task<bool> updateDossierValue(Dossiers currDoss, FluxLogDTO editFL)
{ {
bool answ = false; bool answ = false;
@@ -886,6 +950,40 @@ namespace MP.SPEC.Data
return answ; return answ;
} }
/// <summary>
/// Elenco completo tabella Vocabolario
/// </summary>
/// <returns></returns>
public List<VocabolarioModel> VocabolarioGetAll()
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
List<VocabolarioModel>? result = new List<VocabolarioModel>();
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
#region Protected Fields #region Protected Fields
@@ -912,6 +1010,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";
@@ -919,23 +1020,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>
+74
View File
@@ -0,0 +1,74 @@
namespace MP.SPEC.Data
{
public class SelectArticoliParams
{
#region Public Constructors
public SelectArticoliParams()
{ }
#endregion Public Constructors
#region Public Properties
public int CurrPage { get; set; } = 1;
public string IdxMacchina { get; set; } = "*";
public string Azienda { get; set; } = "*";
public int MaxRecord { get; set; } = 100;
public int NumRec { get; set; } = 10;
public int TotCount { get; set; } = 0;
#endregion Public Properties
#region Public Methods
public SelectArticoliParams clone()
{
SelectArticoliParams clonedData = new SelectArticoliParams()
{
CurrPage = this.CurrPage,
IdxMacchina = this.IdxMacchina,
Azienda = this.Azienda,
MaxRecord = this.MaxRecord,
NumRec = this.NumRec,
TotCount = this.TotCount
};
return clonedData;
}
public override bool Equals(object obj)
{
if (!(obj is SelectArticoliParams item))
return false;
if (MaxRecord != item.MaxRecord)
return false;
if (NumRec != item.NumRec)
return false;
if (TotCount != item.TotCount)
return false;
if (CurrPage != item.CurrPage)
return false;
if (IdxMacchina != item.IdxMacchina)
return false;
return true;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
#endregion Public Methods
}
}
+27 -15
View File
@@ -1,4 +1,6 @@
namespace MP.SPEC.Data using MP.Data;
namespace MP.SPEC.Data
{ {
public class SelectDossierParams public class SelectDossierParams
{ {
@@ -13,31 +15,35 @@
public int CurrPage { get; set; } = 1; public int CurrPage { get; set; } = 1;
public DateTime DtEnd { get; set; } = InitDatetime(5); public DateTime DtEnd { get; set; } = Utils.InitDatetime(DateTime.Now, 15);
public DateTime DtStart { get; set; } = InitDatetime(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; } = "*";
public string CodArticolo { get; set; } = "*"; public string CodArticolo { get; set; } = "*";
public int NumRec { get; set; } = 10;
public int TotCount { get; set; } = 0;
public int MaxRecord { get; set; } = 100; public int MaxRecord { get; set; } = 100;
public bool isEditing { get; set; } = false;
#endregion Public Properties #endregion Public Properties
#region Public Methods #region Public Methods
public SelectDossierParams clone()
/// <summary>
/// Inizializzazione con periodo e arrotondamento
/// </summary>
/// <param name="minRound"></param>
/// <returns></returns>
public static DateTime InitDatetime(int minRound)
{ {
TimeSpan DayElapsed = DateTime.Now.Subtract(DateTime.Today); SelectDossierParams clonedData = new SelectDossierParams()
int minDay = (int)Math.Ceiling((double)(DayElapsed.TotalMinutes / minRound)) * minRound; {
DateTime endRounded = DateTime.Today.AddMinutes(minDay); DtEnd = this.DtEnd,
return endRounded; DtStart = this.DtStart,
CurrPage = this.CurrPage,
IdxMacchina = this.IdxMacchina,
CodArticolo = this.CodArticolo,
MaxRecord = this.MaxRecord,
NumRec = this.NumRec,
TotCount = this.TotCount
};
return clonedData;
} }
public override bool Equals(object obj) public override bool Equals(object obj)
@@ -54,6 +60,12 @@
if (MaxRecord != item.MaxRecord) if (MaxRecord != item.MaxRecord)
return false; return false;
if (TotCount != item.TotCount)
return false;
if (NumRec != item.NumRec)
return false;
if (DtEnd != item.DtEnd) if (DtEnd != item.DtEnd)
return false; return false;
+27 -2
View File
@@ -19,14 +19,33 @@
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;
public int NumRec { get; set; } = 10;
public int MaxRecord { get; set; } = 100; public int MaxRecord { get; set; } = 100;
public int TempoAgg { get; set; } = 10000; public int TempoAgg { get; set; } = 10000;
public int TotCount { get; set; } = 0;
#endregion Public Properties #endregion Public Properties
#region Public Methods #region Public Methods
public SelectFluxParams clone()
{
SelectFluxParams clonedData = new SelectFluxParams()
{
CodFlux = this.CodFlux,
CurrPage = this.CurrPage,
dtRif = this.dtRif,
dtMax = this.dtMax,
dtMin = this.dtMin,
IdxMacchina = this.IdxMacchina,
lastUpdate = this.lastUpdate,
LiveUpdate = this.LiveUpdate,
NumRec = this.NumRec,
MaxRecord = this.MaxRecord,
TotCount = this.TotCount,
TempoAgg = this.TempoAgg
};
return clonedData;
}
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
if (!(obj is SelectFluxParams item)) if (!(obj is SelectFluxParams item))
@@ -47,6 +66,12 @@
if (TempoAgg != item.TempoAgg) if (TempoAgg != item.TempoAgg)
return false; return false;
if (NumRec!= item.NumRec)
return false;
if (TotCount!= item.TotCount)
return false;
if (CurrPage != item.CurrPage) if (CurrPage != item.CurrPage)
return false; return false;
+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.1910</Version> <Version>6.16.2211.312</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>
+5 -9
View File
@@ -24,9 +24,11 @@ namespace MP.SPEC.Pages
return answ; return answ;
} }
private SelectArticoliParams currFilter = new SelectArticoliParams();
public void Dispose() public void Dispose()
{ {
MessageService.EA_SearchUpdated -= OnSeachUpdated; //MessageService.EA_SearchUpdated -= OnSeachUpdated;
currRecord = null; currRecord = null;
ListTipoArt = null; ListTipoArt = null;
ListAziende = null; ListAziende = null;
@@ -56,10 +58,7 @@ namespace MP.SPEC.Pages
protected MpDataService MDService { get; set; } = null!; protected MpDataService MDService { get; set; } = null!;
[Inject] [Inject]
protected MessageService MessageService { get; set; } = null!; protected NavigationManager NavManager { get; set; } = null!;
[Inject]
protected NavigationManager NavManager { get; set; }
protected int totalCount protected int totalCount
{ {
@@ -131,9 +130,6 @@ namespace MP.SPEC.Pages
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
numRecord = 10; numRecord = 10;
// mostro ricerca
MessageService.ShowSearch = true;
MessageService.EA_SearchUpdated += OnSeachUpdated;
configData = await MDService.ConfigGetAll(); configData = await MDService.ConfigGetAll();
var currRec = configData.FirstOrDefault(x => x.Chiave == "AZIENDA"); var currRec = configData.FirstOrDefault(x => x.Chiave == "AZIENDA");
if (currRec != null) if (currRec != null)
@@ -294,7 +290,7 @@ namespace MP.SPEC.Pages
private async Task reloadData() private async Task reloadData()
{ {
isLoading = true; isLoading = true;
SearchRecords = await MDService.ArticoliGetSearch(100000, selAzienda, MessageService.SearchVal); 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;
} }
+1 -55
View File
@@ -21,67 +21,13 @@
</div> </div>
</div> </div>
<div class="card-body"> <div class="card-body">
@if (currDetFluxLogRecord != null)
{
<div class="row">
<div class="col-12">
<div class="card mb-5">
<div class="card-header bg-primary text-light">Modifica Parametro</div>
<div class="card-body">
<div class="row">
<div class="col-3 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm">MACCHINA</span>
<input type="text" class="form-control" disabled aria-label="Art search" aria-describedby="inputGroup-sizing-sm" @bind-value="@currDetFluxLogRecord.IdxMacchina">
</div>
</div>
<div class="col-3 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm">DATA</span>
<input type="text" class="form-control" disabled aria-label="Art search" aria-describedby="inputGroup-sizing-sm" @bind-value="@currDetFluxLogRecord.dtEvento">
</div>
</div>
<div class="col-3 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm">DATA TYPE</span>
<input type="text" class="form-control" disabled aria-label="Art search" aria-describedby="inputGroup-sizing-sm" @bind-value="@currDetFluxLogRecord.CodFlux">
</div>
</div>
<div class="col-3 pe-0">
<div class="input-group input-group-sm">
<span class="input-group-text" id="inputGroup-sizing-sm">VALORE</span>
<input type="text" class="form-control" aria-label="Art search" aria-describedby="inputGroup-sizing-sm" @bind-value="@currDetFluxLogRecord.ValoreEdit">
</div>
</div>
</div>
<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="() => cancel()" 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="() => update(currDetFluxLogRecord)" class="btn btn-success">Save <i class="bi bi-save"></i></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
}
@if (isLoading) @if (isLoading)
{ {
<LoadingData></LoadingData> <LoadingData></LoadingData>
} }
else else
{ {
<ListDossiers SelFilter="@currFilter" RecordSel="@selRecordDoss" RecordSelFlux="@selRecordFlux" TotRecordChanged="updateTotal"></ListDossiers> <ListDossiers SelFilter="@currFilter" RecordSel="@selRecordDoss" TotRecordChanged="updateTotal"></ListDossiers>
} }
</div> </div>
<div class="card-footer py-1"> <div class="card-footer py-1">
+42 -52
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,19 +22,10 @@ namespace MP.SPEC.Pages
[Inject] [Inject]
protected MpDataService MDService { get; set; } = null!; protected MpDataService MDService { get; set; } = null!;
[Inject]
protected MessageService MsgService { get; set; } = null!;
#endregion Protected Properties #endregion Protected Properties
#region Protected Methods #region Protected Methods
protected async Task cancel()
{
currDetFluxLogRecord = null;
await Task.Delay(1);
}
protected void ForceReload(int newNum) protected void ForceReload(int newNum)
{ {
numRecord = newNum; numRecord = newNum;
@@ -51,9 +41,6 @@ namespace MP.SPEC.Pages
{ {
isLoading = true; isLoading = true;
isFiltering = true; isFiltering = true;
// disabilito ricerca...
MsgService.SearchVal = "";
MsgService.ShowSearch = false;
// fix pagina // fix pagina
await Task.Delay(1); await Task.Delay(1);
var modFilter = currFilter; var modFilter = currFilter;
@@ -69,72 +56,75 @@ namespace MP.SPEC.Pages
await Task.Delay(1); await Task.Delay(1);
} }
protected async Task selRecordFlux(FluxLogDTO selRec)
{
currDetFluxLogRecord = selRec;
await Task.Delay(1);
}
protected async Task update(FluxLogDTO selRec)
{
if (!await JSRuntime.InvokeAsync<bool>("confirm", "Confermi di voler salvare le modifiche? queste saranno parte del dossier inviato all'impianto"))
return;
await Task.Delay(1);
if (currRecordDoss != null)
{
// METODO PER UPDATE FLUX
await MDService.updateDossierValue(currRecordDoss, selRec);
}
currDetFluxLogRecord = null;
await Task.Delay(1);
}
protected void updateTotal(int newTotCount) protected void updateTotal(int newTotCount)
{ {
totalCount = newTotCount; totalCount = newTotCount;
} }
protected void UpdateTotCount(int newTotCount)
{
totalCount = newTotCount;
}
#endregion Protected Methods #endregion Protected Methods
#region Private Fields
private FluxLogDTO? _currDetFluxLogRecord = null;
#endregion Private Fields
#region Private Properties #region Private Properties
private FluxLogDTO? currDetFluxLogRecord
{
get => _currDetFluxLogRecord;
set { _currDetFluxLogRecord = value; }
}
private SelectDossierParams currFilter { get; set; } = new SelectDossierParams(); private SelectDossierParams currFilter { get; set; } = new SelectDossierParams();
private int currPage private int currPage
{ {
get => MsgService.currPage; get => currFilter.CurrPage;
set => MsgService.currPage = value; set => currFilter.CurrPage = value;
} }
private Dossiers? currRecordDoss { get; set; } = null; private Dossiers? currRecordDoss { get; set; } = null;
private bool isEditing
{
get => currFilter.isEditing;
set => currFilter.isEditing = value;
}
private bool isFiltering { get; set; } = false; private bool isFiltering { get; set; } = false;
private bool isLoading { get; set; } = true; private bool isLoading { get; set; } = true;
private int numRecord private int numRecord
{ {
get => MsgService.numRecord; get => currFilter.NumRec;
set => MsgService.numRecord = value; set => currFilter.NumRec = value;
} }
private int totalCount { get; set; } = 0; private int totalCount
{
get => currFilter.TotCount;
set => currFilter.TotCount = value;
}
#endregion Private Properties #endregion Private Properties
#region Private Methods #region Private Methods
private string css()
{
string answ = "";
if (isEditing == false)
{
answ = "hidden";
}
else
{
answ = "visible";
}
return answ;
}
private void enableEditing()
{
isEditing = true;
}
private async Task updateFilter(SelectDossierParams newParams) private async Task updateFilter(SelectDossierParams newParams)
{ {
isFiltering = false; isFiltering = false;
+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
+18
View File
@@ -20,9 +20,27 @@
</div> </div>
</div> </div>
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<div class="d-flex justify-content-between">
@if (filtActive)
{
<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"> <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> <i class="fa-solid fa-bars"></i>
</a> </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)
+1 -1
View File
@@ -25,7 +25,7 @@
} }
else else
{ {
<ListPARAMS SelFilter="@currFilter" TotRecordChanged="@updateTotal" RecordSel="@detailSel"></ListPARAMS> <ListPARAMS SelFilter="@currFilter" TotRecordChanged="@UpdateTotCount" RecordSel="@detailSel"></ListPARAMS>
} }
</div> </div>
<div class="card-footer py-1"> <div class="card-footer py-1">
+17 -14
View File
@@ -9,14 +9,12 @@ namespace MP.SPEC.Pages
{ {
#region Protected Fields #region Protected Fields
protected DataPager pagerODL = null!; protected DataPager? pagerODL = null!;
#endregion Protected Fields #endregion Protected Fields
#region Protected Properties #region Protected Properties
[Inject]
protected MessageService MsgService { get; set; } = null!;
#endregion Protected Properties #endregion Protected Properties
@@ -32,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;
@@ -43,9 +42,6 @@ namespace MP.SPEC.Pages
{ {
isLoading = true; isLoading = true;
isFiltering = true; isFiltering = true;
// disabilito ricerca...
MsgService.SearchVal = "";
MsgService.ShowSearch = false;
// fix pagina // fix pagina
await Task.Delay(1); await Task.Delay(1);
var modFilter = currFilter; var modFilter = currFilter;
@@ -60,7 +56,11 @@ namespace MP.SPEC.Pages
{ {
if (doReset) if (doReset)
{ {
await pagerODL.resetCurrPage(); await Task.Delay(1);
if (pagerODL != null)
{
pagerODL.resetCurrPage();
}
} }
} }
@@ -100,8 +100,8 @@ namespace MP.SPEC.Pages
private int currPage private int currPage
{ {
get => MsgService.currPage; get => currFilter.CurrPage;
set => MsgService.currPage = value; set => currFilter.CurrPage = value;
} }
private bool isFiltering { get; set; } = false; private bool isFiltering { get; set; } = false;
@@ -109,8 +109,8 @@ namespace MP.SPEC.Pages
private int numRecord private int numRecord
{ {
get => MsgService.numRecord; get => currFilter.NumRec;
set => MsgService.numRecord = value; set => currFilter.NumRec = value;
} }
private int totalCount { get; set; } = 0; private int totalCount { get; set; } = 0;
@@ -132,14 +132,17 @@ 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());
currFilter = newParams; currFilter = newParams;
isLoading = false; isLoading = false;
} }
protected void UpdateTotCount(int newTotCount)
{
totalCount = newTotCount;
}
#endregion Private Methods #endregion Private Methods
} }
} }
+9 -1
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>
@@ -34,6 +34,7 @@
<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>
@@ -125,10 +126,17 @@
@if (ListMacchine != null) @if (ListMacchine != null)
{ {
foreach (var item in ListMacchine) foreach (var item in ListMacchine)
{
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> <option value="@item.IdxMacchina">@item.IdxMacchina | @item.Descrizione</option>
} }
} }
}
</select> </select>
</div> </div>
</div> </div>
+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.1910</h4> <h4>Versione: 6.16.2211.312</h4>
<br /> Note di rilascio: <br /> Note di rilascio:
<ul> <ul>
<li> <li>
+1 -1
View File
@@ -1 +1 @@
6.16.2210.1910 6.16.2211.312
+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.1910</version> <version>6.16.2211.312</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/"
} }
} }
+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>