From 6dc3137627db07aea7f609624e0aee5306844f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Wed, 8 Dec 2021 15:38:38 +0500 Subject: [PATCH] update default WellOperationCategories --- ...8103008_Update_operations_list.Designer.cs | 2978 +++++++++++++++++ .../20211208103008_Update_operations_list.cs | 89 + .../AsbCloudDbContextModelSnapshot.cs | 50 +- AsbCloudDb/Model/AsbCloudDbContext.cs | 12 +- .../WellOperationImportService.cs | 4 + .../WellOperationImportTemplate.xlsx | Bin 60998 -> 61071 bytes 6 files changed, 3109 insertions(+), 24 deletions(-) create mode 100644 AsbCloudDb/Migrations/20211208103008_Update_operations_list.Designer.cs create mode 100644 AsbCloudDb/Migrations/20211208103008_Update_operations_list.cs diff --git a/AsbCloudDb/Migrations/20211208103008_Update_operations_list.Designer.cs b/AsbCloudDb/Migrations/20211208103008_Update_operations_list.Designer.cs new file mode 100644 index 00000000..ec57acd8 --- /dev/null +++ b/AsbCloudDb/Migrations/20211208103008_Update_operations_list.Designer.cs @@ -0,0 +1,2978 @@ +// +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("20211208103008_Update_operations_list")] + partial class Update_operations_list + { + 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 = "fluidPlanLastData" + }, + new + { + Id = 9, + Name = "Последний замер бурового раствора ФАКТ", + ShortName = "fluidFactLastData" + }, + new + { + Id = 10, + Name = "Последние данные Шламограммы", + ShortName = "mudLastData" + }, + new + { + Id = 11, + Name = "Последние данные ННБ", + ShortName = "nnbLastData" + }, + 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("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.Property("PermissionValue") + .HasColumnType("integer") + .HasColumnName("permission_value"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_permission"); + + b + .HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.PermissionInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property>("BitDescription") + .HasColumnType("jsonb") + .HasColumnName("bit_description") + .HasComment("Описание каждого бита разрешений"); + + 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_info"); + + 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.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 = "Пилотный ствол" + }, + new + { + Id = 2, + Caption = "Направление" + }, + new + { + Id = 3, + Caption = "Кондуктор" + }, + new + { + Id = 4, + Caption = "Эксплуатационная колонна" + }, + new + { + Id = 5, + Caption = "Транспортный ствол" + }, + new + { + Id = 6, + Caption = "Хвостовик" + }); + }); + + 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.Permission", b => + { + b.HasOne("AsbCloudDb.Model.PermissionInfo", "PermissionInfo") + .WithMany("Permissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("Permissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("PermissionInfo"); + + b.Navigation("UserRole"); + }); + + 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.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.PermissionInfo", b => + { + b.Navigation("Permissions"); + }); + + 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("Permissions"); + + 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/20211208103008_Update_operations_list.cs b/AsbCloudDb/Migrations/20211208103008_Update_operations_list.cs new file mode 100644 index 00000000..c4e3296b --- /dev/null +++ b/AsbCloudDb/Migrations/20211208103008_Update_operations_list.cs @@ -0,0 +1,89 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace AsbCloudDb.Migrations +{ + public partial class Update_operations_list : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 1009); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 1010); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 1036); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 1023, + column: "name", + value: "Сборка инструмента с мостков"); + + migrationBuilder.InsertData( + table: "t_well_operation_category", + columns: new[] { "id", "code", "name" }, + values: new object[,] + { + { 1051, 0, "Замер ТС" }, + { 1052, 0, "Тех. отстой" }, + { 1053, 0, "Циркуляция и Обработка БР" }, + { 1054, 0, "Срезка ствола" }, + { 1055, 0, "Вспомогательные работы" } + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 1051); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 1052); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 1053); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 1054); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 1055); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 1023, + column: "name", + value: "Сборка инструмента"); + + migrationBuilder.InsertData( + table: "t_well_operation_category", + columns: new[] { "id", "code", "name" }, + values: new object[,] + { + { 1009, 0, "Оборудование устья" }, + { 1010, 0, "ОЗЦ" }, + { 1036, 0, "Спуск обсадной колонны" } + }); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 075d6f0f..2b632f98 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -2137,18 +2137,6 @@ namespace AsbCloudDb.Migrations Name = "ОЗЦ" }, new - { - Id = 1009, - Code = 0, - Name = "Оборудование устья" - }, - new - { - Id = 1010, - Code = 0, - Name = "ОЗЦ" - }, - new { Id = 1011, Code = 0, @@ -2224,7 +2212,7 @@ namespace AsbCloudDb.Migrations { Id = 1023, Code = 0, - Name = "Сборка инструмента" + Name = "Сборка инструмента с мостков" }, new { @@ -2299,12 +2287,6 @@ namespace AsbCloudDb.Migrations Name = "Принудительная проработка" }, new - { - Id = 1036, - Code = 0, - Name = "Спуск обсадной колонны" - }, - new { Id = 1037, Code = 0, @@ -2381,6 +2363,36 @@ namespace AsbCloudDb.Migrations 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 = "Вспомогательные работы" }); }); diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 91b30ff2..91bed559 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -329,8 +329,6 @@ namespace AsbCloudDb.Model new WellOperationCategory {Id = 1006, Name = "Установка ФА", Code = 0 }, new WellOperationCategory {Id = 1007, Name = "Оборудование устья", Code = 0 }, new WellOperationCategory {Id = 1008, Name = "ОЗЦ", Code = 0 }, - new WellOperationCategory {Id = 1009, Name = "Оборудование устья", Code = 0 }, - new WellOperationCategory {Id = 1010, Name = "ОЗЦ", Code = 0 }, new WellOperationCategory {Id = 1011, Name = "Начало цикла строительства скважины", Code = 0 }, new WellOperationCategory {Id = 1012, Name = "Окончание цикла строительства скважины", Code = 0 }, new WellOperationCategory {Id = 1013, Name = "Опрессовка ПВО", Code = 0 }, @@ -343,7 +341,7 @@ namespace AsbCloudDb.Model new WellOperationCategory {Id = 1020, Name = "Подъем инструмента", Code = 0 }, new WellOperationCategory {Id = 1021, Name = "Подъем инструмента с промывкой", Code = 0 }, new WellOperationCategory {Id = 1022, Name = "Обратная проработка", Code = 0 }, - new WellOperationCategory {Id = 1023, Name = "Сборка инструмента", Code = 0 }, + new WellOperationCategory {Id = 1023, Name = "Сборка инструмента с мостков", Code = 0 }, new WellOperationCategory {Id = 1024, Name = "Подготовительные работы", Code = 0 }, new WellOperationCategory {Id = 1025, Name = "Сборка КНБК", Code = 0 }, new WellOperationCategory {Id = 1026, Name = "Разборка КНБК", Code = 0 }, @@ -356,7 +354,6 @@ namespace AsbCloudDb.Model new WellOperationCategory {Id = 1033, Name = "Спуск инструмента с промывкой", Code = 0 }, new WellOperationCategory {Id = 1034, Name = "Прямая проработка", Code = 0 }, new WellOperationCategory {Id = 1035, Name = "Принудительная проработка", Code = 0 }, - new WellOperationCategory {Id = 1036, Name = "Спуск обсадной колонны", Code = 0 }, new WellOperationCategory {Id = 1037, Name = "Тех СПО-подъем", Code = 0 }, new WellOperationCategory {Id = 1038, Name = "Тех СПО-спуск", Code = 0 }, new WellOperationCategory {Id = 1039, Name = "Техническое обслуживание", Code = 0 }, @@ -369,7 +366,12 @@ namespace AsbCloudDb.Model new WellOperationCategory {Id = 1046, Name = "Спуск КНБК", Code = 0 }, new WellOperationCategory {Id = 1047, Name = "Подъем КНБК", Code = 0 }, new WellOperationCategory {Id = 1048, Name = "Спуск ОК", Code = 0 }, - new WellOperationCategory {Id = 1050, Name = "Промывка при спуске ОК", Code = 0 } + new WellOperationCategory {Id = 1050, Name = "Промывка при спуске ОК", Code = 0 }, + new WellOperationCategory {Id = 1051, Name = "Замер ТС", Code = 0 }, + new WellOperationCategory {Id = 1052, Name = "Тех. отстой", Code = 0 }, + new WellOperationCategory {Id = 1053, Name = "Циркуляция и Обработка БР", Code = 0 }, + new WellOperationCategory {Id = 1054, Name = "Срезка ствола", Code = 0 }, + new WellOperationCategory {Id = 1055, Name = "Вспомогательные работы", Code = 0 }, }); }); diff --git a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportService.cs b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportService.cs index b652fb9d..60507aa8 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportService.cs @@ -11,6 +11,10 @@ using AsbCloudApp.Services; namespace AsbCloudInfrastructure.Services.WellOperationService { + /* + * password for WellOperationImportTemplate.xlsx is ASB2020! + */ + public class WellOperationImportService : IWellOperationImportService { private const string sheetNamePlan = "План"; diff --git a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportTemplate.xlsx index 1798d7d84d115ae0ff50e40e6aeeceae6c6492e5..ac6367ac513ccb096ba8b6094fb1a6c5fb791136 100644 GIT binary patch delta 4835 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