⟨/⟩ Nts/60_Epics/NtsFuelCalc/UseCases/UC_NtsFuelCalc.cs

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

using Rugrid.Sdaid.Notation.Documents;

namespace Rugrid.Sdaid.Epas.Nts.Epics.NtsFuelCalc.UseCases
{
    /// <summary>
    /// Сквозной сценарий эпика: пользователь от авторизации в ОПЭС доходит до расчётного
    /// нормативного расхода топлива по выбранному ТС — выбирает ТС, дозаполняет данные ЭНТС,
    /// подбирает модификации и запускает расчёт.
    /// </summary>
    public class UC_NtsFuelCalc : IUseCaseDocument, IHasStructuralLinks, IFolder<NtsEpicsFolder>
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Realizes<EPIC_NtsFuelCalc>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleRegistry>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleCard>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_Vehicle>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleModification>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_SelectedModifications>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleCalc>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalc>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalcModel>(),
            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.Infrastructure.AisOiaPeo.DOC_NtsAisImport>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_AisRefreshPolicy>(),
        };

        public static string _refName = "Получение нормативного расхода топлива по ТС";

        public string Name => "Получение нормативного расхода топлива по ТС";

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

        public string PrimaryActor => "Пользователь";

        public static string Intro = $"""
            ## Цель сценария

            Сценарий доводит пользователя до расчётного нормативного расхода топлива по одному ТС:
            от входа в модуль и выбора ТС до результата расчёта. Расчёт ведётся по методике
            {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_NtsCalc>()}; входные данные
            собираются из характеристик ТС
            ({SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_Vehicle>()}) — частично из АИС
            ОИА ПЭО, частично введённых в модуле.
            """;

        public static string Flow = $"""
            ## Основной поток

            Актор — Пользователь.

            **Given** пользователь имеет доступ к Сервису ОПЭС и к модулю ЭНТС; характеристики ТС,
            от которых зависит расчёт, в АИС ОИА ПЭО заполнены.

            **When** пользователь выполняет шаги:

            1. авторизуется в ОПЭС;
            2. переходит в модуль ЭНТС;
            3. выбирает организационный объект в блоке навигации — модуль получает реестр ТС
               организационного объекта ({SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleRegistry>()});
            4. выбирает ТС в реестре и открывает его карточку
               ({SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Ui.DOC_VehicleCard>()});
            5. Модуль получает актуальные сведения о ТС из АИС ОИА ПЭО
               ({SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Infrastructure.AisOiaPeo.DOC_NtsAisImport>()})
               и в рамках того же приёма данных пытается подобрать модификацию автоматически —
               правила реакции подбора и расчёта на приём данных (первый или повторный) — один факт,
               {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_AisRefreshPolicy>()};
            6. дозаполняет сведения о ТС, заполняемые в ЭНТС:
               {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_InputModel>()} (пробег,
               данные по надбавкам, время работы отопителя, масса прицепа);
            7. подбирает модификации ТС из справочника «Марка, модель и модификация ТС»
               ({SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleModification>()},
               отобранное сохраняется в {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_SelectedModifications>()});
            8. запускает расчёт («Сохранить и рассчитать»).

            **Then** Модуль выполняет расчёт по методике и сохраняет результат в
            {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleCalc>()}.

            **And** пользователь получает расчётный нормативный расход
            ({SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Backend.Calc.DOC_OutputModel>()}),
            показанный в карточке ТС и в реестре ТС.

            **And** статус расчёта — «Успешно выполнен»; при нарушениях исходных данных —
            «Выполнен с ошибкой» с текстом ошибки. Итоговый статус обработки ТС вычисляется
            по статусу расчёта, статусу подбора и способу подбора.
            """;

        public static string Trace = """
            ## Шаг → артефакты

            | Шаг | Артефакты |
            |---|---|
            | Авторизация и переход в модуль | платформенные механизмы Сервиса ОПЭС |
            | Выбор организационного объекта | реестр ТС |
            | Выбор ТС | реестр ТС, карточка ТС |
            | Получение сведений о ТС | ТС, приём данных из АИС ОИА ПЭО |
            | Дозаполнение сведений | ТС, модель входных данных |
            | Подбор модификаций | справочник «Марка, модель и модификация ТС», отобранные модификации ТС |
            | Расчёт | методика, модель расчёта, расчёт ТС |

            Таблица заполняется типизированными ссылками по мере появления артефактов: ссылка на ещё
            не созданный документ ломает сборку спеки.
            """;

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