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/51] =?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/51] =?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/51] =?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/51] =?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/51] =?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/51] =?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 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 07/51] =?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 08/51] =?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 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 09/51] =?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 10/51] =?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 11/51] =?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 12/51] =?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 13/51] =?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 14/51] =?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 15/51] =?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 16/51] 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 17/51] =?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 18/51] =?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 19/51] =?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 20/51] =?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 21/51] =?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 22/51] =?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 23/51] =?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 24/51] =?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 25/51] =?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 zcmeFZc{tVG_dZUVq#~q2k4g?oC}k>CqHv;82z4|lQwR}`=_!>Vm7~a5<~e1|aE^)+ z88T+^m7P*=PC+Iz2cuY28V?frBL&$5)8X*ttM zCMKrsOy729U9e$hV)|=26B8HH$|d?oEiGFO>WUe5TvnvdfsI$rk-rvo3zp8gCCO&IbMoa1ou3Ik_Sco0 zUc%R<*O*(k()v_K*A|IHrs0;JE%#3{7(cf>(^|7Zx41Rt0&ZOHWE&biPT#@;mTN0N)c>CVr)&4WN7nP#w_jD4@+U#Xf_&#A_-+g^4@7Pz< zSCzxermw&3C7!SBU8Bn6vpctK_jR(GU|xL!r?1M-s*&X(q+XEF3;! zRp&N_4?HA3a@Bhvw`OkNo%DqO_eWhDXSp8sAL{V9IsbQTZ=XKNaP4)bj~UD5XnRjY z+z;VhcbM|=u&R}v8?|vp<~yJI?J*Tk&Tms<1N@Q6a4HrpAG zY222p%hkJhv&V48=fr*4lkE!AOPQD!7Fd{0{UcVn2$ZW!AXeKT6xkqF4Xm$Tw-FaZ zKmT8h{x1&9KaQS6QpdCG<+w+^y|BHMe6VR3f7NwyeF(lHaq`Rwy1GUuLJZ`2!CV^6@Hf7<=my|&G#%JzRK zS6O+`h9yE_D(`2Wl(c$^$!AB);^-YBk7Ja|AL~v%ZczL&CK;g}9xd?hl}kyVN68HT z6&5}ry}9S#sb-a$n#XW=gIGd)eh$biOV5i^w&8MZ4m{@6yC+YAJ@%Z1cyR=6?`!!h zl(_n>v51CfhIbjqsH7ra_o0(QJ+g}%_N6jruYqQIimS!lyEk+PCWI6b| z|GWRo^Q$l|*t7a0^$z(?rLz^u;_8zF=dxe#17B^1pSGfsIz4j)rUDKJ4V)CdurD4)kJaghj_(C50#Y( z^8|h^ULt2oPOD_D8ENJA?P7Av6+4(YViV$qR}Jy*&Ft@x+Oq2Wz+B+mHAx1E}I-xKAg?{%~#Smb)WrgT>g_EPJ-RpcbOE4 z0{aDr8Zsx3dc;|L+PJi}G}bHB_dh+~a|Jyt6z{!pr@yLzauRYk8R(`~D{ZDeSqKdN77L$|^ zJI@E7*L?T*sb(rGy~aJ&dz!vI+6THV!N+J^amg ztwlHI(3Us>7ymsEv&!rIn*=7mWpdAyth%VdW%2OUN}Sy0O#PSr*ZfsXKdliyvgSe5 zo@WKY0}GZE>w(k4uMgBQ=V?4!!maF|d1PyT4Ye|`HC8a4^Mky^5A{cqRnM!oUA~;K z&EN4rP1?Eu)f+2Ut#`-`^~io76;~+jdE3O!n=n4kE#tcWPKoy+&&%cv_!a z(ytwsCvoD5AQy+BTG0!U+~6-2+UJ#g_9bmwbu)n9HetIN)AP{+(&`=o!y`-$N&I(6 zgMN*#ba*ERSA9Q3JUp$%?%L%&Z@ShoNmji#tlo6B3fC3dYtb|VZSTB$uO!6NH;s=x zDtjw8I%!fg_#o%6tf94`+AUU-jT1)6$#%|p(tME|$8sYFM{+f5&UX~}uogC)II`D% z^pdxE0Po}%`?E{`7Ii-}$JBG*?9%sD!5kI$%UerUD3m_E6uDO|Z}k^3quFm8ATs`) zeLFwOGvz_tyxWY53oLeS8ecWPDvtf!i@0|{x5a{2nVWLF<1cL@b=vZl`ElD_M04pc zQOTRL;sUM^2STse)i-Vu%1BVta`arP$X&RG^G3n4CHxs4!Q+258?EFX*)g$RW}g|+ zsDo7%ziWMslA4`SzD-Z5tPy43p$+0KYvMD!xsG+jS!@vJzRq@h&i-)3=@v@EU{^xs z2N|#B9v|1eY&ugqfbXYLY}O@@Fx~&UzI`UG_ez>rs62d|Tot+pdc97Git8?kraDJ8jtz-}&ZY{kb0jOeH#2gKAA? zM7%Sn+qCmW2UG8aYV*1v(OVC-4);YKxs_P8YlCE7M1J07n}YTEn+dly=gL=6sz=^= zqu=M54XZ|X9mIZ{bvuQ7vuJEYJ5Kn8K%?%F4d+t^#E<2=ufCFV$-Vx3?3tZqPmP2> z-MgCUDR$4Qup)@KJ%>x^FAk2|+*X{rP6s|7t+}s6TZbdNp9?nRKFt5{H1|GZu_voS z6*tX$85~zoWe=Bpz-@9#=-fx`Aa`e;ej&rs{>hmawc6Xn*XFxgO?`E=vcHkO&}F>P z8+o7o(WL7MTa(+o!kgo7ySmI28yG0Onzx^=ef~&cUuU4#!o+=cSBL5NO)Kw|LXWA6J(!XR1UAaiOtl78X+`h2`%Il8r*mB9j({g0($9t76f=XlkJbglY zz3(^Ys3!^X9}BptdJ-RX!uXCmM?ie>;guOZ!O8mC`(k2FXAQr6=+63g+`B2Um>^#9 zNY>-ws#iDMJ!?B9*ztGqr$Lh{9V_#X+pBh*xRNOU_CcWGOWYm;?z@iL`O-^m5!I)T z3x*6lyJ-<2qwSk)U&MY&Myl~d#NiK=BD-zMzP9o`f>YW_6&xdLtqxauwo{Z}@eEaa zeiIx{FxB+m*6~?jZ{euK!-=0V(MR2JpAT>P@>NctGQP&;K}}0mRG4;jXH=_-hn1=M zmdH`R8w*F4Sca?K{Hq{DSM;Lg&lyqIrUl}>f{EDkLuN)wYqo?Xw|46($c<^bs0g?8 zobi$lJYTj?Sm(~#{Uzr2o4v)d96Oo#dU;vbNUJ@5@|yI_^|1Y`zh3O!{nOhz^1x-A z+8x(?t}H*u+_3vr<ezxizU)p?kEP%HI9qb9kT z_ONTn@sitP=S@4Fl;7M@vV6xb?_(Y%hc<0LZYQQ)vs(M?-D%}Gp3~=ZmYmQ(wyf?9 zPtyAznf*~h%U%^La z3o@trBduEa-m5an-MjMXFTuKZ9uL12CRg~~e4oE6?E%+EeUD}F1-QPb>l~a9xx7iQ zEWF#r)BZk2IvQpEfs^Asui5!E#@*`s*4}=(ViWuQHx;$7L`2_L_lfLrDp~(AMRT_H zouWk8;Wt@#-i6gh`gJY8&21y1-2RsN(v59rPmpD|-RQ^`NZq~gaD9yIV8Zc-68Ed@ zl!};xbhw|Eo_Qls87(_%-pA5yu5j(f_XIZLj?)(xY-{DoXW1%tMg`WM@X=DL-S5}e zFEZ+-rMs>+NiAOAV#m3Uwi(Onk3?)vEZnI@TfOYaUeW#&`_#|nsTJH#>rKuv>3y^9 zlw5o0x2&r^dmKBoL=JuWt3vPeHlF?yfm5TIO5`#R;w?8hy&Gb3;UUGR-nS^-zE~L$ zwm&wV`AnDC^OSY%#X$m57HuML))a|nySzMQ+aw!1z-_ISb-G;geAfBvxgQi0b#vJ7 z-d%C2Qr*(@zzqfE*s+<-4HRo5F0qH-#Kt@KZ2g@0EN}n$)&_2TW2m~L))m_iJ`c>- zZ3`t5;?IcG2N7OsTimqPNYpK>bxH{|b8v~SHTh|gQI~D0pUXM0zl746ktmz;eMYuO zWaU_5#`zCBpKjKOK5c%`XJ+i`>IZVskFv$zlB-@$m<6)%%4hdVGX%((BQ|%1~TNPX#7N+{j z%0|lu%hK+jr1H5sE%cqVw3zQ)XkMsJ3^p>LQ0B%vo7f*c=WA`AogD7&d7i)Ue4#Vf zVC$iUpPwt(*$tj&tbI<&%l`SZzuti2JU{z6_xV-@%G_vKr#SobM%S_G&fZ6s`I!r} zvFBl~KfA{YnzlZQc(gSvB`Zrj%++aTzFM6+JlN|RRn&R%5ZRS>gEloJzICgD^PsxI zAt(EpjJdh|+1dF3@z%l4T-T_UqO9i&vjGP4eJ!0u272CyC=0{${g%h8gN?SfInRi@ zPLEIh9Nc!7`_aVd7RRxH z!Q2$;!t}7E=wMmd)~)$2&a?J&)JLkW=Hbs34$apW#CBSa4!4JQXXbZh#0t^`$$jkl zBJ-~IA5U%#cJDp8xx>{?o>r7Fl~qyU;xyGaXrSOU*FI9P;JnaT|GcTq?q^SJUwXd% z#OTe=g~0`v*@@BN`ICnXKBRvisa}{YY8&FCRX-UooyT)az#bw8glcUOj760B)iZgZm+9(;&|xQS&C8m z^Mx}XBQ_n{bEWn{Zdm2K#7TLnGMRl>>L1L6Ro)w|>5SUs`mL?=?zQvJMn-pbI?NnV znA_iUv*>w`^>oiPcTYv|f=r6-;0jl{!}ZUpRN}YVGvDs>+0Svm;brONJ7@7+b4b*B z;9k+!dAAU}@eZ|@`jxN5=C|YO51g)IIikwG6nEuYGs|gD<=dQH=M{NRSNUI5EzZz* zGJg0Jj2CZ|p&dSZ+4sd#*?=#{o}^zrt7)Cgg_Gw%;}XluOj`(Kw#K4~s|Jly!T3da@S7t4Lq zlq2}qmmMiJ6`P&9#8;-J*&#C@?sv5>_J)jrC?{?rMA+m(NV1y1MAT&4`8C56O!F*h zVmxXBT94+I^-`201VU#0$J+QSc-E=P%?8?fCf`)69drGg`IX9(rEC{vPjjlf;fkLa zvs@N=dRB4?TZkJ>v1k75N&3Egx2ixTd!hEO_#Z1@E-a}@F6TeZdE)PGCDrt0{sJW9 z)o4n_a<;s`Vagj8G=&{a*^W(F$MbBdx032BR(~#BrSLhDN`#h2@>$K=-MeqF@pzKH zZP+cO7IEd3fUi;ohkkrig4wx?yt_GZ?_|ztJW=YusLJozvpthj)vQ*2%iU>erAx>P zRe!FBdP?Oyp1q{|9f#D2)W>id_@aE$4R-WJzTHA6iuw6HhyKDjU$4;Pbb-g-{sy#1RaueJnoQaPU4dY0L$Y0+N2mp>;U zCiiB=XHT|AL+?l(li$J@D9duNBk{eI&M&ZCZ^6A=NQ3p(D*qj4I+B;9iM`HNOUSvu ze&`*)mD&w5v-u9# z^Cmmk^E)51r!Bik^BrVQ*a7?zvZs8ZHor+?&i%+!RJV3G! z92VJw1AD(AzS`oeM0=Zrzy6YxFm&k-5jmQ6QT9^1t`dA}Pd_KJHu38XY+JWrzc`%u zHj*?)v4}^*L677gd=C|!{d3qoz@SOH)FOzlqTa~c3%`NW#KP`)vE4PxgO>_((Q)#K zm|Nwq|8fGF18${ZZY6#NzkplO1Y{R*&-P4BRj@Stk$~E5;;Rs0PcXC+XUoy+(f`=- zY0j2AI8Om|M1esq+70d>L>({->v2(jBkw|+;-e$oB8!vm!!e(c=yqEN_AJdQ>;c^J z*}Yi-MnPWT2~&nOAU5dM{|nsp+xpzkaqM>^rRW>${Kt?0X{v{xK2Y#qc8nIsZ2ZTL zk>}U`7tjB5?cbh1_@6xA2Sz_0?oy8s^!~K>rw0C!^P{I`-*YjJ-adV|yuDvvo-@V} zf*IiC0WiCE;j#_FlF)xUKG#2%+Npr&TgC9p4RFbSJPmB%4~zZY_3t%smGUUg8Gs1+ zFOL7eTEKTa0s(T)WiOn}J(36Lup_%GdA3uA76{<>IOVSEzV>1c z!tVGsXas2g z-=LrJ3x4P9A@^aF@O#GZ9e1R4g@0pE@9#PPTg1NEf5X1yqLcp>`)J00!Tzr~|BC(pLVNB1qZ4qXwNFeu+iOKu5V%*n z8{O^n55M=|_Q5xE=EIy}>rb}EJ~Q5Tf8E+$ zKi!Y$*Phy)b%UD^hPcDl*G1kx%WJMosy8-h=UQ&AW%RoFy`H^F`n&V?{>G8y;q<9= z`45H`*qAqrT|r}4(OAXs{@P=)+XrD%3JhFF0~TnY9SwZO2C8Ae77g4&17m1_iVe_U zzy%Gsp@C&1Fu=u+KE<2b{Qf=~@I(U}(10{Ha0mt-qX7~c*og-8`3KMHAJp{P_!$}& zo_8ap*gmB3hJSQE;pAE5KKpEn^wr{v_9Sj_#er!~HqXpT_hwQ5^}W}&%jU`pHgXzp zHmzwap$Kf(7c|B{-W{A-nUJ0xxPsNNAB=UBaMVu2x%i!D(y&FqQmeo{Vt=P!Z#K4w6AEA}q)*BA={#@Gh$N$O7GSjQ#82}`US(tWg}P4G^t z$0&w`Y94SAtQu}0IEDWrhF0Bg?kQf(@vPLWQ8D+3enWu3#!~k?tOHl8rSzW0h>qYk zvH3Zu>l;fOi_DPR?*}sNeV6}hxjUD!<(8XYH6Xd|<&qFQ{7k*cSSu*AFu?HUi5^Mw z@K93`7Ksg<67t*?77`NjB4I78xa#Uco4qL`!MQrJ*lyh8O7A9}U{|hC){8On6t|MO zCYQ@~F~;fri{t^kc5A>nm7b3?oS#YAI7(sFO$$$PPjFTD4CniO8`wOhS_9nT8r(WO z#Ydi%u5mC|2fO_pvHK^d=Kc+r_sa{IktpsDN{J~o**F^R%(H6?ZBy|koz9-jVplEl z#F?+8mBAVL{IJo49_zO|%^K|u6klDVF7zDhIcCtYt!#?ww)ACR%lokEx~`glEl)~< zV9m#`vYFx>icSUVci=fou951~)nVPlB=|Jz>0q``LF&BDo{^GQEqb&J)dgYYZ#~vG zM6hr7T%#UJQk~{By6z=4wktw3TRe~?9U$SDrt`zuvl8B9C{D+0_&6roZs`~_;8&Wf za!|f)E$OO>h5HS$s2h&LL%3}=Ve)t<&nwcM&79n^bUUeZp7-b+e{9_8tg6^Gt`-XW ziaAx@{noIq=Oay~%X)HtI?uPXPxpZI*fxo*!hk}%g60yc)u-O`y9FwE+d4Ta`|c)` z$$1##or<}uv$v#wZfyRJSNSn8cRzcCQdk^f_56f!Xsdep(9RSa*;fIQ=HoaeyUF=G zQq!ErZ+c1P9`((}QLSRWm3MzLs7tR5c-+!3!w$CWNYbdhMo>;igG(#AnJ%G0jt(^V z9lxb%==TZ3$n)348G*xSP zd68+7`#_(GHDxcAe{g)Y%*Mdz>~+-a$JD-Xd%HV79VU0nvTXUj>3P=D(Vfrt0B||2 z6*k;fkQaazIqPC|el&9$NPKV>TOpYyB|Xi_d5GxRg8wu-z8hJMa{w&5Co5Ha`%jzg z)73{Mq+0`Ie(W3aW1X+gEpCus<|ek{I5tn>Fmd6M#W=2fmfPG;n!iHd+CT#Lx7dnP zX)!(&_dQ=)UB3W;hEG=dPjU8SI9od!SU;9DgFUD$yTHUuz7jX+R}9`-u09%+*$3$P znq(3wzMbzT^O|({jn$U8Qh+AJWelb3qB&+#t{f(|#&mE;_6vlYOJJG_+|~2n6$x?o zBgD7wtx1azSA7;9CfLh6CRU|U;dY0j8^rrA-21K)Z@$5jpzjTA-A*=VjhltIoZ{*Q zsc~yp8>u7bZ_jbt=vZ{B+CQ&o9>;+)>U68ubY zKT&!2)M<8Q1I45`qxj4&O5vr*k%Qzj>EEq64w%`%K`x}zwxS5yU-{;wp!;d6V3=9S z#tUoD!ivtUdn3sUFMKG4uOlL`L(ZVkD#aEYJ+|SSauebG3}>&m7kt>=LA?nEhq1xi z$2Z(K77W{3;o}7?vj=0sI~|A#6_@la`DP5i=_ovnnOxHRjDhBIUoin+N8zv*LtjVj zaU82pO*KrT)$&WUx=pN~u@m4S<&RJ9sZFj=d~<9q$5NK3U~QYlcDipT{Ik%`BpJ~Z4zAs?dZ z?cEa=)^;buqd&i!$L2LxwYok7ey~wf2F$$A%M3V?Pjftc7-3`Oo(pe95H@i3hin$O z{m23ikM@0dCbnWtIzp8|HGQfd{wfgRB|}#K5WBmP&O-xIEG^BMo+2olt<2k$H8H6K$!9#xHv2moh>Ze#jybabAI1R-hY-`<9x!+s?8VqfI((rjeH3`_TdxwTkTL!Mgq$!K1G~eYBtj~PU-sg0E-Xb z941eIag&fAO@>uSvKWgUria)>{~R};MxY*ng7cRU# zhv5b|WeEXsO1!x2${57cQ7K|>$x`Nd;#Q3brN4M%MG1zejdjavY5`h>uM_E^i1AGj zX3wG=rhLq1u3Dfx=z;j;brM^45}y~v-B26Zu#0BD;@L#ZE{bLhyS%OI{uYMW<(e5arI$B8nQoUQ77V)>W{J6H(e3i84(!6D zgY4pUTOi{ovr?A<-L;=Hc;a9*EAHidv?6YP5nt>QPH4&(ibu1_| zP+XV2%2ZiDMmbqeko>_I=yQQ$8dBY}2*+9J`X4I`11(azik0u@e-iKzV^QK=oxzO1B4X=Il ztyg9k&dhpshNKCffSl#Yy}Ev%%xu_@cr{2R(SWP&!5(%8^13Y0TB~nb%*tOfkv7f^ z`;n3TE+FZi+j?{RN1eJ6km*ao=lIB8lHHxm{&+(5a)Z>(OSIE{#LXMW?$KoUs>tqC zD^gyjpb^DTJ}z0(d>BV=cy;ojV3f%n@sY=-5chyFbaGQTmy@cclrgWm3Vfzxdo4J; zOVWIwK`LKOU69lisrC97si4O(Ybb?B6MQHFSX@SBh$vVdj|Of0p|?zNWcA_id3q}8 z4!gscOLOf9M_6+L(nT}jZ+98T*rYu+X1VW@vAgzH;C|7>o00PBpXTYXdrCD2*!!FA zOX0TxUB}4XR9hUi_Gknw)=qYe4ryVfYAIYoa{QyNv%}cz47F8$X11q?CgP9+rN|rc zk=>!Zu3LqQ&CDdg+E1NX9a4S|!LlTG8kQ1fI7bOOqXfE?Xie1l5mZQ4!$>&2rjej% zpxD~4)+%yzaP>DDKJ0R8z&3h<^4CKNiaw?u?C|*eQ?6Dsx@cs83T^mlcnn>EslF#Z zwVTd+O5X&8TAogY*TP3t`;;)j3Vk$qCldq;{g77ho7yzP=O^q_R9ltNDJhFXaQ?!E zmsaY6c{)@cm*or@|8GY)F@%rFtIsGU4nCcxGQsKaz>@-bIw@z(i=B&~&~o_FYpN7X zLTbNfeaQBUYGpsK)1%;4{bU)|S6J$%1^_MmXIT&y_a*0dkwn@BQuy_foPPz?<# z9ZpOsE)0-i(XJD~RFi5TEoU=P(sT!yphJOm=|Dr8p+&i!Pa|h*qSNg#%d5!diT692 znQoECl3@QA=x$r9@VJVjho!QG!Own%>j?un!>XBoH0KdNro}QKKy~1u&^x$Y52=z z!1MGyLVkNsoY0hQTf{6XK}HGWQ>erU8Qi?k5;{zXZg~}O{^UeezSV=YU8n}6p9Pl8 zD}pep(#Tj0E+c7&l(6-^{=)=$^{^}mb5vX|o&kz2Y(t{$WI=}wsD058u+d2Jr7Fe( zn+_0FGH`9;+c#vI1XGH3juCXOqsHJcrBa|1(Nz~*AcwvAbbonc%6VV ztL#e}A-)1UwRjB2B z0tadl=Y}x%OoK!>%4bwUynuo^zHxQYW)uPBJ*Id>J4B3=9PI)Yi7^k+4wMrxs@nSD zN-@D2IGM=cO)sOvOVb-MM}hYFm(6^8d5a)yCh^mGi&5^!UNEg%?j?19D*XgVH~%N^ z=ZSmn*FKoL?f_BTxfPCp9ezxEzBSQG8`3<3KCxO}GO#(|ghPs1AgxgZ6|VwS=bSAV z!SoW?V{vQ+NFxNP0UR_PG80j?wTQMOj7S0<-Emz9#MYw8qD}X0F_VM%pLib!J9i99 zDn^hQUo8yIXXJ%X#0kX)Aw=-EM$V<41o9*;67qDy^ui1Twp~!0GZMh>U_z+_bqfB~T%dU{u>3}DLfMU^kpV$~Lu4lS z#UvGB-XzxOFpx7QNl@-f+)zRw4HNwGyo)#u5LOmr^23{B>?IN$-EQoK2Z`_9Hp= z!`R?X9v7iAjcaUj58MvQ9KyX<$o2&dtm`-ByrrTldxV&xN(e^H%fxAt4`{{W=3`t{ zJ(xzl#-|hp%^yr0&u3)Ywr#VyBi^u@S;VG*xTQi9xB;d%4G>eBkV5NsIh@`uuR#^R z&U3F(LDgWC+b?@W{$V+^|1|&)d{kFL+9|&fO5UC$Q22oqeKF`*Ro_!5f7=*7 z&2-DWLcfCKOrjK4-+Ue=?u&%CszLSd;YLU3EsLYxvH|KX>n~R}KOP-s$>TK>b+;o( z>3g28N?lY@N04Fb2eY4+A<1*+5*puv5^-POzP)ler1y9*^%htCpKV9Xp^5`l&;o8i zgj%?&GbsJBX(zRFYK1%0Ig>LoO-D|N%3F4kC$AMW56{Si;ZU#6WHb+;Y9cKM$N)GU z1L$DFyg)%Pt71m~AkTvK@tn-JGca0?LLRC66C}F)anMAtY#wvS=O_bpm(LJ$x8_3XK zW}$O|1s&NV41#x-K+)o3bQr1l0)i%{)zcmi;5xfis!^K>_!Db0F(T$ZNK>XE)bw-T z0&24?@l!KBfs4=+I1T5PiH4JuQu7EWmd{R=P-3EIh+f?4X^`cJE& zygso%@Xw+GJ9}1TLI~E^LK?rB4yFfbn=35-C=VEPO?RK1WsB6Opf2JT&h-~ybpESURv$4$f@-_3Ji! zYM{#oIl)E}O$Im^xwvFer=T{{FHxL~3b{Y>IA#D-5U8>%6Eeu|ZQ^^kB!*aac7JL? zVKBaWPYS=81gQ7H@d2?hf;2doI|Eo$*9yvn+UhQ({Hw65EU*ta;@>s#Pn610B%<3G ztQt5V?Q{q<@iYmJhpd(=_;U`^=)L|! zk4=XGz{P;65Qqw>FtFUiI5(1un9RZ?z}fPwDOQLkmq%BiN);+b#CP@kz;=*|R5FRJ zX_7RoXZ*!Zz7}tkWu>i*sXJapb+9KVqYg&}$R;B#6lW;kAq@$!FJ3FTDdbT(ShVE< zc{ANA;>=4X2Xs>fLkBm@>p&Er+(_>i1mA^D>6`vgqYv4#O_CIJ9>OjgZ~6tqC}vjy zNW&=e?lfW=6B}i{lQ~N5+(^`_GtAq5tt6A^AWmHLp9T6 zF?8-Xy^_f4k}vC(fi_l@^!=D_(dN z%|Yz|jv4*Ce~>g>1_3($>x{=OL}w5n&pm0tK4EVyzb4z0h<2BH7RlrbTaCSbQY- zG$NjPb8-nYadNjq>!OH#{(^|$1~CTNX~~ddFN7N81Ugfdin?GIpPzmuZ>$zZt>;fd ztD!81e3%Md2N>rtHN&>aXmr1b_ICmr`qP+yGIV@zaQnG#2TZOK`v@eY^?qa&owQ_V zM|w`oqgS7QfDF~_7$eSr4*#>Q0IH_}|4ZqiuSF-ol>H$U=np1cn}2jG_?- z7A%TDO-mvN?)v{@6LdTJKVcJ3aarSdkc5x6p{g5LZ)JvLpi@4EKXdiv!TaPayQxT$ z=&JPaoWJ9|fp_IsbXAVJC+Nxnr5R{Dpi3}RBCl4V14f?Z*AOHML|>?|q?@e=KZz)> zgwPTGN>HAAQuSUrpBJ(C%@ELZC744XuD}sZtM>if&}BKW5PJ zbUJT4)>oa3OmH@EIJ9eG^(&~Cc60aMgSJv}^KNzMBM;$ThrTS<)~j9K+V8Tz+PO** zbwg88=6-f-guOez4YT-K@Df%}b#8i$T0p%Y+lqYQZajg8JBV0GQWhH5Knh#xi6_qh zn9eTD(+D1M3_=MQ`<5Y_EhD6zJZe@XE;Qiv(ipwKg!e9vFKF z@0fN;e3QD0z8~Bk+pW2k5*B0AN!(&0U7GA@kje{vFiRd%?;0A8AWT&4z$XQQKt-Gn z%@?xuS0NPq03M{Eu`R*1fC(whAO|L-1p&np7$`rS*q^6Nhfc&zNuzzULw*n<|&B13u$g|^s2!I*mtJ9;g?zzJH@7*=B-@2q=!wgMv}QEiAVd(C~8D z?Jwhg0IrPbxWKNAf9EA4){N>+Zd$JE7s;AErl{*T%u5T40X54x@*3_&5zh>Pm9e)j zA~ll5)Bt;FSr%x^kdd4#peK3pC)v=e1+>t6!r0IqDN4~|2Lhw#W&||4t$+6>&`1JY z2_hqRCLJ@lyuAVcF+j>(yq$>Ja0m0~JmiSF@n|2y^p<)v%!@4^gYIZ_=#bwEt&E$f zE<|qVP*6qcOaan7^mOQV!jO{~u-INS(F!fDVqyq1W)ML|(>tkv7?cj;=_($>$`)VpO$HO>W~l=x$B7CMS*dt8H+f<>>RVVXzwRU?$3WQ@XaGTzYc4mOApA=K z|1#OXD_~5HO7lVgPE^3mdRC%16bgiYAB)S;=DZkbsCHF2g)#=w129_85r~fK$5cUUv(htAQMBP@bmDWpFL8j(n@tWV+js}T;jA9ykcE0+C_8{2 zMi+~j+4OD>+NLMaCrVBK-)L1-F#$ zD^KUA`y~r3;w-iY($#$&5GeG(%q_6{So-NI(S7Srq)`74c0ms-+Q}tCs}W&i9U``3 zc%uSYB5auO{4%gQcDaCb1P=q3dzi{11(Sia;jjrgAsB48cU+ zKb-$tW?!RpokaoOfS2P=cMu-HtqzsvuJ1atTh0=$!5iT|Y8R%9*8mrDntw}h@HgF| zBMSQbT3-Dbl#N%Iw-7!xe-!s?cDMvjHZ+0v(Tj#*c&U^?=`swdy|LUL9{j@F0^@?2 zK;lVnBifnWvxNI_ajcbZU@ZY%n*wU5y?>G_Jeq^&1No?Po(+oI5nK3`;0Rw4Gy_3T z$HRp#YGpg;cisG=DPnXhWlMTH5%r61fS^wBLGLVL% z_L#!@04hpg9yu_NI{Da`H(3po<|sFp`6oCO-5MpAEL!+KDXtqjzv8zzGku zQ9NMD5!j@NG5b#D4`K)xkS1tk%vSI!8hT15_F_$A^cX9aNtDR4Sf>P1I}h%KDTUMh z^pqR6R?l?M0aYYObTl5)bgBPzH0NZ{3SY+6Mm$nmj+9LgCCed;i$9=umFaT%IkcrF zl(6t^1;<0v4hn{h?eM$@df#nDvgqmosdCg=y6m@%G0}2^y@*ouCK*+I|YvtPGX(qN$i>|n9+GN z$wBd$$va6x??bT7Lf*v86U}%?fPo*im67O5rPCVuY<<^)(a@~j_<@%L^Sf4G>bk~% zCgSG&UQTAOHrmh6g;HB|{S0r`$LR6zAgN31`zCEW{Mftea_jcDdG7>tG~84Pe>+B= zeV$O;m{_-~Fs+@rgKeRqF?a2TTcHWHTCuKtVF6JNDSo4bbrH6j75JshM5XO1xQ_vD z%)Axc_wwp@mJySmHcNMt`9;cA;iq@{rq;ybgVkJ9&iFBc5c~=EOiZ4R;Rjh0`xKQ( zTG=qc_r?c^%11Ll2WoZV!N5~8w4`h<43$L_jo zPM+46K8I|XChe!%nugTAxs}CHrYa8wOkEFN&m&`#L4<>H)0cpO^qQIq%MxPf6Pg#t zggVt~HFf>dS&FCY&PI3^WzyPTBa>JoJ%NKyZ%@Yc+jY`7Z4>Kj0#Hw-)rF2$&4eM zYG&bokuhiqdr=z-&Mw+CN{HQ0&Cnh_5D(_`g>XS5b%Jf-Pbh1gRfA{;BqvRq+w?qo zqNX{Iyye@=Q=!_42ODHqXv9#hp3n~Lq^{roBY2v#`%T!XV&{Dn!%xJ}s=Ru=hB8%# zRs22%Y-|-#GokV^7PD)t!L}GxHpN*$RNiUE+uFGZ2O7LY6%jDUrtrOOyhjnBADP4C zj6p=64)>_uWz2I2WXEyH`d<^RLeI8}q;}}>ul%|rRfYHK%MpdQ!-PK80X%F&)gfi& z2MTNRgjaejy^CsP)jS65vD!nhER@TXoTvVQ~D_4k>4X zXnGbm%Gz7^MX^zfy(Qi60^v)XT^(6Ka5p*!6qbU!6Z%Nh_|{+M6fC-STyv3XF^P{~3>D!aX1EY5N8W~5v>`}zku?sAO2#HTy1&ub zMa_74GCwOWe1{^8J-T9_vj4oaP&EaV2X9uhO98q4(HY*HXZ;r z7J(Tx(()LHAm+>Qddb0lS-GwyixeNl;Nqk*C)$Bu$b^6m3s~7aacXOEzNIPThATiN zi#BNp*gw9DY&ngvv6m;`@?(JThRi(6-%*rKk3HRB3^l*Wht9Xk24H=aNR)E+Z=o{( z;#+#;O<%K55u`qNrYltan*b2?o9)B!-k%+gud;$Q1@&Lh4*-ByEwV;9N?QMEa;fs>GRu)GA^2w#db{Nt<+RBd2IEEyC{xT`_F zD_-Q0>X=^Kl3VgG9#7H(S2%iK9=wZF zDqhks{qAw9#%=>!?|DJ$iGoVLJ+X+Ms-cj84AP#k-8*BaPFdG_^Bt}IArSW^8o@Ve zA1gO@->3|qzmj^8S;b*u~Wwh|EAS6r=L!`&yZD5sDIGUhIDN^ zXFuW=ICs|!=i*G>pCnl%4nn1}i;nP^a2ed*T~{Z!G8y*+|DClZq;#5;ZKZvuR}m7H z6Oc`i-?TGpRY$Ay2DYS?n_pJ@lZyg*jh?0#JFuq4S$5zbe{eSAbDxf(xQBf)$+caY zO-puUt%4h%hx_ZM7v>_vQ}g4+v%P(#ibbeR-}4MLkdbH6UkY-l=a89wI95j zyV1liFT(sgzGT13qz|9bSj~;=`r-OS!PbVJgEbZ1RGliF6e?9mb zv=SwVndcpTGbk|1L>Oq}jg+KViYht#jd5~+w5@`$KGq-Av)=ruL29+;8N@S2fE^|0 z{$#a4KX|KjYcCveMrM2|0pSiA6wH;k6k=zNvecv*e!Ac5PrvHA)yQH1QV%`gs$$v# zw)p^2aX$ZIf}erRQ4UL<=|_WCqZJt;Kf8Ac*)4&3p1tCV|MR z03JDz#bE+@9A&|bKrEjpWA1(m)X5MJsZtn&#@RMjp)c65`DV`F=yFSXqj4K3-(_E( z&XarjcSb2b6k;e?Q?DV}Z?r`u)mYRQU})7go~r}+yxX2*D=~-`1df8eV8TwVv28yF zYfL*7ZKe(JM9A)J3n;zqCOQLjg4oh4GhAGCjPAe2F1{7I(hn7h6! ze8bR8*x$MrERW<;-cL5W8tDVf78BttCOVO2P(^^!oo=u!%0x9mVs^AWp%?u#JRbJ{%G*F`QjX*EkW ztf>8hl?32=n<}JmB^|D6ti{B%G@l3~|D0Aq+60MFg3$e6>rJR5Bzq~kv<2ye+g3Rl zaNh5)D{i_VPoroZI_wO7`a75J8X%z%_6i%?{4fKgA$CS*t~dS6x>g#yfbRF}fz_Wv z+(+lb_WPR^qaf99yZGq0(wlS(eGwGo2l)ez2}OY(&jdK%ZE$lN2t~-z&c9dz)Co9zDq3s6xAjbUsEK8BnAFG(cTe8H-}DL3(b{M}O+MY)Z7VYUk^ZWPLEl+Y9WQ z4`5JZW|5*;j<8;6gUVz*XuXRPNF}U66{e`FD=mSZ5GsKYkUHMwz|OItIZfB9 z%`%DU8b44KcUolzB9ysFGE9WGRb)+lGLDhCj5QMIHS{7pY$QOhBFxiEXpBmYk!98t zq1FP%LX7fsv4TF|wwNtIXlr4K2P;oaLo?G+cp>k1VDn6+m+#d>e$(mpVubu>*mf$*gs6|xC z%+rOoYvtDnh}vyDG>hN*0mMzb_&VT%yXpB@dNJA8_B&zI)bnA`tg=r3X;oIwkq(-l z2hujqYy~3+0_l(t#yTz{lh9M~J!Xc=T2%3(2n^LnA&uYy#R^JI$4UoU{w1V9R3ItJ z$gscJ7m+K>aa3d!iD-l$LA}#a5r?GsqNZ@b%6S#gf`3HQEl6Y#<{4{0qUZa;;=W(j z-IW8S0(Hw`MT6M|SchkkkQgN^okAAt<4H`WtdG8_Ap47580JD{^{We!bXu(|#vzp% zwI=*k{&w!3sCy4VlMIUSqzC5hTT^cW+BMoryI|%X2U4I(U!+02j^a-cDy2FSL{SnL znAT2SipCT{YmxayU*c}PzVYZNUG^%2!eJyWbqcTScApF&xc%p2Mf>soA9bT;bCk3TkoW}(YoT?k4J6Ofgl(dEUDY&JV%pjcqrXz|yPmzK5oFEgNdPq!xCE18d> zbcr3Cf#m)L{5~LGUL}(lrS8Or`W!wlCO%c}>BGPDkH%w)13JJh*bRH@N1Q8T@d%G&lpCAcfJ z51mTB98{t^Dh8o7HNQ|5@wi9e>&qzhS$w6`^pGt`CbO&3LW$NR2# zS_ArEd`1S3DicJSo7emIM1=%g+&u(DYrfwFrK;HIm`SL$#1_@@|z2nT?=_!Z>J?Wp;Q!n!5o#B)?mW8aiUpfNM!6M)qC-XBTe z3y^m7if8nXra-Hu7d?)i9OAib?)d1AQPsRu7g-FNLDE9CC@vpXgo!NC3&$cTo*vAf zHSlG0Jzh6*(EOdsVN7^>RlcFu+hRx{KvcrRkGu4I#eUJeU<`F*P2}q6X0Z~5o&6z$ z5ksMQ!jo8PM`g9|G4%6S@7Dy=Cg?*Co>;V5AP(p+>k7u^o+WTbHbRaDgY zLu9(422Ga7Rj z&g=EVWQpZh%zOBZ;P`g8O-)_TprVr+hrSF-&xxV1p!}N^Ko>Tupilezd-lishywwtOiG{JZL|D)~A z3{f_DJE{#QhLA!+YmLs{o&TWS&Enj5pcNU}QKHL3Fjz=!3b~ z+M^NX#QWeFzDKM0c$E9TkoaN2OifKA$@gVMGEkaMzy?WKIICd8pZ-=#3rq$b_ULE# zFJ-S40bPI;MXNC$R?BXJ??ZuWL`6VC?0qtms3=m8zP#C-9wyL@DC>$QIR(5hKHINfQ^Mh1~B#9}ABl#W1EzDF%?*qJp+ZESlN{mQAKZ`QU zveX!=LWYtX%Q09rwsV7Ep?;5;FwJAVQ42JbKs8~T_LQ1Dk*tPfTu0n4fSp3HsDo=D z<kK;xD5i^ya?4XUA3UVeaZQpQy_)op=CLOJ4nK->)6KL2bTYTS=~vPd{|m z(je&U2~V^r_nz<&eA7b+?Qu637Q{6Qqd2^;Cdv5856DYfjs~f=r}s-Hq-sGWvdgEW z>g(%zZHWu@M4tv>P#~2^TpE{DK>n?cf#2u(o&*6xAvNaWcD|#}&An~5h7a*S^V}~H z3X4Hng#G#@h`b~hzFIC_3b}BbaNDGTd61qL2{ z`=C0&LcaidKCMT;QnIQ9Rx73b`$WgUXGF%W;fHr4LI9)1;gh3Y6eOC9a`Js{jg6`- zGesFKNxLK6m;b(37*((=WlMhyh*8AsaUi*YaTPqsn^UFz5Cfry)v6scjcRl2ygoBc z1{CikD$N6@b#P@O-MBEKs_bRc21OnC`rQ7?_AUk^gcxbM2&LzPq@z?1PK-M3^qnTps~FUF_-KGO$mBbT!F5 zkLMPIqpR!k?Ob2%c=8!q^r-!l)+e!p>Ossr1E9Bt!n3lU3XULo8BPFEHhbH;;%ek^3ZZH5Jj0-&=CP-@0BUo#2DR_5k z^8x+YwIa;h_H_y$PTUGP-!+YPSS+jw^rzr8U6(-bd$N(!*kY_+(Usq0ux_KcEcDF^@?0ohE>EZbdhR~*=DRvHj$^_8-Y3A?8wCEMmmsSoK$8ZtU8lZ3NW3bE34?LMz%!71kLe3( zA-#A&P6yeBw9Y}VCjDdRl~S_l#F7|8(gB2SXGZ9keo7sK0C%C1+9i`zjFl3^Gl*o? zmJrFxAg{rxf)+pgcP=)?xu7VA6gHEPK^;aM{ zCvP#Wpo_{EaLh(*24PEc-(450UC@0g5l@TSc|yMclr8Y!2DZE_ta6}dcVM7bwIltY zIGoJUp<4iY2)Dv!I``ZV$5?*U0=EZHSJOQvZc_ZH-?`_4nP_}zo>h~6*I0B}(CQ>1 z3N=&6F4pmzfX;_AIGc!Yb5I+Gg+Z5*eTnc9EJs?5{IxaWLm~L2_3-k2D|m3U{h|xI_lwmqg{<`RBw-hK(SuT=uz}8*vCw4Z6j2i&_;_*(pFIN z=}jK@{H2WvM7m4mNw9`ZU_%)AEU-jf@aq9k4Pirp_8cZvPzh0~fAeT+n+*di5EwbK zMo}X8Et6z!8lGSxosx0~cU?pu3>1Zm0p4Ku5A2rAsSBz|T6_ccU4b&%U%X3GwYijf zL+W!SD`>)~QZDzGH^yuP1wHH}fw|CGB#At~?fNKy?t_nep42-WM{9ezDaOzYyH}nH z>B{x3%uW0epvYs!OFSb6BdTc6#En%X)cuGDTgoRpjNTt$dEO-rtnlKoW;R_VzF+aB zBfv}sf-YbgK>Iyz;Tb~;PpFMx;{lOY1=b9-z_;q~F+K8msj}TjbY_Zr_b7VBuzw$# z80^1MLOLWWa#)BGVmmZm+-n9NiPwbHgqN{*~eAZAWYO(fv1W zH_!}HLU`H*Mq%|njzp*>wJvv5bs&?0ihaWDoFNcMUcv9uZBb&dZiW5`L=38-TcD|M zoQm^HBR{8AuyGq!(YH`_vTE3)uuf8H0s-$iY!TU^_C5I#?T1aSLOk`yDO5OYS@v0Z+FvuTwHE8F>fwd8 zQDMmQ?ToQWZJqPMLZeVY_gj)+^%ozSPkatLZ@gInqB0LL0frHU1h~Cl8ggSOEVjFt zr0J}(58Vo~ZB(*8$QTMlnBDHP;)>Aq zrk1)I6PlvCmR38{yDMyAQ9Z1H{U}MPg_xi&O@{3UaYM$zop1=Q&h@^fj7R26^rB!L z#6&U6A(wZFPQ%oUJ*-h4e_2vm8M{9!cJ8$%{V7VOyc>?L%E`|$+_iWvJ5HKED^0^Y zZz-$5RPZ`%t5|IMhN`fFZp5>n3`vh7k|B)k^1 z>m)NOm6n|zb%1()Uw#K_F5QwWK^g8R@9?J!Zn>y=GnbZVOh6l(fSbOCw{UGR!VO3X zWDzuJ$4sP(iT4L^TL?BQKdgkln08f|2I$n-&jm@Gh?F&SrUw};>}=_KdwVQwYHGtw zIPxS0bFvQ$U!B^tW=yqvA2STlK@iuR4_1OMMtyrL(YbJ+4oJfIh1dx}wT-K4ddHBC z0hIap+H`UR4P6lS9#OKj*^MN!X#jR4Q&LttB_-1xWXfXgTm#XK;kUvWXwb$a0g|#; zN`D5u7;*zMEWGsfa!!Rsdp^Mj`A~^!C+c^Q7h|SPM!ye?m=ZY1e%&~d_Q94_$eO~- zR|ekdhCQF)tBDXU?O0B~+xzv)PZf-ff?;{-cWW!Q!Er=Tc`QAMZM>P|e$2esnS8c+ z0VY6CBwCAMn=r=sQdAA?>FzGZ$E@MRpIQubIIasKzP1$fpa@7#pdf{`(C^u$bP!c2 z1qy`-|d60FxD`q3IbrFEDyQF)^3LAnk+OO z8f}hjVh$+3f+E&Es>1=KoFGuJx#L%zlnA*MPrWMW#l&eZz>VY(3}GJt)fhs@+=y$2 z$kV&*$7H2J^@-C#>48K{55!I|XcnZ6P0cM^1Q}HTz zi5s|efc7<*1mRBUO5A(iic%V}F?zEQcFiH?62HYF9UxqynB#yMxk1to87l0>qnB+H z3^bOTJJ{Gv$FTA*%4jRD>2QmEMxxnN$`^f)1eS-h>5Xcw zUY5A3>D)iLh!#N2F0t+AxyYx$#I$#(BtbI* zH))`WLA<9@!a7iYVFL+e64=~9GiN$eoj9`BKKT)DM@Wbn-pa$^G1R?S3)fx6?xzi> zWP_H&*d&O9u-U1!YJ2_5`DINy*P$oDod@BpG&s2nCDO@6qTuc(!K4t!4R)PTBVG#` zGs@^E?w3FV080gG;KauqEN-2ETR`YE4J<9gC{$n(%821r9Xi{_MJwRmI_?$`GQ}+@ zo7Dyl$wBvt+I9cR`9=x{`fg^>cPo%ef{iC8f2A}*Ax?cY(M(IR*;R-waMDBy2U&0& z{KyOM4!a_t*!KOPOBYl)Ji{Cz5GCY_KBMME#6|+9bOZvpyobk2DHw5W)J6&DF4? z^qCEEt>(~lB*~WB2#;Ak82)fSy}9uEdrC`D3fER4dsE1aaK%*mE6I39z!cMCLKR94 zJCDE*iphA<(H4qG+*Q+g2zLH7Rg+&^l)`DEb`f&}P=l*{~jok*WJoDX#{oAwk(>SWtUFu{a#G2i!jg`ZTxwa$;8t*eUi> z$hwhza9q9obL%A7jb1>Rh=U4goP|UE0zV9`-XS zFxXn?XGjYmnJIz0F+kA3_GTQ&7KM66ch*0JIu_I!k}E^vkGmPEh%lo|^v|o^R?g_8 z!1K3QbH{F2P{!?QFfz-8<>zBtk@OGH?7E=ng*}iZS$A+JORdMCX|;-+t^725(??(9 z6A#?7nKz{)=iN<6zRq)IPc8QSB-3&0>#KIxsOgV9x)+BoI&%A{MvL*=sYx!@i#=Y{ zikmB?n@^Xw?H_1wuRUd9)z(urm@-t`*I3(LnBfvyz+SEE=wLlqS=$?`r^iYds2(!U zQY-T@YctFeE0g0C%o9ryeO_MTn>Zx_fs*4Ed zb_Yp`>B=Ydb$4ZmsyB4&J!;vf*6Yu1)fsFlpR>rE%^B)0tZ8y-nzz57WB0SCO3dZE zc%MtVzfwanGpli-U}-BSJIP0$wR}Sg%f7oZ@BOF#n%3%?JR4w5+77Dz#qQ0sNo{Hh zZPL?8c3`$yr?Ce4h6cN8_WPG`-oM?J@{N-&=roX**A;56r)&SSXV6u!WY9)YP|mR@ zTdnP~tGweYrv&*b!G@ln+08!fn{W4W`j(UqnU)P6;dIJ>eVnAb#-LRC&t_DIZ>Qd?k}*~hOcr6m{{ZlwZ6s> zR`+?Q17%*t@~!4#=E)9Ltr_oqJ~fpm_dML$6(xG7tD?OtV~E$ml9Q3wmC^Oy#V1PP zP7lxi8bOu}i_w-g$YZYe*~y9F&{3&%<<5~N!G>u0{Ft+Bm1Nl(wwru9YW{&|s{!bDDYOA4n)3NVy5PMoT8R=+=+9mFHh!fC6nnjn9} zV&fq`SUx3*DT8hDoF4zO!P3MOCw8hJ=Tl-zVjNGKkAwYyh2T&Bq4s_sz2qdufJJW> zvs`yx9;c!qw`xG&+mjtzlN;RX(3xn>Y)z}k?M-^yeY*c=gS&{oqpkE{YCk*KsjI!K zcw4#C&ukI4e|ZUu(fR##u|bxYo(^lUH*{WBL}Zz+gLOxT!Tv~rLk?YeE(TsaWy$fY zos|2<*^M>lFSn+o$bJ)GCD^tlu)ZF@we9?)@PUC`fxSyp{o8#%wfgI{RAp6Vx9WJL zfrV)<&8%rn8Jty++Ltw4oo|hZNGa6&oXXh`h}cp8OOcffi5m5A;;2zh zt4947MRqMxWbYjOWLf-iPHFH8&a2ABp$8V0IWIQep>*Se#;Vl$H|k=}Z`yug+Ke@$ zuEp+uy2|bSz?P8q3GO;kcb#qxEn`bAs|>hm(r&y+?$oJWHdVeZeemT7%>FQZeYmTI1oXgl-zHtSiUb?W<8xi|Fe(Qr-KFgVz{D_^NASyxDT z?U+l)W&aZMek>z-eS@wLW3S+x<53ru*eH2yn`R%@aw8$k%`jqD`r5bNJ7t!*=G44A zE*&wwVp&T|j`Vu5N=?62KAu54qMn@XE^vts^Dk`gnUNq9QWlv$&*HY%CJUbvMjgtx zZ*F7Q+cQ#Dh15%)cXV2Jf0<+LKEX5f9qS^lCA>7b>6~fEmrz{yW#Y8M8)WYVe;Lc) zt?p5xnrcwnR@mjS{_oTe4ObTgw&v>VxU&NvFVhpY$yk*p{)&0(xZFG?$64F7+811& zpDZDAYIIvp$=vr$p_jgDsk3&6y05xwack>LmW+^S+UIkj{hJ%!YR{02P467ETDkh` zd;2{%YSVP0)4jEB58lf38DHMx7VeW?UV=Bs)DM&Zp!2k^=v4p9{AZpOQFQr#|bx-`@9j<5pi1_{uYRWTeLOje*KE-rSIj)xECs@L3TIq>e0ArS zRfa>cT94PSntb=I67z!R(rY^tp2)6h+^z^G4ZX=$ysbRX`m)k%#mns3ukJqyzPi|b zbt8|99k2Q*n}7t@Tgvl}U$0hC9L<^&b9%`l_oc>vZ+)Yk@w#RFDUlGqN%u~xf7t#| z5wA28($7(vzvSNTN8^RZe7PTHCj9XS#(F(+tB6tEKjM;PDaP0 zthX#*9iAdtwJc0;j84%UZT6kY9P9ae?gg}8sBe}oP6(gv74fNe$KHoOBT5=tdW;`z zE%c34R7wxhOfPH8+jK8#y3Vpv;?S#*=2EAPiwc?AkCieC+rDqo zw36n@iOP?)$hz+ADQS>;X>3eJ#mVh1#hY`YU#;J`i~q@~=~ap@`(Ex_;IibV{Z73n=MCV zLdvJ`n`Le_seV0ij;-9OJsa|i46&DmzbqNa9 z-jm&s<11lwTV}g=zOqf~xv|zc#~Xu`nyTR|_9kqU2nf{&w=g7`y8kKT0R})QnD@73-0iYx=l;-DT$W zjFUzZZ)a^VDm`&+m)D7tCsab``#tmMw)R=R;nw3xo$+ohkzd2b#l+fy+3uW zy()X)Rp9iu%O~F|(2F|ETYZ)Hf}yzI&I>Z?7iOqR-_!lKq35EJ4@n3}h32(;^+)e-OL-LFzJCc@dJ0iACUo%GDFM$7I5`W>&n{eY9 zs(qQ&%VtyWr@oB7&&X?Aq|?$(TN6SZEHA4qnC<(_QYGmbQ*F(h*BOq{;dY)y8Me*& z;xV6osA{guO6-a157^ z4>>GqzT1*V%c>unuarhG@$6_f^&w9a@z+`^iqP z7e_B{94vZoE6u}p36UtT?EdTYIIry$+TW)CscH03?zOmSwDC2UbtY~h#q;9}=V@(a zr&;eU4gO?z=k>nrC5rVEl4rTe|J<9`vVmXb51(aiVPC9wn)lbKExZ_~GP4@F zFSN?fJGF45SZ>3&52E*bcZn=Py!$5OeiWJJbvn?bXVW#W4qE|lSo$PmBs_TN|O~>>zYp~ z@<&`Nx#tqE<}g^AGSrcqYT%T@Y43Xbwk}TUla!d5U#XKL=jYqYSxyXQM+&E)G=-JS z=%dA4N-yJkT(rz^+lYb1xxGfz5kBIO-=dP8mcJBQ+;`#W1c>2bO{Qdmws zomM7obv%OdGDDW@k{I0$gK?a0uPh$DvccYCxr159o!DheLC*MQc?VlgO-0jNSJ(3B zGg1aW6LKe^_I3bA7{25jb{uE+N8SHbL?MoQVV|i z`^zTxcfcc+r8u!T4^FK%L?;74{W4_DW%rA+_>8WUCbFz8M%LaNY+S)2| zC93WY9-A`QQ&S<|Dlh01R~30`&_plM*wQ?wc&H-7C&`18vZbU=&-+=OT6(3^84sJ( zgT1a|S&lC`ZKdUMazhmrRh+?}Z>!XrTUquUeW#1`k{zuR+BjWKasySCoC+~{9pRYz zzunE9dTP3dn)+kKy?>hL=XQw=3{@QKckXubcj!B%Q)wF2I>Z?0buF`(b+EGQI;wrJ z?*-ebzbL3b_#i{C9ytL z=EXzN=l1k1aVSf*3kxo`acxcJw0wFi?-wH)blk~wF|e;`Ejy=gU9{sPI_CM z_z*GQMmBI-&C^unwL>3MQdKfuuBpn~^P!{rynUZhY{O0YjGE4juH~Qor8pM4O+`FI zw$2gq<>l;GO~J1O?Y?L1`F>`qFY_>??T)3v?PIPoAG)_yA5!2`&)KT|->CZnQ|kj2 zDMm{RHmK)}-HcHCW8X{0s$W$)$4g!8sji$Bv+GXhrrq#)+Mm+wO?!{telTvm*O#q# zqEnv-RUZ`DVYd*0_xf=6g)5$K-+j(k#c;`vqFp-wecSzY2N}B}tOJ53oO2VHxZ}gC z_z3~LF5`qh#$S*O2C+`+-o@BZD;f-ZR4#pZc6|#@sUie}0 z=4rqLSCkc)d=5zN0EMrVcFc8Tb?%YocLOxM-L5<9wr1`VcC*vy*Ngb0$8Hqow${8U ze`RQDbbZr1)uJu5<4v0RdX8}W$(gs`z4a&jc+D)%_&;6&Sa_8)AllcB_7vI^FzpHg z=O?Z@H3ot6;}K!chpcmX!a85_a%jr#xD5cM+2*!x4|} zjd=8Mf=5r;78zbvHcojYDOr98v-K7kl04b4VMIFslL5qjmb|Bj*fd*{S0-c2_BqzsK7;14cK)dI!+k5&OJa1}XJZTmj!+ z+5Pdm;1w@63Qf2ixVzQ4LSU81NuDddqP%evc;34l=HBEFxXBt}n4y=< zXCrChN6vGp=SM2E6os;7*EI2JKMe|Demg}T%LblTSXgYKo79Z7l~)QkUI|Asvx8>> z&lR`t0%0q50P{ZRrL66;moOc{Kwjq~PgjE2`*(>GRCtwHG#35j@Fd_hun^c}AuzuU z^Q!OQxWM#~g}{D>fa_nlYGBw?tnyz^Jc2qe)Jzrvb3aVXq-~;L6Ys3jwzSo(DI`aDSl5UlB@}a6;#(l?Pn-i(&td*Pr#CzuyC~ z^WYii1>yT26aSw#=qfmT$?EC<(AXC@94D;w!K1%VzRHKwJk(rz!P1+wCyJT_+WrsW z1gQMi?Bf;SwZNFj0`FPHAPfBWYkq$n)`kC=B(JeL-c+8G3fiUgn8cUJ$^(lG}fj6Fn--(gMIdM)nd1L0V;;( z$&xF6S?qg*v@Ne?DHs3inq^nP{|~#R|F=~5M{Xf4|9XeT4XU{K(<7Xj&wNjPU2GY< zUB*jh_UO6XwJ-HwYoBj;lK)})c*TFL{n3@V22cHeq8rgvQa;V&`O7z%|A#gI{No?q zvR>fmN^}eVS1#aHp714FF}cxWtk~o~-n@8Y@oD##t*`$ok$pdIfzmueq8EI=Zu^gk ziO+Z6y=!n)(sokTHIddmJEQNtojAb*&r~*E<~i@wY&aeE=WM?@`GJ@B@|h~R6&UJO zz>&F{2G3c}F+Xn^o{#^zDtjxl!l=!Nc`dEv4PXL7<{o35<(mwro4%Y1$6t2Nhoh$J z*9F1(q>U1u^VaaeH$LNo11JrpWmIFbEw=+PC-3wsvF{sXgo?gzgySc(8MfZWf$UoV zDGKR7p!>=Z&%$(uLk|PTBcNy&o_VOr7sYbsX@dut)dmkBR%sM+!%PuaDj|;gjL};v z0ZOD&2}HZc?{eX}uSV}NZQj28=qlG8UBYly&MH8{Us%BY8}RG1+K*ML93|AAXuiV9}Sqsm{tg+!wDi$ zZxVHQ-yMJRa$HW75uT3;2i;z`N`u2SfrNZmA9$|HV-m*|4}Uh*7CsY==F8Uy?){ff z7wjf|{KdWRb^FD=cf9vqY;)o;_kPRaU)=k{Yi3Pf`pj#Xd%ucs@5w>1yaFf2yc@^) zb-QcS?SL1eJm$mBk9S8Mku(j|G=lRW-Ln6_R}g*iOi1|DkB7E@?A#5ExsRP;wr51{ z>{OeT^`7;?yhXPLKvpaJc>~1fMTyJKmYrvG&kv5athn3uW0&(i#EC?SX))kr?|X0- z{VElt9IGH<366t|_Gnd^m<6bJq;CeC7<)|wPNf%@s*aJsak~~(t+GA)(3R}YTL@hf z7jI<&Qw_LAN4y6)scNe5byH6*2ad?3KYdK$%=Nar|S7nNM=c&DHnUhofH`de7Wi1;^T7uv&C6cZ-GC=zASMv?^8j6X(}?K9Ht4#0%;a z_=DjbUN|^=F-?TOXt{dAQXsp-aq3<#*adYr^mhS6?A`&tZ`kG|NiU9mj*mm`Vi3BD;Ba4E`f7wNW zpF2ze{5<1t0cq{s9YVI9381sP2 z_v-b>RT(#Ivo6}J@w|V*_c`l@LE8N9o3h~8@mp#X;__BU{EW^9Jd4=vnHo@^B_Ho&%faKPB5AFfM?nSNFH@-}%$OOf|D*`KZ(D zrM<~@qXFFwv;~XWV8a)QGZ{#6Tt4aadS`EBR9`sTJ%lH=Uv{Fn?#=GG{ch*O2-tl^ z{g{dMqFVr^3IGCeL*(YRs!V@(0zu7f52hGCKu~klCW?rTrz}q}A*1H|W&D9Jk6}78 z$IpRvgQR9SX}U^bUb}+qY==o#ANtJ!G|tqnb?eLT0)@`*5B|=KoRW#tb-+$~26?|I zW&umpCs3hE?%ww;Ns^3h)`z7{fNOhsV)poVU$ifI$5zYU1lT4lfrZ&M-z^9;Tezsd zY5pefC)DVSQld|c*1xv;!Zo{PeY{7NWL09|6zb`GH_99C2Pk=+|DxpsFVYZ@!~u9A zZ}8O*4&sZh+ex(@+Vi2_^1%k2NV59|q1;z)QNWc3LO@)unx%g58&I<3+?<_-zjaWWe3n)4ZaJ;7_k-Ao%{mKyH~HTbXw^L9V%tI|s1o&v2CZ$IUtu z6)1w=>tG8p<-QVM&=Qe%!bD=8a+8p==GRvV@(=}c!C zqJ3mPN#Z4zo zw0j8fxZ#ajh!Bjq{)nx{@_#m(5y9aT{`Notx&fG_v zjml%T@PwD-9lqp^zn+Kd#tlec-}CT%?moBkhY6^=uW`&bV+?G;;pu?e<0TAh%LhA& zDIU?;q+^QVDv_eilTh~92nU-HHsxn1j#VizEOwxa0D` z7sh2%lY#>9H0F;oZYq3HZEq!H0^{cCMW4YFrnHe>;7BAea!=vh8f$G87zt>bKwbo@!PJ7Sp6P>1)gU-%SV z_&C<;@9~oGKc=7dfR%WGK?4=h*|_P>bJp>J{~MghVP5++5smw^IUYu z*-~MDto{dtEV=h@3h!6z1l{)?-E`J4+-U6na49BpNzu=w{aKU!J^>lDvj?UN;SYfI z^uROxW3w-m0ObJ>n=e~i0n>dUSmLlYE1*?;7>ft-KX@%NAyvTvVmQ+xwva@q!In`)>%1z zQa!vp4M2c*qsT{gKt2MLDS&?b`Ng(*O9G>QdknCM@c{Z{ec31B5&%6)DtutNZjmaS z5f6#IgE9h}?9+y?+zdD;Z+J4GIrWkA3qIw-EU2zE@5kyRfG$2riD--@L;OoiB^BJsbn61!m zco<8IC;od_o)JM#07bm+%FF0zO<{6=d@A-SN3!*HprPJ`5NC_;OOi;@7-XTtkLr;^ zjW`X!ejxLJ>G}c)$hZdDb(v1_Vn?1BRWW^o@5-2ylj*CGFNJ53Qv_N70|nnT+(K9h zK*Pnvh&d0uM`2K3T3E(C_(BP(A`&VQT1WWpio*Xnos+$qDagT;28k+=G*{? zx~yuZGe!0$&;vq*r{IDJeWLL-_SDxAI0FEV$>Hr~q61UCW51Yv+1Cwxo(S^dgkA?w z&=HjBuJX||WdvRt;5HPYQ`Ye5BL_H92G6*Mq@Yk0csX3=d44q^=K;K0Njq+0lo}k- zKIS0L61#3)q&O3xcpqXfB!Dsiz$8eafwuAsen3EChYLY2?59^7l-_m;M5U>8MeDXC`GTb^qm!KZf%0K zcfS;2vv!v!yfi`X)m#mdlC4H|G4R$uXn7CQ^X$ z#QsbSEpX(2o`WTU*r8*f=&9F=@NU4*C<~3wb%^?mYaHNLG_!O4SOSe|JJ5c!5fFTt zQk03!&T5%x7=thayGJyY^&s*pN)g@#)v}(#&8GYNaqNUDk6o6~g5rYWH**0vBi{hC zAH@Zs_eWFwX2@j;B9-8+U=3AKi8NFwa*`L`&brAG%GmO~Klzks{# z0;vF!E-&ShU-m}cA8k)P&PpJ*5u!XFB7O+Jgjf$*%dd9Wxp8PU)MSlyhqiX9op_d6CpIuU$%v$M>sw%!)npjXyJ0PwgWOS zSD^(bOxhbK?x^$Ol0a7iN+PEYoFO7+ACCZS6MUaN%{wO)C~8pA98VQ!Q#i5MP#Qez z33N7%7$8RwWb2Wy0L_wBMY{KjW@7Ak8<1kak=Q+yF-JUGqV1|e6(CX=fdLbXYnyt- z8F)m*i_nZO06hWzi=uw#BlSDQwQ86V6_$pW2XZM?-^6dzAWX9GFGDc~@8A4mYyFQT zK-*CKwi8*!c{9KIk+Cj-;f6ZqotN#-eEkt`NRhSVpcaN_Dbqv$!5tVbSF78Nu+Sl` z9)_MQ;GluvV2Sj>rlpPCPDfG!uK@oqAmId%I8P6Z?kSSDCsYe%Z zAR*on;N}iQh;e6Oqy-Vo976@M#s}PoGXg9lFwl+k)?~_o-JCoQfH^rxUjcYj9f&Wq zOQWLQKM1?OJ6?os;aVACTqNH?Y&D|5J&>Kn4RKtaGYm)N$^Dqqz?mp35uaz+v0FM( zcDA1s7Yu5s(hfy=rZYu*jx|$2)X=<3@r>;;w?jRV7!*--X1Dgrf2ixNy{m{y66 zF9(YD`SO|7RS^OLfQwqmX@Y@qFVfzGNv& z_H6e$AUod%ogJV?z*r6dMkJ#Q1lTz6e?rirr%h){D&F$_~PbM_#k6D&?0^NrtdOc;|#^Paxoc z)sj2%WnWE*DZU&=h|%GLvNz|2K=>e`oRk>7V4U!Jz@4U1k0!jWOz+qRl5Wk1vurW` zK^uVza&)Rpmbjle`2=L<^$|8)M5GzXV&M5lwb(TQ)M_a)UW!TnO@)TGyCvzf_>G`s zg^2)!>o2pZK}GEq6rSkoi}HgQb5H~UPc!0ci%_5DFL<0GbA=A%IMNz4>>E-5sL8=s z;M;FT0u(hY3>cgjmAd4Hh%sCN=0IEtg;5UFT+j5xsVA^G?z{V81RQ>MAg*yi-j=py z38uFs(%91Q2Vw{+#3dyeKLway!t%;MnFgAy_bu%#w>l^fFg;jdW6OoWbHfrm{nfRH zAs1YI5@EA6(VC(->Mnzk<~4YQ;wm_2$kh;lMujuXdVHbCB`$b)V2}XnM>;;40xzHVJ(xa31>*T?ESH{`MYarYoO5TdqKebRo|@51Q7_{ zd0!_SH)?FNnS^*?eIt+?5~GG6OIu^4a&7j)(HJRwjau!j3W4g(+`S_v@vB457aEA& zrJJzSy%m%A$PB-@b|yc)5>4F7xhYjy75DA`hk%tCNBi1;!8^8Ez{3D56?k_dKHbXUt=wL0P-Y~l~)|XczxNiUe@&y?R=x^YN8r>&MWdJ>{)HKa)O@gEr^5m)% z3(&+z@M2s41o(&8FzK97Q*quQKV{=<{0|zw1*n)HiV`fE?0$qZeyM}dRSJ)@`;a@S zGktxy$g~w!E=cxF0j@2vHgPHs)m?5ds$(_P==!@mBrMI04}R!QY^?s zp>#St_runvk!AMwc{+g#geZ&hv8@5{sgE|B_kZ!~CYBUa6{z0eWk^9K2lc=7 z*nOGK6f%@}=L7Df6rZ9*8}QyNXM(nrstQZT^5r+=H$_T^b5y{lxMh(rldC+mPx@tV z{X*X(;{4{+)t)RM1W&K@5}39kQX1hx;1=TPC@WGV-s?##kXy+rnD&q+SJL7x*pxj0 zpV77dqhcUFp=;`z&JYUgX(v{yLWAl$*%yE(jJLWP+xAGcScNLGy)&^(#dW6KN>h%+ zpT}3-rg9hET7Mmp!mablg9l3u~^I^7Ddrv zbpjtB8ha&O`7bIeWcQk`u!z^*`vuW^m*{5iFvxmuh21GrOU7q+cD3 zse@}w_GP1NlDfjAQO}{qw05pMgze$1gw9tqGNo#1^6t?enp&X9(4c!Ndyp{Qqi6X= zL!}N@CpQ&B$4XaHr7*F&a46oF&~_H_UrDFMlu6bNXE)N>6Lx`+tg5>kX5qw!IHD4f z3)iFS2wwl;51LFI(ogAO;A)PGJtPqX1#}!08d?n|bd65@A&EiU<5OeEF$n=XYAGhh zpdq_Gd~vx_w|({$NI?^~Z(L6!-iuyo0$KNu2yY;9wu9XF*z|*DF$KtOy1AwHQY)0D z2i$=GIso)<&|n<}4de}H8OMkL-)Hv`5e2UsUY2Fva3eP&5TD@g!wfY@JjROF?MG+znNP_Pk zE3onNwB&a$su@)dSA&%R=sCsyI6%fj9VzIoxD-gom@~k(iw~__5P(kx@T2 z28yiq+3pfoS=}tqj~!p_Hz`UGoPqi>rkv21 z>vyB*zLY=18VeY%Bhb(RAZdfQVncb>XaorxAk%~Ut3d#4hAAgtSy0@FR1re7XFAy= zfM3&SD8*54s)qk63#Ct|oLs2_x@4&9GDl5m=s2OP1S#7)`E|uA>B;Z5N3_|$KoUI= zg)_jv2+V?5c$JGLO}wb6eQMeuyIocV^$OJYrgfO&YJ(_I1ake+dQHr%Vu6+lAFAcj z)fmN&7KTa`4ekxae-8lU_l}J^h(TWmDXtB&t||ZHsAovMTuLp~Dm*f-Xuk88LS}<^HPcrp zQr7%+?bIyoLa#rW5`Lv~X?QO7fKf$(Mgwr*K}Iq4{~@p$^!i<`ksL=%TTh$SZVsT5 zFgU@9e0!KOWXO>5k=g)_Ya}6>vQ@(>Cjal_lSc}N7d}Wk$MOM%^m8r3G?KV-WHy93 z5iDxhy+Vzf5Lg3P7N+WuJ7XuuF-0Gj00yOrh7!bc-J^9=oQ(7e223$Hd`vM$)Btz2 zN#;qGq<6IggwMC^czXK^Ba(@E?&WxEmxU-5P5efRcskqqUl zSbLa6=Ta!gC`s!Mm%REO(`V{yM`#Qam4&e)cb!il0h1H(E4^8EjypHrzK zsM}N&DWE)bV%vd0vFEpB%|_5l}Ll4P4O>OLZX zCI>lww+wJj^IB9^1%buA!8B-1TvLNy?gx@gk8QF0^rdhM=GfJ5B|S!}`iUViRGHS|oER&yUiV=%YLBjIx^D2)v3yW= zkQxCS1Yv2}A?v^yK^m^C%Pb>38+_DTzM}^mf5(55L5x=LOM3HTVc56V0lJxTwV?s8nx;=PCy?gk?*QaEdb(~ko*t?I_WH+N1|qQ*kcpL zlUiCNPD)uSE>xUA!FqH%Zx|a~irJ-Huy^6?!cB_H)4f|nO1+o=Ma__-u z6aAb7<+oIRjj(n~0D~4YtAKoT9%>UT7XA_9(Vq%Yc6uh6EPu$P{C!Cu3|)gdAC(3J z0R27}fIjSPD5Cm*1JDhe|1Sd2vqr(As^klyRhd$G4~#VKB81cuY?u;68@+cXBj{Nh zw=$t^2$*ypfH+RS$kmmih1p2?@||0HfJV#8TR5sC|NTu1N3XVnilhBx)#RXuoS1 zG@%}ZpITg+Qn~0Bp}M5QC0I7#(EE5T4;53h4xSxb6n|$L!+u7zQ)~?r@f;*%Y#Y=5 zQlDhyjTie^_x9gT5+YSa3sHXZg{W0qC^C!kLoF&;vbNiW6l6Ms^r+h2k7>mS*=xkt zR(g-4N(9Q9L}sBi#Y3sab*NC2ChbP~h6u?$Zs#8yJm^kkDX@*lQy6LhEXYvi`TsXI zvST5QfISE(F~?FK1vYrl>hmw##C!l+dr&_R$%xNY!p|I545@J)U|%G0CApGGzdR=F z=Nxwu_qpObK>15n8nu?#P#H^d{ZFoBhj1{;1L?Yz4U~))t}{T96!L(`j9OBO`GK4Q`z?1)C=5`gw2=o|L2(>5Ormo+b4@~#8& z^jY8|r^et$uw&xT(0-@(mX9*&sglQ?y71%hk{aABY z%FykZO9~*xu3o;BDuV4+KntSg6b#R(mLjTtlvQP?5h;-@st{}*tfV!bZfwP2!q+>_ zp$vw27Gy8i>L}-(h2h)D2DX-nO_M+G63rK_>7>@92q_aSkUfDrV%1($Z4aU_^}e(~ z2F}rqB^g)9^raB?bx=M)Z>C>J;aAN7$u#w_59kV02DZgs)l8Rbcy5cjuOEtvAb^0V z=u`zS)9uza8PXpt=pkb^vFsM8+skeBIVa*~rs|hNPMMiYl|6N~Woq9p9lu>n<$hc4 z5uxf!;Zbvr2K%Q9aWtqSIjDy zuVuVP2XGkUa=h0i!0CQ7)0wZ@SwR_0hd&G?Od{5(``=+pPlWCYLwV|ljuWTT+}M35 zflnut1t)w}cv!WqAO#*6_1QNzAPpN4`J(@IxEAckrz&byJfOA0gk#nrn=f%8NP37 zw{eT`k$@sNA#CB{RMvbQINj@m`BzWzI}8&%(XtDW@plbX0l)_*2D_i9+YmWJUoSP zVTMmO9_YI}M_8q-=>;JBZa<>V>KyY_G7t|8eR!z2U3M4!*70g^#I$a_fTQ6{4Q*}i!&~B^n=HfDKZ+&Tc-hoPv9YV+ z@z(BKXC4AWb8S;ZMm?OprWCe*iZS>5sA;n_eW+-i zs~C}4E}lgj@Wf^Q>scz|HzYFS-*sNx_?z#~Ph`wldeGf2MRCTn zK*Scy6Ao`QgM`IV0Q1J8(FiBsFvG-k;ay*9#wA5JSyu>jcRcDLUiw z_W1*Vf|{TP1{@ZbGE*7XnZ_k?^It2eC}i*ajuS0OZ?>9f418dTW~r<`Xl!2gc9dTDYGQuJl7n7TWjysg*)i-`f46@C#Qj{!3e)&ZZe#65RNs(Z`F3i11c5c)t73$|5o=>AUmwiRsN>>P?$@!HLt< zI5fJ!s+|8LFATw8U2!l935wq%{3inKhS>44h7n7SIH)J#J3Pehz62)~aOhjMif014V6eHzB|t3T zdeVc$d9?|A8J>Nd?1@1PI90cbJ=UkeojbIqzq^gl@Njq`;+ZKQh0jf`ijz&?a^>DC zf;mu2;`(a!)jtlntB^HzKFOPM@my=+u8869!|6az14B6MgIdkc>OPWqiUx7*xvi=< zTYBaWCY$z9`cGByD`x^KmGZ3-rVL%nYz=LL$k$qr>d1%0W7fe~)x5c>8#TOQY9zqb z+t%RgzRd1`vr*rLLgKamR^_#48>7Uqdl6%;W(v;;$HReHBS>Zq#Lzh-pD54Zl#sbj>5VNqY{u z8~2@C&Q8)(LIR%h zzH_fnJuke-!_7DV3)iug;mEQ4LBF4H?DgFzu`3khDwJZbmi1iX!)Sn?albKS;{2Ga ztIu9#DjUvdbPs`3;5D?_WliKdINJQ|ybLg!v)s$NHOAdvdl9y0u2DB_ci@LRhNyi1 z5OcNs+t__|!rDIU4NE==EKC@u8*SsV`s}<&Wm&Pm9Rp+Y7-^E1Ofrk-q{UoZo~3=) z()4JbH)q~w#le`GI#GqEYPA)%syCOn=1X>M>KlmFIiGFQe>eaG2w+bw98LH7II7(h zzf+V@J`0nV;bbHq7y|I-UV`r$4RV_oKZ&)2*{(Z$e0Yt(!M8BNjs4QaN-E8HlGbCx z(~JTbdvx4Jhj*|oYB@>{5Dmblo|szeM(IR<)ivF-WVdN9x~nwjeP2(Up7bpudg+bT z-1+sCTYr3P9+)FUVXrG?Jwq|-)N&%Pu3~BlUgoPv4Qrh401F~Yl~lg|f{4zv*wvFV zSA;9C7c0EO4te}H1pZfBse~}*}jp>Qe>Mp(x$`{Z5ktYKu0AJisLiIdM zTp-BYIa{FbLyn7nT!PMUIGO9>i@`8^&e()!cUjZir6H6#f9wEHf4%&P=<#J8`Q*U! zUmrna=Y1ID;RVOdVhUBFGA3yU<*YxTPlmC%8~126M4-6uVH$K)$bo0agbpOm<^EAi zi^&17Z-(6z1Hu}ZW(Q<}MMZVO;5lH#A-}|BV*$gpY~Go#^y|s&qaSfQgnIN<%OcZA zeu!sbL%!2>s(Kc9Vv48D?PHaR*N1KY~R?}M9=_h;F0<%ctl7@Ca z9)64AS}{iRskrglR;2Ou+^92siusJn%9Z3CUogNDFqX))FDurWlju?kZfSm+o%pG+ zuPS@t6yGzSA=x2`M=ftiHcHWnU+vRb%u3PJv7x(S@KTz)FBj_`6}axvG^zWYRyTT+l>>05-n=C7B3%$jfkykI4tNxs31+@wLRJ4EoS?iDFmUZGIDTBXm0At= zq-4d?*5yl2;mw`*p|VaibN3T9?|#gF^0}$=#1iWtrFN|nJ27xJV)BcXWa+siZzk4> z9!wm&?@BReo4s*xmXB>UhoMEAXct&`szA-Qrf%BFf-n!Du0Q;$VhM(Ud7AZ<;WXDz zic}>tP1Y4C?KbVA4)w+b0(Ij{$0crkK~#Z2Stz{6Rb%LWq+9$&)fO9Uqbj=DK?6-DAhyrg03GznybeL^MWRZ_;Ud>b)nb0*L;6Jzu)cl`MzF%yl$84xz6J}&bgoa z8COqqU`)X=#Dy1&~3&ljb*A%h_3V6_$kOxNI>cbbRVHzjK@a(9RusVFp?C3gt z`=xn=5P3y_!d=SI&>;x%9iZm`2V2c4CH_thfI74y+%1MA2iKNdl`bCXUhoQl$}=?p z)jZqE%7`?Fpe|4!vt~f{JMLj(01{b(dcA9AhitsR`6`E; z!`mHLU(m2r>llQMu=`EHg)#<{9X}@pgbCAug|eVSU{$&)2Nj-Z7KI6^cW?gA;KBo( zk0ONfJ6U(SRJfQuSq3rsWwtPinLXCPy9N@xkLq-v$#_>u`&Z1DCD5=9+L0*0Hp-oJX>-hy?hlS1a`mfo=;nlp-mA>D&_wd9rz_%n)`3c$$7%M&=b#4HQj z6R4Wku!ECGIAKcA##kL@(1Qb@q9z2Tw`+^(3?m+sH|ZyF0A>165QLQ?v!q|fsH~zR z1E7WlZ)K?N3}MGmSQWV23RzGD8?V;o(~u1&>d>uR;KF(Bd-a0*KO^OCkon$1ac6LW zN1E_n2}KC&kihIE$}x6*Ki#eZa|4w{l>TDz-4YzyQdszt#=;-)8W()=1f`(ePtTWp zaGY86cv*X&Ka@ScV@R+iL^yxmRb;Ecg`n6QB`+Rp^aP->b{&E3rJhGCc5cgktnzVn zlB*em4P!m~t>HKfdsz29yUL{kZjNR|h--J%vmDfGiq?9+T}X^9=Vd$uuc>vs4ZA(z z9xq3*eH_D;6knzVzu#_ z$;g@ovK|62^jh*)Mgix?Ov~-NHLwOpF72k5ClL7R`ULG`=%r7FaUtzZ5Xu<9ppp#g zp;DmbE0bH*fJ)d^d>A0P$AJoxArVgK_$cgD9Wb~A41@sAzEt7`s@Xvg9Sv8$xzx=t zhxx0?hK%0=MqPgsSc5>l`nl2;CC?n0x? zTzfF}jcMuEsk$feff9Ok1{Mh6n&2TLW+kO>ztDJ-_yAA2bHsjw77r>+7b>YF+A7>U8)h=RZCfEQB%2QIl<-ODM{fb}`3y_8@TE$%dtaCM5yoQnm( zaiQ5#blx|C{i$fiL&}vH6;8V2|I$!A#m?@Lv1sn2BM`DE?D)KmyaffiM##}FS3Rr4 z3NhH%A-+tXSbUF4nuWZ@`wl3J5(lC4E`~|blU$UgdW-X}e zIXdrXy)oM18dW4N=WOjNyxwh&RRnAi#F0=+cb^ItBL3WhPJAB1Z!Els@P&vX=_55z z)z3j-1=OBV)Het0C$PQGEhB@l1gDA6kX$+_f+V2C49qxROtiMe~od)P%1S6HoX!$Un0!*REy%3 zw?Y-vv{pi|geW{hXg5{ahCqN>LkE?GQZ7z67t$xATqMz8(^x`qNuieyi`TPW#nHJn zaDm;EmN=Zn_v!^LGyz>)B-A@FL=rl3+UnQ04JfSU)F}A4s>4Xa`@@ z3>1{u3`QK%XcPFU6973(LDMLn)fCx5GbC-e>R!(c+R*WtU#;ZMv4Q@O{>648OM zE!Oz|n23No=mcSdt{_ZXMoLX}qiQ63(mn2oL zVXN6ydX+s-csG`MATK3uw!M_lYe!49C-e$K5cP&(_J^6}pzUnX_6COv-Ax^1b~XrN z%{T;V#ts$dA!S{kS&E0D?*+NUy2!EWoIoYNVb@O-wAR>gSqW%Nb^_FH)%RV2y4q79 zdsyK^{ydZ5X5d`HkH2_Y#MBNn7hX>?SxXAWHQPXKyELZFxer`b0_aR4bi?Y%T`R{6g+W2|_QgnoNNj$35xk<`HZu*Sn9&Yd#5b z)V4bRfc8~!6DZ+@2V6ZFR0TY<+nqK+VW%vFG-##!Om?HnE0WyM57~G^2nxeHZorxf z@Ez!sGRc~vvKIZY_ZY3IfqPF(aMDjE2u-;J(W7snpqx>f$3kEzUkHBg18AXruUi`_ zkAwCa=wmm+@Za%lWY1$srU_tCZS9xWE!$?D_#kNWaUj+(*rWt?sY85Np>=^PKg$%< z5Sv*~*$nm>2=>LaQ$27268;>Ik;F^F)rCX6MX*Cz`=I5KomKt9!!$Z zjz=zv;DMJt?v^w_yLb3F&@hYy+e=9y2)`f79H^$tB$HmKGCP1rKpmOlP>fbL)w3dp zpeKz^4hcGV&$d(F63D>7&{fb;h4(x^uC%KFLI!SIxcQMXaU?I24@U!gkvaUXV=sQ4*l6orDT={G|zZ{D2g+c`L zV;?^ag3cDPk6P`?V4tK^fXy$gK0@(Dy)=(A7N-T?NEQ4@(ooTX<|!%j(kn~2kx>h0 zkRgcKy6esE$p9;k-TD-|_k_L*Q1n&xQJ5apyGpA^l|i|b_{?U%JS=I?y$BNlI?OV# z1HdS|pe{w#fI%H+p@Dn*#jSGA`;!&|URY~G7((^|wNL@*X*)(^PaDfkq`aJo zX;V+p&sK!2U_JGQ?uAg49>BMLufO@lKJfHBzqWh8cZSAa91ut@cf-qBUwG7k&7yfB z63|Tmu(V;aTl@uks_Ycvnglck_csK*eO!yy4mN+^C{<;%ru3f1CvIDrL3 zDoBAFKyQPzxbd!7Nun+yl}|5-%gXf1CpgHcKIAkf#z3|OsfnZA@Z!mff88S3ZW2Ph z;LbvDJC!Ihi-Bt#;uj=u86sd_64_8|gY+UyC<9YhzT_}AY8-&9kR%ETPz0Q2jv7E? z(b||J*zhY8(iJq(=~D85X3yo|g!QE3ZAwi%Vl%c!Cr@s|0m

Ut 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 From 371ff37d2efdfe8f67434cfd90cb012337874856 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 21 Dec 2023 10:50:26 +0500 Subject: [PATCH 26/51] =?UTF-8?q?Worker=20=D0=B4=D0=BB=D1=8F=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20email?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Background/WorkToSendEmail.cs | 73 +++++++++++++++++++ .../EmailNotificationTransportService.cs | 61 +++------------- 2 files changed, 83 insertions(+), 51 deletions(-) create mode 100644 AsbCloudInfrastructure/Background/WorkToSendEmail.cs diff --git a/AsbCloudInfrastructure/Background/WorkToSendEmail.cs b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs new file mode 100644 index 00000000..da1f273f --- /dev/null +++ b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs @@ -0,0 +1,73 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Exceptions; +using AsbCloudApp.Repositories; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Mail; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Background +{ + internal class WorkToSendEmail : Work + { + private NotificationDto notification; + private string sender; + private string smtpPassword; + private string smtpServer; + + public WorkToSendEmail(string workId, NotificationDto notification, string sender, string smtpPassword, string smtpServer) : base(workId) + { + this.notification = notification; + + this.sender = sender; + this.smtpPassword = smtpPassword; + this.smtpServer = smtpServer; + } + + protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) + { + var notificationRepository = services.GetRequiredService(); + var userRepository = services.GetRequiredService(); + + var user = await userRepository.GetOrDefaultAsync(notification.IdUser, token) + ?? throw new ArgumentInvalidException(nameof(notification.IdUser), "Пользователь не найден"); + + if (!MailAddress.TryCreate(user.Email, out var mailAddress)) + { + Trace.TraceWarning($"Mail {user.Email} is not correct."); + throw new ArgumentInvalidException(nameof(user.Email), $"Mail {user.Email} is not null."); + } + + var from = new MailAddress(sender); + var message = new MailMessage + { + From = from + }; + + message.To.Add(mailAddress.Address); + message.BodyEncoding = System.Text.Encoding.UTF8; + message.Body = notification.Message; + message.Subject = notification.Title; + message.IsBodyHtml = true; + + using var client = new SmtpClient(smtpServer); + client.EnableSsl = true; + client.UseDefaultCredentials = false; + client.Credentials = new System.Net.NetworkCredential(sender, smtpPassword); + + await client.SendMailAsync(message, token); + notification.SentDate = DateTime.UtcNow; + await notificationRepository.UpdateAsync(notification, token); + + Trace.TraceInformation($"Send email to {user.Email} subj:{notification.Title} html body count {notification.Message.Length}"); + } + } +} diff --git a/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs b/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs index e56e423f..e345c351 100644 --- a/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs +++ b/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs @@ -10,6 +10,7 @@ using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Services.Notifications; using AsbCloudInfrastructure.Background; +using AsbCloudInfrastructure.Background.PeriodicWorks; using DocumentFormat.OpenXml.Presentation; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -24,6 +25,7 @@ namespace AsbCloudInfrastructure.Services.Email private readonly string sender; private readonly string smtpServer; private readonly string smtpPassword; + private IConfiguration configuration; public EmailNotificationTransportService(BackgroundWorker backgroundWorker, IConfiguration configuration) @@ -32,6 +34,7 @@ namespace AsbCloudInfrastructure.Services.Email smtpPassword = configuration.GetValue("email:password", string.Empty); smtpServer = configuration.GetValue("email:smtpServer", string.Empty); + var configError = string.IsNullOrEmpty(sender) || string.IsNullOrEmpty(smtpPassword) || string.IsNullOrEmpty(smtpServer); @@ -45,19 +48,18 @@ namespace AsbCloudInfrastructure.Services.Email public Task SendAsync(NotificationDto notification, CancellationToken cancellationToken) { - if (!IsConfigured) - { - Trace.TraceWarning("smtp is not configured"); - return Task.CompletedTask; - } + //if (!IsConfigured) + //{ + // Trace.TraceWarning("smtp is not configured"); + // return Task.CompletedTask; + //} var workId = MakeWorkId(notification.IdUser, notification.Title, notification.Message); if (!backgroundWorker.Works.Any(w=>w.Id==workId)) { - var workAction = MakeEmailSendWorkAction(notification); - - var work = Work.CreateByDelegate(workId, workAction); + var work = new WorkToSendEmail(workId, notification, sender, smtpPassword, smtpServer); backgroundWorker.Enqueue(work); + } return Task.CompletedTask; @@ -71,49 +73,6 @@ namespace AsbCloudInfrastructure.Services.Email return Task.WhenAll(tasks); } - private Func, CancellationToken, Task> MakeEmailSendWorkAction(NotificationDto notification) - { - return async (_, serviceProvider, onProgress, token) => - { - var notificationRepository = serviceProvider.GetRequiredService(); - var userRepository = serviceProvider.GetRequiredService(); - - var user = await userRepository.GetOrDefaultAsync(notification.IdUser, token) - ?? throw new ArgumentInvalidException(nameof(notification.IdUser), "Пользователь не найден"); - - if(!MailAddress.TryCreate(user.Email, out var mailAddress)) - { - Trace.TraceWarning($"Mail {user.Email} is not correct."); - throw new ArgumentInvalidException(nameof(user.Email), $"Mail {user.Email} is not null."); - } - - var from = new MailAddress(sender); - var message = new MailMessage - { - From = from - }; - - message.To.Add(mailAddress.Address); - message.BodyEncoding = System.Text.Encoding.UTF8; - message.Body = notification.Message; - message.Subject = notification.Title; - message.IsBodyHtml = true; - - using var client = new SmtpClient(smtpServer); - client.EnableSsl = true; - client.UseDefaultCredentials = false; - client.Credentials = new System.Net.NetworkCredential(sender, smtpPassword); - - await client.SendMailAsync(message, token); - - notification.SentDate = DateTime.UtcNow; - - await notificationRepository.UpdateAsync(notification, token); - - Trace.TraceInformation($"Send email to {user.Email} subj:{notification.Title} html body count {notification.Message.Length}"); - }; - } - private static string MakeWorkId(int idUser, string subject, string content) { var hash = idUser.GetHashCode(); 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 27/51] =?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 28/51] =?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", } }; From 9671f1552386dc204821cd426834e4c1f5bf5c14 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 21 Dec 2023 12:31:25 +0500 Subject: [PATCH 29/51] =?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 --- .../Background/WorkToSendEmail.cs | 30 +++++++---- .../EmailNotificationTransportService.cs | 51 ++++--------------- 2 files changed, 32 insertions(+), 49 deletions(-) diff --git a/AsbCloudInfrastructure/Background/WorkToSendEmail.cs b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs index da1f273f..06e88342 100644 --- a/AsbCloudInfrastructure/Background/WorkToSendEmail.cs +++ b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs @@ -1,39 +1,51 @@ using AsbCloudApp.Data; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; -using AsbCloudApp.Services; -using AsbCloudDb.Model; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Linq; using System.Net.Mail; -using System.Text; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Background { + ///

+ /// Класс для отправки email + /// internal class WorkToSendEmail : Work { private NotificationDto notification; private string sender; private string smtpPassword; private string smtpServer; + private bool IsConfigured; - public WorkToSendEmail(string workId, NotificationDto notification, string sender, string smtpPassword, string smtpServer) : base(workId) + public WorkToSendEmail(string workId, NotificationDto notification, IConfiguration configuration) : base(workId) { this.notification = notification; - this.sender = sender; - this.smtpPassword = smtpPassword; - this.smtpServer = smtpServer; + sender = configuration.GetValue("email:sender", string.Empty); + smtpPassword = configuration.GetValue("email:password", string.Empty); + smtpServer = configuration.GetValue("email:smtpServer", string.Empty); + + var configError = string.IsNullOrEmpty(sender) || + string.IsNullOrEmpty(smtpPassword) || + string.IsNullOrEmpty(smtpServer); + + IsConfigured = !configError; } + protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) { + if (!IsConfigured) + { + Trace.TraceWarning("smtp is not configured"); + return; + } + var notificationRepository = services.GetRequiredService(); var userRepository = services.GetRequiredService(); diff --git a/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs b/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs index e345c351..d24d150f 100644 --- a/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs +++ b/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs @@ -1,19 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Net.Mail; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data; -using AsbCloudApp.Exceptions; -using AsbCloudApp.Repositories; +using AsbCloudApp.Data; using AsbCloudApp.Services.Notifications; using AsbCloudInfrastructure.Background; -using AsbCloudInfrastructure.Background.PeriodicWorks; -using DocumentFormat.OpenXml.Presentation; using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.Email { @@ -21,45 +13,24 @@ namespace AsbCloudInfrastructure.Services.Email public class EmailNotificationTransportService : INotificationTransportService { private readonly BackgroundWorker backgroundWorker; - private readonly bool IsConfigured; - private readonly string sender; - private readonly string smtpServer; - private readonly string smtpPassword; private IConfiguration configuration; - public EmailNotificationTransportService(BackgroundWorker backgroundWorker, + public EmailNotificationTransportService(BackgroundWorker backgroundWorker, IConfiguration configuration) { - sender = configuration.GetValue("email:sender", string.Empty); - smtpPassword = configuration.GetValue("email:password", string.Empty); - smtpServer = configuration.GetValue("email:smtpServer", string.Empty); - - - var configError = string.IsNullOrEmpty(sender) || - string.IsNullOrEmpty(smtpPassword) || - string.IsNullOrEmpty(smtpServer); - - IsConfigured = !configError; - + this.configuration = configuration; this.backgroundWorker = backgroundWorker; } public int IdTransportType => 1; - + public Task SendAsync(NotificationDto notification, CancellationToken cancellationToken) { - //if (!IsConfigured) - //{ - // Trace.TraceWarning("smtp is not configured"); - // return Task.CompletedTask; - //} - var workId = MakeWorkId(notification.IdUser, notification.Title, notification.Message); - if (!backgroundWorker.Works.Any(w=>w.Id==workId)) + if (!backgroundWorker.Works.Any(w => w.Id == workId)) { - var work = new WorkToSendEmail(workId, notification, sender, smtpPassword, smtpServer); + var work = new WorkToSendEmail(workId, notification, configuration); backgroundWorker.Enqueue(work); - } return Task.CompletedTask; @@ -72,7 +43,7 @@ namespace AsbCloudInfrastructure.Services.Email return Task.WhenAll(tasks); } - + private static string MakeWorkId(int idUser, string subject, string content) { var hash = idUser.GetHashCode(); From 85d0aca9a8756d37d6389066f7d842dacccd9bff Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 21 Dec 2023 14:48:08 +0500 Subject: [PATCH 30/51] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Background/WorkToSendEmail.cs | 11 ++++++++++- .../Email/EmailNotificationTransportService.cs | 15 ++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/AsbCloudInfrastructure/Background/WorkToSendEmail.cs b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs index 06e88342..96136cde 100644 --- a/AsbCloudInfrastructure/Background/WorkToSendEmail.cs +++ b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs @@ -22,7 +22,7 @@ namespace AsbCloudInfrastructure.Background private string smtpServer; private bool IsConfigured; - public WorkToSendEmail(string workId, NotificationDto notification, IConfiguration configuration) : base(workId) + public WorkToSendEmail(NotificationDto notification, IConfiguration configuration) : base(MakeWorkId(notification)) { this.notification = notification; @@ -81,5 +81,14 @@ namespace AsbCloudInfrastructure.Background Trace.TraceInformation($"Send email to {user.Email} subj:{notification.Title} html body count {notification.Message.Length}"); } + + + private static string MakeWorkId(NotificationDto notification) + { + var hash = notification.IdUser.GetHashCode(); + hash ^= notification.Title.GetHashCode(); + hash ^= notification.Message.GetHashCode(); + return hash.ToString("x"); + } } } diff --git a/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs b/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs index d24d150f..f41bd7ad 100644 --- a/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs +++ b/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs @@ -12,8 +12,8 @@ namespace AsbCloudInfrastructure.Services.Email public class EmailNotificationTransportService : INotificationTransportService { + private readonly IConfiguration configuration; private readonly BackgroundWorker backgroundWorker; - private IConfiguration configuration; public EmailNotificationTransportService(BackgroundWorker backgroundWorker, IConfiguration configuration) @@ -26,10 +26,9 @@ namespace AsbCloudInfrastructure.Services.Email public Task SendAsync(NotificationDto notification, CancellationToken cancellationToken) { - var workId = MakeWorkId(notification.IdUser, notification.Title, notification.Message); - if (!backgroundWorker.Works.Any(w => w.Id == workId)) + var work = new WorkToSendEmail(notification, configuration); + if (!backgroundWorker.Works.Any(w => w.Id == work.Id)) { - var work = new WorkToSendEmail(workId, notification, configuration); backgroundWorker.Enqueue(work); } @@ -44,12 +43,6 @@ namespace AsbCloudInfrastructure.Services.Email return Task.WhenAll(tasks); } - private static string MakeWorkId(int idUser, string subject, string content) - { - var hash = idUser.GetHashCode(); - hash ^= subject.GetHashCode(); - hash ^= content.GetHashCode(); - return hash.ToString("x"); - } + } } From af343626a70dd48f26d354216150a9feb0b85451 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 21 Dec 2023 15:31:15 +0500 Subject: [PATCH 31/51] remove permissions on get requests --- AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs index aab78cd3..f4cfe0b4 100644 --- a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs @@ -45,7 +45,6 @@ namespace AsbCloudWebApi.Controllers.SAUB /// Токен завершения задачи /// [HttpGet("{idWell}")] - [Permission] public async Task>> GetDataAsync([Required] int idWell, [FromQuery] GtrWithGetDataRequest request, CancellationToken token) @@ -75,7 +74,6 @@ namespace AsbCloudWebApi.Controllers.SAUB /// /// [HttpGet("{idWell}/{idRecord}")] - [Permission] public async Task>> GetLastDataByRecordIdAsync(int idWell, int idRecord, CancellationToken token) { int? idCompany = User.GetCompanyId(); From 5572000fb5151e9cf3e53750a3da235eca9e0d97 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 21 Dec 2023 15:33:45 +0500 Subject: [PATCH 32/51] DetectedOperationRequest fix initialization of IEnumerables --- AsbCloudApp/Requests/DetectedOperationRequest.cs | 6 +++--- .../Services/DetectOperations/DetectedOperationService.cs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/AsbCloudApp/Requests/DetectedOperationRequest.cs b/AsbCloudApp/Requests/DetectedOperationRequest.cs index 1e38ff7b..dcf66aab 100644 --- a/AsbCloudApp/Requests/DetectedOperationRequest.cs +++ b/AsbCloudApp/Requests/DetectedOperationRequest.cs @@ -20,12 +20,12 @@ namespace AsbCloudApp.Requests /// Список id телеметрий /// пустой список - нет фильтрации ///
- public IEnumerable IdsTelemetries { get; set; } = Enumerable.Empty(); + public IEnumerable IdsTelemetries { get; set; } = Array.Empty(); /// /// категории операций /// - public IEnumerable IdsCategories { get; set; } = Enumerable.Empty(); + public IEnumerable IdsCategories { get; set; } = Array.Empty(); /// /// Больше или равно дате @@ -50,7 +50,7 @@ namespace AsbCloudApp.Requests /// /// Фильтр по пользователю панели /// - public int? EqIdTelemetryUser { get; set; } + public int? IdTelemetryUser { get; set; } } } diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index a65525ad..9691c7fb 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -199,8 +199,8 @@ namespace AsbCloudInfrastructure.Services.DetectOperations 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); + if (request.IdTelemetryUser is not null) + query = query.Where(o => o.IdUsersAtStart == request.IdTelemetryUser); } return query; From 40ac7780dab0924bc9f429d091c130261398b1aa Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 21 Dec 2023 16:07:11 +0500 Subject: [PATCH 33/51] Tests Add TestDataContainsNotDefaultProps example --- AsbCloudWebApi.Tests/ReflectionExtensions.cs | 47 ++++++++++++ .../WellOperationExportServiceTest.cs | 75 +++++++++++++++++-- 2 files changed, 114 insertions(+), 8 deletions(-) create mode 100644 AsbCloudWebApi.Tests/ReflectionExtensions.cs diff --git a/AsbCloudWebApi.Tests/ReflectionExtensions.cs b/AsbCloudWebApi.Tests/ReflectionExtensions.cs new file mode 100644 index 00000000..e08a8e38 --- /dev/null +++ b/AsbCloudWebApi.Tests/ReflectionExtensions.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudWebApi.Tests +{ + public static class ReflectionExtensions + { + private static readonly Dictionary _commonTypeDictionary = new() + { + { typeof(int), default(int) }, + { typeof(Guid), default(Guid) }, + { typeof(DateOnly), default(DateOnly) }, + { typeof(DateTime), default(DateTime) }, + { typeof(DateTimeOffset), default(DateTimeOffset) }, + { typeof(TimeOnly), default(TimeOnly) }, + { typeof(long), default(long) }, + { typeof(bool), default(bool) }, + { typeof(double), default(double) }, + { typeof(short), default(short) }, + { typeof(float), default(float) }, + { typeof(byte), default(byte) }, + { typeof(char), default(char) }, + { typeof(uint), default(uint) }, + { typeof(ushort), default(ushort) }, + { typeof(ulong), default(ulong) }, + { typeof(sbyte), default(sbyte) } + }; + + public static object? GetDefaultValue(this Type type) + { + if (!type.IsValueType) + { + return null; + } + + return _commonTypeDictionary.TryGetValue(type, out var value) + ? value + : Activator.CreateInstance(type); + } + + public static bool IsDefaultValue(this Type type, object? value) + => (value?.Equals(type.GetDefaultValue()) != false); + } +} diff --git a/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs b/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs index cdfd6cd8..dc000166 100644 --- a/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs +++ b/AsbCloudWebApi.Tests/UnitTests/Services/WellOperationExport/WellOperationExportServiceTest.cs @@ -8,11 +8,16 @@ using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.WellOperationImport; using AsbCloudInfrastructure.Services.WellOperationImport.FileParser; using NSubstitute; +using SignalRSwaggerGen.Enums; using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Xunit; +using Xunit.Abstractions; namespace AsbCloudWebApi.Tests.UnitTests.Services.WellOperationExport { @@ -27,31 +32,36 @@ namespace AsbCloudWebApi.Tests.UnitTests.Services.WellOperationExport private WellOperationImportService wellOperationImportService; private IWellOperationExcelParser wellOperationDefaultExcelParser; - private readonly WellOperationDto[] operations = new WellOperationDto[2] { new WellOperationDto() { + Id = 5, IdWell = idWell, IdUser = 1, IdType = 0, IdWellSectionType = 1, + WellSectionTypeName = "1", IdCategory = 1, - CategoryInfo = "1", + CategoryName = "1", + CategoryInfo = "CategoryInfo 1", DepthStart = 10, DepthEnd = 20, - DateStart = getDate(days: 0), + DateStart = GetDate(days: 0), DurationHours = 10, Comment = "Комментарий 1", }, new WellOperationDto() { + Id = 6, IdWell = idWell, IdUser = 1, IdType = 0, IdWellSectionType = 2, + WellSectionTypeName = "2", IdCategory = 2, - CategoryInfo = "2", + CategoryName = "2", + CategoryInfo = "CategoryInfo 2", DepthStart = 20, DepthEnd = 30, - DateStart = getDate(days: 1), + DateStart = GetDate(days: 1), DurationHours = 20, Comment = "Комментарий 2", } @@ -92,14 +102,15 @@ namespace AsbCloudWebApi.Tests.UnitTests.Services.WellOperationExport Name = "2" } }; + private readonly ITestOutputHelper output; - private static DateTime getDate(int days) + 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() + public WellOperationExportServiceTest(ITestOutputHelper output) { wellService = Substitute.For(); wellOperationRepository = Substitute.For(); @@ -108,6 +119,7 @@ namespace AsbCloudWebApi.Tests.UnitTests.Services.WellOperationExport wellOperationImportService = new WellOperationImportService(wellOperationRepository); wellOperationDefaultExcelParser = new WellOperationDefaultExcelParser(); + this.output = output; } [Fact] @@ -136,6 +148,53 @@ namespace AsbCloudWebApi.Tests.UnitTests.Services.WellOperationExport Assert.Equal(expected, actual); } - } + [Fact] + public void TestDataContainsNotDefaultProps() + { + var initOk = true; + for (int i = 0; i < operations.Length; i++) + { + var operation = operations[i]; + var propsWithDefault = GetPropsWithDefaultValue(operation, + nameof(WellOperationDto.Id), + nameof(WellOperationDto.IdType), + nameof(WellOperationDto.IdPlan), + nameof(WellOperationDto.IdParentCategory), + nameof(WellOperationDto.Day), + nameof(WellOperationDto.NptHours), + nameof(WellOperationDto.UserName), + nameof(WellOperationDto.LastUpdateDate) + ) + .ToArray(); + + if (propsWithDefault.Any()) + { + initOk = false; + foreach (var propertyName in propsWithDefault) + output.WriteLine($"{nameof(operations)}[{i}].{propertyName} is default"); + } + } + + Assert.True(initOk); + } + + private static IEnumerable GetPropsWithDefaultValue(T dto, params string[] excludeProps) + { + IEnumerable props = typeof(T).GetProperties( + BindingFlags.Public + | BindingFlags.Instance); + + props = props + .Where(prop=>prop.CanWrite) + .Where(prop => !excludeProps.Contains(prop.Name)); + + foreach (var prop in props) + { + var value = prop.GetValue(dto); + if (prop.PropertyType.IsDefaultValue(value)) + yield return prop.Name; + } + } + } } From 38f861c2e90bf974cea997928b9211e981d60845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 22 Dec 2023 09:48:18 +0500 Subject: [PATCH 34/51] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B8=D0=BC?= =?UTF-8?q?=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=20=D0=BF=D0=BB=D0=B0=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D0=BC=D0=B8=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=D0=BC=D0=B8=20=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudWebApi/Controllers/WellOperationController.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index d4723657..ae0c8b92 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -403,7 +403,8 @@ namespace AsbCloudWebApi.Controllers /// /// Импорт операций из excel (xlsx) файла. ГПНХ (Хантос) /// - /// id скважины + /// Id скважины + /// Параметры парсинга /// Коллекция из одного файла xlsx /// /// @@ -412,14 +413,12 @@ namespace AsbCloudWebApi.Controllers [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] [Permission] public Task ImportPlanGazpromKhantosExcelFileAsync(int idWell, + [FromQuery] WellOperationImportGazpromKhantosOptionsDto options, [FromForm] IFormFileCollection files, CancellationToken cancellationToken) { - var options = new WellOperationImportGazpromKhantosOptionsDto - { - IdType = WellOperation.IdOperationTypePlan - }; - + options.IdType = WellOperation.IdOperationTypePlan; + return ImportExcelFileAsync(idWell, files, options, (stream, _) => wellOperationGazpromKhantosExcelParser.Parse(stream, options), null, From 15adc2d79d7f9b3c37d3e72fd2e00d4c47a16a72 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 22 Dec 2023 11:47:10 +0500 Subject: [PATCH 35/51] fix tvdLagDays --- .../Services/WellOperationService/OperationsStatService.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs index a93dc50b..c9018051 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs @@ -10,7 +10,6 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data.SAUB; -using AsbCloudInfrastructure.Services.SAUB; using AsbCloudApp.Repositories; namespace AsbCloudInfrastructure.Services.WellOperationService; @@ -219,7 +218,7 @@ public class OperationsStatService : IOperationsStatService var factEnd = lastCorrespondingFactOperation.DateStart.AddHours(lastCorrespondingFactOperation.DurationHours); var planEnd = lastCorrespondingPlanOperation.DateStart.AddHours(lastCorrespondingPlanOperation.DurationHours); - var lagDays = (planEnd - factEnd).TotalDays; + var lagDays = (factEnd - planEnd).TotalDays; return lagDays; } From 44565c805590990946191bf9cf9e08aa4ce348e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 22 Dec 2023 14:32:56 +0500 Subject: [PATCH 36/51] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=81?= =?UTF-8?q?=D0=B5=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B2=20=D1=88=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BD=D0=B5=20=D0=B3=D0=B3=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Files/WellOperationImportTemplate.xlsx | Bin 98992 -> 98938 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 7e9cec5ef4884fe0fd0c22749e2cdd8e23faadfb..6f53ccfbeffaf2feaa69d38216b8b4f6a085a824 100644 GIT binary patch literal 98938 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%0D<;;j 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

Y*%T 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 Ze%w9!T2PSTTblz8EP|WOGYI4=@E@*WtDpb? literal 98992 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 F{{iPwwZH%X From 12809cdd504dad289b3365babfa5187751ef69b6 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, 25 Dec 2023 09:33:07 +0500 Subject: [PATCH 37/51] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=88=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BD=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=B8?= =?UTF-8?q?=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20=D0=A0=D0=A2=D0=9A-?= =?UTF-8?q?=D0=BF=D0=BB=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...cessMapPlanImportWellDrillingTemplate.xlsx | Bin 12484 -> 12486 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/WellDrilling/ProcessMapPlanImportWellDrillingTemplate.xlsx b/AsbCloudInfrastructure/Services/ProcessMaps/WellDrilling/ProcessMapPlanImportWellDrillingTemplate.xlsx index 1fcfbe73873b360d2e77cdf70ce9589da9726fd9..383f242c77828718e9c7c200cc1134881a924486 100644 GIT binary patch delta 4900 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 b@p}YN3j+60UQj_iEmS`A4xy^ZzYqNjnd~eV delta 4921 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 Date: Mon, 25 Dec 2023 09:49:56 +0500 Subject: [PATCH 38/51] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BE=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE?= =?UTF-8?q?=D1=81=D1=86=D0=B8=D0=BB=D0=BB=D1=8F=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DetectOperations/Detectors/DetectorAbstract.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs index 28873719..228d0810 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs @@ -161,14 +161,14 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors { var enabledSubsystems = 0; + if (extraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out var hasOscillation) + && hasOscillation is true) + enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoOscillation; + 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)EnabledSubsystemsFlags.AutoRotor; From 58edaf4204bbcd7f35145d73dcd230c5673b02b9 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 25 Dec 2023 10:53:45 +0500 Subject: [PATCH 39/51] =?UTF-8?q?=D0=9E=D1=82=D0=B4=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20work=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=B8=D0=B0=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=BC=D1=8B=20=D0=BE=D1=82=D1=87=D0=B5=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Services/IReportService.cs | 13 +-- .../Background/WorkToCreateReport.cs | 101 ++++++++++++++++++ .../Services/ReportService.cs | 85 +++------------ .../Controllers/ReportController.cs | 3 +- AsbCloudWebApi/SignalR/ReportsHub.cs | 3 +- 5 files changed, 119 insertions(+), 86 deletions(-) create mode 100644 AsbCloudInfrastructure/Background/WorkToCreateReport.cs diff --git a/AsbCloudApp/Services/IReportService.cs b/AsbCloudApp/Services/IReportService.cs index 85d72020..23d34b31 100644 --- a/AsbCloudApp/Services/IReportService.cs +++ b/AsbCloudApp/Services/IReportService.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Requests; using System; using System.Collections.Generic; using System.Threading; @@ -11,24 +12,16 @@ namespace AsbCloudApp.Services ///

public interface IReportService { - /// - /// категория рапорта - /// - int ReportCategoryId { get; } /// /// Поставить рапорт в очередь на формирование /// /// /// - /// - /// - /// - /// + /// /// /// - string EnqueueCreateReportWork(int idWell, int idUser, int stepSeconds, - int format, DateTime begin, DateTime end, + string EnqueueCreateReportWork(int idWell, int idUser, ReportParametersRequest request, Action handleReportProgress); /// diff --git a/AsbCloudInfrastructure/Background/WorkToCreateReport.cs b/AsbCloudInfrastructure/Background/WorkToCreateReport.cs new file mode 100644 index 00000000..11c4b1e5 --- /dev/null +++ b/AsbCloudInfrastructure/Background/WorkToCreateReport.cs @@ -0,0 +1,101 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services; +using Mapster; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Background +{ + /// + /// Класс для создания отчета + /// + internal class WorkToCreateReport : Work + { + private int idWell; + private DateTime begin; + private DateTime end; + private int stepSeconds; + private int format; + private int idUser; + private Action progressHandler; + + public WorkToCreateReport(int idWell, int idUser, ReportParametersRequest request, Action progressHandler) : base("") + { + this.idWell = idWell; + this.idUser = idUser; + + this.begin = request.Begin; + this.end = request.End; + this.stepSeconds = request.StepSeconds; + this.format = request.Format; + + this.progressHandler = progressHandler; + + Id = $"create report by wellid:{idWell} for userid:{idUser} requested at {DateTime.Now}"; + } + + + protected override async Task Action(string id, IServiceProvider services, Action onProgress, CancellationToken token) + { + var wellService = services.GetRequiredService(); + using var context = services.GetRequiredService(); + var fileService = services.GetRequiredService(); + + var timezoneOffset = wellService.GetTimezone(idWell).Hours; + var beginRemote = begin.ToTimeZoneOffsetHours(timezoneOffset); + var endRemote = end.ToTimeZoneOffsetHours(timezoneOffset); + var beginUtc = begin.ToUtcDateTimeOffset(timezoneOffset); + var endUtc = end.ToUtcDateTimeOffset(timezoneOffset); + + var tempDir = Path.Combine(Path.GetTempPath(), "report"); + + var generator = ReportService.GetReportGenerator(idWell, beginRemote, endRemote, stepSeconds, format, context); + var reportFileName = Path.Combine(tempDir, generator.GetReportDefaultFileName()); + var totalPages = generator.GetPagesCount(); + + generator.OnProgress += (s, e) => + { + var arg = e.Adapt(); + onProgress(arg.Operation ?? string.Empty, arg.Progress); + progressHandler.Invoke(arg, id); + }; + generator.Make(reportFileName); + + var ReportCategoryId = context.FileCategories + .AsNoTracking() + .First(c => c.Name.Equals("Рапорт")) + .Id; + + var fileInfo = (await fileService.MoveAsync(idWell, idUser, ReportCategoryId, reportFileName, reportFileName, token))!; + + progressHandler.Invoke(new + { + Operation = "done", + Progress = 100f, + TotalPages = totalPages, + CurrentPage = totalPages, + file = fileInfo, + }, id); + + var newReportProperties = new ReportProperty + { + IdWell = idWell, + IdFile = fileInfo.Id, + Begin = beginUtc, + End = endUtc, + Step = stepSeconds, + Format = format + }; + context.ReportProperties.Add(newReportProperties); + context.SaveChanges(); + } + } +} diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index e1cd558a..cd026451 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -1,14 +1,12 @@ using AsbCloudApp.Data; +using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudInfrastructure.Background; using AsbSaubReport; -using Mapster; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -23,8 +21,6 @@ public class ReportService : IReportService private readonly IWellService wellService; private readonly BackgroundWorker backgroundWorkerService; - public int ReportCategoryId { get; private set; } - public ReportService(IAsbCloudDbContext db, ITelemetryService telemetryService, IWellService wellService, @@ -36,76 +32,21 @@ public class ReportService : IReportService this.backgroundWorkerService = backgroundWorkerService; this.telemetryService = telemetryService; this.fileService = fileService; - ReportCategoryId = db.FileCategories - .AsNoTracking() - .First(c => c.Name.Equals("Рапорт")) - .Id; } - public string EnqueueCreateReportWork(int idWell, int idUser, int stepSeconds, int format, DateTime begin, - DateTime end, Action progressHandler) + public string EnqueueCreateReportWork(int idWell, int idUser, ReportParametersRequest request, Action progressHandler) { - var timezoneOffset = wellService.GetTimezone(idWell).Hours; - var beginUtc = begin.ToUtcDateTimeOffset(timezoneOffset); - var endUtc = end.ToUtcDateTimeOffset(timezoneOffset); - var beginRemote = begin.ToTimeZoneOffsetHours(timezoneOffset); - var endRemote = end.ToTimeZoneOffsetHours(timezoneOffset); + var work = new WorkToCreateReport(idWell, idUser, request, progressHandler); - var workId = $"create report by wellid:{idWell} for userid:{idUser} requested at {DateTime.Now}"; - - var workAction = async (string id, IServiceProvider serviceProvider, Action onProgress, CancellationToken token) => - { - using var context = serviceProvider.GetRequiredService(); - var fileService = serviceProvider.GetRequiredService(); - - var tempDir = Path.Combine(Path.GetTempPath(), "report"); - - var generator = GetReportGenerator(idWell, beginRemote, endRemote, stepSeconds, format, context); - var reportFileName = Path.Combine(tempDir, generator.GetReportDefaultFileName()); - var totalPages = generator.GetPagesCount(); - - generator.OnProgress += (s, e) => - { - var arg = e.Adapt(); - onProgress(arg.Operation?? string.Empty, arg.Progress); - progressHandler.Invoke(arg, id); - }; - generator.Make(reportFileName); - - var fileInfo = (await fileService.MoveAsync(idWell, idUser, ReportCategoryId, reportFileName, reportFileName, token))!; - - progressHandler.Invoke(new - { - Operation = "done", - Progress = 100f, - TotalPages = totalPages, - CurrentPage = totalPages, - file = fileInfo, - }, id); - - var newReportProperties = new ReportProperty - { - IdWell = idWell, - IdFile = fileInfo.Id, - Begin = beginUtc, - End = endUtc, - Step = stepSeconds, - Format = format - }; - context.ReportProperties.Add(newReportProperties); - context.SaveChanges(); - }; - - var work = Work.CreateByDelegate(workId, workAction); work.OnErrorAsync = (message, exception, token) => Task.Run(() => progressHandler.Invoke(new - { - Operation = "error", - Progress = 100f, - Message = string.IsNullOrEmpty(message) + { + Operation = "error", + Progress = 100f, + Message = string.IsNullOrEmpty(message) ? exception.Message : message, - Exception = exception, - }, workId) + Exception = exception, + }, work.Id) , token); backgroundWorkerService.Enqueue(work); @@ -114,8 +55,8 @@ public class ReportService : IReportService { Operation = "Ожидает начала в очереди.", Progress = 0f, - }, workId); - return workId; + }, work.Id); + return work.Id; } public int GetReportPagesCount(int idWell, DateTime begin, DateTime end, int stepSeconds, int format) @@ -172,7 +113,7 @@ public class ReportService : IReportService return dtos; } - private static IReportGenerator GetReportGenerator(int idWell, DateTime begin, + public static IReportGenerator GetReportGenerator(int idWell, DateTime begin, DateTime end, int stepSeconds, int format, IAsbCloudDbContext context) { var dataSource = new ReportDataSourcePgCloud(context, idWell); @@ -184,7 +125,7 @@ public class ReportService : IReportService _ => new AsbSaubReportPdf.ReprotGeneratorPdf(dataSource), }; - if(begin == default || end == default) + if (begin == default || end == default) { var analyzeResult = dataSource.Analyze(); begin = begin == default ? analyzeResult.MinDate : begin; diff --git a/AsbCloudWebApi/Controllers/ReportController.cs b/AsbCloudWebApi/Controllers/ReportController.cs index ffcc8b9b..ec1b7228 100644 --- a/AsbCloudWebApi/Controllers/ReportController.cs +++ b/AsbCloudWebApi/Controllers/ReportController.cs @@ -65,8 +65,7 @@ namespace AsbCloudWebApi.Controllers .GetReportProgress(progress, token); }, token); - var id = reportService.EnqueueCreateReportWork(idWell, (int)idUser, - request.StepSeconds, request.Format, request.Begin, request.End, HandleReportProgressAsync); + var id = reportService.EnqueueCreateReportWork(idWell, (int)idUser, request, HandleReportProgressAsync); return Ok(id); } diff --git a/AsbCloudWebApi/SignalR/ReportsHub.cs b/AsbCloudWebApi/SignalR/ReportsHub.cs index 5b9aec9b..2bf098f8 100644 --- a/AsbCloudWebApi/SignalR/ReportsHub.cs +++ b/AsbCloudWebApi/SignalR/ReportsHub.cs @@ -54,8 +54,7 @@ namespace AsbCloudWebApi.SignalR .GetReportProgress(progress, CancellationToken.None); }, CancellationToken.None); - var id = reportService.EnqueueCreateReportWork(idWell, (int)idUser, - request.StepSeconds, request.Format, request.Begin, request.End, HandleReportProgressAsync); + var id = reportService.EnqueueCreateReportWork(idWell, (int)idUser, request, HandleReportProgressAsync); } } } From a9d20340cb6c7822e349d386de9dc4853cf2dcc2 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 25 Dec 2023 11:28:42 +0500 Subject: [PATCH 40/51] Fix ProcessMapPlanRepository.GetAsync(..) --- .../Repository/ProcessMapPlanRepository.cs | 71 ++++++++++++------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanRepository.cs index c362611a..1e5a8403 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapPlanRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanRepository.cs @@ -3,12 +3,14 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data.ProcessMaps; +using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudDb.Model.ProcessMaps; using Microsoft.EntityFrameworkCore; +using Org.BouncyCastle.Asn1.Ocsp; namespace AsbCloudInfrastructure.Repository; @@ -20,54 +22,69 @@ public class ProcessMapPlanRepository : CrudWellRelatedRepository private readonly IWellService wellService; public ProcessMapPlanRepository(IAsbCloudDbContext context, IWellService wellService) - : base(context, dbSet => - dbSet - .Include(p => p.WellSectionType) - .Include(p => p.Well)) + : base(context, dbSet => + dbSet + .Include(p => p.WellSectionType) + .Include(p => p.Well)) { - this.wellService = wellService; + this.wellService = wellService; } public async Task> GetAsync(IEnumerable requests, CancellationToken cancellationToken) { - var query = BuildQuery(requests); + var query = BuildQuery(requests); - var entities = await query.ToArrayAsync(cancellationToken); + var entities = await query.ToArrayAsync(cancellationToken); - return entities.Select(Convert); + return entities.Select(Convert); } public Task RemoveByWellAsync(int idWell) { - var query = GetQuery().Where(x => x.IdWell == idWell); + var query = GetQuery().Where(x => x.IdWell == idWell); - dbSet.RemoveRange(query); + dbSet.RemoveRange(query); - return dbContext.SaveChangesAsync(CancellationToken.None); + return dbContext.SaveChangesAsync(CancellationToken.None); } private IQueryable BuildQuery(IEnumerable requests) { - var query = GetQuery(); + var queries = requests + .Select(request => BuildQuery(request)) + .ToArray(); + + var query = queries.FirstOrDefault() + ?? throw new ArgumentInvalidException(nameof(requests), "Пустые запросы недопустимы"); - foreach (var request in requests) - { - query = query.Where(p => p.IdWell == request.IdWell); + for ( var i = 1; i < queries.Length; i++) + query = query.Union(queries[i]); - if (request.IdWellSectionType is not null) - query = query.Where(p => p.IdWellSectionType == request.IdWellSectionType); + query = query + .Distinct() + .OrderBy(e => e.DepthStart) + .ThenBy(e => e.Id) + .AsNoTracking(); - if (request.UpdateFrom is not null) - { - var timezone = wellService.GetTimezone(request.IdWell); - var updateFromUtc = request.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); + return query; + } - query = query.Where(p => p.LastUpdate >= updateFromUtc); - } - } + private IQueryable BuildQuery(ProcessMapPlanRequest request) + { + var query = GetQuery(); + + query = query.Where(p => p.IdWell == request.IdWell); - return query.OrderBy(e => e.DepthStart) - .ThenBy(e => e.Id) - .AsNoTracking(); + if (request.IdWellSectionType is not null) + query = query.Where(p => p.IdWellSectionType == request.IdWellSectionType); + + if (request.UpdateFrom is not null) + { + var timezone = wellService.GetTimezone(request.IdWell); + var updateFromUtc = request.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); + + query = query.Where(p => p.LastUpdate >= updateFromUtc); + } + return query; } } \ No newline at end of file From 33afc72ead93175da3ecf17aa9fc320673bb94d9 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, 25 Dec 2023 11:41:24 +0500 Subject: [PATCH 41/51] =?UTF-8?q?=D0=92=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE?= =?UTF-8?q?=D0=BD=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BA=D0=BE=D0=BD=D1=81?= =?UTF-8?q?=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D0=B8=20=D1=81=D0=B5=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...cessMapPlanImportWellDrillingTemplate.xlsx | Bin 12486 -> 12611 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/WellDrilling/ProcessMapPlanImportWellDrillingTemplate.xlsx b/AsbCloudInfrastructure/Services/ProcessMaps/WellDrilling/ProcessMapPlanImportWellDrillingTemplate.xlsx index 383f242c77828718e9c7c200cc1134881a924486..bdf13143446f1d64a808c157f915d943dcf5d610 100644 GIT binary patch delta 4800 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 B!4Lod From ae072e74387082a223a85fdaeba6fdf7d07aad6f Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 25 Dec 2023 15:47:03 +0500 Subject: [PATCH 42/51] =?UTF-8?q?=D0=9E=D1=82=D0=B4=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20CreateRep?= =?UTF-8?q?ortAsync,=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B9=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20=D0=B2=D0=BE?= =?UTF-8?q?=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Services/IReportService.cs | 11 +++ .../Background/WorkToCreateReport.cs | 76 ++----------------- .../Services/ReportService.cs | 61 ++++++++++++++- 3 files changed, 76 insertions(+), 72 deletions(-) diff --git a/AsbCloudApp/Services/IReportService.cs b/AsbCloudApp/Services/IReportService.cs index 23d34b31..994db83a 100644 --- a/AsbCloudApp/Services/IReportService.cs +++ b/AsbCloudApp/Services/IReportService.cs @@ -24,6 +24,17 @@ namespace AsbCloudApp.Services string EnqueueCreateReportWork(int idWell, int idUser, ReportParametersRequest request, Action handleReportProgress); + /// + /// Создание отчета + /// + /// + /// + /// + /// + /// + /// + Task CreateReportAsync(int idWell, int idUser, ReportParametersRequest request, Action progressHandler, CancellationToken token); + /// /// Получить предполагаемый список страниц рапорта /// diff --git a/AsbCloudInfrastructure/Background/WorkToCreateReport.cs b/AsbCloudInfrastructure/Background/WorkToCreateReport.cs index 11c4b1e5..4100634d 100644 --- a/AsbCloudInfrastructure/Background/WorkToCreateReport.cs +++ b/AsbCloudInfrastructure/Background/WorkToCreateReport.cs @@ -1,14 +1,7 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Requests; +using AsbCloudApp.Requests; using AsbCloudApp.Services; -using AsbCloudDb.Model; -using AsbCloudInfrastructure.Services; -using Mapster; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using System; -using System.IO; -using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -20,82 +13,23 @@ namespace AsbCloudInfrastructure.Background internal class WorkToCreateReport : Work { private int idWell; - private DateTime begin; - private DateTime end; - private int stepSeconds; - private int format; private int idUser; + private ReportParametersRequest request; private Action progressHandler; public WorkToCreateReport(int idWell, int idUser, ReportParametersRequest request, Action progressHandler) : base("") { this.idWell = idWell; this.idUser = idUser; - - this.begin = request.Begin; - this.end = request.End; - this.stepSeconds = request.StepSeconds; - this.format = request.Format; - + this.request = request; this.progressHandler = progressHandler; - - Id = $"create report by wellid:{idWell} for userid:{idUser} requested at {DateTime.Now}"; } protected override async Task Action(string id, IServiceProvider services, Action onProgress, CancellationToken token) { - var wellService = services.GetRequiredService(); - using var context = services.GetRequiredService(); - var fileService = services.GetRequiredService(); - - var timezoneOffset = wellService.GetTimezone(idWell).Hours; - var beginRemote = begin.ToTimeZoneOffsetHours(timezoneOffset); - var endRemote = end.ToTimeZoneOffsetHours(timezoneOffset); - var beginUtc = begin.ToUtcDateTimeOffset(timezoneOffset); - var endUtc = end.ToUtcDateTimeOffset(timezoneOffset); - - var tempDir = Path.Combine(Path.GetTempPath(), "report"); - - var generator = ReportService.GetReportGenerator(idWell, beginRemote, endRemote, stepSeconds, format, context); - var reportFileName = Path.Combine(tempDir, generator.GetReportDefaultFileName()); - var totalPages = generator.GetPagesCount(); - - generator.OnProgress += (s, e) => - { - var arg = e.Adapt(); - onProgress(arg.Operation ?? string.Empty, arg.Progress); - progressHandler.Invoke(arg, id); - }; - generator.Make(reportFileName); - - var ReportCategoryId = context.FileCategories - .AsNoTracking() - .First(c => c.Name.Equals("Рапорт")) - .Id; - - var fileInfo = (await fileService.MoveAsync(idWell, idUser, ReportCategoryId, reportFileName, reportFileName, token))!; - - progressHandler.Invoke(new - { - Operation = "done", - Progress = 100f, - TotalPages = totalPages, - CurrentPage = totalPages, - file = fileInfo, - }, id); - - var newReportProperties = new ReportProperty - { - IdWell = idWell, - IdFile = fileInfo.Id, - Begin = beginUtc, - End = endUtc, - Step = stepSeconds, - Format = format - }; - context.ReportProperties.Add(newReportProperties); - context.SaveChanges(); + var reportService = services.GetRequiredService(); + await reportService.CreateReportAsync(idWell, idUser, request, progressHandler, token); } } } diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index cd026451..795be62a 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -4,9 +4,11 @@ using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudInfrastructure.Background; using AsbSaubReport; +using Mapster; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -113,7 +115,64 @@ public class ReportService : IReportService return dtos; } - public static IReportGenerator GetReportGenerator(int idWell, DateTime begin, + + public async Task CreateReportAsync( + int idWell, + int idUser, + ReportParametersRequest request, + Action progressHandler, + CancellationToken token) + { + var workId = $"create report by wellid:{idWell} for userid:{idUser} requested at {DateTime.Now}"; + var timezoneOffset = wellService.GetTimezone(idWell).Hours; + var beginRemote = request.Begin.ToTimeZoneOffsetHours(timezoneOffset); + var endRemote = request.End.ToTimeZoneOffsetHours(timezoneOffset); + var beginUtc = request.Begin.ToUtcDateTimeOffset(timezoneOffset); + var endUtc = request.End.ToUtcDateTimeOffset(timezoneOffset); + + var tempDir = Path.Combine(Path.GetTempPath(), "report"); + + var generator = GetReportGenerator(idWell, beginRemote, endRemote, request.StepSeconds, request.Format, db); + var reportFileName = Path.Combine(tempDir, generator.GetReportDefaultFileName()); + var totalPages = generator.GetPagesCount(); + + generator.OnProgress += (s, e) => + { + var arg = e.Adapt(); + progressHandler(arg, workId); + }; + generator.Make(reportFileName); + + var ReportCategoryId = db.FileCategories + .AsNoTracking() + .First(c => c.Name.Equals("Рапорт")) + .Id; + + var fileInfo = (await fileService.MoveAsync(idWell, idUser, ReportCategoryId, reportFileName, reportFileName, token))!; + + progressHandler(new + { + Operation = "done", + Progress = 100f, + TotalPages = totalPages, + CurrentPage = totalPages, + file = fileInfo, + }, workId); + + var newReportProperties = new ReportProperty + { + IdWell = idWell, + IdFile = fileInfo.Id, + Begin = beginUtc, + End = endUtc, + Step = request.StepSeconds, + Format = request.Format + }; + db.ReportProperties.Add(newReportProperties); + db.SaveChanges(); + } + + private static IReportGenerator GetReportGenerator(int idWell, DateTime begin, DateTime end, int stepSeconds, int format, IAsbCloudDbContext context) { var dataSource = new ReportDataSourcePgCloud(context, idWell); From b7bb7ef31f03f886d4e951532cd29a5d53e5a591 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, 25 Dec 2023 16:16:06 +0500 Subject: [PATCH 43/51] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BD=D0=B0=D0=BB=D0=B8=D1=87=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D0=B5=D0=BC=D0=B5=D1=82=D1=80=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. При получении наработки, возвращается пустой список если у скважины нет телеметрии. Попутно удалил неиспользуемую зависимость 2. При получении РТК отчёт, возвращается пустой список если у скважины нет телеметрии --- .../Report/ProcessMapReportWellDrillingService.cs | 2 +- .../Services/Subsystems/SubsystemService.cs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportWellDrillingService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportWellDrillingService.cs index 0561e9ee..eb63d709 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportWellDrillingService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportWellDrillingService.cs @@ -40,7 +40,7 @@ public class ProcessMapReportWellDrillingService : IProcessMapReportWellDrilling ?? throw new ArgumentInvalidException(nameof(idWell), $"Скважина с Id: {idWell} не найдена"); if (!well.IdTelemetry.HasValue) - throw new ArgumentInvalidException(nameof(idWell), $"Скважина с Id: {idWell} не имеет телеметрии"); + return Enumerable.Empty(); var processMapPlanWellDrillings = await processMapPlanWellDrillingRepository.GetByIdWellAsync(idWell, token); diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index 209fc65f..34626f78 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -25,19 +25,16 @@ internal class SubsystemService : ISubsystemService private readonly IWellService wellService; private readonly IDetectedOperationService detectedOperationService; - private readonly ITelemetryDataSaubService telemetryDataSaubService; private IDictionary subsystems = new Dictionary(); public SubsystemService(ICrudRepository subsystemRepository, IWellService wellService, - IDetectedOperationService detectedOperationService, - ITelemetryDataSaubService telemetryDataSaubService) + IDetectedOperationService detectedOperationService) { this.wellService = wellService; this.subsystemRepository = subsystemRepository; this.detectedOperationService = detectedOperationService; - this.telemetryDataSaubService = telemetryDataSaubService; } public async Task> GetStatAsync(SubsystemRequest request, CancellationToken token) @@ -45,10 +42,13 @@ 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"); + if(!well.IdTelemetry.HasValue) + return Enumerable.Empty(); + var detectedOperationSummaryRequest = new DetectedOperationRequest { IdWell = request.IdWell, - IdsTelemetries = new[] { well.IdTelemetry!.Value }, + IdsTelemetries = new[] { well.IdTelemetry.Value }, IdsCategories = WellOperationCategory.MechanicalDrillingSubIds, GeDateStart = request.GeDate, From b8b55c334a2fe1dd5f9d59789929b9b792d6130b Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Tue, 26 Dec 2023 09:21:36 +0500 Subject: [PATCH 44/51] Fix TelemetryDataSaubService.GetTelemetryDataStatAsync(). increase db command timeout. --- .../Services/SAUB/TelemetryDataSaubService.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs index 2fbc78ad..d918f384 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs @@ -39,6 +39,8 @@ namespace AsbCloudInfrastructure.Services.SAUB var timezoneOffset = TimeSpan.FromHours(timezone.Hours); int[] modes = new int[] { 0, 1, 3 }; + db.Database.SetCommandTimeout(TimeSpan.FromMinutes(1.5)); + var query = db.Set() .Where(t => t.IdTelemetry == idTelemetry) .Where(t => t.BlockPosition > 0.0001) From 36c6ffb0e4e30bd332fbf948b6592a14285a5aa7 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 26 Dec 2023 12:10:50 +0500 Subject: [PATCH 45/51] =?UTF-8?q?=D0=9C=D0=B8=D0=B3=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F:=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B2=20=D0=91=D0=94=20(?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D0=B9=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20well=5Foperations)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...e_WellOperation_set_Categories.Designer.cs | 9115 +++++++++++++++++ ...date_Table_WellOperation_set_Categories.cs | 21 + 2 files changed, 9136 insertions(+) create mode 100644 AsbCloudDb/Migrations/20231226070850_Update_Table_WellOperation_set_Categories.Designer.cs create mode 100644 AsbCloudDb/Migrations/20231226070850_Update_Table_WellOperation_set_Categories.cs diff --git a/AsbCloudDb/Migrations/20231226070850_Update_Table_WellOperation_set_Categories.Designer.cs b/AsbCloudDb/Migrations/20231226070850_Update_Table_WellOperation_set_Categories.Designer.cs new file mode 100644 index 00000000..c95d01b9 --- /dev/null +++ b/AsbCloudDb/Migrations/20231226070850_Update_Table_WellOperation_set_Categories.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("20231226070850_Update_Table_WellOperation_set_Categories")] + partial class Update_Table_WellOperation_set_Categories + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.7") + .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/20231226070850_Update_Table_WellOperation_set_Categories.cs b/AsbCloudDb/Migrations/20231226070850_Update_Table_WellOperation_set_Categories.cs new file mode 100644 index 00000000..be2a9a71 --- /dev/null +++ b/AsbCloudDb/Migrations/20231226070850_Update_Table_WellOperation_set_Categories.cs @@ -0,0 +1,21 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class Update_Table_WellOperation_set_Categories : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.Sql + (@"UPDATE public.t_well_operation SET id_category=5010 WHERE id_category=4004; " + + @"UPDATE public.t_well_operation SET id_category=5019 WHERE id_category=4007; "); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} From 7e9c0d51c8c43f941dcf2b4734f52ca2a3aa6b16 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, 26 Dec 2023 12:12:14 +0500 Subject: [PATCH 46/51] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D1=80=D0=BE=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/DependencyInjection.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 8db9e42c..88ef1f45 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -242,7 +242,8 @@ namespace AsbCloudInfrastructure new CrudCacheRepositoryBase( s.GetRequiredService(), s.GetRequiredService(), - dbSet => dbSet.Include(d => d.Clusters))); + dbSet => dbSet.Include(d => d.Clusters) + .ThenInclude(c => c.Wells))); services.AddTransient, CrudCacheRepositoryBase>(s => new CrudCacheRepositoryBase( s.GetRequiredService(), From 4c3f638bfba7e9255f94a75bc56dec390a72ad56 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Tue, 26 Dec 2023 14:03:31 +0500 Subject: [PATCH 47/51] Fix DetectedOperationExportService.ExportAsync exception type/text --- .../DetectedOperationExportService.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs index a94726c1..b70f8cd4 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs @@ -12,6 +12,7 @@ using AsbCloudApp.Data.DetectedOperation; using AsbCloudInfrastructure.Services.DetectOperations.Detectors; using AsbCloudApp.Repositories; using Microsoft.AspNetCore.Http.Extensions; +using AsbCloudApp.Exceptions; namespace AsbCloudInfrastructure.Services.DetectOperations; @@ -57,21 +58,21 @@ public class DetectedOperationExportService /// хост /// /// - /// + /// public async Task ExportAsync(int idWell, string host, CancellationToken cancellationToken) { - var well = await dbContext.Wells + var well = await dbContext.Set() .Include(w => w.Cluster) .ThenInclude(c => c.Deposit) - .SingleOrDefaultAsync(w => w.Id == idWell, cancellationToken); + .FirstOrDefaultAsync(w => w.Id == idWell, cancellationToken); if (well is null) - throw new ArgumentNullException(nameof(well)); + throw new ArgumentInvalidException(nameof(idWell), $"Well {idWell} does not exist"); if (!well.IdTelemetry.HasValue) - throw new ArgumentNullException(nameof(well)); + throw new ArgumentInvalidException(nameof(idWell), $"Well {idWell} has no telemetry"); - var operations = await DetectOperationsAsync(well.IdTelemetry.Value, DateTime.UnixEpoch, cancellationToken); + var operations = await DetectOperationsAsync(well.IdTelemetry.Value, DateTime.UnixEpoch, cancellationToken); return await GenerateExcelFileStreamAsync(well, host, operations, cancellationToken); } From d950e487fa3b005889c07db6aa78e1209a8e2c98 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Tue, 26 Dec 2023 14:04:02 +0500 Subject: [PATCH 48/51] WellService.GetWellTreeAsync add companies --- AsbCloudApp/Data/WellMapInfoDto.cs | 7 +++++++ AsbCloudInfrastructure/Services/WellService.cs | 1 + 2 files changed, 8 insertions(+) diff --git a/AsbCloudApp/Data/WellMapInfoDto.cs b/AsbCloudApp/Data/WellMapInfoDto.cs index 5f6ca5a7..a677a1e3 100644 --- a/AsbCloudApp/Data/WellMapInfoDto.cs +++ b/AsbCloudApp/Data/WellMapInfoDto.cs @@ -1,5 +1,7 @@ using AsbCloudApp.Data.SAUB; using System; +using System.Collections.Generic; +using System.Linq; namespace AsbCloudApp.Data { @@ -37,6 +39,11 @@ namespace AsbCloudApp.Data /// Дата полседнего получения данных от станции контроля параметров цементирования (СКЦ) /// public DateTime? LastDataCpmsDate { get; set; } + + /// + /// Компании + /// + public IEnumerable Companies { get; set; } = Enumerable.Empty(); } /// diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 6a805560..befa8851 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -97,6 +97,7 @@ namespace AsbCloudInfrastructure.Services dto ??= well.Adapt(); dto.Latitude ??= gCluster.Key.Latitude ?? gDeposit.Key.Latitude; dto.Longitude ??= gCluster.Key.Longitude ?? gDeposit.Key.Longitude; + dto.Companies = well.RelationCompaniesWells.Select(r => Convert(r.Company)); return dto; }), }), From 1d3294e799210c619e686d07c3af4a082beb620f Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 26 Dec 2023 14:31:20 +0500 Subject: [PATCH 49/51] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80:=20=D0=BE=D0=B4=D0=B8=D0=BD=20=D1=8D=D0=BA=D1=88?= =?UTF-8?q?=D0=BD,=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2?= =?UTF-8?q?=20=D0=BA=D0=B0=D1=87=D0=B5=D1=81=D1=82=D0=B2=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=B0=20=D0=B2=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20CreateReportAsync.=20=D0=92?= =?UTF-8?q?=D0=BD=D1=83=D1=82=D1=80=D0=B8=20=D1=8D=D0=BA=D1=88=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=B7=D1=8B=D0=B2=D0=B0=D1=8E=D1=82=D1=81=D1=8F?= =?UTF-8?q?=202=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0:=20onProgress=20?= =?UTF-8?q?=D0=B8=20progressHandler.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/ReportProgressDto.cs | 5 +++++ AsbCloudApp/Services/IReportService.cs | 3 ++- .../Background/WorkToCreateReport.cs | 12 ++++++++++-- AsbCloudInfrastructure/Services/ReportService.cs | 6 +++--- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/AsbCloudApp/Data/ReportProgressDto.cs b/AsbCloudApp/Data/ReportProgressDto.cs index c7bf4cbb..5a271180 100644 --- a/AsbCloudApp/Data/ReportProgressDto.cs +++ b/AsbCloudApp/Data/ReportProgressDto.cs @@ -5,6 +5,11 @@ /// public class ReportProgressDto { + /// + /// файл + /// + public FileInfoDto file { get; set; } + /// /// прогресс 0 - 100% /// diff --git a/AsbCloudApp/Services/IReportService.cs b/AsbCloudApp/Services/IReportService.cs index 994db83a..283e27ee 100644 --- a/AsbCloudApp/Services/IReportService.cs +++ b/AsbCloudApp/Services/IReportService.cs @@ -27,13 +27,14 @@ namespace AsbCloudApp.Services /// /// Создание отчета /// + /// /// /// /// /// /// /// - Task CreateReportAsync(int idWell, int idUser, ReportParametersRequest request, Action progressHandler, CancellationToken token); + Task CreateReportAsync(string workId, int idWell, int idUser, ReportParametersRequest request, Action progressHandler, CancellationToken token); /// /// Получить предполагаемый список страниц рапорта diff --git a/AsbCloudInfrastructure/Background/WorkToCreateReport.cs b/AsbCloudInfrastructure/Background/WorkToCreateReport.cs index 4100634d..671dff65 100644 --- a/AsbCloudInfrastructure/Background/WorkToCreateReport.cs +++ b/AsbCloudInfrastructure/Background/WorkToCreateReport.cs @@ -1,4 +1,5 @@ -using AsbCloudApp.Requests; +using AsbCloudApp.Data; +using AsbCloudApp.Requests; using AsbCloudApp.Services; using Microsoft.Extensions.DependencyInjection; using System; @@ -23,13 +24,20 @@ namespace AsbCloudInfrastructure.Background this.idUser = idUser; this.request = request; this.progressHandler = progressHandler; + + Id = $"create report by wellid:{idWell} for userid:{idUser} requested at {DateTime.Now}"; } protected override async Task Action(string id, IServiceProvider services, Action onProgress, CancellationToken token) { var reportService = services.GetRequiredService(); - await reportService.CreateReportAsync(idWell, idUser, request, progressHandler, token); + Action handler = (state, workId) => + { + onProgress?.Invoke(state.Operation ?? string.Empty, state.Progress); + progressHandler?.Invoke(state, workId); + }; + await reportService.CreateReportAsync(Id, idWell, idUser, request, handler, token); } } } diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index 795be62a..99ee490b 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -117,13 +117,13 @@ public class ReportService : IReportService public async Task CreateReportAsync( + string workId, int idWell, int idUser, ReportParametersRequest request, - Action progressHandler, + Action progressHandler, CancellationToken token) { - var workId = $"create report by wellid:{idWell} for userid:{idUser} requested at {DateTime.Now}"; var timezoneOffset = wellService.GetTimezone(idWell).Hours; var beginRemote = request.Begin.ToTimeZoneOffsetHours(timezoneOffset); var endRemote = request.End.ToTimeZoneOffsetHours(timezoneOffset); @@ -150,7 +150,7 @@ public class ReportService : IReportService var fileInfo = (await fileService.MoveAsync(idWell, idUser, ReportCategoryId, reportFileName, reportFileName, token))!; - progressHandler(new + progressHandler(new ReportProgressDto() { Operation = "done", Progress = 100f, From 617a529780e2ec9d1f8e0493a4e3e0fe6a3f40f3 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 27 Dec 2023 09:38:00 +0500 Subject: [PATCH 50/51] =?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=D0=BF=D0=BE=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B0=D0=BC=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/Progress/ProgressDto.cs | 19 +++++++++++ .../Data/Progress/ReportProgressDto.cs | 13 ++++++++ .../Data/Progress/ReportProgressFinalDto.cs | 18 ++++++++++ AsbCloudApp/Data/ReportProgressDto.cs | 33 ------------------- AsbCloudApp/Services/IReportService.cs | 3 +- .../Background/WorkToCreateReport.cs | 4 +-- .../Services/ReportService.cs | 5 +-- 7 files changed, 57 insertions(+), 38 deletions(-) create mode 100644 AsbCloudApp/Data/Progress/ProgressDto.cs create mode 100644 AsbCloudApp/Data/Progress/ReportProgressDto.cs create mode 100644 AsbCloudApp/Data/Progress/ReportProgressFinalDto.cs delete mode 100644 AsbCloudApp/Data/ReportProgressDto.cs diff --git a/AsbCloudApp/Data/Progress/ProgressDto.cs b/AsbCloudApp/Data/Progress/ProgressDto.cs new file mode 100644 index 00000000..601268ca --- /dev/null +++ b/AsbCloudApp/Data/Progress/ProgressDto.cs @@ -0,0 +1,19 @@ +namespace AsbCloudApp.Data.Progress +{ + /// + /// DTO прогресса + /// + public class ProgressDto + { + /// + /// прогресс 0 - 100% + /// + public float Progress { get; set; } + + /// + /// название текущей операции генерации + /// + public string? Operation { get; set; } + + } +} diff --git a/AsbCloudApp/Data/Progress/ReportProgressDto.cs b/AsbCloudApp/Data/Progress/ReportProgressDto.cs new file mode 100644 index 00000000..00db12a8 --- /dev/null +++ b/AsbCloudApp/Data/Progress/ReportProgressDto.cs @@ -0,0 +1,13 @@ +namespace AsbCloudApp.Data.Progress +{ + /// + /// DTO завершенного прогресса генерации рапорта-диаграммы + /// + public class ReportProgressFinalDto : ReportProgressDto + { + /// + /// файл + /// + public FileInfoDto file { get; set; } + } +} diff --git a/AsbCloudApp/Data/Progress/ReportProgressFinalDto.cs b/AsbCloudApp/Data/Progress/ReportProgressFinalDto.cs new file mode 100644 index 00000000..29956546 --- /dev/null +++ b/AsbCloudApp/Data/Progress/ReportProgressFinalDto.cs @@ -0,0 +1,18 @@ +namespace AsbCloudApp.Data.Progress +{ + /// + /// DTO прогресса генерации рапорта-диаграммы + /// + public class ReportProgressDto : ProgressDto + { + /// + /// номер текущей страницы + /// + public int CurrentPage { get; set; } + + /// + /// предполагаемое суммарное количество страниц + /// + public int TotalPages { get; set; } + } +} diff --git a/AsbCloudApp/Data/ReportProgressDto.cs b/AsbCloudApp/Data/ReportProgressDto.cs deleted file mode 100644 index 5a271180..00000000 --- a/AsbCloudApp/Data/ReportProgressDto.cs +++ /dev/null @@ -1,33 +0,0 @@ -namespace AsbCloudApp.Data -{ - /// - /// DTO прогресса генерации рапорта-диаграммы - /// - public class ReportProgressDto - { - /// - /// файл - /// - public FileInfoDto file { get; set; } - - /// - /// прогресс 0 - 100% - /// - public float Progress { get; set; } - - /// - /// название текущей операции генерации - /// - public string? Operation { get; set; } - - /// - /// номер текущей страницы - /// - public int CurrentPage { get; set; } - - /// - /// предполагаемое суммарное количество страниц - /// - public int TotalPages { get; set; } - } -} diff --git a/AsbCloudApp/Services/IReportService.cs b/AsbCloudApp/Services/IReportService.cs index 283e27ee..5f992a20 100644 --- a/AsbCloudApp/Services/IReportService.cs +++ b/AsbCloudApp/Services/IReportService.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.Progress; using AsbCloudApp.Requests; using System; using System.Collections.Generic; @@ -34,7 +35,7 @@ namespace AsbCloudApp.Services /// /// /// - Task CreateReportAsync(string workId, int idWell, int idUser, ReportParametersRequest request, Action progressHandler, CancellationToken token); + Task CreateReportAsync(string workId, int idWell, int idUser, ReportParametersRequest request, Action progressHandler, CancellationToken token); /// /// Получить предполагаемый список страниц рапорта diff --git a/AsbCloudInfrastructure/Background/WorkToCreateReport.cs b/AsbCloudInfrastructure/Background/WorkToCreateReport.cs index 671dff65..3381f033 100644 --- a/AsbCloudInfrastructure/Background/WorkToCreateReport.cs +++ b/AsbCloudInfrastructure/Background/WorkToCreateReport.cs @@ -1,4 +1,4 @@ -using AsbCloudApp.Data; +using AsbCloudApp.Data.Progress; using AsbCloudApp.Requests; using AsbCloudApp.Services; using Microsoft.Extensions.DependencyInjection; @@ -32,7 +32,7 @@ namespace AsbCloudInfrastructure.Background protected override async Task Action(string id, IServiceProvider services, Action onProgress, CancellationToken token) { var reportService = services.GetRequiredService(); - Action handler = (state, workId) => + Action handler = (state, workId) => { onProgress?.Invoke(state.Operation ?? string.Empty, state.Progress); progressHandler?.Invoke(state, workId); diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index 99ee490b..59fd97ea 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.Progress; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; @@ -121,7 +122,7 @@ public class ReportService : IReportService int idWell, int idUser, ReportParametersRequest request, - Action progressHandler, + Action progressHandler, CancellationToken token) { var timezoneOffset = wellService.GetTimezone(idWell).Hours; @@ -150,7 +151,7 @@ public class ReportService : IReportService var fileInfo = (await fileService.MoveAsync(idWell, idUser, ReportCategoryId, reportFileName, reportFileName, token))!; - progressHandler(new ReportProgressDto() + progressHandler(new ReportProgressFinalDto() { Operation = "done", Progress = 100f, From 4c97c6459414cb653b54f9a7123270165d62c994 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 27 Dec 2023 13:07:41 +0500 Subject: [PATCH 51/51] =?UTF-8?q?Report*=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/Progress/ProgressDto.cs | 25 +++++---- .../Data/Progress/ProgressExceptionDto.cs | 29 ++++++++++ .../Data/Progress/ReportProgressDto.cs | 17 +++--- .../Data/Progress/ReportProgressFinalDto.cs | 25 +++++---- .../Background/WorkToCreateReport.cs | 54 +++++++++---------- .../Services/ReportService.cs | 19 +++---- 6 files changed, 97 insertions(+), 72 deletions(-) create mode 100644 AsbCloudApp/Data/Progress/ProgressExceptionDto.cs diff --git a/AsbCloudApp/Data/Progress/ProgressDto.cs b/AsbCloudApp/Data/Progress/ProgressDto.cs index 601268ca..3ad2c50a 100644 --- a/AsbCloudApp/Data/Progress/ProgressDto.cs +++ b/AsbCloudApp/Data/Progress/ProgressDto.cs @@ -1,19 +1,18 @@ -namespace AsbCloudApp.Data.Progress +namespace AsbCloudApp.Data.Progress; + +/// +/// DTO прогресса +/// +public class ProgressDto { /// - /// DTO прогресса + /// прогресс 0 - 100% /// - public class ProgressDto - { - /// - /// прогресс 0 - 100% - /// - public float Progress { get; set; } + public float Progress { get; set; } - /// - /// название текущей операции генерации - /// - public string? Operation { get; set; } + /// + /// название текущей операции генерации + /// + public string? Operation { get; set; } - } } diff --git a/AsbCloudApp/Data/Progress/ProgressExceptionDto.cs b/AsbCloudApp/Data/Progress/ProgressExceptionDto.cs new file mode 100644 index 00000000..cb264178 --- /dev/null +++ b/AsbCloudApp/Data/Progress/ProgressExceptionDto.cs @@ -0,0 +1,29 @@ +using System; + +namespace AsbCloudApp.Data.Progress; + +/// +/// DTO прогресса с ошибкой +/// +public class ProgressExceptionDto +{ + /// + /// прогресс 0 - 100% + /// + public float Progress { get; set; } + + /// + /// название текущей операции генерации + /// + public string? Operation { get; set; } + + /// + /// Отображаемый текст ошибки + /// + public string Message { get; set; } = null!; + + /// + /// Инфо об исключении + /// + public Exception Exception { get; set; } = null!; +} \ No newline at end of file diff --git a/AsbCloudApp/Data/Progress/ReportProgressDto.cs b/AsbCloudApp/Data/Progress/ReportProgressDto.cs index 00db12a8..b14166e9 100644 --- a/AsbCloudApp/Data/Progress/ReportProgressDto.cs +++ b/AsbCloudApp/Data/Progress/ReportProgressDto.cs @@ -1,13 +1,12 @@ -namespace AsbCloudApp.Data.Progress +namespace AsbCloudApp.Data.Progress; + +/// +/// DTO завершенного прогресса генерации рапорта-диаграммы +/// +public class ReportProgressFinalDto : ReportProgressDto { /// - /// DTO завершенного прогресса генерации рапорта-диаграммы + /// файл /// - public class ReportProgressFinalDto : ReportProgressDto - { - /// - /// файл - /// - public FileInfoDto file { get; set; } - } + public FileInfoDto file { get; set; } } diff --git a/AsbCloudApp/Data/Progress/ReportProgressFinalDto.cs b/AsbCloudApp/Data/Progress/ReportProgressFinalDto.cs index 29956546..b5ce965a 100644 --- a/AsbCloudApp/Data/Progress/ReportProgressFinalDto.cs +++ b/AsbCloudApp/Data/Progress/ReportProgressFinalDto.cs @@ -1,18 +1,17 @@ -namespace AsbCloudApp.Data.Progress +namespace AsbCloudApp.Data.Progress; + +/// +/// DTO прогресса генерации рапорта-диаграммы +/// +public class ReportProgressDto : ProgressDto { /// - /// DTO прогресса генерации рапорта-диаграммы + /// номер текущей страницы /// - public class ReportProgressDto : ProgressDto - { - /// - /// номер текущей страницы - /// - public int CurrentPage { get; set; } + public int CurrentPage { get; set; } - /// - /// предполагаемое суммарное количество страниц - /// - public int TotalPages { get; set; } - } + /// + /// предполагаемое суммарное количество страниц + /// + public int TotalPages { get; set; } } diff --git a/AsbCloudInfrastructure/Background/WorkToCreateReport.cs b/AsbCloudInfrastructure/Background/WorkToCreateReport.cs index 3381f033..f07e7f85 100644 --- a/AsbCloudInfrastructure/Background/WorkToCreateReport.cs +++ b/AsbCloudInfrastructure/Background/WorkToCreateReport.cs @@ -6,38 +6,36 @@ using System; using System.Threading; using System.Threading.Tasks; -namespace AsbCloudInfrastructure.Background +namespace AsbCloudInfrastructure.Background; + +/// +/// Класс для создания отчета +/// +internal class WorkToCreateReport : Work { - /// - /// Класс для создания отчета - /// - internal class WorkToCreateReport : Work + private readonly int idWell; + private readonly int idUser; + private readonly ReportParametersRequest request; + private readonly Action progressHandler; + + public WorkToCreateReport(int idWell, int idUser, ReportParametersRequest request, Action progressHandler) : base("") { - private int idWell; - private int idUser; - private ReportParametersRequest request; - private Action progressHandler; + this.idWell = idWell; + this.idUser = idUser; + this.request = request; + this.progressHandler = progressHandler; - public WorkToCreateReport(int idWell, int idUser, ReportParametersRequest request, Action progressHandler) : base("") + Id = $"create report by wellid:{idWell} for userid:{idUser} requested at {DateTime.Now}"; + } + + protected override async Task Action(string id, IServiceProvider services, Action onProgress, CancellationToken token) + { + var reportService = services.GetRequiredService(); + void handler(ProgressDto state, string workId) { - this.idWell = idWell; - this.idUser = idUser; - this.request = request; - this.progressHandler = progressHandler; - - Id = $"create report by wellid:{idWell} for userid:{idUser} requested at {DateTime.Now}"; - } - - - protected override async Task Action(string id, IServiceProvider services, Action onProgress, CancellationToken token) - { - var reportService = services.GetRequiredService(); - Action handler = (state, workId) => - { - onProgress?.Invoke(state.Operation ?? string.Empty, state.Progress); - progressHandler?.Invoke(state, workId); - }; - await reportService.CreateReportAsync(Id, idWell, idUser, request, handler, token); + onProgress(state.Operation ?? string.Empty, state.Progress); + progressHandler(state, workId); } + await reportService.CreateReportAsync(Id, idWell, idUser, request, handler, token); } } diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index 59fd97ea..3b7199a9 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -41,16 +41,18 @@ public class ReportService : IReportService { var work = new WorkToCreateReport(idWell, idUser, request, progressHandler); - work.OnErrorAsync = (message, exception, token) => Task.Run(() => progressHandler.Invoke(new - { - Operation = "error", - Progress = 100f, - Message = string.IsNullOrEmpty(message) + work.OnErrorAsync = (message, exception, token) => Task.Run(() => { + var state = new ProgressExceptionDto + { + Operation = "error", + Progress = 100f, + Message = string.IsNullOrEmpty(message) ? exception.Message : message, - Exception = exception, - }, work.Id) - , token); + Exception = exception, + }; + progressHandler.Invoke(state, work.Id); + }, token); backgroundWorkerService.Enqueue(work); @@ -116,7 +118,6 @@ public class ReportService : IReportService return dtos; } - public async Task CreateReportAsync( string workId, int idWell,