private void dbMCSources_OnEventHandler(object obj) { DbMCInterface.ID_EVENT id_event = DbMCInterface.ID_EVENT.Unknown; EventArgs argEventChanged = null; // оборудование для которого произошло событие TEC tec; // для оборудования которой произошло событие Tuple <DbMCInterface.EVENT, bool> tupleConnectHandler; Func <DateTime, TimeSpan> difference = delegate(DateTime target) { // разница целевой даты объекта события и текущей даты return(target - ASUTP.Core.HDateTime.ToMoscowTimeZone()); }; Func <DateTime, bool> isRequired = delegate(DateTime target) { // разница целевой даты объекта события и текущей даты; для проверки необходимости обработки события (только текущие сутки) TimeSpan diff = difference(target); return(diff.TotalDays > -1 && diff.TotalDays < ASUTP.Core.HDateTime.TS_MSK_OFFSET_OF_UTCTIMEZONE.TotalDays); }; Func <DbMCInterface.ID_EVENT, DateTime, DateTime> translate = delegate(DbMCInterface.ID_EVENT id, DateTime datetime) { return(((id == DbMCInterface.ID_EVENT.RELOAD_PLAN_VALUES) || (id == DbMCInterface.ID_EVENT.NEW_PLAN_VALUES)) ? datetime.SystemToLocalHqEx() : ((id == DbMCInterface.ID_EVENT.PHANTOM_RELOAD_PLAN_VALUES) || (id == DbMCInterface.ID_EVENT.REQUEST_PLAN_VALUES)) ? datetime : datetime); }; if (obj is Array) { id_event = (DbMCInterface.ID_EVENT)(obj as object []) [0]; if (id_event == DbMCInterface.ID_EVENT.GENOBJECT_MODIFIED) { Modes.NetAccess.EventRefreshData53500 ev = (obj as object []) [1] as Modes.NetAccess.EventRefreshData53500; #region Подготовка текста сообщения в журнал о событии string msg = string.Empty , listEquipment = string.Empty; msg = string.Format(@"AdminMC::dbMCSources_OnEventHandler((ID_MC_EVENT={1}) - обработчик события - изменения[кол-во={2}]{0}для оборудования {3}..." , Environment.NewLine, id_event, ev.Equipments.Count, @"СПИСОК"); foreach (KeyValuePair <DateTime, List <int> > pair in ev.Equipments) { listEquipment += string.Format(@"[Дата={0}, список=({1})],", pair.Key.ToString(), string.Join(", ", pair.Value)); } listEquipment = listEquipment.Remove(listEquipment.Length - 1); msg = msg.Replace(@"СПИСОК", listEquipment); #endregion Logging.Logg().Action(msg, Logging.INDEX_MESSAGE.NOT_SET); } else if ((id_event == DbMCInterface.ID_EVENT.RELOAD_PLAN_VALUES) || (id_event == DbMCInterface.ID_EVENT.PHANTOM_RELOAD_PLAN_VALUES)) { Modes.NetAccess.EventRefreshJournalMaket53500 ev = (obj as object []) [1] as Modes.NetAccess.EventRefreshJournalMaket53500; DateTime dateTarget; ReadOnlyCollection <Guid> makets; string abbr = string.Empty , taskModes = string.Empty; dateTarget = translate(id_event, ev.dtTarget.GetValueOrDefault()); makets = ev.makets as ReadOnlyCollection <Guid>; abbr = ev.Task.GetAbbr(); taskModes = ev.Task.ModesTaskToString(); Logging.Logg().Action(string.Format(@"AdminMC::dbMCSources_OnEventHandler(ID_MC_EVENT={0}) - обработчик события - переопубликация[на дату={1}, кол-во макетов={2}], Аббр={3}, описание={4}..." , id_event.ToString(), dateTarget.ToString(), makets.Count, abbr, taskModes) , Logging.INDEX_MESSAGE.NOT_SET); if (isRequired(dateTarget) == true) { argEventChanged = new EventArgs <Guid> (id_event, dateTarget, makets); } else { Logging.Logg().Debug($"AdminMC::dbMCSources_OnEventHandler(ID_MC_EVENT={id_event.ToString ()}) - дата нового не актуальна; Day=[{dateTarget}], разн.(сутки)=[{difference (dateTarget).TotalDays}]..." , Logging.INDEX_MESSAGE.NOT_SET); } } else if ((id_event == DbMCInterface.ID_EVENT.NEW_PLAN_VALUES) || (id_event == DbMCInterface.ID_EVENT.REQUEST_PLAN_VALUES)) { Modes.NetAccess.EventPlanDataChanged ev = (obj as object []) [1] as Modes.NetAccess.EventPlanDataChanged; DateTime day , version; string pbr_number = string.Empty , id_mc_tec = string.Empty; int id_gate = -1; day = translate(id_event, ev.Day); pbr_number = ev.Type.PlanTypeToString(); version = translate(id_event, ev.Version); id_mc_tec = ev.ClientId; id_gate = ev.IdGate; Logging.Logg().Action(string.Format(@"AdminMC::dbMCSources_OnEventHandler(ID_MC_EVENT={0}) - обработчик события - {6} план[на дату={1}, номер={2}, версия={3}, для подразделения={4}, IdGate={5}]..." , id_event.ToString(), day.ToString(), pbr_number, version.ToString(), id_mc_tec, id_gate , id_event == DbMCInterface.ID_EVENT.NEW_PLAN_VALUES ? "новый" : id_event == DbMCInterface.ID_EVENT.REQUEST_PLAN_VALUES ? "<запрос>" : "НЕ ИЗВЕСТНО") , Logging.INDEX_MESSAGE.NOT_SET); // проверить дату за которую получен новый план: только сегодняшние и следующие сутки сутки if (isRequired(day) == true) { tec = m_list_tec.Find(t => { return(t.name_MC.Trim().Equals(id_mc_tec.ToString())); }); argEventChanged = new EventArgs <FormChangeMode.KeyDevice> (id_event, day, new ReadOnlyCollection <FormChangeMode.KeyDevice> ( allTECComponents.FindAll(comp => { return((comp.IsGTP == true) && (comp.tec.m_id == tec.m_id)); }).ConvertAll(comp => new FormChangeMode.KeyDevice() { Id = comp.m_id, Mode = FormChangeMode.MODE_TECCOMPONENT.GTP }) )); } else { Logging.Logg().Debug($"AdminMC::dbMCSources_OnEventHandler(ID_MC_EVENT={id_event.ToString ()}) - дата не актуальная; Day=[{day}], разн.(сутки)=[{difference (day).TotalDays}]..." , Logging.INDEX_MESSAGE.NOT_SET); } } else { ; } // проверить сфорирован ли аргумент для события // , имеется ли обработчик; иначе из коллекции не смогут быть удалены элементы(удаление только из-вне) // , а значит коллекция увеличивается без ограничений, а элементы никаким образом не обрабатываются if ((Equals(argEventChanged, null) == false) && (isHandlerMCEvent(id_event) == true)) { AddEvent(argEventChanged); } else { ; } } else if (typeof(Tuple <DbMCInterface.EVENT, bool>).IsAssignableFrom(obj.GetType()) == true) { //TODO: ретранслировать для формы произошла подписка/отписка от события Модес-Центра tupleConnectHandler = obj as Tuple <DbMCInterface.EVENT, bool>; _dictNotify [DbMCInterface.ID_EVENT.HANDLER_CONNECT]?.Invoke(this, new EventArgs <bool>(DbMCInterface.TranslateEvent(tupleConnectHandler.Item1), DateTime.MinValue, new ReadOnlyCollection <bool> (new List <bool>() { tupleConnectHandler.Item2 }))); } else if (typeof(bool).IsAssignableFrom(obj.GetType()) == true) { id_event = DbMCInterface.ID_EVENT.Unknown; //TODO: проверить результат попытки установки соединения Logging.Logg().Action($"AdminMC::dbMCSources_OnEventHandler(ID_MC_EVENT={id_event.ToString ()}) - изменение состояния соединения УСТАНОВЛЕНО = {(bool)obj})...", Logging.INDEX_MESSAGE.NOT_SET); switch ((bool)obj == true ? 1 : 0) { case 0: _eventConnected.Reset(); break; case 1: _eventConnected.Set(); FetchEvent(false); break; default: break; } } else { throw new Exception(@"AdminMC::dbMCSources_OnEventHandler () - неизвестное событие от DbMCSources..."); } }
private void FormMainTransMC_EventHandlerConnect(object obj, EventArgs ev) { Action checkStateChanged = delegate() { trans_mc.AdminMC.EventArgs <bool> arg = ev as trans_mc.AdminMC.EventArgs <bool>; ((ToolStripMenuItem)this.СобытияМодесЦентрToolStripMenuItem.DropDownItems.Find(getNameSubToolStripMenuItem(DbMCInterface.TranslateEvent(arg.m_id)), true) [0]) .Checked = arg.m_listParameters [0]; this.СобытияМодесЦентрToolStripMenuItem.Enabled = this.СобытияМодесЦентрToolStripMenuItem.DropDownItems.Cast <ToolStripMenuItem> ().Any(item => item.Checked == true); }; try { if (InvokeRequired == true) { Invoke(checkStateChanged); } else { checkStateChanged(); } } catch (Exception e) { Logging.Logg().Exception(e, $"::FormMainTransMC_EventHandlerConnect () - ...", Logging.INDEX_MESSAGE.NOT_SET); } }