Advertisement
Guest User

Untitled

a guest
Apr 13th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 7.62 KB | None | 0 0
  1. /****** Object:  StoredProcedure [wfl].[WorkflowRun]    Script Date: 11. 5. 2017 14:11:10 ******/
  2. ALTER PROCEDURE [wfl].[WorkflowRun]
  3.      @WorkflowId        int,
  4.      @StartType         int,    --1 - od zacatku do konce (@StartStepId ma id prvniho kroku wfl)
  5.                                 --2 - od urciteho kroku do konce
  6.                                 --3 - pouze urcity krok
  7.     @UserId             int,    -- id uzivatele kdo wfl pousti
  8.     @StartStepId        int = NULL,
  9.     @InputWorkflowRunId int = 0 --Pokud pokračujeme v pozastavenem behu - musi byt na vstupu Id pozastaveneho behu
  10. AS
  11. -- =================================================
  12. -- Author:      JPR
  13. -- Create date: 08.03.2017
  14. -- Description: Procedura spouští krok za krokem daného wfl
  15. -- Changelog:   11.5.2017 - jpr - wfl neceka na potvrzeni pri pusteni jen jednoho kroku s potvrzenim
  16. --              16.3.2018 - jpr - přidána podpora typu kroku 5 (Spust jine wfl). v podstatě se jen do seznamu kroku
  17. --                              - ke spusteni rekurzivne natáhnou kroky i z "child" wfls
  18. DECLARE
  19.      @ProcedureName         varchar(50) = 'WorkflowRun',
  20.      @CurrentStepId         int,
  21.      @CurrentLevel          int,
  22.      @CurrentOrder          int,
  23.      @CurrentStepResult     int,
  24.      @WorkflowRunId         int,
  25.      @Waiting               bit = 0,
  26.      @ValidateResult        int,
  27.      @NewRun                bit = 0
  28.    
  29.  
  30. BEGIN
  31. TRY
  32.     --Pokud se wfl pousti od zacatku, nemusi byt vyplnen @StartStepId, vezme se první z daneho wfl
  33.     SET @StartStepId = CASE WHEN @InputWorkflowRunId IS NULL AND @StartStepId IS NULL
  34.                                 THEN (SELECT TOP 1 Id FROM wfl.WorkflowSteps WHERE WorkflowId = @WorkflowId ORDER BY OrderNo)
  35.                                 ELSE @StartStepId
  36.                        END
  37.    
  38.     IF @InputWorkflowRunId>0 BEGIN
  39.         SET @WorkflowRunId = @InputWorkflowRunId
  40.         UPDATE wfl.WorkflowsRuns SET
  41.             Result          = 2,
  42.             ConfirmRequest  = 0,
  43.             ConfirmDateTime = SYSDATETIME(),
  44.             ConfirmUserId   = @UserId
  45.         WHERE Id = @WorkflowRunId
  46.     END ELSE BEGIN
  47.         SET @NewRun = 1
  48.         --Zavolání kontroly, ta bud projde a vrati Result 1 a wflRunId nebo vrati Result 7 a konec
  49.         EXEC wfl.WorkflowValidate @WorkflowId = @WorkflowId, @UserId = @UserId, @OutputWorkflowRunId = @WorkflowRunId OUTPUT, @Result = @ValidateResult OUTPUT  
  50.    
  51.  
  52.         UPDATE wfl.WorkflowsRuns SET
  53.             Result          = 2,
  54.             StartType       = @StartType,
  55.             StartDateTime   = SYSDATETIME(),
  56.             StartUserId     = @UserId,
  57.             StartStepId     = @StartStepId,
  58.             ActiveStepId    = @StartStepId,
  59.             ActiveStepResult= 1
  60.         WHERE Id = @WorkflowRunId
  61.     END
  62.  
  63.     IF CURSOR_STATUS('global','c_wf_steps')>=-1
  64.         DEALLOCATE c_wf_steps
  65.  
  66.    
  67.     IF @StartType = 3 BEGIN
  68.         --Pro start jen jednoho kroku - definuje kurzor jen s jednim radkem
  69.         DECLARE c_wf_steps CURSOR FAST_FORWARD FOR
  70.         WITH pc (Id, WorkflowStepTypeId, SubIndicatorId, OrderNo)
  71.         AS
  72.         (   -- Anchor member definition
  73.             SELECT ws.Id, ws.WorkflowStepTypeId, wsd.SubIndicatorId, ws.OrderNo
  74.             FROM wfl.Workflows w
  75.             JOIN wfl.WorkflowSteps ws
  76.             ON w.Id = ws.WorkflowId
  77.             LEFT JOIN wfl.WorkflowStepDetails wsd --Pro typ kroku: Spusteni jineho workflow
  78.             ON wsd.WorkflowStepId = ws.Id
  79.             AND ws.WorkflowStepTypeId = 5
  80.             WHERE w.Id = @WorkflowId
  81.             AND ws.Id = @StartStepId
  82.  
  83.             UNION ALL
  84.             -- Recursive member definition
  85.             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
  86.             FROM wfl.WorkflowSteps ws
  87.             INNER JOIN pc
  88.             ON pc.SubIndicatorId = ws.WorkflowId
  89.         )
  90.         -- Statement that executes the CTE
  91.         select distinct pc.Id, pc.OrderNo, ws.OrderNo from pc
  92.         join wfl.WorkflowSteps ws
  93.         on pc.Id = ws.Id
  94.         where pc.WorkflowStepTypeId <>5
  95.         order by pc.OrderNo ,ws.OrderNo
  96.     END
  97.     ELSE BEGIN
  98.         --Kurzor pres vsechny kroky daneho wfl, postupne na ne pousti wfl.StepRun
  99.         --Kurzor vybere vety jen od @StartStepId dal (cili s vetsimrovno OrderNo)
  100.         DECLARE c_wf_steps CURSOR FAST_FORWARD FOR
  101.         WITH pc (Id, WorkflowStepTypeId, SubIndicatorId, OrderNo)
  102.         AS
  103.         (   -- Anchor member definition
  104.             SELECT ws.Id, ws.WorkflowStepTypeId, wsd.SubIndicatorId, ws.OrderNo
  105.             FROM wfl.Workflows w
  106.             JOIN wfl.WorkflowSteps ws
  107.             ON w.Id = ws.WorkflowId
  108.             LEFT JOIN wfl.WorkflowStepDetails wsd --Pro typ kroku: Spusteni jineho workflow
  109.             ON wsd.WorkflowStepId = ws.Id
  110.             AND ws.WorkflowStepTypeId = 5
  111.             WHERE w.Id = @WorkflowId
  112.             --AND ws.OrderNo >= (SELECT OrderNo FROM wfl.WorkflowSteps WHERE Id = @StartStepId)
  113.  
  114.             UNION ALL
  115.             -- Recursive member definition
  116.             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
  117.             FROM wfl.WorkflowSteps ws
  118.             INNER JOIN pc
  119.             ON pc.SubIndicatorId = ws.WorkflowId
  120.         )
  121.         -- Statement that executes the CTE
  122.         select distinct pc.Id, pc.OrderNo, ws.OrderNo from pc
  123.         join wfl.WorkflowSteps ws
  124.         on pc.Id = ws.Id
  125.         where pc.WorkflowStepTypeId <> 5
  126.         and pc.OrderNo >= (select OrderNo from pc where id = @StartStepId)
  127.         order by pc.OrderNo, ws.OrderNo
  128.     END
  129.  
  130.     OPEN c_wf_steps
  131.     FETCH NEXT FROM c_wf_steps INTO @CurrentStepId, @CurrentLevel, @CurrentOrder
  132.     WHILE @@FETCH_STATUS = 0 BEGIN
  133.        
  134.         UPDATE wfl.WorkflowsRuns SET ActiveStepId = @CurrentStepId, ActiveStepResult = 1 WHERE Id = @WorkflowRunId      --připraven
  135.        
  136.         --Zastaveni
  137.         IF (SELECT CancelRequest FROM wfl.WorkflowsRuns WHERE Id = @WorkflowRunId) = 1 BEGIN
  138.             UPDATE wfl.WorkflowsRuns SET ActiveStepResult = 3, Result = 3 WHERE Id = @WorkflowRunId     --připraven
  139.             GOTO Logovani
  140.             --RETURN
  141.         END
  142.  
  143.         --Potvrzeni
  144.         IF (((SELECT ManualyConfirm FROM wfl.WorkflowSteps WHERE Id = @CurrentStepId) = 1 AND @NewRun = 1)
  145.                 OR
  146.             ((SELECT ManualyConfirm FROM wfl.WorkflowSteps WHERE Id = @CurrentStepId) = 1 AND @NewRun = 0 AND @StartStepId <> @CurrentStepId))
  147.             BEGIN --AND @InputWorkflowRunId = 0 proč? --AND @StartStepId <> @CurrentStepId
  148.            
  149.             UPDATE wfl.WorkflowsRuns SET ActiveStepResult = 6, Result = 6, ConfirmRequest = 1 WHERE Id = @WorkflowRunId     --čeká
  150.             --Zapis do StepLogu
  151.             INSERT INTO wfl.StepRunLogs(WorkflowRunId, StepId, Datetime, Result, UserId)
  152.             VALUES (@WorkflowRunId, @CurrentStepId, SYSDATETIME(), 6, @UserId)
  153.             --Zapis do logu
  154.             INSERT INTO p4s.RunLog (ProcedureName, Comment, LogTime)
  155.             VALUES  (@ProcedureName, 'Workflow pozastaveno - ceka na potvzeni', GetDate())
  156.             SELECT @@IDENTITY
  157.             GOTO Logovani
  158.             --RETURN @WorkflowRunId--konec
  159.         END
  160.  
  161.        
  162.         UPDATE wfl.WorkflowsRuns SET ActiveStepResult = 2 WHERE Id = @WorkflowRunId     --spuštěn
  163.         EXEC @CurrentStepResult = wfl.StepRun @StepId = @CurrentStepId, @WorkflowRunId = @WorkflowRunId, @UserId = @UserId      --pusti StepRun a vracenou hodnotu da do CurrStepResult
  164.        
  165.         IF @CurrentStepResult>0
  166.             UPDATE wfl.WorkflowsRuns SET ActiveStepResult = 4 WHERE Id = @WorkflowRunId     --dokončen
  167.         ELSE
  168.             UPDATE wfl.WorkflowsRuns SET ActiveStepResult = 5 WHERE Id = @WorkflowRunId     --chyba
  169.  
  170.         FETCH NEXT FROM c_wf_steps INTO @CurrentStepId, @CurrentLevel, @CurrentOrder
  171.    
  172.     END
  173.     CLOSE c_wf_steps
  174.     DEALLOCATE c_wf_steps
  175.    
  176.     Logovani:
  177.     UPDATE wfl.WorkflowsRuns SET
  178.         EndDateTime = SYSDATETIME(),
  179.         Result = CASE WHEN EXISTS (SELECT TOP 1 1 FROM wfl.StepRunLogs WHERE WorkflowRunId = @WorkflowRunId AND Result = 5) THEN 5
  180.                       WHEN Result = 3 THEN Result
  181.                       WHEN Result = 6 THEN Result
  182.                       ELSE 4
  183.                  END
  184.     WHERE Id = @WorkflowRunId
  185.  
  186.  
  187.     -- zapis do logu
  188.     INSERT INTO p4s.RunLog (ProcedureName, Comment, LogTime)
  189.     VALUES  (@ProcedureName, 'Uložení výsledku spusteni workflow', GetDate())
  190.     SELECT @@IDENTITY
  191.     RETURN
  192. END
  193. TRY
  194. BEGIN CATCH
  195.     -- zapis do logu
  196.     INSERT INTO p4s.RunLog (ProcedureName, Comment, LogTime)
  197.     VALUES  (@ProcedureName, 'Nespecifikovaná chyba spouštění kroků workflow', GetDate())
  198.     SELECT - @@IDENTITY
  199.     RETURN  
  200. END CATCH
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement