[ELMA3] Проверка наличия незавершенных процессов согласования документа с помощью сценария
Сценарий для проверки наличия незавершенных процессов согласования документа. В начало бизнес-процесса необходимо добавить исключающий ИЛИ-шлюз и блок сценария.
Переход "Есть незавершённый процессы" необходимо пометить как переход по умолчанию.
Пример с использованием PublicAPI
Контекстные переменные:
- Документ (context.DocumentHere) – переменная типа Документ. Документ, который отправляется на согласование;
- Итератор (context.Iterator) – переменная типа Целое число. Не может иметь пустое значение, по умолчанию имеет значение ‘0’;
- Список процессов (context.CheckList) – переменная типа Текст.
Для корректной работы необходимо подключить следующие пространства имен:
using EleWise.ELMA.API;
Текст сценария:
var findedWorkflows = PublicAPI.Processes.WorkflowInstance.Filter().GeneralStatus(PublicAPI.Enums.Workflow.WorkflowInstanceGeneralStatus.Current).Query(String.Format("Id IN (FROM P_Approvement SELECT WorkflowInstance WHERE DocumentThere = {0})", context.DocumentHere.Id.ToString())).Find();
//Запись наименований запущенных процессов согласования в текстовую переменную CheckList
foreach(var proc in findedWorkflows)
{
context.CheckList += "\n" + proc.Name.ToString(); //Запись наименования экземпляра процесса
context.Iterator++; //Увеличение счётчика запущенных процессов
}
Пример без использования PublicAPI
Контекстные переменные:
- Документ (context.DocumentHere) – переменная типа Документ. Документ, который отправляется на согласование;
- Итератор (context.Iterator) – переменная типа Целое число. Не может иметь пустое значение, по умолчанию имеет значение ‘0’;
- Список процессов (context.CheckList) – переменная типа Текст.
Для корректной работы необходимо подключить следующие пространства имен:
using EleWise.ELMA.Model.Services; using EleWise.ELMA.Workflow.Models; using EleWise.ELMA.Workflow.Managers;
Текст сценария в блоке Поиск запущенных процессов:
var filter = InterfaceActivator.Create<IWorkflowInstanceFilter>(); //Создание фильтра по экземплярам процесса filter.GeneralStatus = WorkflowInstanceGeneralStatus.Current; //Поиск запущенных процессов filter.Query = String.Format("Id IN (FROM P_Approvement SELECT WorkflowInstance WHERE DocumentThere = {0})", context.DocumentHere.Id.ToString()); var findedWorkflows = WorkflowInstanceManager.Instance.Find(filter, null); //Поиск экземпляров процессов по указанному фильтру //Запись наименований запущенных процессов согласования в текстовую переменную CheckList foreach(var proc in findedWorkflows) { context.CheckList += "\n" + proc.Name.ToString(); //Запись наименования экземпляра процесса context.Iterator++; //Увеличение счётчика запущенных процессов }
Разбор запроса filter.Query:
P_Approvement – имя класса процесса в базе данных, запущенные экземпляры которого мы ищем. Найти это имя можно во вкладке Настройки бизнес-процесса.
DocumentThere – имя контекстной переменной в базе, совпадения по которой мы ищем. В данном примере нам нужно найти документ. Имя можно посмотреть во вкладке Контекст бизнес-процесса, запущенные экземпляры которого необходимо найти.
В условии перехода Нет запущенных процессов необходимо указать сценарий:
if(context.Iterator == 0) return true; else return false;