public ActionResult SaveWorkTimeSetting(WorkTimeSetting workTime)
        {
            SettingsLogic logic  = new SettingsLogic();
            var           result = logic.SaveWorkTime(workTime);

            return(Json(result));
        }
Exemple #2
0
        public ActionResult InsertRecord(WorkTime workTime, WorkTimeSetting workTimeSetting)
        {
            workTime.EmployeeId = UserContext.CurrentUser.UserId;
            WorkTimeLogic wtLogic = new WorkTimeLogic();
            var           result  = wtLogic.InsertWorkTime(workTime, workTimeSetting);

            return(Json(new { Result = result, Data = workTime }));
        }
Exemple #3
0
 public WorkTimeSetting GetEnabledWorkTimeSetting()
 {
     using (TeamDBContext context = new TeamDBContext())
     {
         WorkTimeSetting wts = context.WorkTimeSettings
                               .Where(s => s.Enabled == true)
                               .Single();
         return(wts);
     }
 }
Exemple #4
0
        public bool InsertWorkTime(WorkTime workTime, WorkTimeSetting workTimeSetting)
        {
            Guard.ArgumentNotNull(workTime, "workTime");
            Guard.ArgumentNotNullOrEmpty(workTime.JobContent, "workTime.JobContent");
            Guard.ArgumentNotNull(workTime.BeginTime, "workTime.BeginTime");
            Guard.ArgumentNotNull(workTime.EndTime, "workTime.EndTime");

            using (TeamDBContext context = new TeamDBContext())
            {
                DatabaseAccess dba = context.DatabaseAccess();
                using (var conn = dba.GetOpenConnection())
                {
                    workTime.WorkTimeId = Guid.NewGuid();
                    PrepareWorkTime(workTime, workTimeSetting, context);
                    context.WorkTimes.Add(workTime);
                    int affectRows = context.SaveChanges();
                    return(affectRows > 0);
                }
            }
        }
Exemple #5
0
 public bool DeleteWorkTime(Guid timeId)
 {
     using (TeamDBContext context = new TeamDBContext())
     {
         var result = from w in context.WorkTimeSettings
                      where w.WorkTimeSettingId == timeId
                      select w;
         WorkTimeSetting workTime = null;
         foreach (WorkTimeSetting t in result)
         {
             workTime = t;
             break;
         }
         if (workTime == null)
         {
             return(false);
         }
         context.WorkTimeSettings.Remove(workTime);
         var val = context.SaveChanges();
         return(val > 0);
     }
 }
Exemple #6
0
        public bool SaveWorkTime(WorkTimeSetting time)
        {
            using (TeamDBContext context = new TeamDBContext())
            {
                WorkTimeSetting workTime = null;
                if (time.WorkTimeSettingId == Guid.Empty)
                {
                    workTime = time;
                    workTime.WorkTimeSettingId = Guid.NewGuid();
                    context.WorkTimeSettings.Add(workTime);
                }
                else
                {
                    var result = from w in context.WorkTimeSettings
                                 where w.WorkTimeSettingId == time.WorkTimeSettingId
                                 select w;
                    foreach (WorkTimeSetting t in result)
                    {
                        workTime = t;
                        break;
                    }
                    if (workTime == null)
                    {
                        return(false);
                    }
                    workTime.AMStartTime = time.AMStartTime;
                    workTime.AMEndTime   = time.AMEndTime;
                    workTime.PMStartTime = time.PMStartTime;
                    workTime.PMEndTime   = time.PMEndTime;
                    workTime.Enabled     = time.Enabled;
                    workTime.WorkHour    = time.WorkHour;
                }

                var val = context.SaveChanges();
                return(val > 0);
            }
        }
Exemple #7
0
        void PrepareWorkTime(WorkTime workTime, WorkTimeSetting workTimeSetting, TeamDBContext context)
        {
            Guard.ArgumentNotNull(context, "context");

            //如果是请假则不用关联项目信息
            if (workTime.AttendanceType == "3-02" && workTime.ProjectId != null)
            {
                workTime.ProjectId  = null;
                workTime.StageId    = null;
                workTime.ActivityId = null;
            }
            DateTime beginTime = workTime.BeginTime.Value;
            DateTime endTime   = workTime.EndTime.Value;
            TimeSpan interval  = endTime - beginTime;
            double   hours     = interval.Hours + (interval.Minutes / 60.0);

            //如果是正常上班或者请假则需要去除午休时间,外勤和出差则按全部时间记录
            if (workTime.AttendanceType == "3-01" || workTime.AttendanceType == "3-02")
            {
                if (workTimeSetting == null)
                {
                    if (workTime.WorkTimeSettingId == null)
                    {
                        workTimeSetting = context.WorkTimeSettings
                                          .Where(wts => wts.Enabled == true)
                                          .SingleOrDefault();
                    }
                    else
                    {
                        workTimeSetting = context.WorkTimeSettings
                                          .Where(wts => wts.WorkTimeSettingId == workTime.WorkTimeSettingId)
                                          .SingleOrDefault();
                    }
                    if (workTimeSetting == null)
                    {
                        throw new ModuleLogicException("没能获取到可用的工作时间设置信息");
                    }
                }

                DateTime amBeginTime = beginTime
                                       .AddHours(workTimeSetting.AMStartTime.Value.Hours - beginTime.Hour)
                                       .AddMinutes(workTimeSetting.AMStartTime.Value.Minutes - beginTime.Minute)
                                       .AddSeconds(workTimeSetting.AMStartTime.Value.Seconds - beginTime.Second);
                DateTime amEndTime = beginTime
                                     .AddHours(workTimeSetting.AMEndTime.Value.Hours - beginTime.Hour)
                                     .AddMinutes(workTimeSetting.AMEndTime.Value.Minutes - beginTime.Minute)
                                     .AddSeconds(workTimeSetting.AMEndTime.Value.Seconds - beginTime.Second);
                DateTime pmBeginTime = beginTime
                                       .AddHours(workTimeSetting.PMStartTime.Value.Hours - beginTime.Hour)
                                       .AddMinutes(workTimeSetting.PMStartTime.Value.Minutes - beginTime.Minute)
                                       .AddSeconds(workTimeSetting.PMStartTime.Value.Seconds - beginTime.Second);
                DateTime pmEndTime = beginTime
                                     .AddHours(workTimeSetting.PMEndTime.Value.Hours - beginTime.Hour)
                                     .AddMinutes(workTimeSetting.PMEndTime.Value.Minutes - beginTime.Minute)
                                     .AddSeconds(workTimeSetting.PMEndTime.Value.Seconds - beginTime.Second);

                if (beginTime > amEndTime && beginTime < pmBeginTime)
                {
                    beginTime = amEndTime;
                }
                if (endTime > amEndTime && endTime < pmBeginTime)
                {
                    endTime = pmBeginTime;
                }
                interval = endTime - beginTime;
                hours    = interval.TotalHours;

                if (beginTime <= amEndTime && endTime >= pmBeginTime)
                {
                    interval = pmBeginTime - amEndTime;
                    double noonTime = interval.Hours + (interval.Minutes / 60.0);
                    hours -= noonTime;
                    if (hours <= 0)
                    {
                        throw new ModuleLogicException("在正常上班或请假时午休时间不能登记工时");
                    }
                }
                workTime.WorkTimeSettingId = workTimeSetting.WorkTimeSettingId;
            }
            workTime.Hour = Convert.ToDecimal(hours);
        }
        /// <summary>
        /// 只计算当天的工作日
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="setting"></param>
        /// <returns></returns>
        private decimal CalculatetByDay(DateTime begin, DateTime end, WorkTimeSetting setting)
        {
            TimeSpan interval = begin - end;

            if (interval.Days > 0)
            {
                throw new ArgumentException("start和end都必需在同一天");
            }

            DateTime amBegin = SetTime(begin, setting.AMStartTime.Value);
            DateTime amEnd   = SetTime(begin, setting.AMEndTime.Value);
            DateTime pmBegin = SetTime(end, setting.PMStartTime.Value);
            DateTime pmEnd   = SetTime(end, setting.PMEndTime.Value);

            if (begin < amBegin)
            {
                begin = amBegin;
            }
            if (end > pmEnd)
            {
                end = pmEnd;
            }

            decimal dayCount = 0;
            decimal halfDay  = new decimal(0.5);

            if (begin < amEnd)
            {
                dayCount += halfDay;
            }
            if (end > pmBegin)
            {
                dayCount += halfDay;
            }

            /* 精确的小时算法,暂时不用
             * //校准时间,用于午休时间的修正
             * if (begin > amEnd && begin < pmBegin)
             *  begin = amEnd;
             * if (end > amEnd && end < pmBegin)
             *  end = pmBegin;
             * interval = end - begin;
             * double hours = interval.Hours + (interval.Minutes / 60.0);
             *
             * //如果时间中包含午休时间则除去午休时间
             * if(begin <= amEnd && end >= pmBegin)
             * {
             *  interval = pmBegin - amEnd;
             *  hours -= interval.Hours + (interval.Minutes / 60.0);
             * }
             * decimal dayCount;
             * if(hours <= 0)
             * {
             *  dayCount = 0;
             * }
             * else
             * {
             *  interval = amEnd - amBegin;
             *  double totalHours = interval.Hours + (interval.Minutes / 60.0);
             *  interval = pmEnd - pmBegin;
             *  totalHours += interval.Hours + (interval.Minutes / 60.0);
             *  dayCount = Convert.ToDecimal(hours / totalHours);
             * }
             */
            return(dayCount);
        }
        private decimal CalculatetWorkdayCount(TeamDBContext context, RequestLeaveBill bill, bool amStart, bool amEnd)
        {
            //获取假期
            DateTime         startTime = QueryParameterUtility.DateTimeStart(bill.LeaveStart);
            DateTime         endTime   = QueryParameterUtility.DateTimeEnd(bill.LeaveEnd);
            DatabaseAccess   dba       = context.DatabaseAccess();
            HashSet <string> holidays  = dba.ExecuteReader <HashSet <string> >(
                "SELECT CONVERT(varchar, HolidayDate, 120) AS HolidayDate FROM HolidaySettings WHERE HolidayDate >= @p0 AND HolidayDate <= @p1",
                new object[] { startTime, endTime },
                (d, r) => {
                d.Add(r.GetString(0));
            }
                );
            //获取工作时间
            WorkTimeSetting setting = context.WorkTimeSettings
                                      .Where(s => s.Enabled)
                                      .Single();

            //设置时间
            if (amStart)
            {
                bill.LeaveStart = SetTime(bill.LeaveStart, setting.AMStartTime.Value);
            }
            else
            {
                bill.LeaveStart = SetTime(bill.LeaveStart, setting.PMStartTime.Value);
            }
            if (amEnd)
            {
                bill.LeaveEnd = SetTime(bill.LeaveEnd, setting.AMEndTime.Value);
            }
            else
            {
                bill.LeaveEnd = SetTime(bill.LeaveEnd, setting.PMEndTime.Value);
            }

            decimal  workDayCount = 0;
            TimeSpan time         = bill.LeaveEnd - bill.LeaveStart;
            string   formatter    = "yyyy-MM-dd";

            if (time.Days == 0)
            {
                if (!holidays.Contains(bill.LeaveStart.ToString(formatter)))
                {
                    //当天请假,只计算小时
                    workDayCount = CalculatetByDay(bill.LeaveStart, bill.LeaveEnd, setting);
                }
            }
            else if (time.Days >= 1)
            {
                if (time.Days > 1)
                {
                    //跨多天请假,中间按自然天,头尾按小时
                    //计算中间的工作日(除去请假开始的那天和请假结束的那天)
                    DateTime middleStart = QueryParameterUtility.DateTimeStart(bill.LeaveStart.AddDays(1));
                    DateTime middleEnd   = QueryParameterUtility.DateTimeStart(bill.LeaveEnd);
                    if (middleStart < middleEnd)
                    {
                        middleEnd = middleEnd.AddDays(-1);
                    }
                    int middleDays = (middleEnd - middleStart).Days + 1;
                    //移除休息日
                    for (int i = 0; i < middleDays; i++)
                    {
                        if (!holidays.Contains(middleStart.AddDays(i).ToString(formatter)))
                        {
                            workDayCount++;
                        }
                    }
                }

                //跨天请假,分别计算小时
                DateTime begin, end;
                if (!holidays.Contains(bill.LeaveStart.ToString(formatter)))
                {
                    begin         = bill.LeaveStart;
                    end           = SetTime(bill.LeaveStart, setting.PMEndTime.Value);
                    workDayCount += CalculatetByDay(begin, end, setting);
                }

                if (!holidays.Contains(bill.LeaveEnd.ToString(formatter)))
                {
                    begin         = SetTime(bill.LeaveEnd, setting.AMStartTime.Value);
                    end           = bill.LeaveEnd;
                    workDayCount += CalculatetByDay(begin, end, setting);
                }
            }

            return(workDayCount);
        }