Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
 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);
 }
Пример #4
0
        /// <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;
        }
Пример #5
0
 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);
 }