From 33c3e74e53a2c684cf47d470694b16d32be8679c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D0=B0=D1=80=D1=87=D0=B5=D0=BD=D0=BA=D0=BE=20=D0=92?= =?UTF-8?q?=D0=BB=D0=B0=D0=B4=D0=B8=D0=BC=D0=B8=D1=80?= Date: Wed, 22 Dec 2021 16:06:30 +0500 Subject: [PATCH] Added new well section types --- ...222105725_AddedNewSectionTypes.Designer.cs | 3083 +++++++++++++++++ .../20211222105725_AddedNewSectionTypes.cs | 248 ++ .../AsbCloudDbContextModelSnapshot.cs | 132 +- AsbCloudDb/Model/AsbCloudDbContext.cs | 36 +- .../WellOperationImportTemplate.xlsx | Bin 61071 -> 61323 bytes 5 files changed, 3487 insertions(+), 12 deletions(-) create mode 100644 AsbCloudDb/Migrations/20211222105725_AddedNewSectionTypes.Designer.cs create mode 100644 AsbCloudDb/Migrations/20211222105725_AddedNewSectionTypes.cs diff --git a/AsbCloudDb/Migrations/20211222105725_AddedNewSectionTypes.Designer.cs b/AsbCloudDb/Migrations/20211222105725_AddedNewSectionTypes.Designer.cs new file mode 100644 index 00000000..e436d718 --- /dev/null +++ b/AsbCloudDb/Migrations/20211222105725_AddedNewSectionTypes.Designer.cs @@ -0,0 +1,3083 @@ +// +using System; +using System.Collections.Generic; +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace AsbCloudDb.Migrations +{ + [DbContext(typeof(AsbCloudDbContext))] + [Migration("20211222105725_AddedNewSectionTypes")] + partial class AddedNewSectionTypes + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasPostgresExtension("adminpack") + .HasAnnotation("Relational:Collation", "Russian_Russia.1251") + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.10") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdDeposit") + .HasColumnType("integer") + .HasColumnName("id_deposit"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.HasKey("Id"); + + b.HasIndex("IdDeposit"); + + b.ToTable("t_cluster"); + + b + .HasComment("Кусты"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("IdCompanyType") + .HasMaxLength(255) + .HasColumnType("integer") + .HasColumnName("id_company_type") + .HasComment("вид деятельности"); + + b.HasKey("Id"); + + b.HasIndex("IdCompanyType"); + + b.ToTable("t_company"); + + b.HasData( + new + { + Id = 1, + Caption = "ООО \"АСБ\"", + IdCompanyType = 3 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.HasKey("Id"); + + b.ToTable("t_company_type"); + + b.HasData( + new + { + Id = 1, + Caption = "Недрапользователь" + }, + new + { + Id = 2, + Caption = "Буровой подрядчик" + }, + new + { + Id = 3, + Caption = "Сервис автоматизации бурения" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.HasKey("Id"); + + b.ToTable("t_deposit"); + + b + .HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AxialLoadMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_max") + .HasComment("Максимальная нагрузка"); + + b.Property("AxialLoadMin") + .HasColumnType("double precision") + .HasColumnName("axial_load_min") + .HasComment("Минимальная нагрузка"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина окончания интервала"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Стартовая глубина"); + + b.Property("FlowMax") + .HasColumnType("double precision") + .HasColumnName("flow_max") + .HasComment("Максимальный расход"); + + b.Property("FlowMin") + .HasColumnType("double precision") + .HasColumnName("flow_min") + .HasComment("Минимальный расход"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("well_id") + .HasComment("Id скважины"); + + b.Property("IdWellOperationCategory") + .HasColumnType("integer") + .HasColumnName("id_operation_category") + .HasComment("Id типа операции"); + + b.Property("LastUpdate") + .HasColumnType("timestamp without time zone") + .HasColumnName("last_update") + .HasComment("Дата последнего изменения"); + + b.Property("PressureMax") + .HasColumnType("double precision") + .HasColumnName("pressure_max") + .HasComment("Максимальное давление"); + + b.Property("PressureMin") + .HasColumnType("double precision") + .HasColumnName("pressure_min") + .HasComment("Минимальное давление"); + + b.Property("RotorSpeedMax") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_max") + .HasComment("Максимальные обороты на ВСП"); + + b.Property("RotorSpeedMin") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_min") + .HasComment("Минимальные обороты на ВСП"); + + b.Property("RotorTorqueMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_max") + .HasComment("Максимальный момент на ВСП"); + + b.Property("RotorTorqueMin") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_min") + .HasComment("Минимальный момент на ВСП"); + + b.HasKey("Id"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellOperationCategory"); + + b.ToTable("t_drill_flow_chart"); + + b + .HasComment("Параметры корридоров бурения (диапазоны параметров бурения)"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AxialLoadAvg") + .HasColumnType("double precision") + .HasColumnName("axial_load_avg") + .HasComment("Средняя нагрузка"); + + b.Property("AxialLoadMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_max") + .HasComment("Максимальная нагрузка"); + + b.Property("AxialLoadMin") + .HasColumnType("double precision") + .HasColumnName("axial_load_min") + .HasComment("Минимальная нагрузка"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина окончания интервала"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Стартовая глубина"); + + b.Property("FlowAvg") + .HasColumnType("double precision") + .HasColumnName("flow_avg") + .HasComment("Средний расход"); + + b.Property("FlowMax") + .HasColumnType("double precision") + .HasColumnName("flow_max") + .HasComment("Максимальный расход"); + + b.Property("FlowMin") + .HasColumnType("double precision") + .HasColumnName("flow_min") + .HasComment("Минимальный расход"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("well_id") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Id с типом секции скважины"); + + b.Property("PressureAvg") + .HasColumnType("double precision") + .HasColumnName("pressure_avg") + .HasComment("Среднее давление"); + + b.Property("PressureMax") + .HasColumnType("double precision") + .HasColumnName("pressure_max") + .HasComment("Максимальное давление"); + + b.Property("PressureMin") + .HasColumnType("double precision") + .HasColumnName("pressure_min") + .HasComment("Минимальное давление"); + + b.Property("RotorSpeedAvg") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_avg") + .HasComment("Средние обороты на ВСП"); + + b.Property("RotorSpeedMax") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_max") + .HasComment("Максимальные обороты на ВСП"); + + b.Property("RotorSpeedMin") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_min") + .HasComment("Минимальные обороты на ВСП"); + + b.Property("RotorTorqueAvg") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_avg") + .HasComment("Средний момент на ВСП"); + + b.Property("RotorTorqueMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_max") + .HasComment("Максимальный момент на ВСП"); + + b.Property("RotorTorqueMin") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_min") + .HasComment("Минимальный момент на ВСП"); + + b.HasKey("Id"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_drill_params"); + + b + .HasComment("Режим бурения в секции (диапазоны параметров бурения)"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_file_category"); + + b + .HasComment("Категории файлов"); + + b.HasData( + new + { + Id = 1, + Name = "Растворный сервис", + ShortName = "fluidService" + }, + new + { + Id = 2, + Name = "Цементирование", + ShortName = "cement" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "nnb" + }, + new + { + Id = 4, + Name = "ГТИ", + ShortName = "gti" + }, + new + { + Id = 5, + Name = "Документы по скважине", + ShortName = "wellDocuments" + }, + new + { + Id = 6, + Name = "Супервайзер", + ShortName = "supervisor" + }, + new + { + Id = 7, + Name = "Мастер", + ShortName = "master" + }, + new + { + Id = 8, + Name = "Долотный сервис", + ShortName = "toolService" + }, + new + { + Id = 9, + Name = "Буровой подрядчик", + ShortName = "drillService" + }, + new + { + Id = 10, + Name = "Сервис по заканчиванию скважины", + ShortName = "closingService" + }, + new + { + Id = 12, + Name = "Рапорт", + ShortName = "report" + }, + new + { + Id = 13, + Name = "Программа бурения, части", + ShortName = "ПБч" + }, + new + { + Id = 14, + Name = "Программа бурения", + ShortName = "ПБ" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории файла"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Удален ли файл"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название файла"); + + b.Property("PublishInfo") + .HasColumnType("jsonb") + .HasColumnName("publish_info") + .HasComment("Информация о файле в облаке"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("file_size") + .HasComment("Размер файла"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_file_info"); + + b + .HasComment("Файлы всех категорий"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp without time zone") + .HasColumnName("date_created") + .HasComment("Дата совершенного действия"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла"); + + b.Property("IdMarkType") + .HasColumnType("integer") + .HasColumnName("id_mark_type") + .HasComment("0 - Согласован"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("id пользователя"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Помечен ли файл как удаленный"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdUser"); + + b.ToTable("t_file_mark"); + + b + .HasComment("Действия с файлами."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property>("Data") + .HasColumnType("jsonb") + .HasColumnName("data") + .HasComment("Данные таблицы последних данных"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Пометка удаленным"); + + b.Property("Timestamp") + .HasColumnType("timestamp without time zone") + .HasColumnName("timestamp") + .HasComment("время добавления"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_measure"); + + b + .HasComment("Таблица c данными для вкладки 'Последние данные'"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_measure_category"); + + b + .HasComment("Категория последних данных"); + + b.HasData( + new + { + Id = 1, + Name = "Показатели бурового раствора", + ShortName = "Раствор" + }, + new + { + Id = 2, + Name = "Шламограмма", + ShortName = "Шламограмма" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "ННБ" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission"); + + b + .HasComment("Разрешения на доступ к данным"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("IdCompany", "IdWell"); + + b.HasIndex("IdWell"); + + b.ToTable("t_relation_company_well"); + + b + .HasComment("отношение скважин и компаний"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission"); + + b + .HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role"); + + b + .HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + IdUser = 1, + IdUserRole = 2 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Begin") + .HasColumnType("timestamp with time zone") + .HasColumnName("begin"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end") + .HasComment("timestamp with time zone"); + + b.Property("Format") + .HasColumnType("integer") + .HasColumnName("format") + .HasComment("Формат отчета"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла-родителя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("Step") + .HasColumnType("integer") + .HasColumnName("step") + .HasComment("размер шага в секундах"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdWell"); + + b.ToTable("t_report_property"); + + b + .HasComment("Отчеты с данными по буровым"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("комментарий для оператора"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("ObsolescenceSec") + .HasColumnType("integer") + .HasColumnName("obsolescence") + .HasComment("сек. до устаревания"); + + b.Property>("Setpoints") + .HasColumnType("jsonb") + .HasColumnName("setpoint_set") + .HasComment("Набор уставок"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdWell"); + + b.ToTable("t_setpoints_rquest"); + + b + .HasComment("Запросы на изменение уставок панели оператора"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + b.Property("TelemetryTimeZone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); + + b.ToTable("t_telemetry"); + + b + .HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("DurationSec") + .HasColumnType("integer") + .HasColumnName("duration_sec") + .HasComment("Кол-во секунд после предыдущей операции"); + + b.Property("IdOperation") + .HasColumnType("integer") + .HasColumnName("id_operation"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IsBitPositionDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_bit_position_decreasing") + .HasComment("Долото поднимается"); + + b.Property("IsBitPositionIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_bit_position_increasing") + .HasComment("Долото спускается"); + + b.Property("IsBitPositionLt20") + .HasColumnType("boolean") + .HasColumnName("is_bit_posision_lt_20") + .HasComment("Положение долота меньше 20м"); + + b.Property("IsBlockPositionDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_block_posision_decresing") + .HasComment("Талевый блок поднимается"); + + b.Property("IsBlockPositionIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_block_posision_incresing") + .HasComment("Талевый блок спускается"); + + b.Property("IsHookWeightLt3") + .HasColumnType("boolean") + .HasColumnName("is_hook_weight_lt_3") + .HasComment("Вес на крюке менее 3т"); + + b.Property("IsHookWeightNotChanges") + .HasColumnType("boolean") + .HasColumnName("is_hook_weight_not_changes") + .HasComment("Вес на крюке не меняется"); + + b.Property("IsPressureGt20") + .HasColumnType("boolean") + .HasColumnName("is_pressure_gt_20") + .HasComment("Давоение более 20"); + + b.Property("IsPressureLt20") + .HasColumnType("boolean") + .HasColumnName("is_pressure_lt_20") + .HasComment("Давление менее 20"); + + b.Property("IsRotorSpeedGt5") + .HasColumnType("boolean") + .HasColumnName("is_rotor_speed_gt_3") + .HasComment("Обороты ротора выше 3"); + + b.Property("IsRotorSpeedLt5") + .HasColumnType("boolean") + .HasColumnName("is_rotor_speed_lt_3") + .HasComment("Обороты ротора ниже 3"); + + b.Property("IsWellDepthDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_well_depth_decreasing") + .HasComment("Глубина забоя не увеличивается"); + + b.Property("IsWellDepthIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_well_depth_increasing") + .HasComment("Глубина забоя увеличивается"); + + b.Property("OperationEndDepth") + .HasColumnType("double precision") + .HasColumnName("operation_end_depth") + .HasComment("Глубина, на которой закончилась операция"); + + b.Property("OperationStartDepth") + .HasColumnType("double precision") + .HasColumnName("operation_start_depth") + .HasComment("Глубина, на которой началась операция"); + + b.Property("UnixDate") + .HasColumnType("bigint") + .HasColumnName("unix_date") + .HasComment("Unix timestamp для Linq запросов с вычислением дат"); + + b.HasKey("Id"); + + b.HasIndex("IdOperation"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_analysis"); + + b + .HasComment("События на скважине"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("AxialLoad") + .HasColumnType("real") + .HasColumnName("axial_load") + .HasComment("Осевая нагрузка"); + + b.Property("AxialLoadLimitMax") + .HasColumnType("real") + .HasColumnName("axial_load_limit_max") + .HasComment("Осевая нагрузка. Аварийная макс."); + + b.Property("AxialLoadSp") + .HasColumnType("real") + .HasColumnName("axial_load_sp") + .HasComment("Осевая нагрузка. Задание"); + + b.Property("BitDepth") + .HasColumnType("real") + .HasColumnName("bit_depth") + .HasComment("Положение инструмента"); + + b.Property("BlockPosition") + .HasColumnType("real") + .HasColumnName("block_position") + .HasComment("Высота талевого блока"); + + b.Property("BlockPositionMax") + .HasColumnType("real") + .HasColumnName("block_position_max") + .HasComment("Талевый блок. Макс положение"); + + b.Property("BlockPositionMin") + .HasColumnType("real") + .HasColumnName("block_position_min") + .HasComment("Талевый блок. Мин положение"); + + b.Property("BlockSpeed") + .HasColumnType("real") + .HasColumnName("block_speed") + .HasComment("Скорость талевого блока"); + + b.Property("BlockSpeedSp") + .HasColumnType("real") + .HasColumnName("block_speed_sp") + .HasComment("Скорости талевого блока. Задание"); + + b.Property("BlockSpeedSpDevelop") + .HasColumnType("real") + .HasColumnName("block_speed_sp_develop") + .HasComment("Талевый блок. Задание скорости для проработки"); + + b.Property("BlockSpeedSpRotor") + .HasColumnType("real") + .HasColumnName("block_speed_sp_rotor") + .HasComment("Талевый блок. Задание скорости для роторного бурения"); + + b.Property("BlockSpeedSpSlide") + .HasColumnType("real") + .HasColumnName("block_speed_sp_slide") + .HasComment("Талевый блок. Задание скорости для режима слайда"); + + b.Property("Flow") + .HasColumnType("real") + .HasColumnName("flow") + .HasComment("Расход"); + + b.Property("FlowDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("flow_delta_limit_max") + .HasComment("Расход. Аварийный макс."); + + b.Property("FlowIdle") + .HasColumnType("real") + .HasColumnName("flow_idle") + .HasComment("Расход. Холостой ход"); + + b.Property("HookWeight") + .HasColumnType("real") + .HasColumnName("hook_weight") + .HasComment("Вес на крюке"); + + b.Property("HookWeightIdle") + .HasColumnType("real") + .HasColumnName("hook_weight_idle") + .HasComment("Вес на крюке. Холостой ход"); + + b.Property("HookWeightLimitMax") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_max") + .HasComment("Вес на крюке. Затяжка"); + + b.Property("HookWeightLimitMin") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_min") + .HasComment("Вес на крюке. Посадка"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator") + .HasComment("Текущий критерий бурения"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Пользователь САУБ"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Режим САУБ"); + + b.Property("MseState") + .HasColumnType("smallint") + .HasColumnName("mse_state") + .HasComment("Текущее состояние работы MSE"); + + b.Property("Pressure") + .HasColumnType("real") + .HasColumnName("pressure") + .HasComment("Давление"); + + b.Property("PressureDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("pressure_delta_limit_max") + .HasComment("Давление дифф. Аварийное макс."); + + b.Property("PressureIdle") + .HasColumnType("real") + .HasColumnName("pressure_idle") + .HasComment("Давление. Холостой ход"); + + b.Property("PressureSp") + .HasColumnType("real") + .HasColumnName("pressure_sp") + .HasComment("Давление. Задание"); + + b.Property("PressureSpDevelop") + .HasColumnType("real") + .HasColumnName("pressure_sp_develop") + .HasComment("Давление. Задание для проработки"); + + b.Property("PressureSpRotor") + .HasColumnType("real") + .HasColumnName("pressure_sp_rotor") + .HasComment("Давление. Задание для роторного бурения"); + + b.Property("PressureSpSlide") + .HasColumnType("real") + .HasColumnName("pressure_sp_slide") + .HasComment("Давление. Задание для режима слайда"); + + b.Property("RotorSpeed") + .HasColumnType("real") + .HasColumnName("rotor_speed") + .HasComment("Обороты ротора"); + + b.Property("RotorTorque") + .HasColumnType("real") + .HasColumnName("rotor_torque") + .HasComment("Момент на роторе"); + + b.Property("RotorTorqueIdle") + .HasColumnType("real") + .HasColumnName("rotor_torque_idle") + .HasComment("Момент на роторе. Холостой ход"); + + b.Property("RotorTorqueLimitMax") + .HasColumnType("real") + .HasColumnName("rotor_torque_limit_max") + .HasComment("Момент на роторе. Аварийный макс."); + + b.Property("RotorTorqueSp") + .HasColumnType("real") + .HasColumnName("rotor_torque_sp") + .HasComment("Момент на роторе. Задание"); + + b.Property("WellDepth") + .HasColumnType("real") + .HasColumnName("well_depth") + .HasComment("Глубина забоя"); + + b.HasKey("IdTelemetry", "Date"); + + b.ToTable("t_telemetry_data_saub"); + + b + .HasComment("набор основных данных по SAUB"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("BreakAngleK") + .HasColumnType("real") + .HasColumnName("break_angle_k") + .HasComment("Коэффициент для расчёта за какой угол нужно тормозить"); + + b.Property("BreakAngleLeft") + .HasColumnType("real") + .HasColumnName("break_angle_left") + .HasComment("Угол торможения влево при работе по моменту"); + + b.Property("EncoderResolution") + .HasColumnType("real") + .HasColumnName("encoder_resolution") + .HasComment(" Разрешение энкодера"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Выбранный режим управления"); + + b.Property("PidMuxTorqueLeftLimit") + .HasColumnType("real") + .HasColumnName("pid_mux_torque_left_limit") + .HasComment(" Момент при котором определяется ехать назад по моменту или по скорости"); + + b.Property("PositionRight") + .HasColumnType("real") + .HasColumnName("position_right") + .HasComment("Крайний правый угол осциляции"); + + b.Property("PositionZero") + .HasColumnType("real") + .HasColumnName("position_zero") + .HasComment("Нулевая позиция осциляции"); + + b.Property("Ratio") + .HasColumnType("real") + .HasColumnName("ratio") + .HasComment(" Коэффициент редукции редектора"); + + b.Property("ReverseKTorque") + .HasColumnType("real") + .HasColumnName("reverse_k_torque") + .HasComment("Коэффициент на который умножается момент, для того чтобы система поняла что мы движемся в обратную сторону"); + + b.Property("ReverseSpeedSpZeroTime") + .HasColumnType("smallint") + .HasColumnName("reverse_speed_sp_zero_time") + .HasComment("Время выдачи сигнала нулевой скорости на при смене направления"); + + b.Property("RevolsLeftLimit") + .HasColumnType("real") + .HasColumnName("revols_left_limit") + .HasComment("Ограничение числа оборотов влево"); + + b.Property("RevolsLeftTotal") + .HasColumnType("real") + .HasColumnName("revols_left_total") + .HasComment("Суммарное количество оборотов влево"); + + b.Property("RevolsRightLimit") + .HasColumnType("real") + .HasColumnName("revols_right_limit") + .HasComment("Ограничение числа оборотов вправо"); + + b.Property("RevolsRightTotal") + .HasColumnType("real") + .HasColumnName("revols_right_total") + .HasComment("Суммарное количество оборотов вправо"); + + b.Property("RotorTorqueAvg") + .HasColumnType("real") + .HasColumnName("rotor_torque_avg") + .HasComment(" Момент в роторе средний"); + + b.Property("SpeedLeftSp") + .HasColumnType("real") + .HasColumnName("speed_left_sp") + .HasComment("Заданная скорость вращения влево"); + + b.Property("SpeedRightSp") + .HasColumnType("real") + .HasColumnName("speed_right_sp") + .HasComment("Заданная скорость вращения вправо"); + + b.Property("State") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("Переменная этапа"); + + b.Property("TopDriveSpeed") + .HasColumnType("real") + .HasColumnName("top_drive_speed") + .HasComment("Скорость СВП"); + + b.Property("TopDriveSpeedErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_speed_err"); + + b.Property("TopDriveSpeedMax") + .HasColumnType("real") + .HasColumnName("top_drive_speed_max") + .HasComment("верхний предел"); + + b.Property("TopDriveSpeedMin") + .HasColumnType("real") + .HasColumnName("top_drive_speed_min") + .HasComment("нижний предел"); + + b.Property("TopDriveSpeedOffset") + .HasColumnType("real") + .HasColumnName("top_drive_speed_offset") + .HasComment("смещение"); + + b.Property("TopDriveSpeedSpFrom") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from") + .HasComment("Заданная скорость c СВП"); + + b.Property("TopDriveSpeedSpFromErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_speed_sp_from_err"); + + b.Property("TopDriveSpeedSpFromMax") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from_max"); + + b.Property("TopDriveSpeedSpFromMin") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from_min"); + + b.Property("TopDriveSpeedSpFromOffset") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from_offset"); + + b.Property("TopDriveSpeedSpTo") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to") + .HasComment("Задание скорости на СВП"); + + b.Property("TopDriveSpeedSpToErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_speed_sp_to_err"); + + b.Property("TopDriveSpeedSpToMax") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to_max"); + + b.Property("TopDriveSpeedSpToMin") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to_min"); + + b.Property("TopDriveSpeedSpToOffset") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to_offset"); + + b.Property("TopDriveTorque") + .HasColumnType("real") + .HasColumnName("top_drive_torque") + .HasComment("Момент СВП"); + + b.Property("TopDriveTorqueErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_torque_err"); + + b.Property("TopDriveTorqueMax") + .HasColumnType("real") + .HasColumnName("top_drive_torque_max"); + + b.Property("TopDriveTorqueMin") + .HasColumnType("real") + .HasColumnName("top_drive_torque_min"); + + b.Property("TopDriveTorqueOffset") + .HasColumnType("real") + .HasColumnName("top_drive_torque_offset"); + + b.Property("TopDriveTorqueSpFrom") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from") + .HasComment("Заданный момент c СВП"); + + b.Property("TopDriveTorqueSpFromErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_torque_sp_from_err"); + + b.Property("TopDriveTorqueSpFromMax") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from_max"); + + b.Property("TopDriveTorqueSpFromMin") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from_min"); + + b.Property("TopDriveTorqueSpFromOffset") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from_offset"); + + b.Property("TopDriveTorqueSpTo") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to") + .HasComment("Задание момента на СВП"); + + b.Property("TopDriveTorqueSpToErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_torque_sp_to_err"); + + b.Property("TopDriveTorqueSpToMax") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to_max"); + + b.Property("TopDriveTorqueSpToMin") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to_min"); + + b.Property("TopDriveTorqueSpToOffset") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to_offset"); + + b.Property("TorqueLeftLimit") + .HasColumnType("real") + .HasColumnName("torque_left_limit") + .HasComment("Ограничение крутящего момента влево"); + + b.Property("TorqueRampTime") + .HasColumnType("real") + .HasColumnName("torque_ramp_time") + .HasComment("Время нарастания момента"); + + b.Property("TorqueRightLimit") + .HasColumnType("real") + .HasColumnName("torque_right_limit") + .HasComment("Ограничение крутящего момента вправо"); + + b.Property("TorqueStarting") + .HasColumnType("real") + .HasColumnName("torque_starting") + .HasComment(" Страгивающий момент"); + + b.Property("TurnLeftOnceByAngle") + .HasColumnType("real") + .HasColumnName("turn_left_once_by_angle") + .HasComment("Доворот по градусам единожды влево"); + + b.Property("TurnLeftOnceByRevols") + .HasColumnType("real") + .HasColumnName("turn_left_once_by_revols") + .HasComment("Доворот по оборотам единожды влево"); + + b.Property("TurnLeftOnceByTorque") + .HasColumnType("real") + .HasColumnName("turn_left_once_by_torque") + .HasComment("Доворот по моменту единожды влево"); + + b.Property("TurnRightOnceByAngle") + .HasColumnType("real") + .HasColumnName("turn_right_once_by_angle") + .HasComment("Доворот по градусам единожды вправо"); + + b.Property("TurnRightOnceByRevols") + .HasColumnType("real") + .HasColumnName("turn_right_once_by_revols") + .HasComment("Доворот по оборотам единожды вправо"); + + b.Property("TurnRightOnceByTorque") + .HasColumnType("real") + .HasColumnName("turn_right_once_by_torque") + .HasComment("Доворот по моменту единожды вправо"); + + b.Property("UnlockBySectorOut") + .HasColumnType("real") + .HasColumnName("unlock_by_sector_out") + .HasComment(" Градус отклонения от сектора для автоматического сброса блокировки"); + + b.Property("Ver") + .HasColumnType("real") + .HasColumnName("ver") + .HasComment("Версия ПО ПЛК"); + + b.Property("W2800") + .HasColumnType("smallint") + .HasColumnName("w2800") + .HasComment("Установка нуля энкодера"); + + b.Property("W2808") + .HasColumnType("smallint") + .HasColumnName("w2808") + .HasComment("Неисправность энкодера"); + + b.Property("W2810") + .HasColumnType("smallint") + .HasColumnName("w2810") + .HasComment(" автоматический сброс блокировки"); + + b.HasKey("IdTelemetry", "Date"); + + b.ToTable("t_telemetry_data_spin"); + + b + .HasComment("набор основных данных по SpinMaster"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.Property("MessageTemplate") + .HasColumnType("text") + .HasColumnName("message_template"); + + b.HasKey("IdTelemetry", "IdEvent"); + + b.ToTable("t_telemetry_event"); + + b + .HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Arg0") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg0") + .HasComment("Аргумент №0 для вставки в шаблон сообщения"); + + b.Property("Arg1") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg1"); + + b.Property("Arg2") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg2"); + + b.Property("Arg3") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg3"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdTelemetryUser") + .HasColumnType("integer") + .HasColumnName("id_telemetry_user") + .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); + + b.Property("WellDepth") + .HasColumnType("double precision") + .HasColumnName("well_depth"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_message"); + + b + .HasComment("Сообщения на буровых"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic"); + + b.Property("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname"); + + b.HasKey("IdTelemetry", "IdUser"); + + b.ToTable("t_telemetry_user"); + + b + .HasComment("Пользователи панели САУБ. Для сообщений."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("Login") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("login"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("имя"); + + b.Property("PasswordHash") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("password_hash") + .HasComment("соленый хэш пароля.\nпервые 5 символов - соль"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("отчество"); + + b.Property("Phone") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("phone") + .HasComment("номер телефона"); + + b.Property("Position") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("position") + .HasComment("email"); + + b.Property("State") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n100 - удален"); + + b.Property("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user"); + + b + .HasComment("Пользователи облака"); + + b.HasData( + new + { + Id = 1, + IdCompany = 1, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("От какой роли унаследована данная роль"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b + .HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор", + IdType = 0 + }, + new + { + Id = 2, + Caption = "Пользователь", + IdType = 0 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("IdCluster") + .HasColumnType("integer") + .HasColumnName("id_cluster"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("state") + .HasComment("0 - неизвестно, 1 - в работе, 2 - завершена"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdWellType") + .HasColumnType("integer") + .HasColumnName("id_well_type"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.HasKey("Id"); + + b.HasIndex("IdCluster"); + + b.HasIndex("IdTelemetry") + .IsUnique(); + + b.HasIndex("IdWellType"); + + b.ToTable("t_well"); + + b + .HasComment("скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины получателя"); + + b.Property("IdWellSrc") + .HasColumnType("integer") + .HasColumnName("id_well_src") + .HasComment("Id скважины композита"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции композита"); + + b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); + + b.HasIndex("IdWellSectionType"); + + b.HasIndex("IdWellSrc"); + + b.ToTable("t_well_composite"); + + b + .HasComment("Композитная скважина"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp without time zone") + .HasColumnName("date_start") + .HasComment("Дата начала операции"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина после завершения операции, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина на начало операции, м"); + + b.Property("DurationHours") + .HasColumnType("double precision") + .HasColumnName("duration_hours") + .HasComment("Продолжительность, часы"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0 = План или 1 = Факт"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции скважины"); + + b.HasKey("Id"); + + b.HasIndex("DateStart"); + + b.HasIndex("DepthEnd"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_well_operation"); + + b + .HasComment("Данные по операциям на скважине"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Code") + .HasColumnType("integer") + .HasColumnName("code") + .HasComment("Код операции"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории операции"); + + b.HasKey("Id"); + + b.ToTable("t_well_operation_category"); + + b + .HasComment("Справочник операций на скважине"); + + b.HasData( + new + { + Id = 1, + Code = 0, + Name = "Невозможно определить операцию" + }, + new + { + Id = 2, + Code = 0, + Name = "Роторное бурение" + }, + new + { + Id = 3, + Code = 0, + Name = "Слайдирование" + }, + new + { + Id = 4, + Code = 0, + Name = "Подъем с проработкой" + }, + new + { + Id = 5, + Code = 0, + Name = "Спуск с проработкой" + }, + new + { + Id = 6, + Code = 0, + Name = "Подъем с промывкой" + }, + new + { + Id = 7, + Code = 0, + Name = "Спуск с промывкой" + }, + new + { + Id = 8, + Code = 0, + Name = "Спуск в скважину" + }, + new + { + Id = 9, + Code = 0, + Name = "Спуск с вращением" + }, + new + { + Id = 10, + Code = 0, + Name = "Подъем из скважины" + }, + new + { + Id = 11, + Code = 0, + Name = "Подъем с вращением" + }, + new + { + Id = 12, + Code = 0, + Name = "Промывка в покое" + }, + new + { + Id = 13, + Code = 0, + Name = "Промывка с вращением" + }, + new + { + Id = 14, + Code = 0, + Name = "Удержание в клиньях" + }, + new + { + Id = 15, + Code = 0, + Name = "Неподвижное состояние" + }, + new + { + Id = 16, + Code = 0, + Name = "Вращение без циркуляции" + }, + new + { + Id = 17, + Code = 0, + Name = "На поверхности" + }, + new + { + Id = 1001, + Code = 0, + Name = "Бурение" + }, + new + { + Id = 1002, + Code = 0, + Name = "ГИС" + }, + new + { + Id = 1003, + Code = 0, + Name = "ГФР" + }, + new + { + Id = 1004, + Code = 0, + Name = "Монтаж ПВО" + }, + new + { + Id = 1005, + Code = 0, + Name = "Демонтаж ПВО" + }, + new + { + Id = 1006, + Code = 0, + Name = "Установка ФА" + }, + new + { + Id = 1007, + Code = 0, + Name = "Оборудование устья" + }, + new + { + Id = 1008, + Code = 0, + Name = "ОЗЦ" + }, + new + { + Id = 1011, + Code = 0, + Name = "Начало цикла строительства скважины" + }, + new + { + Id = 1012, + Code = 0, + Name = "Окончание цикла строительства скважины" + }, + new + { + Id = 1013, + Code = 0, + Name = "Опрессовка ПВО" + }, + new + { + Id = 1014, + Code = 0, + Name = "Опресовка Ц.К." + }, + new + { + Id = 1015, + Code = 0, + Name = "Опрессовка ВЗД" + }, + new + { + Id = 1016, + Code = 0, + Name = "Перевод скв на другой тип промывочной жидкости" + }, + new + { + Id = 1017, + Code = 0, + Name = "Перезапись каротажа" + }, + new + { + Id = 1018, + Code = 0, + Name = "Перетяжка талевого каната" + }, + new + { + Id = 1019, + Code = 0, + Name = "Наращивание, промывка" + }, + new + { + Id = 1020, + Code = 0, + Name = "Подъем инструмента" + }, + new + { + Id = 1021, + Code = 0, + Name = "Подъем инструмента с промывкой" + }, + new + { + Id = 1022, + Code = 0, + Name = "Обратная проработка" + }, + new + { + Id = 1023, + Code = 0, + Name = "Сборка инструмента с мостков" + }, + new + { + Id = 1024, + Code = 0, + Name = "Подготовительные работы" + }, + new + { + Id = 1025, + Code = 0, + Name = "Сборка КНБК" + }, + new + { + Id = 1026, + Code = 0, + Name = "Разборка КНБК" + }, + new + { + Id = 1027, + Code = 0, + Name = "Промывка" + }, + new + { + Id = 1028, + Code = 0, + Name = "Промежуточная промывка" + }, + new + { + Id = 1029, + Code = 0, + Name = "Прокачка пачек" + }, + new + { + Id = 1030, + Code = 0, + Name = "Разбуривание тех.оснастки" + }, + new + { + Id = 1031, + Code = 0, + Name = "Ремонт" + }, + new + { + Id = 1032, + Code = 0, + Name = "Спуск инструмента" + }, + new + { + Id = 1033, + Code = 0, + Name = "Спуск инструмента с промывкой" + }, + new + { + Id = 1034, + Code = 0, + Name = "Прямая проработка" + }, + new + { + Id = 1035, + Code = 0, + Name = "Принудительная проработка" + }, + new + { + Id = 1037, + Code = 0, + Name = "Тех СПО-подъем" + }, + new + { + Id = 1038, + Code = 0, + Name = "Тех СПО-спуск" + }, + new + { + Id = 1039, + Code = 0, + Name = "Техническое обслуживание" + }, + new + { + Id = 1040, + Code = 0, + Name = "Цементаж" + }, + new + { + Id = 1041, + Code = 0, + Name = "Шаблонировка ствола" + }, + new + { + Id = 1042, + Code = 0, + Name = "Геологическое осложнение" + }, + new + { + Id = 1043, + Code = 0, + Name = "НПВ" + }, + new + { + Id = 1044, + Code = 0, + Name = "ВМР" + }, + new + { + Id = 1045, + Code = 0, + Name = "Прочее" + }, + new + { + Id = 1046, + Code = 0, + Name = "Спуск КНБК" + }, + new + { + Id = 1047, + Code = 0, + Name = "Подъем КНБК" + }, + new + { + Id = 1048, + Code = 0, + Name = "Спуск ОК" + }, + new + { + Id = 1050, + Code = 0, + Name = "Промывка при спуске ОК" + }, + new + { + Id = 1051, + Code = 0, + Name = "Замер ТС" + }, + new + { + Id = 1052, + Code = 0, + Name = "Тех. отстой" + }, + new + { + Id = 1053, + Code = 0, + Name = "Циркуляция и Обработка БР" + }, + new + { + Id = 1054, + Code = 0, + Name = "Срезка ствола" + }, + new + { + Id = 1055, + Code = 0, + Name = "Вспомогательные работы" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_section_type"); + + b + .HasComment("конструкция секции скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Пилотный ствол 1" + }, + new + { + Id = 2, + Caption = "Пилотный ствол 2" + }, + new + { + Id = 3, + Caption = "Пилотный ствол 3" + }, + new + { + Id = 4, + Caption = "Пилотный ствол 4" + }, + new + { + Id = 5, + Caption = "Пилотный ствол 5" + }, + new + { + Id = 6, + Caption = "Направление 1" + }, + new + { + Id = 7, + Caption = "Направление 2" + }, + new + { + Id = 8, + Caption = "Направление 3" + }, + new + { + Id = 9, + Caption = "Направление 4" + }, + new + { + Id = 10, + Caption = "Направление 5" + }, + new + { + Id = 11, + Caption = "Кондуктор 1" + }, + new + { + Id = 12, + Caption = "Кондуктор 2" + }, + new + { + Id = 13, + Caption = "Кондуктор 3" + }, + new + { + Id = 14, + Caption = "Кондуктор 4" + }, + new + { + Id = 15, + Caption = "Кондуктор 5" + }, + new + { + Id = 16, + Caption = "Эксплуатационная колонна 1" + }, + new + { + Id = 17, + Caption = "Эксплуатационная колонна 2" + }, + new + { + Id = 18, + Caption = "Эксплуатационная колонна 3" + }, + new + { + Id = 19, + Caption = "Эксплуатационная колонна 4" + }, + new + { + Id = 20, + Caption = "Эксплуатационная колонна 5" + }, + new + { + Id = 21, + Caption = "Транспортный ствол 1" + }, + new + { + Id = 22, + Caption = "Транспортный ствол 2" + }, + new + { + Id = 23, + Caption = "Транспортный ствол 3" + }, + new + { + Id = 24, + Caption = "Транспортный ствол 4" + }, + new + { + Id = 25, + Caption = "Транспортный ствол 5" + }, + new + { + Id = 26, + Caption = "Хвостовик 1" + }, + new + { + Id = 27, + Caption = "Хвостовик 2" + }, + new + { + Id = 28, + Caption = "Хвостовик 3" + }, + new + { + Id = 29, + Caption = "Хвостовик 4" + }, + new + { + Id = 30, + Caption = "Хвостовик 5" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_type"); + + b + .HasComment("конструкция скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Наклонно-направленная" + }, + new + { + Id = 2, + Caption = "Горизонтальная" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.HasOne("AsbCloudDb.Model.Deposit", "Deposit") + .WithMany("Clusters") + .HasForeignKey("IdDeposit") + .HasConstraintName("t_cluster_t_deposit_id_fk"); + + b.Navigation("Deposit"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType") + .WithMany("Companies") + .HasForeignKey("IdCompanyType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CompanyType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("DrillParamsCollection") + .HasForeignKey("IdWellSectionType") + .HasConstraintName("t_drill_params_t_well_section_type_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany("Files") + .HasForeignKey("IdAuthor"); + + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("FileCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => + { + b.HasOne("AsbCloudDb.Model.FileInfo", "FileInfo") + .WithMany("FileMarks") + .HasForeignKey("IdFile") + .HasConstraintName("t_file_mark_t_file_info_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .HasConstraintName("t_user_t_file_mark_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.HasOne("AsbCloudDb.Model.MeasureCategory", "Category") + .WithMany("Measures") + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdCompany") + .HasConstraintName("t_relation_company_well_t_company_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .HasConstraintName("t_relation_company_well_t_well_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.HasOne("AsbCloudDb.Model.Permission", "Permission") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.HasOne("AsbCloudDb.Model.FileInfo", "File") + .WithMany() + .HasForeignKey("IdFile") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("File"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Operation") + .WithMany("Analysis") + .HasForeignKey("IdOperation") + .HasConstraintName("t_analysis_t_operation_id_fk") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Analysis") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_analysis_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Operation"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_event_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_messages_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .HasConstraintName("t_user_t_company_id_fk") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Company"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.HasOne("AsbCloudDb.Model.Cluster", "Cluster") + .WithMany("Wells") + .HasForeignKey("IdCluster") + .HasConstraintName("t_well_t_cluster_id_fk"); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithOne("Well") + .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry") + .HasConstraintName("t_well_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("AsbCloudDb.Model.WellType", "WellType") + .WithMany("Wells") + .HasForeignKey("IdWellType"); + + b.Navigation("Cluster"); + + b.Navigation("Telemetry"); + + b.Navigation("WellType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("WellComposites") + .HasForeignKey("IdWell") + .HasConstraintName("t_well_сomposite_t_well_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .HasConstraintName("t_well_сomposite_src_t_well_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + + b.Navigation("WellSrc"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("WellOperations") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellOperations") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Navigation("Wells"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => + { + b.Navigation("Companies"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Navigation("Clusters"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Navigation("FileMarks"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Navigation("Measures"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Navigation("RelationUserRolePermissions"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Navigation("Analysis"); + + b.Navigation("DataSaub"); + + b.Navigation("DataSpin"); + + b.Navigation("Events"); + + b.Navigation("Messages"); + + b.Navigation("Users"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Navigation("FileMarks"); + + b.Navigation("Files"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("RelationUserRolePermissions"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellComposites"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Navigation("Analysis"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Navigation("DrillParamsCollection"); + + b.Navigation("WellComposites"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Navigation("Wells"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/AsbCloudDb/Migrations/20211222105725_AddedNewSectionTypes.cs b/AsbCloudDb/Migrations/20211222105725_AddedNewSectionTypes.cs new file mode 100644 index 00000000..9c3214cc --- /dev/null +++ b/AsbCloudDb/Migrations/20211222105725_AddedNewSectionTypes.cs @@ -0,0 +1,248 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace AsbCloudDb.Migrations +{ + public partial class AddedNewSectionTypes : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 1, + column: "caption", + value: "Пилотный ствол 1"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 2, + column: "caption", + value: "Пилотный ствол 2"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 3, + column: "caption", + value: "Пилотный ствол 3"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 4, + column: "caption", + value: "Пилотный ствол 4"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 5, + column: "caption", + value: "Пилотный ствол 5"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 6, + column: "caption", + value: "Направление 1"); + + migrationBuilder.InsertData( + table: "t_well_section_type", + columns: new[] { "id", "caption" }, + values: new object[,] + { + { 30, "Хвостовик 5" }, + { 29, "Хвостовик 4" }, + { 28, "Хвостовик 3" }, + { 27, "Хвостовик 2" }, + { 26, "Хвостовик 1" }, + { 25, "Транспортный ствол 5" }, + { 24, "Транспортный ствол 4" }, + { 23, "Транспортный ствол 3" }, + { 22, "Транспортный ствол 2" }, + { 21, "Транспортный ствол 1" }, + { 19, "Эксплуатационная колонна 4" }, + { 18, "Эксплуатационная колонна 3" }, + { 17, "Эксплуатационная колонна 2" }, + { 16, "Эксплуатационная колонна 1" }, + { 15, "Кондуктор 5" }, + { 14, "Кондуктор 4" }, + { 13, "Кондуктор 3" }, + { 12, "Кондуктор 2" }, + { 11, "Кондуктор 1" }, + { 10, "Направление 5" }, + { 9, "Направление 4" }, + { 8, "Направление 3" }, + { 20, "Эксплуатационная колонна 5" }, + { 7, "Направление 2" } + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 7); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 8); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 9); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 10); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 11); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 12); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 13); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 14); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 15); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 16); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 17); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 18); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 19); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 20); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 21); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 22); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 23); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 24); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 25); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 26); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 27); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 28); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 29); + + migrationBuilder.DeleteData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 30); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 1, + column: "caption", + value: "Пилотный ствол"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 2, + column: "caption", + value: "Направление"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 3, + column: "caption", + value: "Кондуктор"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 4, + column: "caption", + value: "Эксплуатационная колонна"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 5, + column: "caption", + value: "Транспортный ствол"); + + migrationBuilder.UpdateData( + table: "t_well_section_type", + keyColumn: "id", + keyValue: 6, + column: "caption", + value: "Хвостовик"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 86f8da8d..fef5954e 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -2406,32 +2406,152 @@ namespace AsbCloudDb.Migrations new { Id = 1, - Caption = "Пилотный ствол" + Caption = "Пилотный ствол 1" }, new { Id = 2, - Caption = "Направление" + Caption = "Пилотный ствол 2" }, new { Id = 3, - Caption = "Кондуктор" + Caption = "Пилотный ствол 3" }, new { Id = 4, - Caption = "Эксплуатационная колонна" + Caption = "Пилотный ствол 4" }, new { Id = 5, - Caption = "Транспортный ствол" + Caption = "Пилотный ствол 5" }, new { Id = 6, - Caption = "Хвостовик" + Caption = "Направление 1" + }, + new + { + Id = 7, + Caption = "Направление 2" + }, + new + { + Id = 8, + Caption = "Направление 3" + }, + new + { + Id = 9, + Caption = "Направление 4" + }, + new + { + Id = 10, + Caption = "Направление 5" + }, + new + { + Id = 11, + Caption = "Кондуктор 1" + }, + new + { + Id = 12, + Caption = "Кондуктор 2" + }, + new + { + Id = 13, + Caption = "Кондуктор 3" + }, + new + { + Id = 14, + Caption = "Кондуктор 4" + }, + new + { + Id = 15, + Caption = "Кондуктор 5" + }, + new + { + Id = 16, + Caption = "Эксплуатационная колонна 1" + }, + new + { + Id = 17, + Caption = "Эксплуатационная колонна 2" + }, + new + { + Id = 18, + Caption = "Эксплуатационная колонна 3" + }, + new + { + Id = 19, + Caption = "Эксплуатационная колонна 4" + }, + new + { + Id = 20, + Caption = "Эксплуатационная колонна 5" + }, + new + { + Id = 21, + Caption = "Транспортный ствол 1" + }, + new + { + Id = 22, + Caption = "Транспортный ствол 2" + }, + new + { + Id = 23, + Caption = "Транспортный ствол 3" + }, + new + { + Id = 24, + Caption = "Транспортный ствол 4" + }, + new + { + Id = 25, + Caption = "Транспортный ствол 5" + }, + new + { + Id = 26, + Caption = "Хвостовик 1" + }, + new + { + Id = 27, + Caption = "Хвостовик 2" + }, + new + { + Id = 28, + Caption = "Хвостовик 3" + }, + new + { + Id = 29, + Caption = "Хвостовик 4" + }, + new + { + Id = 30, + Caption = "Хвостовик 5" }); }); diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 42fb6a2e..0773f0c4 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -402,12 +402,36 @@ namespace AsbCloudDb.Model modelBuilder.Entity(entity => { entity.HasData(new List{ - new WellSectionType{ Id = 1, Caption = "Пилотный ствол"}, - new WellSectionType{ Id = 2, Caption = "Направление"}, - new WellSectionType{ Id = 3, Caption = "Кондуктор"}, - new WellSectionType{ Id = 4, Caption = "Эксплуатационная колонна"}, - new WellSectionType{ Id = 5, Caption = "Транспортный ствол"}, - new WellSectionType{ Id = 6, Caption = "Хвостовик"}, + new WellSectionType{ Id = 1, Caption = "Пилотный ствол 1"}, + new WellSectionType{ Id = 2, Caption = "Пилотный ствол 2"}, + new WellSectionType{ Id = 3, Caption = "Пилотный ствол 3"}, + new WellSectionType{ Id = 4, Caption = "Пилотный ствол 4"}, + new WellSectionType{ Id = 5, Caption = "Пилотный ствол 5"}, + new WellSectionType{ Id = 6, Caption = "Направление 1"}, + new WellSectionType{ Id = 7, Caption = "Направление 2"}, + new WellSectionType{ Id = 8, Caption = "Направление 3"}, + new WellSectionType{ Id = 9, Caption = "Направление 4"}, + new WellSectionType{ Id = 10, Caption = "Направление 5"}, + new WellSectionType{ Id = 11, Caption = "Кондуктор 1"}, + new WellSectionType{ Id = 12, Caption = "Кондуктор 2"}, + new WellSectionType{ Id = 13, Caption = "Кондуктор 3"}, + new WellSectionType{ Id = 14, Caption = "Кондуктор 4"}, + new WellSectionType{ Id = 15, Caption = "Кондуктор 5"}, + new WellSectionType{ Id = 16, Caption = "Эксплуатационная колонна 1"}, + new WellSectionType{ Id = 17, Caption = "Эксплуатационная колонна 2"}, + new WellSectionType{ Id = 18, Caption = "Эксплуатационная колонна 3"}, + new WellSectionType{ Id = 19, Caption = "Эксплуатационная колонна 4"}, + new WellSectionType{ Id = 20, Caption = "Эксплуатационная колонна 5"}, + new WellSectionType{ Id = 21, Caption = "Транспортный ствол 1"}, + new WellSectionType{ Id = 22, Caption = "Транспортный ствол 2"}, + new WellSectionType{ Id = 23, Caption = "Транспортный ствол 3"}, + new WellSectionType{ Id = 24, Caption = "Транспортный ствол 4"}, + new WellSectionType{ Id = 25, Caption = "Транспортный ствол 5"}, + new WellSectionType{ Id = 26, Caption = "Хвостовик 1"}, + new WellSectionType{ Id = 27, Caption = "Хвостовик 2"}, + new WellSectionType{ Id = 28, Caption = "Хвостовик 3"}, + new WellSectionType{ Id = 29, Caption = "Хвостовик 4"}, + new WellSectionType{ Id = 30, Caption = "Хвостовик 5"} }); }); diff --git a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportTemplate.xlsx index ac6367ac513ccb096ba8b6094fb1a6c5fb791136..31b8273e386c24dc2d9deb380c18ef366df6bb76 100644 GIT binary patch literal 61323 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 W`QeK57$9g|;J;MB0)30%+5Z7>|5$MV literal 61071 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 JeY4