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

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

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

using BasementAtticHeatingTypes = Rugrid.Sdaid.Epas.Ntr.Domain.Reference.BasementAtticHeatingTypes;
using InsulationMaterial = Rugrid.Sdaid.Epas.Ntr.Domain.Reference.InsulationMaterial;
using Material = Rugrid.Sdaid.Epas.Ntr.Domain.Reference.Material;
using RoofType = Rugrid.Sdaid.Epas.Ntr.Domain.Reference.RoofType;

namespace Rugrid.Sdaid.Epas.Ntr.Domain.ConsumptionModel
{
    /// <summary>
    /// Доменная сущность. Перенесено дословно из ntr-01/domain/consumption-model/roof-model.md.
    /// </summary>
    public class DOC_RoofModel : 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.Reference.DOC_BasementAtticHeatingTypes>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.Reference.DOC_BuildingShape>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.Reference.DOC_InsulationMaterial>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.Reference.DOC_Material>(),
            Rel.Uses<Rugrid.Sdaid.Epas.Ntr.Domain.Reference.DOC_RoofType>(),
        };

        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, CR «Расчёт площади ВОК для четырёхскатных крыш»: добавлен атрибут «Длина конька, м» — исходный параметр расчёта площади покрытия вальмовой крыши.",
        };
        public Type Entity => typeof(RoofModel);
    }

    /// <summary>
    /// Доменная сущность «ВОК».
    /// Класс — источник структуры: таблица свойств и диаграмма связей на странице документа
    /// строятся генератором по нему. Прозу и разбор ведёт документ DOC_RoofModel.
    /// </summary>
    [DomainEntity]
    public class RoofModel
    {
        /// <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>
        [Relation]
        [DomainField(Alias = "roof_type_id", RequiredForCalc = "Да")]
        public RoofType? RoofType { get; set; }

        /// <summary>Площадь ВОК при произвольной форме здания, м²</summary>
        [DomainField(
            Alias = "custom_upper_enclosure_area",
            RequiredForCalc = "Да, при произвольной форме здания (Форма здания. Код = \"other\")",
            Unit = "м²",
            Range = "вещественное > 0"
        )]
        public decimal CustomUpperEnclosureArea { get; set; }

        /// <summary>Наличие чердачного помещения</summary>
        [DomainField(Alias = "has_attic", RequiredOnCreate = true, RequiredForCalc = "Да", Range = "{false; true}", Default = "false")]
        public bool HasAttic { get; set; }

        /// <summary>Тип отопления чердачного помещения</summary>
        [Relation]
        [DomainField(Alias = "attic_heating_type_id")]
        public BasementAtticHeatingTypes? AtticHeatingType { get; set; }

        /// <summary>Уровень верхнего перекрытия, м</summary>
        [DomainField(Alias = "upper_floor_level_m", RequiredForCalc = "Да", Unit = "м", Range = "вещественное > 0")]
        public decimal UpperFloorLevelM { get; set; }

        /// <summary>Длина конька, м</summary>
        [DomainField(
            Alias = "ridge_length_m",
            RequiredForCalc = "Да, если Тип крыши.Код = \"hipped\"",
            Unit = "м",
            Range = "вещественное, 0 < L_конька < Размер по габариту A"
        )]
        public decimal RidgeLengthM { get; set; }

        /// <summary>Верхнее перекрытие: материал несущего слоя</summary>
        [Relation]
        [DomainField(Alias = "floor_slab_bearing_material_id", RequiredForCalc = "Да")]
        public Material? FloorSlabBearingMaterial { get; set; }

        /// <summary>Верхнее перекрытие: толщина несущего слоя, мм</summary>
        [DomainField(Alias = "floor_slab_bearing_thickness_mm", RequiredForCalc = "Да", Unit = "мм", Range = "вещественное > 0")]
        public decimal FloorSlabBearingThicknessMm { get; set; }

        /// <summary>Верхнее перекрытие: материал утеплителя</summary>
        [Relation]
        [DomainField(Alias = "floor_slab_insulation_material_id")]
        public InsulationMaterial? FloorSlabInsulationMaterial { get; set; }

        /// <summary>Верхнее перекрытие: толщина утеплителя, мм</summary>
        [DomainField(
            Alias = "floor_slab_insulation_thickness_mm",
            RequiredForCalc = "Да, если указан материал утеплителя перекрытия И Материал утеплителя.Наименование != \"Нет\"",
            Unit = "мм",
            Range = "вещественное > 0"
        )]
        public decimal FloorSlabInsulationThicknessMm { get; set; }

        /// <summary>Перекрытие крыши: материал утеплителя</summary>
        [Relation]
        [DomainField(Alias = "roof_surface_insulation_material_id")]
        public InsulationMaterial? RoofSurfaceInsulationMaterial { get; set; }

        /// <summary>Перекрытие крыши: толщина утеплителя, мм</summary>
        [DomainField(
            Alias = "roof_surface_insulation_thickness_mm",
            RequiredForCalc = "Да, если указан материал утеплителя крыши И Материал утеплителя. Наименование != \"Нет\"",
            Unit = "мм",
            Range = "вещественное > 0"
        )]
        public decimal RoofSurfaceInsulationThicknessMm { 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", Calculated = "Да", Unit = "м²·°C/Вт", Range = "вещественное > 0")]
        public decimal ThermalResistanceM2cPerWt { get; set; }

        /// <summary>Площадь ВОК, м²</summary>
        [DomainField(Alias = "area", Calculated = "Да", Unit = "м²", Range = "Вещественное (0; 10000000]")]
        public decimal Area { get; set; }

        /// <summary>Площадь стен чердака, м²</summary>
        [DomainField(
            Alias = "attic_wall_area",
            Calculated = "Да",
            Unit = "м²",
            Range = "если \"Наличие чердачного помещения\" = \"Да\", то Вещественное (0; 10000000]"
        )]
        public decimal AtticWallArea { get; set; }

        /// <summary>Площадь покрытия крыши, м²</summary>
        [DomainField(Alias = "roof_cover_area", Calculated = "Да", Unit = "м²", Range = "Вещественное (0; 10000000]")]
        public decimal RoofCoverArea { get; set; }
    }

}