public ApplyRequestVdto CaculateVacation(ApplyRequestVdto model) { if (model == null) { return(null); } var type = model.VacationType; if (type == null) { throw new ActionStatusMessageException(ActionStatusMessage.ApplyMessage.Request.VacationTypeNotExist); } // 检查是否合法 model.VacationAdditionals?.All(v => { if (v.Description == Const_LawVacationDescription) { throw new ActionStatusMessageException(ActionStatusMessage.ApplyMessage.Request.LawVacationCantCreateByUser); } return(true); }); if (model.StampLeave != null) { var vacationLength = model.VacationLength; if (type.CanUseOnTrip) { vacationLength += model.OnTripLength; } // 仅计算正休假包含的法定节假日 if (type.CaculateBenefit) { // 得到所有福利假后需要加入路途和原假并再次计算 model.StampReturn = vacationCheckServices.CrossVacation(model.StampLeave.Value, vacationLength, true, model.LawVacationSet); List <VacationAdditional> lawVacations = vacationCheckServices.VacationDesc.Select(v => new VacationAdditional() { Name = v.Name, Start = v.Start, Length = v.UseLength, Description = Const_LawVacationDescription }).ToList(); if (model.VacationAdditionals != null) { lawVacations.AddRange(model.VacationAdditionals); } model.VacationAdditionals = lawVacations; //执行完crossVacation后已经处于加载完毕状态可直接使用 vacationLength += model.VacationAdditionals.Sum(v => v.Length); } // 到归队日期前一天的23:59:59 model.StampReturn = model.StampLeave.Value.AddDays(vacationLength).AddSeconds(-1); model.VacationDescriptions = vacationCheckServices.VacationDesc.CombineVacationDescription(); } return(model); }
/// <summary> /// 转换并计算用户的申请 /// </summary> /// <param name="model">原始申请</param> /// <param name="context">数据库</param> /// <returns></returns> public static ApplyRequestVdto ToVDTO(this SubmitRequestInfoViewModel model, ApplicationDbContext context) { var successVacationPlace = int.TryParse(model.VacationPlace, out var vacationPlace); var b = new ApplyRequestVdto() { Reason = model.Reason, StampLeave = model.StampLeave, OnTripLength = model.OnTripLength, VacationLength = model.VacationLength, VacationPlace = context.AdminDivisions.Where(a => a.Code == vacationPlace).FirstOrDefault(), VacationPlaceName = model.VacationPlaceName, VacationType = context.VacationTypes.Where(t => t.Name == model.VacationType).FirstOrDefault(), ByTransportation = model.ByTransportation, VacationAdditionals = model.VacationAdditionals, LawVacationSet = model.LawVacationSet, IsPlan = model.IsPlan ?? false }; return(b); }
public ApplyRequest SubmitRequestAsync(User targetUser, ApplyRequestVdto model) { if (model == null) { return(null); } var vacationInfo = usersService.VacationInfo(targetUser, model?.StampLeave?.Year ?? DateTime.Now.XjxtNow().Year, model.IsPlan ? MainStatus.IsPlan : MainStatus.Normal); if (vacationInfo.Description == null || vacationInfo.Description.Contains("无休假")) { throw new ActionStatusMessageException(new ApiResult(ActionStatusMessage.ApplyMessage.Request.HaveNoVacationSinceExcept, vacationInfo.Description ?? "休假信息生效中", true)); } model = CaculateVacation(model); var type = model.VacationType; if (type?.Disabled ?? true) { throw new ActionStatusMessageException(ActionStatusMessage.ApplyMessage.Request.InvalidVacationType); } if (type.Primary) { // 剩余天数判断 if (model.VacationLength > vacationInfo.LeftLength) { throw new ActionStatusMessageException(new ApiResult(ActionStatusMessage.ApplyMessage.Request.NoEnoughVacation, $"超出{model.VacationLength - vacationInfo.LeftLength}天", true)); } // 剩余路途次数判断 if (model.OnTripLength < 0) { throw new ActionStatusMessageException(ActionStatusMessage.ApplyMessage.Request.Default); } } // 不允许未休完正休假前休某些假 else if (!type.AllowBeforePrimary && vacationInfo.LeftLength > 0) { throw new ActionStatusMessageException(new ApiResult(ActionStatusMessage.ApplyMessage.Request.BeforePrimaryNotAllow, $"({type.Alias})", true)); } // 路途判断 if (type.CanUseOnTrip) { if (model.OnTripLength > 0 && vacationInfo.MaxTripTimes <= vacationInfo.OnTripTimes) { throw new ActionStatusMessageException(ActionStatusMessage.ApplyMessage.Request.TripTimesExceed); } } else { model.OnTripLength = 0; } // 休假天数范围判断 if (model.VacationLength < type.MinLength) { throw new ActionStatusMessageException(ActionStatusMessage.ApplyMessage.Request.VacationLengthTooShort); } if (model.VacationLength > type.MaxLength) { throw new ActionStatusMessageException(ActionStatusMessage.ApplyMessage.Request.VacationLengthTooLong); } // 福利假判断 if (!type.CaculateBenefit) { model.VacationAdditionals = null; } // 跨年假判断 if (type.NotPermitCrossYear) { if (model.StampReturn.Value.Year != model.StampLeave.Value.Year) { throw new ActionStatusMessageException(ActionStatusMessage.ApplyMessage.Request.NotPermitCrossYear); } } var r = new ApplyRequest() { OnTripLength = model.OnTripLength, Reason = model.Reason, StampLeave = model.StampLeave, StampReturn = model.StampReturn, VacationLength = model.VacationLength, VacationPlace = model.VacationPlace, VacationPlaceName = model.VacationPlaceName, VacationType = model.VacationType.Name, CreateTime = DateTime.Now, ByTransportation = model.ByTransportation, AdditialVacations = model.VacationAdditionals, VacationDescription = vacationInfo.Description }; context.ApplyRequests.Add(r); context.SaveChanges(); return(r); }