Дополнительная логика

Для маршрута можно указать хранимую процедуру, которая будет вызываться на каждый переход, выполняемый по этому маршруту.

Поле для выбора процедуры-обработчика на форме маршрута

Процедура может реализовать дополнительные проверки, запрашивать подтверждения и управлять логикой перехода.

Пример процедуры

create procedure [demo].[usp_WfVacationApplication] ( @ID_Process int, @ID_StageTo int, @ID_Transition int, @FlagConfirmVacation bit null -- Дополнительный необязательный параметр для механизма подтверждения ) as if (select s.Code from wf.Process p join wf.Stage s on p.ID_Stage = s.ID where p.ID = @ID_Process) = 'signing' and @FlagConfirmVacation is null begin if exists(select * from demo.VacationApplication where ID = (select ID_Record from wf.Process where ID = @ID_Process) and DATEDIFF(day, DateOfApplication, DateStart) < 3) begin -- Проверка и запрет перехода raiserror('Дата заявления должна быть не раньше 3 дней с даты начала отпуска', 2, 1) return; end -- Интерфейс подтверждения select 'success' as [$Type], 'Подать заявление' as [$Title], 'FlagConfirmVacation' as [$Param], '1' as [$ParamValue] union all select 'danger' as [$Type], 'Отменить' as [$Title], 'FlagConfirmVacation' as [$Param], '0' as [$ParamValue] raiserror('Вы уверены, что хотите подать заявление на отпуск?', 2, 1) return; end if @FlagConfirmVacation = 0 -- В строке в колонке $ID_StageTo процедура может вернуть стадию, на которую нужно осуществить переход select s2.ID as [$ID_StageTo] from wf.Process p join wf.Stage s on p.ID_Stage = s.ID join wf.Stage s2 on s.ID_Route = s.ID_Route where s2.Code = 'approved' and p.ID = @ID_Process -- Если процедура ничего не возвращает - используется стандартная логика переходов

Спецификация

Параметры процедуры:

  • @ID_Process int — идентификатор процесса.

  • @ID_StageTo int — идентификатор стадии, на которую осуществляется переход.

  • @ID_Transition int — идентификатор осуществляемого перехода.

С помощью хранимой процедуры можно:

  • Перейти на любую стадию. Для этого необходимо вернуть строку с идентификатором стадии, на которую нужно перейти, в поле $ID_StageTo.

  • Выдать подтверждения/ошибки с помощью стандартного механизма подтверждений.

Если хранимая процедура ничего не возвращает, то срабатывает стандартная логика.