private void AttachAttendanceReocrds(List <AttendanceResult> timezones, List <AttendanceLog> ars) { for (int i = 0; i < timezones.Count; i++) { AttendanceResult item = timezones[i]; AttendanceLog record = null; //上班时间 if (item.LogWhenArrive) { DateTime dt1 = item.EarlyestTime; //最早上班时间 //获取上班打卡时间,如果之前有已经计算好的时间段,则当前时间段的上班时间需要从上一个时间段的刷卡时间后开始算起, //并要注意上班时间不能小于上一班次的下班时间 if (i > 0) { AttendanceResult stPre = timezones[i - 1]; if (stPre.NewEndTime >= dt1) { dt1 = stPre.NewEndTime.AddMilliseconds(1); } if (stPre.OffDutyTime != null && stPre.OffDutyTime.Value >= dt1) { dt1 = stPre.OffDutyTime.Value.AddMilliseconds(1); } } record = (from it in ars where it.ReadDateTime >= dt1 && it.ReadDateTime < item.NewEndTime orderby it.ReadDateTime ascending select it).FirstOrDefault(); if (record != null) { item.OnDutyTime = record.ReadDateTime; DateTime dtTemp = record.ReadDateTime; if (AttendanceRules.Current != null) { if (!string.IsNullOrEmpty(item.ShiftID)) { dtTemp = dtTemp.AddMinutes(AttendanceRules.Current.MinShiftMinute); } else { dtTemp = dtTemp.AddMinutes(AttendanceRules.Current.MinOTMinute); } } else { dtTemp = dtTemp.AddMinutes(1); } ars.RemoveAll(it => it.ReadDateTime <= dtTemp); //去掉所有前面的读卡记录,下面计算时会越来越快 } } else { item.OnDutyTime = item.NewStartTime; //如果上班不需要刷卡,则上班时间设置成应上班时间 } if (item.LogWhenLeave) { //获取下班时间 DateTime dt2 = item.LatestTime; if (i < timezones.Count - 1) { AttendanceResult stNext = timezones[i + 1]; if (dt2 >= stNext.NewStartTime) { dt2 = stNext.NewStartTime.AddMilliseconds(-1); } List <AttendanceLog> items = (from it in ars where it.ReadDateTime >= item.NewEndTime && it.ReadDateTime <= dt2 orderby it.ReadDateTime descending select it).ToList(); if (items.Count == 1) { item.OffDutyTime = items[0].ReadDateTime; } if (items.Count > 1) //如果有多条记录,则下班时间计算到最长,保留最后一条用作下一个班次的上班时间就可以了。 { if (items[0].ReadDateTime >= stNext.EarlyestTime) { item.OffDutyTime = items[1].ReadDateTime; } else { item.OffDutyTime = items[0].ReadDateTime; } ars.RemoveAll(it => it.ReadDateTime <= item.OffDutyTime); //去掉所有前面的读卡记录,下面计算时会越来越快 } } if (item.OffDutyTime == null) { record = (from it in ars where it.ReadDateTime > item.NewStartTime && it.ReadDateTime <= dt2 orderby it.ReadDateTime descending select it).FirstOrDefault(); if (record != null) { item.OffDutyTime = record.ReadDateTime; ars.RemoveAll(it => it.ReadDateTime <= item.OffDutyTime);//去掉所有前面的读卡记录,下面计算时会越来越快 } } } else { item.OffDutyTime = item.NewEndTime; //如果下班不需要刷卡,则下班时间为应下班时间 } } }
public CommandResult Delete(AttendanceLog info) { return ProviderFactory.Create<IAttendanceLogProvider>(_RepoUri).Delete(info); }
/// <summary> /// 获取机器上的考勤记录 /// </summary> /// <param name="range">考勤记录的日期时间范围,为null表示获取所有记录</param> /// <returns></returns> public List<AttendanceLog> GetAttendanceLogs(DatetimeRange range) { int idwErrorCode = 0; List<AttendanceLog> logs = new List<AttendanceLog>(); try { axCZKEM1.EnableDevice(iMachineNumber, false);//disable the device if (axCZKEM1.ReadGeneralLogData(iMachineNumber))//read all the attendance records to the memory { int idwTMachineNumber = 0; int idwEnrollNumber = 0; int idwEMachineNumber = 0; int idwVerifyMode = 0; int idwInOutMode = 0; int idwYear = 0; int idwMonth = 0; int idwDay = 0; int idwHour = 0; int idwMinute = 0; while (axCZKEM1.GetGeneralLogData(iMachineNumber, ref idwTMachineNumber, ref idwEnrollNumber, ref idwEMachineNumber, ref idwVerifyMode, ref idwInOutMode, ref idwYear, ref idwMonth, ref idwDay, ref idwHour, ref idwMinute))//get records from the memory { DateTime dt = new DateTime(idwYear, idwMonth, idwDay, idwHour, idwMinute, 0); if (range == null || range.Contain(dt)) { AttendanceLog log = new AttendanceLog() { StaffID = idwEnrollNumber, StaffName = string.Empty, ReaderID = Parameter.ID, ReaderName = Parameter.Name, ReadDateTime = dt, }; logs.Add(log); } } } else { axCZKEM1.GetLastError(ref idwErrorCode); if (idwErrorCode != 0) { LJH.GeneralLibrary.LOG.FileLog.Log(Parameter.Name, "获取考勤记录失败,ErrorCode=" + idwErrorCode.ToString()); } else { LJH.GeneralLibrary.LOG.FileLog.Log(Parameter.Name, "无考勤记录,ErrorCode=" + idwErrorCode.ToString()); } } } catch (Exception ex) { throw ex; } finally { axCZKEM1.EnableDevice(iMachineNumber, true);//enable the device } return logs; }
public CommandResult Add(AttendanceLog info) { return ProviderFactory.Create<IAttendanceLogProvider>(_RepoUri).Insert(info); }
private List<AttendanceLog> GetLogs() { List<AttendanceLog> logs = new List<AttendanceLog>(); List<Staff> items = departmentTreeview1.SelectedStaff; foreach (Staff staff in items) { DateTime dt1 = dtStart.Value; DateTime dt2 = dtEnd.Value; while (dt1 <= dt2) { for (int i = 1; i <= 6; i++) { if ((this.Controls["chkTime" + i.ToString()] as CheckBox).Checked) { int hour = (int)((this.Controls["txtHour" + i.ToString()] as NumericUpDown).Value); int minute = (int)((this.Controls["txtMinute" + i.ToString()] as NumericUpDown).Value); AttendanceLog log = new AttendanceLog() { StaffID = staff.ID, ReadDateTime = dt1.AddHours(hour).AddMinutes(minute), StaffName = staff.Name, ReaderID = string.Empty, IsManual = true, Memo = txtMemo.Text }; logs.Add(log); } } dt1 = dt1.AddDays(1); } } return logs; }