From c5e433a6423a0939a6fde47922890b58bacce8c5 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 28 Oct 2024 20:15:49 +0100 Subject: [PATCH 1/3] 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 From 37e54bc587a739bc323858adaac3ea299104bff6 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 29 Oct 2024 09:04:58 +0100 Subject: [PATCH 2/3] PROG - Fix gerstione revisioni x Del / Appr --- MP.FileData/Controllers/FileController.cs | 1 - MP.Prog/Components/FileEditor.razor.cs | 278 ++++++++++++---------- MP.Prog/Components/RevList.razor | 19 +- MP.Prog/Components/RevList.razor.cs | 50 +++- MP.Prog/MP.Prog.csproj | 2 +- MP.Prog/Pages/Archive.razor | 88 ++++--- MP.Prog/Pages/Archive.razor.cs | 29 ++- MP.Prog/Resources/ChangeLog.html | 2 +- MP.Prog/Resources/VersNum.txt | 2 +- MP.Prog/Resources/manifest.xml | 2 +- 10 files changed, 285 insertions(+), 188 deletions(-) diff --git a/MP.FileData/Controllers/FileController.cs b/MP.FileData/Controllers/FileController.cs index 3fc400be..578c7b07 100644 --- a/MP.FileData/Controllers/FileController.cs +++ b/MP.FileData/Controllers/FileController.cs @@ -1076,7 +1076,6 @@ namespace MP.FileData.Controllers { DateTime adesso = DateTime.Now; currRec.UserAppr = UserName; - currRec.LastMod = adesso; currRec.LastCheck = adesso; //currFile.DiskStatus = FileState.Ok; localDbCtx.Entry(currRec).State = EntityState.Modified; diff --git a/MP.Prog/Components/FileEditor.razor.cs b/MP.Prog/Components/FileEditor.razor.cs index f24b5b28..0d00faf1 100644 --- a/MP.Prog/Components/FileEditor.razor.cs +++ b/MP.Prog/Components/FileEditor.razor.cs @@ -2,6 +2,7 @@ using Microsoft.JSInterop; using MP.FileData.DatabaseModels; using MP.Prog.Data; +using NLog; using System; using System.Collections.Generic; using System.IO; @@ -12,14 +13,11 @@ namespace MP.Prog.Components { public partial class FileEditor : ComponentBase { - #region Public Fields - - public FileModel _currItem = new FileModel(); - - #endregion Public Fields - #region Public Properties + /// + /// Item richiesto x display + /// [Parameter] public FileModel currItem { @@ -31,9 +29,12 @@ namespace MP.Prog.Components { _currItem = value; CompareRev = false; + LoadRevision(); + FixTitles(); } } + private static Logger Log = LogManager.GetCurrentClassLogger(); [Parameter] public EventCallback DataReset { get; set; } @@ -43,82 +44,32 @@ namespace MP.Prog.Components [Parameter] public List MacList { get; set; } + /// + /// Rev richiesta (x confronto) + /// + [Parameter] + public int ReqRev + { + get => SelRevDx; + set + { + if (value > 0) + { + CompareRev = true; + SelRevDx = value; + } + else + { + CompareRev = false; + } + } + } + [Parameter] public List TagList { get; set; } #endregion Public Properties - private bool CompareRev = false; - protected int SelRevSx - { - get => _selRevSx; - set - { - if (_selRevSx != value) - { - _selRevSx = value; - // ricarico file SX - LoadRevision(); - FixTitles(); - } - } - } - protected int SelRevDx - { - get => _selRevDx; - set - { - if (_selRevDx != value) - { - _selRevDx = value; - LoadRevision(); - FixTitles(); - } - } - } - private int _selRevSx = 0; - private int _selRevDx = 0; - - private List ListRevSx - { - get - { - List answ = new List() { 0 }; - for (int i = 1; i < SelRevDx; i++) - { - answ.Add(i); - } - return answ; - } - } - private List ListRevDx - { - get - { - List answ = new List(); - for (int i = 0; i <= _currItem.Rev; i++) - { - answ.Add(i); - } - return answ; - } - } - - - private void DoCompare() - { - CompareRev = !CompareRev; - LoadRevision(); - FixTitles(); - } - - private void FixTitles() - { - // sistemo titoli - TitleSx = CompareRev ? $"Rev. {SelRevSx}" : "Archivio"; - TitleDx = CompareRev ? $"Rev. {SelRevDx}" : "Attuale"; - } - #region Public Methods public string CurrFileContent(string fullPath) @@ -150,19 +101,93 @@ namespace MP.Prog.Components [Inject] protected MessageService MServ { get; set; } + protected int SelRevDx + { + get => _selRevDx; + set + { + if (_selRevDx != value) + { + _selRevDx = value; + LoadRevision(); + FixTitles(); + } + } + } + + protected int SelRevSx + { + get => _selRevSx; + set + { + if (_selRevSx != value) + { + _selRevSx = value; + // ricarico file SX + LoadRevision(); + FixTitles(); + } + } + } + #endregion Protected Properties #region Protected Methods - protected void diffDoneHandler(int numChanges) + protected override void OnParametersSet() { -#if false - numDiff = numChanges; -#endif + LoadRevision(); } #endregion Protected Methods + #region Private Fields + + private FileModel _currItem = new FileModel(); + private int _selRevDx = 0; + private int _selRevSx = 0; + + #endregion Private Fields + + #region Private Properties + + private bool CompareRev { get; set; } = false; + private string FileContDx { get; set; } = ""; + + private string FileContSx { get; set; } = ""; + + private List ListRevDx + { + get + { + List answ = new List(); + for (int i = 0; i <= _currItem.Rev; i++) + { + answ.Add(i); + } + return answ; + } + } + + private List ListRevSx + { + get + { + List answ = new List() { 0 }; + for (int i = 1; i < SelRevDx; i++) + { + answ.Add(i); + } + return answ; + } + } + + private string TitleDx { get; set; } = "Attuale"; + + private string TitleSx { get; set; } = "Archivio"; + + #endregion Private Properties + #region Private Methods private async Task ApproveChange() @@ -177,7 +202,7 @@ namespace MP.Prog.Components } else { - Console.WriteLine("File null!"); + Log.Error("_currItem null!"); } } @@ -198,10 +223,21 @@ namespace MP.Prog.Components } else { - Console.WriteLine("File null!"); + Log.Error("_currItem null!"); } } + private void DoCompare() + { + CompareRev = !CompareRev; + if (CompareRev) + { + SelRevDx = _currItem.Rev; + } + LoadRevision(); + FixTitles(); + } + /// /// Esporta da archivio a filesystem /// @@ -221,52 +257,15 @@ namespace MP.Prog.Components } else { - Console.WriteLine("File null!"); + Log.Error("_currItem null!"); } } - private async Task RejectChange() + private void FixTitles() { - if (!await JSRuntime.InvokeAsync("confirm", "Sicuro di voler eliminare la modifica del file selezionato e sovrascrivere la versione in rete?")) - return; - - if (_currItem != null) - { - await FDService.FileReject(_currItem); - await DataUpdated.InvokeAsync(1); - } - else - { - Console.WriteLine("File null!"); - } - } - - private async Task saveUpdate() - { - if (_currItem != null) - { - await FDService.FileUpdate(_currItem); - await DataUpdated.InvokeAsync(1); - } - else - { - Console.WriteLine("File null!"); - } - } - - private string FileContSx { get; set; } = ""; - private string FileContDx { get; set; } = ""; - - private string TitleSx { get; set; } = "Archivio"; - private string TitleDx { get; set; } = "Attuale"; - - - protected override void OnParametersSet() - { - FileContSx = _currItem.FileStringContent; - FileContDx = CurrFileContent(_currItem.Path); - SelRevDx = _currItem.Rev; - FixTitles(); + // sistemo titoli + TitleSx = CompareRev ? $"Rev. {SelRevSx}" : "Archivio"; + TitleDx = CompareRev ? $"Rev. {SelRevDx}" : "Attuale"; } private void LoadRevision() @@ -286,6 +285,35 @@ namespace MP.Prog.Components FixTitles(); } + private async Task RejectChange() + { + if (!await JSRuntime.InvokeAsync("confirm", "Sicuro di voler eliminare la modifica del file selezionato e sovrascrivere la versione in rete?")) + return; + + if (_currItem != null) + { + await FDService.FileReject(_currItem); + await DataUpdated.InvokeAsync(1); + } + else + { + Log.Error("_currItem null!"); + } + } + + private async Task saveUpdate() + { + if (_currItem != null) + { + await FDService.FileUpdate(_currItem); + await DataUpdated.InvokeAsync(1); + } + else + { + Log.Error("_currItem null!"); + } + } + #endregion Private Methods } } \ No newline at end of file diff --git a/MP.Prog/Components/RevList.razor b/MP.Prog/Components/RevList.razor index a7ef9f87..86d06067 100644 --- a/MP.Prog/Components/RevList.razor +++ b/MP.Prog/Components/RevList.razor @@ -10,7 +10,9 @@ { +
    @@ -26,10 +28,10 @@
    @if (!string.IsNullOrEmpty(record.UserAppr)) { - + @record.UserAppr +
    } else { @@ -42,6 +44,17 @@ }
    + +
    @record.LastMod.ToString("yyyy.MM.dd")
    +
    @record.LastMod.ToString("ddd HH:mm.ss")
    + + + + @if (string.IsNullOrEmpty(record.UserAppr)) + { + + } + } diff --git a/MP.Prog/Components/RevList.razor.cs b/MP.Prog/Components/RevList.razor.cs index edfcaa85..ba0c0d33 100644 --- a/MP.Prog/Components/RevList.razor.cs +++ b/MP.Prog/Components/RevList.razor.cs @@ -15,6 +15,24 @@ namespace MP.Prog.Components [Parameter] public FileModel CurrRec { get; set; } + /// + /// Evento selezione rev x confronto, valore = rev + /// + [Parameter] + public EventCallback EC_selRev { get; set; } + + /// + /// Evento richiesta approvazione versione, valore = record + /// + [Parameter] + public EventCallback EC_reqAppr { get; set; } + + /// + /// Evento richeista eliminazione da DB del File + /// + [Parameter] + public EventCallback EC_reqDelete { get; set; } + #endregion Public Properties #region Protected Properties @@ -43,31 +61,39 @@ namespace MP.Prog.Components } /// - /// forza approvazione utente corrente + /// 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 EC_reqAppr.InvokeAsync(CurrRec); + await Task.Delay(100); await ReloadData(); } /// - /// Imposta filtro x utente + /// Selezione Rev x display confronto /// - /// /// - protected async Task FilterUserName(string userName) + protected async Task SelRev(FileModel CurrRec) { - //SelUserName = userName; - //currPage = 1; - await Task.Delay(1); - //isLoading = false; + await EC_selRev.InvokeAsync(CurrRec.Rev); + await ReloadData(); } + + /// + /// Elimina record (non approvato) corrente e riattiva precedente + /// + /// + protected async Task DeleteRec(FileModel CurrRec) + { + await EC_reqDelete.InvokeAsync(CurrRec); + await Task.Delay(100); + await ReloadData(); + } + + protected override async Task OnParametersSetAsync() { await ReloadData(); diff --git a/MP.Prog/MP.Prog.csproj b/MP.Prog/MP.Prog.csproj index e675d567..fc51295a 100644 --- a/MP.Prog/MP.Prog.csproj +++ b/MP.Prog/MP.Prog.csproj @@ -3,7 +3,7 @@ net6.0 MP.Prog - 6.16.2410.2820 + 6.16.2410.2909 True diff --git a/MP.Prog/Pages/Archive.razor b/MP.Prog/Pages/Archive.razor index 2b5fe7cf..65523610 100644 --- a/MP.Prog/Pages/Archive.razor +++ b/MP.Prog/Pages/Archive.razor @@ -97,7 +97,7 @@
    @if (currRecord != null) { - + } @if (ListRecords == null) { @@ -124,11 +124,17 @@ File Rev - Size / User + @if (currRecord == null || currRecord.Rev == 0) + { + Size / User + } Macchina Tags - Modificato - + @if (currRecord == null || currRecord.Rev == 0) + { + Modificato + + } @@ -157,29 +163,32 @@
    - -
    - @CalcSize(record.Size) -
    -
    - @if (!string.IsNullOrEmpty(record.UserAppr)) - { - - } - else - { + @if (currRecord == null || currRecord.Rev == 0) + { + +
    + @CalcSize(record.Size) +
    +
    + @if (!string.IsNullOrEmpty(record.UserAppr)) + { + + } + else + { - - } -
    - + + } +
    + + }
    @record.Macchina.Nome
    @record.Macchina.Descrizione
    @@ -192,17 +201,20 @@ } - -
    @record.LastMod.ToString("yyyy.MM.dd")
    -
    @record.LastMod.ToString("ddd HH:mm.ss")
    + @if (currRecord == null || currRecord.Rev == 0) + { + +
    @record.LastMod.ToString("yyyy.MM.dd")
    +
    @record.LastMod.ToString("ddd HH:mm.ss")
    - - - @if (string.IsNullOrEmpty(record.UserAppr)) - { - - } - + + + @if (string.IsNullOrEmpty(record.UserAppr)) + { + + } + + } } @@ -210,8 +222,8 @@
@if (currRecord != null && currRecord.Rev > 0) { -
- +
+
}
diff --git a/MP.Prog/Pages/Archive.razor.cs b/MP.Prog/Pages/Archive.razor.cs index dcef5e47..564530c8 100644 --- a/MP.Prog/Pages/Archive.razor.cs +++ b/MP.Prog/Pages/Archive.razor.cs @@ -147,14 +147,10 @@ namespace MP.Prog.Pages } // rileggo dal DB il record corrente... + ReqRevDx = 0; currRecord = FDService.FileGetByKey(selRecord.FileId); } - private string mainCol - { - get => currRecord == null || currRecord.Rev == 0 ? "col-12" : "col-10"; - } - /// /// forza approvazione utente corrente /// @@ -356,6 +352,15 @@ namespace MP.Prog.Pages currRecord = selRecord; } + /// + /// imposta revisione richiesta + /// + /// + protected void SelRev(int reqRev) + { + ReqRevDx = reqRev; + } + /// /// Imposta pagina corrente /// @@ -405,9 +410,18 @@ namespace MP.Prog.Pages #region Private Fields private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); + private FileModel currRecord = null; + private List ListRecords; + private List MacList; + + /// + /// Revisione richiesta a dx + /// + private int ReqRevDx = 0; + private List TagList; #endregion Private Fields @@ -428,6 +442,11 @@ namespace MP.Prog.Pages private bool isLoading { get; set; } = false; + private string mainCol + { + get => currRecord == null || currRecord.Rev == 0 ? "col-12" : "col-9"; + } + private int numRecord { get diff --git a/MP.Prog/Resources/ChangeLog.html b/MP.Prog/Resources/ChangeLog.html index 7e4d7231..338cd6ab 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.2820

+

Versione: 6.16.2410.2909


Note di rilascio:
    diff --git a/MP.Prog/Resources/VersNum.txt b/MP.Prog/Resources/VersNum.txt index e1fd2aa3..db88b9d2 100644 --- a/MP.Prog/Resources/VersNum.txt +++ b/MP.Prog/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2410.2820 +6.16.2410.2909 diff --git a/MP.Prog/Resources/manifest.xml b/MP.Prog/Resources/manifest.xml index f7085958..45021f1f 100644 --- a/MP.Prog/Resources/manifest.xml +++ b/MP.Prog/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2410.2820 + 6.16.2410.2909 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 From f3319674179d107f21e4d571beeffe411b8b537a Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 29 Oct 2024 10:41:30 +0100 Subject: [PATCH 3/3] PROG - fix esclusione file temp da regexp - fix gestione delete - test update/approve da REST --- MP.FileData/Controllers/FileController.cs | 81 ++++++++++++++++----- MP.FileData/Enum.cs | 2 +- MP.FileData/SearchRules.cs | 10 +++ MP.Prog/Components/ArchiveStatus.razor.cs | 1 - MP.Prog/Components/FileEditor.razor | 6 -- MP.Prog/Components/RevList.razor.cs | 2 +- MP.Prog/Conf/Rule01.json | 56 +++++++------- MP.Prog/Conf/Rule02.json | 44 +++++------ MP.Prog/Conf/Rule03.json | 68 ++++++++--------- MP.Prog/Conf/Rule04.json | 6 +- MP.Prog/Conf/Rule05.json | 6 +- MP.Prog/Controllers/FileChangeController.cs | 12 ++- MP.Prog/MP.Prog.csproj | 2 +- MP.Prog/Pages/Archive.razor.cs | 3 +- MP.Prog/Resources/ChangeLog.html | 2 +- MP.Prog/Resources/VersNum.txt | 2 +- MP.Prog/Resources/manifest.xml | 2 +- 17 files changed, 182 insertions(+), 123 deletions(-) diff --git a/MP.FileData/Controllers/FileController.cs b/MP.FileData/Controllers/FileController.cs index 578c7b07..3ea65ec5 100644 --- a/MP.FileData/Controllers/FileController.cs +++ b/MP.FileData/Controllers/FileController.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using MP.FileData.DatabaseModels; using Newtonsoft.Json; using MP.FileData.DTO; +using System.Text.RegularExpressions; namespace MP.FileData.Controllers { @@ -121,25 +122,10 @@ namespace MP.FileData.Controllers { Log.Info($"CheckFileArchived S00 | macchina: {idxMacchina} | path: {path} | pattern: {searchPattern} | # ExcludedFileExt: {currRule.ExcludedFileExt.Count()}"); int checkDone = 0; - DirectoryInfo dirInfo = new DirectoryInfo(path); - FileInfo[] fileListRaw = dirInfo.GetFiles(searchPattern, SearchOption.AllDirectories); List fileList = new List(); - DateTime adesso = DateTime.Now; - // se ho un limite x giorni indietor x modifiche --> limito! - if (numDayPre > 0) - { - foreach (var item in fileListRaw) - { - if (adesso.Subtract(item.LastWriteTime).TotalDays <= numDayPre) - { - fileList.Add(item); - } - } - } - else - { - fileList = fileListRaw.ToList(); - } + // leggo i files rispettando regole e filtri vari + fileList = GetFiltFileFromDisk(path, numDayPre, searchPattern, currRule, fileList); + Log.Debug($"CheckFileArchived S01 | file trovati: {fileList.Count()}"); List fileNew = new List(); List fileChecked = new List(); @@ -271,6 +257,61 @@ namespace MP.FileData.Controllers // chiudo return checkDone; } + /// + /// Recupera file dal disco saltando eventuali math di esclusione e/o filtro date/nome file + /// + /// + /// + /// + /// + /// + /// + private static List GetFiltFileFromDisk(string path, int numDayPre, string searchPattern, SearchRules currRule, List fileList) + { + DirectoryInfo dirInfo = new DirectoryInfo(path); + var fileListRaw = dirInfo.GetFiles(searchPattern, SearchOption.AllDirectories).ToList(); + List file2Rem = new List(); + // se richiesto filtro i files esclusi da regexp li calcolo... + if (currRule.ExclFileEnabled) + { + foreach (var item in fileListRaw) + { + string pattern = currRule.ExclFileRegExPattern; + // uso regexp + MatchCollection hasMatch = Regex.Matches(item.Name, pattern); + if (hasMatch.Count > 0) + { + file2Rem.Add(item); + } + } + // quindi li rimuovo da elenco raw... + if (file2Rem.Count > 0) + { + foreach (var f2d in file2Rem) + { + fileListRaw.Remove(f2d); + } + } + } + DateTime adesso = DateTime.Now; + // se ho un limite x giorni indietro x modifiche --> limito! + if (numDayPre > 0) + { + foreach (var item in fileListRaw) + { + if (adesso.Subtract(item.LastWriteTime).TotalDays <= numDayPre) + { + fileList.Add(item); + } + } + } + else + { + fileList = fileListRaw.ToList(); + } + + return fileList; + } /// /// Effettua la comparazione tra i file in archivio ed i file attuali e segna info LastCheck @@ -1010,7 +1051,7 @@ namespace MP.FileData.Controllers foreach (var item in missFiles) { // salvo update file - item.DiskStatus = FileState.Deleted; + item.DiskStatus = FileState.Missing; item.LastCheck = adesso; localDbCtx.Entry(item).State = EntityState.Modified; } @@ -1163,7 +1204,7 @@ namespace MP.FileData.Controllers .Count(); item.NumMissing = activeRecords - .Where(x => x.DiskStatus == FileState.Deleted) + .Where(x => x.DiskStatus == FileState.Missing) .Count(); item.NoTags = activeRecords diff --git a/MP.FileData/Enum.cs b/MP.FileData/Enum.cs index 5163fd93..a2de0a37 100644 --- a/MP.FileData/Enum.cs +++ b/MP.FileData/Enum.cs @@ -13,7 +13,7 @@ namespace MP.FileData { ND = 0, Changed, - Deleted, + Missing, Ok } } \ No newline at end of file diff --git a/MP.FileData/SearchRules.cs b/MP.FileData/SearchRules.cs index 0f8ee9e3..c3e2589f 100644 --- a/MP.FileData/SearchRules.cs +++ b/MP.FileData/SearchRules.cs @@ -93,6 +93,16 @@ namespace MP.FileData /// public List Tag2Collect { get; set; } = new List(); + /// + /// Configurazione opzionale x escludere files da regexp su filename + /// + public bool ExclFileEnabled { get; set; } = false; + + /// + /// Pattern in formato RegExp x esclusione file da nome + /// + public string ExclFileRegExPattern { get; set; } = ""; + #endregion Public Properties } } \ No newline at end of file diff --git a/MP.Prog/Components/ArchiveStatus.razor.cs b/MP.Prog/Components/ArchiveStatus.razor.cs index 55670bed..9a186f0f 100644 --- a/MP.Prog/Components/ArchiveStatus.razor.cs +++ b/MP.Prog/Components/ArchiveStatus.razor.cs @@ -163,7 +163,6 @@ namespace MP.Prog.Components // recupero elenco macchine percLoading += 100 / numMacchine; 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 f6112f6b..f092d35e 100644 --- a/MP.Prog/Components/FileEditor.razor +++ b/MP.Prog/Components/FileEditor.razor @@ -64,13 +64,7 @@ else {
    -
    -
    -
    -
    -
    -
    }
diff --git a/MP.Prog/Components/RevList.razor.cs b/MP.Prog/Components/RevList.razor.cs index ba0c0d33..c5b44208 100644 --- a/MP.Prog/Components/RevList.razor.cs +++ b/MP.Prog/Components/RevList.razor.cs @@ -132,7 +132,7 @@ namespace MP.Prog.Components answ += " text-bg-warning"; break; - case FileState.Deleted: + case FileState.Missing: answ += " text-bg-danger"; break; diff --git a/MP.Prog/Conf/Rule01.json b/MP.Prog/Conf/Rule01.json index 1ee93dff..dc958695 100644 --- a/MP.Prog/Conf/Rule01.json +++ b/MP.Prog/Conf/Rule01.json @@ -1,29 +1,31 @@ { - "ExcludedTags": [ - "M4", - "M5", - "M4+A", - "M4+B", - "M5+A", - "M5+B" - ], - "ExcludedFileExt": [ - ".xls", - ".xls#", - ".xlsx" - ], - "FileNameExtReplace": { - ".P-2": "" - }, - "MaxChar2Search": 100, - "Mode": 0, - "Name": "Tag da Commento Filename", - "OutExcludeFileName": true, - "OutReplace": { - "(": " ", - ")": " " - }, - "RegExPattern": "\\b{{fileName}}.{0,2}\\([\\w\\d\\s./\\-=]+\\)", - "RegExRepFileName": true, - "ReplaceCR": true + "ExcludedTags": [ + "M4", + "M5", + "M4+A", + "M4+B", + "M5+A", + "M5+B" + ], + "ExcludedFileExt": [ + ".xls", + ".xls#", + ".xlsx" + ], + "FileNameExtReplace": { + ".P-2": "" + }, + "MaxChar2Search": 100, + "Mode": 0, + "Name": "Tag da Commento Filename", + "OutExcludeFileName": true, + "OutReplace": { + "(": " ", + ")": " " + }, + "RegExPattern": "\\b{{fileName}}.{0,2}\\([\\w\\d\\s./\\-=]+\\)", + "RegExRepFileName": true, + "ReplaceCR": true, + "ExclFileEnabled": true, + "ExclFileRegExPattern": "^~\\$" } \ No newline at end of file diff --git a/MP.Prog/Conf/Rule02.json b/MP.Prog/Conf/Rule02.json index b7414dda..6548131f 100644 --- a/MP.Prog/Conf/Rule02.json +++ b/MP.Prog/Conf/Rule02.json @@ -1,23 +1,25 @@ { - "ExcludedTags": [], - "ExcludedFileExt": [ - ".xls", - ".xls#", - ".xlsx" - ], - "FileNameExtReplace": { - ".P-2": "" - }, - "MaxChar2Search": 1, - "Mode": 1, - "Name": "Tag da Directory + Filename", - "OutExcludeFileName": false, - "OutReplace": { - ".WPD": "", - ".MPF": "", - ".SPF": "" - }, - "RegExPattern": "", - "RegExRepFileName": true, - "ReplaceCR": false + "ExcludedTags": [], + "ExcludedFileExt": [ + ".xls", + ".xls#", + ".xlsx" + ], + "FileNameExtReplace": { + ".P-2": "" + }, + "MaxChar2Search": 1, + "Mode": 1, + "Name": "Tag da Directory + Filename", + "OutExcludeFileName": false, + "OutReplace": { + ".WPD": "", + ".MPF": "", + ".SPF": "" + }, + "RegExPattern": "", + "RegExRepFileName": true, + "ReplaceCR": false, + "ExclFileEnabled": true, + "ExclFileRegExPattern": "^~\\$" } \ No newline at end of file diff --git a/MP.Prog/Conf/Rule03.json b/MP.Prog/Conf/Rule03.json index e7cc1892..6f19ccdf 100644 --- a/MP.Prog/Conf/Rule03.json +++ b/MP.Prog/Conf/Rule03.json @@ -1,35 +1,37 @@ { - "ExcludedTags": [ - "M4", - "M5", - "M4+A", - "M4+B", - "M5+A", - "M5+B", - "M6+A", - "M6+B", - "+A" - ], - "ExcludedFileExt": [ - ".xls", - ".xls#", - ".xlsx" - ], - "FileNameExtReplace": { - ".P-2": "", - ".tim": "" - }, - "MaxChar2Search": 100, - "Mode": 0, - "Name": "Tag da Commento Filename Tornoss TISIS", - "OutExcludeFileName": true, - "OutReplace": { - "(": " ", - ")": " ", - "<": " ", - ">": " " - }, - "RegExPattern": "\\b{{fileName}}.{0,2}\\([\\<\\w\\d\\s./\\-=\\+\\>]+\\)", - "RegExRepFileName": true, - "ReplaceCR": true + "ExcludedTags": [ + "M4", + "M5", + "M4+A", + "M4+B", + "M5+A", + "M5+B", + "M6+A", + "M6+B", + "+A" + ], + "ExcludedFileExt": [ + ".xls", + ".xls#", + ".xlsx" + ], + "FileNameExtReplace": { + ".P-2": "", + ".tim": "" + }, + "MaxChar2Search": 100, + "Mode": 0, + "Name": "Tag da Commento Filename Tornoss TISIS", + "OutExcludeFileName": true, + "OutReplace": { + "(": " ", + ")": " ", + "<": " ", + ">": " " + }, + "RegExPattern": "\\b{{fileName}}.{0,2}\\([\\<\\w\\d\\s./\\-=\\+\\>]+\\)", + "RegExRepFileName": true, + "ReplaceCR": true, + "ExclFileEnabled": true, + "ExclFileRegExPattern": "^~\\$" } \ No newline at end of file diff --git a/MP.Prog/Conf/Rule04.json b/MP.Prog/Conf/Rule04.json index c1a5fa19..f0991de1 100644 --- a/MP.Prog/Conf/Rule04.json +++ b/MP.Prog/Conf/Rule04.json @@ -1,5 +1,5 @@ { - "ExcludedTags": [ ], + "ExcludedTags": [], "ExcludedFileExt": [ ".bak", ".bck" @@ -33,5 +33,7 @@ "IP=", "AUTO_CHANGE_ODL=", "AUTO_SNAPSHOT_DOSSIER=" - ] + ], + "ExclFileEnabled": true, + "ExclFileRegExPattern": "^~\\$" } \ No newline at end of file diff --git a/MP.Prog/Conf/Rule05.json b/MP.Prog/Conf/Rule05.json index 8607aced..e77df664 100644 --- a/MP.Prog/Conf/Rule05.json +++ b/MP.Prog/Conf/Rule05.json @@ -1,5 +1,5 @@ { - "ExcludedTags": [ ], + "ExcludedTags": [], "ExcludedFileExt": [ ".bak", ".bck", @@ -39,5 +39,7 @@ "\"QrJumpPath\":", "\"Environment\":", "\"appVers\":" - ] + ], + "ExclFileEnabled": true, + "ExclFileRegExPattern": "^~\\$" } \ No newline at end of file diff --git a/MP.Prog/Controllers/FileChangeController.cs b/MP.Prog/Controllers/FileChangeController.cs index 7e7494da..70446d52 100644 --- a/MP.Prog/Controllers/FileChangeController.cs +++ b/MP.Prog/Controllers/FileChangeController.cs @@ -152,11 +152,15 @@ namespace MP.Prog.Controllers // ciclo ogni file modificato foreach (var cFile in listChanged) { - // approvo il file modificato con utente anonimo (auto-Approve) - bool fatto = await FADService.FileModApprove(cFile, ""); - if (fatto) + // se è modificato... + if (cFile.DiskStatus == FileData.FileState.Changed) { - answ.Add(cFile.Path); + // approvo il file modificato con utente anonimo (auto-Approve) + bool fatto = await FADService.FileModApprove(cFile, ""); + if (fatto) + { + answ.Add(cFile.Path); + } } } return answ; diff --git a/MP.Prog/MP.Prog.csproj b/MP.Prog/MP.Prog.csproj index fc51295a..c5bd87e0 100644 --- a/MP.Prog/MP.Prog.csproj +++ b/MP.Prog/MP.Prog.csproj @@ -3,7 +3,7 @@ net6.0 MP.Prog - 6.16.2410.2909 + 6.16.2410.2910 True diff --git a/MP.Prog/Pages/Archive.razor.cs b/MP.Prog/Pages/Archive.razor.cs index 564530c8..649d3801 100644 --- a/MP.Prog/Pages/Archive.razor.cs +++ b/MP.Prog/Pages/Archive.razor.cs @@ -134,6 +134,7 @@ namespace MP.Prog.Pages var numCheck = await FDService.UpdateMachineFilesArchive(CurrRec.IdxMacchina, FileIdList, false, false, "", false); isLoading = true; + currRecord = null; await ReloadData(); isLoading = false; } @@ -678,7 +679,7 @@ namespace MP.Prog.Pages answ += " text-bg-warning"; break; - case FileState.Deleted: + case FileState.Missing: answ += " text-bg-danger"; break; diff --git a/MP.Prog/Resources/ChangeLog.html b/MP.Prog/Resources/ChangeLog.html index 338cd6ab..b88d8894 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.2909

+

Versione: 6.16.2410.2910


Note di rilascio:
    diff --git a/MP.Prog/Resources/VersNum.txt b/MP.Prog/Resources/VersNum.txt index db88b9d2..c04a835b 100644 --- a/MP.Prog/Resources/VersNum.txt +++ b/MP.Prog/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2410.2909 +6.16.2410.2910 diff --git a/MP.Prog/Resources/manifest.xml b/MP.Prog/Resources/manifest.xml index 45021f1f..f245f835 100644 --- a/MP.Prog/Resources/manifest.xml +++ b/MP.Prog/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2410.2909 + 6.16.2410.2910 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