예제 #1
0
 public string ParseDateTime(string s)
 {
     try
     {
         AppData.CheckLoggedOn();
         DateTime dateTime;
         object   data = ScadaUtils.TryParseDateTime(s, out dateTime) ?
                         (object)WebUtils.DateTimeToJs(dateTime) : null;
         return(JsSerializer.Serialize(new DataTransferObject(data)));
     }
     catch (Exception ex)
     {
         AppData.Log.WriteException(ex, Localization.UseRussian ?
                                    "Ошибка при преобразовани строки в число" :
                                    "Error parsing date and time");
         return(GetErrorDtoJs(ex));
     }
 }
예제 #2
0
        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));
            }
        }
예제 #3
0
        /// <summary>
        /// Получить часовые данные входных каналов
        /// </summary>
        private HourCnlData[] GetHourCnlDataArr(int year, int month, int day,
                                                int startHour, int endHour, IList <int> cnlList, bool existing, ref long[] dataAgeArr)
        {
            if (startHour > endHour)
            {
                throw new ArgumentException("Start hour must be less or equal than end hour.");
            }

            DataAccess dataAccess = AppData.DataAccess;
            DataCache  dataCache  = dataAccess.DataCache;

            DateTime date      = new DateTime(year, month, day);
            DateTime startDT   = date.AddHours(startHour);
            DateTime startDate = startDT.Date;
            DateTime endDT     = date.AddHours(endHour);
            DateTime endDate   = endDT.Date;
            int      hourCnt   = endHour - startHour + 1;
            int      dayCnt    = (int)(endDate - startDate).TotalDays + 1;

            List <HourCnlData> hourCnlDataList = new List <HourCnlData>(hourCnt);

            long[]   newDataAgeArr = new long[dayCnt];
            DateTime nowDT         = DateTime.Now;
            DateTime curDate       = startDate;

            for (int dayInd = 0; dayInd < dayCnt; dayInd++)
            {
                SrezTableLight tblHour     = dataCache.GetHourTable(curDate);
                long           newDataAge  = WebUtils.DateTimeToJs(tblHour.FileModTime);
                long           prevDataAge = dayInd < dataAgeArr.Length ? dataAgeArr[dayInd] : 0;
                bool           modified    = prevDataAge <= 0 || prevDataAge < newDataAge;
                newDataAgeArr[dayInd] = newDataAge;
                DateTime nextDate = curDate.AddDays(1.0);

                if (existing)
                {
                    // получение всех существующих часовых срезов
                    DateTime dayStartDT = curDate > startDate ? curDate : startDT;
                    DateTime dayEndDT   = curDate < endDate ? nextDate : endDT;

                    foreach (SrezTableLight.Srez snapshot in tblHour.SrezList.Values)
                    {
                        DateTime snapshotDT = snapshot.DateTime;
                        if (dayStartDT <= snapshotDT && snapshotDT <= dayEndDT)
                        {
                            double hour = (snapshotDT - date).TotalHours;
                            if (modified)
                            {
                                AppendHourCnlData(hourCnlDataList, hour, cnlList, snapshot, snapshotDT, nowDT);
                            }
                            else
                            {
                                AppendEmptyHourCnlData(hourCnlDataList, hour);
                            }
                        }
                    }
                }
                else
                {
                    // заполнение данных по целым часам
                    int dayStartHour = curDate > startDate ? 0 : startDT.Hour;
                    int dayEndHour   = curDate < endDate ? 23 : endDT.Hour;

                    for (int dayHour = dayStartHour; dayHour <= dayEndHour; dayHour++)
                    {
                        DateTime            snapshotDT = curDate.AddHours(dayHour);
                        SrezTableLight.Srez snapshot;
                        tblHour.SrezList.TryGetValue(snapshotDT, out snapshot);
                        double hour = (snapshotDT - date).TotalHours;
                        if (modified)
                        {
                            AppendHourCnlData(hourCnlDataList, hour, cnlList, snapshot, snapshotDT, nowDT);
                        }
                        else
                        {
                            AppendEmptyHourCnlData(hourCnlDataList, hour);
                        }
                    }
                }

                curDate = nextDate;
            }

            dataAgeArr = newDataAgeArr;
            return(hourCnlDataList.ToArray());
        }