年休假扣減順序存儲過程

 最近在優化公司的年休假扣減流程,這裏寫了兩種方式,一種是在數據庫中使用存儲過程,進行年休假順序扣減。也就是本文的介紹的一種情況,還有一種是在代碼中通過積分扣減形式,進行扣減計算。這個將在下一篇文章中介紹。

1.年休假統計表的表結構SQL如下,在數據庫中執行即可。


/****** Object:  Table [dbo].[ZZ_HR_ANNUAL_VACATION]    Script Date: 2020/5/18 13:55:37 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[ZZ_HR_ANNUAL_VACATION](
	[工號] [nvarchar](255) NULL,
	[姓名] [nvarchar](255) NULL,
	[年度] [float] NULL,
	[去年可休剩餘年假] [float] NULL,
	[去年已休剩餘年假] [float] NULL,
	[本年可休法定年假] [float] NULL,
	[本年已休法定年假] [float] NULL,
	[本年可休福利年假] [float] NULL,
	[本年已休福利年假] [float] NULL,
	[多休年假天數] [float] NULL,
	[更新時間] [datetime] NULL
) ON [PRIMARY]
GO


2.年休假扣減的執行的存儲過程腳本如下,我這裏是修改的腳本,大家可以直接創建即可。 


/****** Object:  StoredProcedure [dbo].[SP_HR_扣除員工年假情況]    Script Date: 2020/5/18 13:50:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_HR_扣除員工年假情況]
  @工號 VARCHAR(50),
  @起始時間 DATETIME,
  @請假天數 MONEY
AS

DECLARE @去年可休剩餘年假   MONEY
DECLARE @去年已休剩餘年假   MONEY
DECLARE @本年可休法定年假   MONEY
DECLARE @本年已休法定年假   MONEY
DECLARE @本年可休福利年假   MONEY
DECLARE @本年已休福利年假   MONEY
DECLARE @多休年假天數   MONEY

SELECT @去年可休剩餘年假 = 去年可休剩餘年假,
  @去年已休剩餘年假 = 去年已休剩餘年假,
  @本年可休法定年假 = 本年可休法定年假,
  @本年已休法定年假 = 本年已休法定年假,
  @本年可休福利年假 = 本年可休福利年假,
  @本年已休福利年假 = 本年已休福利年假,
  @多休年假天數 = 多休年假天數
FROM ZZ_HR_ANNUAL_VACATION
WHERE 工號 = @工號

--每年的三月之前,扣除去年剩餘
IF DATEPART (MONTH, @起始時間) <= 3
   BEGIN
      IF @去年可休剩餘年假 - @去年已休剩餘年假 < @請假天數
        BEGIN
          UPDATE ZZ_HR_ANNUAL_VACATION
              SET 去年已休剩餘年假 = 去年已休剩餘年假 + (@去年可休剩餘年假 - @去年已休剩餘年假),
                  更新時間 = GETDATE ()
            WHERE 工號 = @工號

            SELECT @請假天數 = @請假天數 - (@去年可休剩餘年假 - @去年已休剩餘年假)
        END
      ELSE
        BEGIN
          UPDATE ZZ_HR_ANNUAL_VACATION
              SET 去年已休剩餘年假 = 去年已休剩餘年假 + @請假天數,
                  更新時間 = GETDATE ()
          WHERE 工號 = @工號

          SELECT @請假天數 = 0
        END
   END

--法定年假
IF @本年可休法定年假 - @本年已休法定年假 < @請假天數
  BEGIN
    UPDATE ZZ_HR_ANNUAL_VACATION
        SET 本年已休法定年假 = 本年已休法定年假 + (@本年可休法定年假 - @本年已休法定年假),
            更新時間 = GETDATE ()
      WHERE 工號 = @工號

      SELECT @請假天數 = @請假天數 - (@本年可休法定年假 - @本年已休法定年假)
  END
ELSE
  BEGIN
    UPDATE ZZ_HR_ANNUAL_VACATION
            SET 本年已休法定年假 = 本年已休法定年假 + @請假天數,
                更新時間 = GETDATE ()
        WHERE 工號 = @工號
        
    SELECT @請假天數 = 0
  END

--福利年假
IF @本年可休福利年假 - @本年已休福利年假 < @請假天數
  BEGIN
    UPDATE ZZ_HR_ANNUAL_VACATION
        SET 本年已休福利年假 = 本年已休福利年假 + (@本年可休福利年假 - @本年已休福利年假),
            更新時間 = GETDATE ()
      WHERE 工號 = @工號

      SELECT @請假天數 = @請假天數 - (@本年可休福利年假 - @本年已休福利年假)
  END
ELSE
  BEGIN
    UPDATE ZZ_HR_ANNUAL_VACATION
            SET 本年已休福利年假 = 本年已休福利年假 + @請假天數,
                更新時間 = GETDATE ()
        WHERE 工號 = @工號
    
    SELECT @請假天數 = 0
  END

--多休年假天數
print @請假天數
UPDATE ZZ_HR_ANNUAL_VACATION
            SET 多休年假天數 = @多休年假天數 + @請假天數,
                更新時間 = GETDATE ()
        WHERE 工號 = @工號

3.代碼中調用腳存儲過程的代碼如下(這裏使用C#實現的):

   public void PushLeave(string empId, DateTime startDate, decimal leaveDays)
        {
            OAContext db = new OAContext();
            var empParam = new SqlParameter("@工號", empId);
            var dateParam = new SqlParameter("@起始時間", startDate);
            var leaveParam = new SqlParameter("@請假天數", leaveDays);

            db.Database.ExecuteSqlCommand(@"EXEC [10.120.5.6].[EIS].[dbo].[SP_HR_扣除員工年假情況]
		                                                     @工號, @起始時間, @請假天數", empParam, dateParam, leaveParam);
        }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章