Список критических изменений в 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
- Номер объекта и точки учёта теперь не обнуляемые. Технически сейчас в ЛЭРС УЧЁТ не может быть объекта или точки учёта без номера. Поэтому тип данных полей Node.Number и MeasurePoint.Number изменён с int? на int. Ранее можно было при создании точки/объекта задать номера null и сервер формировал их автоматически. Теперь для автоформирования нужно задать значение 0.
- Метод AccountManager.GetAccountGroupAdditionalInfoAsync теперь возвращает Task и не принимает callback функцию в качестве параметра.
- Свойство MeasurePoint.IsDoublePipeHotWaterSystem теперь доступно только для чтения. Для того чтобы установить признак двухтрубной системы необходимо использовать свойство MeasurePoint.IsTwoChannels. Теперь одноканальной можно сделать и точку учёта теплоснабжения.
3.30
- Из класса ContractAnalysisDataRecord удалены свойства Parameter (измеряемый параметр) и ContractConsumptionType (тип договорной нагрузки). Они заменены на свойство ContractConsumptionParameter с типом DataParameter, т.к. по нему можно однозначно определить и измеряемый параметр и тип договорной нагрузки.
- Из класса UnitsOfMeasurement удалены методы, принимающие перечисление MeasuredParameter. Вместо него нужно использовать перечисление DataParameterCategory.
- Для объекта Территория добавлено свойство Нормативные температуры наружного воздуха для территории - MonthStdTemperature
- Удалены устаревшие методы блокировки сущностей из класса LersServer. Вместо асинхронных методов, которые получают функцию обратной связи, нужно использовать awaitable методы с такими же именами, но возвращающие Task.
3.29
- Классы, которые находятся в пространстве имён Lers.Models, перемещены в сборку Lers.Models. Разработчикам рекомендуется включить эту сборку в ссылки своих проектов, так как в ней находятся некоторые базовые классы, которые используются во многих объектах.
- Добавлена функция GetContractAnalysisData (Получает данные сравнения потребления с договорной нагрузкой с возможность указать тип данных DeviceDataType), для совместимости предыдущая функция использует параметр DeviceDataType == Month.
3.28
- Значительное количество описаний перечислений было перемещено из сборки Lers.System в сборку Lers.Core. Всем разработчикам следует включить в свои проекты ссылку на сборку Lers.Core.
- В класс PollTask добавлены методы управления состоянием задания StartAsync, StopAsync, SetPriority, и т.д. Класс MeasurePointElectricPowerRecord теперь наследуется от MeasurePointConsumptionRecord, что позволяет унифицировать работу с ним.
- Пользовательские параметры используемые при формировании отчета (класс ReportParameter) удалены из класса ReportOptions.
- Во все методы формирования отчетов добавлен параметр для передачи массива пользовательских параметров ( ReportParameter [] ), значения которых могут использоваться в скриптах отчетной формы.
- Из системы был удалён список обслуживающих инженеров, поэтому удалён класс ServicemanManager.
- Класс Serviceman теперь наследуется от AccountBase.
- В LersServerException добавлено поле Error, в котором находится значение из перечисления ErrorCode. С его помощью можно определить какая именно ошибка произошла при обработке запроса.
- Удалены устаревшие методы получения данных температурного графика. Теперь нужно использовать только методы, возвращающие Task.
- Удалены устаревшие методы класса NodeJob.
- Исключения NoConnectionException и Networking.RequestDisconnectException теперь наследуются от одного базового родителя Networking.RequestConnectionException. Это позволит в обработчиках ошибок перехватывать и обрабатывать только родительское исключение RequestConnectionException.
- Удалены устаревшие методы AccountManager.GetAccountAdditionalInfoAsync и AccountManager.GetOwnNotificationSettingsAsync
- Метод MeasurePoint.GetContractAnalysisDataAsync теперь возвращает
Task<T>
.
3.07 R26
- В операции LersServer.ConnectAsync теперь можно запросить токен восстановления сеанса, который затем используется вместо логина и пароля для повторного подключения.
- Добавлен класс GsmModemCommandExtensions, позволяющий выполнять AT-команды на подключенных к службе опроса GSM-модемах. Описание и примеры использования находятся в документации.
- В классе 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
- 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();
}
Синхронные методы получения объектов и списков отмечены устаревшими. Вместо них предлагается использовать новые асинхронные. Обратите внимание что в приложениях, у которых есть графический интерфейс пользователя, стоит использовать только асинхронные методы с помощью технологии await. Ожидание завершения асинхронного задания приведёт к блокировке программы.
В консольных приложениях метод 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();
}
- Удалены старые асинхронные и синхронные методы у класса TerritoryManager. Список территорий и территорию по идентификатору теперь можно получить только с помощью async/await.
- Добавлен класс Lers.Administration.SystemParameters для работы с системными параметрами.
- Добавлен класс Lers.Administration.AccountLogManager для работы с журналом учётной записи.
- Добавлены события, вызывающиеся при создании, изменении или удалении объектов:
- Lers.Communal.RoomManager.RoomChanged - вызывается при изменении помещения
- Lers.Core.ServiceCompanyManager.ServiceCompanyChanged
- Lers.Core.SupplierManager.SupplierChanged
- Lers.Core.CustomerManager.CustomerChanged
- Lers.Core.EquipmentManager.EquipmentChanged
- Lers.Core.NodeGroupManager.NodeGroupChanged
- Добавлена возможность создание подключений объекта учёта
Пример создания 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();
- Теперь через 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();
- Следующие типы перенесены из сборки Lers.System в сборку Lers.Core:
- SystemType
- ResourceKind
- IncidentType
- IncidentImportance Если ваш модуль или приложение использовали один из этих типов, добавьте в него ссылку на сборку Lers.Core.dll
3.07 R21
- Классы пространства имён Lers.Utils вынесены из Lers.System в сборку Lers.Utils.
- Изменён метод ReportManager.GetPreparedReportInfo(Async). Удалён параметр reportOptions.
- Изменён класс ReportOptionsObject. Удалён флаг GetPreparedReport.
3.07 R18
В версии 3.07 R18 подключения были перенесены в объект учёта из точки учёта и удалены сети устройств.
Полный список изменений:
Пространство/класс | Удалено |
---|---|
Lers.Core | Класс DeviceNetwork |
Lers.Core.EquipmentManager | Методы - GetNetworkList - GetNetworkListAsync |
Lers.Core.EquipmentPollSettings | Свойства - Network |
Lers.Core.MeasurePointManager | Методы - GetListByDeviceNetworkAsynс |