using EgwCoreLib.Razor.Data; using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using NLog; using StackExchange.Redis; using System.Diagnostics; using System.Text; using WebDoorCreator.Core; using WebDoorCreator.Data.Controllers; using WebDoorCreator.Data.DbModels; namespace WebDoorCreator.UI.Data { public class WebDoorCreatorService { #region Public Fields public static WebDoorCreatorController dbController = null!; #endregion Public Fields #region Public Constructors public WebDoorCreatorService(IConfiguration configuration, IConnectionMultiplexer redisConnMult, IEmailSender emailSender) { _configuration = configuration; _emailSender = emailSender; // Conf cache redisConn = redisConnMult; redisDb = this.redisConn.GetDatabase(); // json serializer... FIX errore loop circolare https://www.ryadel.com/en/jsonserializationexception-self-referencing-loop-detected-error-fix-entity-framework-asp-net-core/ JSSettings = new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; // cod app CodApp = _configuration["CodApp"]; // Conf DB string connStr = _configuration.GetConnectionString("WDC.DB"); if (string.IsNullOrEmpty(connStr)) { Log.Info("ConnString empty!"); } else { dbController = new WebDoorCreatorController(configuration); } Log.Info("Avviata classe WebDoorCreatorService"); } #endregion Public Constructors #region Public Properties public string CodApp { get; set; } = ""; #endregion Public Properties #region Public Methods /// /// Update company /// /// /// public async Task CompanyAddMod(CompanyModel currRec) { var dbResult = await dbController.CompanyAddMod(currRec); // elimino cache redis... RedisValue pattern = new RedisValue($"{Constants.rKeyCompany}"); bool answ = await ExecFlushRedisPattern(pattern); await Task.Delay(1); return dbResult; } /// /// Company list filtered by company id /// /// Id to filter (0=ALL) /// public async Task> CompanyGetByKey(int id) { string source = "DB"; List dbResult = new List(); // cerco da cache string currKey = $"{Constants.rKeyCompany}:{id}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbController.CompanyGetByKey(id); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"CompanyGetAll | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /*----------------------------------------------------------------------------------------------------------------------*/ /// /// Getting a list of all the active components /// /// Path to start /// public async Task> CompoGetAllActive(string rootPath) { await Task.Delay(1); List listActiveCompo = new List(); //estraggo la lista di componenti che sono attive per il cliente IniFile fIni = new IniFile(rootPath); string compoDDF = fIni.ReadString("CompoOrder", "CompoDDFOrder", "CONFIG"); var compoDDFList = compoDDF.Split(","); foreach (string compo in compoDDFList) { listActiveCompo.Add(compo.Trim()); } return listActiveCompo; } /// /// Setting all the component list /// /// Path to start /// public async Task CompoListSetAll(string rootPath) { bool fatto = false; string compoName = ""; string sizeVal = ""; List listGraphicParams = new List(); List listValues = new List(); ListValuesTempModel Values = new ListValuesTempModel(); dbController.TestTablesTruncate(); List listActiveCompo = await CompoGetAllActive(Path.Combine(rootPath, @"Default.ini")); List listCompoS = new List(); //estraggo tutte le sotto directory della cartella \EgtData\Doors\EgtCompoBase\Compo string[] dirs = Directory.GetDirectories(rootPath, "*", SearchOption.TopDirectoryOnly); // elenco obj da inserire List ListObjDOT = new List(); string[] DefaultFile = Directory.GetFiles(rootPath, "Default.ini"); IniFile fIniDef = new IniFile(DefaultFile[0]); ListValuesTempModel listValObj = new ListValuesTempModel() { TableName = "Properties", FieldName = "DoorDef", Value = "Properties", Label = "Properties", Ordinal = 1, DefaultVal = "Maple, Oak, Pine, Birch, Walnut", InputType = "" }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "Finishing", FieldName = "DoorDef", Value = "Finishing", Label = "Finishing", Ordinal = 1, DefaultVal = "Varnishing, Veneer", InputType = "" }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "All", FieldName = "OrderStep", Value = "10", Label = "Door Draft", Ordinal = 10, DefaultVal = "#EF6C00", InputType = "" }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "All", FieldName = "OrderStep", Value = "20", Label = "Sent to DCA", Ordinal = 20, DefaultVal = "#FBC02D", InputType = "" }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "All", FieldName = "OrderStep", Value = "30", Label = "Approved By Maker", Ordinal = 30, DefaultVal = "#2962FF", InputType = "" }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "All", FieldName = "OrderStep", Value = "40", Label = "Approved By Customer", Ordinal = 40, DefaultVal = "#673AB7", InputType = "" }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "All", FieldName = "OrderStep", Value = "50", Label = "Planned", Ordinal = 50, DefaultVal = "#00B8D4", InputType = "" }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "All", FieldName = "OrderStep", Value = "60", Label = "In Production", Ordinal = 60, DefaultVal = "#43A047", InputType = "" }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "All", FieldName = "OrderStep", Value = "70", Label = "Delivered", Ordinal = 70, DefaultVal = "#AEEA00", InputType = "" }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "All", FieldName = "DoorDefStep", Value = "10", Label = "Door", Ordinal = 10, DefaultVal = "#448AFF", InputType = "" }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "All", FieldName = "DoorDefStep", Value = "20", Label = "Hardware", Ordinal = 20, DefaultVal = "#448AFF", InputType = "" }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "All", FieldName = "DoorDefStep", Value = "30", Label = "Report", Ordinal = 30, DefaultVal = "#448AFF", InputType = "" }; listValues.Add(listValObj); // parto con obj base sizeVal = fIniDef.ReadString("Size", "Width", "0.0"); listValObj = new ListValuesTempModel() { TableName = "Size", FieldName = "DoorDef", Value = "Width", Label = "50001", Ordinal = 1, DefaultVal = sizeVal, InputType = "TextBox", isSerializable = true }; listValues.Add(listValObj); sizeVal = fIniDef.ReadString("Size", "Height", "0.0"); listValObj = new ListValuesTempModel() { TableName = "Size", FieldName = "DoorDef", Value = "Height", Label = "50002", Ordinal = 2, DefaultVal = sizeVal, InputType = "TextBox", isSerializable = true }; listValues.Add(listValObj); sizeVal = fIniDef.ReadString("Size", "Thickness", "0.0"); listValObj = new ListValuesTempModel() { TableName = "Size", FieldName = "DoorDef", Value = "Thickness", Label = "50003", Ordinal = 3, DefaultVal = sizeVal, InputType = "TextBox", isSerializable = true }; listValues.Add(listValObj); sizeVal = fIniDef.ReadString("Size", "SwingList", "UNDEF"); listValObj = new ListValuesTempModel() { TableName = "Swing", FieldName = "DoorDef", Value = "Swing", Label = "50004", Ordinal = 1, DefaultVal = sizeVal, InputType = "TextBox", isSerializable = true }; listValues.Add(listValObj); //sizeVal = fIniDef.ReadString("Edge", "EdgeTypeList", "UNDEF"); StringBuilder edgesList = new StringBuilder(); for (int x = 1; x <= 11; x++) { var edge = fIniDef.ReadString("Edge", $"EdgeType{x}", "UNDEF"); if (x != 11) { edgesList.Append($"{edge.Split("/")[0]},"); } else { edgesList.Append($"{edge.Split("/")[0]}"); } } listValObj = new ListValuesTempModel() { TableName = "Profiles", FieldName = "DoorDef", Value = "lockedge", Label = "50005", Ordinal = 1, DefaultVal = "", InputType = "", isSerializable = true }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "Profiles", FieldName = "DoorDef", Value = "hingeedge", Label = "50006", Ordinal = 2, DefaultVal = "", InputType = "", isSerializable = true }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "Profiles", FieldName = "DoorDef", Value = "top", Label = "50007", Ordinal = 3, DefaultVal = "", InputType = "", isSerializable = true }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "Profiles", FieldName = "DoorDef", Value = "bottom", Label = "50008", Ordinal = 4, DefaultVal = "", InputType = "", isSerializable = true }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "Profiles", FieldName = "DoorDef", Value = "type", Label = "50424", Ordinal = 5, DefaultVal = edgesList.ToString(), InputType = "ComboBox", isSerializable = true }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "Profiles", FieldName = "DoorDef", Value = "machining", Label = "90312", Ordinal = 6, DefaultVal = "ON,OFF", InputType = "ComboBox", isSerializable = true }; listValues.Add(listValObj); listValObj = new ListValuesTempModel() { TableName = "Profiles", FieldName = "DoorDef", Value = "overmaterial", Label = "90312", Ordinal = 7, DefaultVal = "0.1", InputType = "ComboBox", isSerializable = true }; listValues.Add(listValObj); int i = 0; foreach (string dir in dirs) { int numPar = 1; int numHead = 1; // scansione della directory... string[] files = Directory.GetFiles(dir, "Config.ini"); compoName = ""; //iterazione per cercare tutti numPar file "Config.ini" nelle sotto directory foreach (string file in files) { //leggo tutte le linee del file List lines = File.ReadAllLines(file).ToList(); IniFile fIni = new IniFile(file); Guid opCode = Guid.NewGuid(); //cerco la sezione del file ed estraggo il nome del componente compoName = fIni.ReadString("Compo", "Name", "COMPONAME"); //cerco la sezione del file ed estraggo se numPar template sono attivi per il seguente componente var isActive = fIni.ReadString("Template", "IsActive", "1"); string layerName = fIni.ReadString("Layer", "LayerName", "LAYER"); // lo slash indica l'alias var compoNameSplit = compoName.Split("/"); var compoAcArray = listActiveCompo.ToArray(); var x = Array.FindIndex(compoAcArray, row => row == compoNameSplit[0]); if (listActiveCompo.Contains(compoNameSplit[0].ToString())) { //creo il componente (padre) listValObj = new ListValuesTempModel() { TableName = $"{compoNameSplit[0]}".Trim(), FieldName = "Hardware", Value = $"{compoNameSplit[0]}", Label = $"{compoNameSplit[1]}", Ordinal = x, DefaultVal = " ", InputType = " " }; //HardwareModel compoConfig = new HardwareModel() { compoName = $"{compoNameSplit[0]}", compoAlias = compoNameSplit[1].ToString(), compoLayerName = layerName, compoTemplateIsActive = compoTemplateIsActive }; //await dbController.CompoAdd(compoConfig); //listCompoS.Add(compoConfig); listValues.Add(listValObj); i++; //cerco all'interno del file tutte le sezioni che contengono "[Graphic" così da poter prendere il nome della sezione ES: [Graphic parameters1] = Graphic parameters1 var lineToSearch = lines.Where(x => x.Contains("[Graphic")).ToList(); numHead = 1; foreach (var match in lineToSearch) { var listV = await GraphicParamsGetAll(file, match, numHead, numPar, $"{compoNameSplit[0]}"); foreach (var item in listV) { listValues.Add(item); } numHead++; } numPar++; } } } fatto = await dbController.ListValuesAdd(listValues); return fatto; } public string DecriptData(string encData) { return SteamCrypto.DecryptString(encData, Constants.passPhrase); } /// /// CElimina record posta /// /// /// public async Task DoorDelete(DoorModel currRec) { int DoorId = currRec.DoorId; int OrderId = currRec.OrderId; // elimino sul DB bool answ = await dbController.DoorDelete(DoorId); // svuoto cache await DoorFlushCache(DoorId); await DoorOpFlushCache(DoorId); await OrderDetailFlushCache(OrderId); await OrdersFlushCache(); return answ; } /// /// Clean redis DOORS cache /// /// 0 = all /// public async Task DoorFlushCache(int DoorId) { RedisValue pattern = new RedisValue($"{Constants.rKeyDoor}:*"); if (DoorId > 0) { pattern = new RedisValue($"{Constants.rKeyDoor}:{DoorId}:*"); } bool answ = await ExecFlushRedisPattern(pattern); return answ; } /// /// Doors list, last in desc order /// public async Task?> DoorGetLast(int numRec) { string source = "DB"; List? dbResult = new List(); // cerco da cache string currKey = $"{Constants.rKeyDoorLast}:{numRec}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbController.DoorsGetLast(numRec); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, FastCache); } if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"DoorGetLast | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /// /// Doors list by numRec /// public async Task?> DoorGetByOrderId(int orderId) { string source = "DB"; List? dbResult = new List(); // cerco da cache string currKey = $"{Constants.rKeyOrderDetail}:{orderId}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbController.DoorsGetByOrderId(orderId); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"DoorGetByOrderId | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /// /// Add door /// /// /// public async Task DoorInsert(DoorModel newRec) { var dbResult = await dbController.DoorInsert(newRec); // elimino cache redis dati ordine... await OrderDetailFlushCache(newRec.OrderId); await OrdersFlushCache(); return dbResult; } /// /// Adding or removing a single door /// /// Record id to edit or add /// States if it has to be added or removing a door /// public async Task DoorModQty(int OrderId, int DoorId, bool isAdd) { var dbResult = await dbController.DoorModQty(DoorId, isAdd); // svuoto cache await DoorFlushCache(DoorId); await DoorOpFlushCache(DoorId); await OrderDetailFlushCache(OrderId); await OrdersFlushCache(); return dbResult; } /// /// Eliminazione DoorOP /// /// /// public async Task DoorOpDelete(DoorOpModel currDoorOp) { var dbResult = await dbController.DoorOpDelete(currDoorOp); // elimino cache redis dati porta... bool answ = await DoorOpFlushCache(currDoorOp.DoorId); answ = answ && await DoorFlushCache(currDoorOp.DoorId); // elimino cache redis dati ordine... answ = answ && await OrdersFlushCache(); return dbResult; } /// /// Eliminazione DoorOP list /// /// /// public async Task DoorOpDeleteRange(List currDoorOpList) { var dbResult = await dbController.DoorOpDeleteRange(currDoorOpList); // elimino cache redis dati porta... foreach (var item in currDoorOpList) { bool answ = await DoorOpFlushCache(item.DoorId); answ = answ && await DoorFlushCache(item.DoorId); // elimino cache redis dati ordine... answ = answ && await OrdersFlushCache(); } return dbResult; } /// /// Clean redis DOORS OP cache /// /// 0 = all /// public async Task DoorOpFlushCache(int DoorId) { RedisValue pattern = new RedisValue($"{Constants.rKeyDoorOp}*"); if (DoorId > 0) { pattern = new RedisValue($"{Constants.rKeyDoorOp}:{DoorId}*"); } bool answ = await ExecFlushRedisPattern(pattern); return answ; } /// /// Doors list by numRec /// public async Task> DoorOpGetByDoorId(int doorId) { string source = "DB"; List? dbResult = new List(); // cerco da cache string currKey = $"{Constants.rKeyDoorOp}:{doorId}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbController.DoorOpGetByDoorId(doorId); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"DoorOpGetByDoorId | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /// /// Doors list by numRec /// public async Task DoorOpGetById(int doorOpId) { await Task.Delay(1); string source = "DB"; DoorOpModel? dbResult = new DoorOpModel(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.DoorOpGetById(doorOpId); if (dbResult == null) { dbResult = new DoorOpModel(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"DoorOpGetById | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /// /// lista DoorOpList necessarie all'init /// /// public async Task> DoorOpGetDefault() { List? dbResult = new List(); string source = "DB"; // cerco da cache string currKey = $"{Constants.rKeyDoorOpType}:DEFAULT"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = await dbController.DoorOpTypeGetDefault(); if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"DoorOpGetDefault | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /// /// Restitusice i CurrVals + GraphParams aggiornati dati valori Folder/template /// /// Obj x cui è richiesto il ricalcolo parametri /// Dizionario dei valori attuali /// Dizionario di obj x GraphParams /// public async Task<(Dictionary, Dictionary>)> DoorOpGetUpdatedVals(string ObjectId, Dictionary currVal, Dictionary> currParams, string currTemplShape) { await Task.Delay(1); // duplico oggetti da tornare Dictionary currValUpd = new Dictionary(); Dictionary> currParamsUpd = new Dictionary>(); string default2Design = ""; // cerco il setup del template selezionato var listRecordTmp = await ListValuesGetAll(ObjectId, currTemplShape); if (listRecordTmp != null && currVal.ContainsKey("Folder") && currVal.ContainsKey(currTemplShape)) { string actKey = currVal[currTemplShape]; var firstTemplate = listRecordTmp.Where(x => x.Value == actKey).FirstOrDefault(); if (firstTemplate != null) { if (firstTemplate.DefaultVal != "") { default2Design = firstTemplate.DefaultVal; } else { default2Design = "1"; } } // elimino dai valori di setup e attuali quanto non sia template/folder... currValUpd = currVal.Where(x => x.Key == "Folder" || x.Key == currTemplShape).ToDictionary(x => x.Key, x => x.Value); // preparo setup valori List listDefVal = new List(); var listRecordGP = await ListValuesGetAll(ObjectId, $"Graphic Parameters{default2Design}"); if (listRecordGP != null) { foreach (var item in listRecordGP) { if (item.isSerializable && item.DefaultVal.Contains(",")) { listDefVal = item.DefaultVal.Trim().Split(",").ToList(); currValUpd.Add(item.Value.Trim(), item.DefaultVal.Trim().Split(",")[0].Split("/")[0]); } else { if (item.DefaultVal.Contains("/")) { listDefVal = new List() { item.DefaultVal.Trim().Split("/")[0] }; currValUpd.Add(item.Value.Trim(), item.DefaultVal.Trim().Split("/")[0]); } else { listDefVal = new List() { item.DefaultVal.Trim() }; currValUpd.Add(item.Value.Trim(), item.DefaultVal.Trim()); } } //defaultParamsList.Add(listDefVal); currParamsUpd.Add(item.Value.Trim(), listDefVal); } } } return (currValUpd, currParamsUpd); } /// /// Add doorOP list /// /// /// /// public async Task DoorOpInsert(int DoorId, List newOpList) { var dbResult = await dbController.DoorOpInsert(newOpList); // elimino cache redis dati porta... bool answ = await DoorOpFlushCache(DoorId); answ = answ && await DoorFlushCache(DoorId); // elimino cache redis dati ordine... answ = answ && await OrdersFlushCache(); return dbResult; } /// /// Effettua il setup dei Graph parameters date info template selezionato /// /// /// public async Task DoorOpSetupGraphParams(DoorOpModel currDoorOp) { string default2Design = ""; Dictionary? actDict = new Dictionary(); Dictionary? actDictNew = new Dictionary(); Dictionary>? defaultDictNew = new Dictionary>(); // per prima cosa deserializzo i valori attuali dal record... if (!string.IsNullOrEmpty(currDoorOp.JsoncActVal)) { actDict = JsonConvert.DeserializeObject>(currDoorOp.JsoncActVal); // verifico di avere valori validi if (actDict != null) { // cerco il setup del template selezionato var listRecordTmp = await ListValuesGetAll(currDoorOp.ObjectId, "template"); if (listRecordTmp != null && actDict.ContainsKey("Folder") && (actDict.ContainsKey("template") || actDict.ContainsKey("shape"))) { string actKey = actDict["template"];// Path.Combine(actDict["Folder"], actDict["template"]); var firstTemplate = listRecordTmp.Where(x => x.Value == actKey).FirstOrDefault(); if (firstTemplate != null) { if (firstTemplate.DefaultVal != "") { default2Design = firstTemplate.DefaultVal; } else { default2Design = "1"; } } // elimino dai valori di setup e attuali quanto non sia template/folder... actDictNew = actDict.Where(x => x.Key == "Folder" || x.Key == "template").ToDictionary(x => x.Key, x => x.Value); // preparo setup valori List listDefVal = new List(); var listRecordGP = await ListValuesGetAll(currDoorOp.ObjectId, $"Graphic Parameters{default2Design}"); if (listRecordGP != null) { foreach (var item in listRecordGP) { if (item.isSerializable && item.DefaultVal.Contains(",")) { listDefVal = item.DefaultVal.Trim().Split(",").ToList(); actDictNew.Add(item.Value.Trim(), item.DefaultVal.Trim().Split(",")[0].Split("/")[0]); } else { if (item.DefaultVal.Contains("/")) { listDefVal = new List() { item.DefaultVal.Trim().Split("/")[0] }; actDictNew.Add(item.Value.Trim(), item.DefaultVal.Trim().Split("/")[0]); } else { listDefVal = new List() { item.DefaultVal.Trim() }; actDictNew.Add(item.Value.Trim(), item.DefaultVal.Trim()); } } //defaultParamsList.Add(listDefVal); defaultDictNew.Add(item.Value.Trim(), listDefVal); } } // ri-serializzo e salvo! currDoorOp.JsoncActVal = JsonConvert.SerializeObject(actDictNew); currDoorOp.JsoncConfigVal = JsonConvert.SerializeObject(defaultDictNew); } } } return currDoorOp; } /// /// Doors list by numRec /// public async Task?> DoorOpTypeGetAll() { await Task.Delay(1); string source = "DB"; List? dbResult = new List(); // cerco da cache string currKey = $"{Constants.rKeyDoorOpType}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.DoorOpTypeGetAll(); if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"DoorOpTypeGetAll | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /// /// Aggiornamento DoorOP /// /// /// public async Task DoorOpUpdate(List currDoorOps) { var dbResult = await dbController.DoorOpUpdate(currDoorOps); // elimino cache redis dati porta... bool answ = await DoorOpFlushCache(currDoorOps.FirstOrDefault()!.DoorId); answ = answ && await DoorFlushCache(currDoorOps.FirstOrDefault()!.DoorId); // elimino cache redis dati ordine... answ = answ && await OrdersFlushCache(); return dbResult; } /// /// Update or add door /// /// /// public async Task DoorUpsert(DoorModel currRec) { var dbResult = await dbController.DoorUpsert(currRec); // elimino cache redis dati porta... bool answ = await DoorFlushCache(currRec.DoorId); // elimino cache redis dati ordine... answ = answ && await OrdersFlushCache(); return dbResult; } public string EncriptData(string rawData) { return SteamCrypto.EncryptString(rawData, Constants.passPhrase); } public async Task FlushRedisCache() { await Task.Delay(1); RedisValue pattern = new RedisValue($"{Constants.redisBaseAddr}*"); bool answ = await ExecFlushRedisPattern(pattern); return answ; } public async Task> GraphicParamsGetAll(string file, string match, int n, int i, string HwCode) { await Task.Delay(1); List listValuesTemp = new List(); ListValuesTempModel listValObj = new ListValuesTempModel(); IniFile fIni = new IniFile(file); //cerco il contenuto delle sezioni var graphicParamsName = fIni.ReadSection(match.Substring(1, match.Length - 2)); //controllo se tra numPar numeri di graphic params vi è un buco ES: Graphic parameters1 Graphic parameters3 se il buco c'è salto tutti numPar parametri che stanno dopo il buco ==> tengo conto solo di Graphic parameters1 if (int.Parse(match.Substring(match.Length - 2, 1)) == n) { int ordinal = 1; foreach (string param in graphicParamsName) { string compoParams = fIni.ReadString(match.Substring(1, match.Length - 2), $"{param.Split("=")[0]}", "CONFIG"); //cerco il parametro nella sezione var compoParamsSplit = compoParams.Split(";"); string CompoParamName = ""; string CompoParamAlias = ""; if (param.Split("=")[0].StartsWith("Param")) { if (compoParamsSplit[1].Contains("/")) { CompoParamName = compoParamsSplit[1].Split("/")[0]; CompoParamAlias = compoParamsSplit[1].Split("/")[1]; } else if (compoParamsSplit[1].Contains(" ")) { CompoParamName = compoParamsSplit[1].Split(" ")[1]; //CompoParamAlias = compoParamsSplit[1].Split(" ")[1]; } //creo nuovo oggetto parametro che conterrà anche il nome del componente per creare relazione listValObj = new ListValuesTempModel() { TableName = $"{HwCode}".Trim(), FieldName = match.Substring(1, match.Length - 2), Value = CompoParamName, Label = CompoParamAlias, Ordinal = ordinal, DefaultVal = param.Split("=")[1].Split(";")[2], InputType = param.Split("=")[1].Split(";")[0], isSerializable = true }; if (listValuesTemp.Where(x => x.TableName == listValObj.TableName && x.FieldName == listValObj.FieldName && x.Value == listValObj.Value).Count() == 0 && listValObj.TableName != null && listValObj.FieldName != null && listValObj.Value != null) { listValuesTemp.Add(listValObj); ordinal++; } else { Log.Error($"GraphicParamsGetAll | Duplicated key: {listValObj.TableName} {listValObj.FieldName} {listValObj.Value} "); } } else { } } } return listValuesTemp; } /// /// Estraggo tutte le lingue disponibili per questa applicazione /// /// public async Task?> LanguageGetAll() { string source = "DB"; List? dbResult = new List(); // cerco da cache string currKey = $"{Constants.rKeyLanguage}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbController.LanguageGetAll(); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"LanguageGetAll | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /// /// List values /// public async Task?> ListValuesGetAll(string tableName, string fieldName) { string source = "DB"; List? dbResult = new List(); string currKey = ""; // cerco da cache currKey = $"{Constants.rKeyListValues}:{tableName}:{fieldName}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbController.ListValuesGetAll(tableName, fieldName); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"ListValuesGetAll | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } public async Task ListValuesLuaNgeInsert(string rootPath) { List values = new List(); string[] dirs = Directory.GetDirectories(rootPath); foreach (string dir in dirs) { string compoCode = ""; string compoTempOrShape = ""; string[] templateDirectories = Directory.GetDirectories(dir); string[] iniFiles = Directory.GetFiles(dir, "Config.ini"); int ordin = 1; foreach (string templateDirectory in templateDirectories) { var tName = templateDirectory.Split("\\"); var fName = templateDirectory.Split("\\"); foreach (var file in iniFiles) { List lines = File.ReadAllLines(file).ToList(); IniFile fIni = new IniFile(file); var compoName = fIni.ReadString("Compo", "Name", "COMPONAME"); var compoT = fIni.ReadString("Template", "Name", "TEMPSHAPE"); compoCode = compoName.Split("/")[0].Trim(); compoTempOrShape = compoT.Split("/")[0].Trim(); } string[] templateFiles = Directory.GetFiles(templateDirectory); if (templateFiles.Length > 0) { ListValuesTempModel folderNames = new ListValuesTempModel() { TableName = $"{compoCode}".Replace(" ", "_"), FieldName = "Folder", Value = @$"{tName[tName.Length - 1]}", Label = @$"{tName[tName.Length - 1]}", Ordinal = 0, DefaultVal = " ", InputType = " ", }; values.Add(folderNames); } foreach (string templateFile in templateFiles) { string defGpNum = ""; var lines = File.ReadAllLines(templateFile).ToList(); foreach (var line in lines) { if (line.StartsWith("--") && line.Contains("Default")) { if (line.Split("=")[1] != null) { defGpNum = line.Split("=")[1]; } else { defGpNum = " "; } } } var fileName = ""; if (Path.GetFileName(templateFile).Split(".")[1] == "lua") { fileName = Path.GetFileName(templateFile).Split(".")[0]; } else { fileName = Path.GetFileName(templateFile); } ListValuesTempModel temp = new ListValuesTempModel() { TableName = $"{compoCode}".Replace(" ", "_"), FieldName = compoTempOrShape, Value = @$"{tName[tName.Length - 1]}\{fileName}", Label = fileName, Ordinal = ordin, DefaultVal = defGpNum, InputType = " ", }; if (values.Where(x => x.TableName == temp.TableName && x.FieldName == temp.FieldName && x.Value == temp.Value).Count() == 0 && temp.TableName != null && temp.FieldName != null && temp.Value != null) { values.Add(temp); ordin++; } else { Log.Error($"GraphicParamsGetAll | Duplicated key: {temp.TableName} {temp.FieldName} {temp.Value} "); } } } } bool fatto = await dbController.ListValuesAdd(values); return fatto; } /// /// Add new order /// /// /// public async Task OrderAdd(OrderModel currRec) { var dbResult = await dbController.OrderAdd(currRec); // elimino cache redis... RedisValue pattern = new RedisValue($"{Constants.rKeyOrderStatus}:*"); bool answ = await ExecFlushRedisPattern(pattern); return dbResult; } /// /// Clean REDIS order detail data in cache /// /// 0 = all /// public async Task OrderDetailFlushCache(int OrderId) { RedisValue pattern = new RedisValue($"{Constants.rKeyOrderDetail}:*"); if (OrderId > 0) { pattern = new RedisValue($"{Constants.rKeyOrderDetail}:{OrderId}"); } bool answ = await ExecFlushRedisPattern(pattern); return answ; } /// /// Remove order /// /// /// public async Task OrderRem(int OrdId) { var dbResult = await dbController.OrderRem(OrdId); // elimino cache redis... RedisValue pattern = new RedisValue($"{Constants.rKeyOrderStatus}:*"); bool answ = await ExecFlushRedisPattern(pattern); return dbResult; } /// /// Clean redis ORDERS cache /// /// /// public async Task OrdersFlushCache() { RedisValue pattern = new RedisValue($"{Constants.rKeyOrderStatus}:*"); bool answ = await ExecFlushRedisPattern(pattern); return answ; } public async Task?> OrderStatusGetFilt(int companyId, int orderStatus, DateTime dataFrom, DateTime dataTo) { string source = "DB"; List? dbResult = new List(); // cerco da cache string currKey = $"{Constants.rKeyOrderStatus}:{companyId}:{orderStatus}:{dataFrom:yyyyMMdd}:{dataTo:yyyyMMdd}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { var rawResult = dbController.OrderStatusGetAll(companyId, orderStatus, dataFrom, dataTo); // ordino desc in ram... dbResult = rawResult.OrderByDescending(x => x.OrderId).ToList(); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"OrderStatusGetFilt | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /// /// Updating an order status /// /// /// /// public async Task OrderUpdate(int orderId, int newStatus) { var dbResult = await dbController.OrderUpdate(orderId, newStatus); // elimino cache redis... //bool answ = await DoorFlushCache(currRec.doorId); // elimino cache redis dati ordine... bool answ = await FlushRedisCache(); return dbResult; } /// /// Graphic parameters list by hw id /// public async Task?> ParamGetByHwId(int hwId) { string source = "DB"; List? dbResult = new List(); // cerco da cache string currKey = $"{Constants.rKeyGraphicParameters}:{hwId}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbController.ParamGetByHwId(hwId); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"ParamGetByHwId | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /// /// roles list /// public async Task?> RolesGetAll() { string source = "DB"; List? dbResult = new List(); // cerco da cache string currKey = Constants.rKeyRoles; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbController.RolesGetAll(); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"RolesGetAll | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /// /// Users roles list /// public async Task?> UsersGetAll() { string source = "DB"; List? dbResult = new List(); // cerco da cache string currKey = Constants.rKeyUsers; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbController.UsersGetAll(); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"UsersGetAll | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /// /// Users roles list /// public async Task UsersGetById(string userId) { string source = "DB"; AspNetUsers dbResult = new AspNetUsers(); // cerco da cache string currKey = $"{Constants.rKeyUsers}:{userId}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject(rawData); if (tempResult == null) { dbResult = new AspNetUsers(); } else { dbResult = tempResult; } } else { dbResult = dbController.UsersGetById(userId); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new AspNetUsers(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"UsersGetById | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } /// /// Users roles list /// public async Task?> UserViewGetAll() { string source = "DB"; List? dbResult = new List(); // cerco da cache string currKey = Constants.rKeyUsersView; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>(rawData); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbController.UserViewGetAll(); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new List(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"UserViewGetAll | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } public async Task>?> VocLemmaGetAll() { string source = "DB"; Dictionary>? dbResult = new Dictionary>(); // cerco da cache Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string currKey = $"{Constants.rKeyVocLemma}"; string? rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>>(rawData); if (tempResult == null) { dbResult = new Dictionary>(); } else { dbResult = tempResult; } } else { dbResult = dbController.VocLemmaGetAll(); rawData = JsonConvert.SerializeObject(dbResult, JSSettings); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (dbResult == null) { dbResult = new Dictionary>(); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"VocLemmaGetAll | {source} in: {ts.TotalMilliseconds} ms"); return dbResult; } public async Task VocLemmaInsert(string rootPath) { bool fatto = false; List VocLemmas = new List(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); string[] files = Directory.GetFiles(rootPath, "*"); string lang = ""; foreach (string file in files) { var fileName = file.Split("."); lang = fileName[0].Substring(fileName[0].Length - 2, 2); //leggo tutte le linee del file List lines = File.ReadAllLines(file).ToList(); foreach (var line in lines) { if (!line.StartsWith("//") && line != "") { string[] lineSplit = line.Split("="); //string trad = ""; if (lineSplit.Length != 1) { VocabularyTempModel newVocLemma = new VocabularyTempModel() { Lingua = lang, Lemma = lineSplit[0], Traduzione = lineSplit[1] }; VocLemmas.Add(newVocLemma); } } } } fatto = await dbController.VocLemmaInsert(VocLemmas); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"VocLemmaInsert in: {ts.TotalMilliseconds} ms"); return fatto; } public async Task createDoor(int idOrd, string userId, string currMeaUnit) { int answ = 0; // conto le porte x questo ordine e uso x chiamata successiva... var door4ord = await DoorGetByOrderId(idOrd); int numDoors = door4ord?.Count + 1 ?? 1; List listOp = new List(); DateTime adesso = DateTime.Now; // creo una nuova porta... DoorModel newDoor = new DoorModel() { OrderId = idOrd, MeasureUnit = currMeaUnit, UserIdIns = userId, UserIdMod = userId, UserIdLock = userId, DateIns = adesso, DateMod = adesso, DateLockExpiry = adesso.AddHours(1), DoorDescript = $"ORD {idOrd} | Door {numDoors:00}", DoorExtCode = $"ORD {idOrd} | Ext Code --", Quantity = 1, UnitCost = 0, TypeId = 1 }; // chiamo metodo x insert... var doorId = await DoorInsert(newDoor); // aggiungo le lavorazioni standard... var doorOpList = await DoorOpGetDefault(); var listRecordEdge = await ListValuesGetAll("Profiles", "DoorDef"); var listRecordSizing = await ListValuesGetAll("Size", "DoorDef"); var listRecordSwing = await ListValuesGetAll("Swing", "DoorDef"); var listRecordProperties = await ListValuesGetAll("Properties", "DoorDef"); var listRecordFinishing = await ListValuesGetAll("Finishing", "DoorDef"); ListValuesModel? profCurrType = null; ListValuesModel? profCurrMach = null; ListValuesModel? profCurrOverMat = null; if (listRecordEdge != null) { profCurrType = listRecordEdge.Where(x => x.Value == "type").FirstOrDefault(); profCurrMach = listRecordEdge.Where(x => x.Value == "machining").FirstOrDefault(); profCurrOverMat = listRecordEdge.Where(x => x.Value == "overmaterial").FirstOrDefault(); } Dictionary>> itemsDictDef = new Dictionary>>(); Dictionary> itemsDictAct = new Dictionary>(); Dictionary> paramsDict = new Dictionary>(); Dictionary actDict = new Dictionary(); List listDefVal = new List(); List listDefValCurrMach = new List(); List listDefValOverMat = new List(); List defaultParamsList = new List(); #region Gestione Properties if (listRecordProperties != null) { foreach (var item in listRecordProperties) { foreach (var param in item.DefaultVal.Split(",")) { listDefVal.Add(param.Trim()); if (!actDict.ContainsKey(item.Value)) { actDict.Add(item.Value, item.DefaultVal.Trim().Split(",")[0]); paramsDict.Add(item.Value, listDefVal); } //itemsDict.Add(item.Value, paramsDict); //paramsDict.Clear(); } //listDefVal = new List() { item.DefaultVal.Trim() }; } itemsDictDef.Add("Properties", paramsDict); itemsDictAct.Add("Properties", actDict); //defaultParamsList.Add(listDefVal); } var jsonDef = JsonConvert.SerializeObject(itemsDictDef); var jsonAct = JsonConvert.SerializeObject(itemsDictAct); DoorOpModel doorOpToAdd = new DoorOpModel() { DateIns = adesso, DateMod = adesso, UserIdIns = userId, UserIdMod = userId, ObjectId = "Properties", DoorId = doorId, JsoncConfigVal = jsonDef, JsoncActVal = jsonAct, userConfirm = userId, DtConfirm = adesso }; listOp.Add(doorOpToAdd); #endregion Gestione Properties paramsDict.Clear(); actDict.Clear(); itemsDictDef.Clear(); itemsDictAct.Clear(); listDefVal.Clear(); #region Gestione Finishing if (listRecordFinishing != null) { foreach (var item in listRecordFinishing) { foreach (var param in item.DefaultVal.Split(",")) { listDefVal.Add(param.Trim()); if (!actDict.ContainsKey(item.Value)) { actDict.Add(item.Value, item.DefaultVal.Trim().Split(",")[0]); paramsDict.Add(item.Value, listDefVal); } //itemsDict.Add(item.Value, paramsDict); //paramsDict.Clear(); } //listDefVal = new List() { item.DefaultVal.Trim() }; } itemsDictDef.Add("Finishing", paramsDict); itemsDictAct.Add("Finishing", actDict); //defaultParamsList.Add(listDefVal); } jsonDef = JsonConvert.SerializeObject(itemsDictDef); jsonAct = JsonConvert.SerializeObject(itemsDictAct); doorOpToAdd = new DoorOpModel() { DateIns = adesso, DateMod = adesso, UserIdIns = userId, UserIdMod = userId, ObjectId = "Finishing", DoorId = doorId, JsoncConfigVal = jsonDef, JsoncActVal = jsonAct, userConfirm = userId, DtConfirm = adesso }; listOp.Add(doorOpToAdd); #endregion Gestione Finishing paramsDict.Clear(); actDict.Clear(); itemsDictDef.Clear(); itemsDictAct.Clear(); listDefVal.Clear(); #region Gestione sizing if (listRecordSizing != null) { foreach (var item in listRecordSizing) { listDefVal = new List() { item.DefaultVal.Trim() }; if (!actDict.ContainsKey(item.Value)) { actDict.Add(item.Value, item.DefaultVal.Trim()); paramsDict.Add(item.Value, listDefVal); } } itemsDictDef.Add("Size", paramsDict); itemsDictAct.Add("Size", actDict); //defaultParamsList.Add(listDefVal); } jsonDef = JsonConvert.SerializeObject(itemsDictDef); jsonAct = JsonConvert.SerializeObject(itemsDictAct); doorOpToAdd = new DoorOpModel() { DateIns = adesso, DateMod = adesso, UserIdIns = userId, UserIdMod = userId, ObjectId = "Size", DoorId = doorId, JsoncConfigVal = jsonDef, JsoncActVal = jsonAct, userConfirm = userId, DtConfirm = adesso }; listOp.Add(doorOpToAdd); #endregion Gestione sizing paramsDict.Clear(); actDict.Clear(); itemsDictDef.Clear(); itemsDictAct.Clear(); listDefVal.Clear(); #region Gestione Swing if (listRecordSwing != null) { foreach (var item in listRecordSwing) { foreach (var param in item.DefaultVal.Split(",")) { listDefVal.Add(param.Trim()); if (!actDict.ContainsKey(item.Value)) { actDict.Add(item.Value, item.DefaultVal.Trim().Split(",")[0]); paramsDict.Add(item.Value, listDefVal); } //itemsDict.Add(item.Value, paramsDict); //paramsDict.Clear(); } //listDefVal = new List() { item.DefaultVal.Trim() }; } itemsDictDef.Add("Swing", paramsDict); itemsDictAct.Add("Swing", actDict); //defaultParamsList.Add(listDefVal); } jsonDef = JsonConvert.SerializeObject(itemsDictDef); jsonAct = JsonConvert.SerializeObject(itemsDictAct); doorOpToAdd = new DoorOpModel() { DateIns = adesso, DateMod = adesso, UserIdIns = userId, UserIdMod = userId, ObjectId = "Swing", DoorId = doorId, JsoncConfigVal = jsonDef, JsoncActVal = jsonAct, userConfirm = userId, DtConfirm = adesso }; listOp.Add(doorOpToAdd); #endregion Gestione Swing paramsDict.Clear(); actDict.Clear(); itemsDictDef.Clear(); itemsDictAct.Clear(); listDefVal.Clear(); #region Gestione Profiles if (listRecordEdge != null) { listDefVal.Clear(); if (profCurrType != null) { foreach (var param in profCurrType.DefaultVal.Split(",")) { listDefVal.Add(param.Trim()); if (!actDict.ContainsKey(profCurrType.Value)) { actDict.Add(profCurrType.Value, param.Trim()); paramsDict.Add(profCurrType.Value, listDefVal); //listDefVal.Clear(); } //itemsDict.Add(item.Value, paramsDict); //paramsDict.Clear(); } if (profCurrMach != null) { //listDefVal.Clear(); foreach (var param in profCurrMach.DefaultVal.Split(",")) { listDefValCurrMach.Add(param.Trim()); if (!actDict.ContainsKey(profCurrMach.Value)) { paramsDict.Add(profCurrMach.Value, listDefValCurrMach); actDict.Add(profCurrMach.Value, profCurrMach.DefaultVal.Trim().Split(",")[0]); //listDefVal.Clear(); } //itemsDict.Add(item.Value, paramsDict); //paramsDict.Clear(); } } if (profCurrOverMat != null) { //listDefVal.Clear(); if (!paramsDict.ContainsKey(profCurrOverMat.Value)) { listDefValOverMat.Add(profCurrOverMat.DefaultVal.Trim()); paramsDict.Add(profCurrOverMat.Value, listDefValOverMat); actDict.Add(profCurrOverMat.Value, profCurrOverMat.DefaultVal.Trim()); } } } foreach (var item in listRecordEdge.Where(x => x.Value != "type" && x.Value != "machining" && x.Value != "overmaterial")) { if (!itemsDictDef.ContainsKey(item.Value)) { itemsDictDef.Add(item.Value, paramsDict); } if (!itemsDictAct.ContainsKey(item.Value)) { itemsDictAct.Add(item.Value, actDict); } //defaultParamsList.Add(listDefVal); //defaultDict.Add(item.Label, listDefVal); } } //actDict.Add(HwToShow.TableName, actParamsList); jsonDef = JsonConvert.SerializeObject(itemsDictDef); jsonAct = JsonConvert.SerializeObject(itemsDictAct); doorOpToAdd = new DoorOpModel() { DateIns = adesso, DateMod = adesso, UserIdIns = userId, UserIdMod = userId, ObjectId = "Profiles", DoorId = doorId, JsoncConfigVal = jsonDef, JsoncActVal = jsonAct, userConfirm = userId, DtConfirm = adesso }; listOp.Add(doorOpToAdd); #endregion Gestione Profiles // salvo Door OP associate bool fatto = await DoorOpInsert(doorId, listOp); if (fatto) { answ = doorId; } return answ; } #endregion Public Methods #region Protected Fields protected Random rnd = new Random(); #endregion Protected Fields #region Private Fields private static IConfiguration _configuration = null!; private static JsonSerializerSettings? JSSettings; private static Logger Log = LogManager.GetCurrentClassLogger(); private readonly IEmailSender _emailSender; /// /// Durata cache lunga IN SECONDI /// private int cacheTtlLong = 60 * 5; /// /// Durata cache breve IN SECONDI /// private int cacheTtlShort = 60 * 1; /// /// Oggetto per connessione a REDIS /// private IConnectionMultiplexer redisConn; /// /// Oggetto DB redis da impiegare x chiamate R/W /// private IDatabase redisDb = null!; #endregion Private Fields #region Private Properties /// /// Durata cache lunga (+ perturbazione percentuale +/-10%) /// private TimeSpan FastCache { get => TimeSpan.FromSeconds(cacheTtlShort * rnd.Next(900, 1100) / 1000); } /// /// Durata cache lunga (+ perturbazione percentuale +/-10%) /// private TimeSpan LongCache { get => TimeSpan.FromSeconds(cacheTtlLong * rnd.Next(900, 1100) / 1000); } /// /// Durata cache lunga (+ perturbazione percentuale +/-10%) /// private TimeSpan UltraLongCache { get => TimeSpan.FromSeconds(cacheTtlLong * 10 * rnd.Next(900, 1100) / 1000); } #endregion Private Properties #region Private Methods /// /// Esegue flush memoria redis dato pattern /// /// /// private async Task ExecFlushRedisPattern(RedisValue pattern) { bool answ = false; var listEndpoints = redisConn.GetEndPoints(); foreach (var endPoint in listEndpoints) { //var server = redisConnAdmin.GetServer(listEndpoints[0]); var server = redisConn.GetServer(endPoint); if (server != null) { var keyList = server.Keys(redisDb.Database, pattern); foreach (var item in keyList) { await redisDb.KeyDeleteAsync(item); } answ = true; } } return answ; } public async Task FlushCustomPattern(string keyWord) { await Task.Delay(1); RedisValue pattern = new RedisValue($"{Constants.redisBaseAddr}:{keyWord}"); bool answ = await ExecFlushRedisPattern(pattern); return answ; } #endregion Private Methods } }