zoukankan      html  css  js  c++  java
  • 考勤系统之计算工作小时数

    /// <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;
            }
  • 相关阅读:
    springboot: 使web项目支持jsp
    springboot: 集成freemark模板引擎
    Springboot的优点和实现
    Spring的两种动态代理:Jdk和Cglib 的区别和实现
    JAVA单例模式:懒汉式,饿汉式
    java的内存管理 对象的分配与释放
    JAVA反射调用方法
    JAVA内置注解 基本注解
    图——图的定义与操作
    树——二叉树的线索化
  • 原文地址:https://www.cnblogs.com/dongh/p/6603887.html
Copyright © 2011-2022 走看看