年休假扣减顺序存储过程

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

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);
        }

 

 

你可能感兴趣的:(考勤查询,OA,SQL,年休假,HR,存储过程)