public void ReadWaterBase(DateTime dateTime_start, DateTime dateTime_end) { var dt_start_local = new DateTime(dateTime_start.Year, dateTime_start.Month, dateTime_start.Day); var dt_end_local = new DateTime(dateTime_end.Year, dateTime_end.Month, dateTime_end.Day); string jsTamplateAdminGroup = "adminGroupsArr.push(new AdminGroup(\"$name\", \"$idgroup\"));\n"; string jsTamplateWaterNode = "arr.push(new WaterNode(\"$nameid\", \"$info\", \"$idgroup\"));\n"; string jsTamplateWatermeter = "arr[arr.length - 1].waterMeters.push(new Watermeter(\"$id\", \"$type\", $startdata, $enddata));\n"; var xmlDocument = new XmlDocument(); xmlDocument.Load("waterMeter_conf.xml"); XmlNodeList Nodes = xmlDocument.SelectNodes("//DataBaseSQL"); if (Nodes.Count > 0) { sqlHandler = new SQLhandler(Nodes[0].Attributes["Database"].Value, Nodes[0].Attributes["DataSource"].Value, Nodes[0].Attributes["UserId"].Value, Nodes[0].Attributes["Password"].Value); TableWatermetersData = Nodes[0].Attributes["tabledata"].Value; TableWatermetersNameLink = Nodes[0].Attributes["tableLinkName"].Value; } else { Console.WriteLine("Отсутствуют данные к подключению к базе!"); return; } // получаем группы водомерных узлов XmlNodeList watermeterunits = xmlDocument.SelectNodes("watermeters/node"); int ComNumOfMeters = xmlDocument.SelectNodes("//watermeter").Count; if (setMaxLevelProgressbar != null) { setMaxLevelProgressbar(ComNumOfMeters); } if (watermeterunits.Count > 0) { string jsString = ""; foreach (XmlNode admingroup in xmlDocument.SelectNodes("watermeters/admin_groups/adgroup")) { jsString += jsTamplateAdminGroup .Replace("$name", admingroup.Attributes["name"].Value) .Replace("$idgroup", admingroup.Attributes["idgroup"].Value); } foreach (XmlNode metersunit in watermeterunits) { jsString += jsTamplateWaterNode .Replace("$nameid", metersunit.Attributes["name"].Value) .Replace("$info", metersunit.Attributes["consumer"].Value) .Replace("$idgroup", metersunit.Attributes["idgroup"].Value); foreach (XmlNode watermeter in metersunit.ChildNodes) { WaterMeterConsumption localmeter = GiveWaterData(watermeter, dt_start_local, dt_end_local); jsString += jsTamplateWatermeter .Replace("$id", localmeter.meterId) .Replace("$type", localmeter.waterType) .Replace("$startdata", localmeter.ConsumptionStartPoint.ToString(CultureInfo.InvariantCulture)) .Replace("$enddata", localmeter.ConsumptionEndPoint.ToString(CultureInfo.InvariantCulture)); if (invokeIncrementProgressbar != null) { invokeIncrementProgressbar(); } } } string rangeStr = String.Format("c {0} по {1}", dateTime_start.ToString("dd.MM.yyyy"), dateTime_end.ToString("dd.MM.yyyy")); string tamplateStr = System.IO.File.ReadAllText(@"tamplates\WaterTamplate.report"); tamplateStr = tamplateStr .Replace("$comment", String.Format("Показания за период {0} <br>Общее количество счетчиков {1}", rangeStr, ComNumOfMeters.ToString())) .Replace("$jscode", jsString); string nameFile = customSavePath ?? @"Reports\" + String.Format("Водосчетчики_за_Период_{0}_", rangeStr) + String.Format("-{0}_{1}_{2}", DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second) + ".html"; System.IO.File.WriteAllText(nameFile, tamplateStr); if (openReportAfter) { System.Diagnostics.Process.Start(nameFile); } } }
private WaterMeterConsumption GiveWaterData(XmlNode watermeter, DateTime dt_start, DateTime dt_end) { /* * Найти сдвиг для конкретной точки * Найти потребление с учетом сдвига в конечной точке * Расчитав относительное потребление за период * получить начальную точку */ #region Функция записи данных Func <XmlNode, string, string> writeValue = (nodes, atr) => { //if (nodes.Count == 0) // return; try { return(nodes.Attributes[atr].Value); } catch (ArgumentException) { return("#error#"); } catch (NullReferenceException) { return("н/д"); } }; #endregion WaterMeterConsumption watermeter_struct = new WaterMeterConsumption(); watermeter_struct.meterId = watermeter.Attributes["snumber"].Value; watermeter_struct.waterType = writeValue(watermeter, "function"); watermeter_struct.waterConsumer = writeValue(watermeter.ParentNode, "consumer"); watermeter_struct.Difference = CalculateWaterConsumption(watermeter_struct.meterId, dt_start, dt_end); double aftercheckpoint = 0; // Подчитаываем сдвиг показаний if (watermeter.ChildNodes != null) { foreach (XmlNode nd in watermeter.ChildNodes) { if (nd.Name == "point") { try { watermeter_struct.watermeterOffset.SetTimePointFromStrings(nd.Attributes["time"].Value, nd.Attributes["data"].Value); } catch (ArgumentException) { } } } string sqlselect = "SELECT mdate.* FROM " + TableWatermetersNameLink + " mlink, " + TableWatermetersData + " mdate where locate('" + watermeter_struct.meterId.ToString() + "', mlink.NameMeter) > 0 and mlink.ChID = mdate.chID and mdate.flagsMask = 0 and mdate.oleDT < " + watermeter_struct.watermeterOffset.TimePoint.ToOADate().ToString(CultureInfo.InvariantCulture) + " order by Id desc limit 1"; DataTable dt = new DataTable(); try { dt = sqlHandler.ReadSqlTable(sqlselect); } catch (Exception e) { Console.WriteLine("Ошибка чтения к базе {0}", e.Message); } if (dt.Rows.Count > 0) { watermeter_struct.watermeterOffset.OffSetFromBase = (float)dt.Rows[0]["Value"]; } // ищем приращение объема , начиная от контрольной точки сдвига aftercheckpoint = CalculateWaterConsumption(watermeter_struct.meterId, watermeter_struct.watermeterOffset.TimePoint, dt_end); watermeter_struct.ConsumptionEndPoint = aftercheckpoint + watermeter_struct.watermeterOffset.Offset; watermeter_struct.ConsumptionStartPoint = watermeter_struct.ConsumptionEndPoint - watermeter_struct.Difference; } return(watermeter_struct); }