Проверка доступности исполнителей на этапе маршрута#
Используется, чтобы проверить, доступен ли хотя бы один исполнитель на этапе маршрута. Если все назначенные пользователи и профили недоступны, скрипт устанавливает флаг и отправляет системное уведомление, предотвращая зависание задачи.
Место применения: Управление бизнес-процессами > Справочники > Схема бизнес-процесса > [Процесс] > Редактировать > Вкладка "Процедуры" > Поле процедуры выполнения.
Тип: JEXL-скрипт
/*
spCheckAvailableExecutorByPsSubject
Проверка свободных исполнителей по субъекту процесса
*/
/*
Проверка свободных исполнителей по субъекту процесса для выполнения задачи
Параметры: {системное имя субъекта процесса};{параметр для записи числового значения}
*/
var NNumber = function (number) { new ("ru.bitec.app.gtk.lang.NNumber", number); }
// param - строка с произвольными параметрами jexl скрипта
var paramArr = param.split(";");
var svSignSubj = paramArr[0];
var svParamName = paramArr[1].toString();
// idpPrState- параметр jexl скрипта с id состояния
var ropProc = Bpm_PrStateApi.getProcess(idpPrState);
var ropSignOpt = Bpm_PrSubjectApi.getByPSSubject(ropProc, svSignSubj);
if (!empty(ropSignOpt)) {
var ropSign = ropSignOpt.get();
var aroSign = ropSign.copyAro();
var idPrSubject = aroSign.id;
var sqlUser = `select btkUser.gid from Btk_User btkUser
where btkUser.id in (select prsubjuser.idUser from Bpm_PrSubjUser prSubjUser
where prsubjuser.idPrSubject = `+idPrSubject+`)`;
var gidavUser = sql(sqlUser).asList();
var sqlAcProfile = `select acProfile.gid from Btk_AcProfile acProfile
where acProfile.id in (select prSubjAcProfile.idAcProfile from Bpm_PrSubjAcProfile prSubjAcProfile
where prSubjAcProfile.idPrSubject = `+idPrSubject+`)`;
var gidavAcProfile = sql(sqlAcProfile).asList();
gidavUser.addAll(gidavAcProfile);
if (!Bpm_ProcessApi.checkVarExists(ropProc, svParamName)) {
raise(`Переменной`+svParamName+` для данного процесса не существует!!`);
}
Bpm_ProcessApi.setProcessVar(ropProc, svParamName, 1);
for (gidvResource : gidavUser) {
var query = `select t.id
from Mpr_OperModeResource t
where t.gidResource = '`+gidvResource.gid+`'
and t.dbegin < now() and (t.dend is null or t.dend > now())`;
var lst = sql(query).asList();
if (lst.size() == 0) {
Bpm_ProcessApi.setProcessVar(ropProc, svParamName, 0);
}
}
if (Bpm_ProcessApi.getProcessVar(ropProc, svParamName).toLong() == 0.0) {
var idvState = Bpm_PrStateApi.load(idpPrState).copyAro().idState();
var svCaption = Btk_ClassStateApi.load(idvState).copyAro().sCaption();
selection.coreRep().application().notifications().notify("Задача, направленная по маршруту, не может быть выполнена, поскольку в данный момент отсутствуют доступные исполнители. Текущее состояние задачи: "+svCaption);
}
}