⟨/⟩ Ntr/60_Epics/ActualConsumption/UseCases/UC_ActualConsumption.cs

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

using Rugrid.Sdaid.Notation.Documents;
using Rugrid.Sdaid.Notation.Glossary;
using Rugrid.Sdaid.Epas.Ntr.Glossary.Terms;
using Rugrid.Sdaid.Epas.Ntr.Epics.ActualConsumption;

namespace Rugrid.Sdaid.Epas.Ntr.Epics.ActualConsumption.UseCases
{
    /// <summary>
    /// Сквозной сценарий эпика: данные учёта попадают из АИС ОИА ПЭО в Сервис и становятся видны
    /// пользователю на вкладках расхода ЭЭ и ТЭ.
    /// </summary>
    public class UC_ActualConsumption : IUseCaseDocument, IHasStructuralLinks
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Realizes<EPIC_ActualConsumption>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.ActualConsumptionModel.BC_ActualConsumptionModel>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.BuildingModel.DOC_Building>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.OrgObjectModel.DOC_OrgObject>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Infrastructure.AisOiaPeo.DOC_AisDataImport>(),
        };

        public static string _refName = "Загрузка и просмотр данных учёта";

        public string Name => "Загрузка данных учёта и их просмотр";

        public string Description =>
            "Администратор Сервиса загружает данные учёта из АИС ОИА ПЭО; пользователь смотрит потребление ресурса по зданиям организационного объекта или по зданию.";

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

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

            Учёт ведётся в {GlossaryAnchors.RefTo<AisOiaPeo>(AisOiaPeo.Name)} помесячно по точкам учёта
            здания. Сценарий доводит месячные значения до пользователя Сервиса: загрузка переносит их в
            Сервис, сводя точки учёта к
            {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Ntr.Domain.BuildingModel.DOC_Building>()}, просмотр
            показывает потребление ресурса по зданиям организационного объекта или по одному зданию.

            Два потока независимы по времени: загрузка выполняется очередным прогоном импорта, просмотр
            — когда пользователю потребуются данные. Общего состояния между ними нет, только сами
            данные учёта.
            """;

        public static string Flow1 = $"""
            ## Поток 1. Загрузка данных учёта

            Актор — администратор Сервиса.

            **Given** в {GlossaryAnchors.RefTo<AisOiaPeo>(AisOiaPeo.Name)} есть данные учёта по точкам
            учёта зданий за один или несколько месяцев, а в Сервисе эти здания уже заведены.

            **When** администратор Сервиса запускает импорт данных из АИС ОИА ПЭО — единый прогон, в
            котором загружаются все данные Сервиса: справочники, организационная структура, здания,
            модели потребления и данные учёта.

            **Then** Сервис сводит значения точек учёта к зданию и сохраняет по каждому зданию, месяцу
            и виду ТЭР месячное потребление в единицах источника — тыс. кВт·ч для электрической
            энергии, Гкал для тепловой.

            **And** повторный импорт тех же месяцев обновляет ранее сохранённые значения, не создавая
            вторых записей.
            """;

        public static string Flow2 = $"""
            ## Поток 2. Просмотр данных учёта

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

            **Given** данные учёта загружены.

            **When** пользователь выбирает в блоке навигации организационный объект или здание и
            открывает вкладку нужного ресурса — «Расход ЭЭ» или «Расход ТЭ».

            **Then** Сервис показывает потребление этого ресурса за период: для организационного объекта
            — по зданиям, находящимся в нём или ниже; для здания — по одному зданию.

            **And** период по умолчанию — календарный год, предшествующий текущему; пользователь может
            выбрать другой.

            **And** по каждому зданию выведен итог за год.

            **And** данные доступны только на чтение: изменить значение в Сервисе нельзя.
            """;

        public static string Flow2Alt = """
            ### Альтернативный ход: данных по зданию нет

            **Given** по зданию данные учёта за выбранный период не загружены.

            **When** пользователь открывает вкладку ресурса.

            **Then** здание показано с пустыми значениями; это не ошибка.
            """;

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

            | Шаг | Артефакты |
            |---|---|
            | Загрузка данных учёта | контракт загрузки — задача S-3 эпика; сущность месячного потребления — S-2 |
            | Просмотр данных учёта | вкладки — S-4 и S-6; запрос и хендлер — S-5; сущность месячного потребления — S-2 |

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

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