Как создавать пользовательские напоминания и уведомления
Glossary Item Box
Общие сведения
В bpm'online версии 7.12.0 переработан механизм отправки уведомлений и напоминаний.
Ранее для отправки пользовательского уведомления требовалось:
- Создать класс, реализующий интерфейс INotificationProvider или наследующий абстрактный класс BaseNotificationProvider.
- В созданный класс добавить логику для выбора пользовательских напоминаний приложением.
- Зарегистрировать класс в таблице NotificationProvider.
При этом уведомления отправлялись раз в минуту, вызывая все классы из таблицы NotificationProvider.
Начиная с версии 7.12.0 достаточно создать уведомление или напоминание с нужными параметрами. После этого приложение либо отправит уведомление мгновенно, либо отобразит напоминание в указанное время.
Чтобы отправлять пользовательские напоминания:
1. В пользовательском пакете создайте схему [Исходный код], в которой определите класс для формирования текста напоминания и всплывающего окна. Класс должен реализовывать интерфейс IRemindingTextFormer (объявлен в схеме IRemindingTextFormer пакета Base).
2. Заместите нужный объект (например, объект [Лид]) и задайте в нем логику отправки напоминания.
3. Заместите схему вкладки напоминаний ReminderNotificationsSchema для отображения напоминаний по требуемому объекту.
Описание примера
Создать пользовательское напоминание о дате актуализации продажи в лиде. Дата должна быть указана в поле [Дата следующей актуализации] на вкладке [Информация о сделке].
Исходный код
Пакет с реализацией примера для bpm'online sales enterprise можно скачать по ссылке.
Алгоритм реализации примера
1. Создать класс для формирования текста напоминания и всплывающего окна
1. Создайте в пользовательском пакете схему [Исходный код] (см. "Создание схемы [Исходный код]"). Установите для нее следующие значения свойств (рис. 1):
- [Заголовок] ([Title]) — "Конструктор текста напоминаний лида" ("Lead Reminding Text Former").
- [Название] ([Name]) — "UsrLeadRemindingTextFormer".
Рис. 1. — Свойства схемы [Исходный код]
2. Используя контекстное меню вкладки [Структура] ([Structure]), добавьте в схему две локализуемые строки (рис. 2). Свойства локализуемых строк приведены в таблице 1.
Рис. 2. — Добавление локализуемых строк в схему
Табл. 1. — Свойства локализуемых строк
[Название] ([Name]) | [Значение] ([Value]) |
---|---|
TitleTemplate | Необходимо актуализировать продажу (You need to update the sale) |
BodyTemplate | Лид {0} требует актуализации информации по продаже (Lead {0} requires update of sales information) |
3. На вкладку [Исходный код] ([Source code]) добавьте реализацию класса для формирования текста напоминания и всплывающего окна:
namespace Terrasoft.Configuration { using System.Collections.Generic; using Terrasoft.Common; using Terrasoft.Core; public class UsrLeadRemindingTextFormer : IRemindingTextFormer { private const string ClassName = nameof(UsrLeadRemindingTextFormer); protected readonly UserConnection UserConnection; public UsrLeadRemindingTextFormer(UserConnection userConnection) { UserConnection = userConnection; } // Формирует текст напоминания из коллекции входящих параметров и локализуемой строки BodyTemplate. public string GetBody(IDictionary<string, object> formParameters) { formParameters.CheckArgumentNull("formParameters"); var bodyTemplate = UserConnection.GetLocalizableString(ClassName, "BodyTemplate"); var leadName = (string)formParameters["LeadName"]; var body = string.Format(bodyTemplate, leadName); return body; } // Формирует заголовок напоминания из имени класса и локализуемой строки TitleTemplate. public string GetTitle(IDictionary<string, object> formParameters) { return UserConnection.GetLocalizableString(ClassName, "TitleTemplate"); } } }
4. Сохраните и опубликуйте схему.
2. Заместить объект [Лид] и задать в нем логику отправки напоминания
1. Создайте замещающую схему объекта [Лид] (см. раздел "Создание замещающей схемы объекта" статьи "Создание схемы объекта").
2. Используя команду [Дополнительно] ([Additional]) — [Открыть процесс] ([Open process]), перейдите в дизайнер встроенного процесса замещающего объекта [Лид] (рис. 3).
Рис. 3. — Команда перехода в дизайнер встроенного процесса
3. Используя контекстное меню вкладки [Структура] ([Structure]), добавьте параметр процесса GenerateReminding (рис. 4) со следующими свойствами (рис. 5):
- [Заголовок] ([Title]) — "Сгенерировать напоминание" ("Generate Reminding").
- [Название] ([Name]) — "GenerateReminding".
- [Тип данных] ([Data type]) — "Boolean".
Рис. 4. — Добавление параметра процесса
Рис. 5. — Свойства параметра процесса
4. На вкладке [Структура] ([Structure]), в группе [Methods] выберите метод LeadSavingMethod(), который вызывается перед сохранением объекта (рис. 6). Укажите признак [Переопределен] ([Override]) и добавьте следующий исходный код в тело метода:
// Вызов базовой реализации метода. base.LeadSavingMethod(); // Получение идентификатора ответственного. var oldOwnerId = Entity.GetTypedOldColumnValue<Guid>("OwnerId"); // Получение даты следующей актуализации. DateTime oldRemindDate = Entity.GetTypedOldColumnValue<DateTime>("NextActualizationDate"); // Сравнение старого значения идентификатора ответственного и нового. bool ownerChanged = !Entity.OwnerId.Equals(oldOwnerId); // Сравнение старого значения даты актуализации и нового. bool remindDateChanged = !Entity.NextActualizationDate.Equals(oldRemindDate); // Параметру процесса GenerateReminding присвоить true, если были изменены или ответственный, // или дата следующей актуализации. GenerateReminding = ownerChanged || remindDateChanged;
К СВЕДЕНИЮ
Для отображения редактора исходного кода тела метода дважды кликните по названию метода на вкладке [Структура].
Рис. 6. — Свойства метода LeadSavingMethod
5. На вкладке [Структура] ([Structure]), в группе [Methods] выберите метод LeadSavedMethod(), который вызывается после сохранения объекта (рис. 7). Укажите признак [Переопределен] ([Override]) и добавьте следующий исходный код в тело метода:
base.LeadSaved(); // Проверки необходимости генерации напоминания. if (!GenerateReminding) { return; } DateTime remindTime = Entity.NextActualizationDate; if (Entity.OwnerId.Equals(Guid.Empty) || remindTime.Equals(default(DateTime))) { return; } // Создание экземпляра класса UsrLeadRemindingTextFormer. IRemindingTextFormer textFormer = ClassFactory.Get<UsrLeadRemindingTextFormer>(new ConstructorArgument("userConnection", UserConnection)); // Получение названия лида. string leadName = Entity.LeadName; // Получение текста напоминания. string subjectCaption = textFormer.GetBody(new Dictionary<string, object> { {"LeadName", leadName} }); // Получение заголовка напоминания. string popupTitle = textFormer.GetTitle(null); // Конфигурирование напоминания. var remindingConfig = new RemindingConfig(Entity); // Автор сообщения — текущий контакт. remindingConfig.AuthorId = UserConnection.CurrentUser.ContactId; // Целевой получатель — ответственный лида. remindingConfig.ContactId = Entity.OwnerId; // Тип — напоминание. remindingConfig.NotificationTypeId = RemindingConsts.NotificationTypeRemindingId; // Дата отправки напоминания — дата актуализации продажи в лиде. remindingConfig.RemindTime = remindTime; // Текст напоминания. remindingConfig.Description = subjectCaption; // Заголовок напоминания. remindingConfig.PopupTitle = popupTitle; // Создание утилитного класса напоминания. var remindingUtilities = ClassFactory.Get<RemindingUtilities>(); // Создание напоминания. remindingUtilities.CreateReminding(UserConnection, remindingConfig);
Рис. 7. — Свойства метода LeadSavedMethod
К СВЕДЕНИЮ
Чтобы напоминания отображались на вкладке системных уведомлений , необходимо в коде метода LeadSavedMethod вместо remindingConfig.NotificationTypeId = RemindingConsts.NotificationTypeRemindingId; указать remindingConfig.NotificationTypeId = RemindingConsts.NotificationTypeNotificationId;
6. Сохраните и опубликуйте схему встроенного процесса объекта [Лид]. Затем опубликуйте схему объекта [Лид].
3. Заместить схему вкладки напоминаний ReminderNotificationsSchema
1. Чтобы отображались напоминания по требуемому объекту, создайте в пользовательском пакете замещающую схему ReminderNotificationsSchema и добавьте в нее необходимую программную логику. Как создать замещающую клиентскую схему описано в статье "Создание клиентской схемы". Свойства замещающей схемы (рис. 8):
- [Заголовок] ([Title]) — "Модуль уведомлений" ("Notifications module").
- [Название] ([Name]) — "ReminderNotificationsSchema".
Рис. 8. — Свойства схемы ReminderNotificationsSchema
2. На вкладку [Исходный код] ([Source code]) схемы добавьте следующий исходный код:
define("ReminderNotificationsSchema", ["ReminderNotificationsSchemaResources"], function() { return { entitySchemaName: "Reminding", methods: { // Определяет, относится ли напоминание к лиду. getIsLeadNotification: function() { return this.get("SchemaName") === "Lead"; }, // Возвращает заголовок напоминания. getNotificationSubjectCaption: function() { var caption = this.get("Description"); return caption; } }, // Массив модификаций модели представления. diff: [ // Основной контейнер напоминания. { "operation": "insert", "name": "NotificationleadItemContainer", "parentName": "Notification", "propertyName": "items", "values": { "itemType": Terrasoft.ViewItemType.CONTAINER, "wrapClass": [ "reminder-notification-item-container" ], // Отображается только для лидов. "visible": {"bindTo": "getIsLeadNotification"}, "items": [] } }, // Контейнер для заголовка. { "operation": "insert", "name": "NotificationItemleadTopContainer", "parentName": "NotificationleadItemContainer", "propertyName": "items", "values": { "itemType": Terrasoft.ViewItemType.CONTAINER, "wrapClass": ["reminder-notification-item-top-container"], "items": [] } }, // Изображение. { "operation": "insert", "name": "NotificationleadImage", "parentName": "NotificationItemleadTopContainer", "propertyName": "items", "values": { "itemType": Terrasoft.ViewItemType.BUTTON, "className": "Terrasoft.ImageView", "imageSrc": {"bindTo": "getNotificationImage"}, "classes": {"wrapClass": ["reminder-notification-icon-class"]} } }, // Отображение даты. { "operation": "insert", "name": "NotificationDate", "parentName": "NotificationItemleadTopContainer", "propertyName": "items", "values": { "itemType": Terrasoft.ViewItemType.LABEL, "caption": {"bindTo": "getNotificationDate"}, "classes": {"labelClass": ["subject-text-labelClass"]} } }, // Отображение текста напоминания. { "operation": "insert", "name": "NotificationleadSubject", "parentName": "NotificationItemleadTopContainer", "propertyName": "items", "values": { "itemType": Terrasoft.ViewItemType.LABEL, "caption": {"bindTo": "getNotificationSubjectCaption"}, "click": {"bindTo": "onNotificationSubjectClick"}, "classes": {"labelClass": ["subject-text-labelClass", "label-link", "label-url"]} } } ] }; });
3. Сохраните схему.
В результате выполнения примера для лидов, у которых указаны ответственный и дата следующей актуализации (рис. 9), будут приходить напоминания о необходимости актуализации (рис. 10).
Рис. 9. — Лид с указанными ответственным и датой следующей актуализации
Рис. 10. — Напоминание об актуализации лида