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 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); }
/// <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 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); }