/// <summary>
        /// 导出相关人员在某一段时间的考勤报表
        /// </summary>
        /// <param name="staff"></param>
        /// <param name="dr"></param>
        /// <returns></returns>
        public void Export(List<Staff> users, int year, int month, string path)
        {
            Workbook book = null;
            try
            {
                Application app = new Application();
                book = app.Workbooks.Add(ReportModal); //打开模板
                Worksheet sheet = book.ActiveSheet as Worksheet;
                Exportweek(year, month, sheet);

                if (users != null && users.Count > 0)
                {
                    List<Department> depts = (new DepartmentBLL(AppSettings.CurrentSetting.ConnectUri)).GetItems(null).QueryObjects;
                    List<int> staff = users.Select(item => item.ID).ToList();
                    StaffAttendanceResultSearchCondition con = new StaffAttendanceResultSearchCondition();
                    con.Staff = staff;
                    DateTime dt = new DateTime(year, month, 1);
                    con.ShiftDate = new DatetimeRange(dt, dt.AddMonths(1).AddSeconds(-1));
                    List<AttendanceResult> arranges = (new AttendanceResultBLL(AppSettings.CurrentSetting.ConnectUri)).GetItems(con).QueryObjects;
                    int row = 1;
                    foreach (Staff s in users)
                    {
                        List<AttendanceResult> rets = (from it in arranges where it.StaffID == s.ID orderby it.StartTime ascending select it).ToList();
                        if (rets != null && rets.Count > 0)
                        {
                            AddStaff(s, rets, depts, sheet, row);
                            row++;
                        }
                    }
                    sheet.get_Range("A1", GetColName(49) + (2 + (row - 1) * 3)).Borders.LineStyle = XlLineStyle.xlContinuous;
                }
                book.SaveAs(path, XlFileFormat.xlXMLSpreadsheet, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            }
            catch (Exception ex)
            {
                LJH.GeneralLibrary.ExceptionHandling.ExceptionPolicy.HandleException(ex);
            }
            finally
            {
                book.Close(false, Type.Missing, Type.Missing);
            }
        }
 /// <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();
 }
 protected override List<object> GetDataSource()
 {
     List<Staff> users = departmentTreeview1.SelectedStaff;
     if (users != null && users.Count > 0)
     {
         List<int> staff = users.Select(item => item.ID).ToList();
         StaffAttendanceResultSearchCondition con = new StaffAttendanceResultSearchCondition();
         con.Staff = staff;
         con.ShiftDate = new DatetimeRange(ucDateTimeInterval1.StartDateTime, ucDateTimeInterval1.EndDateTime);
         List<AttendanceResult> arranges = (new AttendanceResultBLL(AppSettings.CurrentSetting.ConnectUri)).GetItems(con).QueryObjects;
         List<IGrouping<int, AttendanceResult>> groups = arranges.GroupBy(item => item.StaffID).ToList();
         List<object> items = new List<object>();
         foreach (Staff s in users)
         {
             IGrouping<int, AttendanceResult> group = groups.SingleOrDefault(item => item.Key == s.ID);
             if (group != null) items.Add(group);
         }
         return items;
     }
     return null;
 }
 protected override List<object> GetDataSource()
 {
     List<Staff> users = departmentTreeview1.SelectedStaff;
     if (users != null && users.Count > 0)
     {
         List<int> staff = users.Select(item => item.ID).ToList();
         StaffAttendanceResultSearchCondition con = new StaffAttendanceResultSearchCondition();
         con.Staff = staff;
         con.ShiftDate = new DatetimeRange(ucDateTimeInterval1.StartDateTime, ucDateTimeInterval1.EndDateTime);
         List<AttendanceResult> arranges = (new AttendanceResultBLL(AppSettings.CurrentSetting.ConnectUri)).GetItems(con).QueryObjects;
         List<object> items = new List<object>();
         foreach (Staff s in users)
         {
             List<AttendanceResult> rets = (from it in arranges where it.StaffID == s.ID orderby it.StartTime ascending select it).ToList();
             if (rets != null && rets.Count > 0)
             {
                 rets.ForEach(it => it.StaffName = s.Name);
                 List<IGrouping<DateTime, AttendanceResult>> groups = rets.GroupBy(item => item.ShiftDate).ToList();
                 List<object> sas = (from g in groups select (object)g).ToList();
                 items.AddRange(sas);
             }
         }
         return items;
     }
     return null;
 }
 protected override List<object> GetDataSource()
 {
     List<Staff> users = departmentTreeview1.SelectedStaff;
     if (users != null && users.Count > 0)
     {
         List<int> staff = users.Select(item => item.ID).ToList();
         StaffAttendanceResultSearchCondition con = new StaffAttendanceResultSearchCondition();
         con.Staff = staff;
         con.ShiftDate = new DatetimeRange(ucDateTimeInterval1.StartDateTime, ucDateTimeInterval1.EndDateTime);
         List<AttendanceResult> arranges = (new AttendanceResultBLL(AppSettings.CurrentSetting.ConnectUri)).GetItems(con).QueryObjects;
         return (from item in arranges
                 orderby item.StaffName ascending, item.ShiftDate ascending
                 select (object)item).ToList();
     }
     return null;
 }