using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Data.Common; #nullable disable namespace AsbCloudDb.Model { //Scaffold-DbContext "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True" Npgsql.EntityFrameworkCore.PostgreSQL -OutputDir Model -DataAnnotations public partial class AsbCloudDbContext : DbContext, IAsbCloudDbContext { public virtual DbSet Clusters { get; set; } public virtual DbSet Companies { get; set; } public virtual DbSet DataSaubBases { get; set; } public virtual DbSet Deposits { get; set; } public virtual DbSet FileCategories { get; set; } public virtual DbSet Files { get; set; } public virtual DbSet Measures { get; set; } public virtual DbSet MeasureCategories { get; set; } public virtual DbSet ReportProperties { get; set; } public virtual DbSet Telemetries { get; set; } public virtual DbSet TelemetryAnalysis { get; set; } public virtual DbSet TelemetryEvents { get; set; } public virtual DbSet TelemetryMessages { get; set; } public virtual DbSet TelemetryUsers { get; set; } public virtual DbSet Users { get; set; } public virtual DbSet UserRoles { get; set; } public virtual DbSet Wells { get; set; } public virtual DbSet WellOperations { get; set; } public virtual DbSet TelemetryOperations { get; set; } public virtual DbSet WellSectionTypes { get; set; } public virtual DbSet WellTypes { get; set; } //var options = new DbContextOptionsBuilder() // .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True") // .Options; //var context = new AsbCloudDbContext(options); public AsbCloudDbContext(DbContextOptions options) : base(options) { Database.EnsureCreated(); } //protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) //{ // if (!optionsBuilder.IsConfigured) // { // optionsBuilder.UseNpgsql(connectionString); // } //} protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasPostgresExtension("adminpack") .HasAnnotation("Relational:Collation", "Russian_Russia.1251"); modelBuilder.Entity(entity => { entity.HasOne(d => d.Deposit) .WithMany(p => p.Clusters) .HasForeignKey(d => d.IdDeposit) .HasConstraintName("t_cluster_t_deposit_id_fk"); }); modelBuilder.Entity(entity => { entity.HasOne(d => d.Telemetry) .WithMany(p => p.DataSaubBases) .HasForeignKey(d => d.IdTelemetry) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("t_data_saub_base_t_telemetry_id_fk"); }); modelBuilder.Entity(entity => { entity.HasOne(d => d.Telemetry) .WithMany(p => p.Messages) .HasForeignKey(d => d.IdTelemetry) .HasConstraintName("t_messages_t_telemetry_id_fk"); }); modelBuilder.Entity(entity => { entity.HasKey(nameof(TelemetryUser.IdTelemetry), nameof(TelemetryUser.IdUser)); entity.HasOne(d => d.Telemetry) .WithMany(p => p.Users) .HasForeignKey(d => d.IdTelemetry) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); }); modelBuilder.Entity(entity => { entity.HasOne(d => d.Telemetry) .WithMany(p => p.Analysis) .HasForeignKey(d => d.IdTelemetry) .HasConstraintName("t_analysis_t_telemetry_id_fk"); entity.HasOne(d => d.Operation) .WithMany(p => p.Analysis) .HasForeignKey(d => d.IdOperation) .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("t_analysis_t_operation_id_fk"); }); modelBuilder.Entity(entity => { entity.HasKey(nameof(TelemetryEvent.IdTelemetry), nameof(TelemetryEvent.IdEvent)); entity.HasOne(d => d.Telemetry) .WithMany(p => p.Events) .HasForeignKey(d => d.IdTelemetry) .HasConstraintName("t_event_t_telemetry_id_fk"); }); modelBuilder.Entity(entity => { entity.HasOne(d => d.Company) .WithMany(p => p.Users) .HasForeignKey(d => d.IdCompany) .HasConstraintName("t_user_t_company_id_fk"); entity.HasIndex(d => d.Login) .IsUnique(); }); modelBuilder.Entity(entity => { entity.HasOne(d => d.Cluster) .WithMany(p => p.Wells) .HasForeignKey(d => d.IdCluster) .HasConstraintName("t_well_t_cluster_id_fk"); entity.HasOne(d => d.Telemetry) .WithOne(p => p.Well) .HasForeignKey(d => d.IdTelemetry) .HasConstraintName("t_well_t_telemetry_id_fk"); }); modelBuilder.Entity(entity => { entity.HasKey(nameof(RelationCompanyWell.IdCompany), nameof(RelationCompanyWell.IdWell)); entity.HasOne(r => r.Well) .WithMany(w => w.RelationCompaniesWells) .HasForeignKey(r => r.IdWell) .HasConstraintName("t_relation_company_well_t_well_id_fk"); entity.HasOne(r => r.Company) .WithMany(w => w.RelationCompaniesWells) .HasForeignKey(r => r.IdCompany) .HasConstraintName("t_relation_company_well_t_company_id_fk"); }); modelBuilder.Entity(entity => { entity.HasIndex(d => d.WellDepth); entity.HasIndex(d => d.StartDate); }); FillData(modelBuilder); FillDemoData(modelBuilder); } private static void FillData(ModelBuilder modelBuilder) { modelBuilder.Entity(entity => { entity.HasData(new List{ new UserRole{ Id = 1, Caption = "Администратор", }, }); }); modelBuilder.Entity(entity => { entity.HasData(new List{ new User{ Id = 1, IdCompany = 1, IdRole = 1, Level = int.MaxValue, Login = "dev", PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072", // dev Name = "Разработчик", }, }); }); modelBuilder.Entity(entity => { entity.HasData(new List{ new Company{ Id = 1, Caption = "ООО \"АСБ\"", IdCompanyType = 3}, }); }); modelBuilder.Entity(entity => { entity.HasData(new List { // Автоматически опеределяемые операции new WellOperationCategory {Id = 1, Name = "Невозможно определить операцию", Code = 0}, new WellOperationCategory {Id = 2, Name = "Роторное бурение", Code = 0 }, new WellOperationCategory {Id = 3, Name = "Слайдирование", Code = 0 }, new WellOperationCategory {Id = 4, Name = "Подъем с проработкой", Code = 0 }, new WellOperationCategory {Id = 5, Name = "Спуск с проработкой", Code = 0 }, new WellOperationCategory {Id = 6, Name = "Подъем с промывкой", Code = 0 }, new WellOperationCategory {Id = 7, Name = "Спуск с промывкой", Code = 0 }, new WellOperationCategory {Id = 8, Name = "Спуск в скважину", Code = 0 }, new WellOperationCategory {Id = 9, Name = "Спуск с вращением", Code = 0 }, new WellOperationCategory {Id = 10, Name = "Подъем из скважины", Code = 0 }, new WellOperationCategory {Id = 11, Name = "Подъем с вращением", Code = 0 }, new WellOperationCategory {Id = 12, Name = "Промывка в покое", Code = 0 }, new WellOperationCategory {Id = 13, Name = "Промывка с вращением", Code = 0 }, new WellOperationCategory {Id = 14, Name = "Удержание в клиньях", Code = 0 }, new WellOperationCategory {Id = 15, Name = "Неподвижное состояние", Code = 0 }, new WellOperationCategory {Id = 16, Name = "Вращение без циркуляции", Code = 0 }, new WellOperationCategory {Id = 17, Name = "На поверхности", Code = 0 }, // Операции ручного ввода new WellOperationCategory {Id = 1001, Name = "Бурение в интервале", Code = 0 }, new WellOperationCategory {Id = 1002, Name = "ГИС", Code = 0 }, new WellOperationCategory {Id = 1003, Name = "ГФР", Code = 0 }, new WellOperationCategory {Id = 1004, Name = "Монтаж ПВО", Code = 0 }, new WellOperationCategory {Id = 1005, Name = "Демонтаж ПВО", Code = 0 }, new WellOperationCategory {Id = 1006, Name = "Установка ФА", Code = 0 }, new WellOperationCategory {Id = 1007, Name = "Оборудование устья", Code = 0 }, new WellOperationCategory {Id = 1008, Name = "ОЗЦ", Code = 0 }, new WellOperationCategory {Id = 1009, Name = "Оборудование устья", Code = 0 }, new WellOperationCategory {Id = 1010, Name = "ОЗЦ", Code = 0 }, new WellOperationCategory {Id = 1011, Name = "Начало цикла строительства скважины", Code = 0 }, new WellOperationCategory {Id = 1012, Name = "Окончание цикла строительства скважины", Code = 0 }, new WellOperationCategory {Id = 1013, Name = "Опрессовка ПВО", Code = 0 }, new WellOperationCategory {Id = 1014, Name = "Опресовка Ц.К.", Code = 0 }, new WellOperationCategory {Id = 1015, Name = "Опрессовка ВЗД", Code = 0 }, new WellOperationCategory {Id = 1016, Name = "Перевод скв на другой тип промывочной жидкости", Code = 0 }, new WellOperationCategory {Id = 1017, Name = "Перезапись каротажа", Code = 0 }, new WellOperationCategory {Id = 1018, Name = "Перетяжка талевого каната", Code = 0 }, new WellOperationCategory {Id = 1019, Name = "Перетяжка тальканата", Code = 0 }, new WellOperationCategory {Id = 1020, Name = "Подъем инструмента", Code = 0 }, new WellOperationCategory {Id = 1021, Name = "Подъем инструмента с промывкой", Code = 0 }, new WellOperationCategory {Id = 1022, Name = "Обратная проработка", Code = 0 }, new WellOperationCategory {Id = 1023, Name = "Сборка инструмента", Code = 0 }, new WellOperationCategory {Id = 1024, Name = "Подготовительные работы", Code = 0 }, new WellOperationCategory {Id = 1025, Name = "Сборка КНБК", Code = 0 }, new WellOperationCategory {Id = 1026, Name = "Разборка КНБК", Code = 0 }, new WellOperationCategory {Id = 1027, Name = "Промывка", Code = 0 }, new WellOperationCategory {Id = 1028, Name = "Промежуточная промывка", Code = 0 }, new WellOperationCategory {Id = 1029, Name = "Прокачка пачек", Code = 0 }, new WellOperationCategory {Id = 1030, Name = "Разбуривание тех.оснастки", Code = 0 }, new WellOperationCategory {Id = 1031, Name = "Ремонт", Code = 0 }, new WellOperationCategory {Id = 1032, Name = "Спуск инструмента", Code = 0 }, new WellOperationCategory {Id = 1033, Name = "Спуск инструмента с промывкой", Code = 0 }, new WellOperationCategory {Id = 1034, Name = "Прямая проработка", Code = 0 }, new WellOperationCategory {Id = 1035, Name = "Принудительная проработка", Code = 0 }, new WellOperationCategory {Id = 1036, Name = "Спуск обсадной колонны", Code = 0 }, new WellOperationCategory {Id = 1037, Name = "Тех СПО-подъем", Code = 0 }, new WellOperationCategory {Id = 1038, Name = "Тех СПО-спуск", Code = 0 }, new WellOperationCategory {Id = 1039, Name = "Техническое обслуживание", Code = 0 }, new WellOperationCategory {Id = 1040, Name = "Цементаж", Code = 0 }, new WellOperationCategory {Id = 1041, Name = "Шаблонировка ствола", Code = 0 }, new WellOperationCategory {Id = 1042, Name = "Геологическое осложнение", Code = 0 }, new WellOperationCategory {Id = 1043, Name = "НПВ", Code = 0 }, new WellOperationCategory {Id = 1044, Name = "ВМР", Code = 0 }, new WellOperationCategory {Id = 1045, Name = "Прочее", Code = 0 }, new WellOperationCategory {Id = 1046, Name = "Спуск КНБК", Code = 0 }, new WellOperationCategory {Id = 1047, Name = "Подъем КНБК", Code = 0 }, new WellOperationCategory {Id = 1048, Name = "Спуск ОК", Code = 0 } }); }); modelBuilder.Entity(entity => { entity.HasData(new List { new FileCategory {Id = 1, Name = "Растворный сервис", ShortName = "fluidService"}, new FileCategory {Id = 2, Name = "Цементирование", ShortName = "cement"}, new FileCategory {Id = 3, Name = "ННБ", ShortName = "nnb"}, new FileCategory {Id = 4, Name = "ГТИ", ShortName = "gti"}, new FileCategory {Id = 5, Name = "Документы по скважине", ShortName = "wellDocuments"}, new FileCategory {Id = 6, Name = "Супервайзер", ShortName = "supervisor"}, new FileCategory {Id = 7, Name = "Мастер", ShortName = "master"}, new FileCategory {Id = 8, Name = "Последний замер бурового раствора ПЛАН", ShortName = "fluidPlanLastData"}, new FileCategory {Id = 9, Name = "Последний замер бурового раствора ФАКТ", ShortName = "fluidFactLastData"}, new FileCategory {Id = 10, Name = "Последние данные Шламограммы", ShortName = "mudLastData"}, new FileCategory {Id = 11, Name = "Последние данные ННБ", ShortName = "nnbLastData"}, new FileCategory {Id = 12, Name = "Рапорт", ShortName = "report"} }); }); modelBuilder.Entity(entity => { entity.HasData(new List{ new WellSectionType{ Id = 1, Caption = "Пилотный ствол"}, new WellSectionType{ Id = 2, Caption = "Направление"}, new WellSectionType{ Id = 3, Caption = "Кондуктор"}, new WellSectionType{ Id = 4, Caption = "Эксплуатационная колонна"}, new WellSectionType{ Id = 5, Caption = "Транспортный ствол"}, new WellSectionType{ Id = 6, Caption = "Хвостовик"}, }); }); modelBuilder.Entity(entity => { entity.HasData(new List { new WellType{ Id = 1, Caption = "Наклонно-направленная"}, new WellType{ Id = 2, Caption = "Горизонтальная"}, }); }); modelBuilder.Entity(entity => { entity.HasData(new List { new MeasureCategory{ Id = 1, Name = "Показатели бурового раствора", ShortName = "Раствор"}, new MeasureCategory{ Id = 2, Name = "Шламограмма", ShortName = "Шламограмма"}, new MeasureCategory{ Id = 3, Name = "ННБ", ShortName = "ННБ"}, }); }); } // Эти данные не должны быть в релизе private static void FillDemoData(ModelBuilder modelBuilder) { modelBuilder.Entity(entity => { entity.HasData(new List{ new CompanyType{ Id = 1, Caption = "Недрапользователь", }, new CompanyType{ Id = 2, Caption = "Буровой подрядчик", }, new CompanyType{ Id = 3, Caption = "Сервис автоматизации бурения", }, }); }); modelBuilder.Entity(entity => { entity.HasData(new List { new Deposit{Id = 1, Caption = "м/р 1", Latitude = 60.8705722222222, Longitude = 70.3811888888889 }, }); }); modelBuilder.Entity(entity => { entity.HasData(new List { new Cluster{Id = 1, Caption = "к39.1", IdDeposit = 1, Latitude = 60.8705722222222, Longitude = 70.3811888888889}, new Cluster{Id = 2, Caption = "к151", IdDeposit = 1, Latitude = 60.8205750000000, Longitude = 70.1343833333334}, new Cluster{Id = 3, Caption = "к611", IdDeposit = 1, Latitude = 60.8100666666667, Longitude = 69.7778388888889}, new Cluster{Id = 4, Caption = "к203", IdDeposit = 1, Latitude = 60.8928805555556, Longitude = 70.3272055555556}, new Cluster{Id = 5, Caption = "к221", IdDeposit = 1, Latitude = 60.6672055555556, Longitude = 69.6603861111111}, }); }); modelBuilder.Entity(entity => { entity.HasData(new List { new Measure{ Id = 1, IdCategory = 1, IdWell = 1, Timestamp = DateTime.Now.AddHours(1), Data = new Dictionary{ {"a", 1 }}}, new Measure{ Id = 2, IdCategory = 1, IdWell = 1, Timestamp = DateTime.Now.AddHours(2), Data = new Dictionary{ {"a", 2 }}}, new Measure{ Id = 3, IdCategory = 2, IdWell = 1, Timestamp = DateTime.Now.AddHours(3), Data = new Dictionary{ {"a", 3 }}}, }); }); modelBuilder.Entity(entity => { entity.HasData(new List{ new Telemetry{ Id = 1, RemoteUid = "123", Info = new TelemetryInfo { Well = "1", Cluster = "1", Comment = "", Deposit = "1", Customer = "1", HmiVersion = "1", PlcVersion = "1", TimeZoneId = "1", DrillingStartDate = DateTime.Parse("2021-06-29T12:01:19.000000"), TimeZoneOffsetTotalHours = 5.0 }, } }); }); modelBuilder.Entity(entity => { entity.HasData(new List { new Well{Id = 1, IdCluster = 1, IdWellType = 1, Caption = "скв 16314", Latitude = 60.8705722222222, Longitude = 70.3811888888889, IdTelemetry = 1, }, new Well{Id = 2, IdCluster = 1, IdWellType = 2, Caption = "скв 16311", Latitude = 60.8705722222222, Longitude = 70.3811888888889}, new Well{Id = 3, IdCluster = 2, IdWellType = 1, Caption = "скв 16315", Latitude = 60.8205750000000, Longitude = 70.1343833333334}, new Well{Id = 4, IdCluster = 2, IdWellType = 1, Caption = "скв 16318", Latitude = 60.8205750000000, Longitude = 70.1343833333334}, new Well{Id = 5, IdCluster = 3, IdWellType = 1, Caption = "скв 16310", Latitude = 60.8100666666667, Longitude = 69.7778388888889}, new Well{Id = 6, IdCluster = 4, IdWellType = 1, Caption = "скв 16316", Latitude = 60.8928805555556, Longitude = 70.3272055555556}, new Well{Id = 7, IdCluster = 5, IdWellType = 1, Caption = "скв 16312", Latitude = 60.6672055555556, Longitude = 69.6603861111111}, new Well{Id = 8, IdCluster = 5, IdWellType = 1, Caption = "скв 16313", Latitude = 60.6672055555556, Longitude = 69.6603861111111}, new Well{Id = 9, IdCluster = 5, IdWellType = 1, Caption = "скв 42669", Latitude = 60.6672055555556, Longitude = 69.6603861111111}, }); }); modelBuilder.Entity(entity => { entity.HasData(new List { new RelationCompanyWell{ IdWell = 1, IdCompany = 1}, new RelationCompanyWell{ IdWell = 2, IdCompany = 1}, new RelationCompanyWell{ IdWell = 3, IdCompany = 1}, new RelationCompanyWell{ IdWell = 4, IdCompany = 1}, new RelationCompanyWell{ IdWell = 5, IdCompany = 1}, new RelationCompanyWell{ IdWell = 6, IdCompany = 1}, new RelationCompanyWell{ IdWell = 7, IdCompany = 1}, new RelationCompanyWell{ IdWell = 8, IdCompany = 1}, new RelationCompanyWell{ IdWell = 9, IdCompany = 1}, }); }); modelBuilder.Entity(entity => { entity.HasData(new List { new WellOperation{ Id = 42222, IdWell = 1, IdWellSectionType = 1, IdCategory = 1027, IdType = 1, WellDepth = 800, StartDate = DateTime.Parse("2021-08-24 18:40"), DurationHours = 3.5}, new WellOperation{ Id = 2003, IdWell = 1, IdWellSectionType = 1, IdCategory = 1047, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-25 11:00"), DurationHours = 3.5}, new WellOperation{ Id = 58186, IdWell = 2, IdWellSectionType = 2, IdCategory = 1047, IdType = 1, WellDepth = 1100, StartDate = DateTime.Parse("2021-08-24 17:30"), DurationHours = 15}, new WellOperation{ Id = 47573, IdWell = 1, IdWellSectionType = 1, IdCategory = 1027, IdType = 0, WellDepth = 800, StartDate = DateTime.Parse("2021-08-24 07:00"), DurationHours = 3.5}, new WellOperation{ Id = 71719, IdWell = 1, IdWellSectionType = 1, IdCategory = 1045, IdType = 1, WellDepth = 1300, StartDate = DateTime.Parse("2021-08-25 12:10"), DurationHours = 3.5}, new WellOperation{ Id = 91686, IdWell = 1, IdWellSectionType = 1, IdCategory = 1046, IdType = 1, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 04:40"), DurationHours = 3.5}, new WellOperation{ Id = 98686, IdWell = 5, IdWellSectionType = 2, IdCategory = 1046, IdType = 1, WellDepth = 800, StartDate = DateTime.Parse("2021-08-24 10:30"), DurationHours = 3.5}, new WellOperation{ Id = 3987, IdWell = 1, IdWellSectionType = 1, IdCategory = 1001, IdType = 0, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 14:00"), DurationHours = 3.5}, new WellOperation{ Id = 44563, IdWell = 1, IdWellSectionType = 1, IdCategory = 1045, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-25 07:30"), DurationHours = 3.5}, new WellOperation{ Id = 59332, IdWell = 2, IdWellSectionType = 2, IdCategory = 1026, IdType = 0, WellDepth = 1100, StartDate = DateTime.Parse("2021-08-27 08:30"), DurationHours = 3.5}, new WellOperation{ Id = 35943, IdWell = 1, IdWellSectionType = 1, IdCategory = 1046, IdType = 0, WellDepth = 1100, StartDate = DateTime.Parse("2021-08-24 21:00"), DurationHours = 3.5}, new WellOperation{ Id = 7989, IdWell = 1, IdWellSectionType = 1, IdCategory = 1047, IdType = 1, WellDepth = 1300, StartDate = DateTime.Parse("2021-08-25 08:40"), DurationHours = 3.5}, new WellOperation{ Id = 29454, IdWell = 5, IdWellSectionType = 2, IdCategory = 1027, IdType = 1, WellDepth = 800, StartDate = DateTime.Parse("2021-08-24 07:00"), DurationHours = 3.5}, new WellOperation{ Id = 4071, IdWell = 1, IdWellSectionType = 2, IdCategory = 1046, IdType = 1, WellDepth = 1400, StartDate = DateTime.Parse("2021-09-04 02:30"), DurationHours = 3.5}, new WellOperation{ Id = 82004, IdWell = 1, IdWellSectionType = 2, IdCategory = 1027, IdType = 1, WellDepth = 1400, StartDate = DateTime.Parse("2021-09-03 23:00"), DurationHours = 3.5}, new WellOperation{ Id = 59748, IdWell = 2, IdWellSectionType = 2, IdCategory = 1027, IdType = 0, WellDepth = 800, StartDate = DateTime.Parse("2021-08-24 07:00"), DurationHours = 3.5}, new WellOperation{ Id = 62812, IdWell = 1, IdWellSectionType = 2, IdCategory = 1046, IdType = 0, WellDepth = 1400, StartDate = DateTime.Parse("2021-09-02 19:00"), DurationHours = 3.5}, new WellOperation{ Id = 9526, IdWell = 2, IdWellSectionType = 2, IdCategory = 1001, IdType = 1, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 14:00"), DurationHours = 3.5}, new WellOperation{ Id = 42065, IdWell = 1, IdWellSectionType = 1, IdCategory = 1025, IdType = 1, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 01:10"), DurationHours = 3.5}, new WellOperation{ Id = 18584, IdWell = 1, IdWellSectionType = 1, IdCategory = 1047, IdType = 1, WellDepth = 1300, StartDate = DateTime.Parse("2021-08-25 15:40"), DurationHours = 3.5}, new WellOperation{ Id = 65446, IdWell = 4, IdWellSectionType = 2, IdCategory = 1001, IdType = 0, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 14:00"), DurationHours = 3.5}, new WellOperation{ Id = 5000, IdWell = 1, IdWellSectionType = 1, IdCategory = 1047, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-25 18:00"), DurationHours = 3.5}, new WellOperation{ Id = 58571, IdWell = 1, IdWellSectionType = 1, IdCategory = 1047, IdType = 1, WellDepth = 1300, StartDate = DateTime.Parse("2021-08-26 02:10"), DurationHours = 3.5}, new WellOperation{ Id = 41059, IdWell = 1, IdWellSectionType = 2, IdCategory = 1046, IdType = 1, WellDepth = 1400, StartDate = DateTime.Parse("2021-09-03 19:30"), DurationHours = 3.5}, new WellOperation{ Id = 82283, IdWell = 1, IdWellSectionType = 1, IdCategory = 1026, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-25 21:30"), DurationHours = 3.5}, new WellOperation{ Id = 15387, IdWell = 5, IdWellSectionType = 2, IdCategory = 1001, IdType = 1, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 14:00"), DurationHours = 3.5}, new WellOperation{ Id = 6250, IdWell = 1, IdWellSectionType = 1, IdCategory = 1048, IdType = 1, WellDepth = 1300, StartDate = DateTime.Parse("2021-08-26 09:10"), DurationHours = 3.5}, new WellOperation{ Id = 34860, IdWell = 1, IdWellSectionType = 2, IdCategory = 1026, IdType = 1, WellDepth = 1500, StartDate = DateTime.Parse("2021-09-04 13:00"), DurationHours = 3.5}, new WellOperation{ Id = 61847, IdWell = 5, IdWellSectionType = 2, IdCategory = 1046, IdType = 1, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 03:30"), DurationHours = 3.5}, new WellOperation{ Id = 82029, IdWell = 1, IdWellSectionType = 1, IdCategory = 1001, IdType = 0, WellDepth = 1100, StartDate = DateTime.Parse("2021-08-25 00:30"), DurationHours = 3.5}, new WellOperation{ Id = 17507, IdWell = 1, IdWellSectionType = 1, IdCategory = 1046, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-26 08:00"), DurationHours = 3.5}, new WellOperation{ Id = 87222, IdWell = 5, IdWellSectionType = 2, IdCategory = 1025, IdType = 1, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 00:00"), DurationHours = 3.5}, new WellOperation{ Id = 9622, IdWell = 1, IdWellSectionType = 2, IdCategory = 1025, IdType = 1, WellDepth = 1400, StartDate = DateTime.Parse("2021-09-03 16:00"), DurationHours = 3.5}, new WellOperation{ Id = 69090, IdWell = 1, IdWellSectionType = 1, IdCategory = 1046, IdType = 0, WellDepth = 800, StartDate = DateTime.Parse("2021-08-24 10:30"), DurationHours = 3.5}, new WellOperation{ Id = 30815, IdWell = 1, IdWellSectionType = 1, IdCategory = 1048, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-26 01:00"), DurationHours = 3.5}, new WellOperation{ Id = 59823, IdWell = 2, IdWellSectionType = 2, IdCategory = 1025, IdType = 0, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 00:00"), DurationHours = 3.5}, new WellOperation{ Id = 4826, IdWell = 2, IdWellSectionType = 2, IdCategory = 1046, IdType = 1, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 03:30"), DurationHours = 3.5}, new WellOperation{ Id = 72813, IdWell = 2, IdWellSectionType = 2, IdCategory = 1027, IdType = 1, WellDepth = 800, StartDate = DateTime.Parse("2021-08-24 07:00"), DurationHours = 3.5}, new WellOperation{ Id = 33609, IdWell = 1, IdWellSectionType = 2, IdCategory = 1001, IdType = 0, WellDepth = 1400, StartDate = DateTime.Parse("2021-09-03 05:30"), DurationHours = 3.5}, new WellOperation{ Id = 22988, IdWell = 4, IdWellSectionType = 2, IdCategory = 1046, IdType = 0, WellDepth = 800, StartDate = DateTime.Parse("2021-08-24 10:30"), DurationHours = 3.5}, new WellOperation{ Id = 80776, IdWell = 4, IdWellSectionType = 2, IdCategory = 1047, IdType = 0, WellDepth = 1100, StartDate = DateTime.Parse("2021-08-24 17:30"), DurationHours = 15}, new WellOperation{ Id = 48442, IdWell = 1, IdWellSectionType = 1, IdCategory = 1046, IdType = 0, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 03:30"), DurationHours = 3.5}, new WellOperation{ Id = 82844, IdWell = 1, IdWellSectionType = 1, IdCategory = 1025, IdType = 0, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 00:00"), DurationHours = 3.5}, new WellOperation{ Id = 57789, IdWell = 2, IdWellSectionType = 2, IdCategory = 1001, IdType = 0, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 14:00"), DurationHours = 3.5}, new WellOperation{ Id = 99586, IdWell = 1, IdWellSectionType = 1, IdCategory = 1046, IdType = 1, WellDepth = 1110, StartDate = DateTime.Parse("2021-08-25 01:40"), DurationHours = 3.5}, new WellOperation{ Id = 46064, IdWell = 1, IdWellSectionType = 1, IdCategory = 1047, IdType = 0, WellDepth = 1400, StartDate = DateTime.Parse("2021-08-27 05:00"), DurationHours = 3.5}, new WellOperation{ Id = 53146, IdWell = 1, IdWellSectionType = 2, IdCategory = 1027, IdType = 0, WellDepth = 1400, StartDate = DateTime.Parse("2021-09-02 22:30"), DurationHours = 3.5}, new WellOperation{ Id = 67566, IdWell = 1, IdWellSectionType = 1, IdCategory = 1047, IdType = 0, WellDepth = 1100, StartDate = DateTime.Parse("2021-08-24 17:30"), DurationHours = 3.5}, new WellOperation{ Id = 96390, IdWell = 1, IdWellSectionType = 1, IdCategory = 1026, IdType = 0, WellDepth = 1400, StartDate = DateTime.Parse("2021-08-27 08:30"), DurationHours = 3.5}, new WellOperation{ Id = 88634, IdWell = 1, IdWellSectionType = 1, IdCategory = 1027, IdType = 1, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 08:10"), DurationHours = 3.5}, new WellOperation{ Id = 56365, IdWell = 1, IdWellSectionType = 2, IdCategory = 1046, IdType = 0, WellDepth = 1400, StartDate = DateTime.Parse("2021-09-03 02:00"), DurationHours = 3.5}, new WellOperation{ Id = 12296, IdWell = 1, IdWellSectionType = 2, IdCategory = 1047, IdType = 1, WellDepth = 1500, StartDate = DateTime.Parse("2021-09-04 09:30"), DurationHours = 3.5}, new WellOperation{ Id = 73429, IdWell = 2, IdWellSectionType = 2, IdCategory = 1046, IdType = 1, WellDepth = 800, StartDate = DateTime.Parse("2021-08-24 10:30"), DurationHours = 3.5}, new WellOperation{ Id = 25451, IdWell = 1, IdWellSectionType = 1, IdCategory = 1046, IdType = 1, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 11:40"), DurationHours = 3.5}, new WellOperation{ Id = 52344, IdWell = 4, IdWellSectionType = 2, IdCategory = 1025, IdType = 0, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 00:00"), DurationHours = 3.5}, new WellOperation{ Id = 28277, IdWell = 2, IdWellSectionType = 2, IdCategory = 1026, IdType = 1, WellDepth = 1100, StartDate = DateTime.Parse("2021-08-27 08:30"), DurationHours = 3.5}, new WellOperation{ Id = 14112, IdWell = 1, IdWellSectionType = 2, IdCategory = 1026, IdType = 0, WellDepth = 1500, StartDate = DateTime.Parse("2021-09-03 12:30"), DurationHours = 3.5}, new WellOperation{ Id = 92093, IdWell = 4, IdWellSectionType = 2, IdCategory = 1026, IdType = 0, WellDepth = 1100, StartDate = DateTime.Parse("2021-08-27 08:30"), DurationHours = 3.5}, new WellOperation{ Id = 54204, IdWell = 1, IdWellSectionType = 2, IdCategory = 1025, IdType = 0, WellDepth = 1400, StartDate = DateTime.Parse("2021-09-02 15:30"), DurationHours = 3.5}, new WellOperation{ Id = 46250, IdWell = 2, IdWellSectionType = 2, IdCategory = 1025, IdType = 1, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 00:00"), DurationHours = 3.5}, new WellOperation{ Id = 58490, IdWell = 1, IdWellSectionType = 1, IdCategory = 1033, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-25 14:30"), DurationHours = 3.5}, new WellOperation{ Id = 42809, IdWell = 2, IdWellSectionType = 2, IdCategory = 1046, IdType = 0, WellDepth = 800, StartDate = DateTime.Parse("2021-08-24 10:30"), DurationHours = 3.5}, new WellOperation{ Id = 54743, IdWell = 5, IdWellSectionType = 2, IdCategory = 1047, IdType = 1, WellDepth = 1100, StartDate = DateTime.Parse("2021-08-24 17:30"), DurationHours = 15}, new WellOperation{ Id = 82546, IdWell = 1, IdWellSectionType = 1, IdCategory = 1046, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-26 22:00"), DurationHours = 3.5}, new WellOperation{ Id = 45594, IdWell = 1, IdWellSectionType = 1, IdCategory = 1047, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-25 04:00"), DurationHours = 3.5}, new WellOperation{ Id = 31385, IdWell = 1, IdWellSectionType = 1, IdCategory = 1025, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-26 18:30"), DurationHours = 3.5}, new WellOperation{ Id = 77880, IdWell = 1, IdWellSectionType = 1, IdCategory = 1027, IdType = 1, WellDepth = 800, StartDate = DateTime.Parse("2021-08-25 19:10"), DurationHours = 3.5}, new WellOperation{ Id = 85121, IdWell = 1, IdWellSectionType = 1, IdCategory = 1025, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-26 04:30"), DurationHours = 3.5}, new WellOperation{ Id = 84883, IdWell = 1, IdWellSectionType = 1, IdCategory = 1047, IdType = 1, WellDepth = 1110, StartDate = DateTime.Parse("2021-08-24 22:10"), DurationHours = 3.5}, new WellOperation{ Id = 86695, IdWell = 1, IdWellSectionType = 1, IdCategory = 1001, IdType = 1, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 15:10"), DurationHours = 3.5}, new WellOperation{ Id = 35347, IdWell = 1, IdWellSectionType = 1, IdCategory = 1026, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-26 15:00"), DurationHours = 3.5}, new WellOperation{ Id = 41956, IdWell = 1, IdWellSectionType = 1, IdCategory = 1001, IdType = 1, WellDepth = 1110, StartDate = DateTime.Parse("2021-08-25 05:10"), DurationHours = 3.5}, new WellOperation{ Id = 42008, IdWell = 1, IdWellSectionType = 2, IdCategory = 1001, IdType = 1, WellDepth = 1400, StartDate = DateTime.Parse("2021-09-04 06:00"), DurationHours = 3.5}, new WellOperation{ Id = 57353, IdWell = 1, IdWellSectionType = 1, IdCategory = 1026, IdType = 1, WellDepth = 1300, StartDate = DateTime.Parse("2021-08-26 05:40"), DurationHours = 3.5}, new WellOperation{ Id = 68599, IdWell = 1, IdWellSectionType = 1, IdCategory = 1027, IdType = 1, WellDepth = 800, StartDate = DateTime.Parse("2021-08-26 12:40"), DurationHours = 3.5}, new WellOperation{ Id = 76342, IdWell = 4, IdWellSectionType = 2, IdCategory = 1027, IdType = 0, WellDepth = 800, StartDate = DateTime.Parse("2021-08-24 07:00"), DurationHours = 3.5}, new WellOperation{ Id = 66370, IdWell = 1, IdWellSectionType = 1, IdCategory = 1001, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-27 01:30"), DurationHours = 3.5}, new WellOperation{ Id = 9350, IdWell = 1, IdWellSectionType = 1, IdCategory = 1047, IdType = 0, WellDepth = 1250, StartDate = DateTime.Parse("2021-08-26 11:30"), DurationHours = 3.5}, new WellOperation{ Id = 80725, IdWell = 4, IdWellSectionType = 2, IdCategory = 1046, IdType = 0, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 03:30"), DurationHours = 3.5}, new WellOperation{ Id = 39742, IdWell = 1, IdWellSectionType = 2, IdCategory = 1047, IdType = 0, WellDepth = 1500, StartDate = DateTime.Parse("2021-09-03 09:00"), DurationHours = 3.5}, new WellOperation{ Id = 95388, IdWell = 2, IdWellSectionType = 2, IdCategory = 1046, IdType = 0, WellDepth = 1000, StartDate = DateTime.Parse("2021-08-24 03:30"), DurationHours = 3.5}, new WellOperation{ Id = 18622, IdWell = 5, IdWellSectionType = 2, IdCategory = 1026, IdType = 1, WellDepth = 1100, StartDate = DateTime.Parse("2021-08-27 08:30"), DurationHours = 3.5}, new WellOperation{ Id = 37124, IdWell = 2, IdWellSectionType = 2, IdCategory = 1047, IdType = 0, WellDepth = 1100, StartDate = DateTime.Parse("2021-08-24 17:30"), DurationHours = 15}, new WellOperation{ Id = 6511, IdWell = 1, IdWellSectionType = 1, IdCategory = 1033, IdType = 1, WellDepth = 1300, StartDate = DateTime.Parse("2021-08-25 22:40"), DurationHours = 3.5}, }); }); modelBuilder.Entity(entity => { entity.HasData(new List{ new TelemetryAnalysis { Id = 1, IdTelemetry = 1, IdOperation = 17, UnixDate = 1626870355, DurationSec = 10, OperationStartDepth = null, OperationEndDepth = 206, IsWellDepthIncreasing = false, IsWellDepthDecreasing = false, IsBitPositionIncreasing = false, IsBitPositionDecreasing = false, IsBitPositionLt20 = true, IsBlockPositionIncreasing = false, IsBlockPositionDecreasing = false, IsRotorSpeedLt3 = true, IsRotorSpeedGt3 = false, IsPressureLt20 = true, IsPressureGt20 = false, IsHookWeightNotChanges = true, IsHookWeightLt3 = true }, new TelemetryAnalysis { Id = 2, IdTelemetry = 1, IdOperation = 8, UnixDate = 1626870364, DurationSec = 6, OperationStartDepth = 206, OperationEndDepth = 206, IsWellDepthIncreasing = false, IsWellDepthDecreasing = false, IsBitPositionIncreasing = true, IsBitPositionDecreasing = false, IsBitPositionLt20 = true, IsBlockPositionIncreasing = true, IsBlockPositionDecreasing = false, IsRotorSpeedLt3 = true, IsRotorSpeedGt3 = false, IsPressureLt20 = true, IsPressureGt20 = false, IsHookWeightNotChanges = true, IsHookWeightLt3 = true }, new TelemetryAnalysis { Id = 3, IdTelemetry = 1, IdOperation = 10, UnixDate = 1626870370, DurationSec = 2, OperationStartDepth = 206, OperationEndDepth = 206, IsWellDepthIncreasing = false, IsWellDepthDecreasing = false, IsBitPositionIncreasing = false, IsBitPositionDecreasing = true, IsBitPositionLt20 = true, IsBlockPositionIncreasing = false, IsBlockPositionDecreasing = true, IsRotorSpeedLt3 = true, IsRotorSpeedGt3 = false, IsPressureLt20 = true, IsPressureGt20 = false, IsHookWeightNotChanges = true, IsHookWeightLt3 = true }, new TelemetryAnalysis { Id = 4, IdTelemetry = 1, IdOperation = 17, UnixDate = 1626870372, DurationSec = 7, OperationStartDepth = 206, OperationEndDepth = 206, IsWellDepthIncreasing = false, IsWellDepthDecreasing = false, IsBitPositionIncreasing = false, IsBitPositionDecreasing = false, IsBitPositionLt20 = true, IsBlockPositionIncreasing = false, IsBlockPositionDecreasing = false, IsRotorSpeedLt3 = true, IsRotorSpeedGt3 = false, IsPressureLt20 = true, IsPressureGt20 = false, IsHookWeightNotChanges = true, IsHookWeightLt3 = true }, new TelemetryAnalysis { Id = 5, IdTelemetry = 1, IdOperation = 8, UnixDate = 1626870379, DurationSec = 7, OperationStartDepth = 206, OperationEndDepth = 206, IsWellDepthIncreasing = false, IsWellDepthDecreasing = false, IsBitPositionIncreasing = true, IsBitPositionDecreasing = false, IsBitPositionLt20 = true, IsBlockPositionIncreasing = true, IsBlockPositionDecreasing = false, IsRotorSpeedLt3 = true, IsRotorSpeedGt3 = false, IsPressureLt20 = true, IsPressureGt20 = false, IsHookWeightNotChanges = true, IsHookWeightLt3 = true } }); }); } public IQueryable GetWellsForCompany(int idCompany) { return from well in Wells .Include(w => w.RelationCompaniesWells) .ThenInclude(r => r.Company) .Include(w => w.Cluster) .ThenInclude(c => c.Deposit) where well.RelationCompaniesWells.Any(c => c.IdCompany == idCompany) select well; } public IQueryable GetUsersByLogin(string login) => Users .Include(e => e.Role) .Include(e => e.Company) .Where(e => e.Login == login); public async Task<(DateTime From, DateTime To)> GetDatesRangeAsync(int idTelemetry, CancellationToken token = default) where TEntity : class, IIdTelemetryDate { var dbSet = Set(); var datesRange = await (from m in dbSet where m.IdTelemetry == idTelemetry group m by m.IdTelemetry into g select new { From = g.Min(d => d.Date), To = g.Max(d => d.Date) }).AsNoTracking().FirstOrDefaultAsync(token); if (datesRange is null) return (DateTime.MinValue, DateTime.MaxValue); return (datesRange.From, datesRange.To); } public async Task> GetDepthToIntervalAsync(int telemetryId, int intervalHoursTimestamp, int workStartTimestamp, double timezoneOffset, CancellationToken token) { //TODO: Сменить на LINQ группирование using var command = Database.GetDbConnection().CreateCommand(); command.CommandText = $@"SELECT Min(t.bit_depth) AS MinDepth, Max(t.bit_depth) AS MaxDepth, Min(t.Date) AS dateStart FROM t_data_saub_base AS t WHERE id_telemetry = {telemetryId} AND t.Id % 10 = 0 GROUP BY floor((extract(epoch from t.date) - {workStartTimestamp} + {timezoneOffset}) / {intervalHoursTimestamp});"; Database.OpenConnection(); using var reader = await command.ExecuteReaderAsync(token); IEnumerable<(double? MinDepth, double? MaxDepth, DateTime BeginPeriodDate)> GetResult(DbDataReader rd) { if (rd.HasRows) { while (reader.Read()) { yield return ( (double?)reader.GetValue(0), (double?)reader.GetValue(1), (DateTime)reader.GetValue(2) ); } } } return GetResult(reader); } public async Task CreatePartitionAsync(string propertyName, int id, CancellationToken token = default) where TEntity : class { var dbSet = Set(); var baseTableName = dbSet.EntityType.GetTableName(); var schema = dbSet.EntityType.GetSchema(); var tableObject = Microsoft.EntityFrameworkCore.Metadata.StoreObjectIdentifier.Table(baseTableName, schema); var tableName = baseTableName.Replace("_base", ""); var property = dbSet.EntityType.GetProperty(propertyName).GetColumnName(tableObject); var query = $"CREATE TABLE {tableName}_{id} (like {baseTableName} including all, constraint partitioning_check check ({property} = 1)) INHERITS ({baseTableName});"; return await Database.ExecuteSqlRawAsync(query, token).ConfigureAwait(false); } } }