public GetScheduleDayResponse GetScheduleDay(GetScheduleDayRequest request) { //находим метод обработки дня HandlingMode mode = request.CheckParameters.GetMode(); //Формируем данные для обработки var settingsRequest = new GetRuleSettingsRequest() { Date = request.Date, Language = request.Language, ApplyParameters = request.ApplyParameters, CheckParameters = request.CheckParameters .SetModeParam((mode == HandlingMode.AstronomicDay) ? HandlingMode.ThisDay : mode) }; ScheduleDay scheduleDay = GetOrFillScheduleDay(settingsRequest, request.Typicon, request.Handler); if (mode == HandlingMode.AstronomicDay) { //ищем службы следующего дня с маркером IsDayBefore == true settingsRequest.Date = request.Date.AddDays(1); settingsRequest.CheckParameters = settingsRequest.CheckParameters.SetModeParam(HandlingMode.DayBefore); scheduleDay = GetOrFillScheduleDay(settingsRequest, request.Typicon, request.Handler, scheduleDay); } return(new GetScheduleDayResponse() { Day = scheduleDay }); }
/// <summary> /// Переопределяет правило для исполнения /// </summary> /// <param name="request"></param> /// <returns></returns> public override RuleHandlerSettings Create(GetRuleSettingsRequest request) { RuleHandlerSettings result = base.Create(request); result.Rule.RuleDefinition = CustomRule; return(result); }
private ScheduleDay GetOrFillScheduleDay(GetRuleSettingsRequest request, TypiconEntity typicon, ScheduleHandler handler, ScheduleDay scheduleDay = null) { //заполняем Правила и день Октоиха request.MenologyRule = typicon.GetMenologyRule(request.Date); int daysFromEaster = ruleSerializer.BookStorage.Easters.GetDaysFromCurrentEaster(request.Date); request.TriodionRule = typicon.GetTriodionRule(daysFromEaster); request.ModifiedRule = typicon.GetModifiedRuleHighestPriority(request.Date, ruleSerializer); request.OktoikhDay = ruleSerializer.BookStorage.Oktoikh.Get(request.Date); //Формируем данные для обработки var settings = settingsFactory.Create(request); handler.Settings = settings; settings.Rule.GetRule(ruleSerializer).Interpret(handler); var container = handler.GetResult(); if (scheduleDay == null) { //Sign sign = (settings.Rule is Sign s) ? s : GetTemplateSign(settings.Rule.Template); Sign sign = GetRootAdditionSign(settings); //Если settings.SignNumber определен в ModifiedRule, то назначаем его int signNumber = settings.SignNumber ?? (int)sign.Number; //if (request.Date.DayOfWeek == DayOfWeek.Sunday && sign.Priority > 3) //{ // //TODO: жесткая привязка к номеру знака воскресного дня // signNumber = 8;// SignMigrator.GetOldId(k => k.Value.Name == "Воскресный день"); //} scheduleDay = new ScheduleDay { //задаем имя дню Name = nameComposer.Compose(settings, request.Date), Date = request.Date, SignNumber = signNumber, SignName = sign.SignName[settings.Language.Name], }; } //if (container != null) //{ scheduleDay.Schedule.AddRange(container); //} return(scheduleDay); }
private RuleHandlerSettings InnerCreate(TypiconRule rule, IEnumerable <DayWorship> dayWorships, OktoikhDay oktoikhDay, GetRuleSettingsRequest req, RuleHandlerSettings additionalSettings, int?signNumber = null) { return(new RuleHandlerSettings() { Addition = additionalSettings, Date = req.Date, Rule = rule, DayWorships = dayWorships.ToList(), OktoikhDay = oktoikhDay, Language = LanguageSettingsFactory.Create(req.Language), SignNumber = signNumber, //ThrowExceptionIfInvalid = req.ThrowExceptionIfInvalid, ApplyParameters = req.ApplyParameters, CheckParameters = req.CheckParameters }); }
private RuleHandlerSettings GetRecursiveSettings(TypiconRule rule, IEnumerable <DayWorship> dayWorships, OktoikhDay oktoikhDay, GetRuleSettingsRequest req, RuleHandlerSettings additionalSettings, int?signNumber = null) { RuleHandlerSettings outputSettings = InnerCreate(rule, dayWorships, oktoikhDay, req, additionalSettings, signNumber); /* * Если Правило имеет: * Правило помечено как Дополнение * и определен Шаблон */ if (/*string.IsNullOrEmpty(rule.RuleDefinition) && */ rule.IsAddition && rule.Template != null) { //если правило определено и определено как добавление, входим в рекурсию outputSettings = GetRecursiveSettings(rule.Template, dayWorships, oktoikhDay, req, outputSettings); } return(outputSettings); }
/// <summary> /// Формирует запрос для дальнейшей обработки: главную и второстепенную службу, HandlingMode /// Процесс описан в документации /// </summary> /// <param name="req"></param> /// <returns></returns> public virtual RuleHandlerSettings Create(GetRuleSettingsRequest req) { //MenologyRule - не может быть null if (req.MenologyRule == null) { throw new NullReferenceException("MenologyRule"); } //находим день Октоиха - не может быть null if (req.OktoikhDay == null) { throw new NullReferenceException("OktoikhDay"); } //находим TriodionRule //TriodionRule triodionRule = req.Typicon.GetTriodionRule(req.Date); //находим ModifiedRule с максимальным приоритетом //ModifiedRule modifiedRule = _modifiedRuleService.GetModifiedRuleHighestPriority(req.Typicon, req.Date); //создаем выходной объект RuleHandlerSettings settings = null; //Номер Знака службы, указанный в ModifiedRule, который будет использовать в отображении Расписания int?signNumber = null; if (req.ModifiedRule != null) { //custom SignNumber signNumber = req.ModifiedRule.SignNumber; if (req.ModifiedRule.IsAddition == true) { //создаем первый объект, который в дальнейшем станет ссылкой Addition у выбранного правила settings = InnerCreate(req.ModifiedRule.RuleEntity, req.ModifiedRule.RuleEntity.DayWorships, req.OktoikhDay, req, null); //обнуляем его, чтобы больше не участвовал в формировании req.ModifiedRule = null; } } //получаем главное Правило и коллекцию богослужебных текстов (DayRule Rule, IEnumerable <DayWorship> Worships) = CalculatePriorities(req.ModifiedRule, req.MenologyRule, req.TriodionRule); //смотрим, не созданы ли уже настройки if (settings != null) { //созданы - значит был определен элемент для добавления settings.DayWorships.AddRange(Worships); } TypiconRule seniorRule = Rule; //смотрим, главным ставить само Правило или Знак службы /* * Если Правило имеет: * пустое RuleDefinition * //и Правило помечено как Дополнение * и определен Шаблон */ if ( string.IsNullOrEmpty(Rule.RuleDefinition) && Rule.IsAddition && Rule.Template != null ) { seniorRule = seniorRule.Template; } RuleHandlerSettings outputSettings = GetRecursiveSettings(seniorRule, Worships, req.OktoikhDay, req, settings, signNumber); return(outputSettings); }