/// <summary>
        /// Индекс значения результата
        /// </summary>
        /// <returns></returns>
        public double ИндексЗначения(IHierarchyChannelID id, int halfHourIndx, enumTimeDiscreteType discreteType)
        {
            if (halfHourIndx == 0)
            {
                return(0);
            }

            if (discreteType == enumTimeDiscreteType.DBHalfHours)
            {
                return(halfHourIndx);
            }
            if (discreteType == enumTimeDiscreteType.DBHours)
            {
                if (halfHourIndx % 2 != 0)
                {
                    return(0);
                }
                return(halfHourIndx / 2);
            }
            if (discreteType == enumTimeDiscreteType.DB24Hour)
            {
                if (halfHourIndx % 24 != 0)
                {
                    return(0);
                }
                return(halfHourIndx / 24);
            }
            return(1);
        }
Exemple #2
0
        public TArchiveHierObjectPeriod(IHierarchyChannelID id, DateTime dtStart, DateTime dtEnd, List <Servers.Calculation.DBAccess.Interface.Data.TVALUES_DB> vals, enumTimeDiscreteType discreteType,
                                        string timeZoneId, IMyListConverters _myListConverters)
        {
            Id      = id;
            DtStart = dtStart;
            DtEnd   = dtEnd;
            var indx = 0;

            Vals = new List <ArchiveHierObjectPeriodValue>();
            foreach (var dt in _myListConverters.GetDateTimeListForPeriod(dtStart, dtEnd,
                                                                          discreteType, timeZoneId.GeTimeZoneInfoById()))
            {
                Vals.Add(new ArchiveHierObjectPeriodValue
                {
                    Year  = dt.Year,
                    Month = dt.Month,
                    Day   = dt.Day,
                    Hour  = dt.Hour,
                    Val   = vals.ElementAtOrDefault(indx++),
                });
            }
            DiscreteType = discreteType;
        }
        /// <summary>
        /// Результат прекалькуляции
        /// </summary>
        /// <returns></returns>
        public TVALUES_DB GetArchive(IHierarchyChannelID id, int halfHourIndx, enumTimeDiscreteType discreteType, List <Servers.Calculation.DBAccess.Interface.Data.TVALUES_DB> requestedArchives)
        {
            if (!_isRequestArchives)
            {
                return(null);
            }

            List <ArchiveHierObjectPeriodValue> allPeriodArchive = null;

            if (_precalculateArchives.Count > 0)
            {
                var cashedArchives = _precalculateArchives.FirstOrDefault(a => a.Id.Equals(id) && a.DiscreteType == discreteType);
                if (cashedArchives != null)
                {
                    allPeriodArchive = cashedArchives.Vals;
                }
            }

            if (allPeriodArchive == null)
            {
                DateTime dtStart, dtEnd; //Период в рамках которого нужны данные по указанной точке
                switch (discreteType)
                {
                case enumTimeDiscreteType.DB24Hour:    //нужны посуточные данные
                    dtStart = _dtClientStart.Date;     //округляем до начала суток клиента
                    dtEnd   = new DateTime(_dtClientEnd.Year, _dtClientEnd.Month, _dtClientEnd.Day, 23, 30, 0);
                    break;

                case enumTimeDiscreteType.DBMonth:                                                                 //нужны данные по месяцам
                    dtStart = new DateTime(_dtClientStart.Year, _dtClientStart.Month, 1);                          //округляем до начала месяца клиента
                    dtEnd   = new DateTime(_dtClientEnd.Year, _dtClientEnd.Month, 1).AddMonths(1).AddMinutes(-30); //Округляем до окончания месяца
                    break;

                default:
                    //В остальных случаях границы периода не расширяем
                    dtStart = _dtClientStart;
                    dtEnd   = _dtClientEnd;
                    break;
                }


                //смотрим нужно ли запрашивать в архим
                if (requestedArchives != null && dtStart == _dtClientStart && dtEnd == _dtClientEnd)
                {
                    var archives      = _myListConverters.ConvertHalfHoursToOtherList(discreteType, requestedArchives, _dtClientStart, _dtClientEnd, _timeZoneId);
                    var objectArchive = new TArchiveHierObjectPeriod(id, dtStart, dtEnd, archives, discreteType, _timeZoneId, _myListConverters);
                    allPeriodArchive = objectArchive.Vals;
                    if (_precalculateArchives != null)
                    {
                        _precalculateArchives.Add(objectArchive);
                    }
                }
                else
                {
                    IArchivesHierObject archives = new ArchivesHierObjectProvider(new List <IHierarchyChannelID> {
                        id
                    }, true, dtStart, dtEnd, _dataSourceType,
                                                                                  discreteType, EnumUnitDigit.None, _isReadCalculatedValues, _timeZoneId);

                    if (archives.Errors.Length > 0)
                    {
                        Errors.Append(archives.Errors);
                    }

                    if (archives.result_Values != null && archives.result_Values.Count > 0)
                    {
                        var values        = archives.result_Values.FirstOrDefault().Value;
                        var objectArchive = new TArchiveHierObjectPeriod(id, dtStart, dtEnd, values, discreteType, _timeZoneId, _myListConverters);
                        allPeriodArchive = objectArchive.Vals;
                        if (_precalculateArchives != null)
                        {
                            _precalculateArchives.Add(objectArchive);
                        }
                    }
                }
            }

            if (allPeriodArchive == null)
            {
                return(null);
            }

            ArchiveHierObjectPeriodValue objectPeriodValue;

            if (discreteType == enumTimeDiscreteType.DBInterval)
            {
                objectPeriodValue = allPeriodArchive.FirstOrDefault();
            }
            else
            {
                var dt = _dtServerStart.ServerToUtc().AddMinutes(30 * halfHourIndx).UtcToClient(_timeZoneId);
                //Теперь выбираем нужный период (текущие сутки, текущий месяц) из всего архива
                switch (discreteType)
                {
                case enumTimeDiscreteType.DBMonth:     //нужны данные по месяцам
                    objectPeriodValue = allPeriodArchive.FirstOrDefault(v => v.Year == dt.Year && v.Month == dt.Month);
                    break;

                case enumTimeDiscreteType.DB24Hour:     //нужны посуточные данные
                    objectPeriodValue = allPeriodArchive.FirstOrDefault(v => v.Year == dt.Year && v.Month == dt.Month && v.Day == dt.Day);
                    break;

                default:     //нужны часовые
                    objectPeriodValue = allPeriodArchive.FirstOrDefault(v => v.Year == dt.Year && v.Month == dt.Month && v.Day == dt.Day && v.Hour == dt.Hour);
                    break;
                }
            }
            if (objectPeriodValue != null)
            {
                return(objectPeriodValue.Val);
            }

            return(null);
        }
 /// <summary>
 /// Определяем работала ли точка в расчетном периоде
 /// </summary>
 /// <param name="id">Идентифиуатор объекта</param>
 /// <param name="halfHourIndx">Индекс получасовки</param>
 /// <param name="discreteType">Период дискретизации</param>
 /// <returns></returns>
 public bool ЕслиВключено(IHierarchyChannelID id, int halfHourIndx, enumTimeDiscreteType discreteType)
 {
     return(true);
 }
        /// <summary>
        /// Количество часов в расчетном периоде, которое отработала точка
        /// </summary>
        /// <returns></returns>
        public double Ччи(IHierarchyChannelID id, int halfHourIndx, enumTimeDiscreteType discreteType)
        {
            if (!_isRequestArchives || id == null)
            {
                return(0);
            }

            int tiId;

            if (!int.TryParse(id.ID, out tiId))
            {
                return(0);
            }

            Dictionary <DateTime, double> hoursByHalfhourNumber = null;

            if (_precalculateWorkedPeriod.Count > 0)
            {
                var cashedArchives = _precalculateWorkedPeriod.FirstOrDefault(a => a.TiId == tiId && a.DiscreteType == discreteType);
                if (cashedArchives != null)
                {
                    hoursByHalfhourNumber = cashedArchives.HoursByHalfhourNumber;
                }
            }

            if (hoursByHalfhourNumber == null)
            {
                //Нет в словаре, надо добавить
                DateTime dtStart, dtEnd; //Период в рамках которого нужны данные по указанной точке
                switch (discreteType)
                {
                case enumTimeDiscreteType.DB24Hour:    //нужны посуточные данные
                    dtStart = _dtClientStart.Date;     //округляем до начала суток клиента
                    dtEnd   = new DateTime(_dtClientEnd.Year, _dtClientEnd.Month, _dtClientEnd.Day, 23, 30, 0);
                    break;

                case enumTimeDiscreteType.DBMonth:                                                                 //нужны данные по месяцам
                    dtStart = new DateTime(_dtClientStart.Year, _dtClientStart.Month, 1);                          //округляем до начала месяца клиента
                    dtEnd   = new DateTime(_dtClientEnd.Year, _dtClientEnd.Month, 1).AddMonths(1).AddMinutes(-30); //Округляем до окончания месяца
                    break;

                default:
                    //В остальных случаях границы периода не расширяем
                    dtStart = _dtClientStart;
                    dtEnd   = _dtClientEnd;
                    break;
                }

                var workedPeriodHierObject = new FormulaWorkedPeriodHierObject(tiId, dtStart, dtEnd, discreteType, _timeZoneId, _myListConverters, _dateTimeExtensions, _getNotWorkedPeriodService);
                if (_precalculateWorkedPeriod != null)
                {
                    _precalculateWorkedPeriod.Add(workedPeriodHierObject);
                }
                hoursByHalfhourNumber = workedPeriodHierObject.HoursByHalfhourNumber;
            }

            if (hoursByHalfhourNumber == null)
            {
                return(0);
            }

            //Считаем количество отработанных часов в нужном периоде дискретизвции
            double hours;

            if (discreteType == enumTimeDiscreteType.DBInterval)
            {
                hoursByHalfhourNumber.TryGetValue(_dtClientStart, out hours);
            }
            else
            {
                var dt = _dtServerStart.ServerToUtc().AddMinutes(30 * halfHourIndx).UtcToClient(_timeZoneId);
                //Теперь выбираем нужный период (текущие сутки, текущий месяц) из всего архива
                switch (discreteType)
                {
                case enumTimeDiscreteType.DBMonth:     //нужны данные по месяцам
                    hours = hoursByHalfhourNumber.FirstOrDefault(v => v.Key.Year == dt.Year && v.Key.Month == dt.Month).Value;
                    break;

                case enumTimeDiscreteType.DB24Hour:     //нужны посуточные данные
                    hours = hoursByHalfhourNumber.FirstOrDefault(v => v.Key.Year == dt.Year && v.Key.Month == dt.Month && v.Key.Day == dt.Day).Value;
                    break;

                default:     //нужны часовые
                    hours = hoursByHalfhourNumber.FirstOrDefault(v => v.Key.Year == dt.Year && v.Key.Month == dt.Month && v.Key.Day == dt.Day && v.Key.Hour == dt.Hour).Value;
                    break;
                }
            }

            return(hours);
        }