1.背景介绍
为实现员工请假、加班等人事流程流程化、考勤自动化目标,需要将OA中的人事流程与EHR系统做对接,做到员工只需要填写申请单,审核通过后自动进入EHR系统做考勤结算。在此次系统对接中,OA系统提供商为蓝凌科技,EHR系统提供商为同鑫科技。此次系统对接范围:人事请假流程、加班流程、补打卡流程、员工离职流程。
2.方案梳理
本次系统集成采用中间表的方式,步骤如下:
2.1 将OA数据库链接到EHR数据库,链接方法参照: 链接数据库。
此处略写
2.2 将人事流程数据写入中间表。
请假流程、加班流程、补卡流程、离职流程均增加一张中间表用于存储请假、加班等实际业务数据。流程的发起在OA系统,经过审核,流程结束后写入到中间表。OA系统要确保中间表数据的正确性,因此在流程校验上要严格控制考勤流程校验,其次,遇到员工申请单写错的情况,也要有完善的处置办法,在OA里面增加考勤异常报修的流程,用来处理请错假、补错卡等考勤问题。
2.2.1 加班中间表
fd_id | fd_card | fd_name | fd_date | fd_hours |
---|---|---|---|---|
id | 识别卡号 | 员工姓名 | 加班所属日期 | 加班小时数 |
EHR系统计算加班时间是根据员工的排班来计算的,因此只需要知道员工的识别卡号以及加班所属日期和加班小时数即可,此处的中间表是加班申请流程所产生的数据,进入到EHR系统后将用来和考勤打卡数据做比较,一般取小值作为最终考勤结算的加班时数,比如张三实际加班3个小时,但是申请了4个小时,那么在结算的时候取3小时作为考勤结算的数据。当然中间表中也可以增加其他字段,根据实际情况而定。
2.2.2 请假中间表
fd_id | fd_card | fd_name | fd_type | fd_starttime | fd_endtime |
---|---|---|---|---|---|
id | 识别卡号 | 员工姓名 | 请假类型 | 请假开始时间 | 请假结束时间 |
EHR系统计算请假时间是根据员工的排班来计算的,因此这里只需要请假类型、开始时间和结束时间,
2.2.3 补卡中间表
fd_id | fd_card | fd_name | fd_type | fd_starttime | fd_endtime |
---|---|---|---|---|---|
id | 识别卡号 | 员工姓名 | 请假类型 | 请假开始时间 | 请假结束时间 |
EHR系统计算请假时间是根据员工的排班来计算的,因此这里只需要请假类型、开始时间和结束时间,
2.2.4 离职中间表
fd_id | fd_card | fd_name | fd_type | fd_starttime | fd_endtime |
---|---|---|---|---|---|
id | 识别卡号 | 员工姓名 | 请假类型 | 请假开始时间 | 请假结束时间 |
EHR系统计算请假时间是根据员工的排班来计算的,因此这里只需要请假类型、开始时间和结束时间,
2.3 EHR从中间表视图中取数据并写入到EHR系统。
使用OA系统的中间表生成对应的视图,然后在EHR系统中写同步中间表数据的存储过程,代码如下:
CREATE proc [dbo].[OAsj1910]
as
----OA签卡同步数据接口---
IF (SELECT object_id('tempdb..#tkqqk'))>0
DROP TABLE #tkqqk
select * into #tkqqk from (select distinct fd_buKaShiJian,fd_shiBieKaHao,fd_xingMing,fd_gongZuoRiQi,fd_buKaLeiXing,fd_buKaYuanYin
from [kqoa].[ekpa].[dbo].[ekp_personnel_additional_hr] where fd_buKaShiJian>=getdate()-120)a
insert into t_hr_patchcard
(Time,id,EmpID,WorkDate,Sequence,ReasonID,PatchType,IsOverTime,AppStatus,Remark,CreatorCode,
Creator,CreateTime,ModifierCode,Modifier,ModifyTime,ApproverCode,Approver,ApproveTime,Attachment)
select distinct t.fd_bukashijian,
((select case when max(id) is null then 1 else max(id)+1 end from t_hr_patchcard )+ ROW_NUMBER() over (order by e.code)) as id,
e.id as empid,null,null,
case when t.fd_buKaYuanYin=1 then 1 when t.fd_buKaYuanYin=3 then 3 else 4 end ,
case when t.fd_bukaleixing=1 then 0 else 1 end,
null,1,null,'OA','OA同步',getdate(),null,null,null,null,null,null,null
from t_hr_employee e,#tkqqk t
where e.code=t.fd_shibiekahao
and not exists(select 1 from t_hr_patchcard k where k.EmpID = e.ID and k.Time =t.fd_bukashijian )
----OA加班申请过流程接口--
insert into t_hr_daychange
(ChangeDay,ID,EmpID,AppStatus,Remark,CreatorCode,Creator,CreateTime,
ModifierCode,Modifier,ModifyTime,ApproverCode,Approver,ApproveTime,sqjb)
select distinct CONVERT(varchar,k.fd_jiabansuoshuriqi,23) AS ChangeDay ,
((select case when max(id) is null then 1 else max(id)+1 end from t_hr_daychange )+ ROW_NUMBER() over (order by e.code)) as id,
e.id as empid,
1,null,'OA','OA同步',getdate(),null,null,null,null,null,null,sum(cast(k.fd_jiabanxiaoshishu as numeric(10,1)))
from T_HR_Employee e,[kqoa].[ekpa].[dbo].[ekp_personnel_overtime_hr] k where e.code=k.fd_shibiekahao
and not exists(select 1 from t_hr_daychange t where t.EmpID = e.ID
and CONVERT(varchar(100), t.ChangeDay, 23) =CONVERT(varchar(100), k.fd_jiabansuoshuriqi, 23))
group by e.id,CONVERT(varchar,k.fd_jiabansuoshuriqi,23),e.code
----OA请假流程接口--
IF (SELECT object_id('tempdb..#tkqqj1'))>0
DROP TABLE #tkqqj1
select * into #tkqqj1 from (select distinct fd_qingJiaKaiShiShiJian,fd_shiBieKaHao,fd_xingMing,
fd_qingJiaLeiXing,fd_qingJiaJieShuShiJian,fd_qingjiashishu
from [kqoa].[ekpa].[dbo].[ekp_personnel_leave_hr]
where fd_qingJiaKaiShiShiJian>=getdate()-180 )a
insert into t_hr_absence
(BeginTime,ID,EmpID,AbsenceDay,BeginDate,EndDate,EndTime,IsMianKa,IsContinuous,TotalHour,
TypeID,AppStatus,Remark,CreatorCode,Creator,CreateTime,ModifierCode,Modifier,ModifyTime,
ApproverCode,Approver,ApproveTime,Attachment,PBeginDate,PEndDate,PBeginTime,PEndTime,
PTotalHour,LeaveStatus,OutTime,ReturnTime)
select distinct k.fd_qingjiakaishishijian ,((select case when max(id) is null then 1 else max(id)+1 end from t_hr_absence )+ ROW_NUMBER() over (order by e.code)) as id,
e.id as empid,
null,null,null,k.fd_qingjiajieshushijian,1,null,k.fd_qingjiashishu,
case when k.fd_qingjialeixing=20 then 11
when k.fd_qingjialeixing=21 then 8
when k.fd_qingjialeixing=1 then 1
when k.fd_qingjialeixing=2 then 2
when k.fd_qingjialeixing=3 then 3
when k.fd_qingjialeixing=4 then 4
when k.fd_qingjialeixing=5 then 10
when k.fd_qingjialeixing=6 then 12
when k.fd_qingjialeixing=7 then 6
when k.fd_qingjialeixing=8 then 13
when k.fd_qingjialeixing=9 then 14
when k.fd_qingjialeixing=10 then 9
when k.fd_qingjialeixing=23 then 7
when k.fd_qingjialeixing=24 then 15
else 5 end,
1,'','OA','OA同步',getdate(),'OA','OA同步',getdate(),'OA','OA同步',getdate(),null,null,null,null,null,null,0,null,null
from t_hr_employee e,#tkqqj1 k where e.code=k.fd_shibiekahao
--and k.fd_shibiekahao='2046149'
and not exists(select 1 from t_hr_absence t where t.EmpID = e.ID
and t.BeginTime=k.fd_qingjiakaishishijian and t.Endtime= k.fd_qingjiajieshushijian)
DROP TABLE #tkqqj1
接下来,需要写一个定时任务,按照一定的时间执行该存储过程。sqlserver设置定时任务
经过上述三个步骤,在EHR的前台界面中即可展示请假、加班、补卡等流程数据,在EHR系统计算考勤的时候将依照OA同步的数据和员工排班以及考勤打卡数据做处理,最终得出员工考勤报表。