Энергопрофиль
Алиасы: Энергопрофиль, Энергопрофиль здания. parents: [energy-profile-diagram].
Поведение:
- Энергопрофиль создаётся только автоматически на основе задания на сбор профилей по зданиям орг. объектам за отчётный период. Создаётся один на одно здания на отчётный период.
- При сохранении или по отдельной кнопке "Проверить энергопрофиль" должна выполняться проверка выполнения условий сохранения ЭП (см. ниже).
- Сохранение энергопрофиля в статусе "Сформирован" блокирует внесение изменений в модели энергопрофиля: модели нельзя редактировать, удалять, удалять из ЭП.
При сохранении Энергопрофиля необходимо выполнять Проверить энергопрофиль:
**Условия, обязательные для сохранения Энергопрофиля:
Если статус Энергопрофиля "Энергопрофиль. Статус" ==
Формируется: сохранять в любом виде.Если статус Энергопрофиля "Энергопрофиль. Статус" ==
Сформирован, то должны выполняться условия:Определены модели для всех видов расчётов. Для каждого вида расчёта \(k\) определена модель потребления \(M^{k}\):
Все виды расчётов выполнены. Статус расчёта каждой из моделей \(M^{k}\) "Модель потребления. Статус расчёта" ==
Успешно выполнен.Несущий слой стен не менялся: не меняются параметры
InputModel:Walls.CarrierLayerThermalConductivity;Walls.CarrierLayerThickness.
Несущий слой ВП не менялся: не меняются параметры
InputModel:Roof.FloorMaterialThermalConductivity;Roof.FloorMaterialThickness.
Оконные проёмы не меняются. Для каждой модели \(M^k\) вычисляется количество проёмов \(N_{окон}^k(i,a)\) площади \(a\) на стороне здания \(i\in{[A,B,C,D,E,F,G,H]}\):
\(N_{окон}^{k}(i, a) = \sum_{j,; a=a_{окон}^k(j)} {N_{окон}^k(i,j)}\)
где:
- \(a_{окон}^{k}(j)\) - площадь проёма вида окон \(j\) в модели \(M^k\):
Windows[j].OpeningArea; - \(N_{окон}^k(i, j)\) - количество проёмов вида окон \(j\) на стороне здания \(i\in{[A,B,C,D,E,F,G,H]}\) в модели \(M^k\):
Windows[j].OpeningsSideA, ...,Windows[j].OpeningsSideH.
Количества проёмов \(N_{окон}^k(i,a)\) для всех видов расчётов \(k\) должно быть одинаковым.
- \(a_{окон}^{k}(j)\) - площадь проёма вида окон \(j\) в модели \(M^k\):
Воротные проёмы не меняются. Для каждой модели \(M^k\) вычисляется количество проёмов \(N_{ворот}^{k}(i,a)\) площади \(a\) на стороне здания \(i\in{[A,B,C,D,E,F,G,H]}\):
\(N_{ворот}^{k}(i, a) = \sum_{j,; a = a_{ворот}^{k}(j)} N_{ворот}^{k}(i, j)\)
где:
- \(a_{ворот}^{k}(j)\) — площадь проёма вида ворот \(j\) в модели \(M^k\):
Doors[j].OpeningArea; - \(N_{ворот}^{k}(i, j)\) — количество проёмов вида ворот \(j\) на стороне здания \(i\in{A,B,C,D,E,F,G,H}\) в модели \(M^k\):
Doors[j].OpeningsSideA, ...,Doors[j].OpeningsSideH.
Количества проёмов \(N_{в}^{k}(i, a)\) для всех видов расчётов \(k\) должно быть одинаковым.
- \(a_{ворот}^{k}(j)\) — площадь проёма вида ворот \(j\) в модели \(M^k\):
Сопротивления теплопередаче всех элементов ограждающей конструкции здания не ухудшаются. Приведённые сопротивления теплопередаче \(R_{e}^{k}\) каждого элемента ограждающей конструкции здания \(e\in{[стен, окон, ворот, ВОК]}\) для различных видов расчётов \(k\) удовлетворяют условиям:
- \(R_{e}^{Т} ≥ R_{e}^{Э} ≥ R_{e}^{Н}\).
На \(R^{П}_e\) требование не распространяется.
Форма и габариты здания не менялись. Для всех моделей \(M^{k}\) в
InputModelопределены одинаковые параметры секцииGeometry.Функциональное назначение здания не меняется. Для всех моделей \(M^{k}\) определено одинаковое функциональное назначение здания: не меняются параметры
InputModel, определяемые функциональным назначением:OperatingConditions.NormativeSpecificHeatConsumption;OperatingConditions.AirConsumptionPerPerson.
Система отопления здания не меняется. Для всех моделей \(M^{k}\) определён один тип системы отопления:
OperatingConditions.HeatingType.Высота подвала не меняется. Для всех моделей \(M^{k}\) определена одинаковая высота подвала:
GroundContact.BasementHeight
Если условия выполняются, сохранить ЭП, перейти в режим просмотра. Если нет, подсветить ошибку: сообщить об ошибке, предупредить, что при сохранении статус ЭП будет сброшен в Формируется, предложить: отменить, выполнить.
Связи
classDiagram
direction LR
class EnergyProfile {
+Guid id
+EnergyProfileCollectionTask energy_profile_collection_task_id
+Building building_id
+String name
+ConsumptionModel normative_calculation_model_id
+ConsumptionModel standard_calculation_model_id
+ConsumptionModel technological_calculation_model_id
+ConsumptionModel custom_calculation_model_id
+EnergyProfileStatus status_id
+ModelConsistencyStatus model_consistency_status_id
}
class EnergyProfileCollectionTask
class Building
class ConsumptionModel
class EnergyProfileStatus
class ModelConsistencyStatus
EnergyProfile "1" --> "1" EnergyProfileCollectionTask : energy_profile_collection_task_id
EnergyProfile "1" --> "1" Building : building_id
EnergyProfile "0..1" --> "1" ConsumptionModel : normative_calculation_model_id
EnergyProfile "0..1" --> "1" ConsumptionModel : standard_calculation_model_id
EnergyProfile "0..1" --> "1" ConsumptionModel : technological_calculation_model_id
EnergyProfile "0..1" --> "1" ConsumptionModel : custom_calculation_model_id
EnergyProfile "1" --> "1" EnergyProfileStatus : status_id
EnergyProfile "1" --> "1" ModelConsistencyStatus : model_consistency_status_id
Структура
| Наименование | Атрибут | Тип | Обязательно для создания | Вычисляемый, методика | Диапазон / формат | Значение по умолчанию | Неизменяемость | Описание |
|---|---|---|---|---|---|---|---|---|
| Идентификатор записи | id | Guid | Да | Да | ||||
| Задание на сбор энергопрофилей | energy_profile_collection_task_id | EnergyProfileCollectionTask | Да | Да | ||||
| Здание | building_id | Building | Да | Да | ||||
| Наименование | name | String | Нет | Да, вычисляется при чтении / на UI; не хранится. Формула: "{FK → Здание. Наименование} ({FK → Задание на сбор энергопрофилей. Год начала отчётного периода}-{Задание на сбор энергопрофилей. Год окончания отчётного периода})" Пример: Гараж №1 (2026-2026) | ||||
| Модель нормативного расчёта | normative_calculation_model_id | ConsumptionModel | Нет | Если выбрана, то может быть только модель с Вид расчёта == Нормативный | ||||
| Модель эталонного расчёта | standard_calculation_model_id | ConsumptionModel | Нет | Если выбрана, то может быть только модель с Вид расчёта == Эталонный | ||||
| Модель технологического расчёта | technological_calculation_model_id | ConsumptionModel | Нет | Если выбрана, то может быть только модель с Вид расчёта == Технологический | ||||
| Модель произвольного расчёта | custom_calculation_model_id | ConsumptionModel | Нет | Если выбрана, то может быть только модель с Вид расчёта == Произвольный | ||||
| Статус энергопрофиля | status_id | EnergyProfileStatus | Да | {Формируется; Сформирован} | Формируется | Устанавливается пользователем | ||
| Статус выполнения условий расчётов | model_consistency_status_id | ModelConsistencyStatus | Да | Да | {Выполнены; Не выполнены}. | Не выполнены | Вычисляется автоматически |
Исходник
public class EnergyProfile
{
/// <summary>Идентификатор записи</summary>
[DomainField(Alias = "id", RequiredOnCreate = true, Immutable = true)]
public Guid Id { get; set; }
/// <summary>Задание на сбор энергопрофилей</summary>
[Relation]
[DomainField(Alias = "energy_profile_collection_task_id", RequiredOnCreate = true, Immutable = true)]
public EnergyProfileCollectionTask? EnergyProfileCollectionTask { get; set; }
/// <summary>Здание</summary>
[Relation]
[DomainField(Alias = "building_id", RequiredOnCreate = true, Immutable = true)]
public Building? Building { get; set; }
/// <summary>Наименование</summary>
[DomainField(
Alias = "name",
Calculated = "Да, вычисляется при чтении / на UI; не хранится. Формула: \"{FK → Здание. Наименование} ({FK → Задание на сбор энергопрофилей. Год начала отчётного периода}-{Задание на сбор энергопрофилей. Год окончания отчётного периода})\" Пример: Гараж №1 (2026-2026)"
)]
public string? Name { get; set; }
/// <summary>Модель нормативного расчёта</summary>
[Relation]
[DomainField(Alias = "normative_calculation_model_id", Range = "Если выбрана, то может быть только модель с `Вид расчёта` == `Нормативный`")]
public ConsumptionModelEntity? NormativeCalculationModel { get; set; }
/// <summary>Модель эталонного расчёта</summary>
[Relation]
[DomainField(Alias = "standard_calculation_model_id", Range = "Если выбрана, то может быть только модель с `Вид расчёта` == `Эталонный`")]
public ConsumptionModelEntity? StandardCalculationModel { get; set; }
/// <summary>Модель технологического расчёта</summary>
[Relation]
[DomainField(
Alias = "technological_calculation_model_id",
Range = "Если выбрана, то может быть только модель с `Вид расчёта` == `Технологический`"
)]
public ConsumptionModelEntity? TechnologicalCalculationModel { get; set; }
/// <summary>Модель произвольного расчёта</summary>
[Relation]
[DomainField(Alias = "custom_calculation_model_id", Range = "Если выбрана, то может быть только модель с `Вид расчёта` == `Произвольный`")]
public ConsumptionModelEntity? CustomCalculationModel { get; set; }
/// <summary>Статус энергопрофиля</summary>
[Relation]
[DomainField(
Alias = "status_id",
RequiredOnCreate = true,
Range = "{Формируется; Сформирован}",
Default = "Формируется",
Description = "Устанавливается пользователем"
)]
public EnergyProfileStatus? Status { get; set; }
/// <summary>Статус выполнения условий расчётов</summary>
[Relation]
[DomainField(
Alias = "model_consistency_status_id",
RequiredOnCreate = true,
Calculated = "Да",
Range = "{Выполнены; Не выполнены}.",
Default = "Не выполнены",
Description = "Вычисляется автоматически"
)]
public ModelConsistencyStatus? ModelConsistencyStatus { get; set; }
}Структурные связи
Использует
- Доменная сущность Задание на сбор энергопрофиля (сущность)
- Доменная сущность Здание (сущность)
- Доменная сущность Модель потребления
- Доменная сущность Статус выполнения условий расчётов
- Доменная сущность Статус энергопрофиля
Используется
- Доменная сущность Задание на сбор энергопрофиля (сущность)
- Компонент Вкладка "Реестр моделей потребления
- Компонент Вкладка «Реестр энергопрофилей»
- Прикладной сервис Эталоны и нормативы потребления ТЭР зданиями
- Экран Карточка "Энергопрофиль здания
- BC-модуль Домен
Связанные артефакты
Документы
- Доменная сущность Модель потребления