private void MergeTASheet(Staff staff, List <AttendanceResult> timezones, TASheet sheet, DatetimeRange range) { List <AttendanceResult> items = new List <AttendanceResult>(); if (!range.Contain(sheet.StartDate) && !range.Contain(sheet.EndDate)) { return; } DateTime dt = sheet.StartDate; while (dt <= sheet.EndDate && range.Contain(dt)) { List <AttendanceResult> ots = CreateAttendanceResult(staff, dt, sheet); if (ots == null || ots.Count == 0) { break; } foreach (AttendanceResult ot in ots) { DatetimeRange drOT = new DatetimeRange(ot.NewStartTime, ot.NewEndTime); List <AttendanceResult> sts = timezones.Where(it => it.ShiftDate == ot.ShiftDate).ToList(); if (sts == null || sts.Count == 0) { items.Add(ot); } else { foreach (AttendanceResult st in sts) { DatetimeRange drSt = new DatetimeRange(st.NewStartTime, st.NewEndTime); if (!drSt.Contain(drOT)) //检查是否有全部重合的情况,如果与上班时间全部重合,则加班无效。 { if (drSt.Contain(drOT.Begin)) //如果加班的开始时间与普通上班时间有重叠,加班时间要截取掉重合部分,并且普通上班下班不用再打卡。 { st.LogWhenLeave = false; ot.NewStartTime = drSt.End; ot.ShiftTime = (new DatetimeRange(ot.NewStartTime, ot.NewEndTime)).TotalMinutes; ot.Present = (new DatetimeRange(ot.NewStartTime, ot.NewEndTime)).TotalMinutes; ot.LogWhenArrive = false; } if (drSt.Contain(drOT.End)) { ot.NewEndTime = drSt.Begin; ot.ShiftTime = (new DatetimeRange(ot.NewStartTime, ot.NewEndTime)).TotalMinutes; ot.Present = (new DatetimeRange(ot.NewStartTime, ot.NewEndTime)).TotalMinutes; ot.LogWhenLeave = false; st.LogWhenArrive = false; } items.Add(ot); } } } } dt = dt.AddDays(1); } if (items.Count > 0) { timezones.AddRange(items); } }
private void ExcludeTASheet(List <AttendanceResult> timezones, TASheet sheet, DatetimeRange range) { List <AttendanceResult> items = new List <AttendanceResult>(); if (!range.Contain(sheet.StartDate) && !range.Contain(sheet.EndDate)) { return; } DateTime dt = sheet.StartDate; while (dt <= sheet.EndDate && range.Contain(dt)) { if (sheet.Items != null && sheet.Items.Count > 0) { foreach (TASheetItem item in sheet.Items) { DateTime dt1 = dt.AddHours(item.StartTime.Hour).AddMinutes(item.StartTime.Minute).AddSeconds(item.StartTime.Second); DateTime dt2 = dt.AddHours(item.EndTime.Hour).AddMinutes(item.EndTime.Minute).AddSeconds(item.EndTime.Second); if (item.NextDay) { dt2 = dt2.AddDays(1); } DatetimeRange dr = new DatetimeRange(dt1, dt2); List <AttendanceResult> sts = timezones.Where(it => it.ShiftDate == dt).ToList(); if (sts != null && sts.Count > 0) { foreach (AttendanceResult st in sts) { DatetimeRange drItem = new DatetimeRange(st.NewStartTime, st.NewEndTime); if (dr.Contain(drItem)) { if (!(sheet.SheetType == "C" && AttendanceRules.Current != null && AttendanceRules.Current.ShiftTimeIncludeWaiChu)) { st.Present = 0; } st.Category = sheet.CategoryID; st.LogWhenArrive = false; st.LogWhenLeave = false; AbsentItem ai = new AbsentItem() { ID = Guid.NewGuid(), Category = sheet.CategoryID, Duration = st.ShiftTime }; st.AbsentItems.Add(ai); } else if (drItem.Contain(dr)) { if (!(sheet.SheetType == "C" && AttendanceRules.Current != null && AttendanceRules.Current.ShiftTimeIncludeWaiChu)) { st.Present -= dr.TotalMinutes; } if (drItem.Begin == dr.Begin) { st.NewStartTime = dr.End; } if (drItem.End == dr.End) { st.NewEndTime = dr.Begin; } AbsentItem ai = new AbsentItem() { ID = Guid.NewGuid(), Category = sheet.CategoryID, Duration = dr.TotalMinutes }; st.AbsentItems.Add(ai); } else if (drItem.Contain(dr.Begin)) { DatetimeRange drTemp = new DatetimeRange(dr.Begin, drItem.End); if (!(sheet.SheetType == "C" && AttendanceRules.Current != null && AttendanceRules.Current.ShiftTimeIncludeWaiChu)) { st.Present -= drTemp.TotalMinutes; } st.NewEndTime = dr.Begin; AbsentItem ai = new AbsentItem() { ID = Guid.NewGuid(), Category = sheet.CategoryID, Duration = drTemp.TotalMinutes }; st.AbsentItems.Add(ai); } else if (drItem.Contain(dr.End)) { DatetimeRange drTemp = new DatetimeRange(drItem.Begin, dr.End); if (!(sheet.SheetType == "C" && AttendanceRules.Current != null && AttendanceRules.Current.ShiftTimeIncludeWaiChu)) { st.Present -= drTemp.TotalMinutes; } st.NewStartTime = dr.End; AbsentItem ai = new AbsentItem() { ID = Guid.NewGuid(), Category = sheet.CategoryID, Duration = drTemp.TotalMinutes }; st.AbsentItems.Add(ai); } } } } } dt = dt.AddDays(1); } if (items.Count > 0) { timezones.AddRange(items); } }
private void ExcludeTASheet(List<AttendanceResult> timezones, TASheet sheet, DatetimeRange range) { List<AttendanceResult> items = new List<AttendanceResult>(); if (!range.Contain(sheet.StartDate) && !range.Contain(sheet.EndDate)) return; DateTime dt = sheet.StartDate; while (dt <= sheet.EndDate && range.Contain(dt)) { if (sheet.Items != null && sheet.Items.Count > 0) { foreach (TASheetItem item in sheet.Items) { DateTime dt1 = dt.AddHours(item.StartTime.Hour).AddMinutes(item.StartTime.Minute).AddSeconds(item.StartTime.Second); DateTime dt2 = dt.AddHours(item.EndTime.Hour).AddMinutes(item.EndTime.Minute).AddSeconds(item.EndTime.Second); if (item.NextDay) dt2 = dt2.AddDays(1); DatetimeRange dr = new DatetimeRange(dt1, dt2); List<AttendanceResult> sts = timezones.Where(it => it.ShiftDate == dt).ToList(); if (sts != null && sts.Count > 0) { foreach (AttendanceResult st in sts) { DatetimeRange drItem = new DatetimeRange(st.NewStartTime, st.NewEndTime); if (dr.Contain(drItem)) { if (!(sheet.SheetType == "C" && AttendanceRules.Current != null && AttendanceRules.Current.ShiftTimeIncludeWaiChu)) { st.Present = 0; } st.Category = sheet.CategoryID; st.LogWhenArrive = false; st.LogWhenLeave = false; AbsentItem ai = new AbsentItem() { ID=Guid.NewGuid (), Category = sheet.CategoryID, Duration = st.ShiftTime }; st.AbsentItems.Add(ai); } else if (drItem.Contain(dr)) { if (!(sheet.SheetType == "C" && AttendanceRules.Current != null && AttendanceRules.Current.ShiftTimeIncludeWaiChu)) { st.Present -= dr.TotalMinutes; } if (drItem.Begin == dr.Begin) st.NewStartTime = dr.End; if (drItem.End == dr.End) st.NewEndTime = dr.Begin; AbsentItem ai = new AbsentItem() { ID=Guid.NewGuid (), Category = sheet.CategoryID, Duration = dr.TotalMinutes }; st.AbsentItems.Add(ai); } else if (drItem.Contain(dr.Begin)) { DatetimeRange drTemp = new DatetimeRange(dr.Begin, drItem.End); if (!(sheet.SheetType == "C" && AttendanceRules.Current != null && AttendanceRules.Current.ShiftTimeIncludeWaiChu)) { st.Present -= drTemp.TotalMinutes; } st.NewEndTime = dr.Begin; AbsentItem ai = new AbsentItem() { ID=Guid.NewGuid (), Category = sheet.CategoryID, Duration = drTemp.TotalMinutes }; st.AbsentItems.Add(ai); } else if (drItem.Contain(dr.End)) { DatetimeRange drTemp = new DatetimeRange(drItem.Begin, dr.End); if (!(sheet.SheetType == "C" && AttendanceRules.Current != null && AttendanceRules.Current.ShiftTimeIncludeWaiChu)) { st.Present -= drTemp.TotalMinutes; } st.NewStartTime = dr.End; AbsentItem ai = new AbsentItem() { ID=Guid .NewGuid (), Category = sheet.CategoryID, Duration = drTemp.TotalMinutes }; st.AbsentItems.Add(ai); } } } } } dt = dt.AddDays(1); } if (items.Count > 0) timezones.AddRange(items); }
/// <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; }
private void MergeTASheet(Staff staff, List<AttendanceResult> timezones, TASheet sheet, DatetimeRange range) { List<AttendanceResult> items = new List<AttendanceResult>(); if (!range.Contain(sheet.StartDate) && !range.Contain(sheet.EndDate)) return; DateTime dt = sheet.StartDate; while (dt <= sheet.EndDate && range.Contain(dt)) { List<AttendanceResult> ots = CreateAttendanceResult(staff, dt, sheet); if (ots == null || ots.Count == 0) break; foreach (AttendanceResult ot in ots) { DatetimeRange drOT = new DatetimeRange(ot.NewStartTime, ot.NewEndTime); List<AttendanceResult> sts = timezones.Where(it => it.ShiftDate == ot.ShiftDate).ToList(); if (sts == null || sts.Count == 0) { items.Add(ot); } else { foreach (AttendanceResult st in sts) { DatetimeRange drSt = new DatetimeRange(st.NewStartTime, st.NewEndTime); if (!drSt.Contain(drOT)) //检查是否有全部重合的情况,如果与上班时间全部重合,则加班无效。 { if (drSt.Contain(drOT.Begin)) //如果加班的开始时间与普通上班时间有重叠,加班时间要截取掉重合部分,并且普通上班下班不用再打卡。 { st.LogWhenLeave = false; ot.NewStartTime = drSt.End; ot.ShiftTime = (new DatetimeRange(ot.NewStartTime, ot.NewEndTime)).TotalMinutes; ot.Present = (new DatetimeRange(ot.NewStartTime, ot.NewEndTime)).TotalMinutes; ot.LogWhenArrive = false; } if (drSt.Contain(drOT.End)) { ot.NewEndTime = drSt.Begin; ot.ShiftTime = (new DatetimeRange(ot.NewStartTime, ot.NewEndTime)).TotalMinutes; ot.Present = (new DatetimeRange(ot.NewStartTime, ot.NewEndTime)).TotalMinutes; ot.LogWhenLeave = false; st.LogWhenArrive = false; } items.Add(ot); } } } } dt = dt.AddDays(1); } if (items.Count > 0) timezones.AddRange(items); }