protected override int getPPBRValuesResponse(DataTable table, DateTime date) { int iRes = 0; int i = -1, c = -1 //Переменаые цикла , MTermId = -1 //Идентификатор компонента ТЭЦ в системе Модес-Терминал , hour = -1 //Переменаая цикла (номер часа) , indxFactor = -1 //Индекс типа значения (0 - P, 1 - Pmin, 2 - Pmax) //, iMinPBRNumber = -1 , iMaxPBRNumber = -1; INDEX_PLAN_FACTOR j = INDEX_PLAN_FACTOR.Unknown; //Номер ПБР для всех типов (P, Pmin, Pmax) значений int[] arPBRNumber = new int[(int)INDEX_PLAN_FACTOR.COUNT]; DataRow[] hourRows; RDGStruct[,] arRDGValues = null; TECComponent comp = FindTECComponent(CurrentKey) as TECComponent; arRDGValues = new RDGStruct[comp.m_listMTermId.Count, m_curRDGValues.Length]; if (CheckNameFieldsOfTable(table, new string [] { "objName", "idFactor", "Datetime", "Value_MBT" }) == true) { for (c = 0; c < comp.m_listMTermId.Count; c++) { MTermId = comp.m_listMTermId [c]; for (hour = 1; hour < 25; hour++) { try { //Выбрать строки только для часа 'hour' //hourRows = table.Select(@"Datetime='" + date.Date.AddHours(hour + 1 - ts.Hours).ToString(@"yyyyMMdd HH:00:00.000") + @"'"); //hourRows = table.Select(@"Datetime='" + date.Date.AddHours(hour + 1 - ts.Hours) + @"'"); //hourRows = table.Select(@"Datetime=#" + date.Date.AddHours(hour + 1 - ts.Hours).ToString(@"yyyyMMdd HH:00:00.000") + @"#"); hourRows = table.Select(string.Format(@"objName={0} AND Datetime=#{1}#", MTermId, date.Date.AddHours(hour - ASUTP.Core.HDateTime.TS_MSK_OFFSET_OF_UTCTIMEZONE.Hours).ToString(@"yyyy-MM-dd HH:00:00.000"))); //Присвоить исходные для часа значения //PBRNumber = -1; arPBRNumber [(int)INDEX_PLAN_FACTOR.PBR] = arPBRNumber [(int)INDEX_PLAN_FACTOR.Pmin] = arPBRNumber [(int)INDEX_PLAN_FACTOR.Pmax] = -1; // номер набора // значения по типам (0, 1, 2) arRDGValues [c, hour - 1].pbr = -1.0F; arRDGValues [c, hour - 1].pmin = -1.0F; arRDGValues [c, hour - 1].pmax = -1.0F; //ПБР-номер не известен arRDGValues [c, hour - 1].pbr_number = string.Empty; //Проверить количество строк для часа if (hourRows.Length > 0) { //ТОлько при наличии строк для часа 'hour' for (i = 0; i < hourRows.Length; i++) { //Установить тип значения в строке для часа indxFactor = Int32.Parse(hourRows [i] [@"idFactor"].ToString()); //Сравнить номер набора строки с ранее обработанным номером набора (в предыдущих строках) if (!(arPBRNumber [indxFactor] > Int32.Parse(hourRows [i] [@"PBR_NUMBER"].ToString()))) //Толькоо, если номер набора в текущей строке больше //??? номер ПБР назначается для всех 3-х типов значений (P, Pmin, Pmax) // , но номер ПБР индивидуален для КАЖДого из них { arPBRNumber [indxFactor] = Int32.Parse(hourRows [i] [@"PBR_NUMBER"].ToString()); ////Вывод на консоль отладочной информации //for (j = 0; j < hourRows [i].Table.Columns.Count; j ++) { // Console.Write(@"[" + hourRows[i].Table.Columns[j].ColumnName + @"] = " + hourRows[i][hourRows[i].Table.Columns[j].ColumnName] + @"; "); //} //Console.WriteLine(@""); //Присвоить значения в ~ от типа switch (indxFactor) { case 0: //'P' if (!(hourRows [i] [@"Value_MBT"] is DBNull)) { arRDGValues [c, hour - 1].pbr = (double)hourRows [i] [@"Value_MBT"]; } else { arRDGValues [c, hour - 1].pbr = 0; } break; case 1: //'Pmin' if (!(hourRows [i] [@"Value_MBT"] is DBNull)) { arRDGValues [c, hour - 1].pmin = (double)hourRows [i] [@"Value_MBT"]; } else { arRDGValues [c, hour - 1].pmin = 0; } break; case 2: //'Pmax' if (!(hourRows [i] [@"Value_MBT"] is DBNull)) { arRDGValues [c, hour - 1].pmax = (double)hourRows [i] [@"Value_MBT"]; } else { arRDGValues [c, hour - 1].pmax = 0; } break; default: break; } } else { ; } } } else //Если не найдено ни одной строки для часа if (hour > 1) { //Если не 1-ый час - пролонгация arRDGValues [c, hour - 1].pbr = arRDGValues [c, hour - 2].pbr; arRDGValues [c, hour - 1].pmin = arRDGValues [c, hour - 2].pmin; arRDGValues [c, hour - 1].pmax = arRDGValues [c, hour - 2].pmax; for (j = INDEX_PLAN_FACTOR.PBR; j < INDEX_PLAN_FACTOR.COUNT; j++) { arPBRNumber [(int)j] = Int32.Parse(arRDGValues [c, hour - 2].pbr_number.Substring(PBR_PREFIX.Length)); } arRDGValues [c, hour - 1].pbr_number = arRDGValues [c, hour - 2].pbr_number; arRDGValues [c, hour - 1].dtRecUpdate = arRDGValues [c, hour - 2].dtRecUpdate; } else { ; } //iMinPBRNumber = 25; iMaxPBRNumber = -1; for (j = INDEX_PLAN_FACTOR.PBR; j < INDEX_PLAN_FACTOR.COUNT; j++) { if (arPBRNumber [(int)j] > 0) { //???при каком индексе присваивать номер набора //arRDGValues[c, hour - 1].pbr_number = HAdmin.PBR_PREFIX + PBRNumber; //if (iMinPBRNumber > arPBRNumber[(int)j]) if (iMaxPBRNumber < arPBRNumber [(int)j]) { //iMinPBRNumber = arPBRNumber[(int)j]; iMaxPBRNumber = arPBRNumber [(int)j]; } else { ; } if (hour > 1) { switch (j) { case INDEX_PLAN_FACTOR.PBR: if (arRDGValues [c, hour - 1].pbr < 0) { arRDGValues [c, hour - 1].pbr = arRDGValues [c, hour - 2].pbr; } else { ; } break; case INDEX_PLAN_FACTOR.Pmin: if (arRDGValues [c, hour - 1].pmin < 0) { arRDGValues [c, hour - 1].pmin = arRDGValues [c, hour - 2].pmin; } else { ; } break; case INDEX_PLAN_FACTOR.Pmax: if (arRDGValues [c, hour - 1].pmax < 0) { arRDGValues [c, hour - 1].pmax = arRDGValues [c, hour - 2].pmax; } else { ; } break; default: break; } } else { ; } } else { ; //arRDGValues[c, hour - 1].pbr_number = GetPBRNumber (hour); } int hh = -1; for (hh = hour; hh > 0; hh--) { //??? Необходима ИНДИВИДуальная проверка номера ПБР // для каждогоо типа значений (P, Pmin, Pmax) if (arRDGValues [c, hh - 1].pbr_number.Equals(string.Empty) == false) { if (arPBRNumber [(int)j] < Int32.Parse(arRDGValues [c, hh - 1].pbr_number.Substring(PBR_PREFIX.Length))) { arPBRNumber [(int)j] = Int32.Parse(arRDGValues [c, hh - 1].pbr_number.Substring(PBR_PREFIX.Length)); //if (iMinPBRNumber > arPBRNumber[(int)j]) if (iMaxPBRNumber < arPBRNumber [(int)j]) { //iMinPBRNumber = arPBRNumber[(int)j]; iMaxPBRNumber = arPBRNumber [(int)j]; } else { ; } switch (j) { case INDEX_PLAN_FACTOR.PBR: arRDGValues [c, hour - 1].pbr = arRDGValues [c, hh - 1].pbr; break; case INDEX_PLAN_FACTOR.Pmin: arRDGValues [c, hour - 1].pmin = arRDGValues [c, hh - 1].pmin; break; case INDEX_PLAN_FACTOR.Pmax: arRDGValues [c, hour - 1].pmax = arRDGValues [c, hh - 1].pmax; break; default: break; } //arRDGValues[c, hour - 1].pbr_number = arRDGValues[c, hh - 1].pbr_number; //break; } else { ; } } else { ; } } // цикл-окончание hh } // цикл-окончание по индексу типов значений arRDGValues [c, hour - 1].pbr_number = $"{HAdmin.PBR_PREFIX}{iMaxPBRNumber}"; arRDGValues [c, hour - 1].dtRecUpdate = DateTime.MinValue; arRDGValues [c, hour - 1].fc = false; arRDGValues [c, hour - 1].recomendation = 0; arRDGValues [c, hour - 1].deviationPercent = false; arRDGValues [c, hour - 1].deviation = 0; } catch (Exception e) { ASUTP.Logging.Logg().Exception(e, @"AdminMT::GetPPBRValuesResponse () - ...", ASUTP.Logging.INDEX_MESSAGE.NOT_SET); } } // цикл-окончание по номеру часа 'hour' } // цикл-окончание по идентификатору составного элемента (только ГТП3-6 НТЭЦ-5) } else { ASUTP.Logging.Logg().Error($"таблица не содержит необходимый набор полей", ASUTP.Logging.INDEX_MESSAGE.NOT_SET); } for (hour = 1; hour < 25; hour++) { m_curRDGValues[hour - 1].pbr = -1F; m_curRDGValues[hour - 1].pmin = -1F; m_curRDGValues[hour - 1].pmax = -1F; m_curRDGValues[hour - 1].pbr_number = string.Empty; for (c = 0; c < comp.m_listMTermId.Count; c++) { MTermId = comp.m_listMTermId[c]; if (!(arRDGValues[c, hour - 1].pbr < 0)) { // значение есть, необходимо суммировать, установить в "0" if (m_curRDGValues[hour - 1].pbr < 0) { m_curRDGValues[hour - 1].pbr = 0F; } else { ; } // суммируем m_curRDGValues[hour - 1].pbr += arRDGValues[c, hour - 1].pbr; } else { ; } if (!(arRDGValues[c, hour - 1].pmin < 0)) { // значение есть, необходимо суммировать, установить в "0" if (m_curRDGValues[hour - 1].pmin < 0) { m_curRDGValues[hour - 1].pmin = 0F; } else { ; } // суммируем m_curRDGValues[hour - 1].pmin += arRDGValues[c, hour - 1].pmin; } else { ; } if (!(arRDGValues[c, hour - 1].pmax < 0)) { // значение есть, необходимо суммировать, установить в "0" if (m_curRDGValues[hour - 1].pmax < 0) { m_curRDGValues[hour - 1].pmax = 0F; } else { ; } // суммируем m_curRDGValues[hour - 1].pmax += arRDGValues[c, hour - 1].pmax; } else { ; } } // цикл-окончание по идентификатору составного элемента (только ГТП3-6 НТЭЦ-5) //??? m_curRDGValues[hour - 1].pbr_number = arRDGValues[0, hour - 1].pbr_number; //??? m_curRDGValues[hour - 1].dtRecUpdate = DateTime.MinValue; m_curRDGValues[hour - 1].fc = false; m_curRDGValues[hour - 1].recomendation = 0; m_curRDGValues[hour - 1].deviationPercent = false; m_curRDGValues[hour - 1].deviation = 0; } // цикл-окончание по номеру часа 'hour' return(iRes); }
private bool fPPBR(DataTable table, string [] idsInner, DateTime date) { bool bRes = false; Modes.BusinessLogic.IGenObject igo; int i = -1 , idInner = -1; bool valid = false; IList <PlanValueItem> listPVI = null; DataRow [] ppbr_rows = null; string pbr_number = string.Empty , pbr_indx; DateTime dateCurrent; INDEX_PLAN_FACTOR indx_plan_factor = INDEX_PLAN_FACTOR.Unknown; table.Columns.Add("DATE_PBR", typeof(DateTime)); table.Columns.Add("WR_DATE_TIME", typeof(DateTime)); table.Columns.Add(INDEX_PLAN_FACTOR.PBR.ToString(), typeof(double)); table.Columns.Add(INDEX_PLAN_FACTOR.Pmin.ToString(), typeof(double)); table.Columns.Add(INDEX_PLAN_FACTOR.Pmax.ToString(), typeof(double)); table.Columns.Add("PBR_NUMBER", typeof(string)); //table.Columns.Add("ID_COMPONENT", typeof(Int32)); for (i = 0; i < idsInner.Length; i++) { valid = Int32.TryParse(idsInner [i], out idInner); if (valid == false) { continue; } else { ; } igo = delegateFunctionFindIGO(idInner); if (igo == null) { igo = delegateFunctionAddIGO(idInner); } else { ; } if (!(igo == null)) { try { listPVI = _mcApi.GetPlanValuesActual(date.LocalHqToSystemEx(), date.AddDays(1).LocalHqToSystemEx(), igo); bRes = true; } catch (Exception e) { Logging.Logg().Exception(e, string.Format(@"DbMCInterface::GetData () - GetPlanValuesActual () - получение значений для '{0}', [IdInner={1}]..." , igo.Description, igo.IdInner) , Logging.INDEX_MESSAGE.NOT_SET); delegateGetData_OnFillError(new FillErrorEventArgs(table, new object [] { })); bRes = false; } if (bRes == true) { if (listPVI.Count == 0) { Logging.Logg().Warning(string.Format("DbMCInterface::GetData () - GetPlanValuesActual () - нет параметров генерации для '{0}', [ID={1}]..." , igo.Description, igo.IdInner) , Logging.INDEX_MESSAGE.NOT_SET); } else { ; } } else { //ОШИБКА получения значений! break; } foreach (PlanValueItem pvi in listPVI.OrderBy(RRR => RRR.DT)) { //Console.WriteLine (" " + pvi.DT.SystemToLocalHqEx ().ToString () + " " + // pvi.Type.ToString () + " [" + _mcListPFI [pvi.ObjFactor].Description + "] " + // /*it.ObjName это id генерирующего объекта*/ // _mcListPFI [pvi.ObjFactor].Name + " =" + pvi.Value.ToString ()); dateCurrent = pvi.DT.SystemToLocalHqEx(); pbr_number = pvi.Type.ToString().IndexOf(StatisticCommon.HAdmin.PBR_PREFIX) < 0 ? StatisticCommon.HAdmin.PBR_PREFIX + pvi.Type.ToString() : pvi.Type.ToString(); //Получение записи с другими параметрами за это время ////Вариант №1 //if (srtListPPBR.ContainsKey(dateCurrent)) // ppbr = srtListPPBR.First(item => item.Key == dateCurrent).Value; //else // ; //Вариант №2 if (table.Rows.Count > 0) { ppbr_rows = table.Select("DATE_PBR='" + dateCurrent.ToString() + "'"); } else { ; } //Обработка получения записи ////Вариант №1 //if (ppbr == null) //{ // ppbr = new PPBR_Record(); // ppbr.date_time = dateCurrent; // ppbr.wr_date_time = DateTime.Now; // ppbr.PBR_number = pvi.Type.ToString(); // //ppbr.idInner = igo.IdInner; //??? Для TEC5_TG36 2 объекта (TG34 + TG56), т.е. 2 IGO // //После добавления можно продолжать модифицировать экземпляр класса - в коллекции та же самая ссылка хранится. // srtListPPBR.Add(dateCurrent, ppbr); //} //else // ; //Вариант №2, 3 if ((ppbr_rows == null) || (ppbr_rows.Length == 0)) { table.Rows.Add(new object [] { dateCurrent, DateTime.Now, 0F, 0F, 0F, pbr_number /*, igo.IdInner*/ }); ppbr_rows = table.Select($"DATE_PBR='{dateCurrent.ToString ()}'"); } else { ; } ppbr_rows [0] ["PBR_NUMBER"] = pbr_number; indx_plan_factor = (INDEX_PLAN_FACTOR)_mcListPFI [pvi.ObjFactor].Id; switch (indx_plan_factor) { case INDEX_PLAN_FACTOR.PBR: case INDEX_PLAN_FACTOR.Pmin: case INDEX_PLAN_FACTOR.Pmax: pbr_indx = ((INDEX_PLAN_FACTOR)_mcListPFI [pvi.ObjFactor].Id).ToString(); break; default: pbr_indx = string.Empty; break; } if (string.IsNullOrWhiteSpace(pbr_indx) == false) { try { ppbr_rows [0] [pbr_indx] = (double)ppbr_rows [0] [pbr_indx] + pvi.Value; //Вариант №3 } catch (Exception e) { Logging.Logg().Exception(e, $"DbMCInterface::GetData() - тип{ppbr_rows [0] [pbr_indx].GetType ().Name} значения по индексу={indx_plan_factor.ToString()}..." , Logging.INDEX_MESSAGE.NOT_SET); } } else { Logging.Logg().Error(string.Format("DbMCInterface::GetData() - не найден индекс={0} значения ПБР...", _mcListPFI [pvi.ObjFactor].Id) , Logging.INDEX_MESSAGE.NOT_SET); } } // foreach } else { bRes = false; //igo == null } } // for, i return(bRes); }