/// <summary> /// 表单初始化 /// </summary> private void InitForm() { SchedulingTemplateMaster = null; SchedulingTemplateMaster = new T_HR_SCHEDULINGTEMPLATEMASTER(); SchedulingTemplateMaster.TEMPLATEMASTERID = System.Guid.NewGuid().ToString().ToUpper(); //权限控制所需信息 SchedulingTemplateMaster.OWNERCOMPANYID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.UserPosts[0].CompanyID; SchedulingTemplateMaster.OWNERDEPARTMENTID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.UserPosts[0].DepartmentID; SchedulingTemplateMaster.OWNERPOSTID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.UserPosts[0].PostID; SchedulingTemplateMaster.OWNERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; //创建人员的信息 SchedulingTemplateMaster.CREATEDATE = DateTime.Now; SchedulingTemplateMaster.CREATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; SchedulingTemplateMaster.UPDATEDATE = System.DateTime.Now; SchedulingTemplateMaster.UPDATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; //页面初始化加载的临时数据 SchedulingTemplateMaster.SCHEDULINGCIRCLETYPE = "0"; this.DataContext = SchedulingTemplateMaster; }
/// <summary> /// 显示单个模板信息 /// </summary> private void ShowTemplateMasterAndDetail() { if (dgSTList.ItemsSource == null) { SchedulingTemplateMaster = new T_HR_SCHEDULINGTEMPLATEMASTER(); this.DataContext = SchedulingTemplateMaster; BindTemplateDetail(); return; } if (dgSTList.SelectedItems.Count == 0) { IEnumerable <T_HR_SCHEDULINGTEMPLATEMASTER> entList = dgSTList.ItemsSource as IEnumerable <T_HR_SCHEDULINGTEMPLATEMASTER>; SchedulingTemplateMaster = entList.FirstOrDefault(); } else { SchedulingTemplateMaster = dgSTList.SelectedItems[0] as T_HR_SCHEDULINGTEMPLATEMASTER; } if (SchedulingTemplateMaster != null) { this.DataContext = SchedulingTemplateMaster; BindTemplateDetail(); } }
/// <summary> /// 编辑 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void btnEdit_Click(object sender, RoutedEventArgs e) { string strSchedulingTemplateMasterID = string.Empty; if (dgSTList.SelectedItems == null) { ComfirmWindow.ConfirmationBox(Utility.GetResourceStr("CONFIRMINFO"), Utility.GetResourceStr("SELECTERROR", "EDIT"), Utility.GetResourceStr("CONFIRMBUTTON")); return; } if (dgSTList.SelectedItems.Count == 0) { ComfirmWindow.ConfirmationBox(Utility.GetResourceStr("CONFIRMINFO"), Utility.GetResourceStr("SELECTERROR", "EDIT"), Utility.GetResourceStr("CONFIRMBUTTON")); return; } T_HR_SCHEDULINGTEMPLATEMASTER ent = dgSTList.SelectedItems[0] as T_HR_SCHEDULINGTEMPLATEMASTER; strSchedulingTemplateMasterID = ent.TEMPLATEMASTERID.ToString(); SchedulingTemplateForm formSchedulingTemplate = new SchedulingTemplateForm(FormTypes.Edit, strSchedulingTemplateMasterID); EntityBrowser entBrowser = new EntityBrowser(formSchedulingTemplate); 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> void btnDelete_Click(object sender, RoutedEventArgs e) { string strID = ""; if (dgSTList.SelectedItems == null) { ComfirmWindow.ConfirmationBox(Utility.GetResourceStr("CONFIRMINFO"), Utility.GetResourceStr("SELECTERROR", "DELETE"), Utility.GetResourceStr("CONFIRMBUTTON")); return; } if (dgSTList.SelectedItems.Count == 0) { ComfirmWindow.ConfirmationBox(Utility.GetResourceStr("CONFIRMINFO"), Utility.GetResourceStr("SELECTERROR", "DELETE"), Utility.GetResourceStr("CONFIRMBUTTON")); return; } foreach (object ovj in dgSTList.SelectedItems) { T_HR_SCHEDULINGTEMPLATEMASTER entTemplateMaste = ovj as T_HR_SCHEDULINGTEMPLATEMASTER; string Result = ""; if (entTemplateMaste != null) { strID = entTemplateMaste.TEMPLATEMASTERID; ComfirmWindow delComfirm = new ComfirmWindow(); delComfirm.OnSelectionBoxClosed += (obj, result) => { clientAtt.RemoveSchedulingTemplateMasterAsync(strID); }; delComfirm.SelectionBox(Utility.GetResourceStr("DELETECONFIRM"), Utility.GetResourceStr("DELETEALTER"), ComfirmWindow.titlename, Result); } } }
/// <summary> /// 根据主键索引,获得指定的排班模板基本设置以便查看编辑 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void clientAtt_GetSchedulingTemplateMasterByIDCompleted(object sender, GetSchedulingTemplateMasterByIDCompletedEventArgs e) { if (e.Error == null) { SchedulingTemplateMaster = e.Result; this.DataContext = SchedulingTemplateMaster; } else { Utility.ShowCustomMessage(MessageTypes.Error, Utility.GetResourceStr("ERROR"), Utility.GetResourceStr(e.Error.Message)); } }
/// <summary> /// 获取临时主表实体 /// </summary> /// <returns></returns> private T_HR_SCHEDULINGTEMPLATEMASTER GetMaster() { if (string.IsNullOrEmpty(hdTemplateMasterID.Text)) { return(null); } T_HR_SCHEDULINGTEMPLATEMASTER TemplateMaster = new T_HR_SCHEDULINGTEMPLATEMASTER(); TemplateMaster.TEMPLATEMASTERID = hdTemplateMasterID.Text; return(TemplateMaster); }
/// <summary> /// 根据主键索引,获得指定的排班模板基本设置以便查看编辑 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void clientAtt_GetSchedulingTemplateMasterByIDCompleted(object sender, GetSchedulingTemplateMasterByIDCompletedEventArgs e) { if (e.Error == null) { SchedulingTemplateMaster = e.Result; this.DataContext = SchedulingTemplateMaster; SetToolBar(); string strSortKey = " SCHEDULINGINDEX "; clientAtt.GetAllSchedulingTemplateDetailRdListByMasterIdAsync(TemplateMasterID, strSortKey); } else { Utility.ShowCustomMessage(MessageTypes.Error, Utility.GetResourceStr("ERROR"), Utility.GetResourceStr(e.Error.Message)); } }
/// <summary> /// 表单初始化 /// </summary> public void InitForm() { SchedulingTemplateMaster = null; SchedulingTemplateMaster = new T_HR_SCHEDULINGTEMPLATEMASTER(); SchedulingTemplateMaster.TEMPLATEMASTERID = System.Guid.NewGuid().ToString().ToUpper(); //2010年2月11日, 11:37:35,目前暂未实现登录部分,人员相关数据为假定值 SchedulingTemplateMaster.CREATEDATE = DateTime.Now; SchedulingTemplateMaster.CREATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; SchedulingTemplateMaster.UPDATEDATE = System.DateTime.Now; SchedulingTemplateMaster.UPDATEUSERID = SMT.SAAS.Main.CurrentContext.Common.CurrentLoginUserInfo.EmployeeID; //页面初始化加载的临时数据 SchedulingTemplateMaster.SCHEDULINGCIRCLETYPE = "0"; this.DataContext = SchedulingTemplateMaster; }
/// <summary> /// 将LookUp选取的数据抽取出来,转存到AttendanceWS提供的T_HR_SCHEDULINGTEMPLATEMASTER实体中,并返回 /// </summary> /// <param name="obj">LookUp选取的数据</param> /// <returns></returns> private T_HR_SCHEDULINGTEMPLATEMASTER ReplicateDataToNewStructure(object obj) { if (obj == null) { return(null); } T_HR_SCHEDULINGTEMPLATEMASTER entRes = new T_HR_SCHEDULINGTEMPLATEMASTER(); SMT.Saas.Tools.OrganizationWS.T_HR_SCHEDULINGTEMPLATEMASTER entTemp = obj as SMT.Saas.Tools.OrganizationWS.T_HR_SCHEDULINGTEMPLATEMASTER; entRes.TEMPLATEMASTERID = entTemp.TEMPLATEMASTERID; entRes.TEMPLATENAME = entTemp.TEMPLATENAME; entRes.SCHEDULINGCIRCLETYPE = entTemp.SCHEDULINGCIRCLETYPE; entRes.REMARK = entTemp.REMARK; entRes.UPDATEDATE = entTemp.UPDATEDATE; entRes.UPDATEUSERID = entTemp.UPDATEUSERID; entRes.CREATEDATE = entTemp.CREATEDATE; entRes.CREATEUSERID = entTemp.CREATEUSERID; return(entRes); }
/// <summary> /// 计算外出确认时长 /// </summary> /// <param name="strEmployeeId"></param> /// <param name="dtOTStart"></param> /// <param name="dtOTEnd"></param> /// <param name="dOverTimeHours"></param> /// <returns></returns> public string CalculateOverTimeHours(string strEmployeeId, DateTime dtOTStart, DateTime dtOTEnd, ref string dOverTimeHours) { string strRes = string.Empty; decimal dTotalOverTimeHours = 0; DateTime dtStart, dtEnd = new DateTime(); dtStart = dtOTStart; dtEnd = dtOTEnd; //DateTime.TryParse(dtOTStart.ToString("yyyy-MM-dd"), out dtStart); //获取请假起始日期 //DateTime.TryParse(dtOTEnd.ToString("yyyy-MM-dd"), out dtEnd); //获取请假截止日期 AttendanceSolutionAsignBLL bllAttendSolAsign = new AttendanceSolutionAsignBLL(); T_HR_ATTENDANCESOLUTIONASIGN entAttendSolAsign = bllAttendSolAsign.GetAttendanceSolutionAsignByEmployeeIDAndDate(strEmployeeId, dtStart); if (entAttendSolAsign == null) { //当前员工没有分配考勤方案,无法提交请假申请 return("没有找到员工分配的考勤方案!"); } //获取考勤方案 T_HR_ATTENDANCESOLUTION entAttendSol = entAttendSolAsign.T_HR_ATTENDANCESOLUTION; decimal dWorkTimePerDay = entAttendSol.WORKTIMEPERDAY.Value; decimal dWorkMode = entAttendSol.WORKMODE.Value; int iWorkMode = 0; int.TryParse(dWorkMode.ToString(), out iWorkMode);//获取工作制(工作天数/周) List <int> iWorkDays = new List <int>(); Utility.GetWorkDays(iWorkMode, ref iWorkDays); OutPlanDaysBLL bllOutPlanDays = new OutPlanDaysBLL(); IQueryable <T_HR_OUTPLANDAYS> entOutPlanDays = bllOutPlanDays.GetOutPlanDaysRdListByEmployeeID(strEmployeeId); string strVacDayType = (Convert.ToInt32(Common.OutPlanDaysType.Vacation) + 1).ToString(); string strWorkDayType = (Convert.ToInt32(Common.OutPlanDaysType.WorkDay) + 1).ToString(); IQueryable <T_HR_OUTPLANDAYS> entVacDays = entOutPlanDays.Where(s => s.DAYTYPE == strVacDayType); IQueryable <T_HR_OUTPLANDAYS> entWorkDays = entOutPlanDays.Where(s => s.DAYTYPE == strWorkDayType && s.STARTDATE >= dtStart && s.ENDDATE <= dtEnd); SchedulingTemplateDetailBLL bllTemplateDetail = new SchedulingTemplateDetailBLL(); IQueryable <T_HR_SCHEDULINGTEMPLATEDETAIL> entTemplateDetails = bllTemplateDetail.GetTemplateDetailRdListByAttendanceSolutionId(entAttendSol.ATTENDANCESOLUTIONID); T_HR_SCHEDULINGTEMPLATEMASTER entTemplateMaster = entTemplateDetails.FirstOrDefault().T_HR_SCHEDULINGTEMPLATEMASTER; dtEnd = new DateTime(dtEnd.Year, dtEnd.Month, dtEnd.Day, dtEnd.Hour, dtEnd.Minute, 0); dtStart = new DateTime(dtStart.Year, dtStart.Month, dtStart.Day, dtStart.Hour, dtStart.Minute, 0); TimeSpan ts = dtEnd.Subtract(dtStart); int iOTDays = ts.Days; string strMsg = string.Empty; dTotalOverTimeHours = iOTDays * dWorkTimePerDay + ts.Hours; if (dTotalOverTimeHours > 0) { dOverTimeHours = Math.Round(dTotalOverTimeHours, 0) + "小时"; } if (ts.Minutes > 0) { dOverTimeHours = dOverTimeHours + ts.Minutes + "分"; } return(strRes + strMsg); }
/// <summary> /// 显示单个模板信息 /// </summary> private void ShowTemplateMasterAndDetail() { if (dgSTList.ItemsSource == null) { SchedulingTemplateMaster = new T_HR_SCHEDULINGTEMPLATEMASTER(); this.DataContext = SchedulingTemplateMaster; BindTemplateDetail(); return; } if (dgSTList.SelectedItems.Count == 0) { IEnumerable<T_HR_SCHEDULINGTEMPLATEMASTER> entList = dgSTList.ItemsSource as IEnumerable<T_HR_SCHEDULINGTEMPLATEMASTER>; SchedulingTemplateMaster = entList.FirstOrDefault(); } else { SchedulingTemplateMaster = dgSTList.SelectedItems[0] as T_HR_SCHEDULINGTEMPLATEMASTER; } if (SchedulingTemplateMaster != null) { this.DataContext = SchedulingTemplateMaster; BindTemplateDetail(); } }
/// <summary> /// 获取临时主表实体 /// </summary> /// <returns></returns> private T_HR_SCHEDULINGTEMPLATEMASTER GetMaster() { if (string.IsNullOrEmpty(hdTemplateMasterID.Text)) { return null; } T_HR_SCHEDULINGTEMPLATEMASTER TemplateMaster = new T_HR_SCHEDULINGTEMPLATEMASTER(); TemplateMaster.TEMPLATEMASTERID = hdTemplateMasterID.Text; return TemplateMaster; }
private void InitForm() { entTemplateMaster = new T_HR_SCHEDULINGTEMPLATEMASTER(); this.DataContext = entTemplateMaster; }
public string ModifySchedulingTemplateMasterAndDetail(T_HR_SCHEDULINGTEMPLATEMASTER entMasterTemp, List<T_HR_SCHEDULINGTEMPLATEDETAIL> entDetailTemps) { using (SchedulingTemplateMasterBLL bllSchedulingTemplateMaster = new SchedulingTemplateMasterBLL()) { return bllSchedulingTemplateMaster.ModifySchedulingTemplateMasterAndDetail(entMasterTemp, entDetailTemps); } }
public string ModifySchedulingTemplateMaster(T_HR_SCHEDULINGTEMPLATEMASTER entTemp) { using (SchedulingTemplateMasterBLL bllSchedulingTemplateMaster = new SchedulingTemplateMasterBLL()) { return bllSchedulingTemplateMaster.ModifyTemplateMaster(entTemp); } }
/// <summary> /// 根据考勤方案ID,当日的起止时间,获取当天的实际上下班时间(计算考勤异常时使用) /// </summary> /// <param name="strAttendanceSolutionId">考勤方案ID</param> /// <param name="dtWorkStart">当日的起始时间</param> /// <param name="dtWorkEnd">当日的截止时间</param> /// <returns>返回结果(true/ false)</returns> public bool GetAttendDateWorkTime(string strAttendanceSolutionId, ref DateTime dtWorkStart, ref DateTime dtWorkEnd) { bool bflag = false; T_HR_ATTENDANCESOLUTION entAttSol = GetAttendanceSolutionByID(strAttendanceSolutionId); if (entAttSol == null) { return(bflag); } T_HR_SCHEDULINGTEMPLATEMASTER entScheduleMaster = entAttSol.T_HR_SCHEDULINGTEMPLATEMASTER; if (entScheduleMaster == null) { return(bflag); } var ent = (from s in dal.GetObjects <T_HR_SCHEDULINGTEMPLATEDETAIL>().Include("T_HR_SHIFTDEFINE") where s.T_HR_SCHEDULINGTEMPLATEMASTER.TEMPLATEMASTERID == entScheduleMaster.TEMPLATEMASTERID select s.T_HR_SHIFTDEFINE).FirstOrDefault(); if (ent == null) { return(bflag); } bool bDate = false; if (!string.IsNullOrWhiteSpace(ent.FIRSTSTARTTIME)) { bDate = DateTime.TryParse(dtWorkStart.ToString("yyyy-MM-dd") + " " + ent.FIRSTSTARTTIME, out dtWorkStart); } if (!bDate) { return(bflag); } if (!string.IsNullOrWhiteSpace(ent.FOURTHENDTIME)) { bDate = DateTime.TryParse(dtWorkEnd.ToString("yyyy-MM-dd") + " " + ent.FOURTHENDTIME, out dtWorkEnd); } else { if (!string.IsNullOrWhiteSpace(ent.THIRDENDTIME)) { bDate = DateTime.TryParse(dtWorkEnd.ToString("yyyy-MM-dd") + " " + ent.THIRDENDTIME, out dtWorkEnd); } else { if (!string.IsNullOrWhiteSpace(ent.SECONDENDTIME)) { bDate = DateTime.TryParse(dtWorkEnd.ToString("yyyy-MM-dd") + " " + ent.SECONDENDTIME, out dtWorkEnd); } else { if (!string.IsNullOrWhiteSpace(ent.FIRSTENDTIME)) { bDate = DateTime.TryParse(dtWorkEnd.ToString("yyyy-MM-dd") + " " + ent.FIRSTENDTIME, out dtWorkEnd); } } } } return(bflag); }
//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> /// 将LookUp选取的数据抽取出来,转存到AttendanceWS提供的T_HR_SCHEDULINGTEMPLATEMASTER实体中,并返回 /// </summary> /// <param name="obj">LookUp选取的数据</param> /// <returns></returns> private T_HR_SCHEDULINGTEMPLATEMASTER ReplicateDataToNewStructure(object obj) { if (obj == null) { return null; } T_HR_SCHEDULINGTEMPLATEMASTER entRes = new T_HR_SCHEDULINGTEMPLATEMASTER(); SMT.Saas.Tools.OrganizationWS.T_HR_SCHEDULINGTEMPLATEMASTER entTemp = obj as SMT.Saas.Tools.OrganizationWS.T_HR_SCHEDULINGTEMPLATEMASTER; entRes.TEMPLATEMASTERID = entTemp.TEMPLATEMASTERID; entRes.TEMPLATENAME = entTemp.TEMPLATENAME; entRes.SCHEDULINGCIRCLETYPE = entTemp.SCHEDULINGCIRCLETYPE; entRes.REMARK = entTemp.REMARK; entRes.UPDATEDATE = entTemp.UPDATEDATE; entRes.UPDATEUSERID = entTemp.UPDATEUSERID; entRes.CREATEDATE = entTemp.CREATEDATE; entRes.CREATEUSERID = entTemp.CREATEUSERID; return entRes; }
/// <summary> /// 对指定公司,指定的员工,按照指定的考勤方案应用生成指定时段内的考勤初始化记录 /// </summary> /// <param name="entTemp"></param> /// <param name="entCompany"></param> /// <param name="entEmployees"></param> /// <param name="dtAsignDate"></param> /// <returns></returns> private string AsignAttendSolForEmployees(T_HR_ATTENDANCESOLUTIONASIGN entTemp, T_HR_COMPANY entCompany, List <T_HR_EMPLOYEE> entEmployees, DateTime dtAsignDate) { string strRes = string.Empty; try { decimal dWorkMode = entTemp.T_HR_ATTENDANCESOLUTION.WORKMODE.Value; string strAttendanceSolutionID = entTemp.T_HR_ATTENDANCESOLUTION.ATTENDANCESOLUTIONID; int iWorkMode = 0; int.TryParse(dWorkMode.ToString(), out iWorkMode); List <int> iWorkDays = new List <int>(); Utility.GetWorkDays(iWorkMode, ref iWorkDays); SchedulingTemplateDetailBLL bllTemplateDetail = new SchedulingTemplateDetailBLL(); List <T_HR_SCHEDULINGTEMPLATEDETAIL> entTemplateDetails = new List <T_HR_SCHEDULINGTEMPLATEDETAIL>(); var q = bllTemplateDetail.GetTemplateDetailRdListByAttendanceSolutionId(strAttendanceSolutionID); if (q == null) { Tracer.Debug("考勤初始化考勤班次不存在"); return("{NOTFOUND}"); } entTemplateDetails = q.ToList(); if (entTemplateDetails == null) { Tracer.Debug("考勤初始化考勤班次不存在"); return("{NOTFOUND}"); } if (entTemplateDetails.Count == 0) { Tracer.Debug("考勤初始化考勤班次不存在"); return("{NOTFOUND}"); } int iTotalDay = 0; //DateTime dtCheck = new DateTime(); DateTime dtStart = DateTime.Parse(dtAsignDate.ToString("yyyy-MM") + "-1"); //DateTime dtStart = DateTime.Parse("2012-10-1"); if (entTemp.STARTDATE > dtStart) { dtStart = entTemp.STARTDATE.Value; } DateTime dtInitAttandRecordEndDate = dtStart.AddMonths(1).AddDays(-1); AttendanceRecordBLL bllAttRd = new AttendanceRecordBLL(); EmployeeLevelDayCountBLL bllLevelDayCount = new EmployeeLevelDayCountBLL(); EmployeeEntryBLL bllEntry = new EmployeeEntryBLL(); LeftOfficeConfirmBLL bllConfirm = new LeftOfficeConfirmBLL(); //操作表T_HR_EMPLOYEELEVELDAYCOUNT数据的方式:0:直接逐条新增或修改; //1:先把要新增或修改的记录存到内存,然后一次性提交到数据库修改 Tracer.Debug("开始生成员工考勤初始化记录,总员工数:" + entEmployees.Count()); for (int n = 0; n < entEmployees.Count(); n++) { bool AttendNoCheck = false; try { T_HR_EMPLOYEE item_emp = entEmployees[n]; DateTime dtInitAttandRecordStartDate = new DateTime(); #region 判断是否免打卡 //如果是免打卡的用户,在这里还是需要初始化,因为结算的时候需要计算出勤天数 if (!entTemp.T_HR_ATTENDANCESOLUTIONReference.IsLoaded) { entTemp.T_HR_ATTENDANCESOLUTIONReference.Load(); } if (entTemp.T_HR_ATTENDANCESOLUTION.ATTENDANCETYPE == (Convert.ToInt32(Common.AttendanceType.NoCheck) + 1).ToString())//考勤方案设置为不考勤 { AttendNoCheck = true; Tracer.Debug("初始化员工,考勤方案设置为免打卡,员工姓名:" + entEmployees.FirstOrDefault().EMPLOYEECNAME + " 考勤方案名:" + entTemp.T_HR_ATTENDANCESOLUTION.ATTENDANCESOLUTIONNAME); } #endregion #region 初始化开始日期大于结束日期 dtInitAttandRecordStartDate = dtStart; if (dtInitAttandRecordStartDate >= dtInitAttandRecordEndDate) { Tracer.Debug("初始化员工考勤记录被跳过,dtInitAttandRecordStartDate >= dtEnd" + ",员工姓名" + item_emp.EMPLOYEECNAME); continue; } #endregion #region 判断员工状态,是否有入职记录,是否已离职,入职,离职日期 string usedAttendSolutionName = ",使用的考勤方案:" + entTemp.T_HR_ATTENDANCESOLUTION.ATTENDANCESOLUTIONNAME + ",当前线程id:" + Thread.CurrentThread.ManagedThreadId; Tracer.Debug("初始化员工考勤记录:员工状态:" + item_emp.EMPLOYEESTATE + ",员工姓名" + item_emp.EMPLOYEECNAME + usedAttendSolutionName); if (item_emp.EMPLOYEESTATE == "0") { T_HR_EMPLOYEEENTRY entEntry = bllEntry.GetEmployeeEntryByEmployeeID(item_emp.EMPLOYEEID); if (entEntry == null) { Tracer.Debug("初始化员工考勤记录被跳过,该员工入职为空" + ",员工姓名" + item_emp.EMPLOYEECNAME); continue; } TimeSpan tsStart = entEntry.ONPOSTDATE.Value - dtInitAttandRecordStartDate; TimeSpan tsEnd = dtInitAttandRecordEndDate - entEntry.ONPOSTDATE.Value; if (tsStart.Days >= 0 && tsEnd.Days >= 0) { Tracer.Debug("初始化员工考勤记录开始日期被修改:entEntry.ONPOSTDATE.Value > dtInitAttandRecordStartDate" + ",员工姓名" + item_emp.EMPLOYEECNAME + " 入职日期:" + entEntry.ENTRYDATE.Value.ToString("yyyy-MM-dd") + " 到岗日期:" + entEntry.ONPOSTDATE.Value.ToString("yyyy-MM-dd")); dtInitAttandRecordStartDate = new DateTime(entEntry.ONPOSTDATE.Value.Year, entEntry.ONPOSTDATE.Value.Month, entEntry.ONPOSTDATE.Value.Day); } if (tsEnd.Days < 0) { Tracer.Debug("初始化员工考勤记录被跳过:员工到岗日期大于考勤初始化结束日期entEntry.ONPOSTDATE.Value > dtEnd" + ",员工姓名" + item_emp.EMPLOYEECNAME + " 入职日期:" + entEntry.ENTRYDATE.Value.ToString("yyyy-MM-dd") + " 到岗日期:" + entEntry.ONPOSTDATE.Value.ToString("yyyy-MM-dd") + " 考勤初始化结束日期:" + dtInitAttandRecordEndDate); continue; } } if (item_emp.EMPLOYEESTATE == "1") { T_HR_EMPLOYEEENTRY entEntry = bllEntry.GetEmployeeEntryByEmployeeID(item_emp.EMPLOYEEID); if (entEntry == null) { Tracer.Debug("该员工入职为空" + ",员工姓名" + item_emp.EMPLOYEECNAME); continue; } if (entEntry.ONPOSTDATE.Value > dtInitAttandRecordStartDate && entEntry.ONPOSTDATE.Value < dtInitAttandRecordEndDate) { Tracer.Debug("初始化员工考勤记录开始日期被修改:entEntry.ONPOSTDATE.Value > dtInitAttandRecordStartDate" + ",员工姓名" + item_emp.EMPLOYEECNAME + " 入职日期:" + entEntry.ENTRYDATE.Value.ToString("yyyy-MM-dd") + " 到岗日期:" + entEntry.ONPOSTDATE.Value.ToString("yyyy-MM-dd")); dtInitAttandRecordStartDate = new DateTime(entEntry.ONPOSTDATE.Value.Year, entEntry.ONPOSTDATE.Value.Month, entEntry.ONPOSTDATE.Value.Day); } TimeSpan ts3 = entEntry.ONPOSTDATE.Value - dtInitAttandRecordEndDate; if (ts3.Days > 0) { Tracer.Debug("初始化员工考勤记录被跳过,员工入职日期大于本月最后一天" + ",员工姓名" + item_emp.EMPLOYEECNAME); continue; } } else if (item_emp.EMPLOYEESTATE == "2") { T_HR_LEFTOFFICECONFIRM entConfirm = bllConfirm.GetLeftOfficeConfirmByEmployeeId(item_emp.EMPLOYEEID); if (entConfirm.STOPPAYMENTDATE != null && entConfirm.STOPPAYMENTDATE.Value < dtStart) { Tracer.Debug("初始化员工考勤记录被跳过,entConfirm.STOPPAYMENTDATE !=null && entConfirm.STOPPAYMENTDATE.Value < dtStart" + ",员工姓名" + item_emp.EMPLOYEECNAME); continue; } if (entConfirm.STOPPAYMENTDATE != null && entConfirm.STOPPAYMENTDATE.Value > dtStart && entConfirm.STOPPAYMENTDATE.Value < dtInitAttandRecordEndDate) { dtInitAttandRecordEndDate = new DateTime(entConfirm.STOPPAYMENTDATE.Value.Year, entConfirm.STOPPAYMENTDATE.Value.Month, entConfirm.STOPPAYMENTDATE.Value.Day); } if (entConfirm.STOPPAYMENTDATE != null && entConfirm.STOPPAYMENTDATE.Value < dtStart) { Tracer.Debug("初始化员工考勤记录被跳过,entConfirm.STOPPAYMENTDATE != null && entConfirm.STOPPAYMENTDATE.Value < dtStart" + ",员工姓名" + item_emp.EMPLOYEECNAME); continue; } } #endregion TimeSpan ts = dtInitAttandRecordEndDate.Subtract(dtInitAttandRecordStartDate); iTotalDay = ts.Days; T_HR_SCHEDULINGTEMPLATEMASTER entTemplateMaster = entTemplateDetails[0].T_HR_SCHEDULINGTEMPLATEMASTER; 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; } int iPeriod = iTotalDay / iCircleDay; if (iTotalDay % iCircleDay >= 0) { iPeriod += 1; } OutPlanDaysBLL bllOutPlanDays = new OutPlanDaysBLL(); IQueryable <T_HR_OUTPLANDAYS> entOutPlanDays = bllOutPlanDays.GetOutPlanDaysRdListByEmployeeID(item_emp.EMPLOYEEID); string strVacDayType = (Convert.ToInt32(Common.OutPlanDaysType.Vacation) + 1).ToString(); string strWorkDayType = (Convert.ToInt32(Common.OutPlanDaysType.WorkDay) + 1).ToString(); IQueryable <T_HR_OUTPLANDAYS> entVacDays = entOutPlanDays.Where(s => s.DAYTYPE == strVacDayType); IQueryable <T_HR_OUTPLANDAYS> entWorkDays = entOutPlanDays.Where(s => s.DAYTYPE == strWorkDayType && s.STARTDATE >= dtInitAttandRecordStartDate && s.ENDDATE <= dtInitAttandRecordEndDate); //IQueryable<T_HR_OUTPLANDAYS> entVacWorkDays = entOutPlanDays.Where(s => s.STARTDATE >= dtInitAttandRecordStartDate && s.ENDDATE <= dtInitAttandRecordEndDate); //例外工作日考勤初始化记录公共假期 CreateOutPlanWorkDay(entCompany, item_emp, entTemp, entTemplateDetails, entWorkDays, AttendNoCheck); //IQueryable<T_HR_OUTPLANDAYS> entVacWorkHalfDays // = entVacDays.Where(s => s.STARTDATE >= dtInitAttandRecordStartDate // && s.ENDDATE <= dtInitAttandRecordEndDate && s.ISHALFDAY=="1"); int addCount = 0; int updateCount = 0; for (int i = 0; i < iPeriod; i++) { for (int j = 0; j < iCircleDay; j++) { #region 开始生成员工考勤初始化记录 try { int m = (i * iCircleDay) + j; DateTime dtCurDate = dtInitAttandRecordStartDate.AddDays(m); if (dtCurDate > entTemp.ENDDATE.Value) { break; } bool isVacDay = false; if (iWorkDays.Contains(Convert.ToInt32(dtCurDate.DayOfWeek)) == false) { continue; } if (entVacDays.Count() > 0) { foreach (T_HR_OUTPLANDAYS item_Vac in entVacDays) { if (item_Vac.STARTDATE.Value <= dtCurDate && item_Vac.ENDDATE >= dtCurDate) { //如果是公共假期并未设置半天,设为公共假期不考勤 if (string.IsNullOrEmpty(item_Vac.ISHALFDAY)) { isVacDay = true; break; } if (!string.IsNullOrEmpty(item_Vac.ISHALFDAY) && item_Vac.ISHALFDAY == "0") { isVacDay = true; break; } else { //例外工作日考勤初始化记录(公共假期半天休息,还有半天上班也需要初始化考勤记录) } } } } if (isVacDay) { continue; } T_HR_SCHEDULINGTEMPLATEDETAIL item = entTemplateDetails.Where(c => c.SCHEDULINGDATE == (j + 1).ToString()).FirstOrDefault(); var qc = from ar in dal.GetObjects <T_HR_ATTENDANCERECORD>() where //ar.OWNERCOMPANYID == entCompany.COMPANYID && ar.EMPLOYEEID == item_emp.EMPLOYEEID && ar.ATTENDANCEDATE == dtCurDate select ar; T_HR_ATTENDANCERECORD entUpdate = qc.FirstOrDefault(); if (entUpdate == null) { T_HR_ATTENDANCERECORD entAttRd = new T_HR_ATTENDANCERECORD(); entAttRd.ATTENDANCERECORDID = System.Guid.NewGuid().ToString().ToUpper(); entAttRd.ATTENDANCESOLUTIONID = entTemp.T_HR_ATTENDANCESOLUTION.ATTENDANCESOLUTIONID; entAttRd.EMPLOYEEID = item_emp.EMPLOYEEID; entAttRd.EMPLOYEECODE = item_emp.EMPLOYEECODE; entAttRd.EMPLOYEENAME = item_emp.EMPLOYEECNAME; entAttRd.ATTENDANCEDATE = dtCurDate; //外键实体 //entAttRd.T_HR_SHIFTDEFINE = item.T_HR_SHIFTDEFINE; entAttRd.T_HR_SHIFTDEFINEReference.EntityKey = new EntityKey("TM_SaaS_OA_EFModelContext.T_HR_SHIFTDEFINE", "SHIFTDEFINEID", item.T_HR_SHIFTDEFINE.SHIFTDEFINEID); //第一段工作时间 entAttRd.FIRSTSTARTTIME = item.T_HR_SHIFTDEFINE.FIRSTSTARTTIME; entAttRd.FIRSTENDTIME = item.T_HR_SHIFTDEFINE.FIRSTENDTIME; //第二段工作时间 entAttRd.SECONDSTARTTIME = item.T_HR_SHIFTDEFINE.SECONDSTARTTIME; entAttRd.SECONDENDTIME = item.T_HR_SHIFTDEFINE.SECONDENDTIME; //第三段工作时间 entAttRd.THIRDSTARTTIME = item.T_HR_SHIFTDEFINE.THIRDSTARTTIME; entAttRd.THIRDENDTIME = item.T_HR_SHIFTDEFINE.THIRDENDTIME; //第四段工作时间 entAttRd.FOURTHENDTIME = item.T_HR_SHIFTDEFINE.FOURTHENDTIME; entAttRd.FOURTHSTARTTIME = item.T_HR_SHIFTDEFINE.FOURTHSTARTTIME; //查询公共假期设置判断是否只上半天班公共假期 var qVacDay = from ent in entVacDays where ent.STARTDATE == entAttRd.ATTENDANCEDATE select ent; if (qVacDay.Count() > 0) { var set = qVacDay.FirstOrDefault(); if (!string.IsNullOrEmpty(set.ISHALFDAY)) { if (set.ISHALFDAY == "1") { if (set.PEROID == "0")//上午 { string msg = "考勤初始化(新增)-检测到假期设置了休假(半天):" + " 员工:" + entAttRd.EMPLOYEENAME + " 日期:" + entAttRd.ATTENDANCEDATE + " 休假分段(0上午):" + set.PEROID; Tracer.Debug(msg); entAttRd.REMARK = msg; entAttRd.NEEDFRISTATTEND = "0"; //上午不上班 entAttRd.NEEDSECONDATTEND = "1"; //下午上班 } else if (set.PEROID == "1") { string msg = "考勤初始化(新增)-检测到假期设置了休假(半天):" + " 员工:" + entAttRd.EMPLOYEENAME + " 日期:" + entAttRd.ATTENDANCEDATE + " 休假分段(1下午):" + set.PEROID; Tracer.Debug(msg); entAttRd.REMARK = msg; entAttRd.NEEDFRISTATTEND = "1"; //上午上班 entAttRd.NEEDSECONDATTEND = "0"; //下午不上班 } } } } //权限 entAttRd.OWNERCOMPANYID = item_emp.OWNERCOMPANYID; entAttRd.OWNERDEPARTMENTID = item_emp.OWNERDEPARTMENTID; entAttRd.OWNERPOSTID = item_emp.OWNERPOSTID; entAttRd.OWNERID = item_emp.OWNERID; entAttRd.CREATEUSERID = entTemp.CREATEUSERID; entAttRd.CREATEDATE = DateTime.Now; entAttRd.REMARK += entTemp.REMARK; entAttRd.UPDATEUSERID = entTemp.UPDATEUSERID; entAttRd.UPDATEDATE = DateTime.Now; entAttRd.CREATECOMPANYID = entTemp.CREATECOMPANYID; entAttRd.CREATEDEPARTMENTID = entTemp.CREATEDEPARTMENTID; entAttRd.CREATEPOSTID = entTemp.CREATEPOSTID; if (AttendNoCheck) { entAttRd.ATTENDANCESTATE = "1";//免打卡员工 Tracer.Debug("设置为免打孔员工,考勤默认为已出勤," + " 员工姓名" + item_emp.EMPLOYEECNAME + " 考勤初始化日期:" + entAttRd.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + usedAttendSolutionName); } else { entAttRd.ATTENDANCESTATE = string.Empty; //新生成的考勤记录,出勤状态为空 } Tracer.Debug("开始新增员工T_HR_ATTENDANCERECORD记录,日期:" + dtCurDate.ToString("yyyy-MM-dd") + ",员工姓名:" + item_emp.EMPLOYEECNAME + ",初始化考勤状态:" + entAttRd.ATTENDANCESTATE + usedAttendSolutionName); addCount += dal.Add(entAttRd); } else { if (AttendNoCheck) //免打孔 { entUpdate.ATTENDANCESTATE = "1"; //免打卡员工 //非免打卡员工,跳过 Tracer.Debug("设置为免打孔员工,考勤默认为已出勤," + " 员工姓名" + item_emp.EMPLOYEECNAME + " 考勤初始化日期:" + entUpdate.ATTENDANCEDATE.Value.ToString("yyyy-MM-dd") + usedAttendSolutionName); } else { if (!string.IsNullOrEmpty(entUpdate.ATTENDANCESTATE)) { Tracer.Debug("更新考勤初始化记录,已存在的考勤初始化记录状态为: " + entUpdate.ATTENDANCESTATE + " ,跳过不再生成" + ",员工姓名:" + item_emp.EMPLOYEECNAME + ",考勤状态:" + entUpdate.ATTENDANCESTATE + usedAttendSolutionName); continue; //如果存在直接跳过 } entUpdate.ATTENDANCESTATE = string.Empty; //新生成的考勤记录,出勤状态为空 } Tracer.Debug("更新考勤初始化记录,ATTENDANCESTATE考勤状态为空,日期:" + dtCurDate.ToString("yyyy-MM-dd") + ",员工姓名:" + item_emp.EMPLOYEECNAME + ",初始化考勤状态:" + entUpdate.ATTENDANCESTATE + usedAttendSolutionName); entUpdate.ATTENDANCESOLUTIONID = entTemp.T_HR_ATTENDANCESOLUTION.ATTENDANCESOLUTIONID; entUpdate.EMPLOYEEID = item_emp.EMPLOYEEID; entUpdate.EMPLOYEECODE = item_emp.EMPLOYEECODE; entUpdate.EMPLOYEENAME = item_emp.EMPLOYEECNAME; entUpdate.ATTENDANCEDATE = dtCurDate; entUpdate.T_HR_SHIFTDEFINE = item.T_HR_SHIFTDEFINE; //第一段工作时间 entUpdate.FIRSTSTARTTIME = item.T_HR_SHIFTDEFINE.FIRSTSTARTTIME; entUpdate.FIRSTENDTIME = item.T_HR_SHIFTDEFINE.FIRSTENDTIME; //第二段工作时间 entUpdate.SECONDSTARTTIME = item.T_HR_SHIFTDEFINE.SECONDSTARTTIME; entUpdate.SECONDENDTIME = item.T_HR_SHIFTDEFINE.SECONDENDTIME; //第三段工作时间 entUpdate.THIRDSTARTTIME = item.T_HR_SHIFTDEFINE.THIRDSTARTTIME; entUpdate.THIRDENDTIME = item.T_HR_SHIFTDEFINE.THIRDENDTIME; //第四段工作时间 entUpdate.FOURTHENDTIME = item.T_HR_SHIFTDEFINE.FOURTHENDTIME; entUpdate.FOURTHSTARTTIME = item.T_HR_SHIFTDEFINE.FOURTHSTARTTIME; //查询公共假期设置判断是否只上半天班 var qVacDay = from ent in entVacDays where ent.STARTDATE == entUpdate.ATTENDANCEDATE select ent; if (qVacDay.Count() > 0) { var set = qVacDay.FirstOrDefault(); if (!string.IsNullOrEmpty(set.ISHALFDAY)) { if (set.ISHALFDAY == "1") { if (set.PEROID == "0")//上午 { string msg = "考勤初始化(修改)-检测到假期设置了休假(半天):" + " 员工:" + entUpdate.EMPLOYEENAME + " 日期:" + entUpdate.ATTENDANCEDATE + " 上班分段(0上午):" + set.PEROID; Tracer.Debug(msg); entUpdate.REMARK = msg; entUpdate.NEEDFRISTATTEND = "0"; //上午不上班休息 entUpdate.NEEDSECONDATTEND = "1"; //下午上班 } else if (set.PEROID == "1") { string msg = "考勤初始化(修改)-检测到假期设置了休假(半天):" + " 员工:" + entUpdate.EMPLOYEENAME + " 日期:" + entUpdate.ATTENDANCEDATE + " 上班分段(1下午):" + set.PEROID; Tracer.Debug(msg); entUpdate.REMARK = msg; entUpdate.NEEDFRISTATTEND = "1"; //上午上班 entUpdate.NEEDSECONDATTEND = "0"; //下午不上班休息 } } } } //权限 entUpdate.OWNERCOMPANYID = item_emp.OWNERCOMPANYID; entUpdate.OWNERDEPARTMENTID = item_emp.OWNERDEPARTMENTID; entUpdate.OWNERPOSTID = item_emp.OWNERPOSTID; entUpdate.OWNERID = item_emp.OWNERID; entUpdate.REMARK += entTemp.REMARK; entUpdate.UPDATEUSERID = entTemp.UPDATEUSERID; entUpdate.UPDATEDATE = DateTime.Now; updateCount += dal.Update(entUpdate); } } catch (Exception ex) { Tracer.Debug("生成考勤初始化记录出错:" + item_emp.EMPLOYEECNAME + ex.ToString() + usedAttendSolutionName); continue; } #endregion } } //bllLevelDayCount.CalculateEmployeeLevelDayCount(entTemp, item_emp, strOperationType); //int saveCount=dal.SaveContextChanges(); Tracer.Debug(n + "生成员工:" + item_emp.EMPLOYEECNAME + " 考勤记录成功,开始日期" + dtStart.ToString("yyyy-MM-dd") + "结束日期:" + dtInitAttandRecordEndDate.ToString("yyyy-MM-dd") + "共新增考勤记录" + addCount.ToString() + " 更新记录条数:" + updateCount + usedAttendSolutionName); } catch (Exception ex) { Tracer.Debug("生成考勤初始化记录出错:" + entEmployees[n].EMPLOYEECNAME + ex.ToString()); continue; } } Tracer.Debug("生成所有员工考勤记录成功,开始日期" + dtStart.ToString("yyyy-MM-dd") + "结束日期:" + dtInitAttandRecordEndDate.ToString("yyyy-MM-dd")); strRes = "{SAVESUCCESSED}"; } catch (Exception ex) { Tracer.Debug("生成考勤初始化记录出错:" + ex.ToString()); strRes = ex.Message.ToString(); } return(strRes); }
/// <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="strCancelLeaveId">当前销假记录的ID</param> /// <param name="strEmployeeID">员工ID</param> /// <param name="dtLeaveStartTime">销假起始时间</param> /// <param name="dtLeaveEndTime">销假截止时间</param> /// <param name="dLeaveDay">实际销假天数</param> /// <param name="dLeaveTime">实际销假时长</param> /// <param name="dLeaveTotalTime">实际销假合计时长</param> public string GetRealCancelLeaveDayByEmployeeIdAndDate(string strCancelLeaveId, string strEmployeeID, DateTime dtCancelLeaveStartTime, DateTime dtCancelLeaveEndTime, ref decimal dCancelLeaveDay, ref decimal dCancelLeaveTime, ref decimal dCancelLeaveTotalTime) { string strMsg = string.Empty; try { T_HR_EMPLOYEECANCELLEAVE entCancelLeaveRecord = GetEmployeeCancelLeaveByID(strCancelLeaveId); bool flag = false; if (entCancelLeaveRecord != null) { if (entCancelLeaveRecord.STARTDATETIME == dtCancelLeaveStartTime && entCancelLeaveRecord.ENDDATETIME == dtCancelLeaveEndTime) { if (entCancelLeaveRecord.LEAVEDAYS == null) { dCancelLeaveDay = 0; } else { dCancelLeaveDay = entCancelLeaveRecord.LEAVEDAYS.Value; } if (entCancelLeaveRecord.LEAVEHOURS == null) { dCancelLeaveTime = 0; } else { dCancelLeaveTime = entCancelLeaveRecord.LEAVEHOURS.Value; } if (entCancelLeaveRecord.TOTALHOURS == null) { dCancelLeaveTotalTime = 0; } else { dCancelLeaveTotalTime = entCancelLeaveRecord.TOTALHOURS.Value; } flag = true; } } if (flag) { return(strMsg); } DateTime dtStart, dtEnd = new DateTime(); decimal dTotalLeaveDay = 0; //起止时间的时长 DateTime.TryParse(dtCancelLeaveStartTime.ToString("yyyy-MM-dd"), out dtStart); //获取销假起始日期 DateTime.TryParse(dtCancelLeaveEndTime.ToString("yyyy-MM-dd"), out dtEnd); //获取销假截止日期 AttendanceSolutionAsignBLL bllAttendSolAsign = new AttendanceSolutionAsignBLL(); T_HR_ATTENDANCESOLUTIONASIGN entAttendSolAsign = bllAttendSolAsign.GetAttendanceSolutionAsignByEmployeeIDAndDate(strEmployeeID, dtStart); if (entAttendSolAsign == null) { //当前员工没有分配考勤方案,无法提交销假申请 return("{NONEXISTASIGNEDATTENSOL}"); } //获取考勤方案 T_HR_ATTENDANCESOLUTION entAttendSol = entAttendSolAsign.T_HR_ATTENDANCESOLUTION; decimal dWorkTimePerDay = entAttendSol.WORKTIMEPERDAY.Value; decimal dWorkMode = entAttendSol.WORKMODE.Value; int iWorkMode = 0; int.TryParse(dWorkMode.ToString(), out iWorkMode);//获取工作制(工作天数/周) List <int> iWorkDays = new List <int>(); Utility.GetWorkDays(iWorkMode, ref iWorkDays);//获取每周上班天数 OutPlanDaysBLL bllOutPlanDays = new OutPlanDaysBLL(); IQueryable <T_HR_OUTPLANDAYS> entOutPlanDays = bllOutPlanDays.GetOutPlanDaysRdListByEmployeeID(strEmployeeID); string strVacDayType = (Convert.ToInt32(Common.OutPlanDaysType.Vacation) + 1).ToString(); string strWorkDayType = (Convert.ToInt32(Common.OutPlanDaysType.WorkDay) + 1).ToString(); IQueryable <T_HR_OUTPLANDAYS> entVacDays = entOutPlanDays.Where(s => s.DAYTYPE == strVacDayType); //IQueryable<T_HR_OUTPLANDAYS> entWorkDays = entOutPlanDays.Where(s => s.DAYTYPE == strWorkDayType && s.STARTDATE >= dtStart && s.ENDDATE <= dtEnd); // 销假时间要在开始时间和结束时间之间 //注释掉没考虑某一区间的情况 //IQueryable<T_HR_OUTPLANDAYS> entWorkDays = entOutPlanDays.Where(s => s.DAYTYPE == strWorkDayType && s.STARTDATE <= dtStart && s.ENDDATE >= dtEnd); //条件过滤有四种情况 //1:在区间内 //2:大于开始时间且结束时间小于销假结束时间 //3:开始日期大于 销假开始日期且结束日期处于有效期之间 //4:开始日期小于销假开始日期且结束日期在开始时间和结束时间 IQueryable <T_HR_OUTPLANDAYS> entWorkDays = entOutPlanDays.Where(s => s.DAYTYPE == strWorkDayType && ((s.STARTDATE <= dtStart && s.ENDDATE >= dtEnd) || (s.STARTDATE >= dtStart && s.ENDDATE <= dtEnd) || (s.STARTDATE >= dtStart && s.STARTDATE <= dtEnd && s.ENDDATE >= dtEnd) || (s.STARTDATE <= dtStart && s.ENDDATE >= dtStart && s.ENDDATE <= dtEnd))); SchedulingTemplateDetailBLL bllTemplateDetail = new SchedulingTemplateDetailBLL(); IQueryable <T_HR_SCHEDULINGTEMPLATEDETAIL> entTemplateDetails = bllTemplateDetail.GetTemplateDetailRdListByAttendanceSolutionId(entAttendSol.ATTENDANCESOLUTIONID); T_HR_SCHEDULINGTEMPLATEMASTER entTemplateMaster = entTemplateDetails.FirstOrDefault().T_HR_SCHEDULINGTEMPLATEMASTER; TimeSpan ts = dtEnd.Subtract(dtStart); decimal dVacDay = 0, dWorkDay = 0; decimal dLeaveFirstDayTime = 0, dLeaveLastDayTime = 0, dLeaveFirstLastTime = 0;//请假第一天的时长,请假最后一天的时长,请假首尾两天合计时长 if (dtCancelLeaveStartTime != dtCancelLeaveEndTime) { EmployeeLeaveRecordBLL bllLeaveRecord = new EmployeeLeaveRecordBLL(); bllLeaveRecord.CalculateNonWholeDayLeaveTime(dtCancelLeaveStartTime, dtStart, entTemplateMaster, entTemplateDetails, entVacDays, entWorkDays, iWorkDays, "S", ref dLeaveFirstDayTime); bllLeaveRecord.CalculateNonWholeDayLeaveTime(dtCancelLeaveEndTime, dtEnd, entTemplateMaster, entTemplateDetails, entVacDays, entWorkDays, iWorkDays, "E", ref dLeaveLastDayTime); dLeaveFirstLastTime = dLeaveFirstDayTime + dLeaveLastDayTime; if (dtStart == dtEnd) { dLeaveFirstLastTime = dLeaveFirstLastTime - dWorkTimePerDay * 60; } } else { dLeaveFirstLastTime = dWorkTimePerDay * 60; } dTotalLeaveDay = ts.Days; if (ts.Days > 0) { //取得总的请假天数(此天数扣除了首尾两天的时间,根据请假的情况,可能包含了公休假及周假天数,扣除首尾两天的计算只适合请三天以上的) int iDays = ts.Days - 1; dTotalLeaveDay = iDays; for (int i = 0; i < iDays; i++) { int j = i + 1; bool isVacDay = false; DateTime dtCurDate = dtStart.AddDays(j); if (iWorkDays.Contains(Convert.ToInt32(dtCurDate.DayOfWeek)) == false) { dVacDay += 1; } if (entVacDays.Count() > 0) { foreach (T_HR_OUTPLANDAYS item_Vac in entVacDays) { if (item_Vac.STARTDATE.Value <= dtCurDate && item_Vac.ENDDATE >= dtCurDate) { isVacDay = true; break; } } } if (isVacDay) { dVacDay += 1; } if (entWorkDays.Count() > 0) { foreach (T_HR_OUTPLANDAYS item_Work in entWorkDays) { if (item_Work.STARTDATE.Value <= dtCurDate && item_Work.ENDDATE >= dtCurDate) { dWorkDay += 1; break; } } } } } dCancelLeaveDay = dTotalLeaveDay - dVacDay + dWorkDay; //请假天数 = 请假天数-首尾两天 - 总休假天数 + 休假调剂工作天数 decimal dTempTime = decimal.Round((dLeaveFirstLastTime) / 60, 1); if (dTempTime >= dWorkTimePerDay) { decimal dTempDay = decimal.Round(dTempTime / dWorkTimePerDay, 2); string[] strList = dTempDay.ToString().Split('.'); if (strList.Length == 2) { dCancelLeaveDay += decimal.Parse(strList[0].ToString()); dCancelLeaveTime = dTempTime - dWorkTimePerDay * decimal.Parse(strList[0].ToString()); } else { dCancelLeaveDay += dTempDay; } } else if (dTempTime < dWorkTimePerDay) { dCancelLeaveTime = dTempTime; } dCancelLeaveTotalTime = dCancelLeaveDay * dWorkTimePerDay + dCancelLeaveTime; } catch (Exception ex) { strMsg = ex.Message; Utility.SaveLog(ex.ToString()); } return(strMsg); }
/// <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); }