Расчёт ТС

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

Расчёт нормативного расхода топлива транспортного средства: результаты расчёта, статус расчёта и журнал.

⟨/⟩ Исходник

1. Назначение

Расчёт ведётся по методике Методика расчёта расхода топлива. Вход собирается из Транспортное средство — характеристик ТС из АИС и данных, введённых в модуле; собственных входных параметров расчёт не хранит. Здесь лежат результаты расчёта, статус расчёта, журнал, статус загрузки данных из АИС и итоговый статус обработки ТС — вся эта сущность описывает процесс обработки ТС, а не само ТС.

Отдельная сущность выбрана потому, что Транспортное средство содержит и данные АИС, и данные модуля; импорт обновляет только поля АИС. Результаты, статус расчёта и журнал — собственность модуля, импорт их не трогает.

Связи

classDiagram
    direction LR
    class VehicleCalc {
        +Guid id
        +Vehicle vehicle_id
        +Decimal base_consumption_rate
        +Decimal min_base_consumption_rate
        +Decimal max_base_consumption_rate
        +Decimal reference_norm_consumption
        +Decimal reference_consumption_rate
        +Decimal mileage
        +Decimal correction_factor_winter
        +Decimal correction_factor_summer
        +Decimal suburb_coefficient
        +Decimal norm_consumption_winter
        +Decimal norm_consumption_summer
        +Decimal norm_consumption_urban
        +Decimal norm_consumption_suburban
        +Decimal norm_consumption
        +Decimal norm_consumption_by_using_heater
        +Decimal norm_consumption_mileage
        +Decimal cargo_mass
        +Decimal cargo_mileage
        +Decimal transport_work
        +Decimal transport_work_consumption_rate
        +Decimal trailer_mass_consumption_rate
        +Decimal norm_consumption_by_transport_work
        +Decimal norm_consumption_by_trailer_mass
        +Decimal dump_truck_consumption_rate
        +Decimal norm_consumption_by_trips
        +Decimal consumption_rate_for_special_equipment
        +Decimal special_vehicle_consumption_rate
        +Decimal special_work_consumption_rate
        +Decimal special_mileage_to_work
        +Decimal special_mileage_on_work
        +Decimal special_equipment_time
        +Decimal norm_consumption_move_winter
        +Decimal norm_consumption_move_summer
        +Decimal norm_consumption_move_urban
        +Decimal norm_consumption_move_suburban
        +Decimal norm_consumption_move
        +Decimal norm_consumption_stop_winter
        +Decimal norm_consumption_stop_summer
        +Decimal norm_consumption_stop_urban
        +Decimal norm_consumption_stop_suburban
        +Decimal norm_consumption_stop
        +CalculationStatus calculation_status_id
        +NtsModificationSelectionStatus modification_selection_status_id
        +NtsSelectionMethod selection_method_id
        +String calc_log_json
        +String calc_errors_json
        +DateTime calc_date
        +NtsAisLoadStatus ais_load_status_id
        +ProcessingStatus processing_status_id
    }
    class Vehicle
    class CalculationStatus
    class NtsModificationSelectionStatus
    class NtsSelectionMethod
    class NtsAisLoadStatus
    class ProcessingStatus
    VehicleCalc "1" --> "1" Vehicle : vehicle_id
    VehicleCalc "1" --> "1" CalculationStatus : calculation_status_id
    VehicleCalc "1" --> "1" NtsModificationSelectionStatus : modification_selection_status_id
    VehicleCalc "1" --> "1" NtsSelectionMethod : selection_method_id
    VehicleCalc "1" --> "1" NtsAisLoadStatus : ais_load_status_id
    VehicleCalc "1" --> "1" ProcessingStatus : processing_status_id

Структура

НаименованиеАтрибутТипОбязательно для созданияВычисляемый, методикаЕИДиапазон / форматЗначение по умолчаниюНеизменяемостьОписание
Идентификатор записиidGuidДаUUIDДа
Транспортное средствоvehicle_idVehicleДаДа
Базовая норма расхода топлива $H_s$, л/100 кмbase_consumption_rateDecimalНетДа, `fuel.base_norm` — базовая норма H_sл/100 кмвещественное, ≥ 0
Минимальная базовая норма отобранной группы $H_{min}$, л/100 кмmin_base_consumption_rateDecimalНетДа, `fuel.base_norm` — H_minл/100 кмвещественное, ≥ 0
Максимальная базовая норма отобранной группы $H_{max}$, л/100 кмmax_base_consumption_rateDecimalНетДа, `fuel.base_norm` — H_maxл/100 кмвещественное, ≥ 0
Эталонный расход $Q_{эт}$, лreference_norm_consumptionDecimalНетДа, `fuel.reference_consumption` — та же ветка категории ТС, что и Q_н, со входом H_эт вместо H_sлвещественное, ≥ 0
Эталонная норма расхода топлива $H_{эт}$, л/100 кмreference_consumption_rateDecimalНетДа, `fuel.reference_norm` — минимум по всей базовой группе, не только отобраннымл/100 кмвещественное, ≥ 0
Пробег $S$, кмmileageDecimalНетДа, `fuel.mileage`кмвещественное, ≥ 0
Поправочный коэффициент к норме в зимний период $D^{зима}$, %correction_factor_winterDecimalНетДа, `fuel.correction_factor_winter` — D^{зима}%вещественное
Поправочный коэффициент к норме в летний период $D^{лето}$, %correction_factor_summerDecimalНетДа, `fuel.correction_factor_summer` — D^{лето}%вещественное
Поправочный коэффициент при работе за пригородной зоной $D^{загор}$, %suburb_coefficientDecimalНетДа, `fuel.cf_suburb`%вещественное
Нормативный расход в зимний период $Q^{зима}$, лnorm_consumption_winterDecimalНетДа, `fuel.q_winter`, `fuel.bus_q_winter`, …лвещественное, ≥ 0
Нормативный расход в летний период $Q^{лето}$, лnorm_consumption_summerDecimalНетДа, `fuel.q_summer`, `fuel.bus_q_summer`, …лвещественное, ≥ 0
Нормативный расход в городском режиме $Q^{гор}$, лnorm_consumption_urbanDecimalНетДа, `fuel.q_urban` — Q^{гор}лвещественное, ≥ 0
Нормативный расход за пригородной зоной $Q^{загор}$, лnorm_consumption_suburbanDecimalНетДа, `fuel.q_suburban` — Q^{загор}лвещественное, ≥ 0
Нормативный расход $Q_н$, лnorm_consumptionDecimalНетДа, результат ветки категории ТС: `fuel.normative_consumption` — нормативный расход Q_нлвещественное, ≥ 0
Нормативный расход на работу отопителя $Q_{обор}$, лnorm_consumption_by_using_heaterDecimalНетДа, `fuel.q_equipment` — Q_{обор}лвещественное, ≥ 0
Нормативный расход на пробег $Q_{пробег}$, лnorm_consumption_mileageDecimalНетДа, `fuel.q_mileage` — нормативный расход на пробег Q_{пробег}; не применяется в ветке самосваловлвещественное, ≥ 0
Масса груза $G_{гр}$, тcargo_massDecimalНетДа, `fuel.g_cargo` — масса груза G_{гр}твещественное, ≥ 0
Пробег с грузом $S_{гр}$, кмcargo_mileageDecimalНетДа, `fuel.s_cargo` — S_{гр}кмвещественное, ≥ 0
Объём транспортной работы $W$, т·кмtransport_workDecimalНетДа, `fuel.w` — объём транспортной работы Wт·кмвещественное, ≥ 0
Норма расхода топлива на транспортную работу $H_w$, л/100 т·кмtransport_work_consumption_rateDecimalНетДа, `fuel.h_transport` — расчёт от вида топлива: H_wл/100 т·кмвещественное, ≥ 0
Норма расхода топлива на дополнительную массу прицепа $H_g$, л/100 т·кмtrailer_mass_consumption_rateDecimalНетДа, `fuel.h_trailer` — расчёт от вида топлива: H_gл/100 т·кмвещественное, ≥ 0
Нормативный расход на транспортную работу $Q_{трансп}$, лnorm_consumption_by_transport_workDecimalНетДа, `fuel.q_transport` — Q_{трансп}лвещественное, ≥ 0
Нормативный расход на массу прицепа $Q_{прицеп}$, лnorm_consumption_by_trailer_massDecimalНетДа, `fuel.q_trailer` — Q_{прицеп}лвещественное, ≥ 0
Норма расхода автомобиля-самосвала (автопоезда) $H_{sanc}$, л/100 кмdump_truck_consumption_rateDecimalНетДа, `fuel.h_sanc` — H_{sanc}л/100 кмвещественное, ≥ 0
Нормативный расход на ездки с грузом $Q_{ездки}$, лnorm_consumption_by_tripsDecimalНетДа, `fuel.q_trips` — Q_{ездки}лвещественное, ≥ 0
Норма расхода топлива на работу специального оборудования $H_т$, л/чconsumption_rate_for_special_equipmentDecimalНетДа, `fuel.h_special_equipment` — H_тл/чвещественное, ≥ 0
Норма специального автомобиля на пробег с учётом транспортной работы $H_{sc}$, л/100 кмspecial_vehicle_consumption_rateDecimalНетДа, `fuel.h_sc` — H_scл/100 кмвещественное, ≥ 0
Норма расхода топлива на пробег при выполнении специальной работы во время передвижения $H_s''$, л/100 кмspecial_work_consumption_rateDecimalНетДа, `fuel.h_s_special_work` — H_s''л/100 кмвещественное, ≥ 0
Пробег к месту работы и обратно $S'$, кмspecial_mileage_to_workDecimalНетДа, `fuel.s_special_to_work` — S'кмвещественное, ≥ 0
Пробег при выполнении специальной работы при передвижении $S''$, кмspecial_mileage_on_workDecimalНетДа, `fuel.s_special_on_work` — S''кмвещественное, ≥ 0
Время работы специального оборудования $T$, чspecial_equipment_timeDecimalНетДа, `fuel.special_equipment_time` — Tчвещественное, ≥ 0
Нормативный расход за период передвижения в зимний период $Q_{движ}^{зима}$, лnorm_consumption_move_winterDecimalНетДа, `fuel.special_move_q_winter`лвещественное, ≥ 0
Нормативный расход за период передвижения в летний период $Q_{движ}^{лето}$, лnorm_consumption_move_summerDecimalНетДа, `fuel.special_move_q_summer`лвещественное, ≥ 0
Нормативный расход в городском режиме за период передвижения $Q_{движ}^{гор}$, лnorm_consumption_move_urbanDecimalНетДа, `fuel.special_move_q_urban`лвещественное, ≥ 0
Нормативный расход за пригородной зоной за период передвижения $Q_{движ}^{загор}$, лnorm_consumption_move_suburbanDecimalНетДа, `fuel.special_move_q_suburban`лвещественное, ≥ 0
Нормативный расход за период передвижения $Q_{движ}$, лnorm_consumption_moveDecimalНетДа, `fuel.special_move`лвещественное, ≥ 0
Нормативный расход за период стоянки в зимний период $Q_{стоян}^{зима}$, лnorm_consumption_stop_winterDecimalНетДа, `fuel.special_stop_q_winter`лвещественное, ≥ 0
Нормативный расход за период стоянки в летний период $Q_{стоян}^{лето}$, лnorm_consumption_stop_summerDecimalНетДа, `fuel.special_stop_q_summer`лвещественное, ≥ 0
Нормативный расход в городском режиме за период стоянки $Q_{стоян}^{гор}$, лnorm_consumption_stop_urbanDecimalНетДа, `fuel.special_stop_q_urban`лвещественное, ≥ 0
Нормативный расход за пригородной зоной за период стоянки $Q_{стоян}^{загор}$, лnorm_consumption_stop_suburbanDecimalНетДа, `fuel.special_stop_q_suburban`лвещественное, ≥ 0
Нормативный расход за период стоянки $Q_{стоян}$, лnorm_consumption_stopDecimalНетДа, `fuel.special_stop`лвещественное, ≥ 0
Статус расчётаcalculation_status_idCalculationStatusДаНе выполненРезультат работы калькулятора: не выполнен, успешно выполнен или выполнен с ошибкой
Статус подбора модификацииmodification_selection_status_idNtsModificationSelectionStatusДаДа{Не выполнен; Не определена; Определена; Определена группа}Не выполненОпределяется состоянием подбора: не выполнялся / ни одной / одна / несколько модификаций
Способ подбораselection_method_idNtsSelectionMethodДаДа{Не определён; авто; эксперт}Не определёнНе определён — подбор не выполнялся; авто — подбор выполнен сервисом при загрузке ТС; эксперт — пользователь нажал «Применить»
Журнал расчётаcalc_log_jsonStringДаДаШаги расчёта с формулами и значениями, JSON
Ошибки расчётаcalc_errors_jsonStringДаДаОшибки расчёта, JSON
Дата расчётаcalc_dateDateTimeНетДаДата и время выполнения расчёта
Статус загрузкиais_load_status_idNtsAisLoadStatusДаДаНе выполненаДостаточность данных из АИС ОИА ПЭО для расчёта: устанавливается процедурой приёма данных
Статус обработки ТСprocessing_status_idProcessingStatusДаДаНе выполненаИтоговый статус обработки ТС: вычисляется по статусу загрузки, статусу расчёта, статусу подбора модификации и способу подбора

Исходник

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

        /// <summary>Транспортное средство</summary>
        [Relation]
        [DomainField(Alias = "vehicle_id", RequiredOnCreate = true, Immutable = true)]
        public Vehicle? Vehicle { get; set; }

        /// <summary>Базовая норма расхода топлива $H_s$, л/100 км</summary>
        [DomainField(Alias = "base_consumption_rate", Unit = "л/100 км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.base_norm` — базовая норма H_s")]
        public decimal BaseConsumptionRate { get; set; }

        /// <summary>Минимальная базовая норма отобранной группы $H_{min}$, л/100 км</summary>
        [DomainField(Alias = "min_base_consumption_rate", Unit = "л/100 км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.base_norm` — H_min")]
        public decimal MinBaseConsumptionRate { get; set; }

        /// <summary>Максимальная базовая норма отобранной группы $H_{max}$, л/100 км</summary>
        [DomainField(Alias = "max_base_consumption_rate", Unit = "л/100 км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.base_norm` — H_max")]
        public decimal MaxBaseConsumptionRate { get; set; }

        /// <summary>Эталонный расход $Q_{эт}$, л</summary>
        [DomainField(Alias = "reference_norm_consumption", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.reference_consumption` — та же ветка категории ТС, что и Q_н, со входом H_эт вместо H_s")]
        public decimal ReferenceNormConsumption { get; set; }

        /// <summary>Эталонная норма расхода топлива $H_{эт}$, л/100 км</summary>
        [DomainField(Alias = "reference_consumption_rate", Unit = "л/100 км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.reference_norm` — минимум по всей базовой группе, не только отобранным")]
        public decimal ReferenceConsumptionRate { get; set; }

        /// <summary>Пробег $S$, км</summary>
        [DomainField(Alias = "mileage", Unit = "км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.mileage`")]
        public decimal Mileage { get; set; }

        /// <summary>Поправочный коэффициент к норме в зимний период $D^{зима}$, %</summary>
        [DomainField(Alias = "correction_factor_winter", Unit = "%", Range = "вещественное",
            Calculated = "Да, `fuel.correction_factor_winter` — D^{зима}")]
        public decimal CorrectionFactorWinter { get; set; }

        /// <summary>Поправочный коэффициент к норме в летний период $D^{лето}$, %</summary>
        [DomainField(Alias = "correction_factor_summer", Unit = "%", Range = "вещественное",
            Calculated = "Да, `fuel.correction_factor_summer` — D^{лето}")]
        public decimal CorrectionFactorSummer { get; set; }

        /// <summary>Поправочный коэффициент при работе за пригородной зоной $D^{загор}$, %</summary>
        [DomainField(Alias = "suburb_coefficient", Unit = "%", Range = "вещественное",
            Calculated = "Да, `fuel.cf_suburb`")]
        public decimal SuburbCoefficient { get; set; }

        /// <summary>Нормативный расход в зимний период $Q^{зима}$, л</summary>
        [DomainField(Alias = "norm_consumption_winter", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.q_winter`, `fuel.bus_q_winter`, …")]
        public decimal NormConsumptionWinter { get; set; }

        /// <summary>Нормативный расход в летний период $Q^{лето}$, л</summary>
        [DomainField(Alias = "norm_consumption_summer", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.q_summer`, `fuel.bus_q_summer`, …")]
        public decimal NormConsumptionSummer { get; set; }

        /// <summary>Нормативный расход в городском режиме $Q^{гор}$, л</summary>
        [DomainField(Alias = "norm_consumption_urban", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.q_urban` — Q^{гор}")]
        public decimal NormConsumptionUrban { get; set; }

        /// <summary>Нормативный расход за пригородной зоной $Q^{загор}$, л</summary>
        [DomainField(Alias = "norm_consumption_suburban", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.q_suburban` — Q^{загор}")]
        public decimal NormConsumptionSuburban { get; set; }

        /// <summary>Нормативный расход $Q_н$, л</summary>
        [DomainField(Alias = "norm_consumption", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, результат ветки категории ТС: `fuel.normative_consumption` — нормативный расход Q_н")]
        public decimal NormConsumption { get; set; }

        /// <summary>Нормативный расход на работу отопителя $Q_{обор}$, л</summary>
        [DomainField(Alias = "norm_consumption_by_using_heater", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.q_equipment` — Q_{обор}")]
        public decimal NormConsumptionByUsingHeater { get; set; }

        /// <summary>Нормативный расход на пробег $Q_{пробег}$, л</summary>
        [DomainField(Alias = "norm_consumption_mileage", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.q_mileage` — нормативный расход на пробег Q_{пробег}; не применяется в ветке самосвалов")]
        public decimal NormConsumptionMileage { get; set; }

        /// <summary>Масса груза $G_{гр}$, т</summary>
        [DomainField(Alias = "cargo_mass", Unit = "т", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.g_cargo` — масса груза G_{гр}")]
        public decimal CargoMass { get; set; }

        /// <summary>Пробег с грузом $S_{гр}$, км</summary>
        [DomainField(Alias = "cargo_mileage", Unit = "км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.s_cargo` — S_{гр}")]
        public decimal CargoMileage { get; set; }

        /// <summary>Объём транспортной работы $W$, т·км</summary>
        [DomainField(Alias = "transport_work", Unit = "т·км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.w` — объём транспортной работы W")]
        public decimal TransportWork { get; set; }

        /// <summary>Норма расхода топлива на транспортную работу $H_w$, л/100 т·км</summary>
        [DomainField(Alias = "transport_work_consumption_rate", Unit = "л/100 т·км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.h_transport` — расчёт от вида топлива: H_w")]
        public decimal TransportWorkConsumptionRate { get; set; }

        /// <summary>Норма расхода топлива на дополнительную массу прицепа $H_g$, л/100 т·км</summary>
        [DomainField(Alias = "trailer_mass_consumption_rate", Unit = "л/100 т·км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.h_trailer` — расчёт от вида топлива: H_g")]
        public decimal TrailerMassConsumptionRate { get; set; }

        /// <summary>Нормативный расход на транспортную работу $Q_{трансп}$, л</summary>
        [DomainField(Alias = "norm_consumption_by_transport_work", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.q_transport` — Q_{трансп}")]
        public decimal NormConsumptionByTransportWork { get; set; }

        /// <summary>Нормативный расход на массу прицепа $Q_{прицеп}$, л</summary>
        [DomainField(Alias = "norm_consumption_by_trailer_mass", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.q_trailer` — Q_{прицеп}")]
        public decimal NormConsumptionByTrailerMass { get; set; }

        /// <summary>Норма расхода автомобиля-самосвала (автопоезда) $H_{sanc}$, л/100 км</summary>
        [DomainField(Alias = "dump_truck_consumption_rate", Unit = "л/100 км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.h_sanc` — H_{sanc}")]
        public decimal DumpTruckConsumptionRate { get; set; }

        /// <summary>Нормативный расход на ездки с грузом $Q_{ездки}$, л</summary>
        [DomainField(Alias = "norm_consumption_by_trips", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.q_trips` — Q_{ездки}")]
        public decimal NormConsumptionByTrips { get; set; }

        /// <summary>Норма расхода топлива на работу специального оборудования $H_т$, л/ч</summary>
        [DomainField(Alias = "consumption_rate_for_special_equipment", Unit = "л/ч", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.h_special_equipment` — H_т")]
        public decimal ConsumptionRateForSpecialEquipment { get; set; }

        /// <summary>Норма специального автомобиля на пробег с учётом транспортной работы $H_{sc}$, л/100 км</summary>
        [DomainField(Alias = "special_vehicle_consumption_rate", Unit = "л/100 км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.h_sc` — H_sc")]
        public decimal SpecialVehicleConsumptionRate { get; set; }

        /// <summary>Норма расхода топлива на пробег при выполнении специальной работы во время передвижения $H_s''$, л/100 км</summary>
        [DomainField(Alias = "special_work_consumption_rate", Unit = "л/100 км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.h_s_special_work` — H_s''")]
        public decimal SpecialWorkConsumptionRate { get; set; }

        /// <summary>Пробег к месту работы и обратно $S'$, км</summary>
        [DomainField(Alias = "special_mileage_to_work", Unit = "км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.s_special_to_work` — S'")]
        public decimal SpecialMileageToWork { get; set; }

        /// <summary>Пробег при выполнении специальной работы при передвижении $S''$, км</summary>
        [DomainField(Alias = "special_mileage_on_work", Unit = "км", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.s_special_on_work` — S''")]
        public decimal SpecialMileageOnWork { get; set; }

        /// <summary>Время работы специального оборудования $T$, ч</summary>
        [DomainField(Alias = "special_equipment_time", Unit = "ч", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.special_equipment_time` — T")]
        public decimal SpecialEquipmentTime { get; set; }

        /// <summary>Нормативный расход за период передвижения в зимний период $Q_{движ}^{зима}$, л</summary>
        [DomainField(Alias = "norm_consumption_move_winter", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.special_move_q_winter`")]
        public decimal NormConsumptionMoveWinter { get; set; }

        /// <summary>Нормативный расход за период передвижения в летний период $Q_{движ}^{лето}$, л</summary>
        [DomainField(Alias = "norm_consumption_move_summer", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.special_move_q_summer`")]
        public decimal NormConsumptionMoveSummer { get; set; }

        /// <summary>Нормативный расход в городском режиме за период передвижения $Q_{движ}^{гор}$, л</summary>
        [DomainField(Alias = "norm_consumption_move_urban", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.special_move_q_urban`")]
        public decimal NormConsumptionMoveUrban { get; set; }

        /// <summary>Нормативный расход за пригородной зоной за период передвижения $Q_{движ}^{загор}$, л</summary>
        [DomainField(Alias = "norm_consumption_move_suburban", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.special_move_q_suburban`")]
        public decimal NormConsumptionMoveSuburban { get; set; }

        /// <summary>Нормативный расход за период передвижения $Q_{движ}$, л</summary>
        [DomainField(Alias = "norm_consumption_move", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.special_move`")]
        public decimal NormConsumptionMove { get; set; }

        /// <summary>Нормативный расход за период стоянки в зимний период $Q_{стоян}^{зима}$, л</summary>
        [DomainField(Alias = "norm_consumption_stop_winter", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.special_stop_q_winter`")]
        public decimal NormConsumptionStopWinter { get; set; }

        /// <summary>Нормативный расход за период стоянки в летний период $Q_{стоян}^{лето}$, л</summary>
        [DomainField(Alias = "norm_consumption_stop_summer", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.special_stop_q_summer`")]
        public decimal NormConsumptionStopSummer { get; set; }

        /// <summary>Нормативный расход в городском режиме за период стоянки $Q_{стоян}^{гор}$, л</summary>
        [DomainField(Alias = "norm_consumption_stop_urban", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.special_stop_q_urban`")]
        public decimal NormConsumptionStopUrban { get; set; }

        /// <summary>Нормативный расход за пригородной зоной за период стоянки $Q_{стоян}^{загор}$, л</summary>
        [DomainField(Alias = "norm_consumption_stop_suburban", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.special_stop_q_suburban`")]
        public decimal NormConsumptionStopSuburban { get; set; }

        /// <summary>Нормативный расход за период стоянки $Q_{стоян}$, л</summary>
        [DomainField(Alias = "norm_consumption_stop", Unit = "л", Range = "вещественное, ≥ 0",
            Calculated = "Да, `fuel.special_stop`")]
        public decimal NormConsumptionStop { get; set; }

        /// <summary>Статус расчёта</summary>
        [Relation]
        [DomainField(Alias = "calculation_status_id", RequiredOnCreate = true,
            Default = "Не выполнен",
            Description = "Результат работы калькулятора: не выполнен, успешно выполнен или выполнен с ошибкой")]
        public CalculationStatus? CalculationStatus { get; set; }

        /// <summary>Статус подбора модификации</summary>
        [Relation]
        [DomainField(Alias = "modification_selection_status_id", RequiredOnCreate = true,
            Calculated = "Да",
            Range = "{Не выполнен; Не определена; Определена; Определена группа}",
            Default = "Не выполнен",
            Description = "Определяется состоянием подбора: не выполнялся / ни одной / одна / несколько модификаций")]
        public NtsModificationSelectionStatus? ModificationSelectionStatus { get; set; }

        /// <summary>Способ подбора</summary>
        [Relation]
        [DomainField(Alias = "selection_method_id", RequiredOnCreate = true,
            Calculated = "Да", Range = "{Не определён; авто; эксперт}", Default = "Не определён",
            Description = "Не определён — подбор не выполнялся; авто — подбор выполнен сервисом при загрузке ТС; эксперт — пользователь нажал «Применить»")]
        public NtsSelectionMethod? SelectionMethod { get; set; }

        /// <summary>Журнал расчёта</summary>
        [DomainField(Alias = "calc_log_json", RequiredOnCreate = true, Calculated = "Да",
            Description = "Шаги расчёта с формулами и значениями, JSON")]
        public string? CalcLogJson { get; set; }

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

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

        /// <summary>Статус загрузки</summary>
        [Relation]
        [DomainField(Alias = "ais_load_status_id", RequiredOnCreate = true,
            Calculated = "Да", Default = "Не выполнена",
            Description = "Достаточность данных из АИС ОИА ПЭО для расчёта: устанавливается процедурой приёма данных")]
        public NtsAisLoadStatus? AisLoadStatus { get; set; }

        /// <summary>Статус обработки ТС</summary>
        [Relation]
        [DomainField(Alias = "processing_status_id", RequiredOnCreate = true,
            Calculated = "Да", Default = "Не выполнена",
            Description = "Итоговый статус обработки ТС: вычисляется по статусу загрузки, статусу расчёта, статусу подбора модификации и способу подбора")]
        public ProcessingStatus? ProcessingStatus { get; set; }
    }

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

Документы