From c5e433a6423a0939a6fde47922890b58bacce8c5 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 28 Oct 2024 20:15:49 +0100 Subject: [PATCH] Continuo fix gest approvazione --- MP.FileData/Controllers/FileController.cs | 378 ++++++++++++++++++++-- MP.FileData/DTO/ArchiveStatusDTO.cs | 4 + MP.Prog/Components/ArchiveStatus.razor | 6 +- MP.Prog/Components/ArchiveStatus.razor.cs | 3 +- MP.Prog/Components/FileEditor.razor | 6 +- MP.Prog/Components/FileEditor.razor.cs | 25 +- MP.Prog/Components/RevList.razor | 48 +++ MP.Prog/Components/RevList.razor.cs | 127 ++++++++ MP.Prog/Data/FileArchDataService.cs | 116 ++++++- MP.Prog/MP.Prog.csproj | 2 +- MP.Prog/Pages/Archive.razor | 8 +- MP.Prog/Pages/Archive.razor.cs | 24 +- MP.Prog/Resources/ChangeLog.html | 2 +- MP.Prog/Resources/VersNum.txt | 2 +- MP.Prog/Resources/manifest.xml | 2 +- 15 files changed, 677 insertions(+), 76 deletions(-) create mode 100644 MP.Prog/Components/RevList.razor create mode 100644 MP.Prog/Components/RevList.razor.cs diff --git a/MP.FileData/Controllers/FileController.cs b/MP.FileData/Controllers/FileController.cs index 40a17543..3fc400be 100644 --- a/MP.FileData/Controllers/FileController.cs +++ b/MP.FileData/Controllers/FileController.cs @@ -144,6 +144,7 @@ namespace MP.FileData.Controllers List fileNew = new List(); List fileChecked = new List(); List fileMod = new List(); + List fileDel = new List(); // recupera elenco file nel DB List archivedFile = new List(); @@ -163,7 +164,7 @@ namespace MP.FileData.Controllers Log.Debug($"CheckFileArchived S01.C | Recuperati {archivedFile.Count()} da DB per confronto"); using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create()) { - // verifica i file + // verifica i file partendo dal filesystem foreach (var file in fileList) { // escludo i file con desinenza da escludere... @@ -208,6 +209,28 @@ namespace MP.FileData.Controllers } } } + + // ora parto dal DB ed escludo quelli già mappati... + foreach (var fileDb in archivedFile) + { + // escludo i file con desinenza da escludere... + if (!string.IsNullOrEmpty(fileDb.Extension) && currRule.ExcludedFileExt.Contains(fileDb.Extension)) + { + Log.Trace($"CheckFileArchived S02: escluso {fileDb.Name} | estensione {fileDb.Extension}"); + } + else + { + // cerca nel filesystem... + var currRecord = fileList + .Where(x => fileDb.Path == x.FullName) + .FirstOrDefault(); + // se NON trova lo crea + if (currRecord == null) + { + fileDel.Add(fileDb); + } + } + } } // salvo i NUOVI file @@ -231,6 +254,13 @@ namespace MP.FileData.Controllers FileSetChecked(fileChecked, path, currRule, forceTag); Log.Trace($"CheckFileArchived S05 | refreshed {fileChecked.Count} files"); } + // indico infine i file modificati + if (fileDel != null && fileDel.Count > 0) + { + checkDone += fileDel.Count; + FileSetMissing(fileDel, path, currRule, false); + Log.Trace($"FileArchivedMissing S06 | missing {fileDel.Count} files"); + } Log.Info($"Effettuati {checkDone} controlli"); // svuoto @@ -242,6 +272,145 @@ namespace MP.FileData.Controllers return checkDone; } + /// + /// Effettua la comparazione tra i file in archivio ed i file attuali e segna info LastCheck + /// e Changed (se cambiati) + /// + /// cod macchina + /// Elenco dei files (su DB) da verificare + /// path ricerca x macchina + /// pattern di ricerca (*.*) + /// Forza il controllo dei Tags + /// Regole di ricerca applicate + /// Utente connesso x approvazione + /// indica se vada approvata la modifica o lasciato "in sospeso" + /// + public int CheckFileListArchived(string idxMacchina, List FileList, string path, string searchPattern, bool forceTag, SearchRules currRule, string UserName, bool DoApprove) + { + Log.Info($"CheckFileListArchived S00 | macchina: {idxMacchina} | path: {path} | pattern: {searchPattern} | # ExcludedFileExt: {currRule.ExcludedFileExt.Count()}"); + int checkDone = 0; + DirectoryInfo dirInfo = new DirectoryInfo(path); + FileInfo[] fileListRaw = null; + if (FileList.Count == 1) + { + // leggo il singolo... imposto il search pattern... + searchPattern = $"{FileList.FirstOrDefault().Name}"; + fileListRaw = dirInfo.GetFiles(searchPattern, SearchOption.AllDirectories); + + } + else + { + fileListRaw = dirInfo.GetFiles(searchPattern, SearchOption.AllDirectories); + } + List fileList = new List(); + DateTime adesso = DateTime.Now; + // prendo tutti i files + fileList = fileListRaw.ToList(); + Log.Debug($"CheckFileListArchived S01 | file trovati: {fileList.Count()}"); + List fileChecked = new List(); + List fileMod = new List(); + List fileDel = new List(); + + // recupera elenco file nel DB + List archivedFile = new List(); + List dbFileListRaw = FileGetByPath(path, true); + // preparo lista di interi + List FilePathList = FileList.Select(x => x.Path).ToList(); + // ora li filtro: prendo solo quelli che sono nell'elenco dei files da controllare... + List foundFile = dbFileListRaw.Where(x => FilePathList.Contains(x.Path)).ToList(); + + // rimuovo eventuali file con estensioni escluse... + foreach (var fRec in foundFile) + { + if (!string.IsNullOrEmpty(fRec.Extension) && currRule.ExcludedFileExt.Contains(fRec.Extension)) + { + Log.Trace($"CheckFileListArchived S01.B: escluso {fRec.Name} | estensione {fRec.Extension}"); + } + else + { + archivedFile.Add(fRec); + } + } + Log.Debug($"CheckFileListArchived S01.C | Recuperati {archivedFile.Count()} da DB per confronto"); + using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create()) + { + // parto dal DB ed escludo quelli già mappati... + foreach (var fileDb in archivedFile) + { + // escludo i file con desinenza da escludere... + if (!string.IsNullOrEmpty(fileDb.Extension) && currRule.ExcludedFileExt.Contains(fileDb.Extension)) + { + Log.Trace($"CheckFileListArchived S02: escluso {fileDb.Name} | estensione {fileDb.Extension}"); + } + else + { + // cerca nel filesystem... + var currRecord = fileList + .Where(x => fileDb.Path == x.FullName) + .FirstOrDefault(); + // se NON trova lo crea + if (currRecord == null) + { + fileDel.Add(fileDb); + } + else + { + // verifico se data modifica sia cambiata... + if (fileDb.LastMod != currRecord.LastWriteTime) + { + // calcolo e verifico MD5 + var fileContent = File.ReadAllBytes(currRecord.FullName); + var hash = md5.ComputeHash(fileContent); + var newMD5 = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); + if (newMD5 != fileDb.MD5) + { + fileMod.Add(fileDb); + } + else + { + fileChecked.Add(fileDb); + } + } + else + { + fileChecked.Add(fileDb); + } + } + } + } + } + + // aggiorno i file modificati + if (fileMod != null && fileMod.Count > 0) + { + checkDone += fileMod.Count; + FileSetUpdated(fileMod); + Log.Trace($"CheckFileListArchived S04 | update {fileMod.Count} files"); + } + // segno data-ora ultimo controllo x file invariati + if (fileChecked != null && fileChecked.Count > 0) + { + checkDone += fileChecked.Count; + FileSetChecked(fileChecked, path, currRule, forceTag); + Log.Trace($"CheckFileListArchived S05 | refreshed {fileChecked.Count} files"); + } + // indico infine i file modificati + if (fileDel != null && fileDel.Count > 0) + { + checkDone += fileDel.Count; + FileSetMissing(fileDel, path, currRule, false); + Log.Trace($"FileArchivedMissing S06 | missing {fileDel.Count} files"); + } + + Log.Info($"Effettuati {checkDone} controlli"); + // svuoto + fileChecked = new List(); + fileMod = new List(); + GC.Collect(); + // chiudo + return checkDone; + } + public void Dispose() { // Clear database context @@ -335,6 +504,8 @@ namespace MP.FileData.Controllers return done; } + + /// /// Cerca il file x chiave ID /// @@ -353,6 +524,33 @@ namespace MP.FileData.Controllers return thisFile; } + /// + ///recupera tutte le revisioni dato un singolo record, ordinate x REV descending + /// + /// + /// + public List FileGetAllRevByKey(int FileId) + { + List dbResult = new List(); + using (MoonPro_ProgContext localDbCtx = new MoonPro_ProgContext(_configuration)) + { + var thisRec = localDbCtx + .DbSetProgFile + .Where(x => x.FileId == FileId) + .FirstOrDefault(); + + if (thisRec != null) + { + dbResult = localDbCtx + .DbSetProgFile + .Where(x => x.Path == thisRec.Path) + .OrderByDescending(x => x.Rev) + .ToList(); + } + } + return dbResult; + } + /// /// Cerca un file dato un fice successivo specificando rev richiesta) /// @@ -378,14 +576,14 @@ namespace MP.FileData.Controllers { tFile = localDbCtx .DbSetProgFile - .Where(x => x.Name == oFile.Name && x.IdxMacchina == oFile.IdxMacchina && x.Path == oFile.Path) + .Where(x => x.IdxMacchina == oFile.IdxMacchina && x.Path == oFile.Path && x.Rev == Rev) + //.Where(x => x.Name == oFile.Name && x.IdxMacchina == oFile.IdxMacchina && x.Path == oFile.Path) .FirstOrDefault(); } } return tFile; } - public List FileGetByPath(string path, bool onlyActive) { List dbResult = new List(); @@ -540,38 +738,6 @@ namespace MP.FileData.Controllers return answ; } - /// - /// Imposta utente approvazione + data modifica File - /// - /// - /// - /// - public bool FileSetUserApp(FileModel currFile, string UserName) - { - bool done = false; - List listUpdate = new List(); - using (MoonPro_ProgContext localDbCtx = new MoonPro_ProgContext(_configuration)) - { - FileModel currRec = localDbCtx - .DbSetProgFile - .Where(x => x.FileId == currFile.FileId) - .FirstOrDefault(); - if (currRec != null) - { - DateTime adesso = DateTime.Now; - currRec.UserAppr = UserName; - currRec.LastMod = adesso; - currRec.LastCheck = adesso; - //currFile.DiskStatus = FileState.Ok; - localDbCtx.Entry(currRec).State = EntityState.Modified; - // salvo DB - localDbCtx.SaveChanges(); - } - } - return done; - } - - /// /// Approvazione modifica File /// @@ -756,6 +922,113 @@ namespace MP.FileData.Controllers return answ; } + /// + /// Effettua update di un record in archivio da lista (SOLO STATUS) + /// + /// Elenco file MISSING + /// Path base macchina + /// Configuraizone ricerca + /// Indica se fare COMUNQUE verifica del TAG + /// + public bool FileSetMissing(List missFiles, string basePath, SearchRules currRule, bool forceTag) + { + bool answ = false; + DateTime adesso = DateTime.Now; + using (MoonPro_ProgContext localDbCtx = new MoonPro_ProgContext(_configuration)) + { + // SOLO SE richiesto forzatura tags + if (forceTag) + { + // elenco Tags + List currTags = localDbCtx.DbSetTags.ToList(); + FileModel currItem = null; + foreach (var item in missFiles) + { + // recupero record da DB... + currItem = localDbCtx + .DbSetProgFile + .Where(x => x.FileId == item.FileId) + .Include(x => x.Tags) + .FirstOrDefault(); + + List Tags = new List(); + List Tag4File = new List(); + // se necessario bonifico filename... + string fileName = item.Name; + if (currRule.FileNameExtReplace.Count > 0) + { + foreach (var fReplace in currRule.FileNameExtReplace) + { + fileName = fileName.Replace(fReplace.Key, fReplace.Value).Trim(); + } + } + // cerco codice tag da configurazione + if (currRule.Mode == SearchMode.StringOnFile) + { + Tags = TagsUtils.SearchProgComment(fileName, item.FileStringContent, currRule); + } + else if (currRule.Mode == SearchMode.TagListed) + { + Tags = TagsUtils.SearchTagListed(fileName, item.FileStringContent, currRule); + } + else + { + Tags = TagsUtils.SearchPathName(item.Path, basePath, currRule); + } + + foreach (var tag in Tags) + { + var foundTag = currTags.SingleOrDefault(x => x.TagId.ToLower() == tag.ToLower()); + //var foundTag = currTags.SingleOrDefault(x => x.TagId == tag); + // aggiungo i tags SE non ci fossero + if (foundTag == null) + { + var newTag = new TagModel() { TagId = tag }; + currTags.Add(newTag); + //localDbCtx.SaveChanges(); + Tag4File.Add(newTag); + } + else + { + // al file aggiungo comunque + Tag4File.Add(foundTag); + } + } + // aggiungo ai file + if (Tag4File.Count > 0) + { + // salvo i tags relativi ai files + currItem.Tags.Clear(); + currItem.Tags = Tag4File; + //localDbCtx.Entry(currItem).State = EntityState.Modified; + } + //localDbCtx.SaveChanges(); + } + } + + // update comunque data-ora e stato missing + foreach (var item in missFiles) + { + // salvo update file + item.DiskStatus = FileState.Deleted; + item.LastCheck = adesso; + localDbCtx.Entry(item).State = EntityState.Modified; + } + try + { + // salvo + localDbCtx.SaveChanges(); + } + catch (Exception exc) + { + Log.Error($"Errore in salvataggio FileSetChecked{Environment.NewLine}{exc}"); + } + answ = true; + } + GC.Collect(); + return answ; + } + /// /// Effettua update di un record in archivio da lista (solo status, da approvare) /// @@ -783,6 +1056,37 @@ namespace MP.FileData.Controllers return answ; } + /// + /// Imposta utente approvazione + data modifica File + /// + /// + /// + /// + public bool FileSetUserApp(FileModel currFile, string UserName) + { + bool done = false; + List listUpdate = new List(); + using (MoonPro_ProgContext localDbCtx = new MoonPro_ProgContext(_configuration)) + { + FileModel currRec = localDbCtx + .DbSetProgFile + .Where(x => x.FileId == currFile.FileId) + .FirstOrDefault(); + if (currRec != null) + { + DateTime adesso = DateTime.Now; + currRec.UserAppr = UserName; + currRec.LastMod = adesso; + currRec.LastCheck = adesso; + //currFile.DiskStatus = FileState.Ok; + localDbCtx.Entry(currRec).State = EntityState.Modified; + // salvo DB + localDbCtx.SaveChanges(); + } + } + return done; + } + /// /// Aggiorna un record FILE rileggendo e ricalcolando... /// @@ -859,6 +1163,10 @@ namespace MP.FileData.Controllers .Where(x => x.DiskStatus == FileState.Changed) .Count(); + item.NumMissing = activeRecords + .Where(x => x.DiskStatus == FileState.Deleted) + .Count(); + item.NoTags = activeRecords .Where(x => x.Tags.Count == 0) .Count(); diff --git a/MP.FileData/DTO/ArchiveStatusDTO.cs b/MP.FileData/DTO/ArchiveStatusDTO.cs index 224bf0d7..54b8e631 100644 --- a/MP.FileData/DTO/ArchiveStatusDTO.cs +++ b/MP.FileData/DTO/ArchiveStatusDTO.cs @@ -36,6 +36,10 @@ namespace MP.FileData.DTO /// public int NumChanged { get; set; } = 0; /// + /// NBumero file eliminati/missing + /// + public int NumMissing{ get; set; } = 0; + /// /// Conteggio totale tags x macchina /// public int TotalTags { get; set; } diff --git a/MP.Prog/Components/ArchiveStatus.razor b/MP.Prog/Components/ArchiveStatus.razor index f734e27c..d6bb2a4f 100644 --- a/MP.Prog/Components/ArchiveStatus.razor +++ b/MP.Prog/Components/ArchiveStatus.razor @@ -70,7 +70,8 @@ Path Tags Senza Tag - Modificati + Modif. + Miss. Tot File @@ -110,6 +111,9 @@ @record.NumChanged + + @record.NumMissing + @record.TotFile diff --git a/MP.Prog/Components/ArchiveStatus.razor.cs b/MP.Prog/Components/ArchiveStatus.razor.cs index d464a198..55670bed 100644 --- a/MP.Prog/Components/ArchiveStatus.razor.cs +++ b/MP.Prog/Components/ArchiveStatus.razor.cs @@ -162,7 +162,8 @@ namespace MP.Prog.Components sw.Restart(); // recupero elenco macchine percLoading += 100 / numMacchine; - numChecks = await FDService.UpdateMachineArchive(idxMacchina, numDays, true, false, MServ.UserName, false); + numChecks = await FDService.UpdateMachineArchive(idxMacchina, numDays, true, false, "", false); + //numChecks = await FDService.UpdateMachineArchive(idxMacchina, numDays, true, false, MServ.UserName, false); await Task.Delay(1); setupMessages.Add($"{idxMacchina}: {numChecks} files"); await InvokeAsync(StateHasChanged); diff --git a/MP.Prog/Components/FileEditor.razor b/MP.Prog/Components/FileEditor.razor index 8f4b4f58..f6112f6b 100644 --- a/MP.Prog/Components/FileEditor.razor +++ b/MP.Prog/Components/FileEditor.razor @@ -1,14 +1,14 @@ 
-
+

Dettaglio modifiche

-
+
@if (_currItem.Rev > 0) { @@ -75,7 +75,7 @@ }
-
+
diff --git a/MP.Prog/Components/FileEditor.razor.cs b/MP.Prog/Components/FileEditor.razor.cs index de286318..f24b5b28 100644 --- a/MP.Prog/Components/FileEditor.razor.cs +++ b/MP.Prog/Components/FileEditor.razor.cs @@ -58,11 +58,7 @@ namespace MP.Prog.Components { _selRevSx = value; // ricarico file SX - var pUpd = Task.Run(async () => - { - await LoadRevision(); - }); - pUpd.Wait(); + LoadRevision(); FixTitles(); } } @@ -75,12 +71,7 @@ namespace MP.Prog.Components if (_selRevDx != value) { _selRevDx = value; - // ricarico file DX - var pUpd = Task.Run(async () => - { - await LoadRevision(); - }); - pUpd.Wait(); + LoadRevision(); FixTitles(); } } @@ -114,10 +105,10 @@ namespace MP.Prog.Components } - private async Task DoCompare() + private void DoCompare() { CompareRev = !CompareRev; - await LoadRevision(); + LoadRevision(); FixTitles(); } @@ -268,7 +259,7 @@ namespace MP.Prog.Components private string TitleSx { get; set; } = "Archivio"; private string TitleDx { get; set; } = "Attuale"; - + protected override void OnParametersSet() { @@ -278,12 +269,12 @@ namespace MP.Prog.Components FixTitles(); } - private async Task LoadRevision() + private void LoadRevision() { if (CompareRev) { - var reqSx = await FDService.FileGetByKeyRev(_currItem.FileId, SelRevSx); - var reqDx = await FDService.FileGetByKeyRev(_currItem.FileId, SelRevDx); + var reqSx = FDService.FileGetByKeyRev(_currItem.FileId, SelRevSx); + var reqDx = FDService.FileGetByKeyRev(_currItem.FileId, SelRevDx); FileContSx = reqSx.FileStringContent; FileContDx = reqDx.FileStringContent; } diff --git a/MP.Prog/Components/RevList.razor b/MP.Prog/Components/RevList.razor new file mode 100644 index 00000000..a7ef9f87 --- /dev/null +++ b/MP.Prog/Components/RevList.razor @@ -0,0 +1,48 @@ + + + + + + + + + @foreach (var record in ListRecords) + { + + + + + } + +
RevSize / User
+ @record.Rev +
+ + + @record.DiskStatus + + +
+
+
+ @CalcSize(record.Size) +
+
+ @if (!string.IsNullOrEmpty(record.UserAppr)) + { + + } + else + { + + + } +
+
\ No newline at end of file diff --git a/MP.Prog/Components/RevList.razor.cs b/MP.Prog/Components/RevList.razor.cs new file mode 100644 index 00000000..edfcaa85 --- /dev/null +++ b/MP.Prog/Components/RevList.razor.cs @@ -0,0 +1,127 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; +using MP.FileData; +using MP.FileData.DatabaseModels; +using MP.Prog.Data; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace MP.Prog.Components +{ + public partial class RevList + { + #region Public Properties + + [Parameter] + public FileModel CurrRec { get; set; } + + #endregion Public Properties + + #region Protected Properties + + [Inject] + protected FileArchDataService FDService { get; set; } = null!; + + [Inject] + protected IJSRuntime JSRuntime { get; set; } = null!; + + [Inject] + protected MessageService MServ { get; set; } = null!; + + #endregion Protected Properties + + #region Protected Methods + + /// + /// Restituisce size calcolata + /// + /// + /// + protected string CalcSize(long origSize) + { + return MeasureUtils.SizeSuffix(origSize, 1); + } + + /// + /// forza approvazione utente corrente + /// + /// + protected async Task FileSetUserApp(FileModel CurrRec) + { + if (!await JSRuntime.InvokeAsync("confirm", "Sicuro di voler approvare il salvataggio automatico della nuova revisione?")) + return; + + await FDService.FileSetUserApp(CurrRec, MServ.UserName); + await ReloadData(); + } + + /// + /// Imposta filtro x utente + /// + /// + /// + protected async Task FilterUserName(string userName) + { + //SelUserName = userName; + //currPage = 1; + await Task.Delay(1); + //isLoading = false; + } + + protected override async Task OnParametersSetAsync() + { + await ReloadData(); + } + + protected async Task ReloadData() + { + // valutare recupero info + redis + pagiazione EX POST... + if (CurrRec != null) + { + ListRecords = FDService.FileGetAllRevByKey(CurrRec.FileId); + } + else + { + ListRecords = new List(); + } + await Task.Delay(1); + } + + #endregion Protected Methods + + #region Private Fields + + private List ListRecords; + + #endregion Private Fields + + #region Private Methods + + private string cssStatusByCod(FileState currStatus) + { + string answ = "badge"; + switch (currStatus) + { + case FileState.Changed: + answ += " text-bg-warning"; + break; + + case FileState.Deleted: + answ += " text-bg-danger"; + break; + + case FileState.Ok: + answ += " text-bg-success"; + break; + + case FileState.ND: + default: + answ += " text-bg-light"; + break; + } + return answ; + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/MP.Prog/Data/FileArchDataService.cs b/MP.Prog/Data/FileArchDataService.cs index ab68d383..38202ca0 100644 --- a/MP.Prog/Data/FileArchDataService.cs +++ b/MP.Prog/Data/FileArchDataService.cs @@ -164,11 +164,27 @@ namespace MP.Prog.Data Log.Trace($"Effettuata lettura da DB per FileCountFilt: {ts.TotalMilliseconds} ms"); return await Task.FromResult(numCount); } - - public Task FileGetByKey(int FileId) + /// + /// Recupera un record data chiave + /// + /// + /// + public FileModel FileGetByKey(int FileId) { - return Task.FromResult(dbController.FileGetByKey(FileId)); + return dbController.FileGetByKey(FileId); } + + + /// + /// Recupera tutte le revisioni dato un FileId (ordinate desc) + /// + /// + /// + public List FileGetAllRevByKey(int FileId) + { + return dbController.FileGetAllRevByKey(FileId); + } + /// /// Restituisce il file dato un ID + revisione /// cerca a pari nome, macchina + REV specifica) @@ -176,9 +192,9 @@ namespace MP.Prog.Data /// Id del file originale /// Rev specifica richiesta /// - public Task FileGetByKeyRev(int FileId, int Rev) + public FileModel FileGetByKeyRev(int FileId, int Rev) { - return Task.FromResult(dbController.FileGetByKeyRev(FileId, Rev)); + return dbController.FileGetByKeyRev(FileId, Rev); } public async Task> FileGetFilt(SelectData CurrFilter) @@ -286,7 +302,7 @@ namespace MP.Prog.Data } /// - /// Aggiorna archivio di una amcchina scansionando path relativo + /// Aggiorna archivio di una macchina scansionando path relativo /// /// Codice macchina /// @@ -375,6 +391,94 @@ namespace MP.Prog.Data return checkDone; } + + /// + /// Aggiorna archivio di una amcchina scansionando path relativo + /// + /// Codice macchina + /// Elenco dei files (su DB) da verificare + /// Forza la riverifica dei tags (x update da setup) + /// Scrittura log verboso macchina + /// Utente attivo + /// indica se vada approvata la modifica o lasciato "in sospeso" + /// + public async Task UpdateMachineFilesArchive(string idxMacchina, List FileList, bool forceTag, bool fullLog, string UserName, bool DoApprove) + { + int checkDone = 0; + Stopwatch stopWatch = new Stopwatch(); + stopWatch.Start(); + string ruleName = "Rule00.json"; + try + { + ArchMaccModel macchina = await ArchMaccGetByKey(idxMacchina); + if (macchina != null && !string.IsNullOrEmpty(macchina.BasePath)) + { + if (!string.IsNullOrEmpty(macchina.RuleName)) + { + ruleName = macchina.RuleName; + // gestione confRule... + SearchRules currRule = new SearchRules(); + try + { + string rawData = File.ReadAllText(FileController.rulePath(ruleName)); + currRule = JsonConvert.DeserializeObject(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 confReplace = new Dictionary(); + confReplace.Add("(", " "); + confReplace.Add(")", " "); + + Dictionary fileExtReplace = new Dictionary(); + 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() { "M4", "M5", "M4+A", "M4+B", "M5+A", "M5+B" }, + OutReplace = confReplace, + OutExcludeFileName = true + }; + if (fullLog) + { + // serializzo + string rawRule = JsonConvert.SerializeObject(currRule, Formatting.Indented); + Log.Trace($"Conf rule generato:{Environment.NewLine}{rawRule}"); + } + } + checkDone = dbController.CheckFileListArchived(macchina.IdxMacchina, FileList, macchina.BasePath, "*.*", forceTag, currRule, UserName, DoApprove); + } + } + } + catch (Exception exc) + { + Log.Error($"Eccezione in UpdateMachineArchive{Environment.NewLine}{exc}{Environment.NewLine}{exc.InnerException}"); + } + stopWatch.Stop(); + TimeSpan ts = stopWatch.Elapsed; + Log.Info($"Effettuato update archivio file MACCHINA | # file {FileList.Count} | {checkDone} checked | {ts.TotalMilliseconds} ms"); + + // svuoto cache! + await ResetArchiveCache(); + // restituisco conteggio + return checkDone; + } + #endregion Public Methods #region Internal Methods diff --git a/MP.Prog/MP.Prog.csproj b/MP.Prog/MP.Prog.csproj index a622a3d3..e675d567 100644 --- a/MP.Prog/MP.Prog.csproj +++ b/MP.Prog/MP.Prog.csproj @@ -3,7 +3,7 @@ net6.0 MP.Prog - 6.16.2410.2816 + 6.16.2410.2820 True diff --git a/MP.Prog/Pages/Archive.razor b/MP.Prog/Pages/Archive.razor index 9908e1b8..2b5fe7cf 100644 --- a/MP.Prog/Pages/Archive.razor +++ b/MP.Prog/Pages/Archive.razor @@ -110,7 +110,7 @@ else {
-
+
@@ -208,6 +208,12 @@
+ @if (currRecord != null && currRecord.Rev > 0) + { +
+ +
+ }
}
diff --git a/MP.Prog/Pages/Archive.razor.cs b/MP.Prog/Pages/Archive.razor.cs index 934a7bf3..dcef5e47 100644 --- a/MP.Prog/Pages/Archive.razor.cs +++ b/MP.Prog/Pages/Archive.razor.cs @@ -65,13 +65,13 @@ namespace MP.Prog.Pages #region Protected Properties [Inject] - protected FileArchDataService FDService { get; set; } + protected FileArchDataService FDService { get; set; } = null!; [Inject] - protected IJSRuntime JSRuntime { get; set; } + protected IJSRuntime JSRuntime { get; set; } = null!; [Inject] - protected MessageService MServ { get; set; } + protected MessageService MServ { get; set; } = null!; [Inject] protected NavigationManager NavManager { get; set; } @@ -122,13 +122,16 @@ namespace MP.Prog.Pages /// protected async Task DeleteRec(FileModel CurrRec) { - if (!await JSRuntime.InvokeAsync("confirm", "Sicuro di voler eliminare il record e riattivare la revisione antecedente? Il file potrebbe risultare modificato")) + string delMessage = CurrRec.Rev > 0 ? "Sicuro di voler eliminare il record e riattivare la revisione antecedente? Il file potrebbe risultare modificato." : "Sicuro di voler eliminare il record? Non ci sono altre revisioni e quindi sarà definitivamente eliminato."; + + if (!await JSRuntime.InvokeAsync("confirm", delMessage)) return; // elimino await FDService.FileDelete(CurrRec); - //// verifico eventuali modifiche - //var numCheck = await FDService.UpdateMachineArchive(CurrRec.IdxMacchina, 30, false, false, ""); + // verifico eventuali modifiche del SINGOLO + List FileIdList = new List() { CurrRec }; + var numCheck = await FDService.UpdateMachineFilesArchive(CurrRec.IdxMacchina, FileIdList, false, false, "", false); isLoading = true; await ReloadData(); @@ -144,7 +147,12 @@ namespace MP.Prog.Pages } // rileggo dal DB il record corrente... - currRecord = await FDService.FileGetByKey(selRecord.FileId); + currRecord = FDService.FileGetByKey(selRecord.FileId); + } + + private string mainCol + { + get => currRecord == null || currRecord.Rev == 0 ? "col-12" : "col-10"; } /// @@ -233,7 +241,7 @@ namespace MP.Prog.Pages ListRecords = null; // importante altrimenti NON mostra update UI await Task.Delay(1); - var numCheck = await FDService.UpdateAllArchive(numDays, false, MServ.UserName, false); + var numCheck = await FDService.UpdateAllArchive(numDays, false, "", false); await ReloadAllData(); await Task.Delay(1); await RefreshDisplayLoading(); diff --git a/MP.Prog/Resources/ChangeLog.html b/MP.Prog/Resources/ChangeLog.html index cc98769a..7e4d7231 100644 --- a/MP.Prog/Resources/ChangeLog.html +++ b/MP.Prog/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo gestione Programmi MAPO -

Versione: 6.16.2410.2816

+

Versione: 6.16.2410.2820


Note di rilascio:
    diff --git a/MP.Prog/Resources/VersNum.txt b/MP.Prog/Resources/VersNum.txt index 05d65809..e1fd2aa3 100644 --- a/MP.Prog/Resources/VersNum.txt +++ b/MP.Prog/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2410.2816 +6.16.2410.2820 diff --git a/MP.Prog/Resources/manifest.xml b/MP.Prog/Resources/manifest.xml index 509ed2b1..f7085958 100644 --- a/MP.Prog/Resources/manifest.xml +++ b/MP.Prog/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2410.2816 + 6.16.2410.2820 https://nexus.steamware.net/repository/SWS/MP-PROG/stable/LAST/MP.Prog.zip https://nexus.steamware.net/repository/SWS/MP-PROG/stable/LAST/ChangeLog.html false