Импорт процесса BPMN¶
Система поддерживает базовый импорт процессов в формате BPMN 2.0. Система создает каркас процесса в конструкторе на основе импортируемого процесса BPMN (с ограничениями, т.к. не все элементы нотации присутствуют в конструкторе процессов). На основе полученного каркаса уже можно реализовать процесс с помощью конструктора процессов.
Конвертацию процесса при необходимости можно доработать под свои нужды с помощью доработки или реализации своих конвертеров объектов нотации BPMN. Более подробно об этом написано в разделе Доработка конвертации процесса.
Для того, чтобы импортировать процесс, нужно:
-
Открываем или создаем шаблон бизнес-процесса, открываем версию процесса, в которую хотим импортировать структуру процесса из BPMN.
-
Нажимаем кнопку “Импортировать” на панели с кнопками в редакторе процесса.
-
В открывшемся окне выбираем тип файла - Процесс BPMN.
-
Выбираем файл процесса и нажимаем кнопку “Открыть”.
-
Система конвертирует процесс BPMN в процесс на конструкторе бизнес-процессов.
Ограничения¶
Конструктор процессов не реализует нотацию BPMN 2.0 полностью, поэтому при импорте процесса, описанного с помощью данной нотации, есть ряд ограничений.
В базовой реализации конвертации процессов BPMN в процесс конструктора бизнес-процессов игнорируются следующие элементы BPMN:
-
Пулы и линии (Pools and Lanes). Все содержимое пулов и линий конвертируется.
-
Потоки сообщений (Message flow), которые идут от/к пулу. Система конвертирует потоки сообщений, которые соединяют узлы различных пулов.
-
Задача хореографии (Choreography Task).
-
Объект данных (Data Object).
-
Сообщение (Message).
-
Группа (Group).
-
Соединитель страниц (Off-Page Connector).
-
Промежуточное событие, присоединенное к границам других Элементов (Boundary Event). Само событие не переносится, однако все исходящие из него потоки операций и сообщений обрабатываются так, будто они выходят из элемента, к которому относится данное промежуточное событие.
В базовой реализации конвертации процессов BPMN в процесс конструктора бизнес-процессов следующие элементы BPMN имеют ограничения и особенности при конвертации:
-
Поток операций (Sequence Flow) - в процесс на конструкторе не передается информацию о типе потока операций (условный, по умолчанию). Данные настройки в бизнес-процессе конструктора определяются настройкой условий в связи.
-
Текстовая аннотация (Text Annotation) - в BPMN текстовая аннотация может быть привязана к нескольким элементам с помощью ассоциаций (Association). Текстовые аннотации в конструкторе могут быть привязаны только к одному элементу, поэтому при конвертации текстовой аннотации из BPMN переносится связь только с первым элементом (первый элемент определяется структурой данных процесса).
-
Действие (Activity) - настройки действия Цикличность действия (Activity Looping), Многоэкземплярность (Multiple Instances) и Маркер Ad Hoc (Ad-Hoc Marker) не переносятся в бизнес-процесс конструктора. Логика данных настроек в бизнес-процессе определяется действиями в узле и входящими в узел связями.
-
Подпроцесс (Sub-Process) и Транзакция (Transaction) - данные элементы не переносятся в процесс, написанный на конструкторе, но переносится содержимое данных процессов. Обусловлено это тем, что в конструкторе процессов нет поддержки подпроцессов встроенных в процесс. Все подпроцессы создаются как отдельные шаблоны процесса.
Настройка импортированного процесса¶
Рассмотрим абстрактный процесс согласования заявки на отпуск. В нотации BPMN он мог бы выглядеть примерно следующим образом:
Импортировав файл с данным процессом в конструктор процессов система создаст следующий каркас процесса:
В первую очередь можно поправить внешний вид процесса в конструкторе:
Узел запуска процесса по умолчанию ожидает сигнал Start. Оставим данное поведение и не будем дополнительно настраивать действия данного узла.
Далее рассмотрим узел Заполнение заявки на отпуск. В различных ситуациях данный узел может содержать различный набор действий, в зависимости от требований (в нем может меняться состояние заявки, выполняться какие-нибудь дополнительные скрипты и т.д.). В базовом примере предположим, что данный этап - это некоторое задание с вариантами завершения “Отправить на согласование” и “Отменить”. По умолчанию в каждом узле типа Действие (Activity) из BPMN добавляется одно действие с типом Сценарий. С помощью конструктора добавляем в данный узел действие с типом Задание и удаляем изначальное действие Сценарий.
Данное действие необходимо настроить, указав в нем соответствующие параметры задания и настроить обработку вариантов завершения в соответствии с требуемой логикой.
Далее рассмотрим узлы Уведомления руководителя и Согласование заявки. По придуманной нами логике данные узлы должны отправить уведомление руководителю и отправить ему задание на согласование соответственно. Конструктор позволяет поместить несколько последовательно выполняемых действий в один узел. Поэтому мы можем упростить наш процесс, объединив в один узел Согласование заявки и отправку задания и отправку уведомления.
Tip
При использовании действия Уведомление с действием Задание следует ограничить список обрабатываемых сигналов, указав обрабатываемый сигнал Default. В противном случае при каждом действии с заданием (взятие в работу, возврат на роль, завершение) система будет отправлять уведомление.
Tip
Действие Задание в настройках имеет поле Уведомление, которое позволяет указать уведомление, которое придет исполнителю задания при его создании. Это позволяет отправить и задание и уведомление одним действием.
Объединять данные узлы не обязательно, иногда бывает полезно визуально показать в процессе, что происходит отправка уведомления.
Узлы с отправкой уведомления о согласовании, не согласовании и доработки заявки настраиваются по одной схеме:
-
Добавляем действие Уведомление
-
Удаляем действие Сценарий
-
Настраиваем действие Уведомление, чтобы указанному сотруднику приходило соответствующее уведомление.
Узел Обработка заявки - это некая логика, которая определяет, как система обработает согласование заявки. Например, запишет в некий календарь отпусков информацию о новом отпуске, или автоматически добавит заместителя для инициатора на период отпуска. В большинстве случаев данная логика реализуется с помощью скриптов и поэтому действие Сценарий для данного узла подходит как нельзя кстати.
Узел завершения процесса не требует доработки и по умолчанию завершает данный процесс при переходе на него.
Доработка конвертации процесса¶
Система импорта процесса BPMN поддерживает возможность доработки конвертации объектов, в том числе тех, обработка которых сейчас игнорируется.
Для того, чтобы реализовать свой конвертер объекта BPMN нужно:
-
Сделать свою реализацию интерфейса
IWorkflowEngineBPMNObjectConverter<T>
, гдеT
- тип конвертируемого объекта BPMN (список всех типов находится в пространстве именTessa.Workflow.BPMN.Classes
). Лучше всего использовать в качестве базового классаWorkflowEngineBPMNObjectConverterBase<T>
или его открытого наследника, в зависимости от объекта, для которого создается конвертер. -
Зарегистрировать ваш класс в Unity.
-
Зарегистрировать ваш класс в
IWorkflowEngineBPMNObjectConverterResolver
с указанием в качестве ключа - тип объекта, для которого будет использоваться конвертер (типT
из первого пункта).
Все платформенные конвертеры находятся в пространстве имен Tessa.Workflow.BPMN.Converters
.
Пример переопределения конвертера для объекта tUserTask
(задание пользователя):
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Tessa.Platform.Storage;
using Tessa.Workflow.Actions.Descriptors;
using Tessa.Workflow.BPMN.Classes;
using Tessa.Workflow.Storage;
namespace Tessa.Workflow.BPMN.Converters
{
public class MyTUserTaskConverter : TUserTaskConverter
{
#region Constructors
public MyTUserTaskConverter(IWorkflowEngineBPMNObjectConverterResolver objectConverterResolver)
: base(objectConverterResolver)
{
}
#endregion
#region Base Overrides
protected override async Task PrepareForConvertAsyncCore<CoreT>(IWorkflowEngineBPMNObjectConverterContext<CoreT, tUserTask> context)
{
await base.PrepareForConvertAsyncCore(context);
// Базовая реализация создает узел WE для элементов узлов BPMN и записывает его в context.BPMNObjectInfo["Node"]
WorkflowNodeStorage node = context.BPMNObjectInfo.TryGet<WorkflowNodeStorage>("Node");
var name = node.Name;
// Добавляем действие Задание
var action = node.Actions.Add();
action.ActionTypeID = WorkflowActionDescriptors.TaskDescriptor.ID;
action.Order = 0;
action.Caption = name;
action.Hash = new Dictionary<string, object>(StringComparer.Ordinal)
{
// Здесь можно заполнить параметры действия некими настройками
};
action.SetName(name);
}
protected override string GetNodeName(tUserTask element)
{
// Переопределяем имя для узлов данного типа в WE
return "UserTask";
}
#endregion
}
}
Пример его регистрации:
// Регистрируем в Unity
this.UnityContainer.RegisterType<MyTUserTaskConverter>(new ContainerControlledLifetimeManager());
// Регистрируем как конвертер для объекта
this.UnityContainer.Resolve<IWorkflowEngineBPMNObjectConverterResolver>()
.Register<MyTUserTaskConverter>(typeof(tUserTask))
;