Table of Contents

Список критических изменений в Lers Framework

3.58

Важно

Версия сборок Lers.Framework увеличена. Обновите nuget пакеты в вашем приложении на 3.58

Обновлена версия сборок Lers.Framework. Для работы с клиентом 3.58 и выше потребуется обновить nuget пакет до 3.58

В классах DeviceCell, DeviceAddress поля DataParameter и Parameter заменены на DataParameterId и ParameterId. Вместо перечисления DataParameter используется его целочисленное значение, так что потребуется преобразование если нужно присвоить к идентификатору параметр. Например:

До 3.58:

cell.DataParameter = DataParameter.M_in;

3.58 и выше:

cell.DataParameterId = (int)DataParameter.M_in;

3.47

Важно

Поля, которые касаются периода автоформирования отчёта, перенесены из класса Report в ReportGeneratingTask:

  • DataType
  • PeriodType
  • PeriodStartDayOrHour
  • PeriodStartMonthOrDay
  • PeriodEndDayOrHour
  • PeriodEndMonthOrDay
  • PeriodLastDays

3.46

Значение, возвращаемое методом PollSessionManager.GetLogByIdAsync, изменено с Administration.SystemLogRecord на Poll.PollLogRecord. PollLogRecord наследуется от SystemLogRecord, поэтому дополнительные доработки не понадобятся.

3.45

Тип поля Lers.Security.TrusteeAllowedEntitiyes.NodeGroups заменён с int[] на Lers.Models.TrusteeAllowedNodeGroup[]. Теперь для группы объектов можно указать какие типы систем будут доступны для точек учёта внутри группы.

3.32

Удалены устаревшие асинхронные методы объекта NodeFile и Node, принимающие функцию обратной связи. Теперь асинхронно создать или удалить документ объекта можно только методом, который возвращает Task.

В объект Room добавлено свойство RoomCouners - содержит информацию об квартирных счётчиках с привязкой к квартирным точкам учёта

3.31

  1. Номер объекта и точки учёта теперь не обнуляемые. Технически сейчас в ЛЭРС УЧЁТ не может быть объекта или точки учёта без номера. Поэтому тип данных полей Node.Number и MeasurePoint.Number изменён с int? на int. Ранее можно было при создании точки/объекта задать номера null и сервер формировал их автоматически. Теперь для автоформирования нужно задать значение 0.
  2. Метод AccountManager.GetAccountGroupAdditionalInfoAsync теперь возвращает Task и не принимает callback функцию в качестве параметра.
  3. Свойство MeasurePoint.IsDoublePipeHotWaterSystem теперь доступно только для чтения. Для того чтобы установить признак двухтрубной системы необходимо использовать свойство MeasurePoint.IsTwoChannels. Теперь одноканальной можно сделать и точку учёта теплоснабжения.

3.30

  1. Из класса ContractAnalysisDataRecord удалены свойства Parameter (измеряемый параметр)  и ContractConsumptionType (тип договорной нагрузки). Они заменены  на свойство ContractConsumptionParameter с типом DataParameter, т.к. по нему можно однозначно определить и измеряемый параметр и тип договорной нагрузки.
  2. Из класса UnitsOfMeasurement удалены методы, принимающие перечисление MeasuredParameter. Вместо него нужно использовать перечисление DataParameterCategory.
  3. Для объекта Территория добавлено свойство Нормативные температуры наружного воздуха для территории - MonthStdTemperature
  4. Удалены устаревшие методы блокировки сущностей из класса LersServer. Вместо асинхронных методов, которые получают функцию обратной связи, нужно использовать awaitable методы с такими же именами, но возвращающие Task.

3.29

  1. Классы, которые находятся в пространстве имён Lers.Models, перемещены в сборку Lers.Models. Разработчикам рекомендуется включить эту сборку в ссылки своих проектов, так как в ней находятся некоторые базовые классы, которые используются во многих объектах.
  2. Добавлена функция GetContractAnalysisData (Получает данные сравнения потребления с договорной нагрузкой с возможность указать тип данных DeviceDataType), для совместимости предыдущая функция использует параметр DeviceDataType == Month.

3.28

  1. Значительное количество описаний перечислений было перемещено из сборки Lers.System в сборку Lers.Core. Всем разработчикам следует включить в свои проекты ссылку на сборку Lers.Core.
  2. В класс PollTask добавлены методы управления состоянием задания StartAsync, StopAsync, SetPriority, и т.д. Класс MeasurePointElectricPowerRecord теперь наследуется от MeasurePointConsumptionRecord, что позволяет унифицировать работу с ним.
  3. Пользовательские параметры используемые при формировании отчета (класс ReportParameter) удалены из класса ReportOptions.
  4. Во все методы формирования отчетов добавлен параметр для передачи массива пользовательских параметров ( ReportParameter [] ), значения которых могут использоваться в скриптах отчетной формы.
  5. Из системы был удалён список обслуживающих инженеров, поэтому удалён класс ServicemanManager.
  6. Класс Serviceman теперь наследуется от AccountBase.
  7. В LersServerException добавлено поле Error, в котором находится значение из перечисления ErrorCode. С его помощью можно определить какая именно ошибка произошла при обработке запроса.
  8. Удалены устаревшие методы получения данных температурного графика. Теперь нужно использовать только методы, возвращающие Task.
  9. Удалены устаревшие методы класса NodeJob.
  10. Исключения NoConnectionException и Networking.RequestDisconnectException теперь наследуются от одного базового родителя Networking.RequestConnectionException. Это позволит в обработчиках ошибок перехватывать и обрабатывать только родительское исключение RequestConnectionException.
  11. Удалены устаревшие методы AccountManager.GetAccountAdditionalInfoAsync и AccountManager.GetOwnNotificationSettingsAsync
  12. Метод MeasurePoint.GetContractAnalysisDataAsync теперь возвращает Task<T>.

3.07 R26

  1. В операции LersServer.ConnectAsync теперь можно запросить токен восстановления сеанса, который затем используется вместо логина и пароля для повторного подключения.
  2. Добавлен класс GsmModemCommandExtensions, позволяющий выполнять AT-команды на подключенных к службе опроса GSM-модемах. Описание и примеры использования находятся в документации.
  3. В классе Lers.Core.Sensor для определения измеряемого параметра теперь нужно использовать свойства Parameter, ParameterDescriptor и ParameterCategory. Старые свойства помечены как устаревшие.

3.07 R25

  • Важное! В точку учёта добавлены новые методы GetValueEx/SetValueEx, которые возвращают или задают сразу значение параметра и атрибуты. Важно! Флаги BadValues, CalculatedValues, InterolatedValues, ResettedValues теперь доступны только для чтения. Для проверки достоверных/недостоверных значений нужно использовать значение, возвращённое методом GetValueEx. Пример:
// Проверка на недостоверный параметр до R25
var record = /*Получаем потребление по точке учёта*/
if (!record.BadValues.HasFlag(WaterRecordValues.T_in))
{
    // Обрабатываем достоверное значение.
}
  
// Проверка в R25 и позднее
var record = /*Получаем потребление по точке учёта*/
var value = record.GetValueEx(DataParameter.T_in);
 
if (value != null && value.IsGood)
// Альтернатива: if (value?.IsGood == true)
{
    // Обрабатываем достоверное значение.
}
  • Тип свойства MeasurePoint.DataParameters изменено со string[] на DataParameter[]. Отображаемые параметры теперь хранятся в перечислении, а не в виде строковых названий параметров.
  • Добавлена возможность привязки ячеек и каналов к точке учёта с помощью свойства MeasurePoint.DeviceBinding.

Пример:

/ Создаем точку учета и привязки каналов.
measurePoint = node.Systems.Heat.NewMeasurePoint("Отопление");
measurePoint.Device = device;
measurePoint.DeviceBinding.Channels.HeatSystemNumber = 1;
measurePoint.DeviceBinding.Channels.FlowChannelNumber = 1;
measurePoint.DeviceBinding.Channels.ReturnChannelNumber = 2;
await measurePoint.SaveAsync();
 
// Создаем точку учета и привязки ячеек.
var measurePoint = node.Systems.Heat.NewMeasurePoint("Отопление");
measurePoint.Device = device;
  
measurePoint.DeviceBinding.Cells[Lers.Data.DataParameter.M_in] = new MeasurePointCellBinding(
    model.DataInterface.Driver.Cells[0]) { PulseRatio = 1, Unit = Lers.Data.Unit.Ton };
measurePoint.DeviceBinding.Cells[Lers.Data.DataParameter.V_out] = new MeasurePointCellBinding(
    model.DataInterface.Driver.Cells[1]) { PulseRatio = 10, Unit = Lers.Data.Unit.CubicMeter };
measurePoint.DeviceBinding.Cells[Lers.Data.DataParameter.NormalOperationDuration] = new MeasurePointCellBinding(
    model.DataInterface.Driver.Cells[2]) { PulseRatio = 24, Unit = Lers.Data.Unit.Hour };
await measurePoint.SaveAsync();
  • Отображаемые параметры точки учёта теперь хранятся не в виде строк, а в виде массива DataParameter. Изменился тип свойства MeasurePoint.DataParameters со string[] на DataParameter[].
  • Изменился механизм работы с параметрами.

3.07 R23

В этом обновлении продолжается перевод Lers Framework на асинхронный механизм async/await.

Изменена реализация всех методов SaveAsync / DeleteAsync. Теперь удаление и сохранение записей должно выполняться только асинхронными операциями. Из класса EditableRecord (соответственно, из всех его наследников) были удалены следующие методы.

  • SaveAsync(callback, userState)
  • DeleteAsync(force, callback, userState)
  • Save()
  • Delete

Были удалены следующие старые методы класса AccountManager:

  • GetListByAccountGroup
  • GetListByAccountGroupAsync
  • GetListAsync
  • GetList
  • EditOwnNotificationSettingsAsync Вместо них нужно использовать новые awaitable методы.

3.07 R22

  1. Lers Framework теперь использует .NET Framework 4.6

Если вы собирали свои внешние модули или отдельные приложения с более низкой версией .NET Framework, они не смогут использовать Lers Framework v3.07 R22. В свойствах проекта нужно сменить целевую версию .NET Framework на 4.6 или выше. 2. Мы начали постепенный перевод методов Lers Framework на методику асинхронного программирования с использованием async/await. Старые методы с окончанием Async остались в библиотеке, но были отмечены как устаревшие и теперь при компиляции приведут к возникновению предупреждения CS0612. Мы рекомендуем как можно скорее отказаться от использования старых методов и начать работу с новыми.

До версии R22 асинхронные вызовы выполнялись следующим образом:

Версия R21 и ранее

void Foo()
{
    server.MeasurePoints.GetListAsync(CallbackMethod, userState);
}
  
void CallbackMethod(AsyncOperation asyncOperation)
{
    MeasurePoint[] measurePointList = ((GetMeasurePointListAsyncOperation)asyncOperation).EndGetList();
}

Начиная с версии R22 код выглядит так:

Версия R22 и позднее

async void Foo()
{
    MeasurePoint[] measurePointList = await server.MeasurePoints.GetListAsync();
}
  1. Синхронные методы получения объектов и списков отмечены устаревшими. Вместо них предлагается использовать новые асинхронные. Обратите внимание что в приложениях, у которых есть графический интерфейс пользователя, стоит использовать только асинхронные методы с помощью технологии await. Ожидание завершения асинхронного задания приведёт к блокировке программы.

  2. В консольных приложениях метод Main не может быть отмечен как async, поэтому для них рекомендуемый способ следующий: Асинхронное консольное приложение:

static void Main(string[] args)
{
    AsyncContext.Run(() => MainAsync(args));
}
 
static async void MainAsync(string[] args)
{
    Bootstrapper bs = new Bootstrapper();
    var list = await bs.GetList();
}
  1. Удалены старые асинхронные и синхронные методы у класса TerritoryManager. Список территорий и территорию по идентификатору теперь можно получить только с помощью async/await.
  2. Добавлен класс Lers.Administration.SystemParameters для работы с системными параметрами.
  3. Добавлен класс Lers.Administration.AccountLogManager для работы с журналом учётной записи.
  4. Добавлены события, вызывающиеся при создании, изменении или удалении объектов:
  • Lers.Communal.RoomManager.RoomChanged - вызывается при изменении помещения
  • Lers.Core.ServiceCompanyManager.ServiceCompanyChanged
  • Lers.Core.SupplierManager.SupplierChanged
  • Lers.Core.CustomerManager.CustomerChanged
  • Lers.Core.EquipmentManager.EquipmentChanged
  • Lers.Core.NodeGroupManager.NodeGroupChanged
  1. Добавлена возможность создание подключений объекта учёта

Пример создания GPRS-подключения к прибору:

node.Refresh(NodeInfoFlags.PollConnections | NodeInfoFlags.Equipment);
var model = this.Server.Equipment.GetModelById((int)ControllerModel.LersGsmLite);
var gprsModem = this.Server.Equipment.NewEquipment(model, ModemSerial);
gprsModem.Save();
 
model = this.Server.Equipment.GetModelById((int)DeviceModel.KM_5_4);
var device= this.Server.Equipment.NewEquipment(model, "8787877");
device.Save();
 
node.Equipment.Add(gprsModem);
node.Equipment.Add(device);
 
var connection = node.PollConnections.CreateNew(Lers.Poll.CommunicationLink.Gprs, "test connection");
connection.CommDevice = gprsModem;
connection.SetEquipmentList(new Equipment[] { device});
node.PollConnections.Add(connection);
await node.SaveAsync();
  1. Теперь через Lers Framework можно поставить точку учёта на автоопрос

Постановка точки учёта на автоопрос:

measurePoint.AutoPoll.Enabled = true;
measurePoint.AutoPoll.MaxAttempts = 1;
measurePoint.AutoPoll.NextAttemptDelay = 10;
measurePoint.AutoPoll.PollConnectionId = connection.Id;
measurePoint.AutoPoll.Schedule = new Schedule
{
    StartTime = 0,
    EndTime = 1000,
    FrequencyType = FrequencyType.EveryDay,
    FrequencyInterval = 1,
    RetryInterval = 10
};
await measurePoint.SaveAsync();
  1. Следующие типы перенесены из сборки Lers.System в сборку Lers.Core:
  • SystemType
  • ResourceKind
  • IncidentType
  • IncidentImportance Если ваш модуль или приложение использовали один из этих типов, добавьте в него ссылку на сборку Lers.Core.dll

3.07 R21

  1. Классы пространства имён Lers.Utils вынесены из Lers.System в сборку Lers.Utils.
  2. Изменён метод ReportManager.GetPreparedReportInfo(Async). Удалён параметр reportOptions.
  3. Изменён класс ReportOptionsObject. Удалён флаг GetPreparedReport.

3.07 R18

В версии 3.07 R18 подключения были перенесены в объект учёта из точки учёта и удалены сети устройств.

Полный список изменений:

Пространство/класс Удалено
Lers.Core Класс DeviceNetwork
Lers.Core.EquipmentManager Методы
- GetNetworkList
- GetNetworkListAsync
Lers.Core.EquipmentPollSettings Свойства
- Network
Lers.Core.MeasurePointManager Методы
- GetListByDeviceNetworkAsynс