Загрузил проекты примеров

This commit is contained in:
Антон Чичков 2016-04-08 14:43:07 +10:00
parent 6cb8d0c91f
commit 3074b6115e
17 changed files with 1848 additions and 0 deletions

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{1E9BFBEA-6183-416C-B5EA-C883CD62277E}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>LersSample</RootNamespace>
<AssemblyName>LersSample</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<UseVSHostingProcess>false</UseVSHostingProcess>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<UseVSHostingProcess>false</UseVSHostingProcess>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
<CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<ItemGroup>
<Reference Include="Lers.System, Version=3.0.0.0, Culture=neutral, PublicKeyToken=e7c6d6299713498c, processorArchitecture=AMD64">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lers.System\bin\x64\Debug\Lers.System.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -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

126
AttributesSample/Program.cs Normal file
View File

@ -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);
}
}
}

View File

@ -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")]

View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{1E9BFBEA-6183-416C-B5EA-C883CD62277E}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>LersSample</RootNamespace>
<AssemblyName>LersSample</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<UseVSHostingProcess>false</UseVSHostingProcess>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<UseVSHostingProcess>false</UseVSHostingProcess>
</PropertyGroup>
<ItemGroup>
<Reference Include="Lers.System">
<HintPath>..\..\Lers.System\bin\x86\Release\Lers.System.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -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

109
GetDataSample/Program.cs Normal file
View File

@ -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);
}
}
}

View File

@ -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")]

View File

@ -0,0 +1,22 @@
Назначение
Скрипт ImportTemperature.ps1 выполняет импорт данных среднесуточной температуры наружного воздуха с сайта мониторинга погоды www.pogoda.ru.net [HYPERLINK: http://www.pogoda.ru.net] в ЛЭРС УЧЕТ. Импортированные данные сохраняются в справочник температур наружного воздуха.
Синтаксис
Powershell .\ImportTemperature.ps1 Город [период]
где:
Город - название города, по которому необходимо импортировать данные среднесуточной температуры. Параметр должен быть первым в параметрах командной строки.
[период] - интервал времени в формате <дата_начала>-< дата_окончания>, за который импортируются данные среднесуточной температуры. Если параметр не указан, то импортируются данные за предыдущий день. Даты начала и окончания периода задаются в формате dd.mm.yyyy.
Пример 1. Импорт данных среднесуточной температуры за предыдущий день в Хабаровске.
Powershell .\ImportTemperature.ps1 "Хабаровск"
Пример 2. Импорт данных среднесуточной температуры с 1 декабря по 10 декабря в Хабаровске.
Powershell .\ImportTemperature.ps1 "Хабаровск" "01.12.2010-10.12.2010"
Параметры
Перед первым запуском импорта данных необходимо настроить параметры импорта, которые задаются в тексте самого скрипта.
$LersAutoPath - расположение файла сервера автоматизации
$ServerAddress - адрес сервера ЛЭРС УЧЕТ. В качестве адреса сервера может быть указано как имя, так и IP-адрес компьютера, на котором установлен сервер
$ServerPort - порт сервера ЛЭРС УЧЕТ
$Login - Имя входа в ЛЭРС УЧЕТ
$PassWord - пароль для входа в ЛЭРС УЧЕТ

View File

@ -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 адреса заданного города
# <a href="monitor.php?id=35229">Хабаровск</a>
$regExpressionCityFirst = '(?i:<a\shref="(.+)">'
$regExpressionCitySecond = '</a>)'
# регулярное выражение для поиска среднесуточной температуры
# <th class=black>5</th><td class=blue1>-21.0</td><td class=green>-15.1</td>
$regExpressionTemperatureFirst = '(?i:<th\sclass=black>'
$regExpressionTemperatureSecond = '</th>\s*<td\sclass=\w+>[\d\.\-\+]+</td>\s*<td\sclass=\w+>([\d\.\-\+]+)</td>)'
##################################################################
# Подключаемые типы
##################################################################
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 адреса заданного города
# <a href="monitor.php?id=35229">Хабаровск</a>
[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
}
# регулярное выражение для поиска среднесуточной температуры
# <th class=black>5</th><td class=blue1>-21.0</td><td class=green>-15.1</td>
[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
}
########################################################################

View File

@ -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
{
/// <summary>
/// Реализует обработчик запроса на выдачу данных в формате экспорта, утвержденном администрацией г. Хабаровск
/// </summary>
internal class Handler: IHttpHandler
{
/// <summary>
/// Используется в качестве источника при протоколировании.
/// </summary>
private static readonly string CLASS_NAME = typeof(Handler).FullName;
/// <summary>
/// Начальная дата для экспорта данных
/// Берется из параметра dateFrom
/// </summary>
private DateTime beginDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);
/// <summary>
/// Конечная дата для экспорта данных
/// Берется из параметра dateTo
/// </summary>
private DateTime endDate = DateTime.Now;
/// <summary> Тип временных меток: 1 - часовые, 0 - суточные; -1 - и часовые и суточные </summary>
private int dataPeriodType = 0;
/// <summary>
/// Экземпляр класса для подключения к серверу ЛЭРС УЧЕТ
/// </summary>
private LersServer server;
/// <summary>
/// Протоколирует в файл
/// </summary>
private Logger logger;
/// <summary>
/// Возвращает значение, позволяющее определить, может ли другой запрос использовать экземпляр класса IHttpHandler.
/// </summary>
bool IHttpHandler.IsReusable
{
get
{
return false;
}
}
/// <summary>
/// Получает информацию о запросе
/// </summary>
/// <returns>Информация о запросе</returns>
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();
}
/// <summary>
/// Обрабатывает веб запрос. Исходная точка в HttpHandler
/// </summary>
/// <param name="context">Контекст Http запроса</param>
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 Протоколирование
/// <summary>
/// Протоколирует сообщение об ошибке
/// </summary>
/// <param name="message">Текст сообщения</param>
private void LogError(string message)
{
this.logger.LogError("Dgk:\t" + message, CLASS_NAME);
}
/// <summary>
/// Протоколирует информационное сообщение
/// </summary>
/// <param name="message">Текст сообщения</param>
private void LogInfo(string message)
{
this.logger.LogMessage("Dgk:\t" + message, CLASS_NAME);
}
/// <summary>
/// Протоколирует отладочное сообщение
/// </summary>
/// <param name="message">Текст сообщения</param>
private void LogDebug(string message)
{
this.logger.LogDebug("Dgk:\t" + message, CLASS_NAME);
}
/// <summary>
/// Протоколирует предупреждающее сообщение
/// </summary>
/// <param name="message">Текст сообщения</param>
private void LogWarning(string message)
{
this.logger.LogWarning("Dgk:\t" + message, CLASS_NAME);
}
/// <summary>
/// Инициализирует логгер
/// </summary>
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 Инициализация и разбор входных параметров
/// <summary>
/// Инициализация
/// </summary>
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("Соединение установлено.");
}
/// <summary>
/// Обработчик ошибки несовместимости версий сервера и фреймворка
/// </summary>
void server_VersionMismatch(object sender, VersionMismatchEventArgs e)
{
#if DEBUG
e.Ignore = true;
#endif
}
/// <summary>
/// Разбор входных параметров
/// </summary>
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));
}
/// <summary>
/// Пытается разобрать параметр дата задающую начало и конец периода
/// </summary>
/// <param name="paramCollection">Коллекция параметров, полученная из HttpContext.Request.Params</param>
/// <param name="paramName">Имя параметра для разбора</param>
/// <param name="value">Дата полученная из указанного параметра</param>
/// <returns>Результат разбора: true - успех, false - провал.</returns>
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 Выдача данных
/// <summary>
/// Экспортирует данные потребления указанного типа
/// </summary>
/// <param name="measurePoint">Точка учета</param>
/// <param name="isDay">Тип данных: true - суточные, false - часовые</param>
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);
}
}
/// <summary>
/// Отправляет заголовок
/// </summary>
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");
}
/// <summary>
/// Экспортирует данные потребления
/// </summary>
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
}
}

View File

@ -0,0 +1,267 @@
using System;
using System.IO;
using System.Text;
using System.Threading;
namespace Lers.Utils
{
/// <summary>
/// Протоколирует сообщения в файл.
/// </summary>
public class Logger : IDisposable
{
/// <summary>
/// Тип сообщения в журнале.
/// </summary>
private enum LogType
{
/// <summary>
/// Отладочное сообщение.
/// </summary>
Debug = 0,
/// <summary>
/// Информационное сообщение.
/// </summary>
Info = 1,
/// <summary>
/// Предупреждение.
/// </summary>
Warning = 2,
/// <summary>
/// Ошибка.
/// </summary>
Error = 3,
}
private Stream stream;
private StreamWriter streamWriter;
/// <summary>
/// Определяет, нужно ли протоколировать отладочные сообщения.
/// </summary>
public bool LogDebugMessages { get; set; }
/// <summary>
/// Определяет, нужно ли протоколировать идентификатор потока
/// </summary>
public bool LogThreadId { get; set; }
/// <summary>
/// Инициализирует новый экземпляр класса.
/// </summary>
/// <param name="stream">Поток записи.</param>
private Logger(Stream stream)
{
if (stream == null)
throw new ArgumentNullException("stream");
this.stream = stream;
this.streamWriter = new StreamWriter(stream, Encoding.UTF8);
WritePreamble();
}
/// <summary>
/// Создает новый экземпляр, протоколирующий сообщения в указанный файл.
/// </summary>
/// <param name="fileName">Имя файла журнала.</param>
/// <returns>Возвращает экземпляр <see cref="Logger"/>.</returns>
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;
}
}
/// <summary>
/// Закрывает файл журнала.
/// </summary>
public void Close()
{
Dispose();
}
/// <summary>
/// Протоколирует информационное сообщение.
/// </summary>
/// <param name="message">Текст сообщения.</param>
/// <param name="source">Источник сообщения.</param>
public void LogMessage(string message, string source)
{
Log(LogType.Info, message, source);
}
/// <summary>
/// Протоколирует предупреждающее сообщение.
/// </summary>
/// <param name="message">Текст сообщения.</param>
/// <param name="source">Источник сообщения.</param>
public void LogWarning(string message, string source)
{
Log(LogType.Warning, message, source);
}
/// <summary>
/// Протоколирует сообщение об ошибке.
/// </summary>
/// <param name="message">Текст сообщения.</param>
/// <param name="source">Источник сообщения.</param>
public void LogError(string message, string source)
{
Log(LogType.Error, message, source);
}
/// <summary>
/// Протоколирует отладочное.
/// </summary>
/// <param name="message">Текст сообщения.</param>
/// <param name="source">Источник сообщения.</param>
public void LogDebug(string message, string source)
{
// Отладочные сообщения протоколируем только если включено.
if (this.LogDebugMessages)
Log(LogType.Debug, message, source);
}
/// <summary>
/// Протоколирует сообщение в журнал.
/// </summary>
/// <param name="logType">Важность сообщения.</param>
/// <param name="message">Текст сообщения.</param>
/// <param name="source">Источник сообщения.</param>
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
}
/// <summary>
/// Записывает заголовок в файл журнала.
/// </summary>
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;
/// <summary>
/// Проверяет, что экземпляр не уничтожен.
/// </summary>
private void CheckDisposed()
{
if (this.isDisposed)
throw new ObjectDisposedException("Использование экземпляра невозможно, т.к. объект был закрыт.");
}
/// <summary>
/// Освобождает ресурсы.
/// </summary>
public void Dispose()
{
if (!this.isDisposed)
{
this.streamWriter.Close();
this.stream.Close();
this.streamWriter = null;
this.stream = null;
this.isDisposed = true;
}
}
#endregion
}
}

View File

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{0C6B7048-E464-439D-82CD-99532A932E5A}</ProjectGuid>
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Lers.Web.DataAdapter.KhvAdm</RootNamespace>
<AssemblyName>Lers.KhvAdmDataAdapter</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileUpgradeFlags>
</FileUpgradeFlags>
<OldToolsVersion>3.5</OldToolsVersion>
<UpgradeBackupLocation />
<TargetFrameworkProfile />
<UseIISExpress>false</UseIISExpress>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Lers.System">
<HintPath>..\..\Lers.System\bin\x86\Debug\Lers.System.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Web" />
</ItemGroup>
<ItemGroup>
<Content Include="Web.config" />
</ItemGroup>
<ItemGroup>
<Compile Include="App_Code\Handler.cs" />
<Compile Include="App_Code\Logger.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
<WebProjectProperties>
<UseIIS>False</UseIIS>
<AutoAssignPort>False</AutoAssignPort>
<DevelopmentServerPort>89</DevelopmentServerPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath>
<IISUrl>
</IISUrl>
<NTLMAuthentication>False</NTLMAuthentication>
<UseCustomServer>False</UseCustomServer>
<CustomServerUrl>
</CustomServerUrl>
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
</WebProjectProperties>
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>
</Project>

View File

@ -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

View File

@ -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")]

View File

@ -0,0 +1,40 @@
<?xml version="1.0"?>
<configuration>
<connectionStrings/>
<system.web>
<!--
Значение параметра compilation debug="true" означает,
что в компилированную страницу будут вставлены отладочные символы. Так как этот
параметр влияет на производительность,
следует устанавливать в нем значение True только на этапе разработки.
-->
<compilation debug="true" targetFramework="4.0"/>
<!--
Раздел <customErrors> позволяет настраивать
параметры действий на случай возникновения необработанных ошибок
во время выполнения запроса. А именно,
он позволяет разработчикам настраивать HTML-страницы
с сообщениями об ошибках, которые будут отображаться вместо трассировки стека ошибок.
-->
<customErrors mode="Off"/>
<!-- Секция работает для IIS 5/6 и класического режима IIS 7.0-->
<httpHandlers>
<add verb="GET" path="KhvAdmImport.aspx" type="Lers.Web.DataAdapter.KhvAdm.Handler, Lers.KhvAdmDataAdapter"/>
</httpHandlers>
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
</system.web>
<system.webServer>
<handlers>
<add name="KhvAdmDataHandler" path="KhvAdmImport.aspx" verb="GET" type="Lers.Web.DataAdapter.KhvAdm.Handler, Lers.KhvAdmDataAdapter"/>
</handlers>
</system.webServer>
<appSettings>
<add key="ServerAddress" value="localhost"/>
<add key="ServerPort" value="10000"/>
<add key="AdmLogin" value="Admin"/>
<add key="AdmPassword" value="Admin"/>
<!--Необходимо указывать абсолютный путь-->
<add key="DataAdapterFileLogPath" value=""/>
<add key="DataAdapterFileLogDebug" value="1"/>
</appSettings>
</configuration>

View File

@ -1,2 +1,9 @@
# samples
Примеры использования Lers Framework
Проекты:
AttributesSample Работа с атрибутами. Консольное приложение.
GetDataSample Получение данных из ЛЭРС УЧЁТ. Консольное приложение.
ImportTemperature Импорт температуры наружного воздуха в ЛЭРС УЧЁТ.
KhvAdmDataAdapter Экспорт данных из ЛЭРС УЧЁТ. Обработчик HttpHandler для веб-сайта