考勤系统之计算工作小时数

/// <summary>
        /// 计算今天有效工作小时数
        /// </summary>
        public static Decimal GetWorkHour(CheckOnModel todayCheckOn)
        {
            //计算今天有效工作小时数
            //正常情况上下班 早上早与9:00 下班晚于18:00

            DateTime amTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 09:01");
            DateTime pmTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 18:00");

            DateTime noonBreakStartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 12:30");
            DateTime noonBreakEndTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 13:30");


            CheckOnModel copyCheckOn = CheckOnModel.DeepCopy(todayCheckOn);

            //扣除一个小时午休
            bool subtractOneHour = true;
            //早于9:05分上班 上班打卡时间从9点起算
            if (todayCheckOn.OnDutyTime.Value <= amTime)
            {
                copyCheckOn.OnDutyTime = amTime.AddMinutes(-1);
            }
            //在午休时间上班 从午休结束时开始算
            if (todayCheckOn.OnDutyTime.Value >= noonBreakStartTime && todayCheckOn.OnDutyTime.Value <= noonBreakEndTime)
            {
                copyCheckOn.OnDutyTime = noonBreakEndTime;
                subtractOneHour = false;//不再扣除午休时间
            }

            //从午休结束后开始上班
            if (todayCheckOn.OnDutyTime.Value >= noonBreakEndTime)
            {
                subtractOneHour = false;//不再扣除午休时间
            }

            //下班打卡时间从18点起算
            if (todayCheckOn.OffDutyTime.Value >= pmTime)
            {
                copyCheckOn.OffDutyTime = pmTime;
            }
            //下班时间介于午休时间
            if (copyCheckOn.OffDutyTime.Value >= noonBreakStartTime && copyCheckOn.OffDutyTime.Value < noonBreakEndTime)
            {
                copyCheckOn.OffDutyTime = noonBreakStartTime;
                subtractOneHour = false;//不再扣除午休时间
            }
            //下班时间早于午休时间
            if (copyCheckOn.OffDutyTime.Value < noonBreakStartTime)
            {
                subtractOneHour = false;//不再扣除午休时间
            }

            if (subtractOneHour)
            {
                copyCheckOn.WorkHour = Convert.ToDecimal((copyCheckOn.OffDutyTime.Value - copyCheckOn.OnDutyTime.Value).TotalHours - 1);
            }
            else
            {
                copyCheckOn.WorkHour = Convert.ToDecimal((copyCheckOn.OffDutyTime.Value - copyCheckOn.OnDutyTime.Value).TotalHours);
            }
            //午休时间打卡走人的,可能为负数
            if (copyCheckOn.WorkHour < 0)
            {
                copyCheckOn.WorkHour = 0;
            }

            //补签成功的 视为正常打卡 但要减去扣除小时数
            if (copyCheckOn.Status == "Y" && copyCheckOn.EditMan != new Guid())
            {
                copyCheckOn.WorkHour = 8 - copyCheckOn.SubtractHour;
            }

            return copyCheckOn.WorkHour;
        }

 

posted @ 2017-03-23 10:44  你也很优秀  阅读(1635)  评论(0编辑  收藏  举报