⟨/⟩ Ntr/50_Domain/ConsumptionModel/GroundContact.cs

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

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

using BasementAtticHeatingTypes = Rugrid.Sdaid.Epas.Ntr.Domain.Reference.BasementAtticHeatingTypes;

namespace Rugrid.Sdaid.Epas.Ntr.Domain.ConsumptionModel
{
    /// <summary>
    /// Доменная сущность. Перенесено дословно из ntr-01/domain/consumption-model/ground-contact.md.
    /// </summary>
    public class DOC_GroundContact : IDomainEntityDocument, IHasStructuralLinks, IFolder<NtrDomainFolder>
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.ConsumptionModel.DOC_ConsumptionModel>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.ConsumptionModel.DOC_ShapeAndDimensions>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.Reference.DOC_BasementAtticHeatingTypes>(),
        };

        public static string _refName = "Зона контакта с грунтом";

        public string Name => "Зона контакта с грунтом";

        public string Description => "Алиасы: Зона контакта с грунтом, Зона контакта с грунтом (сущность). parents: [consumption-model-diagram].";

        public string Version => "1.0";
        public string Status => "changed";

        public string[] Comments => new[]
        {
            "2026-08-31, фаза 5 миграции (сверка спеки с реализацией): в таблицу свойств добавлены атрибуты, которые есть в БД, но не были описаны в спеке.",
        };
        public Type Entity => typeof(GroundContact);
    }

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

        /// <summary>Модель потребления</summary>
        [Relation]
        [DomainField(Alias = "consumption_model_id", RequiredOnCreate = true, Immutable = true)]
        public ConsumptionModel? ConsumptionModel { get; set; }

        /// <summary>Наличие подвала</summary>
        [DomainField(Alias = "is_basement", RequiredOnCreate = true, RequiredForCalc = "Да", Default = "false")]
        public bool IsBasement { get; set; }

        /// <summary>Вид отопления подвала</summary>
        [Relation]
        [DomainField(Alias = "basement_heating_type_id", RequiredForCalc = "Да, если Наличие подвала=Да")]
        public BasementAtticHeatingTypes? BasementHeatingType { get; set; }

        /// <summary>Высота подвала</summary>
        [DomainField(Alias = "basement_height_m", RequiredForCalc = "Да, если Наличие подвала=Да", Range = "вещественное > 0")]
        public decimal BasementHeightM { get; set; }

        /// <summary>Уровень пола подвала</summary>
        [DomainField(Alias = "basement_floor_level_m", RequiredForCalc = "Да, если Наличие подвала=Да")]
        public decimal BasementFloorLevelM { get; set; }

        /// <summary>Площадь контакта при произвольной форме здания, м²</summary>
        [DomainField(
            Alias = "custom_ground_contact_area_m2",
            RequiredForCalc = "Да, если Форма и габариты (сущность) Форма здания=Другая",
            Unit = "м²",
            Range = "вещественное ≥ 0"
        )]
        public decimal CustomGroundContactAreaM2 { get; set; }

        /// <summary>Энергия теплопотерь, кВт·ч</summary>
        [DomainField(Alias = "heat_loss_energy_k_kwt_h", Calculated = "Да", Unit = "кВт·ч", Range = "вещественное > 0")]
        public decimal HeatLossEnergyKKwtH { get; set; }

        /// <summary>Мощность теплопотерь, кВт</summary>
        [DomainField(Alias = "heat_loss_power_kwt", Calculated = "Да", Unit = "кВт", Range = "вещественное > 0")]
        public decimal HeatLossPowerKwt { get; set; }

        /// <summary>Приведённое сопротивление теплопередаче ЗКГ, м²·°C/Вт</summary>
        [DomainField(
            Alias = "thermal_resistance_m2c_per_wt",
            RequiredForCalc = "Да",
            Calculated = "Да",
            Unit = "м²·°C/Вт",
            Range = "вещественное > 0"
        )]
        public decimal ThermalResistanceM2cPerWt { get; set; }

        /// <summary>Площадь контакта с грунтом, м²</summary>
        [DomainField(Alias = "ground_contact_area_m2", RequiredForCalc = "Да", Calculated = "Да", Unit = "м²", Range = "вещественное > 0")]
        public decimal GroundContactAreaM2 { get; set; }

        /// <summary>Площадь стен подвала, м²</summary>
        [DomainField(
            Alias = "basement_wall_area_m2",
            RequiredForCalc = "Да, если Наличие подвала=Да",
            Calculated = "Да",
            Unit = "м²",
            Range = "вещественное > 0"
        )]
        public decimal BasementWallAreaM2 { get; set; }

        /// <summary>Площадь пола, м²</summary>
        [DomainField(Alias = "ground_floor_area_m2", RequiredForCalc = "Да", Calculated = "Да", Unit = "м²", Range = "вещественное > 0")]
        public decimal GroundFloorAreaM2 { get; set; }

        /// <summary>Площадь пола, м²</summary>
        [DomainField(
            Alias = "cover_area_m2",
            Calculated = "Да",
            Unit = "м²",
            Description = "Колонка есть в БД, значение не заполняется: сеттер в домене не вызывается"
        )]
        public decimal CoverAreaM2 { get; set; }

        /// <summary>Площадь зоны I</summary>
        [DomainField(Alias = "zone_i_area_m2", RequiredForCalc = "Да", Calculated = "Да", Unit = "м²", Range = "вещественное > 0")]
        public decimal ZoneIAreaM2 { get; set; }

        /// <summary>Площадь зоны II</summary>
        [DomainField(Alias = "zone_ii_area_m2", RequiredForCalc = "Да, если ...", Calculated = "Да", Unit = "м²", Range = "вещественное ≥ 0")]
        public decimal ZoneIiAreaM2 { get; set; }

        /// <summary>Площадь зоны III</summary>
        [DomainField(Alias = "zone_iii_area_m2", RequiredForCalc = "Да, если ...", Calculated = "Да", Unit = "м²", Range = "вещественное ≥ 0")]
        public decimal ZoneIiiAreaM2 { get; set; }

        /// <summary>Площадь зоны IV</summary>
        [DomainField(Alias = "zone_iv_area_m2", RequiredForCalc = "Да, если ...", Calculated = "Да", Unit = "м²", Range = "вещественное ≥ 0")]
        public decimal ZoneIvAreaM2 { get; set; }
    }

}