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

绝对原创,判断条件比较多,考虑到午休情况,喜欢的请拿走。。。

复制代码
        /// <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 @   黑 瞳  阅读(2195)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示