Creatio development guide
PDF
Разработка в bpm'online на примерах

Как создавать пользовательские напоминания и уведомления

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. — Напоминание об актуализации лида

© Terrasoft 2002-2019.

Был ли данный материал полезен?

Как можно улучшить эту статью?