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);
            }
        }
 public List<ShiftArrange> ApplyTemplateTo(Staff staff, DatetimeRange range)
 {
     if (Items != null && Items.Count > 0 && Items.Exists(it => it.Duration <= 0)) return null; //如果存在某个班次持续时间小于0,直接退出
     List<ShiftArrange> sas = new List<ShiftArrange>();
     if (this.Items != null && this.Items.Count > 0)
     {
         DateTime dt = range.Begin;
         while (dt <= range.End)
         {
             foreach (TemplateItem item in Items)
             {
                 int duration = 1;
                 while (duration <= item.Duration)
                 {
                     if (HolidaySetting.Current != null &&
                         HolidaySetting.Current.IsHoliday(dt) && (this.Options & TemplateOptions.HolidayShifted) == 0) //节假日不排班
                     {
                         dt = dt.AddDays(1);
                         if (item.DurationUnit == 0) duration++; //按天为单位,即使不排班也要减少次数
                     }
                     else if (HolidaySetting.Current != null &&
                         HolidaySetting.Current.IsWeekend(dt) && (this.Options & TemplateOptions.WeekendShifted) == 0)//周末不排班
                     {
                         dt = dt.AddDays(1);
                         if (item.DurationUnit == 0) duration++; //按天为单位,即使不排班也要减少次数
                     }
                     else
                     {
                         duration++;
                         if (item.Shifts != null && item.Shifts.Count > 0 && staff.HireDate.Date <= dt.Date) //考虑到员工入职日期,入职日期之前排班无意义
                         {
                             foreach (Shift shift in item.Shifts)
                             {
                                 ShiftArrange sa = new ShiftArrange();
                                 sa.StaffID = staff.ID;
                                 sa.ShiftDate = dt;
                                 sa.ShiftID = shift.ID;
                                 sa.Shift = shift;
                                 sas.Add(sa);
                             }
                         }
                         dt = dt.AddDays(1);
                     }
                     if (dt > range.End) return sas;
                 }
                 for (int i = 1; i <= item.RestDays; i++)
                 {
                     dt = dt.AddDays(1);
                     if (dt > range.End) return sas;
                 }
             }
         }
     }
     return sas;
 }
        private void AddTASheetsToTimezones(Staff staff, List<AttendanceResult> timezones, List<TASheet> sheets, DatetimeRange range)
        {
            List<TASheet> items = sheets.Where(item => item.SheetType != "A").ToList();
            if (items != null && items.Count > 0)
            {
                foreach (TASheet sheet in items)
                {
                    ExcludeTASheet(timezones, sheet, range);
                }
            }

            items = sheets.Where(item => item.SheetType == "A").ToList();
            if (items != null && items.Count > 0)
            {
                foreach (TASheet sheet in items)
                {
                    MergeTASheet(staff, timezones, sheet, range);
                }
            }
        }
 public CommandResult ShiftArrange(int staffID, DatetimeRange range, List<ShiftArrange> arranges)
 {
     IShiftArrangeProvider provider = ProviderFactory.Create<IShiftArrangeProvider>(_RepoUri);
     ShiftArrangeSearchCondition con = new ShiftArrangeSearchCondition();
     con.StaffID = staffID;
     con.ShiftDate = range;
     List<ShiftArrange> items = provider.GetItems(con).QueryObjects;
     IUnitWork unitWork = ProviderFactory.Create<IUnitWork>(_RepoUri);
     foreach (ShiftArrange item in items)
     {
         provider.Delete(item, unitWork);
     }
     if (arranges != null && arranges.Count > 0)
     {
         foreach (ShiftArrange item in arranges)
         {
             provider.Insert(item, unitWork);
         }
     }
     return unitWork.Commit();
 }
 /// <summary>
 /// 增加考勤结果,此用户在此时间段内的所以考勤结果都清除,再写入新结果
 /// </summary>
 /// <param name="staffID"></param>
 /// <param name="range"></param>
 /// <param name="arranges"></param>
 /// <returns></returns>
 public CommandResult Add(int staffID, DatetimeRange range, List<AttendanceResult> arranges)
 {
     IAttendanceResultProvider provider = ProviderFactory.Create<IAttendanceResultProvider>(_RepoUri);
     StaffAttendanceResultSearchCondition con = new StaffAttendanceResultSearchCondition();
     con.Staff = new List<int>();
     con.Staff.Add(staffID);
     con.ShiftDate = range;
     List<AttendanceResult> items = provider.GetItems(con).QueryObjects;
     IUnitWork unitWork = ProviderFactory.Create<IUnitWork>(_RepoUri);
     foreach (AttendanceResult item in items)
     {
         provider.Delete(item, unitWork);
     }
     if (arranges != null && arranges.Count > 0)
     {
         foreach (AttendanceResult item in arranges)
         {
             if (item.AbsentItems != null && item.AbsentItems.Count > 0) item.AbsentItems.ForEach(it => it.ResultID = item.ID);
             provider.Insert(item, unitWork);
         }
     }
     return unitWork.Commit();
 }
        private bool CreateAttendanceResults(Staff staff, DatetimeRange dr, List<string> readers)
        {
            ShiftArrangeSearchCondition con1 = new ShiftArrangeSearchCondition();
            con1.StaffID = staff.ID;
            con1.ShiftDate = dr;
            List<ShiftArrange> sas = (new ShiftArrangeBLL(AppSettings.CurrentSetting.ConnectUri)).GetItems(con1).QueryObjects;

            TASheetSearchCondition con2 = new TASheetSearchCondition();
            con2.StaffID = staff.ID;
            List<TASheet> sheets = (new TASheetBLL(AppSettings.CurrentSetting.ConnectUri)).GetItems(con2).QueryObjects;

            AttendanceLogSearchCondition con3 = new AttendanceLogSearchCondition();
            con3.Staff = new List<int>();
            con3.Staff.Add(staff.ID);
            con3.Readers = readers;
            con3.ReadDateTime = dr;
            con3.ContainManualLogs = true;
            List<AttendanceLog> records = (new AttendanceLogBLL(AppSettings.CurrentSetting.ConnectUri)).GetItems(con3).QueryObjects;

            List<AttendanceResult> results = (new AttendanceAnalyst()).Analist(staff, sas, records, sheets, dr);
            CommandResult ret = (new AttendanceResultBLL(AppSettings.CurrentSetting.ConnectUri)).Add(staff.ID, dr, results);
            return ret.Result == ResultCode.Successful;
        }
Example #7
0
 /// <summary>
 /// 判断时间段是否完全包含时间段
 /// </summary>
 /// <param name="dr"></param>
 /// <returns></returns>
 public bool Contain(DatetimeRange dr)
 {
     return(this.Contain(dr.Begin) && this.Contain(dr.End));
 }
 private void btnOk_Click(object sender, EventArgs e)
 {
     if (dtEnd.Value < dtBegin.Value)
     {
         MessageBox.Show("\"复制到\" 里面的结束时间小于开始时间");
         return;
     }
     DatetimeRange dr = new DatetimeRange(dtBegin.Value, dtEnd.Value);
     List<ShiftArrange> items = GetShiftArranges();
     CommandResult ret = (new ShiftArrangeBLL(AppSettings.CurrentSetting.ConnectUri)).ShiftArrange(Staff.ID, dr, items);
     if (ret.Result == ResultCode.Successful)
     {
         ShiftArranges = items;
         this.DialogResult = DialogResult.OK;
     }
     else
     {
         MessageBox.Show(ret.Message);
     }
 }
  private void GetAttendanceLog(DeviceInfo device, bool onlyLatest)
  {
      ZKFingerKeeper keeper = new ZKFingerKeeper(device);
      FrmProcessing frm = new FrmProcessing();
      Action action = delegate()
      {
          frm.ShowProgress("正在连接考勤机...", 0);
          keeper.Connect();
          if (keeper.IsConnected)
          {
              try
              {
                  //清空控制器
                  frm.ShowProgress("正在获取考勤记录...", 0);
                  DatetimeRange dr = null;
                  if (onlyLatest && device.LastEventDt != null)
                  {
                      dr = new DatetimeRange(device.LastEventDt.Value.AddSeconds(1), new DateTime(2099, 12, 31)); //从最后那个时间开始获取
                  }
                  List<AttendanceLog> logs = keeper.GetAttendanceLogs(dr);
                  if (logs == null || logs.Count == 0)
                  {
                      frm.ShowProgress(string.Empty , 1);
                  }
                  else
                  {
                      frm.ShowProgress(string.Format("获取到 {0} 条考勤记录,正在努力保存考勤记录...", logs.Count), 0.99m);
                      AttendanceLogBLL bll = new AttendanceLogBLL(AppSettings.CurrentSetting.ConnectUri);
                      int count = 0;
                      foreach (AttendanceLog log in logs)
                      {
                          count++;
                          frm.ShowProgress(string.Format("正在保存第 {0} 条记录", count), (decimal)count / logs.Count);
                          CommandResult ret = bll.Add(log);
                      }
                      frm.ShowProgress(string.Empty , 1);
                      device.LastEventDt = logs.Max(it => it.ReadDateTime);
                      (new DeviceInfoBLL(AppSettings.CurrentSetting.ConnectUri)).Update(device);
                  }
              }
              catch (ThreadAbortException)
              {
              }
              catch (Exception ex)
              {
                  LJH.GeneralLibrary.ExceptionHandling.ExceptionPolicy.HandleException(ex);
              }
              finally
              {
                  keeper.Disconnect();
              }
          }
          else
          {
              frm.ShowProgress("连接设备失败", 1);
          }
      };
      Thread t = new Thread(new ThreadStart(action));
      t.Start();
      frm.ShowDialog();
 }
Example #10
0
        public List <ShiftArrange> ApplyTemplateTo(Staff staff, DatetimeRange range)
        {
            if (Items != null && Items.Count > 0 && Items.Exists(it => it.Duration <= 0))
            {
                return(null);                                                                          //如果存在某个班次持续时间小于0,直接退出
            }
            List <ShiftArrange> sas = new List <ShiftArrange>();

            if (this.Items != null && this.Items.Count > 0)
            {
                DateTime dt = range.Begin;
                while (dt <= range.End)
                {
                    foreach (TemplateItem item in Items)
                    {
                        int duration = 1;
                        while (duration <= item.Duration)
                        {
                            if (HolidaySetting.Current != null &&
                                HolidaySetting.Current.IsHoliday(dt) && (this.Options & TemplateOptions.HolidayShifted) == 0) //节假日不排班
                            {
                                dt = dt.AddDays(1);
                                if (item.DurationUnit == 0)
                                {
                                    duration++;                         //按天为单位,即使不排班也要减少次数
                                }
                            }
                            else if (HolidaySetting.Current != null &&
                                     HolidaySetting.Current.IsWeekend(dt) && (this.Options & TemplateOptions.WeekendShifted) == 0)//周末不排班
                            {
                                dt = dt.AddDays(1);
                                if (item.DurationUnit == 0)
                                {
                                    duration++;                         //按天为单位,即使不排班也要减少次数
                                }
                            }
                            else
                            {
                                duration++;
                                if (item.Shifts != null && item.Shifts.Count > 0 && staff.HireDate.Date <= dt.Date) //考虑到员工入职日期,入职日期之前排班无意义
                                {
                                    foreach (Shift shift in item.Shifts)
                                    {
                                        ShiftArrange sa = new ShiftArrange();
                                        sa.StaffID   = staff.ID;
                                        sa.ShiftDate = dt;
                                        sa.ShiftID   = shift.ID;
                                        sa.Shift     = shift;
                                        sas.Add(sa);
                                    }
                                }
                                dt = dt.AddDays(1);
                            }
                            if (dt > range.End)
                            {
                                return(sas);
                            }
                        }
                        for (int i = 1; i <= item.RestDays; i++)
                        {
                            dt = dt.AddDays(1);
                            if (dt > range.End)
                            {
                                return(sas);
                            }
                        }
                    }
                }
            }
            return(sas);
        }
        /// <summary>
        /// 根据某个员工的排班记录,刷卡记录,请假单,加班单等原始资料生成指定时间段内的考勤结果
        /// </summary>
        /// <param name="staff"></param>
        /// <param name="sas"></param>
        /// <param name="ars"></param>
        /// <param name="vss"></param>
        /// <returns></returns>
        public List <AttendanceResult> Analist(Staff staff, List <ShiftArrange> sas, List <AttendanceLog> ars, List <TASheet> sheets, DatetimeRange range)
        {
            //根据排班记录,加班单,请假外出单等生成整个时期的要标记的时间段
            List <AttendanceResult> results = CreateTimezones(staff, sas);

            //与加班单和请假外出单等合并,得出最后每个上下班时间的准确日期
            AddTASheetsToTimezones(staff, results, sheets, range);
            //为那些所有需要记录上下班时间的时间段附加签到和签退
            List <AttendanceResult> items = (from item in results
                                             orderby item.NewStartTime ascending
                                             select item).ToList();

            //对每个时间段附加上实际的打卡时间
            AttachAttendanceReocrds(items, ars);
            ////对最终需要上班的时间段和实际的刷卡记录进行分析,得出每个时间段的考勤结果
            results.ForEach(item => item.CreateResult());
            return(results);
        }
        /// <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 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="staff"></param>
        /// <param name="sas"></param>
        /// <param name="ars"></param>
        /// <param name="vss"></param>
        /// <returns></returns>
        public List<AttendanceResult> Analist(Staff staff, List<ShiftArrange> sas, List<AttendanceLog> ars, List<TASheet> sheets, DatetimeRange range)
        {
            //根据排班记录,加班单,请假外出单等生成整个时期的要标记的时间段
            List<AttendanceResult> results = CreateTimezones(staff, sas);

            //与加班单和请假外出单等合并,得出最后每个上下班时间的准确日期
            AddTASheetsToTimezones(staff, results, sheets, range);
            //为那些所有需要记录上下班时间的时间段附加签到和签退
            List<AttendanceResult> items = (from item in results
                                            orderby item.NewStartTime ascending
                                            select item).ToList();
            //对每个时间段附加上实际的打卡时间
            AttachAttendanceReocrds(items, ars);
            ////对最终需要上班的时间段和实际的刷卡记录进行分析,得出每个时间段的考勤结果
            results.ForEach(item => item.CreateResult());
            return results;
        }
 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 AddTASheetsToTimezones(Staff staff, List <AttendanceResult> timezones, List <TASheet> sheets, DatetimeRange range)
        {
            List <TASheet> items = sheets.Where(item => item.SheetType != "A").ToList();

            if (items != null && items.Count > 0)
            {
                foreach (TASheet sheet in items)
                {
                    ExcludeTASheet(timezones, sheet, range);
                }
            }

            items = sheets.Where(item => item.SheetType == "A").ToList();
            if (items != null && items.Count > 0)
            {
                foreach (TASheet sheet in items)
                {
                    MergeTASheet(staff, timezones, sheet, range);
                }
            }
        }
Example #17
0
 /// <summary>
 /// 判断时间段是否完全包含时间段
 /// </summary>
 /// <param name="dr"></param>
 /// <returns></returns>
 public bool Contain(DatetimeRange dr)
 {
     return this.Contain(dr.Begin) && this.Contain(dr.End);
 }
        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 btnOk_Click(object sender, EventArgs e)
        {
            if (txtShiftTemplate.Tag == null)
            {
                MessageBox.Show("没有选择模板");
                return;
            }
            if (this.ucDateTimeInterval1.StartDateTime > this.ucDateTimeInterval1.EndDateTime)
            {
                MessageBox.Show("应用的日期不正确,开始时间大于结束时间");
                return;
            }
            if (this.departmentTreeview1.SelectedStaff == null || this.departmentTreeview1.SelectedStaff.Count == 0)
            {
                MessageBox.Show("没有选择人员");
                return;
            }
            FrmProcessing frm = new FrmProcessing();
            DatetimeRange dr = new DatetimeRange(ucDateTimeInterval1.StartDateTime, ucDateTimeInterval1.EndDateTime);
            List<Staff> staffs = this.departmentTreeview1.SelectedStaff;
            ShiftTemplate template = txtShiftTemplate.Tag as ShiftTemplate;
            Action action = delegate()
            {
                decimal count = 0;
                try
                {
                    foreach (Staff staff in staffs)
                    {
                        try
                        {
                            frm.ShowProgress(string.Format("正在应用模板 {0}...", staff.Name), count / staffs.Count);
                            count++;
                            List<ShiftArrange> items = template.ApplyTemplateTo(staff, dr);
                            CommandResult ret = (new ShiftArrangeBLL(AppSettings.CurrentSetting.ConnectUri)).ShiftArrange(staff.ID, dr, items);
                            if (ret.Result == ResultCode.Successful)
                            {
                                frm.ShowProgress(string.Format("应用模板成功 {0}", staff.Name), count / staffs.Count);
                            }
                            else
                            {
                                frm.ShowProgress(string.Format("应用模板失败 {0}", staff.Name), count / staffs.Count);
                            }
                        }
                        catch (Exception ex)
                        {
                            LJH.GeneralLibrary.ExceptionHandling.ExceptionPolicy.HandleException(ex);
                        }
                    }
                }
                catch (ThreadAbortException)
                {
                }
            };

            Thread t = new Thread(new ThreadStart(action));
            t.IsBackground = true;
            t.Start();
            if (frm.ShowDialog() != DialogResult.OK)
            {
                t.Abort();
            }
            this.DialogResult = DialogResult.OK;
        }