⟨/⟩ Nts/65_Ui/VehicleSummaryWidget.cs

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

using Rugrid.Sdaid.Notation.Documents;

namespace Rugrid.Sdaid.Epas.Nts.Ui
{
    /// <summary>
    /// Виджет сводной статистики ТС: ровно две плашки — состояние обработки и потребление
    /// автотоплива; разбивка по статусам/видам топлива — строки внутри каждой плашки, не
    /// отдельные плашки на каждое значение. Переиспользуемый компонент — встраивается на главную
    /// страницу модуля (без фильтра) и на вкладку «Сведения» организационного объекта (с
    /// фильтром по этому объекту).
    /// </summary>
    public class DOC_VehicleSummaryWidget : IUiComponentDocument, IHasStructuralLinks, IFolder<NtsUiFolder>
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleSummaryStatistics>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_ProcessingStatus>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Nts.Domain.DOC_FuelKind>(),
            Rel.Uses<DOC_VehicleRegistry>(),
        };

        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 Structure = $""""
        ## Структура

        Виджет состоит из **двух плашек** — ровно столько, сколько групп в
        {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_VehicleSummaryStatistics>()}. Разбивка
        по статусам/видам топлива — не отдельная плашка на каждое значение, а компактный список
        строк внутри одной плашки своей группы.

        ### Плашка 1 — «Состояние обработки»

        Строка «Всего ТС» со значением `TotalCount`, далее по одной строке на каждое из семи
        значений {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_ProcessingStatus>()} — цвет
        полосы слева от строки совпадает с цветом бейджа статуса в
        {SdaidAnchors.RefTo<DOC_VehicleRegistry>()} (серый, красный, жёлтый, зелёный). Строка
        выводится всегда, в том числе при нулевом количестве.

        ### Плашка 2 — «Потребление автотоплива ТС»

        Для каждого вида топлива, встретившегося в выборке, — заголовочная строка (вид топлива,
        количество ТС с успешным расчётом) и под ней, с отступом, по отдельной строке на каждый
        агрегат нормативного расхода, л: «Суммарный расход», «Максимальный расход», «Минимальный
        расход», «Средний расход» — вертикально, не в одну строку через точку. Группы видов
        топлива не объединяются и не складываются между собой. Строка «Фактический расход» не
        выводится — поле зарезервировано, источник данных не определён.

        ### Поведение

        - Виджет только отображает агрегаты; переход к карточкам ТС или фильтрация реестра по
          клику на строку в этой версии не предусмотрены.
        - При встраивании на главную страницу модуля фильтр по организационному объекту не
          задаётся — статистика по всему реестру ТС.
        - При встраивании на вкладку «Сведения» организационного объекта фильтр задаётся этим
          объектом, с учётом подчинённых объектов (ТС числятся за МЭС и ПМЭС).
        - Пустая выборка (нет ТС) — плашка 1 показывает «Всего ТС: 0» и нулевые строки по всем
          статусам, плашка 2 не выводится (нет видов топлива для показа).
        - Непустая выборка, но ни одно ТС ещё не прошло успешный расчёт — плашка 1 показывает
          реальные количества (не нули), плашка 2 остаётся на экране, но вместо строк по видам
          топлива показывает одну строку-заглушку «Нет ТС с успешным расчётом»: считать агрегаты
          ещё не по чему, но это не то же самое, что «плашка не выводится» (пустая выборка) —
          виджет остаётся на месте, просто без данных второй группы.
        - Плашка 2 считает только ТС с успешным расчётом, поэтому сумма количеств по видам
          топлива может быть меньше `TotalCount`. Чтобы расхождение не выглядело как потерянные
          ТС, под строками плашки 2 явно показывается строка «Без успешного расчёта: N ТС — не
          входят в агрегаты по топливу» — только когда такой остаток не нулевой.
        - Размещение на вкладке «Сведения»: виджет — отдельный блок **после** полей сведений об
          организационном объекте (Наименование, Вышестоящее подразделение и т. д.), не между ними
          и не до них — сведения об объекте остаются на экране единым блоком сверху.
        - Разрез по виду топлива — бензин/дизельное топливо, не по полному составу справочника
          {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Domain.DOC_FuelKind>()}: методика сама различает
          только эти два вида (например, секции `fuel.h_transport`/`fuel.h_trailer` — норма 2 л/100
          т·км для бензина, 1,3 для дизельного топлива, другие виды не предусмотрены расчётом), и
          виджет наследует то же ограничение, не вводит собственное.
        """";
    }
}