最近在优化公司的年休假扣减流程,这里写了两种方式,一种是在数据库中使用存储过程,进行年休假顺序扣减。也就是本文的介绍的一种情况,还有一种是在代码中通过积分扣减形式,进行扣减计算。这个将在下一篇文章中介绍。
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);
}