private void OnAdminAlarm_EventReg(TecView obj, TecView.EventRegEventArgs ev) { ALARM_OBJECT alarmObj = null; KeyValuePair <int, int> cKey = new KeyValuePair <int, int> (ev.m_id_gtp, ev.m_id_tg); if (m_dictAlarmObject.ContainsKey(cKey) == false) { alarmObj = new ALARM_OBJECT(ev); m_dictAlarmObject.Add(cKey, alarmObj); //if (m_bDestGUIActivated == true) { m_dictAlarmObject [cKey].state = INDEX_STATES_ALARM.PROCESSED; EventAdd(ev); //} else ; } else { bool bEventRetry = false; if (m_dictAlarmObject[cKey].CONFIRM == false) { bEventRetry = true; } else { if ((m_dictAlarmObject[cKey].dtConfirm - m_dictAlarmObject[cKey].dtReg) > TimeSpan.FromMilliseconds(MSEC_ALARM_EVENTRETRY)) { bEventRetry = true; } else { ; } } if (bEventRetry == true) { m_dictAlarmObject[cKey].dtReg = DateTime.Now; //if (m_bDestGUIActivated == true) { if (m_dictAlarmObject [cKey].state < INDEX_STATES_ALARM.PROCESSED) { m_dictAlarmObject [cKey].state = INDEX_STATES_ALARM.PROCESSED; } else { ; } EventRetry(ev); //} else ; } else { ; } } }
/// <summary> /// Возвратить признак подтверждения события /// по указанным частям составного ключа /// </summary> /// <param name="id_comp">Часть составного ключа: идентификтор компонента ТЭЦ (ГТП, ТГ)</param> /// <param name="dtReg">Часть составного ключа: дата/время регистрации события сигнализаций</param> /// <returns>Результат выполнения операции</returns> public bool IsConfirmed(int id_comp, DateTime dtReg) { bool bRes = false; ALARM_OBJECT objAlarm = find(id_comp, dtReg); if (!(objAlarm == null)) { bRes = objAlarm.CONFIRMED; } else { bRes = false; } return(bRes); }
/// <summary> /// Получить дату/время регистрации события сигнализации для ТГ /// </summary> /// <param name="id_comp">Составная часть ключа: идентификатор ГТП</param> /// <param name="id_tg">Составная часть ключа: идентификатор ТГ</param> /// <returns></returns> public DateTime TGAlarmDatetimeReg(int id_comp, DateTime dtReg) { DateTime dtRes = DateTime.Now; ALARM_OBJECT objAlarm = find(id_comp, dtReg); if (!(objAlarm == null)) { dtRes = objAlarm.FirstDTRegistred; } else { ; } return(dtRes); }
/// <summary> /// Найти объект сигнализации по указанным частям составного ключа /// </summary> /// <param name="id_comp">Составная часть ключа: идентификатор ГТП</param> /// <param name="dtReg">Составная часть ключа: дата/время_регистрации события</param> /// <returns>Объект сигнализации</returns> private ALARM_OBJECT find(int id_comp, DateTime dtReg) { ALARM_OBJECT objRes = null; KeyValuePair <int, DateTime> cKey = new KeyValuePair <int, DateTime>(id_comp, dtReg); //int cKey = id_comp; if (_dictAlarmObject.ContainsKey(cKey) == true) { objRes = _dictAlarmObject[cKey]; } else { Logging.Logg().Error(@"DictAlarmObject::find (id_comp=" + id_comp.ToString() + @") - НЕ НАЙДЕН!", Logging.INDEX_MESSAGE.NOT_SET); } return(objRes); }
/// <summary> /// Установить признак - событие сигнализаций "ожидается подтверждение" /// </summary> /// <param name="id_comp">Часть составного ключа: идентификтор компонента ТЭЦ (ГТП, ТГ)</param> /// <param name="dtReg">Часть составного ключа: дата/время регистрации события сигнализаций</param> /// <returns>Результат выполнения операции</returns> public int Confirming(int id_comp, DateTime dtReg) { int iRes = -1; ALARM_OBJECT objAlarm = find(id_comp, dtReg); if (!(objAlarm == null)) { objAlarm.Confirming(); iRes = 0; } else { ; } return(iRes); }
/// <summary> /// Присвоить объекту по указанным частям составного ключа признак "зафиксирован" /// </summary> /// <param name="id_comp">Часть составного ключа: идентификатор компонента</param> /// <param name="dtReg">Часть составного ключа: идентификатор даты/времени_регистрации</param> /// <param name="dtFixed">Дата/время фиксации события</param> /// <returns>Признак выполнения функции</returns> public int Fixed(int id_comp, DateTime dtReg, DateTime dtFixed) { int iRes = -1; ALARM_OBJECT objAlarm = find(id_comp, dtReg); if (!(objAlarm == null)) { objAlarm.Fixed(dtFixed); iRes = 0; } else { ; } return(iRes); }
/// <summary> /// Найти объект сигнализации по указанным частям составного ключа /// </summary> /// <param name="id_comp">Составная часть ключа: идентификатор ГТП</param> /// <param name="dtReg">Составная часть ключа: дата/время_регистрации события</param> /// <returns>Объект сигнализации</returns> private ALARM_OBJECT find(int id_comp, DateTime dtReg) { ALARM_OBJECT objRes = null; KeyValuePair <int, DateTime> cKey = new KeyValuePair <int, DateTime>(id_comp, dtReg); //int cKey = id_comp; if (_dictAlarmObject.ContainsKey(cKey) == true) { objRes = _dictAlarmObject[cKey]; } else { Logging.Logg().Error(@"DictAlarmObject::find (id_comp=" + id_comp + @", dtReg=" + dtReg.ToString(@"dd.MM.yyyy HH:mm:ss.fffffff", CultureInfo.InvariantCulture) + @") - НЕ НАЙДЕН!", Logging.INDEX_MESSAGE.NOT_SET); } //Console.WriteLine(@"DictAlarmObject::find (id_comp=" + id_comp + @", dtReg=" + dtReg.ToString(@"dd.MM.yyyy HH:mm:ss.fffffff", CultureInfo.InvariantCulture) + @") - " + (objRes == null ? @"НЕ НАЙДЕН!" : @"Ok...")); return(objRes); }
/// <summary> /// Найти объект с указанным иднтификатором (частью составного ключа) /// , если объектов больше, чем 1 - вернуть такой /// , у которого разница текущих дата/времени и дата_регистрации минимальна (самый новый) /// </summary> /// <param name="id_comp">Идентификаторр для поиска</param> /// <returns>РОбъект - результат поиска</returns> private ALARM_OBJECT find(int id_comp) { ALARM_OBJECT objRes = null; List <DateTime> listPartKeys = new List <DateTime> (); //Заполнить список датами_регистрации всех записей для указанного идентификатора foreach (KeyValuePair <int, DateTime> cKey in _dictAlarmObject.Keys) { if (cKey.Key.Equals(id_comp) == true) { listPartKeys.Add(cKey.Value); } else { ; } } //Проверить наличие хотя бы одной записи if (listPartKeys.Count > 0) { listPartKeys.Sort(); //Получить объект по ключу try { objRes = _dictAlarmObject[new KeyValuePair <int, DateTime>(id_comp, listPartKeys.LastOrDefault())]; } catch (Exception e) { Logging.Logg().Exception(e, @"DictAlarmObject::find(id_comp=" + id_comp + @") - ...", Logging.INDEX_MESSAGE.NOT_SET); } } else { ; } return(objRes); }
/// <summary> /// Найти объект сигнализации по указанным частям составного ключа /// </summary> /// <param name="id_comp">Составная часть ключа: идентификатор ГТП</param> /// <param name="dtReg">Составная часть ключа: дата/время_регистрации события</param> /// <returns>Объект сигнализации</returns> private ALARM_OBJECT find(int id_comp, DateTime dtReg) { ALARM_OBJECT objRes = null; KeyValuePair <int, DateTime> cKey = new KeyValuePair <int, DateTime>(id_comp, dtReg); //int cKey = id_comp; if (_dictAlarmObject.ContainsKey(cKey) == true) { objRes = _dictAlarmObject[cKey]; } else { //!!! Предупреждение, т.к. ситуация возникает при вкл./выкл. оповещения // , а в этот моммент словарь не может содержать никаких событий Logging.Logg().Warning(@"DictAlarmObject::find (id_comp=" + id_comp + @", dtReg=" + dtReg.ToString(@"dd.MM.yyyy HH:mm:ss.fffffff", CultureInfo.InvariantCulture) + @") - НЕ НАЙДЕН!" , Logging.INDEX_MESSAGE.NOT_SET); } //Console.WriteLine(@"DictAlarmObject::find (id_comp=" + id_comp + @", dtReg=" + dtReg.ToString(@"dd.MM.yyyy HH:mm:ss.fffffff", CultureInfo.InvariantCulture) + @") - " + (objRes == null ? @"НЕ НАЙДЕН!" : @"Ok...")); return(objRes); }
/// <summary> /// Зарегистрировать событие от БД /// </summary> /// <param name="ev">Аргумент события</param> /// <returns>Результат регистрации (см. пред. обработчик для 'TecViewAlarm.AlarmTecViewEventArgs')</returns> public INDEX_ACTION Registred(AdminAlarm.AlarmDbEventArgs ev, MODE mode) { INDEX_ACTION iRes = INDEX_ACTION.NOTHING; ALARM_OBJECT alarmObj = find(ev.m_id_comp, ev.m_dtRegistred.GetValueOrDefault()); lock (this) { try { if (alarmObj == null) {//Только, если объект события сигнализации НЕ создан // создать объект события сигнализации alarmObj = new ALARM_OBJECT(ev); _dictAlarmObject.Add(new KeyValuePair <int, DateTime>(ev.m_id_comp, ev.m_dtRegistred.GetValueOrDefault()), alarmObj); alarmObj.Fixed(ev.m_dtFixed); alarmObj.Confirmed(ev.m_dtConfirm); if (mode == MODE.ADMIN) { if (alarmObj.IsNotify() == true) { alarmObj.Fixing(); iRes = INDEX_ACTION.NEW; } else { ; } } else { ; } } else { alarmObj.Fixed(ev.m_dtFixed); alarmObj.Confirmed(ev.m_dtConfirm); if (mode == MODE.SERVICE) { //if (alarmObj.CONFIRMED == true) // if (TECComponent.Mode(ev.m_id_comp) == FormChangeMode.MODE_TECCOMPONENT.TG) // iRes = INDEX_ACTION.CONFIRMED_TG; // else // ; //else if (alarmObj.IsAutoConfirming() == true) { // если объект не подтвержден длительное время iRes = INDEX_ACTION.AUTO_CONFIRMING; } else if ((alarmObj.IsAutoFixing(ALARM_OBJECT.INDEX_DATETIME_REGISTRED.LAST) == true) || ((TECComponent.Mode(ev.m_id_comp) == FormChangeMode.MODE_TECCOMPONENT.TG) && (alarmObj.IsAutoFixing(ALARM_OBJECT.INDEX_DATETIME_REGISTRED.FIRST) == true))) { // если объект не зафиксирован длительное время iRes = INDEX_ACTION.AUTO_FIXING; } else { ; } } else if (mode == MODE.ADMIN) { if (alarmObj.IsNotify() == true) { alarmObj.Fixing(); iRes = INDEX_ACTION.RETRY; } else { ; } } else { ; // при 'VIEW' ничего не делать } } } catch (Exception e) { Logging.Logg().Exception(e, @"DictAlarmObject::Registred (" + ev.GetType().Name + @") - ...", Logging.INDEX_MESSAGE.NOT_SET); } } return(iRes); }
/// <summary> /// Зарегистрировать событие в режиме "выполнение_приложения" /// </summary> /// <param name="ev">Аргумент события</param> /// <returns>Результат регистрации (-1 - ошибка, 0 - ничего_не_делать, 1 - новый_объект, 2 - повторное_событие)</returns> public INDEX_ACTION Registred(ref TecViewAlarm.AlarmTecViewEventArgs ev) { INDEX_ACTION iRes = INDEX_ACTION.NOTHING; ALARM_OBJECT alarmObj = null; List <KeyValuePair <int, DateTime> > listToRemoveKeys; lock (this) { try { alarmObj = //find(ev.m_id_comp, ev.m_dtRegistred.GetValueOrDefault()) find(ev.m_id_comp) ; if (alarmObj == null) { //Только, если объект события сигнализации НЕ создан //Сообщить для сохранения в БД iRes = INDEX_ACTION.NEW; } else //Только, если объект события сигнализации создан //Проверить состояние if (alarmObj.CONFIRMED == true) { // если подтверждено - проверить период между датой/временем регистрации события сигнализации и датой/временем его подтверждения if (alarmObj.HISTORY == true) { //Сообщить для сохранения в БД для регистрации нового события сигнализаций для этого же компонента ТЭЦ iRes = INDEX_ACTION.NEW; } else { ; } } else if (alarmObj.RETRY == true) { ev.m_dtRegistred = alarmObj.Retry(ev.m_dtRegistred.GetValueOrDefault()); iRes = INDEX_ACTION.RETRY; } else { ; } if (iRes == INDEX_ACTION.NEW) { //Перед добавлением объекта очистить словарь от "устаревших" объектов //Подготовить список со сложными ключами для удалениями listToRemoveKeys = new List <KeyValuePair <int, DateTime> >(); foreach (KeyValuePair <int, DateTime> cKey in _dictAlarmObject.Keys) { //Проверить признак "устаревания" if ((cKey.Value - DateTime.UtcNow).TotalHours > DEPTH_HOUR_OBJECTALRM) { listToRemoveKeys.Add(cKey); } else { ; } } //Удалить объекты со сложными ключами в списке foreach (KeyValuePair <int, DateTime> cKey in listToRemoveKeys) { _dictAlarmObject.Remove(cKey); } // создать объект события сигнализации _dictAlarmObject.Add(new KeyValuePair <int, DateTime>(ev.m_id_comp, ev.m_dtRegistred.GetValueOrDefault()), new ALARM_OBJECT(ev)); } else { ; } Logging.Logg().Debug(@"DictAlarmObject::Register (id=" + ev.m_id_comp + @", dtReg=" + ev.m_dtRegistred.GetValueOrDefault().ToString() + @") - общее_кол-во_событий: " + _dictAlarmObject.Count , Logging.INDEX_MESSAGE.NOT_SET); } catch (Exception e) { iRes = INDEX_ACTION.ERROR; Logging.Logg().Exception(e, @"DictAlarmObject::Registred (" + ev.GetType().Name + @") - ...", Logging.INDEX_MESSAGE.NOT_SET); } } return(iRes); }
/// <summary> /// Зарегистрировать событие от БД /// </summary> /// <param name="ev">Аргумент события</param> /// <returns>Результат регистрации (см. пред. обработчик для 'TecViewAlarm.AlarmTecViewEventArgs')</returns> public INDEX_ACTION Registred(AdminAlarm.AlarmDbEventArgs ev) { INDEX_ACTION iRes = INDEX_ACTION.NOTHING; ALARM_OBJECT alarmObj = find(ev.m_id_comp, ev.m_dtRegistred.GetValueOrDefault()); lock (this) { try { if (alarmObj == null) {//Только, если объект события сигнализации НЕ создан // создать объект события сигнализации alarmObj = new ALARM_OBJECT(ev); _dictAlarmObject.Add(new KeyValuePair <int, DateTime>(ev.m_id_comp, ev.m_dtRegistred.GetValueOrDefault()), alarmObj); alarmObj.Fixed(ev.m_dtFixed); alarmObj.Confirmed(ev.m_dtConfirm); if (alarmObj.IsNotify() == true) { iRes = INDEX_ACTION.NEW; } else { ; } } else { alarmObj.Fixed(ev.m_dtFixed); alarmObj.Confirmed(ev.m_dtConfirm); if ((alarmObj.CONFIRMED == false) && ((alarmObj.FIXED == true) && ((DateTime.UtcNow - ev.m_dtFixed.GetValueOrDefault()).TotalMilliseconds > AdminAlarm.MSEC_ALARM_EVENTRETRY)) ) { // если объект не подтвержден длительное время iRes = INDEX_ACTION.AUTO_CONFIRMING; } else if ((alarmObj.FIXED == false) && ((DateTime.UtcNow - ev.m_dtRegistred.GetValueOrDefault()).TotalMilliseconds > AdminAlarm.MSEC_ALARM_EVENTRETRY) ) { // если объект не зафиксирован длительное время iRes = INDEX_ACTION.AUTO_FIXING; } else if (alarmObj.IsNotify() == true) { iRes = INDEX_ACTION.RETRY; } else { ; } } } catch (Exception e) { Logging.Logg().Exception(e, Logging.INDEX_MESSAGE.NOT_SET, @"DictAlarmObject::Registred (" + ev.GetType().Name + @") - ..."); } } return(iRes); }