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; }
}
}