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);
        }
示例#2
0
        /// <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);
        }