Дополнительная логика
Для маршрута можно указать хранимую процедуру, которая будет вызываться на каждый переход, выполняемый по этому маршруту.
Процедура может реализовать дополнительные проверки, запрашивать подтверждения и управлять логикой перехода.
Пример процедуры
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
.Выдать подтверждения/ошибки с помощью стандартного механизма подтверждений.
Если хранимая процедура ничего не возвращает, то срабатывает стандартная логика.