public ActionResult SaveWorkTimeSetting(WorkTimeSetting workTime) { SettingsLogic logic = new SettingsLogic(); var result = logic.SaveWorkTime(workTime); return(Json(result)); }
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 })); }
public WorkTimeSetting GetEnabledWorkTimeSetting() { using (TeamDBContext context = new TeamDBContext()) { WorkTimeSetting wts = context.WorkTimeSettings .Where(s => s.Enabled == true) .Single(); return(wts); } }
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); } } }
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); } }
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); } }
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); }