protected void OnScvEventSectorization(Object sender, SectorizationReceivedArgs data) { /** Se ha recibido una sectorizacion correcta de una dependencia */ EventThread.Enqueue("OnScvEventSectorization", () => { var ctrldep = DepManagers.Where(d => d.Cfg.Id == data.ScvId).FirstOrDefault(); if (ctrldep != null) { if (data.Accepted) { // Actualizo la Sectorizacion en la Dependencia. ctrldep.MapOfSectors = data.SectorMap; // Mapeo la sectorizacion recibida. var MapOfSectorsMapped = ctrldep.Map(data.SectorMap); // Actualizo la Sectorizacion en el Manager. MainManager.MergeSectorization(MapOfSectorsMapped); // Historico. History.Add(HistoryItems.DepSectorizationReceivedEvent, "", ctrldep.Cfg.Id, "", SectorizationHelper.MapToString(data.SectorMap)); // Propagar la Sectorizacion al SCV real si todas las dependencias han recibido sectorizacion. var DepWithSectInfo = DepManagers.Where(d => d.MapOfSectors.Count > 0).ToList(); if (DepWithSectInfo.Count == DepManagers.Count) { (MainManager.Manager as PsiManager).SendSectorization(MainManager.MapOfSectors); // Historico History.Add(HistoryItems.ScvSectorizationSendedEvent, "", MainManager.Cfg.Id, "", SectorizationHelper.MapToString(MainManager.MapOfSectors), $"Recibida de SACTA ({data.ScvId})"); data.Acknowledge(true); } else { //Logger.Warn<SactaProxy>($"OnScvEventSectorization. IGNORED. No all Sectorization Info Present."); History.Add(HistoryItems.DepSectorizationRejectedEvent, "", ctrldep.Cfg.Id, "", SectorizationHelper.MapToString(data.SectorMap), "No todas las dependencias tienen sectorizaciones válidas."); data.Acknowledge(false); } } else { // Evento de Sectorizacion Rechazada. Historico History.Add(HistoryItems.DepSectorizationRejectedEvent, "", ctrldep.Cfg.Id, "", data.ReceivedMap, data.RejectCause); data.Acknowledge(false); } } else { Logger.Fatal <SactaProxy>($"OnScvEventSectorization. {data.ScvId} Dependency is missing or duplicated"); } }); }
protected void OnPsiEventSectorizationAsk(Object sender, SectorizationRequestArgs data) { EventThread.Enqueue("OnPsiEventActivity", () => { //var DepWithSectInfo = DepManager.Where(d => d.Value.MapOfSectors.Count() > 0).ToList(); var DepWithSectInfo = DepManagers.Where(d => d.MapOfSectors.Count > 0).ToList(); if (DepWithSectInfo.Count == DepManagers.Count) { (MainManager.Manager as PsiManager).SendSectorization(MainManager.MapOfSectors); /** Historico */ History.Add(HistoryItems.ScvSectorizationSendedEvent, "", MainManager.Cfg.Id, "", SectorizationHelper.MapToString(MainManager.MapOfSectors), $"Peticion SCV"); } else { Logger.Warn <SactaProxy>($"OnPsiEventSectorizationAsk. IGNORED. No all Sectorization Info Present."); } }); }
protected bool ConfigureService() { Logger.Info <SactaProxy>("Configurando Servicio"); cfgManager.Get((cfg => { // Se utiliza 'siempre' version 0 para CD30 y version 1 para ULISES. cfg.ProtocolVersion = Properties.Settings.Default.ScvType; History.Configure(cfg.General.HistoryMaxDays, cfg.General.HistoryMaxItems); Managers.Clear(); cfg.Psi.Sectorization.Positions = ""; cfg.Psi.Sectorization.Sectors = ""; cfg.Psi.Sectorization.Virtuals = ""; var manager = new PsiManager(cfg.ProtocolVersion, cfg.Psi, () => History); manager.EventActivity += OnPsiEventActivity; manager.EventSectRequest += OnPsiEventSectorizationAsk; Managers.Add(new DependencyControl(cfg.Psi.Id) { IsMain = true, Cfg = cfg.Psi, Manager = manager }); cfg.Dependencies.ForEach(dep => { var dependency = new ScvManager(cfg.ProtocolVersion, dep, () => History); dependency.EventActivity += OnScvEventActivity; dependency.EventSectorization += OnScvEventSectorization; /** Construyendo la configuracion de Sectorizacion general */ var sectorsMap = dep.Sectorization.SectorsMap.Split(',') .Where(i => Configuration.MapOfSectorsEntryValid(i)) .ToDictionary(k => int.Parse(k.Split(':')[0]), v => int.Parse(v.Split(':')[1])); var positionsMap = dep.Sectorization.PositionsMap.Split(',') .Where(i => Configuration.MapOfSectorsEntryValid(i)) .ToDictionary(k => int.Parse(k.Split(':')[0]), v => int.Parse(v.Split(':')[1])); var virtuals = Configuration.ListString2String( dep.Sectorization.VirtualsList() .Select(v => sectorsMap.Keys.Contains(v) ? sectorsMap[v].ToString() : v.ToString()) .ToList()); var reals = String.Join(",", dep.Sectorization.SectorsList() .Select(r => sectorsMap.Keys.Contains(r) ? sectorsMap[r].ToString() : r.ToString()) .ToList()); //.Aggregate((i, j) => i + "," + j.ToString()); var positions = String.Join(",", dep.Sectorization.PositionsList() .Select(p => positionsMap.Keys.Contains(p) ? positionsMap[p].ToString() : p.ToString()) .ToList()); //.Aggregate((i, j) => i + "," + j.ToString()); cfg.Psi.Sectorization.Positions = Configuration.AgreggateString(cfg.Psi.Sectorization.Positions, positions); cfg.Psi.Sectorization.Virtuals = Configuration.AgreggateString(cfg.Psi.Sectorization.Virtuals, virtuals); cfg.Psi.Sectorization.Sectors = Configuration.AgreggateString(cfg.Psi.Sectorization.Sectors, reals); Managers.Add(new DependencyControl(dep.Id) { IsMain = false, Cfg = dep, Manager = dependency, SectorsMap = sectorsMap, PositionsMap = positionsMap }); }); /** Test de la configuracion que maneja la PSI, que debe coincidir con la configurada en BD */ SectorizationHelper.CompareWithDb(cfg.Psi.Sectorization.Positions, cfg.Psi.Sectorization.Sectors, cfg.Psi.Sectorization.Virtuals, (error) => { // Marcar el Warning... PS.SignalWarning <SactaProxy>($"Incoherencia de Configuración con Base de Datos: {error}", History); }); /** */ var ids = cfg.Dependencies.Select(d => d.Id).ToList(); ids.Add(cfg.Psi.Id); SectorizationPersistence.Sanitize(ids); Cfg = cfg; cfgManager.Write(Cfg); Logger.Info <SactaProxy>("Servicio Configurado..."); })); return(true); }