Поддержка счетчиков уведомлений

advertisement
Поддержка счетчиков уведомлений
Предыстория
До того как наш продукт был разделен на отдельные пакеты (Invoice, Document и т.д.) для
получения количества уведомлений, мы использовали представление VwRemindingsCount. В sql
запросе, который возвращал количество уведомлений, этой view упоминались разные сущности,
такие как Активности, Документы, Счета и другие. После того как мы разделились на отдельные
пакеты появилась потребность собирать продукты в разных комбинациях пакетов. Но такая
возможность не вписывалась в работу механизма получения количества уведомлений, т.к. запрос
у VwRemindingsCount на стороне сервера статичен и всегда включал полный перечень всех
сущностей не зависимо от того установлен ли пакет с этими сущностями.
Например, мы собрали сборку, в которой есть все пакеты кроме Счетов. Следовательно, если
бы мы использовали данные из представления VwRemindingsCount, мы получили бы ошибку т.к. в
запросе мы выбираем данные из Счетов а их по факту в БД нет, потому что не ставили пакет
Счета.
Решение
Для того, что бы избежать ошибочные ситуации и обеспечить возможность поддержки счетчиков
уведомлений отдельно для каждого пакета, механизм формирования количества уведомлений
был перенесен на конфигурацию в виде сервиса RemindingsDataService. Данный сервис собирает
количество уведомлений для счетчиков со всех зарегистрированных в системе провайдеров
уведомлений. Для того, что бы поддержать счетчики для нового типа уведомлений, нужно создать
провайдер, зарегистрировать его в системе и прописать логику получения количества для нового
типа уведомлений.
Так же со стороны клиента нужно теперь обращаться не к представлению VwRemindingsCount а
к методу GetRemindingsCount сервиса RemindingsDataService.
Для того что бы поддержать счетчики по старому или новому типу уведомлений нужно
выполнить ряд действий. А именно:
1. В конфигурации нужно создать класс, унаследованный от интерфейса INotificationProvider.
1. В классе нужно определить методы:
 SetParameters – для установки параметров нужных для работы класса. Для
нашего случая достаточно UserConnection.
 GetCount – самый важный метод. Он должен возвращать количество для
того типа уведомлений для которого создается данный провайдер. Логика
данного метода может быть произвольной. Главное, что бы он вернул
целое число, т.е. интересующее количество уведомлений для счетчиков.
 GetEntitiesSelect – можно оставить пустым. Данный метод нужен для
расширения механизма провайдеров для вычитки собственно сущностей.
Такой подход используется в провайдерах виз.
2. Созданный класс нужно положить в тот пакет, в котором реально будут
присутствовать все сущности и окружение для корректной работы логики метода
GetCount. Например, для счетчика уведомлений Документов, используется
DocumentNotificationProvider, который лежит в пакете Document.
2. Нужно зарегистрировать созданный класс в справочнике NotificationProvider. А именно
нужно в таблицу NotificationProvider положить строку в поле ClassName которой указанно
имя созданного класса провайдера (например
Terrasoft.Configuration.DocumentNotificationProvider) и Type = 1. Есть два типа провайдеров.
Те что с типом 1 работают для счетчика уведомлений, те что с типом 0 формируют
коллекцию данных для виз. Перечисление типов провайдеров называется
NotificationProviderType, на момент написания статьи содержит значения Reminding и Visa.
3. Добавленную строку нужно привязать как данные к тому пакету где будет лежать класс
провайдера.
В итоге мы получаем поддержку счетчиков уведомлений отдельно для каждого пакета.
Например, если стоит пакет Счета, то и количество уведомлений считается с учетом уведомлений
счетов. Если пакет Счета не установлен, то все счетчики уведомлений не ломаются из-за
отсутствия счетов.
Пример реализации класса провайдера можно посмотреть в схеме DocumentNotificationProvider.
Пример вызова из конфигурации:
function getRemindingsCounters(scope, callback) {
var currentContactId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
var currentDate = new Date(Ext.Date.now());
ServiceHelper.callService(
"RemindingsDataService",
"GetRemindingsCount",
function(response) {
var responseObject = Terrasoft.decode(response);
var result = Terrasoft.decode(responseObject.GetRemindingsCountResult);
var remindingsCount = result.RemindingsCount;
var emailsCount = result.EmailsCount;
var visaCount = result.VisaCount;
var sysAdminUnit = result.SysAdminUnit;
callback.call(scope, {
remindingsCount: remindingsCount,
emailsCount: emailsCount,
visaCount: visaCount,
sysAdminUnit: sysAdminUnit
});
},
{
sysAdminUnitId: currentContactId,
dueDate: currentDate
},
this);
}
В виду того, что счетчики уведомлений могут запрашиваться как с клиента, так и по процессу,
следует помнить о том, что все параметры с типом DateTime будут приводиться к universal time с
учетом временной зоны, установленной в userConnection.CurrentUser.
Download