Этап 5. Автозаполнение предложения
дня
Алгоритм работы бизнес-процесса
Перед созданием процесса необходимо определить логику, по которой он будет работать:
- Процесс считывает количество продуктов с категорией товара равной категории товара предложения дня.
- Если продуктов не найдено, процесс завершает работу.
- Иначе создаются записи «Продукт в предложении дня» в количестве равной значению системной настройки «Количество продуктов в предложении дня».
Предварительные действия
Для реализации логики понадобятся следующие элементы бизнес-процесса:
- Исключающее «ИЛИ» — используется для ветвления процесса между различными его вариантами;
- Читать данные — используется для чтения данных из системы;
- Добавить данные — используется для создания записей;
- Формула — используется для вычислений;
- Задание-сценарий — используется для выполнения программного кода на C#.
Рисунок 1 — Необходимые элементы из панели инструментов

Создание бизнес-процесса
- Откройте раздел «Конфигурация».
- Выберите ранее созданный пакет.
- Создайте бизнес-процесс, нажав на кнопку «Добавить». Из списка выберите «Бизнес-процесс».
Рисунок 2 — Создание бизнес-процесса

- На вкладке «Настройки» заполните поля:
- «Заголовок» — «Наполнение предложения дня»;
- «Имя» — «BpmCompleteOfferLowCodeProcess».
Рисунок 3 — Настройка бизнес-процесса

- Из панели инструментов вынесите и соедините элементы процесса как показано на рисунке ниже. Настройки элементов описаны далее в шагах 7-18.
Рисунок 4 — Схема бизнес-процесса

- В блоке «Параметры» настройки бизнес-процесса добавьте параметры из таблицы 1:
Таблица 1 — Параметры процесса
| Название | Код | Тип данных | Направление | Значение |
| Идентификатор Категории товара | ProcessBpmProductCategoryIdParameter | Уникальный идентификатор | Входящий | |
| Идентификатор Предложения дня | ProcessBpmDealIdParameter | Уникальный идентификатор | Входящий | |
| Количество продуктов из системной настройки | ProcessProductCountFromSysSettings | Целое число | Двунаправленный | Формула (Рисунок 6) |
| Количество созданных записей | ProcessCreatedProudctInDealCount | Целое число | Двунаправленный | 0 |
| Количество считанных продуктов в системе | ProcessProductCountFromSystem | Целое число | Двунаправленный | Формула (Рисунок 7) |
Рисунок 5 — Параметры бизнес-процесса

Рисунок 6 — Параметр «Количество продуктов из системной настройки»
Рисунок 7 — Параметр «Количество считанных продуктов в системе»
- Настройте элемент «Читать данные».
Рисунок 8 — Элемент «Читать данные»
- Настройте первый элемент ветвления: заполните название «Есть ли в системе продукты?».
Рисунок 9 — Элемент ветвления «Есть ли в системе продукты?»
- Настройте условный поток «Нет» элемента ветвления «Есть ли в системе продукты?»:
[#Количество считанных продуктов в системе#] <= 0
Рисунок 10 — Условный поток «Нет» ветви «Есть ли в системе продукты?»
- Настройте условный поток «Да» элемента ветвления «Есть ли в системе продукты?»:
[#Количество считанных продуктов в системе#] > 0
Рисунок 11 — Условный поток «Да» ветви «Есть ли в системе продукты?»
- Настройте второй элемент ветвления: заполните название «Количество созданных записей меньше заданного?».
Рисунок 12 — Элемент ветвления «Количество созданных записей меньше заданного?»
- Настройте условный поток «Да» элемента ветвления «Количество созданных записей меньше заданного?»:
[#Количество созданных записей#] <= [#Количество продуктов из системной настройки#]
Рисунок 13 — Условный поток «Да» ветви «Количество созданных записей меньше заданного?»
- Настройте элемент «Добавить данные».
Рисунок 14 — Элемент «Добавить данные»
- Настройте элемент «Формула»:
[#Количество созданных записей#] + 1
Рисунок 15 — Элемент «Формула»
- Настройте третий элемент ветвления: заполните название «Успешно созданы все записи?».
Рисунок 16 — Элемент ветвления «Успешно создано все записи?»
- Настройте условный поток «Да» элемента ветвления «Успешно создано все записи?»:
[#Количество созданных записей#] == [#Количество продуктов из системной настройки#]
Рисунок 17 — Условный поток «Да» ветви «Успешно созданы все записи?»
- Настройте условный поток «Нет» элемента ветвления «Успешно создано все записи?»:
[#Количество созданных записей#] < [#Количество продуктов из системной настройки#]
Рисунок 18 — Условный поток «Нет» ветви «Успешно создано все записи?»
- Настройте элемент «Задание-сценарий».
Рисунок 19 — Элемент «Задание-сценарий»
Вставьте код:
BPMSoft .Configuration .MsgChannelUtilities .PostMessage(UserConnection, "CompleteDeal", ""); return true;
- Сохраните и опубликуйте процесс.
Создание замещающей модели представления
Для обмена данными между процессом и страницей необходимо создать замещающую модель представления базовой схемы ClientMessageBridge. Обмен сообщениями между процессами и схемами осуществляется при помощи технологии WebSocket.
- Откройте раздел «Конфигурация».
- Выберите ранее созданный пакет.
- Создайте замещающую модель представления, нажав на кнопку «Добавить». Из списка выберите «Замещающая модель представления».
Рисунок 20 — Создание замещающей модели представления
- В открывшемся окне заполните свойство «Родительский объект», указав значение ClientMessageBridge. Поля «Код» и «Заголовок» заполнятся автоматически после выбора родительского объекта.
Рисунок 21 — Свойства клиентского модуля
- Добавьте следующий код:
define("ClientMessageBridge", ["ConfigurationConstants"],
function(ConfigurationConstants) {
return {
/* Сообщения. */
messages: {
/* Имя сообщения. */
"CompleteDeal": {
/* Тип сообщения — широковещательное, без указания конкретного подписчика. */
"mode": BPMSoft.MessageMode.BROADCAST,
/* Направление сообщения — публикация. */
"direction": BPMSoft.MessageDirectionType.PUBLISH
}
},
methods: {
/* Инициализация схемы. */
init: function() {
/* Вызов родительского метода. */
this.callParent(arguments);
/* Добавление нового конфигурационного объекта в коллекцию конфигурационных объектов. */
this.addMessageConfig({
/* Имя сообщения, получаемого по WebSocket. */
sender: "CompleteDeal",
/* Имя сообщения, с которым оно будет разослано. */
messageName: "CompleteDeal"
});
}
}
};
});
- Сохраните изменения.
Добавление действия на страницу
Для вызова созданного процесса добавим действие на страницу. Для этого:
- Откройте раздел «Конфигурация».
- Выберите ранее созданный пакет.
- Используя фильтры, найдите «Страница редактирования: “Предложения дня”».
Рисунок 22 — Страница редактирования: “Предложения дня”
- Измените исходный код:
Обратите внимание, в коде клиентского модуля выполнены следующие изменения:
- В массив зависимостей добавлен модуль ProcessModuleUtilities для запуска бизнес-процессов (Строка 1).
- Добавлено свойство messages с сообщением CompleteDeal для режима подписки (Строки 5-10).
- Добавлена бизнес-логика в методы свойства methods (Строки 38-88).
В свойстве diff находятся автоматически сгенерированные элементы, которые могут различаться на разных стендах. Рекомендуется оставить содержимое diff без изменений.
define("BpmDealsOfDayPage", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) {
return {
entitySchemaName: "BpmDealsOfDay",
/** Свойство messages */
messages: {
"CompleteDeal":{
"mode": BPMSoft.MessageMode.BROADCAST,
"direction": BPMSoft.MessageDirectionType.SUBSCRIBE
}
},
/** Свойство attributes */
attributes: {},
/** Свойство modules */
modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
/** Свойство details */
details: /**SCHEMA_DETAILS*/{
"Files": {
"schemaName": "FileDetailV2",
"entitySchemaName": "BpmDealsOfDayFile",
"filter": {
"masterColumn": "Id",
"detailColumn": "BpmDealsOfDay"
}
},
"BpmProductInDeal": {
"schemaName": "BpmProductInDealSchema",
"entitySchemaName": "BpmProductInDeal",
"filter": {
"detailColumn": "BpmDealsOfDay",
"masterColumn": "Id"
}
}
}/**SCHEMA_DETAILS*/,
/** Свойство businessRules */
businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
/** Свойство methods */
methods: {
/* Переопределение базового метода init */
init: function(){
// Вызов родительского метода
this.callParent(arguments);
// Подписка на сообщение "CompleteDeal", после получения сообщения будет выполнен метод updateProducts
this.sandbox.subscribe("CompleteDeal", this.updateProducts,this);
},
/* Обновление детали "Продукты в предложении дня" */
updateProducts: function(){
this.updateDetail({
// Код детали.
"detail": "BpmSchema0ddb2a98Detail68c9d3bb",
"reloadAll": true
});
},
/* Переопределение базового метода для добавление пользовательского действия */
getActions: function(){
// Получаем базовые действия страницы
let actionMenuItems = this.callParent(arguments);
// Добавляем новое действие
actionMenuItems.addItem(this.getButtonMenuItem({
"Caption": "Наполнить предложение",
"Click": {bindTo: "compleateTheDeal"},
"Enabled": true
}));
return actionMenuItems;
},
/* Вызов процесса наполнения детали "Продукты в предложении дня" */
compleateTheDeal: function(){
// Получаем идентификатор предложения дня, после передадим в качестве параметра процесса
let offerId = this.get("Id");
// Получаем идентификатор категории товара, полсе передадим в качестве параметра процесса
let productCategoryId = this.get("BpmProductCategory").value;
// Параметры для запуска процесса
var args = {
/* Имя созданного в предыдущих пунктах процесса. */
sysProcessName: "BpmCompleteOfferLowCodeProcess",
/* Входящие параметры процесса. */
parameters: {
ProcessBpmProductCategoryIdParameter: productCategoryId,
ProcessBpmDealIdParameter:offerId,
}
};
// Вызываем процесс. Для вызова необходимо подключить модель ProcessModuleUtilities
ProcessModuleUtilities.executeProcess(args);
}
},
/** Свойство dataModels */
dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
/** Свойство diff */
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"name": "BpmDealName",
"values": {
"layout": {
"colSpan": 24,
"rowSpan": 1,
"column": 0,
"row": 0,
"layoutName": "ProfileContainer"
},
"bindTo": "BpmDealName",
"enabled": true
},
"parentName": "ProfileContainer",
"propertyName": "items",
"index": 0
},
{
"operation": "insert",
"name": "BpmOfferDate",
"values": {
"layout": {
"colSpan": 24,
"rowSpan": 1,
"column": 0,
"row": 1,
"layoutName": "ProfileContainer"
},
"bindTo": "BpmOfferDate",
"enabled": true
},
"parentName": "ProfileContainer",
"propertyName": "items",
"index": 1
},
{
"operation": "insert",
"name": "BpmProductCategory",
"values": {
"layout": {
"colSpan": 11,
"rowSpan": 1,
"column": 0,
"row": 0,
"layoutName": "Header"
},
"bindTo": "BpmProductCategory",
"enabled": true,
"contentType": 5
},
"parentName": "Header",
"propertyName": "items",
"index": 0
},
{
"operation": "insert",
"name": "BpmIsActive",
"values": {
"layout": {
"colSpan": 11,
"rowSpan": 1,
"column": 13,
"row": 0,
"layoutName": "Header"
},
"bindTo": "BpmIsActive",
"enabled": true
},
"parentName": "Header",
"propertyName": "items",
"index": 1
},
{
"operation": "insert",
"name": "ProductTab",
"values": {
"caption": {
"bindTo": "Resources.Strings.Tabf0eecf56TabLabelTabCaption"
},
"items": [],
"order": 0
},
"parentName": "Tabs",
"propertyName": "tabs",
"index": 1
},
{
"operation": "insert",
"name": "BpmProductInDeal",
"values": {
"itemType": 2,
"markerValue": "added-detail"
},
"parentName": "ProductTab",
"propertyName": "items",
"index": 0
},
{
"operation": "remove",
"name": "ESNTab"
},
{
"operation": "remove",
"name": "ESNFeedContainer"
},
{
"operation": "remove",
"name": "ESNFeed"
}
]/**SCHEMA_DIFF*/
};
});
- Сохраните изменения.
Результат выполнения задачи:
Рисунок 23 — Действие «Наполнить предложение» на странице предложения дня
Рисунок 24 — Результат наполнения
Рекомендуем изучить
Начало разработки
Этап 4. Валидация данных
Этап 6. Создание веб-сервиса
Настройка бизнес-процессов
Обучающий курс «Бизнес-процессы в BPMSoft»