Задание на сбор энергопрофиля (сущность)

Доменная сущность Версия: 1.0 accepted

Алиасы: Задание на сбор энергопрофиля (сущность). parents: [energy-profile-collection-task-diagram].

⟨/⟩ Исходник

Поведение:

Операция "Создать энергопрофили по заданию":

  1. Область зданий. Выбираются все Здания, у которых nav_id входит в поддерево Организационного объекта задания: сам узел task.org_object_id и все нижестоящие по иерархии (Компания → Исполнительный аппарат / МЭС → ПМЭС → Подстанция). Здания, привязанные к оргобъектам вне этого поддерева, не участвуют.
  2. Период эксплуатации здания (start_date / finish_date) не учитывается на этапе создания профилей. Возможное ужесточение (фильтрация по пересечению отчётного периода задания и периода эксплуатации здания) — отложено.
  3. Уникальность. На пару (task_id, building_id) создаётся один Энергопрофиль. Если для такой пары профиль уже существует — он не пересоздаётся и его поля не меняются. Ничего не удаляется.
  4. Идемпотентность. Повторный запуск операции для того же задания безопасен: уже существующие профили остаются без изменений, новые создаются только для зданий, у которых профиля в рамках этого задания ещё не было.
  5. Предусловие по статусу задания. Если task_status.code = "completed" (Сбор завершён), запуск операции запрещён — возвращается ошибка.
  6. Начальные значения создаваемого Энергопрофиля:
    • energy_profile_collection_task_id = task.id;
    • building_id = b.id;
    • name — не сохраняется: формируется при чтении / на UI по формуле из домена (см. Энергопрофиль). При создании профиля не записывается.
    • все ссылки на модели потребления (normative_calculation_model_id, standard_calculation_model_id, technological_calculation_model_id, custom_calculation_model_id) — null (заполняются отдельной операцией);
    • status_id — статус Статус энергопрофиля с code = "in_progress" (Формируется).

Связи

classDiagram
    direction LR
    class EnergyProfileCollectionTask {
        +Guid id
        +OrgObject nav_id
        +String name
        +Int32 report_period_start
        +Int32 report_period_finish
        +DateTime collect_period_start
        +DateTime collect_period_finish
        +TaskStatus status_id
    }
    class OrgObject
    class TaskStatus
    EnergyProfileCollectionTask "1" --> "1" OrgObject : nav_id
    EnergyProfileCollectionTask "1" --> "1" TaskStatus : status_id

Структура

НаименованиеАтрибутТипОбязательно для созданияВычисляемый, методикаЗначение по умолчаниюНеизменяемостьОписание
Идентификатор записиidGuidДаДа
Организационный объектnav_idOrgObjectДаДа
НаименованиеnameStringДаДа, вычисляется при чтении / на UI; не хранится. Маска: $"{{FK → Организационный объект. Наименование} ({Год начала отчётного периода}-{Год окончания отчётного периода})" Пример: ПАО «Россети» (2026-2026)
Год начала отчётного периодаreport_period_startInt32ДаТекущий год
Год окончания отчётного периодаreport_period_finishInt32ДаТекущий год
Дата начала сбора данныхcollect_period_startDateTimeДаТекущая дата
Дата окончания сбора данныхcollect_period_finishDateTimeДаТекущая дата + месяц
Статусstatus_idTaskStatusДаfalseустанавливается пользователем

Исходник

    public class EnergyProfileCollectionTask
    {
        /// <summary>Идентификатор записи</summary>
        [DomainField(Alias = "id", RequiredOnCreate = true, Immutable = true)]
        public Guid Id { get; set; }

        /// <summary>Организационный объект</summary>
        [Relation]
        [DomainField(Alias = "nav_id", RequiredOnCreate = true, Immutable = true)]
        public OrgObject? Nav { get; set; }

        /// <summary>Наименование</summary>
        [DomainField(
            Alias = "name",
            RequiredOnCreate = true,
            Calculated = "Да, вычисляется при чтении / на UI; не хранится. Маска: $\"{{FK → Организационный объект. Наименование} ({Год начала отчётного периода}-{Год окончания отчётного периода})\" Пример: ПАО «Россети» (2026-2026)"
        )]
        public string? Name { get; set; }

        /// <summary>Год начала отчётного периода</summary>
        [DomainField(Alias = "report_period_start", RequiredOnCreate = true, Default = "Текущий год")]
        public int ReportPeriodStart { get; set; }

        /// <summary>Год окончания отчётного периода</summary>
        [DomainField(Alias = "report_period_finish", RequiredOnCreate = true, Default = "Текущий год")]
        public int ReportPeriodFinish { get; set; }

        /// <summary>Дата начала сбора данных</summary>
        [DomainField(Alias = "collect_period_start", RequiredOnCreate = true, Default = "Текущая дата")]
        public DateTime CollectPeriodStart { get; set; }

        /// <summary>Дата окончания сбора данных</summary>
        [DomainField(Alias = "collect_period_finish", RequiredOnCreate = true, Default = "Текущая дата + месяц")]
        public DateTime CollectPeriodFinish { get; set; }

        /// <summary>Статус</summary>
        [Relation]
        [DomainField(Alias = "status_id", RequiredOnCreate = true, Default = "false", Description = "устанавливается пользователем")]
        public TaskStatus? Status { get; set; }
    }

}

Связанные артефакты

Документы