Пример #1
0
        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);
                }
            }
        }
Пример #2
0
        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);
        }