Advertisement
Guest User

Untitled

a guest
Feb 11th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 15.35 KB | None | 0 0
  1. DECLARE @PAGEOFFSET_1 int = 1;
  2. DECLARE @PAGELIMIT_1 int = 20;
  3. DECLARE @CURRENTUSERID_1 uniqueidentifier = '3db19fa0-228a-497f-873a-0250bf0a4ccb';
  4. DECLARE @LOCALE_1 int = 25;
  5.  
  6. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  7. --Представление Vtb24AllRequests
  8. --  TODO:
  9. --      упростить алгоритм подсветки
  10. --      ключ на уникальность поля EmployeeID в Vtb24DictBackOfficeEmployee
  11. --      убрать сортировку по полям *Name и выпилить лишние индексы по ним
  12. --      убрать лишние STUFF
  13. --      убрать лишние JOIN-ы во втором блоке
  14. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  15.  
  16. DECLARE @DepartmentID UNIQUEIDENTIFIER;
  17. DECLARE @IsAdmin BIT;
  18. DECLARE @IsModuleAdmin BIT;
  19. DECLARE @IsHead BIT;
  20. DECLARE @NewLineChar AS NVARCHAR(1) = CHAR(10);
  21. DECLARE @IsDuty BIT;
  22.  
  23. --Получение прав текущего сотрудника
  24. SELECT TOP 1
  25.         @DepartmentID = ActiveBackDepartmentID
  26.         ,@IsAdmin = IsAdmin
  27.         ,@IsModuleAdmin = IsModuleAdmin
  28.         ,@IsHead = IsHead
  29.         ,@IsDuty = IsDuty
  30. FROM Vtb24DictBackOfficeEmployee WITH(NOLOCK)
  31. WHERE EmployeeID = @CURRENTUSERID_1;
  32.  
  33. --Основной запрос
  34. ;WITH
  35.  
  36.         --Выбор подчиненных сотрудников
  37.         Subordinates (ID) as
  38.         (
  39.                 SELECT DISTINCT
  40.                         BOE.EmployeeID AS ID
  41.                     FROM Vtb24DictVtb24DictHeadSubordinates SUB WITH(NOLOCK)
  42.                         LEFT JOIN Vtb24DictBackOfficeEmployee BOE WITH(NOLOCK)
  43.                                 ON SUB.ID = BOE.ID
  44.                         LEFT JOIN Vtb24DictBackOfficeEmployee BOE1 WITH(NOLOCK)
  45.                                 ON SUB.EmployeeID = BOE1.ID
  46.                         WHERE
  47.                                 BOE1.EmployeeID = @CURRENTUSERID_1
  48.         ),
  49.  
  50.         SelectTasks(ID) as
  51.         (
  52. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  53. --1. Выбор ID заданий по параметрам. Тут нужно указывать ТОЛЬКО параметры поиска, выбираются ID заданаий, другие поля НЕ нужны. Связь таблиц 1 к 1.
  54. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  55.                 SELECT
  56.                         VRT.ID
  57.                 FROM Vtb24KsTasks                               VRT     WITH(NOLOCK)
  58.                 LEFT JOIN Vtb24DictProductsGroupProducts        PGP     WITH(NOLOCK) ON VRT.ProductID = PGP.ProductID --поле PGP.ProductID уникальное, связь 1 к 1
  59.                 LEFT JOIN Vtb24DictProductsGroups               PG      WITH(NOLOCK) ON PGP.ID = PG.ID
  60.                 LEFT JOIN Vtb24DictOperationTypes               OT      WITH(NOLOCK) ON OT.ID = VRT.OperationTypeID
  61.                 LEFT JOIN Vtb24ClLegalClients                   LC      WITH(NOLOCK) ON LC.ID = VRT.LegalClientID
  62.                
  63.                 LEFT JOIN Vtb24DictBackOfficeEmployee           BOE     WITH(NOLOCK) ON VRT.PerformerID = BOE.EmployeeID --TODO: НУЖНО ДОБАВИТЬ УНИКАЛЬНЫЙ КЛЮЧ НА BOE.EmployeeID
  64.                 LEFT JOIN Subordinates                          SB      WITH(NOLOCK) ON VRT.PerformerID = SB.ID --поле SB.ID уникальное, связь 1 к 1
  65.                
  66.                 WHERE 1=1
  67.                        
  68.                        
  69.                        
  70.                        
  71.                        
  72.                        
  73.                        
  74.                        
  75.                        
  76.                        
  77.                        
  78.                        
  79.                        
  80.                        
  81.                        
  82.                        
  83.                        
  84.                        
  85.                
  86.                         --Активные задания
  87.                         AND (VRT.TaskStateID IN (9, 10, 11, 13, 14, 15) OR (VRT.TaskStateID NOT IN (7, 12, 17, 18, 19, 24) AND VRT.OnRework IS NOT NULL AND VRT.OnRework = 1 ) )
  88.                         AND EXISTS
  89.                         (
  90.                             SELECT TOP 1 1
  91.                             FROM Tasks T WITH(NOLOCK)
  92.                             WHERE
  93.                                 T.ID = VRT.ID
  94.                                 --AND T.TypeID IN ('dd6d16f3-8652-4c7c-b3bd-d004a69db02e', '59a656c4-5328-4037-a09a-11b861f57f1c')
  95.                         )
  96.                
  97.                         --Задания подчиненных
  98.                         AND (SB.ID IS NOT NULL
  99.                                 OR (@IsHead = 1 AND (BOE.ActiveBackDepartmentID <> @DepartmentID OR BOE.ActiveBackDepartmentID IS NULL)  AND VRT.BODepartmentID = @DepartmentID  AND VRT.PerformerID IS NOT NULL)
  100.                                 OR (VRT.BODepartmentID = @DepartmentID AND VRT.PerformerID IS NULL AND VRT.TaskStateID = 9)
  101.                         )
  102.                
  103.                 --«Дежурный БЭК» видит запросы только по тем модулям, что в явном виде указаны в справочнике «Сотрудники подразделений БЭК-офисов» в поле «Наблюдаемые модули»
  104.                 -- приоритет логики дежурного меньше чем админа и руководителя
  105.                 AND (
  106.                         (
  107.                                 -- Логика для обычного сотрудника
  108.                                 (@IsAdmin IS NULL OR @IsAdmin = 0)
  109.                                 AND(@IsModuleAdmin IS NULL OR @IsModuleAdmin = 0)
  110.                                 AND(@IsHead IS NULL OR @IsHead = 0)
  111.                                 AND(@IsDuty IS NULL OR @IsDuty = 0)
  112.                         )
  113.                         OR
  114.                         (
  115.                                 -- Логика для дежурного БЭК
  116.                                 @IsDuty = 1
  117.                                 AND(@IsAdmin IS NULL OR @IsAdmin = 0)
  118.                                 AND(@IsModuleAdmin IS NULL OR @IsModuleAdmin =0)
  119.                                 AND(@IsHead  IS NULL OR @IsHead =0)
  120.                                 AND EXISTS
  121.                                 (
  122.                                         SELECT TOP 1 1
  123.                                         FROM Vtb24DictBackOfficeEmployee    BOE WITH(NOLOCK)
  124.                                         LEFT JOIN Vtb24DictDutyModules  DDM WITH(NOLOCK) ON DDM.ID = BOE.ID
  125.                                         WHERE BOE.[EmployeeID] = @CURRENTUSERID_1 AND DDM.ModuleID = OT.ModuleID
  126.                                 )
  127.                         )
  128.                         OR
  129.                         (
  130.                                 --логика для руководителя / админа
  131.                                 @IsAdmin = 1
  132.                                 OR @IsModuleAdmin = 1
  133.                                 OR @IsHead = 1
  134.                         )
  135.                 )
  136.                 -- Проверка доступа, администратор видит все запросы, руководитель все запросы своего подразделения, сотрудник видит только свои запросы
  137.                
  138. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  139. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  140. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  141.         )
  142.  
  143.         ,Pagination(ID, AppearanceID, rn) as
  144.         (
  145. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  146. --2. Постраничное отображение и сортировка. При подсчете строк не требуется.
  147. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  148.                 SELECT TOP (@PAGELIMIT_1)
  149.                         P.ID
  150.                         ,P.AppearanceID
  151.                         ,P.rn
  152.                 FROM (
  153.                         SELECT
  154.                                 R.ID
  155.                                 ,R.AppearanceID
  156.                
  157.                                 ,row_number() OVER (ORDER BY R.AppearanceID, VRT.Number desc ) AS rn
  158.                
  159.                         FROM (
  160.                                 SELECT
  161.                                         S.ID
  162.                                         ,(CASE
  163.                                                 WHEN VRTT.TaskStateID = 11 THEN 1 --отложено (7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 24)
  164.                                                 WHEN VRTT.PlannedDate < GETUTCDATE() AND VRTT.TaskStateID IN (9, 10, 11, 13, 14, 15) THEN 0 --просрочено
  165.                                                 WHEN VRTT.TaskStateID IN (14, 15) THEN 2 --отозвано
  166.                                                 WHEN VRTT.UrgencyID = 1 AND VRTT.TaskStateID IN (9, 10, 13)  THEN 3 --срочные
  167.                                                 WHEN VRTT.PlannedDate >= GETUTCDATE() AND VRTT.PlannedDate < (GETUTCDATE()+1) AND VRTT.TaskStateID IN (9, 10, 13)  THEN 4 --сегодняшние
  168.                                                 ELSE 5
  169.                                          END ) AS AppearanceID
  170.                                 FROM SelectTasks S
  171.                                 INNER JOIN Vtb24KsTasks VRTT WITH(NOLOCK) ON VRTT.ID=S.ID
  172.                         ) R
  173.                         INNER JOIN Vtb24KsTasks             VRT WITH(NOLOCK) ON VRT.ID=R.ID
  174.                         INNER JOIN Instances                    INS WITH(NOLOCK) ON INS.ID=VRT.ID --TODO: выпилить
  175.                         INNER JOIN Vtb24DictOperationTypes  OT WITH(NOLOCK) ON OT.ID = VRT.OperationTypeID --TODO: выпилить
  176.                 ) P
  177.                 WHERE P.rn >= @PAGEOFFSET_1 AND P.rn < (@PAGEOFFSET_1 + @PAGELIMIT_1)
  178.                 ORDER BY P.rn
  179. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  180. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  181. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  182.         )
  183.  
  184. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  185. --3. Выбор дополнительных полей для отображении в представлении. Тут НЕ нужно добавлять условия поиска.
  186. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  187.         SELECT
  188.                 P.rn
  189.                 ,T.ID                           AS Vtb24AllRequestsID
  190.                 ,T.Number                       AS Vtb24AllRequestsNumber
  191.                 ,T.ContractNumber
  192.                 ,T.ContractDate
  193.                 ,T.LegalClientINN               AS Vtb24AllRequestsClientINN
  194.                 ,T.NumberBatchRequestID     AS Vtb24AllRequestsBatchRequestID
  195.                 ,T.NumberBatchRequestNumber AS Vtb24AllRequestsBatchRequestNumber
  196.                 ,T.InitiatorName                    AS Vtb24AllRequestsInitiatorName
  197.                 ,T.BODepartmentName         AS Vtb24AllRequestsBODepartment
  198.                 ,T.TaskStateID                  AS Vtb24AllRequestsStateID
  199.                 ,T.BODepartmentID               AS Vtb24AllRequestsBODepartmentID
  200.                 ,T.DealStartDate                    AS Vtb24AllRequestsCreated
  201.                 ,T.OperationTypeID              AS Vtb24AllRequestsOperationTypeID
  202.                 ,T.OperationTypeName            AS Vtb24AllRequestsOperationTypeName
  203.                 ,T.PlannedDate                  AS Vtb24AllRequestsPlanned
  204.                 ,T.DatePerformanceRejection     AS Vtb24AllRequestsDatePerformanceRejection
  205.                 ,T.PerformerID                  AS Vtb24AllRequestsPerformerID
  206.                 ,T.PerformerName                AS Vtb24AllRequestsPerformerName
  207.                 ,T.UrgencyName                  AS Vtb24AllRequestsPriority
  208.                 ,OT.ModuleID                    AS Vtb24AllRequestsModuleID
  209.                 ,OT.ModuleName              AS Vtb24AllRequestsModuleName
  210.                
  211.                 ,CASE
  212.                     WHEN P.AppearanceID = 0 THEN N'#appearance( Background: #A0ff9999)' -- просрочено
  213.                     WHEN P.AppearanceID = 1 THEN N'#appearance( Background: #A0afb3d8)' -- отложено
  214.                     WHEN P.AppearanceID = 2 THEN N'#appearance( Background: #A0ffff00)'     -- отозвано
  215.                     WHEN P.AppearanceID = 3 THEN N'#appearance( Background: #A058D039)' -- срочные
  216.                     WHEN P.AppearanceID = 4 THEN N'#appearance( Background: #A07fD3C8)' -- сегодняшние
  217.                 END AS AppearanceColumn
  218.                
  219.                  ,IIF(
  220.                     INS.TypeID = '3F2E6367-F154-404D-BC45-E08D50A3F177', 'П',
  221.                     IIF(INS.TypeID = '0242f68a-56de-469f-911b-fa827c71938e', 'М', '-')
  222.                  ) AS MultiOrBatchTypeCaption
  223.                  
  224.                 ,CASE
  225.                     WHEN T.TaskStateID = 9 AND T.MemorizedStateID IS NOT NULL
  226.                     THEN T.MemorizedStateName ELSE T.TaskStateName
  227.                 END AS Vtb24AllRequestsStateName
  228.                
  229.                 ,CASE T.IsNotProductOperation
  230.                     WHEN 0 THEN (
  231.                         ISNULL(
  232.                             STUFF((
  233.                                 SELECT @NewLineChar + PDC.ClientName + N';'
  234.                                 FROM Vtb24KsProductDossierCollection PDC WITH(NOLOCK)
  235.                                 WHERE PDC.ID = T.ID
  236.                                 FOR XML PATH(N'')
  237.                             ), 1, 1, N''),
  238.                             ISNULL(T.LegalClientShortName, T.NaturalClientFullName)
  239.                         )
  240.                     )
  241.                     ELSE T.NotProductClient
  242.                 END AS Vtb24AllRequestsClientName
  243.                
  244.                 ,CASE T.IsNotProductOperation
  245.                     WHEN 0 THEN (
  246.                         STUFF((
  247.                             SELECT @NewLineChar + PDC.ProductDossierNumber + N';'
  248.                             FROM Vtb24KsProductDossierCollection PDC WITH(NOLOCK)
  249.                             WHERE PDC.ID = T.ID
  250.                             FOR XML PATH(N'')
  251.                         ), 1, 1, N'')
  252.                     )
  253.                     ELSE T.NotProductContractNumber
  254.                 END AS Vtb24AllRequestsContractNumber
  255.                
  256.                 ,STUFF((
  257.                     SELECT @NewLineChar + format(PDC.ProductDossierDate, N'dd.MM.yyyy') + N';'
  258.                     FROM Vtb24KsProductDossierCollection PDC WITH(NOLOCK)
  259.                         WHERE PDC.ID = T.ID
  260.                     FOR XML PATH(N'')
  261.                 ), 1, 1, N'') AS Vtb24AllRequestsContractDate
  262.                
  263.                 ,STUFF((
  264.                     SELECT @NewLineChar + PDC.ProductDossierAccountNumber + N';'
  265.                     FROM Vtb24KsProductDossierCollection PDC WITH(NOLOCK)
  266.                         WHERE PDC.ID = T.ID
  267.                     FOR XML PATH(N'')
  268.                 ), 1, 1, N'') AS Vtb24AllRequestsAccountNumber
  269.                
  270.                 ,ISNULL(
  271.                     STUFF((
  272.                         SELECT @NewLineChar + PDC.ProductsGroupGroupName + N';'
  273.                         FROM Vtb24KsProductDossierCollection PDC WITH(NOLOCK)
  274.                             WHERE PDC.ID = T.ID
  275.                         FOR XML PATH(N'')
  276.                     ), 1, 1, N''),
  277.                     T.ProductsGroupGroupName
  278.                 ) AS Vtb24AllRequestsProductGroupName
  279.                
  280.                 ,ISNULL(
  281.                     STUFF((
  282.                         SELECT @NewLineChar + PDC.ProductsGroupSystem + N';'
  283.                         FROM Vtb24KsProductDossierCollection PDC WITH(NOLOCK)
  284.                             WHERE PDC.ID = T.ID
  285.                         FOR XML PATH(N'')
  286.                     ), 1, 1, N''),
  287.                     T.ProductsGroupSystem
  288.                 ) AS Vtb24AllRequestsSystemProductsGroup
  289.                
  290.                 ,ISNULL(
  291.                     STUFF((
  292.                         SELECT @NewLineChar + PDC.BranchGroupName + N';'
  293.                         FROM Vtb24KsProductDossierCollection PDC WITH(NOLOCK)
  294.                             WHERE PDC.ID = T.ID
  295.                         FOR XML PATH(N'')
  296.                     ), 1, 1, N''),
  297.                     T.BranchGroupsName
  298.                 ) AS Vtb24AllRequestsBranchDescription
  299.        
  300.                 ,BOE.ActiveBackDepartmentID AS CurrentPerformerDepartment
  301.        
  302.         FROM Pagination P
  303.         INNER JOIN Vtb24KsTasks             T WITH(NOLOCK) ON T.ID=P.ID
  304.         LEFT JOIN Instances                     INS WITH(NOLOCK) ON INS.ID = T.NumberBatchRequestID
  305.         LEFT JOIN Vtb24DictOperationTypes       OT WITH(NOLOCK) ON OT.ID = T.OperationTypeID
  306.        
  307.         LEFT JOIN Vtb24DictBackOfficeEmployee BOE WITH(NOLOCK) ON T.PerformerID = BOE.EmployeeID
  308.        
  309.         ORDER BY P.rn
  310. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  311. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  312. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement