From 3074b6115e323297f31c93aed42dd0a50b5954cd Mon Sep 17 00:00:00 2001 From: achikhv Date: Fri, 8 Apr 2016 14:43:07 +1000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D1=8B=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AttributesSample/LersSample.csproj | 81 ++++ AttributesSample/LersSample.sln | 26 + AttributesSample/Program.cs | 126 +++++ AttributesSample/Properties/AssemblyInfo.cs | 36 ++ GetDataSample/LersSample.csproj | 60 +++ GetDataSample/LersSample.sln | 20 + GetDataSample/Program.cs | 109 +++++ GetDataSample/Properties/AssemblyInfo.cs | 36 ++ ImportTemperature/ImportTemperature.docx | Bin 0 -> 15679 bytes ImportTemperature/ImportTemperature.ps1 | 405 ++++++++++++++++ KhvAdmDataAdapter/App_Code/Handler.cs | 486 +++++++++++++++++++ KhvAdmDataAdapter/App_Code/Logger.cs | 267 ++++++++++ KhvAdmDataAdapter/KhvAdmDataAdapter.csproj | 85 ++++ KhvAdmDataAdapter/KhvAdmDataAdapter.sln | 28 ++ KhvAdmDataAdapter/Properties/AssemblyInfo.cs | 36 ++ KhvAdmDataAdapter/web.config | 40 ++ README.md | 7 + 17 files changed, 1848 insertions(+) create mode 100644 AttributesSample/LersSample.csproj create mode 100644 AttributesSample/LersSample.sln create mode 100644 AttributesSample/Program.cs create mode 100644 AttributesSample/Properties/AssemblyInfo.cs create mode 100644 GetDataSample/LersSample.csproj create mode 100644 GetDataSample/LersSample.sln create mode 100644 GetDataSample/Program.cs create mode 100644 GetDataSample/Properties/AssemblyInfo.cs create mode 100644 ImportTemperature/ImportTemperature.docx create mode 100644 ImportTemperature/ImportTemperature.ps1 create mode 100644 KhvAdmDataAdapter/App_Code/Handler.cs create mode 100644 KhvAdmDataAdapter/App_Code/Logger.cs create mode 100644 KhvAdmDataAdapter/KhvAdmDataAdapter.csproj create mode 100644 KhvAdmDataAdapter/KhvAdmDataAdapter.sln create mode 100644 KhvAdmDataAdapter/Properties/AssemblyInfo.cs create mode 100644 KhvAdmDataAdapter/web.config diff --git a/AttributesSample/LersSample.csproj b/AttributesSample/LersSample.csproj new file mode 100644 index 0000000..b3e8686 --- /dev/null +++ b/AttributesSample/LersSample.csproj @@ -0,0 +1,81 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {1E9BFBEA-6183-416C-B5EA-C883CD62277E} + Exe + Properties + LersSample + LersSample + v4.0 + Client + 512 + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + false + prompt + false + false + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + false + prompt + + + + False + ..\..\Lers.System\bin\x64\Debug\Lers.System.dll + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AttributesSample/LersSample.sln b/AttributesSample/LersSample.sln new file mode 100644 index 0000000..043b7a5 --- /dev/null +++ b/AttributesSample/LersSample.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LersSample", "LersSample.csproj", "{1E9BFBEA-6183-416C-B5EA-C883CD62277E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1E9BFBEA-6183-416C-B5EA-C883CD62277E}.Debug|x64.ActiveCfg = Debug|x64 + {1E9BFBEA-6183-416C-B5EA-C883CD62277E}.Debug|x64.Build.0 = Debug|x64 + {1E9BFBEA-6183-416C-B5EA-C883CD62277E}.Debug|x86.ActiveCfg = Debug|x86 + {1E9BFBEA-6183-416C-B5EA-C883CD62277E}.Debug|x86.Build.0 = Debug|x86 + {1E9BFBEA-6183-416C-B5EA-C883CD62277E}.Release|x64.ActiveCfg = Release|x86 + {1E9BFBEA-6183-416C-B5EA-C883CD62277E}.Release|x64.Build.0 = Release|x86 + {1E9BFBEA-6183-416C-B5EA-C883CD62277E}.Release|x86.ActiveCfg = Release|x86 + {1E9BFBEA-6183-416C-B5EA-C883CD62277E}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/AttributesSample/Program.cs b/AttributesSample/Program.cs new file mode 100644 index 0000000..fd5e476 --- /dev/null +++ b/AttributesSample/Program.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Security; +using Lers.Core; +using Lers.Data; + +namespace LersSample +{ + class Program + { + static void Main(string[] args) + { + // Создаем экземпляр объекта LersServer, через который осуществляется работа с сервером ЛЭРС УЧЕТ. + + Lers.LersServer server = new Lers.LersServer(); + + // Создаем данные для авторизации в системе (логин и пароль). + + string login = "admin"; + SecureString password = Lers.Networking.SecureStringHelper.ConvertToSecureString("admin"); + + Lers.Networking.BasicAuthenticationInfo authInfo = new Lers.Networking.BasicAuthenticationInfo(login, password); + + // Выполняем подключение к серверу, указывая имя компьютера и TCP-порт, а так же данные для авторизации. + + try + { + server.Connect("localhost", 10000, authInfo); + } + catch (Exception exc) + { + Console.WriteLine("Ошибка подключения к серверу.\r\n" + exc.Message); + Console.Read(); + return; + } + + Console.WriteLine("Версия сервера: " + server.Version.ToString()); + + // Получаем объект учета по уникальному номеру, который задается в свойствах объекта учета. + // Указываем через флаг, что нам нужны атрибуты и системы объекта учета. + Node node = server.Nodes.GetByNumber(1232, NodeInfoFlags.Attributes | NodeInfoFlags.Systems); + + // Убеждаемся, что мы получили указатель на объект Node. + // Если объект учета с таким номером не существует или он недоступна для текущего пользовтеля, то метод GetByNumber() вернет null. + + if (node != null) + { + // Выводим наименование Объекта учета. + + Console.WriteLine("Объект учета \'{0}\'", node.Title); + + MeasurePoint[] measurePoints = node.Systems.HotWater.MeasurePoints.ToArray(); + + // Запрашиваем данные о суточном потреблении гвс за двое суток. + + MeasurePointConsumptionRecord[] consumption1 = measurePoints[0].Data.GetConsumption(DateTime.Today.AddDays(-1), DateTime.Today, Lers.Data.DeviceDataType.Day).ToArray(); + + MeasurePointConsumptionRecord[] consumption2 = measurePoints[1].Data.GetConsumption(DateTime.Today.AddDays(-1), DateTime.Today, Lers.Data.DeviceDataType.Day).ToArray(); + + string scheme = (string)node.Attributes["схема"]; + + MeasurePointConsumptionRecord[] consumption = new MeasurePointConsumptionRecord[consumption1.Length]; + + switch (scheme) + { + // Первая схема измерения + case "1": + + // Здесь реализуем расчет по схеме измерения, например складываем потребления по двум точкам учета. + + for (int i = 0; i < consumption1.Length; i++) + { + MeasurePointConsumptionRecordWater record = new MeasurePointConsumptionRecordWater(consumption1[i].DateTime); + + record.M_in = ((MeasurePointConsumptionRecordWater)consumption1[i]).M_in + ((MeasurePointConsumptionRecordWater)consumption2[i]).M_in; + record.M_out = ((MeasurePointConsumptionRecordWater)consumption1[i]).M_out + ((MeasurePointConsumptionRecordWater)consumption2[i]).M_out; + + consumption[i] = record; + } + + break; + + // Вторая схема измерения + case "2": + + // Здесь реализуем расчет по схеме измерения, например вычисляем разницу потребления по двум точкам учета. + + for (int i = 0; i < consumption1.Length; i++) + { + MeasurePointConsumptionRecordWater record = new MeasurePointConsumptionRecordWater(consumption1[i].DateTime); + + record.M_in = ((MeasurePointConsumptionRecordWater)consumption1[i]).M_in - ((MeasurePointConsumptionRecordWater)consumption2[i]).M_in; + record.M_out = ((MeasurePointConsumptionRecordWater)consumption1[i]).M_out - ((MeasurePointConsumptionRecordWater)consumption2[i]).M_out; + + consumption[i] = record; + } + + break; + + default: + throw new Exception("Неподдерживаемый номер схемы измерения."); + } + + // Выводим данные на экран. + + foreach (MeasurePointConsumptionRecordWater recordWater in consumption) + { + Console.WriteLine("{0}: M1 = {1}, M2 = {2}", recordWater.DateTime, recordWater.M_in, recordWater.M_out); + } + } + else + { + Console.WriteLine("Объект учета не существует или недоступен для данной учетной записи."); + } + + Console.ReadLine(); + + // Отключаемся от сервера. + // Указываем таймаут 2 секунды на нормальное завершение сеанса, после выхода которого, соединение будет разорвано. + + server.Disconnect(2000); + } + } +} diff --git a/AttributesSample/Properties/AssemblyInfo.cs b/AttributesSample/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..49ac514 --- /dev/null +++ b/AttributesSample/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("LersSample")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("LersSample")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6a23aa78-7b98-4b51-bad6-69ea6363f58c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/GetDataSample/LersSample.csproj b/GetDataSample/LersSample.csproj new file mode 100644 index 0000000..bc881c9 --- /dev/null +++ b/GetDataSample/LersSample.csproj @@ -0,0 +1,60 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {1E9BFBEA-6183-416C-B5EA-C883CD62277E} + Exe + Properties + LersSample + LersSample + v4.0 + Client + 512 + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\..\Lers.System\bin\x86\Release\Lers.System.dll + + + + + + + + + + + + + + \ No newline at end of file diff --git a/GetDataSample/LersSample.sln b/GetDataSample/LersSample.sln new file mode 100644 index 0000000..60a22e3 --- /dev/null +++ b/GetDataSample/LersSample.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LersSample", "LersSample.csproj", "{1E9BFBEA-6183-416C-B5EA-C883CD62277E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1E9BFBEA-6183-416C-B5EA-C883CD62277E}.Debug|x86.ActiveCfg = Debug|x86 + {1E9BFBEA-6183-416C-B5EA-C883CD62277E}.Debug|x86.Build.0 = Debug|x86 + {1E9BFBEA-6183-416C-B5EA-C883CD62277E}.Release|x86.ActiveCfg = Release|x86 + {1E9BFBEA-6183-416C-B5EA-C883CD62277E}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/GetDataSample/Program.cs b/GetDataSample/Program.cs new file mode 100644 index 0000000..e13939c --- /dev/null +++ b/GetDataSample/Program.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Security; +using Lers.Core; +using Lers.Data; + +namespace LersSample +{ + class Program + { + static void Main(string[] args) + { + // Создаем экземпляр объекта LersServer, через который осуществляется работа с сервером ЛЭРС УЧЕТ. + + Lers.LersServer server = new Lers.LersServer(); + + // Создаем данные для авторизации в системе (логин и пароль). + + string login = "Admin"; + SecureString password = Lers.Networking.SecureStringHelper.ConvertToSecureString("admin"); + + Lers.Networking.BasicAuthenticationInfo authInfo = new Lers.Networking.BasicAuthenticationInfo(login, password); + + // Выполняем подключение к серверу, указывая имя компьютера и TCP-порт, а так же данные для авторизации. + + try + { + server.Connect("localhost", 10000, authInfo); + } + catch (Exception exc) + { + Console.WriteLine("Ошибка подключения к серверу.\r\n" + exc.Message); + Console.Read(); + return; + } + + Console.WriteLine("Версия сервера: " + server.Version.ToString()); + + // Получаем точку учета по уникальному номеру, который задается в свойствах точки учета. + + MeasurePoint measurePoint = server.MeasurePoints.GetByNumber(123); + + // Убеждаемся, что мы получили указатель на объект MeasurePoint. + // Если точки учета с таким номером не существует или она недоступна для текущего пользовтеля, то метод GetByNumber() вернет null. + + if (measurePoint != null) + { + // Выводим полное наименование точки учета. + + Console.WriteLine("Точка учета \'{0}\'", measurePoint.FullTitle); + + if (measurePoint.SystemType != SystemType.Gas) + { + Console.WriteLine("Точка учета должна иметь систему Газонабжение."); + Console.Read(); + return; + } + + // Сохраняем суточные данные о потреблении по точке учета. + // Чтобы сохранить данные по воде, используйте Lers.Data.WaterConsumptionRecord, по электроэнергии - Lers.Data.ElectricConsumptionRecord. + + MeasurePointConsumptionRecordCollection data = new MeasurePointConsumptionRecordCollection(DeviceDataType.Day); + + MeasurePointConsumptionRecordGas record = new MeasurePointConsumptionRecordGas(DateTime.Today.AddDays(-1)); // За вчерашние сутки + record.V = 100; // Объем газа + record.T = 20; // Температура газа + + data.Add(record); + + MeasurePointConsumptionRecordGas record2 = new Lers.Data.MeasurePointConsumptionRecordGas(DateTime.Today); // За сегодняшние сутки + record2.V = 80; // Объем газа + record2.T = 15; // Температура газа + + data.Add(record2); + + // Устанавливаем флаг для перезаписи существующих данных и сохраняем данные. + + MeasurePointSetConsumptionOptions options = new MeasurePointSetConsumptionOptions(); + options.OverwriteExistingRecords = true; + + measurePoint.Data.SetConsumption(data, options); + + // Запрашиваем данные о суточном потреблении газа за двое суток. + + MeasurePointConsumptionRecordCollection consumption = measurePoint.Data.GetConsumption(DateTime.Today.AddDays(-1), DateTime.Today, Lers.Data.DeviceDataType.Day); + + // Выводим данные на экран. + + foreach (MeasurePointConsumptionRecordGas recordGas in consumption) + { + Console.WriteLine("{0}: V = {1}, T = {2}", recordGas.DateTime, recordGas.V, recordGas.T); + } + } + else + { + Console.WriteLine("Точка учета не существует или недоступна для данной учетной записи."); + } + + Console.ReadLine(); + + // Отключаемся от сервера. + // Указываем таймаут 2 секунды на нормальное завершение сеанса, после выхода которого, соединение будет разорвано. + + server.Disconnect(2000); + } + } +} diff --git a/GetDataSample/Properties/AssemblyInfo.cs b/GetDataSample/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..49ac514 --- /dev/null +++ b/GetDataSample/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("LersSample")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("LersSample")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6a23aa78-7b98-4b51-bad6-69ea6363f58c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ImportTemperature/ImportTemperature.docx b/ImportTemperature/ImportTemperature.docx new file mode 100644 index 0000000000000000000000000000000000000000..476d6c871c82b7b498c9b6c790f3070e01f6044e GIT binary patch literal 15679 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 literal 0 HcmV?d00001 diff --git a/ImportTemperature/ImportTemperature.ps1 b/ImportTemperature/ImportTemperature.ps1 new file mode 100644 index 0000000..ec4626f --- /dev/null +++ b/ImportTemperature/ImportTemperature.ps1 @@ -0,0 +1,405 @@ + + ######################################################################## + # Настройки + ######################################################################## + + # путь к фреймворку ЛЭРС УЧЕТ + $LersFrameworkPath = "C:\Program Files\LERS\Common\Framework\bin\Lers.System.dll" + + # Адрес сервера приложения + $ServerAddress = 'localhost' + + # Порт сервера приложения + $ServerPort = 10000 + + # Имя входа/пароль для подключения к Серверу + $Login = 'login' + $PassWord = 'password' + + # адрес ресурса + $url = 'http://www.pogoda.ru.net/monitor.php' + + # регулярное выражение, для нахождения url адреса заданного города + # Хабаровск + $regExpressionCityFirst = '(?i:' + $regExpressionCitySecond = ')' + + # регулярное выражение для поиска среднесуточной температуры + # 5-21.0-15.1 + $regExpressionTemperatureFirst = '(?i:' + $regExpressionTemperatureSecond = '\s*[\d\.\-\+]+\s*([\d\.\-\+]+))' + + ################################################################## + # Подключаемые типы + ################################################################## + + try + { + # подключаем фреймворк + add-type -path $LersFrameworkPath + } + catch + { + write-host 'Ошибка. Не удалось загрузить файл Lers.System.dll. Проверьте правильность расположения файла. ' + $Error[0].Exception.Message + exit + } + + ######################################################################## + # Функции + ######################################################################## + + # Проверяет заданы ли параметры настройки скрипта + Function CheckParameters($url, $ServerAddress, $ServerPort, $Login, $PassWord) + { + try + { + if ($url -eq '') + { + throw new-object Exception('Адрес сайта мониторинга погоды не задан.') + } + + if ($ServerAddress -eq '') + { + throw new-object Exception('Адрес сервера ЛЭРС УЧЕТ не задан.') + } + + if (($ServerPort -eq $null) -or ($ServerPort -eq 0) -or ($ServerPort -eq '')) + { + throw new-object Exception('Порт сервера ЛЭРС УЧЕТ не задан.') + } + + if ($Login -eq '') + { + throw new-object Exception('Имя входа в ЛЭРС УЧЕТ не задано.') + } + + if ($PassWord -eq '') + { + throw new-object Exception('Пароль для входа в ЛЭРС УЧЕТ не задан.') + } + } + catch + { + throw new-object Exception('Параметры скрипта не настроены. ', $Error[0].Exception) + } + } + + ################################################################## + + # возвращает содержимое html страницы по адресу url ввиде строки + Function Get-WwwString([string]$url, [string]$Encoding = "windows-1251") + { + try + { + # создаем web client + $wc = new-object System.Net.WebClient + + # устанавливаем кодировку + $wc.Encoding = [System.Text.Encoding]::GetEncoding($Encoding) + + # возвращаем html страницу ввиде строки + return $wc.DownloadString($url) + } + catch + { + throw new-object Exception('Не удалось загрузить html страницу по адресу ' + $url + '.', $Error[0].Exception) + } + } + + ################################################################## + + # возращает описание исключений + Function GetFullExceptionMessage([Exception]$exc) + { + if($exc -eq $null) + { + return '' + } + + $msg = $exc.Message + + if ($exc.InnerException -ne $null) + { + $mes = GetFullExceptionMessage $exc.InnerException + $msg = $msg + ' ' + $mes + } + + return $msg + } + + ########################################################################## + + # возвращает url адрес на страницу заданного города + # $reply - содержимое html страницы ввиде строки + # $gorod - имя города + # $url - адрес страницы мониторинга погоды + Function Get-CityUrl($reply, $gorod, $url) + { + try + { + # регулярное выражение, для нахождения url адреса заданного города + # Хабаровск + [regex]$reg = $regExpressionCityFirst + $gorod + $regExpressionCitySecond + $match = $reg.match($reply) + + if(!$match.Success) + { + throw new-object Exception(' Url страницы не найден.') + } + + # формируем ссылку на страницу + $uri = new-object Uri ($url) + $urlCity = $match.Groups[1].value + $urlCity = 'http://' + $uri.Host + '/' + $urlCity + + return $urlCity + } + catch + { + throw new-object Exception('Не удалось получить ссылку на страницу города - ' + $gorod + '.', $Error[0].Exception) + } + } + + ########################################################################## + + # возвращает хеш-таблицу среднесуточной температуры наружного воздуха за указанный период времени + # dateFrom - дата начало периода + # dateTo - дата окончания периода + # link - url города + Function Get-CityTemperature($dateFrom, $dateTo, $link) + { + try + { + $today = [DateTime]::Today + if($dateFrom -gt $today) + { + throw new-object Exception('Дата начала периода превышает текущую.') + } + + if($dateFrom -gt $dateTo) + { + throw new-object Exception('Дата начала периода больше даты окончания.') + } + + if($dateTo -gt $today) + { + $dateTo = $today + } + + # хеш таблица для хранения среднесуточных значениий температур по дате + $TempTable = @{} + + # месяц, за который загружается html-страница с темпераиурами + $month = 0 + + # html страница + [void][string]$html + + while ($dateFrom -le $dateTo) + { + if ($dateFrom.Month -ne $month) + { + $month = $dateFrom.Month + + # ссылка на страницу за указанный месяц и год + $ref = $link + '&month=' + $dateFrom.Month + '&year=' + $dateFrom.Year + + # загружаем html страницу заданного месяца и года + $html = Get-WwwString $ref + } + + # регулярное выражение для поиска среднесуточной температуры + # 5-21.0-15.1 + [regex]$reg = $regExpressionTemperatureFirst + $dateFrom.Day + $regExpressionTemperatureSecond + $match = $reg.match($html) + + if (!$match.Success) + { + # температура не найдена + throw new-object Exception('Температура не найдена.') + } + + # считываем температуру + $T = $match.Groups[1].value + + # сохраняем температуру + $TempTable[$dateFrom.ToString()] = $T + + $dateFrom = $dateFrom.AddDays(1) + } + + return $TempTable + } + catch + { + throw new-object Exception('Ошибка получения среднесуточной температуры за указанный период. ', $Error[0].Exception) + } + } + + ########################################################################## + + # возвращает входные параметры + Function Arguments($inArgs) + { + try + { + # проверяем количество параметров + + if($inArgs.Length -eq 0) + { + throw new-object Exception('Отсутствуют параметры командной строки.') + } + + # возвращает введенное имя города + $gorod = $inArgs[0] + $gorod + + [DateTime]$dateTo = [System.DateTime]::Today.AddDays(-1) + [DateTime]$dateFrom = $dateTo + + + if($inArgs.Length -eq 2) + { + $DateTimeStr = $inArgs[1] + $DateTimeStr = $DateTimeStr.Split('-', [System.StringSplitOptions]::RemoveEmptyEntries) + + if($DateTimeStr.Length -ne 2) + { + throw new-object Exception('Период времени задан неверно.') + } + + # дата начало периода + if (![DateTime]::TryParse($DateTimeStr[0], [ref]$dateFrom)) + { + throw new-object Exception('Дата начала периода задана в неверном формате. Формат даты: dd.mm.yyyy') + } + + + # дата конца периода + if (![DateTime]::TryParse($DateTimeStr[1], [ref]$dateTo)) + { + throw new-object Exception('Дата окончания периода задана в неверном формате. Формат даты: dd.mm.yyyy') + } + } + + + # возвращаем дату начало/конца + $dateFrom + $dateTo + } + catch + { + throw new-object Exception('Ошибка разбора параметров коммандной строки. ', $Error[0].Exception) + } + } + + ########################################################################## + + # Функция подключается к серверу автоматизации и возвращает объект сервера + Function ConnectToServer() + { + try + { + Write-Host 'подключаемся к серверу по адресу ' $ServerAddress ':' $ServerPort + + $securePassword = [Lers.Networking.SecureStringHelper]::ConvertToSecureString($PassWord) + + $authenticationInfo = New-Object Lers.Networking.BasicAuthenticationInfo($Login, $securePassword) + + # подключаемся к серверу + $server = new-object Lers.LersServer + + $server.Connect($ServerAddress, $ServerPort, $authenticationInfo) + return $server + } + catch + { + throw new-object Exception('Не удалось подключится к серверу ЛЭРС УЧЕТ. ', $Error[0].Exception) + } + } + + ########################################################################## + + # функция сохраняет данные о температуре на сервере ЛЭРС УЧЕТ + # $server - сервер автоматизации + # $tempTable - таблица среднесуточных температур + Function SaveTemperatureToServer ($server, $tempTable) + { + Write-Host 'Cохраняем данные на сервере ЛЭРС УЧЕТ' + try + { + $str ='' + $keys = $tempTable.Keys + + $temperature = New-Object Lers.Data.OutdoorTemperatureRecord[] $keys.Count + $i = 0 + + foreach($key in $keys) + { + $dt = [DateTime]::Parse($key) + + $value = [string]$tempTable[$key] + + $separator = [System.Globalization.CultureInfo]::CurrentCulture.NumberFormat.NumberDecimalSeparator; + + $value = [Convert]::ToSingle($value.Replace(".",$separator)) + + $record = New-Object Lers.Data.OutdoorTemperatureRecord($dt) + $record.Value = $value + + $temperature[$i] = $record + + $i++ + } + + # сохранение данных на сервере + $server.OutdoorTemperature.Set($temperature) + } + catch + { + throw new-object Exception('Не удалось сохранить данные среднесуточной температуры на сервере ЛЭРС учет. ', $Error[0].Exception) + } + } + + ########################################################################## + # Точка входа + ########################################################################## + + try + { + Write-Host 'Запуск импорта данных среднесуточной температуры с сайта мониторинга погоды.' + + # проверяем параметры настройки скрипта + CheckParameters $url $ServerAddress $ServerPort $Login $PassWord + + #param[0] = город, param[1] = дата_начала, param[2] = дата_окончания + [object[]]$param = Arguments $Args + + Write-host 'Загружаем ресурс ' $url + + # загружаем html страницу + $reply = Get-WwwString $url + + # получаем ссылку на страницу, указанного города + $link = Get-CityUrl $reply $param[0] $url + + # загружаем таблицу с температурами наружного воздуха + $tempTable = Get-CityTemperature $param[1] $param[2] $link + + write-host 'Получены среднесуточные температуры.' + + # подключаемся к серверу ЛЭРС + $server = ConnectToServer + + # сохраняем температуру на сервере + SaveTemperatureToServer $server $tempTable + + Write-Host 'Импорт температур успешно завершен.' + } + catch + { + write-host 'Ошибка импорта температур. ' (GetFullExceptionMessage $Error[0].Exception) + exit + } + + ######################################################################## \ No newline at end of file diff --git a/KhvAdmDataAdapter/App_Code/Handler.cs b/KhvAdmDataAdapter/App_Code/Handler.cs new file mode 100644 index 0000000..60ceea8 --- /dev/null +++ b/KhvAdmDataAdapter/App_Code/Handler.cs @@ -0,0 +1,486 @@ +using System; +using System.Collections.Specialized; +using System.Configuration; +using System.IO; +using System.Text; +using System.Web; +using Lers.Data; +using Lers.Core; +using Lers.Utils; + +namespace Lers.Web.DataAdapter.KhvAdm +{ + ///

+ /// Реализует обработчик запроса на выдачу данных в формате экспорта, утвержденном администрацией г. Хабаровск + /// + internal class Handler: IHttpHandler + { + /// + /// Используется в качестве источника при протоколировании. + /// + private static readonly string CLASS_NAME = typeof(Handler).FullName; + + /// + /// Начальная дата для экспорта данных + /// Берется из параметра dateFrom + /// + private DateTime beginDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1); + + /// + /// Конечная дата для экспорта данных + /// Берется из параметра dateTo + /// + private DateTime endDate = DateTime.Now; + + /// Тип временных меток: 1 - часовые, 0 - суточные; -1 - и часовые и суточные + private int dataPeriodType = 0; + + /// + /// Экземпляр класса для подключения к серверу ЛЭРС УЧЕТ + /// + private LersServer server; + + /// + /// Протоколирует в файл + /// + private Logger logger; + + /// + /// Возвращает значение, позволяющее определить, может ли другой запрос использовать экземпляр класса IHttpHandler. + /// + bool IHttpHandler.IsReusable + { + get + { + return false; + } + } + + /// + /// Получает информацию о запросе + /// + /// Информация о запросе + private string GetRequestInfo() + { + if (HttpContext.Current == null || HttpContext.Current.Request == null) + return "<Не удалось получить дополнительную информацию о запросе>"; + + HttpRequest currentRequest = HttpContext.Current.Request; + + // Адрес, с которого пришёл запрос (может быть адрес прокси) + string publicAddress = currentRequest.ServerVariables["REMOTE_ADDR"]; + + // Локальный адрес компа, заполняется при перенаправлении запроса через прокси + string localAddress = currentRequest.ServerVariables["HTTP_X_FORWARDED_FOR"]; + + + StringBuilder info = new StringBuilder(); + + info.AppendFormat("IP-адрес запроса: {0}.\r\nИсходный IP-адрес запроса: {1}\r\n", publicAddress, localAddress); + + info.AppendFormat("Адрес web-страницы: {0}\r\n", currentRequest.Url); + + return info.ToString(); + } + + /// + /// Обрабатывает веб запрос. Исходная точка в HttpHandler + /// + /// Контекст Http запроса + void IHttpHandler.ProcessRequest(HttpContext context) + { + InitLogger(); + + try + { + string msg = "Получен запрос на экспорт данных в формате ДГК.\r\n" + GetRequestInfo(); + + LogInfo(msg); + + Init(); + + // Разбираем входные параметры + ParseInputParams(); + + // Экспортируем данные + ExportData(); + + if (context.Response.IsClientConnected) + LogInfo("Данные успешно отправлены."); + } + catch (ConfigurationErrorsException ex) + { + LogError(ex.Message); + } + catch (Lers.Networking.RequestTimeoutException exc) + { + LogError("Вышло время ожидания на выполнение операции.\r\n"); + } + catch (Lers.Networking.ServerConnectionException exc) + { + LogError("Ошибка при попытки установить соединение с сервером ЛЭРС УЧЕТ.\r\n"); + } + catch (Lers.Networking.AuthorizationFailedException exc) + { + LogError("Ошибка при попытки установить соединение с сервером ЛЭРС УЧЕТ.\r\n"); + } + catch (VersionMismatchException exc) + { + LogError("Ошибка при попытки установить соединение с сервером ЛЭРС УЧЕТ.\r\n"); + } + catch(Exception exc) + { + string msg = "Ошибка экспорта данных в формате ДГК. "; + LogError(msg); + throw; + } + finally + { + this.logger.LogDebug("Закрываем подключение...", CLASS_NAME); + + if(server != null && server.IsConnected) + server.Disconnect(2000); + + this.logger.Close(); + + context.Response.End(); + } + } + + #region Протоколирование + + /// + /// Протоколирует сообщение об ошибке + /// + /// Текст сообщения + private void LogError(string message) + { + this.logger.LogError("Dgk:\t" + message, CLASS_NAME); + } + + /// + /// Протоколирует информационное сообщение + /// + /// Текст сообщения + private void LogInfo(string message) + { + this.logger.LogMessage("Dgk:\t" + message, CLASS_NAME); + } + + /// + /// Протоколирует отладочное сообщение + /// + /// Текст сообщения + private void LogDebug(string message) + { + this.logger.LogDebug("Dgk:\t" + message, CLASS_NAME); + } + + /// + /// Протоколирует предупреждающее сообщение + /// + /// Текст сообщения + private void LogWarning(string message) + { + this.logger.LogWarning("Dgk:\t" + message, CLASS_NAME); + } + + /// + /// Инициализирует логгер + /// + private void InitLogger() + { + // Считываем путь до журнала протокола + string logFile = System.Configuration.ConfigurationManager.AppSettings["DataAdapterFileLogPath"] ?? ""; + + if (logFile == "") + logFile = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"\LERS\Logs\Web\DataAdapter.log"; + + // Если каталога нет, создаем его + if (!Directory.Exists(Path.GetDirectoryName(logFile))) + Directory.CreateDirectory(Path.GetDirectoryName(logFile)); + + bool debug = false; + + // Считываем значение включено ли протоколирование отладочных сообщений + string fileLogDebug = System.Configuration.ConfigurationManager.AppSettings["DataAdapterFileLogDebug"] ?? ""; + + if (fileLogDebug == "1") + debug = true; + + this.logger = Logger.Create(logFile); + + this.logger.LogDebugMessages = debug; + } + + #endregion + + #region Инициализация и разбор входных параметров + + /// + /// Инициализация + /// + private void Init() + { + LogDebug("Инициализация..."); + + // Отключаем буферизацию + HttpContext.Current.Response.BufferOutput = false; + + // ServerAddress + string serverAddress = ConfigurationManager.AppSettings["ServerAddress"] ?? ""; + + if (serverAddress == "") + serverAddress = "localhost"; + + // ServerPort + int serverPort; + + if (!Int32.TryParse(ConfigurationManager.AppSettings["ServerPort"], out serverPort)) + serverPort = 10000; + + // Login + string login = ConfigurationManager.AppSettings["AdmLogin"]; + + if(string.IsNullOrEmpty(login)) + throw new ConfigurationErrorsException("В конфигурации приложения отсутствует параметр: AdmLogin"); + + // Password + string password = ConfigurationManager.AppSettings["AdmPassword"]; + + if(string.IsNullOrEmpty(password)) + throw new ConfigurationErrorsException("В конфигурации приложения отсутствует параметр: AdmPassword"); + + LogDebug("Инициализация завершена."); + + // Соединяемся + + LogDebug("Соединение с сервером ЛЭРС УЧЕТ..."); + + this.server = new LersServer(); + + this.server.VersionMismatch += server_VersionMismatch; + + System.Security.SecureString securePassword = Networking.SecureStringHelper.ConvertToSecureString(password); + + this.server.Connect(serverAddress, (ushort)serverPort, new Networking.BasicAuthenticationInfo(login, securePassword)); + + LogDebug("Соединение установлено."); + } + + /// + /// Обработчик ошибки несовместимости версий сервера и фреймворка + /// + void server_VersionMismatch(object sender, VersionMismatchEventArgs e) + { +#if DEBUG + e.Ignore = true; +#endif + } + + /// + /// Разбор входных параметров + /// + private void ParseInputParams() + { + NameValueCollection paramCollection = HttpContext.Current.Request.Params; + + DateTime result; + + // Начальная дата + if (TryParseDateParam(paramCollection, "dateFrom", out result)) + beginDate = result; + + // Конечная дата + if (TryParseDateParam(paramCollection, "DateTo", out result)) + endDate = result; + + // Из регламента: + // ДГК может в любое время выполнять запросы данных за произвольный период, + // но на глубину не более чем два месяца, включая отчетный. + + // Комментарий Клауса: + // Если запрашивается большой интервал, то подрезаем его с начала, + // иначе получаем исключение "Слишком большой размер пакета ( > 20МБ ) + + // Если запрашивается интервал больше 3 месяцев, подрезаем его с начала. + if(((TimeSpan)endDate.Subtract(beginDate)).TotalDays > 60) + { + beginDate = endDate.Subtract(new TimeSpan(60, 0, 0, 0)); + + LogWarning("Интервал выборки данных превышает 60 дней. Дата начала интервала заменена на " + beginDate); + } + + //Если интервал не корректный то устанавливаем интервал по умолчанию + if (beginDate > endDate) + { + beginDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1); + + endDate = DateTime.Now; + + LogWarning("Конечная дата периода превышает начальную. Параметры были установлены по умолчанию."); + } + + // Тип данных + if (!Int32.TryParse(paramCollection["PeriodType"], out dataPeriodType)) + dataPeriodType = -1; // Суточные и часовые + + // По умолчанию выдаем и суточные и часовые данные + if (dataPeriodType != -1 && dataPeriodType != 0 && dataPeriodType != 1) + dataPeriodType = -1; + + LogDebug(String.Format("параметры запроса: beginDate = {0}, endDate = {1}, dataPeriodType = {2}", + beginDate, endDate, dataPeriodType)); + } + + /// + /// Пытается разобрать параметр дата задающую начало и конец периода + /// + /// Коллекция параметров, полученная из HttpContext.Request.Params + /// Имя параметра для разбора + /// Дата полученная из указанного параметра + /// Результат разбора: true - успех, false - провал. + private bool TryParseDateParam(NameValueCollection paramCollection, string paramName, out DateTime result) + { + result = new DateTime(); + + // Проверяем есть ли вообще параметры, есть ли необходимый нам параметр, не пустой ли он + if (paramCollection.Count > 0 && + !String.IsNullOrEmpty(paramCollection[paramName])) + { + if (DateTime.TryParseExact(paramCollection[paramName], "yyyyMMddHHmm", null, System.Globalization.DateTimeStyles.AssumeLocal, out result)) + return true; + + if (DateTime.TryParseExact(paramCollection[paramName], "yyyyMMdd", null, System.Globalization.DateTimeStyles.AssumeLocal, out result)) + return true; + } + + return false; + } + + #endregion + + #region Выдача данных + + /// + /// Экспортирует данные потребления указанного типа + /// + /// Точка учета + /// Тип данных: true - суточные, false - часовые + private void ExportConsumption(MeasurePoint measurePoint, bool isDay) + { + // TODO: Сократить количество запросов на сервер, одновременно запрашивая суточные и часовые данные + + // Получаем данные потребления по точке учета + MeasurePointConsumptionRecordCollection consumption = measurePoint.Data.GetConsumption(beginDate, endDate, ((isDay) ? DeviceDataType.Day : DeviceDataType.Hour)); + + // Измеряемый ресурс + int systemTypeId = (int)measurePoint.SystemType; + + // Номер точки учета + int number = measurePoint.Number ?? 0; + + string output = ""; + + foreach (MeasurePointConsumptionRecordWater dataRecord in consumption) + { + if (dataRecord.M_in == null) + continue; + + // Накапливаем данные в строке + output = number + ";" + + ((isDay) ? dataRecord.DateTime.ToString("yyyy-MM-dd") : dataRecord.DateTime.ToString("yyyy-MM-dd HH:mm")) + + ";2;" + + systemTypeId + ";" + + (dataRecord.T_in ?? 0) + ";" + + (dataRecord.T_out == null ? "" : dataRecord.T_out.ToString()) + ";" + + (dataRecord.M_in ?? 0) + ";" + + (dataRecord.M_out == null ? "" : dataRecord.M_out.ToString()) + ";" + + (dataRecord.Q_in == null? "" : dataRecord.Q_in.ToString()) + ";" + + (dataRecord.Q_out == null ? "" : dataRecord.Q_out.ToString()) + ";" + + (dataRecord.P_in == null ? "" : dataRecord.P_in.ToString()) + ";" + + (dataRecord.P_out == null ? "" : dataRecord.P_out.ToString()) + ";" + + (dataRecord.WorkTime == null ? "" : dataRecord.WorkTime.ToString()) + ";" + + Convert.ToInt32(isDay) + ";\n"; + + // Выдаем браузеру + HttpContext.Current.Response.Write(output); + } + } + + /// + /// Отправляет заголовок + /// + private void SendHeader() + { + HttpResponse response = HttpContext.Current.Response; + + // Определяем имя файла + string fileName = "" + ((beginDate != DateTime.MinValue) ? beginDate.ToString("yyyyMMddHHmm") : "") + + "-" + ((endDate != DateTime.MinValue) ? endDate.ToString("yyyyMMddHHmm") : "") + + ((dataPeriodType > -1) ? "_" + dataPeriodType : "") + + ".csv"; + + // Подготавливаем заголовок + // Ставим в качестве ответа, файл в кодировке по умолчанию + response.ContentEncoding = System.Text.Encoding.Default; + response.ContentType = "application/x-download"; + response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName)); + + // Выдаем браузеру заголовок данных потребления + response.Write("MeasurePointID;DataDate;DataSource;ResourceTypeID;T_in;T_out;M_in;M_out;H_in;H_out;P_in;P_out;WorkTime;IsDay\n"); + } + + /// + /// Экспортирует данные потребления + /// + private void ExportData() + { + LogDebug("Отправка данных для администрации г. Хабаровска в ответ на запрос..."); + + SendHeader(); + + MeasurePoint[] measurePoints = this.server.MeasurePoints.GetList(MeasurePointType.Regular); + + // Выдаем все суточные данные потребления + if (dataPeriodType == 0 || dataPeriodType == -1) + { + foreach (MeasurePoint measurepoint in measurePoints) + { + // Выгружаем данные только по воде + if (measurepoint.SystemType != SystemType.ColdWater && measurepoint.SystemType != SystemType.HotWater && measurepoint.SystemType != SystemType.Heat) + continue; + + ExportConsumption(measurepoint, true); + + if (!HttpContext.Current.Response.IsClientConnected) + { + LogDebug("Клиент был отключен от веб-сервера."); + return; + } + } + } + + // Выдаем все часовые данные потребления + if (dataPeriodType == 1 || dataPeriodType == -1) + { + foreach (MeasurePoint measurepoint in measurePoints) + { + // Выгружаем данные только по воде + if (measurepoint.SystemType != SystemType.ColdWater && measurepoint.SystemType != SystemType.HotWater && measurepoint.SystemType != SystemType.Heat) + continue; + + ExportConsumption(measurepoint, false); + + if (!HttpContext.Current.Response.IsClientConnected) + { + LogDebug("Клиент был отключен от веб-сервера."); + return; + } + } + } + } + + #endregion + } +} \ No newline at end of file diff --git a/KhvAdmDataAdapter/App_Code/Logger.cs b/KhvAdmDataAdapter/App_Code/Logger.cs new file mode 100644 index 0000000..5d1e206 --- /dev/null +++ b/KhvAdmDataAdapter/App_Code/Logger.cs @@ -0,0 +1,267 @@ +using System; +using System.IO; +using System.Text; +using System.Threading; + +namespace Lers.Utils +{ + /// + /// Протоколирует сообщения в файл. + /// + public class Logger : IDisposable + { + /// + /// Тип сообщения в журнале. + /// + private enum LogType + { + /// + /// Отладочное сообщение. + /// + Debug = 0, + + /// + /// Информационное сообщение. + /// + Info = 1, + + /// + /// Предупреждение. + /// + Warning = 2, + + /// + /// Ошибка. + /// + Error = 3, + } + + private Stream stream; + + private StreamWriter streamWriter; + + /// + /// Определяет, нужно ли протоколировать отладочные сообщения. + /// + public bool LogDebugMessages { get; set; } + + /// + /// Определяет, нужно ли протоколировать идентификатор потока + /// + public bool LogThreadId { get; set; } + + /// + /// Инициализирует новый экземпляр класса. + /// + /// Поток записи. + private Logger(Stream stream) + { + if (stream == null) + throw new ArgumentNullException("stream"); + + this.stream = stream; + this.streamWriter = new StreamWriter(stream, Encoding.UTF8); + + WritePreamble(); + } + + /// + /// Создает новый экземпляр, протоколирующий сообщения в указанный файл. + /// + /// Имя файла журнала. + /// Возвращает экземпляр . + public static Logger Create(string fileName) + { + // Если папка не существует, то создаем её. + + string logDirectory = Path.GetDirectoryName(fileName); + + if (!Directory.Exists(logDirectory)) + { + Directory.CreateDirectory(logDirectory); + } + + // Открываем файловый поток на запись. Если файл уже существует, то будем дописывать в него, + // если нет - создаем новый файл. + + FileMode fileMode; + + if (File.Exists(fileName)) + fileMode = FileMode.Append; + else + fileMode = FileMode.CreateNew; + + FileStream stream = new FileStream(fileName, fileMode, FileAccess.Write, FileShare.Read); + + // Создаем новый экземпляр класса и возвращаем его. + + try + { + return new Logger(stream); + } + catch + { + // При ошибке закрываем файловый поток. + + stream.Close(); + + throw; + } + } + + /// + /// Закрывает файл журнала. + /// + public void Close() + { + Dispose(); + } + + /// + /// Протоколирует информационное сообщение. + /// + /// Текст сообщения. + /// Источник сообщения. + public void LogMessage(string message, string source) + { + Log(LogType.Info, message, source); + } + + /// + /// Протоколирует предупреждающее сообщение. + /// + /// Текст сообщения. + /// Источник сообщения. + public void LogWarning(string message, string source) + { + Log(LogType.Warning, message, source); + + } + + /// + /// Протоколирует сообщение об ошибке. + /// + /// Текст сообщения. + /// Источник сообщения. + public void LogError(string message, string source) + { + Log(LogType.Error, message, source); + } + + /// + /// Протоколирует отладочное. + /// + /// Текст сообщения. + /// Источник сообщения. + public void LogDebug(string message, string source) + { + // Отладочные сообщения протоколируем только если включено. + + if (this.LogDebugMessages) + Log(LogType.Debug, message, source); + } + + /// + /// Протоколирует сообщение в журнал. + /// + /// Важность сообщения. + /// Текст сообщения. + /// Источник сообщения. + private void Log(LogType logType, string message, string source) + { + CheckDisposed(); + + if (message == null) + throw new ArgumentNullException("message"); + + if (source == null) + throw new ArgumentNullException("source"); + + // Сонхронизируем доступ из разных потоков. + + lock (this.streamWriter) + { + // Записываем строку и очищаем буфер, чтобы строка сразу появилась в лог-файле. + + if(this.LogThreadId) + this.streamWriter.WriteLine("{0:dd-MM-yyyy HH:mm:ss.fff}\t{1}:{2:000}\t{3}\t\t\t{4}", + DateTime.Now, FormatLogType(logType), Thread.CurrentThread.ManagedThreadId, message, source); + else + this.streamWriter.WriteLine("{0:dd-MM-yyyy HH:mm:ss.fff}\t{1}\t{2}\t\t\t{3}", DateTime.Now, FormatLogType(logType), message, source); + + this.streamWriter.Flush(); + } + + // В отладочной версии дополнительно протоколируем в окно Output отладчика. + +#if DEBUG + System.Diagnostics.Debugger.Log((int)logType, source, message + "\r\n"); +#endif + } + + /// + /// Записывает заголовок в файл журнала. + /// + private void WritePreamble() + { + this.streamWriter.WriteLine("========================================"); + this.streamWriter.WriteLine("== Журнал открыт " + DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss.fff")); + this.streamWriter.WriteLine("========================================"); + + this.streamWriter.Flush(); + } + + private static string FormatLogType(LogType logType) + { + switch (logType) + { + case LogType.Debug: + return "D"; + + case LogType.Info: + return "I"; + + case LogType.Warning: + return "W"; + + case LogType.Error: + return "E"; + + default: + throw new ArgumentOutOfRangeException("logType"); + } + } + + #region IDisposable + + private bool isDisposed = false; + + /// + /// Проверяет, что экземпляр не уничтожен. + /// + private void CheckDisposed() + { + if (this.isDisposed) + throw new ObjectDisposedException("Использование экземпляра невозможно, т.к. объект был закрыт."); + } + + /// + /// Освобождает ресурсы. + /// + public void Dispose() + { + if (!this.isDisposed) + { + this.streamWriter.Close(); + this.stream.Close(); + + this.streamWriter = null; + this.stream = null; + + this.isDisposed = true; + } + } + + #endregion + } +} diff --git a/KhvAdmDataAdapter/KhvAdmDataAdapter.csproj b/KhvAdmDataAdapter/KhvAdmDataAdapter.csproj new file mode 100644 index 0000000..5688900 --- /dev/null +++ b/KhvAdmDataAdapter/KhvAdmDataAdapter.csproj @@ -0,0 +1,85 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {0C6B7048-E464-439D-82CD-99532A932E5A} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + Lers.Web.DataAdapter.KhvAdm + Lers.KhvAdmDataAdapter + v4.0 + + + 3.5 + + + false + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + Off + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + ..\..\Lers.System\bin\x86\Debug\Lers.System.dll + + + + + + + + + + + + + + + + + + + + + + False + False + 89 + / + + + False + False + + + False + + + + + \ No newline at end of file diff --git a/KhvAdmDataAdapter/KhvAdmDataAdapter.sln b/KhvAdmDataAdapter/KhvAdmDataAdapter.sln new file mode 100644 index 0000000..44e3380 --- /dev/null +++ b/KhvAdmDataAdapter/KhvAdmDataAdapter.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KhvAdmDataAdapter", "KhvAdmDataAdapter.csproj", "{0C6B7048-E464-439D-82CD-99532A932E5A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0C6B7048-E464-439D-82CD-99532A932E5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C6B7048-E464-439D-82CD-99532A932E5A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C6B7048-E464-439D-82CD-99532A932E5A}.Debug|x64.ActiveCfg = Debug|Any CPU + {0C6B7048-E464-439D-82CD-99532A932E5A}.Debug|x86.ActiveCfg = Debug|Any CPU + {0C6B7048-E464-439D-82CD-99532A932E5A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C6B7048-E464-439D-82CD-99532A932E5A}.Release|Any CPU.Build.0 = Release|Any CPU + {0C6B7048-E464-439D-82CD-99532A932E5A}.Release|x64.ActiveCfg = Release|Any CPU + {0C6B7048-E464-439D-82CD-99532A932E5A}.Release|x86.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/KhvAdmDataAdapter/Properties/AssemblyInfo.cs b/KhvAdmDataAdapter/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9b874e4 --- /dev/null +++ b/KhvAdmDataAdapter/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Управление общими сведениями о сборке осуществляется с помощью +// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения, +// связанные со сборкой. +[assembly: AssemblyTitle("ЛЭРС УЧЕТ. Адаптер данных для администрации г. Хабаровска")] +[assembly: AssemblyDescription("Выполняет преобразование данных в формат экспорта администрации г. Хабаровска")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("ООО \"Хабаровский центр энергоресурсосбережения\"")] +[assembly: AssemblyCulture("")] +[assembly: AssemblyProduct("Система диспетчеризации ЛЭРС УЧЕТ")] +[assembly: AssemblyCopyright("© 2000-2011, Хабаровский центр энергоресурсосбережения")] +[assembly: AssemblyTrademark("Внимание: Данная компьютерная программа защищена законами об авторских правах и международными соглашениями. Незаконное воспроизведение или распространения данной программы или любой ее части влечет гражданскую и уголовную ответственность.")] + +// Параметр ComVisible со значением FALSE делает типы в сборке невидимыми +// для COM-компонентов. Если требуется обратиться к типу в этой сборке через +// COM, задайте атрибуту ComVisible значение TRUE для этого типа. +[assembly: ComVisible(false)] + +// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM +[assembly: Guid("a0027496-d7ea-4530-9e78-3033f1d4e2c7")] + +// Сведения о версии сборки состоят из следующих четырех значений: +// +// Основной номер версии +// Дополнительный номер версии +// Номер построения +// Редакция +// +// Можно задать все значения или принять номер построения и номер редакции по умолчанию, +// используя "*", как показано ниже: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/KhvAdmDataAdapter/web.config b/KhvAdmDataAdapter/web.config new file mode 100644 index 0000000..09dd29b --- /dev/null +++ b/KhvAdmDataAdapter/web.config @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index e4a247d..824641c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,9 @@ # samples Примеры использования Lers Framework + +Проекты: + +AttributesSample Работа с атрибутами. Консольное приложение. +GetDataSample Получение данных из ЛЭРС УЧЁТ. Консольное приложение. +ImportTemperature Импорт температуры наружного воздуха в ЛЭРС УЧЁТ. +KhvAdmDataAdapter Экспорт данных из ЛЭРС УЧЁТ. Обработчик HttpHandler для веб-сайта