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

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

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

using Building = Rugrid.Sdaid.Epas.Ntr.Domain.BuildingModel.Building;
using CalcKind = Rugrid.Sdaid.Epas.Ntr.Domain.Reference.SysReference.CalcKind;
using CalcStatus = Rugrid.Sdaid.Epas.Ntr.Domain.Reference.SysReference.CalcStatus;
using EnergyEfficiencyClasses = Rugrid.Sdaid.Epas.Ntr.Domain.Reference.EnergyEfficiencyClasses;

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

        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-09-01, CR «Расчёт площади ВОК для четырёхскатных крыш»: в диаграмме связей у ВОК показан атрибут «Длина конька».",
        };

                public Type Entity => typeof(ConsumptionModel);

        public static string Body = """"

[[consumption-model|Модель потребления (сущность)]] - корневая сущность [[consumption-model-diagram|Модель потребления (модель)]], которая описывает условия и эффективность потребления [[../building-model/building-diaram|Зданием]] тепловой (ТЭ) и электрической (ЭЭ) энергии. Расчётные атрибуты [[consumption-model|Модель потребления (сущность)]] - сводные расчётные параметры по [[consumption-model-diagram|Модель потребления (модель)]]. 

Здание может быть связано со зданием в смежной системе [[../../../ais-oia-peo|АИС ОИА ПЭО]]. В этом случае для Здания должна бать создана [[consumption-model-diagram|Модель потребления (модель)]] с признаком [[consumption-model|Модель потребления (сущность)]] "Базовая модель" = "Да", она обязана отражать актуальные данные здания в смежной системе. Если признак "Базовая модель" = "Да", часть данных модели, находящаяся в ответственности АИС ОИА ПЭО, не редактируется пользователем. Для её изменения необходимо, вне функциональности [[../../../service-enter|Сервис ЭНЗС]], внести изменения в АИС ОИА ПЭО и выполнить синхронизацию данных.
"""";

    }

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

        /// <summary>Наименование</summary>
        [DomainField(Alias = "name", RequiredOnCreate = true, Default = "\"{Здание. Наименование} {дата и время создания}\"")]
        public string? Name { get; set; }

        /// <summary>Здание</summary>
        [Relation]
        [DomainField(Alias = "building_id", RequiredOnCreate = true, Immutable = true)]
        public Building? Building { get; set; }

        /// <summary>Класс энергоэффективности</summary>
        [Relation]
        [DomainField(
            Alias = "energy_efficiency_class_id",
            Calculated = "Да, `te.class_by_deviation`",
            Range = "возможные значения справочника: {E, D, C-, C, C+, B, B+, A, A+, A++}"
        )]
        public EnergyEfficiencyClasses? EnergyEfficiencyClass { get; set; }

        /// <summary>Отклонение расчётной характеристики от нормативной, %</summary>
        [DomainField(
            Alias = "calc_from_norm_deviation_perc",
            Calculated = "Да, `te.deviation_percent`",
            Unit = "`%`",
            Range = "Вещественное [-100; 100]"
        )]
        public decimal CalcFromNormDeviationPerc { get; set; }

        /// <summary>Удельная характеристика расхода ТЭ (расчётная), Вт/(м3∙℃)</summary>
        [DomainField(
            Alias = "specific_heat_consumption_wt_per_m3c",
            Calculated = "Да, `te.calc_specific_characteristic`",
            Unit = "`Вт/(м³·°C)`",
            Range = "Вещественное (0; 100]"
        )]
        public decimal SpecificHeatConsumptionWtPerM3c { get; set; }

        /// <summary>Удельная характеристика расхода ТЭ (нормативная), Вт/(м3∙℃)</summary>
        [DomainField(Alias = "specific_heat_consumption_norm_wt_per_m3c", Calculated = "Да", Unit = "`Вт/(м³·°C)`", Range = "Вещественное (0; 100]")]
        public decimal SpecificHeatConsumptionNormWtPerM3c { get; set; }

        /// <summary>Удельная теплозащитная характеристика</summary>
        [DomainField(
            Alias = "specific_heat_protection_wt_per_m3c",
            Calculated = "Да, `te.spec_heat_protect_char`",
            Unit = "`Вт/(м³·°C)`",
            Range = "Вещественное (0; 100]"
        )]
        public decimal SpecificHeatProtectionWtPerM3c { get; set; }

        /// <summary>Удельная характеристика внутренних теплопоступлений, Вт/(м³·°C)</summary>
        [DomainField(
            Alias = "specific_internal_heat_gains_wt_per_m3c",
            Calculated = "Да, `te.spec_internal_heat_gain_char`",
            Unit = "`Вт/(м³·°C)`",
            Range = "Вещественное (0; 100]"
        )]
        public decimal SpecificInternalHeatGainsWtPerM3c { get; set; }

        /// <summary>Удельная характеристика теплопоступлений от солнечной радиации, Вт/(м³·°C)</summary>
        [DomainField(
            Alias = "specific_solar_heat_gains_wt_per_m3c",
            Calculated = "Да, `te.spec_solar_gain_char`",
            Unit = "`Вт/(м³·°C)`",
            Range = "Вещественное (0; 100]"
        )]
        public decimal SpecificSolarHeatGainsWtPerM3c { get; set; }

        /// <summary>Коэффициент полезного использования теплопоступлений</summary>
        [DomainField(Alias = "coef_heat_gains_utilization", Calculated = "Да, `te.heat_gain_utilization_factor`", Range = "Вещественное (0; 100]")]
        public decimal CoefHeatGainsUtilization { get; set; }

        /// <summary>Площадь теплозащитной оболочки здания, м²</summary>
        [DomainField(Alias = "heat_envelope_area_m2", Calculated = "Да, `te.envelope_area`", Unit = "`м²`", Range = "Вещественное (0; 10000000]")]
        public decimal HeatEnvelopeAreaM2 { get; set; }

        /// <summary>Приведённое сопротивление теплозащитной оболочки, м²·°C/Вт</summary>
        [DomainField(
            Alias = "heat_envelope_thermal_resistance_m2c_per_wt",
            Calculated = "Да, `te.envelope_thermal_resistance`",
            Unit = "`м²·°C/Вт`",
            Range = "Вещественное (0; 1000]"
        )]
        public decimal HeatEnvelopeThermalResistanceM2cPerWt { get; set; }

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

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

        /// <summary>Потребление ЭЭ на хозяйственно-бытовые нужды, кВт·ч</summary>
        [DomainField(Alias = "ee_consumption_kwt_h", Calculated = "Да, ee.ee_consumption_kwh", Unit = "`кВт·ч`", Range = "Вещественное [0; 1000000]")]
        public decimal EeConsumptionKwtH { get; set; }

        /// <summary>Потребление ТЭ на отопление и вентиляцию, кВт·ч</summary>
        [DomainField(
            Alias = "te_consumption_kwt_h",
            Calculated = "Да, `te.te_consumption_kwh`",
            Unit = "`кВт·ч`",
            Range = "Вещественное [0; 1000000]"
        )]
        public decimal TeConsumptionKwtH { get; set; }

        /// <summary>Потребление ТЭ на отопление и вентиляцию, Гкал</summary>
        [DomainField(
            Alias = "te_consumption_gcal",
            Calculated = "Да, `te.te_consumption_gcal`",
            Unit = "`Гкал`",
            Range = "Вещественное [0; 1000000]"
        )]
        public decimal TeConsumptionGcal { get; set; }

        /// <summary>Общее потребление ТЭ зданием, кВт·ч</summary>
        [DomainField(
            Alias = "summary_te_consumption_kwt_h",
            Calculated = "Да, `summary.te_consumption_kwh`",
            Unit = "`кВт·ч`",
            Range = "Вещественное [0; 1000000]"
        )]
        public decimal SummaryTeConsumptionKwtH { get; set; }

        /// <summary>Общее потребление ТЭ зданием, Гкал</summary>
        [DomainField(
            Alias = "summary_te_consumption_gcal",
            Calculated = "Да, `summary.te_consumption_gcal`",
            Unit = "`Гкал`",
            Range = "Вещественное [0; 1000000]"
        )]
        public decimal SummaryTeConsumptionGcal { get; set; }

        /// <summary>Общее потребление ЭЭ зданием, кВт·ч</summary>
        [DomainField(
            Alias = "summary_ee_consumption_kwt_h",
            Calculated = "Да, `summary.ee_consumption_kwh`",
            Unit = "`кВт·ч`",
            Range = "Вещественное [0; 1000000]"
        )]
        public decimal SummaryEeConsumptionKwtH { get; set; }

        /// <summary>Журнал расчёта</summary>
        [DomainField(Alias = "calc_log_json", RequiredOnCreate = true, Calculated = "Да")]
        public string? CalcLogJson { get; set; }

        /// <summary>Ошибки расчёта</summary>
        [DomainField(
            Alias = "calc_errors_json",
            RequiredOnCreate = true,
            Calculated = "Да",
            Description = "Ошибки расчёта (`CmCalcErrors`) в виде JSON"
        )]
        public string? CalcErrorsJson { get; set; }

        /// <summary>Дата выполнения расчёта</summary>
        [DomainField(Alias = "calc_date", Calculated = "Да", Description = "Дата и время выполнения расчёта")]
        public DateTime CalcDate { get; set; }

        /// <summary>Базовая модель</summary>
        [DomainField(Alias = "is_base_model", RequiredOnCreate = true, Calculated = "Нет", Default = "false")]
        public bool IsBaseModel { get; set; }

        /// <summary>Статус расчёта</summary>
        [Relation]
        [DomainField(Alias = "calc_status_id", RequiredOnCreate = true, Calculated = "Да", Default = "Не выполнен")]
        public CalcStatus? CalcStatus { get; set; }

        /// <summary>Вид расчёта</summary>
        [Relation]
        [DomainField(Alias = "calc_kind_id", RequiredOnCreate = true, Calculated = "Нет", Range = "Строка до 50 символов", Default = "Произвольный")]
        public CalcKind? CalcKind { get; set; }
    }

}