中控考勤与海威达C6考勤系统考勤数据同步

公司的老考勤机坏了,换成中控的S30考勤机了,考勤数据需要合并在一起,特写此存储过程,加入到每天的作业中让其自动执行。考勤统计仍然使用C6的,所以将考勤数据同步到C6的考勤里面。

------------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------------------

create procedure    You_pro_Name
---- PengPeng at 2014
----考勤同步数据操作>>>> C6到考勤数据人员信息同步,主要就是讲C6系统表 RS_Emp的人员信息 同步到中控 USERINFO 表里面
--传入参数
AS  
----变量
declare @card_no varchar(10) --ID卡号-10位
declare @isUpdate_BuMen bit --是否更新部门控制变量
declare @isUpdate_deleteUSERInfo bit ---删除离职的人员
declare @isUpdate_USERInfo bit --是否更新部门控制变量
declare @isUpdate_CardNo bit --更新员工卡号
declare @isUpdate_KQ_Result bit --是否同步考勤记录
----设置 默认值
set @card_no='0000000001'
set @isUpdate_BuMen=0 ---默认关闭部门更新
set @isUpdate_USERInfo=1 --更新员工 ,必须 默认打开
set @isUpdate_deleteUSERInfo=1 --默认开启
set @isUpdate_CardNo=1 ---更新员工卡号
set @isUpdate_KQ_Result=1 ---是否同步考勤记录 开启

-------///同步人员信息\\\--------
----第一 更新部门信息【此步可以不需要,这里只是起显示作用,只要人员信息能对上就可以了,部门可以再C6系统里面找】

----第二 更新员工信息【这里是必须的,将员工的编号信息要导入进来,这里员工信息有,有两个表,将USERINFO表里的离职员工放到USERINFO_OLD里面,将C6的新员工添加进来】
    ---- 2.1,将离职的员工移到USERINFO_OLD表里面,然后删除USerINFO里的员工数据,好跟考勤机同步,
if @isUpdate_deleteUSERInfo<>0  ---是否更新控制
    begin
    insert into USERINFO_OLD select * from USERINFO  where SSN is not null and ltrim(rtrim(SSN)) not in (select ltrim(rtrim(EmpNo)) from CenterSix2012.dbo.RS_Emp)    ---移动
    delete USERINFO where SSN is not null and  USERID  in (select USERID from USERINFO_OLD) --删除已经离职的员工    
    end
else ----如果不删除旧员工也要将卡号清除
    begin
    update USERINFO set CardNo=NUll where  ltrim(SSN) not in (select ltrim(EmpNo) from CenterSix2012.dbo.RS_Emp)            ----將離職員工卡號清空
    end
----go
    ---- 2.2,更新新进的员工
if @isUpdate_USERInfo<>0  --控制开关
begin
insert into USERINFO
(
BADGENUMBER  ,     --考勤号码    
SSN   ,                 --身份证/证件号
NAME   ,                --姓名
GENDER   ,               --性别
PAGER   ,               --移动电话/传呼机
BIRTHDAY  ,                --生日
HIREDDAY  ,                --参加工作日期
STREET   ,              --家庭地址
VERIFICATIONMETHOD   ,      --验证方式
DEFAULTDEPTID   , --所属部门ID号
ATT  ,        --考勤有效
INLATE  ,     --计迟到               
OUTEARLY  ,   --计早退                
OVERTIME  ,   --计加班                 
SEP  ,        --             
HOLIDAY  ,    --假日休息             
MINZU   ,                --民族
LUNCHDURATION --有午休
)
select
replace(ltrim(EmpNo),'QX',''),---考勤号码
ltrim(EmpNo) AS EMPNO, --编号
EmpName,-- 姓名
case when EmpSexID=1 then 'M' else 'F' end,--性别 M男F女
EmpMobile,--移动电话
EmpBirthday,--生日
EmpGrpDate,--入职日期
EmpHomeAddr,--家庭地址
1,--验证方式
1,--部门ID
1,--考勤有效
0,
0,
1,
1,
1,
EmpNation,--民族
1 --午休
from CenterSix2012.dbo.RS_EMp   
where ltrim(EmpNo)  not in (select ltrim(SSN) from USERINFO where SSN is not NULL ) and EMPNO not in ('QX0001','QX0002','QX0007') ---这3个编号不加进去
order by EMPNO
end
----go
    ---- 2.3,更新员工所在部门和职位等无关紧要的信息,不是必须的
    begin
        update USERINFO  set DEFAULTDEPTID=1 where DEFAULTDEPTID is NULL ----没有部门归到总公司
    end
    
    
    
----第三 更新员工ID卡号码 【这里是全部更新,因为有补卡的情况和卡片改变的情况,每次全部更新比较简单】
if @isUpdate_CardNo<>0
begin
update USERINFO set CardNo=(
select replace('0000000001',RIGHT('0000000001',len(CenterSix2012.dbo.TX_EmpCard.CardFixNo)),CenterSix2012.dbo.TX_EmpCard.CardFixNo)
from CenterSix2012.dbo.RS_EMp,CenterSix2012.dbo.TX_EmpCard
where CenterSix2012.dbo.RS_EMp.EmpSYSID=CenterSix2012.dbo.TX_EmpCard.EmpSYSID
and CenterSix2012.dbo.TX_EmpCard.GUID=(
select top 1 AA.GUID from CenterSix2012.dbo.TX_EmpCard AA where CenterSix2012.dbo.RS_EMp.EmpSySID=AA.EmpSySID and  AA.CardStatusID=20 order by AA.EmpSySID,AA.CardNewDay desc
) and ltrim(CenterSix2012.dbo.RS_EMp.EmpNo)=USERINFO.SSN
)
end
----go
----第四 删除设备上的离职员工。不会再打卡的员工[现在还是 需要在考勤机软件上操作]
select top 1 * from USERINFO where 1=2
----第五 上传人员信息 [现在还是 需要在考勤机软件上操作,尽量选在无人打开的时候进行,此时考勤机是打不了卡的,显示正在传输]
----go
------/////考勤人员信息同步完成\\\\\------
------/////下面是考勤记录同步\\\\\------
if @isUpdate_KQ_Result<>0
begin  -----
---第A。下载考勤数据,这个考勤软件自动定时更新,也可随时人工更新【在考勤软件上下载考勤记录就可,可重复操纵,因为每次只下载新的记录】
---第B。将中控考勤数据更新到C6系统
   ---B-1,中控考勤记录表中没有人的编号,先更新编号,【可带来方便】
   begin
       update CHECKINOUT set Memoinfo=(select SSN from USERINFO where  USERINFO.USERID=CHECKINOUT.USERID) where Memoinfo is null
       if exists(select top 1 1 from CHECKINOUT where Memoinfo is null)  ---如果在人员表里面没有找到,在旧的人员数据里找编号
       begin
        update CHECKINOUT set Memoinfo=(select SSN from USERINFO_OLD where  USERINFO_OLD.USERID=CHECKINOUT.USERID) where Memoinfo is null
       end
   end
 ----  go
   ---B-2,将考勤数据导入C6 就是讲CHECKINOUT里的记录打卡数据插入到C6里的 KQ_KqData 表和 Mj_MjData 表里面 Mj_MjData表示打卡原始记录表,
   ------ KQ_KqData是根据Mj_MjData里的数据转来的,C6考勤系统依据它来分析考勤
   ---*--B-2-1 :先将没有导入的数据进行标记 先标记为1 表示那些数据要导入,在导入门禁表Mj_MjData后标记为2,再导入考勤表KQ_KqData ,最后标记为3表示完成。
   ----***----将要导入的记录进行标记 先标记为1
   update checkinout set UserExtFmt=1 where Memoinfo is not NULL and  UserExtFmt=0 ---一开始是0 变成1 进行标记
   begin
       ----***----将第一标记的数据导入Mj_MjData-----------
        insert into CenterSix2012.dbo.MJ_MjData(EmpSysID,DevID,CardID,CardDate,CardDay,DoorID,DoorName)
        select
        (select top 1 av.EmpSysID from CenterSix2012.dbo.TX_EmpCard av where ltrim(av.CardDispNo)=CHECKINOUT.Memoinfo order by av.CardNewDay desc),
        10004,----设备编号设置为10004 便于区分
        (select top 1 ax.CardID from CenterSix2012.dbo.TX_EmpCard ax where 1=1 and ltrim(ax.CardDispNo)=CHECKINOUT.Memoinfo  order by ax.CardNewDay DESC),
        dateadd(day,0,CONVERT(varchar(100), CHECKTIME, 23)) ,
        CHECKTIME,
        1,
        '门区1'
        from CHECKINOUT where Memoinfo is not NULL and  UserExtFmt=1
       ----***----将要导入的记录进行第二次标记 标记为2表示第一步导入完成
       update checkinout set UserExtFmt=2 where Memoinfo is not NULL and  UserExtFmt=1 ---一开始是1 变成2 进行标记
   end
  ---- go
   begin
       ----***----导入数据到C6的考勤表
        insert into CenterSix2012.dbo.KQ_KqData(EmpSysID,KqDate,KqTime,IsKeyin,IsKouKuan,IsModified,DevID,KeyinDay,CardID,SynchFlagID)
        select
        (select top 1 av.EmpSysID from CenterSix2012.dbo.TX_EmpCard av where ltrim(av.CardDispNo)=CHECKINOUT.Memoinfo order by av.CardNewDay desc),
        dateadd(day,0,CONVERT(varchar(100), CHECKTIME, 23)) as TTT ,
        DATEDIFF (ss,dateadd(day,0,CONVERT(varchar(100), CHECKTIME, 23)),CHECKTIME), --考勤时间
        'N',
        'N',
        'N',
        10004,---设备号10004区分
        CHECKTIME,
        (select top 1 ax.CardID from CenterSix2012.dbo.TX_EmpCard ax where 1=1 and ltrim(ax.CardDispNo)=CHECKINOUT.Memoinfo  order by ax.CardNewDay DESC),
        0
        from CHECKINOUT where Memoinfo is not NULL and  UserExtFmt=2
      ----***----将要导入的记录进行第三次标记 标记为3表示导入完成  
      update checkinout set UserExtFmt=3 where Memoinfo is not NULL and  UserExtFmt=2 ---一开始是2 变成3 进行标记  
  end
end ---考勤记录同步结束

go
------------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------------------

---------
吐槽:我也不想这样做,只是一刷卡考勤机2k多是不是太坑爹了点啊

你可能感兴趣的:(sql)