Шаг 4. Реализуйте автозаполнение расписания

Основы

На предыдущем шаге мы добавили к странице проверку соответствия текущего количества активных ежедневных секций количеству залов для групповых занятий.

Теперь реализуем автоматическое заполнение расписания групповых занятий — добавим на страницу действие, которое будет добавлять в расписание 4 новых записи.

Для этого создадим бизнес-процесс, который будет записывать в таблицу базы данных необходимые данные и возвращать в схему страницы сообщение о том, что записи добавлены.

Создать бизнес-процесс 

  1. Перейдите в раздел Конфигурация (Configuration).
  2. В списке пакетов выберите пакет "TryItPackage".
  3. На панели инструментов рабочей области нажмите кнопку Добавить (Add) и выберите в списке тип конфигурационного элемента Бизнес процесс (Business process).
    scr_Add_BusinessProcess.png
  4. Заполните поля свойств процесса значениями:
    • Название (Name) — "UsrAddTrainingsProcess".
    • Код (Code) — "UsrAddTrainingsProcess".
      scr_BusinessProcess_Settings.png
  5. На вкладку Параметры (Parameters) добавьте входящие параметры и параметры, необходимые для работы процесса:
    Название (Title) Код (Code) Тип данных (Data type) Направление (Direction) Значение (Value)
    ProcessSchemaPeriodicity ProcessSchemaPeriodicity Строка (500 символов) (Text (500 characters)) Входящий (Input)  
    NewDate NewDate Дата/Время (Date/Time) Двунаправленный (Bidirectional)  
    Number Number Целое число (Integer) Двунаправленный (Bidirectional) 4
    ProcessSchemaId ProcessSchemaId Уникальный идентификатор (Unique identifier) Входящий (Input)  
    ProcessSchemaCoach ProcessSchemaCoach Уникальный идентификатор (Unique identifier) Входящий (Input)  
    scr_BusinessProcess_Parameters.png
  6. Разместите в рабочей области процесса элементы:

    • Исключающее ИЛИ (Exclusive gateway (OR)).
    • Формула (Formula).
    • Добавить данные (Add data).
    • Задание-сценарий (Script task).

    Cоедините элементы стрелками, как показано на рисунке ниже.

    scr_BusinessProcess_Schema.png

    Процесс выполняется следующим образом:

    • Логический оператор Исключающее ИЛИ (Exclusive gateway (OR)) "Periodicity" — проверяет периодичность секции, для которой нужно заполнить расписание, и разветвляет процесс на следующем шаге в зависимости от периодичности. 
    • Элементы Формула (Formula) — процесс выполняет расчет даты занятия, в зависимости от периодичности секции. Дата записывается в параметр процесса NewDate.
    • Элемент Добавить данные (Add data) — процесс записывает новые данные группового занятия в таблицу базы данных.
    • Элемент Формула (Formula) "New loop formula" — процесс выполняет расчет количества оставшихся для заполнения записей. По условию примера, необходимо заполнить и записать 4 новых записи. Результат записывается в параметр процесса Number.
    • Логический оператор Исключающее ИЛИ (Exclusive gateway (OR)) "New loop" — проверяет значение параметра процесса Number. Если оно больше 0, то выполняет повторение предыдущих шагов. Если значение параметра равно 0, то выполняется переход к следующему шагу.
    • Элемент Задание-сценарий (Script task) — процесс выполняет публикацию сообщения о том, что новые записи групповых занятий добавлены.
  7. Настройте элементы бизнес-процесса.

    Исключающее ИЛИ (Exclusive gateway (OR))  "Periodicity".

    1. Условный поток (Conditional flow) "Daily":
      • Условие перехода(Condition to move down the flow) — [#ProcessSchemaPeriodicity#]=="Daily".
      scr_BP_2.png
    2. Условный поток (Conditional flow) "Every 3 days":
      • Условие перехода(Condition to move down the flow) — [#ProcessSchemaPeriodicity#]=="Every 3 days".
      scr_BP_3.png
    3. Условный поток (Conditional flow) "Weekly":
      • Условие перехода(Condition to move down the flow) — [#ProcessSchemaPeriodicity#]=="Weekly".
      scr_BP_4.png

    Формула (Formula) "Daily formula":

    • В какой параметр передать значение формулы?(Which parameter to set the formula value to?) — "NewDate".
    • Значение формулы(Formula value) — DateTime.Now.AddDays(4-[#Number#]).
    scr_BP_5.png

    Формула (Formula) "Every 3 days formula":

    • В какой параметр передать значение формулы?(Which parameter to set the formula value to?) — "NewDate".
    • Значение формулы(Formula value) — DateTime.Now.AddDays((4-[#Number#])*3).
    scr_BP_6.png

    Формула (Formula) "Weekly formula":

    • В какой параметр передать значение формулы?(Which parameter to set the formula value to?) — "NewDate".
    • Значение формулы(Formula value) — DateTime.Now.AddDays((4-[#Number#])*7).
    scr_BP_6.png

    Добавить данные (Add data) "Add training":

    • В какой объект добавить данные?(Which object to add data to?) — "Group training".
    • Какой режим добавления данных?(What is the data adding mode?) — Добавить одну запись (Add one record).
    • Какие значения колонок установить? (Which column values to set?)
      Колонка объекта Тип добавляемых данных Значение
      [Group sections] Параметр процесса ProcessSchemaId
      [Training date] Параметр процесса NewDate
      [Training status] Значение справочника Planned
      [Training time] Выбор времени 9:00
    scr_BP_7.png

    Формула (Formula) "New loop formula":

    • В какой параметр передать значение формулы?(Which parameter to set the formula value to?) — "Number".
    • Значение формулы(Formula value) — [#Number#]-1.
    scr_BP_8.png

    Исключающее ИЛИ (Exclusive gateway (OR)) "New loop".

    1. Условный поток (Conditional flow) "One more record":
      • Условие перехода(Condition to move down the flow) — [#Number#]>=1.
      scr_BP_9.png
    2. Условный поток (Conditional flow)  "All records added":
      • Условие перехода(Condition to move down the flow) — [#Number#]<1.
      scr_BP_10.png

    Задание-сценарий (Script task) "Sending a message":

    var userConnection = Get<UserConnection>("UserConnection");
    Terrasoft.Configuration.MsgChannelUtilities.PostMessage(
        userConnection,
        "AddingTrainings",
        "");
    return true;
    
    scr_BP_11.png
  8. Сохраните процесс.

Создать замещающую модель представления 

Для реализации обмена сообщениями между процессом и модулем страницы создайте замещающую модель представления базовой схемы ClientMessageBridge. Эта схема реализует транслирование сообщений, полученных по WebSocket, подписчикам внутри Creatio.  

  1. Перейдите в раздел Конфигурация (Configuration).
  2. В списке пакетов выберите пакет "TryItPackage".
  3. На панели инструментов рабочей области нажмите кнопку Добавить (Add) и выберите в списке тип конфигурационного элемента Замещающая модель представления (Replacing view model).
  4. Заполните поле Родительский объект (Parent object) модели представления значением "ClientMessageBridge (ClientMessageBridge)". Остальные поля будут заполнены автоматически.
    scr_ClientMessageBridge.png
  5. В дизайнере схем добавьте исходный код.
    ClientMessageBridge.js
    define("ClientMessageBridge", ["ConfigurationConstants"],
        function(ConfigurationConstants) {
            return {
                /* Сообщения. */
                messages: {
                    /* Имя сообщения. */
                    "AddingTrainings": {
                        /* Тип сообщения — широковещательное, без указания конкретного подписчика. */
                        "mode": Terrasoft.MessageMode.BROADCAST,
                        /* Направление сообщения — публикация. */
                        "direction": Terrasoft.MessageDirectionType.PUBLISH
                    }
                },
                methods: {
                    /* Инициализация схемы. */
                    init: function() {
                        /* Вызов родительского метода. */
                        this.callParent(arguments);
                        /* Добавление нового конфигурационного объекта в коллекцию конфигурационных объектов. */
                        this.addMessageConfig({
                            /* Имя сообщения, получаемого по WebSocket. */
                            sender: "AddingTrainings",
                            /* Имя сообщения, с которым оно будет разослано. */
                            messageName: "AddingTrainings"
                        });
                    
                    }
                }
            };
        });
  6. Сохраните схему, нажав кнопку Сохранить (Save).

Отредактировать исходный код страницы 

На страницу групповой секции добавьте действие, которое будет автоматически добавлять новые занятия на деталь “Групповые занятия”.

  1. Перейдите в раздел Конфигурация (Configuration).
  2. В списке пакетов выберите пакет "TryItPackage".
  3. В результате работы мастеров в пакете уже содержатся схемы разных типов. С помощью сортировки по типу схем выберите для отображения схемы с типом Клиентский модуль (Client module).

    scr_Client_Module.png

  4. Двойным нажатием мыши откройте схему UsrGroupSections1Page и отредактируйте исходный код:
    UsrGroupSections1Page
    define("UsrGroupSections1Page", ["ProcessModuleUtilities"], function(ProcessModuleUtilities) {
    	return {
    		entitySchemaName: "UsrGroupSections",
    		messages: {
    			/* Сообщение, которое вызывает обновление детали. */
    			"AddingTrainings": {
    				"mode": Terrasoft.MessageMode.BROADCAST,
    				"direction": Terrasoft.MessageDirectionType.SUBSCRIBE
    			}
    		},
    		/* Без изменений. */
    		attributes: {
    			// ...
    		},
    		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
    		/* Без изменений. */
    		details: /**SCHEMA_DETAILS*/{
    			// ...
    		}/**SCHEMA_DETAILS*/,
    		
    		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
    		/* Добавляем новые методы к существующим. */
    		methods: {
    			
    			// ...
    	
    			init: function() {
    				this.callParent(arguments);
    				/* Подписка на сообщение, которое вызывает обновление детали. */
    				this.sandbox.subscribe("AddingTrainings", this.updateTrainings, this);
    			},
    			/* Добавляет действие в меню действий. */
    			getActions: function() {
    				var actionMenuItems = this.callParent(arguments);
    				actionMenuItems.addItem(this.getButtonMenuItem({
    					"Caption": {bindTo: "Resources.Strings.AddTrainingsActionCaption"},
    					// Определяем метод-обработчик для действия.
    					"Click": {bindTo: "getBusinessProcessAddTrainings"},
    					"Enabled": true
    				}));
    				return actionMenuItems;
    			},
    			/* Вызывает обновление детали на странице записи. */
    			updateTrainings: function() {
    				this.updateDetail({
    					// Код детали.
    					"detail": "UsrSchema12c4c6adDetail5a26acfb",
    					"reloadAll": true
    				});
    			},
    			/* Метод-обработчик для нового действия в меню. */
    			getBusinessProcessAddTrainings: function() {
    				/* Получаем необходимые для процесса входящие параметры. */
    				var id = this.get("Id");
    				var periodicity = this.get("UsrPeriodicity").displayValue;
    				var coach = this.get("UsrCoach").value;
    				if (!periodicity) {
    					return;
    				}
    				/* Создаем конфигурационный объект для запуска процесса. */
    				var args = {
    					/* Имя созданного в предыдущих пунктах процесса. */
    					sysProcessName: "UsrAddTrainingsProcess",
    					/* Входящие параметры процесса. */
    					parameters: {
    						ProcessSchemaId: id,
    						ProcessSchemaPeriodicity: periodicity,
    						ProcessSchemaCoach: coach
    					}
    				};
    				/* Запуск процесса. */
    				ProcessModuleUtilities.executeProcess(args);
    			},
    		},
    		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
    		/* Без изменений. */
    		diff: /**SCHEMA_DIFF*/[
    		
    		// ...
    		
    		]/**SCHEMA_DIFF*/
    	};
    });
  5. Сохраните схему, нажав на кнопку Сохранить (Save).

В результате мы реализовали автоматическое заполнение расписания групповых занятий. На следующем шаге необходимо реализовать веб-сервис, который будет предоставлять информацию о количестве занятий в расписании.