«Применить» в окне подбора модификаций запускает пересчёт

Запрос на изменение Версия: 0.1 done

После «Применить» в окне подбора модификаций статус расчёта и статус обработки ТС сбрасываются в «не выполнялся», хотя подбор прошёл успешно и данные для расчёта полны. Нужен безусловный пересчёт — тем же путём, что и после приёма данных из АИС.

⟨/⟩ Исходник

1. Источник (как есть)

По итогам ручного тестирования карточки ТС (Уаз-31512): пользователь открыл окно подбора модификаций, выбрал единственную подходящую модификацию и нажал «Применить» — способ подбора стал «эксперт», статус подбора «Определена», базовая норма заполнена. Все обязательные для расчёта поля (включая дату начала эксплуатации) заданы. При этом Статус расчёта стал серым «Не выполнен», Статус обработки — серым «Не выполнена» («Расчёт ещё не выполнялся»), хотя до открытия окна подбора расчёт мог быть успешным.

Причина в прототипе: обработчик onApply (Ntr/65_Ui/html/shell.js:2356-2359) вызывает renderNorm() и resetCalculationState() — не computeNorm(). resetCalculationState() (shell.js:1909-1918) принудительно обнуляет результат и ставит «Не выполнен».

2. Разбор

Ни {{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_ModificationSelectionModal>()}} (правило 7 «Применить»), ни {{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_AisRefreshPolicy>()}} не описывали, что должно происходить со статусом расчёта после ручного применения модификации — AisRefreshPolicy по названию и назначению ограничена реакцией на приём данных из АИС (два триггера: первый приём, «Обновить из АИС»), «Применить» в окне подбора — третий, самостоятельный триггер того же действия, не относящийся к АИС.

Решение: «Применить» запускает расчёт безусловно — тем же механизмом, что и любой другой пересчёт (валидаторы секций {{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_CalcValidators>()}} либо дают результат, либо классифицированную ошибку). Это не расширение AisRefreshPolicy на чужой для неё триггер, а отдельное, явное правило в ModificationSelectionModal.cs — у расчёта нет единого «диспетчера триггеров» в спеке, и вводить его ради этого одного случая избыточно; у каждого триггера — своё правило в своём документе, принцип безусловности общий и описан один раз в DOC_CalcValidators.

Попутно найдена и правится устаревшая формулировка. Правило 8 «Пустая группа» (ModificationSelectionModal.cs) всё ещё гласит: «расчёт без базовой нормы не выполняется вовсе, а не завершается ошибкой» — это текст из модели ДО перехода на безусловный расчёт (правка сессии 2026-10-29 в AisRefreshPolicy.cs/ ProcessingStatusPolicy.cs/VehicleCard.cs), который не был обновлён в этом файле. Актуально: расчёт запускается безусловно и в этом случае, валидатор секции fuel.base_norm возвращает ошибку «Базовая норма не определена», статус расчёта — «Выполнен с ошибкой», статус обработки — «Нет модификаций» ({{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_ProcessingStatusPolicy>()}}, правило 2).

3. Blast radius

3.1. Спецификация

Документ Правка
{{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_ModificationSelectionModal>()}} правило 7 «Применить» — добавить безусловный запуск расчёта; правило 8 «Пустая группа» — убрать устаревшее «расчёт не выполняется вовсе», согласовать с безусловной моделью

3.2. Прототип

Файл Правка
Ntr/65_Ui/html/shell.js:2356-2359 обработчик onApply — заменить resetCalculationState() на computeNorm()

4. План

  1. ModificationSelectionModal.cs — правило 7: добавить предложение о безусловном запуске расчёта после «Применить».
  2. ModificationSelectionModal.cs — правило 8: убрать «расчёт не выполняется вовсе», заменить на согласованную с ProcessingStatusPolicy формулировку (ошибка валидатора, «Выполнен с ошибкой», «Нет модификаций»).
  3. shell.js — обработчик onApply: computeNorm() вместо resetCalculationState().
  4. Собрать (dotnet build, build-html.cmd), проверить testovich реальным выполнением на Уаз-31512 (или эквивалентном сценарии: применить единственную модификацию при уже полных данных — статус расчёта должен стать «Успешно выполнен», не «Не выполнен»).
  5. Зафиксировать «Итог».

5. Acceptance criteria

6. Итог

Реализовано и проверено testovich реальным выполнением (jsdom, Уаз-31512): AC-1 и AC-2 подтверждены буквально. «Применить» при успешном подборе даёт «Успешно выполнен»/«Завершена»; при пустой группе — «Выполнен с ошибкой» («Базовая норма не определена»)/«Нет модификаций». Расхождений спека↔код не найдено.