请假模块申请算法(3)

1、请假模块申请


2、工作日设置


3、工作时间设置(开始时间、截止时间、上午上班时间、上午下班时间、下午上班时间和下午下班时间)

4、请假实体类

     请假表

    [Table("KTD_Leaves", "LeaveID")]
   public class Leaves: BaseEntity
   {
      private string leaveID = string.Empty;
      [PrimaryKey(PrimaryKeyType.Assign,"LeaveID", DbType.String)]
      public string LeaveID
      {
         get{ return leaveID; }
         set{ leaveID = value; }
      }
      /// <summary>
      /// 请假类型
      /// </summary>
      private string leaveType = string.Empty;
      [Colum("LeaveType")]
      public string LeaveType
      {
          get { return leaveType; }
          set { leaveType = value; }
      }
       /// <summary>
       /// 请假人
       /// </summary>
      private string leaveUserID = string.Empty;
      [Colum("LeaveUserID")]
      public string LeaveUserID
      {
         get{ return leaveUserID; }
         set{ leaveUserID = value; }
      }
       /// <summary>
       /// 开始时间
       /// </summary>
      private DateTime? startTime = null;
      [Colum("StartTime", DbType.DateTime)]
      public DateTime? StartTime
      {
         get{ return startTime; }
         set{ startTime = value; }
      }
       /// <summary>
       /// 截止时间
       /// </summary>
      private DateTime? endTime = null;
      [Colum("EndTime", DbType.DateTime)]
      public DateTime? EndTime
      {
         get{ return endTime; }
         set{ endTime = value; }
      }


       /// <summary>
       /// 请假原由
       /// </summary>
      private string reasonTxt = string.Empty;
      [Colum("ReasonTxt")]
      public string ReasonTxt
      {
         get{ return reasonTxt; }
         set{ reasonTxt = value; }
      }
      /// <summary>
      /// 
      /// </summary>
      private double allDay = 0;
      [Colum("AllDay",DbType.Double)]
      public double AllDay
      {
          get { return allDay; }
          set { allDay = value; }
      }


      /// <summary>
      /// 详细
      /// </summary>
      private string leaveEx = string.Empty;
      [Colum("LeaveEx")]
      public string LeaveEx
      {
          get { return leaveEx; }
          set { leaveEx = value; }
      }


       /// <summary>
       /// 操作人员
       /// </summary>
      private string userID = string.Empty;
      [Colum("UserID")]
      public string UserID
      {
          get { return userID; }
          set { userID = value; }
      }
       /// <summary>
       /// 创建时间
       /// </summary>
      private DateTime? createDate = DateTime.Now;
      [Colum("CreateDate", DbType.DateTime)]
      public DateTime? CreateDate
      {
         get{ return createDate; }
         set{ createDate = value; }
      }
   }

    请假类型

    [Table("KTD_LeaveTypes", "LeaveTypeID")]
    public class LeaveTypes : BaseEntity
   {
       private string leaveTypeID = string.Empty;
      [PrimaryKey(PrimaryKeyType.Assign, "LeaveTypeID", DbType.String)]
      public string LeaveTypeID
      {
          get { return leaveTypeID; }
          set { leaveTypeID = value; }
      }
      /// <summary>
      /// 请假类型
      /// </summary>
      private string leaveTypeName = string.Empty;
      [Colum("LeaveTypeName")]
      public string LeaveTypeName
      {
          get { return leaveTypeName; }
          set { leaveTypeName = value; }
      }
       /// <summary>
       /// 状态
       /// </summary>
      private bool state = false;
      [Colum("State", DbType.Boolean)]
      public bool State
      {
          get { return state; }
          set { state = value; }
      }
       /// <summary>
       /// 是否工作日计算
       /// </summary>
      private bool isWorkDay = false;
      [Colum("IsWorkDay", DbType.Boolean)]
      public bool IsWorkDay
      {
          get { return isWorkDay; }
          set { isWorkDay = value; }
      }
      
   }

5、请假具体算法

      /// <summary>
      /// 请假不在同一天(小时)-开始时间
      /// </summary>
      /// <param name="t1"></param>
      /// <param name="wt"></param>
      /// <returns></returns>
      public double GetSameDayTimeFirstDate(DateTime t1, WorkTimes wt)
      {
          double dayHoule = 0;

          DateTime s1 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.AMStartTime);//8:30
          DateTime e1 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.AMEndTime);//11:30
          DateTime s2 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.PMStartTime);//13:00
          DateTime e2 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.PMEndTime);//16:30

          TimeSpan sts33 = new TimeSpan(e1.Ticks);
          TimeSpan ets33 = new TimeSpan(s2.Ticks);
          TimeSpan interval33 = ets33.Subtract(sts33);

          TimeSpan sts22 = new TimeSpan(s1.Ticks);
          TimeSpan ets22 = new TimeSpan(e2.Ticks);
          TimeSpan interval22 = ets22.Subtract(sts22);

          double dayAllHoule = interval22.TotalHours - interval33.TotalHours;

          if (t1 < s1)
          {
              t1 = s1;
          }

          if (t1 < e2)
          {
              if (t1 <= e1) //上午
              {
                  TimeSpan sts3 = new TimeSpan(e1.Ticks);
                  TimeSpan ets3 = new TimeSpan(s2.Ticks);
                  TimeSpan interval3 = ets3.Subtract(sts3);

                  TimeSpan sts2 = new TimeSpan(t1.Ticks);
                  TimeSpan ets2 = new TimeSpan(e2.Ticks);
                  TimeSpan interval2 = ets2.Subtract(sts2);
                  dayHoule = interval2.TotalHours - interval3.TotalHours;
              }
              else if (t1 >= s2 && t1 <= e2)  //下午
              {
                  TimeSpan sts2 = new TimeSpan(t1.Ticks);
                  TimeSpan ets2 = new TimeSpan(e2.Ticks);
                  TimeSpan interval2 = ets2.Subtract(sts2);
                  dayHoule = interval2.TotalHours;
              }
              else
              {
                  TimeSpan sts3 = new TimeSpan(t1.Ticks);
                  TimeSpan ets3 = new TimeSpan(s2.Ticks);
                  TimeSpan interval3 = ets3.Subtract(sts3);

                  TimeSpan sts2 = new TimeSpan(t1.Ticks);
                  TimeSpan ets2 = new TimeSpan(e2.Ticks);
                  TimeSpan interval2 = ets2.Subtract(sts2);
                  dayHoule = interval2.TotalHours - interval3.TotalHours;
              }
          }
          else
          {
              dayHoule = 0;
          }

          if (dayHoule == dayAllHoule)
          {
              return 1;
          }
          else
          {
              return dayHoule * 0.1;
          }
      }


      /// <summary>
      /// 请假不在同一天(小时转天)-截止时间
      /// </summary>
      /// <param name="t2"></param>
      /// <param name="wt"></param>
      /// <returns></returns>
      public double GetSameDayTimeEndDate(DateTime t2, WorkTimes wt)
      {
          double dayHoule = 0;

          DateTime s1 = Convert.ToDateTime(t2.Date.ToString("yyyy-MM-dd") + " " + wt.AMStartTime);//8:30
          DateTime e1 = Convert.ToDateTime(t2.Date.ToString("yyyy-MM-dd") + " " + wt.AMEndTime);//11:30
          DateTime s2 = Convert.ToDateTime(t2.Date.ToString("yyyy-MM-dd") + " " + wt.PMStartTime);//13:00
          DateTime e2 = Convert.ToDateTime(t2.Date.ToString("yyyy-MM-dd") + " " + wt.PMEndTime);//16:30

          TimeSpan sts33 = new TimeSpan(e1.Ticks);
          TimeSpan ets33 = new TimeSpan(s2.Ticks);
          TimeSpan interval33 = ets33.Subtract(sts33);

          TimeSpan sts22 = new TimeSpan(s1.Ticks);
          TimeSpan ets22 = new TimeSpan(e2.Ticks);
          TimeSpan interval22 = ets22.Subtract(sts22);

          double dayAllHoule = interval22.TotalHours - interval33.TotalHours;

          if (t2 > e2)
          {
              t2 = e2;
          }

          if (t2 > s1)
          {
              if (t2 > s1 && t2 <= e1) //上午
              {
                  TimeSpan sts2 = new TimeSpan(s1.Ticks);
                  TimeSpan ets2 = new TimeSpan(t2.Ticks);
                  TimeSpan interval2 = ets2.Subtract(sts2);
                  dayHoule = interval2.TotalHours;
              }
              else if (t2 > s2) //下午
              {
                  TimeSpan sts3 = new TimeSpan(e1.Ticks);
                  TimeSpan ets3 = new TimeSpan(s2.Ticks);
                  TimeSpan interval3 = ets3.Subtract(sts3);

                  TimeSpan sts2 = new TimeSpan(s1.Ticks);
                  TimeSpan ets2 = new TimeSpan(t2.Ticks);
                  TimeSpan interval2 = ets2.Subtract(sts2);
                  dayHoule = interval2.TotalHours - interval3.TotalHours;
              }
              else //中午
              {
                  TimeSpan sts2 = new TimeSpan(s1.Ticks);
                  TimeSpan ets2 = new TimeSpan(e1.Ticks);
                  TimeSpan interval2 = ets2.Subtract(sts2);
                  dayHoule = interval2.TotalHours;
              }
          }
          else
          {
              dayHoule = 0;
          }

          if (dayHoule == dayAllHoule)
          {
              return 1;
          }
          else
          {
              return dayHoule * 0.1;
          }
      }

      /// <summary>
      /// 请假在同一天(小时转天)
      /// </summary>
      /// <param name="t1"></param>
      /// <param name="t2"></param>
      /// <param name="wt"></param>
      /// <returns></returns>
      public double GetSameDayTimeDate(DateTime t1, DateTime t2, WorkTimes wt)
      {
          double dayHoule = 0;

          DateTime s1 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.AMStartTime);//8:30
          DateTime e1 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.AMEndTime);//11:30
          DateTime s2 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.PMStartTime);//13:00
          DateTime e2 = Convert.ToDateTime(t1.Date.ToString("yyyy-MM-dd") + " " + wt.PMEndTime);//16:30

          TimeSpan sts33 = new TimeSpan(e1.Ticks);
          TimeSpan ets33 = new TimeSpan(s2.Ticks);
          TimeSpan interval33 = ets33.Subtract(sts33);

          TimeSpan sts22 = new TimeSpan(s1.Ticks);
          TimeSpan ets22 = new TimeSpan(e2.Ticks);
          TimeSpan interval22 = ets22.Subtract(sts22);
          double dayAllHoule = interval22.TotalHours - interval33.TotalHours;

          if (t1 < s1)
          {
              t1 = s1;
          }

          if (t2 > e2)
          {
              t2 = e2;
          }

          if (t2 <= e1)  //上午
          {
              TimeSpan sts2 = new TimeSpan(t1.Ticks);
              TimeSpan ets2 = new TimeSpan(t2.Ticks);
              TimeSpan interval2 = ets2.Subtract(sts2);
              dayHoule = interval2.TotalHours;
          }
          else if (t1 >= s2) //下午
          {
              TimeSpan sts2 = new TimeSpan(t1.Ticks);
              TimeSpan ets2 = new TimeSpan(t2.Ticks);
              TimeSpan interval2 = ets2.Subtract(sts2);
              dayHoule = interval2.TotalHours;
          }
          else if (t1 >= e1 && t1 < s2) //中午
          {
              TimeSpan sts2 = new TimeSpan(s2.Ticks);
              TimeSpan ets2 = new TimeSpan(t2.Ticks);
              TimeSpan interval2 = ets2.Subtract(sts2);
              dayHoule = interval2.TotalHours;
          }
          else
          {
              TimeSpan sts3 = new TimeSpan(e1.Ticks);
              TimeSpan ets3 = new TimeSpan(s2.Ticks);
              TimeSpan interval3 = ets3.Subtract(sts3);

              TimeSpan sts2 = new TimeSpan(t1.Ticks);
              TimeSpan ets2 = new TimeSpan(t2.Ticks);
              TimeSpan interval2 = ets2.Subtract(sts2);
              dayHoule = interval2.TotalHours - interval3.TotalHours;
          }

          if (dayHoule == dayAllHoule)
          {
              return 1;
          }
          else
          {
              return dayHoule * 0.1;
          }
      }

     public List<LeaveDateTimes> GetWorkTimeOfTwoDay(Trans t, DateTime t1, DateTime t2, string leaveID)
      {
          List<LeaveDateTimes> list = new List<LeaveDateTimes>();

          DateTime? sD = null;
          DateTime? eD = null;
          DateTime? tmp = null;

          if (t1.CompareTo(t2) > 0)
          {
              tmp = t1;
              t1 = t2;
              t2 = tmp.Value;
          }
          sD = t1.AddDays(1).Date;
          eD = t2.Date.AddMilliseconds(-1);
          double days = 0;
          while (sD < eD)
          {
              if (IsWorkDate(t, sD.Value))
              {
                  WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t1);
                  LeaveDateTimes item = new LeaveDateTimes();
                  item.LeaveID = leaveID;
                  item.LeaveDate = sD.Value;
                  item.LeaveDay = 1;
                  item.LeaveHour = 0;
                  item.WorkTime = wt.WorkHour;
                  list.Add(item);
              }
              sD = sD.Value.AddDays(1);
          }
          if (t1.Date != t2.Date)
          {
              if (IsWorkDate(t, t1))
              {
                  WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t1);
                  days = (new WorkTimesBLL()).GetSameDayTimeFirstDate(t1, wt);
                  LeaveDateTimes item = new LeaveDateTimes();
                  item.LeaveID = leaveID;
                  item.LeaveDate = t1.Date;
                  item.LeaveDay = days < 1 ? days / wt.WorkHour : 1;
                  item.LeaveHour = days < 1 ? days : 0;
                  item.WorkTime = wt.WorkHour;
                  list.Add(item);
              }

              if (IsWorkDate(t, t2))
              {
                  WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t2);
                  days = (new WorkTimesBLL()).GetSameDayTimeEndDate(t2, wt);
                  LeaveDateTimes item = new LeaveDateTimes();
                  item.LeaveID = leaveID;
                  item.LeaveDate = t2.Date;
                  item.LeaveDay = days < 1 ? days / wt.WorkHour : 1;
                  item.LeaveHour = days < 1 ? days : 0;
                  item.WorkTime = wt.WorkHour;
                  list.Add(item);
              }
          }
          else
          {
              if (IsWorkDate(t, t1))
              {
                  WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t1);
                  days = (new WorkTimesBLL()).GetSameDayTimeDate(t1, t2, wt);
                  LeaveDateTimes item = new LeaveDateTimes();
                  item.LeaveID = leaveID;
                  item.LeaveDate = t1.Date;
                  item.LeaveDay = days < 1 ? days / wt.WorkHour : 1;
                  item.LeaveHour = days < 1 ? days : 0;
                  item.WorkTime = wt.WorkHour;
                  list.Add(item);
              }
          }
          return list;
      }


      public List<LeaveDateTimes> GetNoWorkTimeOfTwoDay(Trans t, DateTime t1, DateTime t2, string leaveID)
      {
          List<LeaveDateTimes> list = new List<LeaveDateTimes>();

          DateTime? sD = null;
          DateTime? eD = null;
          DateTime? tmp = null;

          if (t1.CompareTo(t2) > 0)
          {
              tmp = t1;
              t1 = t2;
              t2 = tmp.Value;
          }
          sD = t1.AddDays(1).Date;
          eD = t2.Date.AddMilliseconds(-1);
          double days = 0;
          while (sD < eD)
          {
              WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t1);
              LeaveDateTimes item = new LeaveDateTimes();
              item.LeaveID = leaveID;
              item.LeaveDate = sD.Value;
              item.LeaveDay = 1;
              item.LeaveHour = 0;
              item.WorkTime = wt.WorkHour;
              list.Add(item);

              sD = sD.Value.AddDays(1);
          }
          if (t1.Date != t2.Date)
          {

              WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t1);
              days = (new WorkTimesBLL()).GetSameDayTimeFirstDate(t1, wt);
              LeaveDateTimes item = new LeaveDateTimes();
              item.LeaveID = leaveID;
              item.LeaveDate = t1.Date;
              item.LeaveDay = days < 1 ? days / wt.WorkHour : 1;
              item.LeaveHour = days < 1 ? days : 0;
              item.WorkTime = wt.WorkHour;
              list.Add(item);

              wt = (new WorkTimesBLL()).GetWorkTime(t, t2);
              days = (new WorkTimesBLL()).GetSameDayTimeEndDate(t2, wt);
              item = new LeaveDateTimes();
              item.LeaveID = leaveID;
              item.LeaveDate = t2.Date;
              item.LeaveDay = days < 1 ? days / wt.WorkHour : 1;
              item.LeaveHour = days < 1 ? days : 0;
              item.WorkTime = wt.WorkHour;
              list.Add(item);
          }
          else
          {
              WorkTimes wt = (new WorkTimesBLL()).GetWorkTime(t, t1);
              days = (new WorkTimesBLL()).GetSameDayTimeDate(t1, t2, wt);
              LeaveDateTimes item = new LeaveDateTimes();
              item.LeaveID = leaveID;
              item.LeaveDate = t1.Date;
              item.LeaveDay = days < 1 ? days / wt.WorkHour : 1;
              item.LeaveHour = days < 1 ? days : 0;
              item.WorkTime = wt.WorkHour;
              list.Add(item);
          }
          return list;
      }

     public bool IsWorkDate(Trans t, DateTime theDay)
      {
          try
          {
              List<WorkDates> wds = this.Find(t,string.Format(" StartDate<='{0}' AND EndDate>='{0}'", theDay.ToString("yyyy-MM-dd HH:mm:ss")),false);
              if (wds.Count > 0)
              {
                  return wds[0].IsWorkDate;
              }
              else
              {
                  return (theDay.DayOfWeek != DayOfWeek.Saturday && theDay.DayOfWeek != DayOfWeek.Sunday);
              }
          }
          catch (Exception ex)
          {
              throw ex;
          }
      }


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值