Создание и использование пользовательских расширений
В данной статье рассмотрен пример создания и использования пользовательского расширения для вычисления значений даты/времени в бизнес-процессе.
Пользовательское расширение – это операция, размещаемая на графической модели процесса и выполняющая действия, определяемые сценарием этого пользовательского расширения. Пользовательские расширения позволяют определить использовать один и тот же сценарий в разных моделях процессов. При этом для использования готовых расширений не требуется наличие навыков написания сценариев.
Задача вычисления даты/времени очень часто возникает в бизнес-процессах, предназначенных для обеспечения соблюдения временного регламента выполнения операций. При этом значения даты/времени могут вычисляться как с учетом рабочего календаря, так и без него.
В рассматриваемом примере создадим пользовательское расширение, которое будет в качестве входных значений принимать исходную дату, количество добавляемых к исходной дате дней, часов и минут, а также признак вычисления с учетом рабочего календаря. Пользовательское расширение будет возвращать вычисленные на основании входных значений дату и время.
Процедура создания пользовательского расширения описана в соответствующем разделе справки.
В рабочем календаре задаются выходные и праздничные дни, а также режим работы. Подробнее об этом можно прочитать в этой статье.
В новом пользовательском расширении необходимо определить контекстные переменные на вкладке Параметры (рис. 1):
- Исходная дата – тип Дата/Время, Входное;
- Количество добавляемых дней – тип Целое число, Входное;
- Количество добавляемых часов – тип Целое число, Входное;
- Количество добавляемых минут – тип Целое число, Входное;
- С учетом рабочего календаря – тип Да/Нет, Входное;
- Вычисленная дата – тип Дата/Время, Выходное.
Рис. 1. Контекстные переменные пользовательского расширения
Для вычисления даты с учетом рабочего календаря необходимо подключить пространства имен:
using EleWise.ELMA.Scheduling; using EleWise.ELMA.Services;
В сценарии сначала проверяем заполнение входных параметров расширения. Если не задано значение параметра Исходная дата, оно заполняется текущим значением даты и времени, для параметров Количество добавляемых дней, Количество добавляемых часов, Количество добавляемых минут по умолчанию используется значение "0". Для параметра С учетом рабочего календаря по умолчанию используется значение "Нет".
На основании введенных или заполненных по умолчанию значений параметров определяем временной интервал, который необходимо добавить:
TimeSpan ts = new TimeSpan(parameters.KolichestvoDobavlyaemyhDney, parameters.KolichestvoDobavlyaemyhChasov, parameters.KolichestvoDobavlyaemyhMinut, 0);
Вычисление даты с учетом рабочего календаря производится с помощью следующего сценария:
var calendar = Locator.GetServiceNotNull(); parameters.VychislennayaData = calendar.EvalTargetTime(parameters.IshodnayaData.Value, ts);
Если вычисление даты производится без учета рабочего календаря, используем сценарий:
parameters.VychislennayaData = parameters.IshodnayaData.Value.Add(ts);
Полный текст модуля сценариев пользовательского расширения выглядит следующим образом:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using EleWise.ELMA.Services; using EleWise.ELMA.Scheduling; using Parameters = EleWise.ELMA.Workflow.Models.Parameters.CA_VychislenieDaty; namespace EleWise.ELMA.Model.Scripts { /// /// Модуль сценариев пользовательского расширения "Вычисление даты" /// //Внимание! Для корректной работы программы не изменяйте название класса public class CA_VychislenieDaty_Scripts { //Внимание! В классе должен быть метод Execute с данной сигнатурой public void Execute(Parameters parameters) { //Если не задано значение параметра Исходная дата, оно заполняется текущим значением даты и времени if (parameters.IshodnayaData == null) parameters.IshodnayaData = DateTime.Now; //Для параметров Количество добавляемых дней, Количество добавляемых часов, Количество добавляемых минут //по умолчанию используется значение "0" if (parameters.KolichestvoDobavlyaemyhDney == null) parameters.KolichestvoDobavlyaemyhDney = 0; if (parameters.KolichestvoDobavlyaemyhChasov == null) parameters.KolichestvoDobavlyaemyhChasov = 0; if (parameters.KolichestvoDobavlyaemyhMinut == null) parameters.KolichestvoDobavlyaemyhMinut = 0; //Для параметра С учетом рабочего календаря по умолчанию используется значение Нет if (parameters.SUchetomRabochegoKalendarya == null) parameters.SUchetomRabochegoKalendarya = false; TimeSpan ts = new TimeSpan((int)parameters.KolichestvoDobavlyaemyhDney, (int)parameters.KolichestvoDobavlyaemyhChasov, (int)parameters.KolichestvoDobavlyaemyhMinut, 0); if (parameters.SUchetomRabochegoKalendarya) { var calendar = Locator.GetServiceNotNull<IProductionCalendarService>(); parameters.VychislennayaData = calendar.EvalTargetTime(parameters.IshodnayaData.Value, ts); } else { parameters.VychislennayaData = parameters.IshodnayaData.Value.Add(ts); } } } }
После создания пользовательского расширения его необходимо опубликовать. Для публикации необходимо воспользоваться кнопкой верхнего меню Сохранить - Публиковать (рис. 2). Публикация пользовательского расширения не требует перезагрузки сервера.
Рис. 2. Кнопка верхнего меню "Сохранить-Публиковать"
После публикации пользовательское расширение доступно в блоке Plug-ins боковой панели инструментов карточки процесса.
Рассмотрим простой процесс выставления счета для оплаты товара. При моделировании данного процесса аналитику не требуется писать никаких сценариев, достаточно указать значения параметров, заданных ранее для пользовательского расширения (рис. 3).
Рис. 3. Процесс выставления счета с использованием пользовательского расширения
Менеджер по продажам выставляет счет, указывая дату его выставления, а также его номер и контрагента. После выставления счета бухгалтеру следует подтвердить поступление оплаты по счету. Счет действителен в течении 3-х рабочих дней с даты выставления. Если счет не был оплачен своевременно, менеджеру по продажам следует выставить счет повторно.
Настройки формы задачи "Выставить счет клиенту" (рис. 4).
Рис. 4. Настройка формы задачи "Выставить счет клиенту"
Входные/выходные атрибуты расширения Вычисление даты (рис. 5).
Рис. 5. Настройка входных/выходных атрибутов расширения "Вычисление даты"
Настройки эскалации по таймеру из операции "Подтвердить оплату по счету".
Рис. 6. Настройка таймера