Выбор ветки методики по коду вида ТС

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

Ветка методики (fuel.category_by_kind) выбирается по коду вида ТС (VehicleKind.Code), а не по наименованию. Код обязателен для каждой записи справочника «Виды ТС» — довносится в ЭНТС, где АИС его не передаёт. Состав веток не изменился, только ключ сопоставления. Реализовано в спеке и в реальном калькуляторе (src/Nts.Calc).

⟨/⟩ Исходник

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

При разборе справочника «Виды ТС» обнаружено прямое противоречие внутри одного документа: VehicleKind.Code — RequiredOnCreate = true, документирован как «по коду выбирается формула расчёта», но Catalog того же документа явно перечисляет 8 строк с пустым кодом («у видов вне кодового блока mobile код пуст»). Более глубокое расхождение: реальная методика (fuel.category_by_kind) выбирала ветку по VehicleKind.Name (сравнение строк наименований), не по коду — утверждение «код задаёт формулу» было попросту неверно относительно того, как считает калькулятор (подтверждено и в src/Nts.Calc/Calc/CategoryByKind/CategoryByKindValidator.cs — реальная реализация дискриминировала по тем же строкам наименований).

2. Разбор

Решение пользователя:

  1. Код обязателен у каждой записи справочника. Требуем от АИС; где АИС код не передаёт — довносим в ЭНТС. Это не новое правило (RequiredOnCreate = true уже стоял на Вид ТС), решается только фактическое противоречие — 8 строк каталога, которые были без кода, получили код.
  2. Формулу определяет код, не наименование. Секция fuel.category_by_kind Методика расчёта расхода топлива переписана: ключ сопоставления — VehicleKind.Code, не VehicleKind.Name. Состав веток (PassengerCar/Bus/CargoCar/DumpTruck/SpecCar) не менялся — перенесено один в один с ключа «наименование» на ключ «код», никаких новых категорий. Поле VehicleKind Модель входных данных расчёта ЭНТС — «реальный путь» в описании поля тоже меняется на .Code.
  3. В калькуляторе — маппинг код → бизнес-категория. Реализовано и в спеке, и в src/Nts.Calc (не только прототип/спека, как у ReferenceConsumption) — явное решение пользователя для этой задачи.
  4. «Спец-Рубительная машина» — код есть, ветки нет. Это единственный из 8 новых кодов, для которого в текущем перечне fuel.category_by_kind не было соответствия ни по наименованию, ни, соответственно, по коду — предсуществующий пробел методики (как у медицинского автотранспорта, эвакуаторов и части видов спецтехники), не закрывается этим CR.

3. Blast radius

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

Документ Правка
Nts/50_Domain/Reference/VehicleKind.cs Catalog — коды для 8 ранее бескодовых строк; прозу про «mobileNNN/код пуст» — исправлено
Nts/55_Backend/Calc/NtsCalc.cs FuelCategoryByKind — таблица сопоставления переписана с наименования на код
Nts/55_Backend/Calc/InputModel.cs поле VehicleKind — «реальный путь» .Name → .Code

3.2. Backend (src/Nts.Calc)

Файл Правка
Calc/CategoryByKind/CategoryByKindValidator.cs множества PassengerKinds/BusKinds/CargoKinds/DumpTruckKinds/SpecKinds — с наименований на коды
Calc/CategoryByKind/CategoryByKindCalculator.cs текст подсказки — «код вида ТС» вместо «вид ТС»
Calc/CategoryByKind/readme.md уточнено — код, не наименование
Nts.Calc.Tests/*ControlExampleTests.cs, FuelCalcFullTests.cs входные данные тестов — наименования заменены на коды
Nts.Calc.Tests/CategoryByKindCodeTests.cs новый: 8 новых кодов + chipper_machine (методика не определена)

3.3. Вне объёма

Прототип (Ntr/65_Ui/html/shell.js, categoryOf(kind) — matч по regex на наименование) не тронут: демо-данные ТС не несут отдельного поля «код вида ТС», перевод прототипа на код — отдельная задача, явно отложенная, не молчком. Прототип — не часть Методика расчёта расхода топлива как документа спеки, blast radius выше описывает только спеку и реальный backend.

4. План

  1. Вид ТС, Методика расчёта расхода топлива, Модель входных данных расчёта ЭНТС — правки спецификации (сделано).
  2. CategoryByKindValidator.cs/Calculator.cs/readme.md — backend (сделано).
  3. Nts.Calc.Tests — существующие тесты переведены на коды, новый файл на 8 кодов + chipper_machine (сделано).
  4. dotnet build/dotnet test для src/Nts.Calc/src/Nts.Calc.Tests (сделано).
  5. dotnet build, build-html.cmd для спеки (сделано).
  6. doc — проверка спеки.
  7. Зафиксировать «Итог».

5. Acceptance criteria

6. Итог

Выполнено полностью: спека (VehicleKind.cs, NtsCalc.cs, InputModel.cs) и реальный backend-калькулятор (src/Nts.Calc/Calc/CategoryByKind/) переведены на диспетчеризацию ветки методики по коду вида ТС; 8 ранее бескодовых строк справочника получили коды; состав веток не изменился. src/Nts.Calc.Tests — существующие тесты переведены на коды, новый файл покрывает все 8 новых кодов плюс chipper_machine (методика не определена). dotnet test — 20 passed, 1 skip (досуществующий, не связан).

doc нашёл 1 находку — проза CR не использовала typed-ссылки (SdaidAnchors.RefTo) на VehicleKind/NtsCalc/InputModel, только голый текст — исправлено во всех разделах (Analysis/BlastRadius/Plan/Acceptance). Вторая находка (тройное дублирование формулировки «код задаёт формулу» в VehicleKind.cs) — досуществующая, не введена этим CR, оставлена как есть.

Связанные артефакты

Документы