Merge branch 'Release/AggiuntaExcelExport'

This commit is contained in:
Samuele Locatelli
2022-12-22 13:12:35 +01:00
18 changed files with 350 additions and 171 deletions
+20
View File
@@ -208,6 +208,26 @@ namespace MP.Data.Controllers
return dbResult;
}
/// <summary>
/// Export dei dati data la sessione
/// </summary>
/// <param name="sessionID"></param>
/// <returns></returns>
public List<VExpInveSession> ExportSessionDetail(int sessionID)
{
List<VExpInveSession> dbResult = new List<VExpInveSession>();
using (var dbCtx = new MoonPro_InveContext(_configuration))
{
dbResult = dbCtx
.DbExpSessione
.Where(x => (x.InveSessId == sessionID))
.AsNoTracking()
.OrderBy(x => x.DtScan)
.ToList();
}
return dbResult;
}
/// <summary>
/// Elenco Scansioni dato Id sessione inventario
/// </summary>
+50
View File
@@ -0,0 +1,50 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MP.Data.DatabaseModels
{
public partial class VExpInveSession
{
#region Public Properties
[MaxLength(50)]
public string CodArtExt { get; set; }
public string CodArticolo { get; set; }
public string CodMag { get; set; }
[MaxLength(50)]
public string CodStato { get; set; }
public string DescMag { get; set; }
[MaxLength(250)]
public string DescrArt { get; set; }
public string Description { get; set; }
public DateTime DtEnd { get; set; } = new DateTime(2099, 12, 31);
public DateTime DtScan { get; set; }
public DateTime DtStart { get; set; } = new DateTime(1900, 01, 01);
[Column("InveSessID")]
public int InveSessId { get; set; }
public string Lotto { get; set; }
public string Note { get; set; }
public decimal Qty { get; set; }
[Column("ScanID")]
public int ScanId { get; set; }
public string ScanValue { get; set; }
public string UserCrea { get; set; }
public string UserScan { get; set; }
#endregion Public Properties
}
}
+17
View File
@@ -55,6 +55,7 @@ namespace MP.Data
public virtual DbSet<AnagArticoli_MAG> DbArtMag { get; set; }
public virtual DbSet<AnagLottiArca> DbLottoArca { get; set; }
public virtual DbSet<InveSessTotLotModel> DbTotLotti { get; set; }
public virtual DbSet<VExpInveSession> DbExpSessione { get; set; }
#endregion PER INVE
#region PER SPEC
@@ -92,6 +93,22 @@ namespace MP.Data
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasAnnotation("Relational:Collation", "SQL_Latin1_General_CP1_CI_AS");
modelBuilder.Entity<VExpInveSession>(entity =>
{
entity.HasNoKey();
entity.ToView("v_Exp_InveSession");
//entity.Property(e => e.DtEnd).HasColumnType("datetime");
//entity.Property(e => e.DtStart).HasColumnType("datetime");
//entity.Property(e => e.InveSessId).HasColumnName("InveSessID");
entity.Property(e => e.Qty).HasColumnType("decimal(18, 6)");
entity.Property(e => e.ScanId).HasColumnName("ScanID");
});
OnModelCreatingPartial(modelBuilder);
}
+156 -143
View File
@@ -1,90 +1,15 @@
using Blazored.LocalStorage;
using Egw.Core;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Egw.Core;
using MP.Data.Conf;
using MP.Data.DatabaseModels;
using MP.Data.DTO;
using MP.INVE.Pages;
using Newtonsoft.Json;
using NLog;
using StackExchange.Redis;
using System.Diagnostics;
using System.Text;
namespace MP.INVE.Data
{
public class MiDataService : IDisposable
{
#region Protected Fields
protected const string passPhrase = "7871D817-C71F-4DFC-BF12-00A95BE507B5";
protected Random rand = new Random();
#endregion Protected Fields
#region Private Fields
private const string redisBaseAddr = "MP:INVE";
private const string redisConfigBaseAddr = ":Config";
private const string redisElencoOperatori = redisBaseAddr + redisOperatoriBaseAddr + ":ListOperatori";
private const string redisLottiBaseAddr = ":Lotti";
private const string redisLottiEsterni = redisBaseAddr + redisLottiBaseAddr + ":LottiEsterni";
private const string redisLottiInterni = redisBaseAddr + redisLottiBaseAddr + ":LottiInterni";
private const string redisMagList = redisBaseAddr + ":ListMag";
private const string redisOperatoreLogged = redisBaseAddr + redisOperatoriBaseAddr + ":OperatoreLogged";
private const string redisOperatoriBaseAddr = ":Operatore";
private const string redisScanBaseAddr = redisBaseAddr + ":Scan";
private const string redisSessionBaseAddr = ":Session";
private const string redisSessionCurrList = redisBaseAddr + redisSessionBaseAddr + ":ListSessHist";
private const string redisSessionHistList = redisBaseAddr + redisSessionBaseAddr + ":ListSessCurr";
private const string redisTotLottoAddr = ":TotaleLotto";
private const string redisUdcBaseAddr = ":UDC";
private static IConfiguration _configuration = null!;
private static ILogger<MiDataService> _logger = null!;
private static Logger Log = LogManager.GetCurrentClassLogger();
/// <summary>
/// Oggetto vocabolario x uso continuo traduzione
/// </summary>
private List<VocabolarioModel> ObjVocabolario = new List<VocabolarioModel>();
/// <summary>
/// Oggetto per connessione a REDIS
/// </summary>
private ConnectionMultiplexer redisConn = null!;
/// <summary>
/// Oggetto per connessione a REDIS modalità admin (ex flux dati)
/// </summary>
private ConnectionMultiplexer redisConnAdmin = null!;
/// <summary>
/// Oggetto DB redis da impiegare x chiamate R/W
/// </summary>
private IDatabase redisDb = null!;
private int redisLongTimeCache = 5;
#endregion Private Fields
#region Public Constructors
public MiDataService(IConfiguration configuration, ILogger<MiDataService> logger)
@@ -130,11 +55,6 @@ namespace MP.INVE.Data
#endregion Public Properties
#region Private Properties
#endregion Private Properties
#region Public Methods
/// <summary>
@@ -291,36 +211,6 @@ namespace MP.INVE.Data
return result;
}
public List<AnagMagModel> MagazziniList()
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
List<AnagMagModel> result = new List<AnagMagModel>();
string source = "DB";
// cerco in redis...
RedisValue rawData = redisDb.StringGet(redisMagList);
if (!string.IsNullOrEmpty($"{rawData}"))
{
result = JsonConvert.DeserializeObject<List<AnagMagModel>>($"{rawData}");
source = "REDIS";
}
else
{
result = dbController.MagazziniList();
// serializzo e salvo...
rawData = JsonConvert.SerializeObject(result);
redisDb.StringSetAsync(redisMagList, rawData, getRandTOut(redisLongTimeCache));
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"ElencoMagazzini Read from {source}: {ts.TotalMilliseconds}ms");
if (result == null)
{
result = new List<AnagMagModel>();
}
return result;
}
public List<AnagOperatoriModel> ElencoOperatori()
{
string source = "";
@@ -390,6 +280,29 @@ namespace MP.INVE.Data
return SteamCrypto.EncryptString(rawData, passPhrase);
}
/// <summary>
/// Export sessione scansioni inventario (in dettaglio)
/// </summary>
/// <param name="sessID"></param>
/// <returns></returns>
public List<VExpInveSession> ExportSessionDetail(int sessID)
{
string source = "";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
List<VExpInveSession>? result = new List<VExpInveSession>();
result = dbController.ExportSessionDetail(sessID);
source = "DB";
if (result == null)
{
result = new List<VExpInveSession>();
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"ExportSessionDetail Read from {source}: {ts.TotalMilliseconds}ms");
return result;
}
/// <summary>
/// Svuota tutta la sessione dalla root di gestione
/// </summary>
@@ -401,6 +314,7 @@ namespace MP.INVE.Data
bool answ = await ExecFlushRedisPattern(pattern);
return answ;
}
/// <summary>
/// Svuota solo il pattern richiesto
/// </summary>
@@ -414,9 +328,7 @@ namespace MP.INVE.Data
return answ;
}
/// <summary>
/// Svuota cahce sessioni inventario
/// <returns></returns>
/// <summary> Svuota cahce sessioni inventario <returns></returns>
public async Task<bool> FlushSessInvCache()
{
bool answ = await FlushRedisCache(redisSessionCurrList) && await FlushRedisCache(redisSessionHistList);
@@ -649,43 +561,33 @@ namespace MP.INVE.Data
return result;
}
public List<ScanDataModel> ScanBySession(int idSessione)
public List<AnagMagModel> MagazziniList()
{
string source = "";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
List<ScanDataModel>? result = new List<ScanDataModel>();
List<AnagMagModel> result = new List<AnagMagModel>();
string source = "DB";
// cerco in redis...
RedisValue rawData = redisDb.StringGet(redisMagList);
if (!string.IsNullOrEmpty($"{rawData}"))
{
var ListAll = ScanList();
result = ListAll.Where(x => x.InveSessID == idSessione).ToList();
if (result == null)
{
result = new List<ScanDataModel>();
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"ScanBySession Read from {source}: {ts.TotalMilliseconds}ms");
return result;
result = JsonConvert.DeserializeObject<List<AnagMagModel>>($"{rawData}");
source = "REDIS";
}
else
{
result = dbController.MagazziniList();
// serializzo e salvo...
rawData = JsonConvert.SerializeObject(result);
redisDb.StringSetAsync(redisMagList, rawData, getRandTOut(redisLongTimeCache));
}
}
/// <summary>
/// Scansioni dati UDC e sessione
/// </summary>
/// <param name="udc"></param>
/// <param name="inveSessId"></param>
/// <returns></returns>
public ScanDataModel ScanByUdcSession(string udc, int inveSessId)
{
string source = "";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
ScanDataModel? result = new ScanDataModel();
result = dbController.ScanByUdcSession(udc, inveSessId);
source = "DB";
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"ScanByUdcSession Read from {source}: {ts.TotalMilliseconds}ms");
Log.Debug($"ElencoMagazzini Read from {source}: {ts.TotalMilliseconds}ms");
if (result == null)
{
result = new List<AnagMagModel>();
}
return result;
}
@@ -710,6 +612,47 @@ namespace MP.INVE.Data
return result;
}
public List<ScanDataModel> ScanBySession(int idSessione)
{
string source = "";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
List<ScanDataModel>? result = new List<ScanDataModel>();
// cerco in redis...
{
var ListAll = ScanList();
result = ListAll.Where(x => x.InveSessID == idSessione).ToList();
if (result == null)
{
result = new List<ScanDataModel>();
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"ScanBySession Read from {source}: {ts.TotalMilliseconds}ms");
return result;
}
}
/// <summary>
/// Scansioni dati UDC e sessione
/// </summary>
/// <param name="udc"></param>
/// <param name="inveSessId"></param>
/// <returns></returns>
public ScanDataModel ScanByUdcSession(string udc, int inveSessId)
{
string source = "";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
ScanDataModel? result = new ScanDataModel();
result = dbController.ScanByUdcSession(udc, inveSessId);
source = "DB";
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"ScanByUdcSession Read from {source}: {ts.TotalMilliseconds}ms");
return result;
}
public List<ScanDataModel> ScanByValueSessionOpr(string scanData, int inveSessId, string Opr)
{
string source = "";
@@ -821,6 +764,14 @@ namespace MP.INVE.Data
#endregion Public Methods
#region Protected Fields
protected const string passPhrase = "7871D817-C71F-4DFC-BF12-00A95BE507B5";
protected Random rand = new Random();
#endregion Protected Fields
#region Protected Methods
/// <summary>
@@ -836,6 +787,68 @@ namespace MP.INVE.Data
#endregion Protected Methods
#region Private Fields
private const string redisBaseAddr = "MP:INVE";
private const string redisConfigBaseAddr = ":Config";
private const string redisElencoOperatori = redisBaseAddr + redisOperatoriBaseAddr + ":ListOperatori";
private const string redisLottiBaseAddr = ":Lotti";
private const string redisLottiEsterni = redisBaseAddr + redisLottiBaseAddr + ":LottiEsterni";
private const string redisLottiInterni = redisBaseAddr + redisLottiBaseAddr + ":LottiInterni";
private const string redisMagList = redisBaseAddr + ":ListMag";
private const string redisOperatoreLogged = redisBaseAddr + redisOperatoriBaseAddr + ":OperatoreLogged";
private const string redisOperatoriBaseAddr = ":Operatore";
private const string redisScanBaseAddr = redisBaseAddr + ":Scan";
private const string redisSessionBaseAddr = ":Session";
private const string redisSessionCurrList = redisBaseAddr + redisSessionBaseAddr + ":ListSessHist";
private const string redisSessionHistList = redisBaseAddr + redisSessionBaseAddr + ":ListSessCurr";
private const string redisTotLottoAddr = ":TotaleLotto";
private const string redisUdcBaseAddr = ":UDC";
private static IConfiguration _configuration = null!;
private static ILogger<MiDataService> _logger = null!;
private static Logger Log = LogManager.GetCurrentClassLogger();
/// <summary>
/// Oggetto vocabolario x uso continuo traduzione
/// </summary>
private List<VocabolarioModel> ObjVocabolario = new List<VocabolarioModel>();
/// <summary>
/// Oggetto per connessione a REDIS
/// </summary>
private ConnectionMultiplexer redisConn = null!;
/// <summary>
/// Oggetto per connessione a REDIS modalità admin (ex flux dati)
/// </summary>
private ConnectionMultiplexer redisConnAdmin = null!;
/// <summary>
/// Oggetto DB redis da impiegare x chiamate R/W
/// </summary>
private IDatabase redisDb = null!;
private int redisLongTimeCache = 5;
#endregion Private Fields
#region Private Methods
/// <summary>
+1 -1
View File
@@ -5,7 +5,7 @@
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>MP.INVE</RootNamespace>
<Version>6.16.2212.1915</Version>
<Version>6.16.2212.2213</Version>
</PropertyGroup>
<ItemGroup>
+5
View File
@@ -0,0 +1,5 @@
@page "/Download"
@model MP.INVE.Pages.DownloadModel
@{
}
+47
View File
@@ -0,0 +1,47 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace MP.INVE.Pages
{
/// <summary>
/// Gestione donwnload file csv
///
/// da valutare eventualmente xlsx con https://github.com/closedxml/closedxml
/// </summary>
public class DownloadModel : PageModel
{
#region Private Fields
private readonly IWebHostEnvironment _env;
#endregion Private Fields
#region Public Constructors
public DownloadModel(IWebHostEnvironment env)
{
_env = env;
}
#endregion Public Constructors
#region Public Methods
public IActionResult OnGet()
{
string fileName = "OUT.csv";
if (Request.Query.ContainsKey("fileName"))
{
fileName = Request.Query["fileName"];
}
var filePath = Path.Combine(_env.ContentRootPath, "temp\\", fileName);
//var filePath = Path.Combine(_env.WebRootPath, "..\\temp\\", fileName);
byte[] fileBytes = System.IO.File.ReadAllBytes(filePath);
return File(fileBytes, "application/force-download", fileName);
}
#endregion Public Methods
}
}
+10
View File
@@ -80,6 +80,16 @@ else
<button class="btn btn-sm btn-primary mx-1" title="Mostra i dati delle scansioni per questa sessione" @onclick="mostraDati">
<i class="fa-regular fa-rectangle-list"></i>
</button>
@if (fileExist)
{
<a target="_blank" href="Download?fileName=@fileName" class="btn btn-block btn-sm btn-success"><span class="oi oi-cloud-download"></span> Save</a>
}
else
{
<button class="btn btn-sm btn-info mx-1" title="Mostra i dati delle scansioni per questa sessione" @onclick="() => ExportCSV()">
<i class="fa-regular fa-file-excel"></i>
</button>
}
@if (sessione.DtEnd == null)
{
<button class="btn btn-sm btn-danger mx-1 " title="Chiudi la sessione corrente" @onclick="()=>chiudiSessione(sessione.InveSessID)"><i class="fa-solid fa-stop"></i></button>
+36
View File
@@ -52,6 +52,36 @@ namespace MP.INVE.Pages
#endregion Protected Properties
#region Protected Methods
/// <summary>
/// Effettua salvataggio su file CSV
/// </summary>
protected async void ExportCSV()
{
var fullData = MIService.ExportSessionDetail(sessID);
await MP.Data.Utils.SaveToCsv(fullData, fullPath, ';');
await InvokeAsync(StateHasChanged);
}
protected bool fileExist
{
get
{
return File.Exists(fullPath);
}
}
protected string fullPath
{
get => $"{exportDir}\\{fileName}";
}
protected string exportDir = $"{Directory.GetCurrentDirectory()}\\temp";
protected string fileName
{
get => $"{sessID}.csv";
}
protected async void apriSessione(int sessID)
{
@@ -130,6 +160,11 @@ namespace MP.INVE.Pages
protected async Task returnToSessions()
{
// svuoto eventuale vecchio file
if (fileExist)
{
File.Delete(fullPath);
}
await resetCacheSessInv();
// ritorno pagina...
NavManager.NavigateTo("InveSession", true);
@@ -246,5 +281,6 @@ namespace MP.INVE.Pages
}
#endregion Private Methods
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MAPOINVE </i>
<h4>Versione: 6.16.2212.1915</h4>
<h4>Versione: 6.16.2212.2213</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
6.16.2212.1915
6.16.2212.2213
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.16.2212.1915</version>
<version>6.16.2212.2213</version>
<url>https://nexus.steamware.net/repository/SWS/MP-INVE/stable/LAST/MP.INVE.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-INVE/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>
-20
View File
@@ -458,26 +458,6 @@ namespace MP.SPEC.Data
return answ;
}
/// <summary>
/// Effettua salvataggio snapshot parametri (con stored) + svuota eventuale cache redis
/// </summary>
/// <param name="IdxMacchina">macchina</param>
/// <param name="MaxSec">NUm massimo secondi per recuperare dati correnti</param>
/// <param name="DtRif">DataOra riferimento x cui prendere valori antecedenti</param>
/// <returns></returns>
public async Task<bool> DossiersTakeParamsSnapshot(string IdxMacchina, int MaxSec, DateTime DtRif)
{
bool answ = false;
await Task.Delay(1);
// chiamo stored x salvare parametri
dbController.DossiersTakeParamsSnapshot(IdxMacchina, MaxSec, DtRif);
// elimino cache redis...
RedisValue pattern = new RedisValue($"{redisDossByMac}:*");
answ = await ExecFlushRedisPattern(pattern);
Log.Info($"Svuotata cache dossier | {pattern}");
return answ;
}
/// <summary>
/// Effettua salvataggio snapshot parametri (con stored) + svuota eventuale cache redis
/// </summary>
+1 -1
View File
@@ -5,7 +5,7 @@
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>MP.SPEC</RootNamespace>
<Version>6.16.2212.1220</Version>
<Version>6.16.2212.2211</Version>
</PropertyGroup>
<ItemGroup>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MAPOSPEC </i>
<h4>Versione: 6.16.2212.1220</h4>
<h4>Versione: 6.16.2212.2211</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
6.16.2212.1220
6.16.2212.2211
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.16.2212.1220</version>
<version>6.16.2212.2211</version>
<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>
<mandatory>false</mandatory>
+1
View File
@@ -9,6 +9,7 @@
"CodApp": "MP.SPEC",
"ConnectionStrings": {
"Mp.Data": "Server=SQL2016DEV;Database=MoonPro; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=MP.SPEC;",
"Mp.Inve": "Server=SQL2016DEV;Database=MoonPro_MAG; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=MP.SPEC;",
"Redis": "localhost:6379,DefaultDatabase=1,connectTimeout=5000,syncTimeout=5000,asyncTimeout=5000,abortConnect=false,ssl=false",
"RedisAdmin": "localhost:6379,DefaultDatabase=1,connectTimeout=5000,syncTimeout=5000,asyncTimeout=5000,abortConnect=false,ssl=false,allowAdmin=true"
},