最近小编在做一个签到统计项目,项目的大概需求是这样的:一个人每天可以打卡,上班的人需要每天最少打两次卡,上班打一次,下班打一次,但是一天可以打多次,只要打了多次卡,这时候问题就来,比如说一天一共员工打了十次卡,那哪一条算上班打卡,哪一条算下班打卡哪?经过领导审批,在这每一天的打卡记录中,我们按时间排序,第一条算上班,最后一条算下班。下面看看具体的代码功能实现吧。
后台代码统计某个月里的所有打卡记录,并按时间排序,找出这一个月中每一天的第一条数据。PS:降序是下班打卡时间,升序是上班打卡时间。
public List<EmployeeServices> LoadUserTask(string Sort, string CnName, string startTime, string endTime) { try { string sql = string.Format(@"SELECT CnName ,CreateTime from ( SELECT Rank() over(PARTITION BY Convert ( VARCHAR(10), CreateTime, 120),CnName ORDER BY CreateTime {0} ) as rowno, t.* FROM EmployeeServices t WHERE CnName='{1}' and CreateTime BETWEEN '{2}' AND '{3}' ) aa WHERE rowno=1", Sort,CnName, startTime, endTime); List<EmployeeServices> list = new List<EmployeeServices>(); //List<ComparePunch> listComparePunch = new List<ComparePunch>(); foreach (var item in this.QueryData(sql)) { list.Add(item); } return list; } catch (Exception ex) { throw ex; } }
判断是否出勤,出勤后是否迟到,下午是否出勤,出勤后是否早退。并将查出来的上班打卡集合和下班打卡集合融合成一个集合。
上午出勤情况统计
#region 查询出勤情况 /// <summary> /// 查询出勤情况 /// </summary> /// <returns></returns> public List<ComparePunch> QueryComparePurchList() { var model = new EmployeeServicePunchList(); var user = DeluxeIdentity.CurrentUser; model.DisplayName = user.DisplayName; string startTime; string endTime; string sort; HttpCookie cookie = Request.Cookies["queryMonth"]; if (cookie != null) { startTime = DateTime.Parse(cookie["monthValue"]).ToString(); DateTime end = DateTime.Parse(startTime); endTime = LastDayOfMonth(end).ToString(); TimeSpan ts = new TimeSpan(0, 0, 0, 0);//时间跨度 Response.Cookies.Remove("cookie");//清除 } else { startTime = FirstDayOfMonth(DateTime.Now).ToString(); endTime = LastDayOfMonth(DateTime.Now).ToString(); } List<ComparePunch> list = new List<ComparePunch>(); #region 上午出勤情况 查询每一天的第一条记录 //查询每一天的第一条记录 sort = "ASC"; var data = ComparePunchAdapater.Instance.LoadUserTask(sort, model.DisplayName, startTime, endTime); sort = "DESC"; var dataPM = ComparePunchAdapater.Instance.LoadUserTask(sort, model.DisplayName, startTime, endTime); ComparePunch cp = new ComparePunch(); foreach (var item in data) { //1.0判断上午是否出勤 var AM = IsInTimeInterval(item.CreateTime, Convert.ToDateTime(item.CreateTime.ToString("yyyy-MM-dd 06:00:00")), Convert.ToDateTime(item.CreateTime.ToString("yyyy-MM-dd 12:00:00"))); if (AM) { //2.0 判断上午是否迟到 var bl = ExecDateDiff(item.CreateTime, Convert.ToDateTime(item.CreateTime.ToString("yyyy-MM-dd 08:30:00"))); if (bl) { list.Add(new ComparePunch { CreatTime = item.CreateTime.ToString("MM-dd"), AMSignTime = item.CreateTime.ToString("HH:mm") + " " + "迟到" }); } else { list.Add(new ComparePunch { CreatTime = item.CreateTime.ToString("MM-dd"), AMSignTime = item.CreateTime.ToString("HH:mm") }); } } else { list.Add(new ComparePunch { CreatTime = item.CreateTime.ToString("MM-dd"), AMSignTime = "未打卡" }); } } #endregion
下午出勤情况统计
#region 下午出勤情况 查询每一天的最后一条记录 //查询每一天的最后一条记录 for (int i = 0; i < list.Count; i++) { var PM = IsInTimeInterval(dataPM[i].CreateTime, Convert.ToDateTime(dataPM[i].CreateTime.ToString("yyyy-MM-dd 12:00:00")), Convert.ToDateTime(dataPM[i].CreateTime.ToString("yyyy-MM-dd 23:59:59"))); if (PM) { //2.0 判断下午是否早退 var b2 = ExecDateDiff(dataPM[i].CreateTime, Convert.ToDateTime(dataPM[i].CreateTime.ToString("yyyy-MM-dd 17:30:00"))); if (b2) { list[i].PMSignTime = dataPM[i].CreateTime.ToString("HH:mm"); } else //没有早退 { list[i].PMSignTime = dataPM[i].CreateTime.ToString("HH:mm") + " " + "早退"; } } else //没有出勤 { list[i].PMSignTime = "未打卡"; } } #endregion