/// <summary> /// Пишем в коллекцию с экземплярами класса OneRecord. А потом за раз коллекцию превратим в апдейты таблицы базы и выполним. /// Привязка к id станции! Если в API id поменяют - будет неверно работать! /// </summary> public void WritePlanValue(int iStationId, DateTime DT, string sPBRnum, Params PAR, double dGenValue) { KeyTECComponent key = m_listKeyTECComponent.Find(k => !(k.MCentreId.IndexOf(iStationId) < 0)); if (Equals(key, null) == false) { //OneRecord HVCrecord = null; HTECComponentsRecord HVCrecord = null; if (HourlyValuesCollection == null) { //HourlyValuesCollection = new SortedList<DateTime, OneRecord>(50); HourlyValuesCollection = new SortedList <DateTime, HTECComponentsRecord>(50); } else { ; } //А может здесь из базы читать предыдущие значения в коллекцию? Нет. Данные из базы здесь не нужны. /*OneField OFthis = HourlyFieldValues.First(item => item.Key == DT && item.Value.sFieldName == PAR.ToString()).Value; //Не верно, но тема такая * if (OFthis == null) OFthis = new OneField();*/ if (HourlyValuesCollection.ContainsKey(DT)) { HVCrecord = HourlyValuesCollection.First(item => item.Key == DT).Value; } else { ; } if (HVCrecord == null) { //HVCrecord = new OneRecord(); HVCrecord = new HTECComponentsRecord(key.MCentreId); HVCrecord.date_time = DT; HVCrecord.parent = this; HourlyValuesCollection.Add(DT, HVCrecord); //После добавления можно продолжать модифицировать экземпляр класса - в коллекции та же самая ссылка хранится. } else { ; } HVCrecord.wr_date_time = DateTime.Now; HVCrecord.PBR_number = sPBRnum; HVCrecord.SetValues(iStationId, PAR, dGenValue); } else { ; //Такого ГТП (с ном. 'iStationId' не найдено) } }
/// <summary> /// Создаёт "получасовку" по среднему арифметическому между часовыми показателями. /// </summary> private void GenerateHalfHourValues(HTECComponentsRecord HVCrec, DateTime dtMskNow) { List <int> listIds = HVCrec.m_srtlist_ppbr.Keys.ToList(); //OneRecord HVClast_rec = HourlyValuesCollection.Last().Value; HTECComponentsRecord HVCprev_rec; HTECComponentsRecord HVChalf_hour = new HTECComponentsRecord(listIds); //DateTime dtMskNow = TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time")); if (HVCrec.date_time.AddHours(-1) <= dtMskNow) { //Показания в прошлом читаем из базы, из API игнорируем (могут отличаться) HVCprev_rec = new HTECComponentsRecord(listIds); HVCprev_rec.parent = this; HVCprev_rec.ReadFromDatabase(HVCrec.date_time.AddHours(-1)); } else { HVCprev_rec = HourlyValuesCollection.First(item => item.Key == HVCrec.date_time.AddHours(-1)).Value; //Вынимаем из коллекции показания предыдущего (по отношению к выбранному) часа } if (HVCrec.date_time > new DateTime() && HVCprev_rec.date_time > new DateTime()) //Если время в экземплярах классов проставлено - считаем, что данные есть. { HVChalf_hour.date_time = HVCrec.date_time.AddMinutes(-30); HVChalf_hour.parent = this; HVChalf_hour.PBR_number = HVCrec.PBR_number; HVChalf_hour.wr_date_time = DateTime.Now; int i = -1; Params j; for (i = 0; i < listIds.Count; i++) { for (j = Params.PBR; j < Params.COUNT_PARAMS; j++) { //Интерполируем средними арифметическими значениями от соседних часов HVChalf_hour.m_srtlist_ppbr[listIds[i]][(int)j] = (HVCrec.m_srtlist_ppbr[listIds[i]][(int)j].GetValueOrDefault(0) + HVCprev_rec.m_srtlist_ppbr[listIds[i]][(int)j].GetValueOrDefault(0)) / 2; } } HourlyValuesCollection.Add(HVChalf_hour.date_time, HVChalf_hour); } else { ; } }