From 410ef56f184c0c20d020aae80046555b9705ea27 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, 6 Dec 2023 16:43:28 +0500 Subject: [PATCH 01/30] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B0=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82?= =?UTF-8?q?=D0=BC=D0=B0=20=D1=80=D0=B0=D1=81=D1=87=D1=91=D1=82=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D0=90?= =?UTF-8?q?=D0=9F=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/DetectedOperation/OperationsSummaryDto.cs | 5 +++++ .../DetectOperations/DetectedOperationService.cs | 5 +++-- .../Subsystems/SubsystemOperationTimeService.cs | 10 ++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/AsbCloudApp/Data/DetectedOperation/OperationsSummaryDto.cs b/AsbCloudApp/Data/DetectedOperation/OperationsSummaryDto.cs index 74f755cc..74fe1e7b 100644 --- a/AsbCloudApp/Data/DetectedOperation/OperationsSummaryDto.cs +++ b/AsbCloudApp/Data/DetectedOperation/OperationsSummaryDto.cs @@ -29,4 +29,9 @@ public class OperationsSummaryDto /// Cумма продолжительностей операций /// public double SumDurationHours { get; set; } + + /// + /// Флаг включенной подсистемы + /// + public int EnabledSubsystems { get; set; } } diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index a164cb4e..65b4722c 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -104,14 +104,15 @@ namespace AsbCloudInfrastructure.Services.DetectOperations query = query.Where(operation => operation.DepthEnd <= request.LeDepthEnd.Value); var queryGroup = query - .GroupBy(operation => new { operation.IdTelemetry, operation.IdCategory }) + .GroupBy(operation => new { operation.IdTelemetry, operation.IdCategory, operation.EnabledSubsystems }) .Select(group => new OperationsSummaryDto { IdTelemetry = group.Key.IdTelemetry, IdCategory = group.Key.IdCategory, + EnabledSubsystems = group.Key.EnabledSubsystems, Count = group.Count(), SumDepthIntervals = group.Sum(operation => operation.DepthEnd - operation.DepthStart), - SumDurationHours = group.Sum(operation => (operation.DateEnd - operation.DateStart).TotalHours) + SumDurationHours = group.Sum(operation => (operation.DateEnd - operation.DateStart).TotalHours), }) .OrderBy(summ => summ.IdTelemetry) .ThenBy(summ => summ.IdCategory); diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 8164da4c..fc2d8f71 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -156,9 +156,7 @@ internal class SubsystemOperationTimeService : ISubsystemOperationTimeService var groupedSubsystemsTimes = subsystemsTimes .OrderBy(o => o.Id) .GroupBy(o => o.IdSubsystem); - - var periodGroupTotal = subsystemsTimes.Sum(o => (o.DateEnd - o.DateStart).TotalHours); - + var result = groupedSubsystemsTimes.Select(g => { var periodGroup = g.Sum(o => (o.DateEnd - o.DateStart).TotalHours); @@ -193,7 +191,11 @@ internal class SubsystemOperationTimeService : ISubsystemOperationTimeService SumDepthInterval = apdParts.Sum(part => part.SumDepthInterval), OperationCount = apdParts.Sum(part => part.OperationCount), }; - apdSum.KUsage = apdSum.SumDepthInterval / apdSum.SumOperationDepthInterval; + + operationsSummaries = operationsSummaries.Where(o => o.EnabledSubsystems == 1); + + var (_, sumOprationsDurationHours) = AggregateOperationsSummaries(IdSubsystemAKBRotor, operationsSummaries); + apdSum.KUsage = sumOprationsDurationHours / apdSum.SumOperationDurationHours; if (apdSum.KUsage > 1) apdSum.KUsage = 1; result = result.Append(apdSum).OrderBy(m => m.IdSubsystem); From 866cc4c0667bef1d3f4ff7b911076781b1c5a633 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: Sat, 16 Dec 2023 12:31:42 +0500 Subject: [PATCH 02/30] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE?= =?UTF-8?q?=D0=BF=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 1. Фикс расчетов 2. Добавлен новый флаг включенной подсистемы --- AsbCloudDb/Model/DetectedOperation.cs | 4 +++ .../DetectedOperationExportService.cs | 3 +-- .../Detectors/DetectorAbstract.cs | 14 +++++++--- .../Detectors/DetectorDrilling.cs | 26 ++++++++++++++----- 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/AsbCloudDb/Model/DetectedOperation.cs b/AsbCloudDb/Model/DetectedOperation.cs index 7300eb59..d2498ece 100644 --- a/AsbCloudDb/Model/DetectedOperation.cs +++ b/AsbCloudDb/Model/DetectedOperation.cs @@ -92,6 +92,10 @@ namespace AsbCloudDb.Model /// блокировка /// AutoBlocknig = 1 << 6, + /// + /// Спин-мастер + /// + AutoSpin = 1 << 7, } /// diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs index 15dab40f..f833ae7d 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs @@ -152,8 +152,7 @@ public class DetectedOperationExportService { var idCategory = current.IdCategory; if (idCategory == WellOperationCategory.IdSlide - && current.ExtraData[DetectorDrilling.ExtraDataKeyHasOscillation] is bool hasOscillation - && hasOscillation) + && current.HasSubsystemFlag(DetectedOperation.EnabledSubsystemsFlags.AutoSpin)) return "Бурение в слайде с осцилляцией"; var category = wellOperationCategories.FirstOrDefault(o => o.Id == current.IdCategory); diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs index 6da769bf..0fde1096 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs @@ -1,7 +1,6 @@ using AsbCloudDb.Model; using System; using System.Collections.Generic; -using System.Linq; namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors { @@ -126,7 +125,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors DepthEnd = (double)pEnd.WellDepth, ExtraData = ExtraData, Value = CalcValue(telemetry, begin, end), - EnabledSubsystems = DetectEnabledSubsystems(telemetry, begin, end) + EnabledSubsystems = DetectEnabledSubsystems(telemetry, begin, end, ExtraData) }; return operation; @@ -155,10 +154,19 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors /// /// /// + /// /// - private static int DetectEnabledSubsystems(DetectableTelemetry[] telemetry, int begin, int end) + private static int DetectEnabledSubsystems(DetectableTelemetry[] telemetry, int begin, int end, IDictionary extraData) { var enabledSubsystems = 0; + + if(extraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out var hasOscillation) + && hasOscillation is true) + { + enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSpin; + + return enabledSubsystems; + } for (var i = begin; i < end; i += 2) { diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs index 56aa2fd4..a26d04af 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Drawing; using System.Linq; using AsbCloudDb.Model; @@ -65,14 +64,27 @@ public class DetectorDrilling : DetectorAbstract { [ExtraDataKeyAvgRotorSpeed] = avgRotorSpeed, [ExtraDataKeyDispersionOfNormalizedRotorSpeed] = dispersionOfNormalizedRotorSpeed, - [ExtraDataKeyHasOscillation] = dispersionOfNormalizedRotorSpeed > dispersionOfNormalizedRotorSpeedThreshold + [ExtraDataKeyHasOscillation] = avgRotorSpeed > 5 && dispersionOfNormalizedRotorSpeed > dispersionOfNormalizedRotorSpeedThreshold }; return (idCategory, extraData); } private static (double avgRotorSpeed, double dispersionOfNormalizedRotorSpeed) CalcCriteries(DetectableTelemetry[] telemetry, int begin, int end) { - var telemetryRange = telemetry[begin..end]; + var telemetryRange = telemetry[begin..end] + .OrderBy(t => t.DateTime).ToList(); + + for (var i = telemetryRange.Count - 1; i >= 0 && telemetryRange.Count > 1; i--) + { + if (Math.Abs(telemetryRange[i].WellDepth - telemetryRange[i - 1].WellDepth) < 0.001d) + { + telemetryRange.RemoveAt(i); + continue; + } + + break; + } + var avgRotorSpeed = telemetryRange.Average(t => t.RotorSpeed); var dispersion = telemetryRange.Average(t => Math.Pow(t.RotorSpeed / avgRotorSpeed - 1, 2)); return (avgRotorSpeed, dispersion); @@ -85,10 +97,10 @@ public class DetectorDrilling : DetectorAbstract if (avgRotorSpeed < 5) return WellOperationCategory.IdSlide; - if (dispersionOfNormalizedRotorSpeed < dispersionOfNormalizedRotorSpeedThreshold) + if(dispersionOfNormalizedRotorSpeed < dispersionOfNormalizedRotorSpeedThreshold) return WellOperationCategory.IdRotor; - else - return idSlideWithOscillation; - } + + return idSlideWithOscillation; + } } \ No newline at end of file From 72ec8c69d34fce830deb02b3aada1be644d98823 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: Sat, 16 Dec 2023 12:39:41 +0500 Subject: [PATCH 03/30] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...231216060437_Update_Subsystems.Designer.cs | 9015 +++++++++++++++++ .../20231216060437_Update_Subsystems.cs | 71 + .../AsbCloudDbContextModelSnapshot.cs | 78 +- AsbCloudDb/Model/AsbCloudDbContext.cs | 2 - .../DefaultData/EntityFillerSubsystem.cs | 4 +- AsbCloudDb/Model/IAsbCloudDbContext.cs | 2 - .../Model/{Subsystems => }/Subsystem.cs | 4 +- .../Subsystems/SubsystemOperationTime.cs | 41 - 8 files changed, 9091 insertions(+), 126 deletions(-) create mode 100644 AsbCloudDb/Migrations/20231216060437_Update_Subsystems.Designer.cs create mode 100644 AsbCloudDb/Migrations/20231216060437_Update_Subsystems.cs rename AsbCloudDb/Model/{Subsystems => }/Subsystem.cs (93%) delete mode 100644 AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs diff --git a/AsbCloudDb/Migrations/20231216060437_Update_Subsystems.Designer.cs b/AsbCloudDb/Migrations/20231216060437_Update_Subsystems.Designer.cs new file mode 100644 index 00000000..a09d316b --- /dev/null +++ b/AsbCloudDb/Migrations/20231216060437_Update_Subsystems.Designer.cs @@ -0,0 +1,9015 @@ +// +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("20231216060437_Update_Subsystems")] + partial class Update_Subsystems + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.25") + .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"); + + b.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"); + + b.HasComment("Контакты"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .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"); + + b.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"); + + b.HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", 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") + .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("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"); + + 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("части программ бурения"); + }); + + 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"); + + b.HasComment("Drill_test"); + }); + + 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"); + + b.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"); + + b.HasComment("Категории файлов"); + + b.HasData( + new + { + Id = 1, + Name = "Растворный сервис", + ShortName = "fluidService" + }, + new + { + Id = 2, + Name = "Цементирование", + ShortName = "cement" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "nnb" + }, + new + { + Id = 4, + Name = "ГТИ", + ShortName = "gti" + }, + new + { + Id = 5, + Name = "Документы по скважине", + ShortName = "wellDocuments" + }, + new + { + Id = 6, + Name = "Супервайзер", + ShortName = "supervisor" + }, + new + { + Id = 7, + Name = "Мастер", + ShortName = "master" + }, + new + { + Id = 8, + Name = "Долотный сервис", + ShortName = "toolService" + }, + new + { + Id = 9, + Name = "Буровой подрядчик", + ShortName = "drillService" + }, + new + { + Id = 10, + Name = "Сервис по заканчиванию скважины", + ShortName = "closingService" + }, + new + { + Id = 12, + Name = "Рапорт", + ShortName = "report" + }, + new + { + Id = 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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapWellDrilling", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + 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") + .HasColumnType("text") + .HasColumnName("comment") + .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("IdMode") + .HasColumnType("integer") + .HasColumnName("id_mode") + .HasComment("Id режима (1- ротор, 2 слайд)"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("LastUpdate") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_update") + .HasComment("Дата последнего изменения"); + + b.Property("PressureLimitMax") + .HasColumnType("double precision") + .HasColumnName("pressure_limit_max") + .HasComment("Перепад давления, допустимый максимум"); + + b.Property("PressurePlan") + .HasColumnType("double precision") + .HasColumnName("pressure_plan") + .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("IdUser"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map_well_drilling"); + + b.HasComment("РТК бурение скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapWellReam", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина по стволу до, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина по стволу от, м"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("LastUpdate") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_update") + .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("IdUser"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map_well_ream"); + + b.HasComment("РТК проработка скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("IdCompany", "IdWell"); + + b.HasIndex("IdWell"); + + b.ToTable("t_relation_company_well"); + + b.HasComment("отношение скважин и компаний"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.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"); + + b.HasComment("Отношение пользователей и частей ПБ"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission"); + + b.HasComment("Отношение ролей пользователей и разрешений доступа"); + + 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 + }); + }); + + 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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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.ToView("mw_telemetry_datas_saub_stat"); + }); + + 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"); + + b.HasComment("набор основных данных по SpinMaster"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.Property("MessageTemplate") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message_template"); + + b.HasKey("IdTelemetry", "IdEvent"); + + b.ToTable("t_telemetry_event"); + + b.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + 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"); + + b.HasComment("Сообщения на буровых"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname"); + + b.HasKey("IdTelemetry", "IdUser"); + + b.ToTable("t_telemetry_user"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.HasComment("настройки интерфейса пользователя"); + }); + + 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"); + + b.HasComment("скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины получателя"); + + b.Property("IdWellSrc") + .HasColumnType("integer") + .HasColumnName("id_well_src") + .HasComment("Id скважины композита"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции композита"); + + b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); + + b.HasIndex("IdWellSectionType"); + + b.HasIndex("IdWellSrc"); + + b.ToTable("t_well_composite"); + + b.HasComment("Композитная скважина"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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.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"); + + b.HasComment("конструкция скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Наклонно-направленная" + }, + new + { + Id = 2, + Caption = "Горизонтальная" + }); + }); + + 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"); + + 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.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.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.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") + .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.ProcessMapWellDrilling", 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.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapWellReam", 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.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + 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.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/20231216060437_Update_Subsystems.cs b/AsbCloudDb/Migrations/20231216060437_Update_Subsystems.cs new file mode 100644 index 00000000..40643d71 --- /dev/null +++ b/AsbCloudDb/Migrations/20231216060437_Update_Subsystems.cs @@ -0,0 +1,71 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class Update_Subsystems : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "t_subsystem_operation_time"); + + migrationBuilder.DeleteData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 2); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "t_subsystem_operation_time", + columns: table => new + { + id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + id_subsystem = table.Column(type: "integer", nullable: false), + id_telemetry = table.Column(type: "integer", nullable: false, comment: "ИД телеметрии по которой выдается информация"), + date_end = table.Column(type: "timestamp with time zone", nullable: false, comment: "дата/время выключения подсистемы"), + date_start = table.Column(type: "timestamp with time zone", nullable: false, comment: "дата/время включения подсистемы"), + depth_end = table.Column(type: "real", nullable: true, comment: "глубина забоя на момент выключения подсистемы"), + depth_start = table.Column(type: "real", nullable: true, comment: "глубина забоя на момент включения подсистемы") + }, + constraints: table => + { + table.PrimaryKey("PK_t_subsystem_operation_time", x => x.id); + table.ForeignKey( + name: "FK_t_subsystem_operation_time_t_subsystem_id_subsystem", + column: x => x.id_subsystem, + principalTable: "t_subsystem", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_t_subsystem_operation_time_t_telemetry_id_telemetry", + column: x => x.id_telemetry, + principalTable: "t_telemetry", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }, + comment: "наработки подсистем"); + + migrationBuilder.InsertData( + table: "t_subsystem", + columns: new[] { "id", "description", "name" }, + values: new object[] { 2, "Алгоритм поиска оптимальных параметров бурения САУБ", "MSE" }); + + migrationBuilder.CreateIndex( + name: "IX_t_subsystem_operation_time_id_subsystem", + table: "t_subsystem_operation_time", + column: "id_subsystem"); + + migrationBuilder.CreateIndex( + name: "IX_t_subsystem_operation_time_id_telemetry", + table: "t_subsystem_operation_time", + column: "id_telemetry"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 018f140a..01393838 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -1,12 +1,12 @@ // using System; -using System.Collections.Generic; using System.Text.Json; using AsbCloudDb.Model; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using System.Collections.Generic; #nullable disable @@ -4521,7 +4521,7 @@ namespace AsbCloudDb.Migrations b.HasComment("Запросы на изменение уставок панели оператора"); }); - modelBuilder.Entity("AsbCloudDb.Model.Subsystems.Subsystem", b => + modelBuilder.Entity("AsbCloudDb.Model.Subsystem", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -4567,12 +4567,6 @@ namespace AsbCloudDb.Migrations Name = "АПД слайд" }, new - { - Id = 2, - Description = "Алгоритм поиска оптимальных параметров бурения САУБ", - Name = "MSE" - }, - new { Id = 65536, Description = "Осцилляция", @@ -4586,55 +4580,6 @@ namespace AsbCloudDb.Migrations }); }); - modelBuilder.Entity("AsbCloudDb.Model.Subsystems.SubsystemOperationTime", 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") - .HasComment("дата/время выключения подсистемы"); - - b.Property("DateStart") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_start") - .HasComment("дата/время включения подсистемы"); - - b.Property("DepthEnd") - .HasColumnType("real") - .HasColumnName("depth_end") - .HasComment("глубина забоя на момент выключения подсистемы"); - - b.Property("DepthStart") - .HasColumnType("real") - .HasColumnName("depth_start") - .HasComment("глубина забоя на момент включения подсистемы"); - - b.Property("IdSubsystem") - .HasColumnType("integer") - .HasColumnName("id_subsystem"); - - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry") - .HasComment("ИД телеметрии по которой выдается информация"); - - b.HasKey("Id"); - - b.HasIndex("IdSubsystem"); - - b.HasIndex("IdTelemetry"); - - b.ToTable("t_subsystem_operation_time"); - - b.HasComment("наработки подсистем"); - }); - modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => { b.Property("Id") @@ -8602,25 +8547,6 @@ namespace AsbCloudDb.Migrations b.Navigation("Well"); }); - modelBuilder.Entity("AsbCloudDb.Model.Subsystems.SubsystemOperationTime", b => - { - b.HasOne("AsbCloudDb.Model.Subsystems.Subsystem", "Subsystem") - .WithMany() - .HasForeignKey("IdSubsystem") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Subsystem"); - - b.Navigation("Telemetry"); - }); - modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => { b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 43ede314..11450f65 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -1,5 +1,4 @@ using AsbCloudDb.Model.GTR; -using AsbCloudDb.Model.Subsystems; using Microsoft.EntityFrameworkCore; using System.Threading; using System.Threading.Tasks; @@ -37,7 +36,6 @@ namespace AsbCloudDb.Model public virtual DbSet ReportProperties => Set(); public virtual DbSet SetpointsRequests => Set(); public virtual DbSet Subsystems => Set(); - public virtual DbSet SubsystemOperationTimes => Set(); public virtual DbSet Telemetries => Set(); public virtual DbSet TelemetryDataSaub => Set(); public virtual DbSet TelemetryDataSaubStats => Set(); diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs b/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs index 71f81426..12d1d05a 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs @@ -1,5 +1,4 @@ -using AsbCloudDb.Model.Subsystems; -namespace AsbCloudDb.Model.DefaultData +namespace AsbCloudDb.Model.DefaultData { internal class EntityFillerSubsystem : EntityFiller { @@ -8,7 +7,6 @@ namespace AsbCloudDb.Model.DefaultData new () {Id = 1, Name = "АКБ", Description = "Совместная работа режимов \"Бурение в роторе\" и \"Бурение в слайде\""}, new () {Id = 11, Name = "АПД ротор", Description = "Режим работы \"Бурение в роторе\""}, new () {Id = 12, Name = "АПД слайд", Description = "Режим работы \"Бурение в слайде\""}, - new () {Id = 2, Name = "MSE", Description = "Алгоритм поиска оптимальных параметров бурения САУБ"}, //Spin master - id подсистем с 65_536 до 131_071 new () {Id = 65536, Name = "Осцилляция", Description = "Осцилляция"}, new () {Id = 65537, Name = "Демпфер", Description = "Демпфер"} diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index f19a1927..0317fb31 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -1,5 +1,4 @@ using AsbCloudDb.Model.GTR; -using AsbCloudDb.Model.Subsystems; using AsbCloudDb.Model.WITS; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; @@ -40,7 +39,6 @@ namespace AsbCloudDb.Model DbSet RelationContactsWells { get; } DbSet ReportProperties { get; } DbSet Subsystems { get; } - DbSet SubsystemOperationTimes { get; } DbSet Telemetries { get; } DbSet TelemetryDataSaub { get; } DbSet TelemetryDataSaubStats { get; } diff --git a/AsbCloudDb/Model/Subsystems/Subsystem.cs b/AsbCloudDb/Model/Subsystem.cs similarity index 93% rename from AsbCloudDb/Model/Subsystems/Subsystem.cs rename to AsbCloudDb/Model/Subsystem.cs index 37ac9fed..cbb0539c 100644 --- a/AsbCloudDb/Model/Subsystems/Subsystem.cs +++ b/AsbCloudDb/Model/Subsystem.cs @@ -1,8 +1,8 @@ using System.ComponentModel.DataAnnotations; -using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations.Schema; +using Microsoft.EntityFrameworkCore; -namespace AsbCloudDb.Model.Subsystems +namespace AsbCloudDb.Model { [Table("t_subsystem"), Comment("Описание подсистем")] public class Subsystem : IId diff --git a/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs b/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs deleted file mode 100644 index 9fd1833c..00000000 --- a/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -using System.Text.Json.Serialization; - -namespace AsbCloudDb.Model.Subsystems -{ - [Table("t_subsystem_operation_time"), Comment("наработки подсистем")] - public partial class SubsystemOperationTime : IId - { - [Column("id"), Key] - public int Id { get; set; } - - [Column("id_telemetry"), Comment("ИД телеметрии по которой выдается информация")] - public int IdTelemetry { get; set; } - - [Column("id_subsystem")] - public int IdSubsystem { get; set; } - - [Column("date_start"), Comment("дата/время включения подсистемы")] - public DateTimeOffset DateStart { get; set; } - - [Column("date_end"), Comment("дата/время выключения подсистемы")] - public DateTimeOffset DateEnd { get; set; } - - [Column("depth_start"), Comment("глубина забоя на момент включения подсистемы")] - public float? DepthStart { get; set; } - - [Column("depth_end"), Comment("глубина забоя на момент выключения подсистемы")] - public float? DepthEnd { get; set; } - - [JsonIgnore] - [ForeignKey(nameof(IdSubsystem))] - public virtual Subsystem Subsystem { get; set; } = null!; - - [JsonIgnore] - [ForeignKey(nameof(IdTelemetry))] - public virtual Telemetry Telemetry { get; set; } = null!; - } -} From f300974b1d17dbf78d8b05a3858f472d6bd954a5 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: Sat, 16 Dec 2023 13:13:18 +0500 Subject: [PATCH 04/30] =?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=20=D1=84=D0=BB=D0=B0=D0=B3?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=8B?= =?UTF-8?q?=20=D0=B2=20DetectedOperation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudDb/Model/DetectedOperation.cs | 2 +- .../Services/DetectOperations/DetectedOperationExportService.cs | 2 +- .../Services/DetectOperations/Detectors/DetectorAbstract.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AsbCloudDb/Model/DetectedOperation.cs b/AsbCloudDb/Model/DetectedOperation.cs index d2498ece..6245780c 100644 --- a/AsbCloudDb/Model/DetectedOperation.cs +++ b/AsbCloudDb/Model/DetectedOperation.cs @@ -95,7 +95,7 @@ namespace AsbCloudDb.Model /// /// Спин-мастер /// - AutoSpin = 1 << 7, + AutoSpinMaster = 1 << 7, } /// diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs index f833ae7d..c158d5d2 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs @@ -152,7 +152,7 @@ public class DetectedOperationExportService { var idCategory = current.IdCategory; if (idCategory == WellOperationCategory.IdSlide - && current.HasSubsystemFlag(DetectedOperation.EnabledSubsystemsFlags.AutoSpin)) + && current.HasSubsystemFlag(DetectedOperation.EnabledSubsystemsFlags.AutoSpinMaster)) return "Бурение в слайде с осцилляцией"; var category = wellOperationCategories.FirstOrDefault(o => o.Id == current.IdCategory); diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs index 0fde1096..ea2c3bba 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs @@ -163,7 +163,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors if(extraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out var hasOscillation) && hasOscillation is true) { - enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSpin; + enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSpinMaster; return enabledSubsystems; } From 5fb9375955fc6522fd5a711a7f91c4ccf5df28e1 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: Sat, 16 Dec 2023 13:22:23 +0500 Subject: [PATCH 05/30] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D1=87=D0=B5=D1=82=D1=8B=20=D0=BD=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Subsystems/SubsystemActiveWellStatDto.cs | 50 +-- .../Subsystems/SubsystemOperationTimeDto.cs | 38 -- ...TimeRequest.cs => SubsystemTimeRequest.cs} | 37 +- AsbCloudApp/Services/ISubsystemService.cs | 40 ++ .../ISubsystemOperationTimeService.cs | 68 --- .../Model/DefaultData/DefaultContextData.cs | 2 +- .../WorkSubsystemAbfOperationTimeCalc.cs | 127 ------ .../WorkSubsystemOperationTimeCalcAbstract.cs | 102 ----- ...rkSubsystemOscillationOperationTimeCalc.cs | 186 -------- AsbCloudInfrastructure/DependencyInjection.cs | 4 +- .../DailyReport/DailyReportService.cs | 23 +- .../SubsystemOperationTimeService.cs | 397 ------------------ .../Services/Subsystems/SubsystemService.cs | 218 ++++++++++ .../Services/Subsystems/SybsystemDetector.cs | 56 --- .../Services/WellInfoService.cs | 8 +- AsbCloudInfrastructure/Startup.cs | 2 - .../Services/DailyReportServiceTest.cs | 11 +- .../Subsystems/SubsystemController.cs | 92 ++++ .../SubsystemOperationTimeController.cs | 162 ------- 19 files changed, 401 insertions(+), 1222 deletions(-) delete mode 100644 AsbCloudApp/Data/Subsystems/SubsystemOperationTimeDto.cs rename AsbCloudApp/Requests/{SubsystemOperationTimeRequest.cs => SubsystemTimeRequest.cs} (56%) create mode 100644 AsbCloudApp/Services/ISubsystemService.cs delete mode 100644 AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs delete mode 100644 AsbCloudInfrastructure/Background/PeriodicWorks/WorkSubsystemAbfOperationTimeCalc.cs delete mode 100644 AsbCloudInfrastructure/Background/PeriodicWorks/WorkSubsystemOperationTimeCalcAbstract.cs delete mode 100644 AsbCloudInfrastructure/Background/PeriodicWorks/WorkSubsystemOscillationOperationTimeCalc.cs delete mode 100644 AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs create mode 100644 AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs delete mode 100644 AsbCloudInfrastructure/Services/Subsystems/SybsystemDetector.cs create mode 100644 AsbCloudWebApi/Controllers/Subsystems/SubsystemController.cs delete mode 100644 AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs index 4032358f..8636c252 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs @@ -1,30 +1,24 @@ -using System.Collections.Generic; -namespace AsbCloudApp.Data.Subsystems +namespace AsbCloudApp.Data.Subsystems; + +/// +/// Статистика наработки подсистем по активным скважинам +/// +public class SubsystemActiveWellStatDto { - /// - /// Статистика наработки подсистем по активным скважинам - /// - public class SubsystemActiveWellStatDto - { - /// - /// Активная скважина - /// - public WellInfoDto Well { get; set; } = null!; - /// - /// Наработки подсистемы АКБ - /// - public SubsystemStatDto? SubsystemAKB { get; set; } - /// - /// Наработки подсистемы МСЕ - /// - public SubsystemStatDto? SubsystemMSE { get; set; } - /// - /// Наработки подсистемы СПИН - /// - public SubsystemStatDto? SubsystemSpinMaster { get; set; } - /// - /// Наработки подсистемы ТОРК - /// - public SubsystemStatDto? SubsystemTorqueMaster { get; set; } - } + /// + /// Активная скважина + /// + public WellInfoDto Well { get; set; } = null!; + /// + /// Наработки подсистемы АПД + /// + public SubsystemStatDto? SubsystemAPD { get; set; } + /// + /// Наработки подсистемы СПИН + /// + public SubsystemStatDto? SubsystemSpinMaster { get; set; } + /// + /// Наработки подсистемы ТОРК + /// + public SubsystemStatDto? SubsystemTorqueMaster { get; set; } } \ No newline at end of file diff --git a/AsbCloudApp/Data/Subsystems/SubsystemOperationTimeDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemOperationTimeDto.cs deleted file mode 100644 index 50a373d0..00000000 --- a/AsbCloudApp/Data/Subsystems/SubsystemOperationTimeDto.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -namespace AsbCloudApp.Data.Subsystems -{ - /// - /// Модель информации о работе подсистемы - /// - public class SubsystemOperationTimeDto:IId - { - /// - /// Идентификатор - /// - public int Id { get; set; } - /// - /// идентификатор подсистемы - /// - public int IdSubsystem { get; set; } - /// - /// Название подсистемы - /// - public string SubsystemName { get; set; } = null!; - /// - /// дата/время включения подсистемы - /// - public DateTime DateStart { get; set; } - /// - /// дата/время выключения подсистемы - /// - public DateTime DateEnd { get; set; } - /// - /// глубина забоя на момент включения подсистемы - /// - public double DepthStart { get; set; } - /// - /// глубина забоя на момент выключения подсистемы - /// - public double DepthEnd { get; set; } - } -} diff --git a/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs b/AsbCloudApp/Requests/SubsystemTimeRequest.cs similarity index 56% rename from AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs rename to AsbCloudApp/Requests/SubsystemTimeRequest.cs index 26aae17a..6f0cf8f9 100644 --- a/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs +++ b/AsbCloudApp/Requests/SubsystemTimeRequest.cs @@ -8,7 +8,7 @@ namespace AsbCloudApp.Requests /// /// класс с фильтрами для запроса /// - public class SubsystemOperationTimeRequest: RequestBase, IValidatableObject + public class SubsystemTimeRequest: RequestBase, IValidatableObject { private static readonly DateTime validationMinDate = new DateTime(2020,01,01,0,0,0,DateTimeKind.Utc); @@ -26,7 +26,7 @@ namespace AsbCloudApp.Requests /// /// Больше или равно дате /// - public DateTime? GtDate { get; set; }//TODO: its Ge* + public DateTime? GeDate { get; set; } /// /// Меньше или равно дате @@ -43,41 +43,20 @@ namespace AsbCloudApp.Requests /// public double? LtDepth { get; set; } - //TODO: Replace modes by DateTimeOffset LeDateStart, LeDateEnd - /// - /// информация попадает в выборку, если интервал выборки частично или полностью пересекается с запрашиваемым интервалом - /// - public const int SelectModeOuter = 0; - - /// - /// информация попадает в выборку, если интервал выборки строго полностью пересекается с запрашиваемым интервалом. - /// - public const int SelectModeInner = 1; - - /// - /// аналогично outer, но интервалы в частично пересекающиеся укорачиваются по границам интервала выборки. - /// - public const int SelectModeTrim = 2; - - /// - /// Режим выборки элементов - /// - public int SelectMode { get; set; } = SelectModeOuter; - /// public IEnumerable Validate(ValidationContext validationContext) { - if (GtDate.HasValue && GtDate < validationMinDate) + if (GeDate.HasValue && GeDate < validationMinDate) yield return new ValidationResult( $"Должно быть больше {validationMinDate:O})", - new[] { nameof(GtDate) }); + new[] { nameof(GeDate) }); - if (LtDate.HasValue && GtDate.HasValue) + if (LtDate.HasValue && GeDate.HasValue) { - if (LtDate < GtDate) + if (LtDate < GeDate) yield return new ValidationResult( - $"{nameof(LtDate)} должно быть больше {nameof(GtDate)}. ({LtDate:O} < {GtDate:O})", - new[] { nameof(LtDate), nameof(GtDate) }); + $"{nameof(LtDate)} должно быть больше {nameof(GeDate)}. ({LtDate:O} < {GeDate:O})", + new[] { nameof(LtDate), nameof(GeDate) }); } if (LtDepth.HasValue && GtDepth.HasValue) diff --git a/AsbCloudApp/Services/ISubsystemService.cs b/AsbCloudApp/Services/ISubsystemService.cs new file mode 100644 index 00000000..bbc9dcd4 --- /dev/null +++ b/AsbCloudApp/Services/ISubsystemService.cs @@ -0,0 +1,40 @@ +using AsbCloudApp.Data.Subsystems; +using AsbCloudApp.Requests; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services; + +/// +/// Получение инфо о наработке подсистем +/// +public interface ISubsystemService +{ + /// + /// Статистика о наработке подсистем + /// + /// + /// + /// + Task> GetStatAsync(SubsystemTimeRequest request, CancellationToken token); + + /// + /// Получение статистики по наработке подсистем по активным скважинам + /// + /// + /// + /// + /// + /// + Task> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token); + + /// + /// Получение статистики по наработке подсистем по активным скважинам + /// + /// + /// + /// + Task> GetStatByActiveWells(IEnumerable wellIds, CancellationToken token); +} \ No newline at end of file diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs deleted file mode 100644 index 67b29673..00000000 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ /dev/null @@ -1,68 +0,0 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Data.Subsystems; -using AsbCloudApp.Requests; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudApp.Services.Subsystems -{ - /// - /// Получение инфо о наработке подсистем - /// - public interface ISubsystemOperationTimeService - { - /// - /// Статистика о наработке подсистем - /// - /// - /// - /// - Task> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token); - - /// - /// Удаление наработки по подсистемам. - /// Если удаляется конец, то фоновый сервис подсчета наработки восстановит эти данные. - /// Может потребоваться для запуска повторного расчета по новому алгоритму. - /// - /// - /// - /// - Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token); - - /// - /// Интервалы работы подсистем - /// - /// - /// - /// - Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); - - /// - /// Временной диапазон за который есть статистика работы подсистем - /// - /// - /// - /// - Task GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); - - /// - /// Получение статистики по наработке подсистем по активным скважинам - /// - /// - /// - /// - /// - /// - Task> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token); - - /// - /// Получение статистики по наработке подсистем по активным скважинам - /// - /// - /// - /// - Task> GetStatByActiveWells(IEnumerable wellIds, CancellationToken token); - } -} diff --git a/AsbCloudDb/Model/DefaultData/DefaultContextData.cs b/AsbCloudDb/Model/DefaultData/DefaultContextData.cs index d749fc59..48d5a5cf 100644 --- a/AsbCloudDb/Model/DefaultData/DefaultContextData.cs +++ b/AsbCloudDb/Model/DefaultData/DefaultContextData.cs @@ -24,7 +24,7 @@ namespace AsbCloudDb.Model.DefaultData { typeof(WellType), new EntityFillerWellType()}, { typeof(MeasureCategory), new EntityFillerMeasureCategory()}, { typeof(CompanyType), new EntityFillerCompanyType()}, - { typeof(Subsystems.Subsystem), new EntityFillerSubsystem() }, + { typeof(Subsystem), new EntityFillerSubsystem() }, { typeof(NotificationCategory), new EntityNotificationCategory()}, }; return fillers; diff --git a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkSubsystemAbfOperationTimeCalc.cs b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkSubsystemAbfOperationTimeCalc.cs deleted file mode 100644 index fb16781d..00000000 --- a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkSubsystemAbfOperationTimeCalc.cs +++ /dev/null @@ -1,127 +0,0 @@ -using AsbCloudDb.Model; -using AsbCloudDb.Model.Subsystems; -using AsbCloudInfrastructure.Services.Subsystems; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Diagnostics; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudInfrastructure.Background.PeriodicWorks; - -public class WorkSubsystemAbfOperationTimeCalc : WorkSubsystemOperationTimeCalcAbstract -{ - public WorkSubsystemAbfOperationTimeCalc() - : base("Subsystem automated bit feeding operation time calc") - { - Timeout = TimeSpan.FromMinutes(30); - } - - protected override async Task> OperationTimeAsync(int idTelemetry, DateTimeOffset geDate, IAsbCloudDbContext db, CancellationToken token) - { - static bool isSubsytemAkbRotor(short? mode) => mode == 1; - - static bool isSubsytemAkbSlide(short? mode) => mode == 3; - - static bool IsSubsystemMse(short? state) => (state & 1) > 0; - - var query = - $"select tt.date, tt.mode, tt.well_depth, tt.mse_state " + - $"from ( " + - $" select " + - $" date, " + - $" mode, " + - $" mse_state, " + - $" well_depth, " + - $" lag(mode,1) over (order by date) as mode_lag, " + - $" lead(mode,1) over (order by date) as mode_lead " + - $" from t_telemetry_data_saub " + - $" where id_telemetry = {idTelemetry} and well_depth is not null and well_depth > 0 " + - $" order by date ) as tt " + - $"where (tt.mode_lag is null or (tt.mode != tt.mode_lag and tt.mode_lead != tt.mode_lag)) and tt.date >= '{geDate:u}' " + - $"order by tt.date;"; - - using var result = await ExecuteReaderAsync(db, query, token); - - var subsystemsOperationTimes = new List(); - var detectorRotor = new SubsystemDetector(idTelemetry, idSubsystemAPDRotor, isSubsytemAkbRotor, IsValid); - var detectorSlide = new SubsystemDetector(idTelemetry, idSubsystemAPDSlide, isSubsytemAkbSlide, IsValid); - var detectorMse = new SubsystemDetector(idTelemetry, idSubsystemMse, IsSubsystemMse, IsValid); - - while (result.Read()) - { - var mode = result.GetFieldValue(1); - var state = result.GetFieldValue(3); - - var isAkbRotorEnable = isSubsytemAkbRotor(mode); - var isAkbSlideEnable = isSubsytemAkbSlide(mode); - var isMseEnable = IsSubsystemMse(state); - var date = result.GetFieldValue(0); - var depth = result.GetFieldValue(2); - - if (detectorRotor.TryDetect(mode, date, depth, out var detectedRotor)) - subsystemsOperationTimes.Add(detectedRotor!); - - if (detectorSlide.TryDetect(mode, date, depth, out var detectedSlide)) - subsystemsOperationTimes.Add(detectedSlide!); - - if (detectorMse.TryDetect(mode, date, depth, out var detectedMse)) - subsystemsOperationTimes.Add(detectedMse!); - } - - return subsystemsOperationTimes; - } - - private static async Task ExecuteReaderAsync(IAsbCloudDbContext db, string query, CancellationToken token) - { - var connection = db.Database.GetDbConnection(); - if ( - connection?.State is null || - connection.State == ConnectionState.Broken || - connection.State == ConnectionState.Closed) - { - await db.Database.OpenConnectionAsync(token); - connection = db.Database.GetDbConnection(); - } - using var command = connection.CreateCommand(); - command.CommandText = query; - - var result = await command.ExecuteReaderAsync(token); - return result; - } - - private static bool IsValid(SubsystemOperationTime item) - { - var validateCode = GetValidateErrorCode(item); - if (validateCode != 0) - { - var str = System.Text.Json.JsonSerializer.Serialize(item); - Trace.TraceWarning($"Wrong({validateCode}) SubsystemOperationTime: {str}"); - } - return validateCode == 0; - } - - private static int GetValidateErrorCode(SubsystemOperationTime item) - { - if (item.DateStart > item.DateEnd) - return -1; - if ((item.DateEnd - item.DateStart).TotalHours > 48) - return -2; - if (item.DepthEnd < item.DepthStart) - return -3; - if (item.DepthEnd - item.DepthStart > 2000d) - return -4; - if (item.DepthEnd < 0d) - return -5; - if (item.DepthStart < 0d) - return -6; - if (item.DepthEnd > 24_0000d) - return -7; - if (item.DepthStart > 24_0000d) - return -8; - return 0; - } -} diff --git a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkSubsystemOperationTimeCalcAbstract.cs b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkSubsystemOperationTimeCalcAbstract.cs deleted file mode 100644 index b9fb6d23..00000000 --- a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkSubsystemOperationTimeCalcAbstract.cs +++ /dev/null @@ -1,102 +0,0 @@ -using AsbCloudApp.Data.SAUB; -using AsbCloudApp.Repositories; -using AsbCloudDb.Model; -using AsbCloudDb.Model.Subsystems; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudInfrastructure.Background.PeriodicWorks; - -public abstract class WorkSubsystemOperationTimeCalcAbstract : Work -{ - protected const int idSubsystemTorqueMaster = 65537; - protected const int idSubsystemSpinMaster = 65536; - protected const int idSubsystemAPDRotor = 11; - protected const int idSubsystemAPDSlide = 12; - protected const int idSubsystemMse = 2; - - private static TimeSpan obsoleteTime = TimeSpan.FromDays(365 * 100); - - public WorkSubsystemOperationTimeCalcAbstract(string workId) - : base(workId) - { - Timeout = TimeSpan.FromMinutes(30); - } - - protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) - { - var db = services.GetRequiredService(); - db.Database.SetCommandTimeout(TimeSpan.FromMinutes(5)); - - var telemetryLastDetectedDates = await GetTelemetryLastDetectedDates(services, db, token); - - var count = telemetryLastDetectedDates.Count(); - var i = 0d; - - foreach (var item in telemetryLastDetectedDates) - { - onProgressCallback($"Start handling telemetry: {item.IdTelemetry} from {item.DateDetectedLast}", i++ / count); - var newOperationsSaub = await OperationTimeAsync(item.IdTelemetry, item.DateDetectedLast, db, token); - if (newOperationsSaub.Any()) - { - db.SubsystemOperationTimes.AddRange(newOperationsSaub); - await db.SaveChangesAsync(token); - } - } - - obsoleteTime = TimeSpan.FromDays(3); - } - - protected abstract Task> OperationTimeAsync(int idTelemetry, DateTimeOffset geDate, IAsbCloudDbContext db, CancellationToken token); - - private static async Task> GetTelemetryLastDetectedDates(IServiceProvider services, IAsbCloudDbContext db, CancellationToken token) - { - var telemetryDataCache = services.GetRequiredService>(); - - var updatingTelemetries = telemetryDataCache.GetStat() - .Where(tstat => (DateTimeOffset.Now - tstat.DateLast) < obsoleteTime); - - var telemetryIds = updatingTelemetries - .Select(t => t.IdTelemetry) - .ToArray(); - - IEnumerable lastDetectedDates = await GetLastSubsystemOperationTimeAsync(db, token); - lastDetectedDates = lastDetectedDates - .Where(s => telemetryIds.Contains(s.IdTelemetry)); - - var result = updatingTelemetries.Select(tstat => new TelemetryDateLast - { - IdTelemetry = tstat.IdTelemetry, - DateDetectedLast = lastDetectedDates.FirstOrDefault(ldd => ldd.IdTelemetry == tstat.IdTelemetry)?.DateDetectedLast - ?? DateTimeOffset.UnixEpoch, - DateTelemetryLast = tstat.DateLast - }); - return result; - } - - private static async Task> GetLastSubsystemOperationTimeAsync(IAsbCloudDbContext db, CancellationToken token) - { - var result = await db.SubsystemOperationTimes - .GroupBy(o => o.IdTelemetry) - .Select(g => new TelemetryDateLast - { - IdTelemetry = g.Key, - DateDetectedLast = g.Max(o => o.DateEnd) - }) - .ToArrayAsync(token); - return result; - } - - protected class TelemetryDateLast - { - public int IdTelemetry { get; set; } - public DateTimeOffset DateDetectedLast { get; set; } - public DateTimeOffset DateTelemetryLast { get; internal set; } - } -} diff --git a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkSubsystemOscillationOperationTimeCalc.cs b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkSubsystemOscillationOperationTimeCalc.cs deleted file mode 100644 index b2a6800f..00000000 --- a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkSubsystemOscillationOperationTimeCalc.cs +++ /dev/null @@ -1,186 +0,0 @@ -using AsbCloudDb.Model; -using AsbCloudDb.Model.Subsystems; -using AsbCloudInfrastructure.Background; -using AsbCloudInfrastructure.Services.Subsystems; -using AsbCloudInfrastructure.Services.Subsystems.Utils; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudInfrastructure.Background.PeriodicWorks; - -public class WorkSubsystemOscillationOperationTimeCalc : WorkSubsystemOperationTimeCalcAbstract -{ - public WorkSubsystemOscillationOperationTimeCalc() - : base("Subsystem operation time calc") - { - Timeout = TimeSpan.FromMinutes(30); - } - - protected override async Task> OperationTimeAsync(int idTelemetry, DateTimeOffset geDate, IAsbCloudDbContext db, CancellationToken token) - { - static int? GetSubsytemId(short? mode, int? state) - { - // При изменении следующего кода сообщи в Vladimir.Sobolev@nedra.digital - if (state == 7 && (mode & 2) > 0) - return idSubsystemTorqueMaster;// демпфер - - if (state != 0 && state != 5 && state != 6 && state != 7) - return idSubsystemSpinMaster;// осцилляция - - return null; - } - - var querySpin = - $"select " + - $" tspin.date, " + - $" tspin.mode, " + - $" tspin.state " + - $"from ( " + - $" select " + - $" date, " + - $" mode, " + - $" lag(mode, 1) over (order by date) as mode_lag, " + - $" lead(mode, 1) over (order by date) as mode_lead, " + - $" state, " + - $" lag(state, 1) over (order by date) as state_lag " + - $" from t_telemetry_data_spin " + - $" where id_telemetry = {idTelemetry} and date >= '{geDate:u}'" + - $" order by date ) as tspin " + - $"where mode_lag is null or state_lag is null or (mode != mode_lag and mode_lead != mode_lag) or state != state_lag " + - $"order by date;"; - - var rows = new List<(int? IdSubsystem, DateTimeOffset Date)>(32); - - using var resultSpin = await ExecuteReaderAsync(db, querySpin, token); - int? idSubsystemLast = null; - while (resultSpin.Read()) - { - var mode = resultSpin.GetFieldValue(1); - var state = resultSpin.GetFieldValue(2); - var idSubsystem = GetSubsytemId(mode, state); - if (idSubsystemLast != idSubsystem) - { - idSubsystemLast = idSubsystem; - var date = resultSpin.GetFieldValue(0); - rows.Add((idSubsystem, date)); - } - } - await resultSpin.DisposeAsync(); - - if (rows.Count < 2) - return Enumerable.Empty(); - - var minSpinDate = rows.Min(i => i.Date); - var maxSpinDate = rows.Max(i => i.Date); - var depthInterpolation = await GetInterpolation(db, idTelemetry, minSpinDate, maxSpinDate, token); - - if (depthInterpolation is null) - return Enumerable.Empty(); - - var subsystemsOperationTimes = new List(32); - - for (int i = 1; i < rows.Count; i++) - { - var r0 = rows[i - 1]; - var r1 = rows[i]; - if (r0.IdSubsystem is not null && r0.IdSubsystem != r1.IdSubsystem) - { - var subsystemOperationTime = new SubsystemOperationTime() - { - IdTelemetry = idTelemetry, - IdSubsystem = r0.IdSubsystem.Value, - DateStart = r0.Date, - DateEnd = r1.Date, - DepthStart = depthInterpolation.GetDepth(r0.Date), - DepthEnd = depthInterpolation.GetDepth(r1.Date), - }; - - if (IsValid(subsystemOperationTime)) - subsystemsOperationTimes.Add(subsystemOperationTime); - } - } - - return subsystemsOperationTimes; - } - - private static async Task ExecuteReaderAsync(IAsbCloudDbContext db, string query, CancellationToken token) - { - var connection = db.Database.GetDbConnection(); - if ( - connection?.State is null || - connection.State == ConnectionState.Broken || - connection.State == ConnectionState.Closed) - { - await db.Database.OpenConnectionAsync(token); - connection = db.Database.GetDbConnection(); - } - using var command = connection.CreateCommand(); - command.CommandText = query; - - var result = await command.ExecuteReaderAsync(token); - return result; - } - - private static bool IsValid(SubsystemOperationTime item) - { - var validateCode = GetValidateErrorCode(item); - if (validateCode != 0) - { - var str = System.Text.Json.JsonSerializer.Serialize(item); - Trace.TraceWarning($"Wrong({validateCode}) SubsystemOperationTime: {str}"); - } - return validateCode == 0; - } - - private static int GetValidateErrorCode(SubsystemOperationTime item) - { - if (item.DateStart > item.DateEnd) - return -1; - if ((item.DateEnd - item.DateStart).TotalHours > 48) - return -2; - if (item.DepthEnd < item.DepthStart) - return -3; - if (item.DepthEnd - item.DepthStart > 2000d) - return -4; - if (item.DepthEnd < 0d) - return -5; - if (item.DepthStart < 0d) - return -6; - if (item.DepthEnd > 24_0000d) - return -7; - if (item.DepthStart > 24_0000d) - return -8; - return 0; - } - - private static async Task GetInterpolation(IAsbCloudDbContext db, int idTelemetry, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token) - { - var dataDepthFromSaub = await db.TelemetryDataSaub - .Where(d => d.IdTelemetry == idTelemetry) - .Where(d => d.DateTime >= dateBegin) - .Where(d => d.DateTime <= dateEnd) - .Where(d => d.WellDepth > 0) - .GroupBy(d => Math.Ceiling(d.WellDepth * 10)) - .Select(g => new - { - DateMin = g.Min(d => d.DateTime), - DepthMin = g.Min(d => d.WellDepth), - }) - .OrderBy(i => i.DateMin) - .ToArrayAsync(token); - - if (!dataDepthFromSaub.Any()) - return null; - - var depthInterpolation = new DepthInterpolation(dataDepthFromSaub.Select(i => (i.DateMin, i.DepthMin))); - return depthInterpolation; - } -} diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 4e7c8ee6..78d39f71 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -12,12 +12,10 @@ using AsbCloudApp.Services; using AsbCloudApp.Services.Notifications; using AsbCloudApp.Services.ProcessMaps; using AsbCloudApp.Services.ProcessMaps.WellDrilling; -using AsbCloudApp.Services.Subsystems; using AsbCloudApp.Services.WellOperationImport; using AsbCloudDb.Model; using AsbCloudDb.Model.Manuals; using AsbCloudDb.Model.ProcessMaps; -using AsbCloudDb.Model.Subsystems; using AsbCloudDb.Model.Trajectory; using AsbCloudInfrastructure.Background; using AsbCloudInfrastructure.Repository; @@ -209,7 +207,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient, CrudWellRelatedRepositoryBase>(); services.AddTransient(); diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index 9765c3e9..cbe64e03 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -16,7 +16,6 @@ using AsbCloudApp.Data.DailyReport.Blocks.WellOperation; using AsbCloudApp.Requests; using AsbCloudApp.Services.DailyReport; using AsbCloudApp.Services.ProcessMaps.WellDrilling; -using AsbCloudApp.Services.Subsystems; using AsbCloudDb.Model; using Mapster; @@ -29,7 +28,7 @@ public class DailyReportService : IDailyReportService private readonly IDailyReportRepository dailyReportRepository; private readonly IScheduleRepository scheduleRepository; private readonly IWellOperationRepository wellOperationRepository; - private readonly ISubsystemOperationTimeService subsystemOperationTimeService; + private readonly ISubsystemService subsystemService; private readonly IProcessMapReportWellDrillingService processMapReportWellDrillingService; private readonly IDetectedOperationService detectedOperationService; @@ -38,7 +37,7 @@ public class DailyReportService : IDailyReportService IDailyReportRepository dailyReportRepository, IScheduleRepository scheduleRepository, IWellOperationRepository wellOperationRepository, - ISubsystemOperationTimeService subsystemOperationTimeService, + ISubsystemService subsystemService, IProcessMapReportWellDrillingService processMapReportWellDrillingService, IDetectedOperationService detectedOperationService) { @@ -47,7 +46,7 @@ public class DailyReportService : IDailyReportService this.dailyReportRepository = dailyReportRepository; this.scheduleRepository = scheduleRepository; this.wellOperationRepository = wellOperationRepository; - this.subsystemOperationTimeService = subsystemOperationTimeService; + this.subsystemService = subsystemService; this.processMapReportWellDrillingService = processMapReportWellDrillingService; this.detectedOperationService = detectedOperationService; } @@ -311,24 +310,24 @@ public class DailyReportService : IDailyReportService async Task> GetSubsystemsAsync() { - var subsystemOperationTimesPerWell = await subsystemOperationTimeService.GetStatAsync(new SubsystemOperationTimeRequest + var subsystemsStatPerWell = await subsystemService.GetStatAsync(new SubsystemTimeRequest { IdWell = dailyReport.IdWell }, cancellationToken); - var subsystemOperationTimesPerDay = await subsystemOperationTimeService.GetStatAsync(new SubsystemOperationTimeRequest + var subsystemsStatPerDay = await subsystemService.GetStatAsync(new SubsystemTimeRequest { IdWell = dailyReport.IdWell, - GtDate = dailyReport.Date, + GeDate = dailyReport.Date, LtDate = dailyReport.Date.AddHours(24) }, cancellationToken); - var subsystems = subsystemOperationTimesPerWell - .Select(subsystemOperationTime => new SubsystemRecordDto + var subsystems = subsystemsStatPerWell + .Select(subsystemStatPerWell => new SubsystemRecordDto { - Name = subsystemOperationTime.SubsystemName, - UsagePerDay = subsystemOperationTimesPerDay.FirstOrDefault(s => s.IdSubsystem == subsystemOperationTime.IdSubsystem)?.Adapt(), - UsagePerWell = subsystemOperationTime.Adapt() + Name = subsystemStatPerWell.SubsystemName, + UsagePerDay = subsystemsStatPerDay.FirstOrDefault(s => s.IdSubsystem == subsystemStatPerWell.IdSubsystem)?.Adapt(), + UsagePerWell = subsystemStatPerWell.Adapt() }).ToList(); if (dailyReport.SubsystemBlock?.Subsystems != null && dailyReport.SubsystemBlock.Subsystems.Any()) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs deleted file mode 100644 index fc2d8f71..00000000 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ /dev/null @@ -1,397 +0,0 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Data.DetectedOperation; -using AsbCloudApp.Data.Subsystems; -using AsbCloudApp.Exceptions; -using AsbCloudApp.Requests; -using AsbCloudApp.Services; -using AsbCloudApp.Services.Subsystems; -using AsbCloudDb; -using AsbCloudDb.Model; -using AsbCloudDb.Model.Subsystems; -using Mapster; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudInfrastructure.Services.Subsystems; - -/// Todo: Выделить репозиторий -internal class SubsystemOperationTimeService : ISubsystemOperationTimeService -{ - private readonly IAsbCloudDbContext db; - private readonly IWellService wellService; - private readonly ICrudRepository subsystemService; - private readonly IDetectedOperationService detectedOperationService; - public const int IdSubsystemAKB = 1; - public const int IdSubsystemAKBRotor = 11; - public const int IdSubsystemAKBSlide = 12; - public const int IdSubsystemMSE = 2; - public const int IdSubsystemSpin = 65536; - public const int IdSubsystemTorque = 65537; - - public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService, ICrudRepository subsystemService, IDetectedOperationService detectedOperationService) - { - this.db = db; - this.wellService = wellService; - this.subsystemService = subsystemService; - this.detectedOperationService = detectedOperationService; - } - - /// - public async Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token) - { - var well = await wellService.GetOrDefaultAsync(request.IdWell, token) - ?? throw new ArgumentInvalidException(nameof(request.IdWell), $"Well Id: {request.IdWell} does not exist"); - - var query = BuildQuery(request, well); - db.SubsystemOperationTimes.RemoveRange(query); - return await db.SaveChangesAsync(token); - } - - /// - public async Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token) - { - var well = await wellService.GetOrDefaultAsync(request.IdWell, token) - ?? throw new ArgumentInvalidException(nameof(request.IdWell), $"Well Id: {request.IdWell} does not exist"); - - var dtos = await GetOperationTimeAsync(request, well, token); - return dtos; - } - - private async Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, WellDto well, CancellationToken token) - { - var query = BuildQuery(request, well); - IEnumerable data = await query.ToListAsync(token); - - if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeInner) - { - if (request.GtDate is not null) - data = data.Where(o => o.DateStart >= request.GtDate.Value); - - if (request.LtDate is not null) - data = data.Where(o => o.DateEnd <= request.LtDate.Value); - } - else if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeTrim) - { - var begin = request.GtDate?.ToUtcDateTimeOffset(well.Timezone.Hours); - var end = request.LtDate?.ToUtcDateTimeOffset(well.Timezone.Hours); - data = TrimOperation(data, begin, end); - } - - var dtos = data.Select(o => Convert(o, well.Timezone.Hours)); - return dtos; - } - - /// - public async Task> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token) - { - var well = await wellService.GetOrDefaultAsync(request.IdWell, token) - ?? throw new ArgumentInvalidException(nameof(request.IdWell), $"Well Id: {request.IdWell} does not exist"); - - request.SelectMode = SubsystemOperationTimeRequest.SelectModeTrim; - var subsystemsTimes = await GetOperationTimeAsync(request, well, token); - if (subsystemsTimes is null) - return Enumerable.Empty(); - - var detectedOperationSummaryRequest = new DetectedOperationSummaryRequest() - { - IdsTelemetries = new[] {well.IdTelemetry!.Value}, - IdsOperationCategories = WellOperationCategory.MechanicalDrillingSubIds, - - GeDateStart = request.GtDate, - LeDateStart = request.LtDate, - - GeDepthStart = request.GtDepth, - LeDepthStart = request.LtDepth, - }; - var operationsSummaries = await detectedOperationService.GetOperationSummaryAsync(detectedOperationSummaryRequest, token); - if(!operationsSummaries.Any()) - return Enumerable.Empty(); - - var statList = CalcStat(subsystemsTimes, operationsSummaries); - return statList; - } - - private static IEnumerable TrimOperation(IEnumerable data, DateTimeOffset? gtDate, DateTimeOffset? ltDate) - { - if (!ltDate.HasValue && !gtDate.HasValue) - return data.Select(d => d.Adapt()); - - var items = data.Select((item) => - { - var operationTime = item.Adapt(); - if (!(item.DepthStart.HasValue && item.DepthEnd.HasValue)) - return operationTime; - - var dateDiff = (item.DateEnd - item.DateStart).TotalSeconds; - var depthDiff = item.DepthEnd.Value - item.DepthStart.Value; - var a = depthDiff / dateDiff; - var b = item.DepthStart.Value; - - if (gtDate.HasValue && item.DateStart < gtDate.Value) - { - operationTime.DateStart = gtDate.Value; - var x = (gtDate.Value - item.DateStart).TotalSeconds; - operationTime.DepthStart = (float)(a * x + b); - } - if (ltDate.HasValue && item.DateEnd > ltDate.Value) - { - operationTime.DateEnd = ltDate.Value; - var x = (ltDate.Value - item.DateStart).TotalSeconds; - operationTime.DepthEnd = (float)(a * x + b); - } - return operationTime; - }); - - return items; - } - - private IEnumerable CalcStat( - IEnumerable subsystemsTimes, - IEnumerable operationsSummaries) - { - var groupedSubsystemsTimes = subsystemsTimes - .OrderBy(o => o.Id) - .GroupBy(o => o.IdSubsystem); - - var result = groupedSubsystemsTimes.Select(g => - { - var periodGroup = g.Sum(o => (o.DateEnd - o.DateStart).TotalHours); - var periodGroupDepth = g.Sum(o => o.DepthEnd - o.DepthStart); - var (sumOprationsDepth, sumOprationsDurationHours) = AggregateOperationsSummaries(g.Key, operationsSummaries); - var subsystemStat = new SubsystemStatDto() - { - IdSubsystem = g.Key, - SubsystemName = subsystemService.GetOrDefault(g.Key)?.Name ?? "unknown", - UsedTimeHours = periodGroup, - SumOperationDepthInterval = sumOprationsDepth, - SumOperationDurationHours = sumOprationsDurationHours, - SumDepthInterval = periodGroupDepth, - KUsage = periodGroupDepth / sumOprationsDepth, - OperationCount = g.Count(), - }; - if (subsystemStat.KUsage > 1) - subsystemStat.KUsage = 1; - return subsystemStat; - }); - - var apdParts = result.Where(x => x.IdSubsystem == 11 || x.IdSubsystem == 12); - if (apdParts.Any()) - { - var apdSum = new SubsystemStatDto() - { - IdSubsystem = IdSubsystemAKB, - SubsystemName = "АПД", - UsedTimeHours = apdParts.Sum(part => part.UsedTimeHours), - SumOperationDepthInterval = apdParts.Sum(part => part.SumOperationDepthInterval), - SumOperationDurationHours = apdParts.Sum(part => part.SumOperationDurationHours), - SumDepthInterval = apdParts.Sum(part => part.SumDepthInterval), - OperationCount = apdParts.Sum(part => part.OperationCount), - }; - - operationsSummaries = operationsSummaries.Where(o => o.EnabledSubsystems == 1); - - var (_, sumOprationsDurationHours) = AggregateOperationsSummaries(IdSubsystemAKBRotor, operationsSummaries); - apdSum.KUsage = sumOprationsDurationHours / apdSum.SumOperationDurationHours; - if (apdSum.KUsage > 1) - apdSum.KUsage = 1; - result = result.Append(apdSum).OrderBy(m => m.IdSubsystem); - } - - return result; - } - - private static (double SumDepth, double SumDurationHours) AggregateOperationsSummaries(int idSubsystem, IEnumerable operationsSummaries) - => idSubsystem switch - { - IdSubsystemAKBRotor or IdSubsystemTorque => CalcOperationSummariesByCategories(operationsSummaries, WellOperationCategory.IdRotor), - IdSubsystemAKBSlide or IdSubsystemSpin => CalcOperationSummariesByCategories(operationsSummaries, WellOperationCategory.IdSlide), - IdSubsystemAKB or IdSubsystemMSE => CalcOperationSummariesByCategories(operationsSummaries, WellOperationCategory.IdRotor, WellOperationCategory.IdSlide), - _ => throw new ArgumentException($"idSubsystem: {idSubsystem} does not supported in this method", nameof(idSubsystem)), - }; - - private static (double SumDepth, double SumDurationHours) CalcOperationSummariesByCategories( - IEnumerable operationsSummaries, - params int[] idsOperationCategories) - { - var filtered = operationsSummaries.Where(sum => idsOperationCategories.Contains(sum.IdCategory)); - var sumDepth = filtered.Sum(summ => summ.SumDepthIntervals); - var sumDurationHours = filtered.Sum(summ => summ.SumDurationHours); - return (sumDepth, sumDurationHours); - } - - /// - public async Task> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token) - { - var activeWells = await wellService.GetAsync(new() { IdCompany = idCompany, IdState = 1 }, token); - var result = await GetStatAsync(activeWells, gtDate, ltDate, token); - return result; - } - - /// - public async Task> GetStatByActiveWells(IEnumerable wellIds, CancellationToken token) - { - var activeWells = await wellService.GetAsync(new() { Ids = wellIds, IdState = 1 }, token); - var result = await GetStatAsync(activeWells, null, null, token); - return result; - } - - private async Task> GetStatAsync(IEnumerable wells, DateTime? gtDate, DateTime? ltDate, CancellationToken token) - { - if (!wells.Any()) - return Enumerable.Empty(); - - var hoursOffset = wells - .FirstOrDefault(well => well.Timezone is not null) - ?.Timezone.Hours - ?? 5d; - - var beginUTC = gtDate.HasValue - ? gtDate.Value.ToUtcDateTimeOffset(hoursOffset) - : db.SubsystemOperationTimes.Min(s => s.DateStart) - .DateTime - .ToUtcDateTimeOffset(hoursOffset); - - var endUTC = ltDate.HasValue - ? ltDate.Value.ToUtcDateTimeOffset(hoursOffset) - : db.SubsystemOperationTimes.Max(s => s.DateEnd) - .DateTime - .ToUtcDateTimeOffset(hoursOffset); - - IEnumerable idsTelemetries = wells - .Where(w => w.IdTelemetry is not null) - .Select(w => w.IdTelemetry!.Value) - .Distinct(); - - var query = db.SubsystemOperationTimes - .Where(o => idsTelemetries.Contains(o.IdTelemetry) && - o.DateStart >= beginUTC && - o.DateEnd <= endUTC) - .AsNoTracking(); - - var subsystemsOperationTime = await query.ToArrayAsync(token); - - var operationSummaries = await detectedOperationService - .GetOperationSummaryAsync(new () - { - IdsTelemetries = idsTelemetries, - IdsOperationCategories = WellOperationCategory.MechanicalDrillingSubIds, - GeDateStart = beginUTC, - LeDateEnd = endUTC, - }, token); - - var result = wells - .Select(well => { - var dtos = subsystemsOperationTime - .Where(s => s.IdTelemetry == well.IdTelemetry) - .Select(s => Convert(s, well.Timezone.Hours)); - - var wellStat = new SubsystemActiveWellStatDto{ Well = well }; - - var telemetryOperationSummaries = operationSummaries.Where(summ => summ.IdTelemetry == well.IdTelemetry); - if (telemetryOperationSummaries.Any()) - { - var subsystemStat = CalcStat(dtos, telemetryOperationSummaries); - if (subsystemStat.Any()) - { - wellStat.SubsystemAKB = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemAKB); - wellStat.SubsystemMSE = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemMSE); - wellStat.SubsystemSpinMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemSpin); - wellStat.SubsystemTorqueMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemTorque); - } - } - - return wellStat; - }); - - return result; - } - - /// - public async Task GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token) - { - var well = await wellService.GetOrDefaultAsync(request.IdWell, token) - ?? throw new ArgumentInvalidException(nameof(request.IdWell), $"Well Id: {request.IdWell} does not exist"); - - var query = BuildQuery(request, well); - if (query is null) - { - return null; - } - var result = await query - .GroupBy(o => o.IdTelemetry) - .Select(g => new DatesRangeDto - { - From = g.Min(o => o.DateStart).DateTime, - To = g.Max(o => o.DateEnd).DateTime - }) - .FirstOrDefaultAsync(token); - return result; - } - - private IQueryable BuildQuery(SubsystemOperationTimeRequest request, WellDto well) - { - var idTelemetry = well.IdTelemetry - ?? throw new ArgumentInvalidException(nameof(request.IdWell), $"Well Id: {request.IdWell} has no telemetry"); - - var query = db.SubsystemOperationTimes - .Include(o => o.Subsystem) - .Where(o => o.IdTelemetry == idTelemetry) - .AsNoTracking(); - - if (request.IdsSubsystems.Any()) - query = query.Where(o => request.IdsSubsystems.Contains(o.IdSubsystem)); - - // # Dates range condition - // [GtDate LtDate] - // [DateStart DateEnd] [DateStart DateEnd] - if (request.GtDate.HasValue) - { - DateTimeOffset gtDate = request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); - query = query.Where(o => o.DateEnd >= gtDate); - } - - if (request.LtDate.HasValue) - { - DateTimeOffset ltDate = request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); - query = query.Where(o => o.DateStart <= ltDate); - } - - if (request.GtDepth.HasValue) - query = query.Where(o => o.DepthEnd >= request.GtDepth.Value); - - if (request.LtDepth.HasValue) - query = query.Where(o => o.DepthStart <= request.LtDepth.Value); - - if (request?.SortFields?.Any() == true) - { - query = query.SortBy(request.SortFields); - } - else - { - query = query - .OrderBy(o => o.DateStart) - .ThenBy(o => o.DepthStart); - } - - if (request?.Skip > 0) - query = query.Skip((int)request.Skip); - - if (request?.Take > 0) - query = query.Take((int)request.Take); - - return query; - } - - private static SubsystemOperationTimeDto Convert(SubsystemOperationTime operationTime, double? timezoneHours = null) - { - var dto = operationTime.Adapt(); - var hours = timezoneHours ?? operationTime.Telemetry.TimeZone.Hours; - dto.DateStart = operationTime.DateStart.ToRemoteDateTime(hours); - dto.DateEnd = operationTime.DateEnd.ToRemoteDateTime(hours); - return dto; - } -} diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs new file mode 100644 index 00000000..e678aadd --- /dev/null +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -0,0 +1,218 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.DetectedOperation; +using AsbCloudApp.Data.Subsystems; +using AsbCloudApp.Exceptions; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services.Subsystems; + +internal class SubsystemService : ISubsystemService +{ + private const int IdEnabledSubsystemSpinMaster = 128; + + private const int IdSubsystemAPD = 1; + private const int IdSubsystemAPDRotor = 11; + private const int IdSubsystemAPDSlide = 12; + private const int IdSubsystemSpinMaster = 65536; + + private readonly ICrudRepository subsystemRepository; + + private readonly IWellService wellService; + private readonly IDetectedOperationService detectedOperationService; + private readonly ITelemetryDataSaubService telemetryDataSaubService; + + public SubsystemService(ICrudRepository subsystemRepository, + IWellService wellService, + IDetectedOperationService detectedOperationService, + ITelemetryDataSaubService telemetryDataSaubService) + { + this.wellService = wellService; + this.subsystemRepository = subsystemRepository; + this.detectedOperationService = detectedOperationService; + this.telemetryDataSaubService = telemetryDataSaubService; + } + + public async Task> GetStatAsync(SubsystemTimeRequest request, CancellationToken token) + { + var well = await wellService.GetOrDefaultAsync(request.IdWell, token) + ?? throw new ArgumentInvalidException(nameof(request.IdWell), $"Well Id: {request.IdWell} does not exist"); + + var detectedOperationSummaryRequest = new DetectedOperationSummaryRequest + { + IdsTelemetries = new[] { well.IdTelemetry!.Value }, + IdsOperationCategories = WellOperationCategory.MechanicalDrillingSubIds, + + GeDateStart = request.GeDate, + LeDateStart = request.LtDate, + + GeDepthStart = request.GtDepth, + LeDepthStart = request.LtDepth, + }; + + var operations = await detectedOperationService.GetOperationSummaryAsync(detectedOperationSummaryRequest, + token); + + if (!operations.Any()) + return Enumerable.Empty(); + + var stat = await CalcStatAsync(operations, token); + return stat; + } + + public async Task> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, + CancellationToken token) + { + var activeWells = await wellService.GetAsync(new() { IdCompany = idCompany, IdState = 1 }, token); + var result = await GetStatAsync(activeWells, gtDate, ltDate, token); + return result; + } + + public async Task> GetStatByActiveWells(IEnumerable wellIds, CancellationToken token) + { + var activeWells = await wellService.GetAsync(new() { Ids = wellIds, IdState = 1 }, token); + var result = await GetStatAsync(activeWells, null, null, token); + return result; + } + + private async Task> CalcStatAsync(IEnumerable operations, CancellationToken token) + { + var subsystems = await subsystemRepository.GetAllAsync(token); + + var groupedOperations = operations + .GroupBy(o => o.IdCategory); + + var stat = groupedOperations.Select(groupOperations => + { + var idSubsystem = groupOperations.Key switch + { + WellOperationCategory.IdRotor => IdSubsystemAPDRotor, + WellOperationCategory.IdSlide => IdSubsystemAPDSlide, + _ => throw new ArgumentException($"IdCategory: {groupOperations.Key} does not supported in this method", + nameof(groupOperations.Key)), + }; + + var operationsWithEnableSubsystems = groupOperations.Where(o => o.EnabledSubsystems >= 1); + + var subsystemStat = new SubsystemStatDto + { + IdSubsystem = idSubsystem, + SubsystemName = subsystems.FirstOrDefault(s => s.Id == idSubsystem)?.Name ?? "unknown", + UsedTimeHours = operationsWithEnableSubsystems.Sum(o => o.SumDurationHours), + SumOperationDepthInterval = groupOperations.Sum(o => o.SumDepthIntervals), + SumOperationDurationHours = groupOperations.Sum(o => o.SumDurationHours), + SumDepthInterval = operationsWithEnableSubsystems.Sum(o => o.SumDepthIntervals), + OperationCount = operationsWithEnableSubsystems.Sum(o => o.Count), + }; + + subsystemStat.KUsage = subsystemStat.SumDepthInterval / subsystemStat.SumOperationDepthInterval; + + return subsystemStat; + }); + + var apdSlidePart = stat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemAPDSlide); + + if (apdSlidePart is not null) + { + var operationsWithSpinMaster = operations.Where(s => s.EnabledSubsystems == IdEnabledSubsystemSpinMaster); + + var spin = new SubsystemStatDto + { + IdSubsystem = IdSubsystemSpinMaster, + SubsystemName = subsystems.FirstOrDefault(s => s.Id == IdSubsystemSpinMaster)?.Name ?? "unknown", + UsedTimeHours = operationsWithSpinMaster.Sum(o => o.SumDurationHours), + SumOperationDepthInterval = apdSlidePart.SumOperationDepthInterval, + SumOperationDurationHours = apdSlidePart.SumOperationDurationHours, + SumDepthInterval = operationsWithSpinMaster.Sum(o => o.SumDepthIntervals), + OperationCount = operationsWithSpinMaster.Sum(s => s.Count) + }; + + spin.KUsage = spin.SumDepthInterval / spin.SumOperationDepthInterval; + + stat = stat.Append(spin); + } + + var apdParts = stat.Where(s => s.IdSubsystem is IdSubsystemAPDRotor or IdSubsystemAPDSlide); + + if (!apdParts.Any()) + return stat; + + var apdSum = new SubsystemStatDto + { + IdSubsystem = IdSubsystemAPD, + SubsystemName = "АПД", + UsedTimeHours = apdParts.Sum(part => part.UsedTimeHours), + SumOperationDepthInterval = apdParts.Sum(part => part.SumOperationDepthInterval), + SumOperationDurationHours = apdParts.Sum(part => part.SumOperationDurationHours), + SumDepthInterval = apdParts.Sum(part => part.SumDepthInterval), + OperationCount = apdParts.Sum(part => part.OperationCount), + }; + + apdSum.KUsage = apdSum.SumDepthInterval / apdSum.SumOperationDepthInterval; + + stat = stat.Append(apdSum).OrderBy(m => m.IdSubsystem); + + return stat; + } + + private async Task> GetStatAsync(IEnumerable wells, DateTime? gtDate, DateTime? ltDate, + CancellationToken token) + { + if (!wells.Any()) + return Enumerable.Empty(); + + var idsTelemetries = wells + .Where(w => w.IdTelemetry is not null) + .Select(w => w.IdTelemetry!.Value) + .Distinct(); + + var wellsStat = new List(); + + foreach (var well in wells) + { + var hoursOffset = well.Timezone.Hours; + + var dateRange = telemetryDataSaubService.GetRange(well.Id); + + var beginUTC = gtDate.HasValue + ? gtDate.Value.ToUtcDateTimeOffset(hoursOffset) + : dateRange.From.ToUtcDateTimeOffset(hoursOffset); + + var endUTC = ltDate.HasValue + ? ltDate.Value.ToUtcDateTimeOffset(hoursOffset) + : dateRange.To.ToUtcDateTimeOffset(hoursOffset); + + var operations = await detectedOperationService + .GetOperationSummaryAsync(new() + { + IdsTelemetries = idsTelemetries, + IdsOperationCategories = WellOperationCategory.MechanicalDrillingSubIds, + GeDateStart = beginUTC, + LeDateEnd = endUTC, + }, token); + + var wellStat = new SubsystemActiveWellStatDto { Well = well }; + + var telemetryOperations = operations.Where(o => o.IdTelemetry == well.IdTelemetry); + + if (!telemetryOperations.Any()) + continue; + + var subsystemStat = await CalcStatAsync(telemetryOperations, token); + + if (!subsystemStat.Any()) + continue; + + wellStat.SubsystemAPD = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemAPD); + wellStat.SubsystemSpinMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemSpinMaster); + } + + return wellsStat; + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Subsystems/SybsystemDetector.cs b/AsbCloudInfrastructure/Services/Subsystems/SybsystemDetector.cs deleted file mode 100644 index 5444d045..00000000 --- a/AsbCloudInfrastructure/Services/Subsystems/SybsystemDetector.cs +++ /dev/null @@ -1,56 +0,0 @@ -using AsbCloudDb.Model.Subsystems; -using System; - -namespace AsbCloudInfrastructure.Services.Subsystems -{ - public class SubsystemDetector - { - private readonly int idTelemetry; - private readonly int idSubsystem; - private readonly Func isEnable; - private readonly Func isValid; - (bool isEnable, DateTimeOffset date, float depth) pre = default; - - public SubsystemDetector( - int idTelemetry, - int idSubsystem, - Func isEnable, - Func isValid) - { - this.idTelemetry = idTelemetry; - this.idSubsystem = idSubsystem; - this.isEnable = isEnable; - this.isValid = isValid; - } - - public bool TryDetect(short? mode, DateTimeOffset date, float depth, out SubsystemOperationTime? subsystemOperationTime) - { - var isEnable = this.isEnable(mode); - - if (!pre.isEnable && isEnable) - { - pre = (true, date, depth); - } - else if (pre.isEnable && !isEnable) - { - var detected = new SubsystemOperationTime - { - IdTelemetry = idTelemetry, - IdSubsystem = idSubsystem, - DateStart = pre.date, - DateEnd = date, - DepthStart = pre.depth, - DepthEnd = depth, - }; - pre.isEnable = false; - if (isValid(detected)) - { - subsystemOperationTime = detected; - return true; - } - } - subsystemOperationTime = null; - return false; - } - } -} diff --git a/AsbCloudInfrastructure/Services/WellInfoService.cs b/AsbCloudInfrastructure/Services/WellInfoService.cs index 0bf2fd0c..6caa2c08 100644 --- a/AsbCloudInfrastructure/Services/WellInfoService.cs +++ b/AsbCloudInfrastructure/Services/WellInfoService.cs @@ -4,9 +4,7 @@ using AsbCloudApp.Data.WITS; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; -using AsbCloudApp.Services.Subsystems; using AsbCloudInfrastructure.Background; -using AsbCloudInfrastructure.Services.SAUB; using Mapster; using Microsoft.Extensions.DependencyInjection; using System; @@ -35,7 +33,7 @@ public class WellInfoService var wellService = services.GetRequiredService(); var operationsStatService = services.GetRequiredService(); var processMapPlanWellDrillingRepository = services.GetRequiredService>(); - var subsystemOperationTimeService = services.GetRequiredService(); + var subsystemService = services.GetRequiredService(); var telemetryDataSaubCache = services.GetRequiredService>(); var messageHub = services.GetRequiredService>(); @@ -57,7 +55,7 @@ public class WellInfoService var operationsStat = await operationsStatService.GetWellsStatAsync(wellsIds, token); - var subsystemStat = await subsystemOperationTimeService + var subsystemStat = await subsystemService .GetStatByActiveWells(wellsIds, token); subsystemStat = subsystemStat.ToArray(); @@ -157,7 +155,7 @@ public class WellInfoService }; var wellSubsystemStat = subsystemStat.FirstOrDefault(s => s.Well.Id == well.Id); - wellMapInfo.SaubUsage = wellSubsystemStat?.SubsystemAKB?.KUsage ?? 0d; + wellMapInfo.SaubUsage = wellSubsystemStat?.SubsystemAPD?.KUsage ?? 0d; wellMapInfo.SpinUsage = wellSubsystemStat?.SubsystemSpinMaster?.KUsage ?? 0d; wellMapInfo.TorqueKUsage = wellSubsystemStat?.SubsystemTorqueMaster?.KUsage ?? 0d; wellMapInfo.TvdLagDays = wellOperationsStat?.TvdLagDays; diff --git a/AsbCloudInfrastructure/Startup.cs b/AsbCloudInfrastructure/Startup.cs index 3af21638..cfb2a9e7 100644 --- a/AsbCloudInfrastructure/Startup.cs +++ b/AsbCloudInfrastructure/Startup.cs @@ -32,8 +32,6 @@ namespace AsbCloudInfrastructure backgroundWorker.Add(TimeSpan.FromDays(1)); backgroundWorker.Add(TimeSpan.FromMinutes(30)); backgroundWorker.Add(TimeSpan.FromMinutes(15)); - backgroundWorker.Add(TimeSpan.FromMinutes(30)); - backgroundWorker.Add(TimeSpan.FromMinutes(30)); backgroundWorker.Add(TimeSpan.FromMinutes(30)); backgroundWorker.Add(MakeMemoryMonitoringWork(), TimeSpan.FromMinutes(1)); diff --git a/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs b/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs index 496ae9e4..934fe8e5 100644 --- a/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs +++ b/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs @@ -17,7 +17,6 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudApp.Services.ProcessMaps.WellDrilling; -using AsbCloudApp.Services.Subsystems; using AsbCloudInfrastructure.Services.DailyReport; using NSubstitute; using Xunit; @@ -191,7 +190,7 @@ public class DailyReportServiceTest } }; - private readonly SubsystemStatDto fakeStatSubsystemOperationTime = new() + private readonly SubsystemStatDto fakeSubsystemsStat = new() { SubsystemName = "АПД", SumDepthInterval = 250, @@ -204,7 +203,7 @@ public class DailyReportServiceTest private readonly IDailyReportRepository dailyReportRepositoryMock = Substitute.For(); private readonly IScheduleRepository scheduleRepositoryMock = Substitute.For(); private readonly IWellOperationRepository wellOperationRepositoryMock = Substitute.For(); - private readonly ISubsystemOperationTimeService subsystemOperationTimeServiceMock = Substitute.For(); + private readonly ISubsystemService subsystemServiceMock = Substitute.For(); private readonly IProcessMapReportWellDrillingService processMapReportWellDrillingServiceMock = Substitute.For(); private readonly IDetectedOperationService detectedOperationServiceMock = Substitute.For(); @@ -245,7 +244,7 @@ public class DailyReportServiceTest dailyReportRepositoryMock, scheduleRepositoryMock, wellOperationRepositoryMock, - subsystemOperationTimeServiceMock, + subsystemServiceMock, processMapReportWellDrillingServiceMock, detectedOperationServiceMock); @@ -276,8 +275,8 @@ public class DailyReportServiceTest detectedOperationServiceMock.GetAsync(Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(fakeWellOperationSlipsTime); - subsystemOperationTimeServiceMock.GetStatAsync(Arg.Any(), Arg.Any()) - .ReturnsForAnyArgs(new[] { fakeStatSubsystemOperationTime }); + subsystemServiceMock.GetStatAsync(Arg.Any(), Arg.Any()) + .ReturnsForAnyArgs(new[] { fakeSubsystemsStat }); scheduleRepositoryMock.GetAsync(idWell, dateDailyReport, Arg.Any()) .ReturnsForAnyArgs(new[] { fakeShedule }); diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemController.cs new file mode 100644 index 00000000..87e8fb88 --- /dev/null +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemController.cs @@ -0,0 +1,92 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.Subsystems; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudWebApi.Controllers.Subsystems +{ + /// + /// Наработка подсистем + /// + [Route("api/[controller]")] + [ApiController] + [Authorize] + public class SubsystemController : ControllerBase + { + private readonly ISubsystemService subsystemService; + private readonly ITelemetryDataSaubService telemetryDataSaubService; + private readonly IWellService wellService; + + public SubsystemController( + ISubsystemService subsystemService, + IWellService wellService, + ITelemetryDataSaubService telemetryDataSaubService) + { + this.subsystemService = subsystemService; + this.wellService = wellService; + this.telemetryDataSaubService = telemetryDataSaubService; + } + /// + /// получить статистику + /// + [HttpGet("stat")] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] + public async Task GetStatAsync([FromQuery] SubsystemTimeRequest request, CancellationToken token) + { + if (!await UserHasAccessToWellAsync(request.IdWell, token)) + return Forbid(); + var subsystemResult = await subsystemService.GetStatAsync(request, token); + return Ok(subsystemResult); + } + + /// + /// получить период, за который будет рассчитываться статистика + /// + [HttpGet("operationsPeriod/{idWell}")] + [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] + public async Task GetStatDateRangeAsync([FromRoute] int idWell, CancellationToken token) + { + if (!await UserHasAccessToWellAsync(idWell, token)) + return Forbid(); + + var dateRange = telemetryDataSaubService.GetRange(idWell); + + return Ok(dateRange); + } + + /// + /// получить статистику по активным скважинам + /// + /// Больше или равно дате + /// Меньше или равно дате + /// Токен + /// + [HttpGet("statByActiveWell")] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetStatByWellAsync(DateTime? gtDate, DateTime? ltDate, CancellationToken token) + { + var idCompany = User.GetCompanyId(); + if (!idCompany.HasValue) + return Forbid(); + var subsystemResult = await subsystemService.GetStatByActiveWells(idCompany.Value, gtDate, ltDate, token); + return Ok(subsystemResult); + } + + private 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; + } + } +} diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs deleted file mode 100644 index 47ce3630..00000000 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ /dev/null @@ -1,162 +0,0 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Data.Subsystems; -using AsbCloudApp.Requests; -using AsbCloudApp.Services; -using AsbCloudApp.Services.Subsystems; -using AsbCloudDb.Model; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudWebApi.Controllers.Subsystems -{ - /// - /// Наработка подсистем - /// - [Route("api/[controller]")] - [ApiController] - [Authorize] - public class SubsystemOperationTimeController : ControllerBase - { - private readonly ISubsystemOperationTimeService subsystemOperationTimeService; - private readonly ITelemetryDataSaubService telemetryDataSaubService; - private readonly IWellService wellService; - - private readonly Dictionary subsystemNames = new() - { - { 1, "SAUB" }, - { 65537, "Torque Master" }, - { 65536, "Spin Master" } - }; - - public SubsystemOperationTimeController( - ISubsystemOperationTimeService subsystemOperationTimeService, - IWellService wellService, - ITelemetryDataSaubService telemetryDataSaubService) - { - this.subsystemOperationTimeService = subsystemOperationTimeService; - this.wellService = wellService; - this.telemetryDataSaubService = telemetryDataSaubService; - } - /// - /// получить статистику - /// - [HttpGet("stat")] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] - public async Task GetStatAsync([FromQuery] SubsystemOperationTimeRequest request, CancellationToken token) - { - if (!await UserHasAccessToWellAsync(request.IdWell, token)) - return Forbid(); - var subsystemResult = await subsystemOperationTimeService.GetStatAsync(request, token); - return Ok(subsystemResult); - } - - /// - /// получить период, за который будет рассчитываться статистика - /// - [HttpGet("operationsPeriod/{idWell}")] - [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetStatDateRangeAsync([FromRoute] int idWell, CancellationToken token) - { - if (!await UserHasAccessToWellAsync(idWell, token)) - return Forbid(); - - var dateRange = telemetryDataSaubService.GetRange(idWell); - - return Ok(dateRange); - } - - /// - /// получить статистику по активным скважинам - /// - /// Больше или равно дате - /// Меньше или равно дате - /// Токен - /// - [HttpGet("statByActiveWell")] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetStatByWellAsync(DateTime? GtDate, DateTime? LtDate, CancellationToken token) - { - var idCompany = User.GetCompanyId(); - if (!idCompany.HasValue) - return Forbid(); - var subsystemResult = await subsystemOperationTimeService.GetStatByActiveWells(idCompany.Value, GtDate, LtDate, token); - return Ok(subsystemResult); - } - - /// - /// получить доступный диапазон дат наработки подсистемы. - /// - [HttpGet("datesRange")] - [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetDateRangeOperationTimeAsync([FromQuery] SubsystemOperationTimeRequest request, CancellationToken token) - { - if (!await UserHasAccessToWellAsync(request.IdWell, token)) - return Forbid(); - var result = await subsystemOperationTimeService.GetDateRangeOperationTimeAsync(request, token); - return Ok(result); - } - - /// - /// получить список наработок подсистем - /// - [HttpGet("operationTime")] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] - public async Task GetOperationTimeAsync( - [FromQuery] SubsystemOperationTimeRequest request, - CancellationToken token) - { - if (!await UserHasAccessToWellAsync(request.IdWell, token)) - return Forbid(); - - var result = await subsystemOperationTimeService.GetOperationTimeAsync(request, token); - return Ok(result); - } - - /// - /// Удалить наработки. - /// - /// - /// - /// - [HttpDelete] - [Permission] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] - public async Task DeleteAsync( - [FromQuery] SubsystemOperationTimeRequest request, - CancellationToken token) - { - if (!await UserHasAccessToWellAsync(request.IdWell, token)) - return Forbid(); - var result = await subsystemOperationTimeService.DeleteAsync(request, token); - return Ok(result); - } - - /// - /// Получение словаря названий подсистем - /// - /// - [HttpGet("names")] - [ProducesResponseType(typeof(Dictionary), (int)System.Net.HttpStatusCode.OK)] - public IActionResult GetSubsystemsNames() - { - return Ok(subsystemNames); - } - - 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; - } - } -} From 7a6f922a9791cbeb37dfeaabd10b026dfc744360 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: Sat, 16 Dec 2023 14:23:59 +0500 Subject: [PATCH 06/30] =?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=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=B0=20+=20?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20=D0=BD=D0=B5=D0=B8=D1=81?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D0=B5=D0=BC=D0=BE=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{SubsystemTimeRequest.cs => SubsystemRequest.cs} | 8 +------- AsbCloudApp/Services/ISubsystemService.cs | 2 +- .../Services/DailyReport/DailyReportService.cs | 4 ++-- .../Services/Subsystems/SubsystemService.cs | 2 +- .../UnitTests/Services/DailyReportServiceTest.cs | 2 +- .../Controllers/Subsystems/SubsystemController.cs | 2 +- 6 files changed, 7 insertions(+), 13 deletions(-) rename AsbCloudApp/Requests/{SubsystemTimeRequest.cs => SubsystemRequest.cs} (88%) diff --git a/AsbCloudApp/Requests/SubsystemTimeRequest.cs b/AsbCloudApp/Requests/SubsystemRequest.cs similarity index 88% rename from AsbCloudApp/Requests/SubsystemTimeRequest.cs rename to AsbCloudApp/Requests/SubsystemRequest.cs index 6f0cf8f9..5749750a 100644 --- a/AsbCloudApp/Requests/SubsystemTimeRequest.cs +++ b/AsbCloudApp/Requests/SubsystemRequest.cs @@ -1,14 +1,13 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.Linq; namespace AsbCloudApp.Requests { /// /// класс с фильтрами для запроса /// - public class SubsystemTimeRequest: RequestBase, IValidatableObject + public class SubsystemRequest: RequestBase, IValidatableObject { private static readonly DateTime validationMinDate = new DateTime(2020,01,01,0,0,0,DateTimeKind.Utc); @@ -18,11 +17,6 @@ namespace AsbCloudApp.Requests [Required] public int IdWell { get; set; } - /// - /// идентификатор подсистемы - /// - public IEnumerable IdsSubsystems { get; set; } = Enumerable.Empty(); - /// /// Больше или равно дате /// diff --git a/AsbCloudApp/Services/ISubsystemService.cs b/AsbCloudApp/Services/ISubsystemService.cs index bbc9dcd4..458529c5 100644 --- a/AsbCloudApp/Services/ISubsystemService.cs +++ b/AsbCloudApp/Services/ISubsystemService.cs @@ -18,7 +18,7 @@ public interface ISubsystemService /// /// /// - Task> GetStatAsync(SubsystemTimeRequest request, CancellationToken token); + Task> GetStatAsync(SubsystemRequest request, CancellationToken token); /// /// Получение статистики по наработке подсистем по активным скважинам diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index cbe64e03..a1bea561 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -310,12 +310,12 @@ public class DailyReportService : IDailyReportService async Task> GetSubsystemsAsync() { - var subsystemsStatPerWell = await subsystemService.GetStatAsync(new SubsystemTimeRequest + var subsystemsStatPerWell = await subsystemService.GetStatAsync(new SubsystemRequest { IdWell = dailyReport.IdWell }, cancellationToken); - var subsystemsStatPerDay = await subsystemService.GetStatAsync(new SubsystemTimeRequest + var subsystemsStatPerDay = await subsystemService.GetStatAsync(new SubsystemRequest { IdWell = dailyReport.IdWell, GeDate = dailyReport.Date, diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index 957f3b9b..3180c63b 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -39,7 +39,7 @@ internal class SubsystemService : ISubsystemService this.telemetryDataSaubService = telemetryDataSaubService; } - public async Task> GetStatAsync(SubsystemTimeRequest request, CancellationToken token) + public async Task> GetStatAsync(SubsystemRequest request, CancellationToken token) { var well = await wellService.GetOrDefaultAsync(request.IdWell, token) ?? throw new ArgumentInvalidException(nameof(request.IdWell), $"Well Id: {request.IdWell} does not exist"); diff --git a/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs b/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs index 934fe8e5..567f6437 100644 --- a/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs +++ b/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs @@ -275,7 +275,7 @@ public class DailyReportServiceTest detectedOperationServiceMock.GetAsync(Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(fakeWellOperationSlipsTime); - subsystemServiceMock.GetStatAsync(Arg.Any(), Arg.Any()) + subsystemServiceMock.GetStatAsync(Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(new[] { fakeSubsystemsStat }); scheduleRepositoryMock.GetAsync(idWell, dateDailyReport, Arg.Any()) diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemController.cs index 87e8fb88..86673090 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemController.cs @@ -38,7 +38,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems [HttpGet("stat")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] - public async Task GetStatAsync([FromQuery] SubsystemTimeRequest request, CancellationToken token) + public async Task GetStatAsync([FromQuery] SubsystemRequest request, CancellationToken token) { if (!await UserHasAccessToWellAsync(request.IdWell, token)) return Forbid(); From 4ae22517f5ddba1702817940fae17acbc87e0cd1 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 18 Dec 2023 12:38:37 +0500 Subject: [PATCH 07/30] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B3=D0=B0=20=D1=81=20=D0=B2=D1=8B=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=B7=D0=BA=D0=BE=D0=B9=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B9=20=D0=BF=D0=BE=20=D1=81=D0=BA=D0=B2=D0=B0?= =?UTF-8?q?=D0=B6=D0=B8=D0=BD=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DetectedOperationExportService.cs | 17 ++++++++--------- .../SAUB/DetectedOperationController.cs | 8 ++++---- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs index 15dab40f..a6038741 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs @@ -54,7 +54,7 @@ public class DetectedOperationExportService this.wellOperationRepository = wellOperationRepository; } - public async Task ExportAsync(int idWell, int idDomain, CancellationToken cancellationToken) + public async Task ExportAsync(int idWell, string url, CancellationToken cancellationToken) { var well = await dbContext.Wells .Include(w => w.Cluster) @@ -69,17 +69,17 @@ public class DetectedOperationExportService var operations = await DetectOperationsAsync(well.IdTelemetry.Value, DateTime.UnixEpoch, cancellationToken); - return await GenerateExcelFileStreamAsync(well, idDomain, operations, cancellationToken); + return await GenerateExcelFileStreamAsync(well, url, operations, cancellationToken); } - private async Task GenerateExcelFileStreamAsync(Well well, int idDomain, IEnumerable operationDetectorResults, + private async Task GenerateExcelFileStreamAsync(Well well, string url, IEnumerable operationDetectorResults, CancellationToken cancellationToken) { using var excelTemplateStream = await GetExcelTemplateStreamAsync(cancellationToken); using var workbook = new XLWorkbook(excelTemplateStream, XLEventTracking.Disabled); - await AddToWorkbookAsync(workbook, well, idDomain, operationDetectorResults, cancellationToken); + await AddToWorkbookAsync(workbook, well, url, operationDetectorResults, cancellationToken); MemoryStream memoryStream = new MemoryStream(); workbook.SaveAs(memoryStream, new SaveOptions { }); @@ -87,7 +87,7 @@ public class DetectedOperationExportService return memoryStream; } - private async Task AddToWorkbookAsync(XLWorkbook workbook, Well well, int idDomain, IEnumerable operationDetectorResults, + private async Task AddToWorkbookAsync(XLWorkbook workbook, Well well, string url, IEnumerable operationDetectorResults, CancellationToken cancellationToken) { const string sheetName = "Операции"; @@ -98,12 +98,12 @@ public class DetectedOperationExportService var sheet = workbook.Worksheets.FirstOrDefault(ws => ws.Name == sheetName) ?? throw new FileFormatException($"Книга excel не содержит листа {sheetName}."); - await AddToSheetAsync(sheet, well, idDomain, operationDetectorResults + await AddToSheetAsync(sheet, well, url, operationDetectorResults .OrderBy(x => x.Operation.DateStart).ThenBy(x => x.Operation.DepthStart).ToArray(), cancellationToken); } - private async Task AddToSheetAsync(IXLWorksheet sheet, Well well, int idDomain, IList operationDetectorResults, + private async Task AddToSheetAsync(IXLWorksheet sheet, Well well, string url, IList operationDetectorResults, CancellationToken cancellationToken) { var wellOperationCategories = await dbContext.WellOperationCategories.ToListAsync(cancellationToken); @@ -134,8 +134,7 @@ public class DetectedOperationExportService && idReasonOfEndObject is int idReasonOfEnd) row.Cell(columnIdReasonOfEnd).Value = GetIdReasonOfEnd(idReasonOfEnd); - var link = - $"{domains[idDomain]}/well/{well.Id}/telemetry/monitoring?end={Uri.EscapeDataString(dateStart.AddSeconds(1800 * 0.9).ToString("yyyy-MM-ddTHH:mm:ss.fff"))}&range=1800"; + var link = $"{url}?end={Uri.EscapeDataString(dateStart.AddSeconds(1800 * 0.9).ToString("yyyy-MM-ddTHH:mm:ss.fff"))}&range=1800"; row.Cell(columnDateStart).Value = dateStart; row.Cell(columnDateStart).SetHyperlink(new XLHyperlink(link)); diff --git a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs index 3c6d5b64..65231423 100644 --- a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs @@ -122,21 +122,21 @@ namespace AsbCloudWebApi.Controllers.SAUB /// Создает 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, [Range(1, 2)] int idDomain, CancellationToken token) + public async Task ExportAsync(int idWell, CancellationToken token) { var idCompany = User.GetCompanyId(); if (idCompany is null) return Forbid(); - - var stream = await detectedOperationExportService.ExportAsync(idWell, idDomain, token); + + var url = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host}/well/{idWell}/telemetry/monitoring"; + var stream = await detectedOperationExportService.ExportAsync(idWell, url, token); return File(stream, "application/octet-stream", "operations.xlsx"); } From cc45b55919b95ff09311601550e57a77edf1b844 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 18 Dec 2023 13:04:13 +0500 Subject: [PATCH 08/30] =?UTF-8?q?=D0=A0=D0=B5=D0=B3=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20IScheduleReportService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/DependencyInjection.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index a07bc70c..665e15d2 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -222,6 +222,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); From 0570c4f4e4ce35e1797b120725f05959745aadd9 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, 18 Dec 2023 13:51:40 +0500 Subject: [PATCH 09/30] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B0=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnabledSubsystemsFlags.cs | 50 ++++++++++++++++ AsbCloudDb/Model/DetectedOperation.cs | 58 +------------------ .../DetectedOperationExportService.cs | 12 ++-- .../Detectors/DetectorAbstract.cs | 29 +++++----- .../Detectors/DetectorDrilling.cs | 17 +----- .../EnabledSubsystemsFlagsExtensions.cs | 15 +++++ .../Specifications/Бурение ротор и слайд.md | 2 +- 7 files changed, 88 insertions(+), 95 deletions(-) create mode 100644 AsbCloudApp/Data/DetectedOperation/EnabledSubsystemsFlags.cs create mode 100644 AsbCloudInfrastructure/Services/DetectOperations/EnabledSubsystemsFlagsExtensions.cs diff --git a/AsbCloudApp/Data/DetectedOperation/EnabledSubsystemsFlags.cs b/AsbCloudApp/Data/DetectedOperation/EnabledSubsystemsFlags.cs new file mode 100644 index 00000000..7011a272 --- /dev/null +++ b/AsbCloudApp/Data/DetectedOperation/EnabledSubsystemsFlags.cs @@ -0,0 +1,50 @@ +using System; + +namespace AsbCloudApp.Data.DetectedOperation; + +/// +/// Флаги включенных подсистем +/// +[Flags] +public enum EnabledSubsystemsFlags +{ + /// + /// Автоподача долота + /// + AutoRotor = 1 << 0, + + /// + /// БУРЕНИЕ В СЛАЙДЕ + /// + AutoSlide = 1 << 1, + + /// + /// ПРОРАБОТКА + /// + AutoConditionig = 1 << 2, + + /// + /// СПУСК СПО + /// + AutoSinking = 1 << 3, + + /// + /// ПОДЪЕМ СПО + /// + AutoLifting = 1 << 4, + + /// + /// ПОДЪЕМ С ПРОРАБОТКОЙ + /// + AutoLiftingWithConditionig = 1 << 5, + + /// + /// блокировка + /// + AutoBlocknig = 1 << 6, + + /// + /// осцилляция + /// + AutoOscillation = 1 << 7, +} \ No newline at end of file diff --git a/AsbCloudDb/Model/DetectedOperation.cs b/AsbCloudDb/Model/DetectedOperation.cs index 6245780c..c1f66c79 100644 --- a/AsbCloudDb/Model/DetectedOperation.cs +++ b/AsbCloudDb/Model/DetectedOperation.cs @@ -41,7 +41,7 @@ namespace AsbCloudDb.Model [Column("value"), Comment("Ключевой показатель операции")] public double Value { get; set; } - [Column("enabled_subsystems"), Comment("флаги аключенных подсистем")] + [Column("enabled_subsystems"), Comment("флаги включенных подсистем")] public int EnabledSubsystems { get; set; } [Column("extra_data", TypeName = "jsonb"), Comment("доп. инфо по операции")] @@ -57,61 +57,5 @@ namespace AsbCloudDb.Model public override string ToString() => $"{IdCategory}\t{DateStart:G}\t{DateEnd:G}\t{DurationMinutes:#0.#}\t{DepthStart:#0.#}\t{DepthEnd:#0.#}"; - - /// - /// Флаги аключенных подсистем - /// - [Flags] - public enum EnabledSubsystemsFlags - { - /// - /// Автоподача долота - /// - AutoRotor = 1 << 0, - /// - /// БУРЕНИЕ В СЛАЙДЕ - /// - AutoSlide = 1 << 1, - /// - /// ПРОРАБОТКА - /// - AutoConditionig = 1 << 2, - /// - /// СПУСК СПО - /// - AutoSinking = 1 << 3, - /// - /// ПОДЪЕМ СПО - /// - AutoLifting = 1 << 4, - /// - /// ПОДЪЕМ С ПРОРАБОТКОЙ - /// - AutoLiftingWithConditionig = 1 << 5, - /// - /// блокировка - /// - AutoBlocknig = 1 << 6, - /// - /// Спин-мастер - /// - AutoSpinMaster = 1 << 7, - } - - /// - /// Есть ли флаг подсистемы у операции - /// - /// - /// - public bool HasSubsystemFlag(EnabledSubsystemsFlags flag) - => HasSubsystemFlag((int)flag); - - /// - /// Есть ли флаг/флаги подсистемы у операции - /// - /// - /// - public bool HasSubsystemFlag(int flags) - => (EnabledSubsystems & flags) > 0; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs index c158d5d2..ac59408f 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs @@ -8,8 +8,8 @@ using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.DetectedOperation; using AsbCloudInfrastructure.Services.DetectOperations.Detectors; -using AsbCloudApp.Repositories; namespace AsbCloudInfrastructure.Services.DetectOperations; @@ -46,13 +46,11 @@ public class DetectedOperationExportService private const int columnComment = 10; private readonly IAsbCloudDbContext dbContext; - private readonly IWellOperationRepository wellOperationRepository; - public DetectedOperationExportService(IAsbCloudDbContext dbContext, IWellOperationRepository wellOperationRepository) + public DetectedOperationExportService(IAsbCloudDbContext dbContext) { this.dbContext = dbContext; - this.wellOperationRepository = wellOperationRepository; - } + } public async Task ExportAsync(int idWell, int idDomain, CancellationToken cancellationToken) { @@ -151,8 +149,8 @@ public class DetectedOperationExportService private static string GetCategoryName(IEnumerable wellOperationCategories, DetectedOperation current) { var idCategory = current.IdCategory; - if (idCategory == WellOperationCategory.IdSlide - && current.HasSubsystemFlag(DetectedOperation.EnabledSubsystemsFlags.AutoSpinMaster)) + if (idCategory == WellOperationCategory.IdSlide && + EnabledSubsystemsFlags.AutoOscillation.HasEnabledSubsystems(current.EnabledSubsystems)) return "Бурение в слайде с осцилляцией"; var category = wellOperationCategories.FirstOrDefault(o => o.Id == current.IdCategory); diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs index ea2c3bba..28873719 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs @@ -1,6 +1,7 @@ using AsbCloudDb.Model; using System; using System.Collections.Generic; +using AsbCloudApp.Data.DetectedOperation; namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors { @@ -159,39 +160,35 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors private static int DetectEnabledSubsystems(DetectableTelemetry[] telemetry, int begin, int end, IDictionary extraData) { var enabledSubsystems = 0; - - if(extraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out var hasOscillation) - && hasOscillation is true) - { - enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSpinMaster; - - return enabledSubsystems; - } for (var i = begin; i < end; i += 2) { var mode = telemetry[i].Mode; - + + if (extraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out var hasOscillation) + && hasOscillation is true) + enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoOscillation; + if(mode == 1) - enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoRotor; + enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoRotor; if (mode == 3) - enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSlide; + enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoSlide; if (mode == 2) - enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoConditionig; + enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoConditionig; if (mode == 4) - enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSinking; + enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoSinking; if (mode == 5) - enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoLifting; + enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoLifting; if (mode == 6) - enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoLiftingWithConditionig; + enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoLiftingWithConditionig; if (mode == 10) - enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoBlocknig; + enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoBlocknig; } return enabledSubsystems; diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs index a26d04af..3e8b0fa1 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs @@ -64,7 +64,7 @@ public class DetectorDrilling : DetectorAbstract { [ExtraDataKeyAvgRotorSpeed] = avgRotorSpeed, [ExtraDataKeyDispersionOfNormalizedRotorSpeed] = dispersionOfNormalizedRotorSpeed, - [ExtraDataKeyHasOscillation] = avgRotorSpeed > 5 && dispersionOfNormalizedRotorSpeed > dispersionOfNormalizedRotorSpeedThreshold + [ExtraDataKeyHasOscillation] = avgRotorSpeed > 1 && dispersionOfNormalizedRotorSpeed > dispersionOfNormalizedRotorSpeedThreshold }; return (idCategory, extraData); } @@ -73,19 +73,8 @@ public class DetectorDrilling : DetectorAbstract { var telemetryRange = telemetry[begin..end] .OrderBy(t => t.DateTime).ToList(); - - for (var i = telemetryRange.Count - 1; i >= 0 && telemetryRange.Count > 1; i--) - { - if (Math.Abs(telemetryRange[i].WellDepth - telemetryRange[i - 1].WellDepth) < 0.001d) - { - telemetryRange.RemoveAt(i); - continue; - } - - break; - } - - var avgRotorSpeed = telemetryRange.Average(t => t.RotorSpeed); + + var avgRotorSpeed = telemetryRange.Average(t => t.RotorSpeed); var dispersion = telemetryRange.Average(t => Math.Pow(t.RotorSpeed / avgRotorSpeed - 1, 2)); return (avgRotorSpeed, dispersion); } diff --git a/AsbCloudInfrastructure/Services/DetectOperations/EnabledSubsystemsFlagsExtensions.cs b/AsbCloudInfrastructure/Services/DetectOperations/EnabledSubsystemsFlagsExtensions.cs new file mode 100644 index 00000000..09e0e387 --- /dev/null +++ b/AsbCloudInfrastructure/Services/DetectOperations/EnabledSubsystemsFlagsExtensions.cs @@ -0,0 +1,15 @@ +using AsbCloudApp.Data.DetectedOperation; + +namespace AsbCloudInfrastructure.Services.DetectOperations; + +public static class EnabledSubsystemsFlagsExtensions +{ + /// + /// Есть ли флаг подсистемы у операции + /// + /// + /// + /// + public static bool HasEnabledSubsystems(this EnabledSubsystemsFlags flags, int enabledSubsystems) + => (enabledSubsystems & (int)flags) > 0; +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Specifications/Бурение ротор и слайд.md b/AsbCloudInfrastructure/Services/DetectOperations/Specifications/Бурение ротор и слайд.md index fb6ea702..5736190f 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/Specifications/Бурение ротор и слайд.md +++ b/AsbCloudInfrastructure/Services/DetectOperations/Specifications/Бурение ротор и слайд.md @@ -24,4 +24,4 @@ ## Метод определения бурения в роторе, слайде с осцилляцией Необходимо рассчитать десперсию нормированных оборотов ротора по(по среднему значению) 1. Если полученное значение больше константы(0,2), то мы подтвердили что бурение в роторе. - 2. Если полученное значение меньше константы, то это бурение в слайде с осцилляцией. \ No newline at end of file + 2. Если полученное значение меньше константы, и средние обороты ротора больше 1, то это бурение ~~~~в слайде с осцилляцией. \ No newline at end of file From 8b15297a74e0fae35f08dcff5f47714a30550ee3 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, 18 Dec 2023 13:53:51 +0500 Subject: [PATCH 10/30] =?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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Subsystems/SubsystemActiveWellStatDto.cs | 4 +- AsbCloudApp/Requests/SubsystemRequest.cs | 24 +++++------ .../DailyReport/DailyReportService.cs | 2 +- .../Services/Subsystems/SubsystemService.cs | 41 +++++++++++-------- .../Services/WellInfoService.cs | 2 +- 5 files changed, 40 insertions(+), 33 deletions(-) diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs index 8636c252..04a7bce1 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs @@ -14,9 +14,9 @@ public class SubsystemActiveWellStatDto /// public SubsystemStatDto? SubsystemAPD { get; set; } /// - /// Наработки подсистемы СПИН + /// Наработки подсистемы с осцилляцией /// - public SubsystemStatDto? SubsystemSpinMaster { get; set; } + public SubsystemStatDto? SubsystemOscillation { get; set; } /// /// Наработки подсистемы ТОРК /// diff --git a/AsbCloudApp/Requests/SubsystemRequest.cs b/AsbCloudApp/Requests/SubsystemRequest.cs index 5749750a..79c88530 100644 --- a/AsbCloudApp/Requests/SubsystemRequest.cs +++ b/AsbCloudApp/Requests/SubsystemRequest.cs @@ -20,22 +20,22 @@ namespace AsbCloudApp.Requests /// /// Больше или равно дате /// - public DateTime? GeDate { get; set; } + public DateTimeOffset? GeDate { get; set; } /// /// Меньше или равно дате /// - public DateTime? LtDate { get; set; } + public DateTimeOffset? LeDate { get; set; } /// /// Больше или равно глубины забоя /// - public double? GtDepth { get; set; } + public double? GeDepth { get; set; } /// /// Меньше или равно глубины забоя /// - public double? LtDepth { get; set; } + public double? LeDepth { get; set; } /// public IEnumerable Validate(ValidationContext validationContext) @@ -45,20 +45,20 @@ namespace AsbCloudApp.Requests $"Должно быть больше {validationMinDate:O})", new[] { nameof(GeDate) }); - if (LtDate.HasValue && GeDate.HasValue) + if (LeDate.HasValue && GeDate.HasValue) { - if (LtDate < GeDate) + if (LeDate < GeDate) yield return new ValidationResult( - $"{nameof(LtDate)} должно быть больше {nameof(GeDate)}. ({LtDate:O} < {GeDate:O})", - new[] { nameof(LtDate), nameof(GeDate) }); + $"{nameof(LeDate)} должно быть больше {nameof(GeDate)}. ({LeDate:O} < {GeDate:O})", + new[] { nameof(LeDate), nameof(GeDate) }); } - if (LtDepth.HasValue && GtDepth.HasValue) + if (LeDepth.HasValue && GeDepth.HasValue) { - if (LtDepth < GtDepth) + if (LeDepth < GeDepth) yield return new ValidationResult( - $"{nameof(LtDepth)} должно быть больше {nameof(GtDepth)}. ({LtDepth} < {GtDepth})", - new[] { nameof(LtDepth), nameof(GtDepth) }); + $"{nameof(LeDepth)} должно быть больше {nameof(GeDepth)}. ({LeDepth} < {GeDepth})", + new[] { nameof(LeDepth), nameof(GeDepth) }); } yield break; diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index a1bea561..99a213d9 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -319,7 +319,7 @@ public class DailyReportService : IDailyReportService { IdWell = dailyReport.IdWell, GeDate = dailyReport.Date, - LtDate = dailyReport.Date.AddHours(24) + LeDate = dailyReport.Date.AddHours(24) }, cancellationToken); var subsystems = subsystemsStatPerWell diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index 3180c63b..6b5970b9 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -10,17 +10,16 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudInfrastructure.Services.DetectOperations; namespace AsbCloudInfrastructure.Services.Subsystems; internal class SubsystemService : ISubsystemService { - private const int IdEnabledSubsystemSpinMaster = 128; - private const int IdSubsystemAPD = 1; private const int IdSubsystemAPDRotor = 11; private const int IdSubsystemAPDSlide = 12; - private const int IdSubsystemSpinMaster = 65536; + private const int IdSubsystemOscillation = 65536; private readonly ICrudRepository subsystemRepository; @@ -50,10 +49,10 @@ internal class SubsystemService : ISubsystemService IdsOperationCategories = WellOperationCategory.MechanicalDrillingSubIds, GeDateStart = request.GeDate, - LeDateStart = request.LtDate, + LeDateStart = request.LeDate, - GeDepthStart = request.GtDepth, - LeDepthStart = request.LtDepth, + GeDepthStart = request.GeDepth, + LeDepthStart = request.LeDepth, }; var operations = await detectedOperationService.GetOperationSummaryAsync(detectedOperationSummaryRequest, @@ -66,7 +65,9 @@ internal class SubsystemService : ISubsystemService return stat; } - public async Task> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, + public async Task> GetStatByActiveWells(int idCompany, + DateTime? gtDate, + DateTime? ltDate, CancellationToken token) { var activeWells = await wellService.GetAsync(new() { IdCompany = idCompany, IdState = 1 }, token); @@ -98,7 +99,10 @@ internal class SubsystemService : ISubsystemService nameof(groupOperations.Key)), }; - var operationsWithEnableSubsystems = groupOperations.Where(o => o.EnabledSubsystems >= 1); + var operationsWithEnableSubsystems = groupOperations.Where(o => + (EnabledSubsystemsFlags.AutoRotor | + EnabledSubsystemsFlags.AutoSlide | + EnabledSubsystemsFlags.AutoOscillation).HasEnabledSubsystems(o.EnabledSubsystems)); var subsystemStat = new SubsystemStatDto { @@ -120,17 +124,18 @@ internal class SubsystemService : ISubsystemService if (apdSlidePart is not null) { - var operationsWithSpinMaster = operations.Where(s => s.EnabledSubsystems == IdEnabledSubsystemSpinMaster); - + var operationsWithOscillation = + operations.Where(o => EnabledSubsystemsFlags.AutoOscillation.HasEnabledSubsystems(o.EnabledSubsystems)); + var spinMaster = new SubsystemStatDto { - IdSubsystem = IdSubsystemSpinMaster, - SubsystemName = subsystems.FirstOrDefault(s => s.Id == IdSubsystemSpinMaster)?.Name ?? "unknown", - UsedTimeHours = operationsWithSpinMaster.Sum(o => o.SumDurationHours), + IdSubsystem = IdSubsystemOscillation, + SubsystemName = subsystems.FirstOrDefault(s => s.Id == IdSubsystemOscillation)?.Name ?? "unknown", + UsedTimeHours = operationsWithOscillation.Sum(o => o.SumDurationHours), SumOperationDepthInterval = apdSlidePart.SumOperationDepthInterval, SumOperationDurationHours = apdSlidePart.SumOperationDurationHours, - SumDepthInterval = operationsWithSpinMaster.Sum(o => o.SumDepthIntervals), - OperationCount = operationsWithSpinMaster.Sum(s => s.Count) + SumDepthInterval = operationsWithOscillation.Sum(o => o.SumDepthIntervals), + OperationCount = operationsWithOscillation.Sum(s => s.Count) }; spinMaster.KUsage = spinMaster.SumDepthInterval / spinMaster.SumOperationDepthInterval; @@ -161,7 +166,9 @@ internal class SubsystemService : ISubsystemService return stat; } - private async Task> GetStatAsync(IEnumerable wells, DateTime? gtDate, DateTime? ltDate, + private async Task> GetStatAsync(IEnumerable wells, + DateTime? gtDate, + DateTime? ltDate, CancellationToken token) { if (!wells.Any()) @@ -210,7 +217,7 @@ internal class SubsystemService : ISubsystemService continue; wellStat.SubsystemAPD = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemAPD); - wellStat.SubsystemSpinMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemSpinMaster); + wellStat.SubsystemOscillation = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemOscillation); } return wellsStat; diff --git a/AsbCloudInfrastructure/Services/WellInfoService.cs b/AsbCloudInfrastructure/Services/WellInfoService.cs index 6caa2c08..1bdd8ad9 100644 --- a/AsbCloudInfrastructure/Services/WellInfoService.cs +++ b/AsbCloudInfrastructure/Services/WellInfoService.cs @@ -156,7 +156,7 @@ public class WellInfoService var wellSubsystemStat = subsystemStat.FirstOrDefault(s => s.Well.Id == well.Id); wellMapInfo.SaubUsage = wellSubsystemStat?.SubsystemAPD?.KUsage ?? 0d; - wellMapInfo.SpinUsage = wellSubsystemStat?.SubsystemSpinMaster?.KUsage ?? 0d; + wellMapInfo.SpinUsage = wellSubsystemStat?.SubsystemOscillation?.KUsage ?? 0d; wellMapInfo.TorqueKUsage = wellSubsystemStat?.SubsystemTorqueMaster?.KUsage ?? 0d; wellMapInfo.TvdLagDays = wellOperationsStat?.TvdLagDays; wellMapInfo.TvdDrillingDays = wellOperationsStat?.TvdDrillingDays; From 37ec39f403d4d619a9013d6ef72e50abb187377d Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 18 Dec 2023 15:56:24 +0500 Subject: [PATCH 11/30] =?UTF-8?q?1.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20Mic?= =?UTF-8?q?rosoft.AspNetCore.Http.Extensions=202.=20=D0=9F=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83?= =?UTF-8?q?=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B0=D0=BC=20=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AsbCloudInfrastructure.csproj | 1 + .../DetectedOperationExportService.cs | 35 +++++++++++-------- .../SAUB/DetectedOperationController.cs | 4 +-- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index f2edc76d..a1816762 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -56,6 +56,7 @@ + diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs index a6038741..eb119b06 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs @@ -10,6 +10,7 @@ using System.Threading; using System.Threading.Tasks; using AsbCloudInfrastructure.Services.DetectOperations.Detectors; using AsbCloudApp.Repositories; +using Microsoft.AspNetCore.Http.Extensions; namespace AsbCloudInfrastructure.Services.DetectOperations; @@ -21,12 +22,6 @@ public class DetectedOperationExportService new DetectorSlipsTime() }; - private readonly IDictionary domains = new Dictionary - { - { 1, "https://cloud.digitaldrilling.ru" }, - { 2, "https://cloud.autodrilling.ru" } - }; - private const int headerRowsCount = 1; private const string cellDepositName = "B1"; @@ -54,7 +49,15 @@ public class DetectedOperationExportService this.wellOperationRepository = wellOperationRepository; } - public async Task ExportAsync(int idWell, string url, CancellationToken cancellationToken) + /// + /// Экспорт excel файла с операциями по скважине + /// + /// ключ скважины + /// хост + /// + /// + /// + public async Task ExportAsync(int idWell, string host, CancellationToken cancellationToken) { var well = await dbContext.Wells .Include(w => w.Cluster) @@ -69,17 +72,17 @@ public class DetectedOperationExportService var operations = await DetectOperationsAsync(well.IdTelemetry.Value, DateTime.UnixEpoch, cancellationToken); - return await GenerateExcelFileStreamAsync(well, url, operations, cancellationToken); + return await GenerateExcelFileStreamAsync(well, host, operations, cancellationToken); } - private async Task GenerateExcelFileStreamAsync(Well well, string url, IEnumerable operationDetectorResults, + private async Task GenerateExcelFileStreamAsync(Well well, string host, IEnumerable operationDetectorResults, CancellationToken cancellationToken) { using var excelTemplateStream = await GetExcelTemplateStreamAsync(cancellationToken); using var workbook = new XLWorkbook(excelTemplateStream, XLEventTracking.Disabled); - await AddToWorkbookAsync(workbook, well, url, operationDetectorResults, cancellationToken); + await AddToWorkbookAsync(workbook, well, host, operationDetectorResults, cancellationToken); MemoryStream memoryStream = new MemoryStream(); workbook.SaveAs(memoryStream, new SaveOptions { }); @@ -87,7 +90,7 @@ public class DetectedOperationExportService return memoryStream; } - private async Task AddToWorkbookAsync(XLWorkbook workbook, Well well, string url, IEnumerable operationDetectorResults, + private async Task AddToWorkbookAsync(XLWorkbook workbook, Well well, string host, IEnumerable operationDetectorResults, CancellationToken cancellationToken) { const string sheetName = "Операции"; @@ -98,12 +101,12 @@ public class DetectedOperationExportService var sheet = workbook.Worksheets.FirstOrDefault(ws => ws.Name == sheetName) ?? throw new FileFormatException($"Книга excel не содержит листа {sheetName}."); - await AddToSheetAsync(sheet, well, url, operationDetectorResults + await AddToSheetAsync(sheet, well, host, operationDetectorResults .OrderBy(x => x.Operation.DateStart).ThenBy(x => x.Operation.DepthStart).ToArray(), cancellationToken); } - private async Task AddToSheetAsync(IXLWorksheet sheet, Well well, string url, IList operationDetectorResults, + private async Task AddToSheetAsync(IXLWorksheet sheet, Well well, string host, IList operationDetectorResults, CancellationToken cancellationToken) { var wellOperationCategories = await dbContext.WellOperationCategories.ToListAsync(cancellationToken); @@ -134,7 +137,11 @@ public class DetectedOperationExportService && idReasonOfEndObject is int idReasonOfEnd) row.Cell(columnIdReasonOfEnd).Value = GetIdReasonOfEnd(idReasonOfEnd); - var link = $"{url}?end={Uri.EscapeDataString(dateStart.AddSeconds(1800 * 0.9).ToString("yyyy-MM-ddTHH:mm:ss.fff"))}&range=1800"; + var query = new QueryBuilder(); + query.Add("end", dateStart.AddSeconds(1800 * 0.9).ToString("yyyy-MM-ddTHH:mm:ss.fff")); + query.Add("range", "1800"); + + var link = $"{host}/well/{well.Id}/telemetry/monitoring{query}"; row.Cell(columnDateStart).Value = dateStart; row.Cell(columnDateStart).SetHyperlink(new XLHyperlink(link)); diff --git a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs index 65231423..02f2d4cb 100644 --- a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs @@ -135,8 +135,8 @@ namespace AsbCloudWebApi.Controllers.SAUB if (idCompany is null) return Forbid(); - var url = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host}/well/{idWell}/telemetry/monitoring"; - var stream = await detectedOperationExportService.ExportAsync(idWell, url, token); + var host = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host}"; + var stream = await detectedOperationExportService.ExportAsync(idWell, host, token); return File(stream, "application/octet-stream", "operations.xlsx"); } From a915e8365a6cbf70532e00abb620ac32fe925304 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: Tue, 19 Dec 2023 00:35:24 +0500 Subject: [PATCH 12/30] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=BE=D0=B2=D0=B0=D1=8F=20=D0=BC?= =?UTF-8?q?=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ectedOperations_And_Subsystems.Designer.cs | 9115 +++++++++++++++++ ...pdate_DetectedOperations_And_Subsystems.cs | 49 + .../AsbCloudDbContextModelSnapshot.cs | 4 +- .../DefaultData/EntityFillerSubsystem.cs | 2 +- 4 files changed, 9167 insertions(+), 3 deletions(-) create mode 100644 AsbCloudDb/Migrations/20231218192700_Update_DetectedOperations_And_Subsystems.Designer.cs create mode 100644 AsbCloudDb/Migrations/20231218192700_Update_DetectedOperations_And_Subsystems.cs diff --git a/AsbCloudDb/Migrations/20231218192700_Update_DetectedOperations_And_Subsystems.Designer.cs b/AsbCloudDb/Migrations/20231218192700_Update_DetectedOperations_And_Subsystems.Designer.cs new file mode 100644 index 00000000..e72e09a5 --- /dev/null +++ b/AsbCloudDb/Migrations/20231218192700_Update_DetectedOperations_And_Subsystems.Designer.cs @@ -0,0 +1,9115 @@ +// +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("20231218192700_Update_DetectedOperations_And_Subsystems")] + partial class Update_DetectedOperations_And_Subsystems + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.25") + .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"); + + b.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"); + + b.HasComment("Контакты"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .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"); + + b.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"); + + b.HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", 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") + .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("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"); + + 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("части программ бурения"); + }); + + 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"); + + b.HasComment("Drill_test"); + }); + + 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"); + + b.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"); + + b.HasComment("Категории файлов"); + + b.HasData( + new + { + Id = 1, + Name = "Растворный сервис", + ShortName = "fluidService" + }, + new + { + Id = 2, + Name = "Цементирование", + ShortName = "cement" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "nnb" + }, + new + { + Id = 4, + Name = "ГТИ", + ShortName = "gti" + }, + new + { + Id = 5, + Name = "Документы по скважине", + ShortName = "wellDocuments" + }, + new + { + Id = 6, + Name = "Супервайзер", + ShortName = "supervisor" + }, + new + { + Id = 7, + Name = "Мастер", + ShortName = "master" + }, + new + { + Id = 8, + Name = "Долотный сервис", + ShortName = "toolService" + }, + new + { + Id = 9, + Name = "Буровой подрядчик", + ShortName = "drillService" + }, + new + { + Id = 10, + Name = "Сервис по заканчиванию скважины", + ShortName = "closingService" + }, + new + { + Id = 12, + Name = "Рапорт", + ShortName = "report" + }, + new + { + Id = 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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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.ProcessMapWellDrilling", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + 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") + .HasColumnType("text") + .HasColumnName("comment") + .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("IdMode") + .HasColumnType("integer") + .HasColumnName("id_mode") + .HasComment("Id режима (1- ротор, 2 слайд)"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("LastUpdate") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_update") + .HasComment("Дата последнего изменения"); + + b.Property("PressureLimitMax") + .HasColumnType("double precision") + .HasColumnName("pressure_limit_max") + .HasComment("Перепад давления, допустимый максимум"); + + b.Property("PressurePlan") + .HasColumnType("double precision") + .HasColumnName("pressure_plan") + .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("IdUser"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map_well_drilling"); + + b.HasComment("РТК бурение скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapWellReam", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина по стволу до, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина по стволу от, м"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("LastUpdate") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_update") + .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("IdUser"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map_well_ream"); + + b.HasComment("РТК проработка скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("IdCompany", "IdWell"); + + b.HasIndex("IdWell"); + + b.ToTable("t_relation_company_well"); + + b.HasComment("отношение скважин и компаний"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.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"); + + b.HasComment("Отношение пользователей и частей ПБ"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission"); + + b.HasComment("Отношение ролей пользователей и разрешений доступа"); + + 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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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.ToView("mw_telemetry_datas_saub_stat"); + }); + + 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"); + + b.HasComment("набор основных данных по SpinMaster"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.Property("MessageTemplate") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message_template"); + + b.HasKey("IdTelemetry", "IdEvent"); + + b.ToTable("t_telemetry_event"); + + b.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + 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"); + + b.HasComment("Сообщения на буровых"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname"); + + b.HasKey("IdTelemetry", "IdUser"); + + b.ToTable("t_telemetry_user"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.HasComment("настройки интерфейса пользователя"); + }); + + 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"); + + b.HasComment("скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины получателя"); + + b.Property("IdWellSrc") + .HasColumnType("integer") + .HasColumnName("id_well_src") + .HasComment("Id скважины композита"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции композита"); + + b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); + + b.HasIndex("IdWellSectionType"); + + b.HasIndex("IdWellSrc"); + + b.ToTable("t_well_composite"); + + b.HasComment("Композитная скважина"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.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"); + + b.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"); + + b.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"); + + b.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.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") + .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"); + + b.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.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"); + + b.HasComment("конструкция скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Наклонно-направленная" + }, + new + { + Id = 2, + Caption = "Горизонтальная" + }); + }); + + 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"); + + 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.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.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.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") + .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.ProcessMapWellDrilling", 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.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapWellReam", 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.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + 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/20231218192700_Update_DetectedOperations_And_Subsystems.cs b/AsbCloudDb/Migrations/20231218192700_Update_DetectedOperations_And_Subsystems.cs new file mode 100644 index 00000000..fbb49d7d --- /dev/null +++ b/AsbCloudDb/Migrations/20231218192700_Update_DetectedOperations_And_Subsystems.cs @@ -0,0 +1,49 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class Update_DetectedOperations_And_Subsystems : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "enabled_subsystems", + table: "t_detected_operation", + type: "integer", + nullable: false, + comment: "флаги включенных подсистем", + oldClrType: typeof(int), + oldType: "integer", + oldComment: "флаги аключенных подсистем"); + + migrationBuilder.UpdateData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 1, + column: "name", + value: "АПД"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "enabled_subsystems", + table: "t_detected_operation", + type: "integer", + nullable: false, + comment: "флаги аключенных подсистем", + oldClrType: typeof(int), + oldType: "integer", + oldComment: "флаги включенных подсистем"); + + migrationBuilder.UpdateData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 1, + column: "name", + value: "АКБ"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 15d6d5fc..fd9e2d0b 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -386,7 +386,7 @@ namespace AsbCloudDb.Migrations b.Property("EnabledSubsystems") .HasColumnType("integer") .HasColumnName("enabled_subsystems") - .HasComment("флаги аключенных подсистем"); + .HasComment("флаги включенных подсистем"); b.Property>("ExtraData") .IsRequired() @@ -4574,7 +4574,7 @@ namespace AsbCloudDb.Migrations { Id = 1, Description = "Совместная работа режимов \"Бурение в роторе\" и \"Бурение в слайде\"", - Name = "АКБ" + Name = "АПД" }, new { diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs b/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs index 12d1d05a..48de1bb4 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs @@ -4,7 +4,7 @@ { public override Subsystem[] GetData() => new Subsystem[]{ // САУБ - ид подсистем с 1 до 65_535 - new () {Id = 1, Name = "АКБ", Description = "Совместная работа режимов \"Бурение в роторе\" и \"Бурение в слайде\""}, + new () {Id = 1, Name = "АПД", Description = "Совместная работа режимов \"Бурение в роторе\" и \"Бурение в слайде\""}, new () {Id = 11, Name = "АПД ротор", Description = "Режим работы \"Бурение в роторе\""}, new () {Id = 12, Name = "АПД слайд", Description = "Режим работы \"Бурение в слайде\""}, //Spin master - id подсистем с 65_536 до 131_071 From 697d1061f7896d0969b590d100796ed5ba1e4b17 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: Tue, 19 Dec 2023 00:40:04 +0500 Subject: [PATCH 13/30] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D1=8F=D0=B5=D0=BC=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Удалил неиспользуемые DTO и метод из сервиса 2. Рефакторинг Requests --- .../DetectedOperation/DetectedOperationDto.cs | 14 +++- .../DetectedOperation/OperationsSummaryDto.cs | 37 --------- .../Requests/DetectedOperationRequest.cs | 17 ++-- .../DetectedOperationSummaryRequest.cs | 53 ------------- .../Services/IDetectedOperationService.cs | 8 -- .../DailyReport/DailyReportService.cs | 4 +- .../DetectedOperationService.cs | 77 +++---------------- 7 files changed, 38 insertions(+), 172 deletions(-) delete mode 100644 AsbCloudApp/Data/DetectedOperation/OperationsSummaryDto.cs delete mode 100644 AsbCloudApp/Requests/DetectedOperationSummaryRequest.cs diff --git a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs index 9ca920b9..0b9a2f91 100644 --- a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs +++ b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs @@ -12,6 +12,11 @@ namespace AsbCloudApp.Data.DetectedOperation /// public int IdWell { get; set; } + + /// + /// Id телеметрии + /// + public int IdTelemetry { get; set; } /// /// Id названия/описания операции @@ -34,9 +39,9 @@ namespace AsbCloudApp.Data.DetectedOperation public DateTime DateEnd { get; set; } /// - /// Продолжительность операции в минутах + /// Продолжительность операции в часах /// - public double DurationMinutes => (DateEnd - DateStart).TotalMinutes; + public double DurationHours => (DateEnd - DateStart).TotalHours; /// /// глубина на начало операции, м @@ -72,5 +77,10 @@ namespace AsbCloudApp.Data.DetectedOperation /// Ключевой параметр операции /// public double Value { get; set; } + + /// + /// Флаг включенной подсистемы + /// + public int EnabledSubsystems { get; set; } } } diff --git a/AsbCloudApp/Data/DetectedOperation/OperationsSummaryDto.cs b/AsbCloudApp/Data/DetectedOperation/OperationsSummaryDto.cs deleted file mode 100644 index 74fe1e7b..00000000 --- a/AsbCloudApp/Data/DetectedOperation/OperationsSummaryDto.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace AsbCloudApp.Data.DetectedOperation; - -/// -/// Статистика по операциям -/// -public class OperationsSummaryDto -{ - /// - /// Id телеметрии - /// - public int IdTelemetry { get; set; } - - /// - /// Id названия/описания операции - /// - public int IdCategory { get; set; } - - /// - /// Количество операций - /// - public int Count { get; set; } - - /// - /// Cумма проходок операций - /// - public double SumDepthIntervals { get; set; } - - /// - /// Cумма продолжительностей операций - /// - public double SumDurationHours { get; set; } - - /// - /// Флаг включенной подсистемы - /// - public int EnabledSubsystems { get; set; } -} diff --git a/AsbCloudApp/Requests/DetectedOperationRequest.cs b/AsbCloudApp/Requests/DetectedOperationRequest.cs index 9bfa22f7..1e38ff7b 100644 --- a/AsbCloudApp/Requests/DetectedOperationRequest.cs +++ b/AsbCloudApp/Requests/DetectedOperationRequest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.Linq; namespace AsbCloudApp.Requests { @@ -14,31 +15,37 @@ namespace AsbCloudApp.Requests /// [Required] public int IdWell { get; set; } + + /// + /// Список id телеметрий + /// пустой список - нет фильтрации + /// + public IEnumerable IdsTelemetries { get; set; } = Enumerable.Empty(); /// /// категории операций /// - public IEnumerable? IdsCategories { get; set; } + public IEnumerable IdsCategories { get; set; } = Enumerable.Empty(); /// /// Больше или равно дате /// - public DateTime? GtDate { get; set; } + public DateTimeOffset? GeDateStart { get; set; } /// /// Меньше или равно дате /// - public DateTime? LtDate { get; set; } + public DateTimeOffset? LeDateEnd { get; set; } /// /// Больше или равно глубины забоя /// - public double? GtDepth { get; set; } + public double? GeDepth { get; set; } /// /// Меньше или равно глубины забоя /// - public double? LtDepth { get; set; } + public double? LeDepth { get; set; } /// /// Фильтр по пользователю панели diff --git a/AsbCloudApp/Requests/DetectedOperationSummaryRequest.cs b/AsbCloudApp/Requests/DetectedOperationSummaryRequest.cs deleted file mode 100644 index 2b362f28..00000000 --- a/AsbCloudApp/Requests/DetectedOperationSummaryRequest.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace AsbCloudApp.Requests; - -/// -/// Запрос на получение обобщенных данных по операцим -/// -public class DetectedOperationSummaryRequest -{ - /// - /// Список id телеметрий - /// пустой список - нет фильтрации - /// - public IEnumerable IdsTelemetries { get;set;} = Enumerable.Empty(); - - /// - /// Список id категорий операций - /// пустой список - нет фильтрации - /// - public IEnumerable IdsOperationCategories { get; set; } = Enumerable.Empty(); - - /// - /// Больше или равно даты начала операции - /// - public DateTimeOffset? GeDateStart {get;set;} - - /// - /// Меньше или равно даты начала операции - /// - public DateTimeOffset? LeDateStart { get; set; } - - /// - /// Меньше или равно даты окончания операции - /// - public DateTimeOffset? LeDateEnd { get; set; } - - /// - /// Больше или равно глубины начала операции - /// - public double? GeDepthStart { get; set; } - - /// - /// Меньше или равно глубины начала операции - /// - public double? LeDepthStart { get; set; } - - /// - /// Меньше или равно глубины окончания операции - /// - public double? LeDepthEnd { get; set; } -} diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs index 1117d8e3..0ba595ff 100644 --- a/AsbCloudApp/Services/IDetectedOperationService.cs +++ b/AsbCloudApp/Services/IDetectedOperationService.cs @@ -37,14 +37,6 @@ namespace AsbCloudApp.Services /// Task?> GetOperationsAsync(DetectedOperationRequest request, CancellationToken token); - /// - /// Получить интервалы глубин по всем скважинам - /// - /// - /// - /// кортеж - ид телеметрии, интервалы глубины забоя (ротор,слайд) - Task> GetOperationSummaryAsync(DetectedOperationSummaryRequest request, CancellationToken token); - /// /// Удалить операции /// diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index 99a213d9..78e7f67e 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -263,8 +263,8 @@ public class DailyReportService : IDailyReportService { IdsCategories = new[] { idWellOperationSlipsTime }, IdWell = dailyReport.IdWell, - GtDate = dailyReport.Date, - LtDate = dailyReport.Date.AddHours(24) + GeDateStart = dailyReport.Date, + LeDateEnd = dailyReport.Date.AddHours(24) }, cancellationToken))?.Stats.Sum(s => s.Count); dailyReport.TimeBalanceBlock.WellDepth.Fact = factWellOperations diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 65b4722c..4b58e235 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -65,62 +65,6 @@ namespace AsbCloudInfrastructure.Services.DetectOperations return dtos; } - public async Task> GetOperationSummaryAsync(DetectedOperationSummaryRequest request, CancellationToken token) - { - var query = db.Set() - .AsNoTracking(); - - if (request.IdsTelemetries.Any()) - query = query.Where(operation => request.IdsTelemetries.Contains(operation.IdTelemetry)); - - if (request.IdsOperationCategories.Any()) - query = query.Where(operation => request.IdsOperationCategories.Contains(operation.IdCategory)); - - if (request.GeDateStart.HasValue) - { - var geDateStart = request.GeDateStart.Value.ToUniversalTime(); - query = query.Where(operation => operation.DateStart >= geDateStart); - } - - if (request.LeDateStart.HasValue) - { - var leDateStart = request.LeDateStart.Value.ToUniversalTime(); - query = query.Where(operation => operation.DateStart <= leDateStart); - } - - if (request.LeDateEnd.HasValue) - { - var leDateEnd = request.LeDateEnd.Value.ToUniversalTime(); - query = query.Where(operation => operation.DateEnd <= leDateEnd); - } - - if (request.GeDepthStart.HasValue) - query = query.Where(operation => operation.DepthStart >= request.GeDepthStart.Value); - - if (request.LeDepthStart.HasValue) - query = query.Where(operation => operation.DepthStart <= request.LeDepthStart.Value); - - if (request.LeDepthEnd.HasValue) - query = query.Where(operation => operation.DepthEnd <= request.LeDepthEnd.Value); - - var queryGroup = query - .GroupBy(operation => new { operation.IdTelemetry, operation.IdCategory, operation.EnabledSubsystems }) - .Select(group => new OperationsSummaryDto - { - IdTelemetry = group.Key.IdTelemetry, - IdCategory = group.Key.IdCategory, - EnabledSubsystems = group.Key.EnabledSubsystems, - Count = group.Count(), - SumDepthIntervals = group.Sum(operation => operation.DepthEnd - operation.DepthStart), - SumDurationHours = group.Sum(operation => (operation.DateEnd - operation.DateStart).TotalHours), - }) - .OrderBy(summ => summ.IdTelemetry) - .ThenBy(summ => summ.IdCategory); - - var result = await queryGroup.ToArrayAsync(token); - return result; - } - private static IEnumerable GetOperationsDrillersStat(IEnumerable operations) { var groups = operations.GroupBy(o => o.Driller); @@ -241,20 +185,23 @@ namespace AsbCloudInfrastructure.Services.DetectOperations if (request is not null) { - if (request.IdsCategories?.Any() == true) + if (request.IdsTelemetries.Any()) + query = query.Where(o => request.IdsTelemetries.Contains(o.IdTelemetry)); + + if (request.IdsCategories.Any()) query = query.Where(o => request.IdsCategories.Contains(o.IdCategory)); - if (request.GtDate is not null) - query = query.Where(o => o.DateStart >= request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours)); + if (request.GeDateStart is not null) + query = query.Where(o => o.DateStart >= request.GeDateStart.Value.Date.ToUtcDateTimeOffset(well.Timezone.Hours)); - if (request.LtDate is not null) - query = query.Where(o => o.DateEnd <= request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours)); + if (request.LeDateEnd is not null) + query = query.Where(o => o.DateEnd <= request.LeDateEnd.Value.Date.ToUtcDateTimeOffset(well.Timezone.Hours)); - if (request.GtDepth is not null) - query = query.Where(o => o.DepthStart >= request.GtDepth); + if (request.GeDepth is not null) + query = query.Where(o => o.DepthStart >= request.GeDepth); - if (request.LtDepth is not null) - query = query.Where(o => o.DepthEnd <= request.LtDepth); + if (request.LeDepth is not null) + query = query.Where(o => o.DepthEnd <= request.LeDepth); if (request.EqIdTelemetryUser is not null) query = query.Where(o => o.IdUsersAtStart == request.EqIdTelemetryUser); From c924170a54064d19080c69d3ec5a55b3b50557e4 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 19 Dec 2023 09:21:09 +0500 Subject: [PATCH 14/30] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20=D0=B4=D0=B0?= =?UTF-8?q?=D1=82=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WellOperationExportService.cs | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationExportService.cs b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationExportService.cs index e9f1a01f..e4ffd14e 100644 --- a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationExportService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationExportService.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -36,17 +35,15 @@ public class WellOperationExportService : IWellOperationExportService IdWell = idWell }, cancellationToken); - var timezone = wellService.GetTimezone(idWell); - - return MakeExcelFileStream(operations, timezone.Hours); + return MakeExcelFileStream(operations); } - private Stream MakeExcelFileStream(IEnumerable operations, double timezoneOffset) + private Stream MakeExcelFileStream(IEnumerable operations) { using Stream ecxelTemplateStream = wellOperationImportTemplateService.GetExcelTemplateStream(); using var workbook = new XLWorkbook(ecxelTemplateStream, XLEventTracking.Disabled); - AddOperationsToWorkbook(workbook, operations, timezoneOffset); + AddOperationsToWorkbook(workbook, operations); var memoryStream = new MemoryStream(); workbook.SaveAs(memoryStream, new SaveOptions { }); @@ -54,14 +51,14 @@ public class WellOperationExportService : IWellOperationExportService return memoryStream; } - private void AddOperationsToWorkbook(XLWorkbook workbook, IEnumerable operations, double timezoneOffset) + private void AddOperationsToWorkbook(XLWorkbook workbook, IEnumerable operations) { var planOperations = operations.Where(o => o.IdType == 0); if (planOperations.Any()) { var sheetPlan = workbook.Worksheets.FirstOrDefault(ws => ws.Name == DefaultTemplateInfo.SheetNamePlan); if (sheetPlan is not null) - AddOperationsToSheet(sheetPlan, planOperations, timezoneOffset); + AddOperationsToSheet(sheetPlan, planOperations); } var factOperations = operations.Where(o => o.IdType == 1); @@ -69,11 +66,11 @@ public class WellOperationExportService : IWellOperationExportService { var sheetFact = workbook.Worksheets.FirstOrDefault(ws => ws.Name == DefaultTemplateInfo.SheetNameFact); if (sheetFact is not null) - AddOperationsToSheet(sheetFact, factOperations, timezoneOffset); + AddOperationsToSheet(sheetFact, factOperations); } } - private void AddOperationsToSheet(IXLWorksheet sheet, IEnumerable operations, double timezoneOffset) + private void AddOperationsToSheet(IXLWorksheet sheet, IEnumerable operations) { var operationsToArray = operations.ToArray(); @@ -83,19 +80,19 @@ public class WellOperationExportService : IWellOperationExportService for (int i = 0; i < operationsToArray.Length; i++) { var row = sheet.Row(1 + i + DefaultTemplateInfo.HeaderRowsCount); - AddOperationToRow(row, operationsToArray[i], sections, categories, timezoneOffset); + AddOperationToRow(row, operationsToArray[i], sections, categories); } } private static void AddOperationToRow(IXLRow row, WellOperationDto operation, IEnumerable sections, - IEnumerable categories, double timezoneOffset) + IEnumerable categories) { row.Cell(DefaultTemplateInfo.ColumnSection).Value = sections.First(s => s.Id == operation.IdWellSectionType).Caption; row.Cell(DefaultTemplateInfo.ColumnCategory).Value = categories.First(o => o.Id == operation.IdCategory).Name; row.Cell(DefaultTemplateInfo.ColumnCategoryInfo).Value = operation.CategoryInfo; row.Cell(DefaultTemplateInfo.ColumnDepthStart).Value = operation.DepthStart; row.Cell(DefaultTemplateInfo.ColumnDepthEnd).Value = operation.DepthEnd; - row.Cell(DefaultTemplateInfo.ColumnDate).Value = new DateTimeOffset(operation.DateStart).ToRemoteDateTime(timezoneOffset); + row.Cell(DefaultTemplateInfo.ColumnDate).Value = operation.DateStart; row.Cell(DefaultTemplateInfo.ColumnDuration).Value = operation.DurationHours; row.Cell(DefaultTemplateInfo.ColumnComment).Value = operation.Comment; } From b32f115568eb296979074eb2d7e5c8cc7db76e2e 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: Tue, 19 Dec 2023 00:41:02 +0500 Subject: [PATCH 15/30] =?UTF-8?q?=D0=9D=D0=B0=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Добавлен фильр по бурильщику 2. Рефакторинг класса --- .../DetectedOperation/DetectedOperationDto.cs | 4 +- AsbCloudApp/Requests/SubsystemRequest.cs | 5 + .../Detectors/DetectorDrilling.cs | 4 +- .../Services/Subsystems/SubsystemService.cs | 196 +++++++++++------- 4 files changed, 125 insertions(+), 84 deletions(-) diff --git a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs index 0b9a2f91..cdc6571b 100644 --- a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs +++ b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs @@ -39,9 +39,9 @@ namespace AsbCloudApp.Data.DetectedOperation public DateTime DateEnd { get; set; } /// - /// Продолжительность операции в часах + /// Продолжительность операции в минутах /// - public double DurationHours => (DateEnd - DateStart).TotalHours; + public double DurationMinutes => (DateEnd - DateStart).TotalMinutes; /// /// глубина на начало операции, м diff --git a/AsbCloudApp/Requests/SubsystemRequest.cs b/AsbCloudApp/Requests/SubsystemRequest.cs index 79c88530..23a7e70a 100644 --- a/AsbCloudApp/Requests/SubsystemRequest.cs +++ b/AsbCloudApp/Requests/SubsystemRequest.cs @@ -17,6 +17,11 @@ namespace AsbCloudApp.Requests [Required] public int IdWell { get; set; } + /// + /// Идентификатор бурильщика + /// + public int? IdDriller { get; set; } + /// /// Больше или равно дате /// diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs index 3e8b0fa1..68eda39e 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs @@ -71,9 +71,7 @@ public class DetectorDrilling : DetectorAbstract private static (double avgRotorSpeed, double dispersionOfNormalizedRotorSpeed) CalcCriteries(DetectableTelemetry[] telemetry, int begin, int end) { - var telemetryRange = telemetry[begin..end] - .OrderBy(t => t.DateTime).ToList(); - + var telemetryRange = telemetry[begin..end]; var avgRotorSpeed = telemetryRange.Average(t => t.RotorSpeed); var dispersion = telemetryRange.Average(t => Math.Pow(t.RotorSpeed / avgRotorSpeed - 1, 2)); return (avgRotorSpeed, dispersion); diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index 6b5970b9..7ff4076a 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -27,6 +27,8 @@ internal class SubsystemService : ISubsystemService private readonly IDetectedOperationService detectedOperationService; private readonly ITelemetryDataSaubService telemetryDataSaubService; + private IDictionary subsystems = new Dictionary(); + public SubsystemService(ICrudRepository subsystemRepository, IWellService wellService, IDetectedOperationService detectedOperationService, @@ -43,21 +45,25 @@ internal class SubsystemService : ISubsystemService var well = await wellService.GetOrDefaultAsync(request.IdWell, token) ?? throw new ArgumentInvalidException(nameof(request.IdWell), $"Well Id: {request.IdWell} does not exist"); - var detectedOperationSummaryRequest = new DetectedOperationSummaryRequest + var detectedOperationSummaryRequest = new DetectedOperationRequest { + IdWell = request.IdWell, IdsTelemetries = new[] { well.IdTelemetry!.Value }, - IdsOperationCategories = WellOperationCategory.MechanicalDrillingSubIds, + IdsCategories = WellOperationCategory.MechanicalDrillingSubIds, GeDateStart = request.GeDate, - LeDateStart = request.LeDate, + LeDateEnd = request.LeDate, - GeDepthStart = request.GeDepth, - LeDepthStart = request.LeDepth, + GeDepth = request.GeDepth, + LeDepth = request.LeDepth, }; - var operations = await detectedOperationService.GetOperationSummaryAsync(detectedOperationSummaryRequest, + var operations = await detectedOperationService.GetOperationsAsync(detectedOperationSummaryRequest, token); + if (request.IdDriller.HasValue) + operations = operations.Where(o => o.Driller is not null && o.Driller.Id == request.IdDriller.Value); + if (!operations.Any()) return Enumerable.Empty(); @@ -81,89 +87,119 @@ internal class SubsystemService : ISubsystemService var result = await GetStatAsync(activeWells, null, null, token); return result; } - - private async Task> CalcStatAsync(IEnumerable operations, CancellationToken token) + + private async Task> CalcStatAsync(IEnumerable operations, CancellationToken token) { - var subsystems = await subsystemRepository.GetAllAsync(token); + if (!subsystems.Any()) + subsystems = (await subsystemRepository.GetAllAsync(token)).ToDictionary(s => s.Id, s => s); - var groupedOperations = operations - .GroupBy(o => o.IdCategory); + var oscillationStat = CalcOscillationStat(operations); + var apdStat = CalcApdStat(operations); - var stat = groupedOperations.Select(groupOperations => + var stat = new List { oscillationStat }; + stat.AddRange(apdStat); + + return stat; + } + + private SubsystemStatDto CalcOscillationStat(IEnumerable operations) + { + operations = operations.Where(o => o.IdCategory == WellOperationCategory.IdSlide); + + var (sumDepthInterval, usedTimeHours, operationCount) = AggregateOperations(IdSubsystemOscillation, operations); + + var oscillationStat = new SubsystemStatDto { - var idSubsystem = groupOperations.Key switch + IdSubsystem = IdSubsystemOscillation, + SubsystemName = subsystems.TryGetValue(IdSubsystemOscillation, out var subsystemDto) ? subsystemDto.Name : "unknown", + UsedTimeHours = usedTimeHours, + SumOperationDepthInterval = operations.Sum(o => o.DepthEnd - o.DepthStart), + SumOperationDurationHours = operations.Sum(o => o.DurationMinutes / 60), + SumDepthInterval = sumDepthInterval, + OperationCount = operationCount, + }; + + oscillationStat.KUsage = oscillationStat.SumDepthInterval / oscillationStat.SumOperationDepthInterval; + + return oscillationStat; + } + + private IEnumerable CalcApdStat(IEnumerable operations) + { + var apdRotorAndSlide = operations + .Where(o => WellOperationCategory.MechanicalDrillingSubIds.Contains(o.IdCategory)) + .GroupBy(o => o.IdCategory) + .Select(group => { - WellOperationCategory.IdRotor => IdSubsystemAPDRotor, - WellOperationCategory.IdSlide => IdSubsystemAPDSlide, - _ => throw new ArgumentException($"IdCategory: {groupOperations.Key} does not supported in this method", - nameof(groupOperations.Key)), - }; - - var operationsWithEnableSubsystems = groupOperations.Where(o => - (EnabledSubsystemsFlags.AutoRotor | - EnabledSubsystemsFlags.AutoSlide | - EnabledSubsystemsFlags.AutoOscillation).HasEnabledSubsystems(o.EnabledSubsystems)); - - var subsystemStat = new SubsystemStatDto - { - IdSubsystem = idSubsystem, - SubsystemName = subsystems.FirstOrDefault(s => s.Id == idSubsystem)?.Name ?? "unknown", - UsedTimeHours = operationsWithEnableSubsystems.Sum(o => o.SumDurationHours), - SumOperationDepthInterval = groupOperations.Sum(o => o.SumDepthIntervals), - SumOperationDurationHours = groupOperations.Sum(o => o.SumDurationHours), - SumDepthInterval = operationsWithEnableSubsystems.Sum(o => o.SumDepthIntervals), - OperationCount = operationsWithEnableSubsystems.Sum(o => o.Count), - }; + var idSubsystem = group.Key switch + { + WellOperationCategory.IdRotor => IdSubsystemAPDRotor, + WellOperationCategory.IdSlide => IdSubsystemAPDSlide, + _ => throw new ArgumentException($"IdCategory: {group.Key} does not supported in this method", nameof(group.Key)) + }; - subsystemStat.KUsage = subsystemStat.SumDepthInterval / subsystemStat.SumOperationDepthInterval; - - return subsystemStat; - }); + var (sumDepthInterval, usedTimeHours, operationCount) = AggregateOperations(idSubsystem, group); - var apdSlidePart = stat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemAPDSlide); + var subsystemStat = new SubsystemStatDto + { + IdSubsystem = idSubsystem, + SubsystemName = subsystems.TryGetValue(idSubsystem, out var subsystemDto) ? subsystemDto.Name : "unknown", + UsedTimeHours = usedTimeHours, + SumOperationDepthInterval = group.Sum(o => o.DepthEnd - o.DepthStart), + SumOperationDurationHours = group.Sum(o => o.DurationMinutes / 60), + SumDepthInterval = sumDepthInterval, + OperationCount = operationCount, + }; - if (apdSlidePart is not null) - { - var operationsWithOscillation = - operations.Where(o => EnabledSubsystemsFlags.AutoOscillation.HasEnabledSubsystems(o.EnabledSubsystems)); + subsystemStat.KUsage = subsystemStat.SumDepthInterval / subsystemStat.SumOperationDepthInterval; - var spinMaster = new SubsystemStatDto - { - IdSubsystem = IdSubsystemOscillation, - SubsystemName = subsystems.FirstOrDefault(s => s.Id == IdSubsystemOscillation)?.Name ?? "unknown", - UsedTimeHours = operationsWithOscillation.Sum(o => o.SumDurationHours), - SumOperationDepthInterval = apdSlidePart.SumOperationDepthInterval, - SumOperationDurationHours = apdSlidePart.SumOperationDurationHours, - SumDepthInterval = operationsWithOscillation.Sum(o => o.SumDepthIntervals), - OperationCount = operationsWithOscillation.Sum(s => s.Count) - }; - - spinMaster.KUsage = spinMaster.SumDepthInterval / spinMaster.SumOperationDepthInterval; - - stat = stat.Append(spinMaster); - } - - var apdParts = stat.Where(s => s.IdSubsystem is IdSubsystemAPDRotor or IdSubsystemAPDSlide); - - if (!apdParts.Any()) - return stat; + return subsystemStat; + }); + + if (!apdRotorAndSlide.Any()) + return Enumerable.Empty(); var apdSum = new SubsystemStatDto { IdSubsystem = IdSubsystemAPD, - SubsystemName = "АПД", - UsedTimeHours = apdParts.Sum(part => part.UsedTimeHours), - SumOperationDepthInterval = apdParts.Sum(part => part.SumOperationDepthInterval), - SumOperationDurationHours = apdParts.Sum(part => part.SumOperationDurationHours), - SumDepthInterval = apdParts.Sum(part => part.SumDepthInterval), - OperationCount = apdParts.Sum(part => part.OperationCount), + SubsystemName = subsystems.TryGetValue(IdSubsystemAPD, out var subsystemDto) ? subsystemDto.Name : "unknown", + UsedTimeHours = apdRotorAndSlide.Sum(part => part.UsedTimeHours), + SumOperationDepthInterval = apdRotorAndSlide.Sum(part => part.SumOperationDepthInterval), + SumOperationDurationHours = apdRotorAndSlide.Sum(part => part.SumOperationDurationHours), + SumDepthInterval = apdRotorAndSlide.Sum(part => part.SumDepthInterval), + OperationCount = apdRotorAndSlide.Sum(part => part.OperationCount), }; apdSum.KUsage = apdSum.SumDepthInterval / apdSum.SumOperationDepthInterval; - - stat = stat.Append(apdSum).OrderBy(m => m.IdSubsystem); - return stat; + var apdStat = new List { apdSum }; + apdStat.AddRange(apdRotorAndSlide); + + return apdStat; + } + + private static (double SumDepthInterval, double UsedTimeHours, int Count) AggregateOperations(int idSubsystem, + IEnumerable operations) => + idSubsystem switch + { + IdSubsystemAPDRotor => CalcOperationsByEnableSubsystems(operations, EnabledSubsystemsFlags.AutoRotor), + IdSubsystemAPDSlide => CalcOperationsByEnableSubsystems(operations, + EnabledSubsystemsFlags.AutoSlide | EnabledSubsystemsFlags.AutoOscillation), + IdSubsystemOscillation => CalcOperationsByEnableSubsystems(operations, EnabledSubsystemsFlags.AutoOscillation), + _ => throw new ArgumentException($"IdSubsystem: {idSubsystem} does not supported in this method", nameof(idSubsystem)) + }; + + private static (double SumDepthInterval, double UsedTimeHours, int OperationCount) CalcOperationsByEnableSubsystems( + IEnumerable operations, + EnabledSubsystemsFlags enabledSubsystems) + { + var filtered = operations.Where(o => enabledSubsystems.HasEnabledSubsystems(o.EnabledSubsystems)); + + var sumDepthInterval = filtered.Sum(o => o.DepthEnd - o.DepthStart); + var usedTimeHours = filtered.Sum(o => o.DurationMinutes / 60); + var operationCount = filtered.Count(); + + return (sumDepthInterval, usedTimeHours, operationCount); } private async Task> GetStatAsync(IEnumerable wells, @@ -195,14 +231,16 @@ internal class SubsystemService : ISubsystemService ? ltDate.Value.ToUtcDateTimeOffset(hoursOffset) : dateRange.To.ToUtcDateTimeOffset(hoursOffset); + var request = new DetectedOperationRequest + { + IdsTelemetries = idsTelemetries, + IdsCategories = WellOperationCategory.MechanicalDrillingSubIds, + GeDateStart = beginUTC, + LeDateEnd = endUTC, + }; + var operations = await detectedOperationService - .GetOperationSummaryAsync(new() - { - IdsTelemetries = idsTelemetries, - IdsOperationCategories = WellOperationCategory.MechanicalDrillingSubIds, - GeDateStart = beginUTC, - LeDateEnd = endUTC, - }, token); + .GetOperationsAsync(request, token); var wellStat = new SubsystemActiveWellStatDto { Well = well }; From 3cf880832c1e7e95a419f7120f6e1beb2776e3b6 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 19 Dec 2023 12:28:41 +0500 Subject: [PATCH 16/30] =?UTF-8?q?1.=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=83=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=81=20=D0=BA=D0=BB=D1=8E=D1=87=D0=BE=D0=BC=2020000?= =?UTF-8?q?=202.=20=D0=9A=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D1=83=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20=D1=81=D0=BF=D1=80=D1=8F=D1=82=D0=B0=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Model/DefaultData/EntityNotificationCategory.cs | 2 +- AsbCloudDb/Model/NotificationCategory.cs | 8 +++++++- .../Services/DrillingProgram/DrillingProgramService.cs | 7 +++---- .../Services/WellFinalDocumentsService.cs | 4 ++-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/AsbCloudDb/Model/DefaultData/EntityNotificationCategory.cs b/AsbCloudDb/Model/DefaultData/EntityNotificationCategory.cs index f65bd4e1..2a2e5eab 100644 --- a/AsbCloudDb/Model/DefaultData/EntityNotificationCategory.cs +++ b/AsbCloudDb/Model/DefaultData/EntityNotificationCategory.cs @@ -4,6 +4,6 @@ public class EntityNotificationCategory : EntityFiller { public override NotificationCategory[] GetData() => new NotificationCategory[] { - new() { Id = 1, Name = "Системные уведомления" } + new() { Id = NotificationCategory.IdSystemNotificationCategory, Name = "Системные уведомления" } }; } \ No newline at end of file diff --git a/AsbCloudDb/Model/NotificationCategory.cs b/AsbCloudDb/Model/NotificationCategory.cs index 3da37e30..879b59d8 100644 --- a/AsbCloudDb/Model/NotificationCategory.cs +++ b/AsbCloudDb/Model/NotificationCategory.cs @@ -8,7 +8,13 @@ namespace AsbCloudDb.Model; [Table("t_notification_category"), Comment("Категории уведомлений")] public class NotificationCategory : IId { - [Key] + #region constants category notifications ids + /// + /// СИСТЕМНЫЕ УВЕДОМЛЕНИЯ + /// + public const int IdSystemNotificationCategory = 1; + + [Key] [Column("id")] public int Id { get; set; } diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index c91689a3..c7fc2f5d 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -35,7 +35,6 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram private readonly BackgroundWorker backgroundWorker; private readonly NotificationService notificationService; - private const int idNotificationCategory = 20000; private const int idTransportType = 1; private const int idFileCategoryDrillingProgram = 1000; @@ -398,7 +397,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram await notificationService.NotifyAsync(new NotifyRequest { IdUser = user.Id, - IdNotificationCategory = idNotificationCategory, + IdNotificationCategory = NotificationCategory.IdSystemNotificationCategory, Title = subject, Message = body, IdTransportType = idTransportType @@ -422,7 +421,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram await notificationService.NotifyAsync(new NotifyRequest { IdUser = user.Id, - IdNotificationCategory = idNotificationCategory, + IdNotificationCategory = NotificationCategory.IdSystemNotificationCategory, Title = subject, Message = body, IdTransportType = idTransportType @@ -442,7 +441,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram await notificationService.NotifyAsync(new NotifyRequest { IdUser = user.Id, - IdNotificationCategory = idNotificationCategory, + IdNotificationCategory = NotificationCategory.IdSystemNotificationCategory, Title = subject, Message = body, IdTransportType = idTransportType diff --git a/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs b/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs index 8ac7c15c..7a736ba9 100644 --- a/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs +++ b/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Services.Notifications; +using AsbCloudDb.Model; namespace AsbCloudInfrastructure.Services { @@ -136,7 +137,6 @@ namespace AsbCloudInfrastructure.Services private async Task SendMessageAsync(WellDto well, UserDto user, string documentCategory, string message, CancellationToken cancellationToken) { - const int idNotificationCategory = 20000; const int idTransportType = 1; var factory = new WellFinalDocumentMailBodyFactory(configuration); @@ -151,7 +151,7 @@ namespace AsbCloudInfrastructure.Services await notificationService.NotifyAsync(new NotifyRequest { IdUser = user.Id, - IdNotificationCategory = idNotificationCategory, + IdNotificationCategory = NotificationCategory.IdSystemNotificationCategory, Title = subject, Message = body, IdTransportType = idTransportType From 5a4211b8a51299ff753504d95d11379c5764b204 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 19 Dec 2023 12:30:21 +0500 Subject: [PATCH 17/30] =?UTF-8?q?=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20#region?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudDb/Model/NotificationCategory.cs | 1 + .../Services/DrillingProgram/DrillingProgramService.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/AsbCloudDb/Model/NotificationCategory.cs b/AsbCloudDb/Model/NotificationCategory.cs index 879b59d8..3359ce29 100644 --- a/AsbCloudDb/Model/NotificationCategory.cs +++ b/AsbCloudDb/Model/NotificationCategory.cs @@ -13,6 +13,7 @@ public class NotificationCategory : IId /// СИСТЕМНЫЕ УВЕДОМЛЕНИЯ /// public const int IdSystemNotificationCategory = 1; + #endregion [Key] [Column("id")] diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index c7fc2f5d..3e8349ad 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -376,7 +376,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram await notificationService.NotifyAsync(new NotifyRequest { IdUser = user.Id, - IdNotificationCategory = idNotificationCategory, + IdNotificationCategory = NotificationCategory.IdSystemNotificationCategory, Title = subject, Message = body, IdTransportType = idTransportType From f5f5a77418d1f60f14f7829e4fabe8f678afdfb9 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: Tue, 19 Dec 2023 13:39:50 +0500 Subject: [PATCH 18/30] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D1=83=D0=BF=D1=80=D0=B5=D0=B6=D0=B4=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20+=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Services/IDetectedOperationService.cs | 2 +- .../DetectOperations/DetectedOperationService.cs | 12 ++++-------- .../Services/Subsystems/SubsystemService.cs | 10 ++++------ 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs index 0ba595ff..e4f8f201 100644 --- a/AsbCloudApp/Services/IDetectedOperationService.cs +++ b/AsbCloudApp/Services/IDetectedOperationService.cs @@ -35,7 +35,7 @@ namespace AsbCloudApp.Services /// /// /// - Task?> GetOperationsAsync(DetectedOperationRequest request, CancellationToken token); + Task> GetOperationsAsync(DetectedOperationRequest request, CancellationToken token); /// /// Удалить операции diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 4b58e235..a65525ad 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -45,17 +45,13 @@ namespace AsbCloudInfrastructure.Services.DetectOperations return result; } - public async Task?> GetOperationsAsync(DetectedOperationRequest request, CancellationToken token) + public async Task> GetOperationsAsync(DetectedOperationRequest request, CancellationToken token) { var well = await wellService.GetOrDefaultAsync(request.IdWell, token); - if (well?.IdTelemetry is null || well.Timezone is null) - return null; + if (well?.IdTelemetry is null) + return Enumerable.Empty(); - var query = BuildQuery(well, request) - ?.AsNoTracking(); - - if (query is null) - return null; + var query = BuildQuery(well, request).AsNoTracking(); var data = await query.ToListAsync(token); diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index 7ff4076a..f7fdea51 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -223,13 +223,11 @@ internal class SubsystemService : ISubsystemService var dateRange = telemetryDataSaubService.GetRange(well.Id); - var beginUTC = gtDate.HasValue - ? gtDate.Value.ToUtcDateTimeOffset(hoursOffset) - : dateRange.From.ToUtcDateTimeOffset(hoursOffset); + var beginUTC = gtDate?.ToUtcDateTimeOffset(hoursOffset) + ?? dateRange?.From.ToUtcDateTimeOffset(hoursOffset); - var endUTC = ltDate.HasValue - ? ltDate.Value.ToUtcDateTimeOffset(hoursOffset) - : dateRange.To.ToUtcDateTimeOffset(hoursOffset); + var endUTC = ltDate?.ToUtcDateTimeOffset(hoursOffset) + ?? dateRange?.To.ToUtcDateTimeOffset(hoursOffset); var request = new DetectedOperationRequest { From f17d340f8f726c9f1f20c268bc1ad3dc10c4e949 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Tue, 19 Dec 2023 16:02:00 +0500 Subject: [PATCH 19/30] SubsystemService.GetStatAsync() remove telemetry date range from request. --- .../Services/Subsystems/SubsystemService.cs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index f7fdea51..209fc65f 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -203,8 +203,8 @@ internal class SubsystemService : ISubsystemService } private async Task> GetStatAsync(IEnumerable wells, - DateTime? gtDate, - DateTime? ltDate, + DateTime? geDate, + DateTime? leDate, CancellationToken token) { if (!wells.Any()) @@ -221,20 +221,16 @@ internal class SubsystemService : ISubsystemService { var hoursOffset = well.Timezone.Hours; - var dateRange = telemetryDataSaubService.GetRange(well.Id); + var geDateStartUtc = geDate?.ToUtcDateTimeOffset(hoursOffset); - var beginUTC = gtDate?.ToUtcDateTimeOffset(hoursOffset) - ?? dateRange?.From.ToUtcDateTimeOffset(hoursOffset); - - var endUTC = ltDate?.ToUtcDateTimeOffset(hoursOffset) - ?? dateRange?.To.ToUtcDateTimeOffset(hoursOffset); + var leDateUtc = leDate?.ToUtcDateTimeOffset(hoursOffset); var request = new DetectedOperationRequest { IdsTelemetries = idsTelemetries, IdsCategories = WellOperationCategory.MechanicalDrillingSubIds, - GeDateStart = beginUTC, - LeDateEnd = endUTC, + GeDateStart = geDateStartUtc, + LeDateEnd = leDateUtc, }; var operations = await detectedOperationService From 653722b1ddd28554e5c42da3a1ff1ddf81402e6b 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, 20 Dec 2023 09:17:30 +0500 Subject: [PATCH 20/30] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?= =?UTF-8?q?=D1=89=D0=B0=D0=B5=D0=BC=D0=BE=D0=B5=20=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=B7=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D0=BE=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D0=BB=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ProcessMaps/ProcessMapBaseController.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapBaseController.cs index 9fe84901..35b317d2 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapBaseController.cs @@ -152,10 +152,9 @@ public abstract class ProcessMapBaseController : ControllerBase /// /// [HttpGet] - [ProducesResponseType(typeof(ValidationResultDto<>), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status403Forbidden)] - public async Task>> GetAsync(int idWell, CancellationToken cancellationToken) + public async Task>>> GetAsync(int idWell, CancellationToken cancellationToken) { var processMaps = await service.GetAsync(idWell, cancellationToken); From 0316fb9727514dd2fdb2a55187876cdd5fd8730b 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, 20 Dec 2023 10:07:35 +0500 Subject: [PATCH 21/30] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B0=D1=82=D1=80=D0=B8=D0=B1=D1=83=D1=82=20Pro?= =?UTF-8?q?ducesResponseType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ProcessMaps/ProcessMapBaseController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapBaseController.cs index 35b317d2..0d47f808 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapBaseController.cs @@ -152,6 +152,7 @@ public abstract class ProcessMapBaseController : ControllerBase /// /// [HttpGet] + [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status403Forbidden)] public async Task>>> GetAsync(int idWell, CancellationToken cancellationToken) From 97179fac12ad3d211c6269afd65c431909d9ddb3 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 20 Dec 2023 10:51:42 +0500 Subject: [PATCH 22/30] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D1=82=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=B2=D1=8B=D0=B3=D1=80=D1=83=D0=B7=D0=BA?= =?UTF-8?q?=D0=B5=20=D0=BE=D1=82=D1=87=D0=B5=D1=82=D0=B0=20=D0=93=D0=93?= =?UTF-8?q?=D0=94=20(=D0=BF=D0=BB=D0=B0=D0=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WellOperationExportServiceTest.cs | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs diff --git a/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs b/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs new file mode 100644 index 00000000..919dda4d --- /dev/null +++ b/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs @@ -0,0 +1,135 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperationImport.Options; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using AsbCloudApp.Services.WellOperationImport; +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services.WellOperationImport; +using AsbCloudInfrastructure.Services.WellOperationImport.FileParser; +using NSubstitute; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace AsbCloudWebApi.Tests.UnitTests.Services.WellOperationExport +{ + public class WellOperationExportServiceTest + { + private const int idWell = 4; + + private IWellService wellService; + private IWellOperationRepository wellOperationRepository; + private IWellOperationImportTemplateService wellOperationImportTemplateService; + private WellOperationExportService wellOperationExportService; + private WellOperationImportService wellOperationImportService; + private IWellOperationExcelParser wellOperationDefaultExcelParser; + + public WellOperationExportServiceTest() + { + wellService = Substitute.For(); + wellOperationRepository = Substitute.For(); + wellOperationImportTemplateService = new WellOperationImportTemplateService(); + wellOperationExportService = new WellOperationExportService(wellOperationRepository, wellService, wellOperationImportTemplateService); + + wellOperationImportService = new WellOperationImportService(wellOperationRepository); + wellOperationDefaultExcelParser = new WellOperationDefaultExcelParser(); + } + + private readonly WellOperationDto[] operations = new WellOperationDto[2] { + new WellOperationDto() { + CategoryInfo = "1", + Comment = "1", + DateStart = DateTime.Now, + Day = 0, + DepthStart = 10, + DurationHours = 10, + DepthEnd = 20, + IdCategory = 1, + Id = 1, + IdPlan = 1, + IdType = 0, + IdWell = idWell, + IdWellSectionType = 1, + NptHours = 10 + }, + new WellOperationDto() { + CategoryInfo = "2", + Comment = "2", + DateStart = DateTime.Now.AddDays(1), + Day = 0, + DepthStart = 20, + DurationHours = 20, + DepthEnd = 30, + IdCategory = 2, + Id = 2, + IdPlan = 1, + IdType = 0, + IdWell = idWell, + IdWellSectionType = 2, + NptHours = 20 + } + }; + + private readonly WellSectionTypeDto[] sectionTypes = new WellSectionTypeDto[2] + { + new WellSectionTypeDto() + { + Caption = "1", + Id = 1, + Order = 0 + }, + new WellSectionTypeDto() + { + Caption = "2", + Id = 2, + Order = 1 + } + }; + + private readonly WellOperationCategoryDto[] categories = new WellOperationCategoryDto[2] + { + new WellOperationCategoryDto() + { + Id = 1, + IdParent = 1, + KeyValueName = "1", + KeyValueUnits = "1", + Name = "1" + }, + new WellOperationCategoryDto() + { + Id = 2, + IdParent = 2, + KeyValueName = "2", + KeyValueUnits = "2", + Name = "2" + } + }; + + [Fact] + public async Task Check_exported_dates() + { + wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) + .ReturnsForAnyArgs(operations); + wellOperationRepository.GetSectionTypes().Returns(sectionTypes); + wellOperationRepository.GetCategories(false).Returns(categories); + + var stream = await wellOperationExportService.ExportAsync(idWell, CancellationToken.None); + + var options = new WellOperationImportDefaultOptionsDto + { + IdType = WellOperation.IdOperationTypePlan + }; + var sheet = wellOperationDefaultExcelParser.Parse(stream, options); + var result = wellOperationImportService.Import(idWell, 1, options.IdType, sheet); + + var expectedDates = operations.Select(o => o.DateStart.ToString("yyyy-MM-dd HH:mm:ss")); + var realDates = result.Select(o => o.DateStart.ToString("yyyy-MM-dd HH:mm:ss")); + Assert.Equal(expectedDates, realDates); + } + } + +} From 39742b505d7e62a43edb8ba27e39dde74467b4f5 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 20 Dec 2023 14:04:00 +0500 Subject: [PATCH 23/30] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=D1=81=D0=B5=D1=85=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=BF=D1=80=D0=B8=20=D1=8D=D0=BA=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=B5=20=D0=B8=20=D0=B8=D0=BC=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=82=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WellOperationExportServiceTest.cs | 84 ++++++++++--------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs b/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs index 919dda4d..c22c5fa0 100644 --- a/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs +++ b/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs @@ -9,7 +9,7 @@ using AsbCloudInfrastructure.Services.WellOperationImport; using AsbCloudInfrastructure.Services.WellOperationImport.FileParser; using NSubstitute; using System; -using System.Linq; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Xunit; @@ -27,49 +27,31 @@ namespace AsbCloudWebApi.Tests.UnitTests.Services.WellOperationExport private WellOperationImportService wellOperationImportService; private IWellOperationExcelParser wellOperationDefaultExcelParser; - public WellOperationExportServiceTest() - { - wellService = Substitute.For(); - wellOperationRepository = Substitute.For(); - wellOperationImportTemplateService = new WellOperationImportTemplateService(); - wellOperationExportService = new WellOperationExportService(wellOperationRepository, wellService, wellOperationImportTemplateService); - - wellOperationImportService = new WellOperationImportService(wellOperationRepository); - wellOperationDefaultExcelParser = new WellOperationDefaultExcelParser(); - } private readonly WellOperationDto[] operations = new WellOperationDto[2] { new WellOperationDto() { - CategoryInfo = "1", - Comment = "1", - DateStart = DateTime.Now, - Day = 0, - DepthStart = 10, - DurationHours = 10, - DepthEnd = 20, - IdCategory = 1, - Id = 1, - IdPlan = 1, - IdType = 0, IdWell = idWell, + IdUser = 1, + IdType = 0, IdWellSectionType = 1, - NptHours = 10 + IdCategory = 1, + CategoryInfo = "1", + DepthStart = 10, + DepthEnd = 20, + DateStart = getDate(days: 0), + DurationHours = 10, }, new WellOperationDto() { - CategoryInfo = "2", - Comment = "2", - DateStart = DateTime.Now.AddDays(1), - Day = 0, - DepthStart = 20, - DurationHours = 20, - DepthEnd = 30, - IdCategory = 2, - Id = 2, - IdPlan = 1, - IdType = 0, IdWell = idWell, + IdUser = 1, + IdType = 0, IdWellSectionType = 2, - NptHours = 20 + IdCategory = 2, + CategoryInfo = "2", + DepthStart = 20, + DepthEnd = 30, + DateStart = getDate(days: 1), + DurationHours = 20, } }; @@ -109,9 +91,30 @@ namespace AsbCloudWebApi.Tests.UnitTests.Services.WellOperationExport } }; - [Fact] - public async Task Check_exported_dates() + private static DateTime getDate(int days) { + var date = DateTime.Now.AddDays(days); + return new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second); + } + + public WellOperationExportServiceTest() + { + wellService = Substitute.For(); + wellOperationRepository = Substitute.For(); + wellOperationImportTemplateService = new WellOperationImportTemplateService(); + wellOperationExportService = new WellOperationExportService(wellOperationRepository, wellService, wellOperationImportTemplateService); + + wellOperationImportService = new WellOperationImportService(wellOperationRepository); + wellOperationDefaultExcelParser = new WellOperationDefaultExcelParser(); + } + + [Fact] + public async Task Check_Exported_WellOperations_With_Operations_In_Db() + { + wellService.GetTimezone(idWell).Returns(new SimpleTimezoneDto() + { + Hours = 5 + }); wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(operations); wellOperationRepository.GetSectionTypes().Returns(sectionTypes); @@ -126,9 +129,10 @@ namespace AsbCloudWebApi.Tests.UnitTests.Services.WellOperationExport var sheet = wellOperationDefaultExcelParser.Parse(stream, options); var result = wellOperationImportService.Import(idWell, 1, options.IdType, sheet); - var expectedDates = operations.Select(o => o.DateStart.ToString("yyyy-MM-dd HH:mm:ss")); - var realDates = result.Select(o => o.DateStart.ToString("yyyy-MM-dd HH:mm:ss")); - Assert.Equal(expectedDates, realDates); + var expected = JsonSerializer.Serialize(operations); + var actual = JsonSerializer.Serialize(result); + + Assert.Equal(expected, actual); } } From 4ff7b7340325349adace899db85b60e2e1d90397 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, 20 Dec 2023 16:42:39 +0500 Subject: [PATCH 24/30] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Поправлена выборка в репозитории с траекториями 2. В репозитории с операциями по скважине добавлено приведение ко времени куста. --- .../Repository/TrajectoryNnbRepository.cs | 18 +++++++++++++++--- .../Repository/WellOperationRepository.cs | 9 +++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs b/AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs index 3a3692d9..a55e465f 100644 --- a/AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs +++ b/AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs @@ -9,20 +9,26 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Services; namespace AsbCloudInfrastructure.Repository { public class TrajectoryNnbRepository : ITrajectoryNnbRepository { private readonly IAsbCloudDbContext db; - public TrajectoryNnbRepository(IAsbCloudDbContext db) + private readonly IWellService wellService; + + public TrajectoryNnbRepository(IAsbCloudDbContext db, + IWellService wellService) { this.db = db; + this.wellService = wellService; } private IQueryable BuildQuery(TrajectoryRequest request) { var well = db.Wells.SingleOrDefault(w => w.Id == request.IdWell); + var timezone = wellService.GetTimezone(request.IdWell); if (well is null) throw new ArgumentInvalidException($"Скважина с Id: {request.IdWell} не найдена", nameof(request.IdWell)); @@ -31,10 +37,16 @@ namespace AsbCloudInfrastructure.Repository .Where(x => x.IdTelemetry == well.IdTelemetry); if (request.GeDate.HasValue) - query = query.Where(r => r.DateTime >= request.GeDate.Value); + { + var geDate = request.GeDate.Value.ToUtcDateTimeOffset(timezone.Hours); + query = query.Where(r => r.DateTime >= geDate); + } if (request.LeDate.HasValue) - query = query.Where(r => r.DateTime <= request.LeDate.Value); + { + var leDate = request.LeDate.Value.ToUtcDateTimeOffset(timezone.Hours); + query = query.Where(r => r.DateTime <= leDate); + } return query.OrderBy(e => e.Deptsvym); } diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index b87d5a46..fbc94e02 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -186,15 +186,20 @@ public class WellOperationRepository : IWellOperationRepository public async Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken) { + var timezone = wellService.GetTimezone(idWell); + var query = db.WellOperations.Where(o => o.IdWell == idWell && o.IdType == idType); if (!await query.AnyAsync(cancellationToken)) return null; + + var minDate = await query.MinAsync(o => o.DateStart, cancellationToken); + var maxDate = await query.MaxAsync(o => o.DateStart, cancellationToken); return new DatesRangeDto { - From = (await query.MinAsync(o => o.DateStart, cancellationToken)).Date, - To = (await query.MaxAsync(o => o.DateStart, cancellationToken)).Date + From = minDate.ToRemoteDateTime(timezone.Hours), + To = maxDate.ToRemoteDateTime(timezone.Hours) }; } From 6b03e03865d2f95a885f4152d2a28fe7bddfc592 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, 20 Dec 2023 16:45:31 +0500 Subject: [PATCH 25/30] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20?= =?UTF-8?q?=D1=81=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BE?= =?UTF-8?q?=D1=82=D1=87=D1=91=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Изменён тип суточного отчёта 2. Добавлены новые миграции --- ...3_UpdateDateFormat_DailyReport.Designer.cs | 9115 +++++++++++++++++ ...1220091403_UpdateDateFormat_DailyReport.cs | 36 + .../AsbCloudDbContextModelSnapshot.cs | 4 +- AsbCloudDb/Model/DailyReports/DailyReport.cs | 4 +- 4 files changed, 9155 insertions(+), 4 deletions(-) create mode 100644 AsbCloudDb/Migrations/20231220091403_UpdateDateFormat_DailyReport.Designer.cs create mode 100644 AsbCloudDb/Migrations/20231220091403_UpdateDateFormat_DailyReport.cs diff --git a/AsbCloudDb/Migrations/20231220091403_UpdateDateFormat_DailyReport.Designer.cs b/AsbCloudDb/Migrations/20231220091403_UpdateDateFormat_DailyReport.Designer.cs new file mode 100644 index 00000000..c5bba58a --- /dev/null +++ b/AsbCloudDb/Migrations/20231220091403_UpdateDateFormat_DailyReport.Designer.cs @@ -0,0 +1,9115 @@ +// +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("20231220091403_UpdateDateFormat_DailyReport")] + partial class UpdateDateFormat_DailyReport + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.25") + .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"); + + b.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"); + + b.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"); + + b.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"); + + b.HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", 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") + .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("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"); + + 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("части программ бурения"); + }); + + 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"); + + b.HasComment("Drill_test"); + }); + + 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"); + + b.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"); + + b.HasComment("Категории файлов"); + + b.HasData( + new + { + Id = 1, + Name = "Растворный сервис", + ShortName = "fluidService" + }, + new + { + Id = 2, + Name = "Цементирование", + ShortName = "cement" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "nnb" + }, + new + { + Id = 4, + Name = "ГТИ", + ShortName = "gti" + }, + new + { + Id = 5, + Name = "Документы по скважине", + ShortName = "wellDocuments" + }, + new + { + Id = 6, + Name = "Супервайзер", + ShortName = "supervisor" + }, + new + { + Id = 7, + Name = "Мастер", + ShortName = "master" + }, + new + { + Id = 8, + Name = "Долотный сервис", + ShortName = "toolService" + }, + new + { + Id = 9, + Name = "Буровой подрядчик", + ShortName = "drillService" + }, + new + { + Id = 10, + Name = "Сервис по заканчиванию скважины", + ShortName = "closingService" + }, + new + { + Id = 12, + Name = "Рапорт", + ShortName = "report" + }, + new + { + Id = 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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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.ProcessMapWellDrilling", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + 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") + .HasColumnType("text") + .HasColumnName("comment") + .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("IdMode") + .HasColumnType("integer") + .HasColumnName("id_mode") + .HasComment("Id режима (1- ротор, 2 слайд)"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("LastUpdate") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_update") + .HasComment("Дата последнего изменения"); + + b.Property("PressureLimitMax") + .HasColumnType("double precision") + .HasColumnName("pressure_limit_max") + .HasComment("Перепад давления, допустимый максимум"); + + b.Property("PressurePlan") + .HasColumnType("double precision") + .HasColumnName("pressure_plan") + .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("IdUser"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map_well_drilling"); + + b.HasComment("РТК бурение скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapWellReam", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина по стволу до, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина по стволу от, м"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("LastUpdate") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_update") + .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("IdUser"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map_well_ream"); + + b.HasComment("РТК проработка скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("IdCompany", "IdWell"); + + b.HasIndex("IdWell"); + + b.ToTable("t_relation_company_well"); + + b.HasComment("отношение скважин и компаний"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.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"); + + b.HasComment("Отношение пользователей и частей ПБ"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission"); + + b.HasComment("Отношение ролей пользователей и разрешений доступа"); + + 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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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.ToView("mw_telemetry_datas_saub_stat"); + }); + + 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"); + + b.HasComment("набор основных данных по SpinMaster"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.Property("MessageTemplate") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message_template"); + + b.HasKey("IdTelemetry", "IdEvent"); + + b.ToTable("t_telemetry_event"); + + b.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + 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"); + + b.HasComment("Сообщения на буровых"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname"); + + b.HasKey("IdTelemetry", "IdUser"); + + b.ToTable("t_telemetry_user"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.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"); + + b.HasComment("настройки интерфейса пользователя"); + }); + + 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"); + + b.HasComment("скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины получателя"); + + b.Property("IdWellSrc") + .HasColumnType("integer") + .HasColumnName("id_well_src") + .HasComment("Id скважины композита"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции композита"); + + b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); + + b.HasIndex("IdWellSectionType"); + + b.HasIndex("IdWellSrc"); + + b.ToTable("t_well_composite"); + + b.HasComment("Композитная скважина"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.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"); + + b.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"); + + b.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"); + + b.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.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") + .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"); + + b.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.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"); + + b.HasComment("конструкция скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Наклонно-направленная" + }, + new + { + Id = 2, + Caption = "Горизонтальная" + }); + }); + + 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"); + + 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.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.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.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") + .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.ProcessMapWellDrilling", 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.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapWellReam", 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.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + 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/20231220091403_UpdateDateFormat_DailyReport.cs b/AsbCloudDb/Migrations/20231220091403_UpdateDateFormat_DailyReport.cs new file mode 100644 index 00000000..c2771eeb --- /dev/null +++ b/AsbCloudDb/Migrations/20231220091403_UpdateDateFormat_DailyReport.cs @@ -0,0 +1,36 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class UpdateDateFormat_DailyReport : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "date", + table: "t_daily_report", + type: "date", + nullable: false, + comment: "Дата формирования отчёта", + oldClrType: typeof(DateTime), + oldType: "timestamp with time zone", + oldComment: "Дата формирования отчёта"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "date", + table: "t_daily_report", + type: "timestamp with time zone", + nullable: false, + comment: "Дата формирования отчёта", + oldClrType: typeof(DateOnly), + oldType: "date", + oldComment: "Дата формирования отчёта"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index fd9e2d0b..80f5c30b 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -278,8 +278,8 @@ namespace AsbCloudDb.Migrations NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Date") - .HasColumnType("timestamp with time zone") + b.Property("Date") + .HasColumnType("date") .HasColumnName("date") .HasComment("Дата формирования отчёта"); diff --git a/AsbCloudDb/Model/DailyReports/DailyReport.cs b/AsbCloudDb/Model/DailyReports/DailyReport.cs index 1906d9ab..c521ca54 100644 --- a/AsbCloudDb/Model/DailyReports/DailyReport.cs +++ b/AsbCloudDb/Model/DailyReports/DailyReport.cs @@ -20,8 +20,8 @@ public class DailyReport : IId [Column("date_last_update", TypeName = "timestamp with time zone"), Comment("Дата последнего обновления")] public DateTime? DateLastUpdate { get; set; } - [Column("date", TypeName = "timestamp with time zone"), Comment("Дата формирования отчёта")] - public DateTime Date { get; set; } + [Column("date", TypeName = "date"), Comment("Дата формирования отчёта")] + public DateOnly Date { get; set; } [Column("sign_block", TypeName = "jsonb"), Comment("Подпись")] public SignBlock? SignBlock { get; set; } From 8bc7e8b9c5003429fcb50c3b6c9460bbeb100843 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, 20 Dec 2023 16:45:40 +0500 Subject: [PATCH 26/30] =?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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DailyReport/DailyReportTemplate.xlsx | Bin 15765 -> 15806 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportTemplate.xlsx b/AsbCloudInfrastructure/Services/DailyReport/DailyReportTemplate.xlsx index 5c2cbd12263b5e6ef5d159220cff67b02b06e45e..54949f17caad81bdce14c9b28ecdf6ba8b071683 100644 GIT binary patch delta 7189 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 From 202665dce2cdfee556074108629d941c27226663 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, 20 Dec 2023 16:55:17 +0500 Subject: [PATCH 27/30] =?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=81=D1=83=D1=82=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B0=D0=BF=D0=BE=D1=80=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/DailyReport/DailyReportDto.cs | 2 +- .../Repositories/IDailyReportRepository.cs | 2 +- .../DailyReport/IDailyReportExportService.cs | 4 +- .../DailyReport/IDailyReportService.cs | 4 +- .../Repository/DailyReportRepository.cs | 25 ++--- .../DailyReport/DailyReportExportService.cs | 12 ++- .../DailyReport/DailyReportService.cs | 91 ++++++++++++++----- .../Services/DailyReportServiceTest.cs | 55 ++++++----- .../Controllers/DailyReportController.cs | 6 +- 9 files changed, 119 insertions(+), 82 deletions(-) diff --git a/AsbCloudApp/Data/DailyReport/DailyReportDto.cs b/AsbCloudApp/Data/DailyReport/DailyReportDto.cs index 0caeea30..7c1a1ea1 100644 --- a/AsbCloudApp/Data/DailyReport/DailyReportDto.cs +++ b/AsbCloudApp/Data/DailyReport/DailyReportDto.cs @@ -64,7 +64,7 @@ public class DailyReportDto : IId, /// /// Дата формирования отчёта /// - public DateTime Date { get; set; } + public DateOnly Date { get; set; } /// /// Дата последнего обновления diff --git a/AsbCloudApp/Repositories/IDailyReportRepository.cs b/AsbCloudApp/Repositories/IDailyReportRepository.cs index 6e59941d..39de97e5 100644 --- a/AsbCloudApp/Repositories/IDailyReportRepository.cs +++ b/AsbCloudApp/Repositories/IDailyReportRepository.cs @@ -29,5 +29,5 @@ public interface IDailyReportRepository : ICrudRepository /// /// /// - Task GetOrDefaultAsync(int idWell, DateTime date, CancellationToken cancellationToken); + Task GetOrDefaultAsync(int idWell, DateOnly date, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/AsbCloudApp/Services/DailyReport/IDailyReportExportService.cs b/AsbCloudApp/Services/DailyReport/IDailyReportExportService.cs index fb9a897a..eb09874a 100644 --- a/AsbCloudApp/Services/DailyReport/IDailyReportExportService.cs +++ b/AsbCloudApp/Services/DailyReport/IDailyReportExportService.cs @@ -14,8 +14,8 @@ public interface IDailyReportExportService /// Экспортировать /// /// - /// + /// /// /// - Task<(string FileName, Stream File)> ExportAsync(int idWell, DateTime dailyReportDateStart, CancellationToken cancellationToken); + Task<(string FileName, Stream File)> ExportAsync(int idWell, DateOnly dailyReportDate, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/AsbCloudApp/Services/DailyReport/IDailyReportService.cs b/AsbCloudApp/Services/DailyReport/IDailyReportService.cs index 44283a44..f0318025 100644 --- a/AsbCloudApp/Services/DailyReport/IDailyReportService.cs +++ b/AsbCloudApp/Services/DailyReport/IDailyReportService.cs @@ -21,7 +21,7 @@ public interface IDailyReportService /// /// /// - Task UpdateOrInsertAsync(int idWell, DateTime dateDailyReport, int idUser, TBlock editableBlock, + Task UpdateOrInsertAsync(int idWell, DateOnly dateDailyReport, int idUser, TBlock editableBlock, CancellationToken cancellationToken) where TBlock : ItemInfoDto; @@ -32,7 +32,7 @@ public interface IDailyReportService /// /// /// - Task GetAsync(int idWell, DateTime dateDailyReport, CancellationToken cancellationToken); + Task GetAsync(int idWell, DateOnly dateDailyReport, CancellationToken cancellationToken); /// /// Получить список суточных отчётов по скважине diff --git a/AsbCloudInfrastructure/Repository/DailyReportRepository.cs b/AsbCloudInfrastructure/Repository/DailyReportRepository.cs index fff15138..b82b0ce1 100644 --- a/AsbCloudInfrastructure/Repository/DailyReportRepository.cs +++ b/AsbCloudInfrastructure/Repository/DailyReportRepository.cs @@ -33,25 +33,14 @@ public class DailyReportRepository : CrudRepositoryBase d.IdWell == idWell); if (request.GeDate.HasValue) - { - var geDate = request.GeDate.Value.ToDateTime(TimeOnly.MinValue, DateTimeKind.Utc); - query = query.Where(d => d.Date >= geDate); - } - + query = query.Where(d => d.Date >= request.GeDate.Value); + if (request.LeDate.HasValue) - { - var leDate = request.LeDate.Value.ToDateTime(TimeOnly.MinValue, DateTimeKind.Utc); - query = query.Where(d => d.Date <= leDate); - } + query = query.Where(d => d.Date <= request.LeDate.Value); - if (request.SortFields?.Any() == true) - { - query = query.SortBy(request.SortFields); - } - else - { - query = query.OrderBy(d => d.Date); - } + query = request.SortFields?.Any() == true ? + query.SortBy(request.SortFields) : + query.OrderBy(d => d.Date); var entities = await query .Skip(skip) @@ -64,7 +53,7 @@ public class DailyReportRepository : CrudRepositoryBase GetOrDefaultAsync(int idWell, DateTime date, CancellationToken cancellationToken) + public async Task GetOrDefaultAsync(int idWell, DateOnly date, CancellationToken cancellationToken) { var entity = await GetQuery() .AsNoTracking() diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportExportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportExportService.cs index 7c1cb1bb..3148fbf3 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportExportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportExportService.cs @@ -89,9 +89,9 @@ public class DailyReportExportService : IDailyReportExportService this.dailyReportService = dailyReportService; } - public async Task<(string FileName, Stream File)> ExportAsync(int idWell, DateTime dailyReportDateStart, CancellationToken cancellationToken) + public async Task<(string FileName, Stream File)> ExportAsync(int idWell, DateOnly dailyReportDate, CancellationToken cancellationToken) { - var dailyReport = await dailyReportService.GetAsync(idWell, dailyReportDateStart, cancellationToken); + var dailyReport = await dailyReportService.GetAsync(idWell, dailyReportDate, cancellationToken); var stream = await GenerateFileAsync(dailyReport, cancellationToken); @@ -236,12 +236,16 @@ public class DailyReportExportService : IDailyReportExportService private static void AddFactWellOperationBlockToSheet(IXLWorksheet sheet, WellOperationBlockDto factWellOperationBlock) { + var rowCurrent = rowStartFactWellOperationBlock; + sheet.Cell(cellSectionDrillingHours).Value = factWellOperationBlock.SectionDrillingHours; foreach (var factOperation in factWellOperationBlock.WellOperations.OrderBy(w => w.CategoryName)) { - sheet.Cell(rowStartFactWellOperationBlock, columnWellOperationCategory).Value = factOperation.CategoryName; - sheet.Cell(rowStartFactWellOperationBlock, columnWellOperationDurationHours).Value = factOperation.DurationHours; + sheet.Cell(rowCurrent, columnWellOperationCategory).Value = factOperation.CategoryName; + sheet.Cell(rowCurrent, columnWellOperationDurationHours).Value = factOperation.DurationHours; + + rowCurrent++; } } diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index 78e7f67e..0a3d6df4 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -51,7 +51,7 @@ public class DailyReportService : IDailyReportService this.detectedOperationService = detectedOperationService; } - public async Task UpdateOrInsertAsync(int idWell, DateTime dateDailyReport, int idUser, TBlock editableBlock, + public async Task UpdateOrInsertAsync(int idWell, DateOnly dateDailyReport, int idUser, TBlock editableBlock, CancellationToken cancellationToken) where TBlock : ItemInfoDto { @@ -91,7 +91,7 @@ public class DailyReportService : IDailyReportService return await dailyReportRepository.UpdateAsync(dailyReport, cancellationToken); } - public async Task GetAsync(int idWell, DateTime dateDailyReport, CancellationToken cancellationToken) + public async Task GetAsync(int idWell, DateOnly dateDailyReport, CancellationToken cancellationToken) { var well = await wellService.GetOrDefaultAsync(idWell, cancellationToken) ?? throw new ArgumentNullException(nameof(idWell), $"Скважина с Id: {idWell} не найдена"); @@ -102,16 +102,19 @@ public class DailyReportService : IDailyReportService var dailyReport = await dailyReportRepository.GetOrDefaultAsync(idWell, dateDailyReport, cancellationToken) ?? new DailyReportDto { - Date = dateDailyReport.Date, + Date = dateDailyReport, IdWell = well.Id }; + var geDate = dailyReport.Date.ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + var ltDate = dailyReport.Date.AddDays(1).ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + var factOperationRequest = new WellOperationRequest { IdWell = idWell, OperationType = WellOperation.IdOperationTypeFact, - GeDate = dateDailyReport, - LtDate = dateDailyReport.AddHours(24) + GeDate = geDate, + LtDate = ltDate }; var factWellOperations = (await wellOperationRepository.GetAsync(factOperationRequest, cancellationToken)) @@ -197,7 +200,7 @@ public class DailyReportService : IDailyReportService { for (var day = result.Skip; day - result.Skip < result.Take && datesRange.To.AddDays(-day) >= datesRange.From; day++) { - var dateDailyReport = datesRange.To.AddDays(-day).Date; + var dateDailyReport = DateOnly.FromDateTime(datesRange.To.AddDays(-day)); AddDailyReport(dateDailyReport); } @@ -206,7 +209,7 @@ public class DailyReportService : IDailyReportService { for (var day = result.Skip; day - result.Skip < result.Take && datesRange.From.AddDays(day) <= datesRange.To; day++) { - var dateDailyReport = datesRange.From.AddDays(day).Date; + var dateDailyReport = DateOnly.FromDateTime(datesRange.From.AddDays(day)); AddDailyReport(dateDailyReport); } @@ -216,7 +219,7 @@ public class DailyReportService : IDailyReportService return result; - void AddDailyReport(DateTime date) + void AddDailyReport(DateOnly date) { var dailyReport = existingDailyReports.FirstOrDefault(d => d.IdWell == idWell && d.Date == date) ?? new DailyReportDto @@ -225,7 +228,11 @@ public class DailyReportService : IDailyReportService IdWell = idWell }; - var factWellOperationPerDay = factWellOperations.Where(o => o.DateStart.Date >= date && o.DateStart.Date <= date.AddDays(1)); + var geDate = date.ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + var leDate = date.AddDays(1).ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + + var factWellOperationPerDay = factWellOperations.Where(o => o.DateStart.Date >= geDate && + o.DateStart.Date <= leDate); AddFactWellOperationBlock(dailyReport, factWellOperationPerDay); @@ -235,16 +242,29 @@ public class DailyReportService : IDailyReportService public async Task GetDatesRangeAsync(int idWell, CancellationToken cancellationToken) { + var timezone = wellService.GetTimezone(idWell); + var currentDate = DateTimeOffset.UtcNow.ToRemoteDateTime(timezone.Hours); + var factOperationDatesRange = await wellOperationRepository.GetDatesRangeAsync(idWell, WellOperation.IdOperationTypeFact, cancellationToken); if (factOperationDatesRange is null) return null; - + + var from = (factOperationDatesRange.From.AddDays(1) <= DateTime.UtcNow ? + factOperationDatesRange.From : + currentDate.AddDays(-1)) + .Date; + + var to = (factOperationDatesRange.To.AddDays(1) <= DateTime.UtcNow ? + factOperationDatesRange.To : + currentDate.AddDays(-1)) + .Date; + return new DatesRangeDto { - From = factOperationDatesRange.From.AddDays(1) <= DateTime.UtcNow ? factOperationDatesRange.From : DateTime.UtcNow.Date.AddDays(-1), - To = factOperationDatesRange.To.AddDays(1) <= DateTime.UtcNow ? factOperationDatesRange.To : DateTime.UtcNow.Date.AddDays(-1) + From = from, + To = to }; } @@ -258,13 +278,16 @@ public class DailyReportService : IDailyReportService dailyReport.TimeBalanceBlock.SectionName = wellOperationRepository.GetSectionTypes() .FirstOrDefault(s => s.Id == dailyReport.TimeBalanceBlock.IdSection)?.Caption; + var geDateStart = dailyReport.Date.ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + var leDateEnd = dailyReport.Date.AddDays(1).ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + dailyReport.TimeBalanceBlock.WellOperationSlipsTimeCount = (await detectedOperationService.GetAsync( new DetectedOperationRequest { IdsCategories = new[] { idWellOperationSlipsTime }, IdWell = dailyReport.IdWell, - GeDateStart = dailyReport.Date, - LeDateEnd = dailyReport.Date.AddHours(24) + GeDateStart = geDateStart, + LeDateEnd = leDateEnd }, cancellationToken))?.Stats.Sum(s => s.Count); dailyReport.TimeBalanceBlock.WellDepth.Fact = factWellOperations @@ -275,11 +298,14 @@ public class DailyReportService : IDailyReportService private async Task AddTrajectoryBlockAsync(DailyReportDto dailyReport, CancellationToken cancellationToken) { + var geDate = dailyReport.Date.ToDateTime(TimeOnly.MinValue, DateTimeKind.Utc); + var leDate = dailyReport.Date.AddDays(1).ToDateTime(TimeOnly.MinValue, DateTimeKind.Utc); + var trajectory = (await trajectoryFactNnbRepository.GetByRequestAsync(new TrajectoryRequest { IdWell = dailyReport.IdWell, - GeDate = dailyReport.Date, - LeDate = dailyReport.Date.AddHours(24) + GeDate = geDate, + LeDate = leDate }, cancellationToken)).MaxBy(t => t.WellboreDepth); dailyReport.TrajectoryBlock = new TrajectoryBlockDto @@ -291,8 +317,11 @@ public class DailyReportService : IDailyReportService }; } - private async Task AddScheduleBlockAsync(DailyReportDto dailyReport, CancellationToken cancellationToken) => - dailyReport.ScheduleBlock = (await scheduleRepository.GetAsync(dailyReport.IdWell, dailyReport.Date, cancellationToken)) + private async Task AddScheduleBlockAsync(DailyReportDto dailyReport, CancellationToken cancellationToken) + { + var workDate = dailyReport.Date.ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + + dailyReport.ScheduleBlock = (await scheduleRepository.GetAsync(dailyReport.IdWell, workDate, cancellationToken)) .Select(s => new ScheduleRecordDto { ShiftStart = s.ShiftStart, @@ -301,6 +330,7 @@ public class DailyReportService : IDailyReportService Surname = s.Driller?.Surname, Patronymic = s.Driller?.Patronymic }); + } private async Task UpdateSubsystemBlockAsync(DailyReportDto dailyReport, CancellationToken cancellationToken) { @@ -315,11 +345,14 @@ public class DailyReportService : IDailyReportService IdWell = dailyReport.IdWell }, cancellationToken); + var geDate = dailyReport.Date.ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + var leDate = dailyReport.Date.AddDays(1).ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + var subsystemsStatPerDay = await subsystemService.GetStatAsync(new SubsystemRequest { IdWell = dailyReport.IdWell, - GeDate = dailyReport.Date, - LeDate = dailyReport.Date.AddHours(24) + GeDate = geDate, + LeDate = leDate }, cancellationToken); var subsystems = subsystemsStatPerWell @@ -339,9 +372,11 @@ public class DailyReportService : IDailyReportService private async Task AddProcessMapWellDrillingBlockAsync(DailyReportDto dailyReport, CancellationToken cancellationToken) { + var geDate = dailyReport.Date.ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + var leDate = dailyReport.Date.AddDays(1).ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + dailyReport.ProcessMapWellDrillingBlock = (await processMapReportWellDrillingService.GetAsync(dailyReport.IdWell, - cancellationToken)).Where(p => p.DateStart >= dailyReport.Date && - p.DateStart <= dailyReport.Date.AddHours(24)) + cancellationToken)).Where(p => p.DateStart >= geDate && p.DateStart <= leDate) .GroupBy(p => p.DrillingMode) .Select(g => new ProcessMapWellDrillingRecordDto { @@ -362,7 +397,7 @@ public class DailyReportService : IDailyReportService dailyReport.FactWellOperationBlock = new WellOperationBlockDto { - WellOperations = factWellOperations.GroupBy(o => o.IdParentCategory) + WellOperations = factWellOperations.GroupBy(o => o.IdCategory) .Select(g => new WellOperationRecordDto { CategoryName = g.First().CategoryName, @@ -375,10 +410,16 @@ public class DailyReportService : IDailyReportService }; } - private async Task IsDateDailyReportInRangeAsync(int idWell, DateTime dateDailyReport, CancellationToken cancellationToken) + private async Task IsDateDailyReportInRangeAsync(int idWell, DateOnly dateDailyReport, CancellationToken cancellationToken) { var datesRange = await GetDatesRangeAsync(idWell, cancellationToken); - return dateDailyReport >= datesRange?.From && dateDailyReport <= datesRange.To; + if (datesRange is null) + return false; + + var from = DateOnly.FromDateTime(datesRange.From); + var to = DateOnly.FromDateTime(datesRange.To); + + return from >= dateDailyReport && dateDailyReport <= to; } } \ No newline at end of file diff --git a/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs b/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs index 567f6437..c11dda49 100644 --- a/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs +++ b/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs @@ -28,9 +28,7 @@ public class DailyReportServiceTest private const int idDailyReport = 1; private const int idUser = 3; private const int idWell = 2; - - private readonly DateTime dateDailyReport = new DateOnly(2023, 10, 26).ToDateTime(TimeOnly.MinValue); - + private readonly SubsystemBlockDto fakeSubsystemBlock = new() { IdUser = idUser, @@ -219,7 +217,7 @@ public class DailyReportServiceTest { Id = idDailyReport, IdWell = idWell, - Date = dateDailyReport, + Date = new(2023, 10, 26), DateLastUpdate = null }; @@ -251,7 +249,7 @@ public class DailyReportServiceTest dailyReportRepositoryMock.InsertAsync(Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(idDailyReport); - dailyReportRepositoryMock.GetOrDefaultAsync(Arg.Any(), Arg.Any(), Arg.Any()) + dailyReportRepositoryMock.GetOrDefaultAsync(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(fakeDailyReport); dailyReportRepositoryMock.UpdateAsync(Arg.Any(), Arg.Any()) @@ -278,10 +276,10 @@ public class DailyReportServiceTest subsystemServiceMock.GetStatAsync(Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(new[] { fakeSubsystemsStat }); - scheduleRepositoryMock.GetAsync(idWell, dateDailyReport, Arg.Any()) + scheduleRepositoryMock.GetAsync(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(new[] { fakeShedule }); - processMapReportWellDrillingServiceMock.GetAsync(idWell, Arg.Any()) + processMapReportWellDrillingServiceMock.GetAsync(Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(new[] { fakeProcessMapReportWellDrilling }); } @@ -289,7 +287,7 @@ public class DailyReportServiceTest public async Task UpdateOrInsertAsync_ShouldReturn_UpdatedSubsystemBlock() { //act - var result = await dailyReportService.UpdateOrInsertAsync(idWell, dateDailyReport, idUser, fakeSubsystemBlock, CancellationToken.None); + var result = await dailyReportService.UpdateOrInsertAsync(idWell, fakeDailyReport.Date, idUser, fakeSubsystemBlock, CancellationToken.None); //assert Assert.NotNull(fakeSubsystemBlock.LastUpdateDate); @@ -300,14 +298,13 @@ public class DailyReportServiceTest } [Theory] - [InlineData("2090.01.01")] - [InlineData("2000.01.01")] - public async Task UpdateOrInsertAsync_ShouldReturn_UnableToUpdateDailyReport(DateTime dateDaileReport) + [MemberData(nameof(DateDailyReport))] + public async Task UpdateOrInsertAsync_ShouldReturn_UnableToUpdateDailyReport(DateOnly dateDailyReport) { //act var result = await Assert.ThrowsAsync(() => dailyReportService.UpdateOrInsertAsync( idWell, - dateDaileReport, + dateDailyReport, idUser, fakeSignBlock, CancellationToken.None)); @@ -320,7 +317,7 @@ public class DailyReportServiceTest public async Task UpdateOrInsertAsync_ShouldReturn_UpdatedSignBlock() { //act - var result = await dailyReportService.UpdateOrInsertAsync(idWell, dateDailyReport, idUser, fakeSignBlock, CancellationToken.None); + var result = await dailyReportService.UpdateOrInsertAsync(idWell, fakeDailyReport.Date, idUser, fakeSignBlock, CancellationToken.None); //assert Assert.NotNull(fakeSignBlock.LastUpdateDate); @@ -334,7 +331,7 @@ public class DailyReportServiceTest public async Task UpdateOrInsertAsync_ShouldReturn_UpdatedTimeBalanceBlock() { //act - var result = await dailyReportService.UpdateOrInsertAsync(idWell, dateDailyReport, idUser, fakeTimeBalanceBlock, + var result = await dailyReportService.UpdateOrInsertAsync(idWell, fakeDailyReport.Date, idUser, fakeTimeBalanceBlock, CancellationToken.None); //assert @@ -346,13 +343,12 @@ public class DailyReportServiceTest } [Theory] - [InlineData("2090.01.01")] - [InlineData("2000.01.01")] - public async Task GetAsync_ShouldReturn_UnableToGetDailyReport(DateTime dateDaileReport) + [MemberData(nameof(DateDailyReport))] + public async Task GetAsync_ShouldReturn_UnableToGetDailyReport(DateOnly dateDailyReport) { //act var result = await Assert.ThrowsAsync(() => dailyReportService.GetAsync(idWell, - dateDaileReport, + dateDailyReport, CancellationToken.None)); //assert @@ -363,7 +359,7 @@ public class DailyReportServiceTest public async Task GetAsync_ShouldReturn_AddedWellInfo() { //act - var result = await dailyReportService.GetAsync(idWell, dateDailyReport, CancellationToken.None); + var result = await dailyReportService.GetAsync(idWell, fakeDailyReport.Date, CancellationToken.None); //assert Assert.Equal(result.IdWell, fakeWell.Id); @@ -381,7 +377,7 @@ public class DailyReportServiceTest public async Task GetAsync_ShouldReturn_AddedTrajectoryBlock() { //act - var result = await dailyReportService.GetAsync(idWell, dateDailyReport, CancellationToken.None); + var result = await dailyReportService.GetAsync(idWell, fakeDailyReport.Date, CancellationToken.None); //assert Assert.Equal(fakeLastFactTrajectory.WellboreDepth, result.TrajectoryBlock.WellboreDepth); @@ -394,7 +390,7 @@ public class DailyReportServiceTest public async Task GetAsync_ShouldReturn_AddedFactWellOperationBlock() { //act - var result = await dailyReportService.GetAsync(idWell, dateDailyReport, CancellationToken.None); + var result = await dailyReportService.GetAsync(idWell, fakeDailyReport.Date, CancellationToken.None); //assert Assert.Equal(16, result.FactWellOperationBlock.SectionDrillingHours); @@ -410,7 +406,7 @@ public class DailyReportServiceTest public async Task GetAsync_ShouldReturn_AddedScheduleBlock() { //act - var result = await dailyReportService.GetAsync(idWell, dateDailyReport, CancellationToken.None); + var result = await dailyReportService.GetAsync(idWell, fakeDailyReport.Date, CancellationToken.None); //assert Assert.Single(result.ScheduleBlock); @@ -431,7 +427,7 @@ public class DailyReportServiceTest fakeDailyReport.TimeBalanceBlock = fakeTimeBalanceBlock; //act - var result = await dailyReportService.GetAsync(idWell, dateDailyReport, CancellationToken.None); + var result = await dailyReportService.GetAsync(idWell, fakeDailyReport.Date, CancellationToken.None); //assert Assert.NotNull(result.TimeBalanceBlock); @@ -446,7 +442,7 @@ public class DailyReportServiceTest public async Task GetAsync_ShouldReturn_AddedProcessMapWellDrillingBlock() { //act - var result = await dailyReportService.GetAsync(idWell, dateDailyReport, CancellationToken.None); + var result = await dailyReportService.GetAsync(idWell, fakeDailyReport.Date, CancellationToken.None); //assert Assert.Single(result.ProcessMapWellDrillingBlock); @@ -467,7 +463,7 @@ public class DailyReportServiceTest fakeDailyReport.SubsystemBlock = fakeSubsystemBlock; //act - var result = await dailyReportService.GetAsync(idDailyReport, dateDailyReport, CancellationToken.None); + var result = await dailyReportService.GetAsync(idDailyReport, fakeDailyReport.Date, CancellationToken.None); //assert Assert.NotNull(result.SubsystemBlock); @@ -526,6 +522,15 @@ public class DailyReportServiceTest Assert.True(result.To < DateTime.UtcNow.Date); } + public static IEnumerable DateDailyReport() + { + yield return new object[] + { + new DateOnly(2090, 01, 01), + new DateOnly(2000, 01, 01) + }; + } + public static IEnumerable FactWellOperationDatesRange() { yield return new object[] diff --git a/AsbCloudWebApi/Controllers/DailyReportController.cs b/AsbCloudWebApi/Controllers/DailyReportController.cs index 93d2fbe3..e36868f1 100644 --- a/AsbCloudWebApi/Controllers/DailyReportController.cs +++ b/AsbCloudWebApi/Controllers/DailyReportController.cs @@ -175,8 +175,7 @@ public class DailyReportController : ControllerBase { await AssertUserAccessToWell(idWell, cancellationToken); - var dailyReport = await dailyReportExportService.ExportAsync(idWell, - dateDailyReport.ToDateTime(TimeOnly.MinValue, DateTimeKind.Utc), cancellationToken); + var dailyReport = await dailyReportExportService.ExportAsync(idWell, dateDailyReport, cancellationToken); return File(dailyReport.File, "application/octet-stream", dailyReport.FileName); } @@ -187,8 +186,7 @@ public class DailyReportController : ControllerBase { await AssertUserAccessToWell(idWell, cancellationToken); - var id = await dailyReportService.UpdateOrInsertAsync(idWell, dateDailyReport.ToDateTime(TimeOnly.MinValue, DateTimeKind.Utc), IdUser, - block, cancellationToken); + var id = await dailyReportService.UpdateOrInsertAsync(idWell, dateDailyReport, IdUser, block, cancellationToken); return Ok(id); } From 2ee3a4ffa8b547b179c359ad9040a1ac513e5be3 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, 21 Dec 2023 10:32:02 +0500 Subject: [PATCH 28/30] =?UTF-8?q?=D0=92=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE?= =?UTF-8?q?=D0=BD=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20=D0=93?= =?UTF-8?q?=D0=93=D0=94=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BE=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Files/WellOperationImportTemplate.xlsx | Bin 97455 -> 98992 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Files/WellOperationImportTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperationImport/Files/WellOperationImportTemplate.xlsx index 1e89ad3105c0e3b91c194081c382aafda1fe7386..7e9cec5ef4884fe0fd0c22749e2cdd8e23faadfb 100644 GIT binary patch literal 98992 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 F{{iPwwZH%X literal 97455 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

Ut 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 From 9a08ed1687c6b91850b2385426e9a95e3cd7365a 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, 21 Dec 2023 11:10:06 +0500 Subject: [PATCH 29/30] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B2=20=D0=B8=20=D1=84=D0=B8=D0=BA=D1=81=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=B4=D0=B0?= =?UTF-8?q?=D1=82=D1=8B=20=D1=81=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BE=D1=82=D1=87=D0=B5=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DailyReport/DailyReportService.cs | 2 +- .../UnitTests/Services/DailyReportServiceTest.cs | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index 0a3d6df4..e4271c8f 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -420,6 +420,6 @@ public class DailyReportService : IDailyReportService var from = DateOnly.FromDateTime(datesRange.From); var to = DateOnly.FromDateTime(datesRange.To); - return from >= dateDailyReport && dateDailyReport <= to; + return dateDailyReport >= from && dateDailyReport <= to; } } \ No newline at end of file diff --git a/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs b/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs index c11dda49..b75b6947 100644 --- a/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs +++ b/AsbCloudWebApi.Tests/UnitTests/Services/DailyReportServiceTest.cs @@ -196,6 +196,11 @@ public class DailyReportServiceTest KUsage = 30 }; + private readonly SimpleTimezoneDto fakeWellTimezone = new() + { + Hours = 5, + }; + private readonly IWellService wellServiceMock = Substitute.For(); private readonly ITrajectoryNnbRepository trajectoryFactNnbRepositoryMock = Substitute.For(); private readonly IDailyReportRepository dailyReportRepositoryMock = Substitute.For(); @@ -281,6 +286,9 @@ public class DailyReportServiceTest processMapReportWellDrillingServiceMock.GetAsync(Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(new[] { fakeProcessMapReportWellDrilling }); + + wellServiceMock.GetTimezone(Arg.Any()) + .ReturnsForAnyArgs(fakeWellTimezone); } [Fact] @@ -527,6 +535,9 @@ public class DailyReportServiceTest yield return new object[] { new DateOnly(2090, 01, 01), + }; + yield return new object[] + { new DateOnly(2000, 01, 01) }; } From 7d157f76504934db6866b1b28e8949da91ad74b1 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 21 Dec 2023 12:02:29 +0500 Subject: [PATCH 30/30] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81:=20=D1=81=D0=BE?= =?UTF-8?q?=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D0=B5=20?= =?UTF-8?q?=D0=BE=D0=BF=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 --- .../Services/WellOperationImport/WellOperationImportService.cs | 3 ++- .../WellOperationExport/WellOperationExportServiceTest.cs | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs index bf551edc..b8042275 100644 --- a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs @@ -77,7 +77,8 @@ public class WellOperationImportService : IWellOperationImportService DepthStart = row.DepthStart, DepthEnd = row.DepthEnd, DateStart = row.Date, - DurationHours = row.Duration + DurationHours = row.Duration, + Comment = row.Comment }); } catch (FileFormatException ex) diff --git a/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs b/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs index c22c5fa0..cdfd6cd8 100644 --- a/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs +++ b/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs @@ -40,6 +40,7 @@ namespace AsbCloudWebApi.Tests.UnitTests.Services.WellOperationExport DepthEnd = 20, DateStart = getDate(days: 0), DurationHours = 10, + Comment = "Комментарий 1", }, new WellOperationDto() { IdWell = idWell, @@ -52,6 +53,7 @@ namespace AsbCloudWebApi.Tests.UnitTests.Services.WellOperationExport DepthEnd = 30, DateStart = getDate(days: 1), DurationHours = 20, + Comment = "Комментарий 2", } };