⟨/⟩ 65_Ui/Pages/ExportLogPage.cs

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

using Ban.Sdaid.Notation.Documents;
using Ban.Sdaid.Icd.Domain.Export;

namespace Ban.Sdaid.Icd.Ui.Pages
{
    /// <summary>Журнал выгрузок: сформированные файлы для АБИС, их состав и содержимое.</summary>
    public class ExportLogPage : IPageDocument, IFolder<UiFolder>, IHasStructuralLinks
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<CardExportSpec>(),
            Rel.Realizes<Ban.Sdaid.Icd.Requirements.FR_007_AbisExport>(),
        };

        public string Name => "Журнал выгрузок";

        /// <summary>Display-текст для типизированных ссылок <c>SdaidAnchors.RefTo&lt;ExportLogPage&gt;()</c>.</summary>
        public static string _refName = "экран «Журнал выгрузок»";

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

        public string Version => "0.1";
        public string Status => "draft";

        public string[] Comments => new[]
        {
            "2026-08-28. Заведён по CR «Выгрузка в АБИС без отбора выборки».",
        };

        public static string S1_Purpose = $"""
            ## Зачем экран

            Файл для АБИС формируется при создании карты, без участия человека
            ({SdaidAnchors.RefTo<Ban.Sdaid.Icd.Arch.Adr.ADR_013_ExportFileOnCardCreation>()}).
            Пока выгрузку запускал пользователь, он и видел, что выгрузил; теперь это знание
            нужно вернуть — иначе файлы появляются и исчезают незаметно, а тихий отказ обнаружится
            через недели.

            Экран административный. Хранителю сюда ходить незачем: его работа заканчивается
            созданием карты.
            """;

        public static string S2_Layout = $"""
            ## Раскладка

            Мастер-деталь: слева список выгрузок, справа выбранная. Список — потому что вопрос
            обычно звучит «что было за такой-то день», а не «покажи вот эту».

            Строка списка: имя файла, момент, происхождение, число карт, формат. Имени файла
            отведено первое место — по нему выгрузку опознают снаружи Сервиса.

            Справа три блока. **Реквизиты файла** — имя, момент, происхождение, формат,
            пользователь, место в хранилище. **Состав** — карты, вошедшие в файл. **Содержимое
            файла** — текст как есть.

            Содержимому файла место именно здесь: на экране проверки его читать некому, а тут
            сидит тот, кто в состоянии что-то с ним сделать.

            Фильтры: период, происхождение, формат, поиск по имени файла, шифру и инвентарному
            номеру — то есть по тому, что известно, когда ищут «куда делась эта карта».
            """;

        public static string S3_NoStates = """
            ## Чего на экране нет

            **Состояния «принято в АБИС».** Сервис файл кладёт, а не отправляет, и судьбы его
            не наблюдает. Показывать приёмку значило бы утверждать то, чего Сервис не знает.

            **Повторного формирования.** Файл создаётся заново из реестра карт, где видно, какой
            карте его не хватает. Здесь — только то, что уже сформировано.

            **Ошибок формирования.** Незавершённой выгрузки не существует: запись появляется после
            того, как файл записан. Не записался — записи нет, и карта осталась без файла.
            """;

        public static string S4_Alert = $"""
            ## Предупреждение о картах без файла

            Обычный ход работы карт без файла не оставляет, поэтому такие карты — единственное,
            о чём экран предупреждает сам: сообщение вверху со ссылкой
            в {SdaidAnchors.RefTo<InformationCardsPage>()}, где их и чинят.

            Так два экрана делят обязанности: журнал отвечает, что сформировано, реестр — для чего
            не сформировано.
            """;

        public static string S9_Prototype = $"""
            ## Прототип

            {SdaidHtml.LinkTo<ExportLogPage>("exports.html", "Открыть прототип в новой вкладке")}

            {SdaidHtml.IframeOf<ExportLogPage>("exports.html", 720)}
            """;
    }
}