/// <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); }
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); }