udpate paginazione dati solo decina apgine correnti

This commit is contained in:
Samuele Locatelli
2021-09-13 18:05:43 +02:00
parent 48ee4dcdae
commit 6940a68c0c
5 changed files with 184 additions and 132 deletions
+60 -34
View File
@@ -35,6 +35,11 @@ namespace MP.FileData.Controllers
#region Public Methods
public static string rulePath(string ruleName)
{
return string.Format($"Conf/{ruleName}");
}
/// <summary>
/// Effettua la comparazione tra i file in archivio ed i file attuali e segna info LastCheck e Changed (se cambiati)
/// </summary>
@@ -152,6 +157,19 @@ namespace MP.FileData.Controllers
dbCtx.Dispose();
}
public int FileCountFilt(string IdxMacchina, bool OnlyActive, bool OnlyMod, string SearchVal = "")
{
int answ = 0;
using (MoonPro_ProgContext localDbCtx = new MoonPro_ProgContext(_configuration))
{
answ = localDbCtx
.DbSetProgFile
.Where(x => (x.IdxMacchina == IdxMacchina || IdxMacchina == "0") && (x.Active == OnlyActive || !OnlyActive) && (!OnlyMod || x.DiskStatus != FileState.Ok) && (x.Name.Contains(SearchVal) || string.IsNullOrEmpty(SearchVal)))
.Count();
}
return answ;
}
/// <summary>
/// ELiminazione file da tabella
/// </summary>
@@ -232,7 +250,7 @@ namespace MP.FileData.Controllers
return dbResult;
}
public List<DatabaseModels.FileModel> FileGetFilt(string IdxMacchina, string CodArticolo, bool OnlyActive, bool OnlyMod, string SearchVal = "")
public List<DatabaseModels.FileModel> FileGetFilt(string IdxMacchina, bool OnlyActive, bool OnlyMod, int numStart, int numRecords, string SearchVal = "")
{
List<DatabaseModels.FileModel> dbResult = new List<DatabaseModels.FileModel>();
using (MoonPro_ProgContext localDbCtx = new MoonPro_ProgContext(_configuration))
@@ -243,6 +261,8 @@ namespace MP.FileData.Controllers
.Include(t => t.Tags)
.Where(x => (x.IdxMacchina == IdxMacchina || IdxMacchina == "0") && (x.Active == OnlyActive || !OnlyActive) && (!OnlyMod || x.DiskStatus != FileState.Ok) && (x.Name.Contains(SearchVal) || string.IsNullOrEmpty(SearchVal)))
.OrderByDescending(x => x.LastMod)
.Skip(numStart)
.Take(numRecords)
.ToList();
}
return dbResult;
@@ -348,6 +368,8 @@ namespace MP.FileData.Controllers
public bool FileModApprove(FileModel currFile)
{
bool done = false;
// recupero file regole json da macchina..
List<FileInfo> listUpdate = new List<FileInfo>();
using (MoonPro_ProgContext localDbCtx = new MoonPro_ProgContext(_configuration))
{
@@ -355,40 +377,39 @@ namespace MP.FileData.Controllers
var newFileInfo = new FileInfo(currFile.Path);
listUpdate.Add(newFileInfo);
// fixme todo !!! fix da conf file
Dictionary<string, string> confReplace = new Dictionary<string, string>();
confReplace.Add("(", " ");
confReplace.Add(")", " ");
Dictionary<string, string> fileExtReplace = new Dictionary<string, string>();
fileExtReplace.Add(".P-2", "");
// hard coded + salvataggio conf x creare json
SearchRules currRule = new SearchRules()
var currMacchina = localDbCtx
.DbSetMacchine
.Where(x => x.IdxMacchina == currFile.IdxMacchina)
.SingleOrDefault();
if (currMacchina != null)
{
Name = "Commento Filename",
Mode = SearchMode.StringOnFile,
MaxChar2Search = 100,
ReplaceCR = true,
RegExPattern = "\\b{{fileName}}" + @".{0,2}\([\w\d\s.]+\)",
RegExRepFileName = true,
ExcludedTags = new List<string>() { "M4", "M5", "M4+A", "M4+B", "M5+A", "M5+B" },
FileNameExtReplace = fileExtReplace,
OutReplace = confReplace,
OutExcludeFileName = true
};
// gestione confRule...
SearchRules currRule = new SearchRules();
try
{
string rawData = File.ReadAllText(rulePath(currMacchina.RuleName));
currRule = JsonConvert.DeserializeObject<SearchRules>(rawData);
}
catch (Exception exc)
{
Log.Error($"Eccezione in deserializzazione conf rule{Environment.NewLine}{exc}");
}
// se ho letto conf
if (currRule.Name != "ND")
{
// inserisco come REVISIONE
FileInsert(currFile.IdxMacchina, listUpdate, currFile.Rev + 1, currRule);
// inserisco come REVISIONE
FileInsert(currFile.IdxMacchina, listUpdate, currFile.Rev + 1, currRule);
// archivio vecchio file
currFile.Active = false;
currFile.DiskStatus = FileState.Ok;
localDbCtx.Entry(currFile).State = EntityState.Modified;
// salvo DB
localDbCtx.SaveChanges();
// archivio vecchio file
currFile.Active = false;
currFile.DiskStatus = FileState.Ok;
localDbCtx.Entry(currFile).State = EntityState.Modified;
// salvo DB
localDbCtx.SaveChanges();
done = true;
done = true;
}
}
}
return done;
}
@@ -443,7 +464,7 @@ namespace MP.FileData.Controllers
}
/// <summary>
/// Effettua update di un record in archivio da lista (solo status, da
/// Effettua update di un record in archivio da lista (solo status, da approvare)
/// </summary>
/// <param name="updFiles"></param>
/// <returns></returns>
@@ -470,7 +491,7 @@ namespace MP.FileData.Controllers
}
/// <summary>
/// Aggiorna un record FILE
/// Aggiorna un record FILE rileggendo e ricalcolando...
/// </summary>
/// <param name="updItem"></param>
/// <returns></returns>
@@ -481,11 +502,16 @@ namespace MP.FileData.Controllers
{
try
{
// elenco Tags
List<TagModel> currTags = localDbCtx.DbSetTags.ToList();
// file
FileModel currData = null;
currData = dbCtx
.DbSetProgFile
.Where(x => x.FileId == updItem.FileId)
.FirstOrDefault();
if (currData != null)
{
updItem.DiskStatus = FileState.Changed;
+60 -54
View File
@@ -12,6 +12,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using MP.FileData.Controllers;
namespace MP.Prog.Data
{
@@ -104,15 +105,6 @@ namespace MP.Prog.Data
#endregion Private Properties
#region Protected Methods
protected string rulePath(string ruleName)
{
return string.Format($"Conf/{ruleName}");
}
#endregion Protected Methods
#region Internal Methods
internal Task FileApprove(FileData.DatabaseModels.FileModel currItem)
@@ -224,17 +216,29 @@ namespace MP.Prog.Data
dbController.Dispose();
}
public async Task<int> FileCountFilt(SelectData CurrFilter)
{
int numCount = 0;
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
numCount = dbController.FileCountFilt(CurrFilter.IdxMacchina, CurrFilter.OnlyActive, CurrFilter.OnlyMod, CurrFilter.SearchVal);
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Info($"Effettuata lettura da DB + caching per FileCountFilt: {ts.TotalMilliseconds} ms");
return await Task.FromResult(numCount);
}
public Task<FileData.DatabaseModels.FileModel> FileGetByKey(int FileId)
{
return Task.FromResult(dbController.FileGetByKey(FileId));
}
public async Task<List<FileData.DatabaseModels.FileModel>> FileGetFilt(string IdxMacchina, string CodArticolo, bool OnlyActive, bool OnlyMod, string SearchVal)
public async Task<List<FileData.DatabaseModels.FileModel>> FileGetFilt(SelectData CurrFilter)
{
List<FileData.DatabaseModels.FileModel> dbResult = new List<FileData.DatabaseModels.FileModel>();
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
dbResult = dbController.FileGetFilt(IdxMacchina, CodArticolo, OnlyActive, OnlyMod, SearchVal).ToList();
dbResult = dbController.FileGetFilt(CurrFilter.IdxMacchina, CurrFilter.OnlyActive, CurrFilter.OnlyMod, CurrFilter.FirstRecord, CurrFilter.PageSize * 10, CurrFilter.SearchVal).ToList();
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Info($"Effettuata lettura da DB + caching per FileGetFilt: {ts.TotalMilliseconds} ms");
@@ -281,54 +285,56 @@ namespace MP.Prog.Data
foreach (var item in listaMacchine.Where(x => !string.IsNullOrEmpty(x.BasePath)).ToList())
{
if (!string.IsNullOrEmpty(item.RuleName))
{ }
// gestione confRule...
SearchRules currRule = new SearchRules();
try
{
string rawData = File.ReadAllText(rulePath(ruleName));
currRule = JsonConvert.DeserializeObject<SearchRules>(rawData);
//Log.Info($"Conf rule acquisito da file {ruleName}:{Environment.NewLine}{rawData}");
}
catch (Exception exc)
{
Log.Error($"Eccezione in deserializzazione conf rule{Environment.NewLine}{exc}");
}
// se NON deserializzato inizializzo hard-coded
if (currRule.Name == "ND")
{
// fare: lettura conf rule x recupero tag x singola macchina
//$"\\b{fileName}" + @".{0,2}\([\w\d\s.]+\)";
Dictionary<string, string> confReplace = new Dictionary<string, string>();
confReplace.Add("(", " ");
confReplace.Add(")", " ");
Dictionary<string, string> fileExtReplace = new Dictionary<string, string>();
fileExtReplace.Add(".P-2", "");
// hard coded + salvataggio conf x creare json
currRule = new SearchRules()
ruleName = item.RuleName;
// gestione confRule...
SearchRules currRule = new SearchRules();
try
{
Name = "Commento Filename",
Mode = SearchMode.StringOnFile,
MaxChar2Search = 100,
ReplaceCR = true,
RegExPattern = "\\b{{fileName}}" + @".{0,2}\([\w\d\s./]+\)",
RegExRepFileName = true,
FileNameExtReplace = fileExtReplace,
ExcludedTags = new List<string>() { "M4", "M5", "M4+A", "M4+B", "M5+A", "M5+B" },
OutReplace = confReplace,
OutExcludeFileName = true
};
string rawData = File.ReadAllText(FileController.rulePath(ruleName));
currRule = JsonConvert.DeserializeObject<SearchRules>(rawData);
//Log.Info($"Conf rule acquisito da file {ruleName}:{Environment.NewLine}{rawData}");
}
catch (Exception exc)
{
Log.Error($"Eccezione in deserializzazione conf rule{Environment.NewLine}{exc}");
}
// serializzo
// se NON deserializzato inizializzo hard-coded
if (currRule.Name == "ND")
{
// fare: lettura conf rule x recupero tag x singola macchina
//$"\\b{fileName}" + @".{0,2}\([\w\d\s.]+\)";
string rawRule = JsonConvert.SerializeObject(currRule, Formatting.Indented);
Log.Info($"Conf rule generato:{Environment.NewLine}{rawRule}");
Dictionary<string, string> confReplace = new Dictionary<string, string>();
confReplace.Add("(", " ");
confReplace.Add(")", " ");
Dictionary<string, string> fileExtReplace = new Dictionary<string, string>();
fileExtReplace.Add(".P-2", "");
// hard coded + salvataggio conf x creare json
currRule = new SearchRules()
{
Name = "Commento Filename",
Mode = SearchMode.StringOnFile,
MaxChar2Search = 100,
ReplaceCR = true,
RegExPattern = "\\b{{fileName}}" + @".{0,2}\([\w\d\s./]+\)",
RegExRepFileName = true,
FileNameExtReplace = fileExtReplace,
ExcludedTags = new List<string>() { "M4", "M5", "M4+A", "M4+B", "M5+A", "M5+B" },
OutReplace = confReplace,
OutExcludeFileName = true
};
// serializzo
string rawRule = JsonConvert.SerializeObject(currRule, Formatting.Indented);
Log.Info($"Conf rule generato:{Environment.NewLine}{rawRule}");
}
checkDone += dbController.CheckFileArchived(item.IdxMacchina, item.BasePath, numDayPre, "*.*", currRule);
}
checkDone += dbController.CheckFileArchived(item.IdxMacchina, item.BasePath, numDayPre, "*.*", currRule);
}
}
catch (Exception exc)
+2 -2
View File
@@ -9,7 +9,6 @@ namespace MP.Prog.Data
{
#region Public Properties
public string CodArticolo { get; set; } = "";
public DateTime DateEnd { get; set; } = DateTime.Now.AddMinutes(1);
public DateTime DateStart { get; set; } = DateTime.Now.AddDays(-7);
@@ -32,6 +31,7 @@ namespace MP.Prog.Data
public int PageNum { get; set; } = 1;
public int PageSize { get; set; } = 10;
public string SearchVal { get; set; } = "";
#endregion Public Properties
@@ -69,7 +69,7 @@ namespace MP.Prog.Data
return false;
if (OnlyMod != item.OnlyMod)
return false;
if (CodArticolo != item.CodArticolo)
if (SearchVal != item.SearchVal)
return false;
if (IdxMacchina != item.IdxMacchina)
return false;
+34 -37
View File
@@ -5,46 +5,28 @@
<div class="card">
<div class="card-header table-primary h3">
<div class="row">
<div class="col-12 col-md-3 col-lg-4 h3">
Elenco Programmi
</div>
<div class="col-12 col-md-9 col-lg-8 text-right">
<div class="form-row">
@*<div class="col-1">
<div class="form-group mb-0">
<button id="btnForceCheck" class="btn btn-danger btn-sm btn-block" @onclick="() => ForceCheck(0)" title="Forza verifica archivio (totale)">
<i class="far fa-folder-open"></i>&nbsp;<i class="fas fa-sync-alt"></i>
</button>
</div>
</div>*@
<div class="col-3">
<div class="col-12 col-lg-6">
<div class="d-flex">
<div class="px-2">
<h3>Elenco Programmi</h3>
</div>
<div class="px-2">
<div class="form-group mb-0">
<button id="btnForceCheck" class="btn btn-warning btn-sm btn-block" @onclick="() => ForceCheck(30)" title="Analisi Modifiche ultimi 30gg">
<i class="fas fa-sync-alt"></i> Cerca Modifiche (30 gg) <i class="far fa-folder-open"></i>
<button id="btnForceCheck" class="btn btn-warning btn-sm" @onclick="() => ForceCheck(30)" title="Analisi Modifiche ultimi 30gg">
<i class="fas fa-sync-alt"></i> Update (30gg) <i class="far fa-folder-open"></i>
</button>
</div>
</div>
<div class="col-1">
<div class="input-group input-group-sm">
<div class="input-group-prepend">
</div>
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="togAttivi" title="Solo Attivi / Mostra tutti" @bind-value="@OnlyActive" checked="@OnlyActive" />
<label class="custom-control-label small" for="togAttivi"><sub>Attivi</sub></label>
</div>
</div>
</div>
<div class="col-12 col-lg-6 text-right">
<div class="d-flex flex-row-reverse">
<div class="px-2">
<div class="form-group mb-0">
<button id="btnReset" class="btn btn-info btn-sm" @onclick="() => ResetFilter()" title="Reset Filter"><span class="oi oi-loop-circular"></span></button>
</div>
</div>
<div class="col-1">
<div class="input-group input-group-sm">
<div class="input-group-prepend">
</div>
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="togModificati" title="Solo Aperti / Mostra tutti" @bind-value="@OnlyMod" checked="@OnlyMod" />
<label class="custom-control-label small" for="togModificati"><sub>Mod</sub></label>
</div>
</div>
</div>
<div class="col-6">
<div class="px-2">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
@@ -62,9 +44,24 @@
</select>
</div>
</div>
<div class="col-1">
<div class="form-group mb-0">
<button id="btnReset" class="btn btn-info btn-sm btn-block" @onclick="() => ResetFilter()" title="Reset Filter"><span class="oi oi-loop-circular"></span></button>
<div class="px-2">
<div class="input-group input-group-sm">
<div class="input-group-prepend">
</div>
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="togModificati" title="Solo Aperti / Mostra tutti" @bind-value="@OnlyMod" checked="@OnlyMod" />
<label class="custom-control-label small" for="togModificati"><sub>Mod</sub></label>
</div>
</div>
</div>
<div class="px-2">
<div class="input-group input-group-sm">
<div class="input-group-prepend">
</div>
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="togAttivi" title="Solo Attivi / Mostra tutti" @bind-value="@OnlyActive" checked="@OnlyActive" />
<label class="custom-control-label small" for="togAttivi"><sub>Attivi</sub></label>
</div>
</div>
</div>
</div>
+28 -5
View File
@@ -78,7 +78,10 @@ namespace MP.Prog.Pages
if (!AppMService.File_Filter.OnlyActive.Equals(value))
{
AppMService.File_Filter.OnlyActive = value;
var pUpd = Task.Run(async () => await ReloadData());
var pUpd = Task.Run(async () =>
{
await AsyncReload();
});
pUpd.Wait();
}
}
@@ -100,7 +103,10 @@ namespace MP.Prog.Pages
if (!AppMService.File_Filter.OnlyMod.Equals(value))
{
AppMService.File_Filter.OnlyMod = value;
var pUpd = Task.Run(async () => await ReloadData());
var pUpd = Task.Run(async () =>
{
await AsyncReload();
});
pUpd.Wait();
}
}
@@ -122,7 +128,10 @@ namespace MP.Prog.Pages
if (!AppMService.File_Filter.IdxMacchina.Equals(value))
{
AppMService.File_Filter.IdxMacchina = value;
var pUpd = Task.Run(async () => await ReloadData());
var pUpd = Task.Run(async () =>
{
await AsyncReload();
});
pUpd.Wait();
}
}
@@ -209,6 +218,20 @@ namespace MP.Prog.Pages
#region Protected Methods
protected async Task AsyncReload()
{
isLoading = true;
currRecord = null;
SearchRecords = null;
ListRecords = null;
//var pUpd = Task.Run(async () =>
//{
await ReloadData();
isLoading = false;
//});
//pUpd.Wait();
}
protected void Edit(FileModel selRecord)
{
// rileggo dal DB il record corrente...
@@ -276,8 +299,8 @@ namespace MP.Prog.Pages
isLoading = true;
// importante altrimenti NON mostra update UI
await Task.Delay(1);
SearchRecords = await DataService.FileGetFilt(AppMService.File_Filter.IdxMacchina, AppMService.File_Filter.CodArticolo, AppMService.File_Filter.OnlyActive, AppMService.File_Filter.OnlyMod, AppMService.SearchVal);
totalCount = SearchRecords.Count;
totalCount = await DataService.FileCountFilt(AppMService.File_Filter);
SearchRecords = await DataService.FileGetFilt(AppMService.File_Filter);
// faccio paginazione SOLO NELLA DECINA attuale... (quindi non tutte le pagine ma solo subset)
ListRecords = SearchRecords.Skip(numRecord * (currPage % 10 - 1)).Take(numRecord).ToList();
}