Создание пользовательского действия бизнес-процесса
- Автор: Толмачев Дмитрий
- Организация: Программные технологии
- Применимо: bpm'online 7.x / 5.x
- Дата: 15.05.2015
История одного действия
В данной статье речь пойдет о создании пользовательского действия бизнес-процесса на основе уже существующего. Думаю, что все знакомы с таким замечательным действием БП как «Выполнить задачу» (рис. 1), который позволяет настроить создание активности и поднять карточку.
Рис.1 http://take.ms/K3T3i
Но мое любимое свойство этого действия – это возможность за счет последующего ветвления ограничить количество предлагаемых результатов и вывести результаты в виде цветных кнопок (рис. 2)
Рис.2 http://take.ms/zP5L0
К сожалению его использование ранее прекращалось, как только в активность добавлялось новое поле, которое необходимо динамически заполнять в БП. А такая ситуация случалась чуть чаще чем постоянно.
Вместо этого приходилось придумывать разного рода конструкции вида:
1) Использование страницы редактирования
Рис 3. http://take.ms/2VBdo
2) Использование промежуточного сигнала на изменение активности
Рис 4. http://take.ms/OKNVH
Но оба эти варианта не позволяли увидеть «красивые кнопочки» результата. К тому же приходилось дополнительно либо искусственно ограничивать результаты, либо создавать для каждой задачи свою категорию.
Решение
В итоге задавшись наконец этим вопросом, я решил возродить для себя этот магический элемент. Проанализировав, стало ясно, что в действии используются схемы:
• ActivityUserTask / Выполнить задачу [Действие]
• ActivityUserTaskParametersEditPage / Страница редактирования параметров действия «Выполнить задачу»
К сожалению, не найдя способа заместить действие решил воспользоваться старым добрым экспорт/подмена UId/импорт. Экспортировав схему ActivityUserTask заменил (везде) в ней 3 интересующие меня значения
• Название схемы: ActivityUserTask -> SmrActivityUserTask
• Заголовок: Выполнить задачу -> Выполнить настраиваемую задачу
• UId: b5c726f2-af5b-4381-bac6-913074144308 -> b5c726f2-af5b-4381-bac6-913074144309 [!]
[!] Обязательно стоит проверить на существование данный UId в таблицe SysSchema. В случае совпадения наша новая схема заменит уже существующую при импорте. Далее импортируем действие в свой пакет (я предпочитаю хранить пользовательские действия в отдельном пакете)
Рис 5. http://take.ms/83Tjj
Теперь у нас есть собственное действие для создания задачи, которое мы можем редактировать, настраивать, изменять и добавлять параметры.
Для удобства также создадим свою страницу редактирования на базе старой: «Добавить» -> «Страница». В качестве родительской выбирается:
• Страница редактирования параметров действия "Выполнить задачу"
Рис 6. http://take.ms/9sw5B
Предположим, что мы создали новый раздел «Обращение» / SmrCase и в активности добавили на него ссылку. Теперь мы хотим использовать это «Обращение» в нашем действии.
Настройка страницы
Добавим новое справочное поле на страницу:
1. Добавим «Поле параметра» в контейнер «Связи активности»
Рис 7. http://take.ms/Z9s1p
Свойства элемента: • Название: SmrCaseEdit • Подпись: Обращение • Тип данных: Справочник
2. Пропишем привязку поля к параметру действия (сам параметр создадим в действии чуть позже):
Необходимо на странице переопределить метод «GetActivityControlsBinding»
Рис 8. http://take.ms/uFEkh
customBinding.Add( "SmrCase", Page.SmrCaseEdit);
return customBinding;
Настройка Действия
Для начала привяжем действие к странице. Для этого в свойствах действия укажем
• Страница редактирования параметров = Страница редактирования параметров действия "Выполнить настраиваемую задачу"
Можно также указать свое изображение действия. Теперь необходимо дополнить логику нашего действия с учетом добавленного поля:
1) Добавим новый параметр в действие «SmrCase»
Название: SmrCase
Подпись: Обращение
Тип данных: Справочник
Справочник: Обращение
Схема: SmrCase
2) Изменить метод «CreateActivity», добавив обработку параметра SmrCase.
activity.SetDefColumnValues();
// SmrCase
var columnSmrCase = activity.Schema.Columns.FindByName( "SmrCase" );
if (columnSmrCase != null && SmrCase != Guid .Empty)
{
activity.SetColumnValue(columnSmrCase, SmrCase);
}
//...
3) Изменить метод «CompleteExecuting», добавив обработку параметра SmrCase.
if (activity == null)
{
return false ;
}
// SmrCase
var columnSmrCase = activity.Schema.Columns.FindByName( "SmrCase" );
if (columnSmrCase != null)
{
object smrCase = activity.GetColumnValue(columnSmrCase);
if (smrCase != null )
{
SmrCase = ( Guid)smrCase;
}
}
//...
Добавить действие в список действий БП
В общем случае для использования, созданного нами действия можно воспользоваться элементом «Действие процесса» в свойствах которого указать:
• Действие: Выполнить настраиваемую задачу
Но если этот элемент используется действительно часто можно добавить его в общий список. Для этого необходимо зарегистрировать ее в БД. В общем случае достаточно прописать скрипт:
[SysUserTaskSchemaUId] ,
[IsQuickModel] ,
[Caption]
)
VALUES (
(SELECT TOP 1 UId FROM SysSchema WHERE ( Name = 'SmrActivityUserTask' )),
1 ,
'Настраиваемая задача' )
GO
К сожалению название действие в списке генерируется в ядре, поэтому оно у нас все равно получится без названия, но подобрав подходящее изображение можно легко понять зачем нужно это действие.
Вот что у нас получается в результате:
Рис 9. http://take.ms/G2PDS
Теперь мы можем использовать свое собственное (настраиваемое!) действие для создания задачи.