using System;
using Rugrid.Sdaid.Notation.Documents;
namespace Rugrid.Sdaid.Epas.Nts.Epics.NtsFuelCalc
{
/// <summary>
/// Эпик «Расчёт нормативного расхода топлива»: сквозной контекст модуля ЭНТС — главная
/// страница и навигация, приём данных из АИС ОИА ПЭО, справочники, расчёт нормативного
/// расхода автомобильного топлива ТС, представление и анализ результатов.
/// Владелец открытых вопросов модуля.
/// </summary>
public class EPIC_NtsFuelCalc : IEpicDocument, IHasStructuralLinks, IFolder<NtsEpicsFolder>
{
public SdaidLink[] Links => new[]
{
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Vision.DOC_NtsVision>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.BC_Nts>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_Vehicle>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleCalc>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_SelectedModifications>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalc>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_InputModel>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_OutputModel>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalcModel>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_ProcessingStatusPolicy>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_AisRefreshPolicy>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.ModificationSelection.DOC_ModificationGroupSelection>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.ModificationSelection.DOC_ModificationNameRecognition>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleMarkAlias>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_ProcessingStatus>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Infrastructure.AisOiaPeo.DOC_NtsAisImport>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_NtsImportRun>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_NtsImportRunStatus>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsMainPage>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRegistry>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRecords>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsAisImportPage>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsDocumentation>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleRegistry>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleCard>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_ModificationSelectionModal>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleMarkRegistry>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleModificationRegistry>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleModificationCard>(),
Rel.Uses<Rugrid.Sdaid.Epas.Nts.Epics.NtsFuelCalc.UseCases.UC_CreateVehicleModification>(),
};
public static string _refName = "Эпик: расчёт нормативного расхода топлива";
public string Name => "Расчёт нормативного расхода топлива";
public string Description =>
@"Сквозной контекст модуля ЭНТС: навигация по организационной структуре, приём данных из АИС ОИА ПЭО, ведение справочников, расчёт нормативного расхода топлива ТС, отображение и анализ результатов.";
public string Version => "0.2";
public string Status => "draft";
public string[] Comments => new string[0];
public static string Goal = $"""
## Цель
Реализовать модуль ЭНТС: от загрузки данных о ТС и справочников из АИС ОИА ПЭО
и ведения данных, которых нет в АИС, до расчёта нормативного расхода автомобильного
топлива, отображения и анализа результатов
(см. {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Vision.DOC_NtsVision>()}).
""";
public static string Scope = $"""
## Состав работ
Сквозной сценарий модуля — {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Epics.NtsFuelCalc.UseCases.UC_NtsFuelCalc>()}.
### Спецификация
| Задача | Предмет | Зависит от |
|---|---|---|
| S-1 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.BC_Nts>()} — модель данных модуля: ТС, расчёт ТС, отобранные модификации и справочники. Выполнено | — |
| S-2 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalc>()} — методика расчёта, ветки категорий ТС. В работе | S-1 |
| S-3 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalcModel>()} и модели расчёта: {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_InputModel>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_OutputModel>()}. Выполнено | S-2 |
| S-4 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Infrastructure.AisOiaPeo.DOC_NtsAisImport>()} — приём данных из АИС ОИА ПЭО. Выполнено | S-1 |
| S-5 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleRegistry>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleCard>()} — экраны реестра и карточки ТС и макеты. Выполнено | S-3 |
| S-6 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsMainPage>()} — главная страница, общие сведения о модуле, навигация и вкладки организационного объекта. Выполнено | S-5 |
| S-7 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsDocumentation>()} — документация по использованию модуля. Выполнено | S-5, S-6 |
| S-8 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRegistry>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRecords>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleMarkRegistry>()}, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleModificationRegistry>()} — справочники и страницы записей. Выполнено | S-1, S-4 |
| S-9 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsAisImportPage>()} — страница запуска и контроля импорта. Выполнено | S-4 |
| S-10 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_ModificationSelectionModal>()} — окно подбора модификаций и расчёта базовой нормы. Выполнено | S-2, S-3, S-5 |
| S-11 | {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleModificationCard>()} — карточка модификации справочника, точка входа из карточки ТС, {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Epics.NtsFuelCalc.UseCases.UC_CreateVehicleModification>()} | S-5, S-8 |
### Реализация backend
| Задача | Предмет | Зависит от |
|---|---|---|
| B-1 | Доменные сущности и справочники модуля: ТС, расчёт ТС, отобранные модификации, марки, алиасы марок, модели и модификации, субъекты РФ, зимние надбавки, статусы расчёта | S-1 |
| B-2 | Реализация расчёта по методике: лёгковые, автобусы, грузовые, самосвалы и спецтехника. Выполнено | S-2 |
| B-3 | Модели чтения и запросы: навигация, реестр и карточка ТС, справочники, история импорта, подбор модификаций; права доступа | S-4, S-5, S-8, S-9, S-10 |
| B-4 | Команды: сохранение карточки и расчёт, обновление из АИС, импорт, ведение собственных справочников | B-1, B-2, B-3 |
""";
public static string OutOfScope = $"""
## Вне состава
**Организационная структура и характеристики ТС, загруженные из АИС**, в модуле
не изменяются; модуль читает их из АИС. Субъект РФ организационного объекта выбирается
на вкладке «Сведения» и используется для зимней надбавки. Остальные характеристики,
которых нет в АИС, ведутся в ЭНТС (см. {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Vision.DOC_NtsVision>()},
раздел «Границы»).
**Создание и удаление ТС.** Состав ТС ведётся в АИС ОИА ПЭО; в реестре и карточке ТС
создание и удаление не выполняются.
**Отчёты.** Состав отчётов в ТЗ не задан — открытый вопрос {SdaidAnchors.RefTo<OQ_Vision>()}.
""";
public static string Actors = $"""
## Акторы
Роли модуля и их действия — {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Vision.DOC_NtsVision>()},
раздел «Роли пользователей».
""";
public static string Acceptance = """
## Acceptance criteria
| AC | Критерий |
|---|---|
| AC-G1 | На главной странице в блоке «Общие сведения» показаны полное наименование модуля, условное обозначение «Модуль ЭНТС», назначение и цель создания; заголовок не дублирует верхнюю строку |
| AC-N1 | Выбор организационного объекта в дереве навигации открывает вкладки «Сведения» и «Реестр ТС»; по умолчанию активна вкладка «Сведения» |
| AC-R1 | Реестр ТС показывает ТС выбранного объекта, поддерживает переключатели «С потомками / Без потомков» и «Все / Действующие» (действующие — ТС без даты окончания эксплуатации), фильтры по колонкам и постраничный вывод; в строках видны нормативный расход и статус обработки |
| AC-C1 | В карточке ТС доступны группы «Характеристики ТС», «Условия эксплуатации», «Параметры методики» и «Результаты расчёта»; «Сохранить и рассчитать» сохраняет данные и запускает расчёт |
| AC-C2 | Окно подбора модификаций при каждом открытии строит базовую группу по виду ТС и топливу и маску автоуточнением из данных АИС (марка/модель/остаток наименования), независимо от способа подбора; «Отобранные» разово заполняются текущей группой ТС (сохранённой пользователем или полученной автоотбором) и дальше не зависят от изменений маски; ручные условия по марке, модели и модификации строгие; по «Отобранным» показываются $H_{min}$, $H_{max}$ и $H_s$; по «Применить» группа сохраняется, способ подбора становится «эксперт», значение $H_s$ переносится в карточку; если для вида ТС и топлива нет ни одной модификации с нормой — статус подбора «Не определена» (красный бейдж в карточке), «Сохранить и рассчитать» недоступна |
| AC-S1 | Статус расчёта показан бейджем и принимает одно из значений: «Не выполнен», «Успешно выполнен», «Выполнен с ошибкой» |
| AC-S2 | При статусе «Выполнен с ошибкой» показан текст ошибки из классификатора ошибок расчёта |
| AC-S3 | Статус обработки ТС показан цветным бейджем в карточке (ниже статуса расчёта) и в реестре ТС; принимает значения: «Не выполнена», «Мало данных загружено», «Нет модификаций», «Отсутствуют данные для расчёта», «Автовыбор не подтверждён», «Модификация не определена», «Завершена» |
| AC-S4 | Статус загрузки показан бейджем в группе «Сведения о ТС из АИС ОИА ПЭО» карточки ТС; принимает значения «Не выполнена», «Данных мало», «Загрузка выполнена»; при «Данных мало» карточка показывает пояснение с перечнем недостающих данных и блокирует «Сохранить и рассчитать» и «Подобрать модификацию» |
| AC-F1 | Справочники сгруппированы по источнику ведения; справочники АИС и системные доступны только для просмотра, собственные справочники ЭНТС — для создания, изменения и удаления по правам пользователя |
| AC-I1 | Страница импорта запускает пакетную загрузку от корневой компании (ПАО «Россети»), показывает статус, результат по наборам и ошибки; история запусков сохраняется и включает как пакетные запуски, так и одиночные обновления ТС из карточки (с указанием источника) |
| AC-I2 | ТС, отсутствующее в очередной выгрузке АИС, не удаляется — у него выставляется признак `IsAbsentInAis`; при появлении ТС в выгрузке признак снимается, данные модуля и результаты расчёта не меняются |
| AC-D1 | Документация содержит общие сведения, назначение и цель создания, порядок работы с модулем |
| AC-X1 | Повторный импорт тех же данных из АИС не изменяет результаты расчёта, его статус и журнал |
| AC-F2 | В подвале окна подбора модификаций всегда (не только при пустом отборе) доступна администратору модуля кнопка «Создать модификация», открывающая карточку модификации с предзаполненными видом ТС и видом топлива (точно) и предложенными маркой и моделью (редактируемыми); вид ТС и вид топлива с этой карточки не создаются — только выбор из значений АИС; марка и модель — выбор существующей записи или создание новой |
| AC-X2 | «Обновить из АИС» в карточке ТС запрашивает подтверждение перед запуском; если вид ТС или вид топлива не изменились (по Id записи справочника) — подбор, сделанный способом «эксперт», не трогается, способом «авто» — повторяется по актуальному наименованию ТС; если изменились — прежняя группа подбора отбрасывается и выполняется новый автоподбор по новым виду/топливу, даже если данных всё равно недостаточно для расчёта; расчёт запускается безусловно и обновляет дату расчёта, при нехватке обязательных данных возвращает классифицированную ошибку, но видимый статус обработки всё равно показывает «Мало данных загружено» |
""";
}
/// <summary>Открытые вопросы эпика, вынесенные из документа видения (OQ-1…OQ-3).</summary>
public class OQ_Vision : ISdaidDocumentSection
{
public Type Document => typeof(EPIC_NtsFuelCalc);
public Type Parent => typeof(object);
public int Order => 100;
public string Number => "OQ";
public string Name => "Открытые вопросы — видение";
public string Body => """
- **OQ-1. Отчёты.** Требования к модулю «Отчёты» в ТЗ не заданы — есть только заголовок
раздела. Состав отчётов нужно получить от заказчика.
- **OQ-2. Состав собственных справочников.** По ТЗ состав предоставляет заказчик. В модели
зафиксированы марки, модели, модификации ТС, субъекты РФ и предельные значения зимних
надбавок; коэффициенты за срок эксплуатации — параметр методики, отдельного справочника
нет. Нужно подтвердить состав и источник первичного наполнения.
- **OQ-3. Средний нормативный расход.** В методике итоговый расход определён как среднее
городского и пригородного расхода, слагаемые расшифрованы. Открытым остаётся состав
средних показателей для отчётов и их сопоставление с фактическим потреблением.
""";
public string Version => "";
public string Status => "";
public string[] Comments => new string[0];
}
/// <summary>Открытые вопросы эпика, вынесенные из документа методики (OQ-4…OQ-6).</summary>
public class OQ_Calc : ISdaidDocumentSection
{
public Type Document => typeof(EPIC_NtsFuelCalc);
public Type Parent => typeof(object);
public int Order => 110;
public string Number => "OQ";
public string Name => "Открытые вопросы — методика";
public string Body => """
- **OQ-4. Ветки категорий.** Ветки лёгковых автомобилей, автобусов, грузовых, самосвалов
и спецтехники реализованы и проверены контрольными примерами. Открытым остаётся
согласование состава слагаемых и порядка применения коэффициентов с заказчиком.
- **OQ-5. Ручные надбавки.** D_{нас}, D_{ост}, D_{пон}, D_{спец}, D_{чс}, D_{прос} приходят из формы
ввода и суммируются в обе сезонные суммы. На контрольном примере лёгкового они равны нулю.
- **OQ-6. Оборудование спецавтомобилей.** Расход на работу отопителя (автобусы) добавляется
вне поправочного коэффициента — решено. Для спецавтомобилей расход на оборудование
учитывается в ветке `fuel.special_vehicle` и проверен контрольным примером. Открытым
остаётся согласование состава оборудования с заказчиком.
""";
public string Version => "";
public string Status => "";
public string[] Comments => new string[0];
}
/// <summary>Открытые вопросы эпика, вынесенные из документа транспортного средства (OQ-7…OQ-8).</summary>
public class OQ_Vehicle : ISdaidDocumentSection
{
public Type Document => typeof(EPIC_NtsFuelCalc);
public Type Parent => typeof(object);
public int Order => 120;
public string Number => "OQ";
public string Name => "Открытые вопросы — транспортное средство";
public string Body => """
- **OQ-7. Два вида топлива.** У ТС основной и дополнительный вид топлива. Методика знает
один: от вида топлива зависят нормы расхода на транспортную работу. Какой использовать
в расчёте, если заполнены оба.
- **OQ-8. Летние и зимние нормы.** Нормы расхода ведутся парами: летняя и зимняя, на пробег
и на час работы. Методика задаёт базовую норму из справочника модификаций и применяет
к ней сезонные поправочные коэффициенты. Соотношение этих величин нужно определить.
""";
public string Version => "";
public string Status => "";
public string[] Comments => new string[0];
}
/// <summary>Открытые вопросы эпика, вынесенные из документа приёма данных из АИС (OQ-9…OQ-12).</summary>
public class OQ_AisImport : ISdaidDocumentSection
{
public Type Document => typeof(EPIC_NtsFuelCalc);
public Type Parent => typeof(object);
public int Order => 130;
public string Number => "OQ";
public string Name => "Открытые вопросы — загрузка из АИС";
public string Body => """
- **OQ-9. Где держать процедуры интеграции.** Приём данных из АИС ОИА ПЭО — общий механизм
для модулей ОПЭС; у ЭНЗС он описан в своей папке, здесь описан приём данных ЭНТС.
Нужно решить, остаются ли описания по модулям или общая часть переезжает в платформу.
- **OQ-10. Отбор по типу организационного объекта.** В запросе выгрузки отбор идёт по
`navs.navtypealias = 'o_fsk'` — это компания. ТС числятся за ПМЭС и МЭС, поэтому отбор
либо означает «все ТС компании», а привязка к ПМЭС и МЭС лежит в самой записи `navs`,
либо требует уточнения.
- **OQ-11. Данные, которых нет в выгрузке.** Методика использует величины, отсутствующие
в составе наборов: пробег за период и с начала эксплуатации, собственная масса ТС,
признаки надбавок (климат-контроль, кондиционер, прогрев, работа в загородной зоне).
Нужно решить, добавляются ли они в выгрузку или вводятся в модуле.
- **OQ-12. Выбывшие записи.** Поведение, когда запись исчезла из выгрузки АИС. Для справочников
вопрос острее: в ЭНЗС неудаление записей, которых уже нет в АИС, привело к перекрытию
диапазонов классов энергоэффективности (CR 2026-08-19, пункт 5).
""";
public string Version => "";
public string Status => "";
public string[] Comments => new string[0];
}
/// <summary>Открытые вопросы эпика, вынесенные из документов справочников (OQ-13).</summary>
public class OQ_References : ISdaidDocumentSection
{
public Type Document => typeof(EPIC_NtsFuelCalc);
public Type Parent => typeof(object);
public int Order => 140;
public string Number => "OQ";
public string Name => "Открытые вопросы — справочники";
public string Body => """
- **OQ-13. Ведение справочников.** В справочниках ЭНТС зафиксированы марки, модели,
модификации ТС, субъекты РФ и предельные значения зимних надбавок. Нужно согласовать
права на создание, изменение и удаление записей, а также порядок разовой загрузки
справочника «Марка, модель и модификация ТС» из нормативного документа.
""";
public string Version => "";
public string Status => "";
public string[] Comments => new string[0];
}
/// <summary>Открытые вопросы эпика, вынесенные из базовой нормы (OQ-18).</summary>
public class OQ_BaseNorm : ISdaidDocumentSection
{
public Type Document => typeof(EPIC_NtsFuelCalc);
public Type Parent => typeof(object);
public int Order => 145;
public string Number => "OQ";
public string Name => "Открытые вопросы — базовая норма";
public string Body => """
- **OQ-18. Какая норма справочника считается базовой.** Спека
`InputModel.BaseConsumptionRates` и секция `fuel.base_norm` говорят только про
`VehicleModification.NormPerMileage`; прототип и подготовленный справочник используют
`NormPerMileage`, а при её отсутствии — `TransportNorm`. Это не придирка к формулировке:
у автобусов и самосвалов норма на пробег часто пустая, а транспортная заполнена —
только транспортной нормой заполнено около 416 строк справочника (автобусы и самосвалы),
ещё 5 строк не имеют ни одной из двух. Если оставить спеку как есть, для этих видов ТС
базовая группа окажется пустой, а $H_s$ — неопределённой, хотя прототип для них считает.
Нужно подтвердить, что для автобусов и самосвалов базовой является именно транспортная
норма, и определить поле (или правило выбора поля), которое считается «установленной
нормой» для базовой группы.
""";
public string Version => "";
public string Status => "";
public string[] Comments => new string[0];
}
/// <summary>Открытые вопросы эпика, вынесенные из документа реестра ТС (OQ-14, OQ-15).</summary>
public class OQ_VehicleRegistry : ISdaidDocumentSection
{
public Type Document => typeof(EPIC_NtsFuelCalc);
public Type Parent => typeof(object);
public int Order => 150;
public string Number => "OQ";
public string Name => "Открытые вопросы — реестр ТС";
public string Body => """
- **OQ-14. Данные, вносимые в модуле.** По ТЗ модуль обеспечивает внесение данных, которых
нет в АИС. Состав таких данных определится, когда закроются открытые вопросы методики
(пробег, собственная масса, признаки надбавок — см. OQ-11).
- **OQ-15. Результаты расчёта в реестре.** По ТЗ реестр отображает результаты расчёта
нормативного потребления. Состав показателей определится вместе с выходной моделью расчёта.
""";
public string Version => "";
public string Status => "";
public string[] Comments => new string[0];
}
/// <summary>Открытые вопросы эпика, вынесенные из документа карточки ТС (OQ-16).</summary>
public class OQ_VehicleCard : ISdaidDocumentSection
{
public Type Document => typeof(EPIC_NtsFuelCalc);
public Type Parent => typeof(object);
public int Order => 160;
public string Number => "OQ";
public string Name => "Открытые вопросы — карточка ТС";
public string Body => """
- **OQ-16. Состав результатов расчёта.** Состав промежуточных итогов расчёта определится
вместе с выходной моделью расчёта.
""";
public string Version => "";
public string Status => "";
public string[] Comments => new string[0];
}
/// <summary>Открытые вопросы эпика, вынесенные из окна подбора модификаций (OQ-17).</summary>
public class OQ_ModificationSelection : ISdaidDocumentSection
{
public Type Document => typeof(EPIC_NtsFuelCalc);
public Type Parent => typeof(object);
public int Order => 170;
public string Number => "OQ";
public string Name => "Открытые вопросы — окно подбора модификаций";
public string Body => $"""
- **OQ-17. Статусная модель — снят.** Зафиксированы `CalculationStatus`
(не выполнен / успешно выполнен / выполнен с ошибкой), `AisLoadStatus`
(не выполнена / данных мало / загрузка выполнена) и `ProcessingStatus`
(не выполнена / мало данных загружено / нет модификаций / отсутствуют данные для
расчёта / автовыбор не подтверждён / модификация не определена / завершена). Способ
подбора — «авто» / «эксперт»; статус подбора — «не выполнен» / «не определена» /
«определена» / «определена группа» (бейдж «не определена» — красный: подбор проводился
и дал пустой результат, в отличие от нейтрального «не выполнен»). Правило вычисления
`ProcessingStatus` описано в политике статуса обработки.
- **OQ-19. Хранение маски — снят.** Маска нигде не хранится: она формируется заново из
данных АИС при каждом открытии окна подбора и не зависит ни от способа подбора, ни от
сохранённых «Отобранных» (см. `ModificationSelectionModal`, правило 3). Хранилище в
домене не требуется.
- **OQ-20. Мастер-список марок и алиасы — снят.** Мастер-список марок — справочник
{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleMark>()}; алиасы —
отдельная дочерняя сущность {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleMarkAlias>()}
(один алиас — одна марка), заводится через типовой механизм ведения справочников ЭНТС
({SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRegistry>()} →
{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_NtsReferenceRecords>()}), как и
{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleModel>()}. Внешнего
(вне-доменного) мастер-списка больше не требуется.
- **OQ-21. Источник для спецтехники.** Прототип распознаёт марку и модель только по
«Марка и модель базы ТС»; в диагностике подготовки справочников дополнительно
использовалось «Модель спец. автомобиля». Нужно решить, какое поле (или оба) является
источником для спецтехники.
- **OQ-22. Маска после автоподбора — снят.** Маска больше не «остаётся прежней» ни в
каком случае — она всегда формируется заново из текущих данных АИС при открытии
(см. OQ-19), поэтому рассинхронизация с группой невозможна.
- **OQ-23. Два пустых состояния.** Прототип показывает один текст «нет модификаций для
Вид ТС «…» и Вид топлива «…»» и когда кандидатов нет вовсе, и когда их отсекли ручные
условия. Нужно решить, различать ли эти состояния текстом.
- **OQ-24. Смена вида ТС/топлива и уже отобранные модификации — снят.** Ответ уже есть в
{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_AisRefreshPolicy>()} (раздел
«Подбор модификации», строка «Изменились»): прежняя группа отбрасывается целиком,
выполняется новый автоподбор по новым виду/топливу — поэтому «Отобранные», не
соответствующие новому виду/топливу, не остаются.
- **OQ-25. Эталонная норма — хранить ли отдельно от расчёта ТС — снят.**
{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.ChangeRequests.DOC_CR_2026_11_03_ReferenceConsumption>()}
решил, по аналогии с базовой нормой, не хранить эталонную норму вида ТС и топлива как
отдельную НСИ-величину — она пересчитывается при каждом открытии окна подбора и при
каждом расчёте, сохраняется только в разрезе конкретного ТС
(`VehicleCalc.ReferenceConsumptionRate`). Это решение для текущего объёма, не требует
отдельного подтверждения. Отдельно, не как часть этого вопроса: если позже понадобится
агрегированная отчётность «эталон по виду ТС и топливу» (не по ТС) — кэш придётся
выносить отдельно, это будущий самостоятельный CR, а не доработка текущего решения.
- **OQ-26. Детализация эталонного расхода по периодам.** Тот же
{SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.ChangeRequests.DOC_CR_2026_11_03_ReferenceConsumption>()}
ограничил состав эталонных величин одним итоговым $Q_эт$ (аналог $Q_н$), не вводя
эталонные аналоги промежуточных $Q^зима_эт$, $Q^гор_эт$ и т. п. Если заказчику нужна
детализация — потребуется отдельный CR.
""";
public string Version => "";
public string Status => "";
public string[] Comments => new string[0];
}
}