Определение исполнителя для динамической зоны ответственности по принципу «Кто первый» в сценарии

Иногда возникает необходимость назначить исполнителей зоны ответственности непосредственно в ходе выполнения бизнес-процесса. Если исполнитель должен быть только один, то для этого достаточно использовать динамическую зону ответственности, определяемую сценарием. Однако бывают случаи, когда требуется, чтобы задача зоны ответственности приходила группе пользователей по принципу «Кто первый» (кто первый взял себе задачу, тот и становится исполнителем зоны ответственности), и при этом группа пользователей определяется в ходе бизнес-процесса, то есть заранее неизвестна. Такую задачу можно решить, используя сценарий изменения настроек зоны ответственности.

Например, есть процесс "Обработка заявки". Приём заявок осуществляется в центральном офисе, а работы по ней ведутся в филиалах. Выбор филиала осуществляется в момент приёма заявки. Затем задачу по обработке заявки должны получить сотрудники выбранного филиала, чтобы один из них назначил её на себя.

Схема процесса:




Контекстные переменные:

  • Исполнитель – типа Пользователь;
  • Группа пользователей – типа Группа пользователей;
  • Должность – типа Элемент оргструктуры.

Зона ответственности "Филиал" должна иметь следующие настройки:

  • Тип – динамическая (выбор из списка);
  • флажок Использовать механизм "Кто первый" – обязателен для заполнения;
  • переменная для определения/хранения исполнителя – контекстная переменная Исполнитель.



Сценарий "Изменение зоны ответственности"

После выбора группы пользователей запускается сценарий изменения настроек зоны ответственности "Филиал":

// получение настроек зоны ответственности, исполнитель которой хранится в переменной Ispolnitelj
var settings = (EntityUserSettings)context.GetSettingsFor(c => c.Ispolnitelj);
 // сброс списка групп и должностей в настройках зоны ответственности
settings.Workers.Clear();
// добавление элемента оргструктуры из контекстной переменной Dolzhnostj в настройки зоны ответственности
settings.Workers.Add(new Worker { WorkerType = OrganizationItemDTO.MetadataUid, WorkerId = context.Dolzhnostj.Id });
// добавление группы пользователей из контекстной переменной GruppaPoljzovateley в настройки зоны ответственности
settings.Workers.Add(new Worker { WorkerType = UserGroupDTO.MetadataUid, WorkerId = context.GruppaPoljzovateley.Id });
// сохранение изменённых настроек зоны ответственности
settings.Save();


При этом в сценарий необходимо добавить пространства имен:

using EleWise.ELMA.Security.Types.Settings;
using EleWise.ELMA.Security.DTO.Models;
using EleWise.ELMA.Security.Models;