⟨/⟩ Nts/55_Backend/ModificationSelection/ModificationGroupSelection.cs

103 строк · в начало

using Rugrid.Sdaid.Notation.Documents;

namespace Rugrid.Sdaid.Epas.Nts.Backend.ModificationSelection
{
    /// <summary>
    /// Подбор группы модификаций ТС: базовая группа по виду ТС и топливу и мягкое уточнение
    /// по распознанным марке, модели и остатку наименования. Группу не сохраняет.
    /// </summary>
    public class DOC_ModificationGroupSelection : IApplicationServiceDocument, IHasStructuralLinks, IFolder<NtsBackendFolder>
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_Vehicle>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleModification>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.ModificationSelection.DOC_ModificationNameRecognition>(),
        };

        public static string _refName = "Подбор группы модификаций ТС";

        public string Name => "Подбор группы модификаций ТС";

        public string Description =>
            @"Подбор группы модификаций ТС: базовая группа по виду ТС и топливу и мягкое уточнение по распознанным марке, модели и остатку наименования.";

        public string Version => "0.1";
        public string Status => "draft";
        public string[] Comments => new string[0];

        public static string Purpose = $"""
            ## Назначение

            Процедура собирает группу модификаций, применимых к конкретному ТС: сначала **базовую
            группу** по виду ТС и топливу, затем **мягкое уточнение** по распознанным в
            наименовании марке, модели и остатку.

            Вызывающие:

            - приём данных ТС из АИС — {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_AisRefreshPolicy>()};
            - предзаполнение маски окна подбора —
              {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_ModificationSelectionModal>()}.

            В окне подбора используется та же **базовая группа** и та же композиция уточнения, но
            результат — значения полей маски, а не сохранённая группа: установка маски остаётся
            поведением экрана и описана в спеке окна.

            Процедура не сохраняет группу, не меняет статус подбора, способ подбора и
            рассчитанные нормы.
            """;

        public static string BaseGroup = $"""
            ## Базовая группа

            Вход — вид ТС и вид топлива ТС
            ({SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_Vehicle>()}), справочник —
            {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleModification>()}.

            1. Отбираются все модификации этого вида ТС, у которых установлена норма.
               Какое поле справочника считается нормой — открытый вопрос
               {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Epics.NtsFuelCalc.OQ_BaseNorm>()};
               процедура использует готовый признак «норма установлена» и не решает его сама.
            2. Вид топлива — мягкое условие. Если среди отобранных есть модификации с пустым
               видом топлива или совпадающие с основным видом топлива ТС, остаются только они.
               Если таких нет — группа остаётся по виду ТС.
            3. Пустая группа — валидный результат: у вида ТС и топлива нет модификаций с нормой.

            Базовая группа — общий вход и для подбора группы при приёме данных АИС, и для маски
            окна подбора: маска начинает «Отфильтрованные» с неё, даже когда подбор не
            выполнялся (способ «эксперт»).

            Базовая группа — также вход эталонной нормы $H_эт$; определение и формула — секция
            `fuel.reference_norm` {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalc>()}.
            """;

        public static string Composition = $"""
            ## Композиция уточнения

            Из базовой группы:

            1. `DetectBrandIn` по «Марка и модель базы ТС»; если марка найдена — группа сужается
               по марке;
            2. `DetectModel` по полученной группе; если модель найдена — группа сужается по модели,
               а остаток наименования не применяется;
            3. иначе `BuildNameRemainder` — остаток наименования используется как подстрока для
               фильтра по полному наименованию модификации.

            Распознавание — {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.ModificationSelection.DOC_ModificationNameRecognition>()}.

            Каждый шаг **мягкий**: если отбор по распознанному значению даёт пустую группу,
            значение игнорируется, группа остаётся прежней. Жёстких условий в подборе группы нет —
            строгие условия появляются только в маске, когда их задаёт пользователь.
            """;

        public static string Result = $"""
            ## Результат

            Группа модификаций — набор строк справочника после базовой группы и мягких уточнений,
            либо пустая группа. Пустая группа не означает ошибку процедуры: это факт «для этого
            ТС подходящих модификаций с нормой нет», который вызывающие интерпретируют по-своему
            (статус подбора, сообщение в окне, способ подбора).
            """;
    }
}