DD.WellWorkover.Cloud/AsbCloudDb/Model/AsbCloudDbContext.cs

422 lines
23 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
#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<Cluster> Clusters { get; set; }
public virtual DbSet<Company> Companies { get; set; }
public virtual DbSet<DataSaubBase> DataSaubBases { get; set; }
public virtual DbSet<Deposit> Deposits { get; set; }
public virtual DbSet<FileCategory> FileCategories { get; set; }
public virtual DbSet<FileInfo> Files { get; set; }
public virtual DbSet<Measure> Measures { get; set; }
public virtual DbSet<MeasureCategory> MeasureCategories { get; set; }
public virtual DbSet<ReportProperty> ReportProperties { get; set; }
public virtual DbSet<Telemetry> Telemetries { get; set; }
public virtual DbSet<TelemetryAnalysis> TelemetryAnalysis { get; set; }
public virtual DbSet<TelemetryEvent> TelemetryEvents { get; set; }
public virtual DbSet<TelemetryMessage> TelemetryMessages { get; set; }
public virtual DbSet<TelemetryUser> TelemetryUsers { get; set; }
public virtual DbSet<User> Users { get; set; }
public virtual DbSet<UserRole> UserRoles { get; set; }
public virtual DbSet<Well> Wells { get; set; }
public virtual DbSet<WellOperation> WellOperations { get; set; }
public virtual DbSet<WellOperationCategory> TelemetryOperations { get; set; }
public virtual DbSet<WellSectionType> WellSectionTypes { get; set; }
public virtual DbSet<WellType> WellTypes { get; set; }
//var options = new DbContextOptionsBuilder<AsbCloudDbContext>()
// .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True")
// .Options;
//var context = new AsbCloudDbContext(options);
public AsbCloudDbContext() : base()
{
Database.Migrate();
}
public AsbCloudDbContext(DbContextOptions<AsbCloudDbContext> options)
: base(options)
{
Database.Migrate();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
optionsBuilder.UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasPostgresExtension("adminpack")
.HasAnnotation("Relational:Collation", "Russian_Russia.1251");
modelBuilder.Entity<Cluster>(entity =>
{
entity.HasOne(d => d.Deposit)
.WithMany(p => p.Clusters)
.HasForeignKey(d => d.IdDeposit)
.HasConstraintName("t_cluster_t_deposit_id_fk");
});
modelBuilder.Entity<DataSaubBase>(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<TelemetryMessage>(entity =>
{
entity.HasOne(d => d.Telemetry)
.WithMany(p => p.Messages)
.HasForeignKey(d => d.IdTelemetry)
.HasConstraintName("t_messages_t_telemetry_id_fk");
});
modelBuilder.Entity<TelemetryUser>(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<TelemetryAnalysis>(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<TelemetryEvent>(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<User>(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<Well>(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<Well>(d => d.IdTelemetry)
.HasConstraintName("t_well_t_telemetry_id_fk");
});
modelBuilder.Entity<RelationCompanyWell>(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<WellOperation>(entity =>
{
entity.HasIndex(d => d.WellDepth);
entity.HasIndex(d => d.StartDate);
});
FillData(modelBuilder);
}
private static void FillData(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserRole>(entity =>
{
entity.HasData(new List<UserRole>{
new UserRole{ Id = 1, Caption = "Администратор", },
new UserRole{ Id = 2, Caption = "Пользователь", },
});
});
modelBuilder.Entity<User>(entity =>
{
entity.HasData(new List<User>{
new User{
Id = 1,
IdCompany = 1,
IdRole = 1,
Level = int.MaxValue,
Login = "dev",
PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072", // dev
Name = "Разработчик",
},
});
});
modelBuilder.Entity<Company>(entity =>
{
entity.HasData(new List<Company>{
new Company{ Id = 1, Caption = "ООО \"АСБ\"", IdCompanyType = 3},
});
});
modelBuilder.Entity<WellOperationCategory>(entity =>
{
entity.HasData(new List<WellOperationCategory> {
// Автоматически опеределяемые операции
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 = 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 },
new WellOperationCategory {Id = 1050, Name = "Промывка при спуске ОК", Code = 0 }
});
});
modelBuilder.Entity<FileCategory>(entity =>
{
entity.HasData(new List<FileCategory> {
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"},
new FileCategory {Id = 13, Name = "Программа бурения, части", ShortName = "ПБч"},
new FileCategory {Id = 14, Name = "Программа бурения", ShortName = "ПБ"},
});
});
modelBuilder.Entity<WellSectionType>(entity =>
{
entity.HasData(new List<WellSectionType>{
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<WellType>(entity =>
{
entity.HasData(new List<WellType> {
new WellType{ Id = 1, Caption = "Наклонно-направленная"},
new WellType{ Id = 2, Caption = "Горизонтальная"},
});
});
modelBuilder.Entity<MeasureCategory>(entity =>
{
entity.HasData(new List<MeasureCategory> {
new MeasureCategory{ Id = 1, Name = "Показатели бурового раствора", ShortName = "Раствор"},
new MeasureCategory{ Id = 2, Name = "Шламограмма", ShortName = "Шламограмма"},
new MeasureCategory{ Id = 3, Name = "ННБ", ShortName = "ННБ"},
});
});
modelBuilder.Entity<CompanyType>(entity =>
{
entity.HasData(new List<CompanyType>{
new CompanyType{ Id = 1, Caption = "Недрапользователь", },
new CompanyType{ Id = 2, Caption = "Буровой подрядчик", },
new CompanyType{ Id = 3, Caption = "Сервис автоматизации бурения", },
});
});
}
public IQueryable<Well> 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<User> 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<TEntity>(int idTelemetry,
CancellationToken token = default)
where TEntity : class, IIdTelemetryDate
{
var dbSet = Set<TEntity>();
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<IEnumerable<(double? MinDepth, double? MaxDepth, DateTime BeginPeriodDate)>> 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);
var result = new List<(double? MinDepth, double? MaxDepth, DateTime BeginPeriodDate)>();
if (reader.HasRows)
{
while (reader.Read())
{
result.Add(
(
(double?)reader.GetValue(0),
(double?)reader.GetValue(1),
(DateTime)reader.GetValue(2)
));
}
}
return result;
}
public async Task<int> CreatePartitionAsync<TEntity>(string propertyName, int id, CancellationToken token = default)
where TEntity : class
{
var dbSet = Set<TEntity>();
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);
}
}
}