public ActionResult EditLeaveData( Guid billId, string leaveType, DateTime leaveStart, bool amStart, DateTime leaveEnd, bool amEnd, string leaveReason) { RequestLeaveLogic leaveLogic = new RequestLeaveLogic(); RequestLeaveBill leaveData = new RequestLeaveBill(); leaveData.Id = billId; leaveData.LeaveType = leaveType; leaveData.LeaveStart = leaveStart; leaveData.LeaveEnd = leaveEnd; leaveData.LeaveReason = leaveReason; IUserData user = UserContext.CurrentUser; bool result = leaveLogic.UpdateRequestLeaveBill(leaveData, user, amStart, amEnd); return(Json(new { Result = result, Data = leaveData })); }
public bool UpdateRequestLeaveBill(RequestLeaveBill bill, IUserData user, bool amStart, bool amEnd) { Guard.ArgumentNotNull(bill, "bill"); using (TeamDBContext context = new TeamDBContext()) { bill.WorkDayCount = CalculatetWorkdayCount(context, bill, amStart, amEnd); if (bill.WorkDayCount == 0) { throw new ModuleLogicException("请假的工作日为0天,请检查请假的开始结束时间是否填写正确"); } RequestLeaveBill old = context.RequestLeaveBills .Where(p => p.Id == bill.Id) .Single(); old.LeaveStart = bill.LeaveStart; old.LeaveEnd = bill.LeaveEnd; old.LeaveType = bill.LeaveType; old.WorkDayCount = bill.WorkDayCount; old.LeaveReason = bill.LeaveReason; old.PMSign = bill.PMSign; old.PMSignDate = bill.PMSignDate; old.DLSign = bill.DLSign; old.DLSignDate = bill.DLSignDate; old.CEOSign = bill.CEOSign; old.CEOSignDate = bill.CEOSignDate; return(context.SaveChanges() > 0); } }
public bool InsertRequestLeaveBill(RequestLeaveBill bill, IUserData user, bool amStart, bool amEnd) { Guard.ArgumentNotNull(bill, "bill"); bill.Id = Guid.NewGuid(); using (TeamDBContext context = new TeamDBContext()) { bill.WorkDayCount = CalculatetWorkdayCount(context, bill, amStart, amEnd); if (bill.WorkDayCount == 0) { throw new ModuleLogicException("请假的工作日为0天,请检查请假的开始结束时间是否填写正确"); } bill.CreateTime = DateTime.Now; bill.Employee = context.Employees.Where(p => p.EmployeeId == user.UserId).Single(); context.RequestLeaveBills.Add(bill); int affectRows = context.SaveChanges(); return(affectRows > 0); } }
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); }