/// <summary> /// 根据主键索引,获得指定的假期记录以便查看编辑 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void clientAtt_GetShiftDefineByIDCompleted(object sender, GetShiftDefineByIDCompletedEventArgs e) { if (e.Error == null) { entShiftDefine = e.Result; //entShiftDefine.NEEDFIRSTCARD = entShiftDefine.NEEDFIRSTCARD == "2" ? "2" : "1"; //entShiftDefine.NEEDSECONDCARD = entShiftDefine.NEEDSECONDCARD == "2" ? "2" : "1"; //entShiftDefine.NEEDTHIRDCARD = entShiftDefine.NEEDTHIRDCARD == "2" ? "2" : "1"; //entShiftDefine.NEEDFOURTHCARD = entShiftDefine.NEEDFOURTHCARD == "2" ? "2" : "1"; this.DataContext = entShiftDefine; //上班 IsNeedCard(entShiftDefine.NEEDFIRSTCARD, cbNeedFirstCard, nudFirstCardStartTime, nudFirstCardEndTime); IsNeedCard(entShiftDefine.NEEDSECONDCARD, cbNeedSecondCard, nudSecCardStartTime, nudSecCardEndTime); IsNeedCard(entShiftDefine.NEEDTHIRDCARD, cbNeedThirdCard, nudThirdCardStartTime, nudThirdCardEndTime); IsNeedCard(entShiftDefine.NEEDFOURTHCARD, cbNeedFourthCard, nudFourthCardStartTime, nudFourthCardEndTime); //下班 IsNeedCard(entShiftDefine.NEEDFIRSTOFFCARD, cbNeedFirstOffCard, nudFirstOffCardStartTime, nudFirstOffCardEndTime); IsNeedCard(entShiftDefine.NEEDSECONDOFFCARD, cbNeedSecondOffCard, nudSecOffCardStartTime, nudSecOffCardEndTime); IsNeedCard(entShiftDefine.NEEDTHIRDOFFCARD, cbNeedThirdOffCard, nudThirdOffCardStartTime, nudThirdOffCardEndTime); IsNeedCard(entShiftDefine.NEEDFOURTHOFFCARD, cbNeedFourthOffCard, nudFourthOffCardStartTime, nudFourthOffCardEndTime); SetToolBar(); } else { Utility.ShowCustomMessage(MessageTypes.Error, Utility.GetResourceStr("ERROR"), Utility.GetResourceStr(e.Error.Message)); } }
/// <summary> /// 弹出表单子窗口,编辑班次定义 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnEdit_Click(object sender, RoutedEventArgs e) { string strShiftDefineID = string.Empty; if (dgSEList.SelectedItems == null) { ComfirmWindow.ConfirmationBox(Utility.GetResourceStr("CONFIRMINFO"), Utility.GetResourceStr("SELECTERROR", "EDIT"), Utility.GetResourceStr("CONFIRMBUTTON")); return; } if (dgSEList.SelectedItems.Count == 0) { ComfirmWindow.ConfirmationBox(Utility.GetResourceStr("CONFIRMINFO"), Utility.GetResourceStr("SELECTERROR", "EDIT"), Utility.GetResourceStr("CONFIRMBUTTON")); return; } T_HR_SHIFTDEFINE ent = dgSEList.SelectedItems[0] as T_HR_SHIFTDEFINE; strShiftDefineID = ent.SHIFTDEFINEID.ToString(); ShiftDefineForm formShiftDefine = new ShiftDefineForm(FormTypes.Edit, strShiftDefineID); EntityBrowser entBrowser = new EntityBrowser(formShiftDefine); entBrowser.FormType = FormTypes.Edit; entBrowser.ReloadDataEvent += new EntityBrowser.refreshGridView(entBrowser_ReloadDataEvent); entBrowser.Show <string>(DialogMode.Default, SMT.SAAS.Main.CurrentContext.Common.ParentLayoutRoot, "", (result) => {}); }
/// <summary> /// 选择班次 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void lkShiftName_FindClick(object sender, EventArgs e) { Dictionary <string, string> cols = new Dictionary <string, string>(); cols.Add("SHIFTNAME", "SHIFTNAME"); cols.Add("WORKTIME", "WORKTIME"); LookupForm lookup = new LookupForm(SMT.Saas.Tools.OrganizationWS.EntityNames.ShiftDefine, typeof(T_HR_SHIFTDEFINE[]), cols); lookup.SelectedClick += (o, ev) => { T_HR_SHIFTDEFINE ent = lookup.SelectedObj as T_HR_SHIFTDEFINE; LookUp lkShiftName = sender as LookUp; if (ent != null) { lkShiftName.DataContext = ent; if (lkDefaultShiftName.DataContext != null) { T_HR_SHIFTDEFINE entDefault = lkDefaultShiftName.DataContext as T_HR_SHIFTDEFINE; if (ent.SHIFTDEFINEID != entDefault.SHIFTDEFINEID) { lkDefaultShiftName.DataContext = null; } } } }; lookup.Show <string>(DialogMode.Default, SMT.SAAS.Main.CurrentContext.Common.ParentLayoutRoot, "", (result) => { }); }
/// <summary> /// 删除指定班次定义(物理删除,暂定) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnDelete_Click(object sender, RoutedEventArgs e) { string strID = ""; if (dgSEList.SelectedItems == null) { ComfirmWindow.ConfirmationBox(Utility.GetResourceStr("CONFIRMINFO"), Utility.GetResourceStr("SELECTERROR", "DELETE"), Utility.GetResourceStr("CONFIRMBUTTON")); return; } if (dgSEList.SelectedItems.Count == 0) { ComfirmWindow.ConfirmationBox(Utility.GetResourceStr("CONFIRMINFO"), Utility.GetResourceStr("SELECTERROR", "DELETE"), Utility.GetResourceStr("CONFIRMBUTTON")); return; } foreach (object ovj in dgSEList.SelectedItems) { T_HR_SHIFTDEFINE entShiftDefine = ovj as T_HR_SHIFTDEFINE; string Result = ""; if (entShiftDefine != null) { strID = entShiftDefine.SHIFTDEFINEID; ComfirmWindow delComfirm = new ComfirmWindow(); delComfirm.OnSelectionBoxClosed += (obj, result) => { clientAtt.RemoveShiftDefineAsync(strID); }; delComfirm.SelectionBox(Utility.GetResourceStr("DELETECONFIRM"), Utility.GetResourceStr("DELETEALTER"), ComfirmWindow.titlename, Result); } } }
/// <summary> /// 效验提交的数据 /// </summary> /// <param name="flag"></param> /// <returns></returns> private T_HR_SCHEDULINGTEMPLATEDETAIL CheckSubmitForm(ref bool flag) { flag = false; T_HR_SCHEDULINGTEMPLATEDETAIL SchedulingTemplateDetail = new T_HR_SCHEDULINGTEMPLATEDETAIL(); SchedulingTemplateDetail.T_HR_SCHEDULINGTEMPLATEMASTER = GetMaster(); SchedulingTemplateDetail.TEMPLATEDETAILID = System.Guid.NewGuid().ToString().ToUpper(); int iDayNo = 0; flag = int.TryParse(txtSchedulingDate.Text, out iDayNo); if (!flag) { Utility.ShowCustomMessage(MessageTypes.Error, Utility.GetResourceStr("SCHEDULINGDATE"), Utility.GetResourceStr("REQUIREDNUMERICAL", "SCHEDULINGDATE")); return(null); } else { SchedulingTemplateDetail.SCHEDULINGDATE = txtSchedulingDate.Text; } if (lkShiftName.DataContext == null) { flag = false; Utility.ShowCustomMessage(MessageTypes.Error, Utility.GetResourceStr("SHIFTNAME"), Utility.GetResourceStr("REQUIRED", "SHIFTNAME")); return(null); } else { T_HR_SHIFTDEFINE ent = lkShiftName.DataContext as T_HR_SHIFTDEFINE; if (string.IsNullOrEmpty(ent.SHIFTDEFINEID)) { flag = false; return(null); } SchedulingTemplateDetail.T_HR_SHIFTDEFINE = ent; flag = true; } if (!string.IsNullOrEmpty(txtRemark.Text)) { SchedulingTemplateDetail.REMARK = txtRemark.Text; } //2010年2月11日, 11:37:35,目前暂未实现登录部分,人员相关数据为假定值 SchedulingTemplateDetail.CREATEDATE = DateTime.Now; SchedulingTemplateDetail.CREATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; SchedulingTemplateDetail.UPDATEDATE = System.DateTime.Now; SchedulingTemplateDetail.UPDATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; return(SchedulingTemplateDetail); }
/// <summary> /// 表单初始化 /// </summary> private void InitForm() { entShiftDefine = new T_HR_SHIFTDEFINE(); entShiftDefine.SHIFTDEFINEID = System.Guid.NewGuid().ToString().ToUpper(); //权限控制 entShiftDefine.OWNERCOMPANYID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.UserPosts[0].CompanyID; entShiftDefine.OWNERDEPARTMENTID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.UserPosts[0].DepartmentID; entShiftDefine.OWNERPOSTID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.UserPosts[0].PostID; entShiftDefine.OWNERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; //2010年2月11日, 11:37:35,目前暂未实现登录部分,人员相关数据为假定值 entShiftDefine.CREATEDATE = DateTime.Now; entShiftDefine.CREATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; entShiftDefine.UPDATEDATE = System.DateTime.Now; entShiftDefine.UPDATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; //页面初始化加载的临时数据 entShiftDefine.WORKTIME = decimal.Parse("0"); entShiftDefine.NEEDFIRSTCARD = "0"; entShiftDefine.NEEDSECONDCARD = "0"; entShiftDefine.NEEDTHIRDCARD = "0"; entShiftDefine.NEEDFOURTHCARD = "0"; entShiftDefine.NEEDFIRSTOFFCARD = "0"; entShiftDefine.NEEDSECONDOFFCARD = "0"; entShiftDefine.NEEDTHIRDOFFCARD = "0"; entShiftDefine.NEEDFOURTHOFFCARD = "0"; IsNeedCard(entShiftDefine.NEEDFIRSTCARD, cbNeedFirstCard, nudFirstCardStartTime, nudFirstCardEndTime); IsNeedCard(entShiftDefine.NEEDSECONDCARD, cbNeedSecondCard, nudSecCardStartTime, nudSecCardEndTime); IsNeedCard(entShiftDefine.NEEDTHIRDCARD, cbNeedThirdCard, nudThirdCardStartTime, nudThirdCardEndTime); IsNeedCard(entShiftDefine.NEEDFOURTHCARD, cbNeedFourthCard, nudFourthCardStartTime, nudFourthCardEndTime); IsNeedCard(entShiftDefine.NEEDFIRSTOFFCARD, cbNeedFirstOffCard, nudFirstOffCardStartTime, nudFirstOffCardEndTime); IsNeedCard(entShiftDefine.NEEDSECONDOFFCARD, cbNeedSecondOffCard, nudSecOffCardStartTime, nudSecOffCardEndTime); IsNeedCard(entShiftDefine.NEEDTHIRDOFFCARD, cbNeedThirdOffCard, nudThirdOffCardStartTime, nudThirdOffCardEndTime); IsNeedCard(entShiftDefine.NEEDFOURTHOFFCARD, cbNeedFourthOffCard, nudFourthOffCardStartTime, nudFourthOffCardEndTime); this.DataContext = entShiftDefine; }
private void ShowShiftDefine() { if (dgSEList.ItemsSource == null) { entShiftDefine = new T_HR_SHIFTDEFINE(); this.DataContext = entShiftDefine; return; } ObservableCollection <T_HR_SHIFTDEFINE> entList = dgSEList.ItemsSource as ObservableCollection <T_HR_SHIFTDEFINE>; if (entList.Count() == 0) { entShiftDefine = new T_HR_SHIFTDEFINE(); this.DataContext = entShiftDefine; return; } if (dgSEList.SelectedItems.Count == 0) { entShiftDefine = entList.FirstOrDefault(); } else { entShiftDefine = dgSEList.SelectedItems[0] as T_HR_SHIFTDEFINE; } this.DataContext = entShiftDefine; //上班 IsNeedCard(entShiftDefine.NEEDFIRSTCARD, cbNeedFirstCard); IsNeedCard(entShiftDefine.NEEDSECONDCARD, cbNeedSecondCard); IsNeedCard(entShiftDefine.NEEDTHIRDCARD, cbNeedThirdCard); IsNeedCard(entShiftDefine.NEEDFOURTHCARD, cbNeedFourthCard); //下班 IsNeedCard(entShiftDefine.NEEDFIRSTOFFCARD, cbNeedFirstOffCard); IsNeedCard(entShiftDefine.NEEDSECONDOFFCARD, cbNeedSecondOffCard); IsNeedCard(entShiftDefine.NEEDTHIRDOFFCARD, cbNeedThirdOffCard); IsNeedCard(entShiftDefine.NEEDFOURTHOFFCARD, cbNeedFourthOffCard); }
public string ModifyShiftDefine(T_HR_SHIFTDEFINE entTemp) { using (ShiftDefineBLL bllShiftDefine = new ShiftDefineBLL()) { return bllShiftDefine.ModifyShiftDefine(entTemp); } }
private void ShowShiftDefine() { if (dgSEList.ItemsSource == null) { entShiftDefine = new T_HR_SHIFTDEFINE(); this.DataContext = entShiftDefine; return; } ObservableCollection<T_HR_SHIFTDEFINE> entList = dgSEList.ItemsSource as ObservableCollection<T_HR_SHIFTDEFINE>; if (entList.Count() == 0) { entShiftDefine = new T_HR_SHIFTDEFINE(); this.DataContext = entShiftDefine; return; } if (dgSEList.SelectedItems.Count == 0) { entShiftDefine = entList.FirstOrDefault(); } else { entShiftDefine = dgSEList.SelectedItems[0] as T_HR_SHIFTDEFINE; } this.DataContext = entShiftDefine; //上班 IsNeedCard(entShiftDefine.NEEDFIRSTCARD, cbNeedFirstCard); IsNeedCard(entShiftDefine.NEEDSECONDCARD, cbNeedSecondCard); IsNeedCard(entShiftDefine.NEEDTHIRDCARD, cbNeedThirdCard); IsNeedCard(entShiftDefine.NEEDFOURTHCARD, cbNeedFourthCard); //下班 IsNeedCard(entShiftDefine.NEEDFIRSTOFFCARD, cbNeedFirstOffCard); IsNeedCard(entShiftDefine.NEEDSECONDOFFCARD, cbNeedSecondOffCard); IsNeedCard(entShiftDefine.NEEDTHIRDOFFCARD, cbNeedThirdOffCard); IsNeedCard(entShiftDefine.NEEDFOURTHOFFCARD, cbNeedFourthOffCard); }
/// <summary> /// 检测申请加班的相关信息 /// </summary> /// <param name="request">结果数据实体</param> /// <returns>返回结果数据实体</returns> public CalculateOTHoursResponse CalculateOTHours(CalculateOTHoursRequest request) { CalculateOTHoursResponse response = new CalculateOTHoursResponse(); DateTime dtStartDate = Convert.ToDateTime(request.StartDate + " " + request.StartTime); DateTime dtEndDate = Convert.ToDateTime(request.EndDate + " " + request.EndTime); DateTime dtTempStartDate = dtStartDate; DateTime dtTempEndDate = dtEndDate; List <string> sWorkArr = new List <string>(); //工作时间 List <string> sNotWorkArr = new List <string>(); //休息时间 List <string> tempWorkArr = new List <string>(); DateTime FirstCardStartDate = DateTime.MinValue; DateTime FirstCardEndDate = DateTime.MinValue; DateTime SecondCardStartDate = DateTime.MinValue; DateTime SecondCardEndDate = DateTime.MinValue; DateTime ThirdCardStartDate = DateTime.MinValue; DateTime ThirdCardEndDate = DateTime.MinValue; DateTime FourthCardStartDate = DateTime.MinValue; DateTime FourthCardEndDate = DateTime.MinValue; double totalHours = 0; int hasFirstSetting = 1; //0,未设置;1,已设置 int hasSecondSetting = 1; //0,未设置;1,已设置 int hasThirdSetting = 1; //0,未设置;1,已设置 int hasFourthSetting = 1; //0,未设置;1,已设置 response.Result = Enums.Result.Success.GetHashCode(); response.Message = string.Empty; response.OTHours = 0; response.OTDays = 0; response.Month = string.Empty; response.AttendSolution = string.Empty; response.WorkPerDay = 0; response.StartTime = Convert.ToDateTime(request.StartTime).ToString("HH:mm"); //判断加班申请是否重复 T_HR_EMPLOYEEOVERTIMERECORD otEntity = dal.GetObjects <T_HR_EMPLOYEEOVERTIMERECORD>().Where(t => t.OVERTIMERECORDID != request.OverTimeRecordID && t.EMPLOYEEID == request.EmployeeID && ((dtStartDate > t.STARTDATE && dtStartDate < t.ENDDATE) ||//起始时间在已有时间段内 (dtEndDate > t.STARTDATE && dtEndDate < t.ENDDATE) ||//结束时间在已有时间段内 (dtStartDate == t.STARTDATE && dtEndDate > t.STARTDATE) ||//当dtStartDate与开始时间重叠时,dtEndDate需大于开始时间 (dtEndDate == t.ENDDATE && dtStartDate < t.ENDDATE) ||//当dtEndDate与最后时间重叠时dtStartDate需小于束时间 (dtStartDate <t.STARTDATE && dtEndDate> t.ENDDATE)//新增加班完成包含已有加班 ) && t.CHECKSTATE != "3" && t.CHECKSTATE != "0" ).FirstOrDefault(); if (otEntity != null) { response.Result = Enums.Result.HasDuplicateOTRecord.GetHashCode();//结果:失败 response.Message = Constants.HasDuplicateOTRecord + ";" + otEntity.STARTDATE.Value.ToString("yyyy-MM-dd") + " " + otEntity.STARTDATETIME + " ~ " + otEntity.ENDDATE.Value.ToString("yyyy-MM-dd") + " " + otEntity.ENDDATETIME;//加班申请重复 return(response); } #region " 获取考勤方案,排班明细,排班时间段 " AttendanceSolutionBLL bllAttendanceSolution = new AttendanceSolutionBLL(); T_HR_ATTENDANCESOLUTION OTPeriodAttendSolution = bllAttendanceSolution.GetAttendanceSolutionByEmployeeIDAndDate(request.EmployeeID, Convert.ToDateTime(request.StartDate), Convert.ToDateTime(request.EndDate)); SchedulingTemplateDetailBLL bllTemplateDetail = new SchedulingTemplateDetailBLL(); IQueryable <T_HR_SCHEDULINGTEMPLATEDETAIL> scheduleSetDetail = bllTemplateDetail.GetTemplateDetailRdListByAttendanceSolutionId(OTPeriodAttendSolution.ATTENDANCESOLUTIONID); T_HR_SCHEDULINGTEMPLATEMASTER scheduleSetting = scheduleSetDetail.FirstOrDefault().T_HR_SCHEDULINGTEMPLATEMASTER; int iCycleDays = 0; DateTime dtCycleStartDate = Convert.ToDateTime(Convert.ToDateTime(request.StartDate).ToString("yyyy-MM-01"));//按月为周期的排班表 DateTime dtCurCycleOTDate = Convert.ToDateTime(DateTime.Parse(request.StartDate).ToString("yyyy-MM-dd")); //找出加班时间与循环排班详细中对应的日历号,然后通过T_HR_SCHEDULINGTEMPLATEDETAIL找到对应的 打卡时间段: T_HR_SHIFTDEFINE if (scheduleSetting.SCHEDULINGCIRCLETYPE == (Common.SchedulingCircleType.Month.GetHashCode() + 1).ToString()) {//按月循环的排班打卡方式 iCycleDays = 31; } if ((scheduleSetting.SCHEDULINGCIRCLETYPE == (Common.SchedulingCircleType.Week.GetHashCode() + 1).ToString())) {//按周排班打卡方式 iCycleDays = 7; //如果是按周统计,则从当前算起 dtCycleStartDate = Convert.ToDateTime(DateTime.Parse(request.StartDate).ToString("yyyy-MM-dd")); } T_HR_SHIFTDEFINE dayCardSetting = null; //具体的排班明细,最多包括了4个时段的打卡设置,用于计算加班小时数 for (int i = 0; i < iCycleDays; i++) //找出加班日期对应的日历中对应明细排班: T_HR_SHIFTDEFINE { string strSchedulingDate = (i + 1).ToString(); DateTime dtCurDate = new DateTime(); dtCurDate = dtCycleStartDate.AddDays(i); if (dtCurDate != dtCurCycleOTDate) { continue; } T_HR_SCHEDULINGTEMPLATEDETAIL item = scheduleSetDetail.Where(c => c.SCHEDULINGDATE == strSchedulingDate).FirstOrDefault(); if (item != null) { dayCardSetting = item.T_HR_SHIFTDEFINE;//具体的排班明细 } } #endregion string strMonth = Convert.ToDateTime(request.StartDate).ToString("yyyy年MM月"); if (OTPeriodAttendSolution != null) { if (dayCardSetting != null) { #region " 休息时间段的设置,以最大四个班次计算 " DateTime notWorkTimeStart = DateTime.MinValue; DateTime notWorkTimeEnd = DateTime.MinValue; DateTime notWorkTimeStart1 = DateTime.MinValue; DateTime notWorkTimeEnd1 = DateTime.MinValue; DateTime notWorkTimeStart2 = DateTime.MinValue; DateTime notWorkTimeEnd2 = DateTime.MinValue; #endregion #region " 第一时段打卡起始时间 " if (!string.IsNullOrEmpty(dayCardSetting.FIRSTSTARTTIME) && !string.IsNullOrEmpty(dayCardSetting.FIRSTENDTIME)) { FirstCardStartDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.FIRSTSTARTTIME).ToString("HH:mm:ss")); FirstCardEndDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.FIRSTENDTIME).ToString("HH:mm:ss")); notWorkTimeStart = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.FIRSTENDTIME).ToString("HH:mm:ss")); sWorkArr.Add(FirstCardStartDate.ToString() + "|" + FirstCardEndDate.ToString()); response.FirstStartTime = Convert.ToDateTime(dayCardSetting.FIRSTSTARTTIME).ToString("HH:mm:ss"); response.FirstEndTime = Convert.ToDateTime(dayCardSetting.FIRSTENDTIME).ToString("HH:mm:ss"); } else { hasFirstSetting = 0; } #endregion #region " 第二时段打卡起始时间 " if (!string.IsNullOrEmpty(dayCardSetting.SECONDSTARTTIME) && !string.IsNullOrEmpty(dayCardSetting.SECONDENDTIME)) { SecondCardStartDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.SECONDSTARTTIME).ToString("HH:mm:ss")); SecondCardEndDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.SECONDENDTIME).ToString("HH:mm:ss")); notWorkTimeEnd = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.SECONDSTARTTIME).ToString("HH:mm:ss")); notWorkTimeStart1 = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.SECONDENDTIME).ToString("HH:mm:ss")); sWorkArr.Add(SecondCardStartDate.ToString() + "|" + SecondCardEndDate.ToString()); sNotWorkArr.Add(notWorkTimeStart.ToString() + "|" + notWorkTimeEnd.ToString()); response.SecondStartTime = Convert.ToDateTime(dayCardSetting.SECONDSTARTTIME).ToString("HH:mm:ss"); response.SecondEndTime = Convert.ToDateTime(dayCardSetting.SECONDENDTIME).ToString("HH:mm:ss"); } else { hasSecondSetting = 0; } #endregion #region " 第三时段打卡起始时间 " if (!string.IsNullOrEmpty(dayCardSetting.THIRDSTARTTIME) && !string.IsNullOrEmpty(dayCardSetting.THIRDENDTIME)) { ThirdCardStartDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.THIRDSTARTTIME).ToString("HH:mm:ss")); ThirdCardEndDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.THIRDENDTIME).ToString("HH:mm:ss")); notWorkTimeEnd1 = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.THIRDSTARTTIME).ToString("HH:mm:ss")); notWorkTimeStart2 = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.THIRDENDTIME).ToString("HH:mm:ss")); sWorkArr.Add(ThirdCardStartDate.ToString() + "|" + ThirdCardEndDate.ToString()); sNotWorkArr.Add(notWorkTimeStart1.ToString() + "|" + notWorkTimeEnd1.ToString()); response.ThirdStartTime = string.IsNullOrEmpty(dayCardSetting.THIRDSTARTTIME) ? string.Empty : Convert.ToDateTime(dayCardSetting.THIRDSTARTTIME).ToString("HH:mm:ss"); response.ThirdEndTime = string.IsNullOrEmpty(dayCardSetting.THIRDENDTIME) ? string.Empty : Convert.ToDateTime(dayCardSetting.THIRDENDTIME).ToString("HH:mm:ss"); } else { hasThirdSetting = 0; } #endregion #region " 第四时段打卡起始时间 " if (!string.IsNullOrEmpty(dayCardSetting.FOURTHSTARTTIME) && !string.IsNullOrEmpty(dayCardSetting.FOURTHENDTIME)) { FourthCardStartDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.FOURTHSTARTTIME).ToString("HH:mm:ss")); FourthCardEndDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.FOURTHENDTIME).ToString("HH:mm:ss")); notWorkTimeEnd2 = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.FOURTHSTARTTIME).ToString("HH:mm:ss")); sWorkArr.Add(FourthCardStartDate.ToString() + "|" + FourthCardEndDate.ToString()); sNotWorkArr.Add(notWorkTimeStart2.ToString() + "|" + notWorkTimeEnd2.ToString()); response.FourthStartTime = string.IsNullOrEmpty(dayCardSetting.FOURTHSTARTTIME) ? string.Empty : Convert.ToDateTime(dayCardSetting.FOURTHSTARTTIME).ToString("HH:mm:ss"); response.FourthEndTime = string.IsNullOrEmpty(dayCardSetting.FOURTHENDTIME) ? string.Empty : Convert.ToDateTime(dayCardSetting.FOURTHENDTIME).ToString("HH:mm:ss"); } else { hasFourthSetting = 0; } #endregion #region " 判断是否设置了至少两个的打卡时间段 " //为设置打卡时间段,至少设置两个打卡时间段 if (hasFirstSetting == 0) { response.Result = Enums.Result.NonFirstSetting.GetHashCode(); response.Month = strMonth; response.AttendSolution = OTPeriodAttendSolution.ATTENDANCESOLUTIONNAME; response.WorkPerDay = OTPeriodAttendSolution.WORKTIMEPERDAY.HasValue ? OTPeriodAttendSolution.WORKTIMEPERDAY.Value : 0; response.Message = Constants.NonFirstSetting; return(response); } if (hasSecondSetting == 0) { response.Result = Enums.Result.NonSecondSetting.GetHashCode(); response.Month = strMonth; response.AttendSolution = OTPeriodAttendSolution.ATTENDANCESOLUTIONNAME; response.WorkPerDay = OTPeriodAttendSolution.WORKTIMEPERDAY.HasValue ? OTPeriodAttendSolution.WORKTIMEPERDAY.Value : 0; response.Message = Constants.NonSecondSetting; return(response); } #endregion #region " 检查加班时间是否在公共假期,或是工作日,或是三八,或是五四 " decimal dWorkMode = OTPeriodAttendSolution.WORKMODE.Value; int iWorkMode = 0; int.TryParse(dWorkMode.ToString(), out iWorkMode);//获取工作制(工作天数/周) List <int> iWorkDays = new List <int>(); SMT.HRM.BLL.Utility.GetWorkDays(iWorkMode, ref iWorkDays); OutPlanDaysBLL bllOutPlanDays = new OutPlanDaysBLL(); IQueryable <T_HR_OUTPLANDAYS> entOutPlanDays = bllOutPlanDays.GetOutPlanDaysRdListByEmployeeID(request.EmployeeID); string strVacDayType = (Convert.ToInt32(SMT.HRM.BLL.Common.OutPlanDaysType.Vacation) + 1).ToString(); string strWorkDayType = (Convert.ToInt32(SMT.HRM.BLL.Common.OutPlanDaysType.WorkDay) + 1).ToString(); //获取公共假期设置 DateTime vacTempStartDate = Convert.ToDateTime(request.StartDate); DateTime vacTempEndDate = Convert.ToDateTime(request.EndDate); //加班只可能在一天内 IQueryable <T_HR_OUTPLANDAYS> entVacDays = entOutPlanDays.Where(s => s.DAYTYPE == strVacDayType && vacTempStartDate >= s.STARTDATE && vacTempEndDate <= s.ENDDATE); //获取工作日设置 DateTime workTempStartDate = Convert.ToDateTime(request.StartDate); DateTime workTempEndDate = Convert.ToDateTime(request.EndDate); //加班只可能在一天内 IQueryable <T_HR_OUTPLANDAYS> entWorkDays = entOutPlanDays.Where(s => s.DAYTYPE == strWorkDayType && workTempStartDate >= s.STARTDATE && workTempEndDate <= s.ENDDATE); //当前星期几,是否要工作 //Sunday = 0, Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5, Saturday = 6. int iDayOfWeek = Convert.ToDateTime(request.StartDate).DayOfWeek.GetHashCode(); bool iDayCount = iWorkDays.Contains(iDayOfWeek); DateTime WorkDayEndDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.SECONDENDTIME).ToString("HH:mm:ss")); //工作日加班,要在第二时间段以后 if (dayCardSetting != null) { if (hasThirdSetting == 1) { WorkDayEndDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.THIRDENDTIME).ToString("HH:mm:ss")); } if (hasFourthSetting == 1) { WorkDayEndDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.FOURTHENDTIME).ToString("HH:mm:ss")); } } #region " 不是假期 " if (entVacDays.Count() == 0) { //也不是设置的工作日, if (entWorkDays.Count() == 0) { //并且在上班时间列表中 if (iDayCount) { //工作日加班,要在第二时间段以后 if (dayCardSetting != null) { #region 梁杰文 平时加班,加班起始时间要在工作日结束之后 //改判断逻辑dtEndDate <= WorkDayEndDate为WorkDayEndDate>dtStartDate #endregion if (WorkDayEndDate > dtStartDate) { #region " 在上班时间列表中,这天要上班,不算加班 " //这天要上班,不算加班 response.Result = Enums.Result.IsWorkDay.GetHashCode(); response.Message = Constants.IsWorkDay;//是工作日,不算加班 return(response); #endregion } } } } else { //工作日加班,要在第二时间段以后 if (dayCardSetting != null) { #region 梁杰文 平时加班,加班起始时间要在工作日结束之后 //改判断逻辑dtEndDate <= WorkDayEndDate为WorkDayEndDate>dtStartDate #endregion if (WorkDayEndDate > dtStartDate) { #region " 设置为工作日,这天要上班,不算加班 " //这天要上班,不算加班 response.Result = Enums.Result.IsWorkDay.GetHashCode(); response.Message = Constants.IsWorkDay;//是工作日,不算加班 return(response); #endregion } } } } else { //加班时间在假期设置中,但只是半天的设置 foreach (var vac in entVacDays) { #region " 半天公共假期,三八妇女节,青年节 " if (vac.ISHALFDAY == "1") { if (vac.PEROID == "1")//下午 { if (dayCardSetting != null) { DateTime HalfMorningStartDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.FIRSTSTARTTIME).ToString("HH:mm:ss")); DateTime HalfMorningEndDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.FIRSTENDTIME).ToString("HH:mm:ss")); //四个时间中,上午时间的开始与结束 if (hasThirdSetting == 1 && hasFourthSetting == 1) { HalfMorningEndDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.SECONDENDTIME).ToString("HH:mm:ss")); } //如果填写的加班时间段在上午,则不算加班 if (dtEndDate <= HalfMorningEndDate) { response.Result = Enums.Result.IsHalfDayMorningWork.GetHashCode(); response.Month = strMonth; response.AttendSolution = OTPeriodAttendSolution.ATTENDANCESOLUTIONNAME; response.WorkPerDay = OTPeriodAttendSolution.WORKTIMEPERDAY.HasValue ? OTPeriodAttendSolution.WORKTIMEPERDAY.Value : 0; response.Message = Constants.IsHalfDayMorningWork; return(response); } } } else//上午 { if (dayCardSetting != null) { DateTime HalfNoonStartDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.SECONDSTARTTIME).ToString("HH:mm:ss")); DateTime HalfNoonEndDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.SECONDENDTIME).ToString("HH:mm:ss")); //四个时间中,下午时间的开始与结束 if (hasThirdSetting == 1 && hasFourthSetting == 1) { HalfNoonStartDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.THIRDSTARTTIME).ToString("HH:mm:ss")); HalfNoonEndDate = Convert.ToDateTime(request.StartDate + " " + Convert.ToDateTime(dayCardSetting.FOURTHENDTIME).ToString("HH:mm:ss")); } //如果填写的加班时间段在下午,则不算加班 if (dtStartDate >= HalfNoonStartDate && dtStartDate <= HalfNoonEndDate) { response.Result = Enums.Result.IsHalfDayNoonWork.GetHashCode(); response.Month = strMonth; response.AttendSolution = OTPeriodAttendSolution.ATTENDANCESOLUTIONNAME; response.WorkPerDay = OTPeriodAttendSolution.WORKTIMEPERDAY.HasValue ? OTPeriodAttendSolution.WORKTIMEPERDAY.Value : 0; response.Message = Constants.IsHalfDayNoonWork; return(response); } } } } #endregion } } #endregion #endregion //填写的加班时段都在4个设置的上班时间段里面,则直接用结束时间减去开始时间 if ( (dtStartDate >= FirstCardStartDate && dtStartDate <= FirstCardEndDate && dtEndDate >= FirstCardStartDate && dtEndDate <= FirstCardEndDate) || (dtStartDate >= SecondCardStartDate && dtStartDate <= SecondCardEndDate && dtEndDate >= SecondCardStartDate && dtEndDate <= SecondCardEndDate) || (dtStartDate >= ThirdCardStartDate && dtStartDate <= ThirdCardEndDate && dtEndDate >= ThirdCardStartDate && dtEndDate <= ThirdCardEndDate) || (dtStartDate >= FourthCardStartDate && dtStartDate <= FourthCardEndDate && dtEndDate >= FourthCardStartDate && dtEndDate <= FourthCardEndDate) ) { totalHours = dtEndDate.Subtract(dtStartDate).TotalHours; } else { #region " 计算加班时间 " //早7:50打开,将计算加班的有效开始时间设置为8:30,也就是dtCardStartDate //23:00下班,假定四个工作时间段 if (dtStartDate < FirstCardStartDate) { dtTempStartDate = FirstCardStartDate; response.StartTime = dtTempStartDate.ToString("HH:mm:ss"); } #region " 找出开始计算加班的时间点 " DateTime tempOTDate = new DateTime(); foreach (string str in sWorkArr) { string[] s = str.Split('|'); DateTime WorkStartDate = Convert.ToDateTime(s[0]); DateTime WorkEndDate = Convert.ToDateTime(s[1]); //如果开始时间在工作时间范围内,那就从开始时间算加班 if (dtTempStartDate >= WorkStartDate && dtTempStartDate <= WorkEndDate) { tempOTDate = dtTempStartDate; } //如果开始时间大于工作时间段的结束时间,则属于休息时间段的时间点 //找出里他最近的上班时间点作为加班开始时间 if (dtTempStartDate > WorkEndDate) { foreach (string str1 in sNotWorkArr) { string[] sn = str1.Split('|'); DateTime notWorkStartDate = Convert.ToDateTime(sn[0]); DateTime notWorkEndDate = Convert.ToDateTime(sn[1]); //加班开始时间在休息时间点内,则加班的开始时间从休息时间的结束点开始 if (dtTempStartDate >= notWorkStartDate && dtTempStartDate <= notWorkEndDate) { tempOTDate = notWorkEndDate; } else { //不在所有的休息时间段内,则说明加班是在 //一天正常的上班时间段以外进行 tempOTDate = dtTempStartDate; } } } } #endregion #region " 设置具体的加班是时间段 " for (int i = 0; i < sWorkArr.Count(); i++) { string[] ss = sWorkArr[i].Split('|'); DateTime WorkStartDate = Convert.ToDateTime(ss[0]); DateTime WorkEndDate = Convert.ToDateTime(ss[1]); //工作时间段的开始时间大于加班开始时间 if (WorkStartDate >= tempOTDate) { //加班结束时间大于工作时间段的结束时间 //则说明加班时间包含这段工作时间段,计算完整的加班时间段 if (dtTempEndDate >= WorkEndDate) { if (sNotWorkArr.Count() == 0) { tempWorkArr.Add(WorkStartDate.ToString() + "|" + dtTempEndDate.ToString()); } foreach (string str3 in sNotWorkArr) { string[] sn = str3.Split('|'); DateTime notWorkStartDate = Convert.ToDateTime(sn[0]); DateTime notWorkEndDate = Convert.ToDateTime(sn[1]); if (dtTempEndDate >= notWorkStartDate && dtTempEndDate <= notWorkEndDate) { tempWorkArr.Add(WorkStartDate.ToString() + "|" + WorkEndDate.ToString()); } else if (dtTempEndDate >= WorkEndDate) { if (i == sWorkArr.Count() - 1) { WorkEndDate = dtTempEndDate; } tempWorkArr.Add(WorkStartDate.ToString() + "|" + WorkEndDate.ToString()); sNotWorkArr.Remove(str3); break; } else { tempWorkArr.Add(WorkStartDate.ToString() + "|" + notWorkStartDate.ToString()); sNotWorkArr.Remove(str3); break; } } } else { if (sNotWorkArr.Count() == 0) { tempWorkArr.Add(WorkStartDate.ToString() + "|" + dtTempEndDate.ToString()); } foreach (string str3 in sNotWorkArr) { string[] sn = str3.Split('|'); DateTime notWorkStartDate = Convert.ToDateTime(sn[0]); DateTime notWorkEndDate = Convert.ToDateTime(sn[1]); if (dtTempEndDate >= notWorkStartDate && dtTempEndDate <= notWorkEndDate) { } else if (dtTempEndDate >= WorkEndDate) { tempWorkArr.Add(WorkStartDate.ToString() + "|" + WorkEndDate.ToString()); sNotWorkArr.Remove(str3); break; } else { tempWorkArr.Add(WorkStartDate.ToString() + "|" + dtTempEndDate.ToString()); sNotWorkArr.Remove(str3); break; } } } } else { if (i == sWorkArr.Count() - 1) { WorkEndDate = dtTempEndDate; } tempWorkArr.Add(tempOTDate.ToString() + "|" + WorkEndDate.ToString()); } } #endregion #region " 计算加班时长 " tempWorkArr = tempWorkArr.Distinct().ToList(); foreach (string str4 in tempWorkArr) { string[] sss = str4.Split('|'); DateTime WorkStartDate = Convert.ToDateTime(sss[0]); DateTime WorkEndDate = Convert.ToDateTime(sss[1]); if (WorkStartDate <= WorkEndDate) { totalHours += Math.Round(WorkEndDate.Subtract(WorkStartDate).TotalHours, 1); } } #endregion #endregion } } response.Result = Enums.Result.Success.GetHashCode(); response.OTHours = totalHours; response.OTDays = Math.Round(totalHours / Convert.ToDouble(OTPeriodAttendSolution.WORKTIMEPERDAY), 2); response.Month = strMonth; response.AttendSolution = OTPeriodAttendSolution.ATTENDANCESOLUTIONNAME; response.WorkPerDay = OTPeriodAttendSolution.WORKTIMEPERDAY.HasValue ? OTPeriodAttendSolution.WORKTIMEPERDAY.Value : 0; response.Message = ""; return(response); } response.Result = Enums.Result.NonAttendenceSolution.GetHashCode(); response.Message = Constants.NonAttendenceSolution; response.OTHours = 0; response.OTDays = 0; response.Month = strMonth; response.AttendSolution = string.Format("未找到{0}对应的考勤方案", strMonth); response.WorkPerDay = 0; return(response); }
/// <summary> /// 根据选择的循环周期及默认班次方案,生成排班明细记录(临时) /// </summary> private void MakeDetailItemSource() { if (cbxkSchedulingCircleType.SelectedItem == null) { return; } ObservableCollection<T_HR_SCHEDULINGTEMPLATEDETAIL> TemplateDetailList = new ObservableCollection<T_HR_SCHEDULINGTEMPLATEDETAIL>(); T_HR_SHIFTDEFINE entShiftDefine = new T_HR_SHIFTDEFINE(); if (lkDefaultShiftName.DataContext != null) { entShiftDefine = lkDefaultShiftName.DataContext as T_HR_SHIFTDEFINE; } T_SYS_DICTIONARY entDic = cbxkSchedulingCircleType.SelectedItem as T_SYS_DICTIONARY; if (entDic.DICTIONARYVALUE.Value.ToString() == (Convert.ToInt32(SchedulingCircleType.Month) + 1).ToString()) { int iMonthDays = 31; for (int i = 0; i < iMonthDays; i++) { T_HR_SCHEDULINGTEMPLATEDETAIL SchedulingTemplateDetail = new T_HR_SCHEDULINGTEMPLATEDETAIL(); SchedulingTemplateDetail.TEMPLATEDETAILID = System.Guid.NewGuid().ToString().ToUpper(); SchedulingTemplateDetail.T_HR_SCHEDULINGTEMPLATEMASTER = SchedulingTemplateMaster; SchedulingTemplateDetail.SCHEDULINGDATE = (i + 1).ToString(); SchedulingTemplateDetail.SCHEDULINGINDEX = i + 1; SchedulingTemplateDetail.T_HR_SHIFTDEFINE = entShiftDefine; SchedulingTemplateDetail.REMARK = string.Empty; //2010年2月11日, 11:37:35,目前暂未实现登录部分,人员相关数据为假定值 SchedulingTemplateDetail.CREATEDATE = DateTime.Now; SchedulingTemplateDetail.CREATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; SchedulingTemplateDetail.UPDATEDATE = System.DateTime.Now; SchedulingTemplateDetail.UPDATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; TemplateDetailList.Add(SchedulingTemplateDetail); } } else if (entDic.DICTIONARYVALUE.Value.ToString() == (Convert.ToInt32(SchedulingCircleType.Week) + 1).ToString()) { int iWeekDays = 7; for (int j = 0; j < iWeekDays; j++) { T_HR_SCHEDULINGTEMPLATEDETAIL SchedulingTemplateDetail = new T_HR_SCHEDULINGTEMPLATEDETAIL(); SchedulingTemplateDetail.TEMPLATEDETAILID = System.Guid.NewGuid().ToString().ToUpper(); SchedulingTemplateDetail.SCHEDULINGDATE = (j + 1).ToString(); SchedulingTemplateDetail.SCHEDULINGINDEX = j + 1; SchedulingTemplateDetail.T_HR_SCHEDULINGTEMPLATEMASTER = SchedulingTemplateMaster; SchedulingTemplateDetail.T_HR_SHIFTDEFINE = entShiftDefine; SchedulingTemplateDetail.REMARK = string.Empty; //2010年2月11日, 11:37:35,目前暂未实现登录部分,人员相关数据为假定值 SchedulingTemplateDetail.CREATEDATE = DateTime.Now; SchedulingTemplateDetail.CREATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; SchedulingTemplateDetail.UPDATEDATE = System.DateTime.Now; SchedulingTemplateDetail.UPDATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; TemplateDetailList.Add(SchedulingTemplateDetail); } } dgTemplateDetails.ItemsSource = TemplateDetailList; }
/// <summary> /// 根据选择的循环周期及默认班次方案,生成排班明细记录(临时) /// </summary> private void MakeDetailItemSource() { if (cbxkSchedulingCircleType.SelectedItem == null) { return; } ObservableCollection <T_HR_SCHEDULINGTEMPLATEDETAIL> TemplateDetailList = new ObservableCollection <T_HR_SCHEDULINGTEMPLATEDETAIL>(); T_HR_SHIFTDEFINE entShiftDefine = new T_HR_SHIFTDEFINE(); if (lkDefaultShiftName.DataContext != null) { entShiftDefine = lkDefaultShiftName.DataContext as T_HR_SHIFTDEFINE; } T_SYS_DICTIONARY entDic = cbxkSchedulingCircleType.SelectedItem as T_SYS_DICTIONARY; if (entDic.DICTIONARYVALUE.Value.ToString() == (Convert.ToInt32(SchedulingCircleType.Month) + 1).ToString()) { int iMonthDays = 31; for (int i = 0; i < iMonthDays; i++) { T_HR_SCHEDULINGTEMPLATEDETAIL SchedulingTemplateDetail = new T_HR_SCHEDULINGTEMPLATEDETAIL(); SchedulingTemplateDetail.TEMPLATEDETAILID = System.Guid.NewGuid().ToString().ToUpper(); SchedulingTemplateDetail.T_HR_SCHEDULINGTEMPLATEMASTER = SchedulingTemplateMaster; SchedulingTemplateDetail.SCHEDULINGDATE = (i + 1).ToString(); SchedulingTemplateDetail.SCHEDULINGINDEX = i + 1; SchedulingTemplateDetail.T_HR_SHIFTDEFINE = entShiftDefine; SchedulingTemplateDetail.REMARK = string.Empty; //2010年2月11日, 11:37:35,目前暂未实现登录部分,人员相关数据为假定值 SchedulingTemplateDetail.CREATEDATE = DateTime.Now; SchedulingTemplateDetail.CREATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; SchedulingTemplateDetail.UPDATEDATE = System.DateTime.Now; SchedulingTemplateDetail.UPDATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; TemplateDetailList.Add(SchedulingTemplateDetail); } } else if (entDic.DICTIONARYVALUE.Value.ToString() == (Convert.ToInt32(SchedulingCircleType.Week) + 1).ToString()) { int iWeekDays = 7; for (int j = 0; j < iWeekDays; j++) { T_HR_SCHEDULINGTEMPLATEDETAIL SchedulingTemplateDetail = new T_HR_SCHEDULINGTEMPLATEDETAIL(); SchedulingTemplateDetail.TEMPLATEDETAILID = System.Guid.NewGuid().ToString().ToUpper(); SchedulingTemplateDetail.SCHEDULINGDATE = (j + 1).ToString(); SchedulingTemplateDetail.SCHEDULINGINDEX = j + 1; SchedulingTemplateDetail.T_HR_SCHEDULINGTEMPLATEMASTER = SchedulingTemplateMaster; SchedulingTemplateDetail.T_HR_SHIFTDEFINE = entShiftDefine; SchedulingTemplateDetail.REMARK = string.Empty; //2010年2月11日, 11:37:35,目前暂未实现登录部分,人员相关数据为假定值 SchedulingTemplateDetail.CREATEDATE = DateTime.Now; SchedulingTemplateDetail.CREATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; SchedulingTemplateDetail.UPDATEDATE = System.DateTime.Now; SchedulingTemplateDetail.UPDATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; TemplateDetailList.Add(SchedulingTemplateDetail); } } dgTemplateDetails.ItemsSource = TemplateDetailList; }
//private void CalculateNonWholeDayOverTimeHoursNew /// <summary> /// 计算非全天外出确认的时长(节假日外出确认) /// </summary> /// <param name="dWorkTimePerDay">每日工作时长</param> /// <param name="entVacDays">公休假记录</param> /// <param name="entWorkDays">工作周记录</param> /// <param name="iWorkDays">工作日对应星期类型集合</param> /// <param name="dtOTStart">外出确认起始时间</param> /// <param name="dtOTEnd">外出确认截止时间</param> /// <param name="entTemplateMaster">作息方案</param> /// <param name="dTotalOverTimeHours">外出确认累计时长</param> private void CalculateNonWholeDayOverTimeHours(decimal dWorkTimePerDay, IQueryable <T_HR_OUTPLANDAYS> entWorkDays, IQueryable <T_HR_OUTPLANDAYS> entVacDays, List <int> iWorkDays, DateTime dtOTStart, DateTime dtOTEnd, IQueryable <T_HR_SCHEDULINGTEMPLATEDETAIL> entTemplateDetails, T_HR_SCHEDULINGTEMPLATEMASTER entTemplateMaster, ref decimal dOverTimeHours, ref string strMsg) { bool bNoCalculate = false; //True,计算出勤日外出确认;False,计算节假日外出确认 DateTime dtStartDate = DateTime.Parse(dtOTStart.ToString("yyyy-MM") + "-1"); DateTime dtCurOTDate = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd")); if (entWorkDays.Count() > 0) { foreach (T_HR_OUTPLANDAYS item_Work in entWorkDays) { if (item_Work.STARTDATE.Value <= dtCurOTDate && item_Work.ENDDATE >= dtCurOTDate) { bNoCalculate = true; break; } } } if (bNoCalculate) { strMsg = CalculateNonWholeDayOverTimeHoursOnWorkDay(dWorkTimePerDay, dtOTStart, dtOTEnd, entTemplateDetails, entTemplateMaster, ref dOverTimeHours); return; } if (iWorkDays.Contains(Convert.ToInt32(dtCurOTDate.DayOfWeek))) { if (entVacDays.Count() > 0) { bNoCalculate = true; foreach (T_HR_OUTPLANDAYS item_Work in entVacDays) { //如果当前外出确认时间在节假日时间 if (item_Work.STARTDATE.Value <= dtCurOTDate && item_Work.ENDDATE >= dtCurOTDate) { //计算节假日外出确认 bNoCalculate = false; break; } } } if (bNoCalculate) { strMsg = CalculateNonWholeDayOverTimeHoursOnWorkDay(dWorkTimePerDay, dtOTStart, dtOTEnd, entTemplateDetails, entTemplateMaster, ref dOverTimeHours); return; } } DateTime dtCheckDate = new DateTime(); DateTime dtShiftEndDate = new DateTime(); decimal dTempOverTimeHours = 0; int iCircleDay = 0; if (entTemplateMaster.SCHEDULINGCIRCLETYPE == (Convert.ToInt32(Common.SchedulingCircleType.Month) + 1).ToString()) { iCircleDay = 31; } else if (entTemplateMaster.SCHEDULINGCIRCLETYPE == (Convert.ToInt32(Common.SchedulingCircleType.Week) + 1).ToString()) { iCircleDay = 7; } for (int j = 0; j < iCircleDay; j++) { bool bIsOnDuty = false; string strSchedulingDate = (j + 1).ToString(); DateTime dtCurDate = new DateTime(); dtCurDate = dtStartDate.AddDays(j); if (dtCurDate != dtCurOTDate) { continue; } T_HR_SCHEDULINGTEMPLATEDETAIL item = entTemplateDetails.Where(c => c.SCHEDULINGDATE == strSchedulingDate).FirstOrDefault(); T_HR_SHIFTDEFINE entShiftDefine = item.T_HR_SHIFTDEFINE; //根据考勤方案中的上午上班时间计算上班外出确认时长 if (entShiftDefine.FIRSTSTARTTIME != null && entShiftDefine.FIRSTENDTIME != null) { //上午8:30 DateTime dtFirstStart = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.FIRSTSTARTTIME).ToString("HH:mm")); //上午12:00 DateTime dtFirstEnd = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.FIRSTENDTIME).ToString("HH:mm")); //如果外出确认结束时间比上午下班时间小 if (dtFirstEnd >= dtOTEnd) { //外出确认结束时间-外出确认开始时间 TimeSpan tsFirst = dtOTEnd.Subtract(dtOTStart); dTempOverTimeHours = tsFirst.Hours * 60 + tsFirst.Minutes; } else { if (dtFirstEnd > dtOTStart) { TimeSpan tsFirst = dtFirstEnd.Subtract(dtOTStart); dTempOverTimeHours = tsFirst.Hours * 60 + tsFirst.Minutes; dtShiftEndDate = dtFirstEnd; // bIsOnDuty = true; } } } if (entShiftDefine.SECONDSTARTTIME != null && entShiftDefine.SECONDENDTIME != null) { DateTime dtSecondStart = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.SECONDSTARTTIME).ToString("HH:mm")); DateTime dtSecondEnd = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.SECONDENDTIME).ToString("HH:mm")); //如果外出确认结束时间小于二次打卡开始时间,就不往下走 if (dtOTEnd <= dtSecondStart) { break; } //外出确认结束时间小于等于二次打卡结束时间 if (dtOTEnd <= dtSecondEnd) { //外出确认开始时间小于等于二次打卡开始时间 if (dtOTStart <= dtSecondStart) { TimeSpan tsSecond = dtOTEnd.Subtract(dtSecondStart); dTempOverTimeHours += tsSecond.Hours * 60 + tsSecond.Minutes; } //外出确认开始时间大于二次打卡开始时间 else if (dtOTStart > dtSecondStart) { TimeSpan tsSecond = dtOTEnd.Subtract(dtOTStart); dTempOverTimeHours += tsSecond.Hours * 60 + tsSecond.Minutes; } } //外出确认结束时间大于二次打卡结束时间 else if (dtOTEnd > dtSecondEnd) { //外出确认开始时间要小于二次打卡开始时间 if (dtOTStart <= dtSecondStart) { TimeSpan tsSecond = dtSecondEnd.Subtract(dtSecondStart); dTempOverTimeHours += tsSecond.Hours * 60 + tsSecond.Minutes; } //外出确认开始时间大于二次打卡开始时间 else if (dtOTStart > dtSecondStart && dtOTStart <= dtSecondEnd) { TimeSpan tsSecond = dtSecondEnd.Subtract(dtOTStart); dTempOverTimeHours += tsSecond.Hours * 60 + tsSecond.Minutes; } } dtShiftEndDate = dtSecondEnd; } if (entShiftDefine.THIRDSTARTTIME != null && entShiftDefine.THIRDENDTIME != null) { DateTime dtThirdStart = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.THIRDSTARTTIME).ToString("HH:mm")); DateTime dtThirdEnd = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.THIRDENDTIME).ToString("HH:mm")); //如果外出确认结束时间小于三次打卡开始时间,就不往下走 if (dtOTEnd <= dtThirdStart) { break; } //外出确认时间小于等于三次打卡结束时间 if (dtOTEnd <= dtThirdEnd) { //外出确认开始时间小于等于三次打卡开始时间 if (dtOTStart <= dtThirdStart) { TimeSpan tsSecond = dtOTEnd.Subtract(dtThirdStart); dTempOverTimeHours += tsSecond.Hours * 60 + tsSecond.Minutes; } //外出确认开始时间大于三次打卡开始时间 else if (dtOTStart > dtThirdStart) { TimeSpan tsSecond = dtOTEnd.Subtract(dtOTStart); dTempOverTimeHours += tsSecond.Hours * 60 + tsSecond.Minutes; } } //外出确认时间大于三次打卡时间 else if (dtOTEnd > dtThirdEnd) { //外出确认开始时间要小于三次打卡开始时间 if (dtOTStart <= dtThirdStart) { TimeSpan tsSecond = dtThirdEnd.Subtract(dtThirdStart); dTempOverTimeHours += tsSecond.Hours * 60 + tsSecond.Minutes; } //外出确认开始大于三次打卡开始时间 else if (dtOTStart > dtThirdStart) { TimeSpan tsSecond = dtThirdEnd.Subtract(dtOTStart); dTempOverTimeHours += tsSecond.Hours * 60 + tsSecond.Minutes; } } dtShiftEndDate = dtThirdEnd; } if (entShiftDefine.FOURTHSTARTTIME != null && entShiftDefine.FOURTHENDTIME != null) { DateTime dtFourthStart = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.FOURTHSTARTTIME).ToString("HH:mm")); DateTime dtFourthEnd = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.FOURTHENDTIME).ToString("HH:mm")); //如果外出确认结束时间小于四次打卡开始时间,就不往下走 if (dtOTEnd <= dtFourthStart) { break; } //外出确认时间小于四次打卡结束时间 if (dtOTEnd <= dtFourthEnd) { //外出确认开始时间小于等于三次打卡开始时间 if (dtOTStart <= dtFourthStart) { TimeSpan tsSecond = dtOTEnd.Subtract(dtFourthStart); dTempOverTimeHours += tsSecond.Hours * 60 + tsSecond.Minutes; } //外出确认开始时间大于三次打卡开始时间 else if (dtOTStart > dtFourthStart) { TimeSpan tsSecond = dtOTEnd.Subtract(dtOTStart); dTempOverTimeHours += tsSecond.Hours * 60 + tsSecond.Minutes; } } //外出确认时间大于四次打卡时间 else if (dtOTEnd > dtFourthEnd) { //外出确认开始时间要小于四次打卡开始时间 if (dtOTStart <= dtFourthStart) { TimeSpan tsSecond = dtFourthEnd.Subtract(dtFourthStart); dTempOverTimeHours += tsSecond.Hours * 60 + tsSecond.Minutes; } //外出确认开始大于四次打卡开始时间 else if (dtOTStart > dtFourthStart) { TimeSpan tsSecond = dtFourthEnd.Subtract(dtOTStart); dTempOverTimeHours += tsSecond.Hours * 60 + tsSecond.Minutes; } } dtShiftEndDate = dtFourthEnd; } //外出确认结束时间大于最后一次打卡时间 if (dtOTEnd > dtShiftEndDate) { //外出确认开始时间小于等打卡结束时间 if (dtOTStart <= dtShiftEndDate) { TimeSpan tsTemp = dtOTEnd.Subtract(dtShiftEndDate); dTempOverTimeHours += tsTemp.Hours * 60 + tsTemp.Minutes; } //外出确认开始时间大于打卡结束时间 else if (dtOTStart > dtShiftEndDate) { TimeSpan tsTemp = dtOTEnd.Subtract(dtOTStart); dTempOverTimeHours += tsTemp.Hours * 60 + tsTemp.Minutes; } } } if (dTempOverTimeHours != 0) { dTempOverTimeHours = decimal.Round((dTempOverTimeHours) / 60, 1); //按自然时长算,以前是最多为一天工作时长 //if (dTempOverTimeHours > dWorkTimePerDay) //{ // dTempOverTimeHours = dWorkTimePerDay; //} dOverTimeHours += dTempOverTimeHours; } }
/// <summary> /// 计算非全天外出确认的时长(出勤日外出确认) /// </summary> /// <param name="dWorkTimePerDay"></param> /// <param name="dtOTStart"></param> /// <param name="dtOTEnd"></param> /// <param name="entTemplateDetails"></param> /// <param name="entTemplateMaster"></param> /// <param name="dOverTimeHours"></param> private string CalculateNonWholeDayOverTimeHoursOnWorkDay(decimal dWorkTimePerDay, DateTime dtOTStart, DateTime dtOTEnd, IQueryable <T_HR_SCHEDULINGTEMPLATEDETAIL> entTemplateDetails, T_HR_SCHEDULINGTEMPLATEMASTER entTemplateMaster, ref decimal dOverTimeHours) { DateTime dtStartDate = DateTime.Parse(dtOTStart.ToString("yyyy-MM") + "-1"); DateTime dtCurOTDate = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd")); string strRes = string.Empty; decimal dTempOverTimeHours = 0; int iCircleDay = 0; if (entTemplateMaster.SCHEDULINGCIRCLETYPE == (Convert.ToInt32(Common.SchedulingCircleType.Month) + 1).ToString()) { iCircleDay = 31; } else if (entTemplateMaster.SCHEDULINGCIRCLETYPE == (Convert.ToInt32(Common.SchedulingCircleType.Week) + 1).ToString()) { iCircleDay = 7; } for (int j = 0; j < iCircleDay; j++) { bool bIsOnduty = false; string strSchedulingDate = (j + 1).ToString(); DateTime dtCurDate = new DateTime(); dtCurDate = dtStartDate.AddDays(j); if (dtCurDate != dtCurOTDate) { continue; } T_HR_SCHEDULINGTEMPLATEDETAIL item = entTemplateDetails.Where(c => c.SCHEDULINGDATE == strSchedulingDate).FirstOrDefault(); T_HR_SHIFTDEFINE entShiftDefine = item.T_HR_SHIFTDEFINE; if (entShiftDefine.FIRSTSTARTTIME != null && entShiftDefine.FIRSTENDTIME != null) { DateTime dtFirstStart = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.FIRSTSTARTTIME).ToString("HH:mm")); DateTime dtFirstEnd = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.FIRSTENDTIME).ToString("HH:mm")); if (dtFirstStart >= dtOTEnd) { TimeSpan tsTemp = dtOTEnd.Subtract(dtOTStart); dTempOverTimeHours += tsTemp.Hours * 60 + tsTemp.Minutes; break; } else { if (dtFirstEnd >= dtOTStart) { bIsOnduty = true; } } } if (bIsOnduty) { strRes = "{OVERTIMEINWORKDAY}";; break; } if (entShiftDefine.SECONDSTARTTIME != null && entShiftDefine.SECONDENDTIME != null) { DateTime dtSecondStart = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.SECONDSTARTTIME).ToString("HH:mm")); DateTime dtSecondEnd = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.SECONDENDTIME).ToString("HH:mm")); if (dtSecondEnd >= dtOTStart) { bIsOnduty = true; } } if (bIsOnduty) { strRes = "{OVERTIMEINWORKDAY}";; break; } if (entShiftDefine.THIRDSTARTTIME != null && entShiftDefine.THIRDENDTIME != null) { DateTime dtThirdStart = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.THIRDSTARTTIME).ToString("HH:mm")); DateTime dtThirdEnd = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.THIRDENDTIME).ToString("HH:mm")); if (dtThirdEnd >= dtOTStart) { bIsOnduty = true; } } if (bIsOnduty) { strRes = "{OVERTIMEINWORKDAY}";; break; } if (entShiftDefine.FOURTHSTARTTIME != null && entShiftDefine.FOURTHENDTIME != null) { DateTime dtFourthStart = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.FOURTHSTARTTIME).ToString("HH:mm")); DateTime dtFourthEnd = DateTime.Parse(dtOTStart.ToString("yyyy-MM-dd") + " " + DateTime.Parse(entShiftDefine.FOURTHENDTIME).ToString("HH:mm")); if (dtFourthEnd >= dtOTStart) { bIsOnduty = true; } } if (bIsOnduty) { strRes = "{OVERTIMEINWORKDAY}";; break; } TimeSpan tsCur = dtOTEnd.Subtract(dtOTStart); dTempOverTimeHours += tsCur.Hours * 60 + tsCur.Minutes; } if (dTempOverTimeHours != 0) { dTempOverTimeHours = decimal.Round((dTempOverTimeHours) / 60, 1); //按自然时长算,以前是最多为一天工作时长 //if (dTempOverTimeHours > dWorkTimePerDay) //{ // dTempOverTimeHours = dWorkTimePerDay; //} dOverTimeHours += dTempOverTimeHours; } return(strRes); }
/// <summary> /// 检测并清除指定员工指定时间段内考勤异常记录并重置考勤初始化记录状态 /// </summary> /// <param name="EMPLOYEEID">员工id</param> /// <param name="datLevestart">开始时间长日期格式2013/2/16 8:30:00</param> /// <param name="dtLeveEnd">结束时间长日期格式2013/2/16 8:30:00</param> public void DealEmployeeAbnormRecord(string EMPLOYEEID, DateTime datLevestart, DateTime dtLeveEnd, string attState) { var emp = (from em in dal.GetObjects <T_HR_EMPLOYEE>() where em.EMPLOYEEID == EMPLOYEEID select em.EMPLOYEEENAME).FirstOrDefault(); string dealType = string.Empty; if (attState == (Convert.ToInt32(Common.AttendanceState.Leave) + 1).ToString()) { dealType = "员工:" + emp + " 请假消除异常," + "时间区间:" + datLevestart.ToString("yyyy-MM-dd HH:mm:ss") + "----" + dtLeveEnd.ToString("yyyy-MM-dd HH:mm:ss"); } if (attState == (Convert.ToInt32(Common.AttendanceState.Travel) + 1).ToString()) { dealType = "员工:" + emp + " 出差消除异常," + "时间区间:" + datLevestart.ToString("yyyy-MM-dd HH:mm:ss") + "----" + dtLeveEnd.ToString("yyyy-MM-dd HH:mm:ss"); } if (attState == (Convert.ToInt32(Common.AttendanceState.OutApply) + 1).ToString()) { dealType = "员工:" + emp + " 外出申请消除异常," + "时间区间:" + datLevestart.ToString("yyyy-MM-dd HH:mm:ss") + "----" + dtLeveEnd.ToString("yyyy-MM-dd HH:mm:ss"); } if (attState == (Convert.ToInt32(Common.AttendanceState.OutApplyConfirm) + 1).ToString()) { dealType = "员工:" + emp + " 外出确认消除异常," + "时间区间:" + datLevestart.ToString("yyyy-MM-dd HH:mm:ss") + "----" + dtLeveEnd.ToString("yyyy-MM-dd HH:mm:ss"); } Tracer.Debug(dealType + " 开始"); DateTime dtStart = new DateTime(datLevestart.Year, datLevestart.Month, datLevestart.Day); DateTime dtEnd = new DateTime(dtLeveEnd.Year, dtLeveEnd.Month, dtLeveEnd.Day); DateTime dtAtt = new DateTime(); int iDate = 0; #region 判断是否要初始化考勤 while (dtAtt < dtEnd) { dtAtt = dtStart.AddDays(iDate); iDate++; IQueryable <T_HR_ATTENDANCERECORD> entArs = from r in dal.GetObjects <T_HR_ATTENDANCERECORD>() where r.EMPLOYEEID == EMPLOYEEID && r.ATTENDANCEDATE == dtAtt select r; if (entArs.Count() < 1) { string dtInit = datLevestart.Year.ToString() + "-" + datLevestart.Month.ToString(); try { Tracer.Debug(dealType + " 没有查到考勤初始化数据,开始初始化员工考勤:" + dtInit); AttendanceSolutionAsignBLL bllAttendanceSolutionAsign = new AttendanceSolutionAsignBLL(); //初始化该员工当月考勤记录 bllAttendanceSolutionAsign.AsignAttendanceSolutionByOrgID("4", EMPLOYEEID, dtInit); Tracer.Debug(dealType + " 初始化员工考勤成功,初始化月份:" + dtInit); break; } catch (Exception ex) { Tracer.Debug(dealType + " 初始化考勤失败:月份:" + dtInit + "失败原因:" + ex.ToString()); return; } } } #endregion #region 循环检查考勤初始化记录状态 IQueryable <T_HR_ATTENDANCERECORD> entAttAll = from r in dal.GetObjects <T_HR_ATTENDANCERECORD>() where r.EMPLOYEEID == EMPLOYEEID && r.ATTENDANCEDATE >= dtStart && r.ATTENDANCEDATE <= dtEnd select r; foreach (T_HR_ATTENDANCERECORD item in entAttAll) { string strAbnormCategory = (Convert.ToInt32(AbnormCategory.Absent) + 1).ToString(); //获取请假当天所有异常考勤(针对补请假的情况,用于删除异常考勤) List <T_HR_EMPLOYEEABNORMRECORD> entAbnormRecords = (from a in dal.GetObjects <T_HR_EMPLOYEEABNORMRECORD>().Include("T_HR_ATTENDANCERECORD") where a.T_HR_ATTENDANCERECORD.ATTENDANCERECORDID == item.ATTENDANCERECORDID && a.ABNORMCATEGORY == strAbnormCategory select a).ToList(); int i = 0; i = entAbnormRecords.Count(); #region 如果当天没有异常,直接更新此考勤记录的考勤状态 if (i == 0) { //Tracer.Debug(strMsg); item.ATTENDANCESTATE = attState; item.UPDATEDATE = DateTime.Now; string strMsg = item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + dealType + " ,无考勤异常,查询时间:" + item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + ",没有查到异常记录,修改考勤记录状态为:" + attState; item.REMARK = dealType + strMsg; int iUpdate = dal.Update(item); if (iUpdate == 1) { Tracer.Debug(dealType + strMsg + " 成功"); } else { Tracer.Debug(dealType + strMsg + " 失败"); } continue; } #endregion try { Tracer.Debug(dealType + " 日期:" + item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + ",发现当天有异常考勤,需要重新检查当天出勤状态,检查到异常记录共:" + i + "条记录" + "开始处理重新检查考勤异常——————————————————————————————————————Start"); Dictionary <AttendPeriod, AttendanceState> thisDayAttendState = new Dictionary <AttendPeriod, AttendanceState>();//考勤时间段1上午,2中午,3下午 考勤异常状态 1 缺勤 2 请假 foreach (T_HR_EMPLOYEEABNORMRECORD AbnormRecorditem in entAbnormRecords.ToList()) { //需根据请假时间判断是否要删除掉考勤异常 //DateTime datLevestart = entLeaveRecord.STARTDATETIME.Value;//长日期格式2013/2/16 8:30:00 //DateTime datLeveEnd = entLeaveRecord.ENDDATETIME.Value;//长日期格式2013/2/16 8:30:00 DateTime dtDateAbnorm = AbnormRecorditem.ABNORMALDATE.Value;//短日期格式2013/3/8 #region 循环当天考勤异常检查出勤状态并修改考勤记录状态 var q = (from entsf in dal.GetObjects <T_HR_SHIFTDEFINE>() join ab in dal.GetObjects <T_HR_ATTENDANCERECORD>() on entsf.SHIFTDEFINEID equals ab.T_HR_SHIFTDEFINE.SHIFTDEFINEID where ab.ATTENDANCERECORDID == AbnormRecorditem.T_HR_ATTENDANCERECORD.ATTENDANCERECORDID select entsf); if (q.Count() > 0) { T_HR_SHIFTDEFINE defineTime = q.FirstOrDefault(); if (AbnormRecorditem.ATTENDPERIOD.Trim() == "1") //上午上班8:30异常 { if (!string.IsNullOrEmpty(defineTime.NEEDFIRSTCARD) && defineTime.NEEDFIRSTCARD == "2") //以集团打卡举例,第一段上班打卡8:30 { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "考勤班次定义T_HR_SHIFTDEFINE第一段开始上班时间需打卡"); if (!string.IsNullOrEmpty(defineTime.FIRSTSTARTTIME)) { //定义的开始上班时间8:30 DateTime ShiftFirstStartTime = DateTime.Parse(defineTime.FIRSTSTARTTIME); DateTime ShiftstartDateAndTime = new DateTime(dtDateAbnorm.Year, dtDateAbnorm.Month, dtDateAbnorm.Day, ShiftFirstStartTime.Hour, ShiftFirstStartTime.Minute, ShiftFirstStartTime.Second); //定义的第一段上班结束时间12:00 if (!string.IsNullOrEmpty(defineTime.FIRSTENDTIME)) { DateTime FirstEndTime = DateTime.Parse(defineTime.FIRSTENDTIME); DateTime FirstEndDateAndTime = new DateTime(dtDateAbnorm.Year, dtDateAbnorm.Month, dtDateAbnorm.Day, FirstEndTime.Hour, FirstEndTime.Minute, FirstEndTime.Second); //如果请假时间包括了第一段上班时间,那么消除异常 if (datLevestart <= ShiftstartDateAndTime && dtLeveEnd >= ShiftstartDateAndTime) { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "考勤班次定义T_HR_SHIFTDEFINE第一段开始上班时间需打卡时间被请假时间覆盖,消除异常" + " 消除异常,开始时间:" + datLevestart.ToString("yyyy-MM-dd HH:mm:ss") + " 结束时间:" + dtLeveEnd.ToString("yyyy-MM-dd HH:mm:ss") + "定义的上班开始时间:" + ShiftstartDateAndTime.ToString("yyyy-MM-dd HH:mm:ss") + "定义的上班结束时间:" + FirstEndDateAndTime.ToString("yyyy-MM-dd HH:mm:ss")); //消除第一段异常生成的签卡 DeleteSigFromAbnormal(AbnormRecorditem); //消除第一段打卡时间异常考勤 dal.Delete(AbnormRecorditem); //第一段考勤时间标记为请假 thisDayAttendState.Add(AttendPeriod.Morning, AttendanceState.Leave); } else { //第一段考勤时间标记为异常 thisDayAttendState.Add(AttendPeriod.Morning, AttendanceState.Abnormal); } } else { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "考勤班次定义T_HR_SHIFTDEFINE第一段开始上班时间需打卡,但班次定义中的FIRSTSTARTTIME为空"); } } else { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "考勤班次定义T_HR_SHIFTDEFINE第一段开始上班时间需打卡,但班次定义中的FIRSTSTARTTIME为空"); } } } if (AbnormRecorditem.ATTENDPERIOD.Trim() == "2") //中午上班13:30异常 { if (!string.IsNullOrEmpty(defineTime.NEEDSECONDCARD) && defineTime.NEEDSECONDCARD == "2") //以集团打卡举例,第二段上班打卡13:30 { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "考勤班次定义T_HR_SHIFTDEFINE第二段开始上班时间需打卡"); if (!string.IsNullOrEmpty(defineTime.SECONDSTARTTIME)) { DateTime SecondStartTime = DateTime.Parse(defineTime.SECONDSTARTTIME); DateTime SecondStartDateAndTime = new DateTime(dtDateAbnorm.Year, dtDateAbnorm.Month, dtDateAbnorm.Day, SecondStartTime.Hour, SecondStartTime.Minute, SecondStartTime.Second); if (!string.IsNullOrEmpty(defineTime.SECONDENDTIME)) { DateTime SencondEndTime = DateTime.Parse(defineTime.SECONDENDTIME); DateTime SencondEndDateAndTime = new DateTime(dtDateAbnorm.Year, dtDateAbnorm.Month, dtDateAbnorm.Day, SencondEndTime.Hour, SencondEndTime.Minute, SencondEndTime.Second); if (datLevestart <= SecondStartDateAndTime && dtLeveEnd >= SecondStartDateAndTime) { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "考勤班次定义T_HR_SHIFTDEFINE第二段开始上班时间需打卡时间被请假时间覆盖,消除异常" + " 消除异常,开始时间:" + datLevestart.ToString("yyyy-MM-dd HH:mm:ss") + " 结束时间:" + dtLeveEnd.ToString("yyyy-MM-dd HH:mm:ss") + "定义的上班开始时间:" + SecondStartDateAndTime.ToString("yyyy-MM-dd HH:mm:ss") + "定义的上班结束时间:" + SencondEndDateAndTime.ToString("yyyy-MM-dd HH:mm:ss")); //消除第二段异常生成的签卡 DeleteSigFromAbnormal(AbnormRecorditem); //消除第二段打卡时间异常考勤 dal.Delete(AbnormRecorditem); thisDayAttendState.Add(AttendPeriod.Midday, AttendanceState.Leave); } else { thisDayAttendState.Add(AttendPeriod.Midday, AttendanceState.Abnormal); } } else { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "考勤班次定义T_HR_SHIFTDEFINE第二段开始上班时间需打卡,但班次定义中的SECONDENDTIME为空"); } } else { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "考勤班次定义T_HR_SHIFTDEFINE第二段开始上班时间需打卡,但班次定义中的SECONDSTARTTIME为空"); } } } if (AbnormRecorditem.ATTENDPERIOD.Trim() == "3") //下午17:30下班异常 { if (!string.IsNullOrEmpty(defineTime.NEEDSECONDOFFCARD) && defineTime.NEEDSECONDOFFCARD == "2") //以集团打卡举例,第二段下班打卡17:30 { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "考勤班次定义T_HR_SHIFTDEFINE第二段结束上班时间需打卡"); if (!string.IsNullOrEmpty(defineTime.SECONDSTARTTIME)) { DateTime SecondStartTime = DateTime.Parse(defineTime.SECONDSTARTTIME); DateTime SecondStartDateAndTime = new DateTime(dtDateAbnorm.Year, dtDateAbnorm.Month, dtDateAbnorm.Day, SecondStartTime.Hour, SecondStartTime.Minute, SecondStartTime.Second); if (!string.IsNullOrEmpty(defineTime.SECONDENDTIME)) { DateTime SencondEndTime = DateTime.Parse(defineTime.SECONDENDTIME); DateTime SencondEndDateAndTime = new DateTime(dtDateAbnorm.Year, dtDateAbnorm.Month, dtDateAbnorm.Day, SencondEndTime.Hour, SencondEndTime.Minute, SencondEndTime.Second); if (datLevestart <= SencondEndDateAndTime && dtLeveEnd >= SencondEndDateAndTime) { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "考勤班次定义T_HR_SHIFTDEFINE第二段结束上班时间需打卡时间被请假时间覆盖,消除异常" + " 消除异常,开始时间:" + datLevestart.ToString("yyyy-MM-dd HH:mm:ss") + " 结束时间:" + dtLeveEnd.ToString("yyyy-MM-dd HH:mm:ss") + "定义的上班开始时间:" + SecondStartDateAndTime.ToString("yyyy-MM-dd HH:mm:ss") + "定义的上班结束时间:" + SencondEndDateAndTime.ToString("yyyy-MM-dd HH:mm:ss")); //消除第三段异常生成的签卡 DeleteSigFromAbnormal(AbnormRecorditem); //消除第三段打卡时间异常考勤 dal.Delete(AbnormRecorditem); thisDayAttendState.Add(AttendPeriod.Evening, AttendanceState.Leave); } else { thisDayAttendState.Add(AttendPeriod.Evening, AttendanceState.Abnormal); } } else { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "考勤班次定义T_HR_SHIFTDEFINE第二段结束上班时间需打卡,但班次定义中的SECONDENDTIME为空"); } } else { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "考勤班次定义T_HR_SHIFTDEFINE第二段结束上班时间需打卡,但班次定义中的SECONDSTARTTIME为空"); } } } } else { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + "消除异常,通过异常记录获取到考勤初始化记录但通过考勤初始化记录获取的考勤班次定义T_HR_SHIFTDEFINE为空"); } #endregion } #region 修改考勤记录状态 if (thisDayAttendState.Count() > 0) //如果当天存在异常或请假情况 { //如果当天存在请假,同时也存在异常 if (thisDayAttendState.Values.Contains(AttendanceState.Leave) && thisDayAttendState.Values.Contains(AttendanceState.Abnormal)) { //标记当天出勤状况为Mix状态 if (attState == (Convert.ToInt32(Common.AttendanceState.Leave) + 1).ToString()) { item.ATTENDANCESTATE = (Convert.ToInt32(Common.AttendanceState.MixLeveAbnormal) + 1).ToString(); } if (attState == (Convert.ToInt32(Common.AttendanceState.Travel) + 1).ToString()) { item.ATTENDANCESTATE = (Convert.ToInt32(Common.AttendanceState.MixTravelAbnormal) + 1).ToString(); } if (attState == (Convert.ToInt32(Common.AttendanceState.OutApply) + 1).ToString()) { item.ATTENDANCESTATE = (Convert.ToInt32(Common.AttendanceState.MixOutApplyAbnormal) + 1).ToString(); } item.UPDATEDATE = DateTime.Now; string strMsg = item.ATTENDANCEDATE.Value.ToString("yyy-MM-dd") + " 消除异常修改状态完成,员工姓名:" + item.EMPLOYEENAME + ",修改的状态为:" + item.ATTENDANCESTATE; item.REMARK = dealType + strMsg; int iUpdate = dal.Update(item); if (iUpdate == 1) { Tracer.Debug(dealType + strMsg + " 成功"); } else { Tracer.Debug(dealType + strMsg + " 失败"); } } else if (thisDayAttendState.Values.Contains(AttendanceState.Leave) && !thisDayAttendState.Values.Contains(AttendanceState.Abnormal)) { //如果当天异常时间已全部被请假时间涵盖,删除签卡提醒并标记考勤为请假 EmployeeSignInRecordBLL bllSignInRd = new EmployeeSignInRecordBLL(); bllSignInRd.ClearNoSignInRecord("T_HR_EMPLOYEEABNORMRECORD", item.EMPLOYEEID, entAbnormRecords); item.ATTENDANCESTATE = attState; item.UPDATEDATE = DateTime.Now; string strMsg = item.ATTENDANCEDATE.Value.ToString("yyy-MM-dd") + " 消除异常修改状态完成,员工姓名:" + item.EMPLOYEENAME + ",修改的状态为:" + item.ATTENDANCESTATE; item.REMARK = dealType + strMsg; int iUpdate = dal.Update(item); if (iUpdate == 1) { Tracer.Debug(dealType + strMsg + " 成功"); } else { Tracer.Debug(dealType + strMsg + " 失败"); } } } #endregion Tracer.Debug(dealType + " 日期:" + item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + ",发现当天有异常考勤,需要重新检查当天出勤状态,检查到异常记录共:" + i + "条记录" + "开始处理重新检查考勤异常——————————————————————————————————————End"); } catch (Exception ex) { Tracer.Debug(item.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + " " + dealType + " 异常:" + ex.ToString()); } }//for each T_HR_ATTENDANCERECORD End #endregion Tracer.Debug(dealType + " 结束!"); }