/* 需求分析: 1. 首先得判断该员工上的是否上夜班
F_SGSJ<=20:00:00 F_XGSJ>=08:00:00(第二天)
2. 如果是夜班,上夜班时长>10小时 直接补贴55 上夜班时长<2小时 夜班补贴=0
F_GS>=10 夜班补贴=55 F_GS<=2 夜班补贴=0 3. 2小时<上夜班时长<10小时 夜班补贴计算公式为 55÷12×上班时长 2<=F_GS<=10 夜班补贴为 55÷12×上班时长
*/
/* 思路:夜班补贴表拿的是日考勤表的字段,多了一个夜班补贴
1.查询夜班补贴所有字段 w_PSM_ZS_YBBT
ID_ 主键 REF_ID_ 外键 PARENT_ID_ 父ID F_CQRQ 出勤日期 F_CXMC 产线名称ID F_CXMC_NAME 产线名称 F_XM 姓名 F_GH 工号ID F_GH_NAME 工号 F_SGGXMC 上岗工序名称ID F_SGGXMC_NAME 上岗工序名称 F_GS 工时 F_SGSJ 上岗时间 F_XGSJ 下岗时间 F_JJLX 计件类型ID F_JJLX_NAME 计件类型 F_YBBT 夜班补贴 F_BZ 备注 INST_ID_ 流程实例ID INST_STATUS_ 状态 TENANT_ID_ 租户ID CREATE_TIME_ 创建时间 CREATE_BY_ 创建人ID UPDATE_BY_ 更新人 UPDATE_TIME_ 更新时间 CHECK_STATUS_审核状态 CHECK_BY_ 审核人 CHECK_TIME_ 审核时间 GROUP_ID_ 组ID F_JBF 加班费
2.先创建一个临时表@temp
*/
alter PROCEDURE PGL_YB --创建一个存储过程
@KSRQ SMALLDATETIME, --声明变量,这两个其实是日期框的值 @JSRQ SMALLDATETIME
AS BEGIN SET NOCOUNT ON DECLARE @RetVal int = 0 ,@RetMsg varchar(5000) --安全备份 -------------------------------------------------------------------------------------------------------
DECLARE @SBJS SMALLDATETIME --声明变量上岗时间 DECLARE @XBSJ SMALLDATETIME --声明变量下岗时间 DECLARE @GDYBBT NUMERIC(14,5) --定义一个夜班补参数
SET @SBJS = '19:00' SET @GDYBBT =55/12
DECLARE @TEMP TABLE( --先创建一个临时表,因为是从日考勤那边拿数据,临时表会比创建新表更加便捷 ID INT IDENTITY (1,1), F_CQRQ DATETIME, --出勤日期 F_CXMC_NAME VARCHAR(100), --产线名称 F_XM VARCHAR(100), --姓名 F_GH_NAME VARCHAR(100), --工号, F_GS NUMERIC, --工时, F_SGSJ SMALLDATETIME, --上岗时间, F_XGSJ SMALLDATETIME, --下岗时间, F_JJLX_NAME VARCHAR(100), --计件类型, F_YBBT NUMERIC, --夜班补贴, F_BZ VARCHAR(100), --备注, CREATE_TIME_ DATETIME, --创建时间, CREATE_BY_ VARCHAR(100) --创建人 ) INSERT INTO @TEMP( --!!!特别注意这边插入数据的时候 INSERT INTO 下面select from的表才是插入到临时表里的数据 F_CQRQ, --出勤日期 F_CXMC_NAME, --产线名称 F_XM, --姓名, F_GH_NAME, --工号, F_GS, --工时, F_SGSJ, --上岗时间, F_XGSJ, --下岗时间, F_JJLX_NAME, --计件类型, F_YBBT, --夜班补贴, F_BZ, --备注, CREATE_TIME_ , --创建时间, CREATE_BY_ --创建人
) SELECT ---因为是从日考勤这边拿的数据,所以from日考勤的表 将里里面的数据传给临时表 F_CQRQ, --出勤日期 F_CXMC_NAME, --产线名称 F_XM, --姓名, F_GH_NAME, --工号, F_GS, --工时, F_SGSJ, --上岗时间, F_XGSJ, --下岗时间, F_JJLX_NAME, --计件类型, 0, --夜班补贴, F_BZ, --备注, CREATE_TIME_ , --创建时间, CREATE_BY_ --创建人 FROM w_PSM_ZS_RKQ WHERE F_CQRQ BETWEEN @KSRQ AND @JSRQ --这边的条件是出勤日期要在选的日期之间 AND CONVERT(varchar,F_SGSJ,8)>=@SBJS --然后这个意思是截取上岗日期的前八位后的时间 要大于定义的上班时间 判断是上的夜班
SELECT * FROM w_PSM_ZS_YBBT WHERE F_CQRQ BETWEEN @KSRQ AND @JSRQ --这个意思是从表里面先查到这些数据 DELETE FROM w_PSM_ZS_YBBT WHERE F_CQRQ BETWEEN @KSRQ AND @JSRQ --如果查到了的话讲原来的数据删除掉
--删除完成之后就可以插入新的数据了,从数据从哪里来呢,从刚被赋值的@temp临时表里面来 INSERT INTO w_PSM_ZS_YBBT( ID_ , F_CQRQ, --出勤日期 F_CXMC_NAME, --产线名称 F_XM, --姓名, F_GH_NAME, --工号, F_GS, --工时, F_SGSJ, --上岗时间, F_XGSJ, --下岗时间, F_JJLX_NAME, --计件类型, F_YBBT, --夜班补贴, F_BZ, --备注, CREATE_TIME_ , --创建时间, CREATE_BY_ --创建人 ) SELECT NEWID(), F_CQRQ, --出勤日期 F_CXMC_NAME, --产线名称 F_XM, --姓名, F_GH_NAME, --工号, F_GS, --工时, F_SGSJ, --上岗时间, F_XGSJ, --下岗时间, F_JJLX_NAME, --计件类型, 0, --夜班补贴, F_BZ, --备注, CREATE_TIME_ , --创建时间, CREATE_BY_ --创建人 FROM @TEMP WHERE F_CQRQ BETWEEN @KSRQ AND @JSRQ --这边的条件是出勤日期要在选的日期之间 AND CONVERT(varchar,F_SGSJ,8)>=@SBJS UPDATE w_PSM_ZS_YBBT SET F_YBBT = CASE WHEN F_GS>10 THEN 55 ELSE CASE WHEN F_GS <2 THEN 0 ELSE F_GS*@GDYBBT END END
END
EXEC PGL_YB '2022-09-21','2022-09-23' --最后调用即可
|