Esempio n. 1
0
        public override Result <ScheduleDataCalculatorResponse> Calculate(ScheduleDataCalculatorRequest request)
        {
            var result = _innerCalculator.Calculate(request);

            if (result.Failure)
            {
                return(result);
            }

            //находим ExplicitAddRule
            var explicitAddRule = _queryProcessor.Process(new ExplicitAddRuleQuery(request.TypiconVersionId, request.Date));

            if (explicitAddRule != null)
            {
                var create = _settingsFactory.CreateExplicit(new CreateExplicitRuleSettingsRequest(request)
                {
                    Rule = explicitAddRule
                });

                if (create.Success && create.Value is RuleHandlerSettings settings)
                {
                    var lastAddition = GetLastAddition(result.Value.Settings);

                    //и задаем результат у последнего найденного Addition
                    settings.Menologies = lastAddition.Menologies;
                    settings.Triodions  = lastAddition.Triodions;
                    settings.OktoikhDay = lastAddition.OktoikhDay;

                    lastAddition.Addition = settings;
                }
            }

            return(result);
        }
        public GetScheduleDayResponse GetScheduleDay(GetScheduleDayRequest request)
        {
            //находим метод обработки дня
            HandlingMode mode = request.CheckParameters.GetMode();

            //Формируем данные для обработки
            var settingsRequest = new ScheduleDataCalculatorRequest()
            {
                Date             = request.Date,
                TypiconVersionId = request.TypiconId,
                ApplyParameters  = request.ApplyParameters,
                CheckParameters  = request.CheckParameters
                                   .SetModeParam((mode == HandlingMode.AstronomicDay) ? HandlingMode.ThisDay : mode)
            };

            OutputDay scheduleDay = GetOrFillScheduleDay(settingsRequest, 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.Handler, scheduleDay);
            }

            return(new GetScheduleDayResponse()
            {
                Day = scheduleDay
            });
        }
Esempio n. 3
0
        public override Result <ScheduleDataCalculatorResponse> Calculate(ScheduleDataCalculatorRequest req)
        {
            //находим MenologyRule - не может быть null
            var menologyRule = _queryProcessor.Process(new MenologyRuleQuery(req.TypiconVersionId, req.Date)) ?? throw new NullReferenceException("MenologyRule");

            //находим TriodionRule
            var triodionRule = _queryProcessor.Process(new TriodionRuleQuery(req.TypiconVersionId, req.Date));

            //находим ModifiedRule с максимальным приоритетом
            var modifiedRule = _queryProcessor.Process(new ModifiedRuleHighestPriorityQuery(req.TypiconVersionId, req.Date));

            //находим день Октоиха - не может быть null
            var oktoikhDay = _queryProcessor.Process(new OktoikhDayQuery(req.Date)) ?? throw new NullReferenceException("OktoikhDay");

            //вычисляем приоритеты, находим главное правило
            (DayRule MajorRule, IEnumerable <DayWorship> Menologies, IEnumerable <DayWorship> Triodions, bool ModifiedIsUsed)r;

            if (modifiedRule != null || triodionRule?.IsTransparent == false)
            {
                r = CalculatePriorities(modifiedRule, menologyRule, triodionRule);
            }
            else
            {
                //если мы здесь, то осталась только Минея
                r.MajorRule      = menologyRule;
                r.Menologies     = menologyRule.DayWorships;
                r.Triodions      = new List <DayWorship>();
                r.ModifiedIsUsed = false;
            }

            var settings = _settingsFactory.CreateRecursive(new CreateRuleSettingsRequest(req)
            {
                Rule             = r.MajorRule,
                Menologies       = r.Menologies,
                Triodions        = r.Triodions,
                OktoikhDay       = oktoikhDay,
                PrintDayTemplate = r.ModifiedIsUsed
                    ? modifiedRule?.PrintDayTemplate
                    : null//r.MajorRule.PrintDayTemplate
            });

            if (settings.Success)
            {
                //теперь дублируем тексты служб на Additions, вычисленные для данных настроек
                if (settings.Value.Addition != null)
                {
                    FillWorships(settings.Value, settings.Value.Addition, true);
                }

                return(Result.Ok(new ScheduleDataCalculatorResponse()
                {
                    Rule = r.MajorRule, Settings = settings.Value
                }));
            }
            else
            {
                return(Result.Fail <ScheduleDataCalculatorResponse>(settings.ErrorCode, settings.Error));
            }
        }
Esempio n. 4
0
        public override Result <ScheduleDataCalculatorResponse> Calculate(ScheduleDataCalculatorRequest request)
        {
            var result = _innerCalculator.Calculate(request);

            if (result.Failure)
            {
                return(result);
            }

            //находим ModifiedRule с максимальным приоритетом
            var modifiedRule = _queryProcessor.Process(new ModifiedRuleIsAdditionQuery(request.TypiconVersionId, request.Date));

            if (modifiedRule?.IsAddition == true)
            {
                //создаем первый объект, который в дальнейшем станет ссылкой Addition у выбранного правила
                var dayRule = modifiedRule.DayRule;

                var create = _settingsFactory.CreateRecursive(new CreateRuleSettingsRequest(request)
                {
                    Rule = dayRule
                });

                if (create.Success && create.Value is RuleHandlerSettings settings)
                {
                    //задаем номер знака, если он был отдельно задан в ModifiedRule
                    result.Value.Settings.PrintDayTemplate = modifiedRule.PrintDayTemplate;

                    //добавляем DayWorships
                    if (TypeEqualsOrSubclassOf <MenologyRule> .Is(modifiedRule.DayRule))
                    {
                        settings.Menologies.AddRange(modifiedRule.DayWorships);
                    }
                    else
                    {
                        settings.Triodions.AddRange(modifiedRule.DayWorships);
                    }

                    //вставляем тексты служб в полученные ранее настройки
                    var lastAdditionSettings = FillWorships(settings, result.Value.Settings, false);

                    //и задаем результат у последнего найденного Addition
                    settings.Menologies = lastAdditionSettings.Menologies;
                    settings.Triodions  = lastAdditionSettings.Triodions;
                    settings.OktoikhDay = lastAdditionSettings.OktoikhDay;

                    //теперь дублируем тексты служб на Additions, вычисленные для данных настроек
                    if (settings.Addition != null)
                    {
                        FillWorships(settings, settings.Addition, true);
                    }

                    //замыкаем цепочку
                    lastAdditionSettings.Addition = settings;
                }
            }

            return(result);
        }
Esempio n. 5
0
        /// <summary>
        /// Переопределяет правило для исполнения
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public Result <ScheduleDataCalculatorResponse> Calculate(ScheduleDataCalculatorRequest request)
        {
            var response = Decoratee.Calculate(request);

            if (response.Failure)
            {
                return(response);
            }

            response.Value.Settings.RuleContainer = RuleSerializer.Container <RootContainer>().Deserialize(CustomRule);

            //обнуляем добавления?
            response.Value.Settings.Addition = null;

            return(response);
        }
        public override Result <ScheduleDataCalculatorResponse> Calculate(ScheduleDataCalculatorRequest req)
        {
            var result = _innerCalculator.Calculate(req);

            if (result.Failure)
            {
                return(result);
            }

            //находим TriodionRule
            var triodionRule = _queryProcessor.Process(new TriodionRuleQuery(req.TypiconVersionId, req.Date));

            //находим ModifiedRule с максимальным приоритетом
            var modifiedRule = _queryProcessor.Process(new ModifiedRuleHighestPriorityQuery(req.TypiconVersionId, req.Date));

            //формируем, если нет ModifiedRule или оно отмечено как дополнение
            if ((modifiedRule == null || modifiedRule.IsAddition) && triodionRule?.IsTransparent == true)
            {
                var create = _settingsFactory.CreateRecursive(new CreateRuleSettingsRequest(req)
                {
                    Rule      = triodionRule,
                    Triodions = triodionRule.DayWorships
                });

                if (create.Success && create.Value is RuleHandlerSettings settings)
                {
                    //задаем результат из ранее вычисленного правила, кроме Triodions
                    settings.Menologies = result.Value.Settings.Menologies;
                    settings.OktoikhDay = result.Value.Settings.OktoikhDay;

                    //теперь дублируем тексты служб на Additions, вычисленные для данных настроек
                    if (settings.Addition != null)
                    {
                        FillWorships(settings, settings.Addition, true);
                    }

                    //добавялем в цепочку Дополнений вычисленные здесь настройки
                    var lastAddition = GetLastAddition(result.Value.Settings);
                    lastAddition.Addition = settings;
                }
            }

            return(result);
        }
        private OutputDay GetOrFillScheduleDay(ScheduleDataCalculatorRequest request, ScheduleHandler handler, OutputDay scheduleDay = null)
        {
            //Формируем данные для обработки
            var response = dataCalculator.Calculate(request);

            var settings = response.Settings;

            handler.Settings = settings;

            settings.RuleContainer.Interpret(handler);

            var container = handler.GetResult();

            if (scheduleDay == null)
            {
                //Sign sign = (settings.Rule is Sign s) ? s : GetTemplateSign(settings.Rule.Template);
                var sign = GetPredefinedTemplate(response.Rule.Template);

                //Если settings.SignNumber определен в ModifiedRule, то назначаем его
                int signNumber = settings.SignNumber ?? sign.Number.Value;

                scheduleDay = new OutputDay
                {
                    //задаем имя дню
                    Name           = nameComposer.Compose(request.Date, response.Rule.Template.Priority, settings.AllWorships),
                    Date           = request.Date,
                    PredefinedSign = sign
                };
            }

            //if (container != null)
            //{
            scheduleDay.Worships.AddRange(container);
            //}

            return(scheduleDay);
        }
Esempio n. 8
0
        /// <summary>
        /// Вычисляет свойства для заполнения выходной формы
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        private OutputDayInfo GetOutputDayInfo(IScheduleDataCalculator dataCalculator, ScheduleDataCalculatorRequest request)
        {
            //Формируем данные для обработки
            var response = dataCalculator.Calculate(request);

            var outputDay = new OutputDay()
            {
                TypiconId = request.TypiconId,
                Date      = request.Date
            };

            if (response.Success)
            {
                //все удачно - собираем информацию

                var settings = response.Value.Settings;

                var brokenConstraints = GetBrokenConstraints(settings);

                _handler.Settings = settings;

                _handler.ClearResult();

                settings.RuleContainer.Interpret(_handler);

                var results = _handler.GetResults();

                var sign = response.Value.Rule.Template.GetPredefinedTemplate();

                outputDay.Header = new OutputDayHeader()
                {
                    //задаем имя дню
                    Name = _nameComposer.Compose(request.Date, response.Value.Rule.Template.Priority, settings.AllWorships),

                    PredefinedSignId = sign.Id,
                    //Если settings.PrintDayTemplate определен в ModifiedRule, то назначаем его
                    PrintDayTemplate = settings.PrintDayTemplate ?? sign.PrintTemplate
                };

                return(new OutputDayInfo(
                           outputDay,
                           settings.AllWorships,
                           results,
                           brokenConstraints));
            }
            else
            {
                //если response возвращается неудачный, то возвращаем "пустую" информацию
                return(new OutputDayInfo(
                           outputDay,
 public abstract Result <ScheduleDataCalculatorResponse> Calculate(ScheduleDataCalculatorRequest request);