/// <summary> /// Экспортировать события, загрузив их из файла /// </summary> private void ExportEventsFromFile(Exporter exporter, DateTime date) { // загрузка таблицы событий из файла EventTableLight eventTable = new EventTableLight(); EventAdapter eventAdapter = new EventAdapter(); eventAdapter.FileName = ServerUtils.BuildEvFileName(Settings.ArcDir, date); try { eventAdapter.Fill(eventTable); } catch (Exception ex) { log.WriteAction(string.Format(Localization.UseRussian ? "Ошибка при загрузке таблицы событий из файла {0}: {1}" : "Error loading event table from file {0}: {1}", eventAdapter.FileName, ex.Message)); } // добавление событий в очередь экспорта if (eventTable.AllEvents.Count > 0) { foreach (EventTableLight.Event ev in eventTable.AllEvents) { exporter.EnqueueEvent(ev); } log.WriteAction(Localization.UseRussian ? "События добавлены в очередь экспорта" : "Events added to export queue"); } else { log.WriteAction(Localization.UseRussian ? "Отсутствуют события для экспорта" : "No events to export"); } }
/// <summary> /// Начальная обработка дерева XML-документа /// </summary> protected override void StartXmlDocProc() { genDT = DateTime.Now; if (tableView == null) { hourTable = null; } else { AppData.MainData.RefreshData(date, out hourTable); } if (eventOut <= 0) { eventTable = null; } else { AppData.MainData.RefreshEvents(date, out eventTable); } templItemRow = null; templEventRow = null; item = null; eventView = null; }
/// <summary> /// Get a table of events for the day from the cache or from the server /// </summary> /// <remarks>The returned table after loading is not changed by an instance of this class, /// thus, reading its data is thread safe. /// The method always returns a non-null object.</remarks> public EventTableLight GetEventTable(DateTime date) { try { // getting event table from cache date = date.Date; var utcNowDT = DateTime.UtcNow; var cacheItem = EventTableCache.GetOrCreateItem(date, utcNowDT); // blocking access to only one event table lock (cacheItem) { var table = cacheItem.Value; // table to get var tableAge = cacheItem.ValueAge; // table file change time bool tableIsNotValid = utcNowDT - cacheItem.ValueRefrDT > DataValidSpan; // the table might be out of date // getting event table from server if (table == null || tableIsNotValid) { string tableName = EventAdapter.BuildEvTableName(date); var newTableAge = serverComm.ReceiveFileAge(ServerComm.Dirs.Events, tableName); if (newTableAge == DateTime.MinValue) { // the table file does not exist or there is no connection to the server table = null; // do not clog the log //log.WriteError($"Unable to receive modification time of the event table {tableName}"); } else if (newTableAge != tableAge) // table file changed { table = new EventTableLight(); if (serverComm.ReceiveEventTable(tableName, table)) { table.FileModTime = newTableAge; table.LastFillTime = utcNowDT; } else { throw new ScadaException("Unable to receive event table."); } } if (table == null) { table = new EventTableLight(); } // update table in cache EventTableCache.UpdateItem(cacheItem, table, newTableAge, utcNowDT); } return(table); } } catch (Exception ex) { log.WriteException(ex, "Error getting event table for {0} from the cache or from the server", date.ToLocalizedDateString()); return(new EventTableLight()); } }
/// <summary> /// Окончательно обработать дерево XML-документа /// </summary> protected override void FinalXmlDocProc() { // проверка шаблона if (workbook.Worksheets.Count == 0 || eventRowTemplate == null) { throw new Exception(WebPhrases.IncorrectRepTemplate); } // перевод наименования листа workbook.Worksheets[0].Name = TablePhrases.EventsWorksheet; // удаление лишних атрибутов таблицы Table table = eventRowTemplate.ParentTable; table.RemoveTableNodeAttrs(); // удаление строки-шаблона int eventRowIndex = table.Rows.IndexOf(eventRowTemplate); table.RemoveRow(eventRowIndex); // выбор событий EventTableLight tblEvent = dataAccess.DataCache.GetEventTable(date); List <EventTableLight.Event> events = view == null ? tblEvent.AllEvents : tblEvent.GetFilteredEvents(new EventTableLight.EventFilter( EventTableLight.EventFilters.Cnls) { CnlNums = view.CnlSet }); // вывод событий в отчёт DataFormatter dataFormatter = new DataFormatter(); foreach (EventTableLight.Event ev in events) { dispEvent = dataAccess.GetDispEvent(ev, dataFormatter); Row newRow = eventRowTemplate.Clone(); ExcelProc(newRow); table.AppendRow(newRow); } }
/// <summary> /// Loads events from file and adds to the queue. /// </summary> private void ExportEventsFromFile(DateTime minDT, DateTime maxDT) { if (minDT.Date != maxDT.Date) { log.WriteError(Localization.UseRussian ? "Временной диапазон событий должен быть в пределах одних суток" : "The time range of events must be within one day"); return; } string fileName = ServerUtils.BuildEvFileName(arcDir, minDT.Date); if (!File.Exists(fileName)) { log.WriteError(string.Format(CommonPhrases.NamedFileNotFound, fileName)); return; } try { EventTableLight eventTable = new EventTableLight(); EventAdapter eventAdapter = new EventAdapter { FileName = fileName }; eventAdapter.Fill(eventTable); foreach (EventTableLight.Event ev in eventTable.AllEvents) { if (minDT <= ev.DateTime && ev.DateTime <= maxDT) { EnqueueEvent(ev); } } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при загрузке событий из файла {0}" : "Error loading events from file {0}", fileName); } }
public string GetEvents(int year, int month, int day, string cnlNums, int viewID, int lastCount, int startEvNum, long dataAge) { try { UserRights userRights; AppData.CheckLoggedOn(out userRights); // создание фильтра событий HashSet <int> cnlSet = GetCnlSet(cnlNums, viewID, userRights); EventTableLight.EventFilter eventFilter = cnlSet == null ? new EventTableLight.EventFilter(EventTableLight.EventFilters.None) : new EventTableLight.EventFilter(EventTableLight.EventFilters.Cnls); eventFilter.CnlNums = cnlSet; // получение событий DataAccess dataAccess = AppData.DataAccess; DateTime date = new DateTime(year, month, day); EventTableLight tblEvent = dataAccess.DataCache.GetEventTable(date); long newDataAge = WebUtils.DateTimeToJs(tblEvent.FileModTime); DispEvent[] eventsToSend; if (tblEvent.FileModTime > DateTime.MinValue && dataAge < newDataAge) { // применение фильтра событий bool reversed; List <EventTableLight.Event> events = tblEvent.GetFilteredEvents(eventFilter, lastCount, startEvNum, out reversed); // преобразование событий для передачи int evCnt = events.Count; eventsToSend = new DispEvent[evCnt]; if (reversed) { for (int i = 0, j = evCnt - 1; i < evCnt; i++, j--) { eventsToSend[i] = dataAccess.GetDispEvent(events[j], DataFormatter); } } else { for (int i = 0; i < evCnt; i++) { eventsToSend[i] = dataAccess.GetDispEvent(events[i], DataFormatter); } } } else { eventsToSend = new DispEvent[0]; } return(JsSerializer.Serialize(new ArcDTO(eventsToSend, newDataAge))); } catch (Exception ex) { AppData.Log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении событий по фильтру, где каналы={0}, ид. представления={1}" : "Error getting events by the filter where channels={0}, view id={1}", cnlNums, viewID); return(GetErrorDtoJs(ex)); } }
/// <summary> /// Получить таблицу событий за сутки из кэша или от сервера /// </summary> /// <remarks>Возвращаемая таблица после загрузки не изменяется экземпляром данного класса, /// таким образом, чтение её данных является потокобезопасным. /// Метод всегда возвращает объект, не равный null</remarks> public EventTableLight GetEventTable(DateTime date) { try { // получение таблицы событий из кэша date = date.Date; DateTime utcNowDT = DateTime.UtcNow; Cache <DateTime, EventTableLight> .CacheItem cacheItem = EventTableCache.GetOrCreateItem(date, utcNowDT); // блокировка доступа только к одной таблице событий lock (cacheItem) { EventTableLight table = cacheItem.Value; // таблица, которую необходимо получить DateTime tableAge = cacheItem.ValueAge; // время изменения файла таблицы bool tableIsNotValid = utcNowDT - cacheItem.ValueRefrDT > DataValidSpan; // таблица могла устареть // получение таблицы событий от сервера if (table == null || tableIsNotValid) { string tableName = EventAdapter.BuildEvTableName(date); DateTime newTableAge = serverComm.ReceiveFileAge(ServerComm.Dirs.Events, tableName); if (newTableAge == DateTime.MinValue) // файл таблицы не существует или нет связи с сервером { table = null; // не засорять лог /*log.WriteError(string.Format(Localization.UseRussian ? * "Не удалось принять время изменения таблицы событий {0}" : * "Unable to receive modification time of the event table {0}", tableName));*/ } else if (newTableAge != tableAge) // файл таблицы изменён { table = new EventTableLight(); if (serverComm.ReceiveEventTable(tableName, table)) { table.FileModTime = newTableAge; table.LastFillTime = utcNowDT; } else { throw new ScadaException(Localization.UseRussian ? "Не удалось принять таблицу событий." : "Unable to receive event table."); } } if (table == null) { table = new EventTableLight(); } // обновление таблицы в кэше EventTableCache.UpdateItem(cacheItem, table, newTableAge, utcNowDT); } return(table); } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении таблицы событий за {0} из кэша или от сервера" : "Error getting event table for {0} from the cache or from the server", date.ToLocalizedDateString()); return(new EventTableLight()); } }
private int evNum; // номер события protected void Page_Load(object sender, EventArgs e) { appData = AppData.GetAppData(); userData = UserData.GetUserData(); // проверка входа в систему if (!userData.LoggedOn) { throw new ScadaException(WebPhrases.NotLoggedOn); } // скрытие сообщения об ошибке pnlErrMsg.HideAlert(); if (IsPostBack) { evDate = (DateTime)ViewState["EvDate"]; evNum = (int)ViewState["EvNum"]; } else { // перевод веб-страницы Translator.TranslatePage(Page, "Scada.Web.Plugins.Table.WFrmEventAck"); // получение параметров запроса и сохранение во ViewState evDate = Request.QueryString.GetParamAsDate(DateTime.Today); evNum = Request.QueryString.GetParamAsInt("evNum"); ViewState["EvDate"] = evDate; ViewState["EvNum"] = evNum; int viewID = Request.QueryString.GetParamAsInt("viewID"); // получение события EventTableLight tblEvent = appData.DataAccess.DataCache.GetEventTable(evDate); EventTableLight.Event ev = tblEvent.GetEventByNum(evNum); if (ev == null) { pnlErrMsg.ShowAlert(lblEventNotFound); btnSubmit.Enabled = false; } else { // проверка прав EntityRights rights = userData.UserRights.GetUiObjRights(viewID); if (!rights.ViewRight) { throw new ScadaException(CommonPhrases.NoRights); } if (!userData.UserRights.ViewAllRight) { BaseView view = userData.UserViews.GetView(viewID, true); if (!view.ContainsCnl(ev.CnlNum)) { throw new ScadaException(CommonPhrases.NoRights); } } btnSubmit.Visible = pnlTip.Visible = rights.ControlRight && !ev.Checked; // вывод информации по событию pnlInfo.Visible = true; DispEvent dispEvent = appData.DataAccess.GetDispEvent(ev, new DataFormatter()); lblNum.Text = dispEvent.Num.ToString(); lblTime.Text = dispEvent.Time; lblObj.Text = dispEvent.Obj; lblDev.Text = dispEvent.KP; lblCnl.Text = dispEvent.Cnl; lblText.Text = dispEvent.Text; lblAck.Text = dispEvent.Ack; lblAck.CssClass = ev.Checked ? "ack-yes" : "ack-no"; if (ev.Checked && ev.UserID > 0) { string userName = appData.DataAccess.GetUserName(ev.UserID); lblByUser.Text = string.Format(lblByUser.Text, userName); lblByUser.Visible = userName != ""; } if (dispEvent.Color != "") { try { lblNum.ForeColor = lblTime.ForeColor = lblObj.ForeColor = lblDev.ForeColor = lblCnl.ForeColor = lblText.ForeColor = ColorTranslator.FromHtml(dispEvent.Color); } catch { } } } } }