⟨/⟩ Nts/50_Domain/Vehicle.cs

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

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

namespace Rugrid.Sdaid.Epas.Nts.Domain
{
    /// <summary>
    /// Транспортное средство: характеристики из АИС ОИА ПЭО и поля, которые ведутся в ЭНТС.
    /// Импорт обновляет только поля АИС; марка, модель, модификация, условия эксплуатации,
    /// параметры методики и статус обработки — данные модуля.
    /// </summary>
    public class DOC_Vehicle : IDomainEntityDocument, IHasStructuralLinks, IFolder<NtsDomainFolder>
    {
        public SdaidLink[] Links => new[]
        {
            Rel.Uses<DOC_NavEntity>(),
            Rel.Uses<DOC_VehicleKind>(),
            Rel.Uses<DOC_VehicleMark>(),
            Rel.Uses<DOC_VehicleModel>(),
            Rel.Uses<DOC_VehicleModification>(),
            Rel.Uses<DOC_FuelKind>(),
            Rel.Uses<DOC_VehicleFunction>(),
        };

        public static string _refName = "Транспортное средство";

        public string Name => "Транспортное средство";

        public string Description =>
            @"Единица реестра ТС: принадлежность организационному объекту, вид и назначение, характеристики, от которых зависит норма расхода топлива.";

        public string Version => "0.2";
        public string Status => "draft";
        public string[] Comments => new string[0];
        public Type Entity => typeof(Vehicle);

        public static string OpenQuestions = $"""
        ## Открытые вопросы

        Открытые вопросы о транспортном средстве собраны в эпике: {SdaidAnchors.RefTo<Rugrid.Sdaid.Epas.Nts.Epics.NtsFuelCalc.OQ_Vehicle>()}.
        """;
    }

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

        /// <summary>ИД объекта в АИС</summary>
        [DomainField(Alias = "ais_id", Description = "ИД объекта в АИС ОИА ПЭО", Immutable = true)]
        public Guid AisId { get; set; }

        /// <summary>Признак отсутствия в АИС</summary>
        [DomainField(Alias = "is_absent_in_ais", Default = "Нет",
            Description = "Записи нет в последней выгрузке АИС; импорт не удаляет ТС и не меняет данные модуля")]
        public bool IsAbsentInAis { get; set; }

        /// <summary>Организационный объект — владелец ТС</summary>
        [Relation]
        [DomainField(Alias = "org_object_id", RequiredOnCreate = true,
            Range = "Тип организационного объекта: {Company; Mes; Pmes}",
            Description = "Определяет субъект РФ для зимней надбавки. ТС числятся за ПМЭС и МЭС")]
        public NavEntity? OrgObject { get; set; }

        /// <summary>Наименование</summary>
        [DomainField(Alias = "name", RequiredOnCreate = true)]
        public string? Name { get; set; }

        /// <summary>Государственный регистрационный знак</summary>
        [DomainField(Alias = "license_plate")]
        public string? LicensePlate { get; set; }

        /// <summary>Марка и модель базы ТС</summary>
        [DomainField(Alias = "model_name")]
        public string? ModelName { get; set; }

        /// <summary>Модель спец. автомобиля</summary>
        [DomainField(Alias = "model_name_special")]
        public string? ModelNameSpecial { get; set; }

        /// <summary>Год выпуска</summary>
        [DomainField(Alias = "manufacture_year")]
        public int? ManufactureYear { get; set; }

        /// <summary>Вид ТС</summary>
        [Relation]
        [DomainField(Alias = "vehicle_kind_id", RequiredForCalc = "Да",
            Description = "Определяет формулу расчёта: легковой, автобус, грузовой бортовой, тягач, самосвал, фургон, специальный")]
        public VehicleKind? VehicleKind { get; set; }

        /// <summary>Марка ТС</summary>
        [Relation]
        [DomainField(Alias = "vehicle_mark_id",
            Description = "Проставляется в модуле; заполняется, когда известна только марка")]
        public VehicleMark? VehicleMark { get; set; }

        /// <summary>Модель ТС</summary>
        [Relation]
        [DomainField(Alias = "vehicle_model_id",
            Description = "Проставляется в модуле; заполняется, если модель известна (иначе достаточно марки)")]
        public VehicleModel? VehicleModel { get; set; }

        /// <summary>Модификация ТС</summary>
        [Relation]
        [DomainField(Alias = "vehicle_modification_id",
            Description = "Проставляется в модуле; заполняется, если известна модификация (иначе достаточно марки/модели)")]
        public VehicleModification? VehicleModification { get; set; }

        /// <summary>Тип по паспорту ТС</summary>
        [DomainField(Alias = "passport_type_name")]
        public string? TypeNamePassport { get; set; }

        /// <summary>Назначение ТС</summary>
        [Relation]
        [DomainField(Alias = "vehicle_function_id")]
        public VehicleFunction? VehicleFunction { get; set; }

        /// <summary>Основной вид топлива</summary>
        [Relation]
        [DomainField(Alias = "fuel_kind_primary_id", RequiredForCalc = "Да",
            Description = "Задаёт норму расхода на транспортную работу: 2 л/100 т·км для бензина, 1,3 л/100 т·км для дизельного топлива")]
        public FuelKind? FuelKindPrimary { get; set; }

        /// <summary>Дополнительный вид топлива</summary>
        [Relation]
        [DomainField(Alias = "fuel_kind_secondary_id")]
        public FuelKind? FuelKindSecondary { get; set; }

        /// <summary>Норма расхода топлива на пробег, летняя</summary>
        [DomainField(Alias = "norm_per_mileage_summer_l_per_100km", Unit = "л/100 км",
            Range = "вещественное, > 0")]
        public decimal? NormPerMileageSummer { get; set; }

        /// <summary>Норма расхода топлива на пробег, зимняя</summary>
        [DomainField(Alias = "norm_per_mileage_winter_l_per_100km", Unit = "л/100 км",
            Range = "вещественное, > 0")]
        public decimal? NormPerMileageWinter { get; set; }

        /// <summary>Норма расхода топлива на час работы, летняя</summary>
        [DomainField(Alias = "norm_per_hour_summer_l_per_h", Unit = "л/ч", Range = "вещественное, ≥ 0",
            Description = "Для спецавтомобилей: работа оборудования")]
        public decimal? ConsumptionRatePerHourSummer { get; set; }

        /// <summary>Норма расхода топлива на час работы, зимняя</summary>
        [DomainField(Alias = "norm_per_hour_winter_l_per_h", Unit = "л/ч", Range = "вещественное, ≥ 0",
            Description = "Для спецавтомобилей: работа оборудования")]
        public decimal? ConsumptionRatePerHourWinter { get; set; }

        /// <summary>Грузоподъёмность, т</summary>
        [DomainField(Alias = "cargo_capacity", Unit = "т", Range = "вещественное, ≥ 0")]
        public decimal? CargoCapacity { get; set; }

        /// <summary>Пассажировместимость, чел.</summary>
        [DomainField(Alias = "passenger_capacity", Unit = "чел.", Range = "целое, ≥ 0",
            Description = "Для автобусов задаёт нормируемую загрузку пассажиров")]
        public int? PassengerCapacity { get; set; }

        /// <summary>Собственная масса прицепа (полуприцепа), т</summary>
        [DomainField(Alias = "trailer_mass", Unit = "т", Range = "вещественное, ≥ 0",
            Description = "Вносится в модуле, из АИС не приходит; для грузовых")]
        public decimal? TrailerMass { get; set; }

        /// <summary>Дата начала эксплуатации</summary>
        [DomainField(Alias = "start_date", RequiredForCalc = "Да",
            Description = "Вместе с отчётной датой задаёт срок эксплуатации для поправочного коэффициента D_{эксп}")]
        public DateTime? StartDate { get; set; }

        /// <summary>Дата окончания эксплуатации</summary>
        [DomainField(Alias = "finish_date",
            Description = "Заполнена — ТС выбыло из эксплуатации")]
        public DateTime? FinishDate { get; set; }

        /// <summary>Норма расхода топлива при использовании штатных отопителей, л/ч</summary>
        [DomainField(Alias = "consumption_rate_when_using_heater", Unit = "л/ч", Range = "вещественное, ≥ 0",
            Description = "Вносится в модуле, из АИС не приходит; для автобусов")]
        public decimal? ConsumptionRateForUsingHeater { get; set; }

        /// <summary>Время работы автомобиля с включённым отопителем, ч</summary>
        [DomainField(Alias = "time_when_using_heater", Unit = "ч", Range = "вещественное, ≥ 0",
            Description = "Вносится в модуле, из АИС не приходит; для автобусов")]
        public decimal? TimeWhenUsingHeater { get; set; }

        /// <summary>Норма расхода топлива на транспортную работу автомобиля-самосвала и на дополнительную массу самосвального прицепа или полуприцепа, л/100 т·км</summary>
        [DomainField(Alias = "dump_truck_transport_work_consumption_rate", Unit = "л/100 т·км", Range = "вещественное, ≥ 0",
            Description = "Вносится в модуле, из АИС не приходит; для самосвалов")]
        public decimal? DumpTruckTransportWorkConsumptionRate { get; set; }

        /// <summary>Количество поездок с грузом за смену, шт.</summary>
        [DomainField(Alias = "trips_with_cargo_per_shift", Unit = "шт.", Range = "целое, ≥ 0",
            Description = "Вносится в модуле, из АИС не приходит; для самосвалов")]
        public int? TripsWithCargoPerShift { get; set; }

        /// <summary>Поправочный коэффициент на численность населения, %</summary>
        [DomainField(Alias = "population_allowance", Unit = "%", Range = "вещественное, ≥ 0",
            Description = "Вносится в модуле, по умолчанию 0")]
        public decimal? PopulationAllowance { get; set; }

        /// <summary>Поправочный коэффициент на частые технологические остановки, %</summary>
        [DomainField(Alias = "tech_stop_allowance", Unit = "%", Range = "вещественное, ≥ 0",
            Description = "Вносится в модуле, по умолчанию 0")]
        public decimal? TechStopAllowance { get; set; }

        /// <summary>Поправочный коэффициент при движении с пониженной скоростью, %</summary>
        [DomainField(Alias = "low_speed_allowance", Unit = "%", Range = "вещественное, ≥ 0",
            Description = "Вносится в модуле, по умолчанию 0")]
        public decimal? LowSpeedAllowance { get; set; }

        /// <summary>Поправочный коэффициент при работе специальных автомобилей, %</summary>
        [DomainField(Alias = "special_vehicle_allowance", Unit = "%", Range = "вещественное, ≥ 0",
            Description = "Вносится в модуле, по умолчанию 0")]
        public decimal? SpecialVehicleAllowance { get; set; }

        /// <summary>Поправочный коэффициент при работе в условиях ЧС, %</summary>
        [DomainField(Alias = "emergency_allowance", Unit = "%", Range = "вещественное, ≥ 0",
            Description = "Вносится в модуле, по умолчанию 0")]
        public decimal? EmergencyAllowance { get; set; }

        /// <summary>Поправочный коэффициент при вынужденном простое, %</summary>
        [DomainField(Alias = "forced_idle_allowance", Unit = "%", Range = "вещественное, ≥ 0",
            Description = "Вносится в модуле, по умолчанию 0")]
        public decimal? ForcedIdleAllowance { get; set; }
    }
}