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