Esempio n. 1
0
        /// <summary>
        /// 周文斌添加
        /// 获取一个时间段内的考勤方案,
        /// 例如:员工请假从5月10-8月30日
        /// 这里跨越了5,6,7,8三个月的考勤时间段
        /// StartToEndDate的格式为:StartDate|EndDate; yyyy-MM-dd|yyyy-MM-dd
        ///
        /// </summary>
        /// <param name="EmployeeID"></param>
        /// <param name="StartToEndDate"></param>
        /// <returns></returns>
        public List <T_HR_ATTENDANCESOLUTION> GetAttendenceSolutionByEmployeeIDAndStartDateAndEndDate(string EmployeeID, List <string> StartToEndDate)
        {
            List <T_HR_ATTENDANCESOLUTION> solutionList = new List <T_HR_ATTENDANCESOLUTION>();

            foreach (string str in StartToEndDate)
            {
                DateTime StartDate = Convert.ToDateTime(str.Split('|')[0]);
                DateTime EndDate   = Convert.ToDateTime(str.Split('|')[1]);

                AttendanceSolutionDAL   dalAttendanceSolution = new AttendanceSolutionDAL();
                T_HR_ATTENDANCESOLUTION entAttSol             = dalAttendanceSolution.GetAttendanceSolutionByEmployeeIDAndDate(EmployeeID, StartDate, EndDate);

                if (entAttSol != null)
                {
                    solutionList.Add(entAttSol);
                }
                else
                {
                    StartDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-01"));
                    AttendanceSolutionAsignBLL   bllAttSolAsign = new AttendanceSolutionAsignBLL();
                    T_HR_ATTENDANCESOLUTIONASIGN entAttSolAsign = bllAttSolAsign.GetAttendanceSolutionAsignByEmployeeIDAndDate(EmployeeID, StartDate);
                    solutionList.Add(entAttSolAsign.T_HR_ATTENDANCESOLUTION);
                }
            }
            return(solutionList);
        }
Esempio n. 2
0
        /// <summary>
        /// 根据考勤初始化记录获取考勤方案,获取不到则获取员工最新分配的考勤方案
        /// </summary>
        /// <param name="strEmployeeID">员工ID</param>
        /// <param name="dtStart">考勤记录参考起始日期</param>
        /// <param name="dtEnd">考勤记录参考截止日期</param>
        /// <returns></returns>
        public T_HR_ATTENDANCESOLUTION GetAttendanceSolutionByEmployeeIDAndDate(string strEmployeeID, DateTime dtStart, DateTime dtEnd)
        {
            if (string.IsNullOrEmpty(strEmployeeID))
            {
                return(null);
            }

            AttendanceSolutionDAL   dalAttendanceSolution = new AttendanceSolutionDAL();
            T_HR_ATTENDANCESOLUTION entAttSol             = dalAttendanceSolution.GetAttendanceSolutionByEmployeeIDAndDate(strEmployeeID, dtStart, dtEnd);

            if (entAttSol == null)
            {
                dtStart = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-01"));
                AttendanceSolutionAsignBLL   bllAttSolAsign = new AttendanceSolutionAsignBLL();
                T_HR_ATTENDANCESOLUTIONASIGN entAttSolAsign = bllAttSolAsign.GetAttendanceSolutionAsignByEmployeeIDAndDate(strEmployeeID, dtStart);

                if (entAttSolAsign == null)
                {
                    return(null);
                }

                return(entAttSolAsign.T_HR_ATTENDANCESOLUTION);
            }

            return(entAttSol);
        }
Esempio n. 3
0
        private T_HR_ATTENDANCESOLUTION GetAttendanceSolution(string employeeid, DateTime?dtOTStartDate)
        {
            if (dtOTStartDate == null || string.IsNullOrWhiteSpace(employeeid))
            {
                return(null);
            }

            AttendanceSolutionAsignBLL   bllAttSolAsign = new AttendanceSolutionAsignBLL();
            T_HR_ATTENDANCESOLUTIONASIGN entAttSolAsign = bllAttSolAsign.GetAttendanceSolutionAsignByEmployeeIDAndDate(employeeid, dtOTStartDate.Value);

            if (entAttSolAsign == null)
            {
                return(null);
            }

            return(entAttSolAsign.T_HR_ATTENDANCESOLUTION);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        public string OutApplySetValue(string msg, T_HR_OUTAPPLYCONFIRM entity)
        {
            if (!entity.T_HR_OUTAPPLYRECORDReference.IsLoaded)
            {
                entity.T_HR_OUTAPPLYRECORDReference.Load();
            }

            #region 非当天往返或者实际返回未打卡,设置外出结束时间为当天下班时间
            if (entity.T_HR_OUTAPPLYRECORD.ISSAMEDAYRETURN == "0" ||
                entity.ENDDATE == new DateTime(2001, 1, 1))   //
            {
                if (GetAttendanceSolution(entity.EMPLOYEEID, entity.T_HR_OUTAPPLYRECORD.STARTDATE) == null)
                {
                    return("未获取到用户的考勤方案,保存失败");
                }

                AttendanceSolutionAsignBLL   bllAttendSolAsign = new AttendanceSolutionAsignBLL();
                T_HR_ATTENDANCESOLUTIONASIGN entAttendSolAsign = bllAttendSolAsign.GetAttendanceSolutionAsignByEmployeeIDAndDate(entity.EMPLOYEEID, entity.T_HR_OUTAPPLYRECORD.STARTDATE.Value);

                if (entAttendSolAsign.T_HR_ATTENDANCESOLUTION == null)
                {
                    //当前员工没有分配考勤方案,无法提交外出申请
                    msg = msg + "当前员工没有分配考勤方案,无法提交外出申请";
                    Tracer.Debug(msg);
                    return(msg);
                }
                else
                {
                    var entAttendSol = entAttendSolAsign.T_HR_ATTENDANCESOLUTION;

                    var tempMaster = from ent in dal.GetObjects <T_HR_SCHEDULINGTEMPLATEMASTER>()
                                     where ent.TEMPLATEMASTERID == entAttendSol.T_HR_SCHEDULINGTEMPLATEMASTER.TEMPLATEMASTERID
                                     select ent;

                    if (!entAttendSol.T_HR_SCHEDULINGTEMPLATEMASTERReference.IsLoaded)
                    {
                        entAttendSol.T_HR_SCHEDULINGTEMPLATEMASTERReference.Load();
                    }

                    var entsched = from a in dal.GetObjects <T_HR_SCHEDULINGTEMPLATEMASTER>()
                                   join b in dal.GetObjects <T_HR_SCHEDULINGTEMPLATEDETAIL>()
                                   on a.TEMPLATEMASTERID equals b.T_HR_SCHEDULINGTEMPLATEMASTER.TEMPLATEMASTERID
                                   join c in dal.GetObjects <T_HR_SHIFTDEFINE>()
                                   on b.T_HR_SHIFTDEFINE.SHIFTDEFINEID equals c.SHIFTDEFINEID
                                   where a.TEMPLATEMASTERID == entAttendSol.T_HR_SCHEDULINGTEMPLATEMASTER.TEMPLATEMASTERID
                                   select c;
                    if (entsched.Count() > 0)
                    {
                        var      defineTime          = entsched.FirstOrDefault();
                        DateTime ShiftFirstStartTime = new DateTime();
                        if (defineTime.NEEDTHIRDOFFCARD == "2" && !string.IsNullOrEmpty(defineTime.THIRDENDTIME))
                        {
                            ShiftFirstStartTime = DateTime.Parse(defineTime.THIRDENDTIME);//设置3段打卡,第2段下班打卡时间:一般为17:50
                        }
                        else if (defineTime.NEEDSECONDOFFCARD == "2" && !string.IsNullOrEmpty(defineTime.SECONDENDTIME))
                        {
                            ShiftFirstStartTime = DateTime.Parse(defineTime.SECONDENDTIME);//设置2段打卡,第2段下班打卡时间:一般为17:50
                        }
                        else
                        {
                            msg = msg + "外出申请班次定义设置错误,没有找到下班时间定义" + " 考勤方案名:" + entAttendSolAsign.T_HR_ATTENDANCESOLUTION.ATTENDANCESOLUTIONNAME;
                            Tracer.Debug(msg);
                            return(msg);
                        }
                        DateTime dtstar = entity.T_HR_OUTAPPLYRECORD.STARTDATE.Value;
                        DateTime ShiftstartDateAndTime = new DateTime(dtstar.Year, dtstar.Month, dtstar.Day
                                                                      , ShiftFirstStartTime.Hour, ShiftFirstStartTime.Minute, ShiftFirstStartTime.Second);
                        if (entity.ENDDATE == new DateTime(2001, 1, 1))//实际出发时间选择为未打卡不计算外出时长
                        {
                            entity.ENDDATE = ShiftstartDateAndTime;
                        }
                    }
                    else
                    {
                        msg = msg + "外出申请班次定义未找到" + " 考勤方案名:" + entAttendSolAsign.T_HR_ATTENDANCESOLUTION.ATTENDANCESOLUTIONNAME;
                        Tracer.Debug(msg);
                        return(msg);
                    }
                }

                if (entity.ENDDATE == null)
                {
                    msg = msg + "外出申请为非当天往返,但是结束时间未找到,请检查考勤方案排版设置是否正确。" + " 考勤方案名:" + entAttendSolAsign.T_HR_ATTENDANCESOLUTION.ATTENDANCESOLUTIONNAME;
                    Tracer.Debug(msg);
                    return(msg);
                }
            }
            #endregion

            #region 计算外出时长
            string strMsg = string.Empty;
            //
            string dTotalHours = string.Empty;
            if (entity.STARTDATE == new DateTime(2001, 1, 1))//实际出发时间选择为未打卡不计算外出时长
            {
                entity.OUTAPLLYTIMES = "外出确认实际出发时间未打卡";
            }
            else
            {
                strMsg = CalculateOverTimeHours(entity.EMPLOYEEID, entity.STARTDATE.Value, entity.ENDDATE.Value, ref dTotalHours);

                entity.OUTAPLLYTIMES = dTotalHours.ToString();
            }
            #endregion
            return(strMsg);
        }
Esempio n. 6
0
        /// <summary>
        /// 重新初始化考勤记录,强制删除未提交签卡记录,异常考勤,考勤记录,重新初始化考勤
        /// </summary>
        /// <param name="objType"></param>
        /// <param name="objId"></param>
        /// <param name="dtStar"></param>
        /// <param name="dtEnd"></param>
        /// <param name="DealType">0处理免打卡人员,1处理打卡人员,2处理所有</param>
        /// <returns></returns>
        public string CompulsoryInitialization(string objType, string objId, DateTime dtStar, DateTime dtEnd, string DealType)
        {
            string strMsg = string.Empty;

            try
            {
                //List<T_HR_EMPLOYEE> employees = new List<T_HR_EMPLOYEE>();
                EmployeeBLL empbll             = new EmployeeBLL();
                AttendanceSolutionAsignBLL bll = new AttendanceSolutionAsignBLL();

                switch (objType)
                {
                case "0":
                    var employees = from ent in dal.GetObjects <T_HR_EMPLOYEE>()
                                    join ep in dal.GetObjects <T_HR_EMPLOYEEPOST>() on ent.EMPLOYEEID equals ep.T_HR_EMPLOYEE.EMPLOYEEID
                                    join p in dal.GetObjects <T_HR_POST>() on ep.T_HR_POST.POSTID equals p.POSTID
                                    where ep.ISAGENCY == "0" && //主岗位
                                    ep.EDITSTATE == "1" &&    //生效中
                                    ep.CHECKSTATE == "2" &&    //审核通过
                                    p.COMPANYID == objId
                                    select ent;

                    if (employees.Count() > 0)
                    {
                        foreach (var emp in employees)
                        {
                            T_HR_ATTENDANCESOLUTIONASIGN entAttendanceSolution = bll.GetAttendanceSolutionAsignByEmployeeIDAndDate(emp.EMPLOYEEID, dtStar);

                            if (DealType == "0")                                                                                                                     //如果是处理需要打卡人员的记录,跳过免打卡记录员工
                            {
                                if (entAttendanceSolution.T_HR_ATTENDANCESOLUTION.ATTENDANCETYPE != (Convert.ToInt32(Common.AttendanceType.NoCheck) + 1).ToString()) //
                                {
                                    Tracer.Debug("" + emp.EMPLOYEECNAME + entAttendanceSolution.T_HR_ATTENDANCESOLUTION.ATTENDANCESOLUTIONNAME
                                                 + "," + entAttendanceSolution.T_HR_ATTENDANCESOLUTION.ATTENDANCETYPE);
                                    continue;
                                }
                            }
                            else if (DealType == "1")                                                                                                                //如果是处理免打卡人员的记录,跳过打卡人员
                            {
                                if (entAttendanceSolution.T_HR_ATTENDANCESOLUTION.ATTENDANCETYPE == (Convert.ToInt32(Common.AttendanceType.NoCheck) + 1).ToString()) //
                                {
                                    Tracer.Debug("" + emp.EMPLOYEECNAME + entAttendanceSolution.T_HR_ATTENDANCESOLUTION.ATTENDANCESOLUTIONNAME
                                                 + "," + entAttendanceSolution.T_HR_ATTENDANCESOLUTION.ATTENDANCETYPE);

                                    continue;
                                }
                            }
                            else
                            {
                            }
                            strMsg = "开始强制删除考勤初始化记录,员工姓名:" + emp.EMPLOYEECNAME;
                            var q = from ent in dal.GetObjects <T_HR_ATTENDANCERECORD>()
                                    where ent.EMPLOYEEID == emp.EMPLOYEEID &&
                                    ent.ATTENDANCEDATE >= dtStar &&
                                    ent.ATTENDANCEDATE <= dtEnd
                                    select ent;
                            if (q.Count() > 0)
                            {
                                List <T_HR_ATTENDANCERECORD> attlist = q.ToList();
                                RemoveWrongSignRds(attlist);
                                foreach (var att in attlist)
                                {
                                    dal.Delete(att);
                                    strMsg += "强制删除考勤初始化记录,员工姓名:" + att.EMPLOYEENAME
                                              + " 考勤日期:" + att.ATTENDANCEDATE.ToString()
                                              + " 考勤状态:" + att.ATTENDANCESTATE;

                                    Tracer.Debug("强制删除考勤初始化记录,员工姓名:" + att.EMPLOYEENAME
                                                 + " 考勤日期:" + att.ATTENDANCEDATE.ToString()
                                                 + " 考勤状态:" + att.ATTENDANCESTATE);
                                }
                            }

                            bll.AsignAttendanceSolutionForEmployeeByDate(emp, dtStar);
                            strMsg += "强制删除考勤初始化记录,初始化考勤记录成功!,员工姓名:" + emp.EMPLOYEECNAME;
                            Tracer.Debug("强制删除考勤初始化记录,初始化考勤记录成功!,员工姓名:" + emp.EMPLOYEECNAME);
                        }
                    }
                    ;
                    break;

                case "4":
                    //employees.Add(empbll.GetEmployeeByID(objId));
                    break;
                }
            }
            catch (Exception ex)
            {
                Tracer.Debug(ex.ToString());
            }

            return(strMsg);
        }
Esempio n. 7
0
        /// <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);
        }