Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /****** Object: StoredProcedure [wfl].[WorkflowRun] Script Date: 11. 5. 2017 14:11:10 ******/
- ALTER PROCEDURE [wfl].[WorkflowRun]
- @WorkflowId int,
- @StartType int, --1 - od zacatku do konce (@StartStepId ma id prvniho kroku wfl)
- --2 - od urciteho kroku do konce
- --3 - pouze urcity krok
- @UserId int, -- id uzivatele kdo wfl pousti
- @StartStepId int = NULL,
- @InputWorkflowRunId int = 0 --Pokud pokračujeme v pozastavenem behu - musi byt na vstupu Id pozastaveneho behu
- AS
- -- =================================================
- -- Author: JPR
- -- Create date: 08.03.2017
- -- Description: Procedura spouští krok za krokem daného wfl
- -- Changelog: 11.5.2017 - jpr - wfl neceka na potvrzeni pri pusteni jen jednoho kroku s potvrzenim
- -- 16.3.2018 - jpr - přidána podpora typu kroku 5 (Spust jine wfl). v podstatě se jen do seznamu kroku
- -- - ke spusteni rekurzivne natáhnou kroky i z "child" wfls
- DECLARE
- @ProcedureName varchar(50) = 'WorkflowRun',
- @CurrentStepId int,
- @CurrentLevel int,
- @CurrentOrder int,
- @CurrentStepResult int,
- @WorkflowRunId int,
- @Waiting bit = 0,
- @ValidateResult int,
- @NewRun bit = 0
- BEGIN
- TRY
- --Pokud se wfl pousti od zacatku, nemusi byt vyplnen @StartStepId, vezme se první z daneho wfl
- SET @StartStepId = CASE WHEN @InputWorkflowRunId IS NULL AND @StartStepId IS NULL
- THEN (SELECT TOP 1 Id FROM wfl.WorkflowSteps WHERE WorkflowId = @WorkflowId ORDER BY OrderNo)
- ELSE @StartStepId
- END
- IF @InputWorkflowRunId>0 BEGIN
- SET @WorkflowRunId = @InputWorkflowRunId
- UPDATE wfl.WorkflowsRuns SET
- Result = 2,
- ConfirmRequest = 0,
- ConfirmDateTime = SYSDATETIME(),
- ConfirmUserId = @UserId
- WHERE Id = @WorkflowRunId
- END ELSE BEGIN
- SET @NewRun = 1
- --Zavolání kontroly, ta bud projde a vrati Result 1 a wflRunId nebo vrati Result 7 a konec
- EXEC wfl.WorkflowValidate @WorkflowId = @WorkflowId, @UserId = @UserId, @OutputWorkflowRunId = @WorkflowRunId OUTPUT, @Result = @ValidateResult OUTPUT
- UPDATE wfl.WorkflowsRuns SET
- Result = 2,
- StartType = @StartType,
- StartDateTime = SYSDATETIME(),
- StartUserId = @UserId,
- StartStepId = @StartStepId,
- ActiveStepId = @StartStepId,
- ActiveStepResult= 1
- WHERE Id = @WorkflowRunId
- END
- IF CURSOR_STATUS('global','c_wf_steps')>=-1
- DEALLOCATE c_wf_steps
- IF @StartType = 3 BEGIN
- --Pro start jen jednoho kroku - definuje kurzor jen s jednim radkem
- DECLARE c_wf_steps CURSOR FAST_FORWARD FOR
- WITH pc (Id, WorkflowStepTypeId, SubIndicatorId, OrderNo)
- AS
- ( -- Anchor member definition
- SELECT ws.Id, ws.WorkflowStepTypeId, wsd.SubIndicatorId, ws.OrderNo
- FROM wfl.Workflows w
- JOIN wfl.WorkflowSteps ws
- ON w.Id = ws.WorkflowId
- LEFT JOIN wfl.WorkflowStepDetails wsd --Pro typ kroku: Spusteni jineho workflow
- ON wsd.WorkflowStepId = ws.Id
- AND ws.WorkflowStepTypeId = 5
- WHERE w.Id = @WorkflowId
- AND ws.Id = @StartStepId
- UNION ALL
- -- Recursive member definition
- SELECT ws.id, ws.WorkflowStepTypeId, case when ws.WorkflowStepTypeId=5 then (select SubIndicatorId from wfl.WorkflowStepDetails where WorkflowStepId = ws.Id) else 0 end, pc.OrderNo*1000 + ws.OrderNo
- FROM wfl.WorkflowSteps ws
- INNER JOIN pc
- ON pc.SubIndicatorId = ws.WorkflowId
- )
- -- Statement that executes the CTE
- select distinct pc.Id, pc.OrderNo, ws.OrderNo from pc
- join wfl.WorkflowSteps ws
- on pc.Id = ws.Id
- where pc.WorkflowStepTypeId <>5
- order by pc.OrderNo ,ws.OrderNo
- END
- ELSE BEGIN
- --Kurzor pres vsechny kroky daneho wfl, postupne na ne pousti wfl.StepRun
- --Kurzor vybere vety jen od @StartStepId dal (cili s vetsimrovno OrderNo)
- DECLARE c_wf_steps CURSOR FAST_FORWARD FOR
- WITH pc (Id, WorkflowStepTypeId, SubIndicatorId, OrderNo)
- AS
- ( -- Anchor member definition
- SELECT ws.Id, ws.WorkflowStepTypeId, wsd.SubIndicatorId, ws.OrderNo
- FROM wfl.Workflows w
- JOIN wfl.WorkflowSteps ws
- ON w.Id = ws.WorkflowId
- LEFT JOIN wfl.WorkflowStepDetails wsd --Pro typ kroku: Spusteni jineho workflow
- ON wsd.WorkflowStepId = ws.Id
- AND ws.WorkflowStepTypeId = 5
- WHERE w.Id = @WorkflowId
- --AND ws.OrderNo >= (SELECT OrderNo FROM wfl.WorkflowSteps WHERE Id = @StartStepId)
- UNION ALL
- -- Recursive member definition
- SELECT ws.id, ws.WorkflowStepTypeId, case when ws.WorkflowStepTypeId=5 then (select SubIndicatorId from wfl.WorkflowStepDetails where WorkflowStepId = ws.Id) else 0 end, pc.OrderNo*1000+ws.OrderNo
- FROM wfl.WorkflowSteps ws
- INNER JOIN pc
- ON pc.SubIndicatorId = ws.WorkflowId
- )
- -- Statement that executes the CTE
- select distinct pc.Id, pc.OrderNo, ws.OrderNo from pc
- join wfl.WorkflowSteps ws
- on pc.Id = ws.Id
- where pc.WorkflowStepTypeId <> 5
- and pc.OrderNo >= (select OrderNo from pc where id = @StartStepId)
- order by pc.OrderNo, ws.OrderNo
- END
- OPEN c_wf_steps
- FETCH NEXT FROM c_wf_steps INTO @CurrentStepId, @CurrentLevel, @CurrentOrder
- WHILE @@FETCH_STATUS = 0 BEGIN
- UPDATE wfl.WorkflowsRuns SET ActiveStepId = @CurrentStepId, ActiveStepResult = 1 WHERE Id = @WorkflowRunId --připraven
- --Zastaveni
- IF (SELECT CancelRequest FROM wfl.WorkflowsRuns WHERE Id = @WorkflowRunId) = 1 BEGIN
- UPDATE wfl.WorkflowsRuns SET ActiveStepResult = 3, Result = 3 WHERE Id = @WorkflowRunId --připraven
- GOTO Logovani
- --RETURN
- END
- --Potvrzeni
- IF (((SELECT ManualyConfirm FROM wfl.WorkflowSteps WHERE Id = @CurrentStepId) = 1 AND @NewRun = 1)
- OR
- ((SELECT ManualyConfirm FROM wfl.WorkflowSteps WHERE Id = @CurrentStepId) = 1 AND @NewRun = 0 AND @StartStepId <> @CurrentStepId))
- BEGIN --AND @InputWorkflowRunId = 0 proč? --AND @StartStepId <> @CurrentStepId
- UPDATE wfl.WorkflowsRuns SET ActiveStepResult = 6, Result = 6, ConfirmRequest = 1 WHERE Id = @WorkflowRunId --čeká
- --Zapis do StepLogu
- INSERT INTO wfl.StepRunLogs(WorkflowRunId, StepId, Datetime, Result, UserId)
- VALUES (@WorkflowRunId, @CurrentStepId, SYSDATETIME(), 6, @UserId)
- --Zapis do logu
- INSERT INTO p4s.RunLog (ProcedureName, Comment, LogTime)
- VALUES (@ProcedureName, 'Workflow pozastaveno - ceka na potvzeni', GetDate())
- SELECT @@IDENTITY
- GOTO Logovani
- --RETURN @WorkflowRunId--konec
- END
- UPDATE wfl.WorkflowsRuns SET ActiveStepResult = 2 WHERE Id = @WorkflowRunId --spuštěn
- EXEC @CurrentStepResult = wfl.StepRun @StepId = @CurrentStepId, @WorkflowRunId = @WorkflowRunId, @UserId = @UserId --pusti StepRun a vracenou hodnotu da do CurrStepResult
- IF @CurrentStepResult>0
- UPDATE wfl.WorkflowsRuns SET ActiveStepResult = 4 WHERE Id = @WorkflowRunId --dokončen
- ELSE
- UPDATE wfl.WorkflowsRuns SET ActiveStepResult = 5 WHERE Id = @WorkflowRunId --chyba
- FETCH NEXT FROM c_wf_steps INTO @CurrentStepId, @CurrentLevel, @CurrentOrder
- END
- CLOSE c_wf_steps
- DEALLOCATE c_wf_steps
- Logovani:
- UPDATE wfl.WorkflowsRuns SET
- EndDateTime = SYSDATETIME(),
- Result = CASE WHEN EXISTS (SELECT TOP 1 1 FROM wfl.StepRunLogs WHERE WorkflowRunId = @WorkflowRunId AND Result = 5) THEN 5
- WHEN Result = 3 THEN Result
- WHEN Result = 6 THEN Result
- ELSE 4
- END
- WHERE Id = @WorkflowRunId
- -- zapis do logu
- INSERT INTO p4s.RunLog (ProcedureName, Comment, LogTime)
- VALUES (@ProcedureName, 'Uložení výsledku spusteni workflow', GetDate())
- SELECT @@IDENTITY
- RETURN
- END
- TRY
- BEGIN CATCH
- -- zapis do logu
- INSERT INTO p4s.RunLog (ProcedureName, Comment, LogTime)
- VALUES (@ProcedureName, 'Nespecifikovaná chyba spouštění kroků workflow', GetDate())
- SELECT - @@IDENTITY
- RETURN
- END CATCH
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement