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; }
/// <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(); }
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); } } }
/// <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; }