//处理考勤事件 void KQ_SJ_指纹处理(object sender, Even_指纹系统处理 e) { if (textBox3.TextLength > 10000) { textBox3.Text = ""; } textBox3.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ")); textBox3.AppendText(e.mesg + "\r\n"); }
/// <summary> /// 插入新指纹数据 并更新数据库数据 /// </summary> /// <param name="dt"></param> private int Update_KQ(DataTable dt) { DAL dal = new DAL(); //先删除临时表数据 string SQL = "DELETE FROM [CNGTZ].[dbo].[TZ_人员_考勤TEMP]"; dal.RunSql(SQL); foreach (DataRow row in dt.Rows) { SqlParameter par1 = new SqlParameter("刷机时间", row["checktime"].ToString()); #region 用于处理字符串后面的特殊字符 //处理原因为,从Access数据库生成的 table,姓名字段,取出的数据,后面带有特殊不能显示的字符,原因不明 byte[] t = System.Text.Encoding.Default.GetBytes((string)row["name"]); int x = 0; foreach (var b in t) { if (b == 0) { break; } x = x + 1; } string name = Encoding.Default.GetString(t, 0, x); #endregion //Sys.DebugMes(name); SqlParameter par2 = new SqlParameter("姓名", name); SQL = "INSERT INTO [CNGTZ].[dbo].[TZ_人员_考勤TEMP]([刷机时间],[姓名]) VALUES(@刷机时间,@姓名)"; dal.RunSql(SQL, new SqlParameter[] { par1, par2 }); } SQL = @"Insert into [CNGTZ].[dbo].[TZ_人员_考勤_刷机时间]( 刷机时间, 姓名) SELECT 刷机时间, 姓名 from [CNGTZ].[dbo].[TZ_人员_考勤TEMP] b where not exists(select * from [CNGTZ].[dbo].[TZ_人员_考勤_刷机时间] where b.刷机时间= 刷机时间 and b.姓名= 姓名 )"; dal.RunSql(SQL);//运行 复制数据 存储过程 if (this.SJ_指纹处理 != null) { Even_指纹系统处理 e = new Even_指纹系统处理(); e.mesg = "复制纹数据:" + dal.ExecuteRowCount.ToString() + "条"; //触发事件 this.SJ_指纹处理(this, e); } return dal.ExecuteRowCount; }
/// <summary> /// 生成班组考勤表 /// </summary> /// <param name="ry">班组人员列表</param> /// <param name="dt">日期</param> /// <param name="zd">站点</param> /// <param name="bz">班组</param> /// <param name="yb">是否夜班</param> private void KQ_生成班组考勤数据(DataTable ry, DateTime dt, int zd, int bz, bool yb) { string 上班时间 = "", 下班时间 = "", 白班夜班 = ""; SqlParameter par1, par2, par3, par4, par5, par6, par7, par8; string SQL = @"INSERT INTO [CNGTZ].[dbo].[TZ_人员_考勤表] ([人员ID] ,[日期] ,[站点] ,[姓名] ,[班组] ,[白班夜班] ,[上班时间] ,[下班时间]) VALUES (@人员ID ,@日期 ,@站点 ,@姓名 ,@班组 ,@白班夜班 ,@上班时间 ,@下班时间 )"; par1 = new SqlParameter("日期", dt); par2 = new SqlParameter("站点", zd); par3 = new SqlParameter("班组", bz); DAL dal = new DAL(); dal.saveErrorLog(false);//关闭记录错误日志 // 南高站 与 西路站 if (zd == 2 || zd == 3) { if (yb) { 白班夜班 = "夜班"; 上班时间 = dt.ToShortDateString() + " 20:00:00"; 下班时间 = dt.AddDays(1).ToShortDateString() + " 9:00:00"; } else { 白班夜班 = "白班"; 上班时间 = dt.ToShortDateString() + " 9:00:00"; 下班时间 = dt.ToShortDateString() + " 20:00:00"; } par4 = new SqlParameter("白班夜班", 白班夜班); par5 = new SqlParameter("上班时间", 上班时间); par6 = new SqlParameter("下班时间", 下班时间); foreach (DataRow row in ry.Rows) { par7 = new SqlParameter("人员ID", int.Parse(row["ID"].ToString())); par8 = new SqlParameter("姓名", row["姓名"].ToString()); dal.RunSql(SQL, new SqlParameter[] { par1, par2, par3, par4, par5, par6, par7, par8 }); } } //麻柳沱站 if (zd == 4) { if (bz == 2 || bz == 4) {//如果班组为2 或 4 不进行麻柳沱站处理 return; } 上班时间 = dt.ToShortDateString() + " 9:00:00"; 下班时间 = dt.AddDays(2).ToShortDateString() + " 9:00:00"; par4 = new SqlParameter("白班夜班", ""); par5 = new SqlParameter("上班时间", 上班时间); par6 = new SqlParameter("下班时间", 下班时间); foreach (DataRow row in ry.Rows) { par7 = new SqlParameter("人员ID", int.Parse(row["ID"].ToString())); par8 = new SqlParameter("姓名", row["姓名"].ToString()); dal.RunSql(SQL, new SqlParameter[] { par1, par2, par3, par4, par5, par6, par7, par8 }); } } if (this.SJ_指纹处理 != null) { Even_指纹系统处理 e = new Even_指纹系统处理(); e.mesg = string.Format("生成考勤表:日期{0};站点={1};班组:{2}", dt.ToShortDateString(), zd.ToString(), bz.ToString()); //触发事件 this.SJ_指纹处理(this, e); } }
/// <summary> /// 签到时间生成 /// </summary> /// <param name="dt">结束日期</param> /// <param name="dd">处理天数</param> /// <param name="wc">指纹刷机误差小时</param> /// <param name="cdwc">迟到误差分钟</param> /// <param name="ztwc">早退误差分钟</param> public void KQ_签到处理(DateTime dt, int dd, int wc, int cdwc, int ztwc) { //dt = DateTime.Parse(dt.ToShortDateString()); DateTime 起始时间 = dt.AddDays(0 - dd); //签到处理 string SQL = "SELECT [ID],[姓名],[上班时间],[下班时间] FROM [CNGTZ].[dbo].[TZ_人员_考勤表] where 上班签到 IS NULL and 日期 between @起始 and @结束"; SqlParameter par1 = new SqlParameter("起始", 起始时间); SqlParameter par2 = new SqlParameter("结束", dt); //Sys.DebugMes(起始时间.ToString() + " " + dt.ToString()); DAL dal = new DAL(); DataTable renName = dal.RunSqlDataTable(SQL, new SqlParameter[] { par1, par2 });//取得人员列表 foreach (DataRow row in renName.Rows) { DateTime t = DateTime.Parse(row["上班时间"].ToString()); SqlParameter p1 = new SqlParameter("起始", t.AddHours(0 - wc)); SqlParameter p2 = new SqlParameter("结束", t.AddHours(wc)); SqlParameter p3 = new SqlParameter("姓名", row["姓名"].ToString()); if (row["姓名"].ToString() == "陈兴华") { Sys.DebugMes("XXX"); } SQL = "SELECT top 1 [刷机时间] FROM [CNGTZ].[dbo].[TZ_人员_考勤_刷机时间] where 姓名=@姓名 AND 刷机时间 BETWEEN @起始 AND @结束 ORDER BY 刷机时间"; string qdsj = dal.RunSqlGetID(SQL, new SqlParameter[] { p1, p2, p3 });//找到最早指纹签到时间 if (qdsj == null) { continue;//如果没有找到签到时间 就到下一条记录 } int cd = 0;//判断是否迟到 DateTime tt = DateTime.Parse(qdsj);//签到时间 TimeSpan temp = tt.Subtract(t); cd = temp.Minutes;//迟到分钟 cd = (cd > cdwc) ? 1 : 0; SQL = "UPDATE [CNGTZ].[dbo].[TZ_人员_考勤表] SET [上班签到] = @签到时间,[实到] =[实到]+ 1,[迟到]= " + cd.ToString() + " WHERE ID =@ID"; SqlParameter p4 = new SqlParameter("ID", int.Parse(row["ID"].ToString())); SqlParameter p5 = new SqlParameter("签到时间", DateTime.Parse(qdsj)); dal.RunSql(SQL, new SqlParameter[] { p4, p5 });//更新签到时间列表 } //进行签退处理 SQL = "SELECT [ID],[姓名],[上班时间],[下班时间] FROM [CNGTZ].[dbo].[TZ_人员_考勤表] where 下班签退 IS NULL and 日期 between @起始 and @结束"; par1 = new SqlParameter("起始", 起始时间); par2 = new SqlParameter("结束", dt); renName = dal.RunSqlDataTable(SQL, new SqlParameter[] { par1, par2 });//取得人员列表 foreach (DataRow row in renName.Rows) { DateTime t = DateTime.Parse(row["下班时间"].ToString()); SqlParameter p1 = new SqlParameter("起始", t.AddHours(0 - wc)); SqlParameter p2 = new SqlParameter("结束", t.AddHours(wc)); SqlParameter p3 = new SqlParameter("姓名", row["姓名"].ToString()); SQL = "SELECT top 1 [刷机时间] FROM [CNGTZ].[dbo].[TZ_人员_考勤_刷机时间] where 姓名=@姓名 AND 刷机时间 BETWEEN @起始 AND @结束 ORDER BY 刷机时间 desc"; string qdsj = dal.RunSqlGetID(SQL, new SqlParameter[] { p1, p2, p3 });//找到最后下班指纹签到时间 if (qdsj == null) { continue;//如果没有找到签到时间 就到下一条记录 } int zt = 0;//判断是否早退 DateTime tt = DateTime.Parse(qdsj); TimeSpan temp = t.Subtract(tt); zt = temp.Minutes; zt = (zt > ztwc) ? 1 : 0; SQL = "UPDATE [CNGTZ].[dbo].[TZ_人员_考勤表] SET [下班签退] = @签到时间,[实到] =[实到]+ 1,[早退]= " + zt.ToString() + " WHERE ID =@ID"; SqlParameter p4 = new SqlParameter("ID", int.Parse(row["ID"].ToString())); SqlParameter p5 = new SqlParameter("签到时间", DateTime.Parse(qdsj)); dal.RunSql(SQL, new SqlParameter[] { p4, p5 });//更新签到时间列表 } //记录处理时间 SQL = "INSERT INTO [CNGTZ].[dbo].[TZ_人员_考勤处理时间]([时间]) VALUES ('" + DateTime.Now.ToString() + "')"; dal.RunSql(SQL); if (this.SJ_指纹处理 != null) { Even_指纹系统处理 e = new Even_指纹系统处理(); e.mesg = "处理考勤签到【" + 起始时间.ToShortDateString() + " 至 " + dt.ToShortDateString() + "】到完成!"; //触发事件 this.SJ_指纹处理(this, e); } }
/// <summary> /// 处理出勤情况,生成出勤时间(分钟) /// </summary> /// <param name="dt"></param> /// <param name="dd"></param> public void KQ_出勤情况(DateTime dt, int dd) { DateTime 起始时间 = dt.AddDays(0 - dd); string SQL = "UPDATE [CNGTZ].[dbo].[TZ_人员_考勤表] SET [出勤情况] ='正常',[出勤时间] = datediff(mi,[上班签到],[下班签退]) WHERE [实到]=2 AND 日期 BETWEEN @起始 AND @结束"; SqlParameter par1 = new SqlParameter("起始", 起始时间); SqlParameter par2 = new SqlParameter("结束", dt); DAL dal = new DAL(); dal.RunSql(SQL, new SqlParameter[] { par1, par2 }); SQL = "UPDATE [CNGTZ].[dbo].[TZ_人员_考勤表] SET [出勤情况] ='异常' WHERE [实到]<>2 AND 日期 BETWEEN @起始 AND @结束"; dal.RunSql(SQL, new SqlParameter[] { par1, par2 }); if (this.SJ_指纹处理 != null) { Even_指纹系统处理 e = new Even_指纹系统处理(); e.mesg = "处理考勤情况【" + 起始时间.ToShortDateString() + " 至 " + dt.ToShortDateString() + "】到完成!"; //触发事件 this.SJ_指纹处理(this, e); } }
/// <summary> /// 取指纹机考勤数据 /// </summary> /// <param name="path">数据库路径</param> /// <param name="day">读取指定日期</param> /// <returns></returns> public int Get_KQ(string path, DateTime day) { ODBHelper ODB = new ODBHelper(path);//用于操作 access 数据库 DateTime start = day; DateTime end = day.AddDays(1); string SQL = "SELECT b.name, a.checktime FROM CHECKINOUT a left join USERINFO b on a.USERID=b.USERID where a.checktime between @起始时间 and @结束时间"; System.Data.OleDb.OleDbParameter par1 = new System.Data.OleDb.OleDbParameter("起始时间", start.ToString("yyyy-MM-dd HH:mm:ss")); System.Data.OleDb.OleDbParameter par2 = new System.Data.OleDb.OleDbParameter("结束时间", end.ToString("yyyy-MM-dd HH:mm:ss")); Sys.DebugMes(start.ToLongDateString() + " " + end.ToLongDateString()); DataTable dt = ODB.RunSqlDataTable(SQL, new System.Data.OleDb.OleDbParameter[] { par1, par2 }); int nu = 0; if (dt == null) { Sys.DebugMes(ODB.ERR); } else { Sys.DebugMes(dt.Rows.Count.ToString()); if (this.SJ_指纹处理 != null) { Even_指纹系统处理 e = new Even_指纹系统处理(); e.mesg = "读取指纹数据:" + dt.Rows.Count.ToString() + "条"; //触发事件 this.SJ_指纹处理(this, e); } if (dt.Rows.Count > 0) { nu = Update_KQ(dt);// 插入新指纹数据 并更新数据库数据 } } return nu; }