From 14a07fd5d50463ff07a4e0efd413a6343a616b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 1 Apr 2024 13:32:48 +0300 Subject: [PATCH 01/14] =?UTF-8?q?=D0=A0=D0=B5=D0=B4=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B0=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DetectedOperation/DetectedOperationDto.cs | 8 +- .../IDetectedOperationRepository.cs | 25 +- ...94602_Update_DetectedOperation.Designer.cs | 9399 +++++++++++++++++ ...20240401094602_Update_DetectedOperation.cs | 64 + .../AsbCloudDbContextModelSnapshot.cs | 754 +- AsbCloudDb/Model/DetectedOperation.cs | 8 +- .../Repository/DetectedOperationRepository.cs | 55 +- .../DetectedOperationService.cs | 2 +- .../WorkOperationDetection.cs | 2 +- .../SAUB/DetectedOperationController.cs | 290 +- 10 files changed, 10092 insertions(+), 515 deletions(-) create mode 100644 AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.Designer.cs create mode 100644 AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.cs diff --git a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs index e81a45fb..0aa2bae5 100644 --- a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs +++ b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; namespace AsbCloudApp.Data.DetectedOperation; @@ -28,8 +29,7 @@ public class DetectedOperationDto: IId /// /// Id пользователя панели на момент начала операции /// - [Required] - public int IdUserAtStart { get; set; } + public int? IdUserAtStart { get; set; } /// /// Пользователь панели оператора @@ -75,8 +75,8 @@ public class DetectedOperationDto: IId /// /// название/описание операции /// - [Required] - public WellOperationCategoryDto OperationCategory { get; set; } = null!; + [JsonIgnore] + public WellOperationCategoryDto? OperationCategory { get; set; } /// /// Ключевой параметр операции diff --git a/AsbCloudApp/Repositories/IDetectedOperationRepository.cs b/AsbCloudApp/Repositories/IDetectedOperationRepository.cs index d7fe5865..3c9d335b 100644 --- a/AsbCloudApp/Repositories/IDetectedOperationRepository.cs +++ b/AsbCloudApp/Repositories/IDetectedOperationRepository.cs @@ -11,16 +11,16 @@ namespace AsbCloudApp.Repositories; /// /// Таблица автоматически определенных операций /// -public interface IDetectedOperationRepository : ICrudRepository +public interface IDetectedOperationRepository { /// /// Добавление записей /// - /// + /// /// /// /// - Task Insert(int? idUser, IEnumerable dtos, CancellationToken token); + Task InsertRange(int? idEditor, IEnumerable dtos, CancellationToken token); /// /// Получить автоматически определенные операции по телеметрии @@ -33,38 +33,27 @@ public interface IDetectedOperationRepository : ICrudRepository /// Редактирование записей /// - /// + /// /// /// /// - Task Update(int idUser, IEnumerable dtos, CancellationToken token); - - /// - /// Добавляет Dto у которых id == 0, изменяет dto у которых id != 0 - /// - /// - /// - /// - /// - Task UpdateOrInsert(int idUser, IEnumerable dtos, CancellationToken token); + Task UpdateRange(int idEditor, IEnumerable dtos, CancellationToken token); /// /// Удалить операции /// - /// /// /// /// - Task Delete(int idUser, DetectedOperationByTelemetryRequest request, CancellationToken token); + Task Delete(DetectedOperationByTelemetryRequest request, CancellationToken token); /// /// Удаление записей /// - /// /// /// /// - Task DeleteRange(int idUser, IEnumerable ids, CancellationToken token); + Task DeleteRange(IEnumerable ids, CancellationToken token); /// /// Получение дат последних определённых операций diff --git a/AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.Designer.cs b/AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.Designer.cs new file mode 100644 index 00000000..7b762673 --- /dev/null +++ b/AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.Designer.cs @@ -0,0 +1,9399 @@ +// +using System; +using System.Text.Json; +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + [DbContext(typeof(AsbCloudDbContext))] + [Migration("20240401094602_Update_DetectedOperation")] + partial class Update_DetectedOperation + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .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.Property("Timezone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex("IdDeposit"); + + b.ToTable("t_cluster", t => + { + t.HasComment("Кусты"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("IsContact") + .HasColumnType("boolean") + .HasColumnName("is_contact"); + + b.Property("Order") + .HasColumnType("integer") + .HasColumnName("order"); + + b.HasKey("Id"); + + b.ToTable("t_company_type"); + + b.HasData( + new + { + Id = 1, + Caption = "Недропользователь", + IsContact = true, + Order = 3 + }, + new + { + Id = 2, + Caption = "Буровой подрядчик", + IsContact = true, + Order = 2 + }, + new + { + Id = 3, + Caption = "Сервис автоматизации бурения", + IsContact = true, + Order = 0 + }, + new + { + Id = 4, + Caption = "Сервис по ГТИ", + IsContact = true, + Order = 6 + }, + new + { + Id = 5, + Caption = "Растворный сервис", + IsContact = true, + Order = 4 + }, + new + { + Id = 6, + Caption = "Сервис по ННБ", + IsContact = true, + Order = 5 + }, + new + { + Id = 7, + Caption = "Служба супервайзинга", + IsContact = false, + Order = 1 + }, + new + { + Id = 9, + Caption = "Сервис по цементированию", + IsContact = true, + Order = 7 + }, + new + { + Id = 11, + Caption = "Дизельный сервис", + IsContact = false, + Order = 9 + }, + new + { + Id = 12, + Caption = "Сервис по обслуживанию верхних силовых приводов", + IsContact = true, + Order = 8 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Company") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("company") + .HasComment("компания"); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("email"); + + b.Property("FullName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("full_name") + .HasComment("ФИО"); + + b.Property("IdCompanyType") + .HasMaxLength(255) + .HasColumnType("integer") + .HasColumnName("id_company_type") + .HasComment("вид деятельности"); + + b.Property("IdWell") + .HasMaxLength(255) + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ключ скважины"); + + b.Property("Phone") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("phone") + .HasComment("номер телефона"); + + b.Property("Position") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("position") + .HasComment("должность"); + + b.HasKey("Id"); + + b.HasIndex("IdCompanyType"); + + b.HasIndex("IdWell"); + + b.ToTable("t_contact", t => + { + t.HasComment("Контакты"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Date") + .HasColumnType("date") + .HasColumnName("date") + .HasComment("Дата формирования отчёта"); + + b.Property("DateLastUpdate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_update") + .HasComment("Дата последнего обновления"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("SignBlock") + .HasColumnType("jsonb") + .HasColumnName("sign_block") + .HasComment("Подпись"); + + b.Property("SubsystemBlock") + .HasColumnType("jsonb") + .HasColumnName("subsystem_block") + .HasComment("Наработкой подсистем"); + + b.Property("TimeBalanceBlock") + .HasColumnType("jsonb") + .HasColumnName("time_balance_block") + .HasComment("Баланс времени"); + + b.HasKey("Id"); + + b.HasIndex("IdWell", "Date") + .IsUnique(); + + b.ToTable("t_daily_report", t => + { + t.HasComment("Ежедневные отчёты"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AxialLoad") + .HasColumnType("double precision") + .HasColumnName("axial_load") + .HasComment("Фактическая нагрузка"); + + b.Property("AxialLoadLimitMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_limit_max") + .HasComment("Максимально допустимая нагрузка"); + + b.Property("AxialLoadSp") + .HasColumnType("double precision") + .HasColumnName("axial_load_sp") + .HasComment("Ограничение факт. нагрузки"); + + b.Property("BlockSpeedSp") + .HasColumnType("double precision") + .HasColumnName("block_speed_sp") + .HasComment("Ограничение скорости блока"); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("Дата и время окончания"); + + b.Property("DateStart") + .HasColumnType("timestamp with 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("EnabledSubsystems") + .HasColumnType("integer") + .HasColumnName("enabled_subsystems") + .HasComment("Флаги подсистем"); + + b.Property("Flow") + .HasColumnType("double precision") + .HasColumnName("flow") + .HasComment("Фактический расход"); + + b.Property("HasOscillation") + .HasColumnType("boolean") + .HasColumnName("has_oscillation") + .HasComment("Наличие или отсутствие осцилляции"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Название автоопределённой операции"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator") + .HasComment("Работа при достижении ограничения"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Ключ телеметрии"); + + b.Property("Pressure") + .HasColumnType("double precision") + .HasColumnName("pressure") + .HasComment("Давление"); + + b.Property("PressureIdle") + .HasColumnType("double precision") + .HasColumnName("pressure_idle") + .HasComment("Давление холостого хода"); + + b.Property("PressureSp") + .HasColumnType("double precision") + .HasColumnName("pressure_sp") + .HasComment("Ограничение фактического давления"); + + b.Property("RotorSpeed") + .HasColumnType("double precision") + .HasColumnName("rotor_speed") + .HasComment("Фактическая скорость оборотов ВСП"); + + b.Property("RotorTorque") + .HasColumnType("double precision") + .HasColumnName("rotor_torque") + .HasComment("Фактический момент"); + + b.Property("RotorTorqueLimitMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_limit_max") + .HasComment("Максимально допустимый момент"); + + b.Property("RotorTorqueSp") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_sp") + .HasComment("Ограничение факт. момента"); + + b.Property("Speed") + .HasColumnType("double precision") + .HasColumnName("speed") + .HasComment("Скорость бурения"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_data_saub_stat", t => + { + t.HasComment("Кеш-таблица для хранения данных для РТК-отчета"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .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.Property("Timezone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.ToTable("t_deposit", t => + { + t.HasComment("Месторождение"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .HasComment("дата создания"); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("Дата начала операции"); + + b.Property("DateStart") + .HasColumnType("timestamp with 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("EnabledSubsystems") + .HasColumnType("integer") + .HasColumnName("enabled_subsystems") + .HasComment("флаги включенных подсистем"); + + b.Property("ExtraData") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("extra_data") + .HasComment("доп. инфо по операции"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUsersAtStart") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя по телеметрии на момент начала операции"); + + b.Property("Value") + .HasColumnType("double precision") + .HasColumnName("value") + .HasComment("Ключевой показатель операции"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_detected_operation", t => + { + t.HasComment("автоматически определенные операции по телеметрии"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Идентификатор телеметрии"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depthStart") + .HasComment("Глубина начала"); + + b.Property("Params") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("t_drill_test_params") + .HasComment("Параметры записи drill test"); + + b.Property("TimeStampStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("timestamp_start") + .HasComment("Время начала"); + + b.HasKey("Id", "IdTelemetry"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_drill_test", t => + { + t.HasComment("Drill_test"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Имя"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("Отчество"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("Фамилия"); + + b.HasKey("Id"); + + b.ToTable("t_driller", t => + { + t.HasComment("Бурильщик"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdFileCategory") + .HasColumnType("integer") + .HasColumnName("id_file_category"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("Id"); + + b.HasIndex("IdFileCategory"); + + b.HasIndex("IdWell", "IdFileCategory") + .IsUnique(); + + b.ToTable("t_drilling_program_part", t => + { + t.HasComment("части программ бурения"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Faq", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Answer") + .HasColumnType("text") + .HasColumnName("answer") + .HasComment("Текст ответа"); + + b.Property("CounterQuestion") + .HasColumnType("integer") + .HasColumnName("counter_question") + .HasComment("Счетчик повторений вопроса"); + + b.Property("DateAnswer") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_answer") + .HasComment("Дата ответа"); + + b.Property("DateCreatedQuestion") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_created_question") + .HasComment("Дата создания вопроса"); + + b.Property("DateLastEditedQuestion") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_edited_question") + .HasComment("Дата последнего редактирования вопроса"); + + b.Property("IdAuthorAnswer") + .HasColumnType("integer") + .HasColumnName("id_author_answer") + .HasComment("id автора ответа"); + + b.Property("IdAuthorQuestion") + .HasColumnType("integer") + .HasColumnName("id_author_question") + .HasComment("id автора вопроса"); + + b.Property("IdReplacementQuestion") + .HasColumnType("integer") + .HasColumnName("id_replacement_question") + .HasComment("Ключ заменяющего вопроса"); + + b.Property("IsFrequently") + .HasColumnType("boolean") + .HasColumnName("is_frequently") + .HasComment("Частый вопрос"); + + b.Property("Question") + .IsRequired() + .HasColumnType("text") + .HasColumnName("question") + .HasComment("Текст вопроса"); + + b.Property("State") + .HasColumnType("integer") + .HasColumnName("state") + .HasComment("Статус вопроса"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthorAnswer"); + + b.HasIndex("IdAuthorQuestion"); + + b.ToTable("t_faq", t => + { + t.HasComment("вопросы пользователей"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_file_category", t => + { + t.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 = 1000, + Name = "Программа бурения" + }, + new + { + Id = 1001, + Name = "Задание от геологов" + }, + new + { + Id = 1002, + Name = "Профиль ствола скважины (ННБ)" + }, + new + { + Id = 1003, + Name = "Технологические расчеты (ННБ)" + }, + new + { + Id = 1004, + Name = "Долотная программа" + }, + new + { + Id = 1005, + Name = "Программа по растворам" + }, + new + { + Id = 1006, + Name = "Программа геофизических исследований" + }, + new + { + Id = 1007, + Name = "Планы спусков обсадных колонн" + }, + new + { + Id = 1008, + Name = "Программы цементирования обсадных колонн" + }, + new + { + Id = 10000, + Name = "Проект на бурение транспортного и горизонтального участков скважины" + }, + new + { + Id = 10001, + Name = "Программа на бурение транспортного и горизонтального участков скважины" + }, + new + { + Id = 10002, + Name = "Акт о начале бурения" + }, + new + { + Id = 10003, + Name = "План работ спуска и цементирования направления" + }, + new + { + Id = 10004, + Name = "Программа цементирования направления" + }, + new + { + Id = 10005, + Name = "Мера обсадных труб (направление)" + }, + new + { + Id = 10006, + Name = "Акт на выполненные работы по цементированию направления" + }, + new + { + Id = 10007, + Name = "Отчет по цементированию направления (график)" + }, + new + { + Id = 10008, + Name = "План работ спуска и цементирования кондуктора" + }, + new + { + Id = 10009, + Name = "Программа цементирования (кондуктор)" + }, + new + { + Id = 10010, + Name = "Мера обсадных труб (кондуктор)" + }, + new + { + Id = 10011, + Name = "Карта крепления кондуктора" + }, + new + { + Id = 10012, + Name = "Акт на выполненные работы по цементированию кондуктора" + }, + new + { + Id = 10013, + Name = "Отчет по цементированию кондуктора (график)" + }, + new + { + Id = 10014, + Name = "Акт о замере расстояния от стола ротора до муфты кондуктора" + }, + new + { + Id = 10015, + Name = "Акт опресовки цементного кольца за кондуктором" + }, + new + { + Id = 10016, + Name = "Акт опресовки ППГ с глухими плашками совместно с кондуктором" + }, + new + { + Id = 10017, + Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с кондуктором" + }, + new + { + Id = 10018, + Name = "План работ на крепление обсадной колонны (эк. колонна)" + }, + new + { + Id = 10019, + Name = "Программа цементирования (эк. колонна)" + }, + new + { + Id = 10020, + Name = "Мера труб эксплуатационной колонны" + }, + new + { + Id = 10021, + Name = "Карта по креплению скважины (эк. колонна)" + }, + new + { + Id = 10022, + Name = "Акт на установку пружинных центраторов" + }, + new + { + Id = 10023, + Name = "Отчет по цементированию эксплуатационной колонны (график)" + }, + new + { + Id = 10024, + Name = "Акт на выполненные работы по цементированию эксплуатационной колонны" + }, + new + { + Id = 10025, + Name = "Акт об испытании эк. колонны на герметичность (СТОП)" + }, + new + { + Id = 10026, + Name = "Акт опресовки ППГ с глухими плашками совместно с э/колонной" + }, + new + { + Id = 10027, + Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с э/колонной" + }, + new + { + Id = 10028, + Name = "Акт на вскрытие продуктивного пласта" + }, + new + { + Id = 10029, + Name = "Акт замера параметров раствора при бурении горизонтального участка" + }, + new + { + Id = 10030, + Name = "Разрешение на спуск «хвостовика» (телефонограмма)" + }, + new + { + Id = 10031, + Name = "План работ на спуск «хвостовика»" + }, + new + { + Id = 10032, + Name = "Акт готовности бурового и энергетического оборудования к спуску «хвостовика»" + }, + new + { + Id = 10033, + Name = "Акт шаблонировки ствола скважины перед спуском «хвостовика»" + }, + new + { + Id = 10034, + Name = "Мера обсадных труб (хвостовик)" + }, + new + { + Id = 10035, + Name = "Акт выполненных работ по спуску хвостовика с закачкой (нефти, солевого раствора" + }, + new + { + Id = 10036, + Name = "Акт о переводе скважины на тех. воду" + }, + new + { + Id = 10037, + Name = "Акт об окончании бурения" + }, + new + { + Id = 10038, + Name = "Акт на передачу скважины в освоение (КРС)" + }, + new + { + Id = 10039, + Name = "Акт на опресовку межколонного пространства с КРС" + }, + new + { + Id = 10040, + Name = "Акт на сдачу скважины в ЦДНГ" + }, + new + { + Id = 10041, + Name = "Паспорт ОУС (заполняется геологами)" + }, + new + { + Id = 10042, + Name = "Паспорт скважины (заполняется геологами)" + }, + new + { + Id = 10043, + Name = "Фактические данные бурения (вставляются в паспорт скважины)" + }, + new + { + Id = 20000, + Name = "Справки по страницам" + }, + new + { + Id = 30000, + Name = "Инструкции" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .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", t => + { + t.HasComment("Файлы всех категорий"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp with 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 - отклонен, 1 - согласован"); + + 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", t => + { + t.HasComment("Действия с файлами."); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdRecord") + .HasColumnType("integer") + .HasColumnName("id_record"); + + b.Property("IdItem") + .HasColumnType("integer") + .HasColumnName("id_item"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Value") + .HasColumnType("real") + .HasColumnName("value"); + + b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); + + b.ToTable("t_wits_float", t => + { + t.HasComment("таблица данных ГТИ с типом значения float"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdRecord") + .HasColumnType("integer") + .HasColumnName("id_record"); + + b.Property("IdItem") + .HasColumnType("integer") + .HasColumnName("id_item"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Value") + .HasColumnType("integer") + .HasColumnName("value"); + + b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); + + b.ToTable("t_wits_int", t => + { + t.HasComment("таблица данных ГТИ с типом значения int"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdRecord") + .HasColumnType("integer") + .HasColumnName("id_record"); + + b.Property("IdItem") + .HasColumnType("integer") + .HasColumnName("id_item"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text") + .HasColumnName("value"); + + b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); + + b.ToTable("t_wits_string", t => + { + t.HasComment("таблица данных ГТИ с типом значения string"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории файла"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название файла"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("file_size") + .HasComment("Размер файла"); + + b.Property("UrlPage") + .IsRequired() + .HasColumnType("text") + .HasColumnName("url_page") + .HasComment("Url страницы"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.ToTable("t_help_page", t => + { + t.HasComment("Справки"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start"); + + b.Property("DepthEnd") + .HasColumnType("real") + .HasColumnName("depth_end"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depth_start"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_limiting_parameter", t => + { + t.HasComment("Ограничения по параметрам телеметрии"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.Manual", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateDownload") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_download") + .HasComment("Дата загрузки"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id автора"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории файла"); + + b.Property("IdDirectory") + .HasColumnType("integer") + .HasColumnName("id_directory") + .HasComment("Id директории"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdDirectory"); + + b.ToTable("t_manual", t => + { + t.HasComment("Инструкции"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("Id родительской директории"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.HasIndex("IdParent"); + + b.ToTable("t_manual_directory", t => + { + t.HasComment("Директория для инструкций"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Data") + .IsRequired() + .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 with time zone") + .HasColumnName("timestamp") + .HasComment("время добавления"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_measure", t => + { + t.HasComment("Таблица c данными для вкладки 'Последние данные'"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_measure_category", t => + { + t.HasComment("Категория последних данных"); + }); + + b.HasData( + new + { + Id = 1, + Name = "Показатели бурового раствора", + ShortName = "Раствор" + }, + new + { + Id = 2, + Name = "Шламограмма", + ShortName = "Шламограмма" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "ННБ" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Notification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdNotificationCategory") + .HasColumnType("integer") + .HasColumnName("id_notification_category") + .HasComment("Id категории уведомления"); + + b.Property("IdTransportType") + .HasColumnType("integer") + .HasColumnName("id_transport_type") + .HasComment("Id типа доставки уведомления"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id получателя"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message") + .HasComment("Сообщение уведомления"); + + b.Property("ReadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("read_date") + .HasComment("Дата прочтения уведомления"); + + b.Property("RegistrationDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("registration_date") + .HasComment("Дата регистрации уведомления"); + + b.Property("SentDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("sent_date") + .HasComment("Дата отправки уведомления"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text") + .HasColumnName("title") + .HasComment("Заголовок уведомления"); + + b.HasKey("Id"); + + b.HasIndex("IdNotificationCategory"); + + b.HasIndex("IdUser"); + + b.ToTable("t_notification", t => + { + t.HasComment("Уведомления"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("t_notification_category", t => + { + t.HasComment("Категории уведомлений"); + }); + + b.HasData( + new + { + Id = 1, + Name = "Системные уведомления" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.OperationValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Старотовая глубина"); + + b.Property("IdOperationCategory") + .HasColumnType("integer") + .HasColumnName("id_operation_category") + .HasComment("Ид категории операции"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Ид скважины"); + + b.Property("StandardValue") + .HasColumnType("double precision") + .HasColumnName("standard_value") + .HasComment("Нормативный показатель"); + + b.Property("TargetValue") + .HasColumnType("double precision") + .HasColumnName("target_value") + .HasComment("Целевой показатель"); + + b.HasKey("Id"); + + b.HasIndex("IdOperationCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_operationvalue", t => + { + t.HasComment("Целевые/нормативные показатели операции"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission", t => + { + t.HasComment("Разрешения на доступ к данным"); + }); + + b.HasData( + new + { + Id = 100, + Description = "Разрешение удалять админ. Кусты", + Name = "AdminCluster.delete" + }, + new + { + Id = 101, + Description = "Разрешение редактировать админ. Кусты", + Name = "AdminCluster.edit" + }, + new + { + Id = 102, + Description = "Разрешение просматривать админ. Кусты", + Name = "AdminCluster.get" + }, + new + { + Id = 103, + Description = "Разрешение удалять админ. Компании", + Name = "AdminCompany.delete" + }, + new + { + Id = 104, + Description = "Разрешение редактировать админ. Компании", + Name = "AdminCompany.edit" + }, + new + { + Id = 105, + Description = "Разрешение просматривать админ. Компании", + Name = "AdminCompany.get" + }, + new + { + Id = 106, + Description = "Разрешение удалять админ. Типы компаний", + Name = "AdminCompanyType.delete" + }, + new + { + Id = 107, + Description = "Разрешение редактировать админ. Типы компаний", + Name = "AdminCompanyType.edit" + }, + new + { + Id = 108, + Description = "Разрешение просматривать админ. Типы компаний", + Name = "AdminCompanyType.get" + }, + new + { + Id = 109, + Description = "Разрешение удалять админ. Месторождения", + Name = "AdminDeposit.delete" + }, + new + { + Id = 110, + Description = "Разрешение редактировать админ. Месторождения", + Name = "AdminDeposit.edit" + }, + new + { + Id = 111, + Description = "Разрешение просматривать админ. Месторождения", + Name = "AdminDeposit.get" + }, + new + { + Id = 112, + Description = "Разрешение удалять админ. Разрешения", + Name = "AdminPermission.delete" + }, + new + { + Id = 113, + Description = "Разрешение редактировать админ. Разрешения", + Name = "AdminPermission.edit" + }, + new + { + Id = 114, + Description = "Разрешение просматривать админ. Разрешения", + Name = "AdminPermission.get" + }, + new + { + Id = 115, + Description = "Разрешение удалять админ. Телеметрию", + Name = "AdminTelemetry.delete" + }, + new + { + Id = 116, + Description = "Разрешение редактировать админ. Телеметрию", + Name = "AdminTelemetry.edit" + }, + new + { + Id = 117, + Description = "Разрешение просматривать админ. Телеметрию", + Name = "AdminTelemetry.get" + }, + new + { + Id = 118, + Description = "Разрешение удалять админ. Пользователей", + Name = "AdminUser.delete" + }, + new + { + Id = 119, + Description = "Разрешение редактировать админ. Пользователей", + Name = "AdminUser.edit" + }, + new + { + Id = 120, + Description = "Разрешение просматривать админ. Пользователей", + Name = "AdminUser.get" + }, + new + { + Id = 121, + Description = "Разрешение удалять админ. Роли пользователей", + Name = "AdminUserRole.delete" + }, + new + { + Id = 122, + Description = "Разрешение редактировать админ. Роли пользователей", + Name = "AdminUserRole.edit" + }, + new + { + Id = 123, + Description = "Разрешение просматривать админ. Роли пользователей", + Name = "AdminUserRole.get" + }, + new + { + Id = 124, + Description = "Разрешение удалять админ. Скважины", + Name = "AdminWell.delete" + }, + new + { + Id = 125, + Description = "Разрешение редактировать админ. Скважины", + Name = "AdminWell.edit" + }, + new + { + Id = 126, + Description = "Разрешение просматривать админ. Скважины", + Name = "AdminWell.get" + }, + new + { + Id = 127, + Description = "Разрешение удалять админ. Подсистемы", + Name = "AdminSubsytem.delete" + }, + new + { + Id = 128, + Description = "Разрешение редактировать админ. Подсистемы", + Name = "AdminSubsytem.edit" + }, + new + { + Id = 129, + Description = "Разрешение просматривать админ. Подсистемы", + Name = "AdminSubsytem.get" + }, + new + { + Id = 200, + Description = "Разрешение редактировать 0", + Name = "Auth.edit" + }, + new + { + Id = 201, + Description = "Разрешение просматривать 0", + Name = "Auth.get" + }, + new + { + Id = 202, + Description = "Разрешение просматривать Кусты", + Name = "Cluster.get" + }, + new + { + Id = 203, + Description = "Разрешение просматривать Месторождения", + Name = "Deposit.get" + }, + new + { + Id = 204, + Description = "Разрешение удалять РТК", + Name = "DrillFlowChart.delete" + }, + new + { + Id = 205, + Description = "Разрешение редактировать РТК", + Name = "DrillFlowChart.edit" + }, + new + { + Id = 206, + Description = "Разрешение просматривать РТК", + Name = "DrillFlowChart.get" + }, + new + { + Id = 207, + Description = "Разрешение удалять Программу бурения", + Name = "DrillingProgram.delete" + }, + new + { + Id = 208, + Description = "Разрешение редактировать Программу бурения", + Name = "DrillingProgram.edit" + }, + new + { + Id = 209, + Description = "Разрешение просматривать Программу бурения", + Name = "DrillingProgram.get" + }, + new + { + Id = 210, + Description = "Разрешение удалять Режимы бурения", + Name = "DrillParams.delete" + }, + new + { + Id = 211, + Description = "Разрешение редактировать Режимы бурения", + Name = "DrillParams.edit" + }, + new + { + Id = 212, + Description = "Разрешение просматривать Режимы бурения", + Name = "DrillParams.get" + }, + new + { + Id = 213, + Description = "Разрешение удалять Файлы", + Name = "File.delete" + }, + new + { + Id = 214, + Description = "Разрешение редактировать Файлы", + Name = "File.edit" + }, + new + { + Id = 215, + Description = "Разрешение просматривать Файлы", + Name = "File.get" + }, + new + { + Id = 216, + Description = "Разрешение удалять Измерения", + Name = "Measure.delete" + }, + new + { + Id = 217, + Description = "Разрешение редактировать Измерения", + Name = "Measure.edit" + }, + new + { + Id = 218, + Description = "Разрешение просматривать Измерения", + Name = "Measure.get" + }, + new + { + Id = 219, + Description = "Разрешение просматривать Сообщения телеметрии", + Name = "Message.get" + }, + new + { + Id = 220, + Description = "Разрешение просматривать Статистику по операциям", + Name = "OperationStat.get" + }, + new + { + Id = 221, + Description = "Разрешение редактировать Рапорта", + Name = "Report.edit" + }, + new + { + Id = 222, + Description = "Разрешение просматривать Рапорта", + Name = "Report.get" + }, + new + { + Id = 223, + Description = "Разрешение просматривать админ. Системная статистика", + Name = "RequestTracker.get" + }, + new + { + Id = 224, + Description = "Разрешение удалять Рекомендации уставок", + Name = "Setpoints.delete" + }, + new + { + Id = 225, + Description = "Разрешение редактировать Рекомендации уставок", + Name = "Setpoints.edit" + }, + new + { + Id = 226, + Description = "Разрешение просматривать Рекомендации уставок", + Name = "Setpoints.get" + }, + new + { + Id = 227, + Description = "Разрешение редактировать Телеметрии", + Name = "Telemetry.edit" + }, + new + { + Id = 228, + Description = "Разрешение просматривать Анализ телеметрии", + Name = "TelemetryAnalytics.get" + }, + new + { + Id = 229, + Description = "Разрешение редактировать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.edit" + }, + new + { + Id = 230, + Description = "Разрешение просматривать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.get" + }, + new + { + Id = 231, + Description = "Разрешение редактировать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.edit" + }, + new + { + Id = 232, + Description = "Разрешение просматривать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.get" + }, + new + { + Id = 233, + Description = "Разрешение редактировать Скважины", + Name = "Well.edit" + }, + new + { + Id = 234, + Description = "Разрешение просматривать Скважины", + Name = "Well.get" + }, + new + { + Id = 235, + Description = "Разрешение редактировать Композитные скважины", + Name = "WellComposite.edit" + }, + new + { + Id = 236, + Description = "Разрешение просматривать Композитные скважины", + Name = "WellComposite.get" + }, + new + { + Id = 237, + Description = "Разрешение удалять Операции по скважинам", + Name = "WellOperation.delete" + }, + new + { + Id = 238, + Description = "Разрешение редактировать Операции по скважинам", + Name = "WellOperation.edit" + }, + new + { + Id = 239, + Description = "Разрешение просматривать Операции по скважинам", + Name = "WellOperation.get" + }, + new + { + Id = 240, + Description = "Разрешение редактировать Файлы категории 1 (Растворный сервис)", + Name = "File.edit1" + }, + new + { + Id = 241, + Description = "Разрешение редактировать Файлы категории 2 (Цементирование)", + Name = "File.edit2" + }, + new + { + Id = 242, + Description = "Разрешение редактировать Файлы категории 3 (ННБ)", + Name = "File.edit3" + }, + new + { + Id = 243, + Description = "Разрешение редактировать Файлы категории 4 (ГТИ)", + Name = "File.edit4" + }, + new + { + Id = 244, + Description = "Разрешение редактировать Файлы категории 5 (Документы по скважине)", + Name = "File.edit5" + }, + new + { + Id = 245, + Description = "Разрешение редактировать Файлы категории 6 (Супервайзер)", + Name = "File.edit6" + }, + new + { + Id = 246, + Description = "Разрешение редактировать Файлы категории 7 (Мастер)", + Name = "File.edit7" + }, + new + { + Id = 247, + Description = "Разрешение редактировать Файлы категории 8 (Долотный сервис)", + Name = "File.edit8" + }, + new + { + Id = 248, + Description = "Разрешение редактировать Файлы категории 9 (Буровой подрядчик)", + Name = "File.edit9" + }, + new + { + Id = 249, + Description = "Разрешение редактировать Файлы категории 10 (Сервис по заканчиванию скважины)", + Name = "File.edit10" + }, + new + { + Id = 250, + Description = "Разрешение редактировать Файлы категории 11 (Рапорт)", + Name = "File.edit11" + }, + new + { + Id = 251, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit12" + }, + new + { + Id = 252, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit13" + }, + new + { + Id = 253, + Description = "Разрешение редактировать Файлы категории 13", + Name = "File.edit14" + }, + new + { + Id = 254, + Description = "Разрешение редактировать Файлы категории 14", + Name = "File.edit15" + }, + new + { + Id = 255, + Description = "Разрешение редактировать Файлы категории 15", + Name = "File.edit16" + }, + new + { + Id = 256, + Description = "Разрешение редактировать Файлы категории 16", + Name = "File.edit17" + }, + new + { + Id = 257, + Description = "Разрешение редактировать Файлы категории 17", + Name = "File.edit18" + }, + new + { + Id = 258, + Description = "Разрешение редактировать Файлы категории 18", + Name = "File.edit19" + }, + new + { + Id = 259, + Description = "Разрешение редактировать Файлы категории 19", + Name = "File.edit20" + }, + new + { + Id = 260, + Description = "Разрешение редактировать Файлы категории 20", + Name = "File.edit21" + }, + new + { + Id = 261, + Description = "Разрешение редактировать Файлы категории 21", + Name = "File.edit22" + }, + new + { + Id = 262, + Description = "Разрешение редактировать Файлы категории 22", + Name = "File.edit23" + }, + new + { + Id = 263, + Description = "Разрешение редактировать Файлы категории 23", + Name = "File.edit24" + }, + new + { + Id = 264, + Description = "Разрешение редактировать Файлы категории 24", + Name = "File.edit25" + }, + new + { + Id = 265, + Description = "Разрешение редактировать Файлы категории 25", + Name = "File.edit26" + }, + new + { + Id = 266, + Description = "Разрешение редактировать Файлы категории 26", + Name = "File.edit27" + }, + new + { + Id = 267, + Description = "Разрешение редактировать Файлы категории 27", + Name = "File.edit28" + }, + new + { + Id = 268, + Description = "Разрешение редактировать Файлы категории 28", + Name = "File.edit29" + }, + new + { + Id = 269, + Description = "Разрешение редактировать Файлы категории 29", + Name = "File.edit30" + }, + new + { + Id = 380, + Description = "Разрешение просматривать список бурильщиков", + Name = "Driller.get" + }, + new + { + Id = 381, + Description = "Разрешение редактировать бурильщика", + Name = "Driller.edit" + }, + new + { + Id = 382, + Description = "Разрешение удалять бурильщик", + Name = "Driller.delete" + }, + new + { + Id = 383, + Description = "Разрешение просматривать графики бурильщиков", + Name = "Schedule.get" + }, + new + { + Id = 384, + Description = "Разрешение редактировать график бурильщика", + Name = "Schedule.edit" + }, + new + { + Id = 385, + Description = "Разрешение удалять график бурильщика", + Name = "Schedule.delete" + }, + new + { + Id = 386, + Description = "Разрешение просматривать суточный рапорт", + Name = "DailyReport.get" + }, + new + { + Id = 387, + Description = "Разрешение редактировать суточный рапорт", + Name = "DailyReport.edit" + }, + new + { + Id = 388, + Description = "Разрешение просматривать авто. определенные операции", + Name = "DetectedOperation.get" + }, + new + { + Id = 389, + Description = "Разрешение просматривать целевые значения", + Name = "OperationValue.get" + }, + new + { + Id = 390, + Description = "Разрешение редактировать целевые значения", + Name = "OperationValue.edit" + }, + new + { + Id = 391, + Description = "Разрешение удалять целевые значения", + Name = "OperationValue.delete" + }, + new + { + Id = 400, + Description = "Разрешение просматривать инфо по wits параметрам", + Name = "WitsInfo.get" + }, + new + { + Id = 401, + Description = "Разрешение просматривать WITS record 1", + Name = "WitsRecord1.get" + }, + new + { + Id = 407, + Description = "Разрешение просматривать WITS record 7", + Name = "WitsRecord7.get" + }, + new + { + Id = 408, + Description = "Разрешение просматривать WITS record 8", + Name = "WitsRecord8.get" + }, + new + { + Id = 450, + Description = "Разрешение просматривать WITS record 50", + Name = "WitsRecord50.get" + }, + new + { + Id = 460, + Description = "Разрешение просматривать WITS record 60", + Name = "WitsRecord60.get" + }, + new + { + Id = 461, + Description = "Разрешение просматривать WITS record 61", + Name = "WitsRecord61.get" + }, + new + { + Id = 500, + Description = "Разрешение удалять Категорий документов файлов", + Name = "FileCategory.delete" + }, + new + { + Id = 501, + Description = "Разрешение редактировать Категорий документов файлов", + Name = "FileCategory.edit" + }, + new + { + Id = 502, + Description = "Разрешение просматривать Категорий документов файлов", + Name = "FileCategory.get" + }, + new + { + Id = 503, + Description = "Разрешение удалять Дело скважины", + Name = "WellFinalDocuments.delete" + }, + new + { + Id = 504, + Description = "Разрешение редактировать Дело скважины", + Name = "WellFinalDocuments.edit" + }, + new + { + Id = 505, + Description = "Разрешение просматривать Дело скважины", + Name = "WellFinalDocuments.get" + }, + new + { + Id = 506, + Description = "Разрешение редактировать ответственных за загрузку файла Дело скважины", + Name = "WellFinalDocuments.editPublisher" + }, + new + { + Id = 507, + Description = "Разрешение просматривать наработка талевого каната", + Name = "TelemetryWirelineRunOut.get" + }, + new + { + Id = 510, + Description = "Разрешение просматривать плановая траектория", + Name = "PlannedTrajectory.get" + }, + new + { + Id = 511, + Description = "Разрешение редактировать плановая траектория", + Name = "PlannedTrajectory.edit" + }, + new + { + Id = 512, + Description = "Разрешение удалять плановая траектория", + Name = "PlannedTrajectory.delete" + }, + new + { + Id = 516, + Description = "Разрешение просматривать статистику вопросов", + Name = "FaqStatistics.get" + }, + new + { + Id = 517, + Description = "Разрешение редактировать вопрос", + Name = "FaqStatistics.edit" + }, + new + { + Id = 518, + Description = "Разрешение удалять вопрос", + Name = "FaqStatistics.delete" + }, + new + { + Id = 519, + Description = "Разрешение просматривать список контактов", + Name = "WellContact.get" + }, + new + { + Id = 520, + Description = "Разрешение редактировать список контактов", + Name = "WellContact.edit" + }, + new + { + Id = 521, + Description = "Разрешить создание справок по страницам", + Name = "HelpPage.edit" + }, + new + { + Id = 522, + Description = "Разрешить удаление всех настроек пользователя", + Name = "UserSettings.delete" + }, + new + { + Id = 523, + Description = "Разрешить редактирование инструкций", + Name = "Manual.edit" + }, + new + { + Id = 524, + Description = "Разрешить получение инструкций", + Name = "Manual.get" + }, + new + { + Id = 525, + Description = "Разрешение на редактирование РТК у завершенной скважины", + Name = "ProcessMap.editCompletedWell" + }, + new + { + Id = 526, + Description = "Разрешение на редактирование операций у завершенной скважины", + Name = "WellOperation.editCompletedWell" + }, + new + { + Id = 527, + Description = "Разрешение на удаление инструкций", + Name = "Manual.delete" + }, + new + { + Id = 528, + Description = "Разрешение на удаление контакта", + Name = "WellContact.delete" + }, + new + { + Id = 530, + Description = "Разрешение на редактирование плановой конструкции скважины", + Name = "WellSectionPlan.edit" + }, + new + { + Id = 531, + Description = "Разрешение на удаление плановой конструкции скважины", + Name = "WellSectionPlan.delete" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AxialLoadLimitMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_limit_max") + .HasComment("Осевая нагрузка, т, допустимый максимум"); + + b.Property("AxialLoadPlan") + .HasColumnType("double precision") + .HasColumnName("axial_load_plan") + .HasComment("Осевая нагрузка, т, план"); + + b.Property("Comment") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .HasComment("дата создания"); + + b.Property("DeltaPressureLimitMax") + .HasColumnType("double precision") + .HasColumnName("delta_pressure_limit_max") + .HasComment("Перепад давления, атм, допустимый максимум"); + + b.Property("DeltaPressurePlan") + .HasColumnType("double precision") + .HasColumnName("delta_pressure_plan") + .HasComment("Перепад давления, атм, план"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина по стволу до, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина по стволу от, м"); + + b.Property("FlowLimitMax") + .HasColumnType("double precision") + .HasColumnName("flow_limit_max") + .HasComment("Расход, л/с, допустимый максимум"); + + b.Property("FlowPlan") + .HasColumnType("double precision") + .HasColumnName("flow_plan") + .HasComment("Расход, л/с, план"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Автор"); + + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); + + b.Property("IdMode") + .HasColumnType("integer") + .HasColumnName("id_mode") + .HasComment("Id режима (1- ротор, 2 слайд)"); + + b.Property("IdPrevious") + .HasColumnType("integer") + .HasColumnName("id_previous") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("Obsolete") + .HasColumnType("timestamp with time zone") + .HasColumnName("obsolete") + .HasComment("дата устаревания"); + + b.Property("RopPlan") + .HasColumnType("double precision") + .HasColumnName("rop_plan") + .HasComment("Плановая механическая скорость, м/ч"); + + b.Property("TopDriveSpeedLimitMax") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_limit_max") + .HasComment("Обороты на ВСП, допустимый максимум"); + + b.Property("TopDriveSpeedPlan") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_plan") + .HasComment("Обороты на ВСП, план"); + + b.Property("TopDriveTorqueLimitMax") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_limit_max") + .HasComment("Момент на ВСП, допустимый максимум"); + + b.Property("TopDriveTorquePlan") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_plan") + .HasComment("Момент на ВСП, план"); + + b.Property("UsageSaub") + .HasColumnType("double precision") + .HasColumnName("usage_saub") + .HasComment("Плановый процент использования АКБ"); + + b.Property("UsageSpin") + .HasColumnType("double precision") + .HasColumnName("usage_spin") + .HasComment("Плановый процент использования spin master"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdEditor"); + + b.HasIndex("IdPrevious"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map_plan_drilling", t => + { + t.HasComment("РТК план бурение"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .HasComment("дата создания"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина по стволу до, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина по стволу от, м"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Автор"); + + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); + + b.Property("IdPrevious") + .HasColumnType("integer") + .HasColumnName("id_previous") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("Obsolete") + .HasColumnType("timestamp with time zone") + .HasColumnName("obsolete") + .HasComment("дата устаревания"); + + b.Property("Pressure") + .HasColumnType("double precision") + .HasColumnName("pressure") + .HasComment("Давление, атм"); + + b.Property("Repeats") + .HasColumnType("double precision") + .HasColumnName("repeats") + .HasComment("Количество повторений"); + + b.Property("SetpointDrag") + .HasColumnType("double precision") + .HasColumnName("setpoint_drag") + .HasComment("Уставка зятяжки, т"); + + b.Property("SetpointTight") + .HasColumnType("double precision") + .HasColumnName("setpoint_tight") + .HasComment("Уставка посадки, т"); + + b.Property("SpeedDownward") + .HasColumnType("double precision") + .HasColumnName("speed_downward") + .HasComment("Скорость спуска, м/ч"); + + b.Property("SpeedUpward") + .HasColumnType("double precision") + .HasColumnName("speed_upward") + .HasComment("Скорость подъёма, м/ч"); + + b.Property("SpinDownward") + .HasColumnType("double precision") + .HasColumnName("spin_downward") + .HasComment("Вращение при движении вниз, об/мин"); + + b.Property("SpinUpward") + .HasColumnType("double precision") + .HasColumnName("spin_upward") + .HasComment("Вращение при движении вверх, об/мин"); + + b.Property("Torque") + .HasColumnType("double precision") + .HasColumnName("torque") + .HasComment("Момент, кН*м"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdEditor"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map_plan_ream", t => + { + t.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", t => + { + t.HasComment("отношение скважин и компаний"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationContactWell", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.HasKey("IdWell", "IdUser"); + + b.HasIndex("IdUser"); + + b.ToTable("t_relation_contact_well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdDrillingProgramPart") + .HasColumnType("integer") + .HasColumnName("id_drilling_program_part"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_role") + .HasComment("1 - publisher, 2 - approver"); + + b.HasKey("IdUser", "IdDrillingProgramPart") + .HasName("t_relation_user_drilling_program_part_pk"); + + b.HasIndex("IdDrillingProgramPart"); + + b.ToTable("t_relation_user_drilling_program_part", t => + { + t.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", t => + { + t.HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + b.HasData( + new + { + IdUserRole = 1100, + IdPermission = 102 + }, + new + { + IdUserRole = 1100, + IdPermission = 111 + }, + new + { + IdUserRole = 1101, + IdPermission = 101 + }, + new + { + IdUserRole = 1101, + IdPermission = 100 + }, + new + { + IdUserRole = 1102, + IdPermission = 105 + }, + new + { + IdUserRole = 1102, + IdPermission = 108 + }, + new + { + IdUserRole = 1103, + IdPermission = 104 + }, + new + { + IdUserRole = 1103, + IdPermission = 103 + }, + new + { + IdUserRole = 1104, + IdPermission = 108 + }, + new + { + IdUserRole = 1105, + IdPermission = 107 + }, + new + { + IdUserRole = 1105, + IdPermission = 106 + }, + new + { + IdUserRole = 1106, + IdPermission = 111 + }, + new + { + IdUserRole = 1107, + IdPermission = 110 + }, + new + { + IdUserRole = 1107, + IdPermission = 109 + }, + new + { + IdUserRole = 1108, + IdPermission = 114 + }, + new + { + IdUserRole = 1109, + IdPermission = 113 + }, + new + { + IdUserRole = 1109, + IdPermission = 112 + }, + new + { + IdUserRole = 1110, + IdPermission = 123 + }, + new + { + IdUserRole = 1110, + IdPermission = 114 + }, + new + { + IdUserRole = 1111, + IdPermission = 122 + }, + new + { + IdUserRole = 1111, + IdPermission = 121 + }, + new + { + IdUserRole = 1112, + IdPermission = 117 + }, + new + { + IdUserRole = 1113, + IdPermission = 105 + }, + new + { + IdUserRole = 1113, + IdPermission = 123 + }, + new + { + IdUserRole = 1113, + IdPermission = 120 + }, + new + { + IdUserRole = 1114, + IdPermission = 119 + }, + new + { + IdUserRole = 1114, + IdPermission = 118 + }, + new + { + IdUserRole = 1114, + IdPermission = 200 + }, + new + { + IdUserRole = 1115, + IdPermission = 223 + }, + new + { + IdUserRole = 1116, + IdPermission = 105 + }, + new + { + IdUserRole = 1116, + IdPermission = 102 + }, + new + { + IdUserRole = 1116, + IdPermission = 117 + }, + new + { + IdUserRole = 1116, + IdPermission = 126 + }, + new + { + IdUserRole = 1117, + IdPermission = 125 + }, + new + { + IdUserRole = 1117, + IdPermission = 124 + }, + new + { + IdUserRole = 1200, + IdPermission = 203 + }, + new + { + IdUserRole = 1200, + IdPermission = 230 + }, + new + { + IdUserRole = 1201, + IdPermission = 202 + }, + new + { + IdUserRole = 1201, + IdPermission = 203 + }, + new + { + IdUserRole = 1201, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 203 + }, + new + { + IdUserRole = 1202, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 236 + }, + new + { + IdUserRole = 1202, + IdPermission = 212 + }, + new + { + IdUserRole = 1203, + IdPermission = 235 + }, + new + { + IdUserRole = 1204, + IdPermission = 202 + }, + new + { + IdUserRole = 1204, + IdPermission = 203 + }, + new + { + IdUserRole = 1205, + IdPermission = 215 + }, + new + { + IdUserRole = 1206, + IdPermission = 203 + }, + new + { + IdUserRole = 1206, + IdPermission = 206 + }, + new + { + IdUserRole = 1207, + IdPermission = 205 + }, + new + { + IdUserRole = 1208, + IdPermission = 218 + }, + new + { + IdUserRole = 1209, + IdPermission = 217 + }, + new + { + IdUserRole = 1210, + IdPermission = 203 + }, + new + { + IdUserRole = 1210, + IdPermission = 230 + }, + new + { + IdUserRole = 1210, + IdPermission = 219 + }, + new + { + IdUserRole = 1211, + IdPermission = 203 + }, + new + { + IdUserRole = 1211, + IdPermission = 220 + }, + new + { + IdUserRole = 1211, + IdPermission = 239 + }, + new + { + IdUserRole = 1212, + IdPermission = 238 + }, + new + { + IdUserRole = 1212, + IdPermission = 237 + }, + new + { + IdUserRole = 1213, + IdPermission = 203 + }, + new + { + IdUserRole = 1213, + IdPermission = 239 + }, + new + { + IdUserRole = 1213, + IdPermission = 212 + }, + new + { + IdUserRole = 1214, + IdPermission = 211 + }, + new + { + IdUserRole = 1214, + IdPermission = 210 + }, + new + { + IdUserRole = 1215, + IdPermission = 203 + }, + new + { + IdUserRole = 1215, + IdPermission = 222 + }, + new + { + IdUserRole = 1216, + IdPermission = 221 + }, + new + { + IdUserRole = 1217, + IdPermission = 226 + }, + new + { + IdUserRole = 1218, + IdPermission = 225 + }, + new + { + IdUserRole = 1218, + IdPermission = 224 + }, + new + { + IdUserRole = 1219, + IdPermission = 203 + }, + new + { + IdUserRole = 1219, + IdPermission = 206 + }, + new + { + IdUserRole = 1219, + IdPermission = 230 + }, + new + { + IdUserRole = 1219, + IdPermission = 232 + }, + new + { + IdUserRole = 1220, + IdPermission = 203 + }, + new + { + IdUserRole = 1220, + IdPermission = 228 + }, + new + { + IdUserRole = 1221, + IdPermission = 202 + }, + new + { + IdUserRole = 1221, + IdPermission = 203 + }, + new + { + IdUserRole = 1221, + IdPermission = 220 + }, + new + { + IdUserRole = 1221, + IdPermission = 234 + }, + new + { + IdUserRole = 1500, + IdPermission = 507 + }, + new + { + IdUserRole = 1500, + IdPermission = 510 + }, + new + { + IdUserRole = 1501, + IdPermission = 214 + }, + new + { + IdUserRole = 1501, + IdPermission = 213 + }, + new + { + IdUserRole = 1502, + IdPermission = 207 + }, + new + { + IdUserRole = 1502, + IdPermission = 208 + }, + new + { + IdUserRole = 2000, + IdPermission = 205 + }, + new + { + IdUserRole = 2000, + IdPermission = 204 + }, + new + { + IdUserRole = 2000, + IdPermission = 245 + }, + new + { + IdUserRole = 2001, + IdPermission = 244 + }, + new + { + IdUserRole = 2001, + IdPermission = 245 + }, + new + { + IdUserRole = 2002, + IdPermission = 244 + }, + new + { + IdUserRole = 2002, + IdPermission = 246 + }, + new + { + IdUserRole = 2002, + IdPermission = 237 + }, + new + { + IdUserRole = 2002, + IdPermission = 238 + }, + new + { + IdUserRole = 2003, + IdPermission = 240 + }, + new + { + IdUserRole = 2003, + IdPermission = 217 + }, + new + { + IdUserRole = 2003, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 242 + }, + new + { + IdUserRole = 2004, + IdPermission = 217 + }, + new + { + IdUserRole = 2004, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 205 + }, + new + { + IdUserRole = 2004, + IdPermission = 204 + }, + new + { + IdUserRole = 2005, + IdPermission = 247 + }, + new + { + IdUserRole = 2005, + IdPermission = 205 + }, + new + { + IdUserRole = 2005, + IdPermission = 204 + }, + new + { + IdUserRole = 2006, + IdPermission = 243 + }, + new + { + IdUserRole = 2006, + IdPermission = 205 + }, + new + { + IdUserRole = 2006, + IdPermission = 204 + }, + new + { + IdUserRole = 2007, + IdPermission = 241 + }, + new + { + IdUserRole = 2007, + IdPermission = 205 + }, + new + { + IdUserRole = 2007, + IdPermission = 204 + }, + new + { + IdUserRole = 1, + IdPermission = 100 + }, + new + { + IdUserRole = 1, + IdPermission = 101 + }, + new + { + IdUserRole = 1, + IdPermission = 102 + }, + new + { + IdUserRole = 1, + IdPermission = 103 + }, + new + { + IdUserRole = 1, + IdPermission = 104 + }, + new + { + IdUserRole = 1, + IdPermission = 105 + }, + new + { + IdUserRole = 1, + IdPermission = 106 + }, + new + { + IdUserRole = 1, + IdPermission = 107 + }, + new + { + IdUserRole = 1, + IdPermission = 108 + }, + new + { + IdUserRole = 1, + IdPermission = 109 + }, + new + { + IdUserRole = 1, + IdPermission = 110 + }, + new + { + IdUserRole = 1, + IdPermission = 111 + }, + new + { + IdUserRole = 1, + IdPermission = 112 + }, + new + { + IdUserRole = 1, + IdPermission = 113 + }, + new + { + IdUserRole = 1, + IdPermission = 114 + }, + new + { + IdUserRole = 1, + IdPermission = 115 + }, + new + { + IdUserRole = 1, + IdPermission = 116 + }, + new + { + IdUserRole = 1, + IdPermission = 117 + }, + new + { + IdUserRole = 1, + IdPermission = 118 + }, + new + { + IdUserRole = 1, + IdPermission = 119 + }, + new + { + IdUserRole = 1, + IdPermission = 120 + }, + new + { + IdUserRole = 1, + IdPermission = 121 + }, + new + { + IdUserRole = 1, + IdPermission = 122 + }, + new + { + IdUserRole = 1, + IdPermission = 123 + }, + new + { + IdUserRole = 1, + IdPermission = 124 + }, + new + { + IdUserRole = 1, + IdPermission = 125 + }, + new + { + IdUserRole = 1, + IdPermission = 126 + }, + new + { + IdUserRole = 1, + IdPermission = 127 + }, + new + { + IdUserRole = 1, + IdPermission = 128 + }, + new + { + IdUserRole = 1, + IdPermission = 129 + }, + new + { + IdUserRole = 1, + IdPermission = 200 + }, + new + { + IdUserRole = 1, + IdPermission = 201 + }, + new + { + IdUserRole = 1, + IdPermission = 202 + }, + new + { + IdUserRole = 1, + IdPermission = 203 + }, + new + { + IdUserRole = 1, + IdPermission = 204 + }, + new + { + IdUserRole = 1, + IdPermission = 205 + }, + new + { + IdUserRole = 1, + IdPermission = 206 + }, + new + { + IdUserRole = 1, + IdPermission = 207 + }, + new + { + IdUserRole = 1, + IdPermission = 208 + }, + new + { + IdUserRole = 1, + IdPermission = 209 + }, + new + { + IdUserRole = 1, + IdPermission = 210 + }, + new + { + IdUserRole = 1, + IdPermission = 211 + }, + new + { + IdUserRole = 1, + IdPermission = 212 + }, + new + { + IdUserRole = 1, + IdPermission = 213 + }, + new + { + IdUserRole = 1, + IdPermission = 214 + }, + new + { + IdUserRole = 1, + IdPermission = 215 + }, + new + { + IdUserRole = 1, + IdPermission = 216 + }, + new + { + IdUserRole = 1, + IdPermission = 217 + }, + new + { + IdUserRole = 1, + IdPermission = 218 + }, + new + { + IdUserRole = 1, + IdPermission = 219 + }, + new + { + IdUserRole = 1, + IdPermission = 220 + }, + new + { + IdUserRole = 1, + IdPermission = 221 + }, + new + { + IdUserRole = 1, + IdPermission = 222 + }, + new + { + IdUserRole = 1, + IdPermission = 223 + }, + new + { + IdUserRole = 1, + IdPermission = 224 + }, + new + { + IdUserRole = 1, + IdPermission = 225 + }, + new + { + IdUserRole = 1, + IdPermission = 226 + }, + new + { + IdUserRole = 1, + IdPermission = 227 + }, + new + { + IdUserRole = 1, + IdPermission = 228 + }, + new + { + IdUserRole = 1, + IdPermission = 229 + }, + new + { + IdUserRole = 1, + IdPermission = 230 + }, + new + { + IdUserRole = 1, + IdPermission = 231 + }, + new + { + IdUserRole = 1, + IdPermission = 232 + }, + new + { + IdUserRole = 1, + IdPermission = 233 + }, + new + { + IdUserRole = 1, + IdPermission = 234 + }, + new + { + IdUserRole = 1, + IdPermission = 235 + }, + new + { + IdUserRole = 1, + IdPermission = 236 + }, + new + { + IdUserRole = 1, + IdPermission = 237 + }, + new + { + IdUserRole = 1, + IdPermission = 238 + }, + new + { + IdUserRole = 1, + IdPermission = 239 + }, + new + { + IdUserRole = 1, + IdPermission = 240 + }, + new + { + IdUserRole = 1, + IdPermission = 241 + }, + new + { + IdUserRole = 1, + IdPermission = 242 + }, + new + { + IdUserRole = 1, + IdPermission = 243 + }, + new + { + IdUserRole = 1, + IdPermission = 244 + }, + new + { + IdUserRole = 1, + IdPermission = 245 + }, + new + { + IdUserRole = 1, + IdPermission = 246 + }, + new + { + IdUserRole = 1, + IdPermission = 247 + }, + new + { + IdUserRole = 1, + IdPermission = 248 + }, + new + { + IdUserRole = 1, + IdPermission = 249 + }, + new + { + IdUserRole = 1, + IdPermission = 250 + }, + new + { + IdUserRole = 1, + IdPermission = 251 + }, + new + { + IdUserRole = 1, + IdPermission = 252 + }, + new + { + IdUserRole = 1, + IdPermission = 253 + }, + new + { + IdUserRole = 1, + IdPermission = 254 + }, + new + { + IdUserRole = 1, + IdPermission = 255 + }, + new + { + IdUserRole = 1, + IdPermission = 256 + }, + new + { + IdUserRole = 1, + IdPermission = 257 + }, + new + { + IdUserRole = 1, + IdPermission = 258 + }, + new + { + IdUserRole = 1, + IdPermission = 259 + }, + new + { + IdUserRole = 1, + IdPermission = 260 + }, + new + { + IdUserRole = 1, + IdPermission = 261 + }, + new + { + IdUserRole = 1, + IdPermission = 262 + }, + new + { + IdUserRole = 1, + IdPermission = 263 + }, + new + { + IdUserRole = 1, + IdPermission = 264 + }, + new + { + IdUserRole = 1, + IdPermission = 265 + }, + new + { + IdUserRole = 1, + IdPermission = 266 + }, + new + { + IdUserRole = 1, + IdPermission = 267 + }, + new + { + IdUserRole = 1, + IdPermission = 268 + }, + new + { + IdUserRole = 1, + IdPermission = 269 + }, + new + { + IdUserRole = 1, + IdPermission = 380 + }, + new + { + IdUserRole = 1, + IdPermission = 381 + }, + new + { + IdUserRole = 1, + IdPermission = 382 + }, + new + { + IdUserRole = 1, + IdPermission = 383 + }, + new + { + IdUserRole = 1, + IdPermission = 384 + }, + new + { + IdUserRole = 1, + IdPermission = 385 + }, + new + { + IdUserRole = 1, + IdPermission = 386 + }, + new + { + IdUserRole = 1, + IdPermission = 387 + }, + new + { + IdUserRole = 1, + IdPermission = 388 + }, + new + { + IdUserRole = 1, + IdPermission = 389 + }, + new + { + IdUserRole = 1, + IdPermission = 390 + }, + new + { + IdUserRole = 1, + IdPermission = 391 + }, + new + { + IdUserRole = 1, + IdPermission = 400 + }, + new + { + IdUserRole = 1, + IdPermission = 401 + }, + new + { + IdUserRole = 1, + IdPermission = 407 + }, + new + { + IdUserRole = 1, + IdPermission = 408 + }, + new + { + IdUserRole = 1, + IdPermission = 450 + }, + new + { + IdUserRole = 1, + IdPermission = 460 + }, + new + { + IdUserRole = 1, + IdPermission = 461 + }, + new + { + IdUserRole = 1, + IdPermission = 500 + }, + new + { + IdUserRole = 1, + IdPermission = 501 + }, + new + { + IdUserRole = 1, + IdPermission = 502 + }, + new + { + IdUserRole = 1, + IdPermission = 503 + }, + new + { + IdUserRole = 1, + IdPermission = 504 + }, + new + { + IdUserRole = 1, + IdPermission = 505 + }, + new + { + IdUserRole = 1, + IdPermission = 506 + }, + new + { + IdUserRole = 1, + IdPermission = 507 + }, + new + { + IdUserRole = 1, + IdPermission = 510 + }, + new + { + IdUserRole = 1, + IdPermission = 511 + }, + new + { + IdUserRole = 1, + IdPermission = 512 + }, + new + { + IdUserRole = 1, + IdPermission = 516 + }, + new + { + IdUserRole = 1, + IdPermission = 517 + }, + new + { + IdUserRole = 1, + IdPermission = 518 + }, + new + { + IdUserRole = 1, + IdPermission = 519 + }, + new + { + IdUserRole = 1, + IdPermission = 520 + }, + new + { + IdUserRole = 1, + IdPermission = 521 + }, + new + { + IdUserRole = 1, + IdPermission = 522 + }, + new + { + IdUserRole = 1, + IdPermission = 523 + }, + new + { + IdUserRole = 1, + IdPermission = 524 + }, + new + { + IdUserRole = 1, + IdPermission = 525 + }, + new + { + IdUserRole = 1, + IdPermission = 526 + }, + new + { + IdUserRole = 1, + IdPermission = 527 + }, + new + { + IdUserRole = 1, + IdPermission = 528 + }, + new + { + IdUserRole = 1, + IdPermission = 530 + }, + new + { + IdUserRole = 1, + IdPermission = 531 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdInclude") + .HasColumnType("integer") + .HasColumnName("id_include_user_role"); + + b.HasKey("Id", "IdInclude") + .HasName("t_relation_user_role_user_role_pk"); + + b.HasIndex("IdInclude"); + + b.ToTable("t_relation_user_role_user_role", t => + { + t.HasComment("Отношение ролей к ролям"); + }); + + b.HasData( + new + { + Id = 1101, + IdInclude = 1100 + }, + new + { + Id = 1103, + IdInclude = 1102 + }, + new + { + Id = 1105, + IdInclude = 1104 + }, + new + { + Id = 1107, + IdInclude = 1106 + }, + new + { + Id = 1109, + IdInclude = 1108 + }, + new + { + Id = 1111, + IdInclude = 1110 + }, + new + { + Id = 1114, + IdInclude = 1113 + }, + new + { + Id = 1117, + IdInclude = 1116 + }, + new + { + Id = 1203, + IdInclude = 1202 + }, + new + { + Id = 1207, + IdInclude = 1206 + }, + new + { + Id = 1209, + IdInclude = 1208 + }, + new + { + Id = 1212, + IdInclude = 1211 + }, + new + { + Id = 1214, + IdInclude = 1213 + }, + new + { + Id = 1216, + IdInclude = 1215 + }, + new + { + Id = 1218, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1200 + }, + new + { + Id = 2000, + IdInclude = 1201 + }, + new + { + Id = 2000, + IdInclude = 1202 + }, + new + { + Id = 2000, + IdInclude = 1204 + }, + new + { + Id = 2000, + IdInclude = 1205 + }, + new + { + Id = 2000, + IdInclude = 1206 + }, + new + { + Id = 2000, + IdInclude = 1208 + }, + new + { + Id = 2000, + IdInclude = 1210 + }, + new + { + Id = 2000, + IdInclude = 1211 + }, + new + { + Id = 2000, + IdInclude = 1213 + }, + new + { + Id = 2000, + IdInclude = 1215 + }, + new + { + Id = 2000, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1219 + }, + new + { + Id = 2000, + IdInclude = 1220 + }, + new + { + Id = 2000, + IdInclude = 1221 + }, + new + { + Id = 2000, + IdInclude = 1500 + }, + new + { + Id = 2000, + IdInclude = 1501 + }, + new + { + Id = 2000, + IdInclude = 1502 + }, + new + { + Id = 2001, + IdInclude = 1500 + }, + new + { + Id = 2001, + IdInclude = 1501 + }, + new + { + Id = 2001, + IdInclude = 1502 + }, + new + { + Id = 2002, + IdInclude = 1500 + }, + new + { + Id = 2002, + IdInclude = 1501 + }, + new + { + Id = 2002, + IdInclude = 1502 + }, + new + { + Id = 2003, + IdInclude = 1500 + }, + new + { + Id = 2003, + IdInclude = 1501 + }, + new + { + Id = 2003, + IdInclude = 1502 + }, + new + { + Id = 2004, + IdInclude = 1500 + }, + new + { + Id = 2004, + IdInclude = 1501 + }, + new + { + Id = 2004, + IdInclude = 1502 + }, + new + { + Id = 2005, + IdInclude = 1500 + }, + new + { + Id = 2005, + IdInclude = 1501 + }, + new + { + Id = 2005, + IdInclude = 1502 + }, + new + { + Id = 2006, + IdInclude = 1500 + }, + new + { + Id = 2006, + IdInclude = 1501 + }, + new + { + Id = 2006, + IdInclude = 1502 + }, + new + { + Id = 2007, + IdInclude = 1500 + }, + new + { + Id = 2007, + IdInclude = 1501 + }, + new + { + Id = 2007, + IdInclude = 1502 + }); + }); + + 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", t => + { + t.HasComment("Отношение пользователей и ролей"); + }); + + b.HasData( + new + { + IdUser = 1, + IdUserRole = 1 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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", t => + { + t.HasComment("Отчеты с данными по буровым"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DrillEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_end") + .HasComment("Конец вахты"); + + b.Property("DrillStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_start") + .HasComment("Начало вахты"); + + b.Property("IdDriller") + .HasColumnType("integer") + .HasColumnName("id_driller") + .HasComment("Идентификатор бурильщика"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Идентификатор скважины"); + + b.Property("ShiftEnd") + .HasColumnType("time without time zone") + .HasColumnName("shift_end") + .HasComment("Конец смены"); + + b.Property("ShiftStart") + .HasColumnType("time without time zone") + .HasColumnName("shift_start") + .HasComment("Начало смены"); + + b.HasKey("Id"); + + b.HasIndex("IdDriller"); + + b.HasIndex("IdWell"); + + b.ToTable("t_schedule", t => + { + t.HasComment("График работы бурильщика"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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") + .IsRequired() + .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", t => + { + t.HasComment("Запросы на изменение уставок панели оператора"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Subsystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("t_subsystem", t => + { + t.HasComment("Описание подсистем"); + }); + + b.HasData( + new + { + Id = 1, + Description = "Совместная работа режимов \"Бурение в роторе\" и \"Бурение в слайде\"", + Name = "АПД" + }, + new + { + Id = 11, + Description = "Режим работы \"Бурение в роторе\"", + Name = "АПД ротор" + }, + new + { + Id = 12, + Description = "Режим работы \"Бурение в слайде\"", + Name = "АПД слайд" + }, + new + { + Id = 65536, + Description = "Осцилляция", + Name = "Осцилляция" + }, + new + { + Id = 65537, + Description = "Демпфер", + Name = "Демпфер" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Info") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + b.Property("TimeZone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); + + b.ToTable("t_telemetry", t => + { + t.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .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("Mse") + .HasColumnType("real") + .HasColumnName("mse") + .HasComment("MSE"); + + 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("Pump0Flow") + .HasColumnType("real") + .HasColumnName("pump0_flow") + .HasComment("Расход. Буровой насос 1"); + + b.Property("Pump1Flow") + .HasColumnType("real") + .HasColumnName("pump1_flow") + .HasComment("Расход. Буровой насос 2"); + + b.Property("Pump2Flow") + .HasColumnType("real") + .HasColumnName("pump2_flow") + .HasComment("Расход. Буровой насос 3"); + + 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", "DateTime"); + + b.ToTable("t_telemetry_data_saub", t => + { + t.HasComment("набор основных данных по SAUB"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaubStat", b => + { + b.Property("Count") + .HasColumnType("bigint") + .HasColumnName("count_items"); + + b.Property("DateMax") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_max"); + + b.Property("DateMin") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_min"); + + b.Property("DepthMax") + .HasColumnType("real") + .HasColumnName("depth_max"); + + b.Property("DepthMin") + .HasColumnType("real") + .HasColumnName("depth_min"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.ToTable((string)null); + + b.ToView("mw_telemetry_datas_saub_stat", (string)null); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Выбранный режим управления"); + + b.Property("PositionRight") + .HasColumnType("real") + .HasColumnName("position_right") + .HasComment("Крайний правый угол осцилляции"); + + b.Property("PositionZero") + .HasColumnType("real") + .HasColumnName("position_zero") + .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("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.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_data_spin", t => + { + t.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") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message_template"); + + b.HasKey("IdTelemetry", "IdEvent"); + + b.ToTable("t_telemetry_event", t => + { + t.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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("DateTime") + .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", t => + { + t.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") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname"); + + b.HasKey("IdTelemetry", "IdUser"); + + b.ToTable("t_telemetry_user", t => + { + t.HasComment("Пользователи панели САУБ. Для сообщений."); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryWirelineRunOut", b => + { + b.Property("IdTelemetry") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Идентификатор телеметрии"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("IdTelemetry")); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_time") + .HasComment("Отметка времени"); + + b.Property("Hauling") + .HasColumnType("real") + .HasColumnName("hauling") + .HasComment("Наработка талевого каната с момента перетяжки каната, т*км"); + + b.Property("HaulingWarnSp") + .HasColumnType("real") + .HasColumnName("hauling_warn_sp") + .HasComment("Наработка талевого каната до сигнализации о необходимости перетяжки, т*км"); + + b.Property("Replace") + .HasColumnType("real") + .HasColumnName("replace") + .HasComment("Наработка талевого каната с момента замены каната, т*км"); + + b.Property("ReplaceWarnSp") + .HasColumnType("real") + .HasColumnName("replace_warn_sp") + .HasComment("Наработка талевого каната до сигнализации о необходимости замены, т*км"); + + b.HasKey("IdTelemetry"); + + b.ToTable("t_telemetry_wireline_run_out", t => + { + t.HasComment("Наработка талевого каната"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); + + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); + + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); + + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); + + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); + + b.HasKey("Id"); + + b.HasIndex("IdUser"); + + b.HasIndex("IdWell"); + + b.ToTable("t_trajectory_fact", t => + { + t.HasComment("Загрузка фактической траектории"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); + + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("Radius") + .HasColumnType("double precision") + .HasColumnName("radius") + .HasComment("Радиус цели"); + + b.Property("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); + + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); + + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); + + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); + + b.HasKey("Id"); + + b.HasIndex("IdUser"); + + b.HasIndex("IdWell"); + + b.ToTable("t_trajectory_plan", t => + { + t.HasComment("Загрузка плановой траектории"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdState") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n0 - не активен, \n1 - активен, \n2 - заблокирован"); + + b.Property("Login") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("login"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("имя"); + + b.Property("PasswordHash") + .IsRequired() + .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("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user", t => + { + t.HasComment("Пользователи облака"); + }); + + b.HasData( + new + { + Id = 1, + Email = "", + IdCompany = 1, + IdState = (short)1, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role", t => + { + t.HasComment("Роли пользователей в системе"); + }); + + b.HasData( + new + { + Id = 1, + Caption = "root", + IdType = 1 + }, + new + { + Id = 1100, + Caption = "admin_cluster.view", + IdType = 1 + }, + new + { + Id = 1101, + Caption = "admin_cluster.edit", + IdType = 1 + }, + new + { + Id = 1102, + Caption = "admin_company.view", + IdType = 1 + }, + new + { + Id = 1103, + Caption = "admin_company.edit", + IdType = 1 + }, + new + { + Id = 1104, + Caption = "admin_company_type.view", + IdType = 1 + }, + new + { + Id = 1105, + Caption = "admin_company_type.edit", + IdType = 1 + }, + new + { + Id = 1106, + Caption = "admin_deposit.view", + IdType = 1 + }, + new + { + Id = 1107, + Caption = "admin_deposit.edit", + IdType = 1 + }, + new + { + Id = 1108, + Caption = "admin_permission.view", + IdType = 1 + }, + new + { + Id = 1109, + Caption = "admin_permission.edit", + IdType = 1 + }, + new + { + Id = 1110, + Caption = "admin_role.view", + IdType = 1 + }, + new + { + Id = 1111, + Caption = "admin_role.edit", + IdType = 1 + }, + new + { + Id = 1112, + Caption = "admin_telemetry.view", + IdType = 1 + }, + new + { + Id = 1113, + Caption = "admin_user.view", + IdType = 1 + }, + new + { + Id = 1114, + Caption = "admin_user.edit", + IdType = 1 + }, + new + { + Id = 1115, + Caption = "admin_visit_log.view", + IdType = 1 + }, + new + { + Id = 1116, + Caption = "admin_well.view", + IdType = 1 + }, + new + { + Id = 1117, + Caption = "admin_well.edit", + IdType = 1 + }, + new + { + Id = 1200, + Caption = "archive.view", + IdType = 1 + }, + new + { + Id = 1201, + Caption = "cluster.view", + IdType = 1 + }, + new + { + Id = 1202, + Caption = "composite.view", + IdType = 1 + }, + new + { + Id = 1203, + Caption = "composite.edit", + IdType = 1 + }, + new + { + Id = 1204, + Caption = "deposit.view", + IdType = 1 + }, + new + { + Id = 1205, + Caption = "document.view", + IdType = 1 + }, + new + { + Id = 1206, + Caption = "drillProcessFlow.view", + IdType = 1 + }, + new + { + Id = 1207, + Caption = "drillProcessFlow.edit", + IdType = 1 + }, + new + { + Id = 1208, + Caption = "measure.view", + IdType = 1 + }, + new + { + Id = 1209, + Caption = "measure.edit", + IdType = 1 + }, + new + { + Id = 1210, + Caption = "message.view", + IdType = 1 + }, + new + { + Id = 1211, + Caption = "operations.view", + IdType = 1 + }, + new + { + Id = 1212, + Caption = "operations.edit", + IdType = 1 + }, + new + { + Id = 1213, + Caption = "params.view", + IdType = 1 + }, + new + { + Id = 1214, + Caption = "params.edit", + IdType = 1 + }, + new + { + Id = 1215, + Caption = "report.view", + IdType = 1 + }, + new + { + Id = 1216, + Caption = "report.edit", + IdType = 1 + }, + new + { + Id = 1217, + Caption = "setpoints.view", + IdType = 1 + }, + new + { + Id = 1218, + Caption = "setpoints.edit", + IdType = 1 + }, + new + { + Id = 1219, + Caption = "telemetry.view", + IdType = 1 + }, + new + { + Id = 1220, + Caption = "telemetryAnalysis.view", + IdType = 1 + }, + new + { + Id = 1221, + Caption = "well.view", + IdType = 1 + }, + new + { + Id = 1500, + Caption = "Просмотр всего", + IdType = 1 + }, + new + { + Id = 1501, + Caption = "file.edit", + IdType = 1 + }, + new + { + Id = 1502, + Caption = "drillingProgram.edit", + IdType = 1 + }, + new + { + Id = 2000, + Caption = "Заказчик", + IdType = 0 + }, + new + { + Id = 2001, + Caption = "Супервайзер", + IdType = 0 + }, + new + { + Id = 2002, + Caption = "Буровой подрядчик", + IdType = 0 + }, + new + { + Id = 2003, + Caption = "Растворщик", + IdType = 0 + }, + new + { + Id = 2004, + Caption = "Телеметрист", + IdType = 0 + }, + new + { + Id = 2005, + Caption = "Долотный сервис", + IdType = 0 + }, + new + { + Id = 2006, + Caption = "ГТИ", + IdType = 0 + }, + new + { + Id = 2007, + Caption = "Цементирование", + IdType = 0 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("key") + .HasComment("Ключ настроек пользователя"); + + b.Property("Value") + .HasColumnType("jsonb") + .HasColumnName("setting_value") + .HasComment("Значение настроек пользователя"); + + b.HasKey("IdUser", "Key"); + + b.ToTable("t_user_settings", t => + { + t.HasComment("настройки интерфейса пользователя"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.RecordBase", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Actcod") + .HasColumnType("smallint") + .HasColumnName("ACTCOD"); + + b.Property("Date") + .HasColumnType("integer") + .HasColumnName("DATE"); + + b.Property("Recid") + .HasColumnType("smallint") + .HasColumnName("RECID"); + + b.Property("Seqid") + .HasColumnType("integer") + .HasColumnName("SEQID"); + + b.Property("Stknum") + .HasColumnType("smallint") + .HasColumnName("STKNUM"); + + b.Property("Time") + .HasColumnType("integer") + .HasColumnName("TIME"); + + b.Property("Wellid") + .HasColumnType("text") + .HasColumnName("WELLID"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_wits_base"); + + b.UseTptMappingStrategy(); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .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.Property("Timezone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex("IdCluster"); + + b.HasIndex("IdTelemetry") + .IsUnique(); + + b.HasIndex("IdWellType"); + + b.ToTable("t_well", t => + { + t.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", t => + { + t.HasComment("Композитная скважина"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocument", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.HasKey("IdWell", "IdUser", "IdCategory") + .HasName("t_well_final_documents_pk"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdUser"); + + b.ToTable("t_well_final_documents", t => + { + t.HasComment("Дело скважины"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp with 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("IdPlan") + .HasColumnType("integer") + .HasColumnName("id_plan") + .HasComment("Id плановой операции"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0 = План или 1 = Факт"); + + b.Property("IdUser") + .HasColumnType("integer"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции скважины"); + + b.Property("LastUpdateDate") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("DateStart"); + + b.HasIndex("DepthEnd"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdPlan"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_well_operation", t => + { + t.HasComment("Данные по операциям на скважине"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("id родительской категории"); + + b.Property("KeyValueName") + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .HasColumnName("key_value_name") + .HasComment("Название ключевого показателя операции"); + + b.Property("KeyValueUnits") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("key_value_units") + .HasComment("Единицы измерения ключевого показателя операции"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории операции"); + + b.HasKey("Id"); + + b.HasIndex("IdParent"); + + b.ToTable("t_well_operation_category", t => + { + t.HasComment("Справочник операций на скважине"); + }); + + b.HasData( + new + { + Id = 3000, + KeyValueName = "dT", + KeyValueUnits = "м/ч", + Name = "БУРЕНИЕ" + }, + new + { + Id = 3001, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "КРЕПЛЕНИЕ" + }, + new + { + Id = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ГФР" + }, + new + { + Id = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные операции" + }, + new + { + Id = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Непроизводительное время (НПВ)" + }, + new + { + Id = 4000, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "КНБК" + }, + new + { + Id = 4001, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "м/ч", + Name = "Механическое. бурение" + }, + new + { + Id = 4002, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Статический замер" + }, + new + { + Id = 4003, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Нормализация диаметра скважины" + }, + new + { + Id = 4004, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наращивание" + }, + new + { + Id = 4005, + IdParent = 3001, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 4006, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск обсадной колонны" + }, + new + { + Id = 4018, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Крепление" + }, + new + { + Id = 4007, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Цементирование" + }, + new + { + Id = 4008, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные работы при креплении" + }, + new + { + Id = 4009, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка/разборка приборов ГИС" + }, + new + { + Id = 4010, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 4011, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ГИС" + }, + new + { + Id = 4012, + IdParent = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка, ОБР" + }, + new + { + Id = 4013, + IdParent = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные работы" + }, + new + { + Id = 4014, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт оборудования" + }, + new + { + Id = 4015, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Аварийные работы" + }, + new + { + Id = 4016, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Осложнение" + }, + new + { + Id = 4017, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Незаложенные в ГГД операции" + }, + new + { + Id = 5000, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разборка КНБК" + }, + new + { + Id = 5001, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка КНБК" + }, + new + { + Id = 5002, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение слайдом" + }, + new + { + Id = 5003, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение ротором" + }, + new + { + Id = 5004, + IdParent = 4002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Замер ЗТС (запись MWD)" + }, + new + { + Id = 5005, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка перед наращиванием" + }, + new + { + Id = 5006, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка во время бурения" + }, + new + { + Id = 5007, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка перед наращиванием" + }, + new + { + Id = 5008, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка во время бурения" + }, + new + { + Id = 5009, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка перед наращиванием" + }, + new + { + Id = 5010, + IdParent = 4004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наращивание" + }, + new + { + Id = 5011, + IdParent = 4004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Удержание в клиньях" + }, + new + { + Id = 5012, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем инструмента" + }, + new + { + Id = 5013, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем КНБК" + }, + new + { + Id = 5014, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск инструмента" + }, + new + { + Id = 5015, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск КНБК" + }, + new + { + Id = 5016, + IdParent = 4006, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка при спуске ОК" + }, + new + { + Id = 5017, + IdParent = 4006, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск ОК" + }, + new + { + Id = 5018, + IdParent = 4007, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ОЗЦ" + }, + new + { + Id = 5019, + IdParent = 4007, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Цементирование" + }, + new + { + Id = 5020, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка БИ" + }, + new + { + Id = 5021, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка ОК" + }, + new + { + Id = 5022, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при спуске ОК" + }, + new + { + Id = 5023, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при цементировании" + }, + new + { + Id = 5024, + IdParent = 4009, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разборка комплекса приборов ГИС" + }, + new + { + Id = 5025, + IdParent = 4009, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка комплекса приборов ГИС" + }, + new + { + Id = 5026, + IdParent = 4010, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем приборов ГИС (на трубах)" + }, + new + { + Id = 5027, + IdParent = 4010, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск приборов ГИС (на трубах)" + }, + new + { + Id = 5028, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на жестком кабеле" + }, + new + { + Id = 5029, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на кабеле" + }, + new + { + Id = 5030, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на трубах" + }, + new + { + Id = 5031, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Закачка/прокачка пачки" + }, + new + { + Id = 5032, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обработка БР" + }, + new + { + Id = 5033, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование ТС при бурении" + }, + new + { + Id = 5034, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перезапись гаммы-каротажа" + }, + new + { + Id = 5035, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Приготовление БР" + }, + new + { + Id = 5036, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка" + }, + new + { + Id = 5037, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разбуривание тех.оснастки" + }, + new + { + Id = 5038, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск инструмента с проработкой" + }, + new + { + Id = 5039, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ВМР" + }, + new + { + Id = 5040, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Демонтаж ПВО" + }, + new + { + Id = 5041, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Долив затруба при подъёме" + }, + new + { + Id = 5042, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Монтаж ПВО" + }, + new + { + Id = 5043, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наработка жёлоба" + }, + new + { + Id = 5044, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обвязка устья с циркуляционной системой" + }, + new + { + Id = 5045, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Оборудование устья" + }, + new + { + Id = 5046, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка ПВО" + }, + new + { + Id = 5047, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перемонтаж ПВО " + }, + new + { + Id = 5048, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перетяжка талевого каната" + }, + new + { + Id = 5049, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при сборке КНБК" + }, + new + { + Id = 5050, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Полная замена талевого каната" + }, + new + { + Id = 5051, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПР перед забуркой направления" + }, + new + { + Id = 5052, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Продувка манифольда" + }, + new + { + Id = 5053, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Срезка" + }, + new + { + Id = 5054, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Тайм-дриллинг" + }, + new + { + Id = 5055, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Тех.отстой" + }, + new + { + Id = 5056, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Учебная тревога \"Выброс\"" + }, + new + { + Id = 5057, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Чистка ЦСГО/емкостного блока" + }, + new + { + Id = 5058, + IdParent = 4014, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт бурового оборудования" + }, + new + { + Id = 5059, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ловильные работы" + }, + new + { + Id = 5060, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ожидание" + }, + new + { + Id = 5061, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Определение места прихвата и ЛМ" + }, + new + { + Id = 5062, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Работа яссом" + }, + new + { + Id = 5063, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Расхаживание" + }, + new + { + Id = 5064, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - колокол" + }, + new + { + Id = 5065, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - метчик" + }, + new + { + Id = 5066, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - овершот" + }, + new + { + Id = 5067, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - труболовка" + }, + new + { + Id = 5068, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Торпедирование (встряхивание)" + }, + new + { + Id = 5069, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Торпедирование (отстрел)" + }, + new + { + Id = 5070, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Установка ванн" + }, + new + { + Id = 5071, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Фрезеровка" + }, + new + { + Id = 5072, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Контролируемое ГНВП" + }, + new + { + Id = 5073, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Поглощение" + }, + new + { + Id = 5074, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сальникообразование" + }, + new + { + Id = 5075, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Утяжеление БР" + }, + new + { + Id = 5076, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "НПВ / прочее" + }, + new + { + Id = 5077, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обработка раствора (несоответствие параметров)" + }, + new + { + Id = 5078, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "подъем ОК" + }, + new + { + Id = 5079, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ревизия КНБК/инструмента/ЗТС" + }, + new + { + Id = 5082, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка устройства ориентирования КО" + }, + new + { + Id = 5083, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка принудительная" + }, + new + { + Id = 5084, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка подъем БИ, продувка" + }, + new + { + Id = 5085, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск бурильного инструмента со сборкой с мостков" + }, + new + { + Id = 5086, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем БИ с выбросом на мостки" + }, + new + { + Id = 5087, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск БИ со сборкой с мостков" + }, + new + { + Id = 5088, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка и спуск ТБТ" + }, + new + { + Id = 5089, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск КО на транспотрной колонне" + }, + new + { + Id = 5090, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Отворот допускной трубы" + }, + new + { + Id = 5091, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Активация подвески, опрессовка" + }, + new + { + Id = 5092, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Монтаж, опрессовка ФА" + }, + new + { + Id = 5093, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка хвостовика 114мм (согласно схеме)" + }, + new + { + Id = 5094, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР к спуску УЭЦН" + }, + new + { + Id = 5095, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Активация подвески (потайной колонны, хвостовика)" + }, + new + { + Id = 5096, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонирование перед спуском" + }, + new + { + Id = 5097, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка - перевод скважины на новый раствор" + }, + new + { + Id = 5098, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка БИ с мостков на подсвечник" + }, + new + { + Id = 5099, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подготовка ствола скважины. Перезапись ГК в интервале установки КО." + }, + new + { + Id = 5100, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Смена рабочего переводника ВСП" + }, + new + { + Id = 5101, + IdParent = 4014, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт" + }, + new + { + Id = 5102, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск пакера" + }, + new + { + Id = 5103, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Запись гамма-каратожа" + }, + new + { + Id = 5104, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонирование спуск БИ" + }, + new + { + Id = 5105, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка клин-отклонителя" + }, + new + { + Id = 5106, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование и посадка клина-отклонителя" + }, + new + { + Id = 5107, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Протяжка подъемного патрубка подвески" + }, + new + { + Id = 5108, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем клина-отклонителя" + }, + new + { + Id = 5109, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Стыковка стингера с хвостовиком основного ствола" + }, + new + { + Id = 5110, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование и установка стыковочного узла хвостовика" + }, + new + { + Id = 5111, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение с отбором керна" + }, + new + { + Id = 5112, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Работа пакером в обсадной колонне" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("Order") + .HasColumnType("real") + .HasColumnName("order") + .HasComment("Порядок"); + + b.HasKey("Id"); + + b.ToTable("t_well_section_type", t => + { + t.HasComment("конструкция секции скважины"); + }); + + b.HasData( + new + { + Id = 1, + Caption = "Пилотный ствол", + Order = 4f + }, + new + { + Id = 2, + Caption = "Направление", + Order = 0f + }, + new + { + Id = 3, + Caption = "Кондуктор", + Order = 1f + }, + new + { + Id = 4, + Caption = "Эксплуатационная колонна", + Order = 3f + }, + new + { + Id = 5, + Caption = "Транспортный ствол", + Order = 5f + }, + new + { + Id = 6, + Caption = "Хвостовик", + Order = 6f + }, + new + { + Id = 7, + Caption = "Пилотный ствол 2", + Order = 4.1f + }, + new + { + Id = 8, + Caption = "Направление 2", + Order = 0.1f + }, + new + { + Id = 9, + Caption = "Кондуктор 2", + Order = 1.1f + }, + new + { + Id = 10, + Caption = "Эксплуатационная колонна 2", + Order = 3.1f + }, + new + { + Id = 11, + Caption = "Транспортный ствол 2", + Order = 5.1f + }, + new + { + Id = 12, + Caption = "Хвостовик 2", + Order = 6.1f + }, + new + { + Id = 13, + Caption = "Пилотный ствол 3", + Order = 4.2f + }, + new + { + Id = 14, + Caption = "Направление 3", + Order = 0.2f + }, + new + { + Id = 15, + Caption = "Кондуктор 3", + Order = 1.2f + }, + new + { + Id = 16, + Caption = "Эксплуатационная колонна 3", + Order = 3.2f + }, + new + { + Id = 17, + Caption = "Транспортный ствол 3", + Order = 5.2f + }, + new + { + Id = 18, + Caption = "Хвостовик 3", + Order = 6.2f + }, + new + { + Id = 19, + Caption = "Пилотный ствол 4", + Order = 4.3f + }, + new + { + Id = 20, + Caption = "Направление 4", + Order = 0.3f + }, + new + { + Id = 21, + Caption = "Кондуктор 4", + Order = 1.3f + }, + new + { + Id = 22, + Caption = "Эксплуатационная колонна 4", + Order = 3.3f + }, + new + { + Id = 23, + Caption = "Транспортный ствол 4", + Order = 5.3f + }, + new + { + Id = 24, + Caption = "Хвостовик 4", + Order = 6.3f + }, + new + { + Id = 25, + Caption = "Пилотный ствол 5", + Order = 4.4f + }, + new + { + Id = 26, + Caption = "Направление 5", + Order = 0.4f + }, + new + { + Id = 27, + Caption = "Кондуктор 5", + Order = 1.4f + }, + new + { + Id = 28, + Caption = "Эксплуатационная колонна 5", + Order = 3.4f + }, + new + { + Id = 29, + Caption = "Транспортный ствол 5", + Order = 5.4f + }, + new + { + Id = 30, + Caption = "Хвостовик 5", + Order = 6.4f + }, + new + { + Id = 31, + Caption = "Техническая колонна", + Order = 2f + }, + new + { + Id = 32, + Caption = "Техническая колонна 2", + Order = 2.1f + }, + new + { + Id = 33, + Caption = "Техническая колонна 3", + Order = 2.2f + }, + new + { + Id = 34, + Caption = "Хвостовик 6", + Order = 6.5f + }, + new + { + Id = 35, + Caption = "Хвостовик 7", + Order = 6.6f + }, + new + { + Id = 36, + Caption = "Хвостовик 8", + Order = 6.7f + }, + new + { + Id = 37, + Caption = "Хвостовик 9", + Order = 6.8f + }, + new + { + Id = 38, + Caption = "Хвостовик 10", + Order = 6.9f + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина бурения, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Начальная глубина бурения, м"); + + b.Property("IdSectionType") + .HasColumnType("integer") + .HasColumnName("id_section_type") + .HasComment("Тип секции"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("InnerDiameter") + .HasColumnType("double precision") + .HasColumnName("inner_diameter") + .HasComment("Внутренний диаметр"); + + b.Property("LastUpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_update") + .HasComment("Дата последнего обновления"); + + b.Property("OuterDiameter") + .HasColumnType("double precision") + .HasColumnName("outer_diameter") + .HasComment("Внешний диаметр"); + + b.HasKey("Id"); + + b.HasIndex("IdSectionType"); + + b.HasIndex("IdWell", "IdSectionType") + .IsUnique(); + + b.ToTable("t_well_section_plan"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_type", t => + { + t.HasComment("конструкция скважины"); + }); + + b.HasData( + new + { + Id = 1, + Caption = "Наклонно-направленная" + }, + new + { + Id = 2, + Caption = "Горизонтальная" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Blkpos") + .HasColumnType("real") + .HasColumnName("BLKPOS"); + + b.Property("Chkp") + .HasColumnType("real") + .HasColumnName("CHKP"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptretm") + .HasColumnType("real") + .HasColumnName("DEPTRETM"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Gasa") + .HasColumnType("real") + .HasColumnName("GASA"); + + b.Property("Hkla") + .HasColumnType("real") + .HasColumnName("HKLA"); + + b.Property("Hklx") + .HasColumnType("real") + .HasColumnName("HKLX"); + + b.Property("Lagstks") + .HasColumnType("smallint") + .HasColumnName("LAGSTKS"); + + b.Property("Mcia") + .HasColumnType("real") + .HasColumnName("MCIA"); + + b.Property("Mcoa") + .HasColumnType("real") + .HasColumnName("MCOA"); + + b.Property("Mdia") + .HasColumnType("real") + .HasColumnName("MDIA"); + + b.Property("Mdoa") + .HasColumnType("real") + .HasColumnName("MDOA"); + + b.Property("Mfia") + .HasColumnType("real") + .HasColumnName("MFIA"); + + b.Property("Mfoa") + .HasColumnType("real") + .HasColumnName("MFOA"); + + b.Property("Mfop") + .HasColumnType("smallint") + .HasColumnName("MFOP"); + + b.Property("Mtia") + .HasColumnType("real") + .HasColumnName("MTIA"); + + b.Property("Mtoa") + .HasColumnType("real") + .HasColumnName("MTOA"); + + b.Property("Ropa") + .HasColumnType("real") + .HasColumnName("ROPA"); + + b.Property("Rpma") + .HasColumnType("smallint") + .HasColumnName("RPMA"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spm1") + .HasColumnType("smallint") + .HasColumnName("SPM1"); + + b.Property("Spm2") + .HasColumnType("smallint") + .HasColumnName("SPM2"); + + b.Property("Spm3") + .HasColumnType("smallint") + .HasColumnName("SPM3"); + + b.Property("Sppa") + .HasColumnType("real") + .HasColumnName("SPPA"); + + b.Property("Stkc") + .HasColumnType("integer") + .HasColumnName("STKC"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.Property("Torqa") + .HasColumnType("real") + .HasColumnName("TORQA"); + + b.Property("Torqx") + .HasColumnType("real") + .HasColumnName("TORQX"); + + b.Property("Tvolact") + .HasColumnType("real") + .HasColumnName("TVOLACT"); + + b.Property("Tvolcact") + .HasColumnType("real") + .HasColumnName("TVOLCACT"); + + b.Property("Woba") + .HasColumnType("real") + .HasColumnName("WOBA"); + + b.Property("Wobx") + .HasColumnType("real") + .HasColumnName("WOBX"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_1"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("DeptmeasGdpMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_GDP_mc"); + + b.Property("DeptmeasMcrstat") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_MCRSTAT"); + + b.Property("DeptmeasRa33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33_mc"); + + b.Property("DeptmeasRa33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F2_mc"); + + b.Property("DeptmeasRa33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F4_mc"); + + b.Property("DeptmeasRp33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33_mc"); + + b.Property("DeptmeasRp33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F2_mc"); + + b.Property("DeptmeasRp33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F4_mc"); + + b.Property("DeptmeasSlvlMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_SLVL_mc"); + + b.Property("GdpMc") + .HasColumnType("real") + .HasColumnName("GDP_mc"); + + b.Property("Mcrstat") + .HasColumnType("real") + .HasColumnName("MCRSTAT"); + + b.Property("Ra33Mc") + .HasColumnType("real") + .HasColumnName("RA33_mc"); + + b.Property("Ra33f2Mc") + .HasColumnType("real") + .HasColumnName("RA33F2_mc"); + + b.Property("Ra33f4Mc") + .HasColumnType("real") + .HasColumnName("RA33F4_mc"); + + b.Property("Rp33Mc") + .HasColumnType("real") + .HasColumnName("RP33_mc"); + + b.Property("Rp33f2Mc") + .HasColumnType("real") + .HasColumnName("RP33F2_mc"); + + b.Property("Rp33f4Mc") + .HasColumnType("real") + .HasColumnName("RP33F4_mc"); + + b.Property("SlvlMc") + .HasColumnType("real") + .HasColumnName("SLVL_mc"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_50"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Btot") + .HasColumnType("real") + .HasColumnName("Btot"); + + b.Property("Bx") + .HasColumnType("real") + .HasColumnName("Bx"); + + b.Property("By") + .HasColumnType("real") + .HasColumnName("By"); + + b.Property("Bz") + .HasColumnType("real") + .HasColumnName("Bz"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Gtot") + .HasColumnType("real") + .HasColumnName("Gtot"); + + b.Property("Gx") + .HasColumnType("real") + .HasColumnName("Gx"); + + b.Property("Gy") + .HasColumnType("real") + .HasColumnName("Gy"); + + b.Property("Gz") + .HasColumnType("real") + .HasColumnName("Gz"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_60"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Att06h") + .HasColumnType("real") + .HasColumnName("ATT06H"); + + b.Property("Att06l") + .HasColumnType("real") + .HasColumnName("ATT06L"); + + b.Property("Att10h") + .HasColumnType("real") + .HasColumnName("ATT10H"); + + b.Property("Att10l") + .HasColumnType("real") + .HasColumnName("ATT10L"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Phl1f1") + .HasColumnType("real") + .HasColumnName("PHL1F1"); + + b.Property("Phl1f2") + .HasColumnType("real") + .HasColumnName("PHL1F2"); + + b.Property("Phl2f1") + .HasColumnType("real") + .HasColumnName("PHL2F1"); + + b.Property("Phl2f2") + .HasColumnType("real") + .HasColumnName("PHL2F2"); + + b.Property("Status") + .HasColumnType("real") + .HasColumnName("Status"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_61"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptsvym") + .HasColumnType("real") + .HasColumnName("DEPTSVYM"); + + b.Property("Deptsvyv") + .HasColumnType("real") + .HasColumnName("DEPTSVYV"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Svyazc") + .HasColumnType("real") + .HasColumnName("SVYAZC"); + + b.Property("Svyazu") + .HasColumnType("real") + .HasColumnName("SVYAZU"); + + b.Property("Svydls") + .HasColumnType("real") + .HasColumnName("SVYDLS"); + + b.Property("Svyew") + .HasColumnType("real") + .HasColumnName("SVYEW"); + + b.Property("Svygtf") + .HasColumnType("real") + .HasColumnName("SVYGTF"); + + b.Property("Svyinc") + .HasColumnType("real") + .HasColumnName("SVYINC"); + + b.Property("Svymtf") + .HasColumnType("real") + .HasColumnName("SVYMTF"); + + b.Property("Svyns") + .HasColumnType("real") + .HasColumnName("SVYNS"); + + b.Property("Svytype") + .HasColumnType("text") + .HasColumnName("SVYTYPE"); + + b.Property("Svywalk") + .HasColumnType("real") + .HasColumnName("SVYWALK"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_7"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptcalm") + .HasColumnType("real") + .HasColumnName("DEPTCALM"); + + b.Property("Deptcalv") + .HasColumnType("real") + .HasColumnName("DEPTCALV"); + + b.Property("Deptfdm") + .HasColumnType("real") + .HasColumnName("DEPTFDM"); + + b.Property("Deptfdv") + .HasColumnType("real") + .HasColumnName("DEPTFDV"); + + b.Property("Deptgr1m") + .HasColumnType("real") + .HasColumnName("DEPTGR1M"); + + b.Property("Deptgr1v") + .HasColumnType("real") + .HasColumnName("DEPTGR1V"); + + b.Property("Deptgr2m") + .HasColumnType("real") + .HasColumnName("DEPTGR2M"); + + b.Property("Deptgr2v") + .HasColumnType("real") + .HasColumnName("DEPTGR2V"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptp1m") + .HasColumnType("real") + .HasColumnName("DEPTP1M"); + + b.Property("Deptp1v") + .HasColumnType("real") + .HasColumnName("DEPTP1V"); + + b.Property("Deptp2m") + .HasColumnType("real") + .HasColumnName("DEPTP2M"); + + b.Property("Deptp2v") + .HasColumnType("real") + .HasColumnName("DEPTP2V"); + + b.Property("Deptrs1m") + .HasColumnType("real") + .HasColumnName("DEPTRS1M"); + + b.Property("Deptrs1v") + .HasColumnType("real") + .HasColumnName("DEPTRS1V"); + + b.Property("Deptrs2m") + .HasColumnType("real") + .HasColumnName("DEPTRS2M"); + + b.Property("Deptrs2v") + .HasColumnType("real") + .HasColumnName("DEPTRS2V"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Mclp") + .HasColumnType("real") + .HasColumnName("MCLP"); + + b.Property("Mfd") + .HasColumnType("real") + .HasColumnName("MFD"); + + b.Property("Mffp") + .HasColumnType("real") + .HasColumnName("MFFP"); + + b.Property("Mfpp") + .HasColumnType("real") + .HasColumnName("MFPP"); + + b.Property("Mfrann") + .HasColumnType("real") + .HasColumnName("MFRANN"); + + b.Property("Mfrpipe") + .HasColumnType("real") + .HasColumnName("MFRPIPE"); + + b.Property("Mftann") + .HasColumnType("real") + .HasColumnName("MFTANN"); + + b.Property("Mftpipe") + .HasColumnType("real") + .HasColumnName("MFTPIPE"); + + b.Property("Mg1") + .HasColumnType("real") + .HasColumnName("MG1"); + + b.Property("Mg1c") + .HasColumnType("real") + .HasColumnName("MG1C"); + + b.Property("Mg2") + .HasColumnType("real") + .HasColumnName("MG2"); + + b.Property("Mg2c") + .HasColumnType("real") + .HasColumnName("MG2C"); + + b.Property("Mpo1") + .HasColumnType("real") + .HasColumnName("MPO1"); + + b.Property("Mpo2") + .HasColumnType("real") + .HasColumnName("MPO2"); + + b.Property("Mr1") + .HasColumnType("real") + .HasColumnName("MR1"); + + b.Property("Mr1c") + .HasColumnType("real") + .HasColumnName("MR1C"); + + b.Property("Mr2") + .HasColumnType("real") + .HasColumnName("MR2"); + + b.Property("Mr2c") + .HasColumnType("real") + .HasColumnName("MR2C"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spare6") + .HasColumnType("real") + .HasColumnName("SPARE6"); + + b.Property("Spare7") + .HasColumnType("real") + .HasColumnName("SPARE7"); + + b.Property("Spare8") + .HasColumnType("real") + .HasColumnName("SPARE8"); + + b.Property("Spare9") + .HasColumnType("real") + .HasColumnName("SPARE9"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_8"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.HasOne("AsbCloudDb.Model.Deposit", "Deposit") + .WithMany("Clusters") + .HasForeignKey("IdDeposit") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .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.Contact", b => + { + b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType") + .WithMany("Contacts") + .HasForeignKey("IdCompanyType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("Contacts") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CompanyType"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdFileCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("DrillingProgramParts") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Faq", b => + { + b.HasOne("AsbCloudDb.Model.User", "AuthorAnswer") + .WithMany() + .HasForeignKey("IdAuthorAnswer"); + + b.HasOne("AsbCloudDb.Model.User", "AuthorQuestion") + .WithMany() + .HasForeignKey("IdAuthorQuestion") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AuthorAnswer"); + + b.Navigation("AuthorQuestion"); + }); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_file_mark_t_file_info_fk"); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_user_t_file_mark_fk"); + + b.Navigation("FileInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileCategory"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.Manual", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.FileCategory", "Category") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Manuals.ManualDirectory", "Directory") + .WithMany("Manuals") + .HasForeignKey("IdDirectory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Category"); + + b.Navigation("Directory"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => + { + b.HasOne("AsbCloudDb.Model.Manuals.ManualDirectory", "Parent") + .WithMany("Children") + .HasForeignKey("IdParent") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("Parent"); + }); + + 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.Notification", b => + { + b.HasOne("AsbCloudDb.Model.NotificationCategory", "NotificationCategory") + .WithMany("Notifications") + .HasForeignKey("IdNotificationCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NotificationCategory"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.OperationValue", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdOperationCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "Editor") + .WithMany() + .HasForeignKey("IdEditor") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", "Previous") + .WithMany() + .HasForeignKey("IdPrevious"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Editor"); + + b.Navigation("Previous"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "Editor") + .WithMany() + .HasForeignKey("IdEditor"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Editor"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_company_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_well_id_fk"); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationContactWell", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("RelationContactsWells") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.DrillingProgramPart", "DrillingProgramPart") + .WithMany("RelatedUsers") + .HasForeignKey("IdDrillingProgramPart") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DrillingProgramPart"); + + b.Navigation("User"); + }); + + 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.RelationUserRoleUserRole", b => + { + b.HasOne("AsbCloudDb.Model.UserRole", "Role") + .WithMany("RelationUserRoleUserRoles") + .HasForeignKey("Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "IncludeRole") + .WithMany() + .HasForeignKey("IdInclude") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IncludeRole"); + + b.Navigation("Role"); + }); + + 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.Schedule", b => + { + b.HasOne("AsbCloudDb.Model.Driller", "Driller") + .WithMany("Schedule") + .HasForeignKey("IdDriller") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_schedule_t_driller_id_driller"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Driller"); + + 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.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_event_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_messages_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlan", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired() + .HasConstraintName("t_user_t_company_id_fk"); + + b.Navigation("Company"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.HasOne("AsbCloudDb.Model.Cluster", "Cluster") + .WithMany("Wells") + .HasForeignKey("IdCluster") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_t_cluster_id_fk"); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithOne("Well") + .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_well_t_telemetry_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellType", "WellType") + .WithMany("Wells") + .HasForeignKey("IdWellType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_src_t_well_id_fk"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + + b.Navigation("WellSrc"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocument", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "Category") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellOperation", "OperationPlan") + .WithMany() + .HasForeignKey("IdPlan") + .OnDelete(DeleteBehavior.SetNull); + + 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("OperationPlan"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Parent") + .WithMany() + .HasForeignKey("IdParent"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => + { + b.HasOne("AsbCloudDb.Model.WellSectionType", "SectionType") + .WithMany() + .HasForeignKey("IdSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("SectionType"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record1", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record50", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record60", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record61", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record7", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record8", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + 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"); + + b.Navigation("Contacts"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Navigation("Clusters"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Navigation("RelatedUsers"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Navigation("FileMarks"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => + { + b.Navigation("Children"); + + b.Navigation("Manuals"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Navigation("Measures"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => + { + b.Navigation("Notifications"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Navigation("RelationUserRolePermissions"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + 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("RelationContactsWells"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("RelationUserRolePermissions"); + + b.Navigation("RelationUserRoleUserRoles"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("Contacts"); + + b.Navigation("DrillingProgramParts"); + + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellComposites"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + 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/20240401094602_Update_DetectedOperation.cs b/AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.cs new file mode 100644 index 00000000..570f957e --- /dev/null +++ b/AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.cs @@ -0,0 +1,64 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + /// + public partial class Update_DetectedOperation : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "id_user", + table: "t_detected_operation", + type: "integer", + nullable: true, + comment: "Id пользователя по телеметрии на момент начала операции", + oldClrType: typeof(int), + oldType: "integer", + oldComment: "Id пользователя по телеметрии на момент начала операции"); + + migrationBuilder.AddColumn( + name: "creation", + table: "t_detected_operation", + type: "timestamp with time zone", + nullable: false, + defaultValue: new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + comment: "дата создания"); + + migrationBuilder.AddColumn( + name: "id_editor", + table: "t_detected_operation", + type: "integer", + nullable: true, + comment: "Редактор"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "creation", + table: "t_detected_operation"); + + migrationBuilder.DropColumn( + name: "id_editor", + table: "t_detected_operation"); + + migrationBuilder.AlterColumn( + name: "id_user", + table: "t_detected_operation", + type: "integer", + nullable: false, + defaultValue: 0, + comment: "Id пользователя по телеметрии на момент начала операции", + oldClrType: typeof(int), + oldType: "integer", + oldNullable: true, + oldComment: "Id пользователя по телеметрии на момент начала операции"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 9957e235..e0941af4 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace AsbCloudDb.Migrations #pragma warning disable 612, 618 modelBuilder .UseCollation("Russian_Russia.1251") - .HasAnnotation("ProductVersion", "6.0.22") + .HasAnnotation("ProductVersion", "8.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); @@ -63,9 +63,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDeposit"); - b.ToTable("t_cluster"); - - b.HasComment("Кусты"); + b.ToTable("t_cluster", t => + { + t.HasComment("Кусты"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Company", b => @@ -264,9 +265,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_contact"); - - b.HasComment("Контакты"); + b.ToTable("t_contact", t => + { + t.HasComment("Контакты"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => @@ -312,9 +314,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell", "Date") .IsUnique(); - b.ToTable("t_daily_report"); - - b.HasComment("Ежедневные отчёты"); + b.ToTable("t_daily_report", t => + { + t.HasComment("Ежедневные отчёты"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => @@ -442,9 +445,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_data_saub_stat"); - - b.HasComment("Кеш-таблица для хранения данных для РТК-отчета"); + b.ToTable("t_data_saub_stat", t => + { + t.HasComment("Кеш-таблица для хранения данных для РТК-отчета"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => @@ -478,9 +482,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_deposit"); - - b.HasComment("Месторождение"); + b.ToTable("t_deposit", t => + { + t.HasComment("Месторождение"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => @@ -492,6 +497,11 @@ namespace AsbCloudDb.Migrations NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .HasComment("дата создания"); + b.Property("DateEnd") .HasColumnType("timestamp with time zone") .HasColumnName("date_end") @@ -528,11 +538,16 @@ namespace AsbCloudDb.Migrations .HasColumnName("id_category") .HasComment("Id категории операции"); + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); + b.Property("IdTelemetry") .HasColumnType("integer") .HasColumnName("id_telemetry"); - b.Property("IdUsersAtStart") + b.Property("IdUsersAtStart") .HasColumnType("integer") .HasColumnName("id_user") .HasComment("Id пользователя по телеметрии на момент начала операции"); @@ -548,75 +563,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_detected_operation"); - - b.HasComment("автоматически определенные операции по телеметрии"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Driller", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name") - .HasComment("Имя"); - - b.Property("Patronymic") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("patronymic") - .HasComment("Отчество"); - - b.Property("Surname") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("surname") - .HasComment("Фамилия"); - - b.HasKey("Id"); - - b.ToTable("t_driller"); - - b.HasComment("Бурильщик"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdFileCategory") - .HasColumnType("integer") - .HasColumnName("id_file_category"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well"); - - b.HasKey("Id"); - - b.HasIndex("IdFileCategory"); - - b.HasIndex("IdWell", "IdFileCategory") - .IsUnique(); - - b.ToTable("t_drilling_program_part"); - - b.HasComment("части программ бурения"); + b.ToTable("t_detected_operation", t => + { + t.HasComment("автоматически определенные операции по телеметрии"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => @@ -651,9 +601,78 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_drill_test"); + b.ToTable("t_drill_test", t => + { + t.HasComment("Drill_test"); + }); + }); - b.HasComment("Drill_test"); + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Имя"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("Отчество"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("Фамилия"); + + b.HasKey("Id"); + + b.ToTable("t_driller", t => + { + t.HasComment("Бурильщик"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdFileCategory") + .HasColumnType("integer") + .HasColumnName("id_file_category"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("Id"); + + b.HasIndex("IdFileCategory"); + + b.HasIndex("IdWell", "IdFileCategory") + .IsUnique(); + + b.ToTable("t_drilling_program_part", t => + { + t.HasComment("части программ бурения"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Faq", b => @@ -728,9 +747,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdAuthorQuestion"); - b.ToTable("t_faq"); - - b.HasComment("вопросы пользователей"); + b.ToTable("t_faq", t => + { + t.HasComment("вопросы пользователей"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => @@ -755,9 +775,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_file_category"); - - b.HasComment("Категории файлов"); + b.ToTable("t_file_category", t => + { + t.HasComment("Категории файлов"); + }); b.HasData( new @@ -1155,9 +1176,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_file_info"); - - b.HasComment("Файлы всех категорий"); + b.ToTable("t_file_info", t => + { + t.HasComment("Файлы всех категорий"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => @@ -1206,9 +1228,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_file_mark"); - - b.HasComment("Действия с файлами."); + b.ToTable("t_file_mark", t => + { + t.HasComment("Действия с файлами."); + }); }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => @@ -1235,9 +1258,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_float"); - - b.HasComment("таблица данных ГТИ с типом значения float"); + b.ToTable("t_wits_float", t => + { + t.HasComment("таблица данных ГТИ с типом значения float"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => @@ -1264,9 +1288,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_int"); - - b.HasComment("таблица данных ГТИ с типом значения int"); + b.ToTable("t_wits_int", t => + { + t.HasComment("таблица данных ГТИ с типом значения int"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => @@ -1294,9 +1319,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_string"); - - b.HasComment("таблица данных ГТИ с типом значения string"); + b.ToTable("t_wits_string", t => + { + t.HasComment("таблица данных ГТИ с типом значения string"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => @@ -1334,9 +1360,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdCategory"); - b.ToTable("t_help_page"); - - b.HasComment("Справки"); + b.ToTable("t_help_page", t => + { + t.HasComment("Справки"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => @@ -1376,9 +1403,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_limiting_parameter"); - - b.HasComment("Ограничения по параметрам телеметрии"); + b.ToTable("t_limiting_parameter", t => + { + t.HasComment("Ограничения по параметрам телеметрии"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Manuals.Manual", b => @@ -1424,9 +1452,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDirectory"); - b.ToTable("t_manual"); - - b.HasComment("Инструкции"); + b.ToTable("t_manual", t => + { + t.HasComment("Инструкции"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => @@ -1453,9 +1482,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdParent"); - b.ToTable("t_manual_directory"); - - b.HasComment("Директория для инструкций"); + b.ToTable("t_manual_directory", t => + { + t.HasComment("Директория для инструкций"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Measure", b => @@ -1499,9 +1529,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_measure"); - - b.HasComment("Таблица c данными для вкладки 'Последние данные'"); + b.ToTable("t_measure", t => + { + t.HasComment("Таблица c данными для вкладки 'Последние данные'"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => @@ -1526,9 +1557,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_measure_category"); - - b.HasComment("Категория последних данных"); + b.ToTable("t_measure_category", t => + { + t.HasComment("Категория последних данных"); + }); b.HasData( new @@ -1608,9 +1640,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_notification"); - - b.HasComment("Уведомления"); + b.ToTable("t_notification", t => + { + t.HasComment("Уведомления"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => @@ -1629,9 +1662,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_notification_category"); - - b.HasComment("Категории уведомлений"); + b.ToTable("t_notification_category", t => + { + t.HasComment("Категории уведомлений"); + }); b.HasData( new @@ -1687,9 +1721,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_operationvalue"); - - b.HasComment("Целевые/нормативные показатели операции"); + b.ToTable("t_operationvalue", t => + { + t.HasComment("Целевые/нормативные показатели операции"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Permission", b => @@ -1716,9 +1751,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_permission"); - - b.HasComment("Разрешения на доступ к данным"); + b.ToTable("t_permission", t => + { + t.HasComment("Разрешения на доступ к данным"); + }); b.HasData( new @@ -2742,9 +2778,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_process_map_plan_drilling"); - - b.HasComment("РТК план бурение"); + b.ToTable("t_process_map_plan_drilling", t => + { + t.HasComment("РТК план бурение"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => @@ -2862,9 +2899,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_process_map_plan_ream"); - - b.HasComment("РТК проработка скважины"); + b.ToTable("t_process_map_plan_ream", t => + { + t.HasComment("РТК проработка скважины"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => @@ -2881,9 +2919,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_relation_company_well"); - - b.HasComment("отношение скважин и компаний"); + b.ToTable("t_relation_company_well", t => + { + t.HasComment("отношение скважин и компаний"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.RelationContactWell", b => @@ -2923,9 +2962,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDrillingProgramPart"); - b.ToTable("t_relation_user_drilling_program_part"); - - b.HasComment("Отношение пользователей и частей ПБ"); + b.ToTable("t_relation_user_drilling_program_part", t => + { + t.HasComment("Отношение пользователей и частей ПБ"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => @@ -2942,9 +2982,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdPermission"); - b.ToTable("t_relation_user_role_permission"); - - b.HasComment("Отношение ролей пользователей и разрешений доступа"); + b.ToTable("t_relation_user_role_permission", t => + { + t.HasComment("Отношение ролей пользователей и разрешений доступа"); + }); b.HasData( new @@ -4259,9 +4300,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdInclude"); - b.ToTable("t_relation_user_role_user_role"); - - b.HasComment("Отношение ролей к ролям"); + b.ToTable("t_relation_user_role_user_role", t => + { + t.HasComment("Отношение ролей к ролям"); + }); b.HasData( new @@ -4550,9 +4592,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUserRole"); - b.ToTable("t_relation_user_user_role"); - - b.HasComment("Отношение пользователей и ролей"); + b.ToTable("t_relation_user_user_role", t => + { + t.HasComment("Отношение пользователей и ролей"); + }); b.HasData( new @@ -4606,9 +4649,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_report_property"); - - b.HasComment("Отчеты с данными по буровым"); + b.ToTable("t_report_property", t => + { + t.HasComment("Отчеты с данными по буровым"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => @@ -4657,9 +4701,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_schedule"); - - b.HasComment("График работы бурильщика"); + b.ToTable("t_schedule", t => + { + t.HasComment("График работы бурильщика"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => @@ -4712,9 +4757,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_setpoints_rquest"); - - b.HasComment("Запросы на изменение уставок панели оператора"); + b.ToTable("t_setpoints_rquest", t => + { + t.HasComment("Запросы на изменение уставок панели оператора"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Subsystem", b => @@ -4739,9 +4785,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_subsystem"); - - b.HasComment("Описание подсистем"); + b.ToTable("t_subsystem", t => + { + t.HasComment("Описание подсистем"); + }); b.HasData( new @@ -4807,9 +4854,10 @@ namespace AsbCloudDb.Migrations b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); - b.ToTable("t_telemetry"); - - b.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + b.ToTable("t_telemetry", t => + { + t.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => @@ -5025,9 +5073,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_data_saub"); - - b.HasComment("набор основных данных по SAUB"); + b.ToTable("t_telemetry_data_saub", t => + { + t.HasComment("набор основных данных по SAUB"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaubStat", b => @@ -5056,7 +5105,9 @@ namespace AsbCloudDb.Migrations .HasColumnType("integer") .HasColumnName("id_telemetry"); - b.ToView("mw_telemetry_datas_saub_stat"); + b.ToTable((string)null); + + b.ToView("mw_telemetry_datas_saub_stat", (string)null); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => @@ -5122,9 +5173,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_data_spin"); - - b.HasComment("набор основных данных по SpinMaster"); + b.ToTable("t_telemetry_data_spin", t => + { + t.HasComment("набор основных данных по SpinMaster"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => @@ -5148,9 +5200,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdEvent"); - b.ToTable("t_telemetry_event"); - - b.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + b.ToTable("t_telemetry_event", t => + { + t.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => @@ -5208,9 +5261,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_telemetry_message"); - - b.HasComment("Сообщения на буровых"); + b.ToTable("t_telemetry_message", t => + { + t.HasComment("Сообщения на буровых"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => @@ -5245,9 +5299,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdUser"); - b.ToTable("t_telemetry_user"); - - b.HasComment("Пользователи панели САУБ. Для сообщений."); + b.ToTable("t_telemetry_user", t => + { + t.HasComment("Пользователи панели САУБ. Для сообщений."); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryWirelineRunOut", b => @@ -5287,9 +5342,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry"); - b.ToTable("t_telemetry_wireline_run_out"); - - b.HasComment("Наработка талевого каната"); + b.ToTable("t_telemetry_wireline_run_out", t => + { + t.HasComment("Наработка талевого каната"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => @@ -5352,9 +5408,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_trajectory_fact"); - - b.HasComment("Загрузка фактической траектории"); + b.ToTable("t_trajectory_fact", t => + { + t.HasComment("Загрузка фактической траектории"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlan", b => @@ -5422,9 +5479,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_trajectory_plan"); - - b.HasComment("Загрузка плановой траектории"); + b.ToTable("t_trajectory_plan", t => + { + t.HasComment("Загрузка плановой траектории"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.User", b => @@ -5502,9 +5560,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("Login") .IsUnique(); - b.ToTable("t_user"); - - b.HasComment("Пользователи облака"); + b.ToTable("t_user", t => + { + t.HasComment("Пользователи облака"); + }); b.HasData( new @@ -5542,9 +5601,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_user_role"); - - b.HasComment("Роли пользователей в системе"); + b.ToTable("t_user_role", t => + { + t.HasComment("Роли пользователей в системе"); + }); b.HasData( new @@ -5880,9 +5940,55 @@ namespace AsbCloudDb.Migrations b.HasKey("IdUser", "Key"); - b.ToTable("t_user_settings"); + b.ToTable("t_user_settings", t => + { + t.HasComment("настройки интерфейса пользователя"); + }); + }); - b.HasComment("настройки интерфейса пользователя"); + modelBuilder.Entity("AsbCloudDb.Model.WITS.RecordBase", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Actcod") + .HasColumnType("smallint") + .HasColumnName("ACTCOD"); + + b.Property("Date") + .HasColumnType("integer") + .HasColumnName("DATE"); + + b.Property("Recid") + .HasColumnType("smallint") + .HasColumnName("RECID"); + + b.Property("Seqid") + .HasColumnType("integer") + .HasColumnName("SEQID"); + + b.Property("Stknum") + .HasColumnType("smallint") + .HasColumnName("STKNUM"); + + b.Property("Time") + .HasColumnType("integer") + .HasColumnName("TIME"); + + b.Property("Wellid") + .HasColumnType("text") + .HasColumnName("WELLID"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_wits_base"); + + b.UseTptMappingStrategy(); }); modelBuilder.Entity("AsbCloudDb.Model.Well", b => @@ -5940,9 +6046,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellType"); - b.ToTable("t_well"); - - b.HasComment("скважины"); + b.ToTable("t_well", t => + { + t.HasComment("скважины"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => @@ -5968,9 +6075,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSrc"); - b.ToTable("t_well_composite"); - - b.HasComment("Композитная скважина"); + b.ToTable("t_well_composite", t => + { + t.HasComment("Композитная скважина"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocument", b => @@ -5994,9 +6102,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_well_final_documents"); - - b.HasComment("Дело скважины"); + b.ToTable("t_well_final_documents", t => + { + t.HasComment("Дело скважины"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => @@ -6083,9 +6192,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_well_operation"); - - b.HasComment("Данные по операциям на скважине"); + b.ToTable("t_well_operation", t => + { + t.HasComment("Данные по операциям на скважине"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => @@ -6124,9 +6234,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdParent"); - b.ToTable("t_well_operation_category"); - - b.HasComment("Справочник операций на скважине"); + b.ToTable("t_well_operation_category", t => + { + t.HasComment("Справочник операций на скважине"); + }); b.HasData( new @@ -7213,65 +7324,6 @@ namespace AsbCloudDb.Migrations }); }); - modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Конечная глубина бурения, м"); - - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Начальная глубина бурения, м"); - - b.Property("IdSectionType") - .HasColumnType("integer") - .HasColumnName("id_section_type") - .HasComment("Тип секции"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("Id пользователя"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины"); - - b.Property("InnerDiameter") - .HasColumnType("double precision") - .HasColumnName("inner_diameter") - .HasComment("Внутренний диаметр"); - - b.Property("LastUpdateDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_last_update") - .HasComment("Дата последнего обновления"); - - b.Property("OuterDiameter") - .HasColumnType("double precision") - .HasColumnName("outer_diameter") - .HasComment("Внешний диаметр"); - - b.HasKey("Id"); - - b.HasIndex("IdSectionType"); - - b.HasIndex("IdWell", "IdSectionType") - .IsUnique(); - - b.ToTable("t_well_section_plan"); - }); - modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => { b.Property("Id") @@ -7295,9 +7347,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_well_section_type"); - - b.HasComment("конструкция секции скважины"); + b.ToTable("t_well_section_type", t => + { + t.HasComment("конструкция секции скважины"); + }); b.HasData( new @@ -7530,6 +7583,65 @@ namespace AsbCloudDb.Migrations }); }); + modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина бурения, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Начальная глубина бурения, м"); + + b.Property("IdSectionType") + .HasColumnType("integer") + .HasColumnName("id_section_type") + .HasComment("Тип секции"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("InnerDiameter") + .HasColumnType("double precision") + .HasColumnName("inner_diameter") + .HasComment("Внутренний диаметр"); + + b.Property("LastUpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_update") + .HasComment("Дата последнего обновления"); + + b.Property("OuterDiameter") + .HasColumnType("double precision") + .HasColumnName("outer_diameter") + .HasComment("Внешний диаметр"); + + b.HasKey("Id"); + + b.HasIndex("IdSectionType"); + + b.HasIndex("IdWell", "IdSectionType") + .IsUnique(); + + b.ToTable("t_well_section_plan"); + }); + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => { b.Property("Id") @@ -7548,9 +7660,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_well_type"); - - b.HasComment("конструкция скважины"); + b.ToTable("t_well_type", t => + { + t.HasComment("конструкция скважины"); + }); b.HasData( new @@ -7565,49 +7678,6 @@ namespace AsbCloudDb.Migrations }); }); - modelBuilder.Entity("AsbCloudDb.Model.WITS.RecordBase", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("Actcod") - .HasColumnType("smallint") - .HasColumnName("ACTCOD"); - - b.Property("Date") - .HasColumnType("integer") - .HasColumnName("DATE"); - - b.Property("Recid") - .HasColumnType("smallint") - .HasColumnName("RECID"); - - b.Property("Seqid") - .HasColumnType("integer") - .HasColumnName("SEQID"); - - b.Property("Stknum") - .HasColumnType("smallint") - .HasColumnName("STKNUM"); - - b.Property("Time") - .HasColumnType("integer") - .HasColumnName("TIME"); - - b.Property("Wellid") - .HasColumnType("text") - .HasColumnName("WELLID"); - - b.HasKey("IdTelemetry", "DateTime"); - - b.ToTable("t_telemetry_wits_base"); - }); - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => { b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); @@ -8351,6 +8421,17 @@ namespace AsbCloudDb.Migrations b.Navigation("Telemetry"); }); + modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => { b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") @@ -8370,17 +8451,6 @@ namespace AsbCloudDb.Migrations b.Navigation("Well"); }); - modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - modelBuilder.Entity("AsbCloudDb.Model.Faq", b => { b.HasOne("AsbCloudDb.Model.User", "AuthorAnswer") diff --git a/AsbCloudDb/Model/DetectedOperation.cs b/AsbCloudDb/Model/DetectedOperation.cs index df5abbb1..611e933d 100644 --- a/AsbCloudDb/Model/DetectedOperation.cs +++ b/AsbCloudDb/Model/DetectedOperation.cs @@ -19,6 +19,12 @@ namespace AsbCloudDb.Model [Column("id_category"), Comment("Id категории операции")] public int IdCategory { get; set; } + + [Column("id_editor"), Comment("Редактор")] + public int? IdEditor { get; set; } + + [Column("creation"), Comment("дата создания")] + public DateTimeOffset Creation { get; set; } [Column("date_start", TypeName = "timestamp with time zone"), Comment("Дата начала операции")] public DateTimeOffset DateStart { get; set; } @@ -27,7 +33,7 @@ namespace AsbCloudDb.Model public DateTimeOffset DateEnd { get; set; } [Column("id_user"), Comment("Id пользователя по телеметрии на момент начала операции")] - public int IdUsersAtStart { get; set; } + public int? IdUsersAtStart { get; set; } [NotMapped] public double DurationMinutes => (DateEnd - DateStart).TotalMinutes; diff --git a/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs b/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs index 21db64ba..1dc63f37 100644 --- a/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs @@ -12,29 +12,30 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore.ChangeTracking; namespace AsbCloudInfrastructure.Repository; -public class DetectedOperationRepository : CrudRepositoryBase, - IDetectedOperationRepository +public class DetectedOperationRepository : IDetectedOperationRepository { + private readonly IAsbCloudDbContext dbContext; private readonly ITelemetryService telemetryService; - public DetectedOperationRepository(IAsbCloudDbContext context, + public DetectedOperationRepository(IAsbCloudDbContext dbContext, ITelemetryService telemetryService) - : base(context) { + this.dbContext = dbContext; this.telemetryService = telemetryService; } - public async Task Delete(int idUser, DetectedOperationByTelemetryRequest request, CancellationToken token) + public async Task Delete(DetectedOperationByTelemetryRequest request, CancellationToken token) { var query = BuildQuery(request); dbContext.Set().RemoveRange(query); return await dbContext.SaveChangesAsync(token); } - public async Task DeleteRange(int idUser, IEnumerable ids, CancellationToken token) + public async Task DeleteRange(IEnumerable ids, CancellationToken token) { var query = dbContext.Set() .Where(e => ids.Contains( e.Id)); @@ -66,7 +67,7 @@ public class DetectedOperationRepository : CrudRepositoryBase Insert(int? idUser, IEnumerable dtos, CancellationToken token) + public async Task InsertRange(int? idEditor, IEnumerable dtos, CancellationToken token) { if(!dtos.Any()) return 0; @@ -75,6 +76,10 @@ public class DetectedOperationRepository : CrudRepositoryBase(); foreach(var entity in entities) { + if (idEditor.HasValue) + entity.IdEditor = idEditor.Value; + + entity.Creation = DateTimeOffset.UtcNow; entity.Id = default; dbset.Add(entity); } @@ -82,7 +87,7 @@ public class DetectedOperationRepository : CrudRepositoryBase Update(int idUser, IEnumerable dtos, CancellationToken token) + public async Task UpdateRange(int idEditor, IEnumerable dtos, CancellationToken token) { if (!dtos.Any()) return 0; @@ -108,32 +113,22 @@ public class DetectedOperationRepository : CrudRepositoryBase + { + var entity = Convert(dto); + entity.IdEditor = idEditor; + return entity; + }) .ToArray(); - var entries = new Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry[entities.Length]; + var entries = new EntityEntry[entities.Length]; for(var i = 0; i < entities.Length; i++) entries[i] = dbSet.Update(entities[i]); var result = await dbContext.SaveChangesWithExceptionHandling(token); - for (var i = 0; i < entries.Length; i++) - entries[i].State = EntityState.Detached; - - return result; - } - - public async Task UpdateOrInsert(int idUser, IEnumerable dtos, CancellationToken token) - { - var result = 0; - - var itemsToInsert = dtos.Where(e => e.Id == 0); - if (itemsToInsert.Any()) - result += await Insert(idUser, itemsToInsert, token); - - var itemsToUpdate = dtos.Where(e => e.Id != 0); - if (itemsToUpdate.Any()) - result += await Update(idUser, itemsToUpdate, token); + foreach (var entry in entries) + entry.State = EntityState.Detached; return result; } @@ -182,7 +177,7 @@ public class DetectedOperationRepository : CrudRepositoryBase(); dto.DateStart = src.DateStart.ToOffset(offset); @@ -190,11 +185,11 @@ public class DetectedOperationRepository : CrudRepositoryBase(); entity.DateStart = src.DateStart.ToUniversalTime(); entity.DateEnd = src.DateEnd.ToUniversalTime(); return entity; } -} +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 36809ec3..88b2a5aa 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -209,7 +209,7 @@ public class DetectedOperationService : IDetectedOperationService return 0; var requestByTelemetry = new DetectedOperationByTelemetryRequest(well.IdTelemetry.Value, request); - var result = await operationRepository.Delete(-1, requestByTelemetry, token); + var result = await operationRepository.Delete(requestByTelemetry, token); return result; } diff --git a/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs b/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs index d001471e..e1e1212e 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs @@ -48,7 +48,7 @@ public class WorkOperationDetection: Work var detectedOperations = await detectedOperationService.DetectOperationsAsync(telemetryId, beginDate, token); if (detectedOperations.Any()) - await detectedOperationRepository.InsertRangeAsync(detectedOperations, token); + await detectedOperationRepository.InsertRange(null, detectedOperations, token); } } } diff --git a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs index c6bd6dda..b6886280 100644 --- a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs @@ -7,137 +7,191 @@ using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Exceptions; +using AsbCloudApp.Repositories; using AsbCloudInfrastructure.Services.DetectOperations; using Microsoft.AspNetCore.Http; namespace AsbCloudWebApi.Controllers.SAUB { - /// - /// Операции определенные по телеметрии САУБ - /// - [Route("api/[controller]")] - [ApiController] - [Authorize] - public class DetectedOperationController : ControllerBase - { - private readonly IDetectedOperationService detectedOperationService; - private readonly IWellService wellService; - private readonly DetectedOperationExportService detectedOperationExportService; - - public DetectedOperationController(IDetectedOperationService detectedOperationService, IWellService wellService, - DetectedOperationExportService detectedOperationExportService) - { - this.detectedOperationService = detectedOperationService; - this.wellService = wellService; - this.detectedOperationExportService = detectedOperationExportService; - } + /// + /// Операции определенные по телеметрии САУБ + /// + [Route("api/well/{idWell}/[controller]")] + [ApiController] + [Authorize] + public class DetectedOperationController : ControllerBase + { + private readonly IDetectedOperationRepository detectedOperationRepository; + private readonly IDetectedOperationService detectedOperationService; + private readonly IWellService wellService; + private readonly DetectedOperationExportService detectedOperationExportService; - /// - /// получить справочник операций. Отличается от операций заводимых вручную. - /// При задании id скважины вернет только те операции, которые определились в телеметрии этой скважины. - /// - /// [опционально] id скважины - /// - /// - [HttpGet("categories")] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetCategoriesAsync([FromQuery] int? idWell, CancellationToken token) - { - var result = await detectedOperationService.GetCategoriesAsync(idWell, token); - return Ok(result); - } + public DetectedOperationController(IDetectedOperationService detectedOperationService, + IWellService wellService, + DetectedOperationExportService detectedOperationExportService, + IDetectedOperationRepository detectedOperationRepository) + { + this.detectedOperationService = detectedOperationService; + this.wellService = wellService; + this.detectedOperationExportService = detectedOperationExportService; + this.detectedOperationRepository = detectedOperationRepository; + } - /// - /// Получить фильтрованный список операций по телеметрии САУБ - /// - /// - /// - /// - [HttpGet] - [ProducesResponseType(typeof(DetectedOperationListDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAsync( - [FromQuery] DetectedOperationByWellRequest request, - CancellationToken token) - { - if (!await UserHasAccessToWellAsync(request.IdWell, token)) - return Forbid(); + /// + /// Добавить операции + /// + /// + /// + /// + /// + [HttpPost] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + public async Task InsertRangeAsync(int idWell, IEnumerable dtos, CancellationToken token) + { + var idUser = await AssertUserHasAccessToWellAsync(idWell, token); - var result = await detectedOperationService.GetAsync(request, token); - return Ok(result); - } + var result = await detectedOperationRepository.InsertRange(idUser, dtos, token); - /// - /// Получить статистику по фильтрованному списку операций по телеметрии САУБ - /// - /// - /// - /// - [HttpGet("stat")] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetStatAsync( - [FromQuery] DetectedOperationByWellRequest request, - CancellationToken token) - { - if (!await UserHasAccessToWellAsync(request.IdWell, token)) - return Forbid(); + return Ok(result); + } - var result = await detectedOperationService.GetOperationsStatAsync(request, token); - return Ok(result); - } + /// + /// Обновить операции + /// + /// + /// + /// + /// + [HttpPut] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + public async Task UpdateRangeAsync(int idWell, IEnumerable dtos, CancellationToken token) + { + var idUser = await AssertUserHasAccessToWellAsync(idWell, token); - /// - /// Удалить операции. - /// Удаленные операции будут определены повторно сервисом автоматизированного определения операций. - /// Может потребоваться при изменении алгоритмов определения - /// - /// - /// - /// - [HttpDelete] - [Permission] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task DeleteAsync( - [FromQuery] DetectedOperationByWellRequest request, - CancellationToken token) - { - if (!await UserHasAccessToWellAsync(request.IdWell, token)) - return Forbid(); + var result = await detectedOperationRepository.UpdateRange(idUser, dtos, token); - var result = await detectedOperationService.DeleteAsync(request, token); - return Ok(result); - } + return Ok(result); + } - protected async Task UserHasAccessToWellAsync(int idWell, CancellationToken token) - { - var idCompany = User.GetCompanyId(); - if (idCompany is not null && - await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token) - .ConfigureAwait(false)) - return true; - return false; - } + /// + /// Удалить операции + /// + /// + /// + /// + /// + [HttpDelete] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + public async Task DeleteRangeAsync(int idWell, IEnumerable ids, CancellationToken token) + { + await AssertUserHasAccessToWellAsync(idWell, token); - /// - /// Создает excel файл с операциями по скважине - /// - /// id скважины - /// - [HttpGet("export")] - [Permission] - [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK, "application/octet-stream")] - [ProducesResponseType(StatusCodes.Status204NoContent)] - [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] - public async Task ExportAsync(int idWell, CancellationToken token) - { - var idCompany = User.GetCompanyId(); + var result = await detectedOperationRepository.DeleteRange(ids, token); - if (idCompany is null) - return Forbid(); + return Ok(result); + } - var host = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host}"; - var stream = await detectedOperationExportService.ExportAsync(idWell, host, token); - - return File(stream, "application/octet-stream", "operations.xlsx"); - } - } -} + /// + /// получить справочник операций. Отличается от операций заводимых вручную. + /// При задании id скважины вернет только те операции, которые определились в телеметрии этой скважины. + /// + /// [опционально] id скважины + /// + /// + [HttpGet] + [Route("/api/well/[controller]/categories")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task GetCategoriesAsync([FromQuery] int? idWell, CancellationToken token) + { + var result = await detectedOperationService.GetCategoriesAsync(idWell, token); + return Ok(result); + } + + /// + /// Получить фильтрованный список операций по телеметрии САУБ + /// + /// + /// + /// + /// + [HttpGet] + [ProducesResponseType(typeof(DetectedOperationDto), StatusCodes.Status200OK)] + public async Task GetAsync(int idWell, + [FromQuery] DetectedOperationRequest request, + CancellationToken token) + { + await AssertUserHasAccessToWellAsync(idWell, token); + + var well = await wellService.GetOrDefaultAsync(idWell, token); + + if (well?.IdTelemetry is null) + return NoContent(); + + var requestToService = new DetectedOperationByTelemetryRequest(well.IdTelemetry.Value, request); + + var result = await detectedOperationRepository.Get(requestToService, token); + return Ok(result); + } + + /// + /// Получить статистику по фильтрованному списку операций по телеметрии САУБ + /// + /// + /// + /// + /// + [HttpGet("stat")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task GetStatAsync(int idWell, [FromQuery] DetectedOperationRequest request, + CancellationToken token) + { + await AssertUserHasAccessToWellAsync(idWell, token); + + var requestToService = new DetectedOperationByWellRequest(idWell, request); + + var result = await detectedOperationService.GetOperationsStatAsync(requestToService, token); + return Ok(result); + } + + /// + /// Создает excel файл с операциями по скважине + /// + /// id скважины + /// + [HttpGet("export")] + [Permission] + [ProducesResponseType(typeof(PhysicalFileResult), StatusCodes.Status200OK, "application/octet-stream")] + [ProducesResponseType(StatusCodes.Status204NoContent)] + [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] + public async Task ExportAsync(int idWell, CancellationToken token) + { + var idCompany = User.GetCompanyId(); + + if (idCompany is null) + return Forbid(); + + var host = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host}"; + var stream = await detectedOperationExportService.ExportAsync(idWell, host, token); + + return File(stream, "application/octet-stream", "operations.xlsx"); + } + + private async Task AssertUserHasAccessToWellAsync(int idWell, CancellationToken token) + { + var idUser = User.GetUserId(); + var idCompany = User.GetCompanyId(); + + if (!idUser.HasValue) + throw new ForbidException("Неизвестный пользователь"); + + if (!idCompany.HasValue) + throw new ForbidException("Нет доступа к скважине"); + + if (!await wellService.IsCompanyInvolvedInWellAsync(idCompany.Value, idWell, token)) + throw new ForbidException("Нет доступа к скважине"); + + return idUser.Value; + } + } +} \ No newline at end of file From 02f821555f2273a21645dbe5d9632a0985eeacb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 1 Apr 2024 13:35:21 +0300 Subject: [PATCH 02/14] merge fix --- AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs | 1 + AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs index 0aa2bae5..33cc19a5 100644 --- a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs +++ b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Data.DetectedOperation; diff --git a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs index b6886280..b5a94856 100644 --- a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudInfrastructure.Services.DetectOperations; From 79929dc6d2b69bb7723b2bb970d9e6c81ab1b490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 8 Apr 2024 07:17:17 +0300 Subject: [PATCH 03/14] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B5=D0=BF=D0=BE?= =?UTF-8?q?=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/CrudRepositoryBase.cs | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs index f5d11f38..900e181c 100644 --- a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Exceptions; using Microsoft.EntityFrameworkCore.ChangeTracking; namespace AsbCloudInfrastructure.Repository @@ -120,15 +121,26 @@ namespace AsbCloudInfrastructure.Repository { if (!dtos.Any()) return 0; - - var ids = dtos.Select(d => d.Id); - - var countExistingEntities = await dbSet - .Where(d => ids.Contains(d.Id)) + + var ids = dtos + .Select(o => o.Id) + .Distinct() + .ToArray(); + + if (ids.Any(id => id == default)) + throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь Id"); + + if (ids.Length != dtos.Count()) + throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь уникальные Id"); + + var dbSet = dbContext.Set(); + + var existingEntitiesCount = await dbSet + .Where(o => ids.Contains(o.Id)) .CountAsync(token); - - if (ids.Count() > countExistingEntities) - return ICrudRepository.ErrorIdNotFound; + + if (ids.Length != existingEntitiesCount) + throw new ArgumentInvalidException(nameof(dtos), "Все записи должны существовать в БД"); var entities = dtos.Select(Convert); var entries = entities.Select(entity => dbSet.Update(entity)).Cast().ToList(); @@ -145,9 +157,8 @@ namespace AsbCloudInfrastructure.Repository .FirstOrDefault(e => e.Id == id); if (entity == default) return Task.FromResult(ICrudRepository.ErrorIdNotFound); - var entry = dbSet.Remove(entity); + dbSet.Remove(entity); var affected = dbContext.SaveChangesAsync(token); - entry.State = EntityState.Detached; return affected; } @@ -164,10 +175,8 @@ namespace AsbCloudInfrastructure.Repository return ICrudRepository.ErrorIdNotFound; var entities = dbContext.Set().Where(e => ids.Contains(e.Id)); - var entries = entities.Select(entity => dbSet.Remove(entity)).Cast().ToList(); - var affected = await dbContext.SaveChangesAsync(token); - entries.ForEach(e => e.State = EntityState.Detached); - return affected; + dbContext.Set().RemoveRange(entities); + return await dbContext.SaveChangesAsync(token); } protected virtual TDto Convert(TEntity src) => src.Adapt(); From 25f35b77f5920df3879e8b6eb7b3144945cbbebe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 8 Apr 2024 07:26:24 +0300 Subject: [PATCH 04/14] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D1=8F,=20=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B2=D0=B8=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DetectedOperation/DetectedOperationDto.cs | 139 +++++++++--------- .../DetectedOperation/EnabledSubsystems.cs | 102 +++++++++++++ .../IDetectedOperationRepository.cs | 53 ++++--- .../Services/IDetectedOperationService.cs | 20 +++ .../PeriodicWorks/WorkDataSaubStat.cs | 4 +- AsbCloudInfrastructure/DependencyInjection.cs | 5 + .../Repository/DetectedOperationRepository.cs | 129 +++++----------- .../DetectedOperationExportService.cs | 3 +- .../DetectedOperationService.cs | 40 ++++- .../WorkOperationDetection.cs | 2 +- .../SAUB/DetectedOperationController.cs | 17 +-- 11 files changed, 309 insertions(+), 205 deletions(-) create mode 100644 AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs diff --git a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs index 33cc19a5..13af0e6e 100644 --- a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs +++ b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.Text.Json.Serialization; using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Data.DetectedOperation; @@ -9,84 +8,84 @@ namespace AsbCloudApp.Data.DetectedOperation; /// /// Автоматически определенная операция /// -public class DetectedOperationDto: IId +public class DetectedOperationDto : IId { - /// - [Required] - public int Id { get; set; } + /// + [Required] + public int Id { get; set; } - /// - /// Id телеметрии - /// - [Required] - public int IdTelemetry { get; set; } + /// + /// Id телеметрии + /// + [Required] + public int IdTelemetry { get; set; } - /// - /// Id названия/описания операции - /// - [Required] - public int IdCategory { get; set; } + /// + /// Id названия/описания операции + /// + [Required] + public int IdCategory { get; set; } - /// - /// Id пользователя панели на момент начала операции - /// - public int? IdUserAtStart { get; set; } - - /// - /// Пользователь панели оператора - /// - public string? TelemetryUserName { get; set; } + /// + /// Id пользователя панели на момент начала операции + /// + public int? IdUserAtStart { get; set; } + + /// + /// Id пользователя изменившего операцию + /// + public int? IdEditor { get; set; } - /// - /// Дата завершения операции в часовом поясе скважины - /// - [Required] - public DateTimeOffset DateEnd { get; set; } + /// + /// Дата завершения операции в часовом поясе скважины + /// + [Required] + public DateTimeOffset DateEnd { get; set; } - /// - /// Дата начала операции в часовом поясе скважины - /// - [Required] - public DateTimeOffset DateStart { get; set; } + /// + /// Дата начала операции в часовом поясе скважины + /// + [Required] + public DateTimeOffset DateStart { get; set; } - /// - /// глубина на завершения операции, м - /// - [Required] - public double DepthEnd { get; set; } + /// + /// глубина на завершения операции, м + /// + [Required] + public double DepthEnd { get; set; } - /// - /// глубина на начало операции, м - /// - [Required] - public double DepthStart { get; set; } + /// + /// глубина на начало операции, м + /// + [Required] + public double DepthStart { get; set; } - /// - /// Продолжительность операции в минутах - /// - [Required] - public double DurationMinutes => (DateEnd - DateStart).TotalMinutes; + /// + /// Продолжительность операции в минутах + /// + [Required] + public double DurationMinutes => (DateEnd - DateStart).TotalMinutes; + + /// + /// название/описание операции + /// + [Required] + public WellOperationCategoryDto OperationCategory { get; set; } = null!; + + /// + /// Включенные подсистемы + /// + [Required] + public EnabledSubsystems EnabledSubsystems { get; set; } - /// - /// Флаг включенной подсистемы - /// - [Required] - public int EnabledSubsystems { get; set; } + /// + /// Значение ключевой параметра операции + /// + [Required] + public double Value { get; set; } - /// - /// название/описание операции - /// - [JsonIgnore] - public WellOperationCategoryDto? OperationCategory { get; set; } - - /// - /// Ключевой параметр операции - /// - [Required] - public double Value { get; set; } - - /// - /// Доп. инфо по операции - /// - public IDictionary ExtraData { get; set; } = new Dictionary(); + /// + /// Доп. инфо по операции + /// + public IDictionary ExtraData { get; set; } = new Dictionary(); } \ No newline at end of file diff --git a/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs b/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs new file mode 100644 index 00000000..1183c2b8 --- /dev/null +++ b/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs @@ -0,0 +1,102 @@ +namespace AsbCloudApp.Data.DetectedOperation; + +/// +/// Включённые подсистемы +/// +public struct EnabledSubsystems +{ + private int value; + + private EnabledSubsystems(int value) + { + this.value = value; + } + + /// + public static implicit operator int(EnabledSubsystems param) => + param.value; + + /// + public static implicit operator EnabledSubsystems(int param) => + new(param); + + /// + /// Бурение ротором + /// + public bool IsAutoRotor + { + get => (value & (int)EnabledSubsystemsFlags.AutoRotor) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoRotor); + } + + /// + /// Бурение слайдом + /// + public bool IsAutoSlide + { + get => (value & (int)EnabledSubsystemsFlags.AutoSlide) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoSlide); + } + + /// + /// ПРОРАБОТКА + /// + public bool IsAutoConditionig + { + get => (value & (int)EnabledSubsystemsFlags.AutoConditionig) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoConditionig); + } + + /// + /// СПУСК СПО + /// + public bool IsAutoSinking + { + get => (value & (int)EnabledSubsystemsFlags.AutoSinking) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoSinking); + } + + /// + /// ПОДЪЕМ СПО + /// + public bool IsAutoLifting + { + get => (value & (int)EnabledSubsystemsFlags.AutoLifting) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoLifting); + } + + /// + /// ПОДЪЕМ С ПРОРАБОТКОЙ + /// + public bool IsAutoLiftingWithConditionig + { + get => (value & (int)EnabledSubsystemsFlags.AutoLiftingWithConditionig) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoLiftingWithConditionig); + } + + /// + /// Блокировка + /// + public bool IsAutoBlocknig + { + get => (value & (int)EnabledSubsystemsFlags.AutoBlocknig) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoBlocknig); + } + + /// + /// Осцилляция + /// + public bool IsAutoOscillation + { + get => (value & (int)EnabledSubsystemsFlags.AutoOscillation) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoOscillation); + } + + private void UpdateEnabledSubsystems(bool isEnable, EnabledSubsystemsFlags flag) + { + if (isEnable) + value |= (int)flag; + else + value &= ~(int)flag; + } +} \ No newline at end of file diff --git a/AsbCloudApp/Repositories/IDetectedOperationRepository.cs b/AsbCloudApp/Repositories/IDetectedOperationRepository.cs index 3c9d335b..a748984d 100644 --- a/AsbCloudApp/Repositories/IDetectedOperationRepository.cs +++ b/AsbCloudApp/Repositories/IDetectedOperationRepository.cs @@ -4,7 +4,8 @@ using AsbCloudApp.Requests; using System.Collections.Generic; using System.Threading.Tasks; using System.Threading; -using AsbCloudApp.Services; +using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Repositories; @@ -14,14 +15,29 @@ namespace AsbCloudApp.Repositories; public interface IDetectedOperationRepository { /// - /// Добавление записей + /// Добавление нескольких записей + /// + /// + /// + /// количество добавленных + Task InsertRangeAsync(IEnumerable dtos, CancellationToken token); + + /// + /// Обновить несколько записей /// - /// /// /// /// - Task InsertRange(int? idEditor, IEnumerable dtos, CancellationToken token); + Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token); + /// + /// Удаление нескольких записей + /// + /// + /// + /// + Task DeleteRangeAsync(IEnumerable ids, CancellationToken token); + /// /// Получить автоматически определенные операции по телеметрии /// @@ -31,29 +47,12 @@ public interface IDetectedOperationRepository Task> Get(DetectedOperationByTelemetryRequest request, CancellationToken token); /// - /// Редактирование записей - /// - /// - /// - /// - /// - Task UpdateRange(int idEditor, IEnumerable dtos, CancellationToken token); - - /// - /// Удалить операции + /// Получить страницу списка операций /// /// /// /// - Task Delete(DetectedOperationByTelemetryRequest request, CancellationToken token); - - /// - /// Удаление записей - /// - /// - /// - /// - Task DeleteRange(IEnumerable ids, CancellationToken token); + Task> GetPageAsync(DetectedOperationByTelemetryRequest request, CancellationToken token); /// /// Получение дат последних определённых операций @@ -61,4 +60,12 @@ public interface IDetectedOperationRepository /// /// Task> GetLastDetectedDatesAsync(CancellationToken token); + + /// + /// Удалить операции + /// + /// + /// + /// + Task DeleteAsync(DetectedOperationByTelemetryRequest request, CancellationToken token); } diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs index 208706f7..9ab9189e 100644 --- a/AsbCloudApp/Services/IDetectedOperationService.cs +++ b/AsbCloudApp/Services/IDetectedOperationService.cs @@ -13,6 +13,26 @@ namespace AsbCloudApp.Services /// public interface IDetectedOperationService { + /// + /// Добавление операций + /// + /// + /// + /// + /// + /// + Task InsertRangeManualAsync(int idEditor, int idWell, IEnumerable dtos, CancellationToken token); + + /// + /// Редактирование операций + /// + /// + /// + /// + /// + /// + Task UpdateRangeManualAsync(int idEditor, int idWell, IEnumerable dtos, CancellationToken token); + /// /// Список названий операций. /// Если указан idWell, то возвращается список названий операций найденных на указанной скважине. diff --git a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs index 074c26ca..35979165 100644 --- a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs +++ b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs @@ -151,8 +151,6 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks private static DataSaubStatDto CalcStat(DetectedOperationDto operation, Span span) { - var hasOscillation = EnabledSubsystemsFlags.AutoOscillation.HasEnabledSubsystems(operation.EnabledSubsystems); - var aggregatedValues = CalcAggregate(span); var dateStart = span[0].DateTime; var dateEnd = span[^1].DateTime; @@ -181,7 +179,7 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks RotorSpeed = aggregatedValues.RotorSpeed, IdCategory = operation.IdCategory, EnabledSubsystems = operation.EnabledSubsystems, - HasOscillation = hasOscillation, + HasOscillation = operation.EnabledSubsystems.IsAutoOscillation, IdTelemetry = operation.IdTelemetry, Flow = aggregatedValues.Flow }; diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 1139dd3a..6e8b3e89 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -42,6 +42,7 @@ using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; +using AsbCloudApp.Data.DetectedOperation; using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; using AsbCloudInfrastructure.Services.WellOperations.Factories; @@ -51,6 +52,10 @@ namespace AsbCloudInfrastructure { public static void MapsterSetup() { + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .Ignore(source => source.OperationCategory); + TypeAdapterConfig.GlobalSettings.Default.Config .ForType() .Ignore(source => source.Driller); diff --git a/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs b/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs index 1dc63f37..3864b4e1 100644 --- a/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs @@ -1,5 +1,4 @@ using AsbCloudApp.Data.DetectedOperation; -using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; @@ -12,38 +11,51 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore.ChangeTracking; +using AsbCloudApp.Data; namespace AsbCloudInfrastructure.Repository; -public class DetectedOperationRepository : IDetectedOperationRepository +public class DetectedOperationRepository : CrudRepositoryBase, IDetectedOperationRepository { - private readonly IAsbCloudDbContext dbContext; private readonly ITelemetryService telemetryService; - public DetectedOperationRepository(IAsbCloudDbContext dbContext, + public DetectedOperationRepository(IAsbCloudDbContext context, ITelemetryService telemetryService) + : base(context) { - this.dbContext = dbContext; this.telemetryService = telemetryService; } - - public async Task Delete(DetectedOperationByTelemetryRequest request, CancellationToken token) + + public async Task DeleteAsync(DetectedOperationByTelemetryRequest request, CancellationToken token) { var query = BuildQuery(request); dbContext.Set().RemoveRange(query); return await dbContext.SaveChangesAsync(token); } - public async Task DeleteRange(IEnumerable ids, CancellationToken token) + public async Task> GetPageAsync(DetectedOperationByTelemetryRequest request, CancellationToken token) { - var query = dbContext.Set() - .Where(e => ids.Contains( e.Id)); + var skip = request.Skip ?? 0; + var take = request.Take ?? 32; - dbContext.Set() - .RemoveRange(query); + var query = BuildQuery(request); - return await dbContext.SaveChangesAsync(token); + var entities = await query.Skip(skip) + .Take(take) + .AsNoTracking() + .ToArrayAsync(token); + + var offset = telemetryService.GetTimezone(request.IdTelemetry).Offset; + + var paginationContainer = new PaginationContainer + { + Skip = skip, + Take = take, + Count = await query.CountAsync(token), + Items = entities.Select(o => Convert(o, offset)) + }; + + return paginationContainer; } public async Task> GetLastDetectedDatesAsync(CancellationToken token) => @@ -60,82 +72,18 @@ public class DetectedOperationRepository : IDetectedOperationRepository { var query = BuildQuery(request) .Include(o => o.OperationCategory); - var entities = await query.ToArrayAsync(token); + var entities = await query.AsNoTracking().ToArrayAsync(token); var offset = telemetryService.GetTimezone(request.IdTelemetry).Offset; var dtos = entities.Select(o => Convert(o, offset)); return dtos; } - - public async Task InsertRange(int? idEditor, IEnumerable dtos, CancellationToken token) - { - if(!dtos.Any()) - return 0; - - var entities = dtos.Select(Convert); - var dbset = dbContext.Set(); - foreach(var entity in entities) - { - if (idEditor.HasValue) - entity.IdEditor = idEditor.Value; - - entity.Creation = DateTimeOffset.UtcNow; - entity.Id = default; - dbset.Add(entity); - } - - return await dbContext.SaveChangesWithExceptionHandling(token); - } - - public async Task UpdateRange(int idEditor, IEnumerable dtos, CancellationToken token) - { - if (!dtos.Any()) - return 0; - - var ids = dtos - .Select(o => o.Id) - .Distinct() - .ToArray(); - - if (ids.Any(id => id == default)) - throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь Id"); - - if (ids.Length != dtos.Count()) - throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь уникальные Id"); - - var dbSet = dbContext.Set(); - - var existingEntitiesCount = await dbSet - .Where(o => ids.Contains(o.Id)) - .CountAsync(token); - - if (ids.Length != existingEntitiesCount) - throw new ArgumentInvalidException(nameof(dtos), "Все записи должны существовать в БД"); - - var entities = dtos - .Select(dto => - { - var entity = Convert(dto); - entity.IdEditor = idEditor; - return entity; - }) - .ToArray(); - - var entries = new EntityEntry[entities.Length]; - for(var i = 0; i < entities.Length; i++) - entries[i] = dbSet.Update(entities[i]); - - var result = await dbContext.SaveChangesWithExceptionHandling(token); - - foreach (var entry in entries) - entry.State = EntityState.Detached; - - return result; - } - + private IQueryable BuildQuery(DetectedOperationByTelemetryRequest request) { var query = dbContext.Set() + .OrderBy(o => o.DateStart) + .ThenBy(o => o.DepthStart) .Where(o => o.IdTelemetry == request.IdTelemetry); if (request.IdsCategories.Any()) @@ -160,32 +108,21 @@ public class DetectedOperationRepository : IDetectedOperationRepository } if (request.SortFields?.Any() == true) - { query = query.SortBy(request.SortFields); - } - else - query = query - .OrderBy(o => o.DateStart) - .ThenBy(o => o.DepthStart); - - if (request.Skip.HasValue) - query = query.Skip((int)request.Skip); - - if (request.Take.HasValue) - query = query.Take((int)request.Take); return query; } - + private static DetectedOperationDto Convert(DetectedOperation src, TimeSpan offset) { var dto = src.Adapt(); dto.DateStart = src.DateStart.ToOffset(offset); dto.DateEnd = src.DateEnd.ToOffset(offset); + dto.EnabledSubsystems = src.EnabledSubsystems; return dto; } - private static DetectedOperation Convert(DetectedOperationDto src) + protected override DetectedOperation Convert(DetectedOperationDto src) { var entity = src.Adapt(); entity.DateStart = src.DateStart.ToUniversalTime(); diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs index 6ed731f6..00baba7f 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs @@ -162,8 +162,7 @@ public class DetectedOperationExportService private static string GetCategoryName(IEnumerable wellOperationCategories, DetectedOperationDto current) { var idCategory = current.IdCategory; - if (idCategory == WellOperationCategory.IdSlide && - EnabledSubsystemsFlags.AutoOscillation.HasEnabledSubsystems(current.EnabledSubsystems)) + if (idCategory == WellOperationCategory.IdSlide && current.EnabledSubsystems.IsAutoOscillation) return "Бурение в слайде с осцилляцией"; var category = wellOperationCategories.FirstOrDefault(o => o.Id == current.IdCategory); diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 15631c2c..167dc4de 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Exceptions; using AsbCloudInfrastructure.Services.DetectOperations.Detectors; namespace AsbCloudInfrastructure.Services.DetectOperations; @@ -80,6 +81,43 @@ public class DetectedOperationService : IDetectedOperationService return dtos; } + public async Task InsertRangeManualAsync(int idEditor, int idWell, IEnumerable dtos, CancellationToken token) + { + var idTelemetry = await GetIdTelemetryByWell(idWell, token); + + foreach (var dto in dtos) + { + dto.IdEditor = idEditor; + dto.IdTelemetry = idTelemetry; + } + + return await operationRepository.InsertRangeAsync(dtos, token); + } + + public async Task UpdateRangeManualAsync(int idEditor, int idWell, IEnumerable dtos, CancellationToken token) + { + var idTelemetry = await GetIdTelemetryByWell(idWell, token); + + foreach (var dto in dtos) + { + dto.IdEditor = idEditor; + dto.IdTelemetry = idTelemetry; + } + + return await operationRepository.UpdateRangeAsync(dtos, token); + } + + private async Task GetIdTelemetryByWell(int idWell, CancellationToken token) + { + var well = await wellService.GetOrDefaultAsync(idWell, token) ?? + throw new ArgumentInvalidException(nameof(idWell), "Well doesn`t exist"); + + var idTelemetry = well.IdTelemetry ?? + throw new ArgumentInvalidException(nameof(idWell), "У скважины отсутствует телеметрия"); + + return idTelemetry; + } + public async Task> GetCategoriesAsync(int? idWell, CancellationToken token) { if(idWell is null) @@ -213,7 +251,7 @@ public class DetectedOperationService : IDetectedOperationService return 0; var requestByTelemetry = new DetectedOperationByTelemetryRequest(well.IdTelemetry.Value, request); - var result = await operationRepository.Delete(requestByTelemetry, token); + var result = await operationRepository.DeleteAsync(requestByTelemetry, token); return result; } diff --git a/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs b/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs index e1e1212e..d001471e 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs @@ -48,7 +48,7 @@ public class WorkOperationDetection: Work var detectedOperations = await detectedOperationService.DetectOperationsAsync(telemetryId, beginDate, token); if (detectedOperations.Any()) - await detectedOperationRepository.InsertRange(null, detectedOperations, token); + await detectedOperationRepository.InsertRangeAsync(detectedOperations, token); } } } diff --git a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs index b5a94856..11d7451d 100644 --- a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs @@ -1,5 +1,4 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Data.DetectedOperation; +using AsbCloudApp.Data.DetectedOperation; using AsbCloudApp.Requests; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; @@ -7,6 +6,7 @@ using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data; using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; @@ -52,7 +52,7 @@ namespace AsbCloudWebApi.Controllers.SAUB { var idUser = await AssertUserHasAccessToWellAsync(idWell, token); - var result = await detectedOperationRepository.InsertRange(idUser, dtos, token); + var result = await detectedOperationService.InsertRangeManualAsync(idUser, idWell, dtos, token); return Ok(result); } @@ -70,7 +70,7 @@ namespace AsbCloudWebApi.Controllers.SAUB { var idUser = await AssertUserHasAccessToWellAsync(idWell, token); - var result = await detectedOperationRepository.UpdateRange(idUser, dtos, token); + var result = await detectedOperationService.UpdateRangeManualAsync(idUser, idWell, dtos, token); return Ok(result); } @@ -88,7 +88,7 @@ namespace AsbCloudWebApi.Controllers.SAUB { await AssertUserHasAccessToWellAsync(idWell, token); - var result = await detectedOperationRepository.DeleteRange(ids, token); + var result = await detectedOperationRepository.DeleteRangeAsync(ids, token); return Ok(result); } @@ -117,9 +117,8 @@ namespace AsbCloudWebApi.Controllers.SAUB /// /// [HttpGet] - [ProducesResponseType(typeof(DetectedOperationDto), StatusCodes.Status200OK)] - public async Task GetAsync(int idWell, - [FromQuery] DetectedOperationRequest request, + [ProducesResponseType(typeof(PaginationContainer), StatusCodes.Status200OK)] + public async Task GetAsync(int idWell, [FromQuery] DetectedOperationRequest request, CancellationToken token) { await AssertUserHasAccessToWellAsync(idWell, token); @@ -131,7 +130,7 @@ namespace AsbCloudWebApi.Controllers.SAUB var requestToService = new DetectedOperationByTelemetryRequest(well.IdTelemetry.Value, request); - var result = await detectedOperationRepository.Get(requestToService, token); + var result = await detectedOperationRepository.GetPageAsync(requestToService, token); return Ok(result); } From c5a9f67ea004bbb91fd23723d99767bca5c91d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 8 Apr 2024 07:27:17 +0300 Subject: [PATCH 05/14] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D0=B0?= =?UTF-8?q?=D0=BF=D0=B8=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BE=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D1=91=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Clients/IDetectedOperationClient.cs | 23 +++ .../DetectedOperationControllerTests.cs | 182 ++++++++++++++++++ 2 files changed, 205 insertions(+) create mode 100644 AsbCloudWebApi.IntegrationTests/Clients/IDetectedOperationClient.cs create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/DetectedOperationControllerTests.cs diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IDetectedOperationClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IDetectedOperationClient.cs new file mode 100644 index 00000000..ecf37d37 --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Clients/IDetectedOperationClient.cs @@ -0,0 +1,23 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.DetectedOperation; +using AsbCloudApp.Requests; +using Refit; + +namespace AsbCloudWebApi.IntegrationTests.Clients; + +public interface IDetectedOperationClient +{ + private const string BaseRoute = "/api/well/{idWell}/DetectedOperation"; + + [Post(BaseRoute)] + Task> InsertRangeAsync(int idWell, IEnumerable dtos); + + [Put(BaseRoute)] + Task> UpdateRangeAsync(int idWell, IEnumerable dtos); + + [Delete(BaseRoute)] + Task> DeleteRangeAsync(int idWell, [Body] IEnumerable ids); + + [Get(BaseRoute)] + Task>> GetAsync(int idWell, [Query] DetectedOperationRequest request); +} \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/DetectedOperationControllerTests.cs b/AsbCloudWebApi.IntegrationTests/Controllers/DetectedOperationControllerTests.cs new file mode 100644 index 00000000..5f518884 --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Controllers/DetectedOperationControllerTests.cs @@ -0,0 +1,182 @@ +using System.Net; +using AsbCloudApp.Data.DetectedOperation; +using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Requests; +using AsbCloudDb.Model; +using AsbCloudWebApi.IntegrationTests.Clients; +using AsbCloudWebApi.IntegrationTests.Data; +using Mapster; +using Microsoft.EntityFrameworkCore; +using Xunit; + +namespace AsbCloudWebApi.IntegrationTests.Controllers; + +public class DetectedOperationControllerTests : BaseIntegrationTest +{ + private readonly IDetectedOperationClient client; + + private readonly DetectedOperationDto dto = new() + { + IdCategory = WellOperationCategory.IdRotor, + DateStart = new DateTimeOffset(new DateTime(2023, 5, 12, 1,0,0, DateTimeKind.Utc)), + DateEnd = new DateTimeOffset(new DateTime(2023, 5, 12, 1,0,0, DateTimeKind.Utc)), + DepthStart = 0, + DepthEnd = 80, + OperationCategory = new WellOperationCategoryDto + { + Id = WellOperationCategory.IdRotor, + IdParent = WellOperationCategory.IdDrilling, + Name = "Бурение ротором" + }, + EnabledSubsystems = new EnabledSubsystems + { + IsAutoRotor = true + }, + Value = 400, + }; + + public DetectedOperationControllerTests(WebAppFactoryFixture factory) + : base(factory) + { + client = factory.GetAuthorizedHttpClient(string.Empty); + + dbContext.CleanupDbSet(); + } + + [Fact] + public async Task InsertRangeAsync_returns_success() + { + //arrange + var well = dbContext.Wells.First(); + dto.IdTelemetry = well.IdTelemetry!.Value; + + //act + var response = await client.InsertRangeAsync(well.Id, new[] { dto }); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Equal(1, response.Content); + } + + [Fact] + public async Task UpdateRangeAsync_returns_success() + { + //arrange + var well = dbContext.Wells.First(); + dto.IdTelemetry = well.IdTelemetry!.Value; + + var entity = dto.Adapt(); + dbContext.DetectedOperations.Add(entity); + await dbContext.SaveChangesAsync(); + dto.Id = entity.Id; + + //act + var response = await client.UpdateRangeAsync(well.Id, new[] { dto }); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Equal(1, response.Content); + } + + [Fact] + public async Task UpdateRangeAsync_returns_bad_request_when_id_is_invalid() + { + //arrange + var well = dbContext.Wells.First(); + + //act + var response = await client.UpdateRangeAsync(well.Id, new[] { dto }); + + //assert + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + } + + + [Fact] + public async Task DeleteRangeAsync_returns_success() + { + //arrange + var well = dbContext.Wells.First(); + dto.IdTelemetry = well.IdTelemetry!.Value; + + var entity = dto.Adapt(); + dbContext.DetectedOperations.Add(entity); + await dbContext.SaveChangesAsync(); + + var ids = await dbContext.DetectedOperations.Select(d => d.Id).ToArrayAsync(); + + //act + var response = await client.DeleteRangeAsync(well.Id, ids); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Equal(1, response.Content); + } + + [Fact] + public async Task GetAsync_returns_first_page() + { + //arrange + const int pageSize = 10; + const int pageIndex = 0; + + var request = new DetectedOperationRequest + { + Skip = pageIndex, + Take = pageSize, + IdsCategories = new[] { dto.IdCategory } + }; + + var well = dbContext.Wells.First(); + dto.IdTelemetry = well.IdTelemetry!.Value; + + var entity = dto.Adapt(); + dbContext.DetectedOperations.Add(entity); + await dbContext.SaveChangesAsync(); + + //act + var response = await client.GetAsync(well.Id, request); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + + var totalExpected = response.Content.Count - pageSize * pageIndex; + + Assert.Equal(totalExpected, response.Content.Items.Count()); + } + + [Fact] + public async Task GetAsync_returns_first_operation() + { + //arrange + var well = dbContext.Wells.First(); + dto.IdTelemetry = well.IdTelemetry!.Value; + + var entity = dto.Adapt(); + dbContext.DetectedOperations.Add(entity); + await dbContext.SaveChangesAsync(); + + var request = new DetectedOperationRequest + { + IdsCategories = new[] { dto.IdCategory } + }; + + //act + var response = await client.GetAsync(well.Id, request); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + + var firstOperation = response.Content.Items.ElementAt(0); + + Assert.Equal(well.IdTelemetry, firstOperation.IdTelemetry); + Assert.Equal(dto.EnabledSubsystems, firstOperation.EnabledSubsystems); + Assert.Equal(dto.DateStart.ToOffset(TimeSpan.FromHours(Defaults.Timezone.Hours)), firstOperation.DateStart); + Assert.Equal(dto.DateEnd.ToOffset(TimeSpan.FromHours(Defaults.Timezone.Hours)), firstOperation.DateEnd); + } +} \ No newline at end of file From 12a9e06f1d2e8c40178412c5245551d8d56ad294 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 8 Apr 2024 14:49:15 +0300 Subject: [PATCH 06/14] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20EnabledSubsystems?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DetectedOperation/EnabledSubsystems.cs | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs b/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs index 1183c2b8..ee3c3459 100644 --- a/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs +++ b/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs @@ -6,7 +6,7 @@ namespace AsbCloudApp.Data.DetectedOperation; public struct EnabledSubsystems { private int value; - + private EnabledSubsystems(int value) { this.value = value; @@ -25,7 +25,7 @@ public struct EnabledSubsystems /// public bool IsAutoRotor { - get => (value & (int)EnabledSubsystemsFlags.AutoRotor) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoRotor); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoRotor); } @@ -34,7 +34,7 @@ public struct EnabledSubsystems /// public bool IsAutoSlide { - get => (value & (int)EnabledSubsystemsFlags.AutoSlide) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoSlide); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoSlide); } @@ -43,7 +43,7 @@ public struct EnabledSubsystems /// public bool IsAutoConditionig { - get => (value & (int)EnabledSubsystemsFlags.AutoConditionig) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoConditionig); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoConditionig); } @@ -52,7 +52,7 @@ public struct EnabledSubsystems /// public bool IsAutoSinking { - get => (value & (int)EnabledSubsystemsFlags.AutoSinking) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoSinking); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoSinking); } @@ -61,7 +61,7 @@ public struct EnabledSubsystems /// public bool IsAutoLifting { - get => (value & (int)EnabledSubsystemsFlags.AutoLifting) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoLifting); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoLifting); } @@ -70,7 +70,7 @@ public struct EnabledSubsystems /// public bool IsAutoLiftingWithConditionig { - get => (value & (int)EnabledSubsystemsFlags.AutoLiftingWithConditionig) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoLiftingWithConditionig); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoLiftingWithConditionig); } @@ -79,7 +79,7 @@ public struct EnabledSubsystems /// public bool IsAutoBlocknig { - get => (value & (int)EnabledSubsystemsFlags.AutoBlocknig) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoBlocknig); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoBlocknig); } @@ -88,10 +88,13 @@ public struct EnabledSubsystems /// public bool IsAutoOscillation { - get => (value & (int)EnabledSubsystemsFlags.AutoOscillation) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoOscillation); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoOscillation); } + private bool IsEnabledSubsystem(EnabledSubsystemsFlags flag) => + (value & (int)flag) > 0; + private void UpdateEnabledSubsystems(bool isEnable, EnabledSubsystemsFlags flag) { if (isEnable) From 200b0e3ae596ea4cb7f2c0e4627d2d5fdc21bb33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Wed, 10 Apr 2024 06:27:51 +0300 Subject: [PATCH 07/14] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=88=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Templates/ProcessMapPlanReamTemplate.xlsx | Bin 7912 -> 48997 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Templates/ProcessMapPlanReamTemplate.xlsx b/AsbCloudInfrastructure/Services/ProcessMapPlan/Templates/ProcessMapPlanReamTemplate.xlsx index 5217eb02c2e65ad757890bc8bfef1ed4a29aa5b3..5f5be35bfd62215272aeead11ffc54df97cc49c8 100644 GIT binary patch literal 48997 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 NGPV%qAENQM{{v`ry1W1Y literal 7912 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 From ed2d4ae01b626176dcef07809adadecbc14b4eea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Wed, 10 Apr 2024 13:05:20 +0300 Subject: [PATCH 08/14] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=8D=D0=BA?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProcessMapPlan/Export/ProcessMapPlanExportService.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs index 458877d1..07cc6a13 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -26,7 +27,11 @@ public abstract class ProcessMapPlanExportService : ExportExcelService> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token) { - var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell); + var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell) + { + Moment = DateTimeOffset.UtcNow + }; + var dtos = await processMapPlanRepository.Get(request, token); return dtos; } From 80ed5f848fb781299d0465a1f2cc523cffac0a5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 11 Apr 2024 07:33:53 +0300 Subject: [PATCH 09/14] =?UTF-8?q?=D0=AE=D0=BD=D0=B8=D1=82=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnabledSubsystemsTests.cs | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs diff --git a/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs b/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs new file mode 100644 index 00000000..f949deb3 --- /dev/null +++ b/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs @@ -0,0 +1,42 @@ +using AsbCloudApp.Data.DetectedOperation; +using Xunit; + +namespace AsbCloudWebApi.Tests.Services.DetectedOperations; + +public class EnabledSubsystemsTests +{ + [Fact] + public void Create_enable_subsystem_with_the_systems_turned_off() + { + //act + EnabledSubsystems enableSubsystem = 0; + + //arrange + Assert.False(enableSubsystem.IsAutoRotor); + Assert.False(enableSubsystem.IsAutoSlide); + Assert.False(enableSubsystem.IsAutoConditionig); + Assert.False(enableSubsystem.IsAutoSinking); + Assert.False(enableSubsystem.IsAutoLifting); + Assert.False(enableSubsystem.IsAutoLiftingWithConditionig); + Assert.False(enableSubsystem.IsAutoBlocknig); + Assert.False(enableSubsystem.IsAutoOscillation); + } + + [Fact] + public void Create_detected_operation_with_with_the_auto_slide_subsystem_enabled() + { + //act + EnabledSubsystems enableSubsystem = 2; + + //arrange + Assert.True(enableSubsystem.IsAutoSlide); + + Assert.False(enableSubsystem.IsAutoRotor); + Assert.False(enableSubsystem.IsAutoConditionig); + Assert.False(enableSubsystem.IsAutoSinking); + Assert.False(enableSubsystem.IsAutoLifting); + Assert.False(enableSubsystem.IsAutoLiftingWithConditionig); + Assert.False(enableSubsystem.IsAutoBlocknig); + Assert.False(enableSubsystem.IsAutoOscillation); + } +} \ No newline at end of file From 801c4b8c49039878387be0e22662778d820491c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 11 Apr 2024 07:35:28 +0300 Subject: [PATCH 10/14] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=BD=D0=B0=D0=B7=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DetectedOperations/EnabledSubsystemsTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs b/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs index f949deb3..97f459aa 100644 --- a/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs +++ b/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs @@ -23,7 +23,7 @@ public class EnabledSubsystemsTests } [Fact] - public void Create_detected_operation_with_with_the_auto_slide_subsystem_enabled() + public void Create_enable_subsystem_with_the_auto_slide_subsystem() { //act EnabledSubsystems enableSubsystem = 2; From 8192a41d19a8bb8a3c30a3874f577f3df7c80293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 11 Apr 2024 08:12:03 +0300 Subject: [PATCH 11/14] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=81=D1=83?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=88=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/DailyReportRepository.cs | 6 ++++-- .../DailyReport/DailyReportExportService.cs | 4 ++-- .../DailyReport/DailyReportTemplate.xlsx | Bin 15806 -> 15810 bytes 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/DailyReportRepository.cs b/AsbCloudInfrastructure/Repository/DailyReportRepository.cs index f7f582fa..afa131d3 100644 --- a/AsbCloudInfrastructure/Repository/DailyReportRepository.cs +++ b/AsbCloudInfrastructure/Repository/DailyReportRepository.cs @@ -64,10 +64,12 @@ public class DailyReportRepository : CrudRepositoryBase d.IdWell == idWell && d.Date == date, cancellationToken); - return entity is null ? null : Convert(entity); + var timezoneOffset = wellService.GetTimezone(idWell).Offset; + + return entity is null ? null : Convert(entity, timezoneOffset); } - protected DailyReportDto Convert(DailyReport src, TimeSpan timezoneOffset) + private static DailyReportDto Convert(DailyReport src, TimeSpan timezoneOffset) { var dto = new DailyReportDto { diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportExportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportExportService.cs index e593da8c..05831ab1 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportExportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportExportService.cs @@ -185,11 +185,11 @@ public class DailyReportExportService : IDailyReportExportService sheet.Cell(rowСurrent, columnSubsystemName).SetCellValue(subsystem.Name); sheet.Cell(rowСurrent, columnUseSubsystemPerDayUsedTimeHours).SetCellValue(subsystem.UsagePerDay?.UsedTimeHours); sheet.Cell(rowСurrent, columnUseSubsystemPerDaySumDepthInterval).SetCellValue(subsystem.UsagePerDay?.SumDepthInterval); - sheet.Cell(rowСurrent, columnUseSubsystemPerDayKUsage).SetCellValue(subsystem.UsagePerDay?.KUsage); + sheet.Cell(rowСurrent, columnUseSubsystemPerDayKUsage).SetCellValue(subsystem.UsagePerDay?.KUsage * 100); sheet.Cell(rowСurrent, columnUseSubsystemPerWellUsedTimeHours).SetCellValue(subsystem.UsagePerWell?.UsedTimeHours); sheet.Cell(rowСurrent, columnUseSubsystemPerWellSumDepthInterval).SetCellValue(subsystem.UsagePerWell?.SumDepthInterval); - sheet.Cell(rowСurrent, columnUseSubsystemPerWellKUsage).SetCellValue(subsystem.UsagePerWell?.KUsage); + sheet.Cell(rowСurrent, columnUseSubsystemPerWellKUsage).SetCellValue(subsystem.UsagePerWell?.KUsage * 100); rowСurrent++; } diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportTemplate.xlsx b/AsbCloudInfrastructure/Services/DailyReport/DailyReportTemplate.xlsx index 54949f17caad81bdce14c9b28ecdf6ba8b071683..5201a3099c814ec0ca121bf2d28fc2e94c32045b 100644 GIT binary patch delta 7287 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 QqdLM;WLPkirT&`z7ilT^oB#j- delta 7292 zcmYjWWmr{Rx22>d4&4ocgmi<429fg6C5II0?hQzT)SlY`<`{dfwdONdmv_5&l{6`JL(8`%3p4}-6ioz#=LiT09yVOgE}k~#&YT{$ zHd`Nk$~^@RI;t9odH+3?HZA~TJ=$+il{cir|OyxpmE zz3b`qyKJf|q`BW|O8Z_KYErJ^6b)p@{K%#rovkmEnLjU1qPQJXfD6U_wzz+A??$&b z*xl@MtU_YEw<_R#WrV}WQ9}}KDf>0BaI>4Mmi7{0$8K0Rh)l{geamnjziVx4c={nL z*oVL9)lVB@`Ya+pJq~@hH4cs_<^fp`=?|q5mbfcp543g6oUaWjsD@QOOs7+N;x3rr zJ>$K{9Qe>_6Jo;>Q}gwTKZlR{_sj81hl2Uep?-$?Hs6Atj@HaTbZ;un@YHs!A_Qr) zRO|f~!25a2-E-hquDP4bLqqTP3sm*Xa;FQUyPsLDyzLf-pm>5tT2)?LAeNH^!VM8D$CJC=!eDUBipLF&>`VSfZbuH0Sf^VlX*#abk{Glg0v!)$31_$ zUUyXeJN9F_0+8ZoYqTgjC-|3mBYa>FjW8qjTG#maUhdb(4xvc%Kp^CQ|Yv~{T!!bdT%4VT1YVT>{He-^kBxrX&c%s~fa(b@ZATs{kXKpiF1IoYNk3mBY7-SPTo9N%qe_ z^U`8O)dV9v74eP@I^;Kq$4EQ z(BF2p;-JZNUHtMbi|9>5Sd0XrFo^Z&0)G`g#UA_96=|3reUbzZu{3Pne+FY_`gXBp zk|jA*jz(mq|7LS2T_{&^*hti%6u1=539+Vj>1o?9nGLC%u zuDXmCoIV+8Av0WrOqQZuUus{mPSb@TDiB>hw07^NLiaK3M^kyhpOKtNGHrumYDQAe zTOMQ`tFct`t^SHSSvM3dbvMx9FLE3KFYs^Jv?FJ&X{OXR@@+i=!3zy!2_VdyBs7H` z`z$)Oai9^gW0ag@Qd3knukfJjmx9W)HH&PWO!s#5LT*gDL}Zqit>r|a|v zpQ+1f0SQ((`05P_djYpq7)rH<>(83Lxnz8uEoZ@NHR+@)<)ShZTR`1~vWjXvT(#Gk zq}6F0;enoq996~nq_EHmol&i@Y=UVbtL*B_j`Idqy5IK7 z;rZhTB86V=W=)6R#2zNC?#616#hAJdHpfd*e;zDD z%b?da$CtvSKY0BKt9`2sdQ-rWvPVN(?HJ4?vkK>q=#fPcDYK0q5i@KxHj66DP?Il?( zDlJz?Wf>VY4Rzuux!z|6=ssgSdym~xVPEg2pXqrfQa}rlJBm~pFjEUV_-U1 zNbS52X)`7JhQ|J4E2TB=_x;?(>T0{+-Nmm}d*kfK!2(1WkrVehF6AgfUGX8@1ox5@ ztc(*`(Er-T8yWD;5aIo}z0rRh!{F-vu#%dWh{l#$_uD@UNm()K2i$eJOm$2;kO6N+ z)&WX+udPK#UfLnK+>EtH z40?NOFt>+IPcqhkO<+Orlg52q&U$BuN?0@|i=Y(oh+X;Gucdg^<$0UA(Y{>ybZw>n zTwA%_@Dcg(ozd=f?ngJ?`Iea~ie?Mav$Gr&A9w$_-Npgcem1Jyqj#i?jpAJ>Cc)7` z-$dJ8?r9KU>iC2h^Utq3xd;#tUc*jl=m5AAg|J(@s^&_73A28hp}rXm&e&UDR}X!R z<@jPbM15*B4KlBl1JyIyjvpDGqYN6dl@7U5)5Wa&=KCPvkfRC3vMagFL>1toq3z;+ z?^NBKq48^Kvhy{n5FDO4b`%vp`lcVb6gjhfe%wjd2jq%9Vuo#2z;OULlW=>-EHgXIyy(DIgE4y8)1!}MRoK&7OM zfcs(Zy@qyk)5&Es9K37M-fByMvw3CeQBhf$L=x%adbV%j*ut+o8+rJP_}pHC^Hd;d zX|&gL9zHTB2{e0qRyQ{xN8SL#huhcMqjm7+Cem?<<;vNMo4JX*WX4Qmot59XoqsGm ztBq{6w3no-4oSg2gm4c{(q z>`CS#Bab&Us;zCc-FG9)kIfu?eV6~3O4>I3`KAYNZA*Fi8HQ3lasQzA3m-zR*$#B* zJyejV1ZZlP=99ft-yvDr-VHWMD}LYnt2_y(Bj)8j+$yI`-?p)$Fq-UzUsGcm(7d9e zH3#S#*-272#Nfc{M1ehXTm4ImEAwU@zuU%Ov$k$J%sTtNFBk#t-ssh#qc=m$W z7m7%rOS}-xK9Qh>+*YTaFE|vhOtG)7L5YubZ=++@Z6~R20r(N35xwY3x$U)%r#yKf zKh=oRp~DI9R!=JYG?{OkrqfYkoVByi^P7q6QhrR3^O`)rL_xr@@J?T1bxhUhi?*>I z=}=D3j$I{c--^eC-9CCS_^k{-w>QuVqOdx15eRc<8Y+c4EuTnpU4}jvIoySvl#f|5 ziN`5pE0&?*0*0(43Y~E{TOVDXZSG=~rl3eM2gHU1VX?*rGGxVC(|XlNS1=I~a1@ZM zC)lzC?U{^{s?a{8OQrtZxDLVf{-zwE_`cETy^wU*bC$m@>v(PBBpTcpK}Tp(k-L0NXQ`OUn#t z&lMNO`55Xj?;4^)|H*?(xJThiNX5;1(kFU}OfIGmtSE#mLcdGL>yV!njH#&U6>Fb7 zaJwRZv#9PxzBXx^dAZJ)&=VH;fi?#8tlI%BLl(2cNQ(MKz5v88amwt|j1U8_sqHhh z$gx}(oQ#S)KMNy-JX1FZ5RAE6Gx)g2GD=fL$4^cZ=x%K_K_`FQe6uw;hq+Ai0_F1)e_QZ&K_AXpeXa}S& z;$&JGgo%*|DnobbzDZy(f?VD9G`RN?UA#Wa(s3lES9L@r(i__Z1oGLKAox8*f)!>% z@J-l0b<4Y$aj$QpSGY5cElUbzWMET?`0FlDS|vj4h9(AUk<=iiK%UE>qBmDaT8T_N z-n4AJsd@^hmABQsmW!6DUF;d}BP^O`c-8vuAY2(z>~Z=DM8r;X8gjbN2;MU3z7^MM z-w-46-vULKVSF3~_E0{x?9)T=96)(u7wv6mb1)Zsz%Ym2A67VB3ou^ zwaAVSL$yO4XM!k{B&advmIhg%T*389u4z|E#Vo7(=KFby$9K2-h8EWIwST*{&qh^A z+*D9nTtt`XW)tu^_!d^Ft$ulAgeY3E<)#K%V`M7sElcgZ9$OmQy{O|^=r$Zu?yP#l ztKPlMMoR`HJh}YRHlZV-`9}~YKA0LuE-yx=zJjWypUk-;@D+cM#e7)Eb4VlCo_Pfk zchIkK%t?lmG2Lsl>$S!cCq_P|u&eVYB;51S5lb(N&v1G0V)&Xf2z=yFWKa9;O5% zVkZ_S__OI&Kg|kZm-U!xEafUhX&X9v`AT+lhG+yThVbDgz;+n`amf{)H16$>t3QF% zMQpREIwdZM{WM_85i6WVs!Z@#`d^TvZiV%lqpH^gSiW@6E#Y{+~ue$zF--6r&L53 zUl#w*G~OCO1YDeHDpZk~7c)?-&`gf5^k20XwdLXlqokyS!C4wS`LX{?dDMPcCGL~dy9Hvz=Jnp`VAyCd!^Rmk12=(_^+coT#MI?PI%h`+f6xmBtR1++zx zqCCgE6pCSxlTBuMNQR-n-x?cWTfOYOU`h+0Rtb08yFRfbc3O(!2Mg8LSZC_8H6Z() zfZL6stXrIRfP+yE0oORz#sNQ-h9eiA*>w`hVgwBQ^#Z=t(kJkkG5%+H{|^j^toyDQ zD$y^198#K!>(%j4c`G+MHB+Zm4jp-ohDH}($D1#uT$;7Z%rF<*GWa?xUFN_?rB#_{ zt%Ws-P;&IGOUP~$YpajMD;Xn8y09k2m;##J!(Q_xz=t>q_xC0x3)h!X4WOK#?2=}) zuZX)>twr5|^LtZO#@Pb7o>x?QFnQv1#RqKP7F@w43GbNn=P$=cQ5*#+2Apeklrv!1 z+=BABEbgR)hW32>?c{IaJ|sq~G^F%TgW#JMn>sFO<19CqgCXWWQp?(@%T7v-mEzdY z9Fq$H2ePi~+^i2WX9jY3?x_J{$>D`l!h?9ux;FSf-dwQ+wwU*bw3<+7^%t!7W6J~` z64{aSM$)?WGtC0+$2?`@A?hoSPcQGX!y&?~O~X8m*mSqC!`S7yqNSPm<+&}W5d9NQ zIuV92j{Gt40UBk~H?6(~h@>*APKYO@=q^C@@UZ458_&F@E_0KWj&AQ%?ljt5PADJv z+(6EXCvGuz;@-`YxS-}8ly7TyK$rGv1XTU*IqtbHnPKcnE4e1i(t%g@n|x*z6Z1na za`oy=C;d389||Qkts0qd!cUXKP6+ZnPCcxX(FVBL_&t?Beo$}eGd8odwa8kL4SoX_ zW`?lk&e^3P%k)TWrS$2RY{SEPTj<2#`CbmFkQZ_8sN?R}G$C>ZPvTA}ca6u=0)5)^ zKFfBA(JqwaFbA9pE#%tsHH3i6mcg~XyHx{w;4vL{X_aOIw0=i&{PpqT3h4N=JNJ0| z+t~QA?V$_Q_a&CV61&zb6S4A_FEQ}4g3vCA{ow!)8#_@5P69J&_#|oM($Qf#18ur` zdx_J+)p<;9jL&gH1QzoWAGpzUdE@PF%ulh%`7qeSk`!XqV^?Mp_eB!bS&c4tN{a8+ zZf@&nV>F#+g_82SNJsCS(c@GAO*>HP=RIi$bDZf5d?0SF@i7qLNt{rYst3@1T}N^d zx;+XYC=%Ej@!SRPGvIq(^Inlc6w0QgZWir-D%`1mT=qjsTbR|E+6A{iVoM!w{F*D0zp2MryrrCXdu;0=3q6{tNXNsjyo$ zOcI7(_E2E)D?XSt)()=mo27(lSQ?rLPVo*O6ZpO@gN zDH64n(6Ry4L{GsGd!nsFj3BhZOY*Z73u|B|KMQ_zd8ap9*UiotPt}_#RB<9qHn>Qv+M*OUkZ`f9~{=1=qdh)w8s!L-3Ra?C}``$;!Q-DTbMy}-s z63YbbF8W)NqI42kmtJ1OvvHW)IsuQVQ+PvHwOC`Wf|NjsQrY4sAL-z5k9+;oejs>r ztVNEw|4QOUYiX|i>;=9BMKC0WqvxNxmXYtD1PU6f_&HiRBrNYkAm`qleIFl^Su^ua z|6r8#nkqcV32RXFCSNCF3Fz8|q{aPVi}{SUPM;VyA1IQnwhnH`2TYsRVFmmc$<284 zW+K+2b1@=ALmodcO4L{bhY0x+<7UP9t*8ZBbSotHEFT0sYJbAK^tkrR9uiQC<-YzIzm$FmOJ(W|0{brlP`pS9)0ih%w46jJbE&8{^D^-l!xJ;2o2}%%W$UJ8MXTed zO(NVb6WA9OCsiu8T+sDRg9*+kl@6>1_wkHgp&{pGA|CYI^HND!J8Q~#;8dI1LD22O zGXI(_V|Vxze}EyfZ;C$IR7AfjC=#k6E$7A54KzG={7eO$>R^b4X0GaBK+!~Vs^h5{ z!>)pB!MLCvr6M8Q%=H8wW>*?lDAP1JLWJ8sJ6DD(N7igOy6-?vwSX$2|aA=AV^uB{wa<+gD&~ic=$8N*nAnok;oY`aJE(U zu-6*#1rl(w6sTXZ#dnymGJ@4O79sM)m0dP7g~TbLBr+SnbUOd6M=S#0Is)WcE>`q` zLhU^qX%SSO|Gak3If=?mV14K|QCmF3FuYp6Y0S z!jm$Je&R;+L4SXjoQ$6)bo`9l4|T&f_pkbkcNW^dGZQ2bHsZ21t*>WQdj+w~;_UdfY7mseo>-X$)-ldnGAl&p zZ7RltA5)ml1SpiC-+EdsUvQ^-=QC5AYuOt75mKmIo*yLsB6L(e4!6YLUrtR_B{S5LIMWTK`}g@M85b!fZu-%N zFW&xyq}FOVZQXpix8sMMZ0_~B+RQ4Nzw$BcMS3%93Q2n=eH~`3Y?cH*So%iAW^cq? z4eLMtXq Date: Thu, 11 Apr 2024 09:37:11 +0300 Subject: [PATCH 12/14] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B8=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?,=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B9=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D1=8F=D0=B5=D1=82=20=D0=BF=D0=B0=D0=B3?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D1=86=D0=B8=D1=8E=20=D0=B2=20=D0=93=D0=93?= =?UTF-8?q?=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Clients/IWellOperationClient.cs | 2 +- .../WellOperationControllerTest.cs | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs index 84906a77..b9e63518 100644 --- a/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs +++ b/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs @@ -19,7 +19,7 @@ public interface IWellOperationClient Task> UpdateRangeAsync(int idWell, [Body] IEnumerable dtos); [Get(BaseRoute)] - Task>> GetPageOperationsPlanAsync(int idWell, [Query] WellOperationRequestBase request); + Task>> GetPageOperationsAsync(int idWell, [Query] WellOperationRequestBase request); [Multipart] [Post(BaseRoute + "/parse/{idType}")] diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs index 4d6dd3c0..1a700189 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs @@ -89,9 +89,12 @@ public class WellOperationControllerTest : BaseIntegrationTest /// /// [Fact] - public async Task GetPageOperationsPlanAsync_returns_success() + public async Task GetPageOperationsAsync_returns_first_page() { //arrange + const int pageSize = 10; + const int pageIndex = 0; + var well = await dbContext.Wells.FirstAsync(); var entity = CreateWellOperation(well.Id); dbContext.WellOperations.Add(entity); @@ -104,17 +107,22 @@ public class WellOperationControllerTest : BaseIntegrationTest var request = new WellOperationRequestBase { - OperationType = WellOperation.IdOperationTypePlan + OperationType = WellOperation.IdOperationTypePlan, + Skip = pageIndex, + Take = pageSize, }; //act - var response = await client.GetPageOperationsPlanAsync(well.Id, request); + var response = await client.GetPageOperationsAsync(well.Id, request); //assert Assert.Equal(response.StatusCode, HttpStatusCode.OK); Assert.NotNull(response.Content); - Assert.Single(response.Content.Items); + var totalExpected = response.Content.Count - pageSize * pageIndex; + Assert.Equal(totalExpected, response.Content.Items.Count()); + + Assert.Single(response.Content.Items); var actualDto = response.Content.Items.First(); MatchHelper.Match(dto, actualDto); From 0f4a579e70e917dde13856946d9b3f23f4a71c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 11 Apr 2024 11:59:20 +0300 Subject: [PATCH 13/14] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=BE=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=87=D1=87=D0=B8=D0=B2=D0=B0=D1=8E=D1=89?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Services/LimitingParameterService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/Services/LimitingParameterService.cs b/AsbCloudInfrastructure/Services/LimitingParameterService.cs index 5dee9f53..808df22f 100644 --- a/AsbCloudInfrastructure/Services/LimitingParameterService.cs +++ b/AsbCloudInfrastructure/Services/LimitingParameterService.cs @@ -18,10 +18,10 @@ namespace AsbCloudInfrastructure.Services private readonly Dictionary feedRegulatorData = new () { { LimitingParameterDto.NoLimit, "Нет ограничения" }, - { LimitingParameterDto.RopPlan, "МСП" }, + { LimitingParameterDto.RopPlan, "Скорость блока" }, { LimitingParameterDto.Pressure, "Давление" }, { LimitingParameterDto.AxialLoad, "Осевая нагрузка" }, - { LimitingParameterDto.RotorTorque, "Момент" } + { LimitingParameterDto.RotorTorque, "Момент на роторе" } }; public LimitingParameterService(ILimitingParameterRepository limitingParameterRepository, From b734ed929eb5a85c2c248b1c8699140b83aeaba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 12 Apr 2024 09:47:17 +0300 Subject: [PATCH 14/14] Fix well service --- .../Services/SAUB/TelemetryDataCache.cs | 13 +++++++------ AsbCloudInfrastructure/Services/WellService.cs | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs index a75c7bf3..0dcfe080 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs @@ -148,17 +148,18 @@ namespace AsbCloudInfrastructure.Services.SAUB { if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem)) return null; - - var from = cacheItem.FirstByDate?.DateTime; + if (!cacheItem.LastData.Any()) return null; + var from = cacheItem.FirstByDate.DateTime; var to = cacheItem.LastData[^1].DateTime; - from = from ?? cacheItem.LastData[0].DateTime; - return new DatesRangeDto { - From = from.Value.ToUtcDateTimeOffset(cacheItem.TimezoneHours), - To = to.ToUtcDateTimeOffset(cacheItem.TimezoneHours) }; + return new DatesRangeDto + { + From = new DateTimeOffset(from, TimeSpan.FromHours(cacheItem.TimezoneHours)), + To = new DateTimeOffset(to, TimeSpan.FromHours(cacheItem.TimezoneHours)) + }; } public DatesRangeDto? GetOrDefaultCachedDateRange(int idTelemetry) diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 6ed241a0..795d944b 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -71,7 +71,7 @@ namespace AsbCloudInfrastructure.Services return DateTimeOffset.MinValue; var datesRange = telemetryService.GetDatesRange(well.IdTelemetry.Value); - return datesRange.To.DateTime; + return datesRange.To; } ///