コード例 #1
0
ファイル: ModDBExportLogic.cs プロジェクト: zouliangxl/scada
        /// <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");
            }
        }
コード例 #2
0
ファイル: RepHrEvTable.cs プロジェクト: iyus/scada
        /// <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;
        }
コード例 #3
0
        /// <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());
            }
        }
コード例 #4
0
        /// <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);
            }
        }
コード例 #5
0
        /// <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);
            }
        }
コード例 #6
0
ファイル: ClientApiSvc.cs プロジェクト: hhdang/RapidScada
        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));
            }
        }
コード例 #7
0
        /// <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());
            }
        }
コード例 #8
0
        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 { }
                    }
                }
            }
        }