From 9723ee3b9e9f3296806168d8914f9f786660e479 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 18 Mar 2024 10:05:20 +0500 Subject: [PATCH 01/52] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=D0=B0=20=D0=B4=D0=B0=D1=82=20=D0=B2=20WellOp?= =?UTF-8?q?erationRequestBase=20=D1=81=20=20DateTime=20=D0=BD=D0=B0=20Date?= =?UTF-8?q?TimeOffset?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/WellOperationRequest.cs | 6 ++-- .../Repository/WellOperationRepository.cs | 28 +++++++++---------- .../DailyReport/DailyReportService.cs | 4 +-- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs index 1d190018..b2e0fc26 100644 --- a/AsbCloudApp/Requests/WellOperationRequest.cs +++ b/AsbCloudApp/Requests/WellOperationRequest.cs @@ -11,12 +11,12 @@ namespace AsbCloudApp.Requests /// /// фильтр по дате начала операции /// - public DateTime? GeDate { get; set; } + public DateTimeOffset? GeDate { get; set; } /// /// фильтр по дате окончания операции /// - public DateTime? LtDate { get; set; } + public DateTimeOffset? LeDate { get; set; } /// /// фильтр. Больше или равно глубины скважины на начало операции. @@ -60,7 +60,7 @@ namespace AsbCloudApp.Requests GeDepth = request.GeDepth; LeDepth = request.LeDepth; GeDate = request.GeDate; - LtDate = request.LtDate; + LeDate = request.LeDate; OperationCategoryIds = request.OperationCategoryIds; OperationType = request.OperationType; diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 329d2502..c75ab4fd 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -57,7 +57,7 @@ public class WellOperationRepository : IWellOperationRepository .ToArrayAsync(token); var dateLastAssosiatedPlanOperation = await GetDateLastAssosiatedPlanOperationAsync(idWell, currentDate, timezone.Hours, token); - + var result = new WellOperationPlanDto() { WellOperationsPlan = dtos.Select(Convert), @@ -199,9 +199,9 @@ public class WellOperationRepository : IWellOperationRepository { var query = BuildQuery(request) .AsNoTracking(); - + var dtos = await query.ToArrayAsync(token); - + return dtos.Select(Convert); } @@ -222,7 +222,7 @@ public class WellOperationRepository : IWellOperationRepository CancellationToken token) { var query = BuildQuery(request); - + var result = new PaginationContainer { Skip = request.Skip ?? 0, @@ -390,7 +390,7 @@ public class WellOperationRepository : IWellOperationRepository { var timezone = wellService.GetTimezone(request.IdWell); var timeZoneOffset = timezone.Hours; - + var query = db.WellOperations .Include(s => s.WellSectionType) .Include(s => s.OperationCategory) @@ -413,14 +413,14 @@ public class WellOperationRepository : IWellOperationRepository if (request.GeDate.HasValue) { - var geDateOffset = request.GeDate.Value.ToUtcDateTimeOffset(timeZoneOffset); - query = query.Where(e => e.DateStart >= geDateOffset); + //var geDateOffset = request.GeDate.Value.ToUtcDateTimeOffset(timeZoneOffset); + query = query.Where(e => e.DateStart >= request.GeDate); } - if (request.LtDate.HasValue) + if (request.LeDate.HasValue) { - var ltDateOffset = request.LtDate.Value.ToUtcDateTimeOffset(timeZoneOffset); - query = query.Where(e => e.DateStart < ltDateOffset); + //var leDateOffset = request.LeDate.Value.ToUtcDateTimeOffset(timeZoneOffset); + query = query.Where(e => e.DateStart <= request.LeDate); } var currentWellOperations = db.WellOperations @@ -468,7 +468,7 @@ public class WellOperationRepository : IWellOperationRepository { dtos = dtos.SortBy(request.SortFields); } - + dtos = dtos .OrderBy(e => e.DateStart) .ThenBy(e => e.DepthEnd) @@ -533,7 +533,7 @@ public class WellOperationRepository : IWellOperationRepository var timezoneOffset = TimeSpan.FromHours(timezone.Hours); var dtoWithRemoteDateTime = dto.Adapt(); - + dtoWithRemoteDateTime.DateStart = dto.DateStart.ToOffset(TimeSpan.FromHours(timezoneOffset.Hours)); dtoWithRemoteDateTime.LastUpdateDate = dto.LastUpdateDate?.ToOffset(TimeSpan.FromHours(timezoneOffset.Hours)); @@ -605,11 +605,11 @@ public class WellOperationRepository : IWellOperationRepository var geDateUtc = geDate.Value.ToUniversalTime(); query = query.Where(e => e.DateStart >= geDateUtc); } - + var groups = await query .GroupBy(o => new { o.IdWell, o.IdType }) .Select(g => new{ - MaxDate = g.Max(o => o.DateStart), + MaxDate = g.Max(o => o.DateStart), g.Key.IdWell, g.Key.IdType, }) diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index 43fb0abf..6a4cfba5 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -114,7 +114,7 @@ public class DailyReportService : IDailyReportService IdWell = idWell, OperationType = WellOperation.IdOperationTypeFact, GeDate = geDate, - LtDate = ltDate + LeDate = ltDate }; var factWellOperations = (await wellOperationRepository.GetAsync(factOperationRequest, cancellationToken)) @@ -191,7 +191,7 @@ public class DailyReportService : IDailyReportService IdWell = idWell, OperationType = WellOperation.IdOperationTypeFact, GeDate = geDateFactWellOperation, - LtDate = ltDateFactWellOperation + LeDate = ltDateFactWellOperation }; var factWellOperations = await wellOperationRepository.GetAsync(factWellOperationRequest, cancellationToken); From 616cb242d6a4512dd866e293792558027f8a3da1 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 19 Mar 2024 17:21:05 +0500 Subject: [PATCH 02/52] =?UTF-8?q?=D0=A3=D0=BD=D0=B8=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20DailyReport=20+=20=D0=B2=D1=81=D1=91,=20=D1=87=D1=82?= =?UTF-8?q?=D0=BE=20=D0=BF=D1=80=D0=B8=D1=88=D0=BB=D0=BE=D1=81=D1=8C=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D1=82=D1=8C,=20?= =?UTF-8?q?=D1=87=D1=82=D0=BE=D0=B1=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=20=D1=81=D0=BE=D0=B1=D1=80=D0=B0=D0=BB=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/DailyReport/DailyReportDto.cs | 2 +- AsbCloudApp/Data/DatesRangeDto.cs | 4 +- AsbCloudApp/Data/StatWellDto.cs | 2 +- AsbCloudApp/Data/WellDto.cs | 2 +- AsbCloudApp/Services/IWellService.cs | 2 +- .../AsbCloudDbContextModelSnapshot.cs | 2 +- AsbCloudDb/Model/DailyReports/DailyReport.cs | 2 +- .../Repository/DailyReportRepository.cs | 111 +++++++++--------- .../Repository/DepositRepository.cs | 4 +- .../Repository/WellOperationRepository.cs | 18 +-- .../DailyReport/DailyReportService.cs | 46 ++++---- .../Services/SAUB/TelemetryDataBaseService.cs | 2 +- .../OperationsStatService.cs | 9 +- .../Services/WellService.cs | 6 +- .../Services/WellboreServiceTest.cs | 4 +- 15 files changed, 110 insertions(+), 106 deletions(-) diff --git a/AsbCloudApp/Data/DailyReport/DailyReportDto.cs b/AsbCloudApp/Data/DailyReport/DailyReportDto.cs index d8d9d4c8..c31dd73c 100644 --- a/AsbCloudApp/Data/DailyReport/DailyReportDto.cs +++ b/AsbCloudApp/Data/DailyReport/DailyReportDto.cs @@ -74,7 +74,7 @@ public class DailyReportDto : IId, /// /// Дата последнего обновления /// - public DateTime? DateLastUpdate { get; set; } + public DateTimeOffset? DateLastUpdate { get; set; } /// /// Блок фактической траектории diff --git a/AsbCloudApp/Data/DatesRangeDto.cs b/AsbCloudApp/Data/DatesRangeDto.cs index 3f12acb7..a61034b6 100644 --- a/AsbCloudApp/Data/DatesRangeDto.cs +++ b/AsbCloudApp/Data/DatesRangeDto.cs @@ -12,12 +12,12 @@ namespace AsbCloudApp.Data /// Дата начала диапазона /// [Required] - public DateTime From { get; set; } + public DateTimeOffset From { get; set; } /// /// Дата окончания диапазона /// [Required] - public DateTime To { get; set; } + public DateTimeOffset To { get; set; } } } diff --git a/AsbCloudApp/Data/StatWellDto.cs b/AsbCloudApp/Data/StatWellDto.cs index ece9756c..9cf27fe4 100644 --- a/AsbCloudApp/Data/StatWellDto.cs +++ b/AsbCloudApp/Data/StatWellDto.cs @@ -42,7 +42,7 @@ namespace AsbCloudApp.Data /// дата прихода последней телеметрии /// [Required] - public DateTime LastTelemetryDate { get; set; } + public DateTimeOffset LastTelemetryDate { get; set; } /// /// Статистика по секциям diff --git a/AsbCloudApp/Data/WellDto.cs b/AsbCloudApp/Data/WellDto.cs index 30f524c2..d9a67431 100644 --- a/AsbCloudApp/Data/WellDto.cs +++ b/AsbCloudApp/Data/WellDto.cs @@ -72,7 +72,7 @@ namespace AsbCloudApp.Data /// /// Дата/время кода приходили данные последний раз /// - public DateTime LastTelemetryDate { get; set; } + public DateTimeOffset LastTelemetryDate { get; set; } /// /// ID телеметрии diff --git a/AsbCloudApp/Services/IWellService.cs b/AsbCloudApp/Services/IWellService.cs index edea98ae..4279f587 100644 --- a/AsbCloudApp/Services/IWellService.cs +++ b/AsbCloudApp/Services/IWellService.cs @@ -72,7 +72,7 @@ namespace AsbCloudApp.Services /// /// /// - DateTime GetLastTelemetryDate(int idWell); + DateTimeOffset GetLastTelemetryDate(int idWell); //TODO: выяснить и удалить отсюда /// diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 9957e235..8f326f19 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -282,7 +282,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("date") .HasComment("Дата формирования отчёта"); - b.Property("DateLastUpdate") + b.Property("DateLastUpdate") .HasColumnType("timestamp with time zone") .HasColumnName("date_last_update") .HasComment("Дата последнего обновления"); diff --git a/AsbCloudDb/Model/DailyReports/DailyReport.cs b/AsbCloudDb/Model/DailyReports/DailyReport.cs index c521ca54..8bc99470 100644 --- a/AsbCloudDb/Model/DailyReports/DailyReport.cs +++ b/AsbCloudDb/Model/DailyReports/DailyReport.cs @@ -18,7 +18,7 @@ public class DailyReport : IId public int IdWell { get; set; } [Column("date_last_update", TypeName = "timestamp with time zone"), Comment("Дата последнего обновления")] - public DateTime? DateLastUpdate { get; set; } + public DateTimeOffset? DateLastUpdate { get; set; } [Column("date", TypeName = "date"), Comment("Дата формирования отчёта")] public DateOnly Date { get; set; } diff --git a/AsbCloudInfrastructure/Repository/DailyReportRepository.cs b/AsbCloudInfrastructure/Repository/DailyReportRepository.cs index b82b0ce1..f7f582fa 100644 --- a/AsbCloudInfrastructure/Repository/DailyReportRepository.cs +++ b/AsbCloudInfrastructure/Repository/DailyReportRepository.cs @@ -1,80 +1,85 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; using AsbCloudApp.Data.DailyReport; using AsbCloudApp.Data.DailyReport.Blocks.Sign; using AsbCloudApp.Data.DailyReport.Blocks.Subsystems; using AsbCloudApp.Data.DailyReport.Blocks.TimeBalance; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; +using AsbCloudApp.Services; using AsbCloudDb; using AsbCloudDb.Model; using AsbCloudDb.Model.DailyReports; using Mapster; using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository; public class DailyReportRepository : CrudRepositoryBase, - IDailyReportRepository + IDailyReportRepository { - public DailyReportRepository(IAsbCloudDbContext dbContext) - : base(dbContext) - { - } + private IWellService wellService; - public async Task> GetAsync(int idWell, FileReportRequest request, CancellationToken cancellationToken) - { - var skip = request.Skip ?? 0; - var take = request.Take ?? 10; + public DailyReportRepository(IAsbCloudDbContext dbContext, IWellService wellService) + : base(dbContext) + { + this.wellService = wellService; + } - var query = GetQuery().Where(d => d.IdWell == idWell); + public async Task> GetAsync(int idWell, FileReportRequest request, CancellationToken cancellationToken) + { + var skip = request.Skip ?? 0; + var take = request.Take ?? 10; - if (request.GeDate.HasValue) - query = query.Where(d => d.Date >= request.GeDate.Value); - - if (request.LeDate.HasValue) - query = query.Where(d => d.Date <= request.LeDate.Value); + var query = GetQuery().Where(d => d.IdWell == idWell); - query = request.SortFields?.Any() == true ? - query.SortBy(request.SortFields) : - query.OrderBy(d => d.Date); + if (request.GeDate.HasValue) + query = query.Where(d => d.Date >= request.GeDate.Value); - var entities = await query - .Skip(skip) - .Take(take) - .AsNoTracking() - .ToArrayAsync(cancellationToken); + if (request.LeDate.HasValue) + query = query.Where(d => d.Date <= request.LeDate.Value); - var dtos = entities.Select(Convert); + query = request.SortFields?.Any() == true ? + query.SortBy(request.SortFields) : + query.OrderBy(d => d.Date); - return dtos; - } + var entities = await query + .Skip(skip) + .Take(take) + .AsNoTracking() + .ToArrayAsync(cancellationToken); - public async Task GetOrDefaultAsync(int idWell, DateOnly date, CancellationToken cancellationToken) - { - var entity = await GetQuery() - .AsNoTracking() - .SingleOrDefaultAsync(d => d.IdWell == idWell && d.Date == date, cancellationToken); + var timezoneOffset = wellService.GetTimezone(idWell).Offset; + var dtos = entities.Select(entity => Convert(entity, timezoneOffset)); - return entity is null ? null : Convert(entity); - } + return dtos; + } - protected override DailyReportDto Convert(DailyReport src) - { - var dto = new DailyReportDto - { - Id = src.Id, - IdWell = src.IdWell, - DateLastUpdate = src.DateLastUpdate, - Date = src.Date, - SignBlock = src.SignBlock?.Adapt(), - TimeBalanceBlock = src.TimeBalanceBlock?.Adapt(), - SubsystemBlock = src.SubsystemBlock?.Adapt() - }; - - return dto; - } + public async Task GetOrDefaultAsync(int idWell, DateOnly date, CancellationToken cancellationToken) + { + var entity = await GetQuery() + .AsNoTracking() + .SingleOrDefaultAsync(d => d.IdWell == idWell && d.Date == date, cancellationToken); + + return entity is null ? null : Convert(entity); + } + + protected DailyReportDto Convert(DailyReport src, TimeSpan timezoneOffset) + { + var dto = new DailyReportDto + { + Id = src.Id, + IdWell = src.IdWell, + DateLastUpdate = src.DateLastUpdate?.ToOffset(timezoneOffset), + Date = src.Date, + SignBlock = src.SignBlock?.Adapt(), + TimeBalanceBlock = src.TimeBalanceBlock?.Adapt(), + SubsystemBlock = src.SubsystemBlock?.Adapt() + }; + + return dto; + } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/DepositRepository.cs b/AsbCloudInfrastructure/Repository/DepositRepository.cs index 7f19f1d7..804d130e 100644 --- a/AsbCloudInfrastructure/Repository/DepositRepository.cs +++ b/AsbCloudInfrastructure/Repository/DepositRepository.cs @@ -4,6 +4,7 @@ using AsbCloudApp.Services; using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -111,7 +112,8 @@ namespace AsbCloudInfrastructure.Repository { var dto = well.Adapt(); dto.WellType = well.WellType.Caption; - dto.LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id); + dto.LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id) + .ToOffset(TimeSpan.FromHours(well.Timezone.Hours)); dto.Cluster = gCluster.Key.Caption; dto.Deposit = gDeposit.Key.Caption; return dto; diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index c75ab4fd..1c3f6fdc 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -177,8 +177,8 @@ public class WellOperationRepository : IWellOperationRepository return new DatesRangeDto { - From = minDate.ToRemoteDateTime(timezone.Hours), - To = maxDate.ToRemoteDateTime(timezone.Hours) + From = minDate.ToOffset(timezone.Offset), + To = maxDate.ToOffset(timezone.Offset) }; } @@ -197,12 +197,12 @@ public class WellOperationRepository : IWellOperationRepository WellOperationRequest request, CancellationToken token) { - var query = BuildQuery(request) + var query = BuildQuery(request) .AsNoTracking(); - var dtos = await query.ToArrayAsync(token); + var dtos = await query.ToArrayAsync(token); - return dtos.Select(Convert); + return dtos.Select(Convert); } public async Task> GetAsync( @@ -413,14 +413,14 @@ public class WellOperationRepository : IWellOperationRepository if (request.GeDate.HasValue) { - //var geDateOffset = request.GeDate.Value.ToUtcDateTimeOffset(timeZoneOffset); - query = query.Where(e => e.DateStart >= request.GeDate); + var geDateOffset = request.GeDate.Value.ToUniversalTime(); + query = query.Where(e => e.DateStart >= geDateOffset); } if (request.LeDate.HasValue) { - //var leDateOffset = request.LeDate.Value.ToUtcDateTimeOffset(timeZoneOffset); - query = query.Where(e => e.DateStart <= request.LeDate); + var leDateOffset = request.LeDate.Value.ToUniversalTime(); + query = query.Where(e => e.DateStart <= leDateOffset); } var currentWellOperations = db.WellOperations diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index 6a4cfba5..fba35c59 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -83,7 +83,7 @@ public class DailyReportService : IDailyReportService editableBlock.IdUser = idUser; editableBlock.LastUpdateDate = DateTime.UtcNow; - dailyReport.DateLastUpdate = DateTime.UtcNow; + dailyReport.DateLastUpdate = DateTimeOffset.UtcNow; if (dailyReport.Id == 0) return await dailyReportRepository.InsertAsync(dailyReport, cancellationToken); @@ -158,28 +158,27 @@ public class DailyReportService : IDailyReportService return result; var dailyReports = new List(); - - if (request.GeDate.HasValue) - { - var startDate = new DateTime(request.GeDate.Value.Year, request.GeDate.Value.Month, - request.GeDate.Value.Day); + TimeSpan offset = wellService.GetTimezone(idWell).Offset; - if (startDate.Date >= datesRange.From.Date) + if (request.GeDate.HasValue) + { + var startDate = new DateTimeOffset(request.GeDate.Value, TimeOnly.MinValue, offset); + + if (startDate >= datesRange.From) datesRange.From = startDate; } if (request.LeDate.HasValue) { - var finishDate = new DateTime(request.LeDate.Value.Year, request.LeDate.Value.Month, - request.LeDate.Value.Day); + var finishDate = new DateTimeOffset(request.LeDate.Value, TimeOnly.MinValue, offset); - if (finishDate.Date <= datesRange.To.Date) + if (finishDate <= datesRange.To) datesRange.To = finishDate; } if (datesRange.From.AddDays(result.Skip) <= datesRange.To) - result.Count = (int)(Math.Ceiling((datesRange.To - DateTime.UnixEpoch).TotalDays) - - Math.Floor((datesRange.From - DateTime.UnixEpoch).TotalDays)) + 1; + result.Count = (int)(Math.Ceiling((datesRange.To - DateTimeOffset.UnixEpoch).TotalDays) - + Math.Floor((datesRange.From - DateTimeOffset.UnixEpoch).TotalDays)) + 1; var existingDailyReports = await dailyReportRepository.GetAsync(idWell, request, cancellationToken); @@ -200,16 +199,16 @@ public class DailyReportService : IDailyReportService { for (var day = result.Skip; day - result.Skip < result.Take && datesRange.To.AddDays(-day) >= datesRange.From; day++) { - var dateDailyReport = DateOnly.FromDateTime(datesRange.To.AddDays(-day)); + var dateDailyReport = DateOnly.FromDateTime(datesRange.To.AddDays(-day).DateTime); - AddDailyReport(dateDailyReport); + AddDailyReport(dateDailyReport); } } else { for (var day = result.Skip; day - result.Skip < result.Take && datesRange.From.AddDays(day) <= datesRange.To; day++) { - var dateDailyReport = DateOnly.FromDateTime(datesRange.From.AddDays(day)); + var dateDailyReport = DateOnly.FromDateTime(datesRange.From.AddDays(day).DateTime); AddDailyReport(dateDailyReport); } @@ -243,7 +242,7 @@ 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 currentDate = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(timezone.Hours)); var factOperationDatesRange = await wellOperationRepository.GetDatesRangeAsync(idWell, WellOperation.IdOperationTypeFact, cancellationToken); @@ -251,15 +250,13 @@ public class DailyReportService : IDailyReportService if (factOperationDatesRange is null) return null; - var from = (factOperationDatesRange.From.AddDays(1) <= DateTime.UtcNow ? + var from = (factOperationDatesRange.From.AddDays(1) <= DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(timezone.Hours)) ? factOperationDatesRange.From : - currentDate.AddDays(-1)) - .Date; + currentDate.AddDays(-1)); - var to = (factOperationDatesRange.To.AddDays(1) <= DateTime.UtcNow ? + var to = (factOperationDatesRange.To.AddDays(1) <= DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(timezone.Hours)) ? factOperationDatesRange.To : - currentDate.AddDays(-1)) - .Date; + currentDate.AddDays(-1)); return new DatesRangeDto { @@ -417,9 +414,8 @@ public class DailyReportService : IDailyReportService if (datesRange is null) return false; - - var from = DateOnly.FromDateTime(datesRange.From); - var to = DateOnly.FromDateTime(datesRange.To); + var from = DateOnly.FromDateTime(datesRange.From.ToUniversalTime().DateTime); + var to = DateOnly.FromDateTime(datesRange.To.ToUniversalTime().DateTime); return dateDailyReport >= from && dateDailyReport <= to; } diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs index f9cc64ee..52966fad 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs @@ -102,7 +102,7 @@ namespace AsbCloudInfrastructure.Services.SAUB if (dateBegin == default) { var dateRange = telemetryDataCache.GetOrDefaultDataDateRange(telemetry.Id); - dateBeginUtc = (dateRange?.To.ToUtcDateTimeOffset(timezone.Hours) ?? DateTime.UtcNow) + dateBeginUtc = (dateRange?.To.ToOffset(timezone.Offset) ?? DateTimeOffset.UtcNow) .AddSeconds(-intervalSec); } else diff --git a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs index c9018051..4bf326e7 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs @@ -145,6 +145,8 @@ public class OperationsStatService : IOperationsStatService private async Task CalcWellStatAsync(Well well, CancellationToken token) { + var timezone = wellService.GetTimezone(well.Id); + var wellType = (await memoryCache .GetOrCreateBasicAsync(db.Set(), token)) .FirstOrDefault(t => t.Id == well.IdWellType); @@ -155,7 +157,7 @@ public class OperationsStatService : IOperationsStatService WellType = wellType?.Caption ?? "", IdState = well.IdState, State = wellService.GetStateText(well.IdState), - LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id), + LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id).ToOffset(timezone.Offset), Companies = await wellService.GetCompaniesAsync(well.Id, token) }; @@ -169,9 +171,8 @@ public class OperationsStatService : IOperationsStatService if (!wellOperations.Any()) return statWellDto; - var timezoneOffsetH = wellService.GetTimezone(well.Id).Hours; - statWellDto.Sections = CalcSectionsStats(wellOperations, timezoneOffsetH); - statWellDto.Total = GetStatTotal(wellOperations, well.IdState, timezoneOffsetH); + statWellDto.Sections = CalcSectionsStats(wellOperations, timezone.Hours); + statWellDto.Total = GetStatTotal(wellOperations, well.IdState, timezone.Hours); statWellDto.TvdLagDays = CalcTvdLagDays(wellOperations); statWellDto.TvdDrillingDays = CalcDrillingDays(wellOperations); diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 4d6ec10a..2c579140 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -63,12 +63,12 @@ namespace AsbCloudInfrastructure.Services private void DropCacheRelationCompanyWell() => memoryCache.DropBasic(); - public DateTime GetLastTelemetryDate(int idWell) + public DateTimeOffset GetLastTelemetryDate(int idWell) { var well = GetOrDefault(idWell); if (well?.IdTelemetry is null) - return DateTime.MinValue; + return DateTimeOffset.MinValue; var datesRange = telemetryService.GetDatesRange(well.IdTelemetry.Value); return datesRange.To; @@ -278,7 +278,7 @@ namespace AsbCloudInfrastructure.Services dto.Cluster = entity.Cluster.Caption; dto.Deposit = entity.Cluster.Deposit.Caption; if (entity.IdTelemetry is not null) - dto.LastTelemetryDate = telemetryService.GetDatesRange(entity.IdTelemetry.Value).To; + dto.LastTelemetryDate = telemetryService.GetDatesRange(entity.IdTelemetry.Value).To.ToOffset(dto.Timezone.Offset); dto.Companies = entity.RelationCompaniesWells .Select(r => Convert(r.Company)) .ToList(); diff --git a/AsbCloudWebApi.Tests/Services/WellboreServiceTest.cs b/AsbCloudWebApi.Tests/Services/WellboreServiceTest.cs index 7f647158..f256c384 100644 --- a/AsbCloudWebApi.Tests/Services/WellboreServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/WellboreServiceTest.cs @@ -21,7 +21,7 @@ public class WellboreServiceTest Id = 1, IdState = 1, IdTelemetry = 1, - LastTelemetryDate = DateTime.Now, + LastTelemetryDate = DateTimeOffset.Now, Caption = "well 1" }; @@ -30,7 +30,7 @@ public class WellboreServiceTest Id = 2, IdState = 1, IdTelemetry = 100, - LastTelemetryDate = DateTime.Now, + LastTelemetryDate = DateTimeOffset.Now, Caption = "well 2" }; From 0df79ee0fc80699d51b3fe75692619fd7560d965 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 19 Mar 2024 17:52:45 +0500 Subject: [PATCH 03/52] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8F=20DateDownload=20=D0=B2=20Manual=20?= =?UTF-8?q?=D0=B8=20ManualDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/Manuals/ManualDto.cs | 2 +- AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs | 2 +- AsbCloudDb/Model/Manuals/Manual.cs | 4 ++-- AsbCloudInfrastructure/Services/ManualCatalogService.cs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/AsbCloudApp/Data/Manuals/ManualDto.cs b/AsbCloudApp/Data/Manuals/ManualDto.cs index bb89dfbe..c5aa92c4 100644 --- a/AsbCloudApp/Data/Manuals/ManualDto.cs +++ b/AsbCloudApp/Data/Manuals/ManualDto.cs @@ -18,7 +18,7 @@ public class ManualDto : IId /// /// Дата загрузки /// - public DateTime DateDownload { get; set; } + public DateTimeOffset DateDownload { get; set; } /// /// Id автора diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 8f326f19..8bd03355 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -1390,7 +1390,7 @@ namespace AsbCloudDb.Migrations NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("DateDownload") + b.Property("DateDownload") .HasColumnType("timestamp with time zone") .HasColumnName("date_download") .HasComment("Дата загрузки"); diff --git a/AsbCloudDb/Model/Manuals/Manual.cs b/AsbCloudDb/Model/Manuals/Manual.cs index 35b091b5..8ab64735 100644 --- a/AsbCloudDb/Model/Manuals/Manual.cs +++ b/AsbCloudDb/Model/Manuals/Manual.cs @@ -15,8 +15,8 @@ public class Manual : IId [Column("name"), Comment("Название")] public string Name { get; set; } = null!; - [Column("date_download"), Comment("Дата загрузки")] - public DateTime DateDownload { get; set; } + [Column("date_download", TypeName = "timestamp with time zone"), Comment("Дата загрузки")] + public DateTimeOffset DateDownload { get; set; } [Column("id_directory"), Comment("Id директории")] public int IdDirectory { get; set; } diff --git a/AsbCloudInfrastructure/Services/ManualCatalogService.cs b/AsbCloudInfrastructure/Services/ManualCatalogService.cs index c8713ab1..8c779bc7 100644 --- a/AsbCloudInfrastructure/Services/ManualCatalogService.cs +++ b/AsbCloudInfrastructure/Services/ManualCatalogService.cs @@ -57,7 +57,7 @@ public class ManualCatalogService : IManualCatalogService var manual = new ManualDto { Name = name, - DateDownload = DateTime.UtcNow, + DateDownload = DateTimeOffset.UtcNow, IdDirectory = idDirectory, IdCategory = IdFileCategory, IdAuthor = idAuthor From 7f43c951f54ccc7944dfc0691fcefd549db2e31d 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 Mar 2024 10:43:15 +0300 Subject: [PATCH 04/52] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20DTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/DataSaubStatDto.cs | 1 + AsbCloudApp/Data/DatesRangeDto.cs | 4 +- .../DetectedOperation/DetectedOperationDto.cs | 1 + .../WellGroupOpertionDto.cs | 0 .../WellOperationCategoryDto.cs | 2 +- .../Data/WellOperation/WellOperationDto.cs | 115 ++++++++++++++++ AsbCloudApp/Data/WellOperationDataDto.cs | 39 ------ AsbCloudApp/Data/WellOperationDto.cs | 124 ------------------ AsbCloudApp/Data/WellOperationPlanDto.cs | 28 ---- 9 files changed, 120 insertions(+), 194 deletions(-) rename AsbCloudApp/Data/{ => WellOperation}/WellGroupOpertionDto.cs (100%) rename AsbCloudApp/Data/{ => WellOperation}/WellOperationCategoryDto.cs (96%) create mode 100644 AsbCloudApp/Data/WellOperation/WellOperationDto.cs delete mode 100644 AsbCloudApp/Data/WellOperationDataDto.cs delete mode 100644 AsbCloudApp/Data/WellOperationDto.cs delete mode 100644 AsbCloudApp/Data/WellOperationPlanDto.cs diff --git a/AsbCloudApp/Data/DataSaubStatDto.cs b/AsbCloudApp/Data/DataSaubStatDto.cs index a3b80a5d..ceae4f9d 100644 --- a/AsbCloudApp/Data/DataSaubStatDto.cs +++ b/AsbCloudApp/Data/DataSaubStatDto.cs @@ -1,4 +1,5 @@ using System; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Data { diff --git a/AsbCloudApp/Data/DatesRangeDto.cs b/AsbCloudApp/Data/DatesRangeDto.cs index 3f12acb7..a61034b6 100644 --- a/AsbCloudApp/Data/DatesRangeDto.cs +++ b/AsbCloudApp/Data/DatesRangeDto.cs @@ -12,12 +12,12 @@ namespace AsbCloudApp.Data /// Дата начала диапазона /// [Required] - public DateTime From { get; set; } + public DateTimeOffset From { get; set; } /// /// Дата окончания диапазона /// [Required] - public DateTime To { get; set; } + public DateTimeOffset To { get; set; } } } diff --git a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs index e81a45fb..c8b1e15a 100644 --- a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs +++ b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Data.DetectedOperation; diff --git a/AsbCloudApp/Data/WellGroupOpertionDto.cs b/AsbCloudApp/Data/WellOperation/WellGroupOpertionDto.cs similarity index 100% rename from AsbCloudApp/Data/WellGroupOpertionDto.cs rename to AsbCloudApp/Data/WellOperation/WellGroupOpertionDto.cs diff --git a/AsbCloudApp/Data/WellOperationCategoryDto.cs b/AsbCloudApp/Data/WellOperation/WellOperationCategoryDto.cs similarity index 96% rename from AsbCloudApp/Data/WellOperationCategoryDto.cs rename to AsbCloudApp/Data/WellOperation/WellOperationCategoryDto.cs index 108a31f0..2fe0b177 100644 --- a/AsbCloudApp/Data/WellOperationCategoryDto.cs +++ b/AsbCloudApp/Data/WellOperation/WellOperationCategoryDto.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace AsbCloudApp.Data +namespace AsbCloudApp.Data.WellOperation { /// /// DTO категория операции diff --git a/AsbCloudApp/Data/WellOperation/WellOperationDto.cs b/AsbCloudApp/Data/WellOperation/WellOperationDto.cs new file mode 100644 index 00000000..2d8b8c87 --- /dev/null +++ b/AsbCloudApp/Data/WellOperation/WellOperationDto.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace AsbCloudApp.Data.WellOperation; + +public class WellOperationDto : ItemInfoDto, + IId, + IWellRelated +{ + /// + [Required] + public int Id { get; set; } + + /// + [Required] + public int IdWell { get; set; } + + /// + /// Id секции скважины + /// + public int IdWellSectionType { get; set; } + + /// + /// 0 = план или 1 = факт или прогноз = 2 + /// + [Required] + public int IdType { get; set; } + + /// + /// id категории операции + /// + public int IdCategory { get; set; } + + /// + /// Глубина на начало операции, м + /// + public double DepthStart { get; set; } + + /// + /// Глубина после завершения операции, м + /// + [Required] + [Range(0, 50_000)] + public double DepthEnd { get; set; } + + /// + /// Дата начала операции + /// + [Required] + public DateTimeOffset DateStart { get; set; } + + /// + /// Продолжительность, часы + /// + public double DurationHours { get; set; } + + /// + /// Наименование секции + /// + public string? WellSectionTypeCaption { get; set; } + + /// + /// Наименование категории + /// + public string? OperationCategoryName { get; set; } + + /// + /// id плановой операции для сопоставления + /// + public int? IdPlan { get; set; } + + /// + /// Ключ родителя у категории + /// + public int? IdParentCategory { get; set; } + + /// + /// дополнительная информация по операции + /// + [StringLength(8192)] + public string? CategoryInfo { get; set; } + + /// + /// Кол-во дней от даты начала первой плановой (а если её нет, то фактической) операции + /// + [Required] + public double Day { get; set; } + + /// + /// Кол-во часов НПВ от даты начала первой плановой (а если её нет, то фактической) операции + /// + [Required] + public double NptHours { get; set; } + + /// + /// Полезный комментарий + /// + [StringLength(4096, ErrorMessage = "Комментарий не может быть длиннее 4096 символов")] + public string? Comment { get; set; } + + /// + /// Валидация даты + /// + /// + /// + public IEnumerable Validate(ValidationContext validationContext) + { + var gtDate = new DateTimeOffset(2010, 1, 1, 0, 0, 0, TimeSpan.Zero); + if (DateStart <= gtDate) + yield return new ValidationResult( + $"{nameof(DateStart)}: DateStart не может быть меньше {gtDate}", + new[] { nameof(DateStart) }); + } +} \ No newline at end of file diff --git a/AsbCloudApp/Data/WellOperationDataDto.cs b/AsbCloudApp/Data/WellOperationDataDto.cs deleted file mode 100644 index 874bd65c..00000000 --- a/AsbCloudApp/Data/WellOperationDataDto.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace AsbCloudApp.Data -{ - /// Операция на скважине - public class WellOperationDataDto : IWellRelated - { - /// - public int IdWell { get; set; } - - /// - /// id секции скважины - /// - public int IdWellSectionType { get; set; } - - /// - /// id категории операции - /// - public int IdCategory { get; set; } - - /// - /// Глубина на начало операции, м - /// - public double DepthStart { get; set; } - - /// - /// Продолжительность, часы - /// - public double DurationHours { get; set; } - - /// - /// Наименование секции - /// - public string WellSectionTypeCaption { get; set; } = string.Empty; - - /// - /// Наименование категории - /// - public string OperationCategoryName { get; set; } = string.Empty; - } -} diff --git a/AsbCloudApp/Data/WellOperationDto.cs b/AsbCloudApp/Data/WellOperationDto.cs deleted file mode 100644 index 725debfd..00000000 --- a/AsbCloudApp/Data/WellOperationDto.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; - -namespace AsbCloudApp.Data -{ - /// - /// Операции на скважине (заведенные пользователем) - /// - public class WellOperationDto : ItemInfoDto, IId, IWellRelated, IValidatableObject - { - /// - [Required] - public int Id { get; set; } - - /// - [Required] - public int IdWell { get; set; } - - /// - /// id секции скважины - /// - [Required] - public int IdWellSectionType { get; set; } - - /// - /// название секции скважины - /// - public string? WellSectionTypeName { get; set; } - - /// - /// id категории операции - /// - [Required] - [Range(5000, int.MaxValue)] - public int IdCategory { get; set; } - - /// - /// id плановой операции для сопоставления - /// - public int? IdPlan { get; set; } - - /// - /// название категории операции - /// - public string? CategoryName { get; set; } - - /// - /// ключ родителя у категории - /// - public int? IdParentCategory { get; set; } - - /// - /// дополнительная информация по операции - /// - [StringLength(8192)] - public string? CategoryInfo { get; set; } - - /// - /// 0 = план или 1 = факт или прогноз = 2 - /// - [Required] - public int IdType { get; set; } - - /// - /// Глубина на начало операции, м - /// - [Required] - [Range(0, 50_000)] - public double DepthStart { get; set; } - - /// - /// Глубина после завершения операции, м - /// - [Required] - [Range(0, 50_000)] - public double DepthEnd { get; set; } - - /// - /// Кол-во дней от даты начала первой плановой (а если её нет, то фактической) операции - /// - [Required] - public double Day { get; set; } - - /// - /// Кол-во часов НПВ от даты начала первой плановой (а если её нет, то фактической) операции - /// - [Required] - public double NptHours { get; set; } - - /// - /// Дата начала операции - /// - [Required] - public DateTimeOffset DateStart { get; set; } - - /// - /// Продолжительность, часы - /// - [Required] - [Range(0, 50)] - public double DurationHours { get; set; } - - /// - /// Полезный комментарий - /// - [StringLength(4096, ErrorMessage = "Комментарий не может быть длиннее 4096 символов")] - public string? Comment { get; set; } - - /// - /// Валидация даты - /// - /// - /// - public IEnumerable Validate(ValidationContext validationContext) - { - var gtDate = new DateTimeOffset(2010, 1, 1, 0, 0, 0, TimeSpan.Zero); - if (DateStart <= gtDate) - yield return new ValidationResult( - $"{nameof(DateStart)}: DateStart не может быть меньше {gtDate}", - new[] { nameof(DateStart) }); - } - } -} diff --git a/AsbCloudApp/Data/WellOperationPlanDto.cs b/AsbCloudApp/Data/WellOperationPlanDto.cs deleted file mode 100644 index 5c1bac9f..00000000 --- a/AsbCloudApp/Data/WellOperationPlanDto.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; - -namespace AsbCloudApp.Data -{ - /// - /// класс, который хранит список плановых операций для сопоставления - /// и даты последней сопоставленной плановой операции - /// -#nullable enable - public class WellOperationPlanDto - { - /// - /// коллекция плановых операций - /// - [Required] - public IEnumerable WellOperationsPlan { get; set; } = Enumerable.Empty(); - - /// - /// дата последней сопоставленной плановой операции - /// - public DateTime? DateLastAssosiatedPlanOperation { get; set; } - - } - -} From 2734b674ce5126f328e34c556021c2cde734e39d 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 Mar 2024 10:48:50 +0300 Subject: [PATCH 05/52] =?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 --- ...20240320074649_Update_ItemInfo.Designer.cs | 9389 +++++++++++++++++ .../20240320074649_Update_ItemInfo.cs | 37 + .../AsbCloudDbContextModelSnapshot.cs | 742 +- AsbCloudDb/Model/ItemInfo.cs | 2 +- AsbCloudDb/Model/WellOperation.cs | 23 +- 5 files changed, 9834 insertions(+), 359 deletions(-) create mode 100644 AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.Designer.cs create mode 100644 AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.cs diff --git a/AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.Designer.cs b/AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.Designer.cs new file mode 100644 index 00000000..19f8bce0 --- /dev/null +++ b/AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.Designer.cs @@ -0,0 +1,9389 @@ +// +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("20240320074649_Update_ItemInfo")] + partial class Update_ItemInfo + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdDeposit") + .HasColumnType("integer") + .HasColumnName("id_deposit"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.Property("Timezone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex("IdDeposit"); + + b.ToTable("t_cluster", t => + { + t.HasComment("Кусты"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("IdCompanyType") + .HasMaxLength(255) + .HasColumnType("integer") + .HasColumnName("id_company_type") + .HasComment("вид деятельности"); + + b.HasKey("Id"); + + b.HasIndex("IdCompanyType"); + + b.ToTable("t_company"); + + b.HasData( + new + { + Id = 1, + Caption = "ООО \"АСБ\"", + IdCompanyType = 3 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("IsContact") + .HasColumnType("boolean") + .HasColumnName("is_contact"); + + b.Property("Order") + .HasColumnType("integer") + .HasColumnName("order"); + + b.HasKey("Id"); + + b.ToTable("t_company_type"); + + b.HasData( + new + { + Id = 1, + Caption = "Недропользователь", + IsContact = true, + Order = 3 + }, + new + { + Id = 2, + Caption = "Буровой подрядчик", + IsContact = true, + Order = 2 + }, + new + { + Id = 3, + Caption = "Сервис автоматизации бурения", + IsContact = true, + Order = 0 + }, + new + { + Id = 4, + Caption = "Сервис по ГТИ", + IsContact = true, + Order = 6 + }, + new + { + Id = 5, + Caption = "Растворный сервис", + IsContact = true, + Order = 4 + }, + new + { + Id = 6, + Caption = "Сервис по ННБ", + IsContact = true, + Order = 5 + }, + new + { + Id = 7, + Caption = "Служба супервайзинга", + IsContact = false, + Order = 1 + }, + new + { + Id = 9, + Caption = "Сервис по цементированию", + IsContact = true, + Order = 7 + }, + new + { + Id = 11, + Caption = "Дизельный сервис", + IsContact = false, + Order = 9 + }, + new + { + Id = 12, + Caption = "Сервис по обслуживанию верхних силовых приводов", + IsContact = true, + Order = 8 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Company") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("company") + .HasComment("компания"); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("email"); + + b.Property("FullName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("full_name") + .HasComment("ФИО"); + + b.Property("IdCompanyType") + .HasMaxLength(255) + .HasColumnType("integer") + .HasColumnName("id_company_type") + .HasComment("вид деятельности"); + + b.Property("IdWell") + .HasMaxLength(255) + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ключ скважины"); + + b.Property("Phone") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("phone") + .HasComment("номер телефона"); + + b.Property("Position") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("position") + .HasComment("должность"); + + b.HasKey("Id"); + + b.HasIndex("IdCompanyType"); + + b.HasIndex("IdWell"); + + b.ToTable("t_contact", t => + { + t.HasComment("Контакты"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Date") + .HasColumnType("date") + .HasColumnName("date") + .HasComment("Дата формирования отчёта"); + + b.Property("DateLastUpdate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_update") + .HasComment("Дата последнего обновления"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("SignBlock") + .HasColumnType("jsonb") + .HasColumnName("sign_block") + .HasComment("Подпись"); + + b.Property("SubsystemBlock") + .HasColumnType("jsonb") + .HasColumnName("subsystem_block") + .HasComment("Наработкой подсистем"); + + b.Property("TimeBalanceBlock") + .HasColumnType("jsonb") + .HasColumnName("time_balance_block") + .HasComment("Баланс времени"); + + b.HasKey("Id"); + + b.HasIndex("IdWell", "Date") + .IsUnique(); + + b.ToTable("t_daily_report", t => + { + t.HasComment("Ежедневные отчёты"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AxialLoad") + .HasColumnType("double precision") + .HasColumnName("axial_load") + .HasComment("Фактическая нагрузка"); + + b.Property("AxialLoadLimitMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_limit_max") + .HasComment("Максимально допустимая нагрузка"); + + b.Property("AxialLoadSp") + .HasColumnType("double precision") + .HasColumnName("axial_load_sp") + .HasComment("Ограничение факт. нагрузки"); + + b.Property("BlockSpeedSp") + .HasColumnType("double precision") + .HasColumnName("block_speed_sp") + .HasComment("Ограничение скорости блока"); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("Дата и время окончания"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("Дата и время начала"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина забоя по стволу конечная"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина забоя по стволу начальная"); + + b.Property("EnabledSubsystems") + .HasColumnType("integer") + .HasColumnName("enabled_subsystems") + .HasComment("Флаги подсистем"); + + b.Property("Flow") + .HasColumnType("double precision") + .HasColumnName("flow") + .HasComment("Фактический расход"); + + b.Property("HasOscillation") + .HasColumnType("boolean") + .HasColumnName("has_oscillation") + .HasComment("Наличие или отсутствие осцилляции"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Название автоопределённой операции"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator") + .HasComment("Работа при достижении ограничения"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Ключ телеметрии"); + + b.Property("Pressure") + .HasColumnType("double precision") + .HasColumnName("pressure") + .HasComment("Давление"); + + b.Property("PressureIdle") + .HasColumnType("double precision") + .HasColumnName("pressure_idle") + .HasComment("Давление холостого хода"); + + b.Property("PressureSp") + .HasColumnType("double precision") + .HasColumnName("pressure_sp") + .HasComment("Ограничение фактического давления"); + + b.Property("RotorSpeed") + .HasColumnType("double precision") + .HasColumnName("rotor_speed") + .HasComment("Фактическая скорость оборотов ВСП"); + + b.Property("RotorTorque") + .HasColumnType("double precision") + .HasColumnName("rotor_torque") + .HasComment("Фактический момент"); + + b.Property("RotorTorqueLimitMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_limit_max") + .HasComment("Максимально допустимый момент"); + + b.Property("RotorTorqueSp") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_sp") + .HasComment("Ограничение факт. момента"); + + b.Property("Speed") + .HasColumnType("double precision") + .HasColumnName("speed") + .HasComment("Скорость бурения"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_data_saub_stat", t => + { + t.HasComment("Кеш-таблица для хранения данных для РТК-отчета"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.Property("Timezone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.ToTable("t_deposit", t => + { + t.HasComment("Месторождение"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("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", t => + { + t.HasComment("автоматически определенные операции по телеметрии"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Идентификатор телеметрии"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depthStart") + .HasComment("Глубина начала"); + + b.Property("Params") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("t_drill_test_params") + .HasComment("Параметры записи drill test"); + + b.Property("TimeStampStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("timestamp_start") + .HasComment("Время начала"); + + b.HasKey("Id", "IdTelemetry"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_drill_test", t => + { + t.HasComment("Drill_test"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Имя"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("Отчество"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("Фамилия"); + + b.HasKey("Id"); + + b.ToTable("t_driller", t => + { + t.HasComment("Бурильщик"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdFileCategory") + .HasColumnType("integer") + .HasColumnName("id_file_category"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("Id"); + + b.HasIndex("IdFileCategory"); + + b.HasIndex("IdWell", "IdFileCategory") + .IsUnique(); + + b.ToTable("t_drilling_program_part", t => + { + t.HasComment("части программ бурения"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Faq", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Answer") + .HasColumnType("text") + .HasColumnName("answer") + .HasComment("Текст ответа"); + + b.Property("CounterQuestion") + .HasColumnType("integer") + .HasColumnName("counter_question") + .HasComment("Счетчик повторений вопроса"); + + b.Property("DateAnswer") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_answer") + .HasComment("Дата ответа"); + + b.Property("DateCreatedQuestion") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_created_question") + .HasComment("Дата создания вопроса"); + + b.Property("DateLastEditedQuestion") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_edited_question") + .HasComment("Дата последнего редактирования вопроса"); + + b.Property("IdAuthorAnswer") + .HasColumnType("integer") + .HasColumnName("id_author_answer") + .HasComment("id автора ответа"); + + b.Property("IdAuthorQuestion") + .HasColumnType("integer") + .HasColumnName("id_author_question") + .HasComment("id автора вопроса"); + + b.Property("IdReplacementQuestion") + .HasColumnType("integer") + .HasColumnName("id_replacement_question") + .HasComment("Ключ заменяющего вопроса"); + + b.Property("IsFrequently") + .HasColumnType("boolean") + .HasColumnName("is_frequently") + .HasComment("Частый вопрос"); + + b.Property("Question") + .IsRequired() + .HasColumnType("text") + .HasColumnName("question") + .HasComment("Текст вопроса"); + + b.Property("State") + .HasColumnType("integer") + .HasColumnName("state") + .HasComment("Статус вопроса"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthorAnswer"); + + b.HasIndex("IdAuthorQuestion"); + + b.ToTable("t_faq", t => + { + t.HasComment("вопросы пользователей"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_file_category", t => + { + t.HasComment("Категории файлов"); + }); + + b.HasData( + new + { + Id = 1, + Name = "Растворный сервис", + ShortName = "fluidService" + }, + new + { + Id = 2, + Name = "Цементирование", + ShortName = "cement" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "nnb" + }, + new + { + Id = 4, + Name = "ГТИ", + ShortName = "gti" + }, + new + { + Id = 5, + Name = "Документы по скважине", + ShortName = "wellDocuments" + }, + new + { + Id = 6, + Name = "Супервайзер", + ShortName = "supervisor" + }, + new + { + Id = 7, + Name = "Мастер", + ShortName = "master" + }, + new + { + Id = 8, + Name = "Долотный сервис", + ShortName = "toolService" + }, + new + { + Id = 9, + Name = "Буровой подрядчик", + ShortName = "drillService" + }, + new + { + Id = 10, + Name = "Сервис по заканчиванию скважины", + ShortName = "closingService" + }, + new + { + Id = 12, + Name = "Рапорт", + ShortName = "report" + }, + new + { + Id = 1000, + Name = "Программа бурения" + }, + new + { + Id = 1001, + Name = "Задание от геологов" + }, + new + { + Id = 1002, + Name = "Профиль ствола скважины (ННБ)" + }, + new + { + Id = 1003, + Name = "Технологические расчеты (ННБ)" + }, + new + { + Id = 1004, + Name = "Долотная программа" + }, + new + { + Id = 1005, + Name = "Программа по растворам" + }, + new + { + Id = 1006, + Name = "Программа геофизических исследований" + }, + new + { + Id = 1007, + Name = "Планы спусков обсадных колонн" + }, + new + { + Id = 1008, + Name = "Программы цементирования обсадных колонн" + }, + new + { + Id = 10000, + Name = "Проект на бурение транспортного и горизонтального участков скважины" + }, + new + { + Id = 10001, + Name = "Программа на бурение транспортного и горизонтального участков скважины" + }, + new + { + Id = 10002, + Name = "Акт о начале бурения" + }, + new + { + Id = 10003, + Name = "План работ спуска и цементирования направления" + }, + new + { + Id = 10004, + Name = "Программа цементирования направления" + }, + new + { + Id = 10005, + Name = "Мера обсадных труб (направление)" + }, + new + { + Id = 10006, + Name = "Акт на выполненные работы по цементированию направления" + }, + new + { + Id = 10007, + Name = "Отчет по цементированию направления (график)" + }, + new + { + Id = 10008, + Name = "План работ спуска и цементирования кондуктора" + }, + new + { + Id = 10009, + Name = "Программа цементирования (кондуктор)" + }, + new + { + Id = 10010, + Name = "Мера обсадных труб (кондуктор)" + }, + new + { + Id = 10011, + Name = "Карта крепления кондуктора" + }, + new + { + Id = 10012, + Name = "Акт на выполненные работы по цементированию кондуктора" + }, + new + { + Id = 10013, + Name = "Отчет по цементированию кондуктора (график)" + }, + new + { + Id = 10014, + Name = "Акт о замере расстояния от стола ротора до муфты кондуктора" + }, + new + { + Id = 10015, + Name = "Акт опресовки цементного кольца за кондуктором" + }, + new + { + Id = 10016, + Name = "Акт опресовки ППГ с глухими плашками совместно с кондуктором" + }, + new + { + Id = 10017, + Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с кондуктором" + }, + new + { + Id = 10018, + Name = "План работ на крепление обсадной колонны (эк. колонна)" + }, + new + { + Id = 10019, + Name = "Программа цементирования (эк. колонна)" + }, + new + { + Id = 10020, + Name = "Мера труб эксплуатационной колонны" + }, + new + { + Id = 10021, + Name = "Карта по креплению скважины (эк. колонна)" + }, + new + { + Id = 10022, + Name = "Акт на установку пружинных центраторов" + }, + new + { + Id = 10023, + Name = "Отчет по цементированию эксплуатационной колонны (график)" + }, + new + { + Id = 10024, + Name = "Акт на выполненные работы по цементированию эксплуатационной колонны" + }, + new + { + Id = 10025, + Name = "Акт об испытании эк. колонны на герметичность (СТОП)" + }, + new + { + Id = 10026, + Name = "Акт опресовки ППГ с глухими плашками совместно с э/колонной" + }, + new + { + Id = 10027, + Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с э/колонной" + }, + new + { + Id = 10028, + Name = "Акт на вскрытие продуктивного пласта" + }, + new + { + Id = 10029, + Name = "Акт замера параметров раствора при бурении горизонтального участка" + }, + new + { + Id = 10030, + Name = "Разрешение на спуск «хвостовика» (телефонограмма)" + }, + new + { + Id = 10031, + Name = "План работ на спуск «хвостовика»" + }, + new + { + Id = 10032, + Name = "Акт готовности бурового и энергетического оборудования к спуску «хвостовика»" + }, + new + { + Id = 10033, + Name = "Акт шаблонировки ствола скважины перед спуском «хвостовика»" + }, + new + { + Id = 10034, + Name = "Мера обсадных труб (хвостовик)" + }, + new + { + Id = 10035, + Name = "Акт выполненных работ по спуску хвостовика с закачкой (нефти, солевого раствора" + }, + new + { + Id = 10036, + Name = "Акт о переводе скважины на тех. воду" + }, + new + { + Id = 10037, + Name = "Акт об окончании бурения" + }, + new + { + Id = 10038, + Name = "Акт на передачу скважины в освоение (КРС)" + }, + new + { + Id = 10039, + Name = "Акт на опресовку межколонного пространства с КРС" + }, + new + { + Id = 10040, + Name = "Акт на сдачу скважины в ЦДНГ" + }, + new + { + Id = 10041, + Name = "Паспорт ОУС (заполняется геологами)" + }, + new + { + Id = 10042, + Name = "Паспорт скважины (заполняется геологами)" + }, + new + { + Id = 10043, + Name = "Фактические данные бурения (вставляются в паспорт скважины)" + }, + new + { + Id = 20000, + Name = "Справки по страницам" + }, + new + { + Id = 30000, + Name = "Инструкции" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории файла"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Удален ли файл"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название файла"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("file_size") + .HasComment("Размер файла"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_file_info", t => + { + t.HasComment("Файлы всех категорий"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_created") + .HasComment("Дата совершенного действия"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла"); + + b.Property("IdMarkType") + .HasColumnType("integer") + .HasColumnName("id_mark_type") + .HasComment("0 - отклонен, 1 - согласован"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("id пользователя"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Помечен ли файл как удаленный"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdUser"); + + b.ToTable("t_file_mark", t => + { + t.HasComment("Действия с файлами."); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdRecord") + .HasColumnType("integer") + .HasColumnName("id_record"); + + b.Property("IdItem") + .HasColumnType("integer") + .HasColumnName("id_item"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Value") + .HasColumnType("real") + .HasColumnName("value"); + + b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); + + b.ToTable("t_wits_float", t => + { + t.HasComment("таблица данных ГТИ с типом значения float"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdRecord") + .HasColumnType("integer") + .HasColumnName("id_record"); + + b.Property("IdItem") + .HasColumnType("integer") + .HasColumnName("id_item"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Value") + .HasColumnType("integer") + .HasColumnName("value"); + + b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); + + b.ToTable("t_wits_int", t => + { + t.HasComment("таблица данных ГТИ с типом значения int"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdRecord") + .HasColumnType("integer") + .HasColumnName("id_record"); + + b.Property("IdItem") + .HasColumnType("integer") + .HasColumnName("id_item"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text") + .HasColumnName("value"); + + b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); + + b.ToTable("t_wits_string", t => + { + t.HasComment("таблица данных ГТИ с типом значения string"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории файла"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название файла"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("file_size") + .HasComment("Размер файла"); + + b.Property("UrlPage") + .IsRequired() + .HasColumnType("text") + .HasColumnName("url_page") + .HasComment("Url страницы"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.ToTable("t_help_page", t => + { + t.HasComment("Справки"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start"); + + b.Property("DepthEnd") + .HasColumnType("real") + .HasColumnName("depth_end"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depth_start"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_limiting_parameter", t => + { + t.HasComment("Ограничения по параметрам телеметрии"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.Manual", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateDownload") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_download") + .HasComment("Дата загрузки"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id автора"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории файла"); + + b.Property("IdDirectory") + .HasColumnType("integer") + .HasColumnName("id_directory") + .HasComment("Id директории"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdDirectory"); + + b.ToTable("t_manual", t => + { + t.HasComment("Инструкции"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("Id родительской директории"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.HasIndex("IdParent"); + + b.ToTable("t_manual_directory", t => + { + t.HasComment("Директория для инструкций"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Data") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("data") + .HasComment("Данные таблицы последних данных"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Пометка удаленным"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone") + .HasColumnName("timestamp") + .HasComment("время добавления"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_measure", t => + { + t.HasComment("Таблица c данными для вкладки 'Последние данные'"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_measure_category", t => + { + t.HasComment("Категория последних данных"); + }); + + b.HasData( + new + { + Id = 1, + Name = "Показатели бурового раствора", + ShortName = "Раствор" + }, + new + { + Id = 2, + Name = "Шламограмма", + ShortName = "Шламограмма" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "ННБ" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Notification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdNotificationCategory") + .HasColumnType("integer") + .HasColumnName("id_notification_category") + .HasComment("Id категории уведомления"); + + b.Property("IdTransportType") + .HasColumnType("integer") + .HasColumnName("id_transport_type") + .HasComment("Id типа доставки уведомления"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id получателя"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message") + .HasComment("Сообщение уведомления"); + + b.Property("ReadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("read_date") + .HasComment("Дата прочтения уведомления"); + + b.Property("RegistrationDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("registration_date") + .HasComment("Дата регистрации уведомления"); + + b.Property("SentDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("sent_date") + .HasComment("Дата отправки уведомления"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text") + .HasColumnName("title") + .HasComment("Заголовок уведомления"); + + b.HasKey("Id"); + + b.HasIndex("IdNotificationCategory"); + + b.HasIndex("IdUser"); + + b.ToTable("t_notification", t => + { + t.HasComment("Уведомления"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("t_notification_category", t => + { + t.HasComment("Категории уведомлений"); + }); + + b.HasData( + new + { + Id = 1, + Name = "Системные уведомления" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.OperationValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Старотовая глубина"); + + b.Property("IdOperationCategory") + .HasColumnType("integer") + .HasColumnName("id_operation_category") + .HasComment("Ид категории операции"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Ид скважины"); + + b.Property("StandardValue") + .HasColumnType("double precision") + .HasColumnName("standard_value") + .HasComment("Нормативный показатель"); + + b.Property("TargetValue") + .HasColumnType("double precision") + .HasColumnName("target_value") + .HasComment("Целевой показатель"); + + b.HasKey("Id"); + + b.HasIndex("IdOperationCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_operationvalue", t => + { + t.HasComment("Целевые/нормативные показатели операции"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission", t => + { + t.HasComment("Разрешения на доступ к данным"); + }); + + b.HasData( + new + { + Id = 100, + Description = "Разрешение удалять админ. Кусты", + Name = "AdminCluster.delete" + }, + new + { + Id = 101, + Description = "Разрешение редактировать админ. Кусты", + Name = "AdminCluster.edit" + }, + new + { + Id = 102, + Description = "Разрешение просматривать админ. Кусты", + Name = "AdminCluster.get" + }, + new + { + Id = 103, + Description = "Разрешение удалять админ. Компании", + Name = "AdminCompany.delete" + }, + new + { + Id = 104, + Description = "Разрешение редактировать админ. Компании", + Name = "AdminCompany.edit" + }, + new + { + Id = 105, + Description = "Разрешение просматривать админ. Компании", + Name = "AdminCompany.get" + }, + new + { + Id = 106, + Description = "Разрешение удалять админ. Типы компаний", + Name = "AdminCompanyType.delete" + }, + new + { + Id = 107, + Description = "Разрешение редактировать админ. Типы компаний", + Name = "AdminCompanyType.edit" + }, + new + { + Id = 108, + Description = "Разрешение просматривать админ. Типы компаний", + Name = "AdminCompanyType.get" + }, + new + { + Id = 109, + Description = "Разрешение удалять админ. Месторождения", + Name = "AdminDeposit.delete" + }, + new + { + Id = 110, + Description = "Разрешение редактировать админ. Месторождения", + Name = "AdminDeposit.edit" + }, + new + { + Id = 111, + Description = "Разрешение просматривать админ. Месторождения", + Name = "AdminDeposit.get" + }, + new + { + Id = 112, + Description = "Разрешение удалять админ. Разрешения", + Name = "AdminPermission.delete" + }, + new + { + Id = 113, + Description = "Разрешение редактировать админ. Разрешения", + Name = "AdminPermission.edit" + }, + new + { + Id = 114, + Description = "Разрешение просматривать админ. Разрешения", + Name = "AdminPermission.get" + }, + new + { + Id = 115, + Description = "Разрешение удалять админ. Телеметрию", + Name = "AdminTelemetry.delete" + }, + new + { + Id = 116, + Description = "Разрешение редактировать админ. Телеметрию", + Name = "AdminTelemetry.edit" + }, + new + { + Id = 117, + Description = "Разрешение просматривать админ. Телеметрию", + Name = "AdminTelemetry.get" + }, + new + { + Id = 118, + Description = "Разрешение удалять админ. Пользователей", + Name = "AdminUser.delete" + }, + new + { + Id = 119, + Description = "Разрешение редактировать админ. Пользователей", + Name = "AdminUser.edit" + }, + new + { + Id = 120, + Description = "Разрешение просматривать админ. Пользователей", + Name = "AdminUser.get" + }, + new + { + Id = 121, + Description = "Разрешение удалять админ. Роли пользователей", + Name = "AdminUserRole.delete" + }, + new + { + Id = 122, + Description = "Разрешение редактировать админ. Роли пользователей", + Name = "AdminUserRole.edit" + }, + new + { + Id = 123, + Description = "Разрешение просматривать админ. Роли пользователей", + Name = "AdminUserRole.get" + }, + new + { + Id = 124, + Description = "Разрешение удалять админ. Скважины", + Name = "AdminWell.delete" + }, + new + { + Id = 125, + Description = "Разрешение редактировать админ. Скважины", + Name = "AdminWell.edit" + }, + new + { + Id = 126, + Description = "Разрешение просматривать админ. Скважины", + Name = "AdminWell.get" + }, + new + { + Id = 127, + Description = "Разрешение удалять админ. Подсистемы", + Name = "AdminSubsytem.delete" + }, + new + { + Id = 128, + Description = "Разрешение редактировать админ. Подсистемы", + Name = "AdminSubsytem.edit" + }, + new + { + Id = 129, + Description = "Разрешение просматривать админ. Подсистемы", + Name = "AdminSubsytem.get" + }, + new + { + Id = 200, + Description = "Разрешение редактировать 0", + Name = "Auth.edit" + }, + new + { + Id = 201, + Description = "Разрешение просматривать 0", + Name = "Auth.get" + }, + new + { + Id = 202, + Description = "Разрешение просматривать Кусты", + Name = "Cluster.get" + }, + new + { + Id = 203, + Description = "Разрешение просматривать Месторождения", + Name = "Deposit.get" + }, + new + { + Id = 204, + Description = "Разрешение удалять РТК", + Name = "DrillFlowChart.delete" + }, + new + { + Id = 205, + Description = "Разрешение редактировать РТК", + Name = "DrillFlowChart.edit" + }, + new + { + Id = 206, + Description = "Разрешение просматривать РТК", + Name = "DrillFlowChart.get" + }, + new + { + Id = 207, + Description = "Разрешение удалять Программу бурения", + Name = "DrillingProgram.delete" + }, + new + { + Id = 208, + Description = "Разрешение редактировать Программу бурения", + Name = "DrillingProgram.edit" + }, + new + { + Id = 209, + Description = "Разрешение просматривать Программу бурения", + Name = "DrillingProgram.get" + }, + new + { + Id = 210, + Description = "Разрешение удалять Режимы бурения", + Name = "DrillParams.delete" + }, + new + { + Id = 211, + Description = "Разрешение редактировать Режимы бурения", + Name = "DrillParams.edit" + }, + new + { + Id = 212, + Description = "Разрешение просматривать Режимы бурения", + Name = "DrillParams.get" + }, + new + { + Id = 213, + Description = "Разрешение удалять Файлы", + Name = "File.delete" + }, + new + { + Id = 214, + Description = "Разрешение редактировать Файлы", + Name = "File.edit" + }, + new + { + Id = 215, + Description = "Разрешение просматривать Файлы", + Name = "File.get" + }, + new + { + Id = 216, + Description = "Разрешение удалять Измерения", + Name = "Measure.delete" + }, + new + { + Id = 217, + Description = "Разрешение редактировать Измерения", + Name = "Measure.edit" + }, + new + { + Id = 218, + Description = "Разрешение просматривать Измерения", + Name = "Measure.get" + }, + new + { + Id = 219, + Description = "Разрешение просматривать Сообщения телеметрии", + Name = "Message.get" + }, + new + { + Id = 220, + Description = "Разрешение просматривать Статистику по операциям", + Name = "OperationStat.get" + }, + new + { + Id = 221, + Description = "Разрешение редактировать Рапорта", + Name = "Report.edit" + }, + new + { + Id = 222, + Description = "Разрешение просматривать Рапорта", + Name = "Report.get" + }, + new + { + Id = 223, + Description = "Разрешение просматривать админ. Системная статистика", + Name = "RequestTracker.get" + }, + new + { + Id = 224, + Description = "Разрешение удалять Рекомендации уставок", + Name = "Setpoints.delete" + }, + new + { + Id = 225, + Description = "Разрешение редактировать Рекомендации уставок", + Name = "Setpoints.edit" + }, + new + { + Id = 226, + Description = "Разрешение просматривать Рекомендации уставок", + Name = "Setpoints.get" + }, + new + { + Id = 227, + Description = "Разрешение редактировать Телеметрии", + Name = "Telemetry.edit" + }, + new + { + Id = 228, + Description = "Разрешение просматривать Анализ телеметрии", + Name = "TelemetryAnalytics.get" + }, + new + { + Id = 229, + Description = "Разрешение редактировать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.edit" + }, + new + { + Id = 230, + Description = "Разрешение просматривать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.get" + }, + new + { + Id = 231, + Description = "Разрешение редактировать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.edit" + }, + new + { + Id = 232, + Description = "Разрешение просматривать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.get" + }, + new + { + Id = 233, + Description = "Разрешение редактировать Скважины", + Name = "Well.edit" + }, + new + { + Id = 234, + Description = "Разрешение просматривать Скважины", + Name = "Well.get" + }, + new + { + Id = 235, + Description = "Разрешение редактировать Композитные скважины", + Name = "WellComposite.edit" + }, + new + { + Id = 236, + Description = "Разрешение просматривать Композитные скважины", + Name = "WellComposite.get" + }, + new + { + Id = 237, + Description = "Разрешение удалять Операции по скважинам", + Name = "WellOperation.delete" + }, + new + { + Id = 238, + Description = "Разрешение редактировать Операции по скважинам", + Name = "WellOperation.edit" + }, + new + { + Id = 239, + Description = "Разрешение просматривать Операции по скважинам", + Name = "WellOperation.get" + }, + new + { + Id = 240, + Description = "Разрешение редактировать Файлы категории 1 (Растворный сервис)", + Name = "File.edit1" + }, + new + { + Id = 241, + Description = "Разрешение редактировать Файлы категории 2 (Цементирование)", + Name = "File.edit2" + }, + new + { + Id = 242, + Description = "Разрешение редактировать Файлы категории 3 (ННБ)", + Name = "File.edit3" + }, + new + { + Id = 243, + Description = "Разрешение редактировать Файлы категории 4 (ГТИ)", + Name = "File.edit4" + }, + new + { + Id = 244, + Description = "Разрешение редактировать Файлы категории 5 (Документы по скважине)", + Name = "File.edit5" + }, + new + { + Id = 245, + Description = "Разрешение редактировать Файлы категории 6 (Супервайзер)", + Name = "File.edit6" + }, + new + { + Id = 246, + Description = "Разрешение редактировать Файлы категории 7 (Мастер)", + Name = "File.edit7" + }, + new + { + Id = 247, + Description = "Разрешение редактировать Файлы категории 8 (Долотный сервис)", + Name = "File.edit8" + }, + new + { + Id = 248, + Description = "Разрешение редактировать Файлы категории 9 (Буровой подрядчик)", + Name = "File.edit9" + }, + new + { + Id = 249, + Description = "Разрешение редактировать Файлы категории 10 (Сервис по заканчиванию скважины)", + Name = "File.edit10" + }, + new + { + Id = 250, + Description = "Разрешение редактировать Файлы категории 11 (Рапорт)", + Name = "File.edit11" + }, + new + { + Id = 251, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit12" + }, + new + { + Id = 252, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit13" + }, + new + { + Id = 253, + Description = "Разрешение редактировать Файлы категории 13", + Name = "File.edit14" + }, + new + { + Id = 254, + Description = "Разрешение редактировать Файлы категории 14", + Name = "File.edit15" + }, + new + { + Id = 255, + Description = "Разрешение редактировать Файлы категории 15", + Name = "File.edit16" + }, + new + { + Id = 256, + Description = "Разрешение редактировать Файлы категории 16", + Name = "File.edit17" + }, + new + { + Id = 257, + Description = "Разрешение редактировать Файлы категории 17", + Name = "File.edit18" + }, + new + { + Id = 258, + Description = "Разрешение редактировать Файлы категории 18", + Name = "File.edit19" + }, + new + { + Id = 259, + Description = "Разрешение редактировать Файлы категории 19", + Name = "File.edit20" + }, + new + { + Id = 260, + Description = "Разрешение редактировать Файлы категории 20", + Name = "File.edit21" + }, + new + { + Id = 261, + Description = "Разрешение редактировать Файлы категории 21", + Name = "File.edit22" + }, + new + { + Id = 262, + Description = "Разрешение редактировать Файлы категории 22", + Name = "File.edit23" + }, + new + { + Id = 263, + Description = "Разрешение редактировать Файлы категории 23", + Name = "File.edit24" + }, + new + { + Id = 264, + Description = "Разрешение редактировать Файлы категории 24", + Name = "File.edit25" + }, + new + { + Id = 265, + Description = "Разрешение редактировать Файлы категории 25", + Name = "File.edit26" + }, + new + { + Id = 266, + Description = "Разрешение редактировать Файлы категории 26", + Name = "File.edit27" + }, + new + { + Id = 267, + Description = "Разрешение редактировать Файлы категории 27", + Name = "File.edit28" + }, + new + { + Id = 268, + Description = "Разрешение редактировать Файлы категории 28", + Name = "File.edit29" + }, + new + { + Id = 269, + Description = "Разрешение редактировать Файлы категории 29", + Name = "File.edit30" + }, + new + { + Id = 380, + Description = "Разрешение просматривать список бурильщиков", + Name = "Driller.get" + }, + new + { + Id = 381, + Description = "Разрешение редактировать бурильщика", + Name = "Driller.edit" + }, + new + { + Id = 382, + Description = "Разрешение удалять бурильщик", + Name = "Driller.delete" + }, + new + { + Id = 383, + Description = "Разрешение просматривать графики бурильщиков", + Name = "Schedule.get" + }, + new + { + Id = 384, + Description = "Разрешение редактировать график бурильщика", + Name = "Schedule.edit" + }, + new + { + Id = 385, + Description = "Разрешение удалять график бурильщика", + Name = "Schedule.delete" + }, + new + { + Id = 386, + Description = "Разрешение просматривать суточный рапорт", + Name = "DailyReport.get" + }, + new + { + Id = 387, + Description = "Разрешение редактировать суточный рапорт", + Name = "DailyReport.edit" + }, + new + { + Id = 388, + Description = "Разрешение просматривать авто. определенные операции", + Name = "DetectedOperation.get" + }, + new + { + Id = 389, + Description = "Разрешение просматривать целевые значения", + Name = "OperationValue.get" + }, + new + { + Id = 390, + Description = "Разрешение редактировать целевые значения", + Name = "OperationValue.edit" + }, + new + { + Id = 391, + Description = "Разрешение удалять целевые значения", + Name = "OperationValue.delete" + }, + new + { + Id = 400, + Description = "Разрешение просматривать инфо по wits параметрам", + Name = "WitsInfo.get" + }, + new + { + Id = 401, + Description = "Разрешение просматривать WITS record 1", + Name = "WitsRecord1.get" + }, + new + { + Id = 407, + Description = "Разрешение просматривать WITS record 7", + Name = "WitsRecord7.get" + }, + new + { + Id = 408, + Description = "Разрешение просматривать WITS record 8", + Name = "WitsRecord8.get" + }, + new + { + Id = 450, + Description = "Разрешение просматривать WITS record 50", + Name = "WitsRecord50.get" + }, + new + { + Id = 460, + Description = "Разрешение просматривать WITS record 60", + Name = "WitsRecord60.get" + }, + new + { + Id = 461, + Description = "Разрешение просматривать WITS record 61", + Name = "WitsRecord61.get" + }, + new + { + Id = 500, + Description = "Разрешение удалять Категорий документов файлов", + Name = "FileCategory.delete" + }, + new + { + Id = 501, + Description = "Разрешение редактировать Категорий документов файлов", + Name = "FileCategory.edit" + }, + new + { + Id = 502, + Description = "Разрешение просматривать Категорий документов файлов", + Name = "FileCategory.get" + }, + new + { + Id = 503, + Description = "Разрешение удалять Дело скважины", + Name = "WellFinalDocuments.delete" + }, + new + { + Id = 504, + Description = "Разрешение редактировать Дело скважины", + Name = "WellFinalDocuments.edit" + }, + new + { + Id = 505, + Description = "Разрешение просматривать Дело скважины", + Name = "WellFinalDocuments.get" + }, + new + { + Id = 506, + Description = "Разрешение редактировать ответственных за загрузку файла Дело скважины", + Name = "WellFinalDocuments.editPublisher" + }, + new + { + Id = 507, + Description = "Разрешение просматривать наработка талевого каната", + Name = "TelemetryWirelineRunOut.get" + }, + new + { + Id = 510, + Description = "Разрешение просматривать плановая траектория", + Name = "PlannedTrajectory.get" + }, + new + { + Id = 511, + Description = "Разрешение редактировать плановая траектория", + Name = "PlannedTrajectory.edit" + }, + new + { + Id = 512, + Description = "Разрешение удалять плановая траектория", + Name = "PlannedTrajectory.delete" + }, + new + { + Id = 516, + Description = "Разрешение просматривать статистику вопросов", + Name = "FaqStatistics.get" + }, + new + { + Id = 517, + Description = "Разрешение редактировать вопрос", + Name = "FaqStatistics.edit" + }, + new + { + Id = 518, + Description = "Разрешение удалять вопрос", + Name = "FaqStatistics.delete" + }, + new + { + Id = 519, + Description = "Разрешение просматривать список контактов", + Name = "WellContact.get" + }, + new + { + Id = 520, + Description = "Разрешение редактировать список контактов", + Name = "WellContact.edit" + }, + new + { + Id = 521, + Description = "Разрешить создание справок по страницам", + Name = "HelpPage.edit" + }, + new + { + Id = 522, + Description = "Разрешить удаление всех настроек пользователя", + Name = "UserSettings.delete" + }, + new + { + Id = 523, + Description = "Разрешить редактирование инструкций", + Name = "Manual.edit" + }, + new + { + Id = 524, + Description = "Разрешить получение инструкций", + Name = "Manual.get" + }, + new + { + Id = 525, + Description = "Разрешение на редактирование РТК у завершенной скважины", + Name = "ProcessMap.editCompletedWell" + }, + new + { + Id = 526, + Description = "Разрешение на редактирование операций у завершенной скважины", + Name = "WellOperation.editCompletedWell" + }, + new + { + Id = 527, + Description = "Разрешение на удаление инструкций", + Name = "Manual.delete" + }, + new + { + Id = 528, + Description = "Разрешение на удаление контакта", + Name = "WellContact.delete" + }, + new + { + Id = 530, + Description = "Разрешение на редактирование плановой конструкции скважины", + Name = "WellSectionPlan.edit" + }, + new + { + Id = 531, + Description = "Разрешение на удаление плановой конструкции скважины", + Name = "WellSectionPlan.delete" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AxialLoadLimitMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_limit_max") + .HasComment("Осевая нагрузка, т, допустимый максимум"); + + b.Property("AxialLoadPlan") + .HasColumnType("double precision") + .HasColumnName("axial_load_plan") + .HasComment("Осевая нагрузка, т, план"); + + b.Property("Comment") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .HasComment("дата создания"); + + b.Property("DeltaPressureLimitMax") + .HasColumnType("double precision") + .HasColumnName("delta_pressure_limit_max") + .HasComment("Перепад давления, атм, допустимый максимум"); + + b.Property("DeltaPressurePlan") + .HasColumnType("double precision") + .HasColumnName("delta_pressure_plan") + .HasComment("Перепад давления, атм, план"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина по стволу до, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина по стволу от, м"); + + b.Property("FlowLimitMax") + .HasColumnType("double precision") + .HasColumnName("flow_limit_max") + .HasComment("Расход, л/с, допустимый максимум"); + + b.Property("FlowPlan") + .HasColumnType("double precision") + .HasColumnName("flow_plan") + .HasComment("Расход, л/с, план"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Автор"); + + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); + + b.Property("IdMode") + .HasColumnType("integer") + .HasColumnName("id_mode") + .HasComment("Id режима (1- ротор, 2 слайд)"); + + b.Property("IdPrevious") + .HasColumnType("integer") + .HasColumnName("id_previous") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("Obsolete") + .HasColumnType("timestamp with time zone") + .HasColumnName("obsolete") + .HasComment("дата устаревания"); + + b.Property("RopPlan") + .HasColumnType("double precision") + .HasColumnName("rop_plan") + .HasComment("Плановая механическая скорость, м/ч"); + + b.Property("TopDriveSpeedLimitMax") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_limit_max") + .HasComment("Обороты на ВСП, допустимый максимум"); + + b.Property("TopDriveSpeedPlan") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_plan") + .HasComment("Обороты на ВСП, план"); + + b.Property("TopDriveTorqueLimitMax") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_limit_max") + .HasComment("Момент на ВСП, допустимый максимум"); + + b.Property("TopDriveTorquePlan") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_plan") + .HasComment("Момент на ВСП, план"); + + b.Property("UsageSaub") + .HasColumnType("double precision") + .HasColumnName("usage_saub") + .HasComment("Плановый процент использования АКБ"); + + b.Property("UsageSpin") + .HasColumnType("double precision") + .HasColumnName("usage_spin") + .HasComment("Плановый процент использования spin master"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdEditor"); + + b.HasIndex("IdPrevious"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map_plan_drilling", t => + { + t.HasComment("РТК план бурение"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .HasComment("дата создания"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина по стволу до, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина по стволу от, м"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Автор"); + + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); + + b.Property("IdPrevious") + .HasColumnType("integer") + .HasColumnName("id_previous") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("Obsolete") + .HasColumnType("timestamp with time zone") + .HasColumnName("obsolete") + .HasComment("дата устаревания"); + + b.Property("Pressure") + .HasColumnType("double precision") + .HasColumnName("pressure") + .HasComment("Давление, атм"); + + b.Property("Repeats") + .HasColumnType("double precision") + .HasColumnName("repeats") + .HasComment("Количество повторений"); + + b.Property("SetpointDrag") + .HasColumnType("double precision") + .HasColumnName("setpoint_drag") + .HasComment("Уставка зятяжки, т"); + + b.Property("SetpointTight") + .HasColumnType("double precision") + .HasColumnName("setpoint_tight") + .HasComment("Уставка посадки, т"); + + b.Property("SpeedDownward") + .HasColumnType("double precision") + .HasColumnName("speed_downward") + .HasComment("Скорость спуска, м/ч"); + + b.Property("SpeedUpward") + .HasColumnType("double precision") + .HasColumnName("speed_upward") + .HasComment("Скорость подъёма, м/ч"); + + b.Property("SpinDownward") + .HasColumnType("double precision") + .HasColumnName("spin_downward") + .HasComment("Вращение при движении вниз, об/мин"); + + b.Property("SpinUpward") + .HasColumnType("double precision") + .HasColumnName("spin_upward") + .HasComment("Вращение при движении вверх, об/мин"); + + b.Property("Torque") + .HasColumnType("double precision") + .HasColumnName("torque") + .HasComment("Момент, кН*м"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdEditor"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map_plan_ream", t => + { + t.HasComment("РТК проработка скважины"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("IdCompany", "IdWell"); + + b.HasIndex("IdWell"); + + b.ToTable("t_relation_company_well", t => + { + t.HasComment("отношение скважин и компаний"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationContactWell", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.HasKey("IdWell", "IdUser"); + + b.HasIndex("IdUser"); + + b.ToTable("t_relation_contact_well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdDrillingProgramPart") + .HasColumnType("integer") + .HasColumnName("id_drilling_program_part"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_role") + .HasComment("1 - publisher, 2 - approver"); + + b.HasKey("IdUser", "IdDrillingProgramPart") + .HasName("t_relation_user_drilling_program_part_pk"); + + b.HasIndex("IdDrillingProgramPart"); + + b.ToTable("t_relation_user_drilling_program_part", t => + { + t.HasComment("Отношение пользователей и частей ПБ"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission", t => + { + t.HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + b.HasData( + new + { + IdUserRole = 1100, + IdPermission = 102 + }, + new + { + IdUserRole = 1100, + IdPermission = 111 + }, + new + { + IdUserRole = 1101, + IdPermission = 101 + }, + new + { + IdUserRole = 1101, + IdPermission = 100 + }, + new + { + IdUserRole = 1102, + IdPermission = 105 + }, + new + { + IdUserRole = 1102, + IdPermission = 108 + }, + new + { + IdUserRole = 1103, + IdPermission = 104 + }, + new + { + IdUserRole = 1103, + IdPermission = 103 + }, + new + { + IdUserRole = 1104, + IdPermission = 108 + }, + new + { + IdUserRole = 1105, + IdPermission = 107 + }, + new + { + IdUserRole = 1105, + IdPermission = 106 + }, + new + { + IdUserRole = 1106, + IdPermission = 111 + }, + new + { + IdUserRole = 1107, + IdPermission = 110 + }, + new + { + IdUserRole = 1107, + IdPermission = 109 + }, + new + { + IdUserRole = 1108, + IdPermission = 114 + }, + new + { + IdUserRole = 1109, + IdPermission = 113 + }, + new + { + IdUserRole = 1109, + IdPermission = 112 + }, + new + { + IdUserRole = 1110, + IdPermission = 123 + }, + new + { + IdUserRole = 1110, + IdPermission = 114 + }, + new + { + IdUserRole = 1111, + IdPermission = 122 + }, + new + { + IdUserRole = 1111, + IdPermission = 121 + }, + new + { + IdUserRole = 1112, + IdPermission = 117 + }, + new + { + IdUserRole = 1113, + IdPermission = 105 + }, + new + { + IdUserRole = 1113, + IdPermission = 123 + }, + new + { + IdUserRole = 1113, + IdPermission = 120 + }, + new + { + IdUserRole = 1114, + IdPermission = 119 + }, + new + { + IdUserRole = 1114, + IdPermission = 118 + }, + new + { + IdUserRole = 1114, + IdPermission = 200 + }, + new + { + IdUserRole = 1115, + IdPermission = 223 + }, + new + { + IdUserRole = 1116, + IdPermission = 105 + }, + new + { + IdUserRole = 1116, + IdPermission = 102 + }, + new + { + IdUserRole = 1116, + IdPermission = 117 + }, + new + { + IdUserRole = 1116, + IdPermission = 126 + }, + new + { + IdUserRole = 1117, + IdPermission = 125 + }, + new + { + IdUserRole = 1117, + IdPermission = 124 + }, + new + { + IdUserRole = 1200, + IdPermission = 203 + }, + new + { + IdUserRole = 1200, + IdPermission = 230 + }, + new + { + IdUserRole = 1201, + IdPermission = 202 + }, + new + { + IdUserRole = 1201, + IdPermission = 203 + }, + new + { + IdUserRole = 1201, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 203 + }, + new + { + IdUserRole = 1202, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 236 + }, + new + { + IdUserRole = 1202, + IdPermission = 212 + }, + new + { + IdUserRole = 1203, + IdPermission = 235 + }, + new + { + IdUserRole = 1204, + IdPermission = 202 + }, + new + { + IdUserRole = 1204, + IdPermission = 203 + }, + new + { + IdUserRole = 1205, + IdPermission = 215 + }, + new + { + IdUserRole = 1206, + IdPermission = 203 + }, + new + { + IdUserRole = 1206, + IdPermission = 206 + }, + new + { + IdUserRole = 1207, + IdPermission = 205 + }, + new + { + IdUserRole = 1208, + IdPermission = 218 + }, + new + { + IdUserRole = 1209, + IdPermission = 217 + }, + new + { + IdUserRole = 1210, + IdPermission = 203 + }, + new + { + IdUserRole = 1210, + IdPermission = 230 + }, + new + { + IdUserRole = 1210, + IdPermission = 219 + }, + new + { + IdUserRole = 1211, + IdPermission = 203 + }, + new + { + IdUserRole = 1211, + IdPermission = 220 + }, + new + { + IdUserRole = 1211, + IdPermission = 239 + }, + new + { + IdUserRole = 1212, + IdPermission = 238 + }, + new + { + IdUserRole = 1212, + IdPermission = 237 + }, + new + { + IdUserRole = 1213, + IdPermission = 203 + }, + new + { + IdUserRole = 1213, + IdPermission = 239 + }, + new + { + IdUserRole = 1213, + IdPermission = 212 + }, + new + { + IdUserRole = 1214, + IdPermission = 211 + }, + new + { + IdUserRole = 1214, + IdPermission = 210 + }, + new + { + IdUserRole = 1215, + IdPermission = 203 + }, + new + { + IdUserRole = 1215, + IdPermission = 222 + }, + new + { + IdUserRole = 1216, + IdPermission = 221 + }, + new + { + IdUserRole = 1217, + IdPermission = 226 + }, + new + { + IdUserRole = 1218, + IdPermission = 225 + }, + new + { + IdUserRole = 1218, + IdPermission = 224 + }, + new + { + IdUserRole = 1219, + IdPermission = 203 + }, + new + { + IdUserRole = 1219, + IdPermission = 206 + }, + new + { + IdUserRole = 1219, + IdPermission = 230 + }, + new + { + IdUserRole = 1219, + IdPermission = 232 + }, + new + { + IdUserRole = 1220, + IdPermission = 203 + }, + new + { + IdUserRole = 1220, + IdPermission = 228 + }, + new + { + IdUserRole = 1221, + IdPermission = 202 + }, + new + { + IdUserRole = 1221, + IdPermission = 203 + }, + new + { + IdUserRole = 1221, + IdPermission = 220 + }, + new + { + IdUserRole = 1221, + IdPermission = 234 + }, + new + { + IdUserRole = 1500, + IdPermission = 507 + }, + new + { + IdUserRole = 1500, + IdPermission = 510 + }, + new + { + IdUserRole = 1501, + IdPermission = 214 + }, + new + { + IdUserRole = 1501, + IdPermission = 213 + }, + new + { + IdUserRole = 1502, + IdPermission = 207 + }, + new + { + IdUserRole = 1502, + IdPermission = 208 + }, + new + { + IdUserRole = 2000, + IdPermission = 205 + }, + new + { + IdUserRole = 2000, + IdPermission = 204 + }, + new + { + IdUserRole = 2000, + IdPermission = 245 + }, + new + { + IdUserRole = 2001, + IdPermission = 244 + }, + new + { + IdUserRole = 2001, + IdPermission = 245 + }, + new + { + IdUserRole = 2002, + IdPermission = 244 + }, + new + { + IdUserRole = 2002, + IdPermission = 246 + }, + new + { + IdUserRole = 2002, + IdPermission = 237 + }, + new + { + IdUserRole = 2002, + IdPermission = 238 + }, + new + { + IdUserRole = 2003, + IdPermission = 240 + }, + new + { + IdUserRole = 2003, + IdPermission = 217 + }, + new + { + IdUserRole = 2003, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 242 + }, + new + { + IdUserRole = 2004, + IdPermission = 217 + }, + new + { + IdUserRole = 2004, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 205 + }, + new + { + IdUserRole = 2004, + IdPermission = 204 + }, + new + { + IdUserRole = 2005, + IdPermission = 247 + }, + new + { + IdUserRole = 2005, + IdPermission = 205 + }, + new + { + IdUserRole = 2005, + IdPermission = 204 + }, + new + { + IdUserRole = 2006, + IdPermission = 243 + }, + new + { + IdUserRole = 2006, + IdPermission = 205 + }, + new + { + IdUserRole = 2006, + IdPermission = 204 + }, + new + { + IdUserRole = 2007, + IdPermission = 241 + }, + new + { + IdUserRole = 2007, + IdPermission = 205 + }, + new + { + IdUserRole = 2007, + IdPermission = 204 + }, + new + { + IdUserRole = 1, + IdPermission = 100 + }, + new + { + IdUserRole = 1, + IdPermission = 101 + }, + new + { + IdUserRole = 1, + IdPermission = 102 + }, + new + { + IdUserRole = 1, + IdPermission = 103 + }, + new + { + IdUserRole = 1, + IdPermission = 104 + }, + new + { + IdUserRole = 1, + IdPermission = 105 + }, + new + { + IdUserRole = 1, + IdPermission = 106 + }, + new + { + IdUserRole = 1, + IdPermission = 107 + }, + new + { + IdUserRole = 1, + IdPermission = 108 + }, + new + { + IdUserRole = 1, + IdPermission = 109 + }, + new + { + IdUserRole = 1, + IdPermission = 110 + }, + new + { + IdUserRole = 1, + IdPermission = 111 + }, + new + { + IdUserRole = 1, + IdPermission = 112 + }, + new + { + IdUserRole = 1, + IdPermission = 113 + }, + new + { + IdUserRole = 1, + IdPermission = 114 + }, + new + { + IdUserRole = 1, + IdPermission = 115 + }, + new + { + IdUserRole = 1, + IdPermission = 116 + }, + new + { + IdUserRole = 1, + IdPermission = 117 + }, + new + { + IdUserRole = 1, + IdPermission = 118 + }, + new + { + IdUserRole = 1, + IdPermission = 119 + }, + new + { + IdUserRole = 1, + IdPermission = 120 + }, + new + { + IdUserRole = 1, + IdPermission = 121 + }, + new + { + IdUserRole = 1, + IdPermission = 122 + }, + new + { + IdUserRole = 1, + IdPermission = 123 + }, + new + { + IdUserRole = 1, + IdPermission = 124 + }, + new + { + IdUserRole = 1, + IdPermission = 125 + }, + new + { + IdUserRole = 1, + IdPermission = 126 + }, + new + { + IdUserRole = 1, + IdPermission = 127 + }, + new + { + IdUserRole = 1, + IdPermission = 128 + }, + new + { + IdUserRole = 1, + IdPermission = 129 + }, + new + { + IdUserRole = 1, + IdPermission = 200 + }, + new + { + IdUserRole = 1, + IdPermission = 201 + }, + new + { + IdUserRole = 1, + IdPermission = 202 + }, + new + { + IdUserRole = 1, + IdPermission = 203 + }, + new + { + IdUserRole = 1, + IdPermission = 204 + }, + new + { + IdUserRole = 1, + IdPermission = 205 + }, + new + { + IdUserRole = 1, + IdPermission = 206 + }, + new + { + IdUserRole = 1, + IdPermission = 207 + }, + new + { + IdUserRole = 1, + IdPermission = 208 + }, + new + { + IdUserRole = 1, + IdPermission = 209 + }, + new + { + IdUserRole = 1, + IdPermission = 210 + }, + new + { + IdUserRole = 1, + IdPermission = 211 + }, + new + { + IdUserRole = 1, + IdPermission = 212 + }, + new + { + IdUserRole = 1, + IdPermission = 213 + }, + new + { + IdUserRole = 1, + IdPermission = 214 + }, + new + { + IdUserRole = 1, + IdPermission = 215 + }, + new + { + IdUserRole = 1, + IdPermission = 216 + }, + new + { + IdUserRole = 1, + IdPermission = 217 + }, + new + { + IdUserRole = 1, + IdPermission = 218 + }, + new + { + IdUserRole = 1, + IdPermission = 219 + }, + new + { + IdUserRole = 1, + IdPermission = 220 + }, + new + { + IdUserRole = 1, + IdPermission = 221 + }, + new + { + IdUserRole = 1, + IdPermission = 222 + }, + new + { + IdUserRole = 1, + IdPermission = 223 + }, + new + { + IdUserRole = 1, + IdPermission = 224 + }, + new + { + IdUserRole = 1, + IdPermission = 225 + }, + new + { + IdUserRole = 1, + IdPermission = 226 + }, + new + { + IdUserRole = 1, + IdPermission = 227 + }, + new + { + IdUserRole = 1, + IdPermission = 228 + }, + new + { + IdUserRole = 1, + IdPermission = 229 + }, + new + { + IdUserRole = 1, + IdPermission = 230 + }, + new + { + IdUserRole = 1, + IdPermission = 231 + }, + new + { + IdUserRole = 1, + IdPermission = 232 + }, + new + { + IdUserRole = 1, + IdPermission = 233 + }, + new + { + IdUserRole = 1, + IdPermission = 234 + }, + new + { + IdUserRole = 1, + IdPermission = 235 + }, + new + { + IdUserRole = 1, + IdPermission = 236 + }, + new + { + IdUserRole = 1, + IdPermission = 237 + }, + new + { + IdUserRole = 1, + IdPermission = 238 + }, + new + { + IdUserRole = 1, + IdPermission = 239 + }, + new + { + IdUserRole = 1, + IdPermission = 240 + }, + new + { + IdUserRole = 1, + IdPermission = 241 + }, + new + { + IdUserRole = 1, + IdPermission = 242 + }, + new + { + IdUserRole = 1, + IdPermission = 243 + }, + new + { + IdUserRole = 1, + IdPermission = 244 + }, + new + { + IdUserRole = 1, + IdPermission = 245 + }, + new + { + IdUserRole = 1, + IdPermission = 246 + }, + new + { + IdUserRole = 1, + IdPermission = 247 + }, + new + { + IdUserRole = 1, + IdPermission = 248 + }, + new + { + IdUserRole = 1, + IdPermission = 249 + }, + new + { + IdUserRole = 1, + IdPermission = 250 + }, + new + { + IdUserRole = 1, + IdPermission = 251 + }, + new + { + IdUserRole = 1, + IdPermission = 252 + }, + new + { + IdUserRole = 1, + IdPermission = 253 + }, + new + { + IdUserRole = 1, + IdPermission = 254 + }, + new + { + IdUserRole = 1, + IdPermission = 255 + }, + new + { + IdUserRole = 1, + IdPermission = 256 + }, + new + { + IdUserRole = 1, + IdPermission = 257 + }, + new + { + IdUserRole = 1, + IdPermission = 258 + }, + new + { + IdUserRole = 1, + IdPermission = 259 + }, + new + { + IdUserRole = 1, + IdPermission = 260 + }, + new + { + IdUserRole = 1, + IdPermission = 261 + }, + new + { + IdUserRole = 1, + IdPermission = 262 + }, + new + { + IdUserRole = 1, + IdPermission = 263 + }, + new + { + IdUserRole = 1, + IdPermission = 264 + }, + new + { + IdUserRole = 1, + IdPermission = 265 + }, + new + { + IdUserRole = 1, + IdPermission = 266 + }, + new + { + IdUserRole = 1, + IdPermission = 267 + }, + new + { + IdUserRole = 1, + IdPermission = 268 + }, + new + { + IdUserRole = 1, + IdPermission = 269 + }, + new + { + IdUserRole = 1, + IdPermission = 380 + }, + new + { + IdUserRole = 1, + IdPermission = 381 + }, + new + { + IdUserRole = 1, + IdPermission = 382 + }, + new + { + IdUserRole = 1, + IdPermission = 383 + }, + new + { + IdUserRole = 1, + IdPermission = 384 + }, + new + { + IdUserRole = 1, + IdPermission = 385 + }, + new + { + IdUserRole = 1, + IdPermission = 386 + }, + new + { + IdUserRole = 1, + IdPermission = 387 + }, + new + { + IdUserRole = 1, + IdPermission = 388 + }, + new + { + IdUserRole = 1, + IdPermission = 389 + }, + new + { + IdUserRole = 1, + IdPermission = 390 + }, + new + { + IdUserRole = 1, + IdPermission = 391 + }, + new + { + IdUserRole = 1, + IdPermission = 400 + }, + new + { + IdUserRole = 1, + IdPermission = 401 + }, + new + { + IdUserRole = 1, + IdPermission = 407 + }, + new + { + IdUserRole = 1, + IdPermission = 408 + }, + new + { + IdUserRole = 1, + IdPermission = 450 + }, + new + { + IdUserRole = 1, + IdPermission = 460 + }, + new + { + IdUserRole = 1, + IdPermission = 461 + }, + new + { + IdUserRole = 1, + IdPermission = 500 + }, + new + { + IdUserRole = 1, + IdPermission = 501 + }, + new + { + IdUserRole = 1, + IdPermission = 502 + }, + new + { + IdUserRole = 1, + IdPermission = 503 + }, + new + { + IdUserRole = 1, + IdPermission = 504 + }, + new + { + IdUserRole = 1, + IdPermission = 505 + }, + new + { + IdUserRole = 1, + IdPermission = 506 + }, + new + { + IdUserRole = 1, + IdPermission = 507 + }, + new + { + IdUserRole = 1, + IdPermission = 510 + }, + new + { + IdUserRole = 1, + IdPermission = 511 + }, + new + { + IdUserRole = 1, + IdPermission = 512 + }, + new + { + IdUserRole = 1, + IdPermission = 516 + }, + new + { + IdUserRole = 1, + IdPermission = 517 + }, + new + { + IdUserRole = 1, + IdPermission = 518 + }, + new + { + IdUserRole = 1, + IdPermission = 519 + }, + new + { + IdUserRole = 1, + IdPermission = 520 + }, + new + { + IdUserRole = 1, + IdPermission = 521 + }, + new + { + IdUserRole = 1, + IdPermission = 522 + }, + new + { + IdUserRole = 1, + IdPermission = 523 + }, + new + { + IdUserRole = 1, + IdPermission = 524 + }, + new + { + IdUserRole = 1, + IdPermission = 525 + }, + new + { + IdUserRole = 1, + IdPermission = 526 + }, + new + { + IdUserRole = 1, + IdPermission = 527 + }, + new + { + IdUserRole = 1, + IdPermission = 528 + }, + new + { + IdUserRole = 1, + IdPermission = 530 + }, + new + { + IdUserRole = 1, + IdPermission = 531 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdInclude") + .HasColumnType("integer") + .HasColumnName("id_include_user_role"); + + b.HasKey("Id", "IdInclude") + .HasName("t_relation_user_role_user_role_pk"); + + b.HasIndex("IdInclude"); + + b.ToTable("t_relation_user_role_user_role", t => + { + t.HasComment("Отношение ролей к ролям"); + }); + + b.HasData( + new + { + Id = 1101, + IdInclude = 1100 + }, + new + { + Id = 1103, + IdInclude = 1102 + }, + new + { + Id = 1105, + IdInclude = 1104 + }, + new + { + Id = 1107, + IdInclude = 1106 + }, + new + { + Id = 1109, + IdInclude = 1108 + }, + new + { + Id = 1111, + IdInclude = 1110 + }, + new + { + Id = 1114, + IdInclude = 1113 + }, + new + { + Id = 1117, + IdInclude = 1116 + }, + new + { + Id = 1203, + IdInclude = 1202 + }, + new + { + Id = 1207, + IdInclude = 1206 + }, + new + { + Id = 1209, + IdInclude = 1208 + }, + new + { + Id = 1212, + IdInclude = 1211 + }, + new + { + Id = 1214, + IdInclude = 1213 + }, + new + { + Id = 1216, + IdInclude = 1215 + }, + new + { + Id = 1218, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1200 + }, + new + { + Id = 2000, + IdInclude = 1201 + }, + new + { + Id = 2000, + IdInclude = 1202 + }, + new + { + Id = 2000, + IdInclude = 1204 + }, + new + { + Id = 2000, + IdInclude = 1205 + }, + new + { + Id = 2000, + IdInclude = 1206 + }, + new + { + Id = 2000, + IdInclude = 1208 + }, + new + { + Id = 2000, + IdInclude = 1210 + }, + new + { + Id = 2000, + IdInclude = 1211 + }, + new + { + Id = 2000, + IdInclude = 1213 + }, + new + { + Id = 2000, + IdInclude = 1215 + }, + new + { + Id = 2000, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1219 + }, + new + { + Id = 2000, + IdInclude = 1220 + }, + new + { + Id = 2000, + IdInclude = 1221 + }, + new + { + Id = 2000, + IdInclude = 1500 + }, + new + { + Id = 2000, + IdInclude = 1501 + }, + new + { + Id = 2000, + IdInclude = 1502 + }, + new + { + Id = 2001, + IdInclude = 1500 + }, + new + { + Id = 2001, + IdInclude = 1501 + }, + new + { + Id = 2001, + IdInclude = 1502 + }, + new + { + Id = 2002, + IdInclude = 1500 + }, + new + { + Id = 2002, + IdInclude = 1501 + }, + new + { + Id = 2002, + IdInclude = 1502 + }, + new + { + Id = 2003, + IdInclude = 1500 + }, + new + { + Id = 2003, + IdInclude = 1501 + }, + new + { + Id = 2003, + IdInclude = 1502 + }, + new + { + Id = 2004, + IdInclude = 1500 + }, + new + { + Id = 2004, + IdInclude = 1501 + }, + new + { + Id = 2004, + IdInclude = 1502 + }, + new + { + Id = 2005, + IdInclude = 1500 + }, + new + { + Id = 2005, + IdInclude = 1501 + }, + new + { + Id = 2005, + IdInclude = 1502 + }, + new + { + Id = 2006, + IdInclude = 1500 + }, + new + { + Id = 2006, + IdInclude = 1501 + }, + new + { + Id = 2006, + IdInclude = 1502 + }, + new + { + Id = 2007, + IdInclude = 1500 + }, + new + { + Id = 2007, + IdInclude = 1501 + }, + new + { + Id = 2007, + IdInclude = 1502 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role", t => + { + t.HasComment("Отношение пользователей и ролей"); + }); + + b.HasData( + new + { + IdUser = 1, + IdUserRole = 1 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Begin") + .HasColumnType("timestamp with time zone") + .HasColumnName("begin"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end") + .HasComment("timestamp with time zone"); + + b.Property("Format") + .HasColumnType("integer") + .HasColumnName("format") + .HasComment("Формат отчета"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла-родителя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("Step") + .HasColumnType("integer") + .HasColumnName("step") + .HasComment("размер шага в секундах"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdWell"); + + b.ToTable("t_report_property", t => + { + t.HasComment("Отчеты с данными по буровым"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DrillEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_end") + .HasComment("Конец вахты"); + + b.Property("DrillStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_start") + .HasComment("Начало вахты"); + + b.Property("IdDriller") + .HasColumnType("integer") + .HasColumnName("id_driller") + .HasComment("Идентификатор бурильщика"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Идентификатор скважины"); + + b.Property("ShiftEnd") + .HasColumnType("time without time zone") + .HasColumnName("shift_end") + .HasComment("Конец смены"); + + b.Property("ShiftStart") + .HasColumnType("time without time zone") + .HasColumnName("shift_start") + .HasComment("Начало смены"); + + b.HasKey("Id"); + + b.HasIndex("IdDriller"); + + b.HasIndex("IdWell"); + + b.ToTable("t_schedule", t => + { + t.HasComment("График работы бурильщика"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("комментарий для оператора"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("ObsolescenceSec") + .HasColumnType("integer") + .HasColumnName("obsolescence") + .HasComment("сек. до устаревания"); + + b.Property("Setpoints") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("setpoint_set") + .HasComment("Набор уставок"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdWell"); + + b.ToTable("t_setpoints_rquest", t => + { + t.HasComment("Запросы на изменение уставок панели оператора"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Subsystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("t_subsystem", t => + { + t.HasComment("Описание подсистем"); + }); + + b.HasData( + new + { + Id = 1, + Description = "Совместная работа режимов \"Бурение в роторе\" и \"Бурение в слайде\"", + Name = "АПД" + }, + new + { + Id = 11, + Description = "Режим работы \"Бурение в роторе\"", + Name = "АПД ротор" + }, + new + { + Id = 12, + Description = "Режим работы \"Бурение в слайде\"", + Name = "АПД слайд" + }, + new + { + Id = 65536, + Description = "Осцилляция", + Name = "Осцилляция" + }, + new + { + Id = 65537, + Description = "Демпфер", + Name = "Демпфер" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Info") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + b.Property("TimeZone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); + + b.ToTable("t_telemetry", t => + { + t.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("AxialLoad") + .HasColumnType("real") + .HasColumnName("axial_load") + .HasComment("Осевая нагрузка"); + + b.Property("AxialLoadLimitMax") + .HasColumnType("real") + .HasColumnName("axial_load_limit_max") + .HasComment("Осевая нагрузка. Аварийная макс."); + + b.Property("AxialLoadSp") + .HasColumnType("real") + .HasColumnName("axial_load_sp") + .HasComment("Осевая нагрузка. Задание"); + + b.Property("BitDepth") + .HasColumnType("real") + .HasColumnName("bit_depth") + .HasComment("Положение инструмента"); + + b.Property("BlockPosition") + .HasColumnType("real") + .HasColumnName("block_position") + .HasComment("Высота талевого блока"); + + b.Property("BlockPositionMax") + .HasColumnType("real") + .HasColumnName("block_position_max") + .HasComment("Талевый блок. Макс положение"); + + b.Property("BlockPositionMin") + .HasColumnType("real") + .HasColumnName("block_position_min") + .HasComment("Талевый блок. Мин положение"); + + b.Property("BlockSpeed") + .HasColumnType("real") + .HasColumnName("block_speed") + .HasComment("Скорость талевого блока"); + + b.Property("BlockSpeedSp") + .HasColumnType("real") + .HasColumnName("block_speed_sp") + .HasComment("Скорости талевого блока. Задание"); + + b.Property("BlockSpeedSpDevelop") + .HasColumnType("real") + .HasColumnName("block_speed_sp_develop") + .HasComment("Талевый блок. Задание скорости для проработки"); + + b.Property("BlockSpeedSpRotor") + .HasColumnType("real") + .HasColumnName("block_speed_sp_rotor") + .HasComment("Талевый блок. Задание скорости для роторного бурения"); + + b.Property("BlockSpeedSpSlide") + .HasColumnType("real") + .HasColumnName("block_speed_sp_slide") + .HasComment("Талевый блок. Задание скорости для режима слайда"); + + b.Property("Flow") + .HasColumnType("real") + .HasColumnName("flow") + .HasComment("Расход"); + + b.Property("FlowDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("flow_delta_limit_max") + .HasComment("Расход. Аварийный макс."); + + b.Property("FlowIdle") + .HasColumnType("real") + .HasColumnName("flow_idle") + .HasComment("Расход. Холостой ход"); + + b.Property("HookWeight") + .HasColumnType("real") + .HasColumnName("hook_weight") + .HasComment("Вес на крюке"); + + b.Property("HookWeightIdle") + .HasColumnType("real") + .HasColumnName("hook_weight_idle") + .HasComment("Вес на крюке. Холостой ход"); + + b.Property("HookWeightLimitMax") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_max") + .HasComment("Вес на крюке. Затяжка"); + + b.Property("HookWeightLimitMin") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_min") + .HasComment("Вес на крюке. Посадка"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator") + .HasComment("Текущий критерий бурения"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Пользователь САУБ"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Режим САУБ"); + + b.Property("Mse") + .HasColumnType("real") + .HasColumnName("mse") + .HasComment("MSE"); + + b.Property("MseState") + .HasColumnType("smallint") + .HasColumnName("mse_state") + .HasComment("Текущее состояние работы MSE"); + + b.Property("Pressure") + .HasColumnType("real") + .HasColumnName("pressure") + .HasComment("Давление"); + + b.Property("PressureDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("pressure_delta_limit_max") + .HasComment("Давление дифф. Аварийное макс."); + + b.Property("PressureIdle") + .HasColumnType("real") + .HasColumnName("pressure_idle") + .HasComment("Давление. Холостой ход"); + + b.Property("PressureSp") + .HasColumnType("real") + .HasColumnName("pressure_sp") + .HasComment("Давление. Задание"); + + b.Property("PressureSpDevelop") + .HasColumnType("real") + .HasColumnName("pressure_sp_develop") + .HasComment("Давление. Задание для проработки"); + + b.Property("PressureSpRotor") + .HasColumnType("real") + .HasColumnName("pressure_sp_rotor") + .HasComment("Давление. Задание для роторного бурения"); + + b.Property("PressureSpSlide") + .HasColumnType("real") + .HasColumnName("pressure_sp_slide") + .HasComment("Давление. Задание для режима слайда"); + + b.Property("Pump0Flow") + .HasColumnType("real") + .HasColumnName("pump0_flow") + .HasComment("Расход. Буровой насос 1"); + + b.Property("Pump1Flow") + .HasColumnType("real") + .HasColumnName("pump1_flow") + .HasComment("Расход. Буровой насос 2"); + + b.Property("Pump2Flow") + .HasColumnType("real") + .HasColumnName("pump2_flow") + .HasComment("Расход. Буровой насос 3"); + + b.Property("RotorSpeed") + .HasColumnType("real") + .HasColumnName("rotor_speed") + .HasComment("Обороты ротора"); + + b.Property("RotorTorque") + .HasColumnType("real") + .HasColumnName("rotor_torque") + .HasComment("Момент на роторе"); + + b.Property("RotorTorqueIdle") + .HasColumnType("real") + .HasColumnName("rotor_torque_idle") + .HasComment("Момент на роторе. Холостой ход"); + + b.Property("RotorTorqueLimitMax") + .HasColumnType("real") + .HasColumnName("rotor_torque_limit_max") + .HasComment("Момент на роторе. Аварийный макс."); + + b.Property("RotorTorqueSp") + .HasColumnType("real") + .HasColumnName("rotor_torque_sp") + .HasComment("Момент на роторе. Задание"); + + b.Property("WellDepth") + .HasColumnType("real") + .HasColumnName("well_depth") + .HasComment("Глубина забоя"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_data_saub", t => + { + t.HasComment("набор основных данных по SAUB"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaubStat", b => + { + b.Property("Count") + .HasColumnType("bigint") + .HasColumnName("count_items"); + + b.Property("DateMax") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_max"); + + b.Property("DateMin") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_min"); + + b.Property("DepthMax") + .HasColumnType("real") + .HasColumnName("depth_max"); + + b.Property("DepthMin") + .HasColumnType("real") + .HasColumnName("depth_min"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.ToTable((string)null); + + b.ToView("mw_telemetry_datas_saub_stat", (string)null); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Выбранный режим управления"); + + b.Property("PositionRight") + .HasColumnType("real") + .HasColumnName("position_right") + .HasComment("Крайний правый угол осцилляции"); + + b.Property("PositionZero") + .HasColumnType("real") + .HasColumnName("position_zero") + .HasComment("Нулевая позиция осцилляции"); + + b.Property("RevolsLeftLimit") + .HasColumnType("real") + .HasColumnName("revols_left_limit") + .HasComment("Ограничение числа оборотов влево"); + + b.Property("RevolsLeftTotal") + .HasColumnType("real") + .HasColumnName("revols_left_total") + .HasComment("Суммарное количество оборотов влево"); + + b.Property("RevolsRightLimit") + .HasColumnType("real") + .HasColumnName("revols_right_limit") + .HasComment("Ограничение числа оборотов вправо"); + + b.Property("RevolsRightTotal") + .HasColumnType("real") + .HasColumnName("revols_right_total") + .HasComment("Суммарное количество оборотов вправо"); + + b.Property("SpeedLeftSp") + .HasColumnType("real") + .HasColumnName("speed_left_sp") + .HasComment("Заданная скорость вращения влево"); + + b.Property("SpeedRightSp") + .HasColumnType("real") + .HasColumnName("speed_right_sp") + .HasComment("Заданная скорость вращения вправо"); + + b.Property("State") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("Переменная этапа"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_data_spin", t => + { + t.HasComment("набор основных данных по SpinMaster"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.Property("MessageTemplate") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message_template"); + + b.HasKey("IdTelemetry", "IdEvent"); + + b.ToTable("t_telemetry_event", t => + { + t.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arg0") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg0") + .HasComment("Аргумент №0 для вставки в шаблон сообщения"); + + b.Property("Arg1") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg1"); + + b.Property("Arg2") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg2"); + + b.Property("Arg3") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg3"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdTelemetryUser") + .HasColumnType("integer") + .HasColumnName("id_telemetry_user") + .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); + + b.Property("WellDepth") + .HasColumnType("double precision") + .HasColumnName("well_depth"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_message", t => + { + t.HasComment("Сообщения на буровых"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname"); + + b.HasKey("IdTelemetry", "IdUser"); + + b.ToTable("t_telemetry_user", t => + { + t.HasComment("Пользователи панели САУБ. Для сообщений."); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryWirelineRunOut", b => + { + b.Property("IdTelemetry") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Идентификатор телеметрии"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("IdTelemetry")); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_time") + .HasComment("Отметка времени"); + + b.Property("Hauling") + .HasColumnType("real") + .HasColumnName("hauling") + .HasComment("Наработка талевого каната с момента перетяжки каната, т*км"); + + b.Property("HaulingWarnSp") + .HasColumnType("real") + .HasColumnName("hauling_warn_sp") + .HasComment("Наработка талевого каната до сигнализации о необходимости перетяжки, т*км"); + + b.Property("Replace") + .HasColumnType("real") + .HasColumnName("replace") + .HasComment("Наработка талевого каната с момента замены каната, т*км"); + + b.Property("ReplaceWarnSp") + .HasColumnType("real") + .HasColumnName("replace_warn_sp") + .HasComment("Наработка талевого каната до сигнализации о необходимости замены, т*км"); + + b.HasKey("IdTelemetry"); + + b.ToTable("t_telemetry_wireline_run_out", t => + { + t.HasComment("Наработка талевого каната"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); + + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); + + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); + + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); + + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); + + b.HasKey("Id"); + + b.HasIndex("IdUser"); + + b.HasIndex("IdWell"); + + b.ToTable("t_trajectory_fact", t => + { + t.HasComment("Загрузка фактической траектории"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); + + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("Radius") + .HasColumnType("double precision") + .HasColumnName("radius") + .HasComment("Радиус цели"); + + b.Property("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); + + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); + + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); + + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); + + b.HasKey("Id"); + + b.HasIndex("IdUser"); + + b.HasIndex("IdWell"); + + b.ToTable("t_trajectory_plan", t => + { + t.HasComment("Загрузка плановой траектории"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdState") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n0 - не активен, \n1 - активен, \n2 - заблокирован"); + + b.Property("Login") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("login"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("имя"); + + b.Property("PasswordHash") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("password_hash") + .HasComment("соленый хэш пароля.\nпервые 5 символов - соль"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("отчество"); + + b.Property("Phone") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("phone") + .HasComment("номер телефона"); + + b.Property("Position") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("position") + .HasComment("email"); + + b.Property("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user", t => + { + t.HasComment("Пользователи облака"); + }); + + b.HasData( + new + { + Id = 1, + Email = "", + IdCompany = 1, + IdState = (short)1, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role", t => + { + t.HasComment("Роли пользователей в системе"); + }); + + b.HasData( + new + { + Id = 1, + Caption = "root", + IdType = 1 + }, + new + { + Id = 1100, + Caption = "admin_cluster.view", + IdType = 1 + }, + new + { + Id = 1101, + Caption = "admin_cluster.edit", + IdType = 1 + }, + new + { + Id = 1102, + Caption = "admin_company.view", + IdType = 1 + }, + new + { + Id = 1103, + Caption = "admin_company.edit", + IdType = 1 + }, + new + { + Id = 1104, + Caption = "admin_company_type.view", + IdType = 1 + }, + new + { + Id = 1105, + Caption = "admin_company_type.edit", + IdType = 1 + }, + new + { + Id = 1106, + Caption = "admin_deposit.view", + IdType = 1 + }, + new + { + Id = 1107, + Caption = "admin_deposit.edit", + IdType = 1 + }, + new + { + Id = 1108, + Caption = "admin_permission.view", + IdType = 1 + }, + new + { + Id = 1109, + Caption = "admin_permission.edit", + IdType = 1 + }, + new + { + Id = 1110, + Caption = "admin_role.view", + IdType = 1 + }, + new + { + Id = 1111, + Caption = "admin_role.edit", + IdType = 1 + }, + new + { + Id = 1112, + Caption = "admin_telemetry.view", + IdType = 1 + }, + new + { + Id = 1113, + Caption = "admin_user.view", + IdType = 1 + }, + new + { + Id = 1114, + Caption = "admin_user.edit", + IdType = 1 + }, + new + { + Id = 1115, + Caption = "admin_visit_log.view", + IdType = 1 + }, + new + { + Id = 1116, + Caption = "admin_well.view", + IdType = 1 + }, + new + { + Id = 1117, + Caption = "admin_well.edit", + IdType = 1 + }, + new + { + Id = 1200, + Caption = "archive.view", + IdType = 1 + }, + new + { + Id = 1201, + Caption = "cluster.view", + IdType = 1 + }, + new + { + Id = 1202, + Caption = "composite.view", + IdType = 1 + }, + new + { + Id = 1203, + Caption = "composite.edit", + IdType = 1 + }, + new + { + Id = 1204, + Caption = "deposit.view", + IdType = 1 + }, + new + { + Id = 1205, + Caption = "document.view", + IdType = 1 + }, + new + { + Id = 1206, + Caption = "drillProcessFlow.view", + IdType = 1 + }, + new + { + Id = 1207, + Caption = "drillProcessFlow.edit", + IdType = 1 + }, + new + { + Id = 1208, + Caption = "measure.view", + IdType = 1 + }, + new + { + Id = 1209, + Caption = "measure.edit", + IdType = 1 + }, + new + { + Id = 1210, + Caption = "message.view", + IdType = 1 + }, + new + { + Id = 1211, + Caption = "operations.view", + IdType = 1 + }, + new + { + Id = 1212, + Caption = "operations.edit", + IdType = 1 + }, + new + { + Id = 1213, + Caption = "params.view", + IdType = 1 + }, + new + { + Id = 1214, + Caption = "params.edit", + IdType = 1 + }, + new + { + Id = 1215, + Caption = "report.view", + IdType = 1 + }, + new + { + Id = 1216, + Caption = "report.edit", + IdType = 1 + }, + new + { + Id = 1217, + Caption = "setpoints.view", + IdType = 1 + }, + new + { + Id = 1218, + Caption = "setpoints.edit", + IdType = 1 + }, + new + { + Id = 1219, + Caption = "telemetry.view", + IdType = 1 + }, + new + { + Id = 1220, + Caption = "telemetryAnalysis.view", + IdType = 1 + }, + new + { + Id = 1221, + Caption = "well.view", + IdType = 1 + }, + new + { + Id = 1500, + Caption = "Просмотр всего", + IdType = 1 + }, + new + { + Id = 1501, + Caption = "file.edit", + IdType = 1 + }, + new + { + Id = 1502, + Caption = "drillingProgram.edit", + IdType = 1 + }, + new + { + Id = 2000, + Caption = "Заказчик", + IdType = 0 + }, + new + { + Id = 2001, + Caption = "Супервайзер", + IdType = 0 + }, + new + { + Id = 2002, + Caption = "Буровой подрядчик", + IdType = 0 + }, + new + { + Id = 2003, + Caption = "Растворщик", + IdType = 0 + }, + new + { + Id = 2004, + Caption = "Телеметрист", + IdType = 0 + }, + new + { + Id = 2005, + Caption = "Долотный сервис", + IdType = 0 + }, + new + { + Id = 2006, + Caption = "ГТИ", + IdType = 0 + }, + new + { + Id = 2007, + Caption = "Цементирование", + IdType = 0 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("key") + .HasComment("Ключ настроек пользователя"); + + b.Property("Value") + .HasColumnType("jsonb") + .HasColumnName("setting_value") + .HasComment("Значение настроек пользователя"); + + b.HasKey("IdUser", "Key"); + + b.ToTable("t_user_settings", t => + { + t.HasComment("настройки интерфейса пользователя"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.RecordBase", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Actcod") + .HasColumnType("smallint") + .HasColumnName("ACTCOD"); + + b.Property("Date") + .HasColumnType("integer") + .HasColumnName("DATE"); + + b.Property("Recid") + .HasColumnType("smallint") + .HasColumnName("RECID"); + + b.Property("Seqid") + .HasColumnType("integer") + .HasColumnName("SEQID"); + + b.Property("Stknum") + .HasColumnType("smallint") + .HasColumnName("STKNUM"); + + b.Property("Time") + .HasColumnType("integer") + .HasColumnName("TIME"); + + b.Property("Wellid") + .HasColumnType("text") + .HasColumnName("WELLID"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_wits_base"); + + b.UseTptMappingStrategy(); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("IdCluster") + .HasColumnType("integer") + .HasColumnName("id_cluster"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("state") + .HasComment("0 - неизвестно, 1 - в работе, 2 - завершена"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdWellType") + .HasColumnType("integer") + .HasColumnName("id_well_type"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.Property("Timezone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex("IdCluster"); + + b.HasIndex("IdTelemetry") + .IsUnique(); + + b.HasIndex("IdWellType"); + + b.ToTable("t_well", t => + { + t.HasComment("скважины"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины получателя"); + + b.Property("IdWellSrc") + .HasColumnType("integer") + .HasColumnName("id_well_src") + .HasComment("Id скважины композита"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции композита"); + + b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); + + b.HasIndex("IdWellSectionType"); + + b.HasIndex("IdWellSrc"); + + b.ToTable("t_well_composite", t => + { + t.HasComment("Композитная скважина"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocument", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.HasKey("IdWell", "IdUser", "IdCategory") + .HasName("t_well_final_documents_pk"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdUser"); + + b.ToTable("t_well_final_documents", t => + { + t.HasComment("Дело скважины"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("Дата начала операции"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина после завершения операции, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина на начало операции, м"); + + b.Property("DurationHours") + .HasColumnType("double precision") + .HasColumnName("duration_hours") + .HasComment("Продолжительность, часы"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("IdPlan") + .HasColumnType("integer") + .HasColumnName("id_plan") + .HasComment("Id плановой операции"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0 = План или 1 = Факт"); + + b.Property("IdUser") + .HasColumnType("integer"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции скважины"); + + b.Property("LastUpdateDate") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("DateStart"); + + b.HasIndex("DepthEnd"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdPlan"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_well_operation", t => + { + t.HasComment("Данные по операциям на скважине"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("id родительской категории"); + + b.Property("KeyValueName") + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .HasColumnName("key_value_name") + .HasComment("Название ключевого показателя операции"); + + b.Property("KeyValueUnits") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("key_value_units") + .HasComment("Единицы измерения ключевого показателя операции"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории операции"); + + b.HasKey("Id"); + + b.HasIndex("IdParent"); + + b.ToTable("t_well_operation_category", t => + { + t.HasComment("Справочник операций на скважине"); + }); + + b.HasData( + new + { + Id = 3000, + KeyValueName = "dT", + KeyValueUnits = "м/ч", + Name = "БУРЕНИЕ" + }, + new + { + Id = 3001, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "КРЕПЛЕНИЕ" + }, + new + { + Id = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ГФР" + }, + new + { + Id = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные операции" + }, + new + { + Id = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Непроизводительное время (НПВ)" + }, + new + { + Id = 4000, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "КНБК" + }, + new + { + Id = 4001, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "м/ч", + Name = "Механическое. бурение" + }, + new + { + Id = 4002, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Статический замер" + }, + new + { + Id = 4003, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Нормализация диаметра скважины" + }, + new + { + Id = 4004, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наращивание" + }, + new + { + Id = 4005, + IdParent = 3001, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 4006, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск обсадной колонны" + }, + new + { + Id = 4018, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Крепление" + }, + new + { + Id = 4007, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Цементирование" + }, + new + { + Id = 4008, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные работы при креплении" + }, + new + { + Id = 4009, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка/разборка приборов ГИС" + }, + new + { + Id = 4010, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 4011, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ГИС" + }, + new + { + Id = 4012, + IdParent = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка, ОБР" + }, + new + { + Id = 4013, + IdParent = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные работы" + }, + new + { + Id = 4014, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт оборудования" + }, + new + { + Id = 4015, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Аварийные работы" + }, + new + { + Id = 4016, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Осложнение" + }, + new + { + Id = 4017, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Незаложенные в ГГД операции" + }, + new + { + Id = 5000, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разборка КНБК" + }, + new + { + Id = 5001, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка КНБК" + }, + new + { + Id = 5002, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение слайдом" + }, + new + { + Id = 5003, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение ротором" + }, + new + { + Id = 5004, + IdParent = 4002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Замер ЗТС (запись MWD)" + }, + new + { + Id = 5005, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка перед наращиванием" + }, + new + { + Id = 5006, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка во время бурения" + }, + new + { + Id = 5007, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка перед наращиванием" + }, + new + { + Id = 5008, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка во время бурения" + }, + new + { + Id = 5009, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка перед наращиванием" + }, + new + { + Id = 5010, + IdParent = 4004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наращивание" + }, + new + { + Id = 5011, + IdParent = 4004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Удержание в клиньях" + }, + new + { + Id = 5012, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем инструмента" + }, + new + { + Id = 5013, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем КНБК" + }, + new + { + Id = 5014, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск инструмента" + }, + new + { + Id = 5015, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск КНБК" + }, + new + { + Id = 5016, + IdParent = 4006, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка при спуске ОК" + }, + new + { + Id = 5017, + IdParent = 4006, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск ОК" + }, + new + { + Id = 5018, + IdParent = 4007, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ОЗЦ" + }, + new + { + Id = 5019, + IdParent = 4007, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Цементирование" + }, + new + { + Id = 5020, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка БИ" + }, + new + { + Id = 5021, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка ОК" + }, + new + { + Id = 5022, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при спуске ОК" + }, + new + { + Id = 5023, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при цементировании" + }, + new + { + Id = 5024, + IdParent = 4009, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разборка комплекса приборов ГИС" + }, + new + { + Id = 5025, + IdParent = 4009, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка комплекса приборов ГИС" + }, + new + { + Id = 5026, + IdParent = 4010, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем приборов ГИС (на трубах)" + }, + new + { + Id = 5027, + IdParent = 4010, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск приборов ГИС (на трубах)" + }, + new + { + Id = 5028, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на жестком кабеле" + }, + new + { + Id = 5029, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на кабеле" + }, + new + { + Id = 5030, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на трубах" + }, + new + { + Id = 5031, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Закачка/прокачка пачки" + }, + new + { + Id = 5032, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обработка БР" + }, + new + { + Id = 5033, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование ТС при бурении" + }, + new + { + Id = 5034, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перезапись гаммы-каротажа" + }, + new + { + Id = 5035, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Приготовление БР" + }, + new + { + Id = 5036, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка" + }, + new + { + Id = 5037, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разбуривание тех.оснастки" + }, + new + { + Id = 5038, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск инструмента с проработкой" + }, + new + { + Id = 5039, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ВМР" + }, + new + { + Id = 5040, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Демонтаж ПВО" + }, + new + { + Id = 5041, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Долив затруба при подъёме" + }, + new + { + Id = 5042, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Монтаж ПВО" + }, + new + { + Id = 5043, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наработка жёлоба" + }, + new + { + Id = 5044, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обвязка устья с циркуляционной системой" + }, + new + { + Id = 5045, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Оборудование устья" + }, + new + { + Id = 5046, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка ПВО" + }, + new + { + Id = 5047, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перемонтаж ПВО " + }, + new + { + Id = 5048, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перетяжка талевого каната" + }, + new + { + Id = 5049, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при сборке КНБК" + }, + new + { + Id = 5050, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Полная замена талевого каната" + }, + new + { + Id = 5051, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПР перед забуркой направления" + }, + new + { + Id = 5052, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Продувка манифольда" + }, + new + { + Id = 5053, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Срезка" + }, + new + { + Id = 5054, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Тайм-дриллинг" + }, + new + { + Id = 5055, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Тех.отстой" + }, + new + { + Id = 5056, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Учебная тревога \"Выброс\"" + }, + new + { + Id = 5057, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Чистка ЦСГО/емкостного блока" + }, + new + { + Id = 5058, + IdParent = 4014, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт бурового оборудования" + }, + new + { + Id = 5059, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ловильные работы" + }, + new + { + Id = 5060, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ожидание" + }, + new + { + Id = 5061, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Определение места прихвата и ЛМ" + }, + new + { + Id = 5062, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Работа яссом" + }, + new + { + Id = 5063, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Расхаживание" + }, + new + { + Id = 5064, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - колокол" + }, + new + { + Id = 5065, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - метчик" + }, + new + { + Id = 5066, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - овершот" + }, + new + { + Id = 5067, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - труболовка" + }, + new + { + Id = 5068, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Торпедирование (встряхивание)" + }, + new + { + Id = 5069, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Торпедирование (отстрел)" + }, + new + { + Id = 5070, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Установка ванн" + }, + new + { + Id = 5071, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Фрезеровка" + }, + new + { + Id = 5072, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Контролируемое ГНВП" + }, + new + { + Id = 5073, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Поглощение" + }, + new + { + Id = 5074, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сальникообразование" + }, + new + { + Id = 5075, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Утяжеление БР" + }, + new + { + Id = 5076, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "НПВ / прочее" + }, + new + { + Id = 5077, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обработка раствора (несоответствие параметров)" + }, + new + { + Id = 5078, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "подъем ОК" + }, + new + { + Id = 5079, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ревизия КНБК/инструмента/ЗТС" + }, + new + { + Id = 5082, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка устройства ориентирования КО" + }, + new + { + Id = 5083, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка принудительная" + }, + new + { + Id = 5084, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка подъем БИ, продувка" + }, + new + { + Id = 5085, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск бурильного инструмента со сборкой с мостков" + }, + new + { + Id = 5086, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем БИ с выбросом на мостки" + }, + new + { + Id = 5087, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск БИ со сборкой с мостков" + }, + new + { + Id = 5088, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка и спуск ТБТ" + }, + new + { + Id = 5089, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск КО на транспотрной колонне" + }, + new + { + Id = 5090, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Отворот допускной трубы" + }, + new + { + Id = 5091, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Активация подвески, опрессовка" + }, + new + { + Id = 5092, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Монтаж, опрессовка ФА" + }, + new + { + Id = 5093, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка хвостовика 114мм (согласно схеме)" + }, + new + { + Id = 5094, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР к спуску УЭЦН" + }, + new + { + Id = 5095, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Активация подвески (потайной колонны, хвостовика)" + }, + new + { + Id = 5096, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонирование перед спуском" + }, + new + { + Id = 5097, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка - перевод скважины на новый раствор" + }, + new + { + Id = 5098, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка БИ с мостков на подсвечник" + }, + new + { + Id = 5099, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подготовка ствола скважины. Перезапись ГК в интервале установки КО." + }, + new + { + Id = 5100, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Смена рабочего переводника ВСП" + }, + new + { + Id = 5101, + IdParent = 4014, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт" + }, + new + { + Id = 5102, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск пакера" + }, + new + { + Id = 5103, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Запись гамма-каратожа" + }, + new + { + Id = 5104, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонирование спуск БИ" + }, + new + { + Id = 5105, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка клин-отклонителя" + }, + new + { + Id = 5106, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование и посадка клина-отклонителя" + }, + new + { + Id = 5107, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Протяжка подъемного патрубка подвески" + }, + new + { + Id = 5108, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем клина-отклонителя" + }, + new + { + Id = 5109, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Стыковка стингера с хвостовиком основного ствола" + }, + new + { + Id = 5110, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование и установка стыковочного узла хвостовика" + }, + new + { + Id = 5111, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение с отбором керна" + }, + new + { + Id = 5112, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Работа пакером в обсадной колонне" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("Order") + .HasColumnType("real") + .HasColumnName("order") + .HasComment("Порядок"); + + b.HasKey("Id"); + + b.ToTable("t_well_section_type", t => + { + t.HasComment("конструкция секции скважины"); + }); + + b.HasData( + new + { + Id = 1, + Caption = "Пилотный ствол", + Order = 4f + }, + new + { + Id = 2, + Caption = "Направление", + Order = 0f + }, + new + { + Id = 3, + Caption = "Кондуктор", + Order = 1f + }, + new + { + Id = 4, + Caption = "Эксплуатационная колонна", + Order = 3f + }, + new + { + Id = 5, + Caption = "Транспортный ствол", + Order = 5f + }, + new + { + Id = 6, + Caption = "Хвостовик", + Order = 6f + }, + new + { + Id = 7, + Caption = "Пилотный ствол 2", + Order = 4.1f + }, + new + { + Id = 8, + Caption = "Направление 2", + Order = 0.1f + }, + new + { + Id = 9, + Caption = "Кондуктор 2", + Order = 1.1f + }, + new + { + Id = 10, + Caption = "Эксплуатационная колонна 2", + Order = 3.1f + }, + new + { + Id = 11, + Caption = "Транспортный ствол 2", + Order = 5.1f + }, + new + { + Id = 12, + Caption = "Хвостовик 2", + Order = 6.1f + }, + new + { + Id = 13, + Caption = "Пилотный ствол 3", + Order = 4.2f + }, + new + { + Id = 14, + Caption = "Направление 3", + Order = 0.2f + }, + new + { + Id = 15, + Caption = "Кондуктор 3", + Order = 1.2f + }, + new + { + Id = 16, + Caption = "Эксплуатационная колонна 3", + Order = 3.2f + }, + new + { + Id = 17, + Caption = "Транспортный ствол 3", + Order = 5.2f + }, + new + { + Id = 18, + Caption = "Хвостовик 3", + Order = 6.2f + }, + new + { + Id = 19, + Caption = "Пилотный ствол 4", + Order = 4.3f + }, + new + { + Id = 20, + Caption = "Направление 4", + Order = 0.3f + }, + new + { + Id = 21, + Caption = "Кондуктор 4", + Order = 1.3f + }, + new + { + Id = 22, + Caption = "Эксплуатационная колонна 4", + Order = 3.3f + }, + new + { + Id = 23, + Caption = "Транспортный ствол 4", + Order = 5.3f + }, + new + { + Id = 24, + Caption = "Хвостовик 4", + Order = 6.3f + }, + new + { + Id = 25, + Caption = "Пилотный ствол 5", + Order = 4.4f + }, + new + { + Id = 26, + Caption = "Направление 5", + Order = 0.4f + }, + new + { + Id = 27, + Caption = "Кондуктор 5", + Order = 1.4f + }, + new + { + Id = 28, + Caption = "Эксплуатационная колонна 5", + Order = 3.4f + }, + new + { + Id = 29, + Caption = "Транспортный ствол 5", + Order = 5.4f + }, + new + { + Id = 30, + Caption = "Хвостовик 5", + Order = 6.4f + }, + new + { + Id = 31, + Caption = "Техническая колонна", + Order = 2f + }, + new + { + Id = 32, + Caption = "Техническая колонна 2", + Order = 2.1f + }, + new + { + Id = 33, + Caption = "Техническая колонна 3", + Order = 2.2f + }, + new + { + Id = 34, + Caption = "Хвостовик 6", + Order = 6.5f + }, + new + { + Id = 35, + Caption = "Хвостовик 7", + Order = 6.6f + }, + new + { + Id = 36, + Caption = "Хвостовик 8", + Order = 6.7f + }, + new + { + Id = 37, + Caption = "Хвостовик 9", + Order = 6.8f + }, + new + { + Id = 38, + Caption = "Хвостовик 10", + Order = 6.9f + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина бурения, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Начальная глубина бурения, м"); + + b.Property("IdSectionType") + .HasColumnType("integer") + .HasColumnName("id_section_type") + .HasComment("Тип секции"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("InnerDiameter") + .HasColumnType("double precision") + .HasColumnName("inner_diameter") + .HasComment("Внутренний диаметр"); + + b.Property("LastUpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_update") + .HasComment("Дата последнего обновления"); + + b.Property("OuterDiameter") + .HasColumnType("double precision") + .HasColumnName("outer_diameter") + .HasComment("Внешний диаметр"); + + b.HasKey("Id"); + + b.HasIndex("IdSectionType"); + + b.HasIndex("IdWell", "IdSectionType") + .IsUnique(); + + b.ToTable("t_well_section_plan"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_type", t => + { + t.HasComment("конструкция скважины"); + }); + + b.HasData( + new + { + Id = 1, + Caption = "Наклонно-направленная" + }, + new + { + Id = 2, + Caption = "Горизонтальная" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Blkpos") + .HasColumnType("real") + .HasColumnName("BLKPOS"); + + b.Property("Chkp") + .HasColumnType("real") + .HasColumnName("CHKP"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptretm") + .HasColumnType("real") + .HasColumnName("DEPTRETM"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Gasa") + .HasColumnType("real") + .HasColumnName("GASA"); + + b.Property("Hkla") + .HasColumnType("real") + .HasColumnName("HKLA"); + + b.Property("Hklx") + .HasColumnType("real") + .HasColumnName("HKLX"); + + b.Property("Lagstks") + .HasColumnType("smallint") + .HasColumnName("LAGSTKS"); + + b.Property("Mcia") + .HasColumnType("real") + .HasColumnName("MCIA"); + + b.Property("Mcoa") + .HasColumnType("real") + .HasColumnName("MCOA"); + + b.Property("Mdia") + .HasColumnType("real") + .HasColumnName("MDIA"); + + b.Property("Mdoa") + .HasColumnType("real") + .HasColumnName("MDOA"); + + b.Property("Mfia") + .HasColumnType("real") + .HasColumnName("MFIA"); + + b.Property("Mfoa") + .HasColumnType("real") + .HasColumnName("MFOA"); + + b.Property("Mfop") + .HasColumnType("smallint") + .HasColumnName("MFOP"); + + b.Property("Mtia") + .HasColumnType("real") + .HasColumnName("MTIA"); + + b.Property("Mtoa") + .HasColumnType("real") + .HasColumnName("MTOA"); + + b.Property("Ropa") + .HasColumnType("real") + .HasColumnName("ROPA"); + + b.Property("Rpma") + .HasColumnType("smallint") + .HasColumnName("RPMA"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spm1") + .HasColumnType("smallint") + .HasColumnName("SPM1"); + + b.Property("Spm2") + .HasColumnType("smallint") + .HasColumnName("SPM2"); + + b.Property("Spm3") + .HasColumnType("smallint") + .HasColumnName("SPM3"); + + b.Property("Sppa") + .HasColumnType("real") + .HasColumnName("SPPA"); + + b.Property("Stkc") + .HasColumnType("integer") + .HasColumnName("STKC"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.Property("Torqa") + .HasColumnType("real") + .HasColumnName("TORQA"); + + b.Property("Torqx") + .HasColumnType("real") + .HasColumnName("TORQX"); + + b.Property("Tvolact") + .HasColumnType("real") + .HasColumnName("TVOLACT"); + + b.Property("Tvolcact") + .HasColumnType("real") + .HasColumnName("TVOLCACT"); + + b.Property("Woba") + .HasColumnType("real") + .HasColumnName("WOBA"); + + b.Property("Wobx") + .HasColumnType("real") + .HasColumnName("WOBX"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_1"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("DeptmeasGdpMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_GDP_mc"); + + b.Property("DeptmeasMcrstat") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_MCRSTAT"); + + b.Property("DeptmeasRa33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33_mc"); + + b.Property("DeptmeasRa33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F2_mc"); + + b.Property("DeptmeasRa33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F4_mc"); + + b.Property("DeptmeasRp33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33_mc"); + + b.Property("DeptmeasRp33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F2_mc"); + + b.Property("DeptmeasRp33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F4_mc"); + + b.Property("DeptmeasSlvlMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_SLVL_mc"); + + b.Property("GdpMc") + .HasColumnType("real") + .HasColumnName("GDP_mc"); + + b.Property("Mcrstat") + .HasColumnType("real") + .HasColumnName("MCRSTAT"); + + b.Property("Ra33Mc") + .HasColumnType("real") + .HasColumnName("RA33_mc"); + + b.Property("Ra33f2Mc") + .HasColumnType("real") + .HasColumnName("RA33F2_mc"); + + b.Property("Ra33f4Mc") + .HasColumnType("real") + .HasColumnName("RA33F4_mc"); + + b.Property("Rp33Mc") + .HasColumnType("real") + .HasColumnName("RP33_mc"); + + b.Property("Rp33f2Mc") + .HasColumnType("real") + .HasColumnName("RP33F2_mc"); + + b.Property("Rp33f4Mc") + .HasColumnType("real") + .HasColumnName("RP33F4_mc"); + + b.Property("SlvlMc") + .HasColumnType("real") + .HasColumnName("SLVL_mc"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_50"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Btot") + .HasColumnType("real") + .HasColumnName("Btot"); + + b.Property("Bx") + .HasColumnType("real") + .HasColumnName("Bx"); + + b.Property("By") + .HasColumnType("real") + .HasColumnName("By"); + + b.Property("Bz") + .HasColumnType("real") + .HasColumnName("Bz"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Gtot") + .HasColumnType("real") + .HasColumnName("Gtot"); + + b.Property("Gx") + .HasColumnType("real") + .HasColumnName("Gx"); + + b.Property("Gy") + .HasColumnType("real") + .HasColumnName("Gy"); + + b.Property("Gz") + .HasColumnType("real") + .HasColumnName("Gz"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_60"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Att06h") + .HasColumnType("real") + .HasColumnName("ATT06H"); + + b.Property("Att06l") + .HasColumnType("real") + .HasColumnName("ATT06L"); + + b.Property("Att10h") + .HasColumnType("real") + .HasColumnName("ATT10H"); + + b.Property("Att10l") + .HasColumnType("real") + .HasColumnName("ATT10L"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Phl1f1") + .HasColumnType("real") + .HasColumnName("PHL1F1"); + + b.Property("Phl1f2") + .HasColumnType("real") + .HasColumnName("PHL1F2"); + + b.Property("Phl2f1") + .HasColumnType("real") + .HasColumnName("PHL2F1"); + + b.Property("Phl2f2") + .HasColumnType("real") + .HasColumnName("PHL2F2"); + + b.Property("Status") + .HasColumnType("real") + .HasColumnName("Status"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_61"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptsvym") + .HasColumnType("real") + .HasColumnName("DEPTSVYM"); + + b.Property("Deptsvyv") + .HasColumnType("real") + .HasColumnName("DEPTSVYV"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Svyazc") + .HasColumnType("real") + .HasColumnName("SVYAZC"); + + b.Property("Svyazu") + .HasColumnType("real") + .HasColumnName("SVYAZU"); + + b.Property("Svydls") + .HasColumnType("real") + .HasColumnName("SVYDLS"); + + b.Property("Svyew") + .HasColumnType("real") + .HasColumnName("SVYEW"); + + b.Property("Svygtf") + .HasColumnType("real") + .HasColumnName("SVYGTF"); + + b.Property("Svyinc") + .HasColumnType("real") + .HasColumnName("SVYINC"); + + b.Property("Svymtf") + .HasColumnType("real") + .HasColumnName("SVYMTF"); + + b.Property("Svyns") + .HasColumnType("real") + .HasColumnName("SVYNS"); + + b.Property("Svytype") + .HasColumnType("text") + .HasColumnName("SVYTYPE"); + + b.Property("Svywalk") + .HasColumnType("real") + .HasColumnName("SVYWALK"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_7"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptcalm") + .HasColumnType("real") + .HasColumnName("DEPTCALM"); + + b.Property("Deptcalv") + .HasColumnType("real") + .HasColumnName("DEPTCALV"); + + b.Property("Deptfdm") + .HasColumnType("real") + .HasColumnName("DEPTFDM"); + + b.Property("Deptfdv") + .HasColumnType("real") + .HasColumnName("DEPTFDV"); + + b.Property("Deptgr1m") + .HasColumnType("real") + .HasColumnName("DEPTGR1M"); + + b.Property("Deptgr1v") + .HasColumnType("real") + .HasColumnName("DEPTGR1V"); + + b.Property("Deptgr2m") + .HasColumnType("real") + .HasColumnName("DEPTGR2M"); + + b.Property("Deptgr2v") + .HasColumnType("real") + .HasColumnName("DEPTGR2V"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptp1m") + .HasColumnType("real") + .HasColumnName("DEPTP1M"); + + b.Property("Deptp1v") + .HasColumnType("real") + .HasColumnName("DEPTP1V"); + + b.Property("Deptp2m") + .HasColumnType("real") + .HasColumnName("DEPTP2M"); + + b.Property("Deptp2v") + .HasColumnType("real") + .HasColumnName("DEPTP2V"); + + b.Property("Deptrs1m") + .HasColumnType("real") + .HasColumnName("DEPTRS1M"); + + b.Property("Deptrs1v") + .HasColumnType("real") + .HasColumnName("DEPTRS1V"); + + b.Property("Deptrs2m") + .HasColumnType("real") + .HasColumnName("DEPTRS2M"); + + b.Property("Deptrs2v") + .HasColumnType("real") + .HasColumnName("DEPTRS2V"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Mclp") + .HasColumnType("real") + .HasColumnName("MCLP"); + + b.Property("Mfd") + .HasColumnType("real") + .HasColumnName("MFD"); + + b.Property("Mffp") + .HasColumnType("real") + .HasColumnName("MFFP"); + + b.Property("Mfpp") + .HasColumnType("real") + .HasColumnName("MFPP"); + + b.Property("Mfrann") + .HasColumnType("real") + .HasColumnName("MFRANN"); + + b.Property("Mfrpipe") + .HasColumnType("real") + .HasColumnName("MFRPIPE"); + + b.Property("Mftann") + .HasColumnType("real") + .HasColumnName("MFTANN"); + + b.Property("Mftpipe") + .HasColumnType("real") + .HasColumnName("MFTPIPE"); + + b.Property("Mg1") + .HasColumnType("real") + .HasColumnName("MG1"); + + b.Property("Mg1c") + .HasColumnType("real") + .HasColumnName("MG1C"); + + b.Property("Mg2") + .HasColumnType("real") + .HasColumnName("MG2"); + + b.Property("Mg2c") + .HasColumnType("real") + .HasColumnName("MG2C"); + + b.Property("Mpo1") + .HasColumnType("real") + .HasColumnName("MPO1"); + + b.Property("Mpo2") + .HasColumnType("real") + .HasColumnName("MPO2"); + + b.Property("Mr1") + .HasColumnType("real") + .HasColumnName("MR1"); + + b.Property("Mr1c") + .HasColumnType("real") + .HasColumnName("MR1C"); + + b.Property("Mr2") + .HasColumnType("real") + .HasColumnName("MR2"); + + b.Property("Mr2c") + .HasColumnType("real") + .HasColumnName("MR2C"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spare6") + .HasColumnType("real") + .HasColumnName("SPARE6"); + + b.Property("Spare7") + .HasColumnType("real") + .HasColumnName("SPARE7"); + + b.Property("Spare8") + .HasColumnType("real") + .HasColumnName("SPARE8"); + + b.Property("Spare9") + .HasColumnType("real") + .HasColumnName("SPARE9"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_8"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.HasOne("AsbCloudDb.Model.Deposit", "Deposit") + .WithMany("Clusters") + .HasForeignKey("IdDeposit") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_cluster_t_deposit_id_fk"); + + b.Navigation("Deposit"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType") + .WithMany("Companies") + .HasForeignKey("IdCompanyType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CompanyType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Contact", b => + { + b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType") + .WithMany("Contacts") + .HasForeignKey("IdCompanyType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("Contacts") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CompanyType"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdFileCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("DrillingProgramParts") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Faq", b => + { + b.HasOne("AsbCloudDb.Model.User", "AuthorAnswer") + .WithMany() + .HasForeignKey("IdAuthorAnswer"); + + b.HasOne("AsbCloudDb.Model.User", "AuthorQuestion") + .WithMany() + .HasForeignKey("IdAuthorQuestion") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AuthorAnswer"); + + b.Navigation("AuthorQuestion"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany("Files") + .HasForeignKey("IdAuthor"); + + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("FileCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => + { + b.HasOne("AsbCloudDb.Model.FileInfo", "FileInfo") + .WithMany("FileMarks") + .HasForeignKey("IdFile") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_file_mark_t_file_info_fk"); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_user_t_file_mark_fk"); + + b.Navigation("FileInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileCategory"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.Manual", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.FileCategory", "Category") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Manuals.ManualDirectory", "Directory") + .WithMany("Manuals") + .HasForeignKey("IdDirectory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Category"); + + b.Navigation("Directory"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => + { + b.HasOne("AsbCloudDb.Model.Manuals.ManualDirectory", "Parent") + .WithMany("Children") + .HasForeignKey("IdParent") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.HasOne("AsbCloudDb.Model.MeasureCategory", "Category") + .WithMany("Measures") + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Notification", b => + { + b.HasOne("AsbCloudDb.Model.NotificationCategory", "NotificationCategory") + .WithMany("Notifications") + .HasForeignKey("IdNotificationCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NotificationCategory"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.OperationValue", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdOperationCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "Editor") + .WithMany() + .HasForeignKey("IdEditor") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", "Previous") + .WithMany() + .HasForeignKey("IdPrevious"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Editor"); + + b.Navigation("Previous"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "Editor") + .WithMany() + .HasForeignKey("IdEditor"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Editor"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_company_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_well_id_fk"); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationContactWell", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("RelationContactsWells") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.DrillingProgramPart", "DrillingProgramPart") + .WithMany("RelatedUsers") + .HasForeignKey("IdDrillingProgramPart") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DrillingProgramPart"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.HasOne("AsbCloudDb.Model.Permission", "Permission") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.HasOne("AsbCloudDb.Model.UserRole", "Role") + .WithMany("RelationUserRoleUserRoles") + .HasForeignKey("Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "IncludeRole") + .WithMany() + .HasForeignKey("IdInclude") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IncludeRole"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.HasOne("AsbCloudDb.Model.FileInfo", "File") + .WithMany() + .HasForeignKey("IdFile") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("File"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => + { + b.HasOne("AsbCloudDb.Model.Driller", "Driller") + .WithMany("Schedule") + .HasForeignKey("IdDriller") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_schedule_t_driller_id_driller"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Driller"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_event_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_messages_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlan", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired() + .HasConstraintName("t_user_t_company_id_fk"); + + b.Navigation("Company"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.HasOne("AsbCloudDb.Model.Cluster", "Cluster") + .WithMany("Wells") + .HasForeignKey("IdCluster") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_t_cluster_id_fk"); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithOne("Well") + .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_well_t_telemetry_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellType", "WellType") + .WithMany("Wells") + .HasForeignKey("IdWellType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Cluster"); + + b.Navigation("Telemetry"); + + b.Navigation("WellType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("WellComposites") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_src_t_well_id_fk"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + + b.Navigation("WellSrc"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocument", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "Category") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellOperation", "OperationPlan") + .WithMany() + .HasForeignKey("IdPlan") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("WellOperations") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellOperations") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("OperationPlan"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Parent") + .WithMany() + .HasForeignKey("IdParent"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => + { + b.HasOne("AsbCloudDb.Model.WellSectionType", "SectionType") + .WithMany() + .HasForeignKey("IdSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("SectionType"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record1", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record50", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record60", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record61", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record7", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record8", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Navigation("Wells"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => + { + b.Navigation("Companies"); + + b.Navigation("Contacts"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Navigation("Clusters"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Navigation("RelatedUsers"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Navigation("FileMarks"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => + { + b.Navigation("Children"); + + b.Navigation("Manuals"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Navigation("Measures"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => + { + b.Navigation("Notifications"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Navigation("RelationUserRolePermissions"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Navigation("DataSaub"); + + b.Navigation("DataSpin"); + + b.Navigation("Events"); + + b.Navigation("Messages"); + + b.Navigation("Users"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Navigation("FileMarks"); + + b.Navigation("Files"); + + b.Navigation("RelationContactsWells"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("RelationUserRolePermissions"); + + b.Navigation("RelationUserRoleUserRoles"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("Contacts"); + + b.Navigation("DrillingProgramParts"); + + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellComposites"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Navigation("WellComposites"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Navigation("Wells"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.cs b/AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.cs new file mode 100644 index 00000000..d806854b --- /dev/null +++ b/AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.cs @@ -0,0 +1,37 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + /// + public partial class Update_ItemInfo : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "LastUpdateDate", + table: "t_well_operation", + type: "timestamp with time zone", + nullable: true, + oldClrType: typeof(DateTimeOffset), + oldType: "timestamp with time zone"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "LastUpdateDate", + table: "t_well_operation", + type: "timestamp with time zone", + nullable: false, + defaultValue: new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), + oldClrType: typeof(DateTimeOffset), + oldType: "timestamp with time zone", + oldNullable: true); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 9957e235..4ae3016a 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -63,9 +63,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDeposit"); - b.ToTable("t_cluster"); - - b.HasComment("Кусты"); + b.ToTable("t_cluster", t => + { + t.HasComment("Кусты"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Company", b => @@ -264,9 +265,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_contact"); - - b.HasComment("Контакты"); + b.ToTable("t_contact", t => + { + t.HasComment("Контакты"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => @@ -312,9 +314,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell", "Date") .IsUnique(); - b.ToTable("t_daily_report"); - - b.HasComment("Ежедневные отчёты"); + b.ToTable("t_daily_report", t => + { + t.HasComment("Ежедневные отчёты"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => @@ -442,9 +445,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_data_saub_stat"); - - b.HasComment("Кеш-таблица для хранения данных для РТК-отчета"); + b.ToTable("t_data_saub_stat", t => + { + t.HasComment("Кеш-таблица для хранения данных для РТК-отчета"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => @@ -478,9 +482,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_deposit"); - - b.HasComment("Месторождение"); + b.ToTable("t_deposit", t => + { + t.HasComment("Месторождение"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => @@ -548,75 +553,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_detected_operation"); - - b.HasComment("автоматически определенные операции по телеметрии"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Driller", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name") - .HasComment("Имя"); - - b.Property("Patronymic") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("patronymic") - .HasComment("Отчество"); - - b.Property("Surname") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("surname") - .HasComment("Фамилия"); - - b.HasKey("Id"); - - b.ToTable("t_driller"); - - b.HasComment("Бурильщик"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdFileCategory") - .HasColumnType("integer") - .HasColumnName("id_file_category"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well"); - - b.HasKey("Id"); - - b.HasIndex("IdFileCategory"); - - b.HasIndex("IdWell", "IdFileCategory") - .IsUnique(); - - b.ToTable("t_drilling_program_part"); - - b.HasComment("части программ бурения"); + b.ToTable("t_detected_operation", t => + { + t.HasComment("автоматически определенные операции по телеметрии"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => @@ -651,9 +591,78 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_drill_test"); + b.ToTable("t_drill_test", t => + { + t.HasComment("Drill_test"); + }); + }); - b.HasComment("Drill_test"); + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Имя"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("Отчество"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("Фамилия"); + + b.HasKey("Id"); + + b.ToTable("t_driller", t => + { + t.HasComment("Бурильщик"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdFileCategory") + .HasColumnType("integer") + .HasColumnName("id_file_category"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("Id"); + + b.HasIndex("IdFileCategory"); + + b.HasIndex("IdWell", "IdFileCategory") + .IsUnique(); + + b.ToTable("t_drilling_program_part", t => + { + t.HasComment("части программ бурения"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Faq", b => @@ -728,9 +737,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdAuthorQuestion"); - b.ToTable("t_faq"); - - b.HasComment("вопросы пользователей"); + b.ToTable("t_faq", t => + { + t.HasComment("вопросы пользователей"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => @@ -755,9 +765,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_file_category"); - - b.HasComment("Категории файлов"); + b.ToTable("t_file_category", t => + { + t.HasComment("Категории файлов"); + }); b.HasData( new @@ -1155,9 +1166,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_file_info"); - - b.HasComment("Файлы всех категорий"); + b.ToTable("t_file_info", t => + { + t.HasComment("Файлы всех категорий"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => @@ -1206,9 +1218,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_file_mark"); - - b.HasComment("Действия с файлами."); + b.ToTable("t_file_mark", t => + { + t.HasComment("Действия с файлами."); + }); }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => @@ -1235,9 +1248,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_float"); - - b.HasComment("таблица данных ГТИ с типом значения float"); + b.ToTable("t_wits_float", t => + { + t.HasComment("таблица данных ГТИ с типом значения float"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => @@ -1264,9 +1278,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_int"); - - b.HasComment("таблица данных ГТИ с типом значения int"); + b.ToTable("t_wits_int", t => + { + t.HasComment("таблица данных ГТИ с типом значения int"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => @@ -1294,9 +1309,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_string"); - - b.HasComment("таблица данных ГТИ с типом значения string"); + b.ToTable("t_wits_string", t => + { + t.HasComment("таблица данных ГТИ с типом значения string"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => @@ -1334,9 +1350,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdCategory"); - b.ToTable("t_help_page"); - - b.HasComment("Справки"); + b.ToTable("t_help_page", t => + { + t.HasComment("Справки"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => @@ -1376,9 +1393,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_limiting_parameter"); - - b.HasComment("Ограничения по параметрам телеметрии"); + b.ToTable("t_limiting_parameter", t => + { + t.HasComment("Ограничения по параметрам телеметрии"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Manuals.Manual", b => @@ -1424,9 +1442,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDirectory"); - b.ToTable("t_manual"); - - b.HasComment("Инструкции"); + b.ToTable("t_manual", t => + { + t.HasComment("Инструкции"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => @@ -1453,9 +1472,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdParent"); - b.ToTable("t_manual_directory"); - - b.HasComment("Директория для инструкций"); + b.ToTable("t_manual_directory", t => + { + t.HasComment("Директория для инструкций"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Measure", b => @@ -1499,9 +1519,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_measure"); - - b.HasComment("Таблица c данными для вкладки 'Последние данные'"); + b.ToTable("t_measure", t => + { + t.HasComment("Таблица c данными для вкладки 'Последние данные'"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => @@ -1526,9 +1547,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_measure_category"); - - b.HasComment("Категория последних данных"); + b.ToTable("t_measure_category", t => + { + t.HasComment("Категория последних данных"); + }); b.HasData( new @@ -1608,9 +1630,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_notification"); - - b.HasComment("Уведомления"); + b.ToTable("t_notification", t => + { + t.HasComment("Уведомления"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => @@ -1629,9 +1652,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_notification_category"); - - b.HasComment("Категории уведомлений"); + b.ToTable("t_notification_category", t => + { + t.HasComment("Категории уведомлений"); + }); b.HasData( new @@ -1687,9 +1711,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_operationvalue"); - - b.HasComment("Целевые/нормативные показатели операции"); + b.ToTable("t_operationvalue", t => + { + t.HasComment("Целевые/нормативные показатели операции"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Permission", b => @@ -1716,9 +1741,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_permission"); - - b.HasComment("Разрешения на доступ к данным"); + b.ToTable("t_permission", t => + { + t.HasComment("Разрешения на доступ к данным"); + }); b.HasData( new @@ -2742,9 +2768,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_process_map_plan_drilling"); - - b.HasComment("РТК план бурение"); + b.ToTable("t_process_map_plan_drilling", t => + { + t.HasComment("РТК план бурение"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => @@ -2862,9 +2889,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_process_map_plan_ream"); - - b.HasComment("РТК проработка скважины"); + b.ToTable("t_process_map_plan_ream", t => + { + t.HasComment("РТК проработка скважины"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => @@ -2881,9 +2909,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_relation_company_well"); - - b.HasComment("отношение скважин и компаний"); + b.ToTable("t_relation_company_well", t => + { + t.HasComment("отношение скважин и компаний"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.RelationContactWell", b => @@ -2923,9 +2952,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDrillingProgramPart"); - b.ToTable("t_relation_user_drilling_program_part"); - - b.HasComment("Отношение пользователей и частей ПБ"); + b.ToTable("t_relation_user_drilling_program_part", t => + { + t.HasComment("Отношение пользователей и частей ПБ"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => @@ -2942,9 +2972,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdPermission"); - b.ToTable("t_relation_user_role_permission"); - - b.HasComment("Отношение ролей пользователей и разрешений доступа"); + b.ToTable("t_relation_user_role_permission", t => + { + t.HasComment("Отношение ролей пользователей и разрешений доступа"); + }); b.HasData( new @@ -4259,9 +4290,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdInclude"); - b.ToTable("t_relation_user_role_user_role"); - - b.HasComment("Отношение ролей к ролям"); + b.ToTable("t_relation_user_role_user_role", t => + { + t.HasComment("Отношение ролей к ролям"); + }); b.HasData( new @@ -4550,9 +4582,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUserRole"); - b.ToTable("t_relation_user_user_role"); - - b.HasComment("Отношение пользователей и ролей"); + b.ToTable("t_relation_user_user_role", t => + { + t.HasComment("Отношение пользователей и ролей"); + }); b.HasData( new @@ -4606,9 +4639,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_report_property"); - - b.HasComment("Отчеты с данными по буровым"); + b.ToTable("t_report_property", t => + { + t.HasComment("Отчеты с данными по буровым"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => @@ -4657,9 +4691,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_schedule"); - - b.HasComment("График работы бурильщика"); + b.ToTable("t_schedule", t => + { + t.HasComment("График работы бурильщика"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => @@ -4712,9 +4747,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_setpoints_rquest"); - - b.HasComment("Запросы на изменение уставок панели оператора"); + b.ToTable("t_setpoints_rquest", t => + { + t.HasComment("Запросы на изменение уставок панели оператора"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Subsystem", b => @@ -4739,9 +4775,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_subsystem"); - - b.HasComment("Описание подсистем"); + b.ToTable("t_subsystem", t => + { + t.HasComment("Описание подсистем"); + }); b.HasData( new @@ -4807,9 +4844,10 @@ namespace AsbCloudDb.Migrations b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); - b.ToTable("t_telemetry"); - - b.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + b.ToTable("t_telemetry", t => + { + t.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => @@ -5025,9 +5063,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_data_saub"); - - b.HasComment("набор основных данных по SAUB"); + b.ToTable("t_telemetry_data_saub", t => + { + t.HasComment("набор основных данных по SAUB"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaubStat", b => @@ -5056,7 +5095,9 @@ namespace AsbCloudDb.Migrations .HasColumnType("integer") .HasColumnName("id_telemetry"); - b.ToView("mw_telemetry_datas_saub_stat"); + b.ToTable((string)null); + + b.ToView("mw_telemetry_datas_saub_stat", (string)null); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => @@ -5122,9 +5163,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_data_spin"); - - b.HasComment("набор основных данных по SpinMaster"); + b.ToTable("t_telemetry_data_spin", t => + { + t.HasComment("набор основных данных по SpinMaster"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => @@ -5148,9 +5190,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdEvent"); - b.ToTable("t_telemetry_event"); - - b.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + b.ToTable("t_telemetry_event", t => + { + t.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => @@ -5208,9 +5251,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_telemetry_message"); - - b.HasComment("Сообщения на буровых"); + b.ToTable("t_telemetry_message", t => + { + t.HasComment("Сообщения на буровых"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => @@ -5245,9 +5289,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdUser"); - b.ToTable("t_telemetry_user"); - - b.HasComment("Пользователи панели САУБ. Для сообщений."); + b.ToTable("t_telemetry_user", t => + { + t.HasComment("Пользователи панели САУБ. Для сообщений."); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryWirelineRunOut", b => @@ -5287,9 +5332,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry"); - b.ToTable("t_telemetry_wireline_run_out"); - - b.HasComment("Наработка талевого каната"); + b.ToTable("t_telemetry_wireline_run_out", t => + { + t.HasComment("Наработка талевого каната"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => @@ -5352,9 +5398,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_trajectory_fact"); - - b.HasComment("Загрузка фактической траектории"); + b.ToTable("t_trajectory_fact", t => + { + t.HasComment("Загрузка фактической траектории"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlan", b => @@ -5422,9 +5469,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_trajectory_plan"); - - b.HasComment("Загрузка плановой траектории"); + b.ToTable("t_trajectory_plan", t => + { + t.HasComment("Загрузка плановой траектории"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.User", b => @@ -5502,9 +5550,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("Login") .IsUnique(); - b.ToTable("t_user"); - - b.HasComment("Пользователи облака"); + b.ToTable("t_user", t => + { + t.HasComment("Пользователи облака"); + }); b.HasData( new @@ -5542,9 +5591,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_user_role"); - - b.HasComment("Роли пользователей в системе"); + b.ToTable("t_user_role", t => + { + t.HasComment("Роли пользователей в системе"); + }); b.HasData( new @@ -5880,9 +5930,55 @@ namespace AsbCloudDb.Migrations b.HasKey("IdUser", "Key"); - b.ToTable("t_user_settings"); + b.ToTable("t_user_settings", t => + { + t.HasComment("настройки интерфейса пользователя"); + }); + }); - b.HasComment("настройки интерфейса пользователя"); + modelBuilder.Entity("AsbCloudDb.Model.WITS.RecordBase", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Actcod") + .HasColumnType("smallint") + .HasColumnName("ACTCOD"); + + b.Property("Date") + .HasColumnType("integer") + .HasColumnName("DATE"); + + b.Property("Recid") + .HasColumnType("smallint") + .HasColumnName("RECID"); + + b.Property("Seqid") + .HasColumnType("integer") + .HasColumnName("SEQID"); + + b.Property("Stknum") + .HasColumnType("smallint") + .HasColumnName("STKNUM"); + + b.Property("Time") + .HasColumnType("integer") + .HasColumnName("TIME"); + + b.Property("Wellid") + .HasColumnType("text") + .HasColumnName("WELLID"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_wits_base"); + + b.UseTptMappingStrategy(); }); modelBuilder.Entity("AsbCloudDb.Model.Well", b => @@ -5940,9 +6036,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellType"); - b.ToTable("t_well"); - - b.HasComment("скважины"); + b.ToTable("t_well", t => + { + t.HasComment("скважины"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => @@ -5968,9 +6065,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSrc"); - b.ToTable("t_well_composite"); - - b.HasComment("Композитная скважина"); + b.ToTable("t_well_composite", t => + { + t.HasComment("Композитная скважина"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocument", b => @@ -5994,9 +6092,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_well_final_documents"); - - b.HasComment("Дело скважины"); + b.ToTable("t_well_final_documents", t => + { + t.HasComment("Дело скважины"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => @@ -6066,7 +6165,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("id_well_section_type") .HasComment("Id тип секции скважины"); - b.Property("LastUpdateDate") + b.Property("LastUpdateDate") .HasColumnType("timestamp with time zone"); b.HasKey("Id"); @@ -6083,9 +6182,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_well_operation"); - - b.HasComment("Данные по операциям на скважине"); + b.ToTable("t_well_operation", t => + { + t.HasComment("Данные по операциям на скважине"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => @@ -6124,9 +6224,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdParent"); - b.ToTable("t_well_operation_category"); - - b.HasComment("Справочник операций на скважине"); + b.ToTable("t_well_operation_category", t => + { + t.HasComment("Справочник операций на скважине"); + }); b.HasData( new @@ -7213,65 +7314,6 @@ namespace AsbCloudDb.Migrations }); }); - modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Конечная глубина бурения, м"); - - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Начальная глубина бурения, м"); - - b.Property("IdSectionType") - .HasColumnType("integer") - .HasColumnName("id_section_type") - .HasComment("Тип секции"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("Id пользователя"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины"); - - b.Property("InnerDiameter") - .HasColumnType("double precision") - .HasColumnName("inner_diameter") - .HasComment("Внутренний диаметр"); - - b.Property("LastUpdateDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_last_update") - .HasComment("Дата последнего обновления"); - - b.Property("OuterDiameter") - .HasColumnType("double precision") - .HasColumnName("outer_diameter") - .HasComment("Внешний диаметр"); - - b.HasKey("Id"); - - b.HasIndex("IdSectionType"); - - b.HasIndex("IdWell", "IdSectionType") - .IsUnique(); - - b.ToTable("t_well_section_plan"); - }); - modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => { b.Property("Id") @@ -7295,9 +7337,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_well_section_type"); - - b.HasComment("конструкция секции скважины"); + b.ToTable("t_well_section_type", t => + { + t.HasComment("конструкция секции скважины"); + }); b.HasData( new @@ -7530,6 +7573,65 @@ namespace AsbCloudDb.Migrations }); }); + modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина бурения, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Начальная глубина бурения, м"); + + b.Property("IdSectionType") + .HasColumnType("integer") + .HasColumnName("id_section_type") + .HasComment("Тип секции"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("InnerDiameter") + .HasColumnType("double precision") + .HasColumnName("inner_diameter") + .HasComment("Внутренний диаметр"); + + b.Property("LastUpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_update") + .HasComment("Дата последнего обновления"); + + b.Property("OuterDiameter") + .HasColumnType("double precision") + .HasColumnName("outer_diameter") + .HasComment("Внешний диаметр"); + + b.HasKey("Id"); + + b.HasIndex("IdSectionType"); + + b.HasIndex("IdWell", "IdSectionType") + .IsUnique(); + + b.ToTable("t_well_section_plan"); + }); + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => { b.Property("Id") @@ -7548,9 +7650,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_well_type"); - - b.HasComment("конструкция скважины"); + b.ToTable("t_well_type", t => + { + t.HasComment("конструкция скважины"); + }); b.HasData( new @@ -7565,49 +7668,6 @@ namespace AsbCloudDb.Migrations }); }); - modelBuilder.Entity("AsbCloudDb.Model.WITS.RecordBase", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("Actcod") - .HasColumnType("smallint") - .HasColumnName("ACTCOD"); - - b.Property("Date") - .HasColumnType("integer") - .HasColumnName("DATE"); - - b.Property("Recid") - .HasColumnType("smallint") - .HasColumnName("RECID"); - - b.Property("Seqid") - .HasColumnType("integer") - .HasColumnName("SEQID"); - - b.Property("Stknum") - .HasColumnType("smallint") - .HasColumnName("STKNUM"); - - b.Property("Time") - .HasColumnType("integer") - .HasColumnName("TIME"); - - b.Property("Wellid") - .HasColumnType("text") - .HasColumnName("WELLID"); - - b.HasKey("IdTelemetry", "DateTime"); - - b.ToTable("t_telemetry_wits_base"); - }); - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => { b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); @@ -8351,6 +8411,17 @@ namespace AsbCloudDb.Migrations b.Navigation("Telemetry"); }); + modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => { b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") @@ -8370,17 +8441,6 @@ namespace AsbCloudDb.Migrations b.Navigation("Well"); }); - modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - modelBuilder.Entity("AsbCloudDb.Model.Faq", b => { b.HasOne("AsbCloudDb.Model.User", "AuthorAnswer") diff --git a/AsbCloudDb/Model/ItemInfo.cs b/AsbCloudDb/Model/ItemInfo.cs index 3d7e6793..bf579080 100644 --- a/AsbCloudDb/Model/ItemInfo.cs +++ b/AsbCloudDb/Model/ItemInfo.cs @@ -12,6 +12,6 @@ namespace AsbCloudDb.Model /// /// дата последнего обновления блока /// - public DateTimeOffset LastUpdateDate { get; set; } = DateTimeOffset.Now; + public DateTimeOffset? LastUpdateDate { get; set; } } } diff --git a/AsbCloudDb/Model/WellOperation.cs b/AsbCloudDb/Model/WellOperation.cs index dda4e3e4..7a63e586 100644 --- a/AsbCloudDb/Model/WellOperation.cs +++ b/AsbCloudDb/Model/WellOperation.cs @@ -51,6 +51,12 @@ namespace AsbCloudDb.Model [Column("comment"), Comment("Комментарий")] public string? Comment { get; set; } + + [NotMapped] + public double NptHours { get; set; } + + [NotMapped] + public double Day { get; set; } [JsonIgnore] [ForeignKey(nameof(IdWell))] @@ -67,23 +73,6 @@ namespace AsbCloudDb.Model [JsonIgnore] [ForeignKey(nameof(IdPlan))] public virtual WellOperation? OperationPlan { get; set; } = null!; - - public bool IsSame(WellOperation other) - { - var isSame = IdWell == other.IdWell && - IdWellSectionType == other.IdWellSectionType && - IdCategory == other.IdCategory && - IdType == other.IdType && - IdPlan == other.IdPlan && - DepthStart == other.DepthStart && - DepthEnd == other.DepthEnd && - DateStart == other.DateStart && - DurationHours == other.DurationHours && - CategoryInfo == other.CategoryInfo && - Comment == other.Comment; - - return isSame; - } } } From 88c928cd5d2edeb7a578c533243bd657f2570757 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 Mar 2024 10:52:28 +0300 Subject: [PATCH 06/52] =?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=20WellOperationRepository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IWellOperationCategoryRepository.cs | 4 +- .../Repositories/IWellOperationRepository.cs | 90 +- AsbCloudApp/Requests/WellOperationRequest.cs | 140 +-- .../Services/IDetectedOperationService.cs | 2 +- .../Services/IOperationsStatService.cs | 1 + .../IWellCompositeOperationService.cs | 6 +- .../Repository/CrudRepositoryBase.cs | 28 + .../WellOperationCategoryRepository.cs | 5 +- .../Repository/WellOperationRepository.cs | 1028 ++++++----------- 9 files changed, 438 insertions(+), 866 deletions(-) diff --git a/AsbCloudApp/Repositories/IWellOperationCategoryRepository.cs b/AsbCloudApp/Repositories/IWellOperationCategoryRepository.cs index 4e18c231..ecf915cd 100644 --- a/AsbCloudApp/Repositories/IWellOperationCategoryRepository.cs +++ b/AsbCloudApp/Repositories/IWellOperationCategoryRepository.cs @@ -1,5 +1,5 @@ -using AsbCloudApp.Data; -using System.Collections.Generic; +using System.Collections.Generic; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Repositories { diff --git a/AsbCloudApp/Repositories/IWellOperationRepository.cs b/AsbCloudApp/Repositories/IWellOperationRepository.cs index dd39ce52..ffc69970 100644 --- a/AsbCloudApp/Repositories/IWellOperationRepository.cs +++ b/AsbCloudApp/Repositories/IWellOperationRepository.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Repositories { @@ -17,24 +18,8 @@ namespace AsbCloudApp.Repositories /// /// IEnumerable GetSectionTypes(); - - /// - /// список плановых операций для сопоставления - /// - /// - /// - /// - /// - Task GetOperationsPlanAsync(int idWell, DateTime? currentDate, CancellationToken token); - - /// - /// дата/время первой операции по скважине - /// - /// - /// - DateTimeOffset? FirstOperationDate(int idWell); - - /// + + /// /// Получить страницу списка операций /// /// @@ -42,15 +27,7 @@ namespace AsbCloudApp.Repositories /// Task> GetAsync(WellOperationRequest request, CancellationToken token); - /// - /// Получить список операций по запросу - /// - /// - /// - /// - Task> GetAsync(WellsOperationRequest request, CancellationToken token); - - /// + /// /// Получить страницу списка операций /// /// @@ -58,39 +35,30 @@ namespace AsbCloudApp.Repositories /// Task> GetPageAsync(WellOperationRequest request, CancellationToken token); - /// - /// Получить операцию по id - /// - /// - /// - /// - Task GetOrDefaultAsync(int id, CancellationToken token); - - /// + /// /// Получить статистику операции по скважине с группировкой по категориям /// /// /// /// - Task> GetGroupOperationsStatAsync( - WellOperationRequest request, - CancellationToken token); + Task> GetGroupOperationsStatAsync(WellOperationRequest request, CancellationToken token); + + /// + /// Добавить несколько операций + /// + /// + /// + /// + /// + Task InsertRangeAsync(IEnumerable dtos, bool deleteBeforeInsert, CancellationToken token); /// - /// Добавить несколько операций за один раз - /// - /// - /// - /// - Task InsertRangeAsync(IEnumerable wellOperationDtos, CancellationToken token); - - /// - /// Обновить существующую операцию + /// Обновить несколько существующую операций /// /// /// /// - Task UpdateAsync(WellOperationDto dto, CancellationToken token); + Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token); /// /// Удалить операции по id @@ -98,7 +66,7 @@ namespace AsbCloudApp.Repositories /// /// /// - Task DeleteAsync(IEnumerable ids, CancellationToken token); + Task DeleteRangeAsync(IEnumerable ids, CancellationToken token); /// /// Получить секции скважин из операций ГГД. Секцие поделены на плановые и фактические. @@ -115,24 +83,6 @@ namespace AsbCloudApp.Repositories /// /// /// - Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken); - - /// - /// Удаление полных дубликатов операций по всем скважинам - /// - /// - /// - /// - Task RemoveDuplicates(Action onProgressCallback, CancellationToken token); - - /// - /// Усечение пересекающейся последующей операции по дате и глубине забоя - /// - /// Фильтр по дате. Если хоть одна операция попадет в в фильтр, то будет обработана вся скважина, а не только эта операция - /// Фильтр по дате. Если хоть одна операция попадет в в фильтр, то будет обработана вся скважина, а не только эта операция - /// - /// - /// - Task TrimOverlapping(DateTimeOffset? geDate, DateTimeOffset leDate, Action onProgressCallback, CancellationToken token); - } + Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken); + } } \ No newline at end of file diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs index 1d190018..3164c2d1 100644 --- a/AsbCloudApp/Requests/WellOperationRequest.cs +++ b/AsbCloudApp/Requests/WellOperationRequest.cs @@ -3,110 +3,50 @@ using System.Collections.Generic; namespace AsbCloudApp.Requests { - /// - /// параметры для запроса списка операций - /// - public class WellOperationRequestBase : RequestBase - { - /// - /// фильтр по дате начала операции - /// - public DateTime? GeDate { get; set; } + public class WellOperationRequest : RequestBase + { + /// + /// Идентификаторы скважин + /// + public IEnumerable? IdsWell { get; set; } - /// - /// фильтр по дате окончания операции - /// - public DateTime? LtDate { get; set; } + /// + /// Больше или равно дате начала операции + /// + public DateTimeOffset? GeDate { get; set; } - /// - /// фильтр. Больше или равно глубины скважины на начало операции. - /// - public double? GeDepth { get; set; } + /// + /// Меньше или равно дате окончания операции + /// + public DateTimeOffset? LeDate { get; set; } - /// - /// фильтр. Меньше или равно глубины скважины на конец операции. - /// - public double? LeDepth { get; set; } + /// + /// Больше или равно глубины скважины на начало операции. + /// + public double? GeDepth { get; set; } - /// - /// фильтр по списку id категорий операции - /// - public IEnumerable? OperationCategoryIds { get; set; } + /// + /// Меньше или равно глубины скважины на конец операции. + /// + public double? LeDepth { get; set; } - /// - /// фильтр по план = 0, факт = 1 - /// - public int? OperationType { get; set; } + /// + /// Идентификаторы категорий операции + /// + public IEnumerable? OperationCategoryIds { get; set; } - /// - /// фильтр по списку id конструкций секции - /// - public IEnumerable? SectionTypeIds { get; set; } + /// + /// Тип операций + /// + /// 0 - плановая операция + /// 1 - фактическая операция + /// + /// + public int? OperationType { get; set; } - /// - /// Параметры для запроса списка операций. - /// Базовый конструктор - /// - public WellOperationRequestBase() - { } - - /// - /// Параметры для запроса списка операций. - /// Копирующий конструктор - /// - /// - public WellOperationRequestBase(WellOperationRequestBase request) - { - GeDepth = request.GeDepth; - LeDepth = request.LeDepth; - GeDate = request.GeDate; - LtDate = request.LtDate; - - OperationCategoryIds = request.OperationCategoryIds; - OperationType = request.OperationType; - SectionTypeIds = request.SectionTypeIds; - - Skip = request.Skip; - Take = request.Take; - SortFields = request.SortFields; - } - } - - /// - /// Параметры для запроса списка операций (с id скважины) - /// - public class WellOperationRequest : WellOperationRequestBase - { - /// - /// id скважины - /// - public int IdWell { get; set; } - - /// - /// ctor - /// - public WellOperationRequest() { } - - /// - /// копирующий конструктор - /// - /// - /// - public WellOperationRequest(WellOperationRequestBase request, int idWell) - :base(request) - { - IdWell = idWell; - } - } - - /// - /// Параметры для запроса списка операций (с массивом id скважин) - /// - public class WellsOperationRequest : WellOperationRequestBase - { - /// - /// ids скважин - /// - public IEnumerable IdsWell { get; set; } = null!; - } -} + /// + /// Идентификаторы конструкций секции + /// + public IEnumerable? SectionTypeIds { get; set; } + } +} \ No newline at end of file diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs index 998032ba..208706f7 100644 --- a/AsbCloudApp/Services/IDetectedOperationService.cs +++ b/AsbCloudApp/Services/IDetectedOperationService.cs @@ -1,10 +1,10 @@ using System; -using AsbCloudApp.Data; using AsbCloudApp.Data.DetectedOperation; using AsbCloudApp.Requests; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Services { diff --git a/AsbCloudApp/Services/IOperationsStatService.cs b/AsbCloudApp/Services/IOperationsStatService.cs index a92d0553..f5ec7c7c 100644 --- a/AsbCloudApp/Services/IOperationsStatService.cs +++ b/AsbCloudApp/Services/IOperationsStatService.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Services { diff --git a/AsbCloudApp/Services/IWellCompositeOperationService.cs b/AsbCloudApp/Services/IWellCompositeOperationService.cs index 94ba1f93..96dbcf2b 100644 --- a/AsbCloudApp/Services/IWellCompositeOperationService.cs +++ b/AsbCloudApp/Services/IWellCompositeOperationService.cs @@ -1,7 +1,7 @@ -using AsbCloudApp.Data; -using System.Collections.Generic; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Services { @@ -16,6 +16,6 @@ namespace AsbCloudApp.Services /// /// /// - Task>> GetAsync(IEnumerable idsWells, CancellationToken token); + Task>> GetAsync(IEnumerable idsWells, CancellationToken token); } } diff --git a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs index f21dd487..3cdce610 100644 --- a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs @@ -114,6 +114,26 @@ namespace AsbCloudInfrastructure.Repository entry.State = EntityState.Detached; return entry.Entity.Id; } + + public virtual async Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) + { + if (!dtos.Any()) + return 0; + + var ids = dtos.Select(d => d.Id); + + var countExistingEntities = await dbSet + .Where(d => ids.Contains(d.Id)) + .CountAsync(token); + + if (ids.Count() > countExistingEntities) + return ICrudRepository.ErrorIdNotFound; + + var entities = dtos.Select(Convert); + dbContext.Set().UpdateRange(entities); + + return await dbContext.SaveChangesAsync(token); + } /// public virtual Task DeleteAsync(int id, CancellationToken token) @@ -129,6 +149,14 @@ namespace AsbCloudInfrastructure.Repository return affected; } + public virtual async Task DeleteRangeAsync(IEnumerable ids, CancellationToken token) + { + var query = dbContext.Set().Where(e => ids.Contains(e.Id)); + dbContext.Set().RemoveRange(query); + + return await dbContext.SaveChangesAsync(token); + } + protected virtual TDto Convert(TEntity src) => src.Adapt(); protected virtual TEntity Convert(TDto src) => src.Adapt(); diff --git a/AsbCloudInfrastructure/Repository/WellOperationCategoryRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationCategoryRepository.cs index 84da5f3d..927a424e 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationCategoryRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationCategoryRepository.cs @@ -1,11 +1,10 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Repositories; +using AsbCloudApp.Repositories; using AsbCloudDb.Model; using Mapster; using Microsoft.Extensions.Caching.Memory; -using System; using System.Collections.Generic; using System.Linq; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudInfrastructure.Repository; diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 329d2502..702ca982 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -1,4 +1,11 @@ -using AsbCloudApp.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; @@ -7,693 +14,340 @@ using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository; -/// -/// репозиторий операций по скважине -/// -public class WellOperationRepository : IWellOperationRepository +public class WellOperationRepository : CrudRepositoryBase, + IWellOperationRepository { - private const string KeyCacheSections = "OperationsBySectionSummarties"; - - private readonly IAsbCloudDbContext db; - private readonly IMemoryCache memoryCache; - private readonly IWellService wellService; - private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; - - public WellOperationRepository(IAsbCloudDbContext db, IMemoryCache memoryCache, IWellService wellService, IWellOperationCategoryRepository wellOperationCategoryRepository) - { - this.db = db; - this.memoryCache = memoryCache; - this.wellService = wellService; - this.wellOperationCategoryRepository = wellOperationCategoryRepository; - } - - public IEnumerable GetSectionTypes() => - memoryCache - .GetOrCreateBasic(db.Set()) - .OrderBy(s => s.Order) - .Select(s => s.Adapt()); - - public async Task GetOperationsPlanAsync(int idWell, DateTime? currentDate, CancellationToken token) - { - var timezone = wellService.GetTimezone(idWell); - var request = new WellOperationRequest() - { - IdWell = idWell, - OperationType = WellOperation.IdOperationTypePlan, - }; - - var dtos = await BuildQuery(request) - .AsNoTracking() - .ToArrayAsync(token); - - var dateLastAssosiatedPlanOperation = await GetDateLastAssosiatedPlanOperationAsync(idWell, currentDate, timezone.Hours, token); - - var result = new WellOperationPlanDto() - { - WellOperationsPlan = dtos.Select(Convert), - DateLastAssosiatedPlanOperation = dateLastAssosiatedPlanOperation - }; - - return result; - } - - private async Task GetDateLastAssosiatedPlanOperationAsync( - int idWell, - DateTime? lessThenDate, - double timeZoneHours, - CancellationToken token) - { - if (lessThenDate is null) - return null; - - var currentDateOffset = lessThenDate.Value.ToUtcDateTimeOffset(timeZoneHours); - var timeZoneOffset = TimeSpan.FromHours(timeZoneHours); - - var lastFactOperation = await db.WellOperations - .Where(o => o.IdWell == idWell) - .Where(o => o.IdType == WellOperation.IdOperationTypeFact) - .Where(o => o.IdPlan != null) - .Where(o => o.DateStart < currentDateOffset) - .Include(x => x.OperationPlan) - .OrderByDescending(x => x.DateStart) - .FirstOrDefaultAsync(token) - .ConfigureAwait(false); - - if (lastFactOperation is not null) - return DateTime.SpecifyKind(lastFactOperation.OperationPlan!.DateStart.UtcDateTime + timeZoneOffset, DateTimeKind.Unspecified); - - return null; - } - - /// - public async Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token) - { - var cache = await memoryCache.GetOrCreateAsync(KeyCacheSections, async (entry) => - { - entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30); - - var query = db.Set() - .GroupBy(operation => new - { - operation.IdWell, - operation.IdType, - operation.IdWellSectionType, - operation.WellSectionType.Caption, - }) - .Select(group => new - { - group.Key.IdWell, - group.Key.IdType, - group.Key.IdWellSectionType, - group.Key.Caption, - - First = group - .OrderBy(operation => operation.DateStart) - .Select(operation => new - { - operation.DateStart, - operation.DepthStart, - }) - .First(), - - Last = group - .OrderByDescending(operation => operation.DateStart) - .Select(operation => new - { - operation.DateStart, - operation.DurationHours, - operation.DepthEnd, - }) - .First(), - }); - var dbData = await query.ToArrayAsync(token); - var sections = dbData.Select( - item => new SectionByOperationsDto - { - IdWell = item.IdWell, - IdType = item.IdType, - IdWellSectionType = item.IdWellSectionType, - - Caption = item.Caption, - - DateStart = item.First.DateStart, - DepthStart = item.First.DepthStart, - - DateEnd = item.Last.DateStart.AddHours(item.Last.DurationHours), - DepthEnd = item.Last.DepthEnd, - }) - .ToArray() - .AsEnumerable(); - - entry.Value = sections; - return sections; - }); - - var sections = cache.Where(s => idsWells.Contains(s.IdWell)); - return sections; - } - - 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 = minDate.ToRemoteDateTime(timezone.Hours), - To = maxDate.ToRemoteDateTime(timezone.Hours) - }; - } - - /// - public DateTimeOffset? FirstOperationDate(int idWell) - { - var sections = GetSectionsAsync(new[] { idWell }, CancellationToken.None).Result; - var first = sections.FirstOrDefault(section => section.IdType == WellOperation.IdOperationTypeFact) - ?? sections.FirstOrDefault(section => section.IdType == WellOperation.IdOperationTypePlan); - - return first?.DateStart; - } - - /// - public async Task> GetAsync( - WellOperationRequest request, - CancellationToken token) - { - var query = BuildQuery(request) - .AsNoTracking(); - - var dtos = await query.ToArrayAsync(token); - - return dtos.Select(Convert); - } - - public async Task> GetAsync( - WellsOperationRequest request, - CancellationToken token) - { - var query = BuildQuery(request) - .AsNoTracking(); - - var dtos = await query.ToArrayAsync(token); - return dtos; - } - - /// - public async Task> GetPageAsync( - WellOperationRequest request, - CancellationToken token) - { - var query = BuildQuery(request); - - var result = new PaginationContainer - { - Skip = request.Skip ?? 0, - Take = request.Take ?? 32, - Count = await query.CountAsync(token), - }; - - var dtos = await query.ToArrayAsync(token); - - result.Items = dtos.Select(Convert); - - return result; - } - - /// - public async Task GetOrDefaultAsync(int id, - CancellationToken token) - { - var entity = await db.WellOperations - .Include(s => s.WellSectionType) - .Include(s => s.OperationCategory) - .FirstOrDefaultAsync(e => e.Id == id, token) - .ConfigureAwait(false); - - if (entity is null) - return null; - - var timezone = wellService.GetTimezone(entity.IdWell); - - var dto = entity.Adapt(); - dto.WellSectionTypeName = entity.WellSectionType.Caption; - dto.DateStart = entity.DateStart.ToRemoteDateTime(timezone.Hours); - dto.CategoryName = entity.OperationCategory.Name; - return dto; - } - - /// - public async Task> GetGroupOperationsStatAsync( - WellOperationRequest request, - CancellationToken token) - { - // TODO: Rename controller method - request.OperationType = WellOperation.IdOperationTypeFact; - var query = BuildQuery(request); - var entities = await query - .Select(o => new - { - o.IdCategory, - DurationMinutes = o.DurationHours * 60, - DurationDepth = o.DepthEnd - o.DepthStart - }) - .ToListAsync(token); - var parentRelationDictionary = wellOperationCategoryRepository.Get(true) - .ToDictionary(c => c.Id, c => new - { - c.Name, - c.IdParent - }); - - var dtos = entities - .GroupBy(o => o.IdCategory) - .Select(g => new WellGroupOpertionDto - { - IdCategory = g.Key, - Category = parentRelationDictionary[g.Key].Name, - Count = g.Count(), - MinutesAverage = g.Average(o => o.DurationMinutes), - MinutesMin = g.Min(o => o.DurationMinutes), - MinutesMax = g.Max(o => o.DurationMinutes), - TotalMinutes = g.Sum(o => o.DurationMinutes), - DeltaDepth = g.Sum(o => o.DurationDepth), - IdParent = parentRelationDictionary[g.Key].IdParent - }); - - while (dtos.All(x => x.IdParent != null)) - { - dtos = dtos - .GroupBy(o => o.IdParent!) - .Select(g => - { - var idCategory = g.Key ?? int.MinValue; - var category = parentRelationDictionary.GetValueOrDefault(idCategory); - var newDto = new WellGroupOpertionDto - { - IdCategory = idCategory, - Category = category?.Name ?? "unknown", - Count = g.Sum(o => o.Count), - DeltaDepth = g.Sum(o => o.DeltaDepth), - TotalMinutes = g.Sum(o => o.TotalMinutes), - Items = g.ToList(), - IdParent = category?.IdParent, - }; - return newDto; - }); - } - return dtos; - } - - /// - public async Task InsertRangeAsync( - IEnumerable wellOperationDtos, - CancellationToken token) - { - var firstOperation = wellOperationDtos - .FirstOrDefault(); - if (firstOperation is null) - return 0; - - var idWell = firstOperation.IdWell; - - var timezone = wellService.GetTimezone(idWell); - foreach (var dto in wellOperationDtos) - { - var entity = dto.Adapt(); - entity.Id = default; - entity.DateStart = dto.DateStart.DateTime.ToUtcDateTimeOffset(timezone.Hours); - entity.IdWell = idWell; - entity.LastUpdateDate = DateTimeOffset.UtcNow; - db.WellOperations.Add(entity); - } - - var result = await db.SaveChangesAsync(token); - if (result > 0) - memoryCache.Remove(KeyCacheSections); - return result; - - } - - /// - public async Task UpdateAsync( - WellOperationDto dto, CancellationToken token) - { - var timezone = wellService.GetTimezone(dto.IdWell); - var entity = dto.Adapt(); - entity.DateStart = dto.DateStart.DateTime.ToUtcDateTimeOffset(timezone.Hours); - entity.LastUpdateDate = DateTimeOffset.UtcNow; - db.WellOperations.Update(entity); - - var result = await db.SaveChangesAsync(token); - if (result > 0) - memoryCache.Remove(KeyCacheSections); - return result; - } - - /// - public async Task DeleteAsync(IEnumerable ids, - CancellationToken token) - { - var query = db.WellOperations.Where(e => ids.Contains(e.Id)); - db.WellOperations.RemoveRange(query); - - var result = await db.SaveChangesAsync(token); - if (result > 0) - memoryCache.Remove(KeyCacheSections); - return result; - } - - /// - /// В результате попрежнему требуется конвертировать дату - /// - /// - /// - /// - private IQueryable BuildQuery(WellOperationRequest request) - { - var timezone = wellService.GetTimezone(request.IdWell); - var timeZoneOffset = timezone.Hours; - - var query = db.WellOperations - .Include(s => s.WellSectionType) - .Include(s => s.OperationCategory) - .Where(o => o.IdWell == request.IdWell); - - if (request.OperationType.HasValue) - query = query.Where(e => e.IdType == request.OperationType.Value); - - if (request.SectionTypeIds?.Any() == true) - query = query.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); - - if (request.OperationCategoryIds?.Any() == true) - query = query.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); - - if (request.GeDepth.HasValue) - query = query.Where(e => e.DepthEnd >= request.GeDepth.Value); - - if (request.LeDepth.HasValue) - query = query.Where(e => e.DepthEnd <= request.LeDepth.Value); - - if (request.GeDate.HasValue) - { - var geDateOffset = request.GeDate.Value.ToUtcDateTimeOffset(timeZoneOffset); - query = query.Where(e => e.DateStart >= geDateOffset); - } - - if (request.LtDate.HasValue) - { - var ltDateOffset = request.LtDate.Value.ToUtcDateTimeOffset(timeZoneOffset); - query = query.Where(e => e.DateStart < ltDateOffset); - } - - var currentWellOperations = db.WellOperations - .Where(subOp => subOp.IdWell == request.IdWell); - - var wellOperationsWithCategoryNpt = currentWellOperations - .Where(subOp => subOp.IdType == 1) - .Where(subOp => WellOperationCategory.NonProductiveTimeSubIds.Contains(subOp.IdCategory)); - - // TODO: Вынести query.Select из метода BuildQuery - var dtos = query.Select(o => new WellOperationDto - { - Id = o.Id, - IdPlan = o.IdPlan, - IdType = o.IdType, - IdWell = o.IdWell, - IdWellSectionType = o.IdWellSectionType, - IdCategory = o.IdCategory, - IdParentCategory = o.OperationCategory.IdParent, - - CategoryName = o.OperationCategory.Name, - WellSectionTypeName = o.WellSectionType.Caption, - DateStart = o.DateStart, - DepthStart = o.DepthStart, - DepthEnd = o.DepthEnd, - DurationHours = o.DurationHours, - CategoryInfo = o.CategoryInfo, - Comment = o.Comment, - - NptHours = wellOperationsWithCategoryNpt - .Where(subOp => subOp.DateStart <= o.DateStart) - .Select(subOp => subOp.DurationHours) - .Sum(), - - Day = (o.DateStart - currentWellOperations - .Where(subOp => subOp.IdType == o.IdType) - .Where(subOp => subOp.DateStart <= o.DateStart) - .Min(subOp => subOp.DateStart)) - .TotalDays, - IdUser = o.IdUser, - LastUpdateDate = o.LastUpdateDate, - }); - - if (request.SortFields?.Any() == true) - { - dtos = dtos.SortBy(request.SortFields); - } - - dtos = dtos - .OrderBy(e => e.DateStart) - .ThenBy(e => e.DepthEnd) - .ThenBy(e => e.Id); - - if (request.Skip.HasValue) - dtos = dtos.Skip(request.Skip.Value); - - if (request.Take.HasValue) - dtos = dtos.Take(request.Take.Value); - - return dtos.AsNoTracking(); - } - - /// - /// Получение данных по запросу - /// - /// - /// - /// - private IQueryable BuildQuery(WellsOperationRequest request) - { - var query = db.WellOperations - .Where(o => request.IdsWell.Contains(o.IdWell)) - .Where(o => request.OperationType == o.IdType); - - if (request.SectionTypeIds?.Any() == true) - query = query.Where(o => request.SectionTypeIds.Contains(o.IdWellSectionType)); - - if (request.OperationCategoryIds?.Any() == true) - query = query.Where(o => request.OperationCategoryIds.Contains(o.IdCategory)); - - // TODO: Вынести query.Select из метода BuildQuery - var dtos = query.Select(o => new WellOperationDataDto - { - DepthStart = o.DepthStart, - DurationHours = o.DurationHours, - IdCategory = o.IdCategory, - IdWell = o.IdWell, - IdWellSectionType = o.IdWellSectionType, - OperationCategoryName = o.OperationCategory.Name, - WellSectionTypeCaption = o.WellSectionType.Caption, - }); - - if (request.SortFields?.Any() == true) - { - dtos = dtos.SortBy(request.SortFields); - } - - if (request.Skip.HasValue) - dtos = dtos.Skip(request.Skip.Value); - - if (request.Take.HasValue) - dtos = dtos.Take(request.Take.Value); - - return dtos.AsNoTracking(); - } - - private WellOperationDto Convert(WellOperationDto dto) - { - var timezone = wellService.GetTimezone(dto.IdWell); - var timezoneOffset = TimeSpan.FromHours(timezone.Hours); - - var dtoWithRemoteDateTime = dto.Adapt(); - - dtoWithRemoteDateTime.DateStart = dto.DateStart.ToOffset(TimeSpan.FromHours(timezoneOffset.Hours)); - dtoWithRemoteDateTime.LastUpdateDate = dto.LastUpdateDate?.ToOffset(TimeSpan.FromHours(timezoneOffset.Hours)); - - return dtoWithRemoteDateTime; - } - - public async Task RemoveDuplicates(Action onProgressCallback, CancellationToken token) - { - IQueryable dbset = db.Set(); - var query = dbset - .GroupBy(o => new { o.IdWell, o.IdType }) - .Select(g => new { g.Key.IdWell, g.Key.IdType }); - - var groups = await query - .ToArrayAsync(token); - - var count = groups.Count(); - var i = 0; - var totalRemoved = 0; - var total = 0; - foreach (var group in groups) - { - var result = await RemoveDuplicatesInGroup(group.IdWell, group.IdType, token); - totalRemoved += result.removed; - total += result.total; - var percent = i++ / count; - var message = $"RemoveDuplicates [{i} of {count}] wellId: {group.IdWell}, opType: {group.IdType}, affected: {result.removed} of {result.total}"; - onProgressCallback?.Invoke(message, percent); - Trace.TraceInformation(message); - } - var messageDone = $"RemoveDuplicates done [{i} of {count}] totalAffected: {totalRemoved} of {total}"; - Trace.TraceInformation(messageDone); - onProgressCallback?.Invoke(messageDone, 1); - return totalRemoved; - } - - private async Task<(int removed, int total)> RemoveDuplicatesInGroup(int idWell, int idType, CancellationToken token) - { - var dbset = db.Set(); - var entities = await dbset - .Where(o => o.IdWell == idWell && o.IdType == idType) - .OrderBy(o => o.DateStart) - .ToListAsync(token); - - using var entitiesEnumerator = entities.GetEnumerator(); - - if (!entitiesEnumerator.MoveNext()) - return (0, 0); - - var preEntity = entitiesEnumerator.Current; - while (entitiesEnumerator.MoveNext()) - { - var entity = entitiesEnumerator.Current; - if (preEntity.IsSame(entity)) - dbset.Remove(entity); - else - preEntity = entity; - } - var removed = await db.SaveChangesAsync(token); - return (removed, entities.Count); - } - - public async Task TrimOverlapping(DateTimeOffset? geDate, DateTimeOffset leDate, Action onProgressCallback, CancellationToken token) - { - var leDateUtc = leDate.ToUniversalTime(); - IQueryable query = db.Set(); - if (geDate.HasValue) - { - var geDateUtc = geDate.Value.ToUniversalTime(); - query = query.Where(e => e.DateStart >= geDateUtc); - } - - var groups = await query - .GroupBy(o => new { o.IdWell, o.IdType }) - .Select(g => new{ - MaxDate = g.Max(o => o.DateStart), - g.Key.IdWell, - g.Key.IdType, - }) - .Where(g => g.MaxDate <= leDateUtc) - .ToArrayAsync(token); - - var count = groups.Count(); - var i = 0; - (int takeover, int trimmed,int total) totalResult = (0, 0, 0); - foreach (var group in groups) - { - var result = await TrimOverlapping(group.IdWell, group.IdType, token); - totalResult.takeover += result.takeover; - totalResult.trimmed += result.trimmed; - totalResult.total += result.total; - var percent = i++ / count; - var message = $"TrimOverlapping [{i} of {count}] wellId: {group.IdWell}, opType: {group.IdType}, takeover:{result.takeover}, trimmed:{result.trimmed}, of {result.total}"; - onProgressCallback?.Invoke(message, percent); - Trace.TraceInformation(message); - } - var messageDone = $"TrimOverlapping done [{i} of {count}] total takeover:{totalResult.takeover}, total trimmed:{totalResult.trimmed} of {totalResult.total}"; - Trace.TraceInformation(messageDone); - onProgressCallback?.Invoke(messageDone, 1); - return totalResult.takeover + totalResult.trimmed; - } - - private async Task<(int takeover, int trimmed, int total)> TrimOverlapping(int idWell, int idType, CancellationToken token) - { - var dbset = db.Set(); - var query = dbset - .Where(o => o.IdWell == idWell) - .Where(o => o.IdType == idType) - .OrderBy(o => o.DateStart) - .ThenBy(o => o.DepthStart); - - var entities = await query - .ToListAsync(token); - - using var entitiesEnumerator = entities.GetEnumerator(); - - if (!entitiesEnumerator.MoveNext()) - return (0, 0, 0); - - int takeover = 0; - int trimmed = 0; - var preEntity = entitiesEnumerator.Current; - while (entitiesEnumerator.MoveNext()) - { - var entity = entitiesEnumerator.Current; - var preDepth = preEntity.DepthEnd; - - if (preEntity.DepthEnd >= entity.DepthEnd) - { - dbset.Remove(entity); - takeover++; - continue; - } - - if (preEntity.DepthEnd > entity.DepthStart) - { - entity.DepthStart = preEntity.DepthEnd; - trimmed++; - } - - var preDate = preEntity.DateStart.AddHours(preEntity.DurationHours); - - if (preDate >= entity.DateStart.AddHours(entity.DurationHours)) - { - dbset.Remove(entity); - takeover++; - continue; - } - - if (preDate > entity.DateStart) - { - var entityDateEnd = entity.DateStart.AddHours(entity.DurationHours); - entity.DateStart = preDate; - entity.DurationHours = (entityDateEnd - entity.DateStart).TotalHours; - trimmed++; - } - - preEntity = entity; - } - var affected = await db.SaveChangesAsync(token); - return (takeover, trimmed, entities.Count); - } -} + private readonly IMemoryCache memoryCache; + private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; + private readonly IWellService wellService; + + public WellOperationRepository(IAsbCloudDbContext context, + IMemoryCache memoryCache, + IWellOperationCategoryRepository wellOperationCategoryRepository, + IWellService wellService) + : base(context, dbSet => dbSet.Include(e => e.WellSectionType) + .Include(e => e.OperationCategory)) + { + this.memoryCache = memoryCache; + this.wellOperationCategoryRepository = wellOperationCategoryRepository; + this.wellService = wellService; + } + + public IEnumerable GetSectionTypes() => + memoryCache + .GetOrCreateBasic(dbContext.WellSectionTypes) + .OrderBy(s => s.Order) + .Select(s => s.Adapt()); + + public async Task> GetAsync(WellOperationRequest request, CancellationToken token) + { + var entities = await BuildQuery(request) + .AsNoTracking() + .ToArrayAsync(token); + + var dtos = entities.Select(Convert); + + return dtos; + } + + public async Task> GetPageAsync(WellOperationRequest request, CancellationToken token) + { + var skip = request.Skip ?? 0; + var take = request.Take ?? 32; + + var query = BuildQuery(request); + + var entites = await query.Skip(skip) + .Take(take) + .AsNoTracking() + .ToArrayAsync(token); + + var paginationContainer = new PaginationContainer + { + Skip = skip, + Take = take, + Count = await query.CountAsync(token), + Items = entites.Select(Convert) + }; + + return paginationContainer; + } + + public async Task> GetGroupOperationsStatAsync(WellOperationRequest request, CancellationToken token) + { + var query = BuildQuery(request); + var entities = await query + .Select(o => new + { + o.IdCategory, + DurationMinutes = o.DurationHours * 60, + DurationDepth = o.DepthEnd - o.DepthStart + }) + .ToArrayAsync(token); + + var parentRelationDictionary = wellOperationCategoryRepository.Get(true) + .ToDictionary(c => c.Id, c => new + { + c.Name, + c.IdParent + }); + + var dtos = entities + .GroupBy(o => o.IdCategory) + .Select(g => new WellGroupOpertionDto + { + IdCategory = g.Key, + Category = parentRelationDictionary[g.Key].Name, + Count = g.Count(), + MinutesAverage = g.Average(o => o.DurationMinutes), + MinutesMin = g.Min(o => o.DurationMinutes), + MinutesMax = g.Max(o => o.DurationMinutes), + TotalMinutes = g.Sum(o => o.DurationMinutes), + DeltaDepth = g.Sum(o => o.DurationDepth), + IdParent = parentRelationDictionary[g.Key].IdParent + }); + + while (dtos.All(x => x.IdParent != null)) + { + dtos = dtos + .GroupBy(o => o.IdParent!) + .Select(g => + { + var idCategory = g.Key ?? int.MinValue; + var category = parentRelationDictionary.GetValueOrDefault(idCategory); + var newDto = new WellGroupOpertionDto + { + IdCategory = idCategory, + Category = category?.Name ?? "unknown", + Count = g.Sum(o => o.Count), + DeltaDepth = g.Sum(o => o.DeltaDepth), + TotalMinutes = g.Sum(o => o.TotalMinutes), + Items = g.ToList(), + IdParent = category?.IdParent, + }; + return newDto; + }); + } + + return dtos; + } + + public async Task InsertRangeAsync(IEnumerable dtos, + bool deleteBeforeInsert, + CancellationToken token) + { + EnsureValidWellOperations(dtos); + + if (!deleteBeforeInsert) + return await InsertRangeAsync(dtos, token); + + var idType = dtos.First().IdType; + var idWell = dtos.First().IdWell; + + var existingOperationIds = await dbContext.WellOperations + .Where(e => e.IdWell == idWell && e.IdType == idType) + .Select(e => e.Id) + .ToArrayAsync(token); + + await DeleteRangeAsync(existingOperationIds, token); + + return await InsertRangeAsync(dtos, token); + } + + public override Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) + { + EnsureValidWellOperations(dtos); + + return base.UpdateRangeAsync(dtos, token); + } + + private static void EnsureValidWellOperations(IEnumerable dtos) + { + if (dtos.GroupBy(d => d.IdType).Count() > 1) + throw new ArgumentInvalidException(nameof(dtos), "Все операции должны быть одного типа"); + + if (dtos.GroupBy(d => d.IdType).Count() > 1) + throw new ArgumentInvalidException(nameof(dtos), "Все операции должны принадлежать одной скважине"); + } + + private IQueryable BuildQuery(WellOperationRequest request) + { + var currentWellOperations = GetQuery() + .Where(e => request.IdsWell != null && request.IdsWell.Contains(e.Id)); + + var query = GetQuery() + .Where(e => request.IdsWell != null && request.IdsWell.Contains(e.Id)) + .Select(o => new WellOperation + { + Id = o.Id, + IdPlan = o.IdPlan, + IdType = o.IdType, + IdWell = o.IdWell, + LastUpdateDate = o.LastUpdateDate, + IdWellSectionType = o.IdWellSectionType, + IdCategory = o.IdCategory, + OperationCategory = o.OperationCategory, + WellSectionType = o.WellSectionType, + DateStart = o.DateStart, + DepthStart = o.DepthStart, + DepthEnd = o.DepthEnd, + DurationHours = o.DurationHours, + CategoryInfo = o.CategoryInfo, + Comment = o.Comment, + IdUser = o.IdUser, + + NptHours = currentWellOperations + .Where(e => e.IdType == 1 && e.IdWell == o.IdWell) + .Where(e => WellOperationCategory.NonProductiveTimeSubIds.Contains(e.IdCategory)) + .Select(e => e.DurationHours) + .Sum(), + + Day = (o.DateStart - currentWellOperations + .Where(subOp => subOp.IdType == o.IdType && subOp.IdWell == o.IdWell) + .Where(subOp => subOp.DateStart <= o.DateStart) + .Min(subOp => subOp.DateStart)) + .TotalDays + }); + + if (request.OperationType.HasValue) + query = query.Where(e => e.IdType == request.OperationType.Value); + + if (request.SectionTypeIds?.Any() is true) + query = query.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); + + if (request.OperationCategoryIds?.Any() is true) + query = query.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); + + if (request.GeDepth.HasValue) + query = query.Where(e => e.DepthEnd >= request.GeDepth.Value); + + if (request.LeDepth.HasValue) + query = query.Where(e => e.DepthEnd <= request.LeDepth.Value); + + if (request.GeDate.HasValue) + { + var geDateUtc = request.GeDate.Value.UtcDateTime; + query = query.Where(e => e.DateStart >= geDateUtc); + } + + if (request.LeDate.HasValue) + { + var leDateUtc = request.LeDate.Value.UtcDateTime; + query = query.Where(e => e.DateStart <= leDateUtc); + } + + if (request.SortFields?.Any() is true) + query = query.SortBy(request.SortFields); + + return query; + } + + public async Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token) + { + const string keyCacheSections = "OperationsBySectionSummarties"; + + var cache = await memoryCache.GetOrCreateAsync(keyCacheSections, async (entry) => + { + entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30); + + var query = dbContext.Set() + .GroupBy(operation => new + { + operation.IdWell, + operation.IdType, + operation.IdWellSectionType, + operation.WellSectionType.Caption, + }) + .Select(group => new + { + group.Key.IdWell, + group.Key.IdType, + group.Key.IdWellSectionType, + group.Key.Caption, + + First = group + .OrderBy(operation => operation.DateStart) + .Select(operation => new + { + operation.DateStart, + operation.DepthStart, + }) + .First(), + + Last = group + .OrderByDescending(operation => operation.DateStart) + .Select(operation => new + { + operation.DateStart, + operation.DurationHours, + operation.DepthEnd, + }) + .First(), + }); + var dbData = await query.ToArrayAsync(token); + var sections = dbData.Select( + item => new SectionByOperationsDto + { + IdWell = item.IdWell, + IdType = item.IdType, + IdWellSectionType = item.IdWellSectionType, + + Caption = item.Caption, + + DateStart = item.First.DateStart, + DepthStart = item.First.DepthStart, + + DateEnd = item.Last.DateStart.AddHours(item.Last.DurationHours), + DepthEnd = item.Last.DepthEnd, + }) + .ToArray() + .AsEnumerable(); + + entry.Value = sections; + return sections; + }); + + var sections = cache.Where(s => idsWells.Contains(s.IdWell)); + return sections; + } + + public async Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken) + { + var query = dbContext.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 = minDate.ToOffset(minDate.Offset), + To = maxDate.ToOffset(minDate.Offset) + }; + } + + protected override WellOperation Convert(WellOperationDto src) + { + var entity = src.Adapt(); + entity.LastUpdateDate = src.LastUpdateDate?.UtcDateTime; + entity.DateStart = src.DateStart.UtcDateTime; + return entity; + } + + protected override WellOperationDto Convert(WellOperation src) + { + //TODO: пока такое получение TimeZone скважины, нужно исправить на Lazy + //Хоть мы и тянем данные из кэша, но от получения TimeZone в этом методе нужно избавиться, пока так + var timeZoneOffset = wellService.GetTimezone(src.IdWell).Offset; + + var dto = src.Adapt(); + dto.DateStart = src.DateStart.ToOffset(timeZoneOffset); + dto.LastUpdateDate = src.LastUpdateDate?.ToOffset(timeZoneOffset); + return dto; + } +} \ No newline at end of file From ec2abd224ebd9c9a7fef4b44a01a660f944e54f9 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 20 Mar 2024 16:29:25 +0500 Subject: [PATCH 07/52] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=B0=D1=82=20=D1=81=20?= =?UTF-8?q?DateTime=20=D0=BD=D0=B0=20DateTimeOffset=20=D0=B2=20Notificatio?= =?UTF-8?q?n=20=D0=B8=20NotificationDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/NotificationDto.cs | 12 ++++++------ AsbCloudApp/Requests/NotificationDeleteRequest.cs | 4 ++-- .../Services/Notifications/NotificationService.cs | 8 ++++---- .../Migrations/AsbCloudDbContextModelSnapshot.cs | 6 +++--- AsbCloudDb/Model/Notification.cs | 6 +++--- AsbCloudInfrastructure/Background/WorkToSendEmail.cs | 2 +- .../Repository/NotificationRepository.cs | 4 ++-- .../EmailNotificationTransportServiceTests.cs | 2 +- .../SignalR/Services/NotificationPublisher.cs | 2 +- 9 files changed, 23 insertions(+), 23 deletions(-) diff --git a/AsbCloudApp/Data/NotificationDto.cs b/AsbCloudApp/Data/NotificationDto.cs index ee42f8d7..0fd8b673 100644 --- a/AsbCloudApp/Data/NotificationDto.cs +++ b/AsbCloudApp/Data/NotificationDto.cs @@ -42,17 +42,17 @@ public class NotificationDto : IId /// Дата регистрации уведомления /// [Required] - public DateTime RegistrationDate { get; set; } + public DateTimeOffset RegistrationDate { get; set; } /// /// Дата отправки уведомления /// - public DateTime? SentDate { get; set; } + public DateTimeOffset? SentDate { get; set; } /// /// Дата прочтения уведомления /// - public DateTime? ReadDate { get; set; } + public DateTimeOffset? ReadDate { get; set; } /// /// Состояние уведомления @@ -82,12 +82,12 @@ public class NotificationDto : IId ReadDate = null; break; case 1: - SentDate = DateTime.UtcNow; + SentDate = DateTimeOffset.UtcNow; ReadDate = null; break; case 2: - SentDate = DateTime.UtcNow; - ReadDate = DateTime.UtcNow; + SentDate = DateTimeOffset.UtcNow; + ReadDate = DateTimeOffset.UtcNow; break; } } diff --git a/AsbCloudApp/Requests/NotificationDeleteRequest.cs b/AsbCloudApp/Requests/NotificationDeleteRequest.cs index ec2026f3..56921d70 100644 --- a/AsbCloudApp/Requests/NotificationDeleteRequest.cs +++ b/AsbCloudApp/Requests/NotificationDeleteRequest.cs @@ -15,10 +15,10 @@ public class NotificationDeleteRequest /// /// Меньше или равно дате отправки /// - public DateTime? LtSentDate { get; set; } + public DateTimeOffset? LtSentDate { get; set; } /// /// Меньше или равно дате прочтения /// - public DateTime? LtReadDate { get; set; } + public DateTimeOffset? LtReadDate { get; set; } } \ No newline at end of file diff --git a/AsbCloudApp/Services/Notifications/NotificationService.cs b/AsbCloudApp/Services/Notifications/NotificationService.cs index d703ffb4..97b8bfb5 100644 --- a/AsbCloudApp/Services/Notifications/NotificationService.cs +++ b/AsbCloudApp/Services/Notifications/NotificationService.cs @@ -49,7 +49,7 @@ public class NotificationService var notification = new NotificationDto { IdUser = request.IdUser, - RegistrationDate = DateTime.UtcNow, + RegistrationDate = DateTimeOffset.UtcNow, IdNotificationCategory = notificationCategory.Id, Title = request.Title, Message = request.Message, @@ -71,7 +71,7 @@ public class NotificationService Console.WriteLine(ex.Message); } - notification.SentDate = DateTime.UtcNow; + notification.SentDate = DateTimeOffset.UtcNow; await notificationRepository.UpdateAsync(notification, cancellationToken); } @@ -92,7 +92,7 @@ public class NotificationService if(isRead && !notification.SentDate.HasValue) throw new ArgumentInvalidException(nameof(isRead), "Уведомление не может быть прочитано"); - notification.ReadDate = isRead ? DateTime.UtcNow : null; + notification.ReadDate = isRead ? DateTimeOffset.UtcNow : null; await notificationRepository.UpdateAsync(notification, cancellationToken); @@ -119,7 +119,7 @@ public class NotificationService var tasks = notifications.Select(notification => { - notification.SentDate = DateTime.UtcNow; + notification.SentDate = DateTimeOffset.UtcNow; return notificationRepository.UpdateAsync(notification, cancellationToken); }); diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 8bd03355..9c6590fb 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -1581,17 +1581,17 @@ namespace AsbCloudDb.Migrations .HasColumnName("message") .HasComment("Сообщение уведомления"); - b.Property("ReadDate") + b.Property("ReadDate") .HasColumnType("timestamp with time zone") .HasColumnName("read_date") .HasComment("Дата прочтения уведомления"); - b.Property("RegistrationDate") + b.Property("RegistrationDate") .HasColumnType("timestamp with time zone") .HasColumnName("registration_date") .HasComment("Дата регистрации уведомления"); - b.Property("SentDate") + b.Property("SentDate") .HasColumnType("timestamp with time zone") .HasColumnName("sent_date") .HasComment("Дата отправки уведомления"); diff --git a/AsbCloudDb/Model/Notification.cs b/AsbCloudDb/Model/Notification.cs index 09f718b1..bed84a2b 100644 --- a/AsbCloudDb/Model/Notification.cs +++ b/AsbCloudDb/Model/Notification.cs @@ -25,13 +25,13 @@ public class Notification : IId public string Message { get; set; } = null!; [Column("registration_date"), Comment("Дата регистрации уведомления")] - public DateTime RegistrationDate { get; set; } + public DateTimeOffset RegistrationDate { get; set; } [Column("sent_date"), Comment("Дата отправки уведомления")] - public DateTime? SentDate { get; set; } + public DateTimeOffset? SentDate { get; set; } [Column("read_date"), Comment("Дата прочтения уведомления")] - public DateTime? ReadDate { get; set; } + public DateTimeOffset? ReadDate { get; set; } [Column("id_transport_type"), Comment("Id типа доставки уведомления")] public int IdTransportType { get; set; } diff --git a/AsbCloudInfrastructure/Background/WorkToSendEmail.cs b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs index 57605438..ef8048e9 100644 --- a/AsbCloudInfrastructure/Background/WorkToSendEmail.cs +++ b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs @@ -27,7 +27,7 @@ namespace AsbCloudInfrastructure.Background await notificationService.SendAsync(notification, token); - notification.SentDate = DateTime.UtcNow; + notification.SentDate = DateTimeOffset.UtcNow; await notificationRepository.UpdateAsync(notification, token); } diff --git a/AsbCloudInfrastructure/Repository/NotificationRepository.cs b/AsbCloudInfrastructure/Repository/NotificationRepository.cs index 6f1e4a98..7e184f02 100644 --- a/AsbCloudInfrastructure/Repository/NotificationRepository.cs +++ b/AsbCloudInfrastructure/Repository/NotificationRepository.cs @@ -110,10 +110,10 @@ public class NotificationRepository : CrudRepositoryBase n.IdNotificationCategory == request.IdCategory.Value); if (request.LtSentDate.HasValue) - query = query.Where(n => n.SentDate <= request.LtSentDate.Value); + query = query.Where(n => n.SentDate <= request.LtSentDate.Value.ToUniversalTime()); if (request.LtReadDate.HasValue) - query = query.Where(n => n.ReadDate <= request.LtReadDate.Value); + query = query.Where(n => n.ReadDate <= request.LtReadDate.Value.ToUniversalTime()); dbContext.Notifications.RemoveRange(query); diff --git a/AsbCloudWebApi.Tests/Services/Notification/EmailNotificationTransportServiceTests.cs b/AsbCloudWebApi.Tests/Services/Notification/EmailNotificationTransportServiceTests.cs index 724f1e7b..5b6bcb1d 100644 --- a/AsbCloudWebApi.Tests/Services/Notification/EmailNotificationTransportServiceTests.cs +++ b/AsbCloudWebApi.Tests/Services/Notification/EmailNotificationTransportServiceTests.cs @@ -26,7 +26,7 @@ namespace AsbCloudWebApi.Tests.Services.Notification IdUser = 1, IdTransportType = 1, IdState = 0, - RegistrationDate = DateTime.Now, + RegistrationDate = DateTimeOffset.Now, IdNotificationCategory = 10000, }; private readonly UserExtendedDto user = new UserExtendedDto() diff --git a/AsbCloudWebApi/SignalR/Services/NotificationPublisher.cs b/AsbCloudWebApi/SignalR/Services/NotificationPublisher.cs index 6799e71d..05c93a29 100644 --- a/AsbCloudWebApi/SignalR/Services/NotificationPublisher.cs +++ b/AsbCloudWebApi/SignalR/Services/NotificationPublisher.cs @@ -35,7 +35,7 @@ public class NotificationPublisher { foreach (var notification in groupedNotifications) { - notification.SentDate = DateTime.UtcNow; + notification.SentDate = DateTimeOffset.UtcNow; } var notifications = groupedNotifications.Select(n => n); From 2ae1cd2e3dbbceef1e264851a421edcf2797f1bf Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 20 Mar 2024 17:34:03 +0500 Subject: [PATCH 08/52] =?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=D1=82=D0=B8=D0=BF=D0=B0=20=D0=B4=D0=B0?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B2=20FileRequest=20=D0=B8=20FileRepository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/FileRequest.cs | 4 ++-- AsbCloudInfrastructure/Repository/FileRepository.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudApp/Requests/FileRequest.cs b/AsbCloudApp/Requests/FileRequest.cs index 7ea84c7e..403c0655 100644 --- a/AsbCloudApp/Requests/FileRequest.cs +++ b/AsbCloudApp/Requests/FileRequest.cs @@ -33,12 +33,12 @@ namespace AsbCloudApp.Requests /// /// Дата начала периода /// - public DateTime? Begin { get; set; } + public DateTimeOffset? Begin { get; set; } /// /// Дата окончания периода /// - public DateTime? End { get; set; } + public DateTimeOffset? End { get; set; } /// /// Признак удаления diff --git a/AsbCloudInfrastructure/Repository/FileRepository.cs b/AsbCloudInfrastructure/Repository/FileRepository.cs index cafc5649..391f5201 100644 --- a/AsbCloudInfrastructure/Repository/FileRepository.cs +++ b/AsbCloudInfrastructure/Repository/FileRepository.cs @@ -53,13 +53,13 @@ namespace AsbCloudInfrastructure.Repository if (request.Begin is not null) { - var beginUtc = request.Begin.Value.ToUtcDateTimeOffset(timezoneOffsetHours); + var beginUtc = request.Begin.Value.ToUniversalTime(); query = query.Where(e => e.UploadDate >= beginUtc); } if (request.End is not null) { - var endUtc = request.End.Value.ToUtcDateTimeOffset(timezoneOffsetHours); + var endUtc = request.End.Value.ToUniversalTime(); query = query.Where(e => e.UploadDate <= endUtc); } From 25138ec3ffbc2527d48e7083108822f47af28ba5 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 21 Mar 2024 10:52:23 +0500 Subject: [PATCH 09/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=B0=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?FileInfoDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/FileInfoDto.cs | 2 +- AsbCloudInfrastructure/Repository/FileRepository.cs | 2 +- .../Services/DrillingProgram/DrillingProgramService.cs | 2 +- AsbCloudInfrastructure/Services/ReportService.cs | 2 +- AsbCloudWebApi.Tests/Services/FileServiceTest.cs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/AsbCloudApp/Data/FileInfoDto.cs b/AsbCloudApp/Data/FileInfoDto.cs index 8e006661..ab44b317 100644 --- a/AsbCloudApp/Data/FileInfoDto.cs +++ b/AsbCloudApp/Data/FileInfoDto.cs @@ -43,7 +43,7 @@ namespace AsbCloudApp.Data /// дата загрузки /// [Required] - public DateTime UploadDate { get; set; } + public DateTimeOffset UploadDate { get; set; } /// /// размер в байтах diff --git a/AsbCloudInfrastructure/Repository/FileRepository.cs b/AsbCloudInfrastructure/Repository/FileRepository.cs index 391f5201..dd6cc8ea 100644 --- a/AsbCloudInfrastructure/Repository/FileRepository.cs +++ b/AsbCloudInfrastructure/Repository/FileRepository.cs @@ -278,7 +278,7 @@ namespace AsbCloudInfrastructure.Repository private static FileInfoDto Convert(FileInfo entity, double timezoneOffset) { var dto = entity.Adapt(); - dto.UploadDate = entity.UploadDate.ToRemoteDateTime(timezoneOffset); + dto.UploadDate = entity.UploadDate.ToOffset(TimeSpan.FromHours(timezoneOffset)); dto.FileMarks = entity.FileMarks.Select(m => { var mark = m.Adapt(); diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index 3e8349ad..644a62cb 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -480,7 +480,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram IdWell = fileEntity.IdWell, Name = fileEntity.Name, Size = fileEntity.Size, - UploadDate = fileEntity.UploadDate.ToRemoteDateTime(timezoneOffset), + UploadDate = fileEntity.UploadDate.ToOffset(TimeSpan.FromHours(timezoneOffset)), }; var marks = fileEntity.FileMarks?.Where(m => !m.IsDeleted); diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index fd7d86a3..e1c75d62 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -106,7 +106,7 @@ public class ReportService : IReportService IdWell = p.File.IdWell, Name = p.File.Name, Size = p.File.Size, - UploadDate = p.File.UploadDate.ToRemoteDateTime(timezoneOffset), + UploadDate = p.File.UploadDate.ToOffset(TimeSpan.FromHours(timezoneOffset)), }, IdWell = p.IdWell, Date = p.File.UploadDate.ToRemoteDateTime(timezoneOffset), diff --git a/AsbCloudWebApi.Tests/Services/FileServiceTest.cs b/AsbCloudWebApi.Tests/Services/FileServiceTest.cs index 311e483f..b1200160 100644 --- a/AsbCloudWebApi.Tests/Services/FileServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/FileServiceTest.cs @@ -39,7 +39,7 @@ public class FileServiceTest IdCategory = idCategory, Name = fileName, Size = 0, - UploadDate = DateTime.Now + UploadDate = DateTimeOffset.Now }; private static FileMarkDto fileMark = new() From 62e30b0e8b49927701ce25d47e39fd9b382b7723 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 21 Mar 2024 10:54:41 +0500 Subject: [PATCH 10/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B0=20=D0=B4=D0=B0=D1=82=D1=8B?= =?UTF-8?q?=20=D0=B2=20DrillTestReportDataDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs | 2 +- .../Services/DrillTestReport/DrillTestReportService.cs | 2 +- AsbCloudInfrastructure/XLExtentions.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs b/AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs index ee63bf9b..b45783e6 100644 --- a/AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs +++ b/AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs @@ -21,6 +21,6 @@ namespace AsbCloudApp.Data.DrillTestReport /// /// Дата отчета /// - public DateTime Date { get; set; } = DateTime.Now; + public DateTimeOffset Date { get; set; } = DateTimeOffset.Now; } } diff --git a/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportService.cs b/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportService.cs index 983d1f7c..897e8724 100644 --- a/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportService.cs +++ b/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportService.cs @@ -49,7 +49,7 @@ namespace AsbCloudInfrastructure.Services.DrillTestReport well.Deposit ?? "-", well.Cluster ?? "-", well.Caption ?? "-"), - Date = DateTime.Now, + Date = DateTimeOffset.Now, }; var fileName = string.Format("Drill_test_{0}.xlsx", dto.TimeStampStart.ToString("dd.mm.yyyy_HH_MM_ss")); diff --git a/AsbCloudInfrastructure/XLExtentions.cs b/AsbCloudInfrastructure/XLExtentions.cs index e9cf11f5..0a784e9a 100644 --- a/AsbCloudInfrastructure/XLExtentions.cs +++ b/AsbCloudInfrastructure/XLExtentions.cs @@ -17,7 +17,7 @@ public static class XLExtentions public static IXLCell SetCellValue(this IXLCell cell, T value, string? format = null) { - if (typeof(T) == typeof(DateTime)) + if (typeof(T) == typeof(DateTime) || typeof(T) == typeof(DateTimeOffset)) { cell.Style.DateFormat.Format = format ?? "DD.MM.YYYY HH:MM:SS"; } From b66ca5a51525076cb08c3e5521082877d478353e Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 21 Mar 2024 11:08:48 +0500 Subject: [PATCH 11/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=B0=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20DrillTestReportInfoDt?= =?UTF-8?q?o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs | 2 +- .../Services/DrillTestReport/DrillTestReportService.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs b/AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs index 39d37a11..a178e6fe 100644 --- a/AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs +++ b/AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs @@ -24,6 +24,6 @@ namespace AsbCloudApp.Data.DrillTestReport /// Дата и время /// [Required] - public DateTime DateTime { get; set; } + public DateTimeOffset DateTime { get; set; } } } diff --git a/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportService.cs b/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportService.cs index 897e8724..ff29ed0f 100644 --- a/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportService.cs +++ b/AsbCloudInfrastructure/Services/DrillTestReport/DrillTestReportService.cs @@ -78,15 +78,15 @@ namespace AsbCloudInfrastructure.Services.DrillTestReport var dtos = await drillTestRepository.GetAllAsync(telemetry.Id, request, cancellationToken); foreach (var dto in dtos) { - var remoteDateTime = dto.TimeStampStart.ToRemoteDateTime(timezone.Hours); + var remoteDateTime = dto.TimeStampStart.ToOffset(TimeSpan.FromHours(timezone.Hours)); reports.Add(new DrillTestReportInfoDto { - FileName = string.Format("Drill_test_{0}", dto.TimeStampStart.DateTime), + FileName = string.Format("Drill_test_{0}", remoteDateTime), DrillDepth = (dto.Params .Where(p => p.DepthDrillStep.HasValue) .Sum(x => x.DepthDrillStep) ?? 0) + dto.DepthStart, - DateTime = dto.TimeStampStart.DateTime, + DateTime = remoteDateTime, Id = dto.Id, }); } From 593183ec87fd9e782d338f402db09de47c3453cf Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 21 Mar 2024 11:33:43 +0500 Subject: [PATCH 12/52] =?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=D1=82=D0=B8=D0=BF=D0=B0=20=D0=B4=D0=B0?= =?UTF-8?q?=D1=82=20=D0=B4=D0=BB=D1=8F=20FileMarkDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/FileMarkDto.cs | 2 +- AsbCloudInfrastructure/Repository/FileRepository.cs | 2 +- .../Services/DrillingProgram/DrillingProgramService.cs | 2 +- .../Services/DrillingProgram/TitleListSheet.cs | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/AsbCloudApp/Data/FileMarkDto.cs b/AsbCloudApp/Data/FileMarkDto.cs index 7329821b..305fad5c 100644 --- a/AsbCloudApp/Data/FileMarkDto.cs +++ b/AsbCloudApp/Data/FileMarkDto.cs @@ -33,7 +33,7 @@ namespace AsbCloudApp.Data /// . /// [Required] - public DateTime DateCreated { get; set; } + public DateTimeOffset DateCreated { get; set; } /// /// diff --git a/AsbCloudInfrastructure/Repository/FileRepository.cs b/AsbCloudInfrastructure/Repository/FileRepository.cs index dd6cc8ea..c4560116 100644 --- a/AsbCloudInfrastructure/Repository/FileRepository.cs +++ b/AsbCloudInfrastructure/Repository/FileRepository.cs @@ -282,7 +282,7 @@ namespace AsbCloudInfrastructure.Repository dto.FileMarks = entity.FileMarks.Select(m => { var mark = m.Adapt(); - mark.DateCreated = m.DateCreated.ToRemoteDateTime(timezoneOffset); + mark.DateCreated = m.DateCreated.ToOffset(TimeSpan.FromHours(timezoneOffset)); return mark; }); return dto; diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index 644a62cb..18e6acf2 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -489,7 +489,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram part.File.FileMarks = marks.Select(m => { var mark = m.Adapt(); - mark.DateCreated = m.DateCreated.ToRemoteDateTime(timezoneOffset); + mark.DateCreated = m.DateCreated.ToOffset(TimeSpan.FromHours(timezoneOffset)); return mark; }); var hasReject = marks.Any(m => m.IdMarkType == idMarkTypeReject); diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/TitleListSheet.cs b/AsbCloudInfrastructure/Services/DrillingProgram/TitleListSheet.cs index 3d6482a7..7c9355d8 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/TitleListSheet.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/TitleListSheet.cs @@ -11,7 +11,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram { private const string directionDirectorPositionName = "Руководитель направления по ТСБ"; - private readonly DateTime totalDate; + private readonly DateTimeOffset totalDate; private readonly FileMarkDto? acceptDirectionDirector; private readonly List acceptsOthers; private readonly WellDto well; @@ -157,7 +157,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram .Alignment.SetHorizontal(XLAlignmentHorizontalValues.Left); } - private static string FormatDate(DateTime dateTime) + private static string FormatDate(DateTimeOffset dateTime) => $"{dateTime.Day:00}.{dateTime.Month:00}.{dateTime.Year:00}"; } From ef9466f90d925a692fd13791079cc6c698297ead Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 21 Mar 2024 11:42:07 +0500 Subject: [PATCH 13/52] =?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=B4=D0=B0=D1=82=D1=8B=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20MeasureDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/MeasureDto.cs | 2 +- AsbCloudInfrastructure/Services/MeasureService.cs | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/AsbCloudApp/Data/MeasureDto.cs b/AsbCloudApp/Data/MeasureDto.cs index 9f823a91..4eddd78f 100644 --- a/AsbCloudApp/Data/MeasureDto.cs +++ b/AsbCloudApp/Data/MeasureDto.cs @@ -36,7 +36,7 @@ namespace AsbCloudApp.Data /// отметка времени замера /// [Required] - public DateTime Timestamp { get; set; } + public DateTimeOffset Timestamp { get; set; } /// /// данные замера diff --git a/AsbCloudInfrastructure/Services/MeasureService.cs b/AsbCloudInfrastructure/Services/MeasureService.cs index 58c5c295..7a349450 100644 --- a/AsbCloudInfrastructure/Services/MeasureService.cs +++ b/AsbCloudInfrastructure/Services/MeasureService.cs @@ -87,8 +87,7 @@ namespace AsbCloudInfrastructure.Services throw new ArgumentInvalidException(nameof(dto), "wrong idCategory"); if (!dto.Data.Any()) throw new ArgumentInvalidException(nameof(dto), "data.data is not optional"); - var timezone = wellService.GetTimezone(idWell); - var entity = Convert(dto, timezone.Hours); + var entity = Convert(dto); entity.IdWell = idWell; db.Measures.Add(entity); return db.SaveChangesAsync(token); @@ -110,7 +109,7 @@ namespace AsbCloudInfrastructure.Services var timezone = wellService.GetTimezone(idWell); entity.IdWell = idWell; - entity.Timestamp = dto.Timestamp.ToUtcDateTimeOffset(timezone.Hours); + entity.Timestamp = dto.Timestamp.ToOffset(TimeSpan.FromHours(timezone.Hours)); entity.Data = dto.Data.Adapt(); return await db.SaveChangesAsync(token).ConfigureAwait(false); @@ -142,13 +141,13 @@ namespace AsbCloudInfrastructure.Services { var dto = entity.Adapt(); dto.CategoryName = entity.Category?.Name ?? String.Empty; - dto.Timestamp = entity.Timestamp.ToRemoteDateTime(hours); + dto.Timestamp = entity.Timestamp.ToOffset(TimeSpan.FromHours(hours)); return dto; } - private Measure Convert(MeasureDto dto, double hours) + private Measure Convert(MeasureDto dto) { var entity = dto.Adapt(); - entity.Timestamp = dto.Timestamp.ToUtcDateTimeOffset(hours); + entity.Timestamp = dto.Timestamp.ToUniversalTime(); return entity; } } From 0bbbb438020c583a079674660a84bc27289efcdc Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 21 Mar 2024 13:58:28 +0500 Subject: [PATCH 14/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=B0=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?MessageRequestBase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/MessageRequest.cs | 4 ++-- AsbCloudInfrastructure/Services/SAUB/MessageService.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudApp/Requests/MessageRequest.cs b/AsbCloudApp/Requests/MessageRequest.cs index 1bfba1a2..a474c7b9 100644 --- a/AsbCloudApp/Requests/MessageRequest.cs +++ b/AsbCloudApp/Requests/MessageRequest.cs @@ -17,12 +17,12 @@ namespace AsbCloudApp.Requests /// /// начальная дата /// - public DateTime? Begin { get; set; } + public DateTimeOffset? Begin { get; set; } /// /// конечная дата /// - public DateTime? End { get; set; } + public DateTimeOffset? End { get; set; } /// /// строка поиска diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index 350829e1..a4d1f841 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -72,13 +72,13 @@ namespace AsbCloudInfrastructure.Services.SAUB if (request.Begin is not null) { - var beginUtc = request.Begin.Value.ToUtcDateTimeOffset(timezone.Hours); + var beginUtc = request.Begin.Value.ToUniversalTime(); query = query.Where(m => m.DateTime >= beginUtc); } if (request.End is not null) { - var endUtc = request.End.Value.ToUtcDateTimeOffset(timezone.Hours); + var endUtc = request.End.Value.ToUniversalTime(); query = query.Where(m => m.DateTime <= endUtc); } From 820e383e5b6aa6cf779657e4d8d925160353eee5 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 21 Mar 2024 17:16:16 +0500 Subject: [PATCH 15/52] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=D0=B0=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20ReportParametersRequest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/ReportParametersRequest.cs | 6 +++--- AsbCloudApp/Services/IReportService.cs | 2 +- AsbCloudInfrastructure/Services/ReportService.cs | 14 +++++++------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/AsbCloudApp/Requests/ReportParametersRequest.cs b/AsbCloudApp/Requests/ReportParametersRequest.cs index 57b83e4d..74bc358a 100644 --- a/AsbCloudApp/Requests/ReportParametersRequest.cs +++ b/AsbCloudApp/Requests/ReportParametersRequest.cs @@ -24,12 +24,12 @@ public class ReportParametersRequest: IValidatableObject /// /// Дата начала интервала /// - public DateTime Begin { get; set; } = default; + public DateTimeOffset Begin { get; set; } = default; /// /// Дата окончания интервала /// - public DateTime End { get; set; } = default; + public DateTimeOffset End { get; set; } = default; /// public IEnumerable Validate(ValidationContext validationContext) @@ -37,7 +37,7 @@ public class ReportParametersRequest: IValidatableObject if (End < Begin) yield return new("End mast be less then begin"); - if (Begin < new DateTime(2000, 1, 1)) + if (Begin < new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero)) yield return new("Begin mast be > 2000-1-1"); } } \ No newline at end of file diff --git a/AsbCloudApp/Services/IReportService.cs b/AsbCloudApp/Services/IReportService.cs index 5f992a20..4b259240 100644 --- a/AsbCloudApp/Services/IReportService.cs +++ b/AsbCloudApp/Services/IReportService.cs @@ -46,7 +46,7 @@ namespace AsbCloudApp.Services /// /// /// - int GetReportPagesCount(int idWell, DateTime begin, DateTime end, + int GetReportPagesCount(int idWell, DateTimeOffset begin, DateTimeOffset end, int stepSeconds, int format); /// diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index e1c75d62..04d7c63b 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -64,11 +64,11 @@ public class ReportService : IReportService return work.Id; } - public int GetReportPagesCount(int idWell, DateTime begin, DateTime end, int stepSeconds, int format) + public int GetReportPagesCount(int idWell, DateTimeOffset begin, DateTimeOffset end, int stepSeconds, int format) { var timezoneOffset = wellService.GetTimezone(idWell).Hours; - var beginRemote = begin.ToTimeZoneOffsetHours(timezoneOffset); - var endRemote = end.ToTimeZoneOffsetHours(timezoneOffset); + var beginRemote = begin.DateTime.ToTimeZoneOffsetHours(timezoneOffset); + var endRemote = end.DateTime.ToTimeZoneOffsetHours(timezoneOffset); var generator = GetReportGenerator(idWell, beginRemote, endRemote, stepSeconds, format, db); var pagesCount = generator.GetPagesCount(); @@ -127,10 +127,10 @@ public class ReportService : IReportService CancellationToken token) { 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 beginRemote = request.Begin.DateTime; + var endRemote = request.End.DateTime; + var beginUtc = request.Begin.ToUniversalTime(); + var endUtc = request.End.ToUniversalTime(); var tempDir = Path.Combine(Path.GetTempPath(), "report"); From 151e481a982f68f54cef6af299006c45a5795515 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 Mar 2024 07:29:01 +0300 Subject: [PATCH 16/52] =?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=20DTO=20=D0=93=D0=93=D0=94.=20?= =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/WellOperation/WellOperationDto.cs | 3 +- .../Repository/WellOperationRepository.cs | 6 +-- .../DailyReport/DailyReportService.cs | 23 +++++------ .../DetectedOperationExportService.cs | 1 + .../DetectedOperationService.cs | 1 + .../Services/SAUB/TelemetryDataBaseService.cs | 2 +- .../Services/WellCompositeOperationService.cs | 19 ++++----- .../OperationsStatService.cs | 5 ++- .../Services/WellService.cs | 9 +++-- .../Services/DailyReportServiceTest.cs | 5 ++- .../WellCompositeOperationServiceTest.cs | 39 ++++++++++--------- .../Controllers/OperationStatController.cs | 1 + .../SAUB/DetectedOperationController.cs | 4 +- .../WellCompositeOperationController.cs | 3 +- 14 files changed, 66 insertions(+), 55 deletions(-) diff --git a/AsbCloudApp/Data/WellOperation/WellOperationDto.cs b/AsbCloudApp/Data/WellOperation/WellOperationDto.cs index 2d8b8c87..17015451 100644 --- a/AsbCloudApp/Data/WellOperation/WellOperationDto.cs +++ b/AsbCloudApp/Data/WellOperation/WellOperationDto.cs @@ -6,7 +6,8 @@ namespace AsbCloudApp.Data.WellOperation; public class WellOperationDto : ItemInfoDto, IId, - IWellRelated + IWellRelated, + IValidatableObject { /// [Required] diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 702ca982..7532b2aa 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -176,10 +176,10 @@ public class WellOperationRepository : CrudRepositoryBase BuildQuery(WellOperationRequest request) { var currentWellOperations = GetQuery() - .Where(e => request.IdsWell != null && request.IdsWell.Contains(e.Id)); + .Where(e => request.IdsWell != null && request.IdsWell.Contains(e.IdWell)); var query = GetQuery() - .Where(e => request.IdsWell != null && request.IdsWell.Contains(e.Id)) + .Where(e => request.IdsWell != null && request.IdsWell.Contains(e.IdWell)) .Select(o => new WellOperation { Id = o.Id, diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index 43fb0abf..fface665 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -13,6 +13,7 @@ using AsbCloudApp.Data.DailyReport.Blocks.Sign; using AsbCloudApp.Data.DailyReport.Blocks.Subsystems; using AsbCloudApp.Data.DailyReport.Blocks.TimeBalance; using AsbCloudApp.Data.DailyReport.Blocks.WellOperation; +using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Requests; using AsbCloudApp.Services.DailyReport; using AsbCloudApp.Services.ProcessMaps.WellDrilling; @@ -107,14 +108,14 @@ public class DailyReportService : IDailyReportService }; var geDate = dailyReport.Date.ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); - var ltDate = dailyReport.Date.AddDays(1).ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + var leDate = dailyReport.Date.AddDays(1).ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); var factOperationRequest = new WellOperationRequest { - IdWell = idWell, + IdsWell = new []{ idWell }, OperationType = WellOperation.IdOperationTypeFact, GeDate = geDate, - LtDate = ltDate + LeDate = leDate }; var factWellOperations = (await wellOperationRepository.GetAsync(factOperationRequest, cancellationToken)) @@ -184,14 +185,14 @@ public class DailyReportService : IDailyReportService var existingDailyReports = await dailyReportRepository.GetAsync(idWell, request, cancellationToken); var geDateFactWellOperation = datesRange.From.AddDays(result.Skip); - var ltDateFactWellOperation = geDateFactWellOperation.AddDays(result.Take); + var leDateFactWellOperation = geDateFactWellOperation.AddDays(result.Take); var factWellOperationRequest = new WellOperationRequest { - IdWell = idWell, + IdsWell = new[] { idWell }, OperationType = WellOperation.IdOperationTypeFact, GeDate = geDateFactWellOperation, - LtDate = ltDateFactWellOperation + LeDate = leDateFactWellOperation }; var factWellOperations = await wellOperationRepository.GetAsync(factWellOperationRequest, cancellationToken); @@ -200,7 +201,7 @@ public class DailyReportService : IDailyReportService { for (var day = result.Skip; day - result.Skip < result.Take && datesRange.To.AddDays(-day) >= datesRange.From; day++) { - var dateDailyReport = DateOnly.FromDateTime(datesRange.To.AddDays(-day)); + var dateDailyReport = DateOnly.FromDateTime(datesRange.To.AddDays(-day).DateTime); AddDailyReport(dateDailyReport); } @@ -209,7 +210,7 @@ public class DailyReportService : IDailyReportService { for (var day = result.Skip; day - result.Skip < result.Take && datesRange.From.AddDays(day) <= datesRange.To; day++) { - var dateDailyReport = DateOnly.FromDateTime(datesRange.From.AddDays(day)); + var dateDailyReport = DateOnly.FromDateTime(datesRange.From.AddDays(day).DateTime); AddDailyReport(dateDailyReport); } @@ -401,7 +402,7 @@ public class DailyReportService : IDailyReportService WellOperations = factWellOperations.GroupBy(o => o.IdCategory) .Select(g => new WellOperationRecordDto { - CategoryName = g.First().CategoryName, + CategoryName = g.First().OperationCategoryName, DurationHours = g.Sum(o => o.DurationHours) }), @@ -418,8 +419,8 @@ public class DailyReportService : IDailyReportService if (datesRange is null) return false; - var from = DateOnly.FromDateTime(datesRange.From); - var to = DateOnly.FromDateTime(datesRange.To); + var from = DateOnly.FromDateTime(datesRange.From.DateTime); + var to = DateOnly.FromDateTime(datesRange.To.DateTime); return dateDailyReport >= from && dateDailyReport <= to; } diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs index fd33c32a..6ed731f6 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs @@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Http.Extensions; using AsbCloudApp.Exceptions; using AsbCloudApp.Services; using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; using AsbCloudInfrastructure.Services.DetectOperations.Detectors; namespace AsbCloudInfrastructure.Services.DetectOperations; diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index b53b1cd0..9059d6bb 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; using AsbCloudInfrastructure.Services.DetectOperations.Detectors; namespace AsbCloudInfrastructure.Services.DetectOperations; diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs index f9cc64ee..a491b483 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs @@ -102,7 +102,7 @@ namespace AsbCloudInfrastructure.Services.SAUB if (dateBegin == default) { var dateRange = telemetryDataCache.GetOrDefaultDataDateRange(telemetry.Id); - dateBeginUtc = (dateRange?.To.ToUtcDateTimeOffset(timezone.Hours) ?? DateTime.UtcNow) + dateBeginUtc = (dateRange?.To.UtcDateTime ?? DateTime.UtcNow) .AddSeconds(-intervalSec); } else diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs index 6ba97ea0..4334e8be 100644 --- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudInfrastructure.Services { @@ -133,7 +134,7 @@ namespace AsbCloudInfrastructure.Services this.wellOperationRepository = wellOperationRepository; } - public async Task>> GetAsync(IEnumerable idsWells, CancellationToken token) + public async Task>> GetAsync(IEnumerable idsWells, CancellationToken token) { var sections = await wellSectionTypeRepository.GetAllAsync(token); var sectionsDict = sections.ToDictionary(s => s.Id, s => s.Caption); @@ -144,7 +145,7 @@ namespace AsbCloudInfrastructure.Services var idsWellSectionTypes = WellSectionTypesWithCategories.Select(t => t.IdSectionType).Distinct(); var usedCategories = WellSectionTypesWithCategories.Select(c => c.IdCategory).Distinct(); - var wellOperationRequest = new WellsOperationRequest() + var wellOperationRequest = new WellOperationRequest { IdsWell = idsWells, OperationCategoryIds = usedCategories, @@ -155,7 +156,7 @@ namespace AsbCloudInfrastructure.Services var renamedOperations = operations.Select(o => UpdateIdWellSectionAndIdCategory(o, sectionsDict, categoriesDict)); - var wellOperationsWithComposite = new List>(); + var wellOperationsWithComposite = new List>(); var compositeDepth = 0d; foreach ((int IdSection, int IdCategory) in WellSectionTypesWithCategories) { @@ -168,7 +169,7 @@ namespace AsbCloudInfrastructure.Services var groupedByWell = filteredByTemplate.GroupBy(o => o.IdWell); - var aggreagtedByWell = groupedByWell.Select(g => new WellOperationDataDto + var aggreagtedByWell = groupedByWell.Select(g => new WellOperationDto { IdCategory = IdCategory, IdWell = g.Key, @@ -197,15 +198,15 @@ namespace AsbCloudInfrastructure.Services return wellOperationsWithComposite; } - private static WellOperationDataDto UpdateIdWellSectionAndIdCategory( - WellOperationDataDto dto, - Dictionary sectionTypes, - Dictionary operationCategories) + private static WellOperationDto UpdateIdWellSectionAndIdCategory( + WellOperationDto dto, + IDictionary sectionTypes, + IDictionary operationCategories) { if (dto.IdWellSectionType == wellSectionTransportTable) { dto.IdWellSectionType = wellSectionProductionString; - dto.WellSectionTypeCaption = sectionTypes[dto.IdWellSectionType] ?? string.Empty; + dto.WellSectionTypeCaption = sectionTypes[dto.IdWellSectionType]; } if ((SettingsForSectionCategoryChange.TryGetValue((dto.IdWellSectionType, dto.IdCategory), out int newIdCategory))) diff --git a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs index c9018051..e5d46b27 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs @@ -10,6 +10,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Repositories; namespace AsbCloudInfrastructure.Services.WellOperationService; @@ -552,8 +553,8 @@ public class OperationsStatService : IOperationsStatService private static WellOperationDto Convert(WellOperation source, double tzOffsetHours) { var destination = source.Adapt(); - destination.CategoryName = source.OperationCategory?.Name; - destination.WellSectionTypeName = source.WellSectionType?.Caption; + destination.OperationCategoryName = source.OperationCategory.Name; + destination.WellSectionTypeCaption = source.WellSectionType.Caption; destination.DateStart = source.DateStart.ToRemoteDateTime(tzOffsetHours); return destination; } diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 4d6ec10a..1b306f15 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -47,7 +47,7 @@ namespace AsbCloudInfrastructure.Services this.telemetryService = telemetryService; this.timezoneService = timezoneService; this.wellInfoService = wellInfoService; - this.wellOperationRepository = new WellOperationRepository(db, memoryCache, this, wellOperationCategoryRepository); + wellOperationRepository = new WellOperationRepository(db, memoryCache, wellOperationCategoryRepository, this); companyTypesService = new CrudCacheRepositoryBase(dbContext, memoryCache); } @@ -71,7 +71,7 @@ namespace AsbCloudInfrastructure.Services return DateTime.MinValue; var datesRange = telemetryService.GetDatesRange(well.IdTelemetry.Value); - return datesRange.To; + return datesRange.To.DateTime; } /// @@ -273,12 +273,13 @@ namespace AsbCloudInfrastructure.Services if (entity.Timezone is null) dto.Timezone = GetTimezone(entity.Id); - dto.StartDate = wellOperationRepository.FirstOperationDate(entity.Id)?.ToRemoteDateTime(dto.Timezone.Hours); + //TODO: фикс + //dto.StartDate = wellOperationRepository.GetDatesRangeAsync(entity.Id, ).FirstOperationDate(entity.Id)?.ToRemoteDateTime(dto.Timezone.Hours); dto.WellType = entity.WellType.Caption; dto.Cluster = entity.Cluster.Caption; dto.Deposit = entity.Cluster.Deposit.Caption; if (entity.IdTelemetry is not null) - dto.LastTelemetryDate = telemetryService.GetDatesRange(entity.IdTelemetry.Value).To; + dto.LastTelemetryDate = telemetryService.GetDatesRange(entity.IdTelemetry.Value).To.DateTime; dto.Companies = entity.RelationCompaniesWells .Select(r => Convert(r.Company)) .ToList(); diff --git a/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs b/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs index 58f23ccc..d7af2c1c 100644 --- a/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs @@ -19,6 +19,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; using Xunit; namespace AsbCloudWebApi.Tests.Services; @@ -154,7 +155,7 @@ public class DailyReportServiceTest IdWell = idWell, IdParentCategory = 4001, IdWellSectionType = 1, - CategoryName = "Механическое. бурение", + OperationCategoryName = "Механическое. бурение", DateStart = new DateTime(2023, 10, 26), DepthStart = 80, DepthEnd = 150, @@ -164,7 +165,7 @@ public class DailyReportServiceTest private readonly WellOperationDto fakeLastFactWellOperation = new() { IdWell = idWell, - CategoryName = "Механическое. бурение", + OperationCategoryName = "Механическое. бурение", IdWellSectionType = 1, IdParentCategory = 4001, DateStart = new DateTime(2023, 10, 26), diff --git a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs index d4659d8a..4018417c 100644 --- a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs @@ -15,6 +15,7 @@ using System.Threading.Tasks; using Xunit; using AsbCloudApp.Repositories; using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Services; namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation @@ -50,9 +51,9 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation new() {Id = 31, Caption = "Техническая колонна", Order = 2} }; - private readonly static IEnumerable wellOperations1 = new List() + private readonly static IEnumerable wellOperations1 = new List() { - new WellOperationDataDto() + new() { DepthStart = 50, DurationHours = 1, @@ -62,7 +63,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation OperationCategoryName = "Шаблонирование перед спуском", WellSectionTypeCaption = "Направление" }, - new WellOperationDataDto() + new() { DepthStart = 84, DurationHours = 1, @@ -74,9 +75,9 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation } }; - private readonly static IEnumerable wellOperations2 = new List() + private readonly static IEnumerable wellOperations2 = new List() { - new WellOperationDataDto() + new() { DepthStart = 10, DurationHours = 1.5, @@ -86,7 +87,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation OperationCategoryName = "Бурение ротором", WellSectionTypeCaption = "Направление" }, - new WellOperationDataDto() + new() { DepthStart = 20, DurationHours = 3.5, @@ -98,9 +99,9 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation } }; - private readonly static IEnumerable wellOperations3 = new List() + private readonly static IEnumerable wellOperations3 = new List() { - new WellOperationDataDto() + new() { DepthStart = 1372, DurationHours = 3, @@ -110,7 +111,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation OperationCategoryName = "Промывка", WellSectionTypeCaption = "Кондуктор" }, - new WellOperationDataDto() + new() { DepthStart = 1435, DurationHours = 4, @@ -122,9 +123,9 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation } }; - private readonly static IEnumerable wellOperations4 = new List() + private readonly static IEnumerable wellOperations4 = new List() { - new WellOperationDataDto() + new() { DepthStart = 1000, DurationHours = 10, @@ -134,7 +135,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation OperationCategoryName = "Подъем инструмента", WellSectionTypeCaption = "Техническая колонна" }, - new WellOperationDataDto() + new() { DepthStart = 500, DurationHours = 5, @@ -144,7 +145,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation OperationCategoryName = "Проработка принудительная", WellSectionTypeCaption = "Техническая колонна" }, - new WellOperationDataDto() + new() { DepthStart = 600, DurationHours = 5, @@ -181,7 +182,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation public async Task GetAsync_return_composite_and_others_with_category_5013() { // arrange - wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) + wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .Returns(wellOperations1); var idsWell = new List() { 55, 64 }; @@ -216,7 +217,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation public async Task GetAsync_return_composite_with_minimum_depth_start() { // arrange - wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) + wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .Returns(wellOperations2); var idsWell = new List() { 55, 64 }; @@ -242,7 +243,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation public async Task GetAsync_return_data3() { // arrange - wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) + wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .Returns(wellOperations3); var idsWell = new List() { 55, 64 }; @@ -272,7 +273,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation public async Task GetAsync_return_data4() { // arrange - wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) + wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .Returns(wellOperations4); var idsWell = new List() { 55, 64 }; @@ -312,13 +313,13 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation public async Task GetAsync_return_data5() { // arrange - var wellOperations = new List(); + var wellOperations = new List(); wellOperations.AddRange(wellOperations1); wellOperations.AddRange(wellOperations2); wellOperations.AddRange(wellOperations3); wellOperations.AddRange(wellOperations4); - wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) + wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .Returns(wellOperations); var idsWell = new List() { 55, 64 }; diff --git a/AsbCloudWebApi/Controllers/OperationStatController.cs b/AsbCloudWebApi/Controllers/OperationStatController.cs index d4346255..7126c5f5 100644 --- a/AsbCloudWebApi/Controllers/OperationStatController.cs +++ b/AsbCloudWebApi/Controllers/OperationStatController.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudWebApi.Controllers { diff --git a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs index c6bd6dda..9b478a2d 100644 --- a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs @@ -1,5 +1,4 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Data.DetectedOperation; +using AsbCloudApp.Data.DetectedOperation; using AsbCloudApp.Requests; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; @@ -7,6 +6,7 @@ using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; using AsbCloudInfrastructure.Services.DetectOperations; using Microsoft.AspNetCore.Http; diff --git a/AsbCloudWebApi/Controllers/WellCompositeOperationController.cs b/AsbCloudWebApi/Controllers/WellCompositeOperationController.cs index d662e4e8..ab4555c0 100644 --- a/AsbCloudWebApi/Controllers/WellCompositeOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellCompositeOperationController.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudWebApi.Controllers { @@ -24,7 +25,7 @@ namespace AsbCloudWebApi.Controllers } [HttpGet] - [ProducesResponseType(typeof(IList>), (int)System.Net.HttpStatusCode.OK)] + [ProducesResponseType(typeof(IList>), (int)System.Net.HttpStatusCode.OK)] public async Task GetAsync([FromQuery] IEnumerable idsWells, CancellationToken token) { foreach (var idWell in idsWells) From 1ccfa84e4530bed4222f1bd3f3b9310d28bab777 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 Mar 2024 07:37:06 +0300 Subject: [PATCH 17/52] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D1=82=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=B8=D0=BD=D1=84=D1=80=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=8B=20=D1=8D?= =?UTF-8?q?=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0/=D0=B8=D0=BC=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/{ => Export}/IExportService.cs | 12 +- .../Services/Export/IExportServiceFactory.cs | 20 +++ .../Services/Parsers/IParserFactory.cs | 23 +++ .../Services/{ => Parsers}/IParserService.cs | 11 +- .../ExcelServices/ExcelExportService.cs | 76 ++++++++++ .../Services/ExcelServices/ExcelParser.cs | 134 ++++++++++++++++++ .../ExcelServices/ExcelWellRelatedParser.cs | 23 +++ .../ExcelServices/ExportExcelService.cs | 3 +- .../ExcelServices/ParserExcelService.cs | 3 +- .../Report/ProcessMapReportDrillingService.cs | 3 +- .../ScheduleReportService.cs | 5 +- AsbCloudInfrastructure/XLExtentions.cs | 10 +- ...ProcessMapReportDataSaubStatServiceTest.cs | 1 + .../ProcessMapPlanBaseController.cs | 2 + .../TrajectoryEditableController.cs | 1 + 15 files changed, 316 insertions(+), 11 deletions(-) rename AsbCloudApp/Services/{ => Export}/IExportService.cs (70%) create mode 100644 AsbCloudApp/Services/Export/IExportServiceFactory.cs create mode 100644 AsbCloudApp/Services/Parsers/IParserFactory.cs rename AsbCloudApp/Services/{ => Parsers}/IParserService.cs (76%) create mode 100644 AsbCloudInfrastructure/Services/ExcelServices/ExcelExportService.cs create mode 100644 AsbCloudInfrastructure/Services/ExcelServices/ExcelParser.cs create mode 100644 AsbCloudInfrastructure/Services/ExcelServices/ExcelWellRelatedParser.cs diff --git a/AsbCloudApp/Services/IExportService.cs b/AsbCloudApp/Services/Export/IExportService.cs similarity index 70% rename from AsbCloudApp/Services/IExportService.cs rename to AsbCloudApp/Services/Export/IExportService.cs index b921fec5..ddfd50f9 100644 --- a/AsbCloudApp/Services/IExportService.cs +++ b/AsbCloudApp/Services/Export/IExportService.cs @@ -3,12 +3,12 @@ using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Requests.ExportOptions; -namespace AsbCloudApp.Services; +namespace AsbCloudApp.Services.Export; /// /// Экспорт данных /// -public interface IExportService +public interface IExportService : IExportService where TOptions : IExportOptionsRequest { /// @@ -18,4 +18,12 @@ public interface IExportService /// /// Task<(string FileName, Stream File)> ExportAsync(TOptions options, CancellationToken token); +} + +/// +/// Экспорт данных +/// +public interface IExportService +{ + } \ No newline at end of file diff --git a/AsbCloudApp/Services/Export/IExportServiceFactory.cs b/AsbCloudApp/Services/Export/IExportServiceFactory.cs new file mode 100644 index 00000000..fb6b5fc9 --- /dev/null +++ b/AsbCloudApp/Services/Export/IExportServiceFactory.cs @@ -0,0 +1,20 @@ +using AsbCloudApp.Requests.ExportOptions; + +namespace AsbCloudApp.Services.Export; + +/// +/// Фабрика создания сервисов для экспорта +/// +/// +public interface IExportServiceFactory + where TId : struct +{ + /// + /// Создать сервис экспорта + /// + /// + /// + /// + IExportService CreateExportService(TId id) + where TOptions : IExportOptionsRequest; +} \ No newline at end of file diff --git a/AsbCloudApp/Services/Parsers/IParserFactory.cs b/AsbCloudApp/Services/Parsers/IParserFactory.cs new file mode 100644 index 00000000..e0fc1aa2 --- /dev/null +++ b/AsbCloudApp/Services/Parsers/IParserFactory.cs @@ -0,0 +1,23 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Requests.ParserOptions; + +namespace AsbCloudApp.Services.Parsers; + +/// +/// Фабрика для создания сервиса парсинга +/// +/// +/// +public interface IParserFactory + where TId : struct + where TDto : class, IId +{ + /// + /// Создать парсер + /// + /// + /// + /// + IParserService CreateParser(TId id) + where TOptions : IParserOptionsRequest; +} \ No newline at end of file diff --git a/AsbCloudApp/Services/IParserService.cs b/AsbCloudApp/Services/Parsers/IParserService.cs similarity index 76% rename from AsbCloudApp/Services/IParserService.cs rename to AsbCloudApp/Services/Parsers/IParserService.cs index 89212ba7..672c9e2b 100644 --- a/AsbCloudApp/Services/IParserService.cs +++ b/AsbCloudApp/Services/Parsers/IParserService.cs @@ -2,14 +2,14 @@ using System.IO; using AsbCloudApp.Data; using AsbCloudApp.Requests.ParserOptions; -namespace AsbCloudApp.Services; +namespace AsbCloudApp.Services.Parsers; /// /// Сервис парсинга /// /// /// -public interface IParserService +public interface IParserService : IParserService where TDto : class, IId where TOptions : IParserOptionsRequest { @@ -26,4 +26,11 @@ public interface IParserService /// /// Stream GetTemplateFile(); +} + +/// +/// Сервис парсинга +/// +public interface IParserService +{ } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ExcelServices/ExcelExportService.cs b/AsbCloudInfrastructure/Services/ExcelServices/ExcelExportService.cs new file mode 100644 index 00000000..74e2d5fb --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/ExcelExportService.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Requests.ExportOptions; +using AsbCloudApp.Services.Export; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using ClosedXML.Excel; +using Mapster; + +namespace AsbCloudInfrastructure.Services.ExcelServices; + +public abstract class ExcelExportService : IExportService + where TOptions : IExportOptionsRequest + where TTemplate : class, ITemplateParameters, new() +{ + protected TTemplate TemplateParameters => new(); + + protected abstract Task BuildFileNameAsync(TOptions options, CancellationToken token); + + protected abstract Task> GetDtosAsync(TOptions options, CancellationToken token); + + public async Task<(string FileName, Stream File)> ExportAsync(TOptions options, CancellationToken token) + { + var dtos = await GetDtosAsync(options, token); + + var fileName = await BuildFileNameAsync(options, token); + var file = BuildFile(dtos); + return (fileName, file); + } + + private Stream BuildFile(IEnumerable dtos) + { + using var template = GetTemplateFile(); + using var workbook = new XLWorkbook(template); + AddDtosToWorkbook(workbook, dtos); + + var memoryStream = new MemoryStream(); + workbook.SaveAs(memoryStream, new SaveOptions { }); + memoryStream.Seek(0, SeekOrigin.Begin); + return memoryStream; + } + + private void AddDtosToWorkbook(XLWorkbook workbook, IEnumerable dtos) + { + var dtosToArray = dtos.ToArray(); + + if (!dtosToArray.Any()) + return; + + var sheet = workbook.GetWorksheet(TemplateParameters.SheetName); + for (var i = 0; i < dtosToArray.Length; i++) + { + var row = sheet.Row(1 + i + TemplateParameters.HeaderRowsCount); + AddRow(row, dtosToArray[i]); + } + } + + private void AddRow(IXLRow xlRow, TDto dto) + { + var properties = dto.Adapt>(); + + foreach (var (name, cellValue) in properties) + { + if (TemplateParameters.Cells.TryGetValue(name, out var cell)) + xlRow.Cell(cell.ColumnNumber).SetCellValue(cellValue); + } + } + + private Stream GetTemplateFile() => + Assembly.GetExecutingAssembly().GetTemplateCopyStream(TemplateParameters.FileName) + ?? throw new ArgumentNullException($"Файл '{TemplateParameters.FileName}' не найден"); +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ExcelServices/ExcelParser.cs b/AsbCloudInfrastructure/Services/ExcelServices/ExcelParser.cs new file mode 100644 index 00000000..924e7477 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/ExcelParser.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.IO; +using System.Linq; +using System.Reflection; +using AsbCloudApp.Data; +using AsbCloudApp.Requests.ParserOptions; +using AsbCloudApp.Services.Parsers; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using ClosedXML.Excel; +using Mapster; + +namespace AsbCloudInfrastructure.Services.ExcelServices; + +public abstract class ExcelParser : IParserService + where TDto : class, IValidatableObject, IId + where TOptions : IParserOptionsRequest + where TTemplate : class, ITemplateParameters, new() +{ + protected TTemplate TemplateParameters => new(); + + public virtual ParserResultDto Parse(Stream file, TOptions options) + { + using var workbook = new XLWorkbook(file); + var sheet = workbook.GetWorksheet(TemplateParameters.SheetName); + var dtos = ParseExcelSheet(sheet); + return dtos; + } + + public virtual Stream GetTemplateFile() => + Assembly.GetExecutingAssembly().GetTemplateCopyStream(TemplateParameters.FileName) + ?? throw new ArgumentNullException($"Файл '{TemplateParameters.FileName}' не найден"); + + + protected virtual IDictionary ParseRow(IXLRow xlRow) + { + var cells = TemplateParameters.Cells.ToDictionary(x => x.Key, x => + { + var columnNumber = x.Value.ColumnNumber; + var xlCell = xlRow.Cell(columnNumber); + var cellValue = x.Value.GetValueFromCell(xlCell); + return cellValue; + }); + + return cells; + } + + protected virtual TDto BuildDto(IDictionary row, int rowNumber) + { + var dto = row.Adapt(); + return dto; + } + + private ValidationResultDto Validate(TDto dto, int rowNumber) + { + var validationResults = new List(); + + var isValid = dto.Validate(validationResults); + + if (isValid) + { + var validDto = new ValidationResultDto + { + Item = dto + }; + + return validDto; + } + + var columnsDict = TemplateParameters.Cells.ToDictionary(x => x.Key, x => x.Value.ColumnNumber); + + var invalidDto = new ValidationResultDto + { + Item = dto, + Warnings = validationResults + .SelectMany(v => v.MemberNames + .Where(columnsDict.ContainsKey) + .Select(m => + { + var columnNumber = columnsDict[m]; + var errorMessage = v.ErrorMessage; + var warningMessage = string.Format(XLExtentions.ProblemDetailsTemplate, + TemplateParameters.SheetName, + rowNumber, + columnNumber, + errorMessage); + var warning = new ValidationResult(warningMessage, new[] { m }); + return warning; + })) + }; + + return invalidDto; + } + + protected virtual ParserResultDto ParseExcelSheet(IXLWorksheet sheet) + { + var count = sheet.RowsUsed().Count() - TemplateParameters.HeaderRowsCount; + if (count <= 0) + return new ParserResultDto(); + + var valiationResults = new List>(count); + var warnings = new List(); + + for (var i = 0; i < count; i++) + { + var xlRow = sheet.Row(1 + i + TemplateParameters.HeaderRowsCount); + var rowNumber = xlRow.RowNumber(); + + try + { + var row = ParseRow(xlRow); + var dto = BuildDto(row, rowNumber); + var validationResult = Validate(dto, rowNumber); + valiationResults.Add(validationResult); + } + catch (FileFormatException ex) + { + var warning = new ValidationResult(ex.Message); + warnings.Add(warning); + } + } + + var parserResult = new ParserResultDto + { + Item = valiationResults + }; + + if (warnings.Any()) + parserResult.Warnings = warnings; + + return parserResult; + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ExcelServices/ExcelWellRelatedParser.cs b/AsbCloudInfrastructure/Services/ExcelServices/ExcelWellRelatedParser.cs new file mode 100644 index 00000000..55485f77 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/ExcelWellRelatedParser.cs @@ -0,0 +1,23 @@ +using System.ComponentModel.DataAnnotations; +using System.IO; +using AsbCloudApp.Data; +using AsbCloudApp.Requests.ParserOptions; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; + +namespace AsbCloudInfrastructure.Services.ExcelServices; + +public abstract class ExcelWellRelatedParser : ExcelParser + where TDto : class, IValidatableObject, IId, IWellRelated + where TOptions : WellRelatedParserRequest + where TTemplate : class, ITemplateParameters, new() +{ + public override ParserResultDto Parse(Stream file, TOptions options) + { + var result = base.Parse(file, options); + + foreach (var dto in result.Item) + dto.Item.IdWell = options.IdWell; + + return result; + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ExcelServices/ExportExcelService.cs b/AsbCloudInfrastructure/Services/ExcelServices/ExportExcelService.cs index 086eba97..cc068ba0 100644 --- a/AsbCloudInfrastructure/Services/ExcelServices/ExportExcelService.cs +++ b/AsbCloudInfrastructure/Services/ExcelServices/ExportExcelService.cs @@ -6,13 +6,14 @@ using System.Reflection; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Requests.ExportOptions; -using AsbCloudApp.Services; +using AsbCloudApp.Services.Export; using AsbCloudInfrastructure.Services.ExcelServices.Templates; using ClosedXML.Excel; using Mapster; namespace AsbCloudInfrastructure.Services.ExcelServices; +[Obsolete] public abstract class ExportExcelService : IExportService where TOptions : IExportOptionsRequest { diff --git a/AsbCloudInfrastructure/Services/ExcelServices/ParserExcelService.cs b/AsbCloudInfrastructure/Services/ExcelServices/ParserExcelService.cs index 64e0259c..a74cab70 100644 --- a/AsbCloudInfrastructure/Services/ExcelServices/ParserExcelService.cs +++ b/AsbCloudInfrastructure/Services/ExcelServices/ParserExcelService.cs @@ -6,13 +6,14 @@ using System.Linq; using System.Reflection; using AsbCloudApp.Data; using AsbCloudApp.Requests.ParserOptions; -using AsbCloudApp.Services; +using AsbCloudApp.Services.Parsers; using AsbCloudInfrastructure.Services.ExcelServices.Templates; using ClosedXML.Excel; using Mapster; namespace AsbCloudInfrastructure.Services.ExcelServices; +[Obsolete] public abstract class ParserExcelService : IParserService where TDto : class, IValidatableObject, IId where TOptions : IParserOptionsRequest diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs index 5ee331d4..3a0d43d4 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudInfrastructure.Services.ProcessMaps.Report; @@ -57,7 +58,7 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService var requestWellOperationFact = new WellOperationRequest() { - IdWell = idWell, + IdsWell = new[] { idWell }, OperationType = WellOperation.IdOperationTypeFact, GeDepth = geDepth, LeDepth = leDepth diff --git a/AsbCloudInfrastructure/Services/WellOperationService/ScheduleReportService.cs b/AsbCloudInfrastructure/Services/WellOperationService/ScheduleReportService.cs index 39ad3cd6..96ef7b85 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/ScheduleReportService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/ScheduleReportService.cs @@ -9,6 +9,7 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudInfrastructure.Services.WellOperationService { @@ -89,7 +90,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService { var row = sheet.Row(i + headerRowsCount); SetCell(row, columnRowNumber, $"{i}"); - SetCell(row, columnCaption, $"{tvdItem.CategoryName} {tvdItem.CategoryInfo}".Trim()); + SetCell(row, columnCaption, $"{tvdItem.OperationCategoryName} {tvdItem.CategoryInfo}".Trim()); SetCell(row, columnWellDepthStart, tvdItem.DepthStart); SetCell(row, columnWellDepthEnd, tvdItem.DepthEnd); SetCell(row, columnDuration, tvdItem.DurationHours); @@ -150,7 +151,7 @@ namespace AsbCloudInfrastructure.Services.WellOperationService var row = sheet.Row(1 + i + headerRowsCount); SetCell(row, columnRowNumber, $"{1 + i}"); - SetCell(row, columnCaption, $"{operation.CategoryName} {operation.CategoryInfo}".Trim()); + SetCell(row, columnCaption, $"{operation.OperationCategoryName} {operation.CategoryInfo}".Trim()); SetCell(row, columnWellDepthStartPlan, tvdItem.Plan?.DepthStart); SetCell(row, columnWellDepthStartFact, tvdItem.Fact?.DepthStart); diff --git a/AsbCloudInfrastructure/XLExtentions.cs b/AsbCloudInfrastructure/XLExtentions.cs index e9cf11f5..b542c1d1 100644 --- a/AsbCloudInfrastructure/XLExtentions.cs +++ b/AsbCloudInfrastructure/XLExtentions.cs @@ -17,10 +17,16 @@ public static class XLExtentions public static IXLCell SetCellValue(this IXLCell cell, T value, string? format = null) { - if (typeof(T) == typeof(DateTime)) + if (value is DateTime || value is DateTimeOffset) { cell.Style.DateFormat.Format = format ?? "DD.MM.YYYY HH:MM:SS"; - } + + if (value is DateTimeOffset dateTimeOffset) + { + cell.Value = XLCellValue.FromObject(dateTimeOffset.DateTime); + return cell; + } + } cell.Value = XLCellValue.FromObject(value); diff --git a/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs b/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs index 68751e00..a5cba844 100644 --- a/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/ProcessMaps/ProcessMapReportDataSaubStatServiceTest.cs @@ -5,6 +5,7 @@ using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data; using AsbCloudApp.Data.ProcessMaps; +using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; diff --git a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs index a7d1763e..f4df65cc 100644 --- a/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMaps/ProcessMapPlanBaseController.cs @@ -16,6 +16,8 @@ using AsbCloudApp.Requests.ParserOptions; using AsbCloudApp.Data.ProcessMaps; using System.ComponentModel.DataAnnotations; using AsbCloudApp.Requests.ExportOptions; +using AsbCloudApp.Services.Export; +using AsbCloudApp.Services.Parsers; namespace AsbCloudWebApi.Controllers.ProcessMaps; diff --git a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs index 56a08c1e..2a734d21 100644 --- a/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs +++ b/AsbCloudWebApi/Controllers/Trajectory/TrajectoryEditableController.cs @@ -10,6 +10,7 @@ using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data; using AsbCloudApp.Requests.ParserOptions; +using AsbCloudApp.Services.Parsers; using AsbCloudInfrastructure.Services.Trajectory.Export; namespace AsbCloudWebApi.Controllers.Trajectory From 39a1c874c03cae3fe4165961a8e409957fd0ebc4 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 Mar 2024 07:38:08 +0300 Subject: [PATCH 18/52] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=80=D1=8B=D0=B5=20=D1=80=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B8=D0=BC=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=82=D0=B0/=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82?= =?UTF-8?q?=D0=B0=20=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IWellOperationExcelParser.cs | 20 -- .../IWellOperationExportService.cs | 19 -- .../IWellOperationImportService.cs | 20 -- .../IWellOperationImportTemplateService.cs | 15 -- .../WellOperationFactTemplate.cs | 26 ++ .../Constants/DefaultTemplateInfo.cs | 17 -- .../Constants/OperationAttributes.cs | 10 - .../Constants/Templates.cs | 7 - .../StringSimilarity/CosineSimilarity.cs | 98 -------- .../WellOperationDefaultExcelParser.cs | 92 ------- .../WellOperationGazpromKhantosExcelParser.cs | 227 ------------------ .../Dictionaries/OperationAttributes.txt | 8 - .../Files/Dictionaries/Operations.txt | 201 ---------------- .../Files/Dictionaries/Sections.txt | 7 - .../Files/WellOperationImportTemplate.xlsx | Bin 98938 -> 0 bytes .../WellOperationExportService.cs | 102 -------- .../WellOperationImportService.cs | 119 --------- .../WellOperationImportTemplateService.cs | 21 -- .../Templates/WellOperationFactTemplate.xlsx | Bin 0 -> 45673 bytes 19 files changed, 26 insertions(+), 983 deletions(-) delete mode 100644 AsbCloudApp/Services/WellOperationImport/IWellOperationExcelParser.cs delete mode 100644 AsbCloudApp/Services/WellOperationImport/IWellOperationExportService.cs delete mode 100644 AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs delete mode 100644 AsbCloudApp/Services/WellOperationImport/IWellOperationImportTemplateService.cs create mode 100644 AsbCloudInfrastructure/Services/ExcelServices/Templates/WellOperations/WellOperationFactTemplate.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Constants/DefaultTemplateInfo.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Constants/OperationAttributes.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Constants/Templates.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/FileParser/StringSimilarity/CosineSimilarity.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationDefaultExcelParser.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationGazpromKhantosExcelParser.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/OperationAttributes.txt delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Operations.txt delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Sections.txt delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/Files/WellOperationImportTemplate.xlsx delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/WellOperationExportService.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportTemplateService.cs create mode 100644 AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationExcelParser.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationExcelParser.cs deleted file mode 100644 index 7a695beb..00000000 --- a/AsbCloudApp/Services/WellOperationImport/IWellOperationExcelParser.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.IO; -using AsbCloudApp.Data.WellOperationImport; -using AsbCloudApp.Data.WellOperationImport.Options; - -namespace AsbCloudApp.Services.WellOperationImport; - -/// -/// Парсинг операций из excel файла -/// -public interface IWellOperationExcelParser - where TOptions : IWellOperationImportOptions -{ - /// - /// Метод парсинга документа - /// - /// - /// - /// - SheetDto Parse(Stream stream, TOptions options); -} \ No newline at end of file diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationExportService.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationExportService.cs deleted file mode 100644 index 9b0a96ac..00000000 --- a/AsbCloudApp/Services/WellOperationImport/IWellOperationExportService.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudApp.Services.WellOperationImport; - -/// -/// Экспорт ГГД -/// -public interface IWellOperationExportService -{ - /// - /// Скачать в excel - /// - /// - /// - /// - Task ExportAsync(int idWell, CancellationToken cancellationToken); -} \ No newline at end of file diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs deleted file mode 100644 index f65d8888..00000000 --- a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Collections.Generic; -using AsbCloudApp.Data; -using AsbCloudApp.Data.WellOperationImport; - -namespace AsbCloudApp.Services.WellOperationImport; - -/// -/// Импорт ГГД -/// -public interface IWellOperationImportService -{ - /// - /// Загрузить из excel список операций - /// - /// - /// - /// - /// - IEnumerable Import(int idWell, int idUser, int idType, SheetDto sheet); -} \ No newline at end of file diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportTemplateService.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationImportTemplateService.cs deleted file mode 100644 index 817f3ae5..00000000 --- a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportTemplateService.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.IO; - -namespace AsbCloudApp.Services.WellOperationImport; - -/// -/// Сервис для получения шаблонов ГГД -/// -public interface IWellOperationImportTemplateService -{ - /// - /// Скачать шаблон для заполнения - /// - /// - Stream GetExcelTemplateStream(); -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/WellOperations/WellOperationFactTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/WellOperations/WellOperationFactTemplate.cs new file mode 100644 index 00000000..afb5fe19 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/WellOperations/WellOperationFactTemplate.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using AsbCloudApp.Data.WellOperation; + +namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.WellOperations; + +public class WellOperationFactTemplate : ITemplateParameters +{ + public string SheetName => "Факт"; + + public int HeaderRowsCount => 1; + + public string FileName => "WellOperationFactTemplate.xlsx"; + + public IDictionary Cells => new Dictionary + { + { nameof(WellOperationDto.WellSectionTypeCaption), new Cell(1, typeof(string)) }, + { nameof(WellOperationDto.OperationCategoryName), new Cell(2, typeof(string)) }, + { nameof(WellOperationDto.CategoryInfo), new Cell(3, typeof(string)) }, + { nameof(WellOperationDto.DepthStart), new Cell(4, typeof(double)) }, + { nameof(WellOperationDto.DepthEnd), new Cell(5, typeof(double)) }, + { nameof(WellOperationDto.DateStart), new Cell(6, typeof(DateTime)) }, + { nameof(WellOperationDto.DurationHours), new Cell(7, typeof(double)) }, + { nameof(WellOperationDto.Comment), new Cell(8, typeof(string)) } + }; +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Constants/DefaultTemplateInfo.cs b/AsbCloudInfrastructure/Services/WellOperationImport/Constants/DefaultTemplateInfo.cs deleted file mode 100644 index 96f3272b..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/Constants/DefaultTemplateInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace AsbCloudInfrastructure.Services.WellOperationImport.Constants; - -public static class DefaultTemplateInfo -{ - public const string SheetNamePlan = "План"; - public const string SheetNameFact = "Факт"; - - public const int HeaderRowsCount = 1; - public const int ColumnSection = 1; - public const int ColumnCategory = 2; - public const int ColumnCategoryInfo = 3; - public const int ColumnDepthStart = 4; - public const int ColumnDepthEnd = 5; - public const int ColumnDate = 6; - public const int ColumnDuration = 7; - public const int ColumnComment = 8; -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Constants/OperationAttributes.cs b/AsbCloudInfrastructure/Services/WellOperationImport/Constants/OperationAttributes.cs deleted file mode 100644 index c4049d03..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/Constants/OperationAttributes.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace AsbCloudInfrastructure.Services.WellOperationImport.Constants; - -public static class OperationAttributes -{ - public const string CategoryInfo = "Описание"; - public const string SectionDiameter = "ОК"; - public const string Depth = "Забой"; - public const string Duration = "Время операции"; - public const string Date = "Дата окончания операции"; -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Constants/Templates.cs b/AsbCloudInfrastructure/Services/WellOperationImport/Constants/Templates.cs deleted file mode 100644 index 631dc170..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/Constants/Templates.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace AsbCloudInfrastructure.Services.WellOperationImport.Constants; - -public static class Templates -{ - public const int IdDefaultTemplate = 0; - public const int IdGazpromKhantosTemplate = 1; -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/StringSimilarity/CosineSimilarity.cs b/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/StringSimilarity/CosineSimilarity.cs deleted file mode 100644 index ae69f7f9..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/StringSimilarity/CosineSimilarity.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; - -namespace AsbCloudInfrastructure.Services.WellOperationImport.FileParser.StringSimilarity; - -public class CosineSimilarity -{ - private const int DefaultK = 2; - - protected int K { get; } - - public CosineSimilarity(int k) - { - if (k <= 0) - { - throw new ArgumentOutOfRangeException(nameof(k), "k should be positive!"); - } - - K = k; - } - - public CosineSimilarity() : this(DefaultK) { } - - public double Similarity(IDictionary profile1, IDictionary profile2) - => DotProduct(profile1, profile2) - / (Norm(profile1) * Norm(profile2)); - - public Dictionary GetProfile(string s) - { - var shingles = new Dictionary(); - - if (string.IsNullOrWhiteSpace(s)) - return shingles; - - var cleanString = Stemming(s); - - for (int i = 0; i < (cleanString.Length - K + 1); i++) - { - var shingle = cleanString.Substring(i, K); - - if (shingles.TryGetValue(shingle, out var old)) - { - shingles[shingle] = old + 1; - } - else - { - shingles[shingle] = 1; - } - } - - return shingles; - } - - private static string Stemming(string s) - { - var cleaned = Regex.Replace(s.ToLower(), "[^a-zа-я0-9]", ""); - var words = cleaned.Split(' '); - var filteredWords = words.Where(word => word.Length > 1).ToArray(); - return string.Concat(filteredWords); - } - - private static double Norm(IDictionary profile) - { - double agg = 0; - - foreach (var entry in profile) - { - agg += 1.0 * entry.Value * entry.Value; - } - - return Math.Sqrt(agg); - } - - private static double DotProduct(IDictionary profile1, IDictionary profile2) - { - var smallProfile = profile2; - var largeProfile = profile1; - - if (profile1.Count < profile2.Count) - { - smallProfile = profile1; - largeProfile = profile2; - } - - double agg = 0; - foreach (var entry in smallProfile) - { - if (!largeProfile.TryGetValue(entry.Key, out var i)) - continue; - - agg += 1.0 * entry.Value * i; - } - - return agg; - } -} diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationDefaultExcelParser.cs b/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationDefaultExcelParser.cs deleted file mode 100644 index 2996d642..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationDefaultExcelParser.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using AsbCloudApp.Data.WellOperationImport; -using AsbCloudApp.Data.WellOperationImport.Options; -using AsbCloudApp.Services.WellOperationImport; -using AsbCloudDb.Model; -using AsbCloudInfrastructure.Services.WellOperationImport.Constants; -using ClosedXML.Excel; - -namespace AsbCloudInfrastructure.Services.WellOperationImport.FileParser; - -public class WellOperationDefaultExcelParser : IWellOperationExcelParser -{ - public SheetDto Parse(Stream stream, WellOperationImportDefaultOptionsDto options) - { - using var workbook = new XLWorkbook(stream); - - return ParseWorkbook(workbook, options); - } - - private static SheetDto ParseWorkbook(IXLWorkbook workbook, WellOperationImportDefaultOptionsDto options) - { - var sheetName = options.IdType == WellOperation.IdOperationTypePlan - ? DefaultTemplateInfo.SheetNamePlan - : DefaultTemplateInfo.SheetNameFact; - - var sheet = workbook.GetWorksheet(sheetName); - - return ParseSheet(sheet); - } - - private static SheetDto ParseSheet(IXLWorksheet sheet) - { - if (sheet.RangeUsed().RangeAddress.LastAddress.ColumnNumber < 7) - throw new FileFormatException($"Лист {sheet.Name} содержит меньшее количество столбцов."); - - var count = sheet.RowsUsed().Count() - DefaultTemplateInfo.HeaderRowsCount; - - switch (count) - { - case > 1024: - throw new FileFormatException($"Лист {sheet.Name} содержит слишком большое количество операций."); - case <= 0: - return new SheetDto { Name = sheet.Name }; - } - - var rows = new RowDto[count]; - - var cellValuesErrors = new List(); - - for (int i = 0; i < rows.Length; i++) - { - try - { - var xlRow = sheet.Row(1 + i + DefaultTemplateInfo.HeaderRowsCount); - - rows[i] = ParseRow(xlRow); - } - catch (FileFormatException ex) - { - cellValuesErrors.Add(ex.Message); - } - } - - if (cellValuesErrors.Any()) - throw new FileFormatException(string.Join("\r\n", cellValuesErrors)); - - return new SheetDto - { - Name = sheet.Name, - Rows = rows - }; - } - - private static RowDto ParseRow(IXLRow xlRow) - { - return new RowDto - { - Number = xlRow.RowNumber(), - Section = xlRow.Cell(DefaultTemplateInfo.ColumnSection).GetCellValue(), - Category = xlRow.Cell(DefaultTemplateInfo.ColumnCategory).GetCellValue(), - CategoryInfo = xlRow.Cell(DefaultTemplateInfo.ColumnCategoryInfo).GetCellValue(), - DepthStart = xlRow.Cell(DefaultTemplateInfo.ColumnDepthStart).GetCellValue(), - DepthEnd = xlRow.Cell(DefaultTemplateInfo.ColumnDepthEnd).GetCellValue(), - Date = xlRow.Cell(DefaultTemplateInfo.ColumnDate).GetCellValue(), - Duration = xlRow.Cell(DefaultTemplateInfo.ColumnDuration).GetCellValue(), - Comment = xlRow.Cell(DefaultTemplateInfo.ColumnComment).GetCellValue() - }; - } -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationGazpromKhantosExcelParser.cs b/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationGazpromKhantosExcelParser.cs deleted file mode 100644 index 7eb62839..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/FileParser/WellOperationGazpromKhantosExcelParser.cs +++ /dev/null @@ -1,227 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using AsbCloudApp.Data.WellOperationImport; -using AsbCloudApp.Data.WellOperationImport.Options; -using AsbCloudApp.Exceptions; -using AsbCloudApp.Services.WellOperationImport; -using AsbCloudInfrastructure.Services.WellOperationImport.Constants; -using AsbCloudInfrastructure.Services.WellOperationImport.FileParser.StringSimilarity; -using ClosedXML.Excel; - -namespace AsbCloudInfrastructure.Services.WellOperationImport.FileParser; - -public class WellOperationGazpromKhantosExcelParser : IWellOperationExcelParser -{ - private class Operation - { - public int RowNumber { get; set; } - - public string? CategoryInfo { get; set; } - - public double SectionDiameter { get; set; } - - public double Depth { get; set; } - - public double Duration { get; set; } - - public DateTime Date { get; set; } - } - - private readonly CosineSimilarity cosineSimilarity = new(); - - private readonly Dictionary operationDict = InitDict("Operations.txt", '='); - private readonly Dictionary sectionDict = InitDict("Sections.txt", '='); - private readonly Dictionary operationAttributesDict = InitDict("OperationAttributes.txt", '='); - - public SheetDto Parse(Stream stream, WellOperationImportGazpromKhantosOptionsDto options) - { - using var workbook = new XLWorkbook(stream); - - return ParseWorkBook(workbook, options); - } - - private SheetDto ParseWorkBook(IXLWorkbook workbook, WellOperationImportGazpromKhantosOptionsDto options) - { - if (options.StartRow is < 1 or > 1048576) - throw new ArgumentInvalidException(nameof(options.StartRow), "Некорректное значение начальной строки"); - - if (options.EndRow is < 1 or > 1048576) - throw new ArgumentInvalidException(nameof(options.EndRow), "Некорректное значение конечной строки"); - - if (options.EndRow < options.StartRow) - throw new ArgumentInvalidException(nameof(options.EndRow), "Конечный номер строки не может быть больше начального"); - - var sheet = workbook.GetWorksheet(options.SheetName); - return ParseSheet(sheet, options.StartRow, options.EndRow); - } - - private SheetDto ParseSheet(IXLWorksheet sheet, int startRow, int endRow) - { - var operationAttributes = GetOperationAttributes(sheet.RowsUsed()); - - if (operationAttributes is null) - return new SheetDto { Name = sheet.Name }; - - var rowsCount = endRow - startRow + 1; - - var operations = new List(); - - var cellValuesErrors = new List(); - - for (int i = 0; i < rowsCount; i++) - { - var xlRow = sheet.Row(startRow + i); - - try - { - operations.Add(new Operation - { - RowNumber = xlRow.RowNumber(), - CategoryInfo = xlRow.Cell(operationAttributes[OperationAttributes.CategoryInfo]).GetCellValue(), - SectionDiameter =xlRow.Cell(operationAttributes[OperationAttributes.SectionDiameter]).GetCellValue(), - Depth = xlRow.Cell(operationAttributes[OperationAttributes.Depth]).GetCellValue(), - Duration = xlRow.Cell(operationAttributes[OperationAttributes.Duration]).GetCellValue(), - Date = xlRow.Cell(operationAttributes[OperationAttributes.Date]).GetCellValue() - }); - } - catch (FileFormatException ex) - { - cellValuesErrors.Add(ex.Message); - } - } - - if (cellValuesErrors.Any()) - throw new FileFormatException(string.Join("\r\n", cellValuesErrors)); - - return new SheetDto() - { - Name = sheet.Name, - Rows = BuildRows() - }; - - IEnumerable<(double Diameter, string Name)> BuildSections() - { - var groupedOperations = operations.GroupBy(o => o.SectionDiameter) - .Select(s => new - { - Diameter = s.Key, - CategoryInfo = string.Concat(s.Select(o => o.CategoryInfo)) - }); - - var repeatedSections = new[] { "xвостовик" }; - - var sections = new List<(double diameter, string section)>(); - - foreach (var groupedOperation in groupedOperations) - { - var sectionNamesSet = new HashSet(sections.Select(s => s.section)); - - sections.Add(new ValueTuple(groupedOperation.Diameter, sectionDict.FirstOrDefault(item => - groupedOperation.CategoryInfo.Contains(item.Key) && - (!sectionNamesSet.Contains(item.Value) || repeatedSections.Contains(item.Value.ToLowerInvariant()))).Value)); - } - - return sections; - } - - IEnumerable BuildRows() - { - if (!operations.Any()) - return Enumerable.Empty(); - - var rows = new List(); - - for (int i = 0; i < operations.Count; i++) - { - var currentOperation = operations[i]; - var nextOperation = i + 1 < operations.Count ? operations[i + 1] : currentOperation; - - rows.Add(new RowDto - { - Number = currentOperation.RowNumber, - Section = BuildSections().FirstOrDefault(s => Math.Abs(s.Diameter - currentOperation.SectionDiameter) < 0.1).Name, - Category = GetValueDictionary(operationDict, currentOperation.CategoryInfo, 0.3), - CategoryInfo = currentOperation.CategoryInfo, - DepthStart = currentOperation.Depth, - DepthEnd = nextOperation.Depth, - Duration = currentOperation.Duration, - Date = currentOperation.Date.AddHours(-currentOperation.Duration) - }); - } - - return rows; - } - } - - private IDictionary? GetOperationAttributes(IXLRows xlRows) - { - const int countOperationAttributes = 5; - - IDictionary? operationAttributes = null; - - foreach (var xlRow in xlRows) - { - operationAttributes = new Dictionary(); - - var cells = xlRow.CellsUsed().ToArray(); - - foreach (var cell in cells) - { - var operationAttribute = GetValueDictionary(operationAttributesDict, cell.GetCellValue(), 0.7); - - if (operationAttribute is null || operationAttributes.Any(a => a.Key == operationAttribute)) - continue; - - operationAttributes.Add(operationAttribute, cell.Address.ColumnNumber); - } - - if (operationAttributes.Count >= countOperationAttributes) - break; - } - - return operationAttributes is not null && operationAttributes.Count == countOperationAttributes ? operationAttributes : null; - } - - private string? GetValueDictionary(IDictionary dict, string? cellValue, double? minSimilarity) - { - if (string.IsNullOrWhiteSpace(cellValue)) - return null; - - var similarValues = new List<(double similarity, string value)>(); - - var profile1 = cosineSimilarity.GetProfile(cellValue); - - foreach (var item in dict) - { - var profile2 = cosineSimilarity.GetProfile(item.Key); - - var similarity = cosineSimilarity.Similarity(profile1, profile2); - - similarValues.Add((similarity, item.Value)); - } - - var mostSimilarValue = similarValues.MaxBy(v => v.similarity); - - return minSimilarity.HasValue && mostSimilarValue.similarity >= minSimilarity ? mostSimilarValue.value : null; - } - - private static Dictionary InitDict(string fileName, char separator) - { - var resourceName = Assembly.GetExecutingAssembly() - .GetManifestResourceNames() - .FirstOrDefault(n => n.EndsWith(fileName))!; - - var stream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(resourceName)!; - - using var reader = new StreamReader(stream); - - return reader.ReadToEnd().Split('\r') - .Where(s => !string.IsNullOrWhiteSpace(s)) - .Select(line => line.Split(separator)) - .ToDictionary(parts => parts[0].Trim(), parts => parts[1].Trim()); - } -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/OperationAttributes.txt b/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/OperationAttributes.txt deleted file mode 100644 index 7127ce99..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/OperationAttributes.txt +++ /dev/null @@ -1,8 +0,0 @@ -Описание=Описание -ОК=ОК -Секция=ОК -Забой, м=Забой -Время=Время операции -Плановое время бурения, сут=Время операции -Окончание=Дата окончания операции -Дата окончания План РГ=Дата окончания операции \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Operations.txt b/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Operations.txt deleted file mode 100644 index 68bc28c7..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Operations.txt +++ /dev/null @@ -1,201 +0,0 @@ -Сборка КНБК=Сборка КНБК -Сборка роторной КНБК=Сборка КНБК -Шаблонирование спуск КНБК=Шаблонирование перед спуском -Бурение под направлением=Бурение ротором -Шаблонирование перед спуском=Шаблонирование перед спуском -Шаблонировка пробуренного интервала + промывка на забое+ подъем КНБК=Шаблонирование перед спуском -Разборка КНБК=Разборка КНБК -ПР к спуску направления 324мм=ПЗР при спуске ОК -Спуск направления=Спуск ОК -Спуск направления 324мм=Спуск ОК -Цементаж направления 324мм=Цементирование -ОЗЦ. Оборудование устья.=ОЗЦ -ОЗЦ. Чистка забурочной ямы. Чистка ВШН. Отворот доп. патрубка. ЗГР=ОЗЦ -Перетяжка талевого каната / замена.=Перетяжка талевого каната -Шаблонирование подъём КНБК=Шаблонировка подъем БИ, продувка -Сборка СБТ 127мм-300м=Сборка БИ с мостков на подсвечник -Сборка КНБК для бурения кондуктора=Сборка КНБК -Сборка КНБК для бурения. Компоновка БК согласно собранного БИ в п.10=Сборка КНБК -Cпуск КНБК=Спуск КНБК -Cпуск КНБК со сборкой БИ с мостков=Спуск бурильного инструмента со сборкой с мостков -Разбурка оснастки (ЦКОД, цем.стакан, БК), замена раствора=Разбуривание тех.оснастки -Бурение под кондуктор. Наращивание св.=Бурение ротором -Промывка, ОБР, МBТ БР<70 кг/м3=Промывка -Промывка на забое=Промывка -Шаблонирование (подъем)=Шаблонировка во время бурения -Шаблонирование (спуск)=Шаблонировка во время бурения -Промывка на забое. Прокачка ВУС, ОБР, МBТ БР <70 кг/м3=Промывка -Подъем=Подъем КНБК -Разборка КНБК с телесистемой=Разборка КНБК -ПЗР к спуску ОК 245мм=ПЗР при спуске ОК -Спуск ОК 245мм с промежуточными промывками (500 м, 1000м). Вывоз БР с БДЕ=Спуск ОК -Промывка перед цементажем=Промывка при спуске ОК -Цементаж кондуктора 245мм=Цементирование -Монтаж ОУС. Вывоз БР, Чистка емкостей=Чистка ЦСГО/емкостного блока -Монтаж ОУС=Монтаж ПВО -Заготовка бурового раствора, чистка емкостей.=Опрессовка ПВО -Монтаж ПВО, монтаж разрезной воронки и устьевого желоба. Вывоз БР, заготовка БР=Монтаж ПВО -Опрессовка глухих плашек ППГ, БГ, БД , выкидных линий, крестовины с коренными задвижками. ЗБР=Опрессовка ПВО -Сборка КНБК на бурение=Сборка КНБК -Сборка СБТ 127мм-465м=Сборка БИ с мостков на подсвечник -Спуск КНБК со сборкой с мостков СБТ -127 (1700м)=Спуск КНБК -Сборка КНБК на бурение транспортного ствола=Сборка КНБК -Опрессовка трубных плашек, ПУГ=Опрессовка ПВО -Разбурка оснастки (ЦКОД, цем.стакан, БК, углубление на 2 метра ниже БК, опрессовка цементного кольца)=Разбуривание тех.оснастки -Разбурка БК, ЦКОДа и цем.стакана=Разбуривание тех.оснастки -Перевод скважины на новый раствор, чистка ЦСГО=Промывка - перевод скважины на новый раствор -Перевод скважины на новый буровой раствор=Промывка - перевод скважины на новый раствор -Бурение транспортного ствола наращ.св. (прокачка укрепляющих пачек ч/з каждые 150-200м)=Бурение ротором -Промывка после ХМ св TVD - 1660 м (ниже на 50 м)=Промывка -Чистка ЦСГО (опрессовка цем. кольца кондуктора во время чистки ЦСГО)=Чистка ЦСГО/емкостного блока -Промывка после Алымской св TVD - 2140 м (ниже на 50 м)=Промывка -Бурение транспортного ствола наращ. cв. (прокачка укрепляющих пачек ч/з каждые 150-200м).=Бурение ротором -Бурение транспортного ствола (1000м первые сутки бурения)=Бурение ротором -Подъем КНБК шаблонировка ствола скважины=Шаблонировка подъем БИ, продувка -Промывка (по согласованию с ЦУСС)=Промывка -Шаблонировка. Подъем КНБК (по согласованию с ЦУСС)=Шаблонировка во время бурения -Шаблонировка.Спуск КНБК со сборкой БИ 300м (по согласованию с ЦУСС)=Шаблонировка во время бурения -Промывка=Промывка -Шаблонировка. Подъем КНБК=Шаблонировка во время бурения -Шаблонировка.Спуск КНБК=Шаблонировка во время бурения -Разборка КНБК с т/с=Разборка КНБК -Промывка на забое, прокачка кольмат. пачки=Помывка -ПЗР к спуску ОК-178мм.=ПЗР при спуске ОК -Спуск ОК 178 мм (до устья, не потайная) с промежуточными промывками=Спуск ОК -Цементирование ОК-178мм=Цементирование -Отворот и выброс допускной трубы, демонтаж ПВО, замыв шурфа для выброса СБТ-127мм, чистка емкостей, приготовление БР=Демонтаж ПВО -Промывка, установка смазывающей пачки=Промывка -Выброс СБТ-127мм на мостки, чистка емкостей, приготовление БР=Подъем БИ с выбросом на мостки -Подъем КНБК с выбросом БИ - 500м (выброс согласовать с куратором ЦУСС)=Подъем КНБК -Монтаж ПВО, замена трубных плашек 127мм на 102мм, замена рабочего переводника на СВП, приготовление БР=Перетяжка талевого каната -ПЗР к спуску ОК 178мм=ПЗР при спуске ОК -Спуск ОК 178мм с промывками. Вывоз БР с БДЕ=Спуск ОК -Цементирование 178мм ОК. Вывоз БР с БДЕ=Цементирование -Частичный демонтаж ПВО=Демонтаж ПВО -Выброс БИ 127 на мостки - 1600м (Оставляем БИ 127 1400 м на бурение под кондуктор). Вывоз БР, чистка емкостей=Подъем БИ с выбросом на мостки -Частичный монтаж ПВО=Монтаж ПВО -Опрессовка (200 атм) глухих плашек ППГ, БГ, БД, выкидных линий, крестовины с коренными задвижками, ЗБР. Сборка БИ-102мм - 1000м для бурения ГС свечами.=Опрессовка ПВО -Сборка КНБК на бурение секции под хвостовик 114мм=Сборка КНБК -Спуск КНБК со сборкой БИ 102 и промежуточными промывками.=Промывка - перевод скважины на новый раствор -Опрессовка трубных плашек ППГ, ПУГ. Промывка, перезапись гаммы=Опрессовка ПВО -Разбурка оснастки (ЦКОД, цем.стакан, БК)=Разбуривание тех.оснастки -Перевод на новый раствор=Промывка - перевод скважины на новый раствор -Чистка ЦСГО=Чистка ЦСГО/емкостного блока -Бурение горизонтального участка скважины (прокачка укрепляющих пачек ч/з каждые 100 м)=Бурение ротором -Подъем БИ в БК Ø178мм.=Подъем КНБК -Спуск БИ со сборкой ТБТ 88,9мм на опрессовку (20м до БК 178)=Спуск КНБК -Опрессовка БИ, установка на подсвечник ТБТ=Опрессовка БИ -Проработка в 2 этапа:1 этап - прямая принудительная проработка; 2 этап - спуск на "сухую"(имитация спуска хвостовика)=Проработка принудительная -Cборка хвостовика=Сборка хвостовика 114мм (согласно схеме) -Промывка, прокачка ВУС=Промывка -Подъем КНБК=Подъем КНБК -ПЗР к спуску хвостовика=ПЗР при спуске ОК -Сборка хвостовика 114мм (согласно схеме)=Сборка хвостовика 114мм (согласно схеме) -Спуск хвостовика 114мм на БИ. В БК 178 перевод на тех.воду (по согл.с ЦУСС)=Спуск ОК -Активация подвески (4ч). Перевод на жидкость заканчивания (2ч).=Активация подвески, опрессовка -Подъем БИ с выбросом на мостки. Оставляем ТБТ 89 (800 м) на следующую скв=Подъем БИ с выбросом на мостки -Демонтаж ПВО=Демонтаж ПВО -Монтаж, опрессовка ФА=Монтаж, опрессовка ФА -5% времени на ТО БУ=Ремонт -Монтаж ФА=Монтаж, опрессовка ФА -Подъем разъединителя с выбросом СБТ-102мм на мостки=Подъем инструмента -Активация подвески. Перевод на жидкость заканчивания. Опрессовка пакера подвески хвостовика.=Активация подвески (потайной колонны, хвостовика) -ПР к спуску хвостовика=ПЗР при спуске ОК -Подъем КНБК с частичным выбросом СБТ-102мм на приемные мостки=Подъем БИ с выбросом на мостки -Бурение горизонтального участка скважины (прокачка укрепляющих пачек ч/з каждые 100м)=Бурение ротором -Промывка перезапись ГК=Промывка -Спуск КНБК со сборкой СБТ-102мм с приемных мостков, с промежуточными промывками каждые 500м=Спуск бурильного инструмента со сборкой с мостков -Сборка КНБК для бурения горизонтального участка скважины=Сборка БИ с мостков на подсвечник -Опрессовка глухих плашек ППГ, БГ, БД, выкидных линий, крестовины с коренными задвижками, приготовление бур.раствора=Опрессовка ПВО -ВМР=ВМР -Долив затруба при подъёме=Долив затруба при подъёме -Закачка/прокачка пачки=Закачка/прокачка пачки -Комплекс ГИС на жестком кабеле=Комплекс ГИС на жестком кабеле -Комплекс ГИС на кабеле=Комплекс ГИС на кабеле -Комплекс ГИС на трубах=Комплекс ГИС на трубах -Контролируемое ГНВП=Контролируемое ГНВП -Ловильные работы=Ловильные работы -Наработка жёлоба=Наработка жёлоба -Наращивание=Наращивание -НПВ / прочее=НПВ / прочее -Обвязка устья с циркуляционной системой=Обвязка устья с циркуляционной системой -Оборудование устья=Оборудование устья -Обработка БР=Обработка БР -Обработка раствора (несоответствие параметров)=Обработка раствора (несоответствие параметров) -Ожидание=Ожидание -Определение места прихвата и ЛМ=Определение места прихвата и ЛМ -Опрессовка ОК=Опрессовка ОК -Ориентирование ТС при бурении=Ориентирование ТС при бурении -Отворот допускной трубы=Отворот допускной трубы -Перезапись гаммы-каротажа=Перезапись гаммы-каротажа -Перемонтаж ПВО=Перемонтаж ПВО -ПЗР к спуску УЭЦН=ПЗР к спуску УЭЦН -ПЗР при сборке КНБК=ПЗР при сборке КНБК -ПЗР при цементировании=ПЗР при цементировании -Поглощение=Поглощение -Подготовка ствола скважины. Перезапись ГК в интервале установки КО.=Подготовка ствола скважины. Перезапись ГК в интервале установки КО. -Подъем БИ с выбросом на мостки=Подъем БИ с выбросом на мостки -подъем ОК=подъем ОК -Подъем приборов ГИС (на трубах)=Подъем приборов ГИС (на трубах) -Полная замена талевого каната=Полная замена талевого каната -ПР перед забуркой направления=ПР перед забуркой направления -Приготовление БР=Приготовление БР -Продувка манифольда=Продувка манифольда -Промывка перед наращиванием=Промывка перед наращиванием -Проработка во время бурения=Проработка во время бурения -Проработка перед наращиванием=Проработка перед наращиванием -Работа яссом=Работа яссом -Разборка комплекса приборов ГИС=Разборка комплекса приборов ГИС -Разбуривание тех.оснастк=Разбуривание тех.оснастки -Расхаживани=Расхаживание -Ревизия КНБК/инструмента/ЗТС=Ревизия КНБК/инструмента/ЗТС -Ремонт бурового оборудования=Ремонт бурового оборудования -Сальникообразование=Сальникообразование -Сборка и спуск ТБТ=Сборка и спуск ТБТ -Сборка комплекса приборов ГИС=Сборка комплекса приборов ГИС -Сборка устройства ориентирования КО=Сборка устройства ориентирования КО -Смена рабочего переводника ВСП=Смена рабочего переводника ВСП -СПО - колокол=СПО - колокол -СПО - метчик=СПО - метчик -СПО - овершот=СПО - овершот -СПО - труболовка=СПО - труболовка -Спуск БИ со сборкой с мостков=Спуск БИ со сборкой с мостков -Спуск инструмента=Спуск инструмента -Спуск инструмента с проработкой=Спуск инструмента с проработкой -Спуск КО на транспотрной колонне=Спуск КО на транспотрной колонне -Спуск приборов ГИС (на трубах)=Спуск приборов ГИС (на трубах) -Срезка=Срезка -Тайм-дриллинг=Тайм-дриллинг -Тех.отстой=Тех.отстой -Торпедирование (встряхивание)=Торпедирование (встряхивание) -Торпедирование (отстрел)=Торпедирование (отстрел) -Удержание в клиньях=Удержание в клиньях -Установка ванн=Установка ванн -Утяжеление БР=Утяжеление БР -Учебная тревога "Выброс"=Учебная тревога "Выброс" -Фрезеровка=Фрезеровка -Шаблонировка подъем БИ, продувка=Шаблонировка подъем БИ, продувка -Шаблонировка перед наращиванием=Шаблонировка перед наращиванием -Демонтаж ПВО ( переоборудование устья скважины). Вывоз БР=Демонтаж ПВО -Сборка БИ 127/147с мостков установкой на подсвечник=Сборка БИ с мостков на подсвечник -Спуск приборов комплекса АМАК.=Спуск приборов ГИС (на трубах) -Подъем с записью=Подъем приборов ГИС (на трубах) -ОЗЦ под давлением (по согласованию с ЦУСС)=ОЗЦ -"Демонтаж ПВО ( переоборудование устья скважины). Вывоз БР=Демонтаж ПВО -Сборка CБТ-127 (0м) с мостков установкой на подсвечник (оставлено СБТ-127 (1500м) с пердыдущей скв). Заготовка БР=Сборка БИ с мостков на подсвечник -ПЗР к спуску ОК=ПЗР при спуске ОК -Выброс СБТ 127 (2100м), оставляется СБТ-127 (700 м) на след скв. ЗБР, чистка емкостей, вывоз БР.=Подъем БИ с выбросом на мостки -Монтаж ПВО повторный (смена плашек ПВО). ЗБР, чистка емкостей, вывоз БР=Монтаж ПВО -Опрессовка ПВО (200 атм), глухие=Опрессовка ПВО -Сборка ТБТ на 2 этапе (кол-во по согласованию с ЦУСС). Подъем/спуск БИ со сборкой ТБТ 102 мм. Опрессовка БИ (1.5 ч)=Сборка и спуск ТБТ -Спуск пакера=Спуск пакера -Запись гамма-каратожа=Запись гамма-каратожа -Шаблонирование спуск БИ=Шаблонирование спуск БИ -Сборка клин-отклонителя=Сборка клин-отклонителя -Ориентирование и посадка клина-отклонителя=Ориентирование и посадка клина-отклонителя -Протяжка подъемного патрубка подвески=Протяжка подъемного патрубка подвески -Подъем клина-отклонителя=Подъем клина-отклонителя -Стыковка стингера с хвостовиком основного ствола=Стыковка стингера с хвостовиком основного ствола -Ориентирование и установка стыковочного узла хвостовика=Ориентирование и установка стыковочного узла хвостовика -Бурение с отбором керна=Бурение с отбором керна -Работа пакером в обсадной колонне=Работа пакером в обсадной колонне \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Sections.txt b/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Sections.txt deleted file mode 100644 index b0b2df54..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/Files/Dictionaries/Sections.txt +++ /dev/null @@ -1,7 +0,0 @@ -направ=Направление -конд=Кондуктор -техн=Техническая колонна -экспл=Эксплуатационная колонна -транс=Транспортный ствол -пилот=Пилотный ствол -хвост=Хвостовик \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/Files/WellOperationImportTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperationImport/Files/WellOperationImportTemplate.xlsx deleted file mode 100644 index 6f53ccfbeffaf2feaa69d38216b8b4f6a085a824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98938 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%0D<;;j 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

Y*%T z1u_ETF_x`dzz8fM(HJJ z(zw>4j~~u2;w6|P=q8z=Ax7|s!3fCJLutp>CBO(U{h)+g3qlUxi!~Af{C1dr`0UzP ziF2Xy>HY+pFq`$?z8cOjk`-XC<)6neD~Z@>NDA~Y?wSh-a) z-8po+cTc@G8-3@E>DF?=EmicMaQdL2akoEBGmqXrlius;I4DT(N~M=M_EYW7Z{-Hs z{AsC22gB(#g7oi>1MoqtafLzYgnp<|%!B5pscOzGdNY0G0A7x=(Ui1>TV*@Ejo4`S zQarDVdWWUib@UpvD~85iY^?0NXvmuK$iav4ZCS~LcPinrJy5^cXxTcD0VU~usfw{K z#=B|RuMJPK)`k?9*+Gf|pP~&+9@ac#ApkDVgpQ+F|4I;eAWW zl*ZCLlS5*Q&cgFs2W~ViI@6MU51I-7r{CECoX5(Qb2%tsyFyJL@uTU^r}Qpvuj$_`TXQp1xpAFc`(8|N;x6V`IB z_sm_EGyR(n963WH$2k6eKQM)tRncxK!p=P z`qLGTd|-5e z6*}XnhN%`}*PZ3*U5?79MMq)h*!OpS#DYf=ImNMLayg_y<5;WA^25&BY;sy`9V>$& zUd2U~PDnFnqlH^^YmkwPX?j03pd$(;s~!??dFFJbN~)5U zwAS{U=ii1yWg9oDOO!8(7niAdwsp}NZ8pbn4PynlDNM-}1LROc*8}7S@b}|b;Q?L4 zFR>pCXQj#*FqW1_9^DBGinAvrwh?0t&9q+pC--{TGQzKQp)sNxS+d5khyma7xE%2Q zV(juF8Af*=fnPHk^izXa1>J9Zzmjuz9^!)#(#CTzZ}-) zS2Iv>`Put}@-P&KVa~yrJz2FADp{%{DzPEVe>OHBlv@LVbiKnonf;+qCTCwQy zS#f{~8aU8{&Rs{ij<|;eFy5r{Ofu*0q+IgG3>R4UKnFC zR*UC-#w{&IZ>cY^UL8h|g3(B7Y%E*jmwiYiN}UeO4aR%4#jLI%qH za2$(o#lP6Xg(!+|$?~1>0X_1KEzy%f9(EeXG?_SO==rRSl}Ds9BIq=pe4K91*6~bZ z==qF}NqZWJdSk&fQ7ZMZ0n^$2W#UK{KER(H+M=kJh%2OplqivjFoA>?Y@4FKM@eGy zDFpABTs^iDD$0k9fn&})e3@>lK$7WLOI{O3Vb`|Ysk|L=+JAZb~pcQp0b zS`57XdMB9XM_LoT2SWo$XIg|8G=4`p*7!A#cTG-9#;6v4{+gWT+H)CHc!gD#c!WM#gV@IX2rWiuFUH%JbfW&@R2jC|W z*yIXbOAvHa2<=lKt+r)pwp6Pvv{hm=Wp_E%y*AuJ3C*jTK07&^&@Ve0Rwk!m6D4M+ ze$(ulqRW_peLi!TKko=l&FEE|!<|7U0&IvoeX!8ckuG<652M=|dU_uOCGn1u3C`^v zoOCEvmtc@pgiG(iaNu*;6Wmk``7)eQ6O#3v%QT}HeW}I@1SK#jA5H-Z^^yPzii**E zPQAodaTJpVVLFVLNbayVneud`FBC`y5ii6jK+zC4WM9(8tPx~r~EV7segYV zvYCG#G*a~c2Spc}hW%uY_O^pmON((XX|W7KPj9eF23sEW2JYvOQWe$brmThZZMb|r zn<_pDufTYUHq_FB4RX+&;!O2QQf+RvteZ*y3;6*Ba{7?DGNfD8J|9`ik4+p+mDGLK zqSSCyk1IBrL;qu?*Fi8(h>N7)M=U*ZEL2A<)vS#Tu8fYyZet!{dHO)q z{=rRwX!iJ$0Tv_xa+aeyjvWh`dOHH8UFeg(m)85&iPn|BtulpfmQSQ@rHZc#MBMi9HS&Pk{XE z>p>5q%N=eKkd5h-JV$L5b<CFupjpN6j&}GAx zU45D#fC=*fz)F}m!Y@Tof3R!Yk80{Azx*LX{MA>~qc9DDE5!D8Pi)a=EM>$37*hn( zcQkzA&wh!2En0aC{Yvy^TDBwo^j#tfU_W(~Y(@F7t9(A=XML?ZLN%jE8fFp+(Hspo z$XKIQ^+nI6rrvko8Ow)mJnO6&UCq500XC>@>@|nLQGjGrDwWvCzNf+uf~d*BZxLI8 zT6v}$e{0Q!fRapX_x15#>03VcG-X+6sPrE=xZ#_k@IJnJJI5IpM{PQ!+_cs7zSuK+ z$spIS8MC=$XMcKfiDkV=saukQQ_}iU;YaeND)%aaPvqF~bPaY+eZm?g-@vi0!Njzv zvBfuX?b^EYFVmm7>^7xc32||G#r49ti?e50gvF`8%}3eTvbi>#)0-h9b)j)i|8c$- zToPO4+^sG0p1F)U!uD*r0LwfXDJjdzOGWq$MqlNhJzIu-y3Rq43yqbPCF_G{yj(Z@ zQdOQBEptW@^QNo_p2?rm@!2a~?U^s+BsO!pNRMu7iu$9 zuz&@H_Y^Rf%$`E8zcptHoPWQ#D?G2juIM@6;|Gj#xg^fZ$wm_6`YL;-_L~j>!zbAM zf&1cH1OuPB;OmvHQSv-s;7#{42}ro}zoQ_443v6TC`R7=XMwKOgh&wRSFoYyINqa+ z%kyRrh?N$mHx6wG-Zx?8W&U?)*oVXronv)D1^EHD9?kV<+&Fi6T1omcKs{7y#>MXc z!G}IG@Bvmfmm0M!!J4FGXUg2(1hy^1i9mH6QH=sBTpWd7|M7>Eaih|aH4d!+U>6|E z4I!IA7A5L`^C1IU08@GVK}fi6KWf?(BppI;vvNo?WB@7=A0r9aQ22#wgp0KrzVUL_ zwVjs>UyWCZ@WrqBJIiN2o!Sb9Ealx8vb+}y-Y03zx03XoCF@Vls%z582yyY?e|MHY zLt^TDM1<9V2<{mdRM_}sZjYC_V7Oph-LpKsp-VLQPc>=@<>KWGH3QJ>Vt-E7@qHVj z@9@#Tt3CS{*rWt=KSl$MafSA`!U{?+hk=6%&!0YA>u%}!#TtN zLezN|gVERXhDrC%XsXvTC2no`ZoDK>_Zh2qpg)k9gGgK+&80q;QKX2=Q!X9`ahZmu z${;RcmJvvSDLJ_@w#*FyhsPbA`f~4AjQd`laGr-CLQF6MDK%w+v^+BH0z%?&Zz*i#8Ri+O#u*JP9{kH@{fI~u%P2|zn{w7>mnoV3`Kr)! zmrT&a0N`8)3B3Xh0OX&y&Wg#uHrX`~?HU4u;l!S0|KJS z*%ZV#id!--KFL3DUvI1_s_0=cvqwV$SKA`zzIie)QN~wyUoaO7my7YOKTN5v)dVsM ztN>!U0^mD1%58|QP?VAd81nS$WyqWZp#en3w7CQKySpKqiwC&htcz3BfJB~)a4FfW zo#D?uTjn4;0_NtEKn@ufv`kxL88I37*4E1Wc1;3K8d}3q-D#`X!HvShb1OOw7J`7;LGfWD=a8{QHfRV2$0Q))w zV5r@{zVHf9@DNRLbdEz@A&!lKD+3#M1Kv`RPpQ(_LIzKnK7yw}2VFg(9(vA82@q%l zBFVXTa<8|5&G7|RL#`I1P^j0NuvQ~P**JTDP0=AV-t7F6e-JyYjqGCmP-OQOM+%+7-gQj1_?>2QeG3cp zoN^jqNf~3-&|O#gL(#sebP>*kq9xSB`<4OMpbV2FoT%@ufg_WfR-Wa1g8C*ayN%-{ z|L4>5sf&;BF|>ataev#{*-?|$_-Nc6(6<@XFYjDx-_^Cne;xg# z>5rO6ns@EmzP^1ME^sqY)BkW`?t4Mal+*2YKRSLGJ9Kov9eAYa>tNOu*;`QTF9)Y& zDmluk51t(S7UFMj+Sd9h_r&!tiN>j?+gF4;n)e(X{8a5F=h&(>`?O7p(OgmgwLXP~ zUlYG)HuN`k+*MkadN|iL(EYoagK3hT#WRNpTdQ(GAK5dfH^(PN_V-Fw%~A1j)V%vn zBq*fEEHJC)^h&O^DZO_6w!T00>yGx#>q{K)vMi#TNWbsVwp^vTGuJ9xTw2qC-fCyl zmeXmGdyD3nq`F*1>4b_(fma}R!$6b1Wv^D(_1Ec(suB}qQfj}OMO#~}OSZMH8>~ol zq{ms9NyS@5+ON`>-rCaa*t%TSd$wJ_v+?+lp5`2fZXfTbCqB%R^_#u6nU?RsCv;Kd zWB05XZ*x>i66=ea>stqF;?(?hsfgB98Ljib>ye#x*E5Svh&D^bgE|7_#I@_`z=m5HUNCHfrdc;9CJ{AwId zHyH>wcBFS|KBfQY>?(Gw_eQs}Y=(HIq22HG6%^7Ql&XqL0-S4xx#=dI&aVGD1mu#K>d(a;oVY*N4Lo5NEO;>pu~z3_+r z>4d>=N8?M>{QTZ49k*5S3NgJZ5gjK*^C^$t*HvGky(V>r()YGaToncLs!m+s5fhj# zcx|<<{i?Dg2OD}w%d%{jBMBNFZ0{S(R0I!hDvLc`AQjHb_UL@EW71%5&KY`Hhocrv z1J>VCEZ1Kc7U-f@rSbV-R%%w;yROf{Z4b&0W|>_mYT}g~u(Dn&EtPdAx&5e_$iQ)jPD56X!(QZIXu()#sljKDg7P5116`rzJj@5^qc4Mw&hk8~DUaXgnQNui&o zhu6l-oThO(Naj|Lns3>*FB+hynI`nig`*KJ<$&GMAuV%hieou+Ks?9C?}=TLAwQp3CR z&0a}Y`@m}wjoGJ*CYO$Tbs?$ic8%sLK|SrIc7`RQj>Udw#%^9VZEEc{4c*LBtMcq= z)x2CM)^E=+sG1XS{mc)m6YKY!NtCiJYc!d>Ay`#x%!xBo?N&YhD797Z`IECxg1)TW zGk5zE>u(R@4Wc&(>7+bWy{UU7^6e(2v?4ZsGyWg*ziLjm?<+T1(`YTQV)N>Rm>XZ3 z%O_MkD~<`3c_{q;Zdm7=Pd4YWZ@u30sA`qnIg`(^`BzyTvX;uIbr!z$&E7EnwTIBQ zyX(uYtT)vvIe+;5)~h|O_YQPT3XwkQH}Q?fE1v%3`Nm3aTF0XAj&n(0G`n-r=_%{) zsMQ(y9-7G6H~!+xWz}bPo#=l1L%QF;`to|k8J+X_cD66uy5d;4w72hWfq>PsJ{iO=13&31onaa_zk-uguVhD*Rf54~&nY zZC_Dj9`CI(&vMY}OqknYuCO=G@+-ZMEIJc0#j)tv=-}m5fmefz9@g@34PMF9yEQfc zN0X~%VGF<76q$LB8V|Vlb|*8Qx&I|gg~XsxvhjcdEURf?{U?eVbn zlvLh*qF)A9j%>rzkHcZJND7iRm)@R>}69scXPA#)($S3n!jnng(tD= z3Lg2IP8nlwP9Gm@e9Ou0k@gDdoO#a|$zxNJNC6z#`&^k*W56&AB^?n)LVK|eaSYIim6q;-YgU;6&Q zvt-(3&YxK>i(`{2#xx39hBtW&&VGBcCq^%NjZvPVg?gD@k4IsOg-oDKwiRE=-M0~H zK}QaKZJ&F_%I0#=f`Cs6u?MZDxox!e)gM{APHugdeu&0X@^YMX z!73e&D_hS$a9^-!o5m-fS5EU@JB`TtSlJL1bfZ?3B7uuECz7@M^JiIPgoP2uj^5PieP zAJei+@7fJ$gdI*$PgN6y+LWl17{eX5F(lvYXP)0C&&F+0NA6FzZCqD!{gYjwluw;mYRx&rPgb3r z4wj7ka$##)~;eo$TlFC-w)X z1}+NP9jCF_u4J{?-AjpP89Hafxx>o#>EyQF%NhG}Ova`3=toPJc+a0IVY1}Pf)({U zKM06K^Dq3l6NOtA%OP;#7Wsj}UcDowaePR9_5rds3+kT2T z$fT#-lC!O!(EOF-D`zyZaXxIEF4T{#4glvmi@-kDLG3SBC5NXLW}?OSF6|;ljSX za&E0}w#EeZ`FV2##`>+@ka|n)tNe}+!o71#kG}AHv|#d+6D!8Fjhj<>qT<6-qaSGj z5~&=#EEW?36*hBb^dHml|74$d-atOde$r9Z^nt-HFaL&#C$8o{x5%?TP&Rp!q~9jt zETc02d+F0%W3PP(;hN6Qwfx3Z`7b3EtJY*FOy???b5Gmz!J9YgyQj<&S~K1;il@9} zn;X~JPe=IPJe9A#c*E8!G_BH5zU|g$euW5+=G-$g(&qEbxYzpZ>N|%VVZkuZxqI0< zdV+;F+Dr?!eUqtj`Gfy8{&DMc9G}TOF?3v!c>BZ!|GZIO*07XyCw*D!ncX(Zdfr{` z@D)?s?cHqOa>nI5?opdls-gKaS$HegdHNGR{yyHZQrFqGvS-L;)qIc_yVG!a*Lfkk zpF*Xhbn{GumpuqkIvd2dB>FA;dxf*d=TD!;qq6bxWQAUZ{Y4wKHWY~Q<%!)8*F7{rv4`#jO!kWL$2%pb5q{qffat3w8D z1L$L-{2cPE*SQ+5N%p?AzhQB+m`LRtEeYAkaFKaSr`gvItXy{E{?smoP>XkKejHNP z|8gqDN?&ECU_+q8Fbp8{THuI(jTE$NqHdeIPvYePL;~8Rf&!cHRkHKZB z3)ic=hP5Z=3H_>Nj<(tQF%ZhcT4Ia__#Czzi`VPrZib)!7)Y+n%=)8uia%t_*A=A@pSH)CV_zAka97aQeidD47M<&Ki618Lk7 z-pNaDJX7&(YJl9rrp{%v#xF48)t^$m_1O$>ZY6J<<-I03hfLeUJXed(etctKs)j$8 zlx6vXtw+WLm_&-UM(8g8s2|Cp<9epLt>RKm^<3_tRZ~B?zuqnCyMRq=_8~2^(VQ-v zN>KrK=U3i-ur=KF=oOZnkjh22T;IQQUiNyd{!`9!^qj`vu=V^GM6~a&WS<<6+>-OK zS}Un=%Th&Koi*JWSz-edb#9EdchH&hN~!mPVQ{a1zdBHLF=HLtv6xvxB(<+tYBlJQ>2 z4FL-e?kEb|$MHEXtk}M5hG&Ao`ht7=w#U7D_jS*dHhn|YIj;X-dshAr<=Vy{!!V_q zv5aOYTZG6MDQjd)$G&7MJ2PY*Mi^wLvNouY4l1Iumn}=!yB+Q zvECcfqPpz|GUYRiZ#!T)Ru3XO?Uh?!Kz`%3uo(2y7Pwq5CO_Vy!8xlM9+jNCpwq%T zePu1J;D)4}7&R#Dh2A$yNb9hK4lTcDU?&5d!G%3t}%)`KT=?rVpVMCXnleURj z6P00NYk%FU-={<7g+W%hQ*!=8U+(Z!w!|(XZ@3MgS}fsN6?Akg*?XvVr6@<_{k)3B zh>URuzwe8oI?s!S!(5}@Mq-jj=brp>Gqa|#b;c}Rgz~+lRWgRtu8im7-aW>jk{fIMeB6BX>ej!ikIb~5 zMERXQokzt5%^99)&~aS>q$i$tc2;O`MUe-;V6rduq#=>Wi&9sm#kjLyNsUf;`uK*ZP*2wQam-g^vm!kGa0#{c(7 zPolW@Ng$%;&sD2V1Porf&HvQPB8#Js{@Tq`b8lplESa0*U8RR68EOb)EHbtxuO$?HSenU=c|%ZDA~)<$z8r^sDaQ+MP5qeN9>t*H>!YG&eGO1nCANk%7J z;=u&TQj3zxtd&&=l^&Yu5yT7}5}??VBWyWd6vh&`IQ?UdO2)M7FO6jiCUL;tB45fD zRZwNwnhbj?%;`riC7FFvbo~kw^hk|7mys2PrX({Psa?$QE`E}KqA&Q<@QQuFo1mjI zsBd-$<7=p93R%6Kh_Ea6uHE4bwmjH_x?xw0I#WI22)*Wp!>U~Y&8z*JpOx0q)!!V$%PUAj+hyXjK<+nOWV409HRJ4 z*j26qDfX8nnGkYu%XD;}Ap54mm&jGT_*$?UJV9t$N-@tMZtP7$Rxrrqf9`?;=8fym z!GFY%03h^NIz#~TAa9(P5zgCtD4 zT8rAOtJN!avne76DP1ajN+t8Cpbi<0R-QWEz?3>EX88>$^$}DI;o2B|&ELr`GJaM@ zIz2$~W91)He^wk~Ry=^IqW-cKiORj%Rbu zg5N(D0sw43pMv(6iQXP={~ml%fjdBh0YF3SfF;?ZF!$EGmNTc#RxU1 zazBlcxXMu?iIU5L8-(1r`#TAp)5s+ewOF!$pVf){+L80+M3v~Z89Y{~pIT+6VC=g% z`N&JFxlNNtHT?+0k`*t}jY65pluLDdI;=4$^JqHA@0PQ+Fjrrm*Od%2*h775+xK=8 zzdd~k6Pr~KKq2$yu98WW(d`(r(lJ@3QJj*xmeQ!DJ5XQVWkmF{oW4&(oF@`pY6+39!nt?+KO#H$_(zWc1c5RJ9){q=^&(M<$;-s+( zw)VNqYd(pF`x1TT(gb*+QH)Y4V^}mx;20xeX!9!{pN4jR{XkQyk59t0?Dv$=jk*3a zBd(|J>!iA>Z8Fro9X*|GK*Uu&VaTjX41*#$b43IFnr>Uy1&6?{1PJr<9$M(G;zmWo z&Mnl7aE(X#FFauR(oNv`NNwfVJF#3gWhiR&ZuCs~2`1}D!3CE2{HPHVVzABBqi%V?<31&rXxa zt#~7c2&ERyy?Jlsf&+Em9mtn@HElewT}7mW90x0gfA^R)mjz!%fXpQ`ZXKMo3ChKeM1YonO#X&%TQIPt~JLGG?h}7B(=SswgZ#`)R-|pEE-V*Es zU*p^%xB%J$_PYL(_4V*_vGee7+0wl$4pOkqH3w841a`{cJ8&ey`Y4F=GXkv<)TYxw zHK>jPTCmf7=)Uj5-cC3-9OnBIyPNy+ZjxFQP^${)$&nq}KePTl(Kiv5N`29z6H?t-sdpCnY_d~G&4N7hFt|;FPqFtS3 ze}|9wE&!;GVWdGJChv-}>k`qnF}Iz9JJ4-;wB6LCHGsCty)7#0{Ff+g&6^fsXL__P z4**i$bO3F#L@P}jR&LA7`F__=6IAXRWYU7}j8(QF0YHxQlS$i=3oXFT+vaD0%7C8% Ze%w9!T2PSTTblz8EP|WOGYI4=@E@*WtDpb? diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationExportService.cs b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationExportService.cs deleted file mode 100644 index 96e640b8..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationExportService.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data; -using AsbCloudApp.Repositories; -using AsbCloudApp.Requests; -using AsbCloudApp.Services.WellOperationImport; -using AsbCloudInfrastructure.Services.WellOperationImport.Constants; -using ClosedXML.Excel; - -namespace AsbCloudInfrastructure.Services.WellOperationImport; - -public class WellOperationExportService : IWellOperationExportService -{ - private readonly IWellOperationRepository wellOperationRepository; - private readonly IWellOperationImportTemplateService wellOperationImportTemplateService; - private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; - - public WellOperationExportService( - IWellOperationRepository wellOperationRepository, - IWellOperationImportTemplateService wellOperationImportTemplateService, - IWellOperationCategoryRepository wellOperationCategoryRepository) - { - this.wellOperationRepository = wellOperationRepository; - this.wellOperationImportTemplateService = wellOperationImportTemplateService; - this.wellOperationCategoryRepository = wellOperationCategoryRepository; - } - - public async Task ExportAsync(int idWell, CancellationToken cancellationToken) - { - var operations = await wellOperationRepository.GetAsync(new WellOperationRequest() - { - IdWell = idWell - }, cancellationToken); - - return MakeExcelFileStream(operations); - } - - private Stream MakeExcelFileStream(IEnumerable operations) - { - using Stream ecxelTemplateStream = wellOperationImportTemplateService.GetExcelTemplateStream(); - - using var workbook = new XLWorkbook(ecxelTemplateStream); - AddOperationsToWorkbook(workbook, operations); - - var memoryStream = new MemoryStream(); - workbook.SaveAs(memoryStream, new SaveOptions { }); - memoryStream.Seek(0, SeekOrigin.Begin); - return memoryStream; - } - - private void AddOperationsToWorkbook(XLWorkbook workbook, IEnumerable operations) - { - var planOperations = operations.Where(o => o.IdType == 0); - if (planOperations.Any()) - { - var sheetPlan = workbook.GetWorksheet(DefaultTemplateInfo.SheetNamePlan); - - AddOperationsToSheet(sheetPlan, planOperations); - } - - var factOperations = operations.Where(o => o.IdType == 1); - if (factOperations.Any()) - { - var sheetFact = workbook.GetWorksheet(DefaultTemplateInfo.SheetNameFact); - - AddOperationsToSheet(sheetFact, factOperations); - } - } - - private void AddOperationsToSheet(IXLWorksheet sheet, IEnumerable operations) - { - var operationsToArray = operations.ToArray(); - - var sections = wellOperationRepository.GetSectionTypes(); - var categories = wellOperationCategoryRepository.Get(false); - - for (int i = 0; i < operationsToArray.Length; i++) - { - var row = sheet.Row(1 + i + DefaultTemplateInfo.HeaderRowsCount); - AddOperationToRow(row, operationsToArray[i], sections, categories); - } - } - - private static void AddOperationToRow(IXLRow row, WellOperationDto operation, IEnumerable sections, - IEnumerable categories) - { - var sectionCaption = sections.First(s => s.Id == operation.IdWellSectionType).Caption; - var categoryName = categories.First(o => o.Id == operation.IdCategory).Name; - - row.Cell(DefaultTemplateInfo.ColumnSection).SetCellValue(sectionCaption); - row.Cell(DefaultTemplateInfo.ColumnCategory).SetCellValue(categoryName); - row.Cell(DefaultTemplateInfo.ColumnCategoryInfo).SetCellValue(operation.CategoryInfo); - row.Cell(DefaultTemplateInfo.ColumnDepthStart).SetCellValue(operation.DepthStart); - row.Cell(DefaultTemplateInfo.ColumnDepthEnd).SetCellValue(operation.DepthEnd); - row.Cell(DefaultTemplateInfo.ColumnDate).SetCellValue(operation.DateStart.DateTime); - row.Cell(DefaultTemplateInfo.ColumnDuration).SetCellValue(operation.DurationHours); - row.Cell(DefaultTemplateInfo.ColumnComment).SetCellValue(operation.Comment); - } -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs deleted file mode 100644 index 6ad227a3..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using AsbCloudApp.Data; -using AsbCloudApp.Data.WellOperationImport; -using AsbCloudApp.Repositories; -using AsbCloudApp.Services; -using AsbCloudApp.Services.WellOperationImport; - -namespace AsbCloudInfrastructure.Services.WellOperationImport; - -public class WellOperationImportService : IWellOperationImportService -{ - private readonly IWellService wellService; - private readonly IWellOperationRepository wellOperationRepository; - private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; - private static readonly DateTime dateLimitMin = new(2001, 1, 1, 0, 0, 0); - private static readonly DateTime dateLimitMax = new(2099, 1, 1, 0, 0, 0); - private static readonly TimeSpan drillingDurationLimitMax = TimeSpan.FromDays(366); - - public WellOperationImportService( - IWellService wellService, - IWellOperationRepository wellOperationRepository, - IWellOperationCategoryRepository wellOperationCategoryRepository - ) - { - this.wellService = wellService; - this.wellOperationRepository = wellOperationRepository; - this.wellOperationCategoryRepository = wellOperationCategoryRepository; - } - - public IEnumerable Import(int idWell, int idUser, int idType, SheetDto sheet) - { - var validationErrors = new List(); - - var sections = wellOperationRepository.GetSectionTypes(); - var categories = wellOperationCategoryRepository.Get(false); - - var wellOperations = new List(); - - var rows = sheet.Rows.OrderBy(r => r.Date); - - var prevRow = new RowDto(); - - foreach (var row in rows) - { - try - { - var section = sections.FirstOrDefault(s => - string.Equals(s.Caption, row.Section, StringComparison.CurrentCultureIgnoreCase)); - - if (section is null) - throw new FileFormatException($"Лист '{sheet.Name}'. В строке '{row.Number}' не удалось определить секцию"); - - var category = categories.FirstOrDefault(c => - string.Equals(c.Name, row.Category, StringComparison.CurrentCultureIgnoreCase)); - - if (category is null) - throw new FileFormatException($"Лист '{sheet.Name}'. В строке '{row.Number}' не удалось определить операцию"); - - if (row.DepthStart is not (>= 0d and <= 20_000d)) - throw new FileFormatException( - $"Лист '{sheet.Name}'. Строка '{row.Number}' некорректная глубина на начало операции"); - - if (row.DepthEnd is not (>= 0d and <= 20_000d)) - throw new FileFormatException( - $"Лист '{sheet.Name}'. Строка '{row.Number}' некорректная глубина на конец операции"); - - if (row.Date < dateLimitMin && row.Date > dateLimitMax) - throw new FileFormatException( - $"Лист '{sheet.Name}'. Строка '{row.Number}' неправильно получена дата начала операции"); - - if (prevRow.Date > row.Date) - throw new FileFormatException( - $"Лист '{sheet.Name}' строка '{row.Number}' дата позднее даты предыдущей операции"); - - if (row.Duration is not (>= 0d and <= 240d)) - throw new FileFormatException($"Лист '{sheet.Name}'. Строка '{row.Number}' некорректная длительность операции"); - - var timezone = wellService.GetTimezone(idWell); - var timezoneOffset = TimeSpan.FromHours(timezone.Hours); - - var wellOperation = new WellOperationDto - { - IdWell = idWell, - IdUser = idUser, - IdType = idType, - IdWellSectionType = section.Id, - WellSectionTypeName = section.Caption, - IdCategory = category.Id, - CategoryName = category.Name, - CategoryInfo = row.CategoryInfo, - DepthStart = row.DepthStart, - DepthEnd = row.DepthEnd, - DateStart = new DateTimeOffset(row.Date, timezoneOffset), - DurationHours = row.Duration, - Comment = row.Comment - }; - - wellOperations.Add(wellOperation); - - prevRow = row; - } - catch (FileFormatException ex) - { - validationErrors.Add(ex.Message); - } - } - - if (wellOperations.Any() && wellOperations.Min(o => o.DateStart) - wellOperations.Max(o => o.DateStart) > drillingDurationLimitMax) - validationErrors.Add($"Лист {sheet.Name} содержит диапазон дат больше {drillingDurationLimitMax}"); - - if (validationErrors.Any()) - throw new FileFormatException(string.Join("\r\n", validationErrors)); - - return wellOperations; - } -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportTemplateService.cs b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportTemplateService.cs deleted file mode 100644 index edb71c14..00000000 --- a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportTemplateService.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.IO; -using System.Linq; -using System.Reflection; -using AsbCloudApp.Services.WellOperationImport; - -namespace AsbCloudInfrastructure.Services.WellOperationImport; - -public class WellOperationImportTemplateService : IWellOperationImportTemplateService -{ - public Stream GetExcelTemplateStream() - { - var resourceName = Assembly.GetExecutingAssembly() - .GetManifestResourceNames() - .FirstOrDefault(n => n.EndsWith("WellOperationImportTemplate.xlsx"))!; - - var stream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(resourceName)!; - - return stream; - } -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..065dc2070b20c533bc426b21237f4e4cf062c581 GIT binary patch literal 45673 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%0AtJkynKDVw^qTIomKcf7n`I8EN-u2v3O%o3olI5c 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 z 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 Date: Fri, 22 Mar 2024 11:01:12 +0500 Subject: [PATCH 19/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20LimitingParameterDataDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/LimitingParameterDataDto.cs | 4 ++-- AsbCloudApp/Requests/LimitingParameterRequest.cs | 4 ++-- .../Repository/LimitingParameterRepository.cs | 8 ++++---- .../Services/LimitingParameterService.cs | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/AsbCloudApp/Data/LimitingParameterDataDto.cs b/AsbCloudApp/Data/LimitingParameterDataDto.cs index 1bf982dc..c5692729 100644 --- a/AsbCloudApp/Data/LimitingParameterDataDto.cs +++ b/AsbCloudApp/Data/LimitingParameterDataDto.cs @@ -20,12 +20,12 @@ namespace AsbCloudApp.Data ///

/// Дата начала ограничения /// - public DateTime DateStart { get; set; } + public DateTimeOffset DateStart { get; set; } /// /// Дата окончания ограничения /// - public DateTime DateEnd { get; set; } + public DateTimeOffset DateEnd { get; set; } /// /// Глубина начала ограничения diff --git a/AsbCloudApp/Requests/LimitingParameterRequest.cs b/AsbCloudApp/Requests/LimitingParameterRequest.cs index 31fb02f0..4e1b5d98 100644 --- a/AsbCloudApp/Requests/LimitingParameterRequest.cs +++ b/AsbCloudApp/Requests/LimitingParameterRequest.cs @@ -17,12 +17,12 @@ namespace AsbCloudApp.Requests /// /// Больше или равно дате /// - public DateTime? GtDate { get; set; } + public DateTimeOffset? GtDate { get; set; } /// /// Меньше или равно дате /// - public DateTime? LtDate { get; set; } + public DateTimeOffset? LtDate { get; set; } /// /// Больше или равно глубины забоя diff --git a/AsbCloudInfrastructure/Repository/LimitingParameterRepository.cs b/AsbCloudInfrastructure/Repository/LimitingParameterRepository.cs index 8f3c42c1..67fc5960 100644 --- a/AsbCloudInfrastructure/Repository/LimitingParameterRepository.cs +++ b/AsbCloudInfrastructure/Repository/LimitingParameterRepository.cs @@ -39,8 +39,8 @@ namespace AsbCloudInfrastructure.Repository IdWell = request.IdWell, IdTelemetry = x.IdTelemetry, IdFeedRegulator = x.IdFeedRegulator, - DateStart = DateTime.SpecifyKind(x.DateStart.UtcDateTime + timezoneSpan, DateTimeKind.Unspecified), - DateEnd = DateTime.SpecifyKind(x.DateEnd.UtcDateTime + timezoneSpan, DateTimeKind.Unspecified), + DateStart = x.DateStart.ToOffset(timezoneSpan), + DateEnd = x.DateEnd.ToOffset(timezoneSpan), DepthStart = x.DepthStart, DepthEnd = x.DepthEnd }); @@ -56,13 +56,13 @@ namespace AsbCloudInfrastructure.Repository if (request.GtDate.HasValue) { - var gtDate = request.GtDate.Value.ToUtcDateTimeOffset(timezoneHours); + var gtDate = request.GtDate.Value.ToUniversalTime(); query = query.Where(x => x.DateEnd >= gtDate); } if (request.LtDate.HasValue) { - var ltDate = request.LtDate.Value.ToUtcDateTimeOffset(timezoneHours); + var ltDate = request.LtDate.Value.ToUniversalTime(); query = query.Where(x => x.DateStart <= ltDate); } diff --git a/AsbCloudInfrastructure/Services/LimitingParameterService.cs b/AsbCloudInfrastructure/Services/LimitingParameterService.cs index c4323597..5dee9f53 100644 --- a/AsbCloudInfrastructure/Services/LimitingParameterService.cs +++ b/AsbCloudInfrastructure/Services/LimitingParameterService.cs @@ -106,7 +106,7 @@ namespace AsbCloudInfrastructure.Services return (float)result; } - private DateTime GetDate(double depth, LimitingParameterDataDto dto) + private DateTimeOffset GetDate(double depth, LimitingParameterDataDto dto) { var a = depth - dto.DepthStart; var b = dto.DepthEnd - dto.DepthStart; From 533ddd29cf02089bd9bb0434727e00c228d10b81 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 22 Mar 2024 11:09:21 +0500 Subject: [PATCH 20/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=B0=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?ProcessMapPlanRequest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/ProcessMapPlanRequest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudApp/Requests/ProcessMapPlanRequest.cs b/AsbCloudApp/Requests/ProcessMapPlanRequest.cs index b614b8c3..6a7fa14b 100644 --- a/AsbCloudApp/Requests/ProcessMapPlanRequest.cs +++ b/AsbCloudApp/Requests/ProcessMapPlanRequest.cs @@ -20,5 +20,5 @@ public class ProcessMapPlanRequest /// /// Дата обновления /// - public DateTime? UpdateFrom { get; set; } + public DateTimeKind? UpdateFrom { get; set; } } \ No newline at end of file From dde34dad19926609471c231966bf8a222a3f8942 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 22 Mar 2024 11:15:10 +0500 Subject: [PATCH 21/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=B0=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?MessageDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/MessageDto.cs | 2 +- AsbCloudInfrastructure/Services/SAUB/MessageService.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudApp/Data/MessageDto.cs b/AsbCloudApp/Data/MessageDto.cs index 071967d9..7234db7a 100644 --- a/AsbCloudApp/Data/MessageDto.cs +++ b/AsbCloudApp/Data/MessageDto.cs @@ -16,7 +16,7 @@ namespace AsbCloudApp.Data /// дата появления события /// [Required] - public DateTime DateTime { get; set; } + public DateTimeOffset DateTime { get; set; } /// /// категория события diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index a4d1f841..10b71093 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -111,7 +111,7 @@ namespace AsbCloudInfrastructure.Services.SAUB WellDepth = message.WellDepth }; - messageDto.DateTime = message.DateTime.ToRemoteDateTime(timezone.Hours); + messageDto.DateTime = message.DateTime.ToOffset(TimeSpan.FromHours(timezone.Hours)); if (message.IdTelemetryUser is not null) { From 16645d053ad9c1ac790022b3c2348e9653b7ef76 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 Mar 2024 10:42:48 +0300 Subject: [PATCH 22/52] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D0=B0=D1=8F=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=8D?= =?UTF-8?q?=D0=BA=D0=BF=D0=BE=D1=80=D1=82=D0=B0/=D0=B8=D0=BC=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=82=D0=B0=20=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Изменено апи 2. Добавлен парсер для ГГД 3. Добавлен ссервис экспорта ГГД --- AsbCloudApp/Data/ParserResultDto.cs | 5 + AsbCloudApp/Data/ValidationResultDto.cs | 2 +- .../WellOperationExportRequest.cs | 20 + .../WellOperationParserRequest.cs | 29 + .../AsbCloudInfrastructure.csproj | 12 +- AsbCloudInfrastructure/DependencyInjection.cs | 15 +- .../WellOperationPlanTemplate.cs | 26 + .../WellOperationExportServiceFactory.cs | 43 + .../Factories/WellOperationParserFactory.cs | 43 + .../Templates/WellOperationPlanTemplate.xlsx | Bin 0 -> 68320 bytes .../WellOperations/WellOperationExport.cs | 51 + .../WellOperations/WellOperationParser.cs | 77 ++ .../AsbCloudWebApi.IntegrationTests.csproj | 2 + .../Clients/IWellOperationClient.cs | 29 +- .../Files/FactWellOperations.xlsx | Bin 0 -> 45419 bytes .../Files/PlanWellOperations.xlsx | Bin 0 -> 68419 bytes .../WellOperationControllerTest.cs | 107 +- .../WellOperationExportServiceTest.cs | 216 ---- .../Controllers/WellOperationController.cs | 928 +++++++----------- 19 files changed, 729 insertions(+), 876 deletions(-) create mode 100644 AsbCloudApp/Requests/ExportOptions/WellOperationExportRequest.cs create mode 100644 AsbCloudApp/Requests/ParserOptions/WellOperationParserRequest.cs create mode 100644 AsbCloudInfrastructure/Services/ExcelServices/Templates/WellOperations/WellOperationPlanTemplate.cs create mode 100644 AsbCloudInfrastructure/Services/WellOperations/Factories/WellOperationExportServiceFactory.cs create mode 100644 AsbCloudInfrastructure/Services/WellOperations/Factories/WellOperationParserFactory.cs create mode 100644 AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationPlanTemplate.xlsx create mode 100644 AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs create mode 100644 AsbCloudInfrastructure/Services/WellOperations/WellOperationParser.cs create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/Files/FactWellOperations.xlsx create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/Files/PlanWellOperations.xlsx rename AsbCloudWebApi.IntegrationTests/Controllers/{ => WellOperations}/WellOperationControllerTest.cs (55%) delete mode 100644 AsbCloudWebApi.Tests/Services/WellOperationExport/WellOperationExportServiceTest.cs diff --git a/AsbCloudApp/Data/ParserResultDto.cs b/AsbCloudApp/Data/ParserResultDto.cs index 5b6eca8d..ffb24d50 100644 --- a/AsbCloudApp/Data/ParserResultDto.cs +++ b/AsbCloudApp/Data/ParserResultDto.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; namespace AsbCloudApp.Data; @@ -9,4 +10,8 @@ namespace AsbCloudApp.Data; public class ParserResultDto : ValidationResultDto>> where TDto : class, IId { + /// + /// Объекты полученные из файла + /// + public override IEnumerable> Item { get; set; } = Enumerable.Empty>(); } \ No newline at end of file diff --git a/AsbCloudApp/Data/ValidationResultDto.cs b/AsbCloudApp/Data/ValidationResultDto.cs index 0116fe0a..1fe0f918 100644 --- a/AsbCloudApp/Data/ValidationResultDto.cs +++ b/AsbCloudApp/Data/ValidationResultDto.cs @@ -18,7 +18,7 @@ public class ValidationResultDto /// /// Объект валидации /// - public T Item { get; set; } = null!; + public virtual T Item { get; set; } = null!; /// /// Предупреждения diff --git a/AsbCloudApp/Requests/ExportOptions/WellOperationExportRequest.cs b/AsbCloudApp/Requests/ExportOptions/WellOperationExportRequest.cs new file mode 100644 index 00000000..facbba72 --- /dev/null +++ b/AsbCloudApp/Requests/ExportOptions/WellOperationExportRequest.cs @@ -0,0 +1,20 @@ +namespace AsbCloudApp.Requests.ExportOptions; + +/// +/// Параметры экспорта ГГД +/// +public class WellOperationExportRequest : WellRelatedExportRequest +{ + /// + public WellOperationExportRequest(int idWell, + int idType) + : base(idWell) + { + IdType = idType; + } + + /// + /// Тип операций + /// + public int IdType { get; } +} \ No newline at end of file diff --git a/AsbCloudApp/Requests/ParserOptions/WellOperationParserRequest.cs b/AsbCloudApp/Requests/ParserOptions/WellOperationParserRequest.cs new file mode 100644 index 00000000..efb9aad2 --- /dev/null +++ b/AsbCloudApp/Requests/ParserOptions/WellOperationParserRequest.cs @@ -0,0 +1,29 @@ +using AsbCloudApp.Data; + +namespace AsbCloudApp.Requests.ParserOptions; + +/// +/// Параметры парсинга ГГД +/// +public class WellOperationParserRequest : WellRelatedParserRequest +{ + /// + public WellOperationParserRequest(int idWell, + int idType, + SimpleTimezoneDto wellTimezone) + : base(idWell) + { + IdType = idType; + WellTimezone = wellTimezone; + } + + /// + /// Тип операции + /// + public int IdType { get; } + + /// + /// Часовой пояс в котором находится скважина + /// + public SimpleTimezoneDto WellTimezone { get; } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 0d56b6bd..371127c4 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -45,11 +45,9 @@ - - - - + + @@ -77,4 +75,10 @@ CommonLibs\AsbWitsInfo.dll + + + + + + diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 5ee77197..bcde8237 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -14,7 +14,6 @@ using AsbCloudApp.Services.DailyReport; using AsbCloudApp.Services.Notifications; using AsbCloudApp.Services.ProcessMaps; using AsbCloudApp.Services.ProcessMaps.WellDrilling; -using AsbCloudApp.Services.WellOperationImport; using AsbCloudDb.Model; using AsbCloudDb.Model.DailyReports.Blocks.TimeBalance; using AsbCloudDb.Model.Manuals; @@ -36,8 +35,6 @@ using AsbCloudInfrastructure.Services.Subsystems; using AsbCloudInfrastructure.Services.Trajectory; using AsbCloudInfrastructure.Services.Trajectory.Export; using AsbCloudInfrastructure.Services.Trajectory.Parser; -using AsbCloudInfrastructure.Services.WellOperationImport; -using AsbCloudInfrastructure.Services.WellOperationImport.FileParser; using AsbCloudInfrastructure.Services.WellOperationService; using Mapster; using Microsoft.EntityFrameworkCore; @@ -46,6 +43,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; +using AsbCloudInfrastructure.Services.WellOperations.Factories; namespace AsbCloudInfrastructure { @@ -160,7 +158,6 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddScoped(); - services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -270,13 +267,6 @@ namespace AsbCloudInfrastructure services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient, WellOperationDefaultExcelParser>(); - services.AddTransient, WellOperationGazpromKhantosExcelParser>(); - services.AddTransient(); services.AddTransient(); @@ -300,6 +290,9 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); + + services.AddTransient(); + services.AddTransient(); return services; } diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/WellOperations/WellOperationPlanTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/WellOperations/WellOperationPlanTemplate.cs new file mode 100644 index 00000000..85e88db7 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/WellOperations/WellOperationPlanTemplate.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using AsbCloudApp.Data.WellOperation; + +namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.WellOperations; + +public class WellOperationPlanTemplate : ITemplateParameters +{ + public string SheetName => "План"; + + public int HeaderRowsCount => 1; + + public string FileName => "WellOperationPlanTemplate.xlsx"; + + public IDictionary Cells => new Dictionary() + { + { nameof(WellOperationDto.WellSectionTypeCaption), new Cell(1, typeof(string)) }, + { nameof(WellOperationDto.OperationCategoryName), new Cell(2, typeof(string)) }, + { nameof(WellOperationDto.CategoryInfo), new Cell(3, typeof(string)) }, + { nameof(WellOperationDto.DepthStart), new Cell(4, typeof(double)) }, + { nameof(WellOperationDto.DepthEnd), new Cell(5, typeof(double)) }, + { nameof(WellOperationDto.DateStart), new Cell(6, typeof(DateTime)) }, + { nameof(WellOperationDto.DurationHours), new Cell(7, typeof(double)) }, + { nameof(WellOperationDto.Comment), new Cell(8, typeof(string)) } + }; +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperations/Factories/WellOperationExportServiceFactory.cs b/AsbCloudInfrastructure/Services/WellOperations/Factories/WellOperationExportServiceFactory.cs new file mode 100644 index 00000000..1dc1d2a7 --- /dev/null +++ b/AsbCloudInfrastructure/Services/WellOperations/Factories/WellOperationExportServiceFactory.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests.ExportOptions; +using AsbCloudApp.Services; +using AsbCloudApp.Services.Export; +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services.ExcelServices.Templates.WellOperations; +using Microsoft.Extensions.DependencyInjection; + +namespace AsbCloudInfrastructure.Services.WellOperations.Factories; + +public class WellOperationExportServiceFactory : IExportServiceFactory +{ + private readonly IDictionary> exportServices; + + public WellOperationExportServiceFactory(IServiceProvider serviceProvider) + { + var wellOperationRepository = serviceProvider.GetRequiredService(); + var wellService = serviceProvider.GetRequiredService(); + + exportServices = new Dictionary> + { + { + WellOperation.IdOperationTypeFact, + () => new WellOperationExport(wellOperationRepository, wellService) + }, + { + WellOperation.IdOperationTypePlan, + () => new WellOperationExport(wellOperationRepository, wellService) + } + }; + } + + public IExportService CreateExportService(int id) + where TOptions : IExportOptionsRequest + { + var parser = exportServices[id].Invoke(); + + return parser as IExportService + ?? throw new ArgumentNullException(nameof(id), "Не удалось экспортировать файл"); + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperations/Factories/WellOperationParserFactory.cs b/AsbCloudInfrastructure/Services/WellOperations/Factories/WellOperationParserFactory.cs new file mode 100644 index 00000000..4107a7dd --- /dev/null +++ b/AsbCloudInfrastructure/Services/WellOperations/Factories/WellOperationParserFactory.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests.ParserOptions; +using AsbCloudApp.Services.Parsers; +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services.ExcelServices.Templates.WellOperations; +using Microsoft.Extensions.DependencyInjection; + +namespace AsbCloudInfrastructure.Services.WellOperations.Factories; + +public class WellOperationParserFactory : IParserFactory +{ + private readonly IDictionary> parsers; + + public WellOperationParserFactory(IServiceProvider serviceProvider) + { + var wellOperationRepository = serviceProvider.GetRequiredService(); + var categoryRepository = serviceProvider.GetRequiredService(); + + parsers = new Dictionary> + { + { + WellOperation.IdOperationTypeFact, + () => new WellOperationParser(wellOperationRepository, categoryRepository) + }, + { + WellOperation.IdOperationTypePlan, + () => new WellOperationParser(wellOperationRepository, categoryRepository) + } + }; + } + + public IParserService CreateParser(int id) + where TOptions : IParserOptionsRequest + { + var parser = parsers[id].Invoke(); + + return parser as IParserService + ?? throw new ArgumentNullException(nameof(id), "Не удалось распознать файл"); + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationPlanTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationPlanTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c5d53089457739c709596e91c6dafae799099e27 GIT binary patch literal 68320 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 : ExcelExportService + where TTemplate : class, ITemplateParameters, new() +{ + private readonly IWellService wellService; + private readonly IWellOperationRepository wellOperationRepository; + + public WellOperationExport(IWellOperationRepository wellOperationRepository, + IWellService wellService) + { + this.wellOperationRepository = wellOperationRepository; + this.wellService = wellService; + } + + protected override async Task BuildFileNameAsync(WellOperationExportRequest options, CancellationToken token) + { + var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token); + + return options.IdType switch + { + WellOperation.IdOperationTypeFact => $"{caption}_Фактические_операции.xlsx", + WellOperation.IdOperationTypePlan => $"{caption}_Плановые_операции.xlsx", + _ => throw new ArgumentOutOfRangeException(nameof(options.IdType)) + }; + } + + protected override Task> GetDtosAsync(WellOperationExportRequest options, CancellationToken token) + { + var request = new WellOperationRequest + { + IdsWell = new[] { options.IdWell }, + OperationType = options.IdType + }; + + return wellOperationRepository.GetAsync(request, token); + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellOperations/WellOperationParser.cs b/AsbCloudInfrastructure/Services/WellOperations/WellOperationParser.cs new file mode 100644 index 00000000..65bda0a2 --- /dev/null +++ b/AsbCloudInfrastructure/Services/WellOperations/WellOperationParser.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests.ParserOptions; +using AsbCloudInfrastructure.Services.ExcelServices; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; + +namespace AsbCloudInfrastructure.Services.WellOperations; + +public class WellOperationParser : ExcelWellRelatedParser + where TTemplateParameters : class, ITemplateParameters, new() +{ + private readonly IEnumerable sectionTypes; + private readonly IEnumerable categories; + + public WellOperationParser(IWellOperationRepository wellOperationRepository, + IWellOperationCategoryRepository categoryRepository) + { + categories = categoryRepository.Get(false); + sectionTypes = wellOperationRepository.GetSectionTypes(); + } + + public override ParserResultDto Parse(Stream file, WellOperationParserRequest options) + { + var result = base.Parse(file, options); + + foreach (var dto in result.Item) + { + dto.Item.IdWell = options.IdWell; + dto.Item.IdType = options.IdType; + dto.Item.DateStart = new DateTimeOffset(dto.Item.DateStart.DateTime, options.WellTimezone.Offset); + } + + return result; + } + + protected override WellOperationDto BuildDto(IDictionary row, int rowNumber) + { + var dto = base.BuildDto(row, rowNumber); + + var sectionType = sectionTypes.FirstOrDefault(s => + string.Equals(s.Caption.Trim(), dto.WellSectionTypeCaption?.Trim(), StringComparison.CurrentCultureIgnoreCase)); + + if (sectionType is null) + { + var message = string.Format(XLExtentions.ProblemDetailsTemplate, + TemplateParameters.SheetName, + rowNumber, + TemplateParameters.Cells[nameof(WellOperationDto.WellSectionTypeCaption)], + "Указана некорректная секция"); + throw new FileFormatException(message); + } + + var category = categories.FirstOrDefault(c => + string.Equals(c.Name.Trim(), dto.OperationCategoryName?.Trim(), StringComparison.CurrentCultureIgnoreCase)); + + if (category is null) + { + var message = string.Format(XLExtentions.ProblemDetailsTemplate, + TemplateParameters.SheetName, + rowNumber, + TemplateParameters.Cells[nameof(WellOperationDto.OperationCategoryName)], + "Указана некорректная операция"); + throw new FileFormatException(message); + } + + dto.IdWellSectionType = sectionType.Id; + dto.IdCategory = category.Id; + dto.IdParentCategory = category.IdParent; + + return dto; + } +} \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/AsbCloudWebApi.IntegrationTests.csproj b/AsbCloudWebApi.IntegrationTests/AsbCloudWebApi.IntegrationTests.csproj index b97bed80..b23176e3 100644 --- a/AsbCloudWebApi.IntegrationTests/AsbCloudWebApi.IntegrationTests.csproj +++ b/AsbCloudWebApi.IntegrationTests/AsbCloudWebApi.IntegrationTests.csproj @@ -23,6 +23,8 @@ + + diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs index 8e2db98f..e7943144 100644 --- a/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs +++ b/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs @@ -1,5 +1,7 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Requests; +using Microsoft.AspNetCore.Mvc; using Refit; namespace AsbCloudWebApi.IntegrationTests.Clients; @@ -8,20 +10,23 @@ public interface IWellOperationClient { private const string BaseRoute = "/api/well/{idWell}/wellOperations"; - [Post(BaseRoute + "/{idType}/{deleteBeforeInsert}")] - Task> InsertRangeAsync(int idWell, int idType, bool deleteBeforeInsert, [Body] IEnumerable dtos); + [Post(BaseRoute + "/{deleteBeforeInsert}")] + Task> InsertRangeAsync(int idWell, + bool deleteBeforeInsert, + [Body] IEnumerable dtos); - [Put(BaseRoute + "/{idOperation}")] - Task> UpdateAsync(int idWell, int idOperation, [Body] WellOperationDto value, CancellationToken token); + [Put(BaseRoute)] + Task> UpdateRangeAsync(int idWell, [Body] IEnumerable dtos); - [Get(BaseRoute + "/plan")] - Task>> GetPageOperationsPlanAsync(int idWell, - [Query] WellOperationRequestBase request, - CancellationToken token); + [Get(BaseRoute)] + Task>> GetPageOperationsPlanAsync(int idWell, [Query] WellOperationRequest request); [Multipart] - [Post(BaseRoute + "/import/plan/default")] - Task>> ImportPlanDefaultExcelFileAsync(int idWell, - [AliasAs("files")] IEnumerable streams, - CancellationToken token); + [Post(BaseRoute + "/parse/{idType}")] + Task>> ParseAsync(int idWell, + int idType, + [AliasAs("file")] StreamPart file); + + [Get(BaseRoute + "/export")] + Task> ExportAsync(int idWell, int idType); } \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/Files/FactWellOperations.xlsx b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/Files/FactWellOperations.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..45ee8a0bb72a6425cf5d0362aeed27e61025d7af GIT binary patch literal 45419 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 }; //act - var response = await client.InsertRangeAsync(well.Id, 1, false, dtos); + var response = await client.InsertRangeAsync(well.Id, false, dtos); //assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -56,18 +56,18 @@ public class WellOperationControllerTest : BaseIntegrationTest var dtos = new[] { entity.Adapt() }; //act - var response = await client.InsertRangeAsync(well.Id, 1, true, dtos); + var response = await client.InsertRangeAsync(well.Id, true, dtos); //assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); } /// - /// Успешное обновление операции + /// Успешное обновление операций /// /// [Fact] - public async Task UpdateAsync_returns_success() + public async Task UpdateRangeAsync_returns_success() { //arrange var well = await dbContext.Wells.FirstAsync(); @@ -75,10 +75,10 @@ public class WellOperationControllerTest : BaseIntegrationTest dbContext.WellOperations.Add(entity); await dbContext.SaveChangesAsync(); - var dto = entity.Adapt(); + var dtos = new[] { entity.Adapt() }; //act - var response = await client.UpdateAsync(well.Id, entity.Id, dto, CancellationToken.None); + var response = await client.UpdateRangeAsync(well.Id, dtos); //assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -100,66 +100,101 @@ public class WellOperationControllerTest : BaseIntegrationTest var dto = entity.Adapt(); var timezoneOffset = TimeSpan.FromHours(well.Timezone.Hours); dto.DateStart = dto.DateStart.ToOffset(timezoneOffset); + dto.LastUpdateDate = dto.LastUpdateDate?.ToOffset(timezoneOffset); - var request = new WellOperationRequestBase + var request = new WellOperationRequest { OperationType = WellOperation.IdOperationTypePlan }; //act - var response = await client.GetPageOperationsPlanAsync(well.Id, request, CancellationToken.None); + var response = await client.GetPageOperationsPlanAsync(well.Id, request); //assert + Assert.Equal(response.StatusCode, HttpStatusCode.OK); Assert.NotNull(response.Content); Assert.Single(response.Content.Items); var actualDto = response.Content.Items.First(); - var excludeProps = new[] - { - nameof(WellOperationDto.LastUpdateDate) - }; - MatchHelper.Match(dto, actualDto, excludeProps); + MatchHelper.Match(dto, actualDto); } - [Fact] - public async Task ImportPlanDefaultExcelFileAsync_returns_success() + [Theory] + [InlineData(WellOperation.IdOperationTypePlan, "PlanWellOperations.xlsx")] + [InlineData(WellOperation.IdOperationTypeFact, "FactWellOperations.xlsx")] + public async Task ParseAsync_returns_success(int idType, string fileName) { //arrange - var stream = Assembly.GetExecutingAssembly().GetFileCopyStream("WellOperationsPlan.xlsx"); - - var memoryStream = new MemoryStream(); - await stream.CopyToAsync(memoryStream); - memoryStream.Position = 0; - var well = await dbContext.Wells.FirstAsync(); - //act - var streamPart = new StreamPart(memoryStream, "WellOperations.xlsx", "application/octet-stream"); + var expectedDto = new WellOperationDto + { + IdWell = well.Id, + IdWellSectionType = 2, + IdCategory = WellOperationCategory.IdSlide, + IdPlan = null, + CategoryInfo = "Доп.инфо", + IdType = idType, + DepthStart = 10.0, + DepthEnd = 20.0, + DateStart = new DateTimeOffset(new DateTime(2023, 1, 10), TimeSpan.FromHours(well.Timezone.Hours)), + DurationHours = 1.0, + Comment = "123", + }; - var response = await client.ImportPlanDefaultExcelFileAsync(well.Id, new[] { streamPart }, CancellationToken.None); + var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); + + var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); + + //act + var response = await client.ParseAsync(well.Id, idType, streamPart); //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.NotNull(response.Content); - Assert.Equal(4, response.Content.Count()); - Assert.True(response.Content.All(w => Math.Abs(w.DateStart.Offset.Hours - Defaults.Timezone.Hours) < 0.1)); + + var actualDto = response.Content.Item.First().Item; + + MatchHelper.Match(expectedDto, actualDto); } - private static WellOperation CreateWellOperation(int idWell) => + [Theory] + [InlineData(WellOperation.IdOperationTypePlan)] + [InlineData(WellOperation.IdOperationTypeFact)] + public async Task ExportAsync_returns_success(int idType) + { + //arrange + var well = await dbContext.Wells.FirstAsync(); + + var entity = CreateWellOperation(well.Id, idType); + dbContext.WellOperations.Add(entity); + await dbContext.SaveChangesAsync(); + + //act + var response = await client.ExportAsync(well.Id, idType); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal("application/octet-stream", response.ContentHeaders?.ContentType?.MediaType); + Assert.True(response.ContentHeaders?.ContentLength > 0); + } + + private static WellOperation CreateWellOperation(int idWell, int idType = WellOperation.IdOperationTypePlan) => new() { IdWell = idWell, IdWellSectionType = 2, - LastUpdateDate = DateTimeOffset.UtcNow, - IdCategory = 5000, + IdCategory = WellOperationCategory.IdSlide, IdPlan = null, - CategoryInfo = "1", - IdType = 0, + CategoryInfo = "Доп.инфо", + LastUpdateDate = new DateTimeOffset(new DateTime(2023, 1, 10)).ToUniversalTime(), + IdType = idType, DepthStart = 10.0, DepthEnd = 20.0, DateStart = new DateTimeOffset(new DateTime(2023, 1, 10), TimeSpan.FromHours(Defaults.Timezone.Hours)).ToUniversalTime(), DurationHours = 1.0, Comment = "1", - IdUser = 1 + IdUser = 1, }; } \ No newline at end of file diff --git a/AsbCloudWebApi.Tests/Services/WellOperationExport/WellOperationExportServiceTest.cs b/AsbCloudWebApi.Tests/Services/WellOperationExport/WellOperationExportServiceTest.cs deleted file mode 100644 index ad3d3895..00000000 --- a/AsbCloudWebApi.Tests/Services/WellOperationExport/WellOperationExportServiceTest.cs +++ /dev/null @@ -1,216 +0,0 @@ -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.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.Services.WellOperationExport -{ - public class WellOperationExportServiceTest - { - private const int idWell = 4; - - private IWellService wellService; - private IWellOperationRepository wellOperationRepository; - private IWellOperationCategoryRepository wellOperationCategoryRepository; - private IWellOperationImportTemplateService wellOperationImportTemplateService; - private WellOperationExportService wellOperationExportService; - private WellOperationImportService wellOperationImportService; - private IWellOperationExcelParser wellOperationDefaultExcelParser; - - 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" - } - }; - private readonly ITestOutputHelper output; - - public WellOperationExportServiceTest(ITestOutputHelper output) - { - wellService = Substitute.For(); - wellOperationRepository = Substitute.For(); - wellOperationCategoryRepository = Substitute.For(); - wellOperationImportTemplateService = new WellOperationImportTemplateService(); - wellOperationExportService = new WellOperationExportService(wellOperationRepository, wellOperationImportTemplateService, wellOperationCategoryRepository); - - wellOperationImportService = new WellOperationImportService(wellService, wellOperationRepository, wellOperationCategoryRepository); - wellOperationDefaultExcelParser = new WellOperationDefaultExcelParser(); - this.output = output; - - wellService.GetTimezone(idWell).Returns(new SimpleTimezoneDto() - { - Hours = 5 - }); - } - - [Fact] - public async Task Check_Exported_WellOperations_With_Operations_In_Db() - { - var operations = getOperations(); - - var localOperations = operations.ToArray(); - - foreach (var operation in localOperations) - operation.Id = 0; - - wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) - .ReturnsForAnyArgs(localOperations); - wellOperationRepository.GetSectionTypes().Returns(sectionTypes); - wellOperationCategoryRepository.Get(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 expected = JsonSerializer.Serialize(localOperations); - var actual = JsonSerializer.Serialize(result); - - Assert.Equal(expected, actual); - } - - [Fact] - public void TestDataContainsNotDefaultProps() - { - var initOk = true; - var operations = getOperations(); - 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; - } - } - - private WellOperationDto[] getOperations() - { - - var timezone = wellService.GetTimezone(idWell); - - DateTimeOffset GetDate(int days) - { - var date = DateTimeOffset.UtcNow.AddDays(days); - return new DateTimeOffset(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, TimeSpan.FromHours(timezone.Hours)); - } - - return new WellOperationDto[2] { - new WellOperationDto() { - Id = 5, - IdWell = idWell, - IdUser = 1, - IdType = 0, - IdWellSectionType = 1, - WellSectionTypeName = "1", - IdCategory = 1, - CategoryName = "1", - CategoryInfo = "CategoryInfo 1", - DepthStart = 10, - DepthEnd = 20, - DateStart = GetDate(days: 0), - DurationHours = 10, - Comment = "Комментарий 1", - }, - new WellOperationDto() { - Id = 6, - IdWell = idWell, - IdUser = 1, - IdType = 0, - IdWellSectionType = 2, - WellSectionTypeName = "2", - IdCategory = 2, - CategoryName = "2", - CategoryInfo = "CategoryInfo 2", - DepthStart = 20, - DepthEnd = 30, - DateStart = GetDate(days: 1), - DurationHours = 20, - Comment = "Комментарий 2", - } - }; - } - } -} diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index d624e89a..e91c9c65 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -1,13 +1,7 @@ using AsbCloudApp.Data; -using AsbCloudApp.Data.WellOperationImport; -using AsbCloudApp.Data.WellOperationImport.Options; -using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; -using AsbCloudApp.Services.WellOperationImport; -using AsbCloudDb.Model; -using AsbCloudInfrastructure; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -15,598 +9,340 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.IO; -using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Requests.ExportOptions; +using AsbCloudApp.Requests.ParserOptions; +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services.WellOperations.Factories; -namespace AsbCloudWebApi.Controllers +namespace AsbCloudWebApi.Controllers; + +/// +/// Буровые операции (вводимые вручную) +/// +[Route("api/well/{idWell}/wellOperations")] +[ApiController] +[Authorize] +public class WellOperationController : ControllerBase { - - /// - /// Буровые операции (вводимые вручную) - /// - [Route("api/well/{idWell}/wellOperations")] - [ApiController] - [Authorize] - public class WellOperationController : ControllerBase - { - private readonly IWellOperationRepository operationRepository; - private readonly IWellService wellService; - private readonly IWellOperationExportService wellOperationExportService; - private readonly IWellOperationImportTemplateService wellOperationImportTemplateService; - private readonly IWellOperationImportService wellOperationImportService; - private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; - private readonly IWellOperationExcelParser wellOperationDefaultExcelParser; - private readonly IWellOperationExcelParser wellOperationGazpromKhantosExcelParser; - private readonly IUserRepository userRepository; - - public WellOperationController(IWellOperationRepository operationRepository, - IWellService wellService, - IWellOperationImportTemplateService wellOperationImportTemplateService, - IWellOperationExportService wellOperationExportService, - IWellOperationImportService wellOperationImportService, - IWellOperationCategoryRepository wellOperationCategoryRepository, - IWellOperationExcelParser wellOperationDefaultExcelParser, - IWellOperationExcelParser wellOperationGazpromKhantosExcelParser, - IUserRepository userRepository) - { - this.operationRepository = operationRepository; - this.wellService = wellService; - this.wellOperationImportTemplateService = wellOperationImportTemplateService; - this.wellOperationExportService = wellOperationExportService; - this.wellOperationImportService = wellOperationImportService; - this.wellOperationCategoryRepository = wellOperationCategoryRepository; - this.wellOperationDefaultExcelParser = wellOperationDefaultExcelParser; - this.wellOperationGazpromKhantosExcelParser = wellOperationGazpromKhantosExcelParser; - this.userRepository = userRepository; - } - - /// - /// Возвращает словарь типов секций - /// - /// - [HttpGet("sectionTypes")] - [Permission] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public IActionResult GetSectionTypes() - { - var result = operationRepository.GetSectionTypes(); - return Ok(result); - } - - /// - /// Возвращает список имен типов операций на скважине - /// - /// флаг, нужно ли включать родителей в список - /// - [HttpGet("categories")] - [Permission] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public IActionResult GetCategories(bool includeParents = true) - { - var result = wellOperationCategoryRepository.Get(includeParents); - return Ok(result); - } - - /// - /// Возвращает список плановых операций для сопоставления - /// - /// id скважины - /// дата для нахождения последней сопоставленной плановой операции - /// - /// - [HttpGet("operationsPlan")] - [ProducesResponseType(typeof(WellOperationPlanDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetOperationsPlanAsync( - [FromRoute] int idWell, - [FromQuery] DateTime currentDate, - CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) - return Forbid(); - - var result = await operationRepository - .GetOperationsPlanAsync(idWell, currentDate, token) - .ConfigureAwait(false); - return Ok(result); - } - - /// - /// Отфильтрованный список фактических операций на скважине. - /// Если не применять фильтр, то вернется весь список. Сортированный по глубине затем по дате - /// - /// id скважины - /// - /// - /// Список операций на скважине - [HttpGet("fact")] - [Permission] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetPageOperationsFactAsync( - [FromRoute] int idWell, - [FromQuery] WellOperationRequestBase request, - CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) - return Forbid(); - - var requestToService = new WellOperationRequest(request, idWell); - var result = await operationRepository.GetAsync( - requestToService, - token) - .ConfigureAwait(false); - return Ok(result); - } - - /// - /// Отфильтрованный список плановых операций на скважине. - /// Если не применять фильтр, то вернется весь список. Сортированный по глубине затем по дате - /// - /// id скважины - /// - /// - /// Список операций на скважине в контейнере для постраничного просмотра - [HttpGet("plan")] - [Permission] - [ProducesResponseType(typeof(PaginationContainer), (int)System.Net.HttpStatusCode.OK)] - public async Task GetPageOperationsPlanAsync( - [FromRoute] int idWell, - [FromQuery] WellOperationRequestBase request, - CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) - return Forbid(); - - var requestToService = new WellOperationRequest(request, idWell); - var result = await operationRepository.GetPageAsync( - requestToService, - token) - .ConfigureAwait(false); - return Ok(result); - } - - /// - /// Статистика операций по скважине, группированная по категориям - /// - /// id скважины - /// - /// - /// - [HttpGet("groupStat")] - [Permission] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetGroupOperationsAsync( - [FromRoute] int idWell, - [FromQuery] WellOperationRequestBase request, - CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) - return Forbid(); - - var requestToService = new WellOperationRequest(request, idWell); - var result = await operationRepository.GetGroupOperationsStatAsync( - requestToService, - token) - .ConfigureAwait(false); - return Ok(result); - } - - /// - /// Возвращает нужную операцию на скважине - /// - /// id скважины - /// id нужной операции - /// Токен отмены задачи - /// Нужную операцию на скважине - [HttpGet("{idOperation}")] - [Permission] - [ProducesResponseType(typeof(WellOperationDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetOrDefaultAsync(int idWell, int idOperation, - CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) - return Forbid(); - - var result = await operationRepository.GetOrDefaultAsync(idOperation, token).ConfigureAwait(false); - return Ok(result); - } - - /// - /// Добавляет новую операцию на скважину - /// - /// Id скважины - /// Тип добавляемой операции - /// Добавляемая операция - /// - /// Количество добавленных в БД записей - [HttpPost("{idType:int}")] - [Permission] - [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] - [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - public async Task InsertAsync( - [Range(1, int.MaxValue, ErrorMessage = "Id скважины не может быть меньше 1")] int idWell, - [Range(0, 1, ErrorMessage = "Тип операции недопустим. Допустимые: 0, 1")] int idType, - WellOperationDto wellOperation, - CancellationToken cancellationToken) - { - if (!await CanUserAccessToWellAsync(idWell, cancellationToken)) - return Forbid(); - - if (!await CanUserEditWellOperationsAsync(idWell, cancellationToken)) - return Forbid(); - - wellOperation.IdWell = idWell; - wellOperation.IdUser = User.GetUserId(); - wellOperation.IdType = idType; - - var result = await operationRepository.InsertRangeAsync(new[] { wellOperation }, cancellationToken); - - return Ok(result); - } - - /// - /// Добавляет новые операции на скважине - /// - /// Id скважины - /// Добавляемые операции - /// Тип добавляемых операций - /// Удалить операции перед сохранением - /// - /// Количество добавленных в БД записей - [HttpPost("{idType:int}/{deleteBeforeInsert:bool}")] - [Permission] - [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] - [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - public async Task InsertRangeAsync( - [Range(1, int.MaxValue, ErrorMessage = "Id скважины не может быть меньше 1")] int idWell, - [Range(0, 1, ErrorMessage = "Тип операции недопустим. Допустимые: 0, 1")] int idType, - bool deleteBeforeInsert, - [FromBody] IEnumerable wellOperations, - CancellationToken cancellationToken) - { - if (!await CanUserAccessToWellAsync(idWell, cancellationToken)) - return Forbid(); - - if (!await CanUserEditWellOperationsAsync(idWell, cancellationToken)) - return Forbid(); - - if (deleteBeforeInsert) - { - var existingOperations = await operationRepository.GetAsync(new WellOperationRequest - { - IdWell = idWell, - OperationType = idType - }, cancellationToken); - - await operationRepository.DeleteAsync(existingOperations.Select(o => o.Id), cancellationToken); - } - - foreach (var wellOperation in wellOperations) - { - wellOperation.IdWell = idWell; - wellOperation.IdUser = User.GetUserId(); - wellOperation.IdType = idType; - } - - var result = await operationRepository.InsertRangeAsync(wellOperations, cancellationToken); - - return Ok(result); - } - - /// - /// Обновляет выбранную операцию на скважине - /// - /// id скважины - /// id выбранной операции - /// Новые данные для выбранной операции - /// Токен отмены задачи - /// Количество обновленных в БД строк - [HttpPut("{idOperation}")] - [Permission] - [ProducesResponseType(typeof(WellOperationDto), (int)System.Net.HttpStatusCode.OK)] - public async Task UpdateAsync(int idWell, int idOperation, - [FromBody] WellOperationDto value, CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, token)) - return Forbid(); - - if (!await CanUserEditWellOperationsAsync(idWell, token)) - return Forbid(); - - value.IdWell = idWell; - value.Id = idOperation; - value.IdUser = User.GetUserId(); - - var result = await operationRepository.UpdateAsync(value, token) - .ConfigureAwait(false); - return Ok(result); - } - - /// - /// Удаляет выбранную операцию на скважине - /// - /// id скважины - /// id выбранной операции - /// Токен отмены задачи - /// Количество удаленных из БД строк - [HttpDelete("{idOperation}")] - [Permission] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task DeleteAsync(int idWell, int idOperation, CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, token)) - return Forbid(); - - if (!await CanUserEditWellOperationsAsync(idWell, token)) - return Forbid(); - - var result = await operationRepository.DeleteAsync(new int[] { idOperation }, token) - .ConfigureAwait(false); - - return Ok(result); - } - - /// - /// Импорт фактических операций из excel (xlsx) файла. Стандартный заполненный шаблон - /// - /// id скважины - /// Коллекция из одного файла xlsx - /// Удалить операции перед сохранением - /// - /// - [HttpPost("import/fact/default/{deleteBeforeInsert:bool}")] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - [Permission] - public Task ImportFactDefaultExcelFileAsync(int idWell, - [FromForm] IFormFileCollection files, - bool deleteBeforeInsert, - CancellationToken cancellationToken) - { - var options = new WellOperationImportDefaultOptionsDto - { - IdType = WellOperation.IdOperationTypeFact - }; - - return ImportExcelFileAsync(idWell, files, options, - (stream, _) => wellOperationDefaultExcelParser.Parse(stream, options), - deleteBeforeInsert, - cancellationToken); - } - - /// - /// Импорт плановых операций из excel (xlsx) файла. Стандартный заполненный шаблон - /// - /// id скважины - /// Коллекция из одного файла xlsx - /// - /// - [HttpPost("import/plan/default")] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - [Permission] - public Task ImportPlanDefaultExcelFileAsync(int idWell, - [FromForm] IFormFileCollection files, - CancellationToken cancellationToken) - { - var options = new WellOperationImportDefaultOptionsDto - { - IdType = WellOperation.IdOperationTypePlan - }; - - return ImportExcelFileAsync(idWell, files, options, - (stream, _) => wellOperationDefaultExcelParser.Parse(stream, options), - null, - cancellationToken); - } - - /// - /// Импорт операций из excel (xlsx) файла. ГПНХ (Хантос) - /// - /// Id скважины - /// Параметры парсинга - /// Коллекция из одного файла xlsx - /// - /// - [HttpPost("import/plan/gazpromKhantos")] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - [Permission] - public Task ImportPlanGazpromKhantosExcelFileAsync(int idWell, - [FromQuery] WellOperationImportGazpromKhantosOptionsDto options, - [FromForm] IFormFileCollection files, - CancellationToken cancellationToken) - { - options.IdType = WellOperation.IdOperationTypePlan; - - return ImportExcelFileAsync(idWell, files, options, - (stream, _) => wellOperationGazpromKhantosExcelParser.Parse(stream, options), - null, - cancellationToken); - } - - /// - /// Создает excel файл с операциями по скважине - /// - /// id скважины - /// Токен отмены задачи - /// Запрашиваемый файл - [HttpGet("export")] - [Permission] - [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK, "application/octet-stream")] - [ProducesResponseType(StatusCodes.Status204NoContent)] - public async Task ExportAsync([FromRoute] int idWell, CancellationToken token) - { - int? idCompany = User.GetCompanyId(); - - if (idCompany is null) - return Forbid(); - - if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, - idWell, token).ConfigureAwait(false)) - return Forbid(); - - var stream = await wellOperationExportService.ExportAsync(idWell, token); - var fileName = await wellService.GetWellCaptionByIdAsync(idWell, token) + "_operations.xlsx"; - return File(stream, "application/octet-stream", fileName); - } - - /// - /// Создает excel файл с "сетевым графиком" - /// - /// id скважины - /// - /// Токен отмены задачи - /// Запрашиваемый файл - [HttpGet("scheduleReport")] - [Permission] - [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)] - public async Task ScheduleReportAsync([FromRoute] int idWell, [FromServices] IScheduleReportService scheduleReportService, CancellationToken token) - { - int? idCompany = User.GetCompanyId(); - - if (idCompany is null) - return Forbid(); - - if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, - idWell, token).ConfigureAwait(false)) - return Forbid(); - - var stream = await scheduleReportService.MakeReportAsync(idWell, token); - var fileName = await wellService.GetWellCaptionByIdAsync(idWell, token) + "_ScheduleReport.xlsx"; - return File(stream, "application/octet-stream", fileName); - } - - /// - /// Удаляет полые дубликаты операций - /// - /// - /// - [HttpPost("/api/well/wellOperations/RemoveDuplicates")] - [Permission] - [Obsolete] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task RemoveDuplicates(CancellationToken token) - { - var result = await operationRepository.RemoveDuplicates((_, _) => { }, token); - return Ok(result); - } - - /// - /// Удаляет полностью пересекающиеся операции или "подрезает" более поздние их по глубине и дате. - /// - /// - /// - /// - /// - [HttpPost("/api/well/wellOperations/TrimOverlapping")] - [Permission] - [Obsolete] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task TrimOverlapping(DateTimeOffset? geDate, DateTimeOffset leDate, CancellationToken token) - { - var result = await operationRepository.TrimOverlapping(geDate, leDate, (_, _) => { }, token); - return Ok(result); - } - - /// - /// Возвращает шаблон файла импорта - /// - /// Запрашиваемый файл - [HttpGet("template")] - [AllowAnonymous] - [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK, "application/octet-stream")] - public IActionResult GetTemplate() - { - var stream = wellOperationImportTemplateService.GetExcelTemplateStream(); - var fileName = "ЕЦП_шаблон_файла_операций.xlsx"; - return File(stream, "application/octet-stream", fileName); - } - - //TODO: deleteBeforeInsert тоже быстрый костыль - private async Task ImportExcelFileAsync(int idWell, [FromForm] IFormFileCollection files, - TOptions options, - Func parseMethod, - bool? deleteBeforeInsert, - CancellationToken cancellationToken) - where TOptions : IWellOperationImportOptions - { - var idCompany = User.GetCompanyId(); - var idUser = User.GetUserId(); - - if (!idCompany.HasValue || !idUser.HasValue) - throw new ForbidException("Неизвестный пользователь"); - - if (!await CanUserAccessToWellAsync(idWell, cancellationToken)) - throw new ForbidException("Нет доступа к скважине"); - - if (!await CanUserEditWellOperationsAsync(idWell, cancellationToken)) - throw new ForbidException("Недостаточно прав для редактирования ГГД на завершенной скважине"); - - if (!await wellService.IsCompanyInvolvedInWellAsync(idCompany.Value, idWell, cancellationToken)) - throw new ForbidException("Скважина недоступна для компании"); - - if (files.Count < 1) - return this.ValidationBadRequest(nameof(files), "Нет файла"); - - var file = files[0]; - if (Path.GetExtension(file.FileName).ToLower() != ".xlsx") - return this.ValidationBadRequest(nameof(files), "Требуется xlsx файл."); - - using Stream stream = file.OpenReadStream(); - - try - { - var sheet = parseMethod(stream, options); - - var wellOperations = wellOperationImportService.Import(idWell, idUser.Value, options.IdType, sheet) - .OrderBy(w => w.DateStart); - - var dateStart = wellOperations.MinOrDefault(w => w.DateStart); - - foreach (var wellOperation in wellOperations) - { - if (dateStart.HasValue) - wellOperation.Day = (wellOperation.DateStart - dateStart.Value).TotalDays; - } - - //TODO: очень быстрый костыль - if (deleteBeforeInsert is not null && options.IdType == WellOperation.IdOperationTypeFact) - { - return await InsertRangeAsync(idWell, options.IdType, - deleteBeforeInsert.Value, - wellOperations, - cancellationToken); - } - - return Ok(wellOperations); - } - catch (FileFormatException ex) - { - return this.ValidationBadRequest(nameof(files), ex.Message); - } - } - - private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token) - { - int? idCompany = User.GetCompanyId(); - return idCompany is not null && await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, - idWell, token).ConfigureAwait(false); - } - - private async Task CanUserEditWellOperationsAsync(int idWell, CancellationToken token) - { - var idUser = User.GetUserId(); - - if (!idUser.HasValue) - return false; - - var well = await wellService.GetOrDefaultAsync(idWell, token); - - if (well is null) - return false; - - return well.IdState != 2 || userRepository.HasPermission(idUser.Value, "WellOperation.editCompletedWell"); - } - } + private readonly IDictionary templateNames = new Dictionary + { + { WellOperation.IdOperationTypeFact, "ЕЦП_шаблон_файла_фактические_операции.xlsx" }, + { WellOperation.IdOperationTypePlan, "ЕЦП_шаблон_файла_плановые_операции.xlsx" } + }; + + private readonly IUserRepository userRepository; + private readonly IWellOperationRepository wellOperationRepository; + private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; + private readonly IWellService wellService; + + private readonly WellOperationParserFactory wellOperationParserFactory; + private readonly WellOperationExportServiceFactory wellOperationExportServiceFactory; + + public WellOperationController(IWellOperationRepository wellOperationRepository, + IWellOperationCategoryRepository wellOperationCategoryRepository, + IWellService wellService, + IUserRepository userRepository, + WellOperationParserFactory wellOperationParserFactory, + WellOperationExportServiceFactory wellOperationExportServiceFactory) + { + this.wellOperationRepository = wellOperationRepository; + this.wellOperationCategoryRepository = wellOperationCategoryRepository; + this.wellService = wellService; + this.userRepository = userRepository; + this.wellOperationParserFactory = wellOperationParserFactory; + this.wellOperationExportServiceFactory = wellOperationExportServiceFactory; + } + + /// + /// Добавляет новые операции на скважине + /// + /// Id скважины + /// Добавляемые операции + /// Удалить операции перед сохранением + /// + /// Количество добавленных в БД записей + [HttpPost("{deleteBeforeInsert:bool}")] + [Permission] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + public async Task InsertRangeAsync( + [Range(1, int.MaxValue, ErrorMessage = "Id скважины не может быть меньше 1")] + int idWell, + bool deleteBeforeInsert, + [FromBody] IEnumerable dtos, + CancellationToken cancellationToken) + { + if (!await CanUserAccessToWellAsync(idWell, cancellationToken)) + return Forbid(); + + if (!await CanUserEditWellOperationsAsync(idWell, cancellationToken)) + return Forbid(); + + foreach (var dto in dtos) + { + dto.IdWell = idWell; + dto.LastUpdateDate = null; + dto.IdUser = User.GetUserId(); + } + + var result = await wellOperationRepository.InsertRangeAsync(dtos, deleteBeforeInsert, cancellationToken); + + return Ok(result); + } + + /// + /// Обновляет выбранную операцию на скважине + /// + /// id скважины + /// + /// Токен отмены задачи + /// Количество обновленных в БД строк + [HttpPut] + [Permission] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + public async Task UpdateRangeAsync(int idWell, + [FromBody] IEnumerable dtos, + CancellationToken token) + { + if (!await CanUserAccessToWellAsync(idWell, token)) + return Forbid(); + + if (!await CanUserEditWellOperationsAsync(idWell, token)) + return Forbid(); + + foreach (var dto in dtos) + { + dto.IdWell = idWell; + dto.IdUser = User.GetUserId(); + dto.LastUpdateDate = DateTimeOffset.UtcNow; + } + + var result = await wellOperationRepository.UpdateRangeAsync(dtos, token); + + return Ok(result); + } + + /// + /// Возвращает словарь типов секций + /// + /// + [HttpGet("sectionTypes")] + [Permission] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public IActionResult GetSectionTypes() + { + var result = wellOperationRepository.GetSectionTypes(); + return Ok(result); + } + + /// + /// Статистика операций по скважине, группированная по категориям + /// + /// id скважины + /// + /// + /// + [HttpGet("groupStat")] + [Permission] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetGroupOperationsAsync( + [FromRoute] int idWell, + [FromQuery] WellOperationRequest request, + CancellationToken token) + { + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) + return Forbid(); + + request.IdsWell = new[] { idWell }; + var result = await wellOperationRepository.GetGroupOperationsStatAsync(request, token); + return Ok(result); + } + + /// + /// Возвращает список имен типов операций на скважине + /// + /// флаг, нужно ли включать родителей в список + /// + [HttpGet("categories")] + [Permission] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public IActionResult GetCategories(bool includeParents = true) + { + var result = wellOperationCategoryRepository.Get(includeParents); + return Ok(result); + } + + /// + /// Постраничный список операций на скважине. + /// + /// id скважины + /// + /// + /// Список операций на скважине + [HttpGet] + [Permission] + [ProducesResponseType(typeof(PaginationContainer), StatusCodes.Status200OK)] + public async Task GetPageOperationsAsync( + [FromRoute] int idWell, + [FromQuery] WellOperationRequest request, + CancellationToken token) + { + if (!await CanUserAccessToWellAsync(idWell, token)) + return Forbid(); + + request.IdsWell = new[] { idWell }; + var result = await wellOperationRepository.GetPageAsync(request, token); + return Ok(result); + } + + /// + /// Создает excel файл с "сетевым графиком" + /// + /// id скважины + /// + /// + /// Запрашиваемый файл + [HttpGet("scheduleReport")] + [Permission] + [ProducesResponseType(typeof(PhysicalFileResult), StatusCodes.Status200OK)] + public async Task ScheduleReportAsync([FromRoute] int idWell, + [FromServices] IScheduleReportService scheduleReportService, + CancellationToken token) + { + var idCompany = User.GetCompanyId(); + + if (idCompany is null) + return Forbid(); + + if (!await wellService.IsCompanyInvolvedInWellAsync(idCompany.Value, idWell, token)) + return Forbid(); + + var stream = await scheduleReportService.MakeReportAsync(idWell, token); + var fileName = await wellService.GetWellCaptionByIdAsync(idWell, token) + "_ScheduleReport.xlsx"; + return File(stream, "application/octet-stream", fileName); + } + + /// + /// Удаляет выбранную операцию на скважине + /// + /// id скважины + /// id выбранной операции + /// Токен отмены задачи + /// Количество удаленных из БД строк + [HttpDelete("{idOperation}")] + [Permission] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + public async Task DeleteAsync(int idWell, int idOperation, CancellationToken token) + { + if (!await CanUserAccessToWellAsync(idWell, token)) + return Forbid(); + + if (!await CanUserEditWellOperationsAsync(idWell, token)) + return Forbid(); + + var result = await wellOperationRepository.DeleteRangeAsync(new[] { idOperation }, token); + + return Ok(result); + } + + /// + /// Формирование excel файла с операциями на скважине + /// + /// + /// + /// + /// + [HttpGet("export")] + [ProducesResponseType(typeof(PhysicalFileResult), StatusCodes.Status200OK, "application/octet-stream")] + public async Task ExportAsync(int idWell, + int idType, + CancellationToken token) + { + var options = new WellOperationExportRequest(idWell, idType); + var exportService = wellOperationExportServiceFactory.CreateExportService(idType); + + var (fileName, file) = await exportService.ExportAsync(options, token); + + return File(file, "application/octet-stream", fileName); + } + + /// + /// Импорт ГГД из excel (xlsx) файла + /// + /// + /// + /// + /// + /// + [HttpPost("parse/{idType}")] + [Permission] + [ProducesResponseType(typeof(ParserResultDto), StatusCodes.Status200OK)] + public async Task ParseAsync(int idWell, + int idType, + [Required] IFormFile file, + CancellationToken token) + { + if (!await CanUserAccessToWellAsync(idWell, token)) + return Forbid(); + + if (!await CanUserEditWellOperationsAsync(idWell, token)) + return Forbid(); + + var stream = file.GetExcelFile(); + + try + { + var timezone = wellService.GetTimezone(idWell); + var options = new WellOperationParserRequest(idWell, idType, timezone); + var parser = wellOperationParserFactory.CreateParser(idType); + var result = parser.Parse(stream, options); + + return Ok(result); + } + catch (FileFormatException ex) + { + return this.ValidationBadRequest(nameof(file), ex.Message); + } + } + + /// + /// Получение шаблона для заполнения ГГД + /// + /// + [HttpGet("template")] + [AllowAnonymous] + [ProducesResponseType(typeof(PhysicalFileResult), StatusCodes.Status200OK, "application/octet-stream")] + [ProducesResponseType(StatusCodes.Status204NoContent)] + public IActionResult GetTemplate(int idType) + { + var parser = wellOperationParserFactory.CreateParser(idType); + var stream = parser.GetTemplateFile(); + + return File(stream, "application/octet-stream", templateNames[idType]); + } + + private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token) + { + var idCompany = User.GetCompanyId(); + return idCompany is not null && await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, + idWell, token).ConfigureAwait(false); + } + + private async Task CanUserEditWellOperationsAsync(int idWell, CancellationToken token) + { + var idUser = User.GetUserId(); + + if (!idUser.HasValue) + return false; + + var well = await wellService.GetOrDefaultAsync(idWell, token); + + if (well is null) + return false; + + return well.IdState != 2 || userRepository.HasPermission(idUser.Value, "WellOperation.editCompletedWell"); + } } \ No newline at end of file From 8ef37600c7be551ee95604b8fc8876996952f2b2 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 22 Mar 2024 17:15:11 +0500 Subject: [PATCH 23/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20ScheduleDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/ScheduleDto.cs | 4 ++-- AsbCloudInfrastructure/Repository/ScheduleRepository.cs | 9 ++++----- .../DetectOperations/DetectedOperationService.cs | 2 +- AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs | 4 ++-- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/AsbCloudApp/Data/ScheduleDto.cs b/AsbCloudApp/Data/ScheduleDto.cs index 84cbe515..a8c8d652 100644 --- a/AsbCloudApp/Data/ScheduleDto.cs +++ b/AsbCloudApp/Data/ScheduleDto.cs @@ -39,13 +39,13 @@ namespace AsbCloudApp.Data /// Начало бурения ///
[Required] - public DateTime DrillStart { get; set; } + public DateTimeOffset DrillStart { get; set; } /// /// Конец бурения /// [Required] - public DateTime DrillEnd { get; set; } + public DateTimeOffset DrillEnd { get; set; } /// /// Бурильщик diff --git a/AsbCloudInfrastructure/Repository/ScheduleRepository.cs b/AsbCloudInfrastructure/Repository/ScheduleRepository.cs index e7c2aa1f..7c7e6491 100644 --- a/AsbCloudInfrastructure/Repository/ScheduleRepository.cs +++ b/AsbCloudInfrastructure/Repository/ScheduleRepository.cs @@ -82,10 +82,9 @@ namespace AsbCloudInfrastructure.Repository protected override Schedule Convert(ScheduleDto dto) { - var hoursOffset = wellService.GetTimezone(dto.IdWell).Hours; var entity = base.Convert(dto); - entity.DrillStart = dto.DrillStart.ToUtcDateTimeOffset(hoursOffset); - entity.DrillEnd = dto.DrillEnd.ToUtcDateTimeOffset(hoursOffset); + entity.DrillStart = dto.DrillStart.ToUniversalTime(); + entity.DrillEnd = dto.DrillEnd.ToUniversalTime(); return entity; } @@ -93,8 +92,8 @@ namespace AsbCloudInfrastructure.Repository { var hoursOffset = wellService.GetTimezone(entity.IdWell).Hours; var dto = base.Convert(entity); - dto.DrillStart = entity.DrillStart.ToRemoteDateTime(hoursOffset); - dto.DrillEnd = entity.DrillEnd.ToRemoteDateTime(hoursOffset); + dto.DrillStart = entity.DrillStart.ToOffset(TimeSpan.FromHours(hoursOffset)); + dto.DrillEnd = entity.DrillEnd.ToOffset(TimeSpan.FromHours(hoursOffset)); return dto; } } diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index b53b1cd0..b645f567 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -264,7 +264,7 @@ public class DetectedOperationService : IDetectedOperationService && v.DepthStart <= dto.DepthStart && v.DepthEnd > dto.DepthStart); - var dateStart = dto.DateStart; + var dateStart = dto.DateStart.ToUniversalTime(); var timeStart = new TimeDto(dateStart); var driller = schedules.FirstOrDefault(s => s.DrillStart <= dateStart && diff --git a/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs b/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs index 58f23ccc..69473ebd 100644 --- a/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs @@ -178,8 +178,8 @@ public class DailyReportServiceTest IdWell = idWell, ShiftStart = new TimeDto(1), ShiftEnd = new TimeDto(5), - DrillStart = new DateTime(2023, 01, 26), - DrillEnd = new DateTime(2023, 12, 26), + DrillStart = new DateTimeOffset(2023, 01, 26, 0, 0, 0, TimeSpan.Zero), + DrillEnd = new DateTimeOffset(2023, 12, 26, 0, 0, 0, TimeSpan.Zero), Driller = new() { Name = "Иван", From 827e1c669480c5a6c81ab30a0b0a1ceb1253c968 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 22 Mar 2024 17:18:19 +0500 Subject: [PATCH 24/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=B0=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?TrajectoryRequest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/TrajectoryRequest.cs | 4 ++-- AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudApp/Requests/TrajectoryRequest.cs b/AsbCloudApp/Requests/TrajectoryRequest.cs index 954879bc..35eca8c3 100644 --- a/AsbCloudApp/Requests/TrajectoryRequest.cs +++ b/AsbCloudApp/Requests/TrajectoryRequest.cs @@ -15,10 +15,10 @@ public class TrajectoryRequest : RequestBase /// /// Больше или равно дате /// - public DateTime? GeDate { get; set; } + public DateTimeOffset? GeDate { get; set; } /// /// Меньше или равно дате /// - public DateTime? LeDate { get; set; } + public DateTimeOffset? LeDate { get; set; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs b/AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs index a55e465f..69c2cccc 100644 --- a/AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs +++ b/AsbCloudInfrastructure/Repository/TrajectoryNnbRepository.cs @@ -38,13 +38,13 @@ namespace AsbCloudInfrastructure.Repository if (request.GeDate.HasValue) { - var geDate = request.GeDate.Value.ToUtcDateTimeOffset(timezone.Hours); + var geDate = request.GeDate.Value.ToUniversalTime(); query = query.Where(r => r.DateTime >= geDate); } if (request.LeDate.HasValue) { - var leDate = request.LeDate.Value.ToUtcDateTimeOffset(timezone.Hours); + var leDate = request.LeDate.Value.ToUniversalTime(); query = query.Where(r => r.DateTime <= leDate); } From 86674ba263637b877b30f7c473eaf7dd280b2cd5 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 22 Mar 2024 17:22:10 +0500 Subject: [PATCH 25/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=B0=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?WellDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/WellDto.cs | 2 +- AsbCloudInfrastructure/Services/WellService.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudApp/Data/WellDto.cs b/AsbCloudApp/Data/WellDto.cs index d9a67431..368e58c9 100644 --- a/AsbCloudApp/Data/WellDto.cs +++ b/AsbCloudApp/Data/WellDto.cs @@ -67,7 +67,7 @@ namespace AsbCloudApp.Data /// /// Дата/время первой операции /// - public DateTime? StartDate { get; set; } + public DateTimeOffset? StartDate { get; set; } /// /// Дата/время кода приходили данные последний раз diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 2c579140..ac457347 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -273,7 +273,7 @@ namespace AsbCloudInfrastructure.Services if (entity.Timezone is null) dto.Timezone = GetTimezone(entity.Id); - dto.StartDate = wellOperationRepository.FirstOperationDate(entity.Id)?.ToRemoteDateTime(dto.Timezone.Hours); + dto.StartDate = wellOperationRepository.FirstOperationDate(entity.Id)?.ToOffset(TimeSpan.FromHours(dto.Timezone.Hours)); dto.WellType = entity.WellType.Caption; dto.Cluster = entity.Cluster.Caption; dto.Deposit = entity.Cluster.Deposit.Caption; From 72341e76d25d2923c87f187c922c3536939cfcf5 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 22 Mar 2024 17:59:03 +0500 Subject: [PATCH 26/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=BB=D1=8F=20ProcessMapRepor?= =?UTF-8?q?tDataSaubStatDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Report/ProcessMapReportDataSaubStatDto.cs | 2 +- .../Services/DailyReport/DailyReportService.cs | 14 ++++++++------ .../Report/ProcessMapReportDrillingService.cs | 2 +- .../Services/DailyReportServiceTest.cs | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportDataSaubStatDto.cs b/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportDataSaubStatDto.cs index 6255726f..4bf221de 100644 --- a/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportDataSaubStatDto.cs +++ b/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportDataSaubStatDto.cs @@ -44,7 +44,7 @@ public class ProcessMapReportDataSaubStatDto /// на начало интервала /// /// - public DateTime DateStart { get; set; } + public DateTimeOffset DateStart { get; set; } /// /// Режим бурения (Ротор/слайд/ручной) diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index fba35c59..a188426e 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -106,10 +106,11 @@ public class DailyReportService : IDailyReportService 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 + var offsetHours = wellService.GetTimezone(dailyReport.IdWell).Hours; + var geDate = new DateTimeOffset(dailyReport.Date, TimeOnly.MinValue, TimeSpan.FromHours(offsetHours)); + var ltDate = new DateTimeOffset(dailyReport.Date.AddDays(1), TimeOnly.MinValue, TimeSpan.FromHours(offsetHours)); + + var factOperationRequest = new WellOperationRequest { IdWell = idWell, OperationType = WellOperation.IdOperationTypeFact, @@ -369,8 +370,9 @@ 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); + var offsetHours = wellService.GetTimezone(dailyReport.IdWell).Hours; + var geDate = new DateTimeOffset(dailyReport.Date, TimeOnly.MinValue, TimeSpan.FromHours(offsetHours)); + var leDate = new DateTimeOffset(dailyReport.Date.AddDays(1), TimeOnly.MinValue, TimeSpan.FromHours(offsetHours)); var request = new DataSaubStatRequest(); dailyReport.ProcessMapWellDrillingBlock = (await processMapReportDrillingService.GetAsync(dailyReport.IdWell, request, diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs index 5ee331d4..74957d59 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs @@ -174,7 +174,7 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService var result = new ProcessMapReportDataSaubStatDto() { IdWellSectionType = wellSectionType.Id, - DateStart = firstElemInInterval.DateStart.DateTime, + DateStart = firstElemInInterval.DateStart, WellSectionTypeName = wellSectionType.Caption, DepthStart = firstElemInInterval.DepthStart, DepthEnd = lastElemInInterval.DepthEnd, diff --git a/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs b/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs index 69473ebd..ac109d7f 100644 --- a/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs @@ -113,7 +113,7 @@ public class DailyReportServiceTest private readonly ProcessMapReportDataSaubStatDto fakeProcessMapReportWellDrilling = new() { DrillingMode = "Ротор", - DateStart = new DateTime(2023, 10, 26), + DateStart = new DateTimeOffset(2023, 10, 26, 0, 0, 0, TimeSpan.Zero), DeltaDepth = 500, Rop = new PlanFactDto { From 9e4761f97beaf7ad31b47e8b82b59cfd1b8dc5d2 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 22 Mar 2024 18:00:04 +0500 Subject: [PATCH 27/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20ProcessMapReportWellDrillingDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs b/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs index 16a9749c..cee53050 100644 --- a/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs +++ b/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs @@ -44,7 +44,7 @@ public class ProcessMapReportWellDrillingDto /// на начало интервала /// /// - public DateTime DateStart { get; set; } + public DateTimeOffset DateStart { get; set; } /// /// Время мех бурения, ч From 488b8ec674817645eb061c03125653f3fd359f1d Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 25 Mar 2024 09:29:44 +0500 Subject: [PATCH 28/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20SetpointsRequestDto=20=D0=B8=20=D0=B2=D1=81=D1=91,=20?= =?UTF-8?q?=D1=87=D1=82=D0=BE=20=D1=81=20=D0=BD=D0=B8=D0=BC=20=D1=81=D0=B2?= =?UTF-8?q?=D1=8F=D0=B7=D0=B0=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/SAUB/SetpointsRequestDto.cs | 2 +- .../Repository/ScheduleRepository.cs | 11 +++++------ .../Repository/SetpointsRequestRepository.cs | 5 ++--- .../Services/SAUB/SetpointsService.cs | 1 - 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/AsbCloudApp/Data/SAUB/SetpointsRequestDto.cs b/AsbCloudApp/Data/SAUB/SetpointsRequestDto.cs index ed81c0ef..192805a6 100644 --- a/AsbCloudApp/Data/SAUB/SetpointsRequestDto.cs +++ b/AsbCloudApp/Data/SAUB/SetpointsRequestDto.cs @@ -33,7 +33,7 @@ namespace AsbCloudApp.Data.SAUB /// /// отметка времени создания запроса /// - public DateTime UploadDate { get; set; } = DateTime.Now; + public DateTimeOffset UploadDate { get; set; } = DateTimeOffset.Now; /// /// время в секундах актуальности этого запроса diff --git a/AsbCloudInfrastructure/Repository/ScheduleRepository.cs b/AsbCloudInfrastructure/Repository/ScheduleRepository.cs index 7c7e6491..781b51ee 100644 --- a/AsbCloudInfrastructure/Repository/ScheduleRepository.cs +++ b/AsbCloudInfrastructure/Repository/ScheduleRepository.cs @@ -24,7 +24,7 @@ namespace AsbCloudInfrastructure.Repository this.wellService = wellService; } - public async Task> GetAsync(int idWell, DateTime workTime, CancellationToken token) + public async Task> GetAsync(int idWell, DateTimeOffset workTime, CancellationToken token) { var entities = await BuildQuery(idWell, workTime) .AsNoTracking() @@ -33,7 +33,7 @@ namespace AsbCloudInfrastructure.Repository return entities.Select(Convert); } - public async Task GetOrDefaultDrillerAsync(int idWell, DateTime workTime, CancellationToken token) + public async Task GetOrDefaultDrillerAsync(int idWell, DateTimeOffset workTime, CancellationToken token) { var entities = await BuildQuery(idWell, workTime) .AsNoTracking() @@ -43,8 +43,7 @@ namespace AsbCloudInfrastructure.Repository return null; var hoursOffset = wellService.GetTimezone(idWell).Hours; - var remoteDate = workTime.ToUtcDateTimeOffset(hoursOffset).ToRemoteDateTime(hoursOffset); - var time = new TimeOnly(remoteDate.Hour, remoteDate.Minute, remoteDate.Second); + var time = new TimeOnly(workTime.Hour, workTime.Minute, workTime.Second); var entity = entities.FirstOrDefault(s => s.ShiftStart > s.ShiftEnd ^ @@ -69,11 +68,11 @@ namespace AsbCloudInfrastructure.Repository } - private IQueryable BuildQuery(int idWell, DateTime workTime) + private IQueryable BuildQuery(int idWell, DateTimeOffset workTime) { var hoursOffset = wellService.GetTimezone(idWell).Hours; - var workTimeDateTime = workTime.ToUtcDateTimeOffset(hoursOffset); + var workTimeDateTime = workTime.ToUniversalTime(); return GetQuery().Where(s => s.IdWell == idWell && s.DrillStart <= workTimeDateTime diff --git a/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs b/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs index 838ae15b..2c1f7905 100644 --- a/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs +++ b/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs @@ -50,15 +50,14 @@ namespace AsbCloudInfrastructure.Repository { var result = base.Convert(src); var timezoneOffsetHours = wellService.GetTimezone(src.IdWell).Hours; - result.UploadDate = src.UploadDate.ToRemoteDateTime(timezoneOffsetHours); + result.UploadDate = src.UploadDate.ToOffset(TimeSpan.FromHours(timezoneOffsetHours)); return result; } protected override SetpointsRequest Convert(SetpointsRequestDto src) { var result = base.Convert(src); - var timezoneOffsetHours = wellService.GetTimezone(src.IdWell).Hours; - result.UploadDate = src.UploadDate.ToUtcDateTimeOffset(timezoneOffsetHours); + result.UploadDate = src.UploadDate.ToUniversalTime(); return result; } } diff --git a/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs b/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs index b0f5c824..657a99c6 100644 --- a/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs @@ -72,7 +72,6 @@ namespace AsbCloudInfrastructure.Services.SAUB foreach (var item in filtered) { item.IdState = 2; - item.UploadDate = DateTime.SpecifyKind(item.UploadDate, DateTimeKind.Utc); } await setpointsRepository.UpdateRangeAsync(filtered, token); From e9386b5897e0adeea8e566d17621e6904d1ca65d 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 Mar 2024 07:33:42 +0300 Subject: [PATCH 29/52] =?UTF-8?q?=D0=A1=D0=B8=D0=BD=D1=85=D1=80=D0=BE?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B8=D0=B0=D0=BF=D0=B0=D0=B7=D0=BE?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D0=B0=D1=82=20=D0=BE=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/IWellOperationRepository.cs | 8 +++++++ .../Repository/WellOperationRepository.cs | 22 ++++++++++++++++--- .../Services/WellService.cs | 5 ++--- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/AsbCloudApp/Repositories/IWellOperationRepository.cs b/AsbCloudApp/Repositories/IWellOperationRepository.cs index ffc69970..2c2817d2 100644 --- a/AsbCloudApp/Repositories/IWellOperationRepository.cs +++ b/AsbCloudApp/Repositories/IWellOperationRepository.cs @@ -76,6 +76,14 @@ namespace AsbCloudApp.Repositories /// Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token); + /// + /// Получить диапазон дат выполнения операций + /// + /// + /// + /// + DatesRangeDto? GetDatesRange(int idWell, int idType); + /// /// Получить диапазон дат выполнения операций /// diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 7532b2aa..c40efd54 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -47,7 +47,7 @@ public class WellOperationRepository : CrudRepositoryBase e.IdType == 1 && e.IdWell == o.IdWell) .Where(e => WellOperationCategory.NonProductiveTimeSubIds.Contains(e.IdCategory)) @@ -314,6 +314,23 @@ public class WellOperationRepository : CrudRepositoryBase o.IdWell == idWell && o.IdType == idType); + + if (!query.Any()) + return null; + + var minDate = query.Min(o => o.DateStart); + var maxDate = query.Max(o => o.DateStart); + + return new DatesRangeDto + { + From = minDate.ToOffset(minDate.Offset), + To = maxDate.ToOffset(minDate.Offset) + }; + } + public async Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken) { var query = dbContext.WellOperations.Where(o => o.IdWell == idWell && o.IdType == idType); @@ -344,7 +361,6 @@ public class WellOperationRepository : CrudRepositoryBase(); dto.DateStart = src.DateStart.ToOffset(timeZoneOffset); dto.LastUpdateDate = src.LastUpdateDate?.ToOffset(timeZoneOffset); diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 1b306f15..d7c0f7d0 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -272,9 +272,8 @@ namespace AsbCloudInfrastructure.Services if (entity.Timezone is null) dto.Timezone = GetTimezone(entity.Id); - - //TODO: фикс - //dto.StartDate = wellOperationRepository.GetDatesRangeAsync(entity.Id, ).FirstOperationDate(entity.Id)?.ToRemoteDateTime(dto.Timezone.Hours); + + dto.StartDate = wellOperationRepository.GetDatesRange(entity.Id, WellOperation.IdOperationTypeFact)?.From.ToRemoteDateTime(dto.Timezone.Hours); dto.WellType = entity.WellType.Caption; dto.Cluster = entity.Cluster.Caption; dto.Deposit = entity.Cluster.Deposit.Caption; From b9b8027a53d406ec1a48b4605c6c7c6255824bbf Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 25 Mar 2024 09:34:54 +0500 Subject: [PATCH 30/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20TrajectoryGeoDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/Trajectory/TrajectoryGeoDto.cs | 2 +- .../Repository/TrajectoryEditableRepository.cs | 2 +- .../Services/Trajectory/TrajectoryExportTest.cs | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/AsbCloudApp/Data/Trajectory/TrajectoryGeoDto.cs b/AsbCloudApp/Data/Trajectory/TrajectoryGeoDto.cs index 237c20b2..11b88141 100644 --- a/AsbCloudApp/Data/Trajectory/TrajectoryGeoDto.cs +++ b/AsbCloudApp/Data/Trajectory/TrajectoryGeoDto.cs @@ -46,7 +46,7 @@ namespace AsbCloudApp.Data.Trajectory /// /// Дата загрузки /// - public DateTime UpdateDate { get; set; } + public DateTimeOffset UpdateDate { get; set; } /// /// ИД пользователя diff --git a/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs b/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs index 4c8ab283..667691b1 100644 --- a/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs +++ b/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs @@ -108,7 +108,7 @@ namespace AsbCloudInfrastructure.Repository private static Tdto Convert(TEntity entity, double offsetHours) { var dto = entity.Adapt(); - dto.UpdateDate = entity.UpdateDate.ToRemoteDateTime(offsetHours); + dto.UpdateDate = entity.UpdateDate.ToOffset(TimeSpan.FromHours(offsetHours)); return dto; } diff --git a/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs index 34d2077c..bffab69f 100644 --- a/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs +++ b/AsbCloudWebApi.Tests/Services/Trajectory/TrajectoryExportTest.cs @@ -34,7 +34,7 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory IdUser = 1, IdWell = 4, Radius = 3, - UpdateDate = DateTime.Now, + UpdateDate = DateTimeOffset.Now, VerticalDepth = 100, WellboreDepth = 100, ZenithAngle = 10 @@ -47,7 +47,7 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory IdUser = 1, IdWell = 4, Radius = 3, - UpdateDate = DateTime.Now, + UpdateDate = DateTimeOffset.Now, VerticalDepth = 100, WellboreDepth = 100, ZenithAngle = 10 @@ -62,7 +62,7 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory Comment = "комментарий", IdUser = 1, IdWell = 4, - UpdateDate = DateTime.Now, + UpdateDate = DateTimeOffset.Now, VerticalDepth = 100, WellboreDepth = 100, ZenithAngle = 10 @@ -74,7 +74,7 @@ namespace AsbCloudWebApi.Tests.Services.Trajectory Comment = "комментарий", IdUser = 1, IdWell = 4, - UpdateDate = DateTime.Now, + UpdateDate = DateTimeOffset.Now, VerticalDepth = 100, WellboreDepth = 100, ZenithAngle = 10 From 55938eadcdb30f6da571b001e45191d63896eb0c Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 25 Mar 2024 09:35:27 +0500 Subject: [PATCH 31/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20ReportPropertiesDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/ReportPropertiesDto.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AsbCloudApp/Data/ReportPropertiesDto.cs b/AsbCloudApp/Data/ReportPropertiesDto.cs index 82caa77e..f802a7e0 100644 --- a/AsbCloudApp/Data/ReportPropertiesDto.cs +++ b/AsbCloudApp/Data/ReportPropertiesDto.cs @@ -29,17 +29,17 @@ namespace AsbCloudApp.Data /// /// Дата формирования /// - public DateTime Date { get; set; } + public DateTimeOffset Date { get; set; } /// /// Дата начала рапорта /// - public DateTime Begin { get; set; } + public DateTimeOffset Begin { get; set; } /// /// Дата окончания рапорта /// - public DateTime End { get; set; } + public DateTimeOffset End { get; set; } /// /// шаг между точками диаграммы From db33e82d022b8d5cad9b14253622011c740da110 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 25 Mar 2024 09:36:57 +0500 Subject: [PATCH 32/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=B0=D1=82=20=D0=B2=D0=BD?= =?UTF-8?q?=D1=83=D1=82=D1=80=D0=B8=20DailyReportService,=20ReportService?= =?UTF-8?q?=20=D0=B8=20SheduleController?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Services/IScheduleService.cs | 4 ++-- .../Services/DailyReport/DailyReportService.cs | 8 +++----- AsbCloudInfrastructure/Services/ReportService.cs | 9 +++++---- AsbCloudWebApi/Controllers/ScheduleController.cs | 2 +- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/AsbCloudApp/Services/IScheduleService.cs b/AsbCloudApp/Services/IScheduleService.cs index 5a28b4c2..81c0d385 100644 --- a/AsbCloudApp/Services/IScheduleService.cs +++ b/AsbCloudApp/Services/IScheduleService.cs @@ -19,7 +19,7 @@ namespace AsbCloudApp.Services /// /// /// - Task> GetAsync(int idWell, DateTime workTime, CancellationToken token); + Task> GetAsync(int idWell, DateTimeOffset workTime, CancellationToken token); /// /// получить бурильщика по idWell и времени @@ -28,7 +28,7 @@ namespace AsbCloudApp.Services /// /// /// - Task GetOrDefaultDrillerAsync(int idWell, DateTime workTime, CancellationToken token); + Task GetOrDefaultDrillerAsync(int idWell, DateTimeOffset workTime, CancellationToken token); /// /// Получить расписание смен diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index a188426e..7570a95f 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -135,7 +135,7 @@ public class DailyReportService : IDailyReportService await UpdateSubsystemBlockAsync(dailyReport, cancellationToken); await AddTrajectoryBlockAsync(dailyReport, cancellationToken); - await AddScheduleBlockAsync(dailyReport, cancellationToken); + await AddScheduleBlockAsync(dailyReport, geDate, cancellationToken); await AddProcessMapWellDrillingBlockAsync(dailyReport, cancellationToken); AddFactWellOperationBlock(dailyReport, factWellOperations); @@ -315,11 +315,9 @@ public class DailyReportService : IDailyReportService }; } - private async Task AddScheduleBlockAsync(DailyReportDto dailyReport, CancellationToken cancellationToken) + private async Task AddScheduleBlockAsync(DailyReportDto dailyReport, DateTimeOffset workDate, CancellationToken cancellationToken) { - var workDate = dailyReport.Date.ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); - - dailyReport.ScheduleBlock = (await scheduleRepository.GetAsync(dailyReport.IdWell, workDate, cancellationToken)) + dailyReport.ScheduleBlock = (await scheduleRepository.GetAsync(dailyReport.IdWell, workDate, cancellationToken)) .Select(s => new ScheduleRecordDto { ShiftStart = s.ShiftStart, diff --git a/AsbCloudInfrastructure/Services/ReportService.cs b/AsbCloudInfrastructure/Services/ReportService.cs index 04d7c63b..4d321525 100644 --- a/AsbCloudInfrastructure/Services/ReportService.cs +++ b/AsbCloudInfrastructure/Services/ReportService.cs @@ -87,6 +87,7 @@ public class ReportService : IReportService public async Task> GetAllReportsByWellAsync(int idWell, CancellationToken token) { var timezoneOffset = wellService.GetTimezone(idWell).Hours; + var timeSpan = TimeSpan.FromHours(timezoneOffset); var propertiesQuery = db.ReportProperties.Include(r => r.File) .Where(p => p.IdWell == idWell) .OrderBy(o => o.File.UploadDate) @@ -106,12 +107,12 @@ public class ReportService : IReportService IdWell = p.File.IdWell, Name = p.File.Name, Size = p.File.Size, - UploadDate = p.File.UploadDate.ToOffset(TimeSpan.FromHours(timezoneOffset)), + UploadDate = p.File.UploadDate.ToOffset(timeSpan), }, IdWell = p.IdWell, - Date = p.File.UploadDate.ToRemoteDateTime(timezoneOffset), - Begin = p.Begin.ToRemoteDateTime(timezoneOffset), - End = p.End.ToRemoteDateTime(timezoneOffset), + Date = p.File.UploadDate.ToOffset(timeSpan), + Begin = p.Begin.ToOffset(timeSpan), + End = p.End.ToOffset(timeSpan), Step = p.Step, Format = p.Format == 0 ? ".pdf" : ".las" }); diff --git a/AsbCloudWebApi/Controllers/ScheduleController.cs b/AsbCloudWebApi/Controllers/ScheduleController.cs index a8c73d30..cc56a296 100644 --- a/AsbCloudWebApi/Controllers/ScheduleController.cs +++ b/AsbCloudWebApi/Controllers/ScheduleController.cs @@ -33,7 +33,7 @@ namespace AsbCloudWebApi.Controllers /// /// бурильщик [HttpGet("driller")] - public async Task> GetDrillerAsync(int idWell, DateTime workTime, CancellationToken token) + public async Task> GetDrillerAsync(int idWell, DateTimeOffset workTime, CancellationToken token) { if (!await UserHasAccesToWellAsync(idWell, token)) return Forbid(); From 15b74da498b0431e155d299cee84bb85aece4469 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 25 Mar 2024 09:45:48 +0500 Subject: [PATCH 33/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B5=D0=B9=20StatOpera?= =?UTF-8?q?tionsDto=20=D0=B8=20WellMapInfoDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/StatOperationsDto.cs | 4 ++-- AsbCloudApp/Data/WellMapInfoDto.cs | 4 ++-- .../Services/WellOperationService/OperationsStatService.cs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/AsbCloudApp/Data/StatOperationsDto.cs b/AsbCloudApp/Data/StatOperationsDto.cs index 7d082648..ec59eae0 100644 --- a/AsbCloudApp/Data/StatOperationsDto.cs +++ b/AsbCloudApp/Data/StatOperationsDto.cs @@ -11,12 +11,12 @@ namespace AsbCloudApp.Data /// /// Дата и время начала /// - public DateTime? Start { get; set; } + public DateTimeOffset? Start { get; set; } /// /// Дата и время окончания /// - public DateTime? End { get; set; } + public DateTimeOffset? End { get; set; } /// /// Глубина, м diff --git a/AsbCloudApp/Data/WellMapInfoDto.cs b/AsbCloudApp/Data/WellMapInfoDto.cs index a677a1e3..55098f4b 100644 --- a/AsbCloudApp/Data/WellMapInfoDto.cs +++ b/AsbCloudApp/Data/WellMapInfoDto.cs @@ -82,14 +82,14 @@ namespace AsbCloudApp.Data /// Дата начала первой фактической операции /// Используется как дата начала бурения /// - public DateTime? FirstFactOperationDateStart { get; set; } + public DateTimeOffset? FirstFactOperationDateStart { get; set; } /// /// Дата окончания последней прогнозируемой операции /// Если скважина завершена, то дата окончания последней фактической операции /// Используется как прогноз окончания бурения /// - public DateTime? LastPredictOperationDateEnd { get; set; } + public DateTimeOffset? LastPredictOperationDateEnd { get; set; } /// /// Рейсовая скорость проходки, последнего рейса diff --git a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs index 4bf326e7..c4463a78 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs @@ -288,8 +288,8 @@ public class OperationsStatService : IOperationsStatService var section = new StatOperationsDto { - Start = operations.FirstOrDefault()?.DateStart.ToRemoteDateTime(timezoneOffsetHours), - End = operations.Max(o => o.DateStart.ToRemoteDateTime(timezoneOffsetHours).AddHours(o.DurationHours)), + Start = operations.FirstOrDefault()?.DateStart.ToOffset(TimeSpan.FromHours(timezoneOffsetHours)), + End = operations.Max(o => o.DateStart.ToOffset(TimeSpan.FromHours(timezoneOffsetHours)).AddHours(o.DurationHours)), WellDepthStart = operations.Min(o => o.DepthStart), WellDepthEnd = operations.Max(o => o.DepthStart), Rop = CalcROP(operations), From 3def1ad101ac06bd7073a61b4cb0e0bcefa9d291 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 25 Mar 2024 09:52:34 +0500 Subject: [PATCH 34/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20TelemetryMessageDto=20=D0=B8=20TelemetryWirelineRunOut?= =?UTF-8?q?BaseDto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/SAUB/TelemetryMessageDto.cs | 2 +- AsbCloudApp/Data/SAUB/TelemetryWirelineRunOutDto.cs | 2 +- .../Repository/TelemetryWirelineRunOutRepository.cs | 5 +++-- AsbCloudInfrastructure/Services/SAUB/MessageService.cs | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/AsbCloudApp/Data/SAUB/TelemetryMessageDto.cs b/AsbCloudApp/Data/SAUB/TelemetryMessageDto.cs index 6c246f16..ee86fc46 100644 --- a/AsbCloudApp/Data/SAUB/TelemetryMessageDto.cs +++ b/AsbCloudApp/Data/SAUB/TelemetryMessageDto.cs @@ -15,7 +15,7 @@ namespace AsbCloudApp.Data.SAUB /// /// отметка времени /// - public DateTime Date { get; set; } + public DateTimeOffset Date { get; set; } /// /// глубина забоя diff --git a/AsbCloudApp/Data/SAUB/TelemetryWirelineRunOutDto.cs b/AsbCloudApp/Data/SAUB/TelemetryWirelineRunOutDto.cs index 69ac6929..213b67ec 100644 --- a/AsbCloudApp/Data/SAUB/TelemetryWirelineRunOutDto.cs +++ b/AsbCloudApp/Data/SAUB/TelemetryWirelineRunOutDto.cs @@ -10,7 +10,7 @@ namespace AsbCloudApp.Data.SAUB /// /// отметка времени /// - public DateTime DateTime { get; set; } + public DateTimeOffset DateTime { get; set; } /// /// Наработка талевого каната с момента перетяжки каната, т*км diff --git a/AsbCloudInfrastructure/Repository/TelemetryWirelineRunOutRepository.cs b/AsbCloudInfrastructure/Repository/TelemetryWirelineRunOutRepository.cs index 81427cf6..ed1f02cf 100644 --- a/AsbCloudInfrastructure/Repository/TelemetryWirelineRunOutRepository.cs +++ b/AsbCloudInfrastructure/Repository/TelemetryWirelineRunOutRepository.cs @@ -5,6 +5,7 @@ using AsbCloudApp.Services; using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -93,14 +94,14 @@ namespace AsbCloudInfrastructure.Repository { var entity = dto.Adapt(); entity.IdTelemetry = idTelemetry; - entity.DateTime = dto.DateTime.ToUtcDateTimeOffset(timezoneOffset); + entity.DateTime = dto.DateTime.ToOffset(TimeSpan.FromHours(timezoneOffset)); return entity; } private static TelemetryWirelineRunOutDto Convert(TelemetryWirelineRunOut entity, WellDto well, double timezoneOffset) { var dto = entity.Adapt(); - dto.DateTime = entity.DateTime.ToRemoteDateTime(timezoneOffset); + dto.DateTime = entity.DateTime.ToOffset(TimeSpan.FromHours(timezoneOffset)); dto.WellInfo = well; return dto; } diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index 10b71093..d728536a 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -150,7 +150,7 @@ namespace AsbCloudInfrastructure.Services.SAUB var entity = dto.Adapt(); entity.Id = 0; entity.IdTelemetry = telemetry.Id; - entity.DateTime = dto.Date.ToUtcDateTimeOffset(timezone.Hours); + entity.DateTime = dto.Date.ToOffset(TimeSpan.FromHours(timezone.Hours)); db.TelemetryMessages.Add(entity); } From b5f71b9816b80e1630cb9a5766c45017a6de081c Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 25 Mar 2024 10:04:06 +0500 Subject: [PATCH 35/52] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=B0=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20WellOperationPlanDto=20=D0=B8=20=D0=B2=D1=81=D1=91,=20?= =?UTF-8?q?=D1=87=D1=82=D0=BE=20=D1=81=20=D0=BD=D0=B8=D0=BC=20=D1=81=D0=B2?= =?UTF-8?q?=D1=8F=D0=B7=D0=B0=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/WellOperationPlanDto.cs | 2 +- AsbCloudApp/Repositories/IWellOperationRepository.cs | 2 +- .../Repository/WellOperationRepository.cs | 10 +++++----- AsbCloudWebApi/Controllers/WellOperationController.cs | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/AsbCloudApp/Data/WellOperationPlanDto.cs b/AsbCloudApp/Data/WellOperationPlanDto.cs index 5c1bac9f..365e06f3 100644 --- a/AsbCloudApp/Data/WellOperationPlanDto.cs +++ b/AsbCloudApp/Data/WellOperationPlanDto.cs @@ -21,7 +21,7 @@ namespace AsbCloudApp.Data /// /// дата последней сопоставленной плановой операции /// - public DateTime? DateLastAssosiatedPlanOperation { get; set; } + public DateTimeOffset? DateLastAssosiatedPlanOperation { get; set; } } diff --git a/AsbCloudApp/Repositories/IWellOperationRepository.cs b/AsbCloudApp/Repositories/IWellOperationRepository.cs index dd39ce52..25550557 100644 --- a/AsbCloudApp/Repositories/IWellOperationRepository.cs +++ b/AsbCloudApp/Repositories/IWellOperationRepository.cs @@ -25,7 +25,7 @@ namespace AsbCloudApp.Repositories /// /// /// - Task GetOperationsPlanAsync(int idWell, DateTime? currentDate, CancellationToken token); + Task GetOperationsPlanAsync(int idWell, DateTimeOffset? currentDate, CancellationToken token); /// /// дата/время первой операции по скважине diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 1c3f6fdc..4e494c77 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -43,7 +43,7 @@ public class WellOperationRepository : IWellOperationRepository .OrderBy(s => s.Order) .Select(s => s.Adapt()); - public async Task GetOperationsPlanAsync(int idWell, DateTime? currentDate, CancellationToken token) + public async Task GetOperationsPlanAsync(int idWell, DateTimeOffset? currentDate, CancellationToken token) { var timezone = wellService.GetTimezone(idWell); var request = new WellOperationRequest() @@ -67,16 +67,16 @@ public class WellOperationRepository : IWellOperationRepository return result; } - private async Task GetDateLastAssosiatedPlanOperationAsync( + private async Task GetDateLastAssosiatedPlanOperationAsync( int idWell, - DateTime? lessThenDate, + DateTimeOffset? lessThenDate, double timeZoneHours, CancellationToken token) { if (lessThenDate is null) return null; - var currentDateOffset = lessThenDate.Value.ToUtcDateTimeOffset(timeZoneHours); + var currentDateOffset = lessThenDate.Value.ToUniversalTime(); var timeZoneOffset = TimeSpan.FromHours(timeZoneHours); var lastFactOperation = await db.WellOperations @@ -90,7 +90,7 @@ public class WellOperationRepository : IWellOperationRepository .ConfigureAwait(false); if (lastFactOperation is not null) - return DateTime.SpecifyKind(lastFactOperation.OperationPlan!.DateStart.UtcDateTime + timeZoneOffset, DateTimeKind.Unspecified); + return lastFactOperation.OperationPlan!.DateStart; return null; } diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index d624e89a..2f2f805b 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -99,7 +99,7 @@ namespace AsbCloudWebApi.Controllers [ProducesResponseType(typeof(WellOperationPlanDto), (int)System.Net.HttpStatusCode.OK)] public async Task GetOperationsPlanAsync( [FromRoute] int idWell, - [FromQuery] DateTime currentDate, + [FromQuery] DateTimeOffset currentDate, CancellationToken token) { if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) From 09be968972c1b4998232153b786d6e852f4297f9 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 25 Mar 2024 10:10:40 +0500 Subject: [PATCH 36/52] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=D0=BE=D0=B2=20=D0=B4=D0=B0=D1=82=20=D0=B2=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=D1=85=20=D0=B2=D0=BD=D1=83?= =?UTF-8?q?=D1=82=D1=80=D0=B8=20FileRepository=20=D0=B8=20TrajectoryEditab?= =?UTF-8?q?leRepository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/SubsystemRequest.cs | 2 +- AsbCloudInfrastructure/Repository/FileRepository.cs | 4 ++-- .../Repository/TrajectoryEditableRepository.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudApp/Requests/SubsystemRequest.cs b/AsbCloudApp/Requests/SubsystemRequest.cs index 23a7e70a..08b980ab 100644 --- a/AsbCloudApp/Requests/SubsystemRequest.cs +++ b/AsbCloudApp/Requests/SubsystemRequest.cs @@ -9,7 +9,7 @@ namespace AsbCloudApp.Requests /// public class SubsystemRequest: RequestBase, IValidatableObject { - private static readonly DateTime validationMinDate = new DateTime(2020,01,01,0,0,0,DateTimeKind.Utc); + private static readonly DateTimeOffset validationMinDate = new DateTimeOffset(2020,01,01,0,0,0, TimeSpan.Zero); /// /// идентификатор скважины diff --git a/AsbCloudInfrastructure/Repository/FileRepository.cs b/AsbCloudInfrastructure/Repository/FileRepository.cs index c4560116..2a203879 100644 --- a/AsbCloudInfrastructure/Repository/FileRepository.cs +++ b/AsbCloudInfrastructure/Repository/FileRepository.cs @@ -184,7 +184,7 @@ namespace AsbCloudInfrastructure.Repository var newFileMark = fileMarkDto.Adapt(); newFileMark.Id = default; - newFileMark.DateCreated = DateTime.UtcNow; + newFileMark.DateCreated = DateTimeOffset.UtcNow; newFileMark.IdUser = idUser; newFileMark.User = null!; @@ -244,7 +244,7 @@ namespace AsbCloudInfrastructure.Repository IdAuthor = newItem.IdAuthor, IdCategory = newItem.IdCategory, Name = newItem.Name, - UploadDate = DateTime.UtcNow, + UploadDate = DateTimeOffset.UtcNow, IsDeleted = false, Size = newItem.Size, }; diff --git a/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs b/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs index 667691b1..94c50ebf 100644 --- a/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs +++ b/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs @@ -115,7 +115,7 @@ namespace AsbCloudInfrastructure.Repository private static TEntity Convert(Tdto dto, double offsetHours) { var entity = dto.Adapt(); - entity.UpdateDate = DateTime.Now.ToUtcDateTimeOffset(offsetHours); + entity.UpdateDate = DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(offsetHours)); return entity; } } From 3b7e3092f5f4b83ff6ea780f1a0eacaad21ccf3a Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 25 Mar 2024 16:08:59 +0500 Subject: [PATCH 37/52] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=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 --- AsbCloudApp/Requests/ProcessMapPlanRequest.cs | 2 +- .../AsbCloudDbContextModelSnapshot.cs | 16004 ++++++++-------- .../Repository/FileRepository.cs | 3 - .../Repository/ScheduleRepository.cs | 6 +- .../TelemetryWirelineRunOutRepository.cs | 2 +- .../TrajectoryEditableRepository.cs | 13 +- .../Repository/WellOperationRepository.cs | 10 +- .../DailyReport/DailyReportService.cs | 48 +- .../Services/SAUB/TelemetryDataBaseService.cs | 2 +- .../Services/SAUB/TelemetryDataCache.cs | 4 +- .../OperationsStatService.cs | 2 +- 11 files changed, 8044 insertions(+), 8052 deletions(-) diff --git a/AsbCloudApp/Requests/ProcessMapPlanRequest.cs b/AsbCloudApp/Requests/ProcessMapPlanRequest.cs index 6a7fa14b..b3247ce2 100644 --- a/AsbCloudApp/Requests/ProcessMapPlanRequest.cs +++ b/AsbCloudApp/Requests/ProcessMapPlanRequest.cs @@ -20,5 +20,5 @@ public class ProcessMapPlanRequest /// /// Дата обновления /// - public DateTimeKind? UpdateFrom { get; set; } + public DateTimeOffset? UpdateFrom { get; set; } } \ No newline at end of file diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 9c6590fb..d3d74c7c 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -26,9300 +26,9300 @@ namespace AsbCloudDb.Migrations NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); - b.Property("IdDeposit") - .HasColumnType("integer") - .HasColumnName("id_deposit"); + b.Property("IdDeposit") + .HasColumnType("integer") + .HasColumnName("id_deposit"); - b.Property("Latitude") - .HasColumnType("double precision") - .HasColumnName("latitude"); + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); - b.Property("Longitude") - .HasColumnType("double precision") - .HasColumnName("longitude"); + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); - b.Property("Timezone") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("timezone") - .HasComment("Смещение часового пояса от UTC"); + b.Property("Timezone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdDeposit"); + b.HasIndex("IdDeposit"); - b.ToTable("t_cluster"); + b.ToTable("t_cluster"); - b.HasComment("Кусты"); - }); + b.HasComment("Кусты"); + }); modelBuilder.Entity("AsbCloudDb.Model.Company", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption"); + 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.Property("IdCompanyType") + .HasMaxLength(255) + .HasColumnType("integer") + .HasColumnName("id_company_type") + .HasComment("вид деятельности"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdCompanyType"); + b.HasIndex("IdCompanyType"); - b.ToTable("t_company"); + b.ToTable("t_company"); - b.HasData( - new - { - Id = 1, - Caption = "ООО \"АСБ\"", - IdCompanyType = 3 - }); - }); + b.HasData( + new + { + Id = 1, + Caption = "ООО \"АСБ\"", + IdCompanyType = 3 + }); + }); modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption"); + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); - b.Property("IsContact") - .HasColumnType("boolean") - .HasColumnName("is_contact"); + b.Property("IsContact") + .HasColumnType("boolean") + .HasColumnName("is_contact"); - b.Property("Order") - .HasColumnType("integer") - .HasColumnName("order"); + b.Property("Order") + .HasColumnType("integer") + .HasColumnName("order"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("t_company_type"); + 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 - }); - }); + 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"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Company") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("company") - .HasComment("компания"); + 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("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("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("IdCompanyType") + .HasMaxLength(255) + .HasColumnType("integer") + .HasColumnName("id_company_type") + .HasComment("вид деятельности"); - b.Property("IdWell") - .HasMaxLength(255) - .HasColumnType("integer") - .HasColumnName("id_well") - .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("Phone") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("phone") + .HasComment("номер телефона"); - b.Property("Position") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("position") - .HasComment("должность"); + b.Property("Position") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("position") + .HasComment("должность"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdCompanyType"); + b.HasIndex("IdCompanyType"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.ToTable("t_contact"); + b.ToTable("t_contact"); - b.HasComment("Контакты"); - }); + b.HasComment("Контакты"); + }); modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Date") - .HasColumnType("date") - .HasColumnName("date") - .HasComment("Дата формирования отчёта"); + b.Property("Date") + .HasColumnType("date") + .HasColumnName("date") + .HasComment("Дата формирования отчёта"); - b.Property("DateLastUpdate") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_last_update") - .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("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); - b.Property("SignBlock") - .HasColumnType("jsonb") - .HasColumnName("sign_block") - .HasComment("Подпись"); + b.Property("SignBlock") + .HasColumnType("jsonb") + .HasColumnName("sign_block") + .HasComment("Подпись"); - b.Property("SubsystemBlock") - .HasColumnType("jsonb") - .HasColumnName("subsystem_block") - .HasComment("Наработкой подсистем"); + b.Property("SubsystemBlock") + .HasColumnType("jsonb") + .HasColumnName("subsystem_block") + .HasComment("Наработкой подсистем"); - b.Property("TimeBalanceBlock") - .HasColumnType("jsonb") - .HasColumnName("time_balance_block") - .HasComment("Баланс времени"); + b.Property("TimeBalanceBlock") + .HasColumnType("jsonb") + .HasColumnName("time_balance_block") + .HasComment("Баланс времени"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdWell", "Date") - .IsUnique(); + b.HasIndex("IdWell", "Date") + .IsUnique(); - b.ToTable("t_daily_report"); + b.ToTable("t_daily_report"); - b.HasComment("Ежедневные отчёты"); - }); + b.HasComment("Ежедневные отчёты"); + }); modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("AxialLoad") - .HasColumnType("double precision") - .HasColumnName("axial_load") - .HasComment("Фактическая нагрузка"); + b.Property("AxialLoad") + .HasColumnType("double precision") + .HasColumnName("axial_load") + .HasComment("Фактическая нагрузка"); - b.Property("AxialLoadLimitMax") - .HasColumnType("double precision") - .HasColumnName("axial_load_limit_max") - .HasComment("Максимально допустимая нагрузка"); + b.Property("AxialLoadLimitMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_limit_max") + .HasComment("Максимально допустимая нагрузка"); - b.Property("AxialLoadSp") - .HasColumnType("double precision") - .HasColumnName("axial_load_sp") - .HasComment("Ограничение факт. нагрузки"); + b.Property("AxialLoadSp") + .HasColumnType("double precision") + .HasColumnName("axial_load_sp") + .HasComment("Ограничение факт. нагрузки"); - b.Property("BlockSpeedSp") - .HasColumnType("double precision") - .HasColumnName("block_speed_sp") - .HasComment("Ограничение скорости блока"); + b.Property("BlockSpeedSp") + .HasColumnType("double precision") + .HasColumnName("block_speed_sp") + .HasComment("Ограничение скорости блока"); - b.Property("DateEnd") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_end") - .HasComment("Дата и время окончания"); + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("Дата и время окончания"); - b.Property("DateStart") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_start") - .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("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина забоя по стволу конечная"); - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Глубина забоя по стволу начальная"); + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина забоя по стволу начальная"); - b.Property("EnabledSubsystems") - .HasColumnType("integer") - .HasColumnName("enabled_subsystems") - .HasComment("Флаги подсистем"); + b.Property("EnabledSubsystems") + .HasColumnType("integer") + .HasColumnName("enabled_subsystems") + .HasComment("Флаги подсистем"); - b.Property("Flow") - .HasColumnType("double precision") - .HasColumnName("flow") - .HasComment("Фактический расход"); + b.Property("Flow") + .HasColumnType("double precision") + .HasColumnName("flow") + .HasComment("Фактический расход"); - b.Property("HasOscillation") - .HasColumnType("boolean") - .HasColumnName("has_oscillation") - .HasComment("Наличие или отсутствие осцилляции"); + b.Property("HasOscillation") + .HasColumnType("boolean") + .HasColumnName("has_oscillation") + .HasComment("Наличие или отсутствие осцилляции"); - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("Название автоопределённой операции"); + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Название автоопределённой операции"); - b.Property("IdFeedRegulator") - .HasColumnType("smallint") - .HasColumnName("id_feed_regulator") - .HasComment("Работа при достижении ограничения"); + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator") + .HasComment("Работа при достижении ограничения"); - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry") - .HasComment("Ключ телеметрии"); + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Ключ телеметрии"); - b.Property("Pressure") - .HasColumnType("double precision") - .HasColumnName("pressure") - .HasComment("Давление"); + b.Property("Pressure") + .HasColumnType("double precision") + .HasColumnName("pressure") + .HasComment("Давление"); - b.Property("PressureIdle") - .HasColumnType("double precision") - .HasColumnName("pressure_idle") - .HasComment("Давление холостого хода"); + b.Property("PressureIdle") + .HasColumnType("double precision") + .HasColumnName("pressure_idle") + .HasComment("Давление холостого хода"); - b.Property("PressureSp") - .HasColumnType("double precision") - .HasColumnName("pressure_sp") - .HasComment("Ограничение фактического давления"); + b.Property("PressureSp") + .HasColumnType("double precision") + .HasColumnName("pressure_sp") + .HasComment("Ограничение фактического давления"); - b.Property("RotorSpeed") - .HasColumnType("double precision") - .HasColumnName("rotor_speed") - .HasComment("Фактическая скорость оборотов ВСП"); + b.Property("RotorSpeed") + .HasColumnType("double precision") + .HasColumnName("rotor_speed") + .HasComment("Фактическая скорость оборотов ВСП"); - b.Property("RotorTorque") - .HasColumnType("double precision") - .HasColumnName("rotor_torque") - .HasComment("Фактический момент"); + b.Property("RotorTorque") + .HasColumnType("double precision") + .HasColumnName("rotor_torque") + .HasComment("Фактический момент"); - b.Property("RotorTorqueLimitMax") - .HasColumnType("double precision") - .HasColumnName("rotor_torque_limit_max") - .HasComment("Максимально допустимый момент"); + b.Property("RotorTorqueLimitMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_limit_max") + .HasComment("Максимально допустимый момент"); - b.Property("RotorTorqueSp") - .HasColumnType("double precision") - .HasColumnName("rotor_torque_sp") - .HasComment("Ограничение факт. момента"); + b.Property("RotorTorqueSp") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_sp") + .HasComment("Ограничение факт. момента"); - b.Property("Speed") - .HasColumnType("double precision") - .HasColumnName("speed") - .HasComment("Скорость бурения"); + b.Property("Speed") + .HasColumnType("double precision") + .HasColumnName("speed") + .HasComment("Скорость бурения"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdCategory"); + b.HasIndex("IdCategory"); - b.HasIndex("IdTelemetry"); + b.HasIndex("IdTelemetry"); - b.ToTable("t_data_saub_stat"); + b.ToTable("t_data_saub_stat"); - b.HasComment("Кеш-таблица для хранения данных для РТК-отчета"); - }); + b.HasComment("Кеш-таблица для хранения данных для РТК-отчета"); + }); modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption"); + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); - b.Property("Latitude") - .HasColumnType("double precision") - .HasColumnName("latitude"); + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); - b.Property("Longitude") - .HasColumnType("double precision") - .HasColumnName("longitude"); + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); - b.Property("Timezone") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("timezone") - .HasComment("Смещение часового пояса от UTC"); + b.Property("Timezone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("t_deposit"); + b.ToTable("t_deposit"); - b.HasComment("Месторождение"); - }); + b.HasComment("Месторождение"); + }); modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("DateEnd") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_end") - .HasComment("Дата начала операции"); + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("Дата начала операции"); - b.Property("DateStart") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_start") - .HasComment("Дата начала операции"); + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("Дата начала операции"); - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Глубина после завершения операции, м"); + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина после завершения операции, м"); - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Глубина на начало операции, м"); + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина на начало операции, м"); - b.Property("EnabledSubsystems") - .HasColumnType("integer") - .HasColumnName("enabled_subsystems") - .HasComment("флаги включенных подсистем"); + b.Property("EnabledSubsystems") + .HasColumnType("integer") + .HasColumnName("enabled_subsystems") + .HasComment("флаги включенных подсистем"); - b.Property("ExtraData") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("extra_data") - .HasComment("доп. инфо по операции"); + b.Property("ExtraData") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("extra_data") + .HasComment("доп. инфо по операции"); - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("Id категории операции"); + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); - b.Property("IdUsersAtStart") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("Id пользователя по телеметрии на момент начала операции"); + b.Property("IdUsersAtStart") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя по телеметрии на момент начала операции"); - b.Property("Value") - .HasColumnType("double precision") - .HasColumnName("value") - .HasComment("Ключевой показатель операции"); + b.Property("Value") + .HasColumnType("double precision") + .HasColumnName("value") + .HasComment("Ключевой показатель операции"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdCategory"); + b.HasIndex("IdCategory"); - b.HasIndex("IdTelemetry"); + b.HasIndex("IdTelemetry"); - b.ToTable("t_detected_operation"); + b.ToTable("t_detected_operation"); - b.HasComment("автоматически определенные операции по телеметрии"); - }); + b.HasComment("автоматически определенные операции по телеметрии"); + }); modelBuilder.Entity("AsbCloudDb.Model.Driller", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name") - .HasComment("Имя"); + 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("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("Отчество"); - b.Property("Surname") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("surname") - .HasComment("Фамилия"); + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("Фамилия"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("t_driller"); + b.ToTable("t_driller"); - b.HasComment("Бурильщик"); - }); + b.HasComment("Бурильщик"); + }); modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("IdFileCategory") - .HasColumnType("integer") - .HasColumnName("id_file_category"); + b.Property("IdFileCategory") + .HasColumnType("integer") + .HasColumnName("id_file_category"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well"); + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdFileCategory"); + b.HasIndex("IdFileCategory"); - b.HasIndex("IdWell", "IdFileCategory") - .IsUnique(); + b.HasIndex("IdWell", "IdFileCategory") + .IsUnique(); - b.ToTable("t_drilling_program_part"); + b.ToTable("t_drilling_program_part"); - b.HasComment("части программ бурения"); - }); + b.HasComment("части программ бурения"); + }); modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => - { - b.Property("Id") - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry") - .HasComment("Идентификатор телеметрии"); + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Идентификатор телеметрии"); - b.Property("DepthStart") - .HasColumnType("real") - .HasColumnName("depthStart") - .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("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.Property("TimeStampStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("timestamp_start") + .HasComment("Время начала"); - b.HasKey("Id", "IdTelemetry"); + b.HasKey("Id", "IdTelemetry"); - b.HasIndex("IdTelemetry"); + b.HasIndex("IdTelemetry"); - b.ToTable("t_drill_test"); + b.ToTable("t_drill_test"); - b.HasComment("Drill_test"); - }); + b.HasComment("Drill_test"); + }); modelBuilder.Entity("AsbCloudDb.Model.Faq", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Answer") - .HasColumnType("text") - .HasColumnName("answer") - .HasComment("Текст ответа"); + b.Property("Answer") + .HasColumnType("text") + .HasColumnName("answer") + .HasComment("Текст ответа"); - b.Property("CounterQuestion") - .HasColumnType("integer") - .HasColumnName("counter_question") - .HasComment("Счетчик повторений вопроса"); + b.Property("CounterQuestion") + .HasColumnType("integer") + .HasColumnName("counter_question") + .HasComment("Счетчик повторений вопроса"); - b.Property("DateAnswer") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_answer") - .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("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("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("IdAuthorAnswer") + .HasColumnType("integer") + .HasColumnName("id_author_answer") + .HasComment("id автора ответа"); - b.Property("IdAuthorQuestion") - .HasColumnType("integer") - .HasColumnName("id_author_question") - .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("IdReplacementQuestion") + .HasColumnType("integer") + .HasColumnName("id_replacement_question") + .HasComment("Ключ заменяющего вопроса"); - b.Property("IsFrequently") - .HasColumnType("boolean") - .HasColumnName("is_frequently") - .HasComment("Частый вопрос"); + b.Property("IsFrequently") + .HasColumnType("boolean") + .HasColumnName("is_frequently") + .HasComment("Частый вопрос"); - b.Property("Question") - .IsRequired() - .HasColumnType("text") - .HasColumnName("question") - .HasComment("Текст вопроса"); + b.Property("Question") + .IsRequired() + .HasColumnType("text") + .HasColumnName("question") + .HasComment("Текст вопроса"); - b.Property("State") - .HasColumnType("integer") - .HasColumnName("state") - .HasComment("Статус вопроса"); + b.Property("State") + .HasColumnType("integer") + .HasColumnName("state") + .HasComment("Статус вопроса"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdAuthorAnswer"); + b.HasIndex("IdAuthorAnswer"); - b.HasIndex("IdAuthorQuestion"); + b.HasIndex("IdAuthorQuestion"); - b.ToTable("t_faq"); + b.ToTable("t_faq"); - b.HasComment("вопросы пользователей"); - }); + b.HasComment("вопросы пользователей"); + }); modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название категории"); + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); - b.Property("ShortName") - .HasColumnType("text") - .HasColumnName("short_name") - .HasComment("Короткое название категории"); + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("t_file_category"); + b.ToTable("t_file_category"); - b.HasComment("Категории файлов"); + 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 = "Инструкции" - }); - }); + 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"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("IdAuthor") - .HasColumnType("integer") - .HasColumnName("id_author") - .HasComment("Id пользователя, загрузившего файл"); + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("id категории файла"); + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории файла"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("id скважины"); + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted") - .HasComment("Удален ли файл"); + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Удален ли файл"); - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название файла"); + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название файла"); - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("file_size") - .HasComment("Размер файла"); + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("file_size") + .HasComment("Размер файла"); - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdAuthor"); + b.HasIndex("IdAuthor"); - b.HasIndex("IdCategory"); + b.HasIndex("IdCategory"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.ToTable("t_file_info"); + b.ToTable("t_file_info"); - b.HasComment("Файлы всех категорий"); - }); + b.HasComment("Файлы всех категорий"); + }); modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Comment") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("comment") - .HasComment("Комментарий"); + 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("DateCreated") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_created") + .HasComment("Дата совершенного действия"); - b.Property("IdFile") - .HasColumnType("integer") - .HasColumnName("id_file") - .HasComment("id файла"); + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла"); - b.Property("IdMarkType") - .HasColumnType("integer") - .HasColumnName("id_mark_type") - .HasComment("0 - отклонен, 1 - согласован"); + b.Property("IdMarkType") + .HasColumnType("integer") + .HasColumnName("id_mark_type") + .HasComment("0 - отклонен, 1 - согласован"); - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("id пользователя"); + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("id пользователя"); - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted") - .HasComment("Помечен ли файл как удаленный"); + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Помечен ли файл как удаленный"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdFile"); + b.HasIndex("IdFile"); - b.HasIndex("IdUser"); + b.HasIndex("IdUser"); - b.ToTable("t_file_mark"); + b.ToTable("t_file_mark"); - b.HasComment("Действия с файлами."); - }); + b.HasComment("Действия с файлами."); + }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); - b.Property("IdRecord") - .HasColumnType("integer") - .HasColumnName("id_record"); + b.Property("IdRecord") + .HasColumnType("integer") + .HasColumnName("id_record"); - b.Property("IdItem") - .HasColumnType("integer") - .HasColumnName("id_item"); + b.Property("IdItem") + .HasColumnType("integer") + .HasColumnName("id_item"); - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); - b.Property("Value") - .HasColumnType("real") - .HasColumnName("value"); + b.Property("Value") + .HasColumnType("real") + .HasColumnName("value"); - b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); + b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_float"); + b.ToTable("t_wits_float"); - b.HasComment("таблица данных ГТИ с типом значения float"); - }); + b.HasComment("таблица данных ГТИ с типом значения float"); + }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); - b.Property("IdRecord") - .HasColumnType("integer") - .HasColumnName("id_record"); + b.Property("IdRecord") + .HasColumnType("integer") + .HasColumnName("id_record"); - b.Property("IdItem") - .HasColumnType("integer") - .HasColumnName("id_item"); + b.Property("IdItem") + .HasColumnType("integer") + .HasColumnName("id_item"); - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); - b.Property("Value") - .HasColumnType("integer") - .HasColumnName("value"); + b.Property("Value") + .HasColumnType("integer") + .HasColumnName("value"); - b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); + b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_int"); + b.ToTable("t_wits_int"); - b.HasComment("таблица данных ГТИ с типом значения int"); - }); + b.HasComment("таблица данных ГТИ с типом значения int"); + }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); - b.Property("IdRecord") - .HasColumnType("integer") - .HasColumnName("id_record"); + b.Property("IdRecord") + .HasColumnType("integer") + .HasColumnName("id_record"); - b.Property("IdItem") - .HasColumnType("integer") - .HasColumnName("id_item"); + b.Property("IdItem") + .HasColumnType("integer") + .HasColumnName("id_item"); - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); - b.Property("Value") - .IsRequired() - .HasColumnType("text") - .HasColumnName("value"); + b.Property("Value") + .IsRequired() + .HasColumnType("text") + .HasColumnName("value"); - b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); + b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_string"); + b.ToTable("t_wits_string"); - b.HasComment("таблица данных ГТИ с типом значения string"); - }); + b.HasComment("таблица данных ГТИ с типом значения string"); + }); modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("Id категории файла"); + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории файла"); - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название файла"); + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название файла"); - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("file_size") - .HasComment("Размер файла"); + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("file_size") + .HasComment("Размер файла"); - b.Property("UrlPage") - .IsRequired() - .HasColumnType("text") - .HasColumnName("url_page") - .HasComment("Url страницы"); + b.Property("UrlPage") + .IsRequired() + .HasColumnType("text") + .HasColumnName("url_page") + .HasComment("Url страницы"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdCategory"); + b.HasIndex("IdCategory"); - b.ToTable("t_help_page"); + b.ToTable("t_help_page"); - b.HasComment("Справки"); - }); + b.HasComment("Справки"); + }); modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("DateEnd") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_end"); + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end"); - b.Property("DateStart") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_start"); + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start"); - b.Property("DepthEnd") - .HasColumnType("real") - .HasColumnName("depth_end"); + b.Property("DepthEnd") + .HasColumnType("real") + .HasColumnName("depth_end"); - b.Property("DepthStart") - .HasColumnType("real") - .HasColumnName("depth_start"); + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depth_start"); - b.Property("IdFeedRegulator") - .HasColumnType("smallint") - .HasColumnName("id_feed_regulator"); + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator"); - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdTelemetry"); + b.HasIndex("IdTelemetry"); - b.ToTable("t_limiting_parameter"); + b.ToTable("t_limiting_parameter"); - b.HasComment("Ограничения по параметрам телеметрии"); - }); + b.HasComment("Ограничения по параметрам телеметрии"); + }); modelBuilder.Entity("AsbCloudDb.Model.Manuals.Manual", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("DateDownload") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_download") - .HasComment("Дата загрузки"); + b.Property("DateDownload") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_download") + .HasComment("Дата загрузки"); - b.Property("IdAuthor") - .HasColumnType("integer") - .HasColumnName("id_author") - .HasComment("Id автора"); + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id автора"); - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("Id категории файла"); + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории файла"); - b.Property("IdDirectory") - .HasColumnType("integer") - .HasColumnName("id_directory") - .HasComment("Id директории"); + b.Property("IdDirectory") + .HasColumnType("integer") + .HasColumnName("id_directory") + .HasComment("Id директории"); - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название"); + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdAuthor"); + b.HasIndex("IdAuthor"); - b.HasIndex("IdCategory"); + b.HasIndex("IdCategory"); - b.HasIndex("IdDirectory"); + b.HasIndex("IdDirectory"); - b.ToTable("t_manual"); + b.ToTable("t_manual"); - b.HasComment("Инструкции"); - }); + b.HasComment("Инструкции"); + }); modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("IdParent") - .HasColumnType("integer") - .HasColumnName("id_parent") - .HasComment("Id родительской директории"); + b.Property("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("Id родительской директории"); - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название"); + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdParent"); + b.HasIndex("IdParent"); - b.ToTable("t_manual_directory"); + b.ToTable("t_manual_directory"); - b.HasComment("Директория для инструкций"); - }); + b.HasComment("Директория для инструкций"); + }); modelBuilder.Entity("AsbCloudDb.Model.Measure", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Data") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("data") - .HasComment("Данные таблицы последних данных"); + b.Property("Data") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("data") + .HasComment("Данные таблицы последних данных"); - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("id категории"); + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("id скважины"); + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted") - .HasComment("Пометка удаленным"); + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Пометка удаленным"); - b.Property("Timestamp") - .HasColumnType("timestamp with time zone") - .HasColumnName("timestamp") - .HasComment("время добавления"); + b.Property("Timestamp") + .HasColumnType("timestamp with time zone") + .HasColumnName("timestamp") + .HasComment("время добавления"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdCategory"); + b.HasIndex("IdCategory"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.ToTable("t_measure"); + b.ToTable("t_measure"); - b.HasComment("Таблица c данными для вкладки 'Последние данные'"); - }); + b.HasComment("Таблица c данными для вкладки 'Последние данные'"); + }); modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название категории"); + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); - b.Property("ShortName") - .HasColumnType("text") - .HasColumnName("short_name") - .HasComment("Короткое название категории"); + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("t_measure_category"); + b.ToTable("t_measure_category"); - b.HasComment("Категория последних данных"); + b.HasComment("Категория последних данных"); - b.HasData( - new - { - Id = 1, - Name = "Показатели бурового раствора", - ShortName = "Раствор" - }, - new - { - Id = 2, - Name = "Шламограмма", - ShortName = "Шламограмма" - }, - new - { - Id = 3, - Name = "ННБ", - ShortName = "ННБ" - }); - }); + 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"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("IdNotificationCategory") - .HasColumnType("integer") - .HasColumnName("id_notification_category") - .HasComment("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("IdTransportType") + .HasColumnType("integer") + .HasColumnName("id_transport_type") + .HasComment("Id типа доставки уведомления"); - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("Id получателя"); + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id получателя"); - b.Property("Message") - .IsRequired() - .HasColumnType("text") - .HasColumnName("message") - .HasComment("Сообщение уведомления"); + b.Property("Message") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message") + .HasComment("Сообщение уведомления"); - b.Property("ReadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("read_date") - .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("RegistrationDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("registration_date") + .HasComment("Дата регистрации уведомления"); - b.Property("SentDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("sent_date") - .HasComment("Дата отправки уведомления"); + b.Property("SentDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("sent_date") + .HasComment("Дата отправки уведомления"); - b.Property("Title") - .IsRequired() - .HasColumnType("text") - .HasColumnName("title") - .HasComment("Заголовок уведомления"); + b.Property("Title") + .IsRequired() + .HasColumnType("text") + .HasColumnName("title") + .HasComment("Заголовок уведомления"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdNotificationCategory"); + b.HasIndex("IdNotificationCategory"); - b.HasIndex("IdUser"); + b.HasIndex("IdUser"); - b.ToTable("t_notification"); + b.ToTable("t_notification"); - b.HasComment("Уведомления"); - }); + b.HasComment("Уведомления"); + }); modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name"); + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("t_notification_category"); + b.ToTable("t_notification_category"); - b.HasComment("Категории уведомлений"); + b.HasComment("Категории уведомлений"); - b.HasData( - new - { - Id = 1, - Name = "Системные уведомления" - }); - }); + b.HasData( + new + { + Id = 1, + Name = "Системные уведомления" + }); + }); modelBuilder.Entity("AsbCloudDb.Model.OperationValue", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Конечная глубина"); + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина"); - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Старотовая глубина"); + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Старотовая глубина"); - b.Property("IdOperationCategory") - .HasColumnType("integer") - .HasColumnName("id_operation_category") - .HasComment("Ид категории операции"); + b.Property("IdOperationCategory") + .HasColumnType("integer") + .HasColumnName("id_operation_category") + .HasComment("Ид категории операции"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Ид скважины"); + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Ид скважины"); - b.Property("StandardValue") - .HasColumnType("double precision") - .HasColumnName("standard_value") - .HasComment("Нормативный показатель"); + b.Property("StandardValue") + .HasColumnType("double precision") + .HasColumnName("standard_value") + .HasComment("Нормативный показатель"); - b.Property("TargetValue") - .HasColumnType("double precision") - .HasColumnName("target_value") - .HasComment("Целевой показатель"); + b.Property("TargetValue") + .HasColumnType("double precision") + .HasColumnName("target_value") + .HasComment("Целевой показатель"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdOperationCategory"); + b.HasIndex("IdOperationCategory"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.ToTable("t_operationvalue"); + b.ToTable("t_operationvalue"); - b.HasComment("Целевые/нормативные показатели операции"); - }); + b.HasComment("Целевые/нормативные показатели операции"); + }); modelBuilder.Entity("AsbCloudDb.Model.Permission", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Description") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("description") - .HasComment("Краткое описание"); + 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.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("t_permission"); + b.ToTable("t_permission"); - b.HasComment("Разрешения на доступ к данным"); + 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" - }); - }); + b.HasData( + new + { + Id = 100, + Description = "Разрешение удалять админ. Кусты", + Name = "AdminCluster.delete" + }, + new + { + Id = 101, + Description = "Разрешение редактировать админ. Кусты", + Name = "AdminCluster.edit" + }, + new + { + Id = 102, + Description = "Разрешение просматривать админ. Кусты", + Name = "AdminCluster.get" + }, + new + { + Id = 103, + Description = "Разрешение удалять админ. Компании", + Name = "AdminCompany.delete" + }, + new + { + Id = 104, + Description = "Разрешение редактировать админ. Компании", + Name = "AdminCompany.edit" + }, + new + { + Id = 105, + Description = "Разрешение просматривать админ. Компании", + Name = "AdminCompany.get" + }, + new + { + Id = 106, + Description = "Разрешение удалять админ. Типы компаний", + Name = "AdminCompanyType.delete" + }, + new + { + Id = 107, + Description = "Разрешение редактировать админ. Типы компаний", + Name = "AdminCompanyType.edit" + }, + new + { + Id = 108, + Description = "Разрешение просматривать админ. Типы компаний", + Name = "AdminCompanyType.get" + }, + new + { + Id = 109, + Description = "Разрешение удалять админ. Месторождения", + Name = "AdminDeposit.delete" + }, + new + { + Id = 110, + Description = "Разрешение редактировать админ. Месторождения", + Name = "AdminDeposit.edit" + }, + new + { + Id = 111, + Description = "Разрешение просматривать админ. Месторождения", + Name = "AdminDeposit.get" + }, + new + { + Id = 112, + Description = "Разрешение удалять админ. Разрешения", + Name = "AdminPermission.delete" + }, + new + { + Id = 113, + Description = "Разрешение редактировать админ. Разрешения", + Name = "AdminPermission.edit" + }, + new + { + Id = 114, + Description = "Разрешение просматривать админ. Разрешения", + Name = "AdminPermission.get" + }, + new + { + Id = 115, + Description = "Разрешение удалять админ. Телеметрию", + Name = "AdminTelemetry.delete" + }, + new + { + Id = 116, + Description = "Разрешение редактировать админ. Телеметрию", + Name = "AdminTelemetry.edit" + }, + new + { + Id = 117, + Description = "Разрешение просматривать админ. Телеметрию", + Name = "AdminTelemetry.get" + }, + new + { + Id = 118, + Description = "Разрешение удалять админ. Пользователей", + Name = "AdminUser.delete" + }, + new + { + Id = 119, + Description = "Разрешение редактировать админ. Пользователей", + Name = "AdminUser.edit" + }, + new + { + Id = 120, + Description = "Разрешение просматривать админ. Пользователей", + Name = "AdminUser.get" + }, + new + { + Id = 121, + Description = "Разрешение удалять админ. Роли пользователей", + Name = "AdminUserRole.delete" + }, + new + { + Id = 122, + Description = "Разрешение редактировать админ. Роли пользователей", + Name = "AdminUserRole.edit" + }, + new + { + Id = 123, + Description = "Разрешение просматривать админ. Роли пользователей", + Name = "AdminUserRole.get" + }, + new + { + Id = 124, + Description = "Разрешение удалять админ. Скважины", + Name = "AdminWell.delete" + }, + new + { + Id = 125, + Description = "Разрешение редактировать админ. Скважины", + Name = "AdminWell.edit" + }, + new + { + Id = 126, + Description = "Разрешение просматривать админ. Скважины", + Name = "AdminWell.get" + }, + new + { + Id = 127, + Description = "Разрешение удалять админ. Подсистемы", + Name = "AdminSubsytem.delete" + }, + new + { + Id = 128, + Description = "Разрешение редактировать админ. Подсистемы", + Name = "AdminSubsytem.edit" + }, + new + { + Id = 129, + Description = "Разрешение просматривать админ. Подсистемы", + Name = "AdminSubsytem.get" + }, + new + { + Id = 200, + Description = "Разрешение редактировать 0", + Name = "Auth.edit" + }, + new + { + Id = 201, + Description = "Разрешение просматривать 0", + Name = "Auth.get" + }, + new + { + Id = 202, + Description = "Разрешение просматривать Кусты", + Name = "Cluster.get" + }, + new + { + Id = 203, + Description = "Разрешение просматривать Месторождения", + Name = "Deposit.get" + }, + new + { + Id = 204, + Description = "Разрешение удалять РТК", + Name = "DrillFlowChart.delete" + }, + new + { + Id = 205, + Description = "Разрешение редактировать РТК", + Name = "DrillFlowChart.edit" + }, + new + { + Id = 206, + Description = "Разрешение просматривать РТК", + Name = "DrillFlowChart.get" + }, + new + { + Id = 207, + Description = "Разрешение удалять Программу бурения", + Name = "DrillingProgram.delete" + }, + new + { + Id = 208, + Description = "Разрешение редактировать Программу бурения", + Name = "DrillingProgram.edit" + }, + new + { + Id = 209, + Description = "Разрешение просматривать Программу бурения", + Name = "DrillingProgram.get" + }, + new + { + Id = 210, + Description = "Разрешение удалять Режимы бурения", + Name = "DrillParams.delete" + }, + new + { + Id = 211, + Description = "Разрешение редактировать Режимы бурения", + Name = "DrillParams.edit" + }, + new + { + Id = 212, + Description = "Разрешение просматривать Режимы бурения", + Name = "DrillParams.get" + }, + new + { + Id = 213, + Description = "Разрешение удалять Файлы", + Name = "File.delete" + }, + new + { + Id = 214, + Description = "Разрешение редактировать Файлы", + Name = "File.edit" + }, + new + { + Id = 215, + Description = "Разрешение просматривать Файлы", + Name = "File.get" + }, + new + { + Id = 216, + Description = "Разрешение удалять Измерения", + Name = "Measure.delete" + }, + new + { + Id = 217, + Description = "Разрешение редактировать Измерения", + Name = "Measure.edit" + }, + new + { + Id = 218, + Description = "Разрешение просматривать Измерения", + Name = "Measure.get" + }, + new + { + Id = 219, + Description = "Разрешение просматривать Сообщения телеметрии", + Name = "Message.get" + }, + new + { + Id = 220, + Description = "Разрешение просматривать Статистику по операциям", + Name = "OperationStat.get" + }, + new + { + Id = 221, + Description = "Разрешение редактировать Рапорта", + Name = "Report.edit" + }, + new + { + Id = 222, + Description = "Разрешение просматривать Рапорта", + Name = "Report.get" + }, + new + { + Id = 223, + Description = "Разрешение просматривать админ. Системная статистика", + Name = "RequestTracker.get" + }, + new + { + Id = 224, + Description = "Разрешение удалять Рекомендации уставок", + Name = "Setpoints.delete" + }, + new + { + Id = 225, + Description = "Разрешение редактировать Рекомендации уставок", + Name = "Setpoints.edit" + }, + new + { + Id = 226, + Description = "Разрешение просматривать Рекомендации уставок", + Name = "Setpoints.get" + }, + new + { + Id = 227, + Description = "Разрешение редактировать Телеметрии", + Name = "Telemetry.edit" + }, + new + { + Id = 228, + Description = "Разрешение просматривать Анализ телеметрии", + Name = "TelemetryAnalytics.get" + }, + new + { + Id = 229, + Description = "Разрешение редактировать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.edit" + }, + new + { + Id = 230, + Description = "Разрешение просматривать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.get" + }, + new + { + Id = 231, + Description = "Разрешение редактировать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.edit" + }, + new + { + Id = 232, + Description = "Разрешение просматривать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.get" + }, + new + { + Id = 233, + Description = "Разрешение редактировать Скважины", + Name = "Well.edit" + }, + new + { + Id = 234, + Description = "Разрешение просматривать Скважины", + Name = "Well.get" + }, + new + { + Id = 235, + Description = "Разрешение редактировать Композитные скважины", + Name = "WellComposite.edit" + }, + new + { + Id = 236, + Description = "Разрешение просматривать Композитные скважины", + Name = "WellComposite.get" + }, + new + { + Id = 237, + Description = "Разрешение удалять Операции по скважинам", + Name = "WellOperation.delete" + }, + new + { + Id = 238, + Description = "Разрешение редактировать Операции по скважинам", + Name = "WellOperation.edit" + }, + new + { + Id = 239, + Description = "Разрешение просматривать Операции по скважинам", + Name = "WellOperation.get" + }, + new + { + Id = 240, + Description = "Разрешение редактировать Файлы категории 1 (Растворный сервис)", + Name = "File.edit1" + }, + new + { + Id = 241, + Description = "Разрешение редактировать Файлы категории 2 (Цементирование)", + Name = "File.edit2" + }, + new + { + Id = 242, + Description = "Разрешение редактировать Файлы категории 3 (ННБ)", + Name = "File.edit3" + }, + new + { + Id = 243, + Description = "Разрешение редактировать Файлы категории 4 (ГТИ)", + Name = "File.edit4" + }, + new + { + Id = 244, + Description = "Разрешение редактировать Файлы категории 5 (Документы по скважине)", + Name = "File.edit5" + }, + new + { + Id = 245, + Description = "Разрешение редактировать Файлы категории 6 (Супервайзер)", + Name = "File.edit6" + }, + new + { + Id = 246, + Description = "Разрешение редактировать Файлы категории 7 (Мастер)", + Name = "File.edit7" + }, + new + { + Id = 247, + Description = "Разрешение редактировать Файлы категории 8 (Долотный сервис)", + Name = "File.edit8" + }, + new + { + Id = 248, + Description = "Разрешение редактировать Файлы категории 9 (Буровой подрядчик)", + Name = "File.edit9" + }, + new + { + Id = 249, + Description = "Разрешение редактировать Файлы категории 10 (Сервис по заканчиванию скважины)", + Name = "File.edit10" + }, + new + { + Id = 250, + Description = "Разрешение редактировать Файлы категории 11 (Рапорт)", + Name = "File.edit11" + }, + new + { + Id = 251, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit12" + }, + new + { + Id = 252, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit13" + }, + new + { + Id = 253, + Description = "Разрешение редактировать Файлы категории 13", + Name = "File.edit14" + }, + new + { + Id = 254, + Description = "Разрешение редактировать Файлы категории 14", + Name = "File.edit15" + }, + new + { + Id = 255, + Description = "Разрешение редактировать Файлы категории 15", + Name = "File.edit16" + }, + new + { + Id = 256, + Description = "Разрешение редактировать Файлы категории 16", + Name = "File.edit17" + }, + new + { + Id = 257, + Description = "Разрешение редактировать Файлы категории 17", + Name = "File.edit18" + }, + new + { + Id = 258, + Description = "Разрешение редактировать Файлы категории 18", + Name = "File.edit19" + }, + new + { + Id = 259, + Description = "Разрешение редактировать Файлы категории 19", + Name = "File.edit20" + }, + new + { + Id = 260, + Description = "Разрешение редактировать Файлы категории 20", + Name = "File.edit21" + }, + new + { + Id = 261, + Description = "Разрешение редактировать Файлы категории 21", + Name = "File.edit22" + }, + new + { + Id = 262, + Description = "Разрешение редактировать Файлы категории 22", + Name = "File.edit23" + }, + new + { + Id = 263, + Description = "Разрешение редактировать Файлы категории 23", + Name = "File.edit24" + }, + new + { + Id = 264, + Description = "Разрешение редактировать Файлы категории 24", + Name = "File.edit25" + }, + new + { + Id = 265, + Description = "Разрешение редактировать Файлы категории 25", + Name = "File.edit26" + }, + new + { + Id = 266, + Description = "Разрешение редактировать Файлы категории 26", + Name = "File.edit27" + }, + new + { + Id = 267, + Description = "Разрешение редактировать Файлы категории 27", + Name = "File.edit28" + }, + new + { + Id = 268, + Description = "Разрешение редактировать Файлы категории 28", + Name = "File.edit29" + }, + new + { + Id = 269, + Description = "Разрешение редактировать Файлы категории 29", + Name = "File.edit30" + }, + new + { + Id = 380, + Description = "Разрешение просматривать список бурильщиков", + Name = "Driller.get" + }, + new + { + Id = 381, + Description = "Разрешение редактировать бурильщика", + Name = "Driller.edit" + }, + new + { + Id = 382, + Description = "Разрешение удалять бурильщик", + Name = "Driller.delete" + }, + new + { + Id = 383, + Description = "Разрешение просматривать графики бурильщиков", + Name = "Schedule.get" + }, + new + { + Id = 384, + Description = "Разрешение редактировать график бурильщика", + Name = "Schedule.edit" + }, + new + { + Id = 385, + Description = "Разрешение удалять график бурильщика", + Name = "Schedule.delete" + }, + new + { + Id = 386, + Description = "Разрешение просматривать суточный рапорт", + Name = "DailyReport.get" + }, + new + { + Id = 387, + Description = "Разрешение редактировать суточный рапорт", + Name = "DailyReport.edit" + }, + new + { + Id = 388, + Description = "Разрешение просматривать авто. определенные операции", + Name = "DetectedOperation.get" + }, + new + { + Id = 389, + Description = "Разрешение просматривать целевые значения", + Name = "OperationValue.get" + }, + new + { + Id = 390, + Description = "Разрешение редактировать целевые значения", + Name = "OperationValue.edit" + }, + new + { + Id = 391, + Description = "Разрешение удалять целевые значения", + Name = "OperationValue.delete" + }, + new + { + Id = 400, + Description = "Разрешение просматривать инфо по wits параметрам", + Name = "WitsInfo.get" + }, + new + { + Id = 401, + Description = "Разрешение просматривать WITS record 1", + Name = "WitsRecord1.get" + }, + new + { + Id = 407, + Description = "Разрешение просматривать WITS record 7", + Name = "WitsRecord7.get" + }, + new + { + Id = 408, + Description = "Разрешение просматривать WITS record 8", + Name = "WitsRecord8.get" + }, + new + { + Id = 450, + Description = "Разрешение просматривать WITS record 50", + Name = "WitsRecord50.get" + }, + new + { + Id = 460, + Description = "Разрешение просматривать WITS record 60", + Name = "WitsRecord60.get" + }, + new + { + Id = 461, + Description = "Разрешение просматривать WITS record 61", + Name = "WitsRecord61.get" + }, + new + { + Id = 500, + Description = "Разрешение удалять Категорий документов файлов", + Name = "FileCategory.delete" + }, + new + { + Id = 501, + Description = "Разрешение редактировать Категорий документов файлов", + Name = "FileCategory.edit" + }, + new + { + Id = 502, + Description = "Разрешение просматривать Категорий документов файлов", + Name = "FileCategory.get" + }, + new + { + Id = 503, + Description = "Разрешение удалять Дело скважины", + Name = "WellFinalDocuments.delete" + }, + new + { + Id = 504, + Description = "Разрешение редактировать Дело скважины", + Name = "WellFinalDocuments.edit" + }, + new + { + Id = 505, + Description = "Разрешение просматривать Дело скважины", + Name = "WellFinalDocuments.get" + }, + new + { + Id = 506, + Description = "Разрешение редактировать ответственных за загрузку файла Дело скважины", + Name = "WellFinalDocuments.editPublisher" + }, + new + { + Id = 507, + Description = "Разрешение просматривать наработка талевого каната", + Name = "TelemetryWirelineRunOut.get" + }, + new + { + Id = 510, + Description = "Разрешение просматривать плановая траектория", + Name = "PlannedTrajectory.get" + }, + new + { + Id = 511, + Description = "Разрешение редактировать плановая траектория", + Name = "PlannedTrajectory.edit" + }, + new + { + Id = 512, + Description = "Разрешение удалять плановая траектория", + Name = "PlannedTrajectory.delete" + }, + new + { + Id = 516, + Description = "Разрешение просматривать статистику вопросов", + Name = "FaqStatistics.get" + }, + new + { + Id = 517, + Description = "Разрешение редактировать вопрос", + Name = "FaqStatistics.edit" + }, + new + { + Id = 518, + Description = "Разрешение удалять вопрос", + Name = "FaqStatistics.delete" + }, + new + { + Id = 519, + Description = "Разрешение просматривать список контактов", + Name = "WellContact.get" + }, + new + { + Id = 520, + Description = "Разрешение редактировать список контактов", + Name = "WellContact.edit" + }, + new + { + Id = 521, + Description = "Разрешить создание справок по страницам", + Name = "HelpPage.edit" + }, + new + { + Id = 522, + Description = "Разрешить удаление всех настроек пользователя", + Name = "UserSettings.delete" + }, + new + { + Id = 523, + Description = "Разрешить редактирование инструкций", + Name = "Manual.edit" + }, + new + { + Id = 524, + Description = "Разрешить получение инструкций", + Name = "Manual.get" + }, + new + { + Id = 525, + Description = "Разрешение на редактирование РТК у завершенной скважины", + Name = "ProcessMap.editCompletedWell" + }, + new + { + Id = 526, + Description = "Разрешение на редактирование операций у завершенной скважины", + Name = "WellOperation.editCompletedWell" + }, + new + { + Id = 527, + Description = "Разрешение на удаление инструкций", + Name = "Manual.delete" + }, + new + { + Id = 528, + Description = "Разрешение на удаление контакта", + Name = "WellContact.delete" + }, + new + { + Id = 530, + Description = "Разрешение на редактирование плановой конструкции скважины", + Name = "WellSectionPlan.edit" + }, + new + { + Id = 531, + Description = "Разрешение на удаление плановой конструкции скважины", + Name = "WellSectionPlan.delete" + }); + }); modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("AxialLoadLimitMax") - .HasColumnType("double precision") - .HasColumnName("axial_load_limit_max") - .HasComment("Осевая нагрузка, т, допустимый максимум"); + 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("AxialLoadPlan") + .HasColumnType("double precision") + .HasColumnName("axial_load_plan") + .HasComment("Осевая нагрузка, т, план"); - b.Property("Comment") - .IsRequired() - .HasMaxLength(1024) - .HasColumnType("character varying(1024)") - .HasColumnName("comment") - .HasComment("Комментарий"); + b.Property("Comment") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .HasColumnName("comment") + .HasComment("Комментарий"); - b.Property("Creation") - .HasColumnType("timestamp with time zone") - .HasColumnName("creation") - .HasComment("дата создания"); + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .HasComment("дата создания"); - b.Property("DeltaPressureLimitMax") - .HasColumnType("double precision") - .HasColumnName("delta_pressure_limit_max") - .HasComment("Перепад давления, атм, допустимый максимум"); + b.Property("DeltaPressureLimitMax") + .HasColumnType("double precision") + .HasColumnName("delta_pressure_limit_max") + .HasComment("Перепад давления, атм, допустимый максимум"); - b.Property("DeltaPressurePlan") - .HasColumnType("double precision") - .HasColumnName("delta_pressure_plan") - .HasComment("Перепад давления, атм, план"); + b.Property("DeltaPressurePlan") + .HasColumnType("double precision") + .HasColumnName("delta_pressure_plan") + .HasComment("Перепад давления, атм, план"); - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Глубина по стволу до, м"); + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина по стволу до, м"); - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Глубина по стволу от, м"); + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина по стволу от, м"); - b.Property("FlowLimitMax") - .HasColumnType("double precision") - .HasColumnName("flow_limit_max") - .HasComment("Расход, л/с, допустимый максимум"); + b.Property("FlowLimitMax") + .HasColumnType("double precision") + .HasColumnName("flow_limit_max") + .HasComment("Расход, л/с, допустимый максимум"); - b.Property("FlowPlan") - .HasColumnType("double precision") - .HasColumnName("flow_plan") - .HasComment("Расход, л/с, план"); + b.Property("FlowPlan") + .HasColumnType("double precision") + .HasColumnName("flow_plan") + .HasComment("Расход, л/с, план"); - b.Property("IdAuthor") - .HasColumnType("integer") - .HasColumnName("id_author") - .HasComment("Автор"); + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Автор"); - b.Property("IdEditor") - .HasColumnType("integer") - .HasColumnName("id_editor") - .HasComment("Редактор"); + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); - b.Property("IdMode") - .HasColumnType("integer") - .HasColumnName("id_mode") - .HasComment("Id режима (1- ротор, 2 слайд)"); + b.Property("IdMode") + .HasColumnType("integer") + .HasColumnName("id_mode") + .HasComment("Id режима (1- ротор, 2 слайд)"); - b.Property("IdPrevious") - .HasColumnType("integer") - .HasColumnName("id_previous") - .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + b.Property("IdPrevious") + .HasColumnType("integer") + .HasColumnName("id_previous") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); - b.Property("IdState") - .HasColumnType("integer") - .HasColumnName("id_state") - .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины"); + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); - b.Property("IdWellSectionType") - .HasColumnType("integer") - .HasColumnName("id_wellsection_type") - .HasComment("Тип секции"); + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); - b.Property("Obsolete") - .HasColumnType("timestamp with time zone") - .HasColumnName("obsolete") - .HasComment("дата устаревания"); + b.Property("Obsolete") + .HasColumnType("timestamp with time zone") + .HasColumnName("obsolete") + .HasComment("дата устаревания"); - b.Property("RopPlan") - .HasColumnType("double precision") - .HasColumnName("rop_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("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("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("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("TopDriveTorquePlan") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_plan") + .HasComment("Момент на ВСП, план"); - b.Property("UsageSaub") - .HasColumnType("double precision") - .HasColumnName("usage_saub") - .HasComment("Плановый процент использования АКБ"); + b.Property("UsageSaub") + .HasColumnType("double precision") + .HasColumnName("usage_saub") + .HasComment("Плановый процент использования АКБ"); - b.Property("UsageSpin") - .HasColumnType("double precision") - .HasColumnName("usage_spin") - .HasComment("Плановый процент использования spin master"); + b.Property("UsageSpin") + .HasColumnType("double precision") + .HasColumnName("usage_spin") + .HasComment("Плановый процент использования spin master"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdAuthor"); + b.HasIndex("IdAuthor"); - b.HasIndex("IdEditor"); + b.HasIndex("IdEditor"); - b.HasIndex("IdPrevious"); + b.HasIndex("IdPrevious"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.HasIndex("IdWellSectionType"); + b.HasIndex("IdWellSectionType"); - b.ToTable("t_process_map_plan_drilling"); + b.ToTable("t_process_map_plan_drilling"); - b.HasComment("РТК план бурение"); - }); + b.HasComment("РТК план бурение"); + }); modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Creation") - .HasColumnType("timestamp with time zone") - .HasColumnName("creation") - .HasComment("дата создания"); + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .HasComment("дата создания"); - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Глубина по стволу до, м"); + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина по стволу до, м"); - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Глубина по стволу от, м"); + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина по стволу от, м"); - b.Property("IdAuthor") - .HasColumnType("integer") - .HasColumnName("id_author") - .HasComment("Автор"); + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Автор"); - b.Property("IdEditor") - .HasColumnType("integer") - .HasColumnName("id_editor") - .HasComment("Редактор"); + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); - b.Property("IdPrevious") - .HasColumnType("integer") - .HasColumnName("id_previous") - .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + b.Property("IdPrevious") + .HasColumnType("integer") + .HasColumnName("id_previous") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); - b.Property("IdState") - .HasColumnType("integer") - .HasColumnName("id_state") - .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины"); + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); - b.Property("IdWellSectionType") - .HasColumnType("integer") - .HasColumnName("id_wellsection_type") - .HasComment("Тип секции"); + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); - b.Property("Obsolete") - .HasColumnType("timestamp with time zone") - .HasColumnName("obsolete") - .HasComment("дата устаревания"); + b.Property("Obsolete") + .HasColumnType("timestamp with time zone") + .HasColumnName("obsolete") + .HasComment("дата устаревания"); - b.Property("Pressure") - .HasColumnType("double precision") - .HasColumnName("pressure") - .HasComment("Давление, атм"); + b.Property("Pressure") + .HasColumnType("double precision") + .HasColumnName("pressure") + .HasComment("Давление, атм"); - b.Property("Repeats") - .HasColumnType("double precision") - .HasColumnName("repeats") - .HasComment("Количество повторений"); + b.Property("Repeats") + .HasColumnType("double precision") + .HasColumnName("repeats") + .HasComment("Количество повторений"); - b.Property("SetpointDrag") - .HasColumnType("double precision") - .HasColumnName("setpoint_drag") - .HasComment("Уставка зятяжки, т"); + b.Property("SetpointDrag") + .HasColumnType("double precision") + .HasColumnName("setpoint_drag") + .HasComment("Уставка зятяжки, т"); - b.Property("SetpointTight") - .HasColumnType("double precision") - .HasColumnName("setpoint_tight") - .HasComment("Уставка посадки, т"); + b.Property("SetpointTight") + .HasColumnType("double precision") + .HasColumnName("setpoint_tight") + .HasComment("Уставка посадки, т"); - b.Property("SpeedDownward") - .HasColumnType("double precision") - .HasColumnName("speed_downward") - .HasComment("Скорость спуска, м/ч"); + b.Property("SpeedDownward") + .HasColumnType("double precision") + .HasColumnName("speed_downward") + .HasComment("Скорость спуска, м/ч"); - b.Property("SpeedUpward") - .HasColumnType("double precision") - .HasColumnName("speed_upward") - .HasComment("Скорость подъёма, м/ч"); + b.Property("SpeedUpward") + .HasColumnType("double precision") + .HasColumnName("speed_upward") + .HasComment("Скорость подъёма, м/ч"); - b.Property("SpinDownward") - .HasColumnType("double precision") - .HasColumnName("spin_downward") - .HasComment("Вращение при движении вниз, об/мин"); + b.Property("SpinDownward") + .HasColumnType("double precision") + .HasColumnName("spin_downward") + .HasComment("Вращение при движении вниз, об/мин"); - b.Property("SpinUpward") - .HasColumnType("double precision") - .HasColumnName("spin_upward") - .HasComment("Вращение при движении вверх, об/мин"); + b.Property("SpinUpward") + .HasColumnType("double precision") + .HasColumnName("spin_upward") + .HasComment("Вращение при движении вверх, об/мин"); - b.Property("Torque") - .HasColumnType("double precision") - .HasColumnName("torque") - .HasComment("Момент, кН*м"); + b.Property("Torque") + .HasColumnType("double precision") + .HasColumnName("torque") + .HasComment("Момент, кН*м"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdAuthor"); + b.HasIndex("IdAuthor"); - b.HasIndex("IdEditor"); + b.HasIndex("IdEditor"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.HasIndex("IdWellSectionType"); + b.HasIndex("IdWellSectionType"); - b.ToTable("t_process_map_plan_ream"); + b.ToTable("t_process_map_plan_ream"); - b.HasComment("РТК проработка скважины"); - }); + b.HasComment("РТК проработка скважины"); + }); modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => - { - b.Property("IdCompany") - .HasColumnType("integer") - .HasColumnName("id_company"); + { + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well"); + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); - b.HasKey("IdCompany", "IdWell"); + b.HasKey("IdCompany", "IdWell"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.ToTable("t_relation_company_well"); + b.ToTable("t_relation_company_well"); - b.HasComment("отношение скважин и компаний"); - }); + b.HasComment("отношение скважин и компаний"); + }); modelBuilder.Entity("AsbCloudDb.Model.RelationContactWell", b => - { - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well"); + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user"); + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); - b.HasKey("IdWell", "IdUser"); + b.HasKey("IdWell", "IdUser"); - b.HasIndex("IdUser"); + b.HasIndex("IdUser"); - b.ToTable("t_relation_contact_well"); - }); + b.ToTable("t_relation_contact_well"); + }); modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => - { - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user"); + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); - b.Property("IdDrillingProgramPart") - .HasColumnType("integer") - .HasColumnName("id_drilling_program_part"); + b.Property("IdDrillingProgramPart") + .HasColumnType("integer") + .HasColumnName("id_drilling_program_part"); - b.Property("IdUserRole") - .HasColumnType("integer") - .HasColumnName("id_role") - .HasComment("1 - publisher, 2 - approver"); + 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.HasKey("IdUser", "IdDrillingProgramPart") + .HasName("t_relation_user_drilling_program_part_pk"); - b.HasIndex("IdDrillingProgramPart"); + b.HasIndex("IdDrillingProgramPart"); - b.ToTable("t_relation_user_drilling_program_part"); + b.ToTable("t_relation_user_drilling_program_part"); - b.HasComment("Отношение пользователей и частей ПБ"); - }); + b.HasComment("Отношение пользователей и частей ПБ"); + }); modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => - { - b.Property("IdUserRole") - .HasColumnType("integer") - .HasColumnName("id_user_role"); + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); - b.Property("IdPermission") - .HasColumnType("integer") - .HasColumnName("id_permission"); + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); - b.HasKey("IdUserRole", "IdPermission"); + b.HasKey("IdUserRole", "IdPermission"); - b.HasIndex("IdPermission"); + b.HasIndex("IdPermission"); - b.ToTable("t_relation_user_role_permission"); + b.ToTable("t_relation_user_role_permission"); - b.HasComment("Отношение ролей пользователей и разрешений доступа"); + 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 - }); - }); + 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("Id") + .HasColumnType("integer") + .HasColumnName("id_user_role"); - b.Property("IdInclude") - .HasColumnType("integer") - .HasColumnName("id_include_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.HasKey("Id", "IdInclude") + .HasName("t_relation_user_role_user_role_pk"); - b.HasIndex("IdInclude"); + b.HasIndex("IdInclude"); - b.ToTable("t_relation_user_role_user_role"); + b.ToTable("t_relation_user_role_user_role"); - b.HasComment("Отношение ролей к ролям"); + 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 - }); - }); + 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("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); - b.Property("IdUserRole") - .HasColumnType("integer") - .HasColumnName("id_user_role"); + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); - b.HasKey("IdUser", "IdUserRole"); + b.HasKey("IdUser", "IdUserRole"); - b.HasIndex("IdUserRole"); + b.HasIndex("IdUserRole"); - b.ToTable("t_relation_user_user_role"); + b.ToTable("t_relation_user_user_role"); - b.HasComment("Отношение пользователей и ролей"); + b.HasComment("Отношение пользователей и ролей"); - b.HasData( - new - { - IdUser = 1, - IdUserRole = 1 - }); - }); + b.HasData( + new + { + IdUser = 1, + IdUserRole = 1 + }); + }); modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Begin") - .HasColumnType("timestamp with time zone") - .HasColumnName("begin"); + 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("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end") + .HasComment("timestamp with time zone"); - b.Property("Format") - .HasColumnType("integer") - .HasColumnName("format") - .HasComment("Формат отчета"); + b.Property("Format") + .HasColumnType("integer") + .HasColumnName("format") + .HasComment("Формат отчета"); - b.Property("IdFile") - .HasColumnType("integer") - .HasColumnName("id_file") - .HasComment("id файла-родителя"); + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла-родителя"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("id скважины"); + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); - b.Property("Step") - .HasColumnType("integer") - .HasColumnName("step") - .HasComment("размер шага в секундах"); + b.Property("Step") + .HasColumnType("integer") + .HasColumnName("step") + .HasComment("размер шага в секундах"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdFile"); + b.HasIndex("IdFile"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.ToTable("t_report_property"); + b.ToTable("t_report_property"); - b.HasComment("Отчеты с данными по буровым"); - }); + b.HasComment("Отчеты с данными по буровым"); + }); modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("DrillEnd") - .HasColumnType("timestamp with time zone") - .HasColumnName("drill_end") - .HasComment("Конец вахты"); + 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("DrillStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_start") + .HasComment("Начало вахты"); - b.Property("IdDriller") - .HasColumnType("integer") - .HasColumnName("id_driller") - .HasComment("Идентификатор бурильщика"); + b.Property("IdDriller") + .HasColumnType("integer") + .HasColumnName("id_driller") + .HasComment("Идентификатор бурильщика"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Идентификатор скважины"); + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Идентификатор скважины"); - b.Property("ShiftEnd") - .HasColumnType("time without time zone") - .HasColumnName("shift_end") - .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.Property("ShiftStart") + .HasColumnType("time without time zone") + .HasColumnName("shift_start") + .HasComment("Начало смены"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdDriller"); + b.HasIndex("IdDriller"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.ToTable("t_schedule"); + b.ToTable("t_schedule"); - b.HasComment("График работы бурильщика"); - }); + b.HasComment("График работы бурильщика"); + }); modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("комментарий для оператора"); + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("комментарий для оператора"); - b.Property("IdAuthor") - .HasColumnType("integer") - .HasColumnName("id_author") - .HasComment("Id пользователя, загрузившего файл"); + 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("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("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); - b.Property("ObsolescenceSec") - .HasColumnType("integer") - .HasColumnName("obsolescence") - .HasComment("сек. до устаревания"); + b.Property("ObsolescenceSec") + .HasColumnType("integer") + .HasColumnName("obsolescence") + .HasComment("сек. до устаревания"); - b.Property("Setpoints") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("setpoint_set") - .HasComment("Набор уставок"); + b.Property("Setpoints") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("setpoint_set") + .HasComment("Набор уставок"); - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdAuthor"); + b.HasIndex("IdAuthor"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.ToTable("t_setpoints_rquest"); + b.ToTable("t_setpoints_rquest"); - b.HasComment("Запросы на изменение уставок панели оператора"); - }); + b.HasComment("Запросы на изменение уставок панели оператора"); + }); modelBuilder.Entity("AsbCloudDb.Model.Subsystem", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Description") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("description"); + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description"); - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name"); + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("t_subsystem"); + b.ToTable("t_subsystem"); - b.HasComment("Описание подсистем"); + 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 = "Демпфер" - }); - }); + 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"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Info") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("info") - .HasComment("Информация с панели о скважине"); + b.Property("Info") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); - b.Property("RemoteUid") - .IsRequired() - .HasColumnType("text") - .HasColumnName("remote_uid") - .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + b.Property("RemoteUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - b.Property("TimeZone") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("timezone") - .HasComment("Смещение часового пояса от UTC"); + b.Property("TimeZone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); + b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); - b.ToTable("t_telemetry"); + b.ToTable("t_telemetry"); - b.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); - }); + b.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); + { + 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("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("AxialLoad") + .HasColumnType("real") + .HasColumnName("axial_load") + .HasComment("Осевая нагрузка"); - b.Property("AxialLoadLimitMax") - .HasColumnType("real") - .HasColumnName("axial_load_limit_max") - .HasComment("Осевая нагрузка. Аварийная макс."); + b.Property("AxialLoadLimitMax") + .HasColumnType("real") + .HasColumnName("axial_load_limit_max") + .HasComment("Осевая нагрузка. Аварийная макс."); - b.Property("AxialLoadSp") - .HasColumnType("real") - .HasColumnName("axial_load_sp") - .HasComment("Осевая нагрузка. Задание"); + b.Property("AxialLoadSp") + .HasColumnType("real") + .HasColumnName("axial_load_sp") + .HasComment("Осевая нагрузка. Задание"); - b.Property("BitDepth") - .HasColumnType("real") - .HasColumnName("bit_depth") - .HasComment("Положение инструмента"); + b.Property("BitDepth") + .HasColumnType("real") + .HasColumnName("bit_depth") + .HasComment("Положение инструмента"); - b.Property("BlockPosition") - .HasColumnType("real") - .HasColumnName("block_position") - .HasComment("Высота талевого блока"); + b.Property("BlockPosition") + .HasColumnType("real") + .HasColumnName("block_position") + .HasComment("Высота талевого блока"); - b.Property("BlockPositionMax") - .HasColumnType("real") - .HasColumnName("block_position_max") - .HasComment("Талевый блок. Макс положение"); + b.Property("BlockPositionMax") + .HasColumnType("real") + .HasColumnName("block_position_max") + .HasComment("Талевый блок. Макс положение"); - b.Property("BlockPositionMin") - .HasColumnType("real") - .HasColumnName("block_position_min") - .HasComment("Талевый блок. Мин положение"); + b.Property("BlockPositionMin") + .HasColumnType("real") + .HasColumnName("block_position_min") + .HasComment("Талевый блок. Мин положение"); - b.Property("BlockSpeed") - .HasColumnType("real") - .HasColumnName("block_speed") - .HasComment("Скорость талевого блока"); + b.Property("BlockSpeed") + .HasColumnType("real") + .HasColumnName("block_speed") + .HasComment("Скорость талевого блока"); - b.Property("BlockSpeedSp") - .HasColumnType("real") - .HasColumnName("block_speed_sp") - .HasComment("Скорости талевого блока. Задание"); + b.Property("BlockSpeedSp") + .HasColumnType("real") + .HasColumnName("block_speed_sp") + .HasComment("Скорости талевого блока. Задание"); - b.Property("BlockSpeedSpDevelop") - .HasColumnType("real") - .HasColumnName("block_speed_sp_develop") - .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("BlockSpeedSpRotor") + .HasColumnType("real") + .HasColumnName("block_speed_sp_rotor") + .HasComment("Талевый блок. Задание скорости для роторного бурения"); - b.Property("BlockSpeedSpSlide") - .HasColumnType("real") - .HasColumnName("block_speed_sp_slide") - .HasComment("Талевый блок. Задание скорости для режима слайда"); + b.Property("BlockSpeedSpSlide") + .HasColumnType("real") + .HasColumnName("block_speed_sp_slide") + .HasComment("Талевый блок. Задание скорости для режима слайда"); - b.Property("Flow") - .HasColumnType("real") - .HasColumnName("flow") - .HasComment("Расход"); + b.Property("Flow") + .HasColumnType("real") + .HasColumnName("flow") + .HasComment("Расход"); - b.Property("FlowDeltaLimitMax") - .HasColumnType("real") - .HasColumnName("flow_delta_limit_max") - .HasComment("Расход. Аварийный макс."); + b.Property("FlowDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("flow_delta_limit_max") + .HasComment("Расход. Аварийный макс."); - b.Property("FlowIdle") - .HasColumnType("real") - .HasColumnName("flow_idle") - .HasComment("Расход. Холостой ход"); + b.Property("FlowIdle") + .HasColumnType("real") + .HasColumnName("flow_idle") + .HasComment("Расход. Холостой ход"); - b.Property("HookWeight") - .HasColumnType("real") - .HasColumnName("hook_weight") - .HasComment("Вес на крюке"); + b.Property("HookWeight") + .HasColumnType("real") + .HasColumnName("hook_weight") + .HasComment("Вес на крюке"); - b.Property("HookWeightIdle") - .HasColumnType("real") - .HasColumnName("hook_weight_idle") - .HasComment("Вес на крюке. Холостой ход"); + b.Property("HookWeightIdle") + .HasColumnType("real") + .HasColumnName("hook_weight_idle") + .HasComment("Вес на крюке. Холостой ход"); - b.Property("HookWeightLimitMax") - .HasColumnType("real") - .HasColumnName("hook_weight_limit_max") - .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("HookWeightLimitMin") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_min") + .HasComment("Вес на крюке. Посадка"); - b.Property("IdFeedRegulator") - .HasColumnType("smallint") - .HasColumnName("id_feed_regulator") - .HasComment("Текущий критерий бурения"); + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator") + .HasComment("Текущий критерий бурения"); - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("Пользователь САУБ"); + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Пользователь САУБ"); - b.Property("Mode") - .HasColumnType("smallint") - .HasColumnName("mode") - .HasComment("Режим САУБ"); + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Режим САУБ"); - b.Property("Mse") - .HasColumnType("real") - .HasColumnName("mse") - .HasComment("MSE"); + b.Property("Mse") + .HasColumnType("real") + .HasColumnName("mse") + .HasComment("MSE"); - b.Property("MseState") - .HasColumnType("smallint") - .HasColumnName("mse_state") - .HasComment("Текущее состояние работы MSE"); + b.Property("MseState") + .HasColumnType("smallint") + .HasColumnName("mse_state") + .HasComment("Текущее состояние работы MSE"); - b.Property("Pressure") - .HasColumnType("real") - .HasColumnName("pressure") - .HasComment("Давление"); + b.Property("Pressure") + .HasColumnType("real") + .HasColumnName("pressure") + .HasComment("Давление"); - b.Property("PressureDeltaLimitMax") - .HasColumnType("real") - .HasColumnName("pressure_delta_limit_max") - .HasComment("Давление дифф. Аварийное макс."); + b.Property("PressureDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("pressure_delta_limit_max") + .HasComment("Давление дифф. Аварийное макс."); - b.Property("PressureIdle") - .HasColumnType("real") - .HasColumnName("pressure_idle") - .HasComment("Давление. Холостой ход"); + b.Property("PressureIdle") + .HasColumnType("real") + .HasColumnName("pressure_idle") + .HasComment("Давление. Холостой ход"); - b.Property("PressureSp") - .HasColumnType("real") - .HasColumnName("pressure_sp") - .HasComment("Давление. Задание"); + b.Property("PressureSp") + .HasColumnType("real") + .HasColumnName("pressure_sp") + .HasComment("Давление. Задание"); - b.Property("PressureSpDevelop") - .HasColumnType("real") - .HasColumnName("pressure_sp_develop") - .HasComment("Давление. Задание для проработки"); + b.Property("PressureSpDevelop") + .HasColumnType("real") + .HasColumnName("pressure_sp_develop") + .HasComment("Давление. Задание для проработки"); - b.Property("PressureSpRotor") - .HasColumnType("real") - .HasColumnName("pressure_sp_rotor") - .HasComment("Давление. Задание для роторного бурения"); + b.Property("PressureSpRotor") + .HasColumnType("real") + .HasColumnName("pressure_sp_rotor") + .HasComment("Давление. Задание для роторного бурения"); - b.Property("PressureSpSlide") - .HasColumnType("real") - .HasColumnName("pressure_sp_slide") - .HasComment("Давление. Задание для режима слайда"); + b.Property("PressureSpSlide") + .HasColumnType("real") + .HasColumnName("pressure_sp_slide") + .HasComment("Давление. Задание для режима слайда"); - b.Property("Pump0Flow") - .HasColumnType("real") - .HasColumnName("pump0_flow") - .HasComment("Расход. Буровой насос 1"); + b.Property("Pump0Flow") + .HasColumnType("real") + .HasColumnName("pump0_flow") + .HasComment("Расход. Буровой насос 1"); - b.Property("Pump1Flow") - .HasColumnType("real") - .HasColumnName("pump1_flow") - .HasComment("Расход. Буровой насос 2"); + b.Property("Pump1Flow") + .HasColumnType("real") + .HasColumnName("pump1_flow") + .HasComment("Расход. Буровой насос 2"); - b.Property("Pump2Flow") - .HasColumnType("real") - .HasColumnName("pump2_flow") - .HasComment("Расход. Буровой насос 3"); + b.Property("Pump2Flow") + .HasColumnType("real") + .HasColumnName("pump2_flow") + .HasComment("Расход. Буровой насос 3"); - b.Property("RotorSpeed") - .HasColumnType("real") - .HasColumnName("rotor_speed") - .HasComment("Обороты ротора"); + b.Property("RotorSpeed") + .HasColumnType("real") + .HasColumnName("rotor_speed") + .HasComment("Обороты ротора"); - b.Property("RotorTorque") - .HasColumnType("real") - .HasColumnName("rotor_torque") - .HasComment("Момент на роторе"); + b.Property("RotorTorque") + .HasColumnType("real") + .HasColumnName("rotor_torque") + .HasComment("Момент на роторе"); - b.Property("RotorTorqueIdle") - .HasColumnType("real") - .HasColumnName("rotor_torque_idle") - .HasComment("Момент на роторе. Холостой ход"); + b.Property("RotorTorqueIdle") + .HasColumnType("real") + .HasColumnName("rotor_torque_idle") + .HasComment("Момент на роторе. Холостой ход"); - b.Property("RotorTorqueLimitMax") - .HasColumnType("real") - .HasColumnName("rotor_torque_limit_max") - .HasComment("Момент на роторе. Аварийный макс."); + b.Property("RotorTorqueLimitMax") + .HasColumnType("real") + .HasColumnName("rotor_torque_limit_max") + .HasComment("Момент на роторе. Аварийный макс."); - b.Property("RotorTorqueSp") - .HasColumnType("real") - .HasColumnName("rotor_torque_sp") - .HasComment("Момент на роторе. Задание"); + b.Property("RotorTorqueSp") + .HasColumnType("real") + .HasColumnName("rotor_torque_sp") + .HasComment("Момент на роторе. Задание"); - b.Property("WellDepth") - .HasColumnType("real") - .HasColumnName("well_depth") - .HasComment("Глубина забоя"); + b.Property("WellDepth") + .HasColumnType("real") + .HasColumnName("well_depth") + .HasComment("Глубина забоя"); - b.HasKey("IdTelemetry", "DateTime"); + b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_data_saub"); + b.ToTable("t_telemetry_data_saub"); - b.HasComment("набор основных данных по SAUB"); - }); + b.HasComment("набор основных данных по SAUB"); + }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaubStat", b => - { - b.Property("Count") - .HasColumnType("bigint") - .HasColumnName("count_items"); + { + b.Property("Count") + .HasColumnType("bigint") + .HasColumnName("count_items"); - b.Property("DateMax") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_max"); + b.Property("DateMax") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_max"); - b.Property("DateMin") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_min"); + b.Property("DateMin") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_min"); - b.Property("DepthMax") - .HasColumnType("real") - .HasColumnName("depth_max"); + b.Property("DepthMax") + .HasColumnType("real") + .HasColumnName("depth_max"); - b.Property("DepthMin") - .HasColumnType("real") - .HasColumnName("depth_min"); + b.Property("DepthMin") + .HasColumnType("real") + .HasColumnName("depth_min"); - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); - b.ToView("mw_telemetry_datas_saub_stat"); - }); + b.ToView("mw_telemetry_datas_saub_stat"); + }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); + { + 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("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("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Выбранный режим управления"); - b.Property("PositionRight") - .HasColumnType("real") - .HasColumnName("position_right") - .HasComment("Крайний правый угол осцилляции"); + b.Property("PositionRight") + .HasColumnType("real") + .HasColumnName("position_right") + .HasComment("Крайний правый угол осцилляции"); - b.Property("PositionZero") - .HasColumnType("real") - .HasColumnName("position_zero") - .HasComment("Нулевая позиция осцилляции"); + b.Property("PositionZero") + .HasColumnType("real") + .HasColumnName("position_zero") + .HasComment("Нулевая позиция осцилляции"); - b.Property("RevolsLeftLimit") - .HasColumnType("real") - .HasColumnName("revols_left_limit") - .HasComment("Ограничение числа оборотов влево"); + b.Property("RevolsLeftLimit") + .HasColumnType("real") + .HasColumnName("revols_left_limit") + .HasComment("Ограничение числа оборотов влево"); - b.Property("RevolsLeftTotal") - .HasColumnType("real") - .HasColumnName("revols_left_total") - .HasComment("Суммарное количество оборотов влево"); + b.Property("RevolsLeftTotal") + .HasColumnType("real") + .HasColumnName("revols_left_total") + .HasComment("Суммарное количество оборотов влево"); - b.Property("RevolsRightLimit") - .HasColumnType("real") - .HasColumnName("revols_right_limit") - .HasComment("Ограничение числа оборотов вправо"); + b.Property("RevolsRightLimit") + .HasColumnType("real") + .HasColumnName("revols_right_limit") + .HasComment("Ограничение числа оборотов вправо"); - b.Property("RevolsRightTotal") - .HasColumnType("real") - .HasColumnName("revols_right_total") - .HasComment("Суммарное количество оборотов вправо"); + b.Property("RevolsRightTotal") + .HasColumnType("real") + .HasColumnName("revols_right_total") + .HasComment("Суммарное количество оборотов вправо"); - b.Property("SpeedLeftSp") - .HasColumnType("real") - .HasColumnName("speed_left_sp") - .HasComment("Заданная скорость вращения влево"); + b.Property("SpeedLeftSp") + .HasColumnType("real") + .HasColumnName("speed_left_sp") + .HasComment("Заданная скорость вращения влево"); - b.Property("SpeedRightSp") - .HasColumnType("real") - .HasColumnName("speed_right_sp") - .HasComment("Заданная скорость вращения вправо"); + b.Property("SpeedRightSp") + .HasColumnType("real") + .HasColumnName("speed_right_sp") + .HasComment("Заданная скорость вращения вправо"); - b.Property("State") - .HasColumnType("smallint") - .HasColumnName("state") - .HasComment("Переменная этапа"); + b.Property("State") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("Переменная этапа"); - b.HasKey("IdTelemetry", "DateTime"); + b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_data_spin"); + b.ToTable("t_telemetry_data_spin"); - b.HasComment("набор основных данных по SpinMaster"); - }); + b.HasComment("набор основных данных по SpinMaster"); + }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); - b.Property("IdEvent") - .HasColumnType("integer") - .HasColumnName("id_event"); + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category"); + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); - b.Property("MessageTemplate") - .IsRequired() - .HasColumnType("text") - .HasColumnName("message_template"); + b.Property("MessageTemplate") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message_template"); - b.HasKey("IdTelemetry", "IdEvent"); + b.HasKey("IdTelemetry", "IdEvent"); - b.ToTable("t_telemetry_event"); + b.ToTable("t_telemetry_event"); - b.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); - }); + b.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Arg0") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("arg0") - .HasComment("Аргумент №0 для вставки в шаблон сообщения"); + 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("Arg1") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg1"); - b.Property("Arg2") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("arg2"); + b.Property("Arg2") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg2"); - b.Property("Arg3") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("arg3"); + b.Property("Arg3") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg3"); - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); - b.Property("IdEvent") - .HasColumnType("integer") - .HasColumnName("id_event"); + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); - b.Property("IdTelemetryUser") - .HasColumnType("integer") - .HasColumnName("id_telemetry_user") - .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); + b.Property("IdTelemetryUser") + .HasColumnType("integer") + .HasColumnName("id_telemetry_user") + .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); - b.Property("WellDepth") - .HasColumnType("double precision") - .HasColumnName("well_depth"); + b.Property("WellDepth") + .HasColumnType("double precision") + .HasColumnName("well_depth"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdTelemetry"); + b.HasIndex("IdTelemetry"); - b.ToTable("t_telemetry_message"); + b.ToTable("t_telemetry_message"); - b.HasComment("Сообщения на буровых"); - }); + b.HasComment("Сообщения на буровых"); + }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user"); + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); - b.Property("Level") - .HasColumnType("integer") - .HasColumnName("level"); + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); - b.Property("Name") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name"); + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); - b.Property("Patronymic") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("patronymic"); + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic"); - b.Property("Surname") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("surname"); + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname"); - b.HasKey("IdTelemetry", "IdUser"); + b.HasKey("IdTelemetry", "IdUser"); - b.ToTable("t_telemetry_user"); + b.ToTable("t_telemetry_user"); - b.HasComment("Пользователи панели САУБ. Для сообщений."); - }); + b.HasComment("Пользователи панели САУБ. Для сообщений."); + }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryWirelineRunOut", b => - { - b.Property("IdTelemetry") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id_telemetry") - .HasComment("Идентификатор телеметрии"); + { + b.Property("IdTelemetry") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Идентификатор телеметрии"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("IdTelemetry")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("IdTelemetry")); - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_time") - .HasComment("Отметка времени"); + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_time") + .HasComment("Отметка времени"); - b.Property("Hauling") - .HasColumnType("real") - .HasColumnName("hauling") - .HasComment("Наработка талевого каната с момента перетяжки каната, т*км"); + b.Property("Hauling") + .HasColumnType("real") + .HasColumnName("hauling") + .HasComment("Наработка талевого каната с момента перетяжки каната, т*км"); - b.Property("HaulingWarnSp") - .HasColumnType("real") - .HasColumnName("hauling_warn_sp") - .HasComment("Наработка талевого каната до сигнализации о необходимости перетяжки, т*км"); + b.Property("HaulingWarnSp") + .HasColumnType("real") + .HasColumnName("hauling_warn_sp") + .HasComment("Наработка талевого каната до сигнализации о необходимости перетяжки, т*км"); - b.Property("Replace") - .HasColumnType("real") - .HasColumnName("replace") - .HasComment("Наработка талевого каната с момента замены каната, т*км"); + b.Property("Replace") + .HasColumnType("real") + .HasColumnName("replace") + .HasComment("Наработка талевого каната с момента замены каната, т*км"); - b.Property("ReplaceWarnSp") - .HasColumnType("real") - .HasColumnName("replace_warn_sp") - .HasComment("Наработка талевого каната до сигнализации о необходимости замены, т*км"); + b.Property("ReplaceWarnSp") + .HasColumnType("real") + .HasColumnName("replace_warn_sp") + .HasComment("Наработка талевого каната до сигнализации о необходимости замены, т*км"); - b.HasKey("IdTelemetry"); + b.HasKey("IdTelemetry"); - b.ToTable("t_telemetry_wireline_run_out"); + b.ToTable("t_telemetry_wireline_run_out"); - b.HasComment("Наработка талевого каната"); - }); + b.HasComment("Наработка талевого каната"); + }); modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("AzimuthGeo") - .HasColumnType("double precision") - .HasColumnName("azimuth_geo") - .HasComment("Азимут Географ."); + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); - b.Property("AzimuthMagnetic") - .HasColumnType("double precision") - .HasColumnName("azimuth_magnetic") - .HasComment("Азимут Магнитный"); + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("Комментарии"); + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("ID пользователя который внес/изменил запись"); + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .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("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); - b.Property("VerticalDepth") - .HasColumnType("double precision") - .HasColumnName("vertical_depth") - .HasComment("Глубина вертикальная"); + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); - b.Property("WellboreDepth") - .HasColumnType("double precision") - .HasColumnName("wellbore_depth") - .HasComment("Глубина по стволу"); + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); - b.Property("ZenithAngle") - .HasColumnType("double precision") - .HasColumnName("zenith_angle") - .HasComment("Угол зенитный"); + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdUser"); + b.HasIndex("IdUser"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.ToTable("t_trajectory_fact"); + b.ToTable("t_trajectory_fact"); - b.HasComment("Загрузка фактической траектории"); - }); + b.HasComment("Загрузка фактической траектории"); + }); modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("AzimuthGeo") - .HasColumnType("double precision") - .HasColumnName("azimuth_geo") - .HasComment("Азимут Географ."); + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); - b.Property("AzimuthMagnetic") - .HasColumnType("double precision") - .HasColumnName("azimuth_magnetic") - .HasComment("Азимут Магнитный"); + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("Комментарии"); + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("ID пользователя который внес/изменил запись"); + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("ID скважины"); + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); - b.Property("Radius") - .HasColumnType("double precision") - .HasColumnName("radius") - .HasComment("Радиус цели"); + b.Property("Radius") + .HasColumnType("double precision") + .HasColumnName("radius") + .HasComment("Радиус цели"); - b.Property("UpdateDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("update_date") - .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("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); - b.Property("WellboreDepth") - .HasColumnType("double precision") - .HasColumnName("wellbore_depth") - .HasComment("Глубина по стволу"); + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); - b.Property("ZenithAngle") - .HasColumnType("double precision") - .HasColumnName("zenith_angle") - .HasComment("Угол зенитный"); + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdUser"); + b.HasIndex("IdUser"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.ToTable("t_trajectory_plan"); + b.ToTable("t_trajectory_plan"); - b.HasComment("Загрузка плановой траектории"); - }); + b.HasComment("Загрузка плановой траектории"); + }); modelBuilder.Entity("AsbCloudDb.Model.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Email") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("email") - .HasComment("должность"); + b.Property("Email") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); - b.Property("IdCompany") - .HasColumnType("integer") - .HasColumnName("id_company"); + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); - b.Property("IdState") - .HasColumnType("smallint") - .HasColumnName("state") - .HasComment("состояние:\n0 - не активен, \n1 - активен, \n2 - заблокирован"); + 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("Login") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("login"); - b.Property("Name") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name") - .HasComment("имя"); + 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("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("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("отчество"); - b.Property("Phone") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("phone") - .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("Position") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("position") + .HasComment("email"); - b.Property("Surname") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("surname") - .HasComment("фамилия"); + b.Property("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdCompany"); + b.HasIndex("IdCompany"); - b.HasIndex("Login") - .IsUnique(); + b.HasIndex("Login") + .IsUnique(); - b.ToTable("t_user"); + b.ToTable("t_user"); - b.HasComment("Пользователи облака"); + b.HasComment("Пользователи облака"); - b.HasData( - new - { - Id = 1, - Email = "", - IdCompany = 1, - IdState = (short)1, - Login = "dev", - Name = "Разработчик", - PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" - }); - }); + 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"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); + 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.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("t_user_role"); + b.ToTable("t_user_role"); - b.HasComment("Роли пользователей в системе"); + 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 - }); - }); + 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("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); - b.Property("Key") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("key") - .HasComment("Ключ настроек пользователя"); + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("key") + .HasComment("Ключ настроек пользователя"); - b.Property("Value") - .HasColumnType("jsonb") - .HasColumnName("setting_value") - .HasComment("Значение настроек пользователя"); + b.Property("Value") + .HasColumnType("jsonb") + .HasColumnName("setting_value") + .HasComment("Значение настроек пользователя"); - b.HasKey("IdUser", "Key"); + b.HasKey("IdUser", "Key"); - b.ToTable("t_user_settings"); + b.ToTable("t_user_settings"); - b.HasComment("настройки интерфейса пользователя"); - }); + b.HasComment("настройки интерфейса пользователя"); + }); modelBuilder.Entity("AsbCloudDb.Model.Well", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption"); + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); - b.Property("IdCluster") - .HasColumnType("integer") - .HasColumnName("id_cluster"); + b.Property("IdCluster") + .HasColumnType("integer") + .HasColumnName("id_cluster"); - b.Property("IdState") - .HasColumnType("integer") - .HasColumnName("state") - .HasComment("0 - неизвестно, 1 - в работе, 2 - завершена"); + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("state") + .HasComment("0 - неизвестно, 1 - в работе, 2 - завершена"); - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); - b.Property("IdWellType") - .HasColumnType("integer") - .HasColumnName("id_well_type"); + b.Property("IdWellType") + .HasColumnType("integer") + .HasColumnName("id_well_type"); - b.Property("Latitude") - .HasColumnType("double precision") - .HasColumnName("latitude"); + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); - b.Property("Longitude") - .HasColumnType("double precision") - .HasColumnName("longitude"); + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); - b.Property("Timezone") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("timezone") - .HasComment("Смещение часового пояса от UTC"); + b.Property("Timezone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdCluster"); + b.HasIndex("IdCluster"); - b.HasIndex("IdTelemetry") - .IsUnique(); + b.HasIndex("IdTelemetry") + .IsUnique(); - b.HasIndex("IdWellType"); + b.HasIndex("IdWellType"); - b.ToTable("t_well"); + b.ToTable("t_well"); - b.HasComment("скважины"); - }); + b.HasComment("скважины"); + }); modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => - { - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины получателя"); + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины получателя"); - b.Property("IdWellSrc") - .HasColumnType("integer") - .HasColumnName("id_well_src") - .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.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции композита"); - b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); + b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); - b.HasIndex("IdWellSectionType"); + b.HasIndex("IdWellSectionType"); - b.HasIndex("IdWellSrc"); + b.HasIndex("IdWellSrc"); - b.ToTable("t_well_composite"); + b.ToTable("t_well_composite"); - b.HasComment("Композитная скважина"); - }); + b.HasComment("Композитная скважина"); + }); modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocument", b => - { - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well"); + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user"); + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category"); + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); - b.HasKey("IdWell", "IdUser", "IdCategory") - .HasName("t_well_final_documents_pk"); + b.HasKey("IdWell", "IdUser", "IdCategory") + .HasName("t_well_final_documents_pk"); - b.HasIndex("IdCategory"); + b.HasIndex("IdCategory"); - b.HasIndex("IdUser"); + b.HasIndex("IdUser"); - b.ToTable("t_well_final_documents"); + b.ToTable("t_well_final_documents"); - b.HasComment("Дело скважины"); - }); + b.HasComment("Дело скважины"); + }); modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("CategoryInfo") - .HasColumnType("text") - .HasColumnName("category_info") - .HasComment("Доп. информация к выбраной категории"); + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("Комментарий"); + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); - b.Property("DateStart") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_start") - .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("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина после завершения операции, м"); - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Глубина на начало операции, м"); + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина на начало операции, м"); - b.Property("DurationHours") - .HasColumnType("double precision") - .HasColumnName("duration_hours") - .HasComment("Продолжительность, часы"); + b.Property("DurationHours") + .HasColumnType("double precision") + .HasColumnName("duration_hours") + .HasComment("Продолжительность, часы"); - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("Id категории операции"); + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); - b.Property("IdPlan") - .HasColumnType("integer") - .HasColumnName("id_plan") - .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("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0 = План или 1 = Факт"); - b.Property("IdUser") - .HasColumnType("integer"); + b.Property("IdUser") + .HasColumnType("integer"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины"); + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); - b.Property("IdWellSectionType") - .HasColumnType("integer") - .HasColumnName("id_well_section_type") - .HasComment("Id тип секции скважины"); + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции скважины"); - b.Property("LastUpdateDate") - .HasColumnType("timestamp with time zone"); + b.Property("LastUpdateDate") + .HasColumnType("timestamp with time zone"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("DateStart"); + b.HasIndex("DateStart"); - b.HasIndex("DepthEnd"); + b.HasIndex("DepthEnd"); - b.HasIndex("IdCategory"); + b.HasIndex("IdCategory"); - b.HasIndex("IdPlan"); + b.HasIndex("IdPlan"); - b.HasIndex("IdWell"); + b.HasIndex("IdWell"); - b.HasIndex("IdWellSectionType"); + b.HasIndex("IdWellSectionType"); - b.ToTable("t_well_operation"); + b.ToTable("t_well_operation"); - b.HasComment("Данные по операциям на скважине"); - }); + b.HasComment("Данные по операциям на скважине"); + }); modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("IdParent") - .HasColumnType("integer") - .HasColumnName("id_parent") - .HasComment("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("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("KeyValueUnits") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("key_value_units") + .HasComment("Единицы измерения ключевого показателя операции"); - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название категории операции"); + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории операции"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdParent"); + b.HasIndex("IdParent"); - b.ToTable("t_well_operation_category"); + b.ToTable("t_well_operation_category"); - b.HasComment("Справочник операций на скважине"); + 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 = "Работа пакером в обсадной колонне" - }); - }); + 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"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Конечная глубина бурения, м"); + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина бурения, м"); - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Начальная глубина бурения, м"); + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Начальная глубина бурения, м"); - b.Property("IdSectionType") - .HasColumnType("integer") - .HasColumnName("id_section_type") - .HasComment("Тип секции"); + b.Property("IdSectionType") + .HasColumnType("integer") + .HasColumnName("id_section_type") + .HasComment("Тип секции"); - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("Id пользователя"); + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины"); + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); - b.Property("InnerDiameter") - .HasColumnType("double precision") - .HasColumnName("inner_diameter") - .HasComment("Внутренний диаметр"); + 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("LastUpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_update") + .HasComment("Дата последнего обновления"); - b.Property("OuterDiameter") - .HasColumnType("double precision") - .HasColumnName("outer_diameter") - .HasComment("Внешний диаметр"); + b.Property("OuterDiameter") + .HasColumnType("double precision") + .HasColumnName("outer_diameter") + .HasComment("Внешний диаметр"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("IdSectionType"); + b.HasIndex("IdSectionType"); - b.HasIndex("IdWell", "IdSectionType") - .IsUnique(); + b.HasIndex("IdWell", "IdSectionType") + .IsUnique(); - b.ToTable("t_well_section_plan"); - }); + b.ToTable("t_well_section_plan"); + }); modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); - b.Property("Order") - .HasColumnType("real") - .HasColumnName("order") - .HasComment("Порядок"); + b.Property("Order") + .HasColumnType("real") + .HasColumnName("order") + .HasComment("Порядок"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("t_well_section_type"); + b.ToTable("t_well_section_type"); - b.HasComment("конструкция секции скважины"); + 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 - }); - }); + 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"); + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); - b.HasKey("Id"); + b.HasKey("Id"); - b.ToTable("t_well_type"); + b.ToTable("t_well_type"); - b.HasComment("конструкция скважины"); + b.HasComment("конструкция скважины"); - b.HasData( - new - { - Id = 1, - Caption = "Наклонно-направленная" - }, - new - { - Id = 2, - Caption = "Горизонтальная" - }); - }); + 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("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); - b.Property("Actcod") - .HasColumnType("smallint") - .HasColumnName("ACTCOD"); + b.Property("Actcod") + .HasColumnType("smallint") + .HasColumnName("ACTCOD"); - b.Property("Date") - .HasColumnType("integer") - .HasColumnName("DATE"); + b.Property("Date") + .HasColumnType("integer") + .HasColumnName("DATE"); - b.Property("Recid") - .HasColumnType("smallint") - .HasColumnName("RECID"); + b.Property("Recid") + .HasColumnType("smallint") + .HasColumnName("RECID"); - b.Property("Seqid") - .HasColumnType("integer") - .HasColumnName("SEQID"); + b.Property("Seqid") + .HasColumnType("integer") + .HasColumnName("SEQID"); - b.Property("Stknum") - .HasColumnType("smallint") - .HasColumnName("STKNUM"); + b.Property("Stknum") + .HasColumnType("smallint") + .HasColumnName("STKNUM"); - b.Property("Time") - .HasColumnType("integer") - .HasColumnName("TIME"); + b.Property("Time") + .HasColumnType("integer") + .HasColumnName("TIME"); - b.Property("Wellid") - .HasColumnType("text") - .HasColumnName("WELLID"); + b.Property("Wellid") + .HasColumnType("text") + .HasColumnName("WELLID"); - b.HasKey("IdTelemetry", "DateTime"); + b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_wits_base"); - }); + b.ToTable("t_telemetry_wits_base"); + }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => - { - b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); - b.Property("Blkpos") - .HasColumnType("real") - .HasColumnName("BLKPOS"); + b.Property("Blkpos") + .HasColumnType("real") + .HasColumnName("BLKPOS"); - b.Property("Chkp") - .HasColumnType("real") - .HasColumnName("CHKP"); + b.Property("Chkp") + .HasColumnType("real") + .HasColumnName("CHKP"); - b.Property("Deptbitm") - .HasColumnType("real") - .HasColumnName("DEPTBITM"); + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); - b.Property("Deptbitv") - .HasColumnType("real") - .HasColumnName("DEPTBITV"); + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); - b.Property("Deptmeas") - .HasColumnType("real") - .HasColumnName("DEPTMEAS"); + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); - b.Property("Deptretm") - .HasColumnType("real") - .HasColumnName("DEPTRETM"); + b.Property("Deptretm") + .HasColumnType("real") + .HasColumnName("DEPTRETM"); - b.Property("Deptvert") - .HasColumnType("real") - .HasColumnName("DEPTVERT"); + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); - b.Property("Gasa") - .HasColumnType("real") - .HasColumnName("GASA"); + b.Property("Gasa") + .HasColumnType("real") + .HasColumnName("GASA"); - b.Property("Hkla") - .HasColumnType("real") - .HasColumnName("HKLA"); + b.Property("Hkla") + .HasColumnType("real") + .HasColumnName("HKLA"); - b.Property("Hklx") - .HasColumnType("real") - .HasColumnName("HKLX"); + b.Property("Hklx") + .HasColumnType("real") + .HasColumnName("HKLX"); - b.Property("Lagstks") - .HasColumnType("smallint") - .HasColumnName("LAGSTKS"); + b.Property("Lagstks") + .HasColumnType("smallint") + .HasColumnName("LAGSTKS"); - b.Property("Mcia") - .HasColumnType("real") - .HasColumnName("MCIA"); + b.Property("Mcia") + .HasColumnType("real") + .HasColumnName("MCIA"); - b.Property("Mcoa") - .HasColumnType("real") - .HasColumnName("MCOA"); + b.Property("Mcoa") + .HasColumnType("real") + .HasColumnName("MCOA"); - b.Property("Mdia") - .HasColumnType("real") - .HasColumnName("MDIA"); + b.Property("Mdia") + .HasColumnType("real") + .HasColumnName("MDIA"); - b.Property("Mdoa") - .HasColumnType("real") - .HasColumnName("MDOA"); + b.Property("Mdoa") + .HasColumnType("real") + .HasColumnName("MDOA"); - b.Property("Mfia") - .HasColumnType("real") - .HasColumnName("MFIA"); + b.Property("Mfia") + .HasColumnType("real") + .HasColumnName("MFIA"); - b.Property("Mfoa") - .HasColumnType("real") - .HasColumnName("MFOA"); + b.Property("Mfoa") + .HasColumnType("real") + .HasColumnName("MFOA"); - b.Property("Mfop") - .HasColumnType("smallint") - .HasColumnName("MFOP"); + b.Property("Mfop") + .HasColumnType("smallint") + .HasColumnName("MFOP"); - b.Property("Mtia") - .HasColumnType("real") - .HasColumnName("MTIA"); + b.Property("Mtia") + .HasColumnType("real") + .HasColumnName("MTIA"); - b.Property("Mtoa") - .HasColumnType("real") - .HasColumnName("MTOA"); + b.Property("Mtoa") + .HasColumnType("real") + .HasColumnName("MTOA"); - b.Property("Ropa") - .HasColumnType("real") - .HasColumnName("ROPA"); + b.Property("Ropa") + .HasColumnType("real") + .HasColumnName("ROPA"); - b.Property("Rpma") - .HasColumnType("smallint") - .HasColumnName("RPMA"); + b.Property("Rpma") + .HasColumnType("smallint") + .HasColumnName("RPMA"); - b.Property("Spare1") - .HasColumnType("real") - .HasColumnName("SPARE1"); + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); - b.Property("Spare2") - .HasColumnType("real") - .HasColumnName("SPARE2"); + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); - b.Property("Spare3") - .HasColumnType("real") - .HasColumnName("SPARE3"); + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); - b.Property("Spare4") - .HasColumnType("real") - .HasColumnName("SPARE4"); + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); - b.Property("Spare5") - .HasColumnType("real") - .HasColumnName("SPARE5"); + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); - b.Property("Spm1") - .HasColumnType("smallint") - .HasColumnName("SPM1"); + b.Property("Spm1") + .HasColumnType("smallint") + .HasColumnName("SPM1"); - b.Property("Spm2") - .HasColumnType("smallint") - .HasColumnName("SPM2"); + b.Property("Spm2") + .HasColumnType("smallint") + .HasColumnName("SPM2"); - b.Property("Spm3") - .HasColumnType("smallint") - .HasColumnName("SPM3"); + b.Property("Spm3") + .HasColumnType("smallint") + .HasColumnName("SPM3"); - b.Property("Sppa") - .HasColumnType("real") - .HasColumnName("SPPA"); + b.Property("Sppa") + .HasColumnType("real") + .HasColumnName("SPPA"); - b.Property("Stkc") - .HasColumnType("integer") - .HasColumnName("STKC"); + b.Property("Stkc") + .HasColumnType("integer") + .HasColumnName("STKC"); - b.Property("TelemetryId") - .HasColumnType("integer"); + b.Property("TelemetryId") + .HasColumnType("integer"); - b.Property("Torqa") - .HasColumnType("real") - .HasColumnName("TORQA"); + b.Property("Torqa") + .HasColumnType("real") + .HasColumnName("TORQA"); - b.Property("Torqx") - .HasColumnType("real") - .HasColumnName("TORQX"); + b.Property("Torqx") + .HasColumnType("real") + .HasColumnName("TORQX"); - b.Property("Tvolact") - .HasColumnType("real") - .HasColumnName("TVOLACT"); + b.Property("Tvolact") + .HasColumnType("real") + .HasColumnName("TVOLACT"); - b.Property("Tvolcact") - .HasColumnType("real") - .HasColumnName("TVOLCACT"); + b.Property("Tvolcact") + .HasColumnType("real") + .HasColumnName("TVOLCACT"); - b.Property("Woba") - .HasColumnType("real") - .HasColumnName("WOBA"); + b.Property("Woba") + .HasColumnType("real") + .HasColumnName("WOBA"); - b.Property("Wobx") - .HasColumnType("real") - .HasColumnName("WOBX"); + b.Property("Wobx") + .HasColumnType("real") + .HasColumnName("WOBX"); - b.HasIndex("TelemetryId"); + b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_1"); - }); + b.ToTable("t_telemetry_wits_1"); + }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => - { - b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); - b.Property("Deptbitm") - .HasColumnType("real") - .HasColumnName("DEPTBITM"); + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); - b.Property("DeptmeasGdpMc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_GDP_mc"); + b.Property("DeptmeasGdpMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_GDP_mc"); - b.Property("DeptmeasMcrstat") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_MCRSTAT"); + b.Property("DeptmeasMcrstat") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_MCRSTAT"); - b.Property("DeptmeasRa33Mc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_RA33_mc"); + b.Property("DeptmeasRa33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33_mc"); - b.Property("DeptmeasRa33f2Mc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_RA33F2_mc"); + b.Property("DeptmeasRa33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F2_mc"); - b.Property("DeptmeasRa33f4Mc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_RA33F4_mc"); + b.Property("DeptmeasRa33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F4_mc"); - b.Property("DeptmeasRp33Mc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_RP33_mc"); + b.Property("DeptmeasRp33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33_mc"); - b.Property("DeptmeasRp33f2Mc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_RP33F2_mc"); + b.Property("DeptmeasRp33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F2_mc"); - b.Property("DeptmeasRp33f4Mc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_RP33F4_mc"); + b.Property("DeptmeasRp33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F4_mc"); - b.Property("DeptmeasSlvlMc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_SLVL_mc"); + b.Property("DeptmeasSlvlMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_SLVL_mc"); - b.Property("GdpMc") - .HasColumnType("real") - .HasColumnName("GDP_mc"); + b.Property("GdpMc") + .HasColumnType("real") + .HasColumnName("GDP_mc"); - b.Property("Mcrstat") - .HasColumnType("real") - .HasColumnName("MCRSTAT"); + b.Property("Mcrstat") + .HasColumnType("real") + .HasColumnName("MCRSTAT"); - b.Property("Ra33Mc") - .HasColumnType("real") - .HasColumnName("RA33_mc"); + b.Property("Ra33Mc") + .HasColumnType("real") + .HasColumnName("RA33_mc"); - b.Property("Ra33f2Mc") - .HasColumnType("real") - .HasColumnName("RA33F2_mc"); + b.Property("Ra33f2Mc") + .HasColumnType("real") + .HasColumnName("RA33F2_mc"); - b.Property("Ra33f4Mc") - .HasColumnType("real") - .HasColumnName("RA33F4_mc"); + b.Property("Ra33f4Mc") + .HasColumnType("real") + .HasColumnName("RA33F4_mc"); - b.Property("Rp33Mc") - .HasColumnType("real") - .HasColumnName("RP33_mc"); + b.Property("Rp33Mc") + .HasColumnType("real") + .HasColumnName("RP33_mc"); - b.Property("Rp33f2Mc") - .HasColumnType("real") - .HasColumnName("RP33F2_mc"); + b.Property("Rp33f2Mc") + .HasColumnType("real") + .HasColumnName("RP33F2_mc"); - b.Property("Rp33f4Mc") - .HasColumnType("real") - .HasColumnName("RP33F4_mc"); + b.Property("Rp33f4Mc") + .HasColumnType("real") + .HasColumnName("RP33F4_mc"); - b.Property("SlvlMc") - .HasColumnType("real") - .HasColumnName("SLVL_mc"); + b.Property("SlvlMc") + .HasColumnType("real") + .HasColumnName("SLVL_mc"); - b.Property("TelemetryId") - .HasColumnType("integer"); + b.Property("TelemetryId") + .HasColumnType("integer"); - b.HasIndex("TelemetryId"); + b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_50"); - }); + b.ToTable("t_telemetry_wits_50"); + }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => - { - b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); - b.Property("Btot") - .HasColumnType("real") - .HasColumnName("Btot"); + b.Property("Btot") + .HasColumnType("real") + .HasColumnName("Btot"); - b.Property("Bx") - .HasColumnType("real") - .HasColumnName("Bx"); + b.Property("Bx") + .HasColumnType("real") + .HasColumnName("Bx"); - b.Property("By") - .HasColumnType("real") - .HasColumnName("By"); + b.Property("By") + .HasColumnType("real") + .HasColumnName("By"); - b.Property("Bz") - .HasColumnType("real") - .HasColumnName("Bz"); + b.Property("Bz") + .HasColumnType("real") + .HasColumnName("Bz"); - b.Property("Deptbitm") - .HasColumnType("real") - .HasColumnName("DEPTBITM"); + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); - b.Property("Deptmeas") - .HasColumnType("real") - .HasColumnName("DEPTMEAS"); + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); - b.Property("Gtot") - .HasColumnType("real") - .HasColumnName("Gtot"); + b.Property("Gtot") + .HasColumnType("real") + .HasColumnName("Gtot"); - b.Property("Gx") - .HasColumnType("real") - .HasColumnName("Gx"); + b.Property("Gx") + .HasColumnType("real") + .HasColumnName("Gx"); - b.Property("Gy") - .HasColumnType("real") - .HasColumnName("Gy"); + b.Property("Gy") + .HasColumnType("real") + .HasColumnName("Gy"); - b.Property("Gz") - .HasColumnType("real") - .HasColumnName("Gz"); + b.Property("Gz") + .HasColumnType("real") + .HasColumnName("Gz"); - b.Property("TelemetryId") - .HasColumnType("integer"); + b.Property("TelemetryId") + .HasColumnType("integer"); - b.HasIndex("TelemetryId"); + b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_60"); - }); + b.ToTable("t_telemetry_wits_60"); + }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => - { - b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); - b.Property("Att06h") - .HasColumnType("real") - .HasColumnName("ATT06H"); + b.Property("Att06h") + .HasColumnType("real") + .HasColumnName("ATT06H"); - b.Property("Att06l") - .HasColumnType("real") - .HasColumnName("ATT06L"); + b.Property("Att06l") + .HasColumnType("real") + .HasColumnName("ATT06L"); - b.Property("Att10h") - .HasColumnType("real") - .HasColumnName("ATT10H"); + b.Property("Att10h") + .HasColumnType("real") + .HasColumnName("ATT10H"); - b.Property("Att10l") - .HasColumnType("real") - .HasColumnName("ATT10L"); + b.Property("Att10l") + .HasColumnType("real") + .HasColumnName("ATT10L"); - b.Property("Deptbitm") - .HasColumnType("real") - .HasColumnName("DEPTBITM"); + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); - b.Property("Deptmeas") - .HasColumnType("real") - .HasColumnName("DEPTMEAS"); + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); - b.Property("Phl1f1") - .HasColumnType("real") - .HasColumnName("PHL1F1"); + b.Property("Phl1f1") + .HasColumnType("real") + .HasColumnName("PHL1F1"); - b.Property("Phl1f2") - .HasColumnType("real") - .HasColumnName("PHL1F2"); + b.Property("Phl1f2") + .HasColumnType("real") + .HasColumnName("PHL1F2"); - b.Property("Phl2f1") - .HasColumnType("real") - .HasColumnName("PHL2F1"); + b.Property("Phl2f1") + .HasColumnType("real") + .HasColumnName("PHL2F1"); - b.Property("Phl2f2") - .HasColumnType("real") - .HasColumnName("PHL2F2"); + b.Property("Phl2f2") + .HasColumnType("real") + .HasColumnName("PHL2F2"); - b.Property("Status") - .HasColumnType("real") - .HasColumnName("Status"); + b.Property("Status") + .HasColumnType("real") + .HasColumnName("Status"); - b.Property("TelemetryId") - .HasColumnType("integer"); + b.Property("TelemetryId") + .HasColumnType("integer"); - b.HasIndex("TelemetryId"); + b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_61"); - }); + b.ToTable("t_telemetry_wits_61"); + }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => - { - b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); - b.Property("Deptmeas") - .HasColumnType("real") - .HasColumnName("DEPTMEAS"); + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); - b.Property("Deptsvym") - .HasColumnType("real") - .HasColumnName("DEPTSVYM"); + b.Property("Deptsvym") + .HasColumnType("real") + .HasColumnName("DEPTSVYM"); - b.Property("Deptsvyv") - .HasColumnType("real") - .HasColumnName("DEPTSVYV"); + b.Property("Deptsvyv") + .HasColumnType("real") + .HasColumnName("DEPTSVYV"); - b.Property("Passnum") - .HasColumnType("smallint") - .HasColumnName("PASSNUM"); + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); - b.Property("Spare1") - .HasColumnType("real") - .HasColumnName("SPARE1"); + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); - b.Property("Spare2") - .HasColumnType("real") - .HasColumnName("SPARE2"); + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); - b.Property("Spare3") - .HasColumnType("real") - .HasColumnName("SPARE3"); + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); - b.Property("Spare4") - .HasColumnType("real") - .HasColumnName("SPARE4"); + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); - b.Property("Spare5") - .HasColumnType("real") - .HasColumnName("SPARE5"); + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); - b.Property("Svyazc") - .HasColumnType("real") - .HasColumnName("SVYAZC"); + b.Property("Svyazc") + .HasColumnType("real") + .HasColumnName("SVYAZC"); - b.Property("Svyazu") - .HasColumnType("real") - .HasColumnName("SVYAZU"); + b.Property("Svyazu") + .HasColumnType("real") + .HasColumnName("SVYAZU"); - b.Property("Svydls") - .HasColumnType("real") - .HasColumnName("SVYDLS"); + b.Property("Svydls") + .HasColumnType("real") + .HasColumnName("SVYDLS"); - b.Property("Svyew") - .HasColumnType("real") - .HasColumnName("SVYEW"); + b.Property("Svyew") + .HasColumnType("real") + .HasColumnName("SVYEW"); - b.Property("Svygtf") - .HasColumnType("real") - .HasColumnName("SVYGTF"); + b.Property("Svygtf") + .HasColumnType("real") + .HasColumnName("SVYGTF"); - b.Property("Svyinc") - .HasColumnType("real") - .HasColumnName("SVYINC"); + b.Property("Svyinc") + .HasColumnType("real") + .HasColumnName("SVYINC"); - b.Property("Svymtf") - .HasColumnType("real") - .HasColumnName("SVYMTF"); + b.Property("Svymtf") + .HasColumnType("real") + .HasColumnName("SVYMTF"); - b.Property("Svyns") - .HasColumnType("real") - .HasColumnName("SVYNS"); + b.Property("Svyns") + .HasColumnType("real") + .HasColumnName("SVYNS"); - b.Property("Svytype") - .HasColumnType("text") - .HasColumnName("SVYTYPE"); + b.Property("Svytype") + .HasColumnType("text") + .HasColumnName("SVYTYPE"); - b.Property("Svywalk") - .HasColumnType("real") - .HasColumnName("SVYWALK"); + b.Property("Svywalk") + .HasColumnType("real") + .HasColumnName("SVYWALK"); - b.Property("TelemetryId") - .HasColumnType("integer"); + b.Property("TelemetryId") + .HasColumnType("integer"); - b.HasIndex("TelemetryId"); + b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_7"); - }); + b.ToTable("t_telemetry_wits_7"); + }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => - { - b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); - b.Property("Deptbitm") - .HasColumnType("real") - .HasColumnName("DEPTBITM"); + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); - b.Property("Deptbitv") - .HasColumnType("real") - .HasColumnName("DEPTBITV"); + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); - b.Property("Deptcalm") - .HasColumnType("real") - .HasColumnName("DEPTCALM"); + b.Property("Deptcalm") + .HasColumnType("real") + .HasColumnName("DEPTCALM"); - b.Property("Deptcalv") - .HasColumnType("real") - .HasColumnName("DEPTCALV"); + b.Property("Deptcalv") + .HasColumnType("real") + .HasColumnName("DEPTCALV"); - b.Property("Deptfdm") - .HasColumnType("real") - .HasColumnName("DEPTFDM"); + b.Property("Deptfdm") + .HasColumnType("real") + .HasColumnName("DEPTFDM"); - b.Property("Deptfdv") - .HasColumnType("real") - .HasColumnName("DEPTFDV"); + b.Property("Deptfdv") + .HasColumnType("real") + .HasColumnName("DEPTFDV"); - b.Property("Deptgr1m") - .HasColumnType("real") - .HasColumnName("DEPTGR1M"); + b.Property("Deptgr1m") + .HasColumnType("real") + .HasColumnName("DEPTGR1M"); - b.Property("Deptgr1v") - .HasColumnType("real") - .HasColumnName("DEPTGR1V"); + b.Property("Deptgr1v") + .HasColumnType("real") + .HasColumnName("DEPTGR1V"); - b.Property("Deptgr2m") - .HasColumnType("real") - .HasColumnName("DEPTGR2M"); + b.Property("Deptgr2m") + .HasColumnType("real") + .HasColumnName("DEPTGR2M"); - b.Property("Deptgr2v") - .HasColumnType("real") - .HasColumnName("DEPTGR2V"); + b.Property("Deptgr2v") + .HasColumnType("real") + .HasColumnName("DEPTGR2V"); - b.Property("Deptmeas") - .HasColumnType("real") - .HasColumnName("DEPTMEAS"); + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); - b.Property("Deptp1m") - .HasColumnType("real") - .HasColumnName("DEPTP1M"); + b.Property("Deptp1m") + .HasColumnType("real") + .HasColumnName("DEPTP1M"); - b.Property("Deptp1v") - .HasColumnType("real") - .HasColumnName("DEPTP1V"); + b.Property("Deptp1v") + .HasColumnType("real") + .HasColumnName("DEPTP1V"); - b.Property("Deptp2m") - .HasColumnType("real") - .HasColumnName("DEPTP2M"); + b.Property("Deptp2m") + .HasColumnType("real") + .HasColumnName("DEPTP2M"); - b.Property("Deptp2v") - .HasColumnType("real") - .HasColumnName("DEPTP2V"); + b.Property("Deptp2v") + .HasColumnType("real") + .HasColumnName("DEPTP2V"); - b.Property("Deptrs1m") - .HasColumnType("real") - .HasColumnName("DEPTRS1M"); + b.Property("Deptrs1m") + .HasColumnType("real") + .HasColumnName("DEPTRS1M"); - b.Property("Deptrs1v") - .HasColumnType("real") - .HasColumnName("DEPTRS1V"); + b.Property("Deptrs1v") + .HasColumnType("real") + .HasColumnName("DEPTRS1V"); - b.Property("Deptrs2m") - .HasColumnType("real") - .HasColumnName("DEPTRS2M"); + b.Property("Deptrs2m") + .HasColumnType("real") + .HasColumnName("DEPTRS2M"); - b.Property("Deptrs2v") - .HasColumnType("real") - .HasColumnName("DEPTRS2V"); + b.Property("Deptrs2v") + .HasColumnType("real") + .HasColumnName("DEPTRS2V"); - b.Property("Deptvert") - .HasColumnType("real") - .HasColumnName("DEPTVERT"); + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); - b.Property("Mclp") - .HasColumnType("real") - .HasColumnName("MCLP"); + b.Property("Mclp") + .HasColumnType("real") + .HasColumnName("MCLP"); - b.Property("Mfd") - .HasColumnType("real") - .HasColumnName("MFD"); + b.Property("Mfd") + .HasColumnType("real") + .HasColumnName("MFD"); - b.Property("Mffp") - .HasColumnType("real") - .HasColumnName("MFFP"); + b.Property("Mffp") + .HasColumnType("real") + .HasColumnName("MFFP"); - b.Property("Mfpp") - .HasColumnType("real") - .HasColumnName("MFPP"); + b.Property("Mfpp") + .HasColumnType("real") + .HasColumnName("MFPP"); - b.Property("Mfrann") - .HasColumnType("real") - .HasColumnName("MFRANN"); + b.Property("Mfrann") + .HasColumnType("real") + .HasColumnName("MFRANN"); - b.Property("Mfrpipe") - .HasColumnType("real") - .HasColumnName("MFRPIPE"); + b.Property("Mfrpipe") + .HasColumnType("real") + .HasColumnName("MFRPIPE"); - b.Property("Mftann") - .HasColumnType("real") - .HasColumnName("MFTANN"); + b.Property("Mftann") + .HasColumnType("real") + .HasColumnName("MFTANN"); - b.Property("Mftpipe") - .HasColumnType("real") - .HasColumnName("MFTPIPE"); + b.Property("Mftpipe") + .HasColumnType("real") + .HasColumnName("MFTPIPE"); - b.Property("Mg1") - .HasColumnType("real") - .HasColumnName("MG1"); + b.Property("Mg1") + .HasColumnType("real") + .HasColumnName("MG1"); - b.Property("Mg1c") - .HasColumnType("real") - .HasColumnName("MG1C"); + b.Property("Mg1c") + .HasColumnType("real") + .HasColumnName("MG1C"); - b.Property("Mg2") - .HasColumnType("real") - .HasColumnName("MG2"); + b.Property("Mg2") + .HasColumnType("real") + .HasColumnName("MG2"); - b.Property("Mg2c") - .HasColumnType("real") - .HasColumnName("MG2C"); + b.Property("Mg2c") + .HasColumnType("real") + .HasColumnName("MG2C"); - b.Property("Mpo1") - .HasColumnType("real") - .HasColumnName("MPO1"); + b.Property("Mpo1") + .HasColumnType("real") + .HasColumnName("MPO1"); - b.Property("Mpo2") - .HasColumnType("real") - .HasColumnName("MPO2"); + b.Property("Mpo2") + .HasColumnType("real") + .HasColumnName("MPO2"); - b.Property("Mr1") - .HasColumnType("real") - .HasColumnName("MR1"); + b.Property("Mr1") + .HasColumnType("real") + .HasColumnName("MR1"); - b.Property("Mr1c") - .HasColumnType("real") - .HasColumnName("MR1C"); + b.Property("Mr1c") + .HasColumnType("real") + .HasColumnName("MR1C"); - b.Property("Mr2") - .HasColumnType("real") - .HasColumnName("MR2"); + b.Property("Mr2") + .HasColumnType("real") + .HasColumnName("MR2"); - b.Property("Mr2c") - .HasColumnType("real") - .HasColumnName("MR2C"); + b.Property("Mr2c") + .HasColumnType("real") + .HasColumnName("MR2C"); - b.Property("Passnum") - .HasColumnType("smallint") - .HasColumnName("PASSNUM"); + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); - b.Property("Spare1") - .HasColumnType("real") - .HasColumnName("SPARE1"); + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); - b.Property("Spare2") - .HasColumnType("real") - .HasColumnName("SPARE2"); + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); - b.Property("Spare3") - .HasColumnType("real") - .HasColumnName("SPARE3"); + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); - b.Property("Spare4") - .HasColumnType("real") - .HasColumnName("SPARE4"); + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); - b.Property("Spare5") - .HasColumnType("real") - .HasColumnName("SPARE5"); + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); - b.Property("Spare6") - .HasColumnType("real") - .HasColumnName("SPARE6"); + b.Property("Spare6") + .HasColumnType("real") + .HasColumnName("SPARE6"); - b.Property("Spare7") - .HasColumnType("real") - .HasColumnName("SPARE7"); + b.Property("Spare7") + .HasColumnType("real") + .HasColumnName("SPARE7"); - b.Property("Spare8") - .HasColumnType("real") - .HasColumnName("SPARE8"); + b.Property("Spare8") + .HasColumnType("real") + .HasColumnName("SPARE8"); - b.Property("Spare9") - .HasColumnType("real") - .HasColumnName("SPARE9"); + b.Property("Spare9") + .HasColumnType("real") + .HasColumnName("SPARE9"); - b.Property("TelemetryId") - .HasColumnType("integer"); + b.Property("TelemetryId") + .HasColumnType("integer"); - b.HasIndex("TelemetryId"); + b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_8"); - }); + 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.HasOne("AsbCloudDb.Model.Deposit", "Deposit") + .WithMany("Clusters") + .HasForeignKey("IdDeposit") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_cluster_t_deposit_id_fk"); - b.Navigation("Deposit"); - }); + b.Navigation("Deposit"); + }); modelBuilder.Entity("AsbCloudDb.Model.Company", b => - { - b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType") - .WithMany("Companies") - .HasForeignKey("IdCompanyType") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType") + .WithMany("Companies") + .HasForeignKey("IdCompanyType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("CompanyType"); - }); + 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.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.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("Contacts") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("CompanyType"); + b.Navigation("CompanyType"); - b.Navigation("Well"); - }); + b.Navigation("Well"); + }); modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => - { - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Well"); - }); + b.Navigation("Well"); + }); modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => - { - b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") - .WithMany() - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("OperationCategory"); + b.Navigation("OperationCategory"); - b.Navigation("Telemetry"); - }); + b.Navigation("Telemetry"); + }); modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => - { - b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") - .WithMany() - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("OperationCategory"); + b.Navigation("OperationCategory"); - b.Navigation("Telemetry"); - }); + 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.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdFileCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany("DrillingProgramParts") - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("DrillingProgramParts") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("FileCategory"); + b.Navigation("FileCategory"); - b.Navigation("Well"); - }); + b.Navigation("Well"); + }); modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Telemetry"); - }); + b.Navigation("Telemetry"); + }); modelBuilder.Entity("AsbCloudDb.Model.Faq", b => - { - b.HasOne("AsbCloudDb.Model.User", "AuthorAnswer") - .WithMany() - .HasForeignKey("IdAuthorAnswer"); + { + b.HasOne("AsbCloudDb.Model.User", "AuthorAnswer") + .WithMany() + .HasForeignKey("IdAuthorAnswer"); - b.HasOne("AsbCloudDb.Model.User", "AuthorQuestion") - .WithMany() - .HasForeignKey("IdAuthorQuestion") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.User", "AuthorQuestion") + .WithMany() + .HasForeignKey("IdAuthorQuestion") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("AuthorAnswer"); + b.Navigation("AuthorAnswer"); - b.Navigation("AuthorQuestion"); - }); + b.Navigation("AuthorQuestion"); + }); modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => - { - b.HasOne("AsbCloudDb.Model.User", "Author") - .WithMany("Files") - .HasForeignKey("IdAuthor"); + { + 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.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Author"); + b.Navigation("Author"); - b.Navigation("FileCategory"); + b.Navigation("FileCategory"); - b.Navigation("Well"); - }); + 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.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.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("FileInfo"); - b.Navigation("User"); - }); + b.Navigation("User"); + }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Telemetry"); - }); + b.Navigation("Telemetry"); + }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Telemetry"); - }); + b.Navigation("Telemetry"); + }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Telemetry"); - }); + b.Navigation("Telemetry"); + }); modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => - { - b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") - .WithMany() - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("FileCategory"); - }); + b.Navigation("FileCategory"); + }); modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Telemetry"); - }); + 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.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.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.HasOne("AsbCloudDb.Model.Manuals.ManualDirectory", "Directory") + .WithMany("Manuals") + .HasForeignKey("IdDirectory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Author"); + b.Navigation("Author"); - b.Navigation("Category"); + b.Navigation("Category"); - b.Navigation("Directory"); - }); + 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.HasOne("AsbCloudDb.Model.Manuals.ManualDirectory", "Parent") + .WithMany("Children") + .HasForeignKey("IdParent") + .OnDelete(DeleteBehavior.Cascade); - b.Navigation("Parent"); - }); + 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.MeasureCategory", "Category") + .WithMany("Measures") + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Category"); + b.Navigation("Category"); - b.Navigation("Well"); - }); + 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.NotificationCategory", "NotificationCategory") + .WithMany("Notifications") + .HasForeignKey("IdNotificationCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("NotificationCategory"); + b.Navigation("NotificationCategory"); - b.Navigation("User"); - }); + 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.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdOperationCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("OperationCategory"); + b.Navigation("OperationCategory"); - b.Navigation("Well"); - }); + b.Navigation("Well"); + }); modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", b => - { - b.HasOne("AsbCloudDb.Model.User", "Author") - .WithMany() - .HasForeignKey("IdAuthor") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.User", "Editor") - .WithMany() - .HasForeignKey("IdEditor") - .OnDelete(DeleteBehavior.Restrict); + b.HasOne("AsbCloudDb.Model.User", "Editor") + .WithMany() + .HasForeignKey("IdEditor") + .OnDelete(DeleteBehavior.Restrict); - b.HasOne("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", "Previous") - .WithMany() - .HasForeignKey("IdPrevious"); + b.HasOne("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", "Previous") + .WithMany() + .HasForeignKey("IdPrevious"); - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .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.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Author"); + b.Navigation("Author"); - b.Navigation("Editor"); + b.Navigation("Editor"); - b.Navigation("Previous"); + b.Navigation("Previous"); - b.Navigation("Well"); + b.Navigation("Well"); - b.Navigation("WellSectionType"); - }); + b.Navigation("WellSectionType"); + }); modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => - { - b.HasOne("AsbCloudDb.Model.User", "Author") - .WithMany() - .HasForeignKey("IdAuthor") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.User", "Editor") - .WithMany() - .HasForeignKey("IdEditor"); + b.HasOne("AsbCloudDb.Model.User", "Editor") + .WithMany() + .HasForeignKey("IdEditor"); - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") - .WithMany() - .HasForeignKey("IdWellSectionType") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Author"); + b.Navigation("Author"); - b.Navigation("Editor"); + b.Navigation("Editor"); - b.Navigation("Well"); + b.Navigation("Well"); - b.Navigation("WellSectionType"); - }); + 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.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.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("Company"); - b.Navigation("Well"); - }); + 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.User", "User") + .WithMany("RelationContactsWells") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("User"); + b.Navigation("User"); - b.Navigation("Well"); - }); + 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.DrillingProgramPart", "DrillingProgramPart") + .WithMany("RelatedUsers") + .HasForeignKey("IdDrillingProgramPart") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("DrillingProgramPart"); + b.Navigation("DrillingProgramPart"); - b.Navigation("User"); - }); + 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.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.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Permission"); + b.Navigation("Permission"); - b.Navigation("UserRole"); - }); + 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", "Role") + .WithMany("RelationUserRoleUserRoles") + .HasForeignKey("Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.UserRole", "IncludeRole") - .WithMany() - .HasForeignKey("IdInclude") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.UserRole", "IncludeRole") + .WithMany() + .HasForeignKey("IdInclude") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("IncludeRole"); + b.Navigation("IncludeRole"); - b.Navigation("Role"); - }); + 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.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.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("User"); + b.Navigation("User"); - b.Navigation("UserRole"); - }); + 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.FileInfo", "File") + .WithMany() + .HasForeignKey("IdFile") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("File"); + b.Navigation("File"); - b.Navigation("Well"); - }); + 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.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.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Driller"); + b.Navigation("Driller"); - b.Navigation("Well"); - }); + 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.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Author"); + b.Navigation("Author"); - b.Navigation("Well"); - }); + 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.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"); - }); + 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.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"); - }); + 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.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_event_t_telemetry_id_fk"); - b.Navigation("Telemetry"); - }); + 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.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_messages_t_telemetry_id_fk"); - b.Navigation("Telemetry"); - }); + 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.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); - b.Navigation("Telemetry"); - }); + 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.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.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("User"); + b.Navigation("User"); - b.Navigation("Well"); - }); + 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.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.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("User"); + b.Navigation("User"); - b.Navigation("Well"); - }); + 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.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired() + .HasConstraintName("t_user_t_company_id_fk"); - b.Navigation("Company"); - }); + b.Navigation("Company"); + }); modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => - { - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("User"); - }); + 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.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.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.HasOne("AsbCloudDb.Model.WellType", "WellType") + .WithMany("Wells") + .HasForeignKey("IdWellType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Cluster"); + b.Navigation("Cluster"); - b.Navigation("Telemetry"); + b.Navigation("Telemetry"); - b.Navigation("WellType"); - }); + 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.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.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.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("Well"); - b.Navigation("WellSectionType"); + b.Navigation("WellSectionType"); - b.Navigation("WellSrc"); - }); + 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.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.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.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Category"); + b.Navigation("Category"); - b.Navigation("User"); + b.Navigation("User"); - b.Navigation("Well"); - }); + 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.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.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.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.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellOperations") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("OperationCategory"); + b.Navigation("OperationCategory"); - b.Navigation("OperationPlan"); + b.Navigation("OperationPlan"); - b.Navigation("Well"); + b.Navigation("Well"); - b.Navigation("WellSectionType"); - }); + b.Navigation("WellSectionType"); + }); modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => - { - b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Parent") - .WithMany() - .HasForeignKey("IdParent"); + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Parent") + .WithMany() + .HasForeignKey("IdParent"); - b.Navigation("Parent"); - }); + 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.WellSectionType", "SectionType") + .WithMany() + .HasForeignKey("IdSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("SectionType"); + b.Navigation("SectionType"); - b.Navigation("Well"); - }); + b.Navigation("Well"); + }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("TelemetryId"); + { + 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.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record1", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Telemetry"); - }); + b.Navigation("Telemetry"); + }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("TelemetryId"); + { + 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.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record50", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Telemetry"); - }); + b.Navigation("Telemetry"); + }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("TelemetryId"); + { + 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.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record60", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Telemetry"); - }); + b.Navigation("Telemetry"); + }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("TelemetryId"); + { + 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.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record61", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Telemetry"); - }); + b.Navigation("Telemetry"); + }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("TelemetryId"); + { + 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.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record7", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Telemetry"); - }); + b.Navigation("Telemetry"); + }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("TelemetryId"); + { + 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.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record8", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Telemetry"); - }); + b.Navigation("Telemetry"); + }); modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => - { - b.Navigation("Wells"); - }); + { + b.Navigation("Wells"); + }); modelBuilder.Entity("AsbCloudDb.Model.Company", b => - { - b.Navigation("RelationCompaniesWells"); + { + b.Navigation("RelationCompaniesWells"); - b.Navigation("Users"); - }); + b.Navigation("Users"); + }); modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => - { - b.Navigation("Companies"); + { + b.Navigation("Companies"); - b.Navigation("Contacts"); - }); + b.Navigation("Contacts"); + }); modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => - { - b.Navigation("Clusters"); - }); + { + b.Navigation("Clusters"); + }); modelBuilder.Entity("AsbCloudDb.Model.Driller", b => - { - b.Navigation("Schedule"); - }); + { + b.Navigation("Schedule"); + }); modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => - { - b.Navigation("RelatedUsers"); - }); + { + b.Navigation("RelatedUsers"); + }); modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => - { - b.Navigation("FileMarks"); - }); + { + b.Navigation("FileMarks"); + }); modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => - { - b.Navigation("Children"); + { + b.Navigation("Children"); - b.Navigation("Manuals"); - }); + b.Navigation("Manuals"); + }); modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => - { - b.Navigation("Measures"); - }); + { + b.Navigation("Measures"); + }); modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => - { - b.Navigation("Notifications"); - }); + { + b.Navigation("Notifications"); + }); modelBuilder.Entity("AsbCloudDb.Model.Permission", b => - { - b.Navigation("RelationUserRolePermissions"); - }); + { + b.Navigation("RelationUserRolePermissions"); + }); modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => - { - b.Navigation("DataSaub"); + { + b.Navigation("DataSaub"); - b.Navigation("DataSpin"); + b.Navigation("DataSpin"); - b.Navigation("Events"); + b.Navigation("Events"); - b.Navigation("Messages"); + b.Navigation("Messages"); - b.Navigation("Users"); + b.Navigation("Users"); - b.Navigation("Well"); - }); + b.Navigation("Well"); + }); modelBuilder.Entity("AsbCloudDb.Model.User", b => - { - b.Navigation("FileMarks"); + { + b.Navigation("FileMarks"); - b.Navigation("Files"); + b.Navigation("Files"); - b.Navigation("RelationContactsWells"); + b.Navigation("RelationContactsWells"); - b.Navigation("RelationUsersUserRoles"); - }); + b.Navigation("RelationUsersUserRoles"); + }); modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => - { - b.Navigation("RelationUserRolePermissions"); + { + b.Navigation("RelationUserRolePermissions"); - b.Navigation("RelationUserRoleUserRoles"); + b.Navigation("RelationUserRoleUserRoles"); - b.Navigation("RelationUsersUserRoles"); - }); + b.Navigation("RelationUsersUserRoles"); + }); modelBuilder.Entity("AsbCloudDb.Model.Well", b => - { - b.Navigation("Contacts"); + { + b.Navigation("Contacts"); - b.Navigation("DrillingProgramParts"); + b.Navigation("DrillingProgramParts"); - b.Navigation("RelationCompaniesWells"); + b.Navigation("RelationCompaniesWells"); - b.Navigation("WellCompositeSrcs"); + b.Navigation("WellCompositeSrcs"); - b.Navigation("WellComposites"); + b.Navigation("WellComposites"); - b.Navigation("WellOperations"); - }); + b.Navigation("WellOperations"); + }); modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => - { - b.Navigation("WellComposites"); + { + b.Navigation("WellComposites"); - b.Navigation("WellOperations"); - }); + b.Navigation("WellOperations"); + }); modelBuilder.Entity("AsbCloudDb.Model.WellType", b => - { - b.Navigation("Wells"); - }); + { + b.Navigation("Wells"); + }); #pragma warning restore 612, 618 } } diff --git a/AsbCloudInfrastructure/Repository/FileRepository.cs b/AsbCloudInfrastructure/Repository/FileRepository.cs index 2a203879..3e97da03 100644 --- a/AsbCloudInfrastructure/Repository/FileRepository.cs +++ b/AsbCloudInfrastructure/Repository/FileRepository.cs @@ -36,9 +36,6 @@ namespace AsbCloudInfrastructure.Repository var query = dbSetConfigured .Where(e => e.IdWell == request.IdWell); - double timezoneOffsetHours = query.FirstOrDefault() - ?.Well.Timezone.Hours ?? 5d; - if (request.IdCategory is not null) query = query.Where(x => x.IdCategory == request.IdCategory); diff --git a/AsbCloudInfrastructure/Repository/ScheduleRepository.cs b/AsbCloudInfrastructure/Repository/ScheduleRepository.cs index 781b51ee..413bb661 100644 --- a/AsbCloudInfrastructure/Repository/ScheduleRepository.cs +++ b/AsbCloudInfrastructure/Repository/ScheduleRepository.cs @@ -90,9 +90,11 @@ namespace AsbCloudInfrastructure.Repository protected override ScheduleDto Convert(Schedule entity) { var hoursOffset = wellService.GetTimezone(entity.IdWell).Hours; + var timeSpan = TimeSpan.FromHours(hoursOffset); + var dto = base.Convert(entity); - dto.DrillStart = entity.DrillStart.ToOffset(TimeSpan.FromHours(hoursOffset)); - dto.DrillEnd = entity.DrillEnd.ToOffset(TimeSpan.FromHours(hoursOffset)); + dto.DrillStart = entity.DrillStart.ToOffset(timeSpan); + dto.DrillEnd = entity.DrillEnd.ToOffset(timeSpan); return dto; } } diff --git a/AsbCloudInfrastructure/Repository/TelemetryWirelineRunOutRepository.cs b/AsbCloudInfrastructure/Repository/TelemetryWirelineRunOutRepository.cs index ed1f02cf..af2b6438 100644 --- a/AsbCloudInfrastructure/Repository/TelemetryWirelineRunOutRepository.cs +++ b/AsbCloudInfrastructure/Repository/TelemetryWirelineRunOutRepository.cs @@ -94,7 +94,7 @@ namespace AsbCloudInfrastructure.Repository { var entity = dto.Adapt(); entity.IdTelemetry = idTelemetry; - entity.DateTime = dto.DateTime.ToOffset(TimeSpan.FromHours(timezoneOffset)); + entity.DateTime = dto.DateTime.ToUniversalTime(); return entity; } diff --git a/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs b/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs index 94c50ebf..6ac07c52 100644 --- a/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs +++ b/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs @@ -37,11 +37,10 @@ namespace AsbCloudInfrastructure.Repository if (!trajectoryRows.All(r => r.IdWell == idWell)) throw new ArgumentInvalidException(nameof(trajectoryRows), "Все строки должны относиться к одной скважине"); - var offsetHours = wellService.GetTimezone(idWell).Hours; var entities = trajectoryRows .Select(e => { - var entity = Convert(e, offsetHours); + var entity = Convert(e); entity.Id = 0; return entity; }); @@ -52,8 +51,7 @@ namespace AsbCloudInfrastructure.Repository public async Task AddAsync(Tdto trajectoryRow, CancellationToken token) { - var offsetHours = wellService.GetTimezone(trajectoryRow.IdWell).Hours; - var entity = Convert(trajectoryRow, offsetHours); + var entity = Convert(trajectoryRow); entity.Id = 0; db.Set().Add(entity); return await db.SaveChangesAsync(token) @@ -98,8 +96,7 @@ namespace AsbCloudInfrastructure.Repository public async Task UpdateAsync(Tdto row, CancellationToken token) { - var offsetHours = wellService.GetTimezone(row.IdWell).Hours; - var entity = Convert(row, offsetHours); + var entity = Convert(row); db.Set().Update(entity); return await db.SaveChangesAsync(token) .ConfigureAwait(false); @@ -112,10 +109,10 @@ namespace AsbCloudInfrastructure.Repository return dto; } - private static TEntity Convert(Tdto dto, double offsetHours) + private static TEntity Convert(Tdto dto) { var entity = dto.Adapt(); - entity.UpdateDate = DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(offsetHours)); + entity.UpdateDate = DateTimeOffset.Now; return entity; } } diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 4e494c77..a5f12a2b 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -98,6 +98,10 @@ public class WellOperationRepository : IWellOperationRepository /// public async Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token) { + var timeSpans = idsWells + .Distinct() + .ToDictionary(idWell => idWell, idWell => TimeSpan.FromHours(wellService.GetTimezone(idWell).Hours)); + var cache = await memoryCache.GetOrCreateAsync(KeyCacheSections, async (entry) => { entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30); @@ -146,10 +150,10 @@ public class WellOperationRepository : IWellOperationRepository Caption = item.Caption, - DateStart = item.First.DateStart, + DateStart = item.First.DateStart.ToOffset(timeSpans[item.IdWell]), + DateEnd = item.Last.DateStart.ToOffset(timeSpans[item.IdWell]).AddHours(item.Last.DurationHours), + DepthStart = item.First.DepthStart, - - DateEnd = item.Last.DateStart.AddHours(item.Last.DurationHours), DepthEnd = item.Last.DepthEnd, }) .ToArray() diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index 7570a95f..da55b708 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -108,15 +108,15 @@ public class DailyReportService : IDailyReportService var offsetHours = wellService.GetTimezone(dailyReport.IdWell).Hours; var geDate = new DateTimeOffset(dailyReport.Date, TimeOnly.MinValue, TimeSpan.FromHours(offsetHours)); - var ltDate = new DateTimeOffset(dailyReport.Date.AddDays(1), TimeOnly.MinValue, TimeSpan.FromHours(offsetHours)); + var leDate = new DateTimeOffset(dailyReport.Date.AddDays(1), TimeOnly.MinValue, TimeSpan.FromHours(offsetHours)); var factOperationRequest = new WellOperationRequest { IdWell = idWell, OperationType = WellOperation.IdOperationTypeFact, GeDate = geDate, - LeDate = ltDate - }; + LeDate = leDate + }; var factWellOperations = (await wellOperationRepository.GetAsync(factOperationRequest, cancellationToken)) .OrderBy(o => o.DateStart) @@ -131,12 +131,12 @@ public class DailyReportService : IDailyReportService dailyReport.DepthStart = factWellOperations.FirstOrDefault()?.DepthStart; dailyReport.DepthEnd = factWellOperations.LastOrDefault()?.DepthEnd; - await UpdateTimeBalanceBlockAsync(dailyReport, factWellOperations, cancellationToken); - await UpdateSubsystemBlockAsync(dailyReport, cancellationToken); + await UpdateTimeBalanceBlockAsync(dailyReport, factWellOperations, geDate, leDate, cancellationToken); + await UpdateSubsystemBlockAsync(dailyReport, geDate, leDate, cancellationToken); - await AddTrajectoryBlockAsync(dailyReport, cancellationToken); + await AddTrajectoryBlockAsync(dailyReport, geDate, leDate, cancellationToken); await AddScheduleBlockAsync(dailyReport, geDate, cancellationToken); - await AddProcessMapWellDrillingBlockAsync(dailyReport, cancellationToken); + await AddProcessMapWellDrillingBlockAsync(dailyReport, geDate, leDate, cancellationToken); AddFactWellOperationBlock(dailyReport, factWellOperations); @@ -228,11 +228,11 @@ public class DailyReportService : IDailyReportService IdWell = idWell }; - var geDate = date.ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); - var leDate = date.AddDays(1).ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); + var geDate = new DateTimeOffset(date, TimeOnly.MinValue, offset); + var leDate = new DateTimeOffset(date.AddDays(1), TimeOnly.MinValue, offset); - var factWellOperationPerDay = factWellOperations.Where(o => o.DateStart.Date >= geDate && - o.DateStart.Date <= leDate); + var factWellOperationPerDay = factWellOperations.Where(o => o.DateStart >= geDate && + o.DateStart <= leDate); AddFactWellOperationBlock(dailyReport, factWellOperationPerDay); @@ -267,7 +267,7 @@ public class DailyReportService : IDailyReportService } private async Task UpdateTimeBalanceBlockAsync(DailyReportDto dailyReport, IEnumerable factWellOperations, - CancellationToken cancellationToken) + DateTimeOffset geDateStart, DateTimeOffset leDateEnd, CancellationToken cancellationToken) { const int idWellOperationSlipsTime = 5011; @@ -276,10 +276,7 @@ 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( + dailyReport.TimeBalanceBlock.WellOperationSlipsTimeCount = (await detectedOperationService.GetAsync( new DetectedOperationByWellRequest { IdsCategories = new[] { idWellOperationSlipsTime }, @@ -294,11 +291,9 @@ public class DailyReportService : IDailyReportService } } - private async Task AddTrajectoryBlockAsync(DailyReportDto dailyReport, CancellationToken cancellationToken) + private async Task AddTrajectoryBlockAsync(DailyReportDto dailyReport, + DateTimeOffset geDate, DateTimeOffset leDate, 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, @@ -328,7 +323,8 @@ public class DailyReportService : IDailyReportService }); } - private async Task UpdateSubsystemBlockAsync(DailyReportDto dailyReport, CancellationToken cancellationToken) + private async Task UpdateSubsystemBlockAsync(DailyReportDto dailyReport, + DateTimeOffset geDate, DateTimeOffset leDate, CancellationToken cancellationToken) { dailyReport.SubsystemBlock ??= new SubsystemBlockDto(); @@ -340,9 +336,6 @@ 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 { @@ -366,12 +359,9 @@ public class DailyReportService : IDailyReportService } } - private async Task AddProcessMapWellDrillingBlockAsync(DailyReportDto dailyReport, CancellationToken cancellationToken) + private async Task AddProcessMapWellDrillingBlockAsync(DailyReportDto dailyReport, + DateTimeOffset geDate, DateTimeOffset leDate, CancellationToken cancellationToken) { - var offsetHours = wellService.GetTimezone(dailyReport.IdWell).Hours; - var geDate = new DateTimeOffset(dailyReport.Date, TimeOnly.MinValue, TimeSpan.FromHours(offsetHours)); - var leDate = new DateTimeOffset(dailyReport.Date.AddDays(1), TimeOnly.MinValue, TimeSpan.FromHours(offsetHours)); - var request = new DataSaubStatRequest(); dailyReport.ProcessMapWellDrillingBlock = (await processMapReportDrillingService.GetAsync(dailyReport.IdWell, request, cancellationToken)).Where(p => p.DateStart >= geDate && p.DateStart <= leDate) diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs index 52966fad..53ed062b 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs @@ -102,7 +102,7 @@ namespace AsbCloudInfrastructure.Services.SAUB if (dateBegin == default) { var dateRange = telemetryDataCache.GetOrDefaultDataDateRange(telemetry.Id); - dateBeginUtc = (dateRange?.To.ToOffset(timezone.Offset) ?? DateTimeOffset.UtcNow) + dateBeginUtc = (dateRange?.To ?? DateTimeOffset.UtcNow) .AddSeconds(-intervalSec); } else diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs index 74643429..a75c7bf3 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs @@ -156,7 +156,9 @@ namespace AsbCloudInfrastructure.Services.SAUB var to = cacheItem.LastData[^1].DateTime; from = from ?? cacheItem.LastData[0].DateTime; - return new DatesRangeDto { From = from.Value, To = to }; + return new DatesRangeDto { + From = from.Value.ToUtcDateTimeOffset(cacheItem.TimezoneHours), + To = to.ToUtcDateTimeOffset(cacheItem.TimezoneHours) }; } public DatesRangeDto? GetOrDefaultCachedDateRange(int idTelemetry) diff --git a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs index c4463a78..ca61dc49 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs @@ -157,7 +157,7 @@ public class OperationsStatService : IOperationsStatService WellType = wellType?.Caption ?? "", IdState = well.IdState, State = wellService.GetStateText(well.IdState), - LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id).ToOffset(timezone.Offset), + LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id), Companies = await wellService.GetCompaniesAsync(well.Id, token) }; From e2cd8cbfd23d006a1d7b94a697f314f638f01606 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 26 Mar 2024 10:16:18 +0500 Subject: [PATCH 38/52] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B8=D0=B9=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= =?UTF-8?q?=20GetDatesRangeAsync=20=D0=B2=20IDailyReportService=20+=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DailyReport/IDailyReportService.cs | 8 ---- .../DailyReport/DailyReportService.cs | 41 ++++--------------- .../Services/DailyReportServiceTest.cs | 7 ++-- .../Controllers/DailyReportController.cs | 3 +- 4 files changed, 13 insertions(+), 46 deletions(-) diff --git a/AsbCloudApp/Services/DailyReport/IDailyReportService.cs b/AsbCloudApp/Services/DailyReport/IDailyReportService.cs index f0318025..b39375a6 100644 --- a/AsbCloudApp/Services/DailyReport/IDailyReportService.cs +++ b/AsbCloudApp/Services/DailyReport/IDailyReportService.cs @@ -42,12 +42,4 @@ public interface IDailyReportService /// /// Task> GetAsync(int idWell, FileReportRequest request, CancellationToken cancellationToken); - - /// - /// Получить диапазон дат по которым возможно сформировать суточный отчёты - /// - /// - /// - /// - Task GetDatesRangeAsync(int idWell, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index da55b708..488d573f 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -153,7 +153,7 @@ public class DailyReportService : IDailyReportService Items = Enumerable.Empty() }; - var datesRange = await GetDatesRangeAsync(idWell, cancellationToken); + var datesRange = await wellOperationRepository.GetDatesRangeAsync(idWell, WellOperation.IdOperationTypeFact, cancellationToken); if (datesRange is null) return result; @@ -177,9 +177,8 @@ public class DailyReportService : IDailyReportService datesRange.To = finishDate; } - if (datesRange.From.AddDays(result.Skip) <= datesRange.To) - result.Count = (int)(Math.Ceiling((datesRange.To - DateTimeOffset.UnixEpoch).TotalDays) - - Math.Floor((datesRange.From - DateTimeOffset.UnixEpoch).TotalDays)) + 1; + result.Count = (int)(Math.Ceiling((datesRange.To - DateTimeOffset.UnixEpoch).TotalDays) + - Math.Floor((datesRange.From - DateTimeOffset.UnixEpoch).TotalDays)); var existingDailyReports = await dailyReportRepository.GetAsync(idWell, request, cancellationToken); @@ -240,32 +239,6 @@ public class DailyReportService : IDailyReportService } } - public async Task GetDatesRangeAsync(int idWell, CancellationToken cancellationToken) - { - var timezone = wellService.GetTimezone(idWell); - var currentDate = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(timezone.Hours)); - - var factOperationDatesRange = await wellOperationRepository.GetDatesRangeAsync(idWell, WellOperation.IdOperationTypeFact, - cancellationToken); - - if (factOperationDatesRange is null) - return null; - - var from = (factOperationDatesRange.From.AddDays(1) <= DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(timezone.Hours)) ? - factOperationDatesRange.From : - currentDate.AddDays(-1)); - - var to = (factOperationDatesRange.To.AddDays(1) <= DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(timezone.Hours)) ? - factOperationDatesRange.To : - currentDate.AddDays(-1)); - - return new DatesRangeDto - { - From = from, - To = to - }; - } - private async Task UpdateTimeBalanceBlockAsync(DailyReportDto dailyReport, IEnumerable factWellOperations, DateTimeOffset geDateStart, DateTimeOffset leDateEnd, CancellationToken cancellationToken) { @@ -400,13 +373,13 @@ public class DailyReportService : IDailyReportService private async Task IsDateDailyReportInRangeAsync(int idWell, DateOnly dateDailyReport, CancellationToken cancellationToken) { - var datesRange = await GetDatesRangeAsync(idWell, cancellationToken); + var datesRange = await wellOperationRepository.GetDatesRangeAsync(idWell, WellOperation.IdOperationTypeFact, cancellationToken); if (datesRange is null) return false; - var from = DateOnly.FromDateTime(datesRange.From.ToUniversalTime().DateTime); - var to = DateOnly.FromDateTime(datesRange.To.ToUniversalTime().DateTime); + var from = DateOnly.FromDateTime(datesRange.From.DateTime); + var to = DateOnly.FromDateTime(datesRange.To.DateTime); - return dateDailyReport >= from && dateDailyReport <= to; + return dateDailyReport >= from && dateDailyReport <= to; } } \ No newline at end of file diff --git a/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs b/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs index ac109d7f..b8e61aa0 100644 --- a/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs @@ -12,6 +12,7 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudApp.Services.ProcessMaps.WellDrilling; +using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.DailyReport; using NSubstitute; using System; @@ -282,7 +283,7 @@ public class DailyReportServiceTest subsystemServiceMock.GetStatAsync(Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(new[] { fakeSubsystemsStat }); - scheduleRepositoryMock.GetAsync(Arg.Any(), Arg.Any(), Arg.Any()) + scheduleRepositoryMock.GetAsync(Arg.Any(), Arg.Any(), Arg.Any()) .ReturnsForAnyArgs(new[] { fakeShedule }); processMapReportWellDrillingServiceMock.GetAsync(Arg.Any(), fakeRequest, Arg.Any()) @@ -523,12 +524,12 @@ public class DailyReportServiceTest .Returns(datesRange); //act - var result = await dailyReportService.GetDatesRangeAsync(idWell, CancellationToken.None); + var result = await wellOperationRepositoryMock.GetDatesRangeAsync(idWell, WellOperation.IdOperationTypeFact, CancellationToken.None); //assert Assert.NotNull(result); Assert.True(result.From <= result.To); - Assert.True(result.To < DateTime.UtcNow.Date); + Assert.True(result.To < DateTimeOffset.UtcNow); } public static IEnumerable DateDailyReport() diff --git a/AsbCloudWebApi/Controllers/DailyReportController.cs b/AsbCloudWebApi/Controllers/DailyReportController.cs index e36868f1..682dc74d 100644 --- a/AsbCloudWebApi/Controllers/DailyReportController.cs +++ b/AsbCloudWebApi/Controllers/DailyReportController.cs @@ -13,6 +13,7 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudApp.Services.DailyReport; +using AsbCloudDb.Model; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -156,7 +157,7 @@ public class DailyReportController : ControllerBase { await AssertUserAccessToWell(idWell, cancellationToken); - var datesRanges = await dailyReportService.GetDatesRangeAsync(idWell, cancellationToken); + var datesRanges = await wellOperationRepository.GetDatesRangeAsync(idWell, WellOperation.IdOperationTypeFact, cancellationToken); return Ok(datesRanges); } From 945cd10baa4be39acaf93c60470b2a6b8d865352 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 Mar 2024 11:35:36 +0300 Subject: [PATCH 39/52] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=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 --- .../Repositories/IWellOperationRepository.cs | 8 - ...20240320074649_Update_ItemInfo.Designer.cs | 9389 ----------------- .../20240320074649_Update_ItemInfo.cs | 37 - .../AsbCloudDbContextModelSnapshot.cs | 126 +- AsbCloudDb/Model/ItemInfo.cs | 2 +- .../AsbCloudInfrastructure.csproj | 5 - .../Repository/CrudRepositoryBase.cs | 27 +- .../Repository/WellOperationRepository.cs | 38 +- .../Services/WellService.cs | 5 +- 9 files changed, 101 insertions(+), 9536 deletions(-) delete mode 100644 AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.Designer.cs delete mode 100644 AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.cs diff --git a/AsbCloudApp/Repositories/IWellOperationRepository.cs b/AsbCloudApp/Repositories/IWellOperationRepository.cs index 2c2817d2..ffc69970 100644 --- a/AsbCloudApp/Repositories/IWellOperationRepository.cs +++ b/AsbCloudApp/Repositories/IWellOperationRepository.cs @@ -76,14 +76,6 @@ namespace AsbCloudApp.Repositories /// Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token); - /// - /// Получить диапазон дат выполнения операций - /// - /// - /// - /// - DatesRangeDto? GetDatesRange(int idWell, int idType); - /// /// Получить диапазон дат выполнения операций /// diff --git a/AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.Designer.cs b/AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.Designer.cs deleted file mode 100644 index 19f8bce0..00000000 --- a/AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.Designer.cs +++ /dev/null @@ -1,9389 +0,0 @@ -// -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("20240320074649_Update_ItemInfo")] - partial class Update_ItemInfo - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .UseCollation("Russian_Russia.1251") - .HasAnnotation("ProductVersion", "8.0.2") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); - - b.Property("IdDeposit") - .HasColumnType("integer") - .HasColumnName("id_deposit"); - - b.Property("Latitude") - .HasColumnType("double precision") - .HasColumnName("latitude"); - - b.Property("Longitude") - .HasColumnType("double precision") - .HasColumnName("longitude"); - - b.Property("Timezone") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("timezone") - .HasComment("Смещение часового пояса от UTC"); - - b.HasKey("Id"); - - b.HasIndex("IdDeposit"); - - b.ToTable("t_cluster", t => - { - t.HasComment("Кусты"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Company", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption"); - - b.Property("IdCompanyType") - .HasMaxLength(255) - .HasColumnType("integer") - .HasColumnName("id_company_type") - .HasComment("вид деятельности"); - - b.HasKey("Id"); - - b.HasIndex("IdCompanyType"); - - b.ToTable("t_company"); - - b.HasData( - new - { - Id = 1, - Caption = "ООО \"АСБ\"", - IdCompanyType = 3 - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption"); - - b.Property("IsContact") - .HasColumnType("boolean") - .HasColumnName("is_contact"); - - b.Property("Order") - .HasColumnType("integer") - .HasColumnName("order"); - - b.HasKey("Id"); - - b.ToTable("t_company_type"); - - b.HasData( - new - { - Id = 1, - Caption = "Недропользователь", - IsContact = true, - Order = 3 - }, - new - { - Id = 2, - Caption = "Буровой подрядчик", - IsContact = true, - Order = 2 - }, - new - { - Id = 3, - Caption = "Сервис автоматизации бурения", - IsContact = true, - Order = 0 - }, - new - { - Id = 4, - Caption = "Сервис по ГТИ", - IsContact = true, - Order = 6 - }, - new - { - Id = 5, - Caption = "Растворный сервис", - IsContact = true, - Order = 4 - }, - new - { - Id = 6, - Caption = "Сервис по ННБ", - IsContact = true, - Order = 5 - }, - new - { - Id = 7, - Caption = "Служба супервайзинга", - IsContact = false, - Order = 1 - }, - new - { - Id = 9, - Caption = "Сервис по цементированию", - IsContact = true, - Order = 7 - }, - new - { - Id = 11, - Caption = "Дизельный сервис", - IsContact = false, - Order = 9 - }, - new - { - Id = 12, - Caption = "Сервис по обслуживанию верхних силовых приводов", - IsContact = true, - Order = 8 - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Contact", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Company") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("company") - .HasComment("компания"); - - b.Property("Email") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("email") - .HasComment("email"); - - b.Property("FullName") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("full_name") - .HasComment("ФИО"); - - b.Property("IdCompanyType") - .HasMaxLength(255) - .HasColumnType("integer") - .HasColumnName("id_company_type") - .HasComment("вид деятельности"); - - b.Property("IdWell") - .HasMaxLength(255) - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("ключ скважины"); - - b.Property("Phone") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("phone") - .HasComment("номер телефона"); - - b.Property("Position") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("position") - .HasComment("должность"); - - b.HasKey("Id"); - - b.HasIndex("IdCompanyType"); - - b.HasIndex("IdWell"); - - b.ToTable("t_contact", t => - { - t.HasComment("Контакты"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Date") - .HasColumnType("date") - .HasColumnName("date") - .HasComment("Дата формирования отчёта"); - - b.Property("DateLastUpdate") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_last_update") - .HasComment("Дата последнего обновления"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("ID скважины"); - - b.Property("SignBlock") - .HasColumnType("jsonb") - .HasColumnName("sign_block") - .HasComment("Подпись"); - - b.Property("SubsystemBlock") - .HasColumnType("jsonb") - .HasColumnName("subsystem_block") - .HasComment("Наработкой подсистем"); - - b.Property("TimeBalanceBlock") - .HasColumnType("jsonb") - .HasColumnName("time_balance_block") - .HasComment("Баланс времени"); - - b.HasKey("Id"); - - b.HasIndex("IdWell", "Date") - .IsUnique(); - - b.ToTable("t_daily_report", t => - { - t.HasComment("Ежедневные отчёты"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AxialLoad") - .HasColumnType("double precision") - .HasColumnName("axial_load") - .HasComment("Фактическая нагрузка"); - - b.Property("AxialLoadLimitMax") - .HasColumnType("double precision") - .HasColumnName("axial_load_limit_max") - .HasComment("Максимально допустимая нагрузка"); - - b.Property("AxialLoadSp") - .HasColumnType("double precision") - .HasColumnName("axial_load_sp") - .HasComment("Ограничение факт. нагрузки"); - - b.Property("BlockSpeedSp") - .HasColumnType("double precision") - .HasColumnName("block_speed_sp") - .HasComment("Ограничение скорости блока"); - - b.Property("DateEnd") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_end") - .HasComment("Дата и время окончания"); - - b.Property("DateStart") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_start") - .HasComment("Дата и время начала"); - - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Глубина забоя по стволу конечная"); - - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Глубина забоя по стволу начальная"); - - b.Property("EnabledSubsystems") - .HasColumnType("integer") - .HasColumnName("enabled_subsystems") - .HasComment("Флаги подсистем"); - - b.Property("Flow") - .HasColumnType("double precision") - .HasColumnName("flow") - .HasComment("Фактический расход"); - - b.Property("HasOscillation") - .HasColumnType("boolean") - .HasColumnName("has_oscillation") - .HasComment("Наличие или отсутствие осцилляции"); - - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("Название автоопределённой операции"); - - b.Property("IdFeedRegulator") - .HasColumnType("smallint") - .HasColumnName("id_feed_regulator") - .HasComment("Работа при достижении ограничения"); - - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry") - .HasComment("Ключ телеметрии"); - - b.Property("Pressure") - .HasColumnType("double precision") - .HasColumnName("pressure") - .HasComment("Давление"); - - b.Property("PressureIdle") - .HasColumnType("double precision") - .HasColumnName("pressure_idle") - .HasComment("Давление холостого хода"); - - b.Property("PressureSp") - .HasColumnType("double precision") - .HasColumnName("pressure_sp") - .HasComment("Ограничение фактического давления"); - - b.Property("RotorSpeed") - .HasColumnType("double precision") - .HasColumnName("rotor_speed") - .HasComment("Фактическая скорость оборотов ВСП"); - - b.Property("RotorTorque") - .HasColumnType("double precision") - .HasColumnName("rotor_torque") - .HasComment("Фактический момент"); - - b.Property("RotorTorqueLimitMax") - .HasColumnType("double precision") - .HasColumnName("rotor_torque_limit_max") - .HasComment("Максимально допустимый момент"); - - b.Property("RotorTorqueSp") - .HasColumnType("double precision") - .HasColumnName("rotor_torque_sp") - .HasComment("Ограничение факт. момента"); - - b.Property("Speed") - .HasColumnType("double precision") - .HasColumnName("speed") - .HasComment("Скорость бурения"); - - b.HasKey("Id"); - - b.HasIndex("IdCategory"); - - b.HasIndex("IdTelemetry"); - - b.ToTable("t_data_saub_stat", t => - { - t.HasComment("Кеш-таблица для хранения данных для РТК-отчета"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption"); - - b.Property("Latitude") - .HasColumnType("double precision") - .HasColumnName("latitude"); - - b.Property("Longitude") - .HasColumnType("double precision") - .HasColumnName("longitude"); - - b.Property("Timezone") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("timezone") - .HasComment("Смещение часового пояса от UTC"); - - b.HasKey("Id"); - - b.ToTable("t_deposit", t => - { - t.HasComment("Месторождение"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("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", t => - { - t.HasComment("автоматически определенные операции по телеметрии"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => - { - b.Property("Id") - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); - - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry") - .HasComment("Идентификатор телеметрии"); - - b.Property("DepthStart") - .HasColumnType("real") - .HasColumnName("depthStart") - .HasComment("Глубина начала"); - - b.Property("Params") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("t_drill_test_params") - .HasComment("Параметры записи drill test"); - - b.Property("TimeStampStart") - .HasColumnType("timestamp with time zone") - .HasColumnName("timestamp_start") - .HasComment("Время начала"); - - b.HasKey("Id", "IdTelemetry"); - - b.HasIndex("IdTelemetry"); - - b.ToTable("t_drill_test", t => - { - t.HasComment("Drill_test"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Driller", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name") - .HasComment("Имя"); - - b.Property("Patronymic") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("patronymic") - .HasComment("Отчество"); - - b.Property("Surname") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("surname") - .HasComment("Фамилия"); - - b.HasKey("Id"); - - b.ToTable("t_driller", t => - { - t.HasComment("Бурильщик"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdFileCategory") - .HasColumnType("integer") - .HasColumnName("id_file_category"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well"); - - b.HasKey("Id"); - - b.HasIndex("IdFileCategory"); - - b.HasIndex("IdWell", "IdFileCategory") - .IsUnique(); - - b.ToTable("t_drilling_program_part", t => - { - t.HasComment("части программ бурения"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Faq", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Answer") - .HasColumnType("text") - .HasColumnName("answer") - .HasComment("Текст ответа"); - - b.Property("CounterQuestion") - .HasColumnType("integer") - .HasColumnName("counter_question") - .HasComment("Счетчик повторений вопроса"); - - b.Property("DateAnswer") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_answer") - .HasComment("Дата ответа"); - - b.Property("DateCreatedQuestion") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_created_question") - .HasComment("Дата создания вопроса"); - - b.Property("DateLastEditedQuestion") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_last_edited_question") - .HasComment("Дата последнего редактирования вопроса"); - - b.Property("IdAuthorAnswer") - .HasColumnType("integer") - .HasColumnName("id_author_answer") - .HasComment("id автора ответа"); - - b.Property("IdAuthorQuestion") - .HasColumnType("integer") - .HasColumnName("id_author_question") - .HasComment("id автора вопроса"); - - b.Property("IdReplacementQuestion") - .HasColumnType("integer") - .HasColumnName("id_replacement_question") - .HasComment("Ключ заменяющего вопроса"); - - b.Property("IsFrequently") - .HasColumnType("boolean") - .HasColumnName("is_frequently") - .HasComment("Частый вопрос"); - - b.Property("Question") - .IsRequired() - .HasColumnType("text") - .HasColumnName("question") - .HasComment("Текст вопроса"); - - b.Property("State") - .HasColumnType("integer") - .HasColumnName("state") - .HasComment("Статус вопроса"); - - b.HasKey("Id"); - - b.HasIndex("IdAuthorAnswer"); - - b.HasIndex("IdAuthorQuestion"); - - b.ToTable("t_faq", t => - { - t.HasComment("вопросы пользователей"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название категории"); - - b.Property("ShortName") - .HasColumnType("text") - .HasColumnName("short_name") - .HasComment("Короткое название категории"); - - b.HasKey("Id"); - - b.ToTable("t_file_category", t => - { - t.HasComment("Категории файлов"); - }); - - b.HasData( - new - { - Id = 1, - Name = "Растворный сервис", - ShortName = "fluidService" - }, - new - { - Id = 2, - Name = "Цементирование", - ShortName = "cement" - }, - new - { - Id = 3, - Name = "ННБ", - ShortName = "nnb" - }, - new - { - Id = 4, - Name = "ГТИ", - ShortName = "gti" - }, - new - { - Id = 5, - Name = "Документы по скважине", - ShortName = "wellDocuments" - }, - new - { - Id = 6, - Name = "Супервайзер", - ShortName = "supervisor" - }, - new - { - Id = 7, - Name = "Мастер", - ShortName = "master" - }, - new - { - Id = 8, - Name = "Долотный сервис", - ShortName = "toolService" - }, - new - { - Id = 9, - Name = "Буровой подрядчик", - ShortName = "drillService" - }, - new - { - Id = 10, - Name = "Сервис по заканчиванию скважины", - ShortName = "closingService" - }, - new - { - Id = 12, - Name = "Рапорт", - ShortName = "report" - }, - new - { - Id = 1000, - Name = "Программа бурения" - }, - new - { - Id = 1001, - Name = "Задание от геологов" - }, - new - { - Id = 1002, - Name = "Профиль ствола скважины (ННБ)" - }, - new - { - Id = 1003, - Name = "Технологические расчеты (ННБ)" - }, - new - { - Id = 1004, - Name = "Долотная программа" - }, - new - { - Id = 1005, - Name = "Программа по растворам" - }, - new - { - Id = 1006, - Name = "Программа геофизических исследований" - }, - new - { - Id = 1007, - Name = "Планы спусков обсадных колонн" - }, - new - { - Id = 1008, - Name = "Программы цементирования обсадных колонн" - }, - new - { - Id = 10000, - Name = "Проект на бурение транспортного и горизонтального участков скважины" - }, - new - { - Id = 10001, - Name = "Программа на бурение транспортного и горизонтального участков скважины" - }, - new - { - Id = 10002, - Name = "Акт о начале бурения" - }, - new - { - Id = 10003, - Name = "План работ спуска и цементирования направления" - }, - new - { - Id = 10004, - Name = "Программа цементирования направления" - }, - new - { - Id = 10005, - Name = "Мера обсадных труб (направление)" - }, - new - { - Id = 10006, - Name = "Акт на выполненные работы по цементированию направления" - }, - new - { - Id = 10007, - Name = "Отчет по цементированию направления (график)" - }, - new - { - Id = 10008, - Name = "План работ спуска и цементирования кондуктора" - }, - new - { - Id = 10009, - Name = "Программа цементирования (кондуктор)" - }, - new - { - Id = 10010, - Name = "Мера обсадных труб (кондуктор)" - }, - new - { - Id = 10011, - Name = "Карта крепления кондуктора" - }, - new - { - Id = 10012, - Name = "Акт на выполненные работы по цементированию кондуктора" - }, - new - { - Id = 10013, - Name = "Отчет по цементированию кондуктора (график)" - }, - new - { - Id = 10014, - Name = "Акт о замере расстояния от стола ротора до муфты кондуктора" - }, - new - { - Id = 10015, - Name = "Акт опресовки цементного кольца за кондуктором" - }, - new - { - Id = 10016, - Name = "Акт опресовки ППГ с глухими плашками совместно с кондуктором" - }, - new - { - Id = 10017, - Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с кондуктором" - }, - new - { - Id = 10018, - Name = "План работ на крепление обсадной колонны (эк. колонна)" - }, - new - { - Id = 10019, - Name = "Программа цементирования (эк. колонна)" - }, - new - { - Id = 10020, - Name = "Мера труб эксплуатационной колонны" - }, - new - { - Id = 10021, - Name = "Карта по креплению скважины (эк. колонна)" - }, - new - { - Id = 10022, - Name = "Акт на установку пружинных центраторов" - }, - new - { - Id = 10023, - Name = "Отчет по цементированию эксплуатационной колонны (график)" - }, - new - { - Id = 10024, - Name = "Акт на выполненные работы по цементированию эксплуатационной колонны" - }, - new - { - Id = 10025, - Name = "Акт об испытании эк. колонны на герметичность (СТОП)" - }, - new - { - Id = 10026, - Name = "Акт опресовки ППГ с глухими плашками совместно с э/колонной" - }, - new - { - Id = 10027, - Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с э/колонной" - }, - new - { - Id = 10028, - Name = "Акт на вскрытие продуктивного пласта" - }, - new - { - Id = 10029, - Name = "Акт замера параметров раствора при бурении горизонтального участка" - }, - new - { - Id = 10030, - Name = "Разрешение на спуск «хвостовика» (телефонограмма)" - }, - new - { - Id = 10031, - Name = "План работ на спуск «хвостовика»" - }, - new - { - Id = 10032, - Name = "Акт готовности бурового и энергетического оборудования к спуску «хвостовика»" - }, - new - { - Id = 10033, - Name = "Акт шаблонировки ствола скважины перед спуском «хвостовика»" - }, - new - { - Id = 10034, - Name = "Мера обсадных труб (хвостовик)" - }, - new - { - Id = 10035, - Name = "Акт выполненных работ по спуску хвостовика с закачкой (нефти, солевого раствора" - }, - new - { - Id = 10036, - Name = "Акт о переводе скважины на тех. воду" - }, - new - { - Id = 10037, - Name = "Акт об окончании бурения" - }, - new - { - Id = 10038, - Name = "Акт на передачу скважины в освоение (КРС)" - }, - new - { - Id = 10039, - Name = "Акт на опресовку межколонного пространства с КРС" - }, - new - { - Id = 10040, - Name = "Акт на сдачу скважины в ЦДНГ" - }, - new - { - Id = 10041, - Name = "Паспорт ОУС (заполняется геологами)" - }, - new - { - Id = 10042, - Name = "Паспорт скважины (заполняется геологами)" - }, - new - { - Id = 10043, - Name = "Фактические данные бурения (вставляются в паспорт скважины)" - }, - new - { - Id = 20000, - Name = "Справки по страницам" - }, - new - { - Id = 30000, - Name = "Инструкции" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdAuthor") - .HasColumnType("integer") - .HasColumnName("id_author") - .HasComment("Id пользователя, загрузившего файл"); - - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("id категории файла"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("id скважины"); - - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted") - .HasComment("Удален ли файл"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название файла"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("file_size") - .HasComment("Размер файла"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.HasKey("Id"); - - b.HasIndex("IdAuthor"); - - b.HasIndex("IdCategory"); - - b.HasIndex("IdWell"); - - b.ToTable("t_file_info", t => - { - t.HasComment("Файлы всех категорий"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Comment") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("comment") - .HasComment("Комментарий"); - - b.Property("DateCreated") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_created") - .HasComment("Дата совершенного действия"); - - b.Property("IdFile") - .HasColumnType("integer") - .HasColumnName("id_file") - .HasComment("id файла"); - - b.Property("IdMarkType") - .HasColumnType("integer") - .HasColumnName("id_mark_type") - .HasComment("0 - отклонен, 1 - согласован"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("id пользователя"); - - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted") - .HasComment("Помечен ли файл как удаленный"); - - b.HasKey("Id"); - - b.HasIndex("IdFile"); - - b.HasIndex("IdUser"); - - b.ToTable("t_file_mark", t => - { - t.HasComment("Действия с файлами."); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("IdRecord") - .HasColumnType("integer") - .HasColumnName("id_record"); - - b.Property("IdItem") - .HasColumnType("integer") - .HasColumnName("id_item"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("Value") - .HasColumnType("real") - .HasColumnName("value"); - - b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - - b.ToTable("t_wits_float", t => - { - t.HasComment("таблица данных ГТИ с типом значения float"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("IdRecord") - .HasColumnType("integer") - .HasColumnName("id_record"); - - b.Property("IdItem") - .HasColumnType("integer") - .HasColumnName("id_item"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("Value") - .HasColumnType("integer") - .HasColumnName("value"); - - b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - - b.ToTable("t_wits_int", t => - { - t.HasComment("таблица данных ГТИ с типом значения int"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("IdRecord") - .HasColumnType("integer") - .HasColumnName("id_record"); - - b.Property("IdItem") - .HasColumnType("integer") - .HasColumnName("id_item"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("Value") - .IsRequired() - .HasColumnType("text") - .HasColumnName("value"); - - b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - - b.ToTable("t_wits_string", t => - { - t.HasComment("таблица данных ГТИ с типом значения string"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("Id категории файла"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название файла"); - - b.Property("Size") - .HasColumnType("bigint") - .HasColumnName("file_size") - .HasComment("Размер файла"); - - b.Property("UrlPage") - .IsRequired() - .HasColumnType("text") - .HasColumnName("url_page") - .HasComment("Url страницы"); - - b.HasKey("Id"); - - b.HasIndex("IdCategory"); - - b.ToTable("t_help_page", t => - { - t.HasComment("Справки"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("DateEnd") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_end"); - - b.Property("DateStart") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_start"); - - b.Property("DepthEnd") - .HasColumnType("real") - .HasColumnName("depth_end"); - - b.Property("DepthStart") - .HasColumnType("real") - .HasColumnName("depth_start"); - - b.Property("IdFeedRegulator") - .HasColumnType("smallint") - .HasColumnName("id_feed_regulator"); - - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.HasKey("Id"); - - b.HasIndex("IdTelemetry"); - - b.ToTable("t_limiting_parameter", t => - { - t.HasComment("Ограничения по параметрам телеметрии"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Manuals.Manual", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("DateDownload") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_download") - .HasComment("Дата загрузки"); - - b.Property("IdAuthor") - .HasColumnType("integer") - .HasColumnName("id_author") - .HasComment("Id автора"); - - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("Id категории файла"); - - b.Property("IdDirectory") - .HasColumnType("integer") - .HasColumnName("id_directory") - .HasComment("Id директории"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название"); - - b.HasKey("Id"); - - b.HasIndex("IdAuthor"); - - b.HasIndex("IdCategory"); - - b.HasIndex("IdDirectory"); - - b.ToTable("t_manual", t => - { - t.HasComment("Инструкции"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdParent") - .HasColumnType("integer") - .HasColumnName("id_parent") - .HasComment("Id родительской директории"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название"); - - b.HasKey("Id"); - - b.HasIndex("IdParent"); - - b.ToTable("t_manual_directory", t => - { - t.HasComment("Директория для инструкций"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Measure", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Data") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("data") - .HasComment("Данные таблицы последних данных"); - - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("id категории"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("id скважины"); - - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted") - .HasComment("Пометка удаленным"); - - b.Property("Timestamp") - .HasColumnType("timestamp with time zone") - .HasColumnName("timestamp") - .HasComment("время добавления"); - - b.HasKey("Id"); - - b.HasIndex("IdCategory"); - - b.HasIndex("IdWell"); - - b.ToTable("t_measure", t => - { - t.HasComment("Таблица c данными для вкладки 'Последние данные'"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название категории"); - - b.Property("ShortName") - .HasColumnType("text") - .HasColumnName("short_name") - .HasComment("Короткое название категории"); - - b.HasKey("Id"); - - b.ToTable("t_measure_category", t => - { - t.HasComment("Категория последних данных"); - }); - - b.HasData( - new - { - Id = 1, - Name = "Показатели бурового раствора", - ShortName = "Раствор" - }, - new - { - Id = 2, - Name = "Шламограмма", - ShortName = "Шламограмма" - }, - new - { - Id = 3, - Name = "ННБ", - ShortName = "ННБ" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Notification", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdNotificationCategory") - .HasColumnType("integer") - .HasColumnName("id_notification_category") - .HasComment("Id категории уведомления"); - - b.Property("IdTransportType") - .HasColumnType("integer") - .HasColumnName("id_transport_type") - .HasComment("Id типа доставки уведомления"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("Id получателя"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text") - .HasColumnName("message") - .HasComment("Сообщение уведомления"); - - b.Property("ReadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("read_date") - .HasComment("Дата прочтения уведомления"); - - b.Property("RegistrationDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("registration_date") - .HasComment("Дата регистрации уведомления"); - - b.Property("SentDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("sent_date") - .HasComment("Дата отправки уведомления"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text") - .HasColumnName("title") - .HasComment("Заголовок уведомления"); - - b.HasKey("Id"); - - b.HasIndex("IdNotificationCategory"); - - b.HasIndex("IdUser"); - - b.ToTable("t_notification", t => - { - t.HasComment("Уведомления"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name"); - - b.HasKey("Id"); - - b.ToTable("t_notification_category", t => - { - t.HasComment("Категории уведомлений"); - }); - - b.HasData( - new - { - Id = 1, - Name = "Системные уведомления" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.OperationValue", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Конечная глубина"); - - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Старотовая глубина"); - - b.Property("IdOperationCategory") - .HasColumnType("integer") - .HasColumnName("id_operation_category") - .HasComment("Ид категории операции"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Ид скважины"); - - b.Property("StandardValue") - .HasColumnType("double precision") - .HasColumnName("standard_value") - .HasComment("Нормативный показатель"); - - b.Property("TargetValue") - .HasColumnType("double precision") - .HasColumnName("target_value") - .HasComment("Целевой показатель"); - - b.HasKey("Id"); - - b.HasIndex("IdOperationCategory"); - - b.HasIndex("IdWell"); - - b.ToTable("t_operationvalue", t => - { - t.HasComment("Целевые/нормативные показатели операции"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Permission", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Description") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("description") - .HasComment("Краткое описание"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name") - .HasComment("Название"); - - b.HasKey("Id"); - - b.ToTable("t_permission", t => - { - t.HasComment("Разрешения на доступ к данным"); - }); - - b.HasData( - new - { - Id = 100, - Description = "Разрешение удалять админ. Кусты", - Name = "AdminCluster.delete" - }, - new - { - Id = 101, - Description = "Разрешение редактировать админ. Кусты", - Name = "AdminCluster.edit" - }, - new - { - Id = 102, - Description = "Разрешение просматривать админ. Кусты", - Name = "AdminCluster.get" - }, - new - { - Id = 103, - Description = "Разрешение удалять админ. Компании", - Name = "AdminCompany.delete" - }, - new - { - Id = 104, - Description = "Разрешение редактировать админ. Компании", - Name = "AdminCompany.edit" - }, - new - { - Id = 105, - Description = "Разрешение просматривать админ. Компании", - Name = "AdminCompany.get" - }, - new - { - Id = 106, - Description = "Разрешение удалять админ. Типы компаний", - Name = "AdminCompanyType.delete" - }, - new - { - Id = 107, - Description = "Разрешение редактировать админ. Типы компаний", - Name = "AdminCompanyType.edit" - }, - new - { - Id = 108, - Description = "Разрешение просматривать админ. Типы компаний", - Name = "AdminCompanyType.get" - }, - new - { - Id = 109, - Description = "Разрешение удалять админ. Месторождения", - Name = "AdminDeposit.delete" - }, - new - { - Id = 110, - Description = "Разрешение редактировать админ. Месторождения", - Name = "AdminDeposit.edit" - }, - new - { - Id = 111, - Description = "Разрешение просматривать админ. Месторождения", - Name = "AdminDeposit.get" - }, - new - { - Id = 112, - Description = "Разрешение удалять админ. Разрешения", - Name = "AdminPermission.delete" - }, - new - { - Id = 113, - Description = "Разрешение редактировать админ. Разрешения", - Name = "AdminPermission.edit" - }, - new - { - Id = 114, - Description = "Разрешение просматривать админ. Разрешения", - Name = "AdminPermission.get" - }, - new - { - Id = 115, - Description = "Разрешение удалять админ. Телеметрию", - Name = "AdminTelemetry.delete" - }, - new - { - Id = 116, - Description = "Разрешение редактировать админ. Телеметрию", - Name = "AdminTelemetry.edit" - }, - new - { - Id = 117, - Description = "Разрешение просматривать админ. Телеметрию", - Name = "AdminTelemetry.get" - }, - new - { - Id = 118, - Description = "Разрешение удалять админ. Пользователей", - Name = "AdminUser.delete" - }, - new - { - Id = 119, - Description = "Разрешение редактировать админ. Пользователей", - Name = "AdminUser.edit" - }, - new - { - Id = 120, - Description = "Разрешение просматривать админ. Пользователей", - Name = "AdminUser.get" - }, - new - { - Id = 121, - Description = "Разрешение удалять админ. Роли пользователей", - Name = "AdminUserRole.delete" - }, - new - { - Id = 122, - Description = "Разрешение редактировать админ. Роли пользователей", - Name = "AdminUserRole.edit" - }, - new - { - Id = 123, - Description = "Разрешение просматривать админ. Роли пользователей", - Name = "AdminUserRole.get" - }, - new - { - Id = 124, - Description = "Разрешение удалять админ. Скважины", - Name = "AdminWell.delete" - }, - new - { - Id = 125, - Description = "Разрешение редактировать админ. Скважины", - Name = "AdminWell.edit" - }, - new - { - Id = 126, - Description = "Разрешение просматривать админ. Скважины", - Name = "AdminWell.get" - }, - new - { - Id = 127, - Description = "Разрешение удалять админ. Подсистемы", - Name = "AdminSubsytem.delete" - }, - new - { - Id = 128, - Description = "Разрешение редактировать админ. Подсистемы", - Name = "AdminSubsytem.edit" - }, - new - { - Id = 129, - Description = "Разрешение просматривать админ. Подсистемы", - Name = "AdminSubsytem.get" - }, - new - { - Id = 200, - Description = "Разрешение редактировать 0", - Name = "Auth.edit" - }, - new - { - Id = 201, - Description = "Разрешение просматривать 0", - Name = "Auth.get" - }, - new - { - Id = 202, - Description = "Разрешение просматривать Кусты", - Name = "Cluster.get" - }, - new - { - Id = 203, - Description = "Разрешение просматривать Месторождения", - Name = "Deposit.get" - }, - new - { - Id = 204, - Description = "Разрешение удалять РТК", - Name = "DrillFlowChart.delete" - }, - new - { - Id = 205, - Description = "Разрешение редактировать РТК", - Name = "DrillFlowChart.edit" - }, - new - { - Id = 206, - Description = "Разрешение просматривать РТК", - Name = "DrillFlowChart.get" - }, - new - { - Id = 207, - Description = "Разрешение удалять Программу бурения", - Name = "DrillingProgram.delete" - }, - new - { - Id = 208, - Description = "Разрешение редактировать Программу бурения", - Name = "DrillingProgram.edit" - }, - new - { - Id = 209, - Description = "Разрешение просматривать Программу бурения", - Name = "DrillingProgram.get" - }, - new - { - Id = 210, - Description = "Разрешение удалять Режимы бурения", - Name = "DrillParams.delete" - }, - new - { - Id = 211, - Description = "Разрешение редактировать Режимы бурения", - Name = "DrillParams.edit" - }, - new - { - Id = 212, - Description = "Разрешение просматривать Режимы бурения", - Name = "DrillParams.get" - }, - new - { - Id = 213, - Description = "Разрешение удалять Файлы", - Name = "File.delete" - }, - new - { - Id = 214, - Description = "Разрешение редактировать Файлы", - Name = "File.edit" - }, - new - { - Id = 215, - Description = "Разрешение просматривать Файлы", - Name = "File.get" - }, - new - { - Id = 216, - Description = "Разрешение удалять Измерения", - Name = "Measure.delete" - }, - new - { - Id = 217, - Description = "Разрешение редактировать Измерения", - Name = "Measure.edit" - }, - new - { - Id = 218, - Description = "Разрешение просматривать Измерения", - Name = "Measure.get" - }, - new - { - Id = 219, - Description = "Разрешение просматривать Сообщения телеметрии", - Name = "Message.get" - }, - new - { - Id = 220, - Description = "Разрешение просматривать Статистику по операциям", - Name = "OperationStat.get" - }, - new - { - Id = 221, - Description = "Разрешение редактировать Рапорта", - Name = "Report.edit" - }, - new - { - Id = 222, - Description = "Разрешение просматривать Рапорта", - Name = "Report.get" - }, - new - { - Id = 223, - Description = "Разрешение просматривать админ. Системная статистика", - Name = "RequestTracker.get" - }, - new - { - Id = 224, - Description = "Разрешение удалять Рекомендации уставок", - Name = "Setpoints.delete" - }, - new - { - Id = 225, - Description = "Разрешение редактировать Рекомендации уставок", - Name = "Setpoints.edit" - }, - new - { - Id = 226, - Description = "Разрешение просматривать Рекомендации уставок", - Name = "Setpoints.get" - }, - new - { - Id = 227, - Description = "Разрешение редактировать Телеметрии", - Name = "Telemetry.edit" - }, - new - { - Id = 228, - Description = "Разрешение просматривать Анализ телеметрии", - Name = "TelemetryAnalytics.get" - }, - new - { - Id = 229, - Description = "Разрешение редактировать Данные телеметрии по САУБ", - Name = "TelemetryDataSaub.edit" - }, - new - { - Id = 230, - Description = "Разрешение просматривать Данные телеметрии по САУБ", - Name = "TelemetryDataSaub.get" - }, - new - { - Id = 231, - Description = "Разрешение редактировать Данные телеметрии по SpinMaster", - Name = "TelemetryDataSpin.edit" - }, - new - { - Id = 232, - Description = "Разрешение просматривать Данные телеметрии по SpinMaster", - Name = "TelemetryDataSpin.get" - }, - new - { - Id = 233, - Description = "Разрешение редактировать Скважины", - Name = "Well.edit" - }, - new - { - Id = 234, - Description = "Разрешение просматривать Скважины", - Name = "Well.get" - }, - new - { - Id = 235, - Description = "Разрешение редактировать Композитные скважины", - Name = "WellComposite.edit" - }, - new - { - Id = 236, - Description = "Разрешение просматривать Композитные скважины", - Name = "WellComposite.get" - }, - new - { - Id = 237, - Description = "Разрешение удалять Операции по скважинам", - Name = "WellOperation.delete" - }, - new - { - Id = 238, - Description = "Разрешение редактировать Операции по скважинам", - Name = "WellOperation.edit" - }, - new - { - Id = 239, - Description = "Разрешение просматривать Операции по скважинам", - Name = "WellOperation.get" - }, - new - { - Id = 240, - Description = "Разрешение редактировать Файлы категории 1 (Растворный сервис)", - Name = "File.edit1" - }, - new - { - Id = 241, - Description = "Разрешение редактировать Файлы категории 2 (Цементирование)", - Name = "File.edit2" - }, - new - { - Id = 242, - Description = "Разрешение редактировать Файлы категории 3 (ННБ)", - Name = "File.edit3" - }, - new - { - Id = 243, - Description = "Разрешение редактировать Файлы категории 4 (ГТИ)", - Name = "File.edit4" - }, - new - { - Id = 244, - Description = "Разрешение редактировать Файлы категории 5 (Документы по скважине)", - Name = "File.edit5" - }, - new - { - Id = 245, - Description = "Разрешение редактировать Файлы категории 6 (Супервайзер)", - Name = "File.edit6" - }, - new - { - Id = 246, - Description = "Разрешение редактировать Файлы категории 7 (Мастер)", - Name = "File.edit7" - }, - new - { - Id = 247, - Description = "Разрешение редактировать Файлы категории 8 (Долотный сервис)", - Name = "File.edit8" - }, - new - { - Id = 248, - Description = "Разрешение редактировать Файлы категории 9 (Буровой подрядчик)", - Name = "File.edit9" - }, - new - { - Id = 249, - Description = "Разрешение редактировать Файлы категории 10 (Сервис по заканчиванию скважины)", - Name = "File.edit10" - }, - new - { - Id = 250, - Description = "Разрешение редактировать Файлы категории 11 (Рапорт)", - Name = "File.edit11" - }, - new - { - Id = 251, - Description = "Разрешение редактировать Файлы категории 12", - Name = "File.edit12" - }, - new - { - Id = 252, - Description = "Разрешение редактировать Файлы категории 12", - Name = "File.edit13" - }, - new - { - Id = 253, - Description = "Разрешение редактировать Файлы категории 13", - Name = "File.edit14" - }, - new - { - Id = 254, - Description = "Разрешение редактировать Файлы категории 14", - Name = "File.edit15" - }, - new - { - Id = 255, - Description = "Разрешение редактировать Файлы категории 15", - Name = "File.edit16" - }, - new - { - Id = 256, - Description = "Разрешение редактировать Файлы категории 16", - Name = "File.edit17" - }, - new - { - Id = 257, - Description = "Разрешение редактировать Файлы категории 17", - Name = "File.edit18" - }, - new - { - Id = 258, - Description = "Разрешение редактировать Файлы категории 18", - Name = "File.edit19" - }, - new - { - Id = 259, - Description = "Разрешение редактировать Файлы категории 19", - Name = "File.edit20" - }, - new - { - Id = 260, - Description = "Разрешение редактировать Файлы категории 20", - Name = "File.edit21" - }, - new - { - Id = 261, - Description = "Разрешение редактировать Файлы категории 21", - Name = "File.edit22" - }, - new - { - Id = 262, - Description = "Разрешение редактировать Файлы категории 22", - Name = "File.edit23" - }, - new - { - Id = 263, - Description = "Разрешение редактировать Файлы категории 23", - Name = "File.edit24" - }, - new - { - Id = 264, - Description = "Разрешение редактировать Файлы категории 24", - Name = "File.edit25" - }, - new - { - Id = 265, - Description = "Разрешение редактировать Файлы категории 25", - Name = "File.edit26" - }, - new - { - Id = 266, - Description = "Разрешение редактировать Файлы категории 26", - Name = "File.edit27" - }, - new - { - Id = 267, - Description = "Разрешение редактировать Файлы категории 27", - Name = "File.edit28" - }, - new - { - Id = 268, - Description = "Разрешение редактировать Файлы категории 28", - Name = "File.edit29" - }, - new - { - Id = 269, - Description = "Разрешение редактировать Файлы категории 29", - Name = "File.edit30" - }, - new - { - Id = 380, - Description = "Разрешение просматривать список бурильщиков", - Name = "Driller.get" - }, - new - { - Id = 381, - Description = "Разрешение редактировать бурильщика", - Name = "Driller.edit" - }, - new - { - Id = 382, - Description = "Разрешение удалять бурильщик", - Name = "Driller.delete" - }, - new - { - Id = 383, - Description = "Разрешение просматривать графики бурильщиков", - Name = "Schedule.get" - }, - new - { - Id = 384, - Description = "Разрешение редактировать график бурильщика", - Name = "Schedule.edit" - }, - new - { - Id = 385, - Description = "Разрешение удалять график бурильщика", - Name = "Schedule.delete" - }, - new - { - Id = 386, - Description = "Разрешение просматривать суточный рапорт", - Name = "DailyReport.get" - }, - new - { - Id = 387, - Description = "Разрешение редактировать суточный рапорт", - Name = "DailyReport.edit" - }, - new - { - Id = 388, - Description = "Разрешение просматривать авто. определенные операции", - Name = "DetectedOperation.get" - }, - new - { - Id = 389, - Description = "Разрешение просматривать целевые значения", - Name = "OperationValue.get" - }, - new - { - Id = 390, - Description = "Разрешение редактировать целевые значения", - Name = "OperationValue.edit" - }, - new - { - Id = 391, - Description = "Разрешение удалять целевые значения", - Name = "OperationValue.delete" - }, - new - { - Id = 400, - Description = "Разрешение просматривать инфо по wits параметрам", - Name = "WitsInfo.get" - }, - new - { - Id = 401, - Description = "Разрешение просматривать WITS record 1", - Name = "WitsRecord1.get" - }, - new - { - Id = 407, - Description = "Разрешение просматривать WITS record 7", - Name = "WitsRecord7.get" - }, - new - { - Id = 408, - Description = "Разрешение просматривать WITS record 8", - Name = "WitsRecord8.get" - }, - new - { - Id = 450, - Description = "Разрешение просматривать WITS record 50", - Name = "WitsRecord50.get" - }, - new - { - Id = 460, - Description = "Разрешение просматривать WITS record 60", - Name = "WitsRecord60.get" - }, - new - { - Id = 461, - Description = "Разрешение просматривать WITS record 61", - Name = "WitsRecord61.get" - }, - new - { - Id = 500, - Description = "Разрешение удалять Категорий документов файлов", - Name = "FileCategory.delete" - }, - new - { - Id = 501, - Description = "Разрешение редактировать Категорий документов файлов", - Name = "FileCategory.edit" - }, - new - { - Id = 502, - Description = "Разрешение просматривать Категорий документов файлов", - Name = "FileCategory.get" - }, - new - { - Id = 503, - Description = "Разрешение удалять Дело скважины", - Name = "WellFinalDocuments.delete" - }, - new - { - Id = 504, - Description = "Разрешение редактировать Дело скважины", - Name = "WellFinalDocuments.edit" - }, - new - { - Id = 505, - Description = "Разрешение просматривать Дело скважины", - Name = "WellFinalDocuments.get" - }, - new - { - Id = 506, - Description = "Разрешение редактировать ответственных за загрузку файла Дело скважины", - Name = "WellFinalDocuments.editPublisher" - }, - new - { - Id = 507, - Description = "Разрешение просматривать наработка талевого каната", - Name = "TelemetryWirelineRunOut.get" - }, - new - { - Id = 510, - Description = "Разрешение просматривать плановая траектория", - Name = "PlannedTrajectory.get" - }, - new - { - Id = 511, - Description = "Разрешение редактировать плановая траектория", - Name = "PlannedTrajectory.edit" - }, - new - { - Id = 512, - Description = "Разрешение удалять плановая траектория", - Name = "PlannedTrajectory.delete" - }, - new - { - Id = 516, - Description = "Разрешение просматривать статистику вопросов", - Name = "FaqStatistics.get" - }, - new - { - Id = 517, - Description = "Разрешение редактировать вопрос", - Name = "FaqStatistics.edit" - }, - new - { - Id = 518, - Description = "Разрешение удалять вопрос", - Name = "FaqStatistics.delete" - }, - new - { - Id = 519, - Description = "Разрешение просматривать список контактов", - Name = "WellContact.get" - }, - new - { - Id = 520, - Description = "Разрешение редактировать список контактов", - Name = "WellContact.edit" - }, - new - { - Id = 521, - Description = "Разрешить создание справок по страницам", - Name = "HelpPage.edit" - }, - new - { - Id = 522, - Description = "Разрешить удаление всех настроек пользователя", - Name = "UserSettings.delete" - }, - new - { - Id = 523, - Description = "Разрешить редактирование инструкций", - Name = "Manual.edit" - }, - new - { - Id = 524, - Description = "Разрешить получение инструкций", - Name = "Manual.get" - }, - new - { - Id = 525, - Description = "Разрешение на редактирование РТК у завершенной скважины", - Name = "ProcessMap.editCompletedWell" - }, - new - { - Id = 526, - Description = "Разрешение на редактирование операций у завершенной скважины", - Name = "WellOperation.editCompletedWell" - }, - new - { - Id = 527, - Description = "Разрешение на удаление инструкций", - Name = "Manual.delete" - }, - new - { - Id = 528, - Description = "Разрешение на удаление контакта", - Name = "WellContact.delete" - }, - new - { - Id = 530, - Description = "Разрешение на редактирование плановой конструкции скважины", - Name = "WellSectionPlan.edit" - }, - new - { - Id = 531, - Description = "Разрешение на удаление плановой конструкции скважины", - Name = "WellSectionPlan.delete" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AxialLoadLimitMax") - .HasColumnType("double precision") - .HasColumnName("axial_load_limit_max") - .HasComment("Осевая нагрузка, т, допустимый максимум"); - - b.Property("AxialLoadPlan") - .HasColumnType("double precision") - .HasColumnName("axial_load_plan") - .HasComment("Осевая нагрузка, т, план"); - - b.Property("Comment") - .IsRequired() - .HasMaxLength(1024) - .HasColumnType("character varying(1024)") - .HasColumnName("comment") - .HasComment("Комментарий"); - - b.Property("Creation") - .HasColumnType("timestamp with time zone") - .HasColumnName("creation") - .HasComment("дата создания"); - - b.Property("DeltaPressureLimitMax") - .HasColumnType("double precision") - .HasColumnName("delta_pressure_limit_max") - .HasComment("Перепад давления, атм, допустимый максимум"); - - b.Property("DeltaPressurePlan") - .HasColumnType("double precision") - .HasColumnName("delta_pressure_plan") - .HasComment("Перепад давления, атм, план"); - - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Глубина по стволу до, м"); - - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Глубина по стволу от, м"); - - b.Property("FlowLimitMax") - .HasColumnType("double precision") - .HasColumnName("flow_limit_max") - .HasComment("Расход, л/с, допустимый максимум"); - - b.Property("FlowPlan") - .HasColumnType("double precision") - .HasColumnName("flow_plan") - .HasComment("Расход, л/с, план"); - - b.Property("IdAuthor") - .HasColumnType("integer") - .HasColumnName("id_author") - .HasComment("Автор"); - - b.Property("IdEditor") - .HasColumnType("integer") - .HasColumnName("id_editor") - .HasComment("Редактор"); - - b.Property("IdMode") - .HasColumnType("integer") - .HasColumnName("id_mode") - .HasComment("Id режима (1- ротор, 2 слайд)"); - - b.Property("IdPrevious") - .HasColumnType("integer") - .HasColumnName("id_previous") - .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); - - b.Property("IdState") - .HasColumnType("integer") - .HasColumnName("id_state") - .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины"); - - b.Property("IdWellSectionType") - .HasColumnType("integer") - .HasColumnName("id_wellsection_type") - .HasComment("Тип секции"); - - b.Property("Obsolete") - .HasColumnType("timestamp with time zone") - .HasColumnName("obsolete") - .HasComment("дата устаревания"); - - b.Property("RopPlan") - .HasColumnType("double precision") - .HasColumnName("rop_plan") - .HasComment("Плановая механическая скорость, м/ч"); - - b.Property("TopDriveSpeedLimitMax") - .HasColumnType("double precision") - .HasColumnName("top_drive_speed_limit_max") - .HasComment("Обороты на ВСП, допустимый максимум"); - - b.Property("TopDriveSpeedPlan") - .HasColumnType("double precision") - .HasColumnName("top_drive_speed_plan") - .HasComment("Обороты на ВСП, план"); - - b.Property("TopDriveTorqueLimitMax") - .HasColumnType("double precision") - .HasColumnName("top_drive_torque_limit_max") - .HasComment("Момент на ВСП, допустимый максимум"); - - b.Property("TopDriveTorquePlan") - .HasColumnType("double precision") - .HasColumnName("top_drive_torque_plan") - .HasComment("Момент на ВСП, план"); - - b.Property("UsageSaub") - .HasColumnType("double precision") - .HasColumnName("usage_saub") - .HasComment("Плановый процент использования АКБ"); - - b.Property("UsageSpin") - .HasColumnType("double precision") - .HasColumnName("usage_spin") - .HasComment("Плановый процент использования spin master"); - - b.HasKey("Id"); - - b.HasIndex("IdAuthor"); - - b.HasIndex("IdEditor"); - - b.HasIndex("IdPrevious"); - - b.HasIndex("IdWell"); - - b.HasIndex("IdWellSectionType"); - - b.ToTable("t_process_map_plan_drilling", t => - { - t.HasComment("РТК план бурение"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Creation") - .HasColumnType("timestamp with time zone") - .HasColumnName("creation") - .HasComment("дата создания"); - - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Глубина по стволу до, м"); - - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Глубина по стволу от, м"); - - b.Property("IdAuthor") - .HasColumnType("integer") - .HasColumnName("id_author") - .HasComment("Автор"); - - b.Property("IdEditor") - .HasColumnType("integer") - .HasColumnName("id_editor") - .HasComment("Редактор"); - - b.Property("IdPrevious") - .HasColumnType("integer") - .HasColumnName("id_previous") - .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); - - b.Property("IdState") - .HasColumnType("integer") - .HasColumnName("id_state") - .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины"); - - b.Property("IdWellSectionType") - .HasColumnType("integer") - .HasColumnName("id_wellsection_type") - .HasComment("Тип секции"); - - b.Property("Obsolete") - .HasColumnType("timestamp with time zone") - .HasColumnName("obsolete") - .HasComment("дата устаревания"); - - b.Property("Pressure") - .HasColumnType("double precision") - .HasColumnName("pressure") - .HasComment("Давление, атм"); - - b.Property("Repeats") - .HasColumnType("double precision") - .HasColumnName("repeats") - .HasComment("Количество повторений"); - - b.Property("SetpointDrag") - .HasColumnType("double precision") - .HasColumnName("setpoint_drag") - .HasComment("Уставка зятяжки, т"); - - b.Property("SetpointTight") - .HasColumnType("double precision") - .HasColumnName("setpoint_tight") - .HasComment("Уставка посадки, т"); - - b.Property("SpeedDownward") - .HasColumnType("double precision") - .HasColumnName("speed_downward") - .HasComment("Скорость спуска, м/ч"); - - b.Property("SpeedUpward") - .HasColumnType("double precision") - .HasColumnName("speed_upward") - .HasComment("Скорость подъёма, м/ч"); - - b.Property("SpinDownward") - .HasColumnType("double precision") - .HasColumnName("spin_downward") - .HasComment("Вращение при движении вниз, об/мин"); - - b.Property("SpinUpward") - .HasColumnType("double precision") - .HasColumnName("spin_upward") - .HasComment("Вращение при движении вверх, об/мин"); - - b.Property("Torque") - .HasColumnType("double precision") - .HasColumnName("torque") - .HasComment("Момент, кН*м"); - - b.HasKey("Id"); - - b.HasIndex("IdAuthor"); - - b.HasIndex("IdEditor"); - - b.HasIndex("IdWell"); - - b.HasIndex("IdWellSectionType"); - - b.ToTable("t_process_map_plan_ream", t => - { - t.HasComment("РТК проработка скважины"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => - { - b.Property("IdCompany") - .HasColumnType("integer") - .HasColumnName("id_company"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well"); - - b.HasKey("IdCompany", "IdWell"); - - b.HasIndex("IdWell"); - - b.ToTable("t_relation_company_well", t => - { - t.HasComment("отношение скважин и компаний"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationContactWell", b => - { - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user"); - - b.HasKey("IdWell", "IdUser"); - - b.HasIndex("IdUser"); - - b.ToTable("t_relation_contact_well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => - { - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user"); - - b.Property("IdDrillingProgramPart") - .HasColumnType("integer") - .HasColumnName("id_drilling_program_part"); - - b.Property("IdUserRole") - .HasColumnType("integer") - .HasColumnName("id_role") - .HasComment("1 - publisher, 2 - approver"); - - b.HasKey("IdUser", "IdDrillingProgramPart") - .HasName("t_relation_user_drilling_program_part_pk"); - - b.HasIndex("IdDrillingProgramPart"); - - b.ToTable("t_relation_user_drilling_program_part", t => - { - t.HasComment("Отношение пользователей и частей ПБ"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => - { - b.Property("IdUserRole") - .HasColumnType("integer") - .HasColumnName("id_user_role"); - - b.Property("IdPermission") - .HasColumnType("integer") - .HasColumnName("id_permission"); - - b.HasKey("IdUserRole", "IdPermission"); - - b.HasIndex("IdPermission"); - - b.ToTable("t_relation_user_role_permission", t => - { - t.HasComment("Отношение ролей пользователей и разрешений доступа"); - }); - - b.HasData( - new - { - IdUserRole = 1100, - IdPermission = 102 - }, - new - { - IdUserRole = 1100, - IdPermission = 111 - }, - new - { - IdUserRole = 1101, - IdPermission = 101 - }, - new - { - IdUserRole = 1101, - IdPermission = 100 - }, - new - { - IdUserRole = 1102, - IdPermission = 105 - }, - new - { - IdUserRole = 1102, - IdPermission = 108 - }, - new - { - IdUserRole = 1103, - IdPermission = 104 - }, - new - { - IdUserRole = 1103, - IdPermission = 103 - }, - new - { - IdUserRole = 1104, - IdPermission = 108 - }, - new - { - IdUserRole = 1105, - IdPermission = 107 - }, - new - { - IdUserRole = 1105, - IdPermission = 106 - }, - new - { - IdUserRole = 1106, - IdPermission = 111 - }, - new - { - IdUserRole = 1107, - IdPermission = 110 - }, - new - { - IdUserRole = 1107, - IdPermission = 109 - }, - new - { - IdUserRole = 1108, - IdPermission = 114 - }, - new - { - IdUserRole = 1109, - IdPermission = 113 - }, - new - { - IdUserRole = 1109, - IdPermission = 112 - }, - new - { - IdUserRole = 1110, - IdPermission = 123 - }, - new - { - IdUserRole = 1110, - IdPermission = 114 - }, - new - { - IdUserRole = 1111, - IdPermission = 122 - }, - new - { - IdUserRole = 1111, - IdPermission = 121 - }, - new - { - IdUserRole = 1112, - IdPermission = 117 - }, - new - { - IdUserRole = 1113, - IdPermission = 105 - }, - new - { - IdUserRole = 1113, - IdPermission = 123 - }, - new - { - IdUserRole = 1113, - IdPermission = 120 - }, - new - { - IdUserRole = 1114, - IdPermission = 119 - }, - new - { - IdUserRole = 1114, - IdPermission = 118 - }, - new - { - IdUserRole = 1114, - IdPermission = 200 - }, - new - { - IdUserRole = 1115, - IdPermission = 223 - }, - new - { - IdUserRole = 1116, - IdPermission = 105 - }, - new - { - IdUserRole = 1116, - IdPermission = 102 - }, - new - { - IdUserRole = 1116, - IdPermission = 117 - }, - new - { - IdUserRole = 1116, - IdPermission = 126 - }, - new - { - IdUserRole = 1117, - IdPermission = 125 - }, - new - { - IdUserRole = 1117, - IdPermission = 124 - }, - new - { - IdUserRole = 1200, - IdPermission = 203 - }, - new - { - IdUserRole = 1200, - IdPermission = 230 - }, - new - { - IdUserRole = 1201, - IdPermission = 202 - }, - new - { - IdUserRole = 1201, - IdPermission = 203 - }, - new - { - IdUserRole = 1201, - IdPermission = 220 - }, - new - { - IdUserRole = 1202, - IdPermission = 203 - }, - new - { - IdUserRole = 1202, - IdPermission = 220 - }, - new - { - IdUserRole = 1202, - IdPermission = 236 - }, - new - { - IdUserRole = 1202, - IdPermission = 212 - }, - new - { - IdUserRole = 1203, - IdPermission = 235 - }, - new - { - IdUserRole = 1204, - IdPermission = 202 - }, - new - { - IdUserRole = 1204, - IdPermission = 203 - }, - new - { - IdUserRole = 1205, - IdPermission = 215 - }, - new - { - IdUserRole = 1206, - IdPermission = 203 - }, - new - { - IdUserRole = 1206, - IdPermission = 206 - }, - new - { - IdUserRole = 1207, - IdPermission = 205 - }, - new - { - IdUserRole = 1208, - IdPermission = 218 - }, - new - { - IdUserRole = 1209, - IdPermission = 217 - }, - new - { - IdUserRole = 1210, - IdPermission = 203 - }, - new - { - IdUserRole = 1210, - IdPermission = 230 - }, - new - { - IdUserRole = 1210, - IdPermission = 219 - }, - new - { - IdUserRole = 1211, - IdPermission = 203 - }, - new - { - IdUserRole = 1211, - IdPermission = 220 - }, - new - { - IdUserRole = 1211, - IdPermission = 239 - }, - new - { - IdUserRole = 1212, - IdPermission = 238 - }, - new - { - IdUserRole = 1212, - IdPermission = 237 - }, - new - { - IdUserRole = 1213, - IdPermission = 203 - }, - new - { - IdUserRole = 1213, - IdPermission = 239 - }, - new - { - IdUserRole = 1213, - IdPermission = 212 - }, - new - { - IdUserRole = 1214, - IdPermission = 211 - }, - new - { - IdUserRole = 1214, - IdPermission = 210 - }, - new - { - IdUserRole = 1215, - IdPermission = 203 - }, - new - { - IdUserRole = 1215, - IdPermission = 222 - }, - new - { - IdUserRole = 1216, - IdPermission = 221 - }, - new - { - IdUserRole = 1217, - IdPermission = 226 - }, - new - { - IdUserRole = 1218, - IdPermission = 225 - }, - new - { - IdUserRole = 1218, - IdPermission = 224 - }, - new - { - IdUserRole = 1219, - IdPermission = 203 - }, - new - { - IdUserRole = 1219, - IdPermission = 206 - }, - new - { - IdUserRole = 1219, - IdPermission = 230 - }, - new - { - IdUserRole = 1219, - IdPermission = 232 - }, - new - { - IdUserRole = 1220, - IdPermission = 203 - }, - new - { - IdUserRole = 1220, - IdPermission = 228 - }, - new - { - IdUserRole = 1221, - IdPermission = 202 - }, - new - { - IdUserRole = 1221, - IdPermission = 203 - }, - new - { - IdUserRole = 1221, - IdPermission = 220 - }, - new - { - IdUserRole = 1221, - IdPermission = 234 - }, - new - { - IdUserRole = 1500, - IdPermission = 507 - }, - new - { - IdUserRole = 1500, - IdPermission = 510 - }, - new - { - IdUserRole = 1501, - IdPermission = 214 - }, - new - { - IdUserRole = 1501, - IdPermission = 213 - }, - new - { - IdUserRole = 1502, - IdPermission = 207 - }, - new - { - IdUserRole = 1502, - IdPermission = 208 - }, - new - { - IdUserRole = 2000, - IdPermission = 205 - }, - new - { - IdUserRole = 2000, - IdPermission = 204 - }, - new - { - IdUserRole = 2000, - IdPermission = 245 - }, - new - { - IdUserRole = 2001, - IdPermission = 244 - }, - new - { - IdUserRole = 2001, - IdPermission = 245 - }, - new - { - IdUserRole = 2002, - IdPermission = 244 - }, - new - { - IdUserRole = 2002, - IdPermission = 246 - }, - new - { - IdUserRole = 2002, - IdPermission = 237 - }, - new - { - IdUserRole = 2002, - IdPermission = 238 - }, - new - { - IdUserRole = 2003, - IdPermission = 240 - }, - new - { - IdUserRole = 2003, - IdPermission = 217 - }, - new - { - IdUserRole = 2003, - IdPermission = 216 - }, - new - { - IdUserRole = 2004, - IdPermission = 242 - }, - new - { - IdUserRole = 2004, - IdPermission = 217 - }, - new - { - IdUserRole = 2004, - IdPermission = 216 - }, - new - { - IdUserRole = 2004, - IdPermission = 205 - }, - new - { - IdUserRole = 2004, - IdPermission = 204 - }, - new - { - IdUserRole = 2005, - IdPermission = 247 - }, - new - { - IdUserRole = 2005, - IdPermission = 205 - }, - new - { - IdUserRole = 2005, - IdPermission = 204 - }, - new - { - IdUserRole = 2006, - IdPermission = 243 - }, - new - { - IdUserRole = 2006, - IdPermission = 205 - }, - new - { - IdUserRole = 2006, - IdPermission = 204 - }, - new - { - IdUserRole = 2007, - IdPermission = 241 - }, - new - { - IdUserRole = 2007, - IdPermission = 205 - }, - new - { - IdUserRole = 2007, - IdPermission = 204 - }, - new - { - IdUserRole = 1, - IdPermission = 100 - }, - new - { - IdUserRole = 1, - IdPermission = 101 - }, - new - { - IdUserRole = 1, - IdPermission = 102 - }, - new - { - IdUserRole = 1, - IdPermission = 103 - }, - new - { - IdUserRole = 1, - IdPermission = 104 - }, - new - { - IdUserRole = 1, - IdPermission = 105 - }, - new - { - IdUserRole = 1, - IdPermission = 106 - }, - new - { - IdUserRole = 1, - IdPermission = 107 - }, - new - { - IdUserRole = 1, - IdPermission = 108 - }, - new - { - IdUserRole = 1, - IdPermission = 109 - }, - new - { - IdUserRole = 1, - IdPermission = 110 - }, - new - { - IdUserRole = 1, - IdPermission = 111 - }, - new - { - IdUserRole = 1, - IdPermission = 112 - }, - new - { - IdUserRole = 1, - IdPermission = 113 - }, - new - { - IdUserRole = 1, - IdPermission = 114 - }, - new - { - IdUserRole = 1, - IdPermission = 115 - }, - new - { - IdUserRole = 1, - IdPermission = 116 - }, - new - { - IdUserRole = 1, - IdPermission = 117 - }, - new - { - IdUserRole = 1, - IdPermission = 118 - }, - new - { - IdUserRole = 1, - IdPermission = 119 - }, - new - { - IdUserRole = 1, - IdPermission = 120 - }, - new - { - IdUserRole = 1, - IdPermission = 121 - }, - new - { - IdUserRole = 1, - IdPermission = 122 - }, - new - { - IdUserRole = 1, - IdPermission = 123 - }, - new - { - IdUserRole = 1, - IdPermission = 124 - }, - new - { - IdUserRole = 1, - IdPermission = 125 - }, - new - { - IdUserRole = 1, - IdPermission = 126 - }, - new - { - IdUserRole = 1, - IdPermission = 127 - }, - new - { - IdUserRole = 1, - IdPermission = 128 - }, - new - { - IdUserRole = 1, - IdPermission = 129 - }, - new - { - IdUserRole = 1, - IdPermission = 200 - }, - new - { - IdUserRole = 1, - IdPermission = 201 - }, - new - { - IdUserRole = 1, - IdPermission = 202 - }, - new - { - IdUserRole = 1, - IdPermission = 203 - }, - new - { - IdUserRole = 1, - IdPermission = 204 - }, - new - { - IdUserRole = 1, - IdPermission = 205 - }, - new - { - IdUserRole = 1, - IdPermission = 206 - }, - new - { - IdUserRole = 1, - IdPermission = 207 - }, - new - { - IdUserRole = 1, - IdPermission = 208 - }, - new - { - IdUserRole = 1, - IdPermission = 209 - }, - new - { - IdUserRole = 1, - IdPermission = 210 - }, - new - { - IdUserRole = 1, - IdPermission = 211 - }, - new - { - IdUserRole = 1, - IdPermission = 212 - }, - new - { - IdUserRole = 1, - IdPermission = 213 - }, - new - { - IdUserRole = 1, - IdPermission = 214 - }, - new - { - IdUserRole = 1, - IdPermission = 215 - }, - new - { - IdUserRole = 1, - IdPermission = 216 - }, - new - { - IdUserRole = 1, - IdPermission = 217 - }, - new - { - IdUserRole = 1, - IdPermission = 218 - }, - new - { - IdUserRole = 1, - IdPermission = 219 - }, - new - { - IdUserRole = 1, - IdPermission = 220 - }, - new - { - IdUserRole = 1, - IdPermission = 221 - }, - new - { - IdUserRole = 1, - IdPermission = 222 - }, - new - { - IdUserRole = 1, - IdPermission = 223 - }, - new - { - IdUserRole = 1, - IdPermission = 224 - }, - new - { - IdUserRole = 1, - IdPermission = 225 - }, - new - { - IdUserRole = 1, - IdPermission = 226 - }, - new - { - IdUserRole = 1, - IdPermission = 227 - }, - new - { - IdUserRole = 1, - IdPermission = 228 - }, - new - { - IdUserRole = 1, - IdPermission = 229 - }, - new - { - IdUserRole = 1, - IdPermission = 230 - }, - new - { - IdUserRole = 1, - IdPermission = 231 - }, - new - { - IdUserRole = 1, - IdPermission = 232 - }, - new - { - IdUserRole = 1, - IdPermission = 233 - }, - new - { - IdUserRole = 1, - IdPermission = 234 - }, - new - { - IdUserRole = 1, - IdPermission = 235 - }, - new - { - IdUserRole = 1, - IdPermission = 236 - }, - new - { - IdUserRole = 1, - IdPermission = 237 - }, - new - { - IdUserRole = 1, - IdPermission = 238 - }, - new - { - IdUserRole = 1, - IdPermission = 239 - }, - new - { - IdUserRole = 1, - IdPermission = 240 - }, - new - { - IdUserRole = 1, - IdPermission = 241 - }, - new - { - IdUserRole = 1, - IdPermission = 242 - }, - new - { - IdUserRole = 1, - IdPermission = 243 - }, - new - { - IdUserRole = 1, - IdPermission = 244 - }, - new - { - IdUserRole = 1, - IdPermission = 245 - }, - new - { - IdUserRole = 1, - IdPermission = 246 - }, - new - { - IdUserRole = 1, - IdPermission = 247 - }, - new - { - IdUserRole = 1, - IdPermission = 248 - }, - new - { - IdUserRole = 1, - IdPermission = 249 - }, - new - { - IdUserRole = 1, - IdPermission = 250 - }, - new - { - IdUserRole = 1, - IdPermission = 251 - }, - new - { - IdUserRole = 1, - IdPermission = 252 - }, - new - { - IdUserRole = 1, - IdPermission = 253 - }, - new - { - IdUserRole = 1, - IdPermission = 254 - }, - new - { - IdUserRole = 1, - IdPermission = 255 - }, - new - { - IdUserRole = 1, - IdPermission = 256 - }, - new - { - IdUserRole = 1, - IdPermission = 257 - }, - new - { - IdUserRole = 1, - IdPermission = 258 - }, - new - { - IdUserRole = 1, - IdPermission = 259 - }, - new - { - IdUserRole = 1, - IdPermission = 260 - }, - new - { - IdUserRole = 1, - IdPermission = 261 - }, - new - { - IdUserRole = 1, - IdPermission = 262 - }, - new - { - IdUserRole = 1, - IdPermission = 263 - }, - new - { - IdUserRole = 1, - IdPermission = 264 - }, - new - { - IdUserRole = 1, - IdPermission = 265 - }, - new - { - IdUserRole = 1, - IdPermission = 266 - }, - new - { - IdUserRole = 1, - IdPermission = 267 - }, - new - { - IdUserRole = 1, - IdPermission = 268 - }, - new - { - IdUserRole = 1, - IdPermission = 269 - }, - new - { - IdUserRole = 1, - IdPermission = 380 - }, - new - { - IdUserRole = 1, - IdPermission = 381 - }, - new - { - IdUserRole = 1, - IdPermission = 382 - }, - new - { - IdUserRole = 1, - IdPermission = 383 - }, - new - { - IdUserRole = 1, - IdPermission = 384 - }, - new - { - IdUserRole = 1, - IdPermission = 385 - }, - new - { - IdUserRole = 1, - IdPermission = 386 - }, - new - { - IdUserRole = 1, - IdPermission = 387 - }, - new - { - IdUserRole = 1, - IdPermission = 388 - }, - new - { - IdUserRole = 1, - IdPermission = 389 - }, - new - { - IdUserRole = 1, - IdPermission = 390 - }, - new - { - IdUserRole = 1, - IdPermission = 391 - }, - new - { - IdUserRole = 1, - IdPermission = 400 - }, - new - { - IdUserRole = 1, - IdPermission = 401 - }, - new - { - IdUserRole = 1, - IdPermission = 407 - }, - new - { - IdUserRole = 1, - IdPermission = 408 - }, - new - { - IdUserRole = 1, - IdPermission = 450 - }, - new - { - IdUserRole = 1, - IdPermission = 460 - }, - new - { - IdUserRole = 1, - IdPermission = 461 - }, - new - { - IdUserRole = 1, - IdPermission = 500 - }, - new - { - IdUserRole = 1, - IdPermission = 501 - }, - new - { - IdUserRole = 1, - IdPermission = 502 - }, - new - { - IdUserRole = 1, - IdPermission = 503 - }, - new - { - IdUserRole = 1, - IdPermission = 504 - }, - new - { - IdUserRole = 1, - IdPermission = 505 - }, - new - { - IdUserRole = 1, - IdPermission = 506 - }, - new - { - IdUserRole = 1, - IdPermission = 507 - }, - new - { - IdUserRole = 1, - IdPermission = 510 - }, - new - { - IdUserRole = 1, - IdPermission = 511 - }, - new - { - IdUserRole = 1, - IdPermission = 512 - }, - new - { - IdUserRole = 1, - IdPermission = 516 - }, - new - { - IdUserRole = 1, - IdPermission = 517 - }, - new - { - IdUserRole = 1, - IdPermission = 518 - }, - new - { - IdUserRole = 1, - IdPermission = 519 - }, - new - { - IdUserRole = 1, - IdPermission = 520 - }, - new - { - IdUserRole = 1, - IdPermission = 521 - }, - new - { - IdUserRole = 1, - IdPermission = 522 - }, - new - { - IdUserRole = 1, - IdPermission = 523 - }, - new - { - IdUserRole = 1, - IdPermission = 524 - }, - new - { - IdUserRole = 1, - IdPermission = 525 - }, - new - { - IdUserRole = 1, - IdPermission = 526 - }, - new - { - IdUserRole = 1, - IdPermission = 527 - }, - new - { - IdUserRole = 1, - IdPermission = 528 - }, - new - { - IdUserRole = 1, - IdPermission = 530 - }, - new - { - IdUserRole = 1, - IdPermission = 531 - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => - { - b.Property("Id") - .HasColumnType("integer") - .HasColumnName("id_user_role"); - - b.Property("IdInclude") - .HasColumnType("integer") - .HasColumnName("id_include_user_role"); - - b.HasKey("Id", "IdInclude") - .HasName("t_relation_user_role_user_role_pk"); - - b.HasIndex("IdInclude"); - - b.ToTable("t_relation_user_role_user_role", t => - { - t.HasComment("Отношение ролей к ролям"); - }); - - b.HasData( - new - { - Id = 1101, - IdInclude = 1100 - }, - new - { - Id = 1103, - IdInclude = 1102 - }, - new - { - Id = 1105, - IdInclude = 1104 - }, - new - { - Id = 1107, - IdInclude = 1106 - }, - new - { - Id = 1109, - IdInclude = 1108 - }, - new - { - Id = 1111, - IdInclude = 1110 - }, - new - { - Id = 1114, - IdInclude = 1113 - }, - new - { - Id = 1117, - IdInclude = 1116 - }, - new - { - Id = 1203, - IdInclude = 1202 - }, - new - { - Id = 1207, - IdInclude = 1206 - }, - new - { - Id = 1209, - IdInclude = 1208 - }, - new - { - Id = 1212, - IdInclude = 1211 - }, - new - { - Id = 1214, - IdInclude = 1213 - }, - new - { - Id = 1216, - IdInclude = 1215 - }, - new - { - Id = 1218, - IdInclude = 1217 - }, - new - { - Id = 2000, - IdInclude = 1200 - }, - new - { - Id = 2000, - IdInclude = 1201 - }, - new - { - Id = 2000, - IdInclude = 1202 - }, - new - { - Id = 2000, - IdInclude = 1204 - }, - new - { - Id = 2000, - IdInclude = 1205 - }, - new - { - Id = 2000, - IdInclude = 1206 - }, - new - { - Id = 2000, - IdInclude = 1208 - }, - new - { - Id = 2000, - IdInclude = 1210 - }, - new - { - Id = 2000, - IdInclude = 1211 - }, - new - { - Id = 2000, - IdInclude = 1213 - }, - new - { - Id = 2000, - IdInclude = 1215 - }, - new - { - Id = 2000, - IdInclude = 1217 - }, - new - { - Id = 2000, - IdInclude = 1219 - }, - new - { - Id = 2000, - IdInclude = 1220 - }, - new - { - Id = 2000, - IdInclude = 1221 - }, - new - { - Id = 2000, - IdInclude = 1500 - }, - new - { - Id = 2000, - IdInclude = 1501 - }, - new - { - Id = 2000, - IdInclude = 1502 - }, - new - { - Id = 2001, - IdInclude = 1500 - }, - new - { - Id = 2001, - IdInclude = 1501 - }, - new - { - Id = 2001, - IdInclude = 1502 - }, - new - { - Id = 2002, - IdInclude = 1500 - }, - new - { - Id = 2002, - IdInclude = 1501 - }, - new - { - Id = 2002, - IdInclude = 1502 - }, - new - { - Id = 2003, - IdInclude = 1500 - }, - new - { - Id = 2003, - IdInclude = 1501 - }, - new - { - Id = 2003, - IdInclude = 1502 - }, - new - { - Id = 2004, - IdInclude = 1500 - }, - new - { - Id = 2004, - IdInclude = 1501 - }, - new - { - Id = 2004, - IdInclude = 1502 - }, - new - { - Id = 2005, - IdInclude = 1500 - }, - new - { - Id = 2005, - IdInclude = 1501 - }, - new - { - Id = 2005, - IdInclude = 1502 - }, - new - { - Id = 2006, - IdInclude = 1500 - }, - new - { - Id = 2006, - IdInclude = 1501 - }, - new - { - Id = 2006, - IdInclude = 1502 - }, - new - { - Id = 2007, - IdInclude = 1500 - }, - new - { - Id = 2007, - IdInclude = 1501 - }, - new - { - Id = 2007, - IdInclude = 1502 - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => - { - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user"); - - b.Property("IdUserRole") - .HasColumnType("integer") - .HasColumnName("id_user_role"); - - b.HasKey("IdUser", "IdUserRole"); - - b.HasIndex("IdUserRole"); - - b.ToTable("t_relation_user_user_role", t => - { - t.HasComment("Отношение пользователей и ролей"); - }); - - b.HasData( - new - { - IdUser = 1, - IdUserRole = 1 - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Begin") - .HasColumnType("timestamp with time zone") - .HasColumnName("begin"); - - b.Property("End") - .HasColumnType("timestamp with time zone") - .HasColumnName("end") - .HasComment("timestamp with time zone"); - - b.Property("Format") - .HasColumnType("integer") - .HasColumnName("format") - .HasComment("Формат отчета"); - - b.Property("IdFile") - .HasColumnType("integer") - .HasColumnName("id_file") - .HasComment("id файла-родителя"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("id скважины"); - - b.Property("Step") - .HasColumnType("integer") - .HasColumnName("step") - .HasComment("размер шага в секундах"); - - b.HasKey("Id"); - - b.HasIndex("IdFile"); - - b.HasIndex("IdWell"); - - b.ToTable("t_report_property", t => - { - t.HasComment("Отчеты с данными по буровым"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("DrillEnd") - .HasColumnType("timestamp with time zone") - .HasColumnName("drill_end") - .HasComment("Конец вахты"); - - b.Property("DrillStart") - .HasColumnType("timestamp with time zone") - .HasColumnName("drill_start") - .HasComment("Начало вахты"); - - b.Property("IdDriller") - .HasColumnType("integer") - .HasColumnName("id_driller") - .HasComment("Идентификатор бурильщика"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Идентификатор скважины"); - - b.Property("ShiftEnd") - .HasColumnType("time without time zone") - .HasColumnName("shift_end") - .HasComment("Конец смены"); - - b.Property("ShiftStart") - .HasColumnType("time without time zone") - .HasColumnName("shift_start") - .HasComment("Начало смены"); - - b.HasKey("Id"); - - b.HasIndex("IdDriller"); - - b.HasIndex("IdWell"); - - b.ToTable("t_schedule", t => - { - t.HasComment("График работы бурильщика"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("комментарий для оператора"); - - b.Property("IdAuthor") - .HasColumnType("integer") - .HasColumnName("id_author") - .HasComment("Id пользователя, загрузившего файл"); - - b.Property("IdState") - .HasColumnType("integer") - .HasColumnName("id_state") - .HasComment("0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("id скважины"); - - b.Property("ObsolescenceSec") - .HasColumnType("integer") - .HasColumnName("obsolescence") - .HasComment("сек. до устаревания"); - - b.Property("Setpoints") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("setpoint_set") - .HasComment("Набор уставок"); - - b.Property("UploadDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.HasKey("Id"); - - b.HasIndex("IdAuthor"); - - b.HasIndex("IdWell"); - - b.ToTable("t_setpoints_rquest", t => - { - t.HasComment("Запросы на изменение уставок панели оператора"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Subsystem", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Description") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("description"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name"); - - b.HasKey("Id"); - - b.ToTable("t_subsystem", t => - { - t.HasComment("Описание подсистем"); - }); - - b.HasData( - new - { - Id = 1, - Description = "Совместная работа режимов \"Бурение в роторе\" и \"Бурение в слайде\"", - Name = "АПД" - }, - new - { - Id = 11, - Description = "Режим работы \"Бурение в роторе\"", - Name = "АПД ротор" - }, - new - { - Id = 12, - Description = "Режим работы \"Бурение в слайде\"", - Name = "АПД слайд" - }, - new - { - Id = 65536, - Description = "Осцилляция", - Name = "Осцилляция" - }, - new - { - Id = 65537, - Description = "Демпфер", - Name = "Демпфер" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Info") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("info") - .HasComment("Информация с панели о скважине"); - - b.Property("RemoteUid") - .IsRequired() - .HasColumnType("text") - .HasColumnName("remote_uid") - .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); - - b.Property("TimeZone") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("timezone") - .HasComment("Смещение часового пояса от UTC"); - - b.HasKey("Id"); - - b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); - - b.ToTable("t_telemetry", t => - { - t.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date") - .HasComment("'2021-10-19 18:23:54+05'"); - - b.Property("AxialLoad") - .HasColumnType("real") - .HasColumnName("axial_load") - .HasComment("Осевая нагрузка"); - - b.Property("AxialLoadLimitMax") - .HasColumnType("real") - .HasColumnName("axial_load_limit_max") - .HasComment("Осевая нагрузка. Аварийная макс."); - - b.Property("AxialLoadSp") - .HasColumnType("real") - .HasColumnName("axial_load_sp") - .HasComment("Осевая нагрузка. Задание"); - - b.Property("BitDepth") - .HasColumnType("real") - .HasColumnName("bit_depth") - .HasComment("Положение инструмента"); - - b.Property("BlockPosition") - .HasColumnType("real") - .HasColumnName("block_position") - .HasComment("Высота талевого блока"); - - b.Property("BlockPositionMax") - .HasColumnType("real") - .HasColumnName("block_position_max") - .HasComment("Талевый блок. Макс положение"); - - b.Property("BlockPositionMin") - .HasColumnType("real") - .HasColumnName("block_position_min") - .HasComment("Талевый блок. Мин положение"); - - b.Property("BlockSpeed") - .HasColumnType("real") - .HasColumnName("block_speed") - .HasComment("Скорость талевого блока"); - - b.Property("BlockSpeedSp") - .HasColumnType("real") - .HasColumnName("block_speed_sp") - .HasComment("Скорости талевого блока. Задание"); - - b.Property("BlockSpeedSpDevelop") - .HasColumnType("real") - .HasColumnName("block_speed_sp_develop") - .HasComment("Талевый блок. Задание скорости для проработки"); - - b.Property("BlockSpeedSpRotor") - .HasColumnType("real") - .HasColumnName("block_speed_sp_rotor") - .HasComment("Талевый блок. Задание скорости для роторного бурения"); - - b.Property("BlockSpeedSpSlide") - .HasColumnType("real") - .HasColumnName("block_speed_sp_slide") - .HasComment("Талевый блок. Задание скорости для режима слайда"); - - b.Property("Flow") - .HasColumnType("real") - .HasColumnName("flow") - .HasComment("Расход"); - - b.Property("FlowDeltaLimitMax") - .HasColumnType("real") - .HasColumnName("flow_delta_limit_max") - .HasComment("Расход. Аварийный макс."); - - b.Property("FlowIdle") - .HasColumnType("real") - .HasColumnName("flow_idle") - .HasComment("Расход. Холостой ход"); - - b.Property("HookWeight") - .HasColumnType("real") - .HasColumnName("hook_weight") - .HasComment("Вес на крюке"); - - b.Property("HookWeightIdle") - .HasColumnType("real") - .HasColumnName("hook_weight_idle") - .HasComment("Вес на крюке. Холостой ход"); - - b.Property("HookWeightLimitMax") - .HasColumnType("real") - .HasColumnName("hook_weight_limit_max") - .HasComment("Вес на крюке. Затяжка"); - - b.Property("HookWeightLimitMin") - .HasColumnType("real") - .HasColumnName("hook_weight_limit_min") - .HasComment("Вес на крюке. Посадка"); - - b.Property("IdFeedRegulator") - .HasColumnType("smallint") - .HasColumnName("id_feed_regulator") - .HasComment("Текущий критерий бурения"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("Пользователь САУБ"); - - b.Property("Mode") - .HasColumnType("smallint") - .HasColumnName("mode") - .HasComment("Режим САУБ"); - - b.Property("Mse") - .HasColumnType("real") - .HasColumnName("mse") - .HasComment("MSE"); - - b.Property("MseState") - .HasColumnType("smallint") - .HasColumnName("mse_state") - .HasComment("Текущее состояние работы MSE"); - - b.Property("Pressure") - .HasColumnType("real") - .HasColumnName("pressure") - .HasComment("Давление"); - - b.Property("PressureDeltaLimitMax") - .HasColumnType("real") - .HasColumnName("pressure_delta_limit_max") - .HasComment("Давление дифф. Аварийное макс."); - - b.Property("PressureIdle") - .HasColumnType("real") - .HasColumnName("pressure_idle") - .HasComment("Давление. Холостой ход"); - - b.Property("PressureSp") - .HasColumnType("real") - .HasColumnName("pressure_sp") - .HasComment("Давление. Задание"); - - b.Property("PressureSpDevelop") - .HasColumnType("real") - .HasColumnName("pressure_sp_develop") - .HasComment("Давление. Задание для проработки"); - - b.Property("PressureSpRotor") - .HasColumnType("real") - .HasColumnName("pressure_sp_rotor") - .HasComment("Давление. Задание для роторного бурения"); - - b.Property("PressureSpSlide") - .HasColumnType("real") - .HasColumnName("pressure_sp_slide") - .HasComment("Давление. Задание для режима слайда"); - - b.Property("Pump0Flow") - .HasColumnType("real") - .HasColumnName("pump0_flow") - .HasComment("Расход. Буровой насос 1"); - - b.Property("Pump1Flow") - .HasColumnType("real") - .HasColumnName("pump1_flow") - .HasComment("Расход. Буровой насос 2"); - - b.Property("Pump2Flow") - .HasColumnType("real") - .HasColumnName("pump2_flow") - .HasComment("Расход. Буровой насос 3"); - - b.Property("RotorSpeed") - .HasColumnType("real") - .HasColumnName("rotor_speed") - .HasComment("Обороты ротора"); - - b.Property("RotorTorque") - .HasColumnType("real") - .HasColumnName("rotor_torque") - .HasComment("Момент на роторе"); - - b.Property("RotorTorqueIdle") - .HasColumnType("real") - .HasColumnName("rotor_torque_idle") - .HasComment("Момент на роторе. Холостой ход"); - - b.Property("RotorTorqueLimitMax") - .HasColumnType("real") - .HasColumnName("rotor_torque_limit_max") - .HasComment("Момент на роторе. Аварийный макс."); - - b.Property("RotorTorqueSp") - .HasColumnType("real") - .HasColumnName("rotor_torque_sp") - .HasComment("Момент на роторе. Задание"); - - b.Property("WellDepth") - .HasColumnType("real") - .HasColumnName("well_depth") - .HasComment("Глубина забоя"); - - b.HasKey("IdTelemetry", "DateTime"); - - b.ToTable("t_telemetry_data_saub", t => - { - t.HasComment("набор основных данных по SAUB"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaubStat", b => - { - b.Property("Count") - .HasColumnType("bigint") - .HasColumnName("count_items"); - - b.Property("DateMax") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_max"); - - b.Property("DateMin") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_min"); - - b.Property("DepthMax") - .HasColumnType("real") - .HasColumnName("depth_max"); - - b.Property("DepthMin") - .HasColumnType("real") - .HasColumnName("depth_min"); - - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.ToTable((string)null); - - b.ToView("mw_telemetry_datas_saub_stat", (string)null); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date") - .HasComment("'2021-10-19 18:23:54+05'"); - - b.Property("Mode") - .HasColumnType("smallint") - .HasColumnName("mode") - .HasComment("Выбранный режим управления"); - - b.Property("PositionRight") - .HasColumnType("real") - .HasColumnName("position_right") - .HasComment("Крайний правый угол осцилляции"); - - b.Property("PositionZero") - .HasColumnType("real") - .HasColumnName("position_zero") - .HasComment("Нулевая позиция осцилляции"); - - b.Property("RevolsLeftLimit") - .HasColumnType("real") - .HasColumnName("revols_left_limit") - .HasComment("Ограничение числа оборотов влево"); - - b.Property("RevolsLeftTotal") - .HasColumnType("real") - .HasColumnName("revols_left_total") - .HasComment("Суммарное количество оборотов влево"); - - b.Property("RevolsRightLimit") - .HasColumnType("real") - .HasColumnName("revols_right_limit") - .HasComment("Ограничение числа оборотов вправо"); - - b.Property("RevolsRightTotal") - .HasColumnType("real") - .HasColumnName("revols_right_total") - .HasComment("Суммарное количество оборотов вправо"); - - b.Property("SpeedLeftSp") - .HasColumnType("real") - .HasColumnName("speed_left_sp") - .HasComment("Заданная скорость вращения влево"); - - b.Property("SpeedRightSp") - .HasColumnType("real") - .HasColumnName("speed_right_sp") - .HasComment("Заданная скорость вращения вправо"); - - b.Property("State") - .HasColumnType("smallint") - .HasColumnName("state") - .HasComment("Переменная этапа"); - - b.HasKey("IdTelemetry", "DateTime"); - - b.ToTable("t_telemetry_data_spin", t => - { - t.HasComment("набор основных данных по SpinMaster"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("IdEvent") - .HasColumnType("integer") - .HasColumnName("id_event"); - - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category"); - - b.Property("MessageTemplate") - .IsRequired() - .HasColumnType("text") - .HasColumnName("message_template"); - - b.HasKey("IdTelemetry", "IdEvent"); - - b.ToTable("t_telemetry_event", t => - { - t.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Arg0") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("arg0") - .HasComment("Аргумент №0 для вставки в шаблон сообщения"); - - b.Property("Arg1") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("arg1"); - - b.Property("Arg2") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("arg2"); - - b.Property("Arg3") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("arg3"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("IdEvent") - .HasColumnType("integer") - .HasColumnName("id_event"); - - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("IdTelemetryUser") - .HasColumnType("integer") - .HasColumnName("id_telemetry_user") - .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); - - b.Property("WellDepth") - .HasColumnType("double precision") - .HasColumnName("well_depth"); - - b.HasKey("Id"); - - b.HasIndex("IdTelemetry"); - - b.ToTable("t_telemetry_message", t => - { - t.HasComment("Сообщения на буровых"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user"); - - b.Property("Level") - .HasColumnType("integer") - .HasColumnName("level"); - - b.Property("Name") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name"); - - b.Property("Patronymic") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("patronymic"); - - b.Property("Surname") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("surname"); - - b.HasKey("IdTelemetry", "IdUser"); - - b.ToTable("t_telemetry_user", t => - { - t.HasComment("Пользователи панели САУБ. Для сообщений."); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryWirelineRunOut", b => - { - b.Property("IdTelemetry") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id_telemetry") - .HasComment("Идентификатор телеметрии"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("IdTelemetry")); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_time") - .HasComment("Отметка времени"); - - b.Property("Hauling") - .HasColumnType("real") - .HasColumnName("hauling") - .HasComment("Наработка талевого каната с момента перетяжки каната, т*км"); - - b.Property("HaulingWarnSp") - .HasColumnType("real") - .HasColumnName("hauling_warn_sp") - .HasComment("Наработка талевого каната до сигнализации о необходимости перетяжки, т*км"); - - b.Property("Replace") - .HasColumnType("real") - .HasColumnName("replace") - .HasComment("Наработка талевого каната с момента замены каната, т*км"); - - b.Property("ReplaceWarnSp") - .HasColumnType("real") - .HasColumnName("replace_warn_sp") - .HasComment("Наработка талевого каната до сигнализации о необходимости замены, т*км"); - - b.HasKey("IdTelemetry"); - - b.ToTable("t_telemetry_wireline_run_out", t => - { - t.HasComment("Наработка талевого каната"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AzimuthGeo") - .HasColumnType("double precision") - .HasColumnName("azimuth_geo") - .HasComment("Азимут Географ."); - - b.Property("AzimuthMagnetic") - .HasColumnType("double precision") - .HasColumnName("azimuth_magnetic") - .HasComment("Азимут Магнитный"); - - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("Комментарии"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("ID пользователя который внес/изменил запись"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("ID скважины"); - - b.Property("UpdateDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("update_date") - .HasComment("Дата загрузки траектории"); - - b.Property("VerticalDepth") - .HasColumnType("double precision") - .HasColumnName("vertical_depth") - .HasComment("Глубина вертикальная"); - - b.Property("WellboreDepth") - .HasColumnType("double precision") - .HasColumnName("wellbore_depth") - .HasComment("Глубина по стволу"); - - b.Property("ZenithAngle") - .HasColumnType("double precision") - .HasColumnName("zenith_angle") - .HasComment("Угол зенитный"); - - b.HasKey("Id"); - - b.HasIndex("IdUser"); - - b.HasIndex("IdWell"); - - b.ToTable("t_trajectory_fact", t => - { - t.HasComment("Загрузка фактической траектории"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AzimuthGeo") - .HasColumnType("double precision") - .HasColumnName("azimuth_geo") - .HasComment("Азимут Географ."); - - b.Property("AzimuthMagnetic") - .HasColumnType("double precision") - .HasColumnName("azimuth_magnetic") - .HasComment("Азимут Магнитный"); - - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("Комментарии"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("ID пользователя который внес/изменил запись"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("ID скважины"); - - b.Property("Radius") - .HasColumnType("double precision") - .HasColumnName("radius") - .HasComment("Радиус цели"); - - b.Property("UpdateDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("update_date") - .HasComment("Дата загрузки траектории"); - - b.Property("VerticalDepth") - .HasColumnType("double precision") - .HasColumnName("vertical_depth") - .HasComment("Глубина вертикальная"); - - b.Property("WellboreDepth") - .HasColumnType("double precision") - .HasColumnName("wellbore_depth") - .HasComment("Глубина по стволу"); - - b.Property("ZenithAngle") - .HasColumnType("double precision") - .HasColumnName("zenith_angle") - .HasComment("Угол зенитный"); - - b.HasKey("Id"); - - b.HasIndex("IdUser"); - - b.HasIndex("IdWell"); - - b.ToTable("t_trajectory_plan", t => - { - t.HasComment("Загрузка плановой траектории"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Email") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("email") - .HasComment("должность"); - - b.Property("IdCompany") - .HasColumnType("integer") - .HasColumnName("id_company"); - - b.Property("IdState") - .HasColumnType("smallint") - .HasColumnName("state") - .HasComment("состояние:\n0 - не активен, \n1 - активен, \n2 - заблокирован"); - - b.Property("Login") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("login"); - - b.Property("Name") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name") - .HasComment("имя"); - - b.Property("PasswordHash") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("password_hash") - .HasComment("соленый хэш пароля.\nпервые 5 символов - соль"); - - b.Property("Patronymic") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("patronymic") - .HasComment("отчество"); - - b.Property("Phone") - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("phone") - .HasComment("номер телефона"); - - b.Property("Position") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("position") - .HasComment("email"); - - b.Property("Surname") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("surname") - .HasComment("фамилия"); - - b.HasKey("Id"); - - b.HasIndex("IdCompany"); - - b.HasIndex("Login") - .IsUnique(); - - b.ToTable("t_user", t => - { - t.HasComment("Пользователи облака"); - }); - - b.HasData( - new - { - Id = 1, - Email = "", - IdCompany = 1, - IdState = (short)1, - Login = "dev", - Name = "Разработчик", - PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); - - b.Property("IdType") - .HasColumnType("integer") - .HasColumnName("id_type") - .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); - - b.HasKey("Id"); - - b.ToTable("t_user_role", t => - { - t.HasComment("Роли пользователей в системе"); - }); - - b.HasData( - new - { - Id = 1, - Caption = "root", - IdType = 1 - }, - new - { - Id = 1100, - Caption = "admin_cluster.view", - IdType = 1 - }, - new - { - Id = 1101, - Caption = "admin_cluster.edit", - IdType = 1 - }, - new - { - Id = 1102, - Caption = "admin_company.view", - IdType = 1 - }, - new - { - Id = 1103, - Caption = "admin_company.edit", - IdType = 1 - }, - new - { - Id = 1104, - Caption = "admin_company_type.view", - IdType = 1 - }, - new - { - Id = 1105, - Caption = "admin_company_type.edit", - IdType = 1 - }, - new - { - Id = 1106, - Caption = "admin_deposit.view", - IdType = 1 - }, - new - { - Id = 1107, - Caption = "admin_deposit.edit", - IdType = 1 - }, - new - { - Id = 1108, - Caption = "admin_permission.view", - IdType = 1 - }, - new - { - Id = 1109, - Caption = "admin_permission.edit", - IdType = 1 - }, - new - { - Id = 1110, - Caption = "admin_role.view", - IdType = 1 - }, - new - { - Id = 1111, - Caption = "admin_role.edit", - IdType = 1 - }, - new - { - Id = 1112, - Caption = "admin_telemetry.view", - IdType = 1 - }, - new - { - Id = 1113, - Caption = "admin_user.view", - IdType = 1 - }, - new - { - Id = 1114, - Caption = "admin_user.edit", - IdType = 1 - }, - new - { - Id = 1115, - Caption = "admin_visit_log.view", - IdType = 1 - }, - new - { - Id = 1116, - Caption = "admin_well.view", - IdType = 1 - }, - new - { - Id = 1117, - Caption = "admin_well.edit", - IdType = 1 - }, - new - { - Id = 1200, - Caption = "archive.view", - IdType = 1 - }, - new - { - Id = 1201, - Caption = "cluster.view", - IdType = 1 - }, - new - { - Id = 1202, - Caption = "composite.view", - IdType = 1 - }, - new - { - Id = 1203, - Caption = "composite.edit", - IdType = 1 - }, - new - { - Id = 1204, - Caption = "deposit.view", - IdType = 1 - }, - new - { - Id = 1205, - Caption = "document.view", - IdType = 1 - }, - new - { - Id = 1206, - Caption = "drillProcessFlow.view", - IdType = 1 - }, - new - { - Id = 1207, - Caption = "drillProcessFlow.edit", - IdType = 1 - }, - new - { - Id = 1208, - Caption = "measure.view", - IdType = 1 - }, - new - { - Id = 1209, - Caption = "measure.edit", - IdType = 1 - }, - new - { - Id = 1210, - Caption = "message.view", - IdType = 1 - }, - new - { - Id = 1211, - Caption = "operations.view", - IdType = 1 - }, - new - { - Id = 1212, - Caption = "operations.edit", - IdType = 1 - }, - new - { - Id = 1213, - Caption = "params.view", - IdType = 1 - }, - new - { - Id = 1214, - Caption = "params.edit", - IdType = 1 - }, - new - { - Id = 1215, - Caption = "report.view", - IdType = 1 - }, - new - { - Id = 1216, - Caption = "report.edit", - IdType = 1 - }, - new - { - Id = 1217, - Caption = "setpoints.view", - IdType = 1 - }, - new - { - Id = 1218, - Caption = "setpoints.edit", - IdType = 1 - }, - new - { - Id = 1219, - Caption = "telemetry.view", - IdType = 1 - }, - new - { - Id = 1220, - Caption = "telemetryAnalysis.view", - IdType = 1 - }, - new - { - Id = 1221, - Caption = "well.view", - IdType = 1 - }, - new - { - Id = 1500, - Caption = "Просмотр всего", - IdType = 1 - }, - new - { - Id = 1501, - Caption = "file.edit", - IdType = 1 - }, - new - { - Id = 1502, - Caption = "drillingProgram.edit", - IdType = 1 - }, - new - { - Id = 2000, - Caption = "Заказчик", - IdType = 0 - }, - new - { - Id = 2001, - Caption = "Супервайзер", - IdType = 0 - }, - new - { - Id = 2002, - Caption = "Буровой подрядчик", - IdType = 0 - }, - new - { - Id = 2003, - Caption = "Растворщик", - IdType = 0 - }, - new - { - Id = 2004, - Caption = "Телеметрист", - IdType = 0 - }, - new - { - Id = 2005, - Caption = "Долотный сервис", - IdType = 0 - }, - new - { - Id = 2006, - Caption = "ГТИ", - IdType = 0 - }, - new - { - Id = 2007, - Caption = "Цементирование", - IdType = 0 - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => - { - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user"); - - b.Property("Key") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("key") - .HasComment("Ключ настроек пользователя"); - - b.Property("Value") - .HasColumnType("jsonb") - .HasColumnName("setting_value") - .HasComment("Значение настроек пользователя"); - - b.HasKey("IdUser", "Key"); - - b.ToTable("t_user_settings", t => - { - t.HasComment("настройки интерфейса пользователя"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.RecordBase", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("Actcod") - .HasColumnType("smallint") - .HasColumnName("ACTCOD"); - - b.Property("Date") - .HasColumnType("integer") - .HasColumnName("DATE"); - - b.Property("Recid") - .HasColumnType("smallint") - .HasColumnName("RECID"); - - b.Property("Seqid") - .HasColumnType("integer") - .HasColumnName("SEQID"); - - b.Property("Stknum") - .HasColumnType("smallint") - .HasColumnName("STKNUM"); - - b.Property("Time") - .HasColumnType("integer") - .HasColumnName("TIME"); - - b.Property("Wellid") - .HasColumnType("text") - .HasColumnName("WELLID"); - - b.HasKey("IdTelemetry", "DateTime"); - - b.ToTable("t_telemetry_wits_base"); - - b.UseTptMappingStrategy(); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Well", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption"); - - b.Property("IdCluster") - .HasColumnType("integer") - .HasColumnName("id_cluster"); - - b.Property("IdState") - .HasColumnType("integer") - .HasColumnName("state") - .HasComment("0 - неизвестно, 1 - в работе, 2 - завершена"); - - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("IdWellType") - .HasColumnType("integer") - .HasColumnName("id_well_type"); - - b.Property("Latitude") - .HasColumnType("double precision") - .HasColumnName("latitude"); - - b.Property("Longitude") - .HasColumnType("double precision") - .HasColumnName("longitude"); - - b.Property("Timezone") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("timezone") - .HasComment("Смещение часового пояса от UTC"); - - b.HasKey("Id"); - - b.HasIndex("IdCluster"); - - b.HasIndex("IdTelemetry") - .IsUnique(); - - b.HasIndex("IdWellType"); - - b.ToTable("t_well", t => - { - t.HasComment("скважины"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => - { - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины получателя"); - - b.Property("IdWellSrc") - .HasColumnType("integer") - .HasColumnName("id_well_src") - .HasComment("Id скважины композита"); - - b.Property("IdWellSectionType") - .HasColumnType("integer") - .HasColumnName("id_well_section_type") - .HasComment("Id тип секции композита"); - - b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); - - b.HasIndex("IdWellSectionType"); - - b.HasIndex("IdWellSrc"); - - b.ToTable("t_well_composite", t => - { - t.HasComment("Композитная скважина"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocument", b => - { - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user"); - - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category"); - - b.HasKey("IdWell", "IdUser", "IdCategory") - .HasName("t_well_final_documents_pk"); - - b.HasIndex("IdCategory"); - - b.HasIndex("IdUser"); - - b.ToTable("t_well_final_documents", t => - { - t.HasComment("Дело скважины"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CategoryInfo") - .HasColumnType("text") - .HasColumnName("category_info") - .HasComment("Доп. информация к выбраной категории"); - - b.Property("Comment") - .HasColumnType("text") - .HasColumnName("comment") - .HasComment("Комментарий"); - - b.Property("DateStart") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_start") - .HasComment("Дата начала операции"); - - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Глубина после завершения операции, м"); - - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Глубина на начало операции, м"); - - b.Property("DurationHours") - .HasColumnType("double precision") - .HasColumnName("duration_hours") - .HasComment("Продолжительность, часы"); - - b.Property("IdCategory") - .HasColumnType("integer") - .HasColumnName("id_category") - .HasComment("Id категории операции"); - - b.Property("IdPlan") - .HasColumnType("integer") - .HasColumnName("id_plan") - .HasComment("Id плановой операции"); - - b.Property("IdType") - .HasColumnType("integer") - .HasColumnName("id_type") - .HasComment("0 = План или 1 = Факт"); - - b.Property("IdUser") - .HasColumnType("integer"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины"); - - b.Property("IdWellSectionType") - .HasColumnType("integer") - .HasColumnName("id_well_section_type") - .HasComment("Id тип секции скважины"); - - b.Property("LastUpdateDate") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id"); - - b.HasIndex("DateStart"); - - b.HasIndex("DepthEnd"); - - b.HasIndex("IdCategory"); - - b.HasIndex("IdPlan"); - - b.HasIndex("IdWell"); - - b.HasIndex("IdWellSectionType"); - - b.ToTable("t_well_operation", t => - { - t.HasComment("Данные по операциям на скважине"); - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdParent") - .HasColumnType("integer") - .HasColumnName("id_parent") - .HasComment("id родительской категории"); - - b.Property("KeyValueName") - .HasMaxLength(32) - .HasColumnType("character varying(32)") - .HasColumnName("key_value_name") - .HasComment("Название ключевого показателя операции"); - - b.Property("KeyValueUnits") - .HasMaxLength(16) - .HasColumnType("character varying(16)") - .HasColumnName("key_value_units") - .HasComment("Единицы измерения ключевого показателя операции"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name") - .HasComment("Название категории операции"); - - b.HasKey("Id"); - - b.HasIndex("IdParent"); - - b.ToTable("t_well_operation_category", t => - { - t.HasComment("Справочник операций на скважине"); - }); - - b.HasData( - new - { - Id = 3000, - KeyValueName = "dT", - KeyValueUnits = "м/ч", - Name = "БУРЕНИЕ" - }, - new - { - Id = 3001, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "СПО" - }, - new - { - Id = 3002, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "КРЕПЛЕНИЕ" - }, - new - { - Id = 3003, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "ГФР" - }, - new - { - Id = 3004, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Вспомогательные операции" - }, - new - { - Id = 3005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Непроизводительное время (НПВ)" - }, - new - { - Id = 4000, - IdParent = 3000, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "КНБК" - }, - new - { - Id = 4001, - IdParent = 3000, - KeyValueName = "dT", - KeyValueUnits = "м/ч", - Name = "Механическое. бурение" - }, - new - { - Id = 4002, - IdParent = 3000, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Статический замер" - }, - new - { - Id = 4003, - IdParent = 3000, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Нормализация диаметра скважины" - }, - new - { - Id = 4004, - IdParent = 3000, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Наращивание" - }, - new - { - Id = 4005, - IdParent = 3001, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "СПО" - }, - new - { - Id = 4006, - IdParent = 3002, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Спуск обсадной колонны" - }, - new - { - Id = 4018, - IdParent = 3002, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Крепление" - }, - new - { - Id = 4007, - IdParent = 3002, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Цементирование" - }, - new - { - Id = 4008, - IdParent = 3002, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Вспомогательные работы при креплении" - }, - new - { - Id = 4009, - IdParent = 3003, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Сборка/разборка приборов ГИС" - }, - new - { - Id = 4010, - IdParent = 3003, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "СПО" - }, - new - { - Id = 4011, - IdParent = 3003, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "ГИС" - }, - new - { - Id = 4012, - IdParent = 3004, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Промывка, ОБР" - }, - new - { - Id = 4013, - IdParent = 3004, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Вспомогательные работы" - }, - new - { - Id = 4014, - IdParent = 3005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Ремонт оборудования" - }, - new - { - Id = 4015, - IdParent = 3005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Аварийные работы" - }, - new - { - Id = 4016, - IdParent = 3005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Осложнение" - }, - new - { - Id = 4017, - IdParent = 3005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Незаложенные в ГГД операции" - }, - new - { - Id = 5000, - IdParent = 4000, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Разборка КНБК" - }, - new - { - Id = 5001, - IdParent = 4000, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Сборка КНБК" - }, - new - { - Id = 5002, - IdParent = 4001, - KeyValueName = "МСП", - KeyValueUnits = "м/ч", - Name = "Бурение слайдом" - }, - new - { - Id = 5003, - IdParent = 4001, - KeyValueName = "МСП", - KeyValueUnits = "м/ч", - Name = "Бурение ротором" - }, - new - { - Id = 5004, - IdParent = 4002, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Замер ЗТС (запись MWD)" - }, - new - { - Id = 5005, - IdParent = 4003, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Промывка перед наращиванием" - }, - new - { - Id = 5006, - IdParent = 4003, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Проработка во время бурения" - }, - new - { - Id = 5007, - IdParent = 4003, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Проработка перед наращиванием" - }, - new - { - Id = 5008, - IdParent = 4003, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Шаблонировка во время бурения" - }, - new - { - Id = 5009, - IdParent = 4003, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Шаблонировка перед наращиванием" - }, - new - { - Id = 5010, - IdParent = 4004, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Наращивание" - }, - new - { - Id = 5011, - IdParent = 4004, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Удержание в клиньях" - }, - new - { - Id = 5012, - IdParent = 4005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Подъем инструмента" - }, - new - { - Id = 5013, - IdParent = 4005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Подъем КНБК" - }, - new - { - Id = 5014, - IdParent = 4005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Спуск инструмента" - }, - new - { - Id = 5015, - IdParent = 4005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Спуск КНБК" - }, - new - { - Id = 5016, - IdParent = 4006, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Промывка при спуске ОК" - }, - new - { - Id = 5017, - IdParent = 4006, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Спуск ОК" - }, - new - { - Id = 5018, - IdParent = 4007, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "ОЗЦ" - }, - new - { - Id = 5019, - IdParent = 4007, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Цементирование" - }, - new - { - Id = 5020, - IdParent = 4008, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Опрессовка БИ" - }, - new - { - Id = 5021, - IdParent = 4008, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Опрессовка ОК" - }, - new - { - Id = 5022, - IdParent = 4008, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "ПЗР при спуске ОК" - }, - new - { - Id = 5023, - IdParent = 4008, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "ПЗР при цементировании" - }, - new - { - Id = 5024, - IdParent = 4009, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Разборка комплекса приборов ГИС" - }, - new - { - Id = 5025, - IdParent = 4009, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Сборка комплекса приборов ГИС" - }, - new - { - Id = 5026, - IdParent = 4010, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Подъем приборов ГИС (на трубах)" - }, - new - { - Id = 5027, - IdParent = 4010, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Спуск приборов ГИС (на трубах)" - }, - new - { - Id = 5028, - IdParent = 4011, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Комплекс ГИС на жестком кабеле" - }, - new - { - Id = 5029, - IdParent = 4011, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Комплекс ГИС на кабеле" - }, - new - { - Id = 5030, - IdParent = 4011, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Комплекс ГИС на трубах" - }, - new - { - Id = 5031, - IdParent = 4012, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Закачка/прокачка пачки" - }, - new - { - Id = 5032, - IdParent = 4012, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Обработка БР" - }, - new - { - Id = 5033, - IdParent = 4012, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Ориентирование ТС при бурении" - }, - new - { - Id = 5034, - IdParent = 4012, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Перезапись гаммы-каротажа" - }, - new - { - Id = 5035, - IdParent = 4012, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Приготовление БР" - }, - new - { - Id = 5036, - IdParent = 4012, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Промывка" - }, - new - { - Id = 5037, - IdParent = 4012, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Разбуривание тех.оснастки" - }, - new - { - Id = 5038, - IdParent = 4012, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Спуск инструмента с проработкой" - }, - new - { - Id = 5039, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "ВМР" - }, - new - { - Id = 5040, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Демонтаж ПВО" - }, - new - { - Id = 5041, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Долив затруба при подъёме" - }, - new - { - Id = 5042, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Монтаж ПВО" - }, - new - { - Id = 5043, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Наработка жёлоба" - }, - new - { - Id = 5044, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Обвязка устья с циркуляционной системой" - }, - new - { - Id = 5045, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Оборудование устья" - }, - new - { - Id = 5046, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Опрессовка ПВО" - }, - new - { - Id = 5047, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Перемонтаж ПВО " - }, - new - { - Id = 5048, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Перетяжка талевого каната" - }, - new - { - Id = 5049, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "ПЗР при сборке КНБК" - }, - new - { - Id = 5050, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Полная замена талевого каната" - }, - new - { - Id = 5051, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "ПР перед забуркой направления" - }, - new - { - Id = 5052, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Продувка манифольда" - }, - new - { - Id = 5053, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Срезка" - }, - new - { - Id = 5054, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Тайм-дриллинг" - }, - new - { - Id = 5055, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Тех.отстой" - }, - new - { - Id = 5056, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Учебная тревога \"Выброс\"" - }, - new - { - Id = 5057, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Чистка ЦСГО/емкостного блока" - }, - new - { - Id = 5058, - IdParent = 4014, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Ремонт бурового оборудования" - }, - new - { - Id = 5059, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Ловильные работы" - }, - new - { - Id = 5060, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Ожидание" - }, - new - { - Id = 5061, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Определение места прихвата и ЛМ" - }, - new - { - Id = 5062, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Работа яссом" - }, - new - { - Id = 5063, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Расхаживание" - }, - new - { - Id = 5064, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "СПО - колокол" - }, - new - { - Id = 5065, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "СПО - метчик" - }, - new - { - Id = 5066, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "СПО - овершот" - }, - new - { - Id = 5067, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "СПО - труболовка" - }, - new - { - Id = 5068, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Торпедирование (встряхивание)" - }, - new - { - Id = 5069, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Торпедирование (отстрел)" - }, - new - { - Id = 5070, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Установка ванн" - }, - new - { - Id = 5071, - IdParent = 4015, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Фрезеровка" - }, - new - { - Id = 5072, - IdParent = 4016, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Контролируемое ГНВП" - }, - new - { - Id = 5073, - IdParent = 4016, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Поглощение" - }, - new - { - Id = 5074, - IdParent = 4016, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Сальникообразование" - }, - new - { - Id = 5075, - IdParent = 4016, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Утяжеление БР" - }, - new - { - Id = 5076, - IdParent = 4017, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "НПВ / прочее" - }, - new - { - Id = 5077, - IdParent = 4017, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Обработка раствора (несоответствие параметров)" - }, - new - { - Id = 5078, - IdParent = 4017, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "подъем ОК" - }, - new - { - Id = 5079, - IdParent = 4017, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Ревизия КНБК/инструмента/ЗТС" - }, - new - { - Id = 5082, - IdParent = 4000, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Сборка устройства ориентирования КО" - }, - new - { - Id = 5083, - IdParent = 4003, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Проработка принудительная" - }, - new - { - Id = 5084, - IdParent = 4005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Шаблонировка подъем БИ, продувка" - }, - new - { - Id = 5085, - IdParent = 4005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Спуск бурильного инструмента со сборкой с мостков" - }, - new - { - Id = 5086, - IdParent = 4005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Подъем БИ с выбросом на мостки" - }, - new - { - Id = 5087, - IdParent = 4005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Спуск БИ со сборкой с мостков" - }, - new - { - Id = 5088, - IdParent = 4005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Сборка и спуск ТБТ" - }, - new - { - Id = 5089, - IdParent = 4005, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Спуск КО на транспотрной колонне" - }, - new - { - Id = 5090, - IdParent = 4008, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Отворот допускной трубы" - }, - new - { - Id = 5091, - IdParent = 4008, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Активация подвески, опрессовка" - }, - new - { - Id = 5092, - IdParent = 4008, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Монтаж, опрессовка ФА" - }, - new - { - Id = 5093, - IdParent = 4008, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Сборка хвостовика 114мм (согласно схеме)" - }, - new - { - Id = 5094, - IdParent = 4008, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "ПЗР к спуску УЭЦН" - }, - new - { - Id = 5095, - IdParent = 4008, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Активация подвески (потайной колонны, хвостовика)" - }, - new - { - Id = 5096, - IdParent = 4008, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Шаблонирование перед спуском" - }, - new - { - Id = 5097, - IdParent = 4012, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Промывка - перевод скважины на новый раствор" - }, - new - { - Id = 5098, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Сборка БИ с мостков на подсвечник" - }, - new - { - Id = 5099, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Подготовка ствола скважины. Перезапись ГК в интервале установки КО." - }, - new - { - Id = 5100, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Смена рабочего переводника ВСП" - }, - new - { - Id = 5101, - IdParent = 4014, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Ремонт" - }, - new - { - Id = 5102, - IdParent = 4018, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Спуск пакера" - }, - new - { - Id = 5103, - IdParent = 4011, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Запись гамма-каратожа" - }, - new - { - Id = 5104, - IdParent = 4013, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Шаблонирование спуск БИ" - }, - new - { - Id = 5105, - IdParent = 4018, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Сборка клин-отклонителя" - }, - new - { - Id = 5106, - IdParent = 4018, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Ориентирование и посадка клина-отклонителя" - }, - new - { - Id = 5107, - IdParent = 4018, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Протяжка подъемного патрубка подвески" - }, - new - { - Id = 5108, - IdParent = 4018, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Подъем клина-отклонителя" - }, - new - { - Id = 5109, - IdParent = 4018, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Стыковка стингера с хвостовиком основного ствола" - }, - new - { - Id = 5110, - IdParent = 4018, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Ориентирование и установка стыковочного узла хвостовика" - }, - new - { - Id = 5111, - IdParent = 4001, - KeyValueName = "МСП", - KeyValueUnits = "м/ч", - Name = "Бурение с отбором керна" - }, - new - { - Id = 5112, - IdParent = 4018, - KeyValueName = "dT", - KeyValueUnits = "мин", - Name = "Работа пакером в обсадной колонне" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); - - b.Property("Order") - .HasColumnType("real") - .HasColumnName("order") - .HasComment("Порядок"); - - b.HasKey("Id"); - - b.ToTable("t_well_section_type", t => - { - t.HasComment("конструкция секции скважины"); - }); - - b.HasData( - new - { - Id = 1, - Caption = "Пилотный ствол", - Order = 4f - }, - new - { - Id = 2, - Caption = "Направление", - Order = 0f - }, - new - { - Id = 3, - Caption = "Кондуктор", - Order = 1f - }, - new - { - Id = 4, - Caption = "Эксплуатационная колонна", - Order = 3f - }, - new - { - Id = 5, - Caption = "Транспортный ствол", - Order = 5f - }, - new - { - Id = 6, - Caption = "Хвостовик", - Order = 6f - }, - new - { - Id = 7, - Caption = "Пилотный ствол 2", - Order = 4.1f - }, - new - { - Id = 8, - Caption = "Направление 2", - Order = 0.1f - }, - new - { - Id = 9, - Caption = "Кондуктор 2", - Order = 1.1f - }, - new - { - Id = 10, - Caption = "Эксплуатационная колонна 2", - Order = 3.1f - }, - new - { - Id = 11, - Caption = "Транспортный ствол 2", - Order = 5.1f - }, - new - { - Id = 12, - Caption = "Хвостовик 2", - Order = 6.1f - }, - new - { - Id = 13, - Caption = "Пилотный ствол 3", - Order = 4.2f - }, - new - { - Id = 14, - Caption = "Направление 3", - Order = 0.2f - }, - new - { - Id = 15, - Caption = "Кондуктор 3", - Order = 1.2f - }, - new - { - Id = 16, - Caption = "Эксплуатационная колонна 3", - Order = 3.2f - }, - new - { - Id = 17, - Caption = "Транспортный ствол 3", - Order = 5.2f - }, - new - { - Id = 18, - Caption = "Хвостовик 3", - Order = 6.2f - }, - new - { - Id = 19, - Caption = "Пилотный ствол 4", - Order = 4.3f - }, - new - { - Id = 20, - Caption = "Направление 4", - Order = 0.3f - }, - new - { - Id = 21, - Caption = "Кондуктор 4", - Order = 1.3f - }, - new - { - Id = 22, - Caption = "Эксплуатационная колонна 4", - Order = 3.3f - }, - new - { - Id = 23, - Caption = "Транспортный ствол 4", - Order = 5.3f - }, - new - { - Id = 24, - Caption = "Хвостовик 4", - Order = 6.3f - }, - new - { - Id = 25, - Caption = "Пилотный ствол 5", - Order = 4.4f - }, - new - { - Id = 26, - Caption = "Направление 5", - Order = 0.4f - }, - new - { - Id = 27, - Caption = "Кондуктор 5", - Order = 1.4f - }, - new - { - Id = 28, - Caption = "Эксплуатационная колонна 5", - Order = 3.4f - }, - new - { - Id = 29, - Caption = "Транспортный ствол 5", - Order = 5.4f - }, - new - { - Id = 30, - Caption = "Хвостовик 5", - Order = 6.4f - }, - new - { - Id = 31, - Caption = "Техническая колонна", - Order = 2f - }, - new - { - Id = 32, - Caption = "Техническая колонна 2", - Order = 2.1f - }, - new - { - Id = 33, - Caption = "Техническая колонна 3", - Order = 2.2f - }, - new - { - Id = 34, - Caption = "Хвостовик 6", - Order = 6.5f - }, - new - { - Id = 35, - Caption = "Хвостовик 7", - Order = 6.6f - }, - new - { - Id = 36, - Caption = "Хвостовик 8", - Order = 6.7f - }, - new - { - Id = 37, - Caption = "Хвостовик 9", - Order = 6.8f - }, - new - { - Id = 38, - Caption = "Хвостовик 10", - Order = 6.9f - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Конечная глубина бурения, м"); - - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Начальная глубина бурения, м"); - - b.Property("IdSectionType") - .HasColumnType("integer") - .HasColumnName("id_section_type") - .HasComment("Тип секции"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("Id пользователя"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины"); - - b.Property("InnerDiameter") - .HasColumnType("double precision") - .HasColumnName("inner_diameter") - .HasComment("Внутренний диаметр"); - - b.Property("LastUpdateDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_last_update") - .HasComment("Дата последнего обновления"); - - b.Property("OuterDiameter") - .HasColumnType("double precision") - .HasColumnName("outer_diameter") - .HasComment("Внешний диаметр"); - - b.HasKey("Id"); - - b.HasIndex("IdSectionType"); - - b.HasIndex("IdWell", "IdSectionType") - .IsUnique(); - - b.ToTable("t_well_section_plan"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Caption") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("caption") - .HasComment("Название"); - - b.HasKey("Id"); - - b.ToTable("t_well_type", t => - { - t.HasComment("конструкция скважины"); - }); - - b.HasData( - new - { - Id = 1, - Caption = "Наклонно-направленная" - }, - new - { - Id = 2, - Caption = "Горизонтальная" - }); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => - { - b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); - - b.Property("Blkpos") - .HasColumnType("real") - .HasColumnName("BLKPOS"); - - b.Property("Chkp") - .HasColumnType("real") - .HasColumnName("CHKP"); - - b.Property("Deptbitm") - .HasColumnType("real") - .HasColumnName("DEPTBITM"); - - b.Property("Deptbitv") - .HasColumnType("real") - .HasColumnName("DEPTBITV"); - - b.Property("Deptmeas") - .HasColumnType("real") - .HasColumnName("DEPTMEAS"); - - b.Property("Deptretm") - .HasColumnType("real") - .HasColumnName("DEPTRETM"); - - b.Property("Deptvert") - .HasColumnType("real") - .HasColumnName("DEPTVERT"); - - b.Property("Gasa") - .HasColumnType("real") - .HasColumnName("GASA"); - - b.Property("Hkla") - .HasColumnType("real") - .HasColumnName("HKLA"); - - b.Property("Hklx") - .HasColumnType("real") - .HasColumnName("HKLX"); - - b.Property("Lagstks") - .HasColumnType("smallint") - .HasColumnName("LAGSTKS"); - - b.Property("Mcia") - .HasColumnType("real") - .HasColumnName("MCIA"); - - b.Property("Mcoa") - .HasColumnType("real") - .HasColumnName("MCOA"); - - b.Property("Mdia") - .HasColumnType("real") - .HasColumnName("MDIA"); - - b.Property("Mdoa") - .HasColumnType("real") - .HasColumnName("MDOA"); - - b.Property("Mfia") - .HasColumnType("real") - .HasColumnName("MFIA"); - - b.Property("Mfoa") - .HasColumnType("real") - .HasColumnName("MFOA"); - - b.Property("Mfop") - .HasColumnType("smallint") - .HasColumnName("MFOP"); - - b.Property("Mtia") - .HasColumnType("real") - .HasColumnName("MTIA"); - - b.Property("Mtoa") - .HasColumnType("real") - .HasColumnName("MTOA"); - - b.Property("Ropa") - .HasColumnType("real") - .HasColumnName("ROPA"); - - b.Property("Rpma") - .HasColumnType("smallint") - .HasColumnName("RPMA"); - - b.Property("Spare1") - .HasColumnType("real") - .HasColumnName("SPARE1"); - - b.Property("Spare2") - .HasColumnType("real") - .HasColumnName("SPARE2"); - - b.Property("Spare3") - .HasColumnType("real") - .HasColumnName("SPARE3"); - - b.Property("Spare4") - .HasColumnType("real") - .HasColumnName("SPARE4"); - - b.Property("Spare5") - .HasColumnType("real") - .HasColumnName("SPARE5"); - - b.Property("Spm1") - .HasColumnType("smallint") - .HasColumnName("SPM1"); - - b.Property("Spm2") - .HasColumnType("smallint") - .HasColumnName("SPM2"); - - b.Property("Spm3") - .HasColumnType("smallint") - .HasColumnName("SPM3"); - - b.Property("Sppa") - .HasColumnType("real") - .HasColumnName("SPPA"); - - b.Property("Stkc") - .HasColumnType("integer") - .HasColumnName("STKC"); - - b.Property("TelemetryId") - .HasColumnType("integer"); - - b.Property("Torqa") - .HasColumnType("real") - .HasColumnName("TORQA"); - - b.Property("Torqx") - .HasColumnType("real") - .HasColumnName("TORQX"); - - b.Property("Tvolact") - .HasColumnType("real") - .HasColumnName("TVOLACT"); - - b.Property("Tvolcact") - .HasColumnType("real") - .HasColumnName("TVOLCACT"); - - b.Property("Woba") - .HasColumnType("real") - .HasColumnName("WOBA"); - - b.Property("Wobx") - .HasColumnType("real") - .HasColumnName("WOBX"); - - b.HasIndex("TelemetryId"); - - b.ToTable("t_telemetry_wits_1"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => - { - b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); - - b.Property("Deptbitm") - .HasColumnType("real") - .HasColumnName("DEPTBITM"); - - b.Property("DeptmeasGdpMc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_GDP_mc"); - - b.Property("DeptmeasMcrstat") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_MCRSTAT"); - - b.Property("DeptmeasRa33Mc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_RA33_mc"); - - b.Property("DeptmeasRa33f2Mc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_RA33F2_mc"); - - b.Property("DeptmeasRa33f4Mc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_RA33F4_mc"); - - b.Property("DeptmeasRp33Mc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_RP33_mc"); - - b.Property("DeptmeasRp33f2Mc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_RP33F2_mc"); - - b.Property("DeptmeasRp33f4Mc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_RP33F4_mc"); - - b.Property("DeptmeasSlvlMc") - .HasColumnType("real") - .HasColumnName("DEPTMEAS_SLVL_mc"); - - b.Property("GdpMc") - .HasColumnType("real") - .HasColumnName("GDP_mc"); - - b.Property("Mcrstat") - .HasColumnType("real") - .HasColumnName("MCRSTAT"); - - b.Property("Ra33Mc") - .HasColumnType("real") - .HasColumnName("RA33_mc"); - - b.Property("Ra33f2Mc") - .HasColumnType("real") - .HasColumnName("RA33F2_mc"); - - b.Property("Ra33f4Mc") - .HasColumnType("real") - .HasColumnName("RA33F4_mc"); - - b.Property("Rp33Mc") - .HasColumnType("real") - .HasColumnName("RP33_mc"); - - b.Property("Rp33f2Mc") - .HasColumnType("real") - .HasColumnName("RP33F2_mc"); - - b.Property("Rp33f4Mc") - .HasColumnType("real") - .HasColumnName("RP33F4_mc"); - - b.Property("SlvlMc") - .HasColumnType("real") - .HasColumnName("SLVL_mc"); - - b.Property("TelemetryId") - .HasColumnType("integer"); - - b.HasIndex("TelemetryId"); - - b.ToTable("t_telemetry_wits_50"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => - { - b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); - - b.Property("Btot") - .HasColumnType("real") - .HasColumnName("Btot"); - - b.Property("Bx") - .HasColumnType("real") - .HasColumnName("Bx"); - - b.Property("By") - .HasColumnType("real") - .HasColumnName("By"); - - b.Property("Bz") - .HasColumnType("real") - .HasColumnName("Bz"); - - b.Property("Deptbitm") - .HasColumnType("real") - .HasColumnName("DEPTBITM"); - - b.Property("Deptmeas") - .HasColumnType("real") - .HasColumnName("DEPTMEAS"); - - b.Property("Gtot") - .HasColumnType("real") - .HasColumnName("Gtot"); - - b.Property("Gx") - .HasColumnType("real") - .HasColumnName("Gx"); - - b.Property("Gy") - .HasColumnType("real") - .HasColumnName("Gy"); - - b.Property("Gz") - .HasColumnType("real") - .HasColumnName("Gz"); - - b.Property("TelemetryId") - .HasColumnType("integer"); - - b.HasIndex("TelemetryId"); - - b.ToTable("t_telemetry_wits_60"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => - { - b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); - - b.Property("Att06h") - .HasColumnType("real") - .HasColumnName("ATT06H"); - - b.Property("Att06l") - .HasColumnType("real") - .HasColumnName("ATT06L"); - - b.Property("Att10h") - .HasColumnType("real") - .HasColumnName("ATT10H"); - - b.Property("Att10l") - .HasColumnType("real") - .HasColumnName("ATT10L"); - - b.Property("Deptbitm") - .HasColumnType("real") - .HasColumnName("DEPTBITM"); - - b.Property("Deptmeas") - .HasColumnType("real") - .HasColumnName("DEPTMEAS"); - - b.Property("Phl1f1") - .HasColumnType("real") - .HasColumnName("PHL1F1"); - - b.Property("Phl1f2") - .HasColumnType("real") - .HasColumnName("PHL1F2"); - - b.Property("Phl2f1") - .HasColumnType("real") - .HasColumnName("PHL2F1"); - - b.Property("Phl2f2") - .HasColumnType("real") - .HasColumnName("PHL2F2"); - - b.Property("Status") - .HasColumnType("real") - .HasColumnName("Status"); - - b.Property("TelemetryId") - .HasColumnType("integer"); - - b.HasIndex("TelemetryId"); - - b.ToTable("t_telemetry_wits_61"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => - { - b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); - - b.Property("Deptmeas") - .HasColumnType("real") - .HasColumnName("DEPTMEAS"); - - b.Property("Deptsvym") - .HasColumnType("real") - .HasColumnName("DEPTSVYM"); - - b.Property("Deptsvyv") - .HasColumnType("real") - .HasColumnName("DEPTSVYV"); - - b.Property("Passnum") - .HasColumnType("smallint") - .HasColumnName("PASSNUM"); - - b.Property("Spare1") - .HasColumnType("real") - .HasColumnName("SPARE1"); - - b.Property("Spare2") - .HasColumnType("real") - .HasColumnName("SPARE2"); - - b.Property("Spare3") - .HasColumnType("real") - .HasColumnName("SPARE3"); - - b.Property("Spare4") - .HasColumnType("real") - .HasColumnName("SPARE4"); - - b.Property("Spare5") - .HasColumnType("real") - .HasColumnName("SPARE5"); - - b.Property("Svyazc") - .HasColumnType("real") - .HasColumnName("SVYAZC"); - - b.Property("Svyazu") - .HasColumnType("real") - .HasColumnName("SVYAZU"); - - b.Property("Svydls") - .HasColumnType("real") - .HasColumnName("SVYDLS"); - - b.Property("Svyew") - .HasColumnType("real") - .HasColumnName("SVYEW"); - - b.Property("Svygtf") - .HasColumnType("real") - .HasColumnName("SVYGTF"); - - b.Property("Svyinc") - .HasColumnType("real") - .HasColumnName("SVYINC"); - - b.Property("Svymtf") - .HasColumnType("real") - .HasColumnName("SVYMTF"); - - b.Property("Svyns") - .HasColumnType("real") - .HasColumnName("SVYNS"); - - b.Property("Svytype") - .HasColumnType("text") - .HasColumnName("SVYTYPE"); - - b.Property("Svywalk") - .HasColumnType("real") - .HasColumnName("SVYWALK"); - - b.Property("TelemetryId") - .HasColumnType("integer"); - - b.HasIndex("TelemetryId"); - - b.ToTable("t_telemetry_wits_7"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => - { - b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); - - b.Property("Deptbitm") - .HasColumnType("real") - .HasColumnName("DEPTBITM"); - - b.Property("Deptbitv") - .HasColumnType("real") - .HasColumnName("DEPTBITV"); - - b.Property("Deptcalm") - .HasColumnType("real") - .HasColumnName("DEPTCALM"); - - b.Property("Deptcalv") - .HasColumnType("real") - .HasColumnName("DEPTCALV"); - - b.Property("Deptfdm") - .HasColumnType("real") - .HasColumnName("DEPTFDM"); - - b.Property("Deptfdv") - .HasColumnType("real") - .HasColumnName("DEPTFDV"); - - b.Property("Deptgr1m") - .HasColumnType("real") - .HasColumnName("DEPTGR1M"); - - b.Property("Deptgr1v") - .HasColumnType("real") - .HasColumnName("DEPTGR1V"); - - b.Property("Deptgr2m") - .HasColumnType("real") - .HasColumnName("DEPTGR2M"); - - b.Property("Deptgr2v") - .HasColumnType("real") - .HasColumnName("DEPTGR2V"); - - b.Property("Deptmeas") - .HasColumnType("real") - .HasColumnName("DEPTMEAS"); - - b.Property("Deptp1m") - .HasColumnType("real") - .HasColumnName("DEPTP1M"); - - b.Property("Deptp1v") - .HasColumnType("real") - .HasColumnName("DEPTP1V"); - - b.Property("Deptp2m") - .HasColumnType("real") - .HasColumnName("DEPTP2M"); - - b.Property("Deptp2v") - .HasColumnType("real") - .HasColumnName("DEPTP2V"); - - b.Property("Deptrs1m") - .HasColumnType("real") - .HasColumnName("DEPTRS1M"); - - b.Property("Deptrs1v") - .HasColumnType("real") - .HasColumnName("DEPTRS1V"); - - b.Property("Deptrs2m") - .HasColumnType("real") - .HasColumnName("DEPTRS2M"); - - b.Property("Deptrs2v") - .HasColumnType("real") - .HasColumnName("DEPTRS2V"); - - b.Property("Deptvert") - .HasColumnType("real") - .HasColumnName("DEPTVERT"); - - b.Property("Mclp") - .HasColumnType("real") - .HasColumnName("MCLP"); - - b.Property("Mfd") - .HasColumnType("real") - .HasColumnName("MFD"); - - b.Property("Mffp") - .HasColumnType("real") - .HasColumnName("MFFP"); - - b.Property("Mfpp") - .HasColumnType("real") - .HasColumnName("MFPP"); - - b.Property("Mfrann") - .HasColumnType("real") - .HasColumnName("MFRANN"); - - b.Property("Mfrpipe") - .HasColumnType("real") - .HasColumnName("MFRPIPE"); - - b.Property("Mftann") - .HasColumnType("real") - .HasColumnName("MFTANN"); - - b.Property("Mftpipe") - .HasColumnType("real") - .HasColumnName("MFTPIPE"); - - b.Property("Mg1") - .HasColumnType("real") - .HasColumnName("MG1"); - - b.Property("Mg1c") - .HasColumnType("real") - .HasColumnName("MG1C"); - - b.Property("Mg2") - .HasColumnType("real") - .HasColumnName("MG2"); - - b.Property("Mg2c") - .HasColumnType("real") - .HasColumnName("MG2C"); - - b.Property("Mpo1") - .HasColumnType("real") - .HasColumnName("MPO1"); - - b.Property("Mpo2") - .HasColumnType("real") - .HasColumnName("MPO2"); - - b.Property("Mr1") - .HasColumnType("real") - .HasColumnName("MR1"); - - b.Property("Mr1c") - .HasColumnType("real") - .HasColumnName("MR1C"); - - b.Property("Mr2") - .HasColumnType("real") - .HasColumnName("MR2"); - - b.Property("Mr2c") - .HasColumnType("real") - .HasColumnName("MR2C"); - - b.Property("Passnum") - .HasColumnType("smallint") - .HasColumnName("PASSNUM"); - - b.Property("Spare1") - .HasColumnType("real") - .HasColumnName("SPARE1"); - - b.Property("Spare2") - .HasColumnType("real") - .HasColumnName("SPARE2"); - - b.Property("Spare3") - .HasColumnType("real") - .HasColumnName("SPARE3"); - - b.Property("Spare4") - .HasColumnType("real") - .HasColumnName("SPARE4"); - - b.Property("Spare5") - .HasColumnType("real") - .HasColumnName("SPARE5"); - - b.Property("Spare6") - .HasColumnType("real") - .HasColumnName("SPARE6"); - - b.Property("Spare7") - .HasColumnType("real") - .HasColumnName("SPARE7"); - - b.Property("Spare8") - .HasColumnType("real") - .HasColumnName("SPARE8"); - - b.Property("Spare9") - .HasColumnType("real") - .HasColumnName("SPARE9"); - - b.Property("TelemetryId") - .HasColumnType("integer"); - - b.HasIndex("TelemetryId"); - - b.ToTable("t_telemetry_wits_8"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => - { - b.HasOne("AsbCloudDb.Model.Deposit", "Deposit") - .WithMany("Clusters") - .HasForeignKey("IdDeposit") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_cluster_t_deposit_id_fk"); - - b.Navigation("Deposit"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Company", b => - { - b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType") - .WithMany("Companies") - .HasForeignKey("IdCompanyType") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CompanyType"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Contact", b => - { - b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType") - .WithMany("Contacts") - .HasForeignKey("IdCompanyType") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany("Contacts") - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("CompanyType"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => - { - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => - { - b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") - .WithMany() - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("OperationCategory"); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => - { - b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") - .WithMany() - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("OperationCategory"); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => - { - b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") - .WithMany() - .HasForeignKey("IdFileCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany("DrillingProgramParts") - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("FileCategory"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Faq", b => - { - b.HasOne("AsbCloudDb.Model.User", "AuthorAnswer") - .WithMany() - .HasForeignKey("IdAuthorAnswer"); - - b.HasOne("AsbCloudDb.Model.User", "AuthorQuestion") - .WithMany() - .HasForeignKey("IdAuthorQuestion") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("AuthorAnswer"); - - b.Navigation("AuthorQuestion"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => - { - b.HasOne("AsbCloudDb.Model.User", "Author") - .WithMany("Files") - .HasForeignKey("IdAuthor"); - - b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") - .WithMany() - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Author"); - - b.Navigation("FileCategory"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => - { - b.HasOne("AsbCloudDb.Model.FileInfo", "FileInfo") - .WithMany("FileMarks") - .HasForeignKey("IdFile") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_file_mark_t_file_info_fk"); - - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany("FileMarks") - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_user_t_file_mark_fk"); - - b.Navigation("FileInfo"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => - { - b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") - .WithMany() - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("FileCategory"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Manuals.Manual", b => - { - b.HasOne("AsbCloudDb.Model.User", "Author") - .WithMany() - .HasForeignKey("IdAuthor") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.FileCategory", "Category") - .WithMany() - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Manuals.ManualDirectory", "Directory") - .WithMany("Manuals") - .HasForeignKey("IdDirectory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Author"); - - b.Navigation("Category"); - - b.Navigation("Directory"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => - { - b.HasOne("AsbCloudDb.Model.Manuals.ManualDirectory", "Parent") - .WithMany("Children") - .HasForeignKey("IdParent") - .OnDelete(DeleteBehavior.Cascade); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Measure", b => - { - b.HasOne("AsbCloudDb.Model.MeasureCategory", "Category") - .WithMany("Measures") - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Notification", b => - { - b.HasOne("AsbCloudDb.Model.NotificationCategory", "NotificationCategory") - .WithMany("Notifications") - .HasForeignKey("IdNotificationCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("NotificationCategory"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.OperationValue", b => - { - b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") - .WithMany() - .HasForeignKey("IdOperationCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("OperationCategory"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", b => - { - b.HasOne("AsbCloudDb.Model.User", "Author") - .WithMany() - .HasForeignKey("IdAuthor") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.User", "Editor") - .WithMany() - .HasForeignKey("IdEditor") - .OnDelete(DeleteBehavior.Restrict); - - b.HasOne("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", "Previous") - .WithMany() - .HasForeignKey("IdPrevious"); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") - .WithMany() - .HasForeignKey("IdWellSectionType") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Author"); - - b.Navigation("Editor"); - - b.Navigation("Previous"); - - b.Navigation("Well"); - - b.Navigation("WellSectionType"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => - { - b.HasOne("AsbCloudDb.Model.User", "Author") - .WithMany() - .HasForeignKey("IdAuthor") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.User", "Editor") - .WithMany() - .HasForeignKey("IdEditor"); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") - .WithMany() - .HasForeignKey("IdWellSectionType") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Author"); - - b.Navigation("Editor"); - - b.Navigation("Well"); - - b.Navigation("WellSectionType"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => - { - b.HasOne("AsbCloudDb.Model.Company", "Company") - .WithMany("RelationCompaniesWells") - .HasForeignKey("IdCompany") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_relation_company_well_t_company_id_fk"); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany("RelationCompaniesWells") - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_relation_company_well_t_well_id_fk"); - - b.Navigation("Company"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationContactWell", b => - { - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany("RelationContactsWells") - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => - { - b.HasOne("AsbCloudDb.Model.DrillingProgramPart", "DrillingProgramPart") - .WithMany("RelatedUsers") - .HasForeignKey("IdDrillingProgramPart") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("DrillingProgramPart"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => - { - b.HasOne("AsbCloudDb.Model.Permission", "Permission") - .WithMany("RelationUserRolePermissions") - .HasForeignKey("IdPermission") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") - .WithMany("RelationUserRolePermissions") - .HasForeignKey("IdUserRole") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Permission"); - - b.Navigation("UserRole"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => - { - b.HasOne("AsbCloudDb.Model.UserRole", "Role") - .WithMany("RelationUserRoleUserRoles") - .HasForeignKey("Id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.UserRole", "IncludeRole") - .WithMany() - .HasForeignKey("IdInclude") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("IncludeRole"); - - b.Navigation("Role"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => - { - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany("RelationUsersUserRoles") - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") - .WithMany("RelationUsersUserRoles") - .HasForeignKey("IdUserRole") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - - b.Navigation("UserRole"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => - { - b.HasOne("AsbCloudDb.Model.FileInfo", "File") - .WithMany() - .HasForeignKey("IdFile") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("File"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => - { - b.HasOne("AsbCloudDb.Model.Driller", "Driller") - .WithMany("Schedule") - .HasForeignKey("IdDriller") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_schedule_t_driller_id_driller"); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Driller"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => - { - b.HasOne("AsbCloudDb.Model.User", "Author") - .WithMany() - .HasForeignKey("IdAuthor") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Author"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany("DataSaub") - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk"); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany("DataSpin") - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk"); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany("Events") - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_event_t_telemetry_id_fk"); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany("Messages") - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_messages_t_telemetry_id_fk"); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany("Users") - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => - { - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlan", b => - { - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.User", b => - { - b.HasOne("AsbCloudDb.Model.Company", "Company") - .WithMany("Users") - .HasForeignKey("IdCompany") - .OnDelete(DeleteBehavior.SetNull) - .IsRequired() - .HasConstraintName("t_user_t_company_id_fk"); - - b.Navigation("Company"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => - { - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Well", b => - { - b.HasOne("AsbCloudDb.Model.Cluster", "Cluster") - .WithMany("Wells") - .HasForeignKey("IdCluster") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_well_t_cluster_id_fk"); - - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithOne("Well") - .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("t_well_t_telemetry_id_fk"); - - b.HasOne("AsbCloudDb.Model.WellType", "WellType") - .WithMany("Wells") - .HasForeignKey("IdWellType") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Cluster"); - - b.Navigation("Telemetry"); - - b.Navigation("WellType"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => - { - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany("WellComposites") - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_well_сomposite_t_well_id_fk"); - - b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") - .WithMany("WellComposites") - .HasForeignKey("IdWellSectionType") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk"); - - b.HasOne("AsbCloudDb.Model.Well", "WellSrc") - .WithMany("WellCompositeSrcs") - .HasForeignKey("IdWellSrc") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("t_well_сomposite_src_t_well_id_fk"); - - b.Navigation("Well"); - - b.Navigation("WellSectionType"); - - b.Navigation("WellSrc"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocument", b => - { - b.HasOne("AsbCloudDb.Model.FileCategory", "Category") - .WithMany() - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.User", "User") - .WithMany() - .HasForeignKey("IdUser") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("User"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => - { - b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") - .WithMany() - .HasForeignKey("IdCategory") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.WellOperation", "OperationPlan") - .WithMany() - .HasForeignKey("IdPlan") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany("WellOperations") - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") - .WithMany("WellOperations") - .HasForeignKey("IdWellSectionType") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("OperationCategory"); - - b.Navigation("OperationPlan"); - - b.Navigation("Well"); - - b.Navigation("WellSectionType"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => - { - b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Parent") - .WithMany() - .HasForeignKey("IdParent"); - - b.Navigation("Parent"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => - { - b.HasOne("AsbCloudDb.Model.WellSectionType", "SectionType") - .WithMany() - .HasForeignKey("IdSectionType") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("AsbCloudDb.Model.Well", "Well") - .WithMany() - .HasForeignKey("IdWell") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("SectionType"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("TelemetryId"); - - b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) - .WithOne() - .HasForeignKey("AsbCloudDb.Model.WITS.Record1", "IdTelemetry", "DateTime") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("TelemetryId"); - - b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) - .WithOne() - .HasForeignKey("AsbCloudDb.Model.WITS.Record50", "IdTelemetry", "DateTime") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("TelemetryId"); - - b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) - .WithOne() - .HasForeignKey("AsbCloudDb.Model.WITS.Record60", "IdTelemetry", "DateTime") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("TelemetryId"); - - b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) - .WithOne() - .HasForeignKey("AsbCloudDb.Model.WITS.Record61", "IdTelemetry", "DateTime") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("TelemetryId"); - - b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) - .WithOne() - .HasForeignKey("AsbCloudDb.Model.WITS.Record7", "IdTelemetry", "DateTime") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("TelemetryId"); - - b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) - .WithOne() - .HasForeignKey("AsbCloudDb.Model.WITS.Record8", "IdTelemetry", "DateTime") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => - { - b.Navigation("Wells"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Company", b => - { - b.Navigation("RelationCompaniesWells"); - - b.Navigation("Users"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => - { - b.Navigation("Companies"); - - b.Navigation("Contacts"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => - { - b.Navigation("Clusters"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Driller", b => - { - b.Navigation("Schedule"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => - { - b.Navigation("RelatedUsers"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => - { - b.Navigation("FileMarks"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => - { - b.Navigation("Children"); - - b.Navigation("Manuals"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => - { - b.Navigation("Measures"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => - { - b.Navigation("Notifications"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Permission", b => - { - b.Navigation("RelationUserRolePermissions"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => - { - b.Navigation("DataSaub"); - - b.Navigation("DataSpin"); - - b.Navigation("Events"); - - b.Navigation("Messages"); - - b.Navigation("Users"); - - b.Navigation("Well"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.User", b => - { - b.Navigation("FileMarks"); - - b.Navigation("Files"); - - b.Navigation("RelationContactsWells"); - - b.Navigation("RelationUsersUserRoles"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => - { - b.Navigation("RelationUserRolePermissions"); - - b.Navigation("RelationUserRoleUserRoles"); - - b.Navigation("RelationUsersUserRoles"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Well", b => - { - b.Navigation("Contacts"); - - b.Navigation("DrillingProgramParts"); - - b.Navigation("RelationCompaniesWells"); - - b.Navigation("WellCompositeSrcs"); - - b.Navigation("WellComposites"); - - b.Navigation("WellOperations"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => - { - b.Navigation("WellComposites"); - - b.Navigation("WellOperations"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.WellType", b => - { - b.Navigation("Wells"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.cs b/AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.cs deleted file mode 100644 index d806854b..00000000 --- a/AsbCloudDb/Migrations/20240320074649_Update_ItemInfo.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace AsbCloudDb.Migrations -{ - /// - public partial class Update_ItemInfo : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "LastUpdateDate", - table: "t_well_operation", - type: "timestamp with time zone", - nullable: true, - oldClrType: typeof(DateTimeOffset), - oldType: "timestamp with time zone"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "LastUpdateDate", - table: "t_well_operation", - type: "timestamp with time zone", - nullable: false, - defaultValue: new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)), - oldClrType: typeof(DateTimeOffset), - oldType: "timestamp with time zone", - oldNullable: true); - } - } -} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 4ae3016a..b572b8da 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -482,7 +482,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_deposit", t => + b.ToTable("t_deposit", null, t => { t.HasComment("Месторождение"); }); @@ -553,7 +553,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_detected_operation", t => + b.ToTable("t_detected_operation", null, t => { t.HasComment("автоматически определенные операции по телеметрии"); }); @@ -591,7 +591,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_drill_test", t => + b.ToTable("t_drill_test", null, t => { t.HasComment("Drill_test"); }); @@ -629,7 +629,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_driller", t => + b.ToTable("t_driller", null, t => { t.HasComment("Бурильщик"); }); @@ -659,7 +659,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell", "IdFileCategory") .IsUnique(); - b.ToTable("t_drilling_program_part", t => + b.ToTable("t_drilling_program_part", null, t => { t.HasComment("части программ бурения"); }); @@ -737,7 +737,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdAuthorQuestion"); - b.ToTable("t_faq", t => + b.ToTable("t_faq", null, t => { t.HasComment("вопросы пользователей"); }); @@ -765,7 +765,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_file_category", t => + b.ToTable("t_file_category", null, t => { t.HasComment("Категории файлов"); }); @@ -1166,7 +1166,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_file_info", t => + b.ToTable("t_file_info", null, t => { t.HasComment("Файлы всех категорий"); }); @@ -1218,7 +1218,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_file_mark", t => + b.ToTable("t_file_mark", null, t => { t.HasComment("Действия с файлами."); }); @@ -1248,7 +1248,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_float", t => + b.ToTable("t_wits_float", null, t => { t.HasComment("таблица данных ГТИ с типом значения float"); }); @@ -1278,7 +1278,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_int", t => + b.ToTable("t_wits_int", null, t => { t.HasComment("таблица данных ГТИ с типом значения int"); }); @@ -1309,7 +1309,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_string", t => + b.ToTable("t_wits_string", null, t => { t.HasComment("таблица данных ГТИ с типом значения string"); }); @@ -1350,7 +1350,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdCategory"); - b.ToTable("t_help_page", t => + b.ToTable("t_help_page", null, t => { t.HasComment("Справки"); }); @@ -1393,7 +1393,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_limiting_parameter", t => + b.ToTable("t_limiting_parameter", null, t => { t.HasComment("Ограничения по параметрам телеметрии"); }); @@ -1442,7 +1442,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDirectory"); - b.ToTable("t_manual", t => + b.ToTable("t_manual", null, t => { t.HasComment("Инструкции"); }); @@ -1472,7 +1472,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdParent"); - b.ToTable("t_manual_directory", t => + b.ToTable("t_manual_directory", null, t => { t.HasComment("Директория для инструкций"); }); @@ -1519,7 +1519,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_measure", t => + b.ToTable("t_measure", null, t => { t.HasComment("Таблица c данными для вкладки 'Последние данные'"); }); @@ -1547,7 +1547,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_measure_category", t => + b.ToTable("t_measure_category", null, t => { t.HasComment("Категория последних данных"); }); @@ -1630,7 +1630,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_notification", t => + b.ToTable("t_notification", null, t => { t.HasComment("Уведомления"); }); @@ -1652,7 +1652,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_notification_category", t => + b.ToTable("t_notification_category", null, t => { t.HasComment("Категории уведомлений"); }); @@ -1711,7 +1711,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_operationvalue", t => + b.ToTable("t_operationvalue", null, t => { t.HasComment("Целевые/нормативные показатели операции"); }); @@ -1741,7 +1741,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_permission", t => + b.ToTable("t_permission", null, t => { t.HasComment("Разрешения на доступ к данным"); }); @@ -2768,7 +2768,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_process_map_plan_drilling", t => + b.ToTable("t_process_map_plan_drilling", null, t => { t.HasComment("РТК план бурение"); }); @@ -2889,7 +2889,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_process_map_plan_ream", t => + b.ToTable("t_process_map_plan_ream", null, t => { t.HasComment("РТК проработка скважины"); }); @@ -2909,7 +2909,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_relation_company_well", t => + b.ToTable("t_relation_company_well", null, t => { t.HasComment("отношение скважин и компаний"); }); @@ -2929,7 +2929,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_relation_contact_well"); + b.ToTable("t_relation_contact_well", (string)null); }); modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => @@ -2952,7 +2952,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDrillingProgramPart"); - b.ToTable("t_relation_user_drilling_program_part", t => + b.ToTable("t_relation_user_drilling_program_part", null, t => { t.HasComment("Отношение пользователей и частей ПБ"); }); @@ -2972,7 +2972,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdPermission"); - b.ToTable("t_relation_user_role_permission", t => + b.ToTable("t_relation_user_role_permission", null, t => { t.HasComment("Отношение ролей пользователей и разрешений доступа"); }); @@ -4290,7 +4290,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdInclude"); - b.ToTable("t_relation_user_role_user_role", t => + b.ToTable("t_relation_user_role_user_role", null, t => { t.HasComment("Отношение ролей к ролям"); }); @@ -4582,7 +4582,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUserRole"); - b.ToTable("t_relation_user_user_role", t => + b.ToTable("t_relation_user_user_role", null, t => { t.HasComment("Отношение пользователей и ролей"); }); @@ -4639,7 +4639,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_report_property", t => + b.ToTable("t_report_property", null, t => { t.HasComment("Отчеты с данными по буровым"); }); @@ -4691,7 +4691,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_schedule", t => + b.ToTable("t_schedule", null, t => { t.HasComment("График работы бурильщика"); }); @@ -4747,7 +4747,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_setpoints_rquest", t => + b.ToTable("t_setpoints_rquest", null, t => { t.HasComment("Запросы на изменение уставок панели оператора"); }); @@ -4775,7 +4775,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_subsystem", t => + b.ToTable("t_subsystem", null, t => { t.HasComment("Описание подсистем"); }); @@ -4844,7 +4844,7 @@ namespace AsbCloudDb.Migrations b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); - b.ToTable("t_telemetry", t => + b.ToTable("t_telemetry", null, t => { t.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); }); @@ -5063,7 +5063,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_data_saub", t => + b.ToTable("t_telemetry_data_saub", null, t => { t.HasComment("набор основных данных по SAUB"); }); @@ -5163,7 +5163,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_data_spin", t => + b.ToTable("t_telemetry_data_spin", null, t => { t.HasComment("набор основных данных по SpinMaster"); }); @@ -5190,7 +5190,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdEvent"); - b.ToTable("t_telemetry_event", t => + b.ToTable("t_telemetry_event", null, t => { t.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); }); @@ -5251,7 +5251,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_telemetry_message", t => + b.ToTable("t_telemetry_message", null, t => { t.HasComment("Сообщения на буровых"); }); @@ -5289,7 +5289,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdUser"); - b.ToTable("t_telemetry_user", t => + b.ToTable("t_telemetry_user", null, t => { t.HasComment("Пользователи панели САУБ. Для сообщений."); }); @@ -5332,7 +5332,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry"); - b.ToTable("t_telemetry_wireline_run_out", t => + b.ToTable("t_telemetry_wireline_run_out", null, t => { t.HasComment("Наработка талевого каната"); }); @@ -5398,7 +5398,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_trajectory_fact", t => + b.ToTable("t_trajectory_fact", null, t => { t.HasComment("Загрузка фактической траектории"); }); @@ -5469,7 +5469,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_trajectory_plan", t => + b.ToTable("t_trajectory_plan", null, t => { t.HasComment("Загрузка плановой траектории"); }); @@ -5550,7 +5550,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("Login") .IsUnique(); - b.ToTable("t_user", t => + b.ToTable("t_user", null, t => { t.HasComment("Пользователи облака"); }); @@ -5591,7 +5591,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_user_role", t => + b.ToTable("t_user_role", null, t => { t.HasComment("Роли пользователей в системе"); }); @@ -5930,7 +5930,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdUser", "Key"); - b.ToTable("t_user_settings", t => + b.ToTable("t_user_settings", null, t => { t.HasComment("настройки интерфейса пользователя"); }); @@ -5976,9 +5976,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_wits_base"); - - b.UseTptMappingStrategy(); + b.ToTable("t_telemetry_wits_base", (string)null); }); modelBuilder.Entity("AsbCloudDb.Model.Well", b => @@ -6036,7 +6034,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellType"); - b.ToTable("t_well", t => + b.ToTable("t_well", null, t => { t.HasComment("скважины"); }); @@ -6065,7 +6063,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSrc"); - b.ToTable("t_well_composite", t => + b.ToTable("t_well_composite", null, t => { t.HasComment("Композитная скважина"); }); @@ -6092,7 +6090,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_well_final_documents", t => + b.ToTable("t_well_final_documents", null, t => { t.HasComment("Дело скважины"); }); @@ -6165,7 +6163,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("id_well_section_type") .HasComment("Id тип секции скважины"); - b.Property("LastUpdateDate") + b.Property("LastUpdateDate") .HasColumnType("timestamp with time zone"); b.HasKey("Id"); @@ -6182,7 +6180,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_well_operation", t => + b.ToTable("t_well_operation", null, t => { t.HasComment("Данные по операциям на скважине"); }); @@ -6224,7 +6222,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdParent"); - b.ToTable("t_well_operation_category", t => + b.ToTable("t_well_operation_category", null, t => { t.HasComment("Справочник операций на скважине"); }); @@ -7337,7 +7335,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_well_section_type", t => + b.ToTable("t_well_section_type", null, t => { t.HasComment("конструкция секции скважины"); }); @@ -7629,7 +7627,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell", "IdSectionType") .IsUnique(); - b.ToTable("t_well_section_plan"); + b.ToTable("t_well_section_plan", (string)null); }); modelBuilder.Entity("AsbCloudDb.Model.WellType", b => @@ -7650,7 +7648,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_well_type", t => + b.ToTable("t_well_type", null, t => { t.HasComment("конструкция скважины"); }); @@ -7829,7 +7827,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_1"); + b.ToTable("t_telemetry_wits_1", (string)null); }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => @@ -7917,7 +7915,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_50"); + b.ToTable("t_telemetry_wits_50", (string)null); }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => @@ -7969,7 +7967,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_60"); + b.ToTable("t_telemetry_wits_60", (string)null); }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => @@ -8025,7 +8023,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_61"); + b.ToTable("t_telemetry_wits_61", (string)null); }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => @@ -8113,7 +8111,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_7"); + b.ToTable("t_telemetry_wits_7", (string)null); }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => @@ -8317,7 +8315,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_8"); + b.ToTable("t_telemetry_wits_8", (string)null); }); modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => diff --git a/AsbCloudDb/Model/ItemInfo.cs b/AsbCloudDb/Model/ItemInfo.cs index bf579080..c93a74bf 100644 --- a/AsbCloudDb/Model/ItemInfo.cs +++ b/AsbCloudDb/Model/ItemInfo.cs @@ -12,6 +12,6 @@ namespace AsbCloudDb.Model /// /// дата последнего обновления блока /// - public DateTimeOffset? LastUpdateDate { get; set; } + public DateTimeOffset LastUpdateDate { get; set; } = DateTimeOffset.UtcNow; } } diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 371127c4..6bdaf411 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -76,9 +76,4 @@ - - - - - diff --git a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs index 3cdce610..f5d11f38 100644 --- a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore.ChangeTracking; namespace AsbCloudInfrastructure.Repository { @@ -86,7 +87,7 @@ namespace AsbCloudInfrastructure.Repository entity.Id = 0; return entity; }); - var entries = new List(items.Count()); + var entries = new List(items.Count()); foreach (var entity in entities) { var entry = dbSet.Add(entity); @@ -130,9 +131,10 @@ namespace AsbCloudInfrastructure.Repository return ICrudRepository.ErrorIdNotFound; var entities = dtos.Select(Convert); - dbContext.Set().UpdateRange(entities); - - return await dbContext.SaveChangesAsync(token); + var entries = entities.Select(entity => dbSet.Update(entity)).Cast().ToList(); + var affected = await dbContext.SaveChangesAsync(token); + entries.ForEach(e => e.State = EntityState.Detached); + return affected; } /// @@ -151,10 +153,21 @@ namespace AsbCloudInfrastructure.Repository public virtual async Task DeleteRangeAsync(IEnumerable ids, CancellationToken token) { - var query = dbContext.Set().Where(e => ids.Contains(e.Id)); - dbContext.Set().RemoveRange(query); + if (!ids.Any()) + return 0; + + var countExistingEntities = await dbSet + .Where(d => ids.Contains(d.Id)) + .CountAsync(token); - return await dbContext.SaveChangesAsync(token); + if (ids.Count() > countExistingEntities) + return ICrudRepository.ErrorIdNotFound; + + var entities = dbContext.Set().Where(e => ids.Contains(e.Id)); + var entries = entities.Select(entity => dbSet.Remove(entity)).Cast().ToList(); + var affected = await dbContext.SaveChangesAsync(token); + entries.ForEach(e => e.State = EntityState.Detached); + return affected; } protected virtual TDto Convert(TEntity src) => src.Adapt(); diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index c40efd54..c9f91c82 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -44,8 +44,15 @@ public class WellOperationRepository : CrudRepositoryBase> GetAsync(WellOperationRequest request, CancellationToken token) { - var entities = await BuildQuery(request) - .AsNoTracking() + var query = BuildQuery(request); + + if (request.Skip.HasValue) + query = query.Skip(request.Skip.Value); + + if (request.Take.HasValue) + query = query.Take(request.Take.Value); + + var entities = await query.AsNoTracking() .ToArrayAsync(token); var dtos = entities.Select(Convert); @@ -180,6 +187,7 @@ public class WellOperationRepository : CrudRepositoryBase request.IdsWell != null && request.IdsWell.Contains(e.IdWell)) + .OrderBy(e => e.DateStart) .Select(o => new WellOperation { Id = o.Id, @@ -314,23 +322,6 @@ public class WellOperationRepository : CrudRepositoryBase o.IdWell == idWell && o.IdType == idType); - - if (!query.Any()) - return null; - - var minDate = query.Min(o => o.DateStart); - var maxDate = query.Max(o => o.DateStart); - - return new DatesRangeDto - { - From = minDate.ToOffset(minDate.Offset), - To = maxDate.ToOffset(minDate.Offset) - }; - } - public async Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken) { var query = dbContext.WellOperations.Where(o => o.IdWell == idWell && o.IdType == idType); @@ -338,20 +329,21 @@ public class WellOperationRepository : CrudRepositoryBase o.DateStart, cancellationToken); var maxDate = await query.MaxAsync(o => o.DateStart, cancellationToken); return new DatesRangeDto { - From = minDate.ToOffset(minDate.Offset), - To = maxDate.ToOffset(minDate.Offset) + From = minDate.ToOffset(timeZoneOffset), + To = maxDate.ToOffset(timeZoneOffset) }; } protected override WellOperation Convert(WellOperationDto src) { var entity = src.Adapt(); - entity.LastUpdateDate = src.LastUpdateDate?.UtcDateTime; entity.DateStart = src.DateStart.UtcDateTime; return entity; } @@ -363,7 +355,7 @@ public class WellOperationRepository : CrudRepositoryBase(); dto.DateStart = src.DateStart.ToOffset(timeZoneOffset); - dto.LastUpdateDate = src.LastUpdateDate?.ToOffset(timeZoneOffset); + dto.LastUpdateDate = src.LastUpdateDate.ToOffset(timeZoneOffset); return dto; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index d7c0f7d0..cfccf153 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -272,8 +272,9 @@ namespace AsbCloudInfrastructure.Services if (entity.Timezone is null) dto.Timezone = GetTimezone(entity.Id); - - dto.StartDate = wellOperationRepository.GetDatesRange(entity.Id, WellOperation.IdOperationTypeFact)?.From.ToRemoteDateTime(dto.Timezone.Hours); + + dto.StartDate = dbContext.WellOperations.Where(e => e.IdType == WellOperation.IdOperationTypeFact) + .MinOrDefault(e => e.DateStart)?.ToRemoteDateTime(dto.Timezone.Hours); dto.WellType = entity.WellType.Caption; dto.Cluster = entity.Cluster.Caption; dto.Deposit = entity.Cluster.Deposit.Caption; From 626c3cb238d8b2cc0a44b237ab0c9c5962c2c3b9 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 26 Mar 2024 15:23:24 +0500 Subject: [PATCH 40/52] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20GetTimezo?= =?UTF-8?q?ne=20(=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B5=20=D0=BD=D0=B5=20=D0=BC=D0=B0=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=82=20=D0=B2=20dto)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/WellService.cs | 68 ++++--------------- 1 file changed, 14 insertions(+), 54 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index ac457347..853a0773 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -116,12 +116,12 @@ namespace AsbCloudInfrastructure.Services if (well is null) return null; - + var wellInfo = wellInfoService.FirstOrDefault(well => well.Id == idWell); if (wellInfo is null) return well.Adapt(); - + wellInfo.IdState = well.IdState; return wellInfo; } @@ -153,7 +153,7 @@ namespace AsbCloudInfrastructure.Services { if (IsTelemetryAssignedToDifferentWell(dto)) throw new ArgumentInvalidException(nameof(dto), "Телеметрия уже была привязана к другой скважине."); - + if (dto.Id != 0 && (await GetCacheAsync(token)).Any(w => w.Id == dto.Id)) throw new ArgumentInvalidException(nameof(dto), $"Нельзя повторно добавить скважину с id: {dto.Id}"); @@ -177,12 +177,12 @@ namespace AsbCloudInfrastructure.Services throw new NotImplementedException(); } - public override async Task UpdateAsync(WellDto dto, + public override async Task UpdateAsync(WellDto dto, CancellationToken token) { if (IsTelemetryAssignedToDifferentWell(dto)) throw new ArgumentInvalidException(nameof(dto), "Телеметрия уже была привязана к другой скважине."); - + var oldRelations = (await GetCacheRelationCompanyWellAsync(token)) .Where(r => r.IdWell == dto.Id).ToArray(); @@ -192,16 +192,16 @@ namespace AsbCloudInfrastructure.Services dbContext.RelationCompaniesWells .RemoveRange(dbContext.RelationCompaniesWells .Where(r => r.IdWell == dto.Id)); - + DropCacheRelationCompanyWell(); var newRelations = dto.Companies .Select(c => new RelationCompanyWell { - IdWell = dto.Id, + IdWell = dto.Id, IdCompany = c.Id }); - + dbContext.RelationCompaniesWells.AddRange(newRelations); } @@ -215,7 +215,7 @@ namespace AsbCloudInfrastructure.Services public async Task GetWellCaptionByIdAsync(int idWell, CancellationToken token) { - var entity = await GetOrDefaultAsync(idWell, token).ConfigureAwait(false); + var entity = await GetOrDefaultAsync(idWell, token).ConfigureAwait(false); return entity!.Caption; } @@ -270,10 +270,7 @@ namespace AsbCloudInfrastructure.Services { var dto = base.Convert(entity); - if (entity.Timezone is null) - dto.Timezone = GetTimezone(entity.Id); - - dto.StartDate = wellOperationRepository.FirstOperationDate(entity.Id)?.ToOffset(TimeSpan.FromHours(dto.Timezone.Hours)); + dto.StartDate = wellOperationRepository.FirstOperationDate(entity.Id); dto.WellType = entity.WellType.Caption; dto.Cluster = entity.Cluster.Caption; dto.Deposit = entity.Cluster.Deposit.Caption; @@ -296,47 +293,10 @@ namespace AsbCloudInfrastructure.Services public SimpleTimezoneDto GetTimezone(int idWell) { - var well = GetOrDefault(idWell) + var cache = GetCache(); + var cacheItem = cache.FirstOrDefault(d => d.Id == idWell) ?? throw new ArgumentInvalidException(nameof(idWell), $"idWell: {idWell} does not exist."); - return GetTimezone(well); - } - - private SimpleTimezoneDto GetTimezone(WellDto wellDto) - { - if (wellDto.Timezone is not null) - return wellDto.Timezone; - - if (wellDto.Telemetry is not null) - { - var timezone = telemetryService.GetTimezone(wellDto.Telemetry.Id); - if (timezone is not null) - return timezone; - } - - var well = GetQuery().FirstOrDefault(w => w.Id == wellDto.Id); - - if (well is not null) - { - var point = GetCoordinates(well); - if (point is not null) - { - if (point.Timezone is not null) - { - return point.Timezone.Adapt(); - } - - if (point.Latitude is not null & point.Longitude is not null) - { - var timezone = timezoneService.GetOrDefaultByCoordinates(point.Latitude!.Value, point.Longitude!.Value); - if (timezone is not null) - { - return timezone; - } - } - } - } - - throw new Exception($"Can't find timezone for well {wellDto.Caption} id: {wellDto.Id}"); + return cacheItem.Timezone.Adapt(); } private bool IsTelemetryAssignedToDifferentWell(WellDto wellDto) @@ -349,7 +309,7 @@ namespace AsbCloudInfrastructure.Services if (existingWellWithAssignedTelemetry is null) return false; - + return existingWellWithAssignedTelemetry.Id != wellDto.Id; } From 24887632f42c593c2d8e55e072dc6c72c9132fdb 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, 27 Mar 2024 07:53:54 +0300 Subject: [PATCH 41/52] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/WellOperationRequest.cs | 122 +++++++++++------- .../DailyReport/DailyReportService.cs | 8 +- .../Report/ProcessMapReportDrillingService.cs | 3 +- .../Services/WellCompositeOperationService.cs | 3 +- .../WellOperations/WellOperationExport.cs | 3 +- .../Clients/IWellOperationClient.cs | 2 +- .../WellOperationControllerTest.cs | 2 +- .../Controllers/WellOperationController.cs | 17 +-- 8 files changed, 94 insertions(+), 66 deletions(-) diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs index 3164c2d1..356ef52d 100644 --- a/AsbCloudApp/Requests/WellOperationRequest.cs +++ b/AsbCloudApp/Requests/WellOperationRequest.cs @@ -1,52 +1,84 @@ using System; using System.Collections.Generic; -namespace AsbCloudApp.Requests +namespace AsbCloudApp.Requests; + +/// +/// Запрос получения ГГД +/// +public class WellOperationRequestBase : RequestBase { - public class WellOperationRequest : RequestBase + /// + /// Больше или равно дате начала операции + /// + public DateTimeOffset? GeDate { get; set; } + + /// + /// Меньше или равно дате окончания операции + /// + public DateTimeOffset? LeDate { get; set; } + + /// + /// Больше или равно глубины скважины на начало операции. + /// + public double? GeDepth { get; set; } + + /// + /// Меньше или равно глубины скважины на конец операции. + /// + public double? LeDepth { get; set; } + + /// + /// Идентификаторы категорий операции + /// + public IEnumerable? OperationCategoryIds { get; set; } + + /// + /// Тип операций + /// + /// 0 - плановая операция + /// 1 - фактическая операция + /// + /// + public int? OperationType { get; set; } + + /// + /// Идентификаторы конструкций секции + /// + public IEnumerable? SectionTypeIds { get; set; } +} + +/// +/// Запрос получения ГГД с идентификаторами скважин +/// +public class WellOperationRequest : WellOperationRequestBase +{ + /// + public WellOperationRequest(IEnumerable idsWell) { - /// - /// Идентификаторы скважин - /// - public IEnumerable? IdsWell { get; set; } - - /// - /// Больше или равно дате начала операции - /// - public DateTimeOffset? GeDate { get; set; } - - /// - /// Меньше или равно дате окончания операции - /// - public DateTimeOffset? LeDate { get; set; } - - /// - /// Больше или равно глубины скважины на начало операции. - /// - public double? GeDepth { get; set; } - - /// - /// Меньше или равно глубины скважины на конец операции. - /// - public double? LeDepth { get; set; } - - /// - /// Идентификаторы категорий операции - /// - public IEnumerable? OperationCategoryIds { get; set; } - - /// - /// Тип операций - /// - /// 0 - плановая операция - /// 1 - фактическая операция - /// - /// - public int? OperationType { get; set; } - - /// - /// Идентификаторы конструкций секции - /// - public IEnumerable? SectionTypeIds { get; set; } + IdsWell = idsWell; } + + /// + public WellOperationRequest(WellOperationRequestBase request, IEnumerable idsWell) + : this(idsWell) + { + GeDepth = request.GeDepth; + LeDepth = request.LeDepth; + GeDate = request.GeDate; + LeDate = request.LeDate; + + OperationCategoryIds = request.OperationCategoryIds; + OperationType = request.OperationType; + SectionTypeIds = request.SectionTypeIds; + + Skip = request.Skip; + Take = request.Take; + SortFields = request.SortFields; + } + + /// + /// Идентификаторы скважин + /// + public IEnumerable? IdsWell { get; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index fface665..3e9607f4 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -110,9 +110,8 @@ public class DailyReportService : IDailyReportService var geDate = dailyReport.Date.ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); var leDate = dailyReport.Date.AddDays(1).ToDateTime(TimeOnly.MinValue, DateTimeKind.Unspecified); - var factOperationRequest = new WellOperationRequest - { - IdsWell = new []{ idWell }, + var factOperationRequest = new WellOperationRequest(new []{ idWell }) + { OperationType = WellOperation.IdOperationTypeFact, GeDate = geDate, LeDate = leDate @@ -187,9 +186,8 @@ public class DailyReportService : IDailyReportService var geDateFactWellOperation = datesRange.From.AddDays(result.Skip); var leDateFactWellOperation = geDateFactWellOperation.AddDays(result.Take); - var factWellOperationRequest = new WellOperationRequest + var factWellOperationRequest = new WellOperationRequest(new[] { idWell }) { - IdsWell = new[] { idWell }, OperationType = WellOperation.IdOperationTypeFact, GeDate = geDateFactWellOperation, LeDate = leDateFactWellOperation diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs index 3a0d43d4..9f527b4c 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs @@ -56,9 +56,8 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService var geDepth = processMapPlanWellDrillings.Min(p => p.DepthStart); var leDepth = processMapPlanWellDrillings.Max(p => p.DepthEnd); - var requestWellOperationFact = new WellOperationRequest() + var requestWellOperationFact = new WellOperationRequest(new[] { idWell }) { - IdsWell = new[] { idWell }, OperationType = WellOperation.IdOperationTypeFact, GeDepth = geDepth, LeDepth = leDepth diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs index 4334e8be..8beb3c3e 100644 --- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs @@ -145,9 +145,8 @@ namespace AsbCloudInfrastructure.Services var idsWellSectionTypes = WellSectionTypesWithCategories.Select(t => t.IdSectionType).Distinct(); var usedCategories = WellSectionTypesWithCategories.Select(c => c.IdCategory).Distinct(); - var wellOperationRequest = new WellOperationRequest + var wellOperationRequest = new WellOperationRequest(idsWells) { - IdsWell = idsWells, OperationCategoryIds = usedCategories, SectionTypeIds = idsWellSectionTypes, OperationType = WellOperation.IdOperationTypeFact diff --git a/AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs b/AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs index 31a49d2a..430bf92f 100644 --- a/AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs +++ b/AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs @@ -40,9 +40,8 @@ public class WellOperationExport : ExcelExportService> GetDtosAsync(WellOperationExportRequest options, CancellationToken token) { - var request = new WellOperationRequest + var request = new WellOperationRequest(new[] { options.IdWell }) { - IdsWell = new[] { options.IdWell }, OperationType = options.IdType }; diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs index e7943144..84906a77 100644 --- a/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs +++ b/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs @@ -19,7 +19,7 @@ public interface IWellOperationClient Task> UpdateRangeAsync(int idWell, [Body] IEnumerable dtos); [Get(BaseRoute)] - Task>> GetPageOperationsPlanAsync(int idWell, [Query] WellOperationRequest request); + Task>> GetPageOperationsPlanAsync(int idWell, [Query] WellOperationRequestBase request); [Multipart] [Post(BaseRoute + "/parse/{idType}")] diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs index 5520121c..4d6dd3c0 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs @@ -102,7 +102,7 @@ public class WellOperationControllerTest : BaseIntegrationTest dto.DateStart = dto.DateStart.ToOffset(timezoneOffset); dto.LastUpdateDate = dto.LastUpdateDate?.ToOffset(timezoneOffset); - var request = new WellOperationRequest + var request = new WellOperationRequestBase { OperationType = WellOperation.IdOperationTypePlan }; diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index e91c9c65..96d5f5f9 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -150,14 +150,15 @@ public class WellOperationController : ControllerBase [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public async Task GetGroupOperationsAsync( [FromRoute] int idWell, - [FromQuery] WellOperationRequest request, + [FromQuery] WellOperationRequestBase request, CancellationToken token) { if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - request.IdsWell = new[] { idWell }; - var result = await wellOperationRepository.GetGroupOperationsStatAsync(request, token); + var requestToservice = new WellOperationRequest(request, new[] { idWell }); + + var result = await wellOperationRepository.GetGroupOperationsStatAsync(requestToservice, token); return Ok(result); } @@ -187,14 +188,15 @@ public class WellOperationController : ControllerBase [ProducesResponseType(typeof(PaginationContainer), StatusCodes.Status200OK)] public async Task GetPageOperationsAsync( [FromRoute] int idWell, - [FromQuery] WellOperationRequest request, + [FromQuery] WellOperationRequestBase request, CancellationToken token) { if (!await CanUserAccessToWellAsync(idWell, token)) return Forbid(); - request.IdsWell = new[] { idWell }; - var result = await wellOperationRepository.GetPageAsync(request, token); + var requestToService = new WellOperationRequest(request, new[] { idWell }); + + var result = await wellOperationRepository.GetPageAsync(requestToService, token); return Ok(result); } @@ -270,7 +272,7 @@ public class WellOperationController : ControllerBase } /// - /// Импорт ГГД из excel (xlsx) файла + /// Парсинг ГГД из excel (xlsx) файла /// /// /// @@ -315,7 +317,6 @@ public class WellOperationController : ControllerBase [HttpGet("template")] [AllowAnonymous] [ProducesResponseType(typeof(PhysicalFileResult), StatusCodes.Status200OK, "application/octet-stream")] - [ProducesResponseType(StatusCodes.Status204NoContent)] public IActionResult GetTemplate(int idType) { var parser = wellOperationParserFactory.CreateParser(idType); From 2ad59e1af2bda9b967d16f8db7154f11e142656f 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, 27 Mar 2024 11:59:58 +0300 Subject: [PATCH 42/52] fix after merge --- AsbCloudApp/Repositories/IWellOperationRepository.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/AsbCloudApp/Repositories/IWellOperationRepository.cs b/AsbCloudApp/Repositories/IWellOperationRepository.cs index 5f14a373..0409969e 100644 --- a/AsbCloudApp/Repositories/IWellOperationRepository.cs +++ b/AsbCloudApp/Repositories/IWellOperationRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Requests; namespace AsbCloudApp.Repositories { From 3e7de2db6eef545d1c2838b54440166f860f8744 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 28 Mar 2024 11:00:55 +0500 Subject: [PATCH 43/52] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=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=82=D0=B5=D1=81=D1=82=D0=B0=20=D1=84?= =?UTF-8?q?=D1=80=D0=BE=D0=BD=D1=82=D0=B5=D0=BD=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/TrajectoryEditableRepository.cs | 2 +- .../Repository/WellOperationRepository.cs | 8 +++++--- AsbCloudInfrastructure/Services/SAUB/MessageService.cs | 3 +-- AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs | 2 +- AsbCloudWebApi/Converters/DateOnlyTypeConverter.cs | 5 ++++- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs b/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs index 6ac07c52..6aca2284 100644 --- a/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs +++ b/AsbCloudInfrastructure/Repository/TrajectoryEditableRepository.cs @@ -112,7 +112,7 @@ namespace AsbCloudInfrastructure.Repository private static TEntity Convert(Tdto dto) { var entity = dto.Adapt(); - entity.UpdateDate = DateTimeOffset.Now; + entity.UpdateDate = DateTimeOffset.UtcNow; return entity; } } diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index a5f12a2b..4e4fe612 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -139,7 +139,9 @@ public class WellOperationRepository : IWellOperationRepository operation.DepthEnd, }) .First(), - }); + }) + .Where(s => idsWells.Contains(s.IdWell)); + var dbData = await query.ToArrayAsync(token); var sections = dbData.Select( item => new SectionByOperationsDto @@ -163,8 +165,7 @@ public class WellOperationRepository : IWellOperationRepository return sections; }); - var sections = cache.Where(s => idsWells.Contains(s.IdWell)); - return sections; + return cache; } public async Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken) @@ -189,6 +190,7 @@ public class WellOperationRepository : IWellOperationRepository /// public DateTimeOffset? FirstOperationDate(int idWell) { + var sections = GetSectionsAsync(new[] { idWell }, CancellationToken.None).Result; var first = sections.FirstOrDefault(section => section.IdType == WellOperation.IdOperationTypeFact) ?? sections.FirstOrDefault(section => section.IdType == WellOperation.IdOperationTypePlan); diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index d728536a..17d92d8d 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -68,8 +68,6 @@ namespace AsbCloudInfrastructure.Services.SAUB query = query.OrderByDescending(m => m.DateTime); - var timezone = telemetryService.GetTimezone(telemetry.Id); - if (request.Begin is not null) { var beginUtc = request.Begin.Value.ToUniversalTime(); @@ -102,6 +100,7 @@ namespace AsbCloudInfrastructure.Services.SAUB var usersDict = users.ToDictionary(x => x.IdUser, x => x); var messagesDtoList = new List(); + var timezone = telemetryService.GetTimezone(telemetry.Id); foreach (var message in messagesList) { diff --git a/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs b/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs index 657a99c6..d06e0b4c 100644 --- a/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs @@ -41,7 +41,7 @@ namespace AsbCloudInfrastructure.Services.SAUB public async Task InsertAsync(SetpointsRequestDto setpointsRequest, CancellationToken token) { setpointsRequest.IdState = 1; - setpointsRequest.UploadDate = DateTime.UtcNow; + setpointsRequest.UploadDate = DateTimeOffset.UtcNow; var result = await setpointsRepository.InsertAsync(setpointsRequest, token); return result; } diff --git a/AsbCloudWebApi/Converters/DateOnlyTypeConverter.cs b/AsbCloudWebApi/Converters/DateOnlyTypeConverter.cs index 581a070d..71d8730d 100644 --- a/AsbCloudWebApi/Converters/DateOnlyTypeConverter.cs +++ b/AsbCloudWebApi/Converters/DateOnlyTypeConverter.cs @@ -22,7 +22,10 @@ namespace AsbCloudWebApi.Converters { if (value is string str) { - return DateOnly.Parse(str); + if (DateTimeOffset.TryParse(str, out DateTimeOffset dateTime)) + return DateOnly.FromDateTime(dateTime.Date); + if (DateTime.TryParse(str, out DateTime date)) + return DateOnly.FromDateTime(date); } return base.ConvertFrom(context, culture, value); } From 03d6aa543aa506c0f78328c35745b8a4bd57180c Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 28 Mar 2024 15:33:51 +0500 Subject: [PATCH 44/52] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=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=82=D0=B5=D1=81=D1=82=D0=B0=20=D1=84?= =?UTF-8?q?=D1=80=D0=BE=D0=BD=D1=82=D0=B5=D0=BD=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudDb/Model/ItemInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudDb/Model/ItemInfo.cs b/AsbCloudDb/Model/ItemInfo.cs index 3d7e6793..c93a74bf 100644 --- a/AsbCloudDb/Model/ItemInfo.cs +++ b/AsbCloudDb/Model/ItemInfo.cs @@ -12,6 +12,6 @@ namespace AsbCloudDb.Model /// /// дата последнего обновления блока /// - public DateTimeOffset LastUpdateDate { get; set; } = DateTimeOffset.Now; + public DateTimeOffset LastUpdateDate { get; set; } = DateTimeOffset.UtcNow; } } From ea9e90dea3f773f43d6d6a635d0b900c72e95356 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, 29 Mar 2024 07:30:19 +0300 Subject: [PATCH 45/52] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/WellOperationPlanDto.cs | 1 - AsbCloudDb/Model/WellOperation.cs | 6 -- .../Repository/WellOperationRepository.cs | 80 ++++++++++--------- 3 files changed, 41 insertions(+), 46 deletions(-) delete mode 100644 AsbCloudApp/Data/WellOperationPlanDto.cs diff --git a/AsbCloudApp/Data/WellOperationPlanDto.cs b/AsbCloudApp/Data/WellOperationPlanDto.cs deleted file mode 100644 index 5f282702..00000000 --- a/AsbCloudApp/Data/WellOperationPlanDto.cs +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/AsbCloudDb/Model/WellOperation.cs b/AsbCloudDb/Model/WellOperation.cs index 7a63e586..9926f0b1 100644 --- a/AsbCloudDb/Model/WellOperation.cs +++ b/AsbCloudDb/Model/WellOperation.cs @@ -51,12 +51,6 @@ namespace AsbCloudDb.Model [Column("comment"), Comment("Комментарий")] public string? Comment { get; set; } - - [NotMapped] - public double NptHours { get; set; } - - [NotMapped] - public double Day { get; set; } [JsonIgnore] [ForeignKey(nameof(IdWell))] diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index c9f91c82..a50ea85d 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -55,9 +55,7 @@ public class WellOperationRepository : CrudRepositoryBase> GetPageAsync(WellOperationRequest request, CancellationToken token) @@ -67,7 +65,7 @@ public class WellOperationRepository : CrudRepositoryBase BuildQuery(WellOperationRequest request) { - var currentWellOperations = GetQuery() - .Where(e => request.IdsWell != null && request.IdsWell.Contains(e.IdWell)); - var query = GetQuery() .Where(e => request.IdsWell != null && request.IdsWell.Contains(e.IdWell)) .OrderBy(e => e.DateStart) - .Select(o => new WellOperation - { - Id = o.Id, - IdPlan = o.IdPlan, - IdType = o.IdType, - IdWell = o.IdWell, - LastUpdateDate = o.LastUpdateDate, - IdWellSectionType = o.IdWellSectionType, - IdCategory = o.IdCategory, - OperationCategory = o.OperationCategory, - WellSectionType = o.WellSectionType, - DateStart = o.DateStart, - DepthStart = o.DepthStart, - DepthEnd = o.DepthEnd, - DurationHours = o.DurationHours, - CategoryInfo = o.CategoryInfo, - Comment = o.Comment, - IdUser = o.IdUser, - - NptHours = currentWellOperations - .Where(e => e.IdType == 1 && e.IdWell == o.IdWell) - .Where(e => WellOperationCategory.NonProductiveTimeSubIds.Contains(e.IdCategory)) - .Select(e => e.DurationHours) - .Sum(), - - Day = (o.DateStart - currentWellOperations - .Where(subOp => subOp.IdType == o.IdType && subOp.IdWell == o.IdWell) - .Where(subOp => subOp.DateStart <= o.DateStart) - .Min(subOp => subOp.DateStart)) - .TotalDays - }); + .AsQueryable(); if (request.OperationType.HasValue) query = query.Where(e => e.IdType == request.OperationType.Value); @@ -341,6 +306,43 @@ public class WellOperationRepository : CrudRepositoryBase> ConvertWithDrillingDaysAndNpvHoursAsync(IEnumerable entities, + CancellationToken token) + { + var idsWell = entities.Select(e => e.IdWell).Distinct(); + + var currentWellOperations = GetQuery() + .Where(entity => idsWell.Contains(entity.IdWell)); + + var dateFirstDrillingOperationByIdWell = await currentWellOperations + .Where(entity => entity.IdType == WellOperation.IdOperationTypeFact) + .GroupBy(entity => entity.IdWell) + .ToDictionaryAsync(g => g.Key, g => g.Min(o => o.DateStart), token); + + var operationsWithNptByIdWell = await currentWellOperations.Where(entity => + entity.IdType == WellOperation.IdOperationTypeFact && + WellOperationCategory.NonProductiveTimeSubIds.Contains(entity.IdCategory)) + .GroupBy(entity => entity.IdWell) + .ToDictionaryAsync(g => g.Key, g => g.Select(o => o), token); + + var dtos = entities.Select(entity => + { + var dto = Convert(entity); + + if (dateFirstDrillingOperationByIdWell.TryGetValue(entity.IdWell, out var dateFirstDrillingOperation)) + dto.Day = (entity.DateStart - dateFirstDrillingOperation).TotalDays; + + if (operationsWithNptByIdWell.TryGetValue(entity.IdWell, out var wellOperationsWithNtp)) + dto.NptHours = wellOperationsWithNtp + .Where(o => o.DateStart <= entity.DateStart) + .Sum(e => e.DurationHours); + + return dto; + }); + + return dtos; + } + protected override WellOperation Convert(WellOperationDto src) { var entity = src.Adapt(); From 2f0af62829fe5a4863658a1a29149dc449c1886c 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, 29 Mar 2024 07:39:47 +0300 Subject: [PATCH 46/52] fix merge --- .../Repository/WellOperationRepository.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index a50ea85d..3b67eb54 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -259,7 +259,8 @@ public class WellOperationRepository : CrudRepositoryBase idsWells.Contains(s.IdWell)); var dbData = await query.ToArrayAsync(token); var sections = dbData.Select( item => new SectionByOperationsDto @@ -283,8 +284,7 @@ public class WellOperationRepository : CrudRepositoryBase idsWells.Contains(s.IdWell)); - return sections; + return cache; } public async Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken) From f0af09258a19beb3698b27e438528306029224cd Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 1 Apr 2024 09:30:40 +0500 Subject: [PATCH 47/52] =?UTF-8?q?=D0=90=D0=BB=D0=B3=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D1=82=D0=BC=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BE=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20"=D0=9F=D1=80=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...erationCategory_IdConditioning.Designer.cs | 9389 +++++++++++++++++ ...te_WellOperationCategory_IdConditioning.cs | 32 + .../AsbCloudDbContextModelSnapshot.cs | 744 +- AsbCloudDb/Model/WellOperationCategory.cs | 6 +- .../DetectedOperationService.cs | 1 + .../Detectors/DetectorConditioning.cs | 55 + .../Specifications/Проработка.md | 29 + .../Detectors/DetectorConditioning.cs | 92 + 8 files changed, 10003 insertions(+), 345 deletions(-) create mode 100644 AsbCloudDb/Migrations/20240329070104_Update_WellOperationCategory_IdConditioning.Designer.cs create mode 100644 AsbCloudDb/Migrations/20240329070104_Update_WellOperationCategory_IdConditioning.cs create mode 100644 AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorConditioning.cs create mode 100644 AsbCloudInfrastructure/Services/DetectOperations/Specifications/Проработка.md create mode 100644 AsbCloudWebApi.Tests/Services/DetectedOperations/Detectors/DetectorConditioning.cs diff --git a/AsbCloudDb/Migrations/20240329070104_Update_WellOperationCategory_IdConditioning.Designer.cs b/AsbCloudDb/Migrations/20240329070104_Update_WellOperationCategory_IdConditioning.Designer.cs new file mode 100644 index 00000000..9a85b491 --- /dev/null +++ b/AsbCloudDb/Migrations/20240329070104_Update_WellOperationCategory_IdConditioning.Designer.cs @@ -0,0 +1,9389 @@ +// +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("20240329070104_Update_WellOperationCategory_IdConditioning")] + partial class Update_WellOperationCategory_IdConditioning + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "8.0.2") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdDeposit") + .HasColumnType("integer") + .HasColumnName("id_deposit"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.Property("Timezone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex("IdDeposit"); + + b.ToTable("t_cluster", t => + { + t.HasComment("Кусты"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("IdCompanyType") + .HasMaxLength(255) + .HasColumnType("integer") + .HasColumnName("id_company_type") + .HasComment("вид деятельности"); + + b.HasKey("Id"); + + b.HasIndex("IdCompanyType"); + + b.ToTable("t_company"); + + b.HasData( + new + { + Id = 1, + Caption = "ООО \"АСБ\"", + IdCompanyType = 3 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("IsContact") + .HasColumnType("boolean") + .HasColumnName("is_contact"); + + b.Property("Order") + .HasColumnType("integer") + .HasColumnName("order"); + + b.HasKey("Id"); + + b.ToTable("t_company_type"); + + b.HasData( + new + { + Id = 1, + Caption = "Недропользователь", + IsContact = true, + Order = 3 + }, + new + { + Id = 2, + Caption = "Буровой подрядчик", + IsContact = true, + Order = 2 + }, + new + { + Id = 3, + Caption = "Сервис автоматизации бурения", + IsContact = true, + Order = 0 + }, + new + { + Id = 4, + Caption = "Сервис по ГТИ", + IsContact = true, + Order = 6 + }, + new + { + Id = 5, + Caption = "Растворный сервис", + IsContact = true, + Order = 4 + }, + new + { + Id = 6, + Caption = "Сервис по ННБ", + IsContact = true, + Order = 5 + }, + new + { + Id = 7, + Caption = "Служба супервайзинга", + IsContact = false, + Order = 1 + }, + new + { + Id = 9, + Caption = "Сервис по цементированию", + IsContact = true, + Order = 7 + }, + new + { + Id = 11, + Caption = "Дизельный сервис", + IsContact = false, + Order = 9 + }, + new + { + Id = 12, + Caption = "Сервис по обслуживанию верхних силовых приводов", + IsContact = true, + Order = 8 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Contact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Company") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("company") + .HasComment("компания"); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("email"); + + b.Property("FullName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("full_name") + .HasComment("ФИО"); + + b.Property("IdCompanyType") + .HasMaxLength(255) + .HasColumnType("integer") + .HasColumnName("id_company_type") + .HasComment("вид деятельности"); + + b.Property("IdWell") + .HasMaxLength(255) + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ключ скважины"); + + b.Property("Phone") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("phone") + .HasComment("номер телефона"); + + b.Property("Position") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("position") + .HasComment("должность"); + + b.HasKey("Id"); + + b.HasIndex("IdCompanyType"); + + b.HasIndex("IdWell"); + + b.ToTable("t_contact", t => + { + t.HasComment("Контакты"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Date") + .HasColumnType("date") + .HasColumnName("date") + .HasComment("Дата формирования отчёта"); + + b.Property("DateLastUpdate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_update") + .HasComment("Дата последнего обновления"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("SignBlock") + .HasColumnType("jsonb") + .HasColumnName("sign_block") + .HasComment("Подпись"); + + b.Property("SubsystemBlock") + .HasColumnType("jsonb") + .HasColumnName("subsystem_block") + .HasComment("Наработкой подсистем"); + + b.Property("TimeBalanceBlock") + .HasColumnType("jsonb") + .HasColumnName("time_balance_block") + .HasComment("Баланс времени"); + + b.HasKey("Id"); + + b.HasIndex("IdWell", "Date") + .IsUnique(); + + b.ToTable("t_daily_report", t => + { + t.HasComment("Ежедневные отчёты"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AxialLoad") + .HasColumnType("double precision") + .HasColumnName("axial_load") + .HasComment("Фактическая нагрузка"); + + b.Property("AxialLoadLimitMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_limit_max") + .HasComment("Максимально допустимая нагрузка"); + + b.Property("AxialLoadSp") + .HasColumnType("double precision") + .HasColumnName("axial_load_sp") + .HasComment("Ограничение факт. нагрузки"); + + b.Property("BlockSpeedSp") + .HasColumnType("double precision") + .HasColumnName("block_speed_sp") + .HasComment("Ограничение скорости блока"); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("Дата и время окончания"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("Дата и время начала"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина забоя по стволу конечная"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина забоя по стволу начальная"); + + b.Property("EnabledSubsystems") + .HasColumnType("integer") + .HasColumnName("enabled_subsystems") + .HasComment("Флаги подсистем"); + + b.Property("Flow") + .HasColumnType("double precision") + .HasColumnName("flow") + .HasComment("Фактический расход"); + + b.Property("HasOscillation") + .HasColumnType("boolean") + .HasColumnName("has_oscillation") + .HasComment("Наличие или отсутствие осцилляции"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Название автоопределённой операции"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator") + .HasComment("Работа при достижении ограничения"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Ключ телеметрии"); + + b.Property("Pressure") + .HasColumnType("double precision") + .HasColumnName("pressure") + .HasComment("Давление"); + + b.Property("PressureIdle") + .HasColumnType("double precision") + .HasColumnName("pressure_idle") + .HasComment("Давление холостого хода"); + + b.Property("PressureSp") + .HasColumnType("double precision") + .HasColumnName("pressure_sp") + .HasComment("Ограничение фактического давления"); + + b.Property("RotorSpeed") + .HasColumnType("double precision") + .HasColumnName("rotor_speed") + .HasComment("Фактическая скорость оборотов ВСП"); + + b.Property("RotorTorque") + .HasColumnType("double precision") + .HasColumnName("rotor_torque") + .HasComment("Фактический момент"); + + b.Property("RotorTorqueLimitMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_limit_max") + .HasComment("Максимально допустимый момент"); + + b.Property("RotorTorqueSp") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_sp") + .HasComment("Ограничение факт. момента"); + + b.Property("Speed") + .HasColumnType("double precision") + .HasColumnName("speed") + .HasComment("Скорость бурения"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_data_saub_stat", t => + { + t.HasComment("Кеш-таблица для хранения данных для РТК-отчета"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.Property("Timezone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.ToTable("t_deposit", t => + { + t.HasComment("Месторождение"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("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", t => + { + t.HasComment("автоматически определенные операции по телеметрии"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Идентификатор телеметрии"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depthStart") + .HasComment("Глубина начала"); + + b.Property("Params") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("t_drill_test_params") + .HasComment("Параметры записи drill test"); + + b.Property("TimeStampStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("timestamp_start") + .HasComment("Время начала"); + + b.HasKey("Id", "IdTelemetry"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_drill_test", t => + { + t.HasComment("Drill_test"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Имя"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("Отчество"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("Фамилия"); + + b.HasKey("Id"); + + b.ToTable("t_driller", t => + { + t.HasComment("Бурильщик"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdFileCategory") + .HasColumnType("integer") + .HasColumnName("id_file_category"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("Id"); + + b.HasIndex("IdFileCategory"); + + b.HasIndex("IdWell", "IdFileCategory") + .IsUnique(); + + b.ToTable("t_drilling_program_part", t => + { + t.HasComment("части программ бурения"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Faq", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Answer") + .HasColumnType("text") + .HasColumnName("answer") + .HasComment("Текст ответа"); + + b.Property("CounterQuestion") + .HasColumnType("integer") + .HasColumnName("counter_question") + .HasComment("Счетчик повторений вопроса"); + + b.Property("DateAnswer") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_answer") + .HasComment("Дата ответа"); + + b.Property("DateCreatedQuestion") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_created_question") + .HasComment("Дата создания вопроса"); + + b.Property("DateLastEditedQuestion") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_edited_question") + .HasComment("Дата последнего редактирования вопроса"); + + b.Property("IdAuthorAnswer") + .HasColumnType("integer") + .HasColumnName("id_author_answer") + .HasComment("id автора ответа"); + + b.Property("IdAuthorQuestion") + .HasColumnType("integer") + .HasColumnName("id_author_question") + .HasComment("id автора вопроса"); + + b.Property("IdReplacementQuestion") + .HasColumnType("integer") + .HasColumnName("id_replacement_question") + .HasComment("Ключ заменяющего вопроса"); + + b.Property("IsFrequently") + .HasColumnType("boolean") + .HasColumnName("is_frequently") + .HasComment("Частый вопрос"); + + b.Property("Question") + .IsRequired() + .HasColumnType("text") + .HasColumnName("question") + .HasComment("Текст вопроса"); + + b.Property("State") + .HasColumnType("integer") + .HasColumnName("state") + .HasComment("Статус вопроса"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthorAnswer"); + + b.HasIndex("IdAuthorQuestion"); + + b.ToTable("t_faq", t => + { + t.HasComment("вопросы пользователей"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_file_category", t => + { + t.HasComment("Категории файлов"); + }); + + b.HasData( + new + { + Id = 1, + Name = "Растворный сервис", + ShortName = "fluidService" + }, + new + { + Id = 2, + Name = "Цементирование", + ShortName = "cement" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "nnb" + }, + new + { + Id = 4, + Name = "ГТИ", + ShortName = "gti" + }, + new + { + Id = 5, + Name = "Документы по скважине", + ShortName = "wellDocuments" + }, + new + { + Id = 6, + Name = "Супервайзер", + ShortName = "supervisor" + }, + new + { + Id = 7, + Name = "Мастер", + ShortName = "master" + }, + new + { + Id = 8, + Name = "Долотный сервис", + ShortName = "toolService" + }, + new + { + Id = 9, + Name = "Буровой подрядчик", + ShortName = "drillService" + }, + new + { + Id = 10, + Name = "Сервис по заканчиванию скважины", + ShortName = "closingService" + }, + new + { + Id = 12, + Name = "Рапорт", + ShortName = "report" + }, + new + { + Id = 1000, + Name = "Программа бурения" + }, + new + { + Id = 1001, + Name = "Задание от геологов" + }, + new + { + Id = 1002, + Name = "Профиль ствола скважины (ННБ)" + }, + new + { + Id = 1003, + Name = "Технологические расчеты (ННБ)" + }, + new + { + Id = 1004, + Name = "Долотная программа" + }, + new + { + Id = 1005, + Name = "Программа по растворам" + }, + new + { + Id = 1006, + Name = "Программа геофизических исследований" + }, + new + { + Id = 1007, + Name = "Планы спусков обсадных колонн" + }, + new + { + Id = 1008, + Name = "Программы цементирования обсадных колонн" + }, + new + { + Id = 10000, + Name = "Проект на бурение транспортного и горизонтального участков скважины" + }, + new + { + Id = 10001, + Name = "Программа на бурение транспортного и горизонтального участков скважины" + }, + new + { + Id = 10002, + Name = "Акт о начале бурения" + }, + new + { + Id = 10003, + Name = "План работ спуска и цементирования направления" + }, + new + { + Id = 10004, + Name = "Программа цементирования направления" + }, + new + { + Id = 10005, + Name = "Мера обсадных труб (направление)" + }, + new + { + Id = 10006, + Name = "Акт на выполненные работы по цементированию направления" + }, + new + { + Id = 10007, + Name = "Отчет по цементированию направления (график)" + }, + new + { + Id = 10008, + Name = "План работ спуска и цементирования кондуктора" + }, + new + { + Id = 10009, + Name = "Программа цементирования (кондуктор)" + }, + new + { + Id = 10010, + Name = "Мера обсадных труб (кондуктор)" + }, + new + { + Id = 10011, + Name = "Карта крепления кондуктора" + }, + new + { + Id = 10012, + Name = "Акт на выполненные работы по цементированию кондуктора" + }, + new + { + Id = 10013, + Name = "Отчет по цементированию кондуктора (график)" + }, + new + { + Id = 10014, + Name = "Акт о замере расстояния от стола ротора до муфты кондуктора" + }, + new + { + Id = 10015, + Name = "Акт опресовки цементного кольца за кондуктором" + }, + new + { + Id = 10016, + Name = "Акт опресовки ППГ с глухими плашками совместно с кондуктором" + }, + new + { + Id = 10017, + Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с кондуктором" + }, + new + { + Id = 10018, + Name = "План работ на крепление обсадной колонны (эк. колонна)" + }, + new + { + Id = 10019, + Name = "Программа цементирования (эк. колонна)" + }, + new + { + Id = 10020, + Name = "Мера труб эксплуатационной колонны" + }, + new + { + Id = 10021, + Name = "Карта по креплению скважины (эк. колонна)" + }, + new + { + Id = 10022, + Name = "Акт на установку пружинных центраторов" + }, + new + { + Id = 10023, + Name = "Отчет по цементированию эксплуатационной колонны (график)" + }, + new + { + Id = 10024, + Name = "Акт на выполненные работы по цементированию эксплуатационной колонны" + }, + new + { + Id = 10025, + Name = "Акт об испытании эк. колонны на герметичность (СТОП)" + }, + new + { + Id = 10026, + Name = "Акт опресовки ППГ с глухими плашками совместно с э/колонной" + }, + new + { + Id = 10027, + Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с э/колонной" + }, + new + { + Id = 10028, + Name = "Акт на вскрытие продуктивного пласта" + }, + new + { + Id = 10029, + Name = "Акт замера параметров раствора при бурении горизонтального участка" + }, + new + { + Id = 10030, + Name = "Разрешение на спуск «хвостовика» (телефонограмма)" + }, + new + { + Id = 10031, + Name = "План работ на спуск «хвостовика»" + }, + new + { + Id = 10032, + Name = "Акт готовности бурового и энергетического оборудования к спуску «хвостовика»" + }, + new + { + Id = 10033, + Name = "Акт шаблонировки ствола скважины перед спуском «хвостовика»" + }, + new + { + Id = 10034, + Name = "Мера обсадных труб (хвостовик)" + }, + new + { + Id = 10035, + Name = "Акт выполненных работ по спуску хвостовика с закачкой (нефти, солевого раствора" + }, + new + { + Id = 10036, + Name = "Акт о переводе скважины на тех. воду" + }, + new + { + Id = 10037, + Name = "Акт об окончании бурения" + }, + new + { + Id = 10038, + Name = "Акт на передачу скважины в освоение (КРС)" + }, + new + { + Id = 10039, + Name = "Акт на опресовку межколонного пространства с КРС" + }, + new + { + Id = 10040, + Name = "Акт на сдачу скважины в ЦДНГ" + }, + new + { + Id = 10041, + Name = "Паспорт ОУС (заполняется геологами)" + }, + new + { + Id = 10042, + Name = "Паспорт скважины (заполняется геологами)" + }, + new + { + Id = 10043, + Name = "Фактические данные бурения (вставляются в паспорт скважины)" + }, + new + { + Id = 20000, + Name = "Справки по страницам" + }, + new + { + Id = 30000, + Name = "Инструкции" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории файла"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Удален ли файл"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название файла"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("file_size") + .HasComment("Размер файла"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_file_info", t => + { + t.HasComment("Файлы всех категорий"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_created") + .HasComment("Дата совершенного действия"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла"); + + b.Property("IdMarkType") + .HasColumnType("integer") + .HasColumnName("id_mark_type") + .HasComment("0 - отклонен, 1 - согласован"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("id пользователя"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Помечен ли файл как удаленный"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdUser"); + + b.ToTable("t_file_mark", t => + { + t.HasComment("Действия с файлами."); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdRecord") + .HasColumnType("integer") + .HasColumnName("id_record"); + + b.Property("IdItem") + .HasColumnType("integer") + .HasColumnName("id_item"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Value") + .HasColumnType("real") + .HasColumnName("value"); + + b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); + + b.ToTable("t_wits_float", t => + { + t.HasComment("таблица данных ГТИ с типом значения float"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdRecord") + .HasColumnType("integer") + .HasColumnName("id_record"); + + b.Property("IdItem") + .HasColumnType("integer") + .HasColumnName("id_item"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Value") + .HasColumnType("integer") + .HasColumnName("value"); + + b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); + + b.ToTable("t_wits_int", t => + { + t.HasComment("таблица данных ГТИ с типом значения int"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdRecord") + .HasColumnType("integer") + .HasColumnName("id_record"); + + b.Property("IdItem") + .HasColumnType("integer") + .HasColumnName("id_item"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text") + .HasColumnName("value"); + + b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); + + b.ToTable("t_wits_string", t => + { + t.HasComment("таблица данных ГТИ с типом значения string"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории файла"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название файла"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("file_size") + .HasComment("Размер файла"); + + b.Property("UrlPage") + .IsRequired() + .HasColumnType("text") + .HasColumnName("url_page") + .HasComment("Url страницы"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.ToTable("t_help_page", t => + { + t.HasComment("Справки"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start"); + + b.Property("DepthEnd") + .HasColumnType("real") + .HasColumnName("depth_end"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depth_start"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_limiting_parameter", t => + { + t.HasComment("Ограничения по параметрам телеметрии"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.Manual", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateDownload") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_download") + .HasComment("Дата загрузки"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id автора"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории файла"); + + b.Property("IdDirectory") + .HasColumnType("integer") + .HasColumnName("id_directory") + .HasComment("Id директории"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdDirectory"); + + b.ToTable("t_manual", t => + { + t.HasComment("Инструкции"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("Id родительской директории"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.HasIndex("IdParent"); + + b.ToTable("t_manual_directory", t => + { + t.HasComment("Директория для инструкций"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Data") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("data") + .HasComment("Данные таблицы последних данных"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Пометка удаленным"); + + b.Property("Timestamp") + .HasColumnType("timestamp with time zone") + .HasColumnName("timestamp") + .HasComment("время добавления"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_measure", t => + { + t.HasComment("Таблица c данными для вкладки 'Последние данные'"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_measure_category", t => + { + t.HasComment("Категория последних данных"); + }); + + b.HasData( + new + { + Id = 1, + Name = "Показатели бурового раствора", + ShortName = "Раствор" + }, + new + { + Id = 2, + Name = "Шламограмма", + ShortName = "Шламограмма" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "ННБ" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Notification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdNotificationCategory") + .HasColumnType("integer") + .HasColumnName("id_notification_category") + .HasComment("Id категории уведомления"); + + b.Property("IdTransportType") + .HasColumnType("integer") + .HasColumnName("id_transport_type") + .HasComment("Id типа доставки уведомления"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id получателя"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message") + .HasComment("Сообщение уведомления"); + + b.Property("ReadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("read_date") + .HasComment("Дата прочтения уведомления"); + + b.Property("RegistrationDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("registration_date") + .HasComment("Дата регистрации уведомления"); + + b.Property("SentDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("sent_date") + .HasComment("Дата отправки уведомления"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text") + .HasColumnName("title") + .HasComment("Заголовок уведомления"); + + b.HasKey("Id"); + + b.HasIndex("IdNotificationCategory"); + + b.HasIndex("IdUser"); + + b.ToTable("t_notification", t => + { + t.HasComment("Уведомления"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("t_notification_category", t => + { + t.HasComment("Категории уведомлений"); + }); + + b.HasData( + new + { + Id = 1, + Name = "Системные уведомления" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.OperationValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Старотовая глубина"); + + b.Property("IdOperationCategory") + .HasColumnType("integer") + .HasColumnName("id_operation_category") + .HasComment("Ид категории операции"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Ид скважины"); + + b.Property("StandardValue") + .HasColumnType("double precision") + .HasColumnName("standard_value") + .HasComment("Нормативный показатель"); + + b.Property("TargetValue") + .HasColumnType("double precision") + .HasColumnName("target_value") + .HasComment("Целевой показатель"); + + b.HasKey("Id"); + + b.HasIndex("IdOperationCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_operationvalue", t => + { + t.HasComment("Целевые/нормативные показатели операции"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission", t => + { + t.HasComment("Разрешения на доступ к данным"); + }); + + b.HasData( + new + { + Id = 100, + Description = "Разрешение удалять админ. Кусты", + Name = "AdminCluster.delete" + }, + new + { + Id = 101, + Description = "Разрешение редактировать админ. Кусты", + Name = "AdminCluster.edit" + }, + new + { + Id = 102, + Description = "Разрешение просматривать админ. Кусты", + Name = "AdminCluster.get" + }, + new + { + Id = 103, + Description = "Разрешение удалять админ. Компании", + Name = "AdminCompany.delete" + }, + new + { + Id = 104, + Description = "Разрешение редактировать админ. Компании", + Name = "AdminCompany.edit" + }, + new + { + Id = 105, + Description = "Разрешение просматривать админ. Компании", + Name = "AdminCompany.get" + }, + new + { + Id = 106, + Description = "Разрешение удалять админ. Типы компаний", + Name = "AdminCompanyType.delete" + }, + new + { + Id = 107, + Description = "Разрешение редактировать админ. Типы компаний", + Name = "AdminCompanyType.edit" + }, + new + { + Id = 108, + Description = "Разрешение просматривать админ. Типы компаний", + Name = "AdminCompanyType.get" + }, + new + { + Id = 109, + Description = "Разрешение удалять админ. Месторождения", + Name = "AdminDeposit.delete" + }, + new + { + Id = 110, + Description = "Разрешение редактировать админ. Месторождения", + Name = "AdminDeposit.edit" + }, + new + { + Id = 111, + Description = "Разрешение просматривать админ. Месторождения", + Name = "AdminDeposit.get" + }, + new + { + Id = 112, + Description = "Разрешение удалять админ. Разрешения", + Name = "AdminPermission.delete" + }, + new + { + Id = 113, + Description = "Разрешение редактировать админ. Разрешения", + Name = "AdminPermission.edit" + }, + new + { + Id = 114, + Description = "Разрешение просматривать админ. Разрешения", + Name = "AdminPermission.get" + }, + new + { + Id = 115, + Description = "Разрешение удалять админ. Телеметрию", + Name = "AdminTelemetry.delete" + }, + new + { + Id = 116, + Description = "Разрешение редактировать админ. Телеметрию", + Name = "AdminTelemetry.edit" + }, + new + { + Id = 117, + Description = "Разрешение просматривать админ. Телеметрию", + Name = "AdminTelemetry.get" + }, + new + { + Id = 118, + Description = "Разрешение удалять админ. Пользователей", + Name = "AdminUser.delete" + }, + new + { + Id = 119, + Description = "Разрешение редактировать админ. Пользователей", + Name = "AdminUser.edit" + }, + new + { + Id = 120, + Description = "Разрешение просматривать админ. Пользователей", + Name = "AdminUser.get" + }, + new + { + Id = 121, + Description = "Разрешение удалять админ. Роли пользователей", + Name = "AdminUserRole.delete" + }, + new + { + Id = 122, + Description = "Разрешение редактировать админ. Роли пользователей", + Name = "AdminUserRole.edit" + }, + new + { + Id = 123, + Description = "Разрешение просматривать админ. Роли пользователей", + Name = "AdminUserRole.get" + }, + new + { + Id = 124, + Description = "Разрешение удалять админ. Скважины", + Name = "AdminWell.delete" + }, + new + { + Id = 125, + Description = "Разрешение редактировать админ. Скважины", + Name = "AdminWell.edit" + }, + new + { + Id = 126, + Description = "Разрешение просматривать админ. Скважины", + Name = "AdminWell.get" + }, + new + { + Id = 127, + Description = "Разрешение удалять админ. Подсистемы", + Name = "AdminSubsytem.delete" + }, + new + { + Id = 128, + Description = "Разрешение редактировать админ. Подсистемы", + Name = "AdminSubsytem.edit" + }, + new + { + Id = 129, + Description = "Разрешение просматривать админ. Подсистемы", + Name = "AdminSubsytem.get" + }, + new + { + Id = 200, + Description = "Разрешение редактировать 0", + Name = "Auth.edit" + }, + new + { + Id = 201, + Description = "Разрешение просматривать 0", + Name = "Auth.get" + }, + new + { + Id = 202, + Description = "Разрешение просматривать Кусты", + Name = "Cluster.get" + }, + new + { + Id = 203, + Description = "Разрешение просматривать Месторождения", + Name = "Deposit.get" + }, + new + { + Id = 204, + Description = "Разрешение удалять РТК", + Name = "DrillFlowChart.delete" + }, + new + { + Id = 205, + Description = "Разрешение редактировать РТК", + Name = "DrillFlowChart.edit" + }, + new + { + Id = 206, + Description = "Разрешение просматривать РТК", + Name = "DrillFlowChart.get" + }, + new + { + Id = 207, + Description = "Разрешение удалять Программу бурения", + Name = "DrillingProgram.delete" + }, + new + { + Id = 208, + Description = "Разрешение редактировать Программу бурения", + Name = "DrillingProgram.edit" + }, + new + { + Id = 209, + Description = "Разрешение просматривать Программу бурения", + Name = "DrillingProgram.get" + }, + new + { + Id = 210, + Description = "Разрешение удалять Режимы бурения", + Name = "DrillParams.delete" + }, + new + { + Id = 211, + Description = "Разрешение редактировать Режимы бурения", + Name = "DrillParams.edit" + }, + new + { + Id = 212, + Description = "Разрешение просматривать Режимы бурения", + Name = "DrillParams.get" + }, + new + { + Id = 213, + Description = "Разрешение удалять Файлы", + Name = "File.delete" + }, + new + { + Id = 214, + Description = "Разрешение редактировать Файлы", + Name = "File.edit" + }, + new + { + Id = 215, + Description = "Разрешение просматривать Файлы", + Name = "File.get" + }, + new + { + Id = 216, + Description = "Разрешение удалять Измерения", + Name = "Measure.delete" + }, + new + { + Id = 217, + Description = "Разрешение редактировать Измерения", + Name = "Measure.edit" + }, + new + { + Id = 218, + Description = "Разрешение просматривать Измерения", + Name = "Measure.get" + }, + new + { + Id = 219, + Description = "Разрешение просматривать Сообщения телеметрии", + Name = "Message.get" + }, + new + { + Id = 220, + Description = "Разрешение просматривать Статистику по операциям", + Name = "OperationStat.get" + }, + new + { + Id = 221, + Description = "Разрешение редактировать Рапорта", + Name = "Report.edit" + }, + new + { + Id = 222, + Description = "Разрешение просматривать Рапорта", + Name = "Report.get" + }, + new + { + Id = 223, + Description = "Разрешение просматривать админ. Системная статистика", + Name = "RequestTracker.get" + }, + new + { + Id = 224, + Description = "Разрешение удалять Рекомендации уставок", + Name = "Setpoints.delete" + }, + new + { + Id = 225, + Description = "Разрешение редактировать Рекомендации уставок", + Name = "Setpoints.edit" + }, + new + { + Id = 226, + Description = "Разрешение просматривать Рекомендации уставок", + Name = "Setpoints.get" + }, + new + { + Id = 227, + Description = "Разрешение редактировать Телеметрии", + Name = "Telemetry.edit" + }, + new + { + Id = 228, + Description = "Разрешение просматривать Анализ телеметрии", + Name = "TelemetryAnalytics.get" + }, + new + { + Id = 229, + Description = "Разрешение редактировать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.edit" + }, + new + { + Id = 230, + Description = "Разрешение просматривать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.get" + }, + new + { + Id = 231, + Description = "Разрешение редактировать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.edit" + }, + new + { + Id = 232, + Description = "Разрешение просматривать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.get" + }, + new + { + Id = 233, + Description = "Разрешение редактировать Скважины", + Name = "Well.edit" + }, + new + { + Id = 234, + Description = "Разрешение просматривать Скважины", + Name = "Well.get" + }, + new + { + Id = 235, + Description = "Разрешение редактировать Композитные скважины", + Name = "WellComposite.edit" + }, + new + { + Id = 236, + Description = "Разрешение просматривать Композитные скважины", + Name = "WellComposite.get" + }, + new + { + Id = 237, + Description = "Разрешение удалять Операции по скважинам", + Name = "WellOperation.delete" + }, + new + { + Id = 238, + Description = "Разрешение редактировать Операции по скважинам", + Name = "WellOperation.edit" + }, + new + { + Id = 239, + Description = "Разрешение просматривать Операции по скважинам", + Name = "WellOperation.get" + }, + new + { + Id = 240, + Description = "Разрешение редактировать Файлы категории 1 (Растворный сервис)", + Name = "File.edit1" + }, + new + { + Id = 241, + Description = "Разрешение редактировать Файлы категории 2 (Цементирование)", + Name = "File.edit2" + }, + new + { + Id = 242, + Description = "Разрешение редактировать Файлы категории 3 (ННБ)", + Name = "File.edit3" + }, + new + { + Id = 243, + Description = "Разрешение редактировать Файлы категории 4 (ГТИ)", + Name = "File.edit4" + }, + new + { + Id = 244, + Description = "Разрешение редактировать Файлы категории 5 (Документы по скважине)", + Name = "File.edit5" + }, + new + { + Id = 245, + Description = "Разрешение редактировать Файлы категории 6 (Супервайзер)", + Name = "File.edit6" + }, + new + { + Id = 246, + Description = "Разрешение редактировать Файлы категории 7 (Мастер)", + Name = "File.edit7" + }, + new + { + Id = 247, + Description = "Разрешение редактировать Файлы категории 8 (Долотный сервис)", + Name = "File.edit8" + }, + new + { + Id = 248, + Description = "Разрешение редактировать Файлы категории 9 (Буровой подрядчик)", + Name = "File.edit9" + }, + new + { + Id = 249, + Description = "Разрешение редактировать Файлы категории 10 (Сервис по заканчиванию скважины)", + Name = "File.edit10" + }, + new + { + Id = 250, + Description = "Разрешение редактировать Файлы категории 11 (Рапорт)", + Name = "File.edit11" + }, + new + { + Id = 251, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit12" + }, + new + { + Id = 252, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit13" + }, + new + { + Id = 253, + Description = "Разрешение редактировать Файлы категории 13", + Name = "File.edit14" + }, + new + { + Id = 254, + Description = "Разрешение редактировать Файлы категории 14", + Name = "File.edit15" + }, + new + { + Id = 255, + Description = "Разрешение редактировать Файлы категории 15", + Name = "File.edit16" + }, + new + { + Id = 256, + Description = "Разрешение редактировать Файлы категории 16", + Name = "File.edit17" + }, + new + { + Id = 257, + Description = "Разрешение редактировать Файлы категории 17", + Name = "File.edit18" + }, + new + { + Id = 258, + Description = "Разрешение редактировать Файлы категории 18", + Name = "File.edit19" + }, + new + { + Id = 259, + Description = "Разрешение редактировать Файлы категории 19", + Name = "File.edit20" + }, + new + { + Id = 260, + Description = "Разрешение редактировать Файлы категории 20", + Name = "File.edit21" + }, + new + { + Id = 261, + Description = "Разрешение редактировать Файлы категории 21", + Name = "File.edit22" + }, + new + { + Id = 262, + Description = "Разрешение редактировать Файлы категории 22", + Name = "File.edit23" + }, + new + { + Id = 263, + Description = "Разрешение редактировать Файлы категории 23", + Name = "File.edit24" + }, + new + { + Id = 264, + Description = "Разрешение редактировать Файлы категории 24", + Name = "File.edit25" + }, + new + { + Id = 265, + Description = "Разрешение редактировать Файлы категории 25", + Name = "File.edit26" + }, + new + { + Id = 266, + Description = "Разрешение редактировать Файлы категории 26", + Name = "File.edit27" + }, + new + { + Id = 267, + Description = "Разрешение редактировать Файлы категории 27", + Name = "File.edit28" + }, + new + { + Id = 268, + Description = "Разрешение редактировать Файлы категории 28", + Name = "File.edit29" + }, + new + { + Id = 269, + Description = "Разрешение редактировать Файлы категории 29", + Name = "File.edit30" + }, + new + { + Id = 380, + Description = "Разрешение просматривать список бурильщиков", + Name = "Driller.get" + }, + new + { + Id = 381, + Description = "Разрешение редактировать бурильщика", + Name = "Driller.edit" + }, + new + { + Id = 382, + Description = "Разрешение удалять бурильщик", + Name = "Driller.delete" + }, + new + { + Id = 383, + Description = "Разрешение просматривать графики бурильщиков", + Name = "Schedule.get" + }, + new + { + Id = 384, + Description = "Разрешение редактировать график бурильщика", + Name = "Schedule.edit" + }, + new + { + Id = 385, + Description = "Разрешение удалять график бурильщика", + Name = "Schedule.delete" + }, + new + { + Id = 386, + Description = "Разрешение просматривать суточный рапорт", + Name = "DailyReport.get" + }, + new + { + Id = 387, + Description = "Разрешение редактировать суточный рапорт", + Name = "DailyReport.edit" + }, + new + { + Id = 388, + Description = "Разрешение просматривать авто. определенные операции", + Name = "DetectedOperation.get" + }, + new + { + Id = 389, + Description = "Разрешение просматривать целевые значения", + Name = "OperationValue.get" + }, + new + { + Id = 390, + Description = "Разрешение редактировать целевые значения", + Name = "OperationValue.edit" + }, + new + { + Id = 391, + Description = "Разрешение удалять целевые значения", + Name = "OperationValue.delete" + }, + new + { + Id = 400, + Description = "Разрешение просматривать инфо по wits параметрам", + Name = "WitsInfo.get" + }, + new + { + Id = 401, + Description = "Разрешение просматривать WITS record 1", + Name = "WitsRecord1.get" + }, + new + { + Id = 407, + Description = "Разрешение просматривать WITS record 7", + Name = "WitsRecord7.get" + }, + new + { + Id = 408, + Description = "Разрешение просматривать WITS record 8", + Name = "WitsRecord8.get" + }, + new + { + Id = 450, + Description = "Разрешение просматривать WITS record 50", + Name = "WitsRecord50.get" + }, + new + { + Id = 460, + Description = "Разрешение просматривать WITS record 60", + Name = "WitsRecord60.get" + }, + new + { + Id = 461, + Description = "Разрешение просматривать WITS record 61", + Name = "WitsRecord61.get" + }, + new + { + Id = 500, + Description = "Разрешение удалять Категорий документов файлов", + Name = "FileCategory.delete" + }, + new + { + Id = 501, + Description = "Разрешение редактировать Категорий документов файлов", + Name = "FileCategory.edit" + }, + new + { + Id = 502, + Description = "Разрешение просматривать Категорий документов файлов", + Name = "FileCategory.get" + }, + new + { + Id = 503, + Description = "Разрешение удалять Дело скважины", + Name = "WellFinalDocuments.delete" + }, + new + { + Id = 504, + Description = "Разрешение редактировать Дело скважины", + Name = "WellFinalDocuments.edit" + }, + new + { + Id = 505, + Description = "Разрешение просматривать Дело скважины", + Name = "WellFinalDocuments.get" + }, + new + { + Id = 506, + Description = "Разрешение редактировать ответственных за загрузку файла Дело скважины", + Name = "WellFinalDocuments.editPublisher" + }, + new + { + Id = 507, + Description = "Разрешение просматривать наработка талевого каната", + Name = "TelemetryWirelineRunOut.get" + }, + new + { + Id = 510, + Description = "Разрешение просматривать плановая траектория", + Name = "PlannedTrajectory.get" + }, + new + { + Id = 511, + Description = "Разрешение редактировать плановая траектория", + Name = "PlannedTrajectory.edit" + }, + new + { + Id = 512, + Description = "Разрешение удалять плановая траектория", + Name = "PlannedTrajectory.delete" + }, + new + { + Id = 516, + Description = "Разрешение просматривать статистику вопросов", + Name = "FaqStatistics.get" + }, + new + { + Id = 517, + Description = "Разрешение редактировать вопрос", + Name = "FaqStatistics.edit" + }, + new + { + Id = 518, + Description = "Разрешение удалять вопрос", + Name = "FaqStatistics.delete" + }, + new + { + Id = 519, + Description = "Разрешение просматривать список контактов", + Name = "WellContact.get" + }, + new + { + Id = 520, + Description = "Разрешение редактировать список контактов", + Name = "WellContact.edit" + }, + new + { + Id = 521, + Description = "Разрешить создание справок по страницам", + Name = "HelpPage.edit" + }, + new + { + Id = 522, + Description = "Разрешить удаление всех настроек пользователя", + Name = "UserSettings.delete" + }, + new + { + Id = 523, + Description = "Разрешить редактирование инструкций", + Name = "Manual.edit" + }, + new + { + Id = 524, + Description = "Разрешить получение инструкций", + Name = "Manual.get" + }, + new + { + Id = 525, + Description = "Разрешение на редактирование РТК у завершенной скважины", + Name = "ProcessMap.editCompletedWell" + }, + new + { + Id = 526, + Description = "Разрешение на редактирование операций у завершенной скважины", + Name = "WellOperation.editCompletedWell" + }, + new + { + Id = 527, + Description = "Разрешение на удаление инструкций", + Name = "Manual.delete" + }, + new + { + Id = 528, + Description = "Разрешение на удаление контакта", + Name = "WellContact.delete" + }, + new + { + Id = 530, + Description = "Разрешение на редактирование плановой конструкции скважины", + Name = "WellSectionPlan.edit" + }, + new + { + Id = 531, + Description = "Разрешение на удаление плановой конструкции скважины", + Name = "WellSectionPlan.delete" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AxialLoadLimitMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_limit_max") + .HasComment("Осевая нагрузка, т, допустимый максимум"); + + b.Property("AxialLoadPlan") + .HasColumnType("double precision") + .HasColumnName("axial_load_plan") + .HasComment("Осевая нагрузка, т, план"); + + b.Property("Comment") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("character varying(1024)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .HasComment("дата создания"); + + b.Property("DeltaPressureLimitMax") + .HasColumnType("double precision") + .HasColumnName("delta_pressure_limit_max") + .HasComment("Перепад давления, атм, допустимый максимум"); + + b.Property("DeltaPressurePlan") + .HasColumnType("double precision") + .HasColumnName("delta_pressure_plan") + .HasComment("Перепад давления, атм, план"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина по стволу до, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина по стволу от, м"); + + b.Property("FlowLimitMax") + .HasColumnType("double precision") + .HasColumnName("flow_limit_max") + .HasComment("Расход, л/с, допустимый максимум"); + + b.Property("FlowPlan") + .HasColumnType("double precision") + .HasColumnName("flow_plan") + .HasComment("Расход, л/с, план"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Автор"); + + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); + + b.Property("IdMode") + .HasColumnType("integer") + .HasColumnName("id_mode") + .HasComment("Id режима (1- ротор, 2 слайд)"); + + b.Property("IdPrevious") + .HasColumnType("integer") + .HasColumnName("id_previous") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("Obsolete") + .HasColumnType("timestamp with time zone") + .HasColumnName("obsolete") + .HasComment("дата устаревания"); + + b.Property("RopPlan") + .HasColumnType("double precision") + .HasColumnName("rop_plan") + .HasComment("Плановая механическая скорость, м/ч"); + + b.Property("TopDriveSpeedLimitMax") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_limit_max") + .HasComment("Обороты на ВСП, допустимый максимум"); + + b.Property("TopDriveSpeedPlan") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_plan") + .HasComment("Обороты на ВСП, план"); + + b.Property("TopDriveTorqueLimitMax") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_limit_max") + .HasComment("Момент на ВСП, допустимый максимум"); + + b.Property("TopDriveTorquePlan") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_plan") + .HasComment("Момент на ВСП, план"); + + b.Property("UsageSaub") + .HasColumnType("double precision") + .HasColumnName("usage_saub") + .HasComment("Плановый процент использования АКБ"); + + b.Property("UsageSpin") + .HasColumnType("double precision") + .HasColumnName("usage_spin") + .HasComment("Плановый процент использования spin master"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdEditor"); + + b.HasIndex("IdPrevious"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map_plan_drilling", t => + { + t.HasComment("РТК план бурение"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .HasComment("дата создания"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина по стволу до, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина по стволу от, м"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Автор"); + + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); + + b.Property("IdPrevious") + .HasColumnType("integer") + .HasColumnName("id_previous") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("ИД состояния записи: \n0 - актуальная\n1 - замененная\n2 - удаленная"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("Obsolete") + .HasColumnType("timestamp with time zone") + .HasColumnName("obsolete") + .HasComment("дата устаревания"); + + b.Property("Pressure") + .HasColumnType("double precision") + .HasColumnName("pressure") + .HasComment("Давление, атм"); + + b.Property("Repeats") + .HasColumnType("double precision") + .HasColumnName("repeats") + .HasComment("Количество повторений"); + + b.Property("SetpointDrag") + .HasColumnType("double precision") + .HasColumnName("setpoint_drag") + .HasComment("Уставка зятяжки, т"); + + b.Property("SetpointTight") + .HasColumnType("double precision") + .HasColumnName("setpoint_tight") + .HasComment("Уставка посадки, т"); + + b.Property("SpeedDownward") + .HasColumnType("double precision") + .HasColumnName("speed_downward") + .HasComment("Скорость спуска, м/ч"); + + b.Property("SpeedUpward") + .HasColumnType("double precision") + .HasColumnName("speed_upward") + .HasComment("Скорость подъёма, м/ч"); + + b.Property("SpinDownward") + .HasColumnType("double precision") + .HasColumnName("spin_downward") + .HasComment("Вращение при движении вниз, об/мин"); + + b.Property("SpinUpward") + .HasColumnType("double precision") + .HasColumnName("spin_upward") + .HasComment("Вращение при движении вверх, об/мин"); + + b.Property("Torque") + .HasColumnType("double precision") + .HasColumnName("torque") + .HasComment("Момент, кН*м"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdEditor"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map_plan_ream", t => + { + t.HasComment("РТК проработка скважины"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("IdCompany", "IdWell"); + + b.HasIndex("IdWell"); + + b.ToTable("t_relation_company_well", t => + { + t.HasComment("отношение скважин и компаний"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationContactWell", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.HasKey("IdWell", "IdUser"); + + b.HasIndex("IdUser"); + + b.ToTable("t_relation_contact_well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdDrillingProgramPart") + .HasColumnType("integer") + .HasColumnName("id_drilling_program_part"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_role") + .HasComment("1 - publisher, 2 - approver"); + + b.HasKey("IdUser", "IdDrillingProgramPart") + .HasName("t_relation_user_drilling_program_part_pk"); + + b.HasIndex("IdDrillingProgramPart"); + + b.ToTable("t_relation_user_drilling_program_part", t => + { + t.HasComment("Отношение пользователей и частей ПБ"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission", t => + { + t.HasComment("Отношение ролей пользователей и разрешений доступа"); + }); + + b.HasData( + new + { + IdUserRole = 1100, + IdPermission = 102 + }, + new + { + IdUserRole = 1100, + IdPermission = 111 + }, + new + { + IdUserRole = 1101, + IdPermission = 101 + }, + new + { + IdUserRole = 1101, + IdPermission = 100 + }, + new + { + IdUserRole = 1102, + IdPermission = 105 + }, + new + { + IdUserRole = 1102, + IdPermission = 108 + }, + new + { + IdUserRole = 1103, + IdPermission = 104 + }, + new + { + IdUserRole = 1103, + IdPermission = 103 + }, + new + { + IdUserRole = 1104, + IdPermission = 108 + }, + new + { + IdUserRole = 1105, + IdPermission = 107 + }, + new + { + IdUserRole = 1105, + IdPermission = 106 + }, + new + { + IdUserRole = 1106, + IdPermission = 111 + }, + new + { + IdUserRole = 1107, + IdPermission = 110 + }, + new + { + IdUserRole = 1107, + IdPermission = 109 + }, + new + { + IdUserRole = 1108, + IdPermission = 114 + }, + new + { + IdUserRole = 1109, + IdPermission = 113 + }, + new + { + IdUserRole = 1109, + IdPermission = 112 + }, + new + { + IdUserRole = 1110, + IdPermission = 123 + }, + new + { + IdUserRole = 1110, + IdPermission = 114 + }, + new + { + IdUserRole = 1111, + IdPermission = 122 + }, + new + { + IdUserRole = 1111, + IdPermission = 121 + }, + new + { + IdUserRole = 1112, + IdPermission = 117 + }, + new + { + IdUserRole = 1113, + IdPermission = 105 + }, + new + { + IdUserRole = 1113, + IdPermission = 123 + }, + new + { + IdUserRole = 1113, + IdPermission = 120 + }, + new + { + IdUserRole = 1114, + IdPermission = 119 + }, + new + { + IdUserRole = 1114, + IdPermission = 118 + }, + new + { + IdUserRole = 1114, + IdPermission = 200 + }, + new + { + IdUserRole = 1115, + IdPermission = 223 + }, + new + { + IdUserRole = 1116, + IdPermission = 105 + }, + new + { + IdUserRole = 1116, + IdPermission = 102 + }, + new + { + IdUserRole = 1116, + IdPermission = 117 + }, + new + { + IdUserRole = 1116, + IdPermission = 126 + }, + new + { + IdUserRole = 1117, + IdPermission = 125 + }, + new + { + IdUserRole = 1117, + IdPermission = 124 + }, + new + { + IdUserRole = 1200, + IdPermission = 203 + }, + new + { + IdUserRole = 1200, + IdPermission = 230 + }, + new + { + IdUserRole = 1201, + IdPermission = 202 + }, + new + { + IdUserRole = 1201, + IdPermission = 203 + }, + new + { + IdUserRole = 1201, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 203 + }, + new + { + IdUserRole = 1202, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 236 + }, + new + { + IdUserRole = 1202, + IdPermission = 212 + }, + new + { + IdUserRole = 1203, + IdPermission = 235 + }, + new + { + IdUserRole = 1204, + IdPermission = 202 + }, + new + { + IdUserRole = 1204, + IdPermission = 203 + }, + new + { + IdUserRole = 1205, + IdPermission = 215 + }, + new + { + IdUserRole = 1206, + IdPermission = 203 + }, + new + { + IdUserRole = 1206, + IdPermission = 206 + }, + new + { + IdUserRole = 1207, + IdPermission = 205 + }, + new + { + IdUserRole = 1208, + IdPermission = 218 + }, + new + { + IdUserRole = 1209, + IdPermission = 217 + }, + new + { + IdUserRole = 1210, + IdPermission = 203 + }, + new + { + IdUserRole = 1210, + IdPermission = 230 + }, + new + { + IdUserRole = 1210, + IdPermission = 219 + }, + new + { + IdUserRole = 1211, + IdPermission = 203 + }, + new + { + IdUserRole = 1211, + IdPermission = 220 + }, + new + { + IdUserRole = 1211, + IdPermission = 239 + }, + new + { + IdUserRole = 1212, + IdPermission = 238 + }, + new + { + IdUserRole = 1212, + IdPermission = 237 + }, + new + { + IdUserRole = 1213, + IdPermission = 203 + }, + new + { + IdUserRole = 1213, + IdPermission = 239 + }, + new + { + IdUserRole = 1213, + IdPermission = 212 + }, + new + { + IdUserRole = 1214, + IdPermission = 211 + }, + new + { + IdUserRole = 1214, + IdPermission = 210 + }, + new + { + IdUserRole = 1215, + IdPermission = 203 + }, + new + { + IdUserRole = 1215, + IdPermission = 222 + }, + new + { + IdUserRole = 1216, + IdPermission = 221 + }, + new + { + IdUserRole = 1217, + IdPermission = 226 + }, + new + { + IdUserRole = 1218, + IdPermission = 225 + }, + new + { + IdUserRole = 1218, + IdPermission = 224 + }, + new + { + IdUserRole = 1219, + IdPermission = 203 + }, + new + { + IdUserRole = 1219, + IdPermission = 206 + }, + new + { + IdUserRole = 1219, + IdPermission = 230 + }, + new + { + IdUserRole = 1219, + IdPermission = 232 + }, + new + { + IdUserRole = 1220, + IdPermission = 203 + }, + new + { + IdUserRole = 1220, + IdPermission = 228 + }, + new + { + IdUserRole = 1221, + IdPermission = 202 + }, + new + { + IdUserRole = 1221, + IdPermission = 203 + }, + new + { + IdUserRole = 1221, + IdPermission = 220 + }, + new + { + IdUserRole = 1221, + IdPermission = 234 + }, + new + { + IdUserRole = 1500, + IdPermission = 507 + }, + new + { + IdUserRole = 1500, + IdPermission = 510 + }, + new + { + IdUserRole = 1501, + IdPermission = 214 + }, + new + { + IdUserRole = 1501, + IdPermission = 213 + }, + new + { + IdUserRole = 1502, + IdPermission = 207 + }, + new + { + IdUserRole = 1502, + IdPermission = 208 + }, + new + { + IdUserRole = 2000, + IdPermission = 205 + }, + new + { + IdUserRole = 2000, + IdPermission = 204 + }, + new + { + IdUserRole = 2000, + IdPermission = 245 + }, + new + { + IdUserRole = 2001, + IdPermission = 244 + }, + new + { + IdUserRole = 2001, + IdPermission = 245 + }, + new + { + IdUserRole = 2002, + IdPermission = 244 + }, + new + { + IdUserRole = 2002, + IdPermission = 246 + }, + new + { + IdUserRole = 2002, + IdPermission = 237 + }, + new + { + IdUserRole = 2002, + IdPermission = 238 + }, + new + { + IdUserRole = 2003, + IdPermission = 240 + }, + new + { + IdUserRole = 2003, + IdPermission = 217 + }, + new + { + IdUserRole = 2003, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 242 + }, + new + { + IdUserRole = 2004, + IdPermission = 217 + }, + new + { + IdUserRole = 2004, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 205 + }, + new + { + IdUserRole = 2004, + IdPermission = 204 + }, + new + { + IdUserRole = 2005, + IdPermission = 247 + }, + new + { + IdUserRole = 2005, + IdPermission = 205 + }, + new + { + IdUserRole = 2005, + IdPermission = 204 + }, + new + { + IdUserRole = 2006, + IdPermission = 243 + }, + new + { + IdUserRole = 2006, + IdPermission = 205 + }, + new + { + IdUserRole = 2006, + IdPermission = 204 + }, + new + { + IdUserRole = 2007, + IdPermission = 241 + }, + new + { + IdUserRole = 2007, + IdPermission = 205 + }, + new + { + IdUserRole = 2007, + IdPermission = 204 + }, + new + { + IdUserRole = 1, + IdPermission = 100 + }, + new + { + IdUserRole = 1, + IdPermission = 101 + }, + new + { + IdUserRole = 1, + IdPermission = 102 + }, + new + { + IdUserRole = 1, + IdPermission = 103 + }, + new + { + IdUserRole = 1, + IdPermission = 104 + }, + new + { + IdUserRole = 1, + IdPermission = 105 + }, + new + { + IdUserRole = 1, + IdPermission = 106 + }, + new + { + IdUserRole = 1, + IdPermission = 107 + }, + new + { + IdUserRole = 1, + IdPermission = 108 + }, + new + { + IdUserRole = 1, + IdPermission = 109 + }, + new + { + IdUserRole = 1, + IdPermission = 110 + }, + new + { + IdUserRole = 1, + IdPermission = 111 + }, + new + { + IdUserRole = 1, + IdPermission = 112 + }, + new + { + IdUserRole = 1, + IdPermission = 113 + }, + new + { + IdUserRole = 1, + IdPermission = 114 + }, + new + { + IdUserRole = 1, + IdPermission = 115 + }, + new + { + IdUserRole = 1, + IdPermission = 116 + }, + new + { + IdUserRole = 1, + IdPermission = 117 + }, + new + { + IdUserRole = 1, + IdPermission = 118 + }, + new + { + IdUserRole = 1, + IdPermission = 119 + }, + new + { + IdUserRole = 1, + IdPermission = 120 + }, + new + { + IdUserRole = 1, + IdPermission = 121 + }, + new + { + IdUserRole = 1, + IdPermission = 122 + }, + new + { + IdUserRole = 1, + IdPermission = 123 + }, + new + { + IdUserRole = 1, + IdPermission = 124 + }, + new + { + IdUserRole = 1, + IdPermission = 125 + }, + new + { + IdUserRole = 1, + IdPermission = 126 + }, + new + { + IdUserRole = 1, + IdPermission = 127 + }, + new + { + IdUserRole = 1, + IdPermission = 128 + }, + new + { + IdUserRole = 1, + IdPermission = 129 + }, + new + { + IdUserRole = 1, + IdPermission = 200 + }, + new + { + IdUserRole = 1, + IdPermission = 201 + }, + new + { + IdUserRole = 1, + IdPermission = 202 + }, + new + { + IdUserRole = 1, + IdPermission = 203 + }, + new + { + IdUserRole = 1, + IdPermission = 204 + }, + new + { + IdUserRole = 1, + IdPermission = 205 + }, + new + { + IdUserRole = 1, + IdPermission = 206 + }, + new + { + IdUserRole = 1, + IdPermission = 207 + }, + new + { + IdUserRole = 1, + IdPermission = 208 + }, + new + { + IdUserRole = 1, + IdPermission = 209 + }, + new + { + IdUserRole = 1, + IdPermission = 210 + }, + new + { + IdUserRole = 1, + IdPermission = 211 + }, + new + { + IdUserRole = 1, + IdPermission = 212 + }, + new + { + IdUserRole = 1, + IdPermission = 213 + }, + new + { + IdUserRole = 1, + IdPermission = 214 + }, + new + { + IdUserRole = 1, + IdPermission = 215 + }, + new + { + IdUserRole = 1, + IdPermission = 216 + }, + new + { + IdUserRole = 1, + IdPermission = 217 + }, + new + { + IdUserRole = 1, + IdPermission = 218 + }, + new + { + IdUserRole = 1, + IdPermission = 219 + }, + new + { + IdUserRole = 1, + IdPermission = 220 + }, + new + { + IdUserRole = 1, + IdPermission = 221 + }, + new + { + IdUserRole = 1, + IdPermission = 222 + }, + new + { + IdUserRole = 1, + IdPermission = 223 + }, + new + { + IdUserRole = 1, + IdPermission = 224 + }, + new + { + IdUserRole = 1, + IdPermission = 225 + }, + new + { + IdUserRole = 1, + IdPermission = 226 + }, + new + { + IdUserRole = 1, + IdPermission = 227 + }, + new + { + IdUserRole = 1, + IdPermission = 228 + }, + new + { + IdUserRole = 1, + IdPermission = 229 + }, + new + { + IdUserRole = 1, + IdPermission = 230 + }, + new + { + IdUserRole = 1, + IdPermission = 231 + }, + new + { + IdUserRole = 1, + IdPermission = 232 + }, + new + { + IdUserRole = 1, + IdPermission = 233 + }, + new + { + IdUserRole = 1, + IdPermission = 234 + }, + new + { + IdUserRole = 1, + IdPermission = 235 + }, + new + { + IdUserRole = 1, + IdPermission = 236 + }, + new + { + IdUserRole = 1, + IdPermission = 237 + }, + new + { + IdUserRole = 1, + IdPermission = 238 + }, + new + { + IdUserRole = 1, + IdPermission = 239 + }, + new + { + IdUserRole = 1, + IdPermission = 240 + }, + new + { + IdUserRole = 1, + IdPermission = 241 + }, + new + { + IdUserRole = 1, + IdPermission = 242 + }, + new + { + IdUserRole = 1, + IdPermission = 243 + }, + new + { + IdUserRole = 1, + IdPermission = 244 + }, + new + { + IdUserRole = 1, + IdPermission = 245 + }, + new + { + IdUserRole = 1, + IdPermission = 246 + }, + new + { + IdUserRole = 1, + IdPermission = 247 + }, + new + { + IdUserRole = 1, + IdPermission = 248 + }, + new + { + IdUserRole = 1, + IdPermission = 249 + }, + new + { + IdUserRole = 1, + IdPermission = 250 + }, + new + { + IdUserRole = 1, + IdPermission = 251 + }, + new + { + IdUserRole = 1, + IdPermission = 252 + }, + new + { + IdUserRole = 1, + IdPermission = 253 + }, + new + { + IdUserRole = 1, + IdPermission = 254 + }, + new + { + IdUserRole = 1, + IdPermission = 255 + }, + new + { + IdUserRole = 1, + IdPermission = 256 + }, + new + { + IdUserRole = 1, + IdPermission = 257 + }, + new + { + IdUserRole = 1, + IdPermission = 258 + }, + new + { + IdUserRole = 1, + IdPermission = 259 + }, + new + { + IdUserRole = 1, + IdPermission = 260 + }, + new + { + IdUserRole = 1, + IdPermission = 261 + }, + new + { + IdUserRole = 1, + IdPermission = 262 + }, + new + { + IdUserRole = 1, + IdPermission = 263 + }, + new + { + IdUserRole = 1, + IdPermission = 264 + }, + new + { + IdUserRole = 1, + IdPermission = 265 + }, + new + { + IdUserRole = 1, + IdPermission = 266 + }, + new + { + IdUserRole = 1, + IdPermission = 267 + }, + new + { + IdUserRole = 1, + IdPermission = 268 + }, + new + { + IdUserRole = 1, + IdPermission = 269 + }, + new + { + IdUserRole = 1, + IdPermission = 380 + }, + new + { + IdUserRole = 1, + IdPermission = 381 + }, + new + { + IdUserRole = 1, + IdPermission = 382 + }, + new + { + IdUserRole = 1, + IdPermission = 383 + }, + new + { + IdUserRole = 1, + IdPermission = 384 + }, + new + { + IdUserRole = 1, + IdPermission = 385 + }, + new + { + IdUserRole = 1, + IdPermission = 386 + }, + new + { + IdUserRole = 1, + IdPermission = 387 + }, + new + { + IdUserRole = 1, + IdPermission = 388 + }, + new + { + IdUserRole = 1, + IdPermission = 389 + }, + new + { + IdUserRole = 1, + IdPermission = 390 + }, + new + { + IdUserRole = 1, + IdPermission = 391 + }, + new + { + IdUserRole = 1, + IdPermission = 400 + }, + new + { + IdUserRole = 1, + IdPermission = 401 + }, + new + { + IdUserRole = 1, + IdPermission = 407 + }, + new + { + IdUserRole = 1, + IdPermission = 408 + }, + new + { + IdUserRole = 1, + IdPermission = 450 + }, + new + { + IdUserRole = 1, + IdPermission = 460 + }, + new + { + IdUserRole = 1, + IdPermission = 461 + }, + new + { + IdUserRole = 1, + IdPermission = 500 + }, + new + { + IdUserRole = 1, + IdPermission = 501 + }, + new + { + IdUserRole = 1, + IdPermission = 502 + }, + new + { + IdUserRole = 1, + IdPermission = 503 + }, + new + { + IdUserRole = 1, + IdPermission = 504 + }, + new + { + IdUserRole = 1, + IdPermission = 505 + }, + new + { + IdUserRole = 1, + IdPermission = 506 + }, + new + { + IdUserRole = 1, + IdPermission = 507 + }, + new + { + IdUserRole = 1, + IdPermission = 510 + }, + new + { + IdUserRole = 1, + IdPermission = 511 + }, + new + { + IdUserRole = 1, + IdPermission = 512 + }, + new + { + IdUserRole = 1, + IdPermission = 516 + }, + new + { + IdUserRole = 1, + IdPermission = 517 + }, + new + { + IdUserRole = 1, + IdPermission = 518 + }, + new + { + IdUserRole = 1, + IdPermission = 519 + }, + new + { + IdUserRole = 1, + IdPermission = 520 + }, + new + { + IdUserRole = 1, + IdPermission = 521 + }, + new + { + IdUserRole = 1, + IdPermission = 522 + }, + new + { + IdUserRole = 1, + IdPermission = 523 + }, + new + { + IdUserRole = 1, + IdPermission = 524 + }, + new + { + IdUserRole = 1, + IdPermission = 525 + }, + new + { + IdUserRole = 1, + IdPermission = 526 + }, + new + { + IdUserRole = 1, + IdPermission = 527 + }, + new + { + IdUserRole = 1, + IdPermission = 528 + }, + new + { + IdUserRole = 1, + IdPermission = 530 + }, + new + { + IdUserRole = 1, + IdPermission = 531 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdInclude") + .HasColumnType("integer") + .HasColumnName("id_include_user_role"); + + b.HasKey("Id", "IdInclude") + .HasName("t_relation_user_role_user_role_pk"); + + b.HasIndex("IdInclude"); + + b.ToTable("t_relation_user_role_user_role", t => + { + t.HasComment("Отношение ролей к ролям"); + }); + + b.HasData( + new + { + Id = 1101, + IdInclude = 1100 + }, + new + { + Id = 1103, + IdInclude = 1102 + }, + new + { + Id = 1105, + IdInclude = 1104 + }, + new + { + Id = 1107, + IdInclude = 1106 + }, + new + { + Id = 1109, + IdInclude = 1108 + }, + new + { + Id = 1111, + IdInclude = 1110 + }, + new + { + Id = 1114, + IdInclude = 1113 + }, + new + { + Id = 1117, + IdInclude = 1116 + }, + new + { + Id = 1203, + IdInclude = 1202 + }, + new + { + Id = 1207, + IdInclude = 1206 + }, + new + { + Id = 1209, + IdInclude = 1208 + }, + new + { + Id = 1212, + IdInclude = 1211 + }, + new + { + Id = 1214, + IdInclude = 1213 + }, + new + { + Id = 1216, + IdInclude = 1215 + }, + new + { + Id = 1218, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1200 + }, + new + { + Id = 2000, + IdInclude = 1201 + }, + new + { + Id = 2000, + IdInclude = 1202 + }, + new + { + Id = 2000, + IdInclude = 1204 + }, + new + { + Id = 2000, + IdInclude = 1205 + }, + new + { + Id = 2000, + IdInclude = 1206 + }, + new + { + Id = 2000, + IdInclude = 1208 + }, + new + { + Id = 2000, + IdInclude = 1210 + }, + new + { + Id = 2000, + IdInclude = 1211 + }, + new + { + Id = 2000, + IdInclude = 1213 + }, + new + { + Id = 2000, + IdInclude = 1215 + }, + new + { + Id = 2000, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1219 + }, + new + { + Id = 2000, + IdInclude = 1220 + }, + new + { + Id = 2000, + IdInclude = 1221 + }, + new + { + Id = 2000, + IdInclude = 1500 + }, + new + { + Id = 2000, + IdInclude = 1501 + }, + new + { + Id = 2000, + IdInclude = 1502 + }, + new + { + Id = 2001, + IdInclude = 1500 + }, + new + { + Id = 2001, + IdInclude = 1501 + }, + new + { + Id = 2001, + IdInclude = 1502 + }, + new + { + Id = 2002, + IdInclude = 1500 + }, + new + { + Id = 2002, + IdInclude = 1501 + }, + new + { + Id = 2002, + IdInclude = 1502 + }, + new + { + Id = 2003, + IdInclude = 1500 + }, + new + { + Id = 2003, + IdInclude = 1501 + }, + new + { + Id = 2003, + IdInclude = 1502 + }, + new + { + Id = 2004, + IdInclude = 1500 + }, + new + { + Id = 2004, + IdInclude = 1501 + }, + new + { + Id = 2004, + IdInclude = 1502 + }, + new + { + Id = 2005, + IdInclude = 1500 + }, + new + { + Id = 2005, + IdInclude = 1501 + }, + new + { + Id = 2005, + IdInclude = 1502 + }, + new + { + Id = 2006, + IdInclude = 1500 + }, + new + { + Id = 2006, + IdInclude = 1501 + }, + new + { + Id = 2006, + IdInclude = 1502 + }, + new + { + Id = 2007, + IdInclude = 1500 + }, + new + { + Id = 2007, + IdInclude = 1501 + }, + new + { + Id = 2007, + IdInclude = 1502 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role", t => + { + t.HasComment("Отношение пользователей и ролей"); + }); + + b.HasData( + new + { + IdUser = 1, + IdUserRole = 1 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Begin") + .HasColumnType("timestamp with time zone") + .HasColumnName("begin"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end") + .HasComment("timestamp with time zone"); + + b.Property("Format") + .HasColumnType("integer") + .HasColumnName("format") + .HasComment("Формат отчета"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла-родителя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("Step") + .HasColumnType("integer") + .HasColumnName("step") + .HasComment("размер шага в секундах"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdWell"); + + b.ToTable("t_report_property", t => + { + t.HasComment("Отчеты с данными по буровым"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DrillEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_end") + .HasComment("Конец вахты"); + + b.Property("DrillStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_start") + .HasComment("Начало вахты"); + + b.Property("IdDriller") + .HasColumnType("integer") + .HasColumnName("id_driller") + .HasComment("Идентификатор бурильщика"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Идентификатор скважины"); + + b.Property("ShiftEnd") + .HasColumnType("time without time zone") + .HasColumnName("shift_end") + .HasComment("Конец смены"); + + b.Property("ShiftStart") + .HasColumnType("time without time zone") + .HasColumnName("shift_start") + .HasComment("Начало смены"); + + b.HasKey("Id"); + + b.HasIndex("IdDriller"); + + b.HasIndex("IdWell"); + + b.ToTable("t_schedule", t => + { + t.HasComment("График работы бурильщика"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("комментарий для оператора"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("ObsolescenceSec") + .HasColumnType("integer") + .HasColumnName("obsolescence") + .HasComment("сек. до устаревания"); + + b.Property("Setpoints") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("setpoint_set") + .HasComment("Набор уставок"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdWell"); + + b.ToTable("t_setpoints_rquest", t => + { + t.HasComment("Запросы на изменение уставок панели оператора"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Subsystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("t_subsystem", t => + { + t.HasComment("Описание подсистем"); + }); + + b.HasData( + new + { + Id = 1, + Description = "Совместная работа режимов \"Бурение в роторе\" и \"Бурение в слайде\"", + Name = "АПД" + }, + new + { + Id = 11, + Description = "Режим работы \"Бурение в роторе\"", + Name = "АПД ротор" + }, + new + { + Id = 12, + Description = "Режим работы \"Бурение в слайде\"", + Name = "АПД слайд" + }, + new + { + Id = 65536, + Description = "Осцилляция", + Name = "Осцилляция" + }, + new + { + Id = 65537, + Description = "Демпфер", + Name = "Демпфер" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Info") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .IsRequired() + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + b.Property("TimeZone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); + + b.ToTable("t_telemetry", t => + { + t.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("AxialLoad") + .HasColumnType("real") + .HasColumnName("axial_load") + .HasComment("Осевая нагрузка"); + + b.Property("AxialLoadLimitMax") + .HasColumnType("real") + .HasColumnName("axial_load_limit_max") + .HasComment("Осевая нагрузка. Аварийная макс."); + + b.Property("AxialLoadSp") + .HasColumnType("real") + .HasColumnName("axial_load_sp") + .HasComment("Осевая нагрузка. Задание"); + + b.Property("BitDepth") + .HasColumnType("real") + .HasColumnName("bit_depth") + .HasComment("Положение инструмента"); + + b.Property("BlockPosition") + .HasColumnType("real") + .HasColumnName("block_position") + .HasComment("Высота талевого блока"); + + b.Property("BlockPositionMax") + .HasColumnType("real") + .HasColumnName("block_position_max") + .HasComment("Талевый блок. Макс положение"); + + b.Property("BlockPositionMin") + .HasColumnType("real") + .HasColumnName("block_position_min") + .HasComment("Талевый блок. Мин положение"); + + b.Property("BlockSpeed") + .HasColumnType("real") + .HasColumnName("block_speed") + .HasComment("Скорость талевого блока"); + + b.Property("BlockSpeedSp") + .HasColumnType("real") + .HasColumnName("block_speed_sp") + .HasComment("Скорости талевого блока. Задание"); + + b.Property("BlockSpeedSpDevelop") + .HasColumnType("real") + .HasColumnName("block_speed_sp_develop") + .HasComment("Талевый блок. Задание скорости для проработки"); + + b.Property("BlockSpeedSpRotor") + .HasColumnType("real") + .HasColumnName("block_speed_sp_rotor") + .HasComment("Талевый блок. Задание скорости для роторного бурения"); + + b.Property("BlockSpeedSpSlide") + .HasColumnType("real") + .HasColumnName("block_speed_sp_slide") + .HasComment("Талевый блок. Задание скорости для режима слайда"); + + b.Property("Flow") + .HasColumnType("real") + .HasColumnName("flow") + .HasComment("Расход"); + + b.Property("FlowDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("flow_delta_limit_max") + .HasComment("Расход. Аварийный макс."); + + b.Property("FlowIdle") + .HasColumnType("real") + .HasColumnName("flow_idle") + .HasComment("Расход. Холостой ход"); + + b.Property("HookWeight") + .HasColumnType("real") + .HasColumnName("hook_weight") + .HasComment("Вес на крюке"); + + b.Property("HookWeightIdle") + .HasColumnType("real") + .HasColumnName("hook_weight_idle") + .HasComment("Вес на крюке. Холостой ход"); + + b.Property("HookWeightLimitMax") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_max") + .HasComment("Вес на крюке. Затяжка"); + + b.Property("HookWeightLimitMin") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_min") + .HasComment("Вес на крюке. Посадка"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator") + .HasComment("Текущий критерий бурения"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Пользователь САУБ"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Режим САУБ"); + + b.Property("Mse") + .HasColumnType("real") + .HasColumnName("mse") + .HasComment("MSE"); + + b.Property("MseState") + .HasColumnType("smallint") + .HasColumnName("mse_state") + .HasComment("Текущее состояние работы MSE"); + + b.Property("Pressure") + .HasColumnType("real") + .HasColumnName("pressure") + .HasComment("Давление"); + + b.Property("PressureDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("pressure_delta_limit_max") + .HasComment("Давление дифф. Аварийное макс."); + + b.Property("PressureIdle") + .HasColumnType("real") + .HasColumnName("pressure_idle") + .HasComment("Давление. Холостой ход"); + + b.Property("PressureSp") + .HasColumnType("real") + .HasColumnName("pressure_sp") + .HasComment("Давление. Задание"); + + b.Property("PressureSpDevelop") + .HasColumnType("real") + .HasColumnName("pressure_sp_develop") + .HasComment("Давление. Задание для проработки"); + + b.Property("PressureSpRotor") + .HasColumnType("real") + .HasColumnName("pressure_sp_rotor") + .HasComment("Давление. Задание для роторного бурения"); + + b.Property("PressureSpSlide") + .HasColumnType("real") + .HasColumnName("pressure_sp_slide") + .HasComment("Давление. Задание для режима слайда"); + + b.Property("Pump0Flow") + .HasColumnType("real") + .HasColumnName("pump0_flow") + .HasComment("Расход. Буровой насос 1"); + + b.Property("Pump1Flow") + .HasColumnType("real") + .HasColumnName("pump1_flow") + .HasComment("Расход. Буровой насос 2"); + + b.Property("Pump2Flow") + .HasColumnType("real") + .HasColumnName("pump2_flow") + .HasComment("Расход. Буровой насос 3"); + + b.Property("RotorSpeed") + .HasColumnType("real") + .HasColumnName("rotor_speed") + .HasComment("Обороты ротора"); + + b.Property("RotorTorque") + .HasColumnType("real") + .HasColumnName("rotor_torque") + .HasComment("Момент на роторе"); + + b.Property("RotorTorqueIdle") + .HasColumnType("real") + .HasColumnName("rotor_torque_idle") + .HasComment("Момент на роторе. Холостой ход"); + + b.Property("RotorTorqueLimitMax") + .HasColumnType("real") + .HasColumnName("rotor_torque_limit_max") + .HasComment("Момент на роторе. Аварийный макс."); + + b.Property("RotorTorqueSp") + .HasColumnType("real") + .HasColumnName("rotor_torque_sp") + .HasComment("Момент на роторе. Задание"); + + b.Property("WellDepth") + .HasColumnType("real") + .HasColumnName("well_depth") + .HasComment("Глубина забоя"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_data_saub", t => + { + t.HasComment("набор основных данных по SAUB"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaubStat", b => + { + b.Property("Count") + .HasColumnType("bigint") + .HasColumnName("count_items"); + + b.Property("DateMax") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_max"); + + b.Property("DateMin") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_min"); + + b.Property("DepthMax") + .HasColumnType("real") + .HasColumnName("depth_max"); + + b.Property("DepthMin") + .HasColumnType("real") + .HasColumnName("depth_min"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.ToTable((string)null); + + b.ToView("mw_telemetry_datas_saub_stat", (string)null); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Выбранный режим управления"); + + b.Property("PositionRight") + .HasColumnType("real") + .HasColumnName("position_right") + .HasComment("Крайний правый угол осцилляции"); + + b.Property("PositionZero") + .HasColumnType("real") + .HasColumnName("position_zero") + .HasComment("Нулевая позиция осцилляции"); + + b.Property("RevolsLeftLimit") + .HasColumnType("real") + .HasColumnName("revols_left_limit") + .HasComment("Ограничение числа оборотов влево"); + + b.Property("RevolsLeftTotal") + .HasColumnType("real") + .HasColumnName("revols_left_total") + .HasComment("Суммарное количество оборотов влево"); + + b.Property("RevolsRightLimit") + .HasColumnType("real") + .HasColumnName("revols_right_limit") + .HasComment("Ограничение числа оборотов вправо"); + + b.Property("RevolsRightTotal") + .HasColumnType("real") + .HasColumnName("revols_right_total") + .HasComment("Суммарное количество оборотов вправо"); + + b.Property("SpeedLeftSp") + .HasColumnType("real") + .HasColumnName("speed_left_sp") + .HasComment("Заданная скорость вращения влево"); + + b.Property("SpeedRightSp") + .HasColumnType("real") + .HasColumnName("speed_right_sp") + .HasComment("Заданная скорость вращения вправо"); + + b.Property("State") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("Переменная этапа"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_data_spin", t => + { + t.HasComment("набор основных данных по SpinMaster"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.Property("MessageTemplate") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message_template"); + + b.HasKey("IdTelemetry", "IdEvent"); + + b.ToTable("t_telemetry_event", t => + { + t.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arg0") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg0") + .HasComment("Аргумент №0 для вставки в шаблон сообщения"); + + b.Property("Arg1") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg1"); + + b.Property("Arg2") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg2"); + + b.Property("Arg3") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg3"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdTelemetryUser") + .HasColumnType("integer") + .HasColumnName("id_telemetry_user") + .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); + + b.Property("WellDepth") + .HasColumnType("double precision") + .HasColumnName("well_depth"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_message", t => + { + t.HasComment("Сообщения на буровых"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname"); + + b.HasKey("IdTelemetry", "IdUser"); + + b.ToTable("t_telemetry_user", t => + { + t.HasComment("Пользователи панели САУБ. Для сообщений."); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryWirelineRunOut", b => + { + b.Property("IdTelemetry") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Идентификатор телеметрии"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("IdTelemetry")); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_time") + .HasComment("Отметка времени"); + + b.Property("Hauling") + .HasColumnType("real") + .HasColumnName("hauling") + .HasComment("Наработка талевого каната с момента перетяжки каната, т*км"); + + b.Property("HaulingWarnSp") + .HasColumnType("real") + .HasColumnName("hauling_warn_sp") + .HasComment("Наработка талевого каната до сигнализации о необходимости перетяжки, т*км"); + + b.Property("Replace") + .HasColumnType("real") + .HasColumnName("replace") + .HasComment("Наработка талевого каната с момента замены каната, т*км"); + + b.Property("ReplaceWarnSp") + .HasColumnType("real") + .HasColumnName("replace_warn_sp") + .HasComment("Наработка талевого каната до сигнализации о необходимости замены, т*км"); + + b.HasKey("IdTelemetry"); + + b.ToTable("t_telemetry_wireline_run_out", t => + { + t.HasComment("Наработка талевого каната"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); + + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); + + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); + + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); + + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); + + b.HasKey("Id"); + + b.HasIndex("IdUser"); + + b.HasIndex("IdWell"); + + b.ToTable("t_trajectory_fact", t => + { + t.HasComment("Загрузка фактической траектории"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); + + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("Radius") + .HasColumnType("double precision") + .HasColumnName("radius") + .HasComment("Радиус цели"); + + b.Property("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); + + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); + + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); + + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); + + b.HasKey("Id"); + + b.HasIndex("IdUser"); + + b.HasIndex("IdWell"); + + b.ToTable("t_trajectory_plan", t => + { + t.HasComment("Загрузка плановой траектории"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdState") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n0 - не активен, \n1 - активен, \n2 - заблокирован"); + + b.Property("Login") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("login"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("имя"); + + b.Property("PasswordHash") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("password_hash") + .HasComment("соленый хэш пароля.\nпервые 5 символов - соль"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("отчество"); + + b.Property("Phone") + .HasMaxLength(50) + .HasColumnType("character varying(50)") + .HasColumnName("phone") + .HasComment("номер телефона"); + + b.Property("Position") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("position") + .HasComment("email"); + + b.Property("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user", t => + { + t.HasComment("Пользователи облака"); + }); + + b.HasData( + new + { + Id = 1, + Email = "", + IdCompany = 1, + IdState = (short)1, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role", t => + { + t.HasComment("Роли пользователей в системе"); + }); + + b.HasData( + new + { + Id = 1, + Caption = "root", + IdType = 1 + }, + new + { + Id = 1100, + Caption = "admin_cluster.view", + IdType = 1 + }, + new + { + Id = 1101, + Caption = "admin_cluster.edit", + IdType = 1 + }, + new + { + Id = 1102, + Caption = "admin_company.view", + IdType = 1 + }, + new + { + Id = 1103, + Caption = "admin_company.edit", + IdType = 1 + }, + new + { + Id = 1104, + Caption = "admin_company_type.view", + IdType = 1 + }, + new + { + Id = 1105, + Caption = "admin_company_type.edit", + IdType = 1 + }, + new + { + Id = 1106, + Caption = "admin_deposit.view", + IdType = 1 + }, + new + { + Id = 1107, + Caption = "admin_deposit.edit", + IdType = 1 + }, + new + { + Id = 1108, + Caption = "admin_permission.view", + IdType = 1 + }, + new + { + Id = 1109, + Caption = "admin_permission.edit", + IdType = 1 + }, + new + { + Id = 1110, + Caption = "admin_role.view", + IdType = 1 + }, + new + { + Id = 1111, + Caption = "admin_role.edit", + IdType = 1 + }, + new + { + Id = 1112, + Caption = "admin_telemetry.view", + IdType = 1 + }, + new + { + Id = 1113, + Caption = "admin_user.view", + IdType = 1 + }, + new + { + Id = 1114, + Caption = "admin_user.edit", + IdType = 1 + }, + new + { + Id = 1115, + Caption = "admin_visit_log.view", + IdType = 1 + }, + new + { + Id = 1116, + Caption = "admin_well.view", + IdType = 1 + }, + new + { + Id = 1117, + Caption = "admin_well.edit", + IdType = 1 + }, + new + { + Id = 1200, + Caption = "archive.view", + IdType = 1 + }, + new + { + Id = 1201, + Caption = "cluster.view", + IdType = 1 + }, + new + { + Id = 1202, + Caption = "composite.view", + IdType = 1 + }, + new + { + Id = 1203, + Caption = "composite.edit", + IdType = 1 + }, + new + { + Id = 1204, + Caption = "deposit.view", + IdType = 1 + }, + new + { + Id = 1205, + Caption = "document.view", + IdType = 1 + }, + new + { + Id = 1206, + Caption = "drillProcessFlow.view", + IdType = 1 + }, + new + { + Id = 1207, + Caption = "drillProcessFlow.edit", + IdType = 1 + }, + new + { + Id = 1208, + Caption = "measure.view", + IdType = 1 + }, + new + { + Id = 1209, + Caption = "measure.edit", + IdType = 1 + }, + new + { + Id = 1210, + Caption = "message.view", + IdType = 1 + }, + new + { + Id = 1211, + Caption = "operations.view", + IdType = 1 + }, + new + { + Id = 1212, + Caption = "operations.edit", + IdType = 1 + }, + new + { + Id = 1213, + Caption = "params.view", + IdType = 1 + }, + new + { + Id = 1214, + Caption = "params.edit", + IdType = 1 + }, + new + { + Id = 1215, + Caption = "report.view", + IdType = 1 + }, + new + { + Id = 1216, + Caption = "report.edit", + IdType = 1 + }, + new + { + Id = 1217, + Caption = "setpoints.view", + IdType = 1 + }, + new + { + Id = 1218, + Caption = "setpoints.edit", + IdType = 1 + }, + new + { + Id = 1219, + Caption = "telemetry.view", + IdType = 1 + }, + new + { + Id = 1220, + Caption = "telemetryAnalysis.view", + IdType = 1 + }, + new + { + Id = 1221, + Caption = "well.view", + IdType = 1 + }, + new + { + Id = 1500, + Caption = "Просмотр всего", + IdType = 1 + }, + new + { + Id = 1501, + Caption = "file.edit", + IdType = 1 + }, + new + { + Id = 1502, + Caption = "drillingProgram.edit", + IdType = 1 + }, + new + { + Id = 2000, + Caption = "Заказчик", + IdType = 0 + }, + new + { + Id = 2001, + Caption = "Супервайзер", + IdType = 0 + }, + new + { + Id = 2002, + Caption = "Буровой подрядчик", + IdType = 0 + }, + new + { + Id = 2003, + Caption = "Растворщик", + IdType = 0 + }, + new + { + Id = 2004, + Caption = "Телеметрист", + IdType = 0 + }, + new + { + Id = 2005, + Caption = "Долотный сервис", + IdType = 0 + }, + new + { + Id = 2006, + Caption = "ГТИ", + IdType = 0 + }, + new + { + Id = 2007, + Caption = "Цементирование", + IdType = 0 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("key") + .HasComment("Ключ настроек пользователя"); + + b.Property("Value") + .HasColumnType("jsonb") + .HasColumnName("setting_value") + .HasComment("Значение настроек пользователя"); + + b.HasKey("IdUser", "Key"); + + b.ToTable("t_user_settings", t => + { + t.HasComment("настройки интерфейса пользователя"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.RecordBase", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Actcod") + .HasColumnType("smallint") + .HasColumnName("ACTCOD"); + + b.Property("Date") + .HasColumnType("integer") + .HasColumnName("DATE"); + + b.Property("Recid") + .HasColumnType("smallint") + .HasColumnName("RECID"); + + b.Property("Seqid") + .HasColumnType("integer") + .HasColumnName("SEQID"); + + b.Property("Stknum") + .HasColumnType("smallint") + .HasColumnName("STKNUM"); + + b.Property("Time") + .HasColumnType("integer") + .HasColumnName("TIME"); + + b.Property("Wellid") + .HasColumnType("text") + .HasColumnName("WELLID"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_wits_base"); + + b.UseTptMappingStrategy(); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.Property("IdCluster") + .HasColumnType("integer") + .HasColumnName("id_cluster"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("state") + .HasComment("0 - неизвестно, 1 - в работе, 2 - завершена"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdWellType") + .HasColumnType("integer") + .HasColumnName("id_well_type"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.Property("Timezone") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex("IdCluster"); + + b.HasIndex("IdTelemetry") + .IsUnique(); + + b.HasIndex("IdWellType"); + + b.ToTable("t_well", t => + { + t.HasComment("скважины"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины получателя"); + + b.Property("IdWellSrc") + .HasColumnType("integer") + .HasColumnName("id_well_src") + .HasComment("Id скважины композита"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции композита"); + + b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); + + b.HasIndex("IdWellSectionType"); + + b.HasIndex("IdWellSrc"); + + b.ToTable("t_well_composite", t => + { + t.HasComment("Композитная скважина"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocument", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.HasKey("IdWell", "IdUser", "IdCategory") + .HasName("t_well_final_documents_pk"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdUser"); + + b.ToTable("t_well_final_documents", t => + { + t.HasComment("Дело скважины"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("Дата начала операции"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина после завершения операции, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина на начало операции, м"); + + b.Property("DurationHours") + .HasColumnType("double precision") + .HasColumnName("duration_hours") + .HasComment("Продолжительность, часы"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("IdPlan") + .HasColumnType("integer") + .HasColumnName("id_plan") + .HasComment("Id плановой операции"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0 = План или 1 = Факт"); + + b.Property("IdUser") + .HasColumnType("integer"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции скважины"); + + b.Property("LastUpdateDate") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("DateStart"); + + b.HasIndex("DepthEnd"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdPlan"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_well_operation", t => + { + t.HasComment("Данные по операциям на скважине"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("id родительской категории"); + + b.Property("KeyValueName") + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .HasColumnName("key_value_name") + .HasComment("Название ключевого показателя операции"); + + b.Property("KeyValueUnits") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("key_value_units") + .HasComment("Единицы измерения ключевого показателя операции"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории операции"); + + b.HasKey("Id"); + + b.HasIndex("IdParent"); + + b.ToTable("t_well_operation_category", t => + { + t.HasComment("Справочник операций на скважине"); + }); + + b.HasData( + new + { + Id = 3000, + KeyValueName = "dT", + KeyValueUnits = "м/ч", + Name = "БУРЕНИЕ" + }, + new + { + Id = 3001, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "КРЕПЛЕНИЕ" + }, + new + { + Id = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ГФР" + }, + new + { + Id = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные операции" + }, + new + { + Id = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Непроизводительное время (НПВ)" + }, + new + { + Id = 4000, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "КНБК" + }, + new + { + Id = 4001, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "м/ч", + Name = "Механическое. бурение" + }, + new + { + Id = 4002, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Статический замер" + }, + new + { + Id = 4003, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Нормализация диаметра скважины" + }, + new + { + Id = 4004, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наращивание" + }, + new + { + Id = 4005, + IdParent = 3001, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 4006, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск обсадной колонны" + }, + new + { + Id = 4018, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Крепление" + }, + new + { + Id = 4007, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Цементирование" + }, + new + { + Id = 4008, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные работы при креплении" + }, + new + { + Id = 4009, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка/разборка приборов ГИС" + }, + new + { + Id = 4010, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 4011, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ГИС" + }, + new + { + Id = 4012, + IdParent = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка, ОБР" + }, + new + { + Id = 4013, + IdParent = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные работы" + }, + new + { + Id = 4014, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт оборудования" + }, + new + { + Id = 4015, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Аварийные работы" + }, + new + { + Id = 4016, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Осложнение" + }, + new + { + Id = 4017, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Незаложенные в ГГД операции" + }, + new + { + Id = 5000, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разборка КНБК" + }, + new + { + Id = 5001, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка КНБК" + }, + new + { + Id = 5002, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение слайдом" + }, + new + { + Id = 5003, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение ротором" + }, + new + { + Id = 5004, + IdParent = 4002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Замер ЗТС (запись MWD)" + }, + new + { + Id = 5005, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка перед наращиванием" + }, + new + { + Id = 5006, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка во время бурения" + }, + new + { + Id = 5007, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка" + }, + new + { + Id = 5008, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка во время бурения" + }, + new + { + Id = 5009, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка перед наращиванием" + }, + new + { + Id = 5010, + IdParent = 4004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наращивание" + }, + new + { + Id = 5011, + IdParent = 4004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Удержание в клиньях" + }, + new + { + Id = 5012, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем инструмента" + }, + new + { + Id = 5013, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем КНБК" + }, + new + { + Id = 5014, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск инструмента" + }, + new + { + Id = 5015, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск КНБК" + }, + new + { + Id = 5016, + IdParent = 4006, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка при спуске ОК" + }, + new + { + Id = 5017, + IdParent = 4006, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск ОК" + }, + new + { + Id = 5018, + IdParent = 4007, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ОЗЦ" + }, + new + { + Id = 5019, + IdParent = 4007, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Цементирование" + }, + new + { + Id = 5020, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка БИ" + }, + new + { + Id = 5021, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка ОК" + }, + new + { + Id = 5022, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при спуске ОК" + }, + new + { + Id = 5023, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при цементировании" + }, + new + { + Id = 5024, + IdParent = 4009, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разборка комплекса приборов ГИС" + }, + new + { + Id = 5025, + IdParent = 4009, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка комплекса приборов ГИС" + }, + new + { + Id = 5026, + IdParent = 4010, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем приборов ГИС (на трубах)" + }, + new + { + Id = 5027, + IdParent = 4010, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск приборов ГИС (на трубах)" + }, + new + { + Id = 5028, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на жестком кабеле" + }, + new + { + Id = 5029, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на кабеле" + }, + new + { + Id = 5030, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на трубах" + }, + new + { + Id = 5031, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Закачка/прокачка пачки" + }, + new + { + Id = 5032, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обработка БР" + }, + new + { + Id = 5033, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование ТС при бурении" + }, + new + { + Id = 5034, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перезапись гаммы-каротажа" + }, + new + { + Id = 5035, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Приготовление БР" + }, + new + { + Id = 5036, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка" + }, + new + { + Id = 5037, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разбуривание тех.оснастки" + }, + new + { + Id = 5038, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск инструмента с проработкой" + }, + new + { + Id = 5039, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ВМР" + }, + new + { + Id = 5040, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Демонтаж ПВО" + }, + new + { + Id = 5041, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Долив затруба при подъёме" + }, + new + { + Id = 5042, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Монтаж ПВО" + }, + new + { + Id = 5043, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наработка жёлоба" + }, + new + { + Id = 5044, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обвязка устья с циркуляционной системой" + }, + new + { + Id = 5045, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Оборудование устья" + }, + new + { + Id = 5046, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка ПВО" + }, + new + { + Id = 5047, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перемонтаж ПВО " + }, + new + { + Id = 5048, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перетяжка талевого каната" + }, + new + { + Id = 5049, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при сборке КНБК" + }, + new + { + Id = 5050, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Полная замена талевого каната" + }, + new + { + Id = 5051, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПР перед забуркой направления" + }, + new + { + Id = 5052, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Продувка манифольда" + }, + new + { + Id = 5053, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Срезка" + }, + new + { + Id = 5054, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Тайм-дриллинг" + }, + new + { + Id = 5055, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Тех.отстой" + }, + new + { + Id = 5056, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Учебная тревога \"Выброс\"" + }, + new + { + Id = 5057, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Чистка ЦСГО/емкостного блока" + }, + new + { + Id = 5058, + IdParent = 4014, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт бурового оборудования" + }, + new + { + Id = 5059, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ловильные работы" + }, + new + { + Id = 5060, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ожидание" + }, + new + { + Id = 5061, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Определение места прихвата и ЛМ" + }, + new + { + Id = 5062, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Работа яссом" + }, + new + { + Id = 5063, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Расхаживание" + }, + new + { + Id = 5064, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - колокол" + }, + new + { + Id = 5065, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - метчик" + }, + new + { + Id = 5066, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - овершот" + }, + new + { + Id = 5067, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - труболовка" + }, + new + { + Id = 5068, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Торпедирование (встряхивание)" + }, + new + { + Id = 5069, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Торпедирование (отстрел)" + }, + new + { + Id = 5070, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Установка ванн" + }, + new + { + Id = 5071, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Фрезеровка" + }, + new + { + Id = 5072, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Контролируемое ГНВП" + }, + new + { + Id = 5073, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Поглощение" + }, + new + { + Id = 5074, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сальникообразование" + }, + new + { + Id = 5075, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Утяжеление БР" + }, + new + { + Id = 5076, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "НПВ / прочее" + }, + new + { + Id = 5077, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обработка раствора (несоответствие параметров)" + }, + new + { + Id = 5078, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "подъем ОК" + }, + new + { + Id = 5079, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ревизия КНБК/инструмента/ЗТС" + }, + new + { + Id = 5082, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка устройства ориентирования КО" + }, + new + { + Id = 5083, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка принудительная" + }, + new + { + Id = 5084, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка подъем БИ, продувка" + }, + new + { + Id = 5085, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск бурильного инструмента со сборкой с мостков" + }, + new + { + Id = 5086, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем БИ с выбросом на мостки" + }, + new + { + Id = 5087, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск БИ со сборкой с мостков" + }, + new + { + Id = 5088, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка и спуск ТБТ" + }, + new + { + Id = 5089, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск КО на транспотрной колонне" + }, + new + { + Id = 5090, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Отворот допускной трубы" + }, + new + { + Id = 5091, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Активация подвески, опрессовка" + }, + new + { + Id = 5092, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Монтаж, опрессовка ФА" + }, + new + { + Id = 5093, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка хвостовика 114мм (согласно схеме)" + }, + new + { + Id = 5094, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР к спуску УЭЦН" + }, + new + { + Id = 5095, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Активация подвески (потайной колонны, хвостовика)" + }, + new + { + Id = 5096, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонирование перед спуском" + }, + new + { + Id = 5097, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка - перевод скважины на новый раствор" + }, + new + { + Id = 5098, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка БИ с мостков на подсвечник" + }, + new + { + Id = 5099, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подготовка ствола скважины. Перезапись ГК в интервале установки КО." + }, + new + { + Id = 5100, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Смена рабочего переводника ВСП" + }, + new + { + Id = 5101, + IdParent = 4014, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт" + }, + new + { + Id = 5102, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск пакера" + }, + new + { + Id = 5103, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Запись гамма-каратожа" + }, + new + { + Id = 5104, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонирование спуск БИ" + }, + new + { + Id = 5105, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка клин-отклонителя" + }, + new + { + Id = 5106, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование и посадка клина-отклонителя" + }, + new + { + Id = 5107, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Протяжка подъемного патрубка подвески" + }, + new + { + Id = 5108, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем клина-отклонителя" + }, + new + { + Id = 5109, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Стыковка стингера с хвостовиком основного ствола" + }, + new + { + Id = 5110, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование и установка стыковочного узла хвостовика" + }, + new + { + Id = 5111, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение с отбором керна" + }, + new + { + Id = 5112, + IdParent = 4018, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Работа пакером в обсадной колонне" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("Order") + .HasColumnType("real") + .HasColumnName("order") + .HasComment("Порядок"); + + b.HasKey("Id"); + + b.ToTable("t_well_section_type", t => + { + t.HasComment("конструкция секции скважины"); + }); + + b.HasData( + new + { + Id = 1, + Caption = "Пилотный ствол", + Order = 4f + }, + new + { + Id = 2, + Caption = "Направление", + Order = 0f + }, + new + { + Id = 3, + Caption = "Кондуктор", + Order = 1f + }, + new + { + Id = 4, + Caption = "Эксплуатационная колонна", + Order = 3f + }, + new + { + Id = 5, + Caption = "Транспортный ствол", + Order = 5f + }, + new + { + Id = 6, + Caption = "Хвостовик", + Order = 6f + }, + new + { + Id = 7, + Caption = "Пилотный ствол 2", + Order = 4.1f + }, + new + { + Id = 8, + Caption = "Направление 2", + Order = 0.1f + }, + new + { + Id = 9, + Caption = "Кондуктор 2", + Order = 1.1f + }, + new + { + Id = 10, + Caption = "Эксплуатационная колонна 2", + Order = 3.1f + }, + new + { + Id = 11, + Caption = "Транспортный ствол 2", + Order = 5.1f + }, + new + { + Id = 12, + Caption = "Хвостовик 2", + Order = 6.1f + }, + new + { + Id = 13, + Caption = "Пилотный ствол 3", + Order = 4.2f + }, + new + { + Id = 14, + Caption = "Направление 3", + Order = 0.2f + }, + new + { + Id = 15, + Caption = "Кондуктор 3", + Order = 1.2f + }, + new + { + Id = 16, + Caption = "Эксплуатационная колонна 3", + Order = 3.2f + }, + new + { + Id = 17, + Caption = "Транспортный ствол 3", + Order = 5.2f + }, + new + { + Id = 18, + Caption = "Хвостовик 3", + Order = 6.2f + }, + new + { + Id = 19, + Caption = "Пилотный ствол 4", + Order = 4.3f + }, + new + { + Id = 20, + Caption = "Направление 4", + Order = 0.3f + }, + new + { + Id = 21, + Caption = "Кондуктор 4", + Order = 1.3f + }, + new + { + Id = 22, + Caption = "Эксплуатационная колонна 4", + Order = 3.3f + }, + new + { + Id = 23, + Caption = "Транспортный ствол 4", + Order = 5.3f + }, + new + { + Id = 24, + Caption = "Хвостовик 4", + Order = 6.3f + }, + new + { + Id = 25, + Caption = "Пилотный ствол 5", + Order = 4.4f + }, + new + { + Id = 26, + Caption = "Направление 5", + Order = 0.4f + }, + new + { + Id = 27, + Caption = "Кондуктор 5", + Order = 1.4f + }, + new + { + Id = 28, + Caption = "Эксплуатационная колонна 5", + Order = 3.4f + }, + new + { + Id = 29, + Caption = "Транспортный ствол 5", + Order = 5.4f + }, + new + { + Id = 30, + Caption = "Хвостовик 5", + Order = 6.4f + }, + new + { + Id = 31, + Caption = "Техническая колонна", + Order = 2f + }, + new + { + Id = 32, + Caption = "Техническая колонна 2", + Order = 2.1f + }, + new + { + Id = 33, + Caption = "Техническая колонна 3", + Order = 2.2f + }, + new + { + Id = 34, + Caption = "Хвостовик 6", + Order = 6.5f + }, + new + { + Id = 35, + Caption = "Хвостовик 7", + Order = 6.6f + }, + new + { + Id = 36, + Caption = "Хвостовик 8", + Order = 6.7f + }, + new + { + Id = 37, + Caption = "Хвостовик 9", + Order = 6.8f + }, + new + { + Id = 38, + Caption = "Хвостовик 10", + Order = 6.9f + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина бурения, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Начальная глубина бурения, м"); + + b.Property("IdSectionType") + .HasColumnType("integer") + .HasColumnName("id_section_type") + .HasComment("Тип секции"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("InnerDiameter") + .HasColumnType("double precision") + .HasColumnName("inner_diameter") + .HasComment("Внутренний диаметр"); + + b.Property("LastUpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_update") + .HasComment("Дата последнего обновления"); + + b.Property("OuterDiameter") + .HasColumnType("double precision") + .HasColumnName("outer_diameter") + .HasComment("Внешний диаметр"); + + b.HasKey("Id"); + + b.HasIndex("IdSectionType"); + + b.HasIndex("IdWell", "IdSectionType") + .IsUnique(); + + b.ToTable("t_well_section_plan"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_type", t => + { + t.HasComment("конструкция скважины"); + }); + + b.HasData( + new + { + Id = 1, + Caption = "Наклонно-направленная" + }, + new + { + Id = 2, + Caption = "Горизонтальная" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Blkpos") + .HasColumnType("real") + .HasColumnName("BLKPOS"); + + b.Property("Chkp") + .HasColumnType("real") + .HasColumnName("CHKP"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptretm") + .HasColumnType("real") + .HasColumnName("DEPTRETM"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Gasa") + .HasColumnType("real") + .HasColumnName("GASA"); + + b.Property("Hkla") + .HasColumnType("real") + .HasColumnName("HKLA"); + + b.Property("Hklx") + .HasColumnType("real") + .HasColumnName("HKLX"); + + b.Property("Lagstks") + .HasColumnType("smallint") + .HasColumnName("LAGSTKS"); + + b.Property("Mcia") + .HasColumnType("real") + .HasColumnName("MCIA"); + + b.Property("Mcoa") + .HasColumnType("real") + .HasColumnName("MCOA"); + + b.Property("Mdia") + .HasColumnType("real") + .HasColumnName("MDIA"); + + b.Property("Mdoa") + .HasColumnType("real") + .HasColumnName("MDOA"); + + b.Property("Mfia") + .HasColumnType("real") + .HasColumnName("MFIA"); + + b.Property("Mfoa") + .HasColumnType("real") + .HasColumnName("MFOA"); + + b.Property("Mfop") + .HasColumnType("smallint") + .HasColumnName("MFOP"); + + b.Property("Mtia") + .HasColumnType("real") + .HasColumnName("MTIA"); + + b.Property("Mtoa") + .HasColumnType("real") + .HasColumnName("MTOA"); + + b.Property("Ropa") + .HasColumnType("real") + .HasColumnName("ROPA"); + + b.Property("Rpma") + .HasColumnType("smallint") + .HasColumnName("RPMA"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spm1") + .HasColumnType("smallint") + .HasColumnName("SPM1"); + + b.Property("Spm2") + .HasColumnType("smallint") + .HasColumnName("SPM2"); + + b.Property("Spm3") + .HasColumnType("smallint") + .HasColumnName("SPM3"); + + b.Property("Sppa") + .HasColumnType("real") + .HasColumnName("SPPA"); + + b.Property("Stkc") + .HasColumnType("integer") + .HasColumnName("STKC"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.Property("Torqa") + .HasColumnType("real") + .HasColumnName("TORQA"); + + b.Property("Torqx") + .HasColumnType("real") + .HasColumnName("TORQX"); + + b.Property("Tvolact") + .HasColumnType("real") + .HasColumnName("TVOLACT"); + + b.Property("Tvolcact") + .HasColumnType("real") + .HasColumnName("TVOLCACT"); + + b.Property("Woba") + .HasColumnType("real") + .HasColumnName("WOBA"); + + b.Property("Wobx") + .HasColumnType("real") + .HasColumnName("WOBX"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_1"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("DeptmeasGdpMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_GDP_mc"); + + b.Property("DeptmeasMcrstat") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_MCRSTAT"); + + b.Property("DeptmeasRa33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33_mc"); + + b.Property("DeptmeasRa33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F2_mc"); + + b.Property("DeptmeasRa33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F4_mc"); + + b.Property("DeptmeasRp33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33_mc"); + + b.Property("DeptmeasRp33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F2_mc"); + + b.Property("DeptmeasRp33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F4_mc"); + + b.Property("DeptmeasSlvlMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_SLVL_mc"); + + b.Property("GdpMc") + .HasColumnType("real") + .HasColumnName("GDP_mc"); + + b.Property("Mcrstat") + .HasColumnType("real") + .HasColumnName("MCRSTAT"); + + b.Property("Ra33Mc") + .HasColumnType("real") + .HasColumnName("RA33_mc"); + + b.Property("Ra33f2Mc") + .HasColumnType("real") + .HasColumnName("RA33F2_mc"); + + b.Property("Ra33f4Mc") + .HasColumnType("real") + .HasColumnName("RA33F4_mc"); + + b.Property("Rp33Mc") + .HasColumnType("real") + .HasColumnName("RP33_mc"); + + b.Property("Rp33f2Mc") + .HasColumnType("real") + .HasColumnName("RP33F2_mc"); + + b.Property("Rp33f4Mc") + .HasColumnType("real") + .HasColumnName("RP33F4_mc"); + + b.Property("SlvlMc") + .HasColumnType("real") + .HasColumnName("SLVL_mc"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_50"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Btot") + .HasColumnType("real") + .HasColumnName("Btot"); + + b.Property("Bx") + .HasColumnType("real") + .HasColumnName("Bx"); + + b.Property("By") + .HasColumnType("real") + .HasColumnName("By"); + + b.Property("Bz") + .HasColumnType("real") + .HasColumnName("Bz"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Gtot") + .HasColumnType("real") + .HasColumnName("Gtot"); + + b.Property("Gx") + .HasColumnType("real") + .HasColumnName("Gx"); + + b.Property("Gy") + .HasColumnType("real") + .HasColumnName("Gy"); + + b.Property("Gz") + .HasColumnType("real") + .HasColumnName("Gz"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_60"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Att06h") + .HasColumnType("real") + .HasColumnName("ATT06H"); + + b.Property("Att06l") + .HasColumnType("real") + .HasColumnName("ATT06L"); + + b.Property("Att10h") + .HasColumnType("real") + .HasColumnName("ATT10H"); + + b.Property("Att10l") + .HasColumnType("real") + .HasColumnName("ATT10L"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Phl1f1") + .HasColumnType("real") + .HasColumnName("PHL1F1"); + + b.Property("Phl1f2") + .HasColumnType("real") + .HasColumnName("PHL1F2"); + + b.Property("Phl2f1") + .HasColumnType("real") + .HasColumnName("PHL2F1"); + + b.Property("Phl2f2") + .HasColumnType("real") + .HasColumnName("PHL2F2"); + + b.Property("Status") + .HasColumnType("real") + .HasColumnName("Status"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_61"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptsvym") + .HasColumnType("real") + .HasColumnName("DEPTSVYM"); + + b.Property("Deptsvyv") + .HasColumnType("real") + .HasColumnName("DEPTSVYV"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Svyazc") + .HasColumnType("real") + .HasColumnName("SVYAZC"); + + b.Property("Svyazu") + .HasColumnType("real") + .HasColumnName("SVYAZU"); + + b.Property("Svydls") + .HasColumnType("real") + .HasColumnName("SVYDLS"); + + b.Property("Svyew") + .HasColumnType("real") + .HasColumnName("SVYEW"); + + b.Property("Svygtf") + .HasColumnType("real") + .HasColumnName("SVYGTF"); + + b.Property("Svyinc") + .HasColumnType("real") + .HasColumnName("SVYINC"); + + b.Property("Svymtf") + .HasColumnType("real") + .HasColumnName("SVYMTF"); + + b.Property("Svyns") + .HasColumnType("real") + .HasColumnName("SVYNS"); + + b.Property("Svytype") + .HasColumnType("text") + .HasColumnName("SVYTYPE"); + + b.Property("Svywalk") + .HasColumnType("real") + .HasColumnName("SVYWALK"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_7"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptcalm") + .HasColumnType("real") + .HasColumnName("DEPTCALM"); + + b.Property("Deptcalv") + .HasColumnType("real") + .HasColumnName("DEPTCALV"); + + b.Property("Deptfdm") + .HasColumnType("real") + .HasColumnName("DEPTFDM"); + + b.Property("Deptfdv") + .HasColumnType("real") + .HasColumnName("DEPTFDV"); + + b.Property("Deptgr1m") + .HasColumnType("real") + .HasColumnName("DEPTGR1M"); + + b.Property("Deptgr1v") + .HasColumnType("real") + .HasColumnName("DEPTGR1V"); + + b.Property("Deptgr2m") + .HasColumnType("real") + .HasColumnName("DEPTGR2M"); + + b.Property("Deptgr2v") + .HasColumnType("real") + .HasColumnName("DEPTGR2V"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptp1m") + .HasColumnType("real") + .HasColumnName("DEPTP1M"); + + b.Property("Deptp1v") + .HasColumnType("real") + .HasColumnName("DEPTP1V"); + + b.Property("Deptp2m") + .HasColumnType("real") + .HasColumnName("DEPTP2M"); + + b.Property("Deptp2v") + .HasColumnType("real") + .HasColumnName("DEPTP2V"); + + b.Property("Deptrs1m") + .HasColumnType("real") + .HasColumnName("DEPTRS1M"); + + b.Property("Deptrs1v") + .HasColumnType("real") + .HasColumnName("DEPTRS1V"); + + b.Property("Deptrs2m") + .HasColumnType("real") + .HasColumnName("DEPTRS2M"); + + b.Property("Deptrs2v") + .HasColumnType("real") + .HasColumnName("DEPTRS2V"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Mclp") + .HasColumnType("real") + .HasColumnName("MCLP"); + + b.Property("Mfd") + .HasColumnType("real") + .HasColumnName("MFD"); + + b.Property("Mffp") + .HasColumnType("real") + .HasColumnName("MFFP"); + + b.Property("Mfpp") + .HasColumnType("real") + .HasColumnName("MFPP"); + + b.Property("Mfrann") + .HasColumnType("real") + .HasColumnName("MFRANN"); + + b.Property("Mfrpipe") + .HasColumnType("real") + .HasColumnName("MFRPIPE"); + + b.Property("Mftann") + .HasColumnType("real") + .HasColumnName("MFTANN"); + + b.Property("Mftpipe") + .HasColumnType("real") + .HasColumnName("MFTPIPE"); + + b.Property("Mg1") + .HasColumnType("real") + .HasColumnName("MG1"); + + b.Property("Mg1c") + .HasColumnType("real") + .HasColumnName("MG1C"); + + b.Property("Mg2") + .HasColumnType("real") + .HasColumnName("MG2"); + + b.Property("Mg2c") + .HasColumnType("real") + .HasColumnName("MG2C"); + + b.Property("Mpo1") + .HasColumnType("real") + .HasColumnName("MPO1"); + + b.Property("Mpo2") + .HasColumnType("real") + .HasColumnName("MPO2"); + + b.Property("Mr1") + .HasColumnType("real") + .HasColumnName("MR1"); + + b.Property("Mr1c") + .HasColumnType("real") + .HasColumnName("MR1C"); + + b.Property("Mr2") + .HasColumnType("real") + .HasColumnName("MR2"); + + b.Property("Mr2c") + .HasColumnType("real") + .HasColumnName("MR2C"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spare6") + .HasColumnType("real") + .HasColumnName("SPARE6"); + + b.Property("Spare7") + .HasColumnType("real") + .HasColumnName("SPARE7"); + + b.Property("Spare8") + .HasColumnType("real") + .HasColumnName("SPARE8"); + + b.Property("Spare9") + .HasColumnType("real") + .HasColumnName("SPARE9"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_8"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.HasOne("AsbCloudDb.Model.Deposit", "Deposit") + .WithMany("Clusters") + .HasForeignKey("IdDeposit") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_cluster_t_deposit_id_fk"); + + b.Navigation("Deposit"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType") + .WithMany("Companies") + .HasForeignKey("IdCompanyType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CompanyType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Contact", b => + { + b.HasOne("AsbCloudDb.Model.CompanyType", "CompanyType") + .WithMany("Contacts") + .HasForeignKey("IdCompanyType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("Contacts") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CompanyType"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdFileCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("DrillingProgramParts") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Faq", b => + { + b.HasOne("AsbCloudDb.Model.User", "AuthorAnswer") + .WithMany() + .HasForeignKey("IdAuthorAnswer"); + + b.HasOne("AsbCloudDb.Model.User", "AuthorQuestion") + .WithMany() + .HasForeignKey("IdAuthorQuestion") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AuthorAnswer"); + + b.Navigation("AuthorQuestion"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany("Files") + .HasForeignKey("IdAuthor"); + + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("FileCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => + { + b.HasOne("AsbCloudDb.Model.FileInfo", "FileInfo") + .WithMany("FileMarks") + .HasForeignKey("IdFile") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_file_mark_t_file_info_fk"); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_user_t_file_mark_fk"); + + b.Navigation("FileInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileCategory"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.Manual", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.FileCategory", "Category") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Manuals.ManualDirectory", "Directory") + .WithMany("Manuals") + .HasForeignKey("IdDirectory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Category"); + + b.Navigation("Directory"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => + { + b.HasOne("AsbCloudDb.Model.Manuals.ManualDirectory", "Parent") + .WithMany("Children") + .HasForeignKey("IdParent") + .OnDelete(DeleteBehavior.Cascade); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.HasOne("AsbCloudDb.Model.MeasureCategory", "Category") + .WithMany("Measures") + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Notification", b => + { + b.HasOne("AsbCloudDb.Model.NotificationCategory", "NotificationCategory") + .WithMany("Notifications") + .HasForeignKey("IdNotificationCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("NotificationCategory"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.OperationValue", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdOperationCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "Editor") + .WithMany() + .HasForeignKey("IdEditor") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanDrilling", "Previous") + .WithMany() + .HasForeignKey("IdPrevious"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Editor"); + + b.Navigation("Previous"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "Editor") + .WithMany() + .HasForeignKey("IdEditor"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Editor"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_company_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_well_id_fk"); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationContactWell", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("RelationContactsWells") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.DrillingProgramPart", "DrillingProgramPart") + .WithMany("RelatedUsers") + .HasForeignKey("IdDrillingProgramPart") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DrillingProgramPart"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.HasOne("AsbCloudDb.Model.Permission", "Permission") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.HasOne("AsbCloudDb.Model.UserRole", "Role") + .WithMany("RelationUserRoleUserRoles") + .HasForeignKey("Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "IncludeRole") + .WithMany() + .HasForeignKey("IdInclude") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IncludeRole"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.HasOne("AsbCloudDb.Model.FileInfo", "File") + .WithMany() + .HasForeignKey("IdFile") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("File"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => + { + b.HasOne("AsbCloudDb.Model.Driller", "Driller") + .WithMany("Schedule") + .HasForeignKey("IdDriller") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_schedule_t_driller_id_driller"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Driller"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_event_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_messages_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlan", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired() + .HasConstraintName("t_user_t_company_id_fk"); + + b.Navigation("Company"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.HasOne("AsbCloudDb.Model.Cluster", "Cluster") + .WithMany("Wells") + .HasForeignKey("IdCluster") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_t_cluster_id_fk"); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithOne("Well") + .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_well_t_telemetry_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellType", "WellType") + .WithMany("Wells") + .HasForeignKey("IdWellType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Cluster"); + + b.Navigation("Telemetry"); + + b.Navigation("WellType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("WellComposites") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_src_t_well_id_fk"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + + b.Navigation("WellSrc"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocument", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "Category") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellOperation", "OperationPlan") + .WithMany() + .HasForeignKey("IdPlan") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("WellOperations") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellOperations") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("OperationPlan"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Parent") + .WithMany() + .HasForeignKey("IdParent"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => + { + b.HasOne("AsbCloudDb.Model.WellSectionType", "SectionType") + .WithMany() + .HasForeignKey("IdSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("SectionType"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record1", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record50", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record60", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record61", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record7", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record8", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Navigation("Wells"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => + { + b.Navigation("Companies"); + + b.Navigation("Contacts"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Navigation("Clusters"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Navigation("RelatedUsers"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Navigation("FileMarks"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => + { + b.Navigation("Children"); + + b.Navigation("Manuals"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Navigation("Measures"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => + { + b.Navigation("Notifications"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Navigation("RelationUserRolePermissions"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Navigation("DataSaub"); + + b.Navigation("DataSpin"); + + b.Navigation("Events"); + + b.Navigation("Messages"); + + b.Navigation("Users"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Navigation("FileMarks"); + + b.Navigation("Files"); + + b.Navigation("RelationContactsWells"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("RelationUserRolePermissions"); + + b.Navigation("RelationUserRoleUserRoles"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("Contacts"); + + b.Navigation("DrillingProgramParts"); + + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellComposites"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Navigation("WellComposites"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Navigation("Wells"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/AsbCloudDb/Migrations/20240329070104_Update_WellOperationCategory_IdConditioning.cs b/AsbCloudDb/Migrations/20240329070104_Update_WellOperationCategory_IdConditioning.cs new file mode 100644 index 00000000..e539a2be --- /dev/null +++ b/AsbCloudDb/Migrations/20240329070104_Update_WellOperationCategory_IdConditioning.cs @@ -0,0 +1,32 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + /// + public partial class Update_WellOperationCategory_IdConditioning : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5007, + column: "name", + value: "Проработка"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5007, + column: "name", + value: "Проработка перед наращиванием"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 9957e235..bb2885e6 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace AsbCloudDb.Migrations #pragma warning disable 612, 618 modelBuilder .UseCollation("Russian_Russia.1251") - .HasAnnotation("ProductVersion", "6.0.22") + .HasAnnotation("ProductVersion", "8.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); @@ -63,9 +63,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDeposit"); - b.ToTable("t_cluster"); - - b.HasComment("Кусты"); + b.ToTable("t_cluster", t => + { + t.HasComment("Кусты"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Company", b => @@ -264,9 +265,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_contact"); - - b.HasComment("Контакты"); + b.ToTable("t_contact", t => + { + t.HasComment("Контакты"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b => @@ -312,9 +314,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell", "Date") .IsUnique(); - b.ToTable("t_daily_report"); - - b.HasComment("Ежедневные отчёты"); + b.ToTable("t_daily_report", t => + { + t.HasComment("Ежедневные отчёты"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b => @@ -442,9 +445,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_data_saub_stat"); - - b.HasComment("Кеш-таблица для хранения данных для РТК-отчета"); + b.ToTable("t_data_saub_stat", t => + { + t.HasComment("Кеш-таблица для хранения данных для РТК-отчета"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => @@ -478,9 +482,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_deposit"); - - b.HasComment("Месторождение"); + b.ToTable("t_deposit", t => + { + t.HasComment("Месторождение"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => @@ -548,75 +553,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_detected_operation"); - - b.HasComment("автоматически определенные операции по телеметрии"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.Driller", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id") - .HasComment("Идентификатор"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("name") - .HasComment("Имя"); - - b.Property("Patronymic") - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("patronymic") - .HasComment("Отчество"); - - b.Property("Surname") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)") - .HasColumnName("surname") - .HasComment("Фамилия"); - - b.HasKey("Id"); - - b.ToTable("t_driller"); - - b.HasComment("Бурильщик"); - }); - - modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("IdFileCategory") - .HasColumnType("integer") - .HasColumnName("id_file_category"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well"); - - b.HasKey("Id"); - - b.HasIndex("IdFileCategory"); - - b.HasIndex("IdWell", "IdFileCategory") - .IsUnique(); - - b.ToTable("t_drilling_program_part"); - - b.HasComment("части программ бурения"); + b.ToTable("t_detected_operation", t => + { + t.HasComment("автоматически определенные операции по телеметрии"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => @@ -651,9 +591,78 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_drill_test"); + b.ToTable("t_drill_test", t => + { + t.HasComment("Drill_test"); + }); + }); - b.HasComment("Drill_test"); + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Имя"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("Отчество"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("Фамилия"); + + b.HasKey("Id"); + + b.ToTable("t_driller", t => + { + t.HasComment("Бурильщик"); + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdFileCategory") + .HasColumnType("integer") + .HasColumnName("id_file_category"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("Id"); + + b.HasIndex("IdFileCategory"); + + b.HasIndex("IdWell", "IdFileCategory") + .IsUnique(); + + b.ToTable("t_drilling_program_part", t => + { + t.HasComment("части программ бурения"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Faq", b => @@ -728,9 +737,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdAuthorQuestion"); - b.ToTable("t_faq"); - - b.HasComment("вопросы пользователей"); + b.ToTable("t_faq", t => + { + t.HasComment("вопросы пользователей"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => @@ -755,9 +765,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_file_category"); - - b.HasComment("Категории файлов"); + b.ToTable("t_file_category", t => + { + t.HasComment("Категории файлов"); + }); b.HasData( new @@ -1155,9 +1166,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_file_info"); - - b.HasComment("Файлы всех категорий"); + b.ToTable("t_file_info", t => + { + t.HasComment("Файлы всех категорий"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => @@ -1206,9 +1218,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_file_mark"); - - b.HasComment("Действия с файлами."); + b.ToTable("t_file_mark", t => + { + t.HasComment("Действия с файлами."); + }); }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b => @@ -1235,9 +1248,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_float"); - - b.HasComment("таблица данных ГТИ с типом значения float"); + b.ToTable("t_wits_float", t => + { + t.HasComment("таблица данных ГТИ с типом значения float"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b => @@ -1264,9 +1278,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_int"); - - b.HasComment("таблица данных ГТИ с типом значения int"); + b.ToTable("t_wits_int", t => + { + t.HasComment("таблица данных ГТИ с типом значения int"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b => @@ -1294,9 +1309,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_string"); - - b.HasComment("таблица данных ГТИ с типом значения string"); + b.ToTable("t_wits_string", t => + { + t.HasComment("таблица данных ГТИ с типом значения string"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b => @@ -1334,9 +1350,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdCategory"); - b.ToTable("t_help_page"); - - b.HasComment("Справки"); + b.ToTable("t_help_page", t => + { + t.HasComment("Справки"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.LimitingParameter", b => @@ -1376,9 +1393,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_limiting_parameter"); - - b.HasComment("Ограничения по параметрам телеметрии"); + b.ToTable("t_limiting_parameter", t => + { + t.HasComment("Ограничения по параметрам телеметрии"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Manuals.Manual", b => @@ -1424,9 +1442,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDirectory"); - b.ToTable("t_manual"); - - b.HasComment("Инструкции"); + b.ToTable("t_manual", t => + { + t.HasComment("Инструкции"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Manuals.ManualDirectory", b => @@ -1453,9 +1472,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdParent"); - b.ToTable("t_manual_directory"); - - b.HasComment("Директория для инструкций"); + b.ToTable("t_manual_directory", t => + { + t.HasComment("Директория для инструкций"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Measure", b => @@ -1499,9 +1519,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_measure"); - - b.HasComment("Таблица c данными для вкладки 'Последние данные'"); + b.ToTable("t_measure", t => + { + t.HasComment("Таблица c данными для вкладки 'Последние данные'"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => @@ -1526,9 +1547,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_measure_category"); - - b.HasComment("Категория последних данных"); + b.ToTable("t_measure_category", t => + { + t.HasComment("Категория последних данных"); + }); b.HasData( new @@ -1608,9 +1630,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_notification"); - - b.HasComment("Уведомления"); + b.ToTable("t_notification", t => + { + t.HasComment("Уведомления"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.NotificationCategory", b => @@ -1629,9 +1652,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_notification_category"); - - b.HasComment("Категории уведомлений"); + b.ToTable("t_notification_category", t => + { + t.HasComment("Категории уведомлений"); + }); b.HasData( new @@ -1687,9 +1711,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_operationvalue"); - - b.HasComment("Целевые/нормативные показатели операции"); + b.ToTable("t_operationvalue", t => + { + t.HasComment("Целевые/нормативные показатели операции"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Permission", b => @@ -1716,9 +1741,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_permission"); - - b.HasComment("Разрешения на доступ к данным"); + b.ToTable("t_permission", t => + { + t.HasComment("Разрешения на доступ к данным"); + }); b.HasData( new @@ -2742,9 +2768,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_process_map_plan_drilling"); - - b.HasComment("РТК план бурение"); + b.ToTable("t_process_map_plan_drilling", t => + { + t.HasComment("РТК план бурение"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.ProcessMaps.ProcessMapPlanReam", b => @@ -2862,9 +2889,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_process_map_plan_ream"); - - b.HasComment("РТК проработка скважины"); + b.ToTable("t_process_map_plan_ream", t => + { + t.HasComment("РТК проработка скважины"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => @@ -2881,9 +2909,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_relation_company_well"); - - b.HasComment("отношение скважин и компаний"); + b.ToTable("t_relation_company_well", t => + { + t.HasComment("отношение скважин и компаний"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.RelationContactWell", b => @@ -2923,9 +2952,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDrillingProgramPart"); - b.ToTable("t_relation_user_drilling_program_part"); - - b.HasComment("Отношение пользователей и частей ПБ"); + b.ToTable("t_relation_user_drilling_program_part", t => + { + t.HasComment("Отношение пользователей и частей ПБ"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => @@ -2942,9 +2972,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdPermission"); - b.ToTable("t_relation_user_role_permission"); - - b.HasComment("Отношение ролей пользователей и разрешений доступа"); + b.ToTable("t_relation_user_role_permission", t => + { + t.HasComment("Отношение ролей пользователей и разрешений доступа"); + }); b.HasData( new @@ -4259,9 +4290,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdInclude"); - b.ToTable("t_relation_user_role_user_role"); - - b.HasComment("Отношение ролей к ролям"); + b.ToTable("t_relation_user_role_user_role", t => + { + t.HasComment("Отношение ролей к ролям"); + }); b.HasData( new @@ -4550,9 +4582,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUserRole"); - b.ToTable("t_relation_user_user_role"); - - b.HasComment("Отношение пользователей и ролей"); + b.ToTable("t_relation_user_user_role", t => + { + t.HasComment("Отношение пользователей и ролей"); + }); b.HasData( new @@ -4606,9 +4639,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_report_property"); - - b.HasComment("Отчеты с данными по буровым"); + b.ToTable("t_report_property", t => + { + t.HasComment("Отчеты с данными по буровым"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => @@ -4657,9 +4691,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_schedule"); - - b.HasComment("График работы бурильщика"); + b.ToTable("t_schedule", t => + { + t.HasComment("График работы бурильщика"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => @@ -4712,9 +4747,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_setpoints_rquest"); - - b.HasComment("Запросы на изменение уставок панели оператора"); + b.ToTable("t_setpoints_rquest", t => + { + t.HasComment("Запросы на изменение уставок панели оператора"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Subsystem", b => @@ -4739,9 +4775,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_subsystem"); - - b.HasComment("Описание подсистем"); + b.ToTable("t_subsystem", t => + { + t.HasComment("Описание подсистем"); + }); b.HasData( new @@ -4807,9 +4844,10 @@ namespace AsbCloudDb.Migrations b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); - b.ToTable("t_telemetry"); - - b.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + b.ToTable("t_telemetry", t => + { + t.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => @@ -5025,9 +5063,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_data_saub"); - - b.HasComment("набор основных данных по SAUB"); + b.ToTable("t_telemetry_data_saub", t => + { + t.HasComment("набор основных данных по SAUB"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaubStat", b => @@ -5056,7 +5095,9 @@ namespace AsbCloudDb.Migrations .HasColumnType("integer") .HasColumnName("id_telemetry"); - b.ToView("mw_telemetry_datas_saub_stat"); + b.ToTable((string)null); + + b.ToView("mw_telemetry_datas_saub_stat", (string)null); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => @@ -5122,9 +5163,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_data_spin"); - - b.HasComment("набор основных данных по SpinMaster"); + b.ToTable("t_telemetry_data_spin", t => + { + t.HasComment("набор основных данных по SpinMaster"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => @@ -5148,9 +5190,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdEvent"); - b.ToTable("t_telemetry_event"); - - b.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + b.ToTable("t_telemetry_event", t => + { + t.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => @@ -5208,9 +5251,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_telemetry_message"); - - b.HasComment("Сообщения на буровых"); + b.ToTable("t_telemetry_message", t => + { + t.HasComment("Сообщения на буровых"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => @@ -5245,9 +5289,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdUser"); - b.ToTable("t_telemetry_user"); - - b.HasComment("Пользователи панели САУБ. Для сообщений."); + b.ToTable("t_telemetry_user", t => + { + t.HasComment("Пользователи панели САУБ. Для сообщений."); + }); }); modelBuilder.Entity("AsbCloudDb.Model.TelemetryWirelineRunOut", b => @@ -5287,9 +5332,10 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry"); - b.ToTable("t_telemetry_wireline_run_out"); - - b.HasComment("Наработка талевого каната"); + b.ToTable("t_telemetry_wireline_run_out", t => + { + t.HasComment("Наработка талевого каната"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryFact", b => @@ -5352,9 +5398,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_trajectory_fact"); - - b.HasComment("Загрузка фактической траектории"); + b.ToTable("t_trajectory_fact", t => + { + t.HasComment("Загрузка фактической траектории"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.Trajectory.TrajectoryPlan", b => @@ -5422,9 +5469,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_trajectory_plan"); - - b.HasComment("Загрузка плановой траектории"); + b.ToTable("t_trajectory_plan", t => + { + t.HasComment("Загрузка плановой траектории"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.User", b => @@ -5502,9 +5550,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("Login") .IsUnique(); - b.ToTable("t_user"); - - b.HasComment("Пользователи облака"); + b.ToTable("t_user", t => + { + t.HasComment("Пользователи облака"); + }); b.HasData( new @@ -5542,9 +5591,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_user_role"); - - b.HasComment("Роли пользователей в системе"); + b.ToTable("t_user_role", t => + { + t.HasComment("Роли пользователей в системе"); + }); b.HasData( new @@ -5880,9 +5930,55 @@ namespace AsbCloudDb.Migrations b.HasKey("IdUser", "Key"); - b.ToTable("t_user_settings"); + b.ToTable("t_user_settings", t => + { + t.HasComment("настройки интерфейса пользователя"); + }); + }); - b.HasComment("настройки интерфейса пользователя"); + modelBuilder.Entity("AsbCloudDb.Model.WITS.RecordBase", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Actcod") + .HasColumnType("smallint") + .HasColumnName("ACTCOD"); + + b.Property("Date") + .HasColumnType("integer") + .HasColumnName("DATE"); + + b.Property("Recid") + .HasColumnType("smallint") + .HasColumnName("RECID"); + + b.Property("Seqid") + .HasColumnType("integer") + .HasColumnName("SEQID"); + + b.Property("Stknum") + .HasColumnType("smallint") + .HasColumnName("STKNUM"); + + b.Property("Time") + .HasColumnType("integer") + .HasColumnName("TIME"); + + b.Property("Wellid") + .HasColumnType("text") + .HasColumnName("WELLID"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_wits_base"); + + b.UseTptMappingStrategy(); }); modelBuilder.Entity("AsbCloudDb.Model.Well", b => @@ -5940,9 +6036,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellType"); - b.ToTable("t_well"); - - b.HasComment("скважины"); + b.ToTable("t_well", t => + { + t.HasComment("скважины"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => @@ -5968,9 +6065,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSrc"); - b.ToTable("t_well_composite"); - - b.HasComment("Композитная скважина"); + b.ToTable("t_well_composite", t => + { + t.HasComment("Композитная скважина"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocument", b => @@ -5994,9 +6092,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_well_final_documents"); - - b.HasComment("Дело скважины"); + b.ToTable("t_well_final_documents", t => + { + t.HasComment("Дело скважины"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => @@ -6083,9 +6182,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_well_operation"); - - b.HasComment("Данные по операциям на скважине"); + b.ToTable("t_well_operation", t => + { + t.HasComment("Данные по операциям на скважине"); + }); }); modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => @@ -6124,9 +6224,10 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdParent"); - b.ToTable("t_well_operation_category"); - - b.HasComment("Справочник операций на скважине"); + b.ToTable("t_well_operation_category", t => + { + t.HasComment("Справочник операций на скважине"); + }); b.HasData( new @@ -6385,7 +6486,7 @@ namespace AsbCloudDb.Migrations IdParent = 4003, KeyValueName = "dT", KeyValueUnits = "мин", - Name = "Проработка перед наращиванием" + Name = "Проработка" }, new { @@ -7213,65 +7314,6 @@ namespace AsbCloudDb.Migrations }); }); - modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("DepthEnd") - .HasColumnType("double precision") - .HasColumnName("depth_end") - .HasComment("Конечная глубина бурения, м"); - - b.Property("DepthStart") - .HasColumnType("double precision") - .HasColumnName("depth_start") - .HasComment("Начальная глубина бурения, м"); - - b.Property("IdSectionType") - .HasColumnType("integer") - .HasColumnName("id_section_type") - .HasComment("Тип секции"); - - b.Property("IdUser") - .HasColumnType("integer") - .HasColumnName("id_user") - .HasComment("Id пользователя"); - - b.Property("IdWell") - .HasColumnType("integer") - .HasColumnName("id_well") - .HasComment("Id скважины"); - - b.Property("InnerDiameter") - .HasColumnType("double precision") - .HasColumnName("inner_diameter") - .HasComment("Внутренний диаметр"); - - b.Property("LastUpdateDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("date_last_update") - .HasComment("Дата последнего обновления"); - - b.Property("OuterDiameter") - .HasColumnType("double precision") - .HasColumnName("outer_diameter") - .HasComment("Внешний диаметр"); - - b.HasKey("Id"); - - b.HasIndex("IdSectionType"); - - b.HasIndex("IdWell", "IdSectionType") - .IsUnique(); - - b.ToTable("t_well_section_plan"); - }); - modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => { b.Property("Id") @@ -7295,9 +7337,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_well_section_type"); - - b.HasComment("конструкция секции скважины"); + b.ToTable("t_well_section_type", t => + { + t.HasComment("конструкция секции скважины"); + }); b.HasData( new @@ -7530,6 +7573,65 @@ namespace AsbCloudDb.Migrations }); }); + modelBuilder.Entity("AsbCloudDb.Model.WellSections.WellSectionPlan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина бурения, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Начальная глубина бурения, м"); + + b.Property("IdSectionType") + .HasColumnType("integer") + .HasColumnName("id_section_type") + .HasComment("Тип секции"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("InnerDiameter") + .HasColumnType("double precision") + .HasColumnName("inner_diameter") + .HasComment("Внутренний диаметр"); + + b.Property("LastUpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_last_update") + .HasComment("Дата последнего обновления"); + + b.Property("OuterDiameter") + .HasColumnType("double precision") + .HasColumnName("outer_diameter") + .HasComment("Внешний диаметр"); + + b.HasKey("Id"); + + b.HasIndex("IdSectionType"); + + b.HasIndex("IdWell", "IdSectionType") + .IsUnique(); + + b.ToTable("t_well_section_plan"); + }); + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => { b.Property("Id") @@ -7548,9 +7650,10 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_well_type"); - - b.HasComment("конструкция скважины"); + b.ToTable("t_well_type", t => + { + t.HasComment("конструкция скважины"); + }); b.HasData( new @@ -7565,49 +7668,6 @@ namespace AsbCloudDb.Migrations }); }); - modelBuilder.Entity("AsbCloudDb.Model.WITS.RecordBase", b => - { - b.Property("IdTelemetry") - .HasColumnType("integer") - .HasColumnName("id_telemetry"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("Actcod") - .HasColumnType("smallint") - .HasColumnName("ACTCOD"); - - b.Property("Date") - .HasColumnType("integer") - .HasColumnName("DATE"); - - b.Property("Recid") - .HasColumnType("smallint") - .HasColumnName("RECID"); - - b.Property("Seqid") - .HasColumnType("integer") - .HasColumnName("SEQID"); - - b.Property("Stknum") - .HasColumnType("smallint") - .HasColumnName("STKNUM"); - - b.Property("Time") - .HasColumnType("integer") - .HasColumnName("TIME"); - - b.Property("Wellid") - .HasColumnType("text") - .HasColumnName("WELLID"); - - b.HasKey("IdTelemetry", "DateTime"); - - b.ToTable("t_telemetry_wits_base"); - }); - modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => { b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); @@ -8351,6 +8411,17 @@ namespace AsbCloudDb.Migrations b.Navigation("Telemetry"); }); + modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => { b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") @@ -8370,17 +8441,6 @@ namespace AsbCloudDb.Migrations b.Navigation("Well"); }); - modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b => - { - b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") - .WithMany() - .HasForeignKey("IdTelemetry") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Telemetry"); - }); - modelBuilder.Entity("AsbCloudDb.Model.Faq", b => { b.HasOne("AsbCloudDb.Model.User", "AuthorAnswer") diff --git a/AsbCloudDb/Model/WellOperationCategory.cs b/AsbCloudDb/Model/WellOperationCategory.cs index edba3581..5014ac14 100644 --- a/AsbCloudDb/Model/WellOperationCategory.cs +++ b/AsbCloudDb/Model/WellOperationCategory.cs @@ -154,9 +154,9 @@ namespace AsbCloudDb.Model /// public const int IdFlashingBeforeConnection = 5005; /// - /// Проработка перед наращиванием + /// Проработка /// - public const int IdDevelopment = 5007; + public const int IdConditioning = 5007; /// /// Шаблонировка во время бурения /// @@ -278,7 +278,7 @@ namespace AsbCloudDb.Model new () {Id = IdStaticSurveying, IdParent = 4002, Name = "Замер ЗТС (запись MWD)", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = IdFlashingBeforeConnection, IdParent = 4003, Name = "Промывка перед наращиванием", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = 5006, IdParent = 4003, Name = "Проработка во время бурения", KeyValueName = "dT", KeyValueUnits = "мин" }, - new () {Id = IdDevelopment, IdParent = 4003, Name = "Проработка перед наращиванием", KeyValueName = "dT", KeyValueUnits = "мин" }, + new () {Id = IdConditioning, IdParent = 4003, Name = "Проработка", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = IdTemplatingWhileDrilling, IdParent = 4003, Name = "Шаблонировка во время бурения", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = IdTemplating, IdParent = 4003, Name = "Шаблонировка перед наращиванием", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = 5010, IdParent = 4004, Name = "Наращивание", KeyValueName = "dT", KeyValueUnits = "мин" }, diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 63391899..501d9cb4 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -27,6 +27,7 @@ public class DetectedOperationService : IDetectedOperationService new DetectorDrilling(), new DetectorSlipsTime(), new DetectorFlashing(), + new DetectorConditioning(), }; public DetectedOperationService( diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorConditioning.cs b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorConditioning.cs new file mode 100644 index 00000000..9336fb27 --- /dev/null +++ b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorConditioning.cs @@ -0,0 +1,55 @@ +using AsbCloudApp.Data.DetectedOperation; +using AsbCloudDb.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors +{ + public class DetectorConditioning : DetectorAbstract + { + protected override double CalcValue(DetectableTelemetry[] telemetry, int begin, int end) => + CalcDeltaMinutes(telemetry, begin, end); + + protected override bool DetectBegin(DetectableTelemetry[] telemetry, int position, DetectedOperationDto? previousOperation) + { + var currentPoint = telemetry[position]; + if (currentPoint.Pressure < 10) + return false; + + if (currentPoint.RotorSpeed <= 8) + return false; + + var delta = currentPoint.WellDepth - currentPoint.BitDepth; + if (delta < 0.03d) + return false; + + if (currentPoint.BitDepth < 150) + return false; + + return true; + } + + protected override int DetectEnd(DetectableTelemetry[] telemetry, int position, DetectedOperationDto? previousOperation) + { + var currentPoint = telemetry[position]; + + if (currentPoint.Pressure < 10) + return IdReasonOfEnd_PressureIsLo; + if (currentPoint.RotorSpeed <=8) + return IdReasonOfEnd_RotorSpeedIsHi; + if ((currentPoint.WellDepth - currentPoint.BitDepth) < 0.03d) + return IdReasonOfEnd_DeltaWellDepthAndBithDepthIsLo; + if (currentPoint.BitDepth < 150) + return IdReasonOfEnd_BithDepthIsLo; + return IdReasonOfEnd_NotDetected; + } + + protected override (int IdCategory, IDictionary ExtraData) GetSpecificInformation(DetectableTelemetry[] telemetry, int begin, int end) + { + return (WellOperationCategory.IdConditioning, new Dictionary()); + } + } +} diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Specifications/Проработка.md b/AsbCloudInfrastructure/Services/DetectOperations/Specifications/Проработка.md new file mode 100644 index 00000000..91ddd293 --- /dev/null +++ b/AsbCloudInfrastructure/Services/DetectOperations/Specifications/Проработка.md @@ -0,0 +1,29 @@ +# Алгоритм определения проработки +## Описание + +Проработка – операция, во время которой производится подъем или спуск бурильного инструмента с вращением и циркуляцией. Следующей операцией после проработки будет либо шаблонировка (аналогично проработке, но БЕЗ вращением и циркуляции), либо разгрузка инструмента в клинья (снижение веса на крюке) – наращивание или отворот бурильного инструмента. + +Проработка определяется как время между: +- начало подъема/спуска бурильного инструмента с циркуляцией и вращением; +- разгрузкой инструмента на клинья (остается только вес крюкоблока и ВСП). При этом давление менее 20 атм. ЛИБО +- начало подъема/спуска бурильного инструмента с циркуляцией, НО БЕЗ вращения +Разделяется два вида проработки: + 1. перед наращиванием - соотношение глубины забоя и глубины долота <= 30 метров; + 2. при спуско-подъёмных операциях (СПО)соотношение глубины забоя - глубины долота > 30 метров. + +## Метод определения + + Признак начала операции = + ( давление >= 10 атм ) И + ( обороты ротора > 8 об/мин ) И + ( расстояние от долота до забоя >= 0.03м ) И + ( глубина долота >= 150м); + + Признак окончания операции = + ( обороты ротора <= 8 об/мин ) ИЛИ + ( давление < 10 атм ) ИЛИ + ( расстояние от долота до забоя < 0.03м ) ИЛИ + ( глубина долота < 150м); + +## Ключевой параметр +Продолжительность операции. diff --git a/AsbCloudWebApi.Tests/Services/DetectedOperations/Detectors/DetectorConditioning.cs b/AsbCloudWebApi.Tests/Services/DetectedOperations/Detectors/DetectorConditioning.cs new file mode 100644 index 00000000..0a9829f5 --- /dev/null +++ b/AsbCloudWebApi.Tests/Services/DetectedOperations/Detectors/DetectorConditioning.cs @@ -0,0 +1,92 @@ +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services.DetectOperations; +using AsbCloudInfrastructure.Services.DetectOperations.Detectors; +using System; +using Xunit; + +namespace AsbCloudWebApi.Tests.Services.DetectedOperations.Detectors; + +/// +/// Тестирование автоопределения операции "Проработка" +/// +public class DetectorConditioningTests : DetectorFlashing +{ + private readonly DetectorConditioning detector = new(); + + /// + /// Операция, попадающая под автоопределение операции промывки + /// + private readonly DetectableTelemetry telemetry = new() + { + Pressure = 21, + RotorSpeed = 9, + WellDepth = 152, + BitDepth = 151, + DateTime = DateTimeOffset.Now, + }; + + + [Fact] + public void DetectOperation_find_startOperation_notFind_endOperation() + { + //arrange + var point0 = telemetry.Copy(); + var point1 = telemetry.Copy(); + point1.DateTime = point0.DateTime.AddMinutes(3); + + var telemetries = new[] { point0, point1 }; + + //act + var isDetectOperation = detector.TryDetect(0, telemetries, 0, telemetries.Length - 1, null, out var result); + + //assert + Assert.True(isDetectOperation); + Assert.NotNull(result); + Assert.Equal(WellOperationCategory.IdConditioning, result.Operation.IdCategory); + Assert.Equal(IdReasonOfEnd_NotDetected, result.Operation.ExtraData["IdReasonOfEnd"]); + } + + [Fact] + public void DetectOperation_with_BitDepth_LE_150_is_fail() + { + //arrange + var point0 = telemetry.Copy(); + point0.BitDepth = 150; + + var point1 = telemetry.Copy(); + + var telemetries = new[] { point0, point1 }; + + //act + + var isDetectOperation = detector.TryDetect(0, telemetries, 0, telemetries.Length - 1, null, out var result); + + //assert + Assert.False(isDetectOperation); + Assert.NotNull(result); + Assert.Equal(WellOperationCategory.IdConditioning, result.Operation.IdCategory); + Assert.Equal(IdReasonOfEnd_NotDetected, result.Operation.ExtraData["IdReasonOfEnd"]); + } + + + + [Fact] + public void DetectOperations_Begin_And_End_by_Pressure_Less_10_is_success() + { + //arrange + var point0 = telemetry.Copy(); + var point1 = telemetry.Copy(); + point1.Pressure = 9; + + var telemetries = new[] { point0, point1 }; + + //act + var isDetectOperation = detector.TryDetect(0, telemetries, 0, telemetries.Length - 1, null, out var result); + + //assert + Assert.False(isDetectOperation); + Assert.NotNull(result); + Assert.Equal(WellOperationCategory.IdConditioning, result.Operation.IdCategory); + Assert.Equal(IdReasonOfEnd_PressureIsLo, result.Operation.ExtraData["IdReasonOfEnd"]); + } +} \ No newline at end of file From 69ec6cc765db04f798e3d5198a5796bdeed36171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 1 Apr 2024 07:54:57 +0300 Subject: [PATCH 48/52] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=80=D0=B0=D0=BF=D0=BE=D1=80=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProcessMaps/Report/ProcessMapReportDrillingService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs index dae4f39b..d4658f52 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs @@ -111,7 +111,7 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService .OrderBy(o => o.DateStart) .ToArray(); - var lastFoundIndex = 1; + var lastFoundIndex = 0; int GetSection(DataSaubStatDto data) { From 2c3f1de8a4633995d2248c874dae70bc934d248c Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 1 Apr 2024 11:44:03 +0500 Subject: [PATCH 49/52] Fix DetectedOperationService: Restore TelemetryDataBaseService: --- .../DetectOperations/DetectedOperationService.cs | 12 +++++++----- .../Services/SAUB/TelemetryDataSaubService.cs | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 36809ec3..53db6c4c 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -11,7 +11,6 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudInfrastructure.Services.DetectOperations.Detectors; -using AsbCloudInfrastructure.Services.SAUB; namespace AsbCloudInfrastructure.Services.DetectOperations; @@ -20,6 +19,7 @@ public class DetectedOperationService : IDetectedOperationService private readonly IDetectedOperationRepository operationRepository; private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; private readonly IWellService wellService; + private readonly ITelemetryService telemetryService; private readonly IRepositoryWellRelated operationValueRepository; private readonly IScheduleRepository scheduleRepository; private readonly ITelemetryDataSaubService telemetryDataSaubService; @@ -34,6 +34,7 @@ public class DetectedOperationService : IDetectedOperationService IDetectedOperationRepository operationRepository, IWellOperationCategoryRepository wellOperationCategoryRepository, IWellService wellService, + ITelemetryService telemetryService, IRepositoryWellRelated operationValueRepository, IScheduleRepository scheduleRepository, ITelemetryDataSaubService telemetryDataSaubService) @@ -41,6 +42,7 @@ public class DetectedOperationService : IDetectedOperationService this.operationRepository = operationRepository; this.wellOperationCategoryRepository = wellOperationCategoryRepository; this.wellService = wellService; + this.telemetryService = telemetryService; this.operationValueRepository = operationValueRepository; this.scheduleRepository = scheduleRepository; this.telemetryDataSaubService = telemetryDataSaubService; @@ -143,6 +145,7 @@ public class DetectedOperationService : IDetectedOperationService const int minOperationLength = 5; const int maxDetectorsInterpolationFrameLength = 30; const int gap = maxDetectorsInterpolationFrameLength + minOperationLength; + var timezone = telemetryService.GetTimezone(idTelemetry); while (true) { @@ -153,13 +156,12 @@ public class DetectedOperationService : IDetectedOperationService Order = 0 }; - var detectableTelemetries = (await telemetryDataSaubService.GetByTelemetryAsync(idTelemetry, request, token)) + var dtos = await telemetryDataSaubService.GetByTelemetryAsync(idTelemetry, request, token); + var detectableTelemetries = dtos .Where(t => t.BlockPosition >= 0) - .Select(t => t as TelemetryNewDataSaubDto) - .Where (t => t is not null) .Select(t => new DetectableTelemetry { - DateTime = t.DateTime, + DateTime = new DateTimeOffset(t.DateTime, timezone.Offset), IdUser = t.IdUser, Mode = t.Mode, WellDepth = t.WellDepth, diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs index e6fb372b..9bca69bd 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs @@ -129,10 +129,10 @@ public class TelemetryDataSaubService : TelemetryDataBaseService(); + var dto = src.Adapt(); var telemetryUser = telemetryUserService.GetOrDefault(src.IdTelemetry, src.IdUser ?? int.MinValue); dto.User = telemetryUser?.MakeDisplayName(); - dto.DateTime = src.DateTime.ToOffset(TimeSpan.FromHours(timezoneOffset)); // src.DateTime.ToRemoteDateTime(timezoneOffset); + dto.DateTime = src.DateTime.ToRemoteDateTime(timezoneOffset); dto.BitDepth = src.BitDepth <= src.WellDepth ? src.BitDepth : src.WellDepth; From 5bf30956c8983e8592cf58f41767246a67aefb08 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 1 Apr 2024 16:11:20 +0500 Subject: [PATCH 50/52] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=80=D0=B0=D1=81=D1=87=D0=B5=D1=82=D0=B0=20=D1=81=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D0=B1=D1=83=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=D1=89=D0=B8=D0=BA=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Subsystems/SubsystemService.cs | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index ed2571a9..a6b28866 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -57,7 +57,7 @@ internal class SubsystemService : ISubsystemService var result = new List(); var schedulePage = await scheduleRepository.GetPageAsync(request, token); var wells = await wellService.GetAsync(new WellRequest { Ids = request.IdsWells }, token); - + foreach (var schedule in schedulePage) { var idWell = schedule.IdWell; @@ -68,21 +68,15 @@ internal class SubsystemService : ISubsystemService var detectedOperations = await detectedOperationService .GetOperationsAsync(byWellRequest, token); - var groupByDriller = detectedOperations - .Where(operation => operation.Driller is not null) - .GroupBy(operation => operation.Driller); - - foreach (var entry in groupByDriller) + var detectedOperationsByCurrentDriller = detectedOperations.Where(d => d.Driller?.Id == schedule.IdDriller); + var drillerOperationsStat = await CalcStatAsync(detectedOperationsByCurrentDriller, token); + var dto = new DrillerDetectedOperationStatDto { - var drillerOperationsStat = await CalcStatAsync(entry, token); - var dto = new DrillerDetectedOperationStatDto - { - Statistic = drillerOperationsStat, - Schedule = schedule, - Well = well, - }; - result.Add(dto); - } + Statistic = drillerOperationsStat, + Schedule = schedule, + Well = well, + }; + result.Add(dto); } return result; From 27b67010d453714a12f64bd0519d07c4eada84f5 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 1 Apr 2024 16:12:15 +0500 Subject: [PATCH 51/52] =?UTF-8?q?Revert=20"=D0=9F=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B0=D1=81=D1=87=D0=B5=D1=82=D0=B0=20=D1=81?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D0=B1?= =?UTF-8?q?=D1=83=D1=80=D0=B8=D0=BB=D1=8C=D1=89=D0=B8=D0=BA=D0=B0=D0=BC"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 5bf30956c8983e8592cf58f41767246a67aefb08. --- .../Services/Subsystems/SubsystemService.cs | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index a6b28866..ed2571a9 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -57,7 +57,7 @@ internal class SubsystemService : ISubsystemService var result = new List(); var schedulePage = await scheduleRepository.GetPageAsync(request, token); var wells = await wellService.GetAsync(new WellRequest { Ids = request.IdsWells }, token); - + foreach (var schedule in schedulePage) { var idWell = schedule.IdWell; @@ -68,15 +68,21 @@ internal class SubsystemService : ISubsystemService var detectedOperations = await detectedOperationService .GetOperationsAsync(byWellRequest, token); - var detectedOperationsByCurrentDriller = detectedOperations.Where(d => d.Driller?.Id == schedule.IdDriller); - var drillerOperationsStat = await CalcStatAsync(detectedOperationsByCurrentDriller, token); - var dto = new DrillerDetectedOperationStatDto + var groupByDriller = detectedOperations + .Where(operation => operation.Driller is not null) + .GroupBy(operation => operation.Driller); + + foreach (var entry in groupByDriller) { - Statistic = drillerOperationsStat, - Schedule = schedule, - Well = well, - }; - result.Add(dto); + var drillerOperationsStat = await CalcStatAsync(entry, token); + var dto = new DrillerDetectedOperationStatDto + { + Statistic = drillerOperationsStat, + Schedule = schedule, + Well = well, + }; + result.Add(dto); + } } return result; From 96f171d6f9fcc9c4761a78ced9a071b6f57a8bf7 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 1 Apr 2024 17:03:36 +0500 Subject: [PATCH 52/52] =?UTF-8?q?R=D0=9A=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B0=D0=BB=D0=B3?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D1=82=D0=BC=D0=B0=20=D0=BF=D1=80=D0=BE=D0=BC?= =?UTF-8?q?=D1=8B=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DetectOperations/Detectors/DetectorFlashing.cs | 4 ++-- .../Services/DetectOperations/Specifications/Промывка.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorFlashing.cs b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorFlashing.cs index e6d8a0dd..f5d0add5 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorFlashing.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorFlashing.cs @@ -23,7 +23,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors return false; var delta = currentPoint.WellDepth - currentPoint.BitDepth; - if (delta < 0.03d) + if (delta < 0.01d) return false; if (currentPoint.RotorSpeed > 8) @@ -47,7 +47,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors if (currentPoint.Pressure < 10) return IdReasonOfEnd_PressureIsLo; - if ((currentPoint.WellDepth - currentPoint.BitDepth) < 0.03d) + if ((currentPoint.WellDepth - currentPoint.BitDepth) < 0.01d) return IdReasonOfEnd_DeltaWellDepthAndBithDepthIsLo; if (currentPoint.RotorSpeed > 8) return IdReasonOfEnd_RotorSpeedIsHi; diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Specifications/Промывка.md b/AsbCloudInfrastructure/Services/DetectOperations/Specifications/Промывка.md index 760d28cb..15e56d47 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/Specifications/Промывка.md +++ b/AsbCloudInfrastructure/Services/DetectOperations/Specifications/Промывка.md @@ -13,13 +13,13 @@ Признак начала операции = ( давление >= 10 атм ) И ( обороты ротора <= 8 об/мин) И - ( расстояние от долота до забоя >= 0.03 м) И + ( расстояние от долота до забоя >= 0.01 м) И ( глубина забоя не изменяется) И ( глубина долота >= 150 м); Признак окончания операции = ( давление < 10 атм ) ИЛИ - ( расстояние от долота до забоя < 0.03 м ) ИЛИ + ( расстояние от долота до забоя < 0.01 м ) ИЛИ ( обороты ротора > 8 об/мин) ИЛИ ( глубина долота < 150 м);