⟨/⟩ Nts/50_Domain/SelectedModifications.cs

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

using System;
using Rugrid.Sdaid.Notation.Documents;

namespace Rugrid.Sdaid.Epas.Nts.Domain
{
    /// <summary>
    /// Связь расчёта ТС с отобранной для расчёта модификацией справочника «Модель, марка и
    /// модификация ТС». Явная сущность связи: строка хранит пару ключей (расчёт, модификация) —
    /// собственных бизнес-атрибутов у связи нет. Идентификатор и уникальность пары — см. Purpose.
    /// </summary>
    public class DOC_SelectedModifications : IDomainEntityDocument, IHasStructuralLinks, IFolder<NtsDomainFolder>
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<DOC_VehicleCalc>(),
            Rel.Uses<DOC_VehicleModification>(),
        };

        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 Type Entity => typeof(SelectedModifications);

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

            Связь «Расчёт ТС → Модификация ТС»: какие модификации справочника участвуют в расчёте.
            Базовая норма расхода топлива — среднее базовых норм отобранных модификаций
            (секция методики `fuel.base_norm`).

            Связь смоделирована отдельной сущностью, а не коллекцией в
            `VehicleCalc`: у неё две колонки-ключа, и так структура хранения видна явно — без
            интерпретации навигационной коллекции в связующую таблицу.

            **Идентификатор и уникальность.** Сущность следует общей инфраструктурной конвенции
            (`BaseEntity`) наравне со всеми остальными доменными сущностями модуля — суррогатный
            `Id`, не композитный ключ из двух FK. Это техническое решение, не бизнес-атрибут связи.
            Отдельно, именно как ограничение целостности — пара (`VehicleCalc`, `VehicleModification`)
            уникальна: одна и та же модификация не может быть отобрана для одного расчёта ТС более
            одного раза. Раньше это гарантировал сам композитный первичный ключ; с суррогатным
            `Id` это нужно задавать явно (уникальный индекс на паре колонок), иначе ограничение
            пропадёт незаметно.
            """;
    }

    /// <summary>
    /// Доменная сущность «Отобранные модификации ТС» — связь расчёта ТС с модификацией справочника.
    /// </summary>
    [DomainEntity]
    public class SelectedModifications
    {
        /// <summary>Идентификатор записи</summary>
        [DomainField(Alias = "id", RequiredOnCreate = true, Range = "UUID", Immutable = true)]
        public Guid Id { get; set; }

        /// <summary>Расчёт ТС</summary>
        [Relation]
        [DomainField(Alias = "vehicle_calc_id", RequiredOnCreate = true, Range = "UUID", Immutable = true,
            Description = "Вместе с VehicleModification — уникальная пара (см. «Идентификатор и уникальность» документа)")]
        public VehicleCalc? VehicleCalc { get; set; }

        /// <summary>Отобранная модификация ТС</summary>
        [Relation]
        [DomainField(Alias = "vehicle_modification_id", RequiredOnCreate = true, Range = "UUID", Immutable = true,
            Description = "Вместе с VehicleCalc — уникальная пара (см. «Идентификатор и уникальность» документа)")]
        public VehicleModification? VehicleModification { get; set; }
    }
}