From 9723ee3b9e9f3296806168d8914f9f786660e479 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 18 Mar 2024 10:05:20 +0500 Subject: [PATCH 001/132] =?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 002/132] =?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 003/132] =?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 004/132] =?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 005/132] =?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 006/132] =?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 007/132] =?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 008/132] =?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 009/132] =?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 010/132] =?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 011/132] =?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 012/132] =?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 013/132] =?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 014/132] =?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 015/132] =?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 016/132] =?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 017/132] =?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 018/132] =?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 zcmeEuc|4U{8#ZauL}=tlGE}ByE>xnhqf*FRAyb>sfNi4^Arv7)M3ga=dDvS;M1#y_ z%si7}+cM<4*R!|kocEl6zJI^({NA5mZ;$6$Yu)R*ulu^Mwaz(#V_M3=u$*Bf0|Uc$ z26YO5l_w(u!@cDU4D1Xmmlzzjv%PF?d)ef)^CfdfBT*;(MV`2&OLjhDSOUNQ|Nr@a zI07HE%WdE6VI}Df98f0flpIV*PF~5C&t<^Zx8i{l&qg1-^YT^hZ9aOZwS|2TT8sIx z5nA`M7fmitNj?_J`dK#8N3(Gw^Ot5TQ;YCvuA(e%l^gM?ItdwfeWV_3p0u-b>C9Sj zEVuEzz$)GaKK`C%r&pcoeLY@LdrN)&0k81M-7zU!-q{w+^Eg^C3uh&kvd*`zK2{eO z-*x3}x{SI&sc)BaM*5Qq&vCM39`DB8VLA)ER(bukU5|{&iJSMSY&&Qr%#gVI)V4Je zUh7$3h;xkdSa`5S-m^7IFx+zM+&THy7nB`qC>8d)P5CU`NB3+Eid{ANZ1!j-%h+;=T8oO7%Ty{;{N7dsB_w*>!i{Pap1gXJTMjSYTo}@wen(azzN3ojo#J!U0bWeZhdz7chyra-6zVQ?&?k7{i-xDAr+?+ zo51(_xm!j5?TT4mQzmXf{rQ-_QJX3)tt0%mBA6cb{1}p5mRT6D;>hma9Dc;LcTeG7 zmZxWI#meKT;x80TKj~J=uzhNMIRjDn-;`-(p5KX5rWO)vE5k}gr;B2=thr|AU~}Hi z&IVPy#SCJEvIoEW|MowH!IjpjL8n1fHO<<<|i@AB_jnVFEH-?VdDmZT_ulczqr`e8=m z*@HI@+q>tu7i&7sDL*Gfj(bZxqwdz zPkM2ej8}Qs*_WKfX1F~~Qs>_FdDQLqexQ_}YF%%9!&!fWm$#^w+p0DGl%V;}h$*h) z%wi*^yUMOLdPlXKA6xxz2-?8^{^AoLT(@Nm3@iW*K+vDqi9h|`w&oy5%Z@RY3-|Gz zvQ{Z-->GT0;LmFl*XwBQP``Kl1no1Sz@Pj*aJ zYRbGqIDY%rk~IA{51EX*#8#D#NuMzprQY7wqW|J4iK8d;+Z3yY_#UUH>2lme)0!NLj^ME;)?3)PQYPwM^!|!@ zUVFi^vghpT(ZLMeR~y6Emg{`ysuX@Wyx(Q}*FJ5X*|cMIeCJ9BhRc(0Rvho9j@vlj zIy~5OaiG!D$>rUp*r!(C`kH+fZd8ReY||f`*Kw_ryw-6b>_B>3r%YSLwuWu*Q^w;8 zg~jwuSm1xV$0GK=kP7##y|Qm(OJmD@xBL#R%g3t@UHtr)Z*3Bz3RMHHo8y;+Ti!dLBz&3M z_t*pg`@f{vS*pNL2o1pNt*8mWAbr`=9B(d${S-%(IHcEN%c;UaKHBk@4qq@vwOTnY(YT75Vf|rys2M-evQ0+-UqNlM!>lJA-Mk@sjGy7h{t?yHkC9 z9mgamtzL>`cHa8jP&s9>BI9X>V8%@gmTy0H%`Kd%Sa;P|>4rx5adw+cRrza;SUO0e z5o1Lxwl56nw5hB+Dv=8<_K6EXmdiN%&!nmTs^Nz(Einbcx(3=0W zid-}H+7JD?(B`{ZLf3xmk2yEeIkt*Cjce!M`G~Jk@6aa0^dYe$1)gh6^UrxU7(P9< z>tl$;&Uaqs**>CP_9c}Ogzfq4f`75H-r%rj({tTddbrkGnYx~z40z)21X zOVRtQ9x845>1%RSQH>>5>JEq1Il(ifIuV}4je~+_9|ospAJysbh^;Gfx1avvV()Y* zbD_&}q4%*jOW>6Iu`5Cak!h{d72ibWhLZdVTmFNx0^hpJ|N2-z%oBd;eBTdsR_j-3vQIwBitqd8+lL#w zbdAmb!$U##4cC}rjZU>G`euI47BoF;d|s=6#Tki-eJbmZ?%+CS>ti>zuGFilML>CC zaAUuqxSw}(zDBA5?~$;}YR7T$$1HDpvW6vZGZt!s}j-Cn)pm}!c_t2^Ol&-nKk^Y`g`7=Ad{ z7FToPs6f=vgUhyYvO4$DoXS{E$VxXJi#zz1Ty~X5<=z#A9)W3{)JoQ|b@m6VeA>w> z&o_?L_<=EXelG#KM)soLmwo*EIvd|2K_EcgA@FU0R0!`d&6 z8nsBx)PSxLmvbI>iCcEu|8#jr#qu4y{f^wOIIv~=(W|05wQF=v-V^jTze|9%~W*da*Iy;SQ%|{N82$ zsigej5F^(=W8gwPHhQ zy4GCXYo)!>2Xk|7zK*VY9Ne}128W}NO8YCubC-BdA0x@}TD86H;=}8X`D-iJ zNe1^13XS_}>#eU#RZlXo-EpS$O4hQ5LvdSEN_J^e*DO0EE;4vbLgP%Kdhv~n-n4wH z-dvs&^6d}5<(T{Lap}+&I`HnVO8t{O8wZbtPmgCSlRn-iT=S6Eza%Oj8&!VdO^fo4 zvsGcyl20=kPj!jLq_1x;kKl{9Z4=5}TPBw0_Uy!!Cb_3W91hw!CqGFU<``Zqc&n76 zm(OzR){1jg8g|zEE-9)!otWMFmF!@_E*kJnbh2{~)Vl|Tl7_8cIdF{+HC(h!ue|lY zgI~|{kYJp2N~j^i_?eFFWe3d^y^nRS>ESlcZV7c(KWww=^Xv=?*oGu4$emd!a_N1u za%Dm*CsMKu-|h<8s+n*Szu$j$!hFpg`Gmkcu~($(XOtq)?*Cit_T%^BUPF;nf~Pxv z>o-SBbMwoN^kxA2KN7!M0nfnKzHjz$s8E@H9(E!G*WX%m_>>H9u68fe`I*M$O<{Mb z9P@+>F7sF2-Ipr6r6XtMlQ=J|yC+uh-rV`3H~hSA3iG{G?x6f14acJ&u1`4gLuHjx;RBtWyfV5f#v2_+XC{jeEOghD zS-87Qk5h^}dvmV6za};kt>EgmFx}~0S>#Tj#w_&yj4^Ign4KAJ>D|^wbe)^~J~fig zVlw*khwj3J``q{5GBNk*nTg`!91FZ>rAb@s{M>MpSla>jpOpDZmY7!J{K#0Ccja)= zkN&auPp`E#y3dWz_L{i=82>&}_PDR6tas3FlUR(q3$=a1Xj}WN*uuNbfd}R%+vkga zjLmO5py2wmeg*vUSWC_nbzx@0+k`x08PmG3qnPMI?PhVG>yBwX;5L)6cC3J9+X2_v zLGiwpjN_w43k_}VZgb-!*S1BD6ba83P!*@fw(XgF$}(Cc??#;KZ@Pxh?VT4>|7aIo zrjF%+o8>Co15*|z+-@!e>R|Wm;CRPd2kM;e0j>ja3p3xp_olZmxKFhO2FCpC zoG%DuSs0v>nE#SbiMujb@7<=L__ICqXZis$iBRSBv%96&+roW5&?F)v^a^#TsZ(rW z>U&L2o4o5q?IJhF#*t_eVPUv9hWjUppG=x<>CCYUjIrHvG`%S6^KldIh1vFrv1`uL z)1MuhOeUn01*nHyzckqC|5zA2-nc_`cg* z(KffaDaYCUVr?YFhf`tcCJ#sEisst_-N}ls)AN-wY9cO^-)6ThxVTNvkUx3~%oR{B z6MAOL0*4ug7ZhhF+ocl>1l#7jrza|j-zk$V{dInLtNzN?g)y7pk>gq8#<}|EW@}ba zH?`YQC`~4I6LD)7u9aFI=<94BuDp1s=v1D8`E1SZFcJCr(bLk}WfDy>#(4{eZ>#!_xqNs!QD8Uf zMkx*}J8;0p;K=)*jTbI7d4!HO@#OT64ZOWp!(4r#G;N?E=Vi{dG%=9{8-u;>Gj)F3 zq8E}rR#QXA#1tOS&&BNB_;Grzgw97<>Yb@D=dGqScUDVW{g^wtC2iMn(nb|#<>5v-BQhw8K)l4USRBo_!85Zw} zi`RG^6lCylXaDs_@hffwiC^l!o>;i5pPW=HPt&|VdGG|hT)sJX^5E(7 z_Z}^kYuIyVr`7ux@m)HC>MlI!WwSMgEUKnpUREReoLip8w#^goOZ4}uQSn6#*)$W#YtJzr*qo7=j+MD zpqV@_ev0aS$s?lD0jdLP!$o;pzBMt<8C)HX9k1BN^=k5S z;aB_*_m`wZFRWhUp%TY;hT*+WkmV9#wR~kxR&Ome?H$iwF`wa6zp?3g)J`AUS3$~b z^9Q-q`L+LgJ#6BUU#AC;cA-bv=#l>+^eFB161%hab~2B=a){%bVZyPgU0!LwGvqX7 zqR-bE9}jb>FG%TMVX-+-*jaRxz^D2$>QXJQ!wXgUFnNxJlZ|ET^crOEt0(7sXKfoh z$<}%_XQ3{XD?8uo>jAFr+#i58F+?5afL;w`6h%ScLju^ zj~j(T0Skpf>LnHw3T_k%0ty8c3kCK08wC^!0t&?l3PlTqf)B4vy~Hu_*B)$UjQ9Lh zI;OtGI;}sp_|j{5>2f(Q7Kqz?`76+Zb|(#ROXsct9H6NQM61BJm@??o;v9jM^0$w? zc7T(EWy<5rd7YPu6IQ&?ZYe&QXp^*U27O9fMXiwVJU&;!X=fD9e&;a6;UYHeOVqP+ zC)q~Pdd5b!uS*C@9yxcD@Lcu&QtUy?O@1G~R{BC|Z~V(b(VYLeP<|MHITZsH%nTNS zK*eIe^IoPdn%JljY>*&V7RrrEewMdk>F6N}^L_}kQWz`=z8at!M>tzAweA_3miOYc z&UNT1L-h9yZbfjXJ}>^;@E!W&CuFTVPoSV(ZT{OMWwtg$+MW&l*Pi|TTeLkxOIi0X zOIe)lzk%Z424GWrnoN*gMKKTr5HTMW;oam{;#huo?51G8H!TC2Ry-{3HE?n~2YUhl z`E&m@VaCktl>m%Z!@tF)ed^@&Xa2%GfElx$D8lo|FFdnDEYF9b9lOW^+~Ml@I@Jc{ zdrL7hAf29UmsvtNuF1133*3Z-^AaHTZ`;2(IrOoATWS=1AKNX>`zUF6edsu92M8ff z`TO=yz8v5VP?{%ihQEI!5b*9TuYK9XiMe+V7T@CkkNs~)590V>M>QWf!D246EM|0} zCz`Qm0m@7#l(r(y7|PN9h#?+8P}00#Qh+d6NVt7CDL$Ft#Qcxh{pW*4VE*x`zps-v zvHv9o+PwZqBos+i7ws!7M`M3#vLFU{yb&=#URUh2pTgoe=_sE0X0*`JGyM`;3-$n8 z%Rd9~_bq#y)fM}Vy93JrdNiYA9Dn zA|ePeVg!c2ZY1XX68|{AyY0*I+S^`8?i^ZK@Zv<@0}CH%C+13D!O>I4GQ*2k zt_YDo_gP1Z8|t*}Ua8nd#p>4;j?y35%T-k>_hXD=Lr6tTJ}e zH^d(o?>BII^C-<)Jap6d&D?DGOIxD(8~Y^WHL|L#-d(zxo!oH7_|-)x)y&tnPN9~M z+rLZJ9eKaKcx_|y6H{l#hW71M%iG%Z;`~1q*PP}gd9RVNOvw-IUN+?It<1URHq23< z_4p~gMj~22o17p3Vv+T1`Nv9Sktx3QbBd2?ol5Y=X{2arpYUf6A9!%y;u@>}GTDI0X)I@p)v z%}s*tim+$$tA_USUpKgL85igyJ+XUiD4I!>MbqpSTLItg_n!95@#Zzs`XSPS>?T3> zqTvmf;!l}4Fzm2t?8C8r;r|k<(PXI|kzEpI_6pY{g+G^jPBWCKwuE#nG0ekI8vj_^ zs*%kk=$=@3L*^~m9~kqq82cQ*W!SIxRvyFNJ7n-RjBoP?&zsCc*nm$&#`w3a4tCZs z*lhb*XNsShMS}7C4fn5^{yGU(I9IjhZ_SKrHhN)eTvB@M-2;YmzlN(4$A&xIbUj>n zIGE2&bfd3@%$D%z4GOwS<&%)VN^zc$AA={+LWe9} z@X~_ssr>Plq9v9tJ6+6gNGjk8Uph*t7&w^hy=67E;2+ay{AQMo$xyw`$z)0Cg+bU3 zd4a~D*`Qt8j&k4bOTlp4&twEHOli&>F;TL~7xIvTd1F zVX~&DGQ)M(yJ)+sw6 zF~ZOMv*u`U24NM0(Yk;OC_H8!C_J#46Q?r2w%kt5>4GILF45%AW_c2dlY_i!#*YBMDIAU?c%i=abju@Vxt9m zIVYa&jf!SmLCmO?xp8>YY9DEG8KcHz$1Ml4+-}K{U}nWyn_w#A3a^YOX#~&j2YRzv zw-3ZRkr{;=u|#7>d3ZxP>}DC-lk=C3qcC`g!NXB|dcvH%EcYr(3O`5oJW-`cjXx#-11QF-QwD?7d?WV;~;w;3^348YX@oL$}5I^G}SCgPu zM}rHW;Nh7s_KZ1xwZ~%wJocjrcE4i8+ONcxb<>4XSla0O6x_bl5>wM}o-6!;pQOoG0vk+fz*r-OFIU6xag z$%5^_tJPT6Kn#k~s;njhM=>X#j^2Y&lzzXGVUl;eU7?u0yj3%f%`7QUptp%bKc8!; zQXlw7$<}I{dmqfyQ5_M~o5Jj{V{M&Wte+#KXV{h;+w@(%a!nSA&p9yo;4!pB7ZZoi z2N6V6_Zl&XB8Ws8{sEEaj}SzZBSd)~NCS=8dnQ>zUZV6NmcL$+W(7!Zy3AOS34gE; zg=chV?b@NaX|JXN2a$Q#)94LEwKsAUNx8NM*FxGS*T~+EO(3tont%5yU}L$5hs&6- zTpO3&R-)Ps`4GW1jTL0i+L~KmPC-eZ3G#Fu2x-hI2|L#Q^!;nrG>SjjbFKyfgYS_` zC`vizrP?SmL%4T`j8-a9?oRrXOI|;<7gIZ%s2BkeU3Wz;F%Cs^bKL2vpeoO(*&U`r zO)kX>@8(Y(t4Ac<9VfcNIP(d7*|Jvg=N>_4la8II`whmqy`AwfQ8Pg|CG-)492r=` zXN?#{;^ZQO5X%|4un-7eVdTt0A&^b}6#}_;k5TC2pNM+IqwLaD`y;!Y29#Wqy*rGR z+>#M;SWhcxe3HS4hiTnLD%jN2stt41D(FOkMY*;CfVEURrN6sbqMm4ZIA9TAIH5_~sd?wtT6g%Be1@@EaYfb-7`D z545*wxR!Hd=5rNRqr7>ikMgDys8#zHZh&_$S)sIvONajD&n#k?#vaYY#1)p;$Pp2bVmzLE$vhtqO%=B!!nSdC47L=bLT3 zt4MGt_8U%~V@l0Sl-t+h)hXeq7PVGwuV9I@3an{T_;1OS*R8ES(yr72z1NP;s#*8A zW4fg9?NF|g#q`Pvl)ILk8t=YlD03DOD4Bh@==1K81sX^V4_}>Wm|1S}a_bVE%=QA^ zN;dr5NFB)AB0>n#;3hAFr~})pyxQ2OgyH7`i7HuF+QuFV&vH(Y>Sd;b>R6x0tpygx zWsWHXJWYbaaF6!z$y&0R)Y4Q-PLsw=iWgOuyPD)VY9CaX-Fks+rjQ7;{?1Q)elCVf zL$zkPNyqlOBPKyGXSC?r`UvUiAjL0_Kul|Jy83vZ2E>CN_~=^ha>Br-@f&XD>`m$B zFsIN|nF*fPVNMaxWZ>0PCe?1I-%_rgP8NG{!q9G`FL`O~d+Y7}k!5jW=UVG*0tNew ztKEdP0fc2|8)cx1eK*#9ul1|+tq{qQ6f7qgVeu*^`dB1^h_04t4SUD#MGk=)k}l+& z4w4>}u;X4Jpi!xE8{%r{4=TtdvMKGW&VM9ovu2+Qg z1kac&&M6%gcR=AkpT!|U9M$&XtZy1VosP(P^a}rINGuX?w0T0_?nQrBcNl66z@*BN zzfku$du7OXV{_Tzrb9Rpia$0MsG_|~^xF>1j!%tr=)F9yA7Q;?6sXn`i5O}=h6iAq zfI*UOGGO?abNb++6Tr_@{w~tg7-bF5XkA98ooirlmr*zK;Wi+3+Go`urJ{znQp-K5 z1CMXT9HOtI9^wn1T{7ZwAu$a!4_`Y;085$s&gm)kI*()c;Cra*sX3(^Ck-O4)jFu( zLz+^b&)Mai4$T!RqsAnyED)k(4We2&HGivx_Dp@6XB52U}@E zCscm()(T^++ z!q*`Jv0r3f8C60PvPte4HCkX$q@7d&4J1fIT8OJaLXv+^x8j`URiW*~P6F4s zF;Vzou#eaaExCfHg$-FB2*V*avu)QagC>HVF-^+uBA2LZ18dMi(5a}_nqpBN)dj3i zpr}6#E+<6o8oeSiVNB@$oMX!w55Zhtkz-z{h5}EIA#@fnAJBOG0-PSMMl6`H;|uD z4hWlXx=)9g1kV!vk3xcly6Ls>^~KN1eNdZWgTNZ^blmG4*mV1$x7r>nt`D=%B2LvBsc9dN;c;-uz>I;WEy z9t4AeCb`58!B*O5r=%jS;+$?1PHhy@j%+{EX{^+mvI*g)t|s0NE}^^s!msKD1&WTtxh9uLHxt@yLMWxP@c0TIa{0S4(RCPVh0ZBzmXxi-I<8-2MdOD*0D)$I zuhhDiQ)$yST!X=Qiw(rHv8#=dzU#{oLsrYU(U@g6)D^@c>6v+}O*$7+TClMdTkbZ8 z$u>zvV_S>Su2{>mEkHczIY#%FH3iy80p>1i4euTl$rB4-L@4wZuv1D^p=cu7sPTKU$bF!P zXmEkVy^6H*;!DZW#V<-TA`5lJ?leOFJuP>E3Wyp}*d|&*rLoMc8A{t{+>o8XGC$yJ zh=e$($=pzT0%hPdcq>^qZG3!sQ5P)0fp(4VT9!HpJ91r)T9WijTTOD-xg7L8t-N5 zZy^H=yEzM$@nGU!RDoQUL&czJltper#lOHs_^Tj`zO@z9QcMAix%zqNOn@+`6Uu_7 zb}`)R9D{x{49unz3wQG#!S{dGa72XGZNKM&GJ?%2wFif>Yb#iUP>rPx?95Hh)A$n# zX2ppbpdD14vPfnFbej0Tj>>OtL9z#Gwhod5RXwqnt`c?*1+OuZ=b#2XJ@YxV3k)4O zrfiHM8}pghgW@#aJktYG^O-)9leyNQd(x(ZjO8o`vkztZZwrnB)_QH%OwgBai#~rH z%EC7^HS6x#XHDI&-No(TfhW>IT9!d?wZ8iXu3U-i)4 zpl5E>{4LGe=&ylJkUCF>d;`@ONh%THeC4G2uGkG1Qy);AoR3 zFuVGIm5IIhQT{e6kIrxQ2&S}!T`biLkz#)-HlHZIKfz?Y$}f%SDR_mBZ)Hs~W1 zjI}V;MbSAM1kKxO@R_9z$JWU1zM`oQ_QXctM%Mg`V2g75IR-iFrgsn+H5jy7`>s=_79B=nRf)FY&=ke&Q3t&c`L9yHxkvjY##(egGzg923{O0v8SP# zz?9=Gq@)a{3;J-WCwk4057%QxbA!7`wopb@L2R6fwfnKxA}9< zOEK|J$-sEP!fRuZ@RWaxl;yql(}-tbd%?1TpL#EV)EBEZa-~7a0Ml~&65tQf{B*WK zW+{bgFO8N3wi5`=*=q-ZfnOu>+v)5RBMfUO&Mu`uyeyFTO+7IS|$GI12{a zXBXF(h0I-07a^c7v}hy?L7~O5M>|e8dfYgN4rTmZ3UawORVbEIWuu?an1Qx(ctv@u zjr&5+EtDLeJp6k(^Pb~Lw+6$`#Ry{xUQcyK+BhH+gp?;&1L1fLO)0eiRT)EBM+|^` z=}%YJ4q4I+bo#i-XsJRYNc4bZj1fx(`(;fKLs)PegD~v^g3l#l@=rm$1A2~XnYrla z7FKN^ZkCWd4Zqaq>}h@kzB@2PA5NH$2+gT8`Zc7Nu{I_%WE6LYw7W4M&kFJb1i+Di zL9lIRfJJ1nH~)dOTA)@WYlM&}etx_y;??DWa;gjzOEy8?`4z5-; z(56{*8uW_|m>dlALQM=Y z@Kg`Uw$#{vmJh(Ofy%~nRxFyI=$LKOjKq!npNRhQ1b* zQwZngF=nmwtT9cmh#JySfg9 z2-#mC9(9;l(P{16lm4;1pAZG=Ut%g5kqKhbsUT=KzCHsfX2KS;=R-M`B+wZl&@16d z$b-Zh-N;tdkD#p%l2bEbV@$i69tE;+kI^5nbvOg*gh^X^V8aG}AWyk<@WN1?EcDit z)ZF7s7zty-0L`oZSl`5cnFNTZL5L0Xt;JiiT$2=d%A<9-1iLYs<34(YhN2lZ2g6a4 zRy}GrXpUiF!$&0~IC;)C(R48q0{h)uP&WqIo=R&k5p}~v7Zo)QxVQhW4ZoLzNts^k z=!M20wGyvBr|cE{0nLH#HZas&sS&8GMbb#_0w%~{NGRn#WnF7j$*73ZvXj_}I$@XC zC`K3#ErPPMIUR<<=A=0rRl#J2I+;PXEY(T$<_91}6~~uRx(0e#s8=6kJ14 z`x>^Hpp6m_GL1FgNp&_9jwC>{LC(&hJ`3#?>h}k3C5wO)O$%u^h;4PXU=EH0S$q`yVh{m7FLcd8*ML{G9ot;CRvUCg zNklEjLp!>P`A1iTG4Tvr@rw!(Zw*xFlk@nWc^K1$oauD{7r z>67v1o_Oy}yD1SLOCUO=s*=UNLRVNH3I1klC%V%hHkRph^}yRDD-Oe%zII#Z5Nw8O zCX^xy2-3riGH$33kdvDoxpKfVDI}vncby{}a**pe$ zaBz0mXPA~535;g>a}R>+MsZU&Irdu?6SzPlqU#CB*p6EZ8W`5RjYf0_r`W(rCc9R? zJptbOI0rla9eA%~GZj;NhecK3D83 zvalC(8y%MEL=N*~^4xa291}9AUxx9KOSU|(rny!GjM#`lbPfV<67vx{*uCVOp}~c| zu;h7KbxxIMri2GZ7!jb<)wndXpmOg=%D558B=rlp3jrNi3%F(=HPHA$T4_ zyNPrvCWVmZyB+u!63oEqB7BZPqxQ&XL2jKl)a6!iA&}YuU;YZ(jcOS(s>sGkL^#d` zt$+of81)e_8?f`h%v^p^p6T5!JTa08X|%LXzb!xPb}wL?=t|sn5Sp3(D9LnQbjwAy z`FX4DQx^@)xXxz+3%?KAUziZ)GBs8pAvCfvh~!CAMAi~4yl@8r^*9(KHNZEKVupp{ zGWkIc0XjaD7a>JNa;O6dAvj!DgX6FoIF-C%ZAH3A%Z+|?3JQi-9Y~B9jh%}}4K1KB z+_2poh>~PsYk=;Db{!;Cf6#!+G=}03D5+C$>R?}o9_lv`@-PuLf?CQ#F~(-f(5;uP zK~&jKSLrTt3r0jkbi)^{n&0*-^=7DkBs>7IO@ZPMXeoNzv>(~~V6}tV#*P~_(cw>% zlU(&;OVW?7YJg(I00OoPEj}O6bq8pll0KDxbDdnXbHW&5fMXV`;c?Qi-3l7W05pdV z|A)dl=k$VG%1zVaYBi;cjZRlV12jPgRwgHqpi(P7Xg#j4Gs(ZwsPM!T^Z=z2Jn(gV z2M$!F28xC2j?pVCnzPW^4OG^eOe9QDBM)~J#*MG7MxHTp@e|QS76^4?s$DmRGQ=() zptHvEliogJ#{#IOg%cSt|Dm^v0hA1a%3~jUQ5+@gj?4jCAS|`vss*MC;S7^@u(UZ) zdx{Nh+h71#MQ{y+raET0pF$}_!wvD%8Vk7eF@ghd(rY0+I#G)nY&c8DfPz7d5*<%q2H__U*spyBK%eN%W*qOMy4FZATz{F$#>h%iV1f)1UL@Zv%s8fDz;aMW zsfQ0m1(8fi*xl7lJzbMnS@tJ^GrHO*8*Uo>YO2PDG?Dmy9(KQoz(0B==Ps(5D9^A9 z49Gwv#ba7b1l$O$bgcX2wDxulHRIk+JRn1JJ8{RrIuniidYXHTnU1v@a7}^ag?s;n=^o9 z0E7_Y*Hr1Rs9Vy2yGOt;jMo$-E|1-Xi#ez}hQy-EVrP+vbD$#CwRZBkpXyihMMjjOWKl@ZvLeOnL#wFQSxK=pbf@X`ZDG>{vq{%Gi{&9pBzc{!<*v~n4WRP}n0F5Y7 z2!ppRT<x6ZiTn*BK z!EK14$35ZxCAc6NyHP&T>MWe$p+g#jHkuMd;6Qmu>!N&hP>v1G!?rsD_rEu^RA2qNaPEx*@*`fRa3j`hf0Jc*&M^x64Zc$h2B4cw(Dfk&1UWN9GX*d@z*@-&)L<$;K<8F)h=$1#isp4dFY+3c0&JRa zn6KQ;3`{c1)|rYOvS_vnp&J-(kgg#D{gI@KeC()V$NTu z2%_VenU+BxtjJHZLH>fBXa&BpGE&n;1cfaYQc*1cZe&EGGh?R+Yv`TODHDZX&@|Im z8eNPS;_pm(m<>i42<8}NV*`-H4*M*VvMBZQ9-x?`6v=bZdk&+@O&9v%VscPGh`5jbuzoHdf@Ek+h6EmHo?o{n24sJYD4|g&)p_XP$(#Y-|xY;v7Q;(D9-KhPE zwPd}W))^;;u#>f!3s!L-O~=;UF1BjZx6+1^^TMv|?D&2mLCj~P*~(Z6NEydzE;_m{ z=c17L1LbIrw&qcsCVf+VHqa%S`@ufD!KNW{*X6r9n2`!MNuW796N}DKB+kN-x#-0j zX+ogmKGhV^`8(c4l~DPKt_p1)9(aNpc1xEHU8_b~d$WZ$%`{yQ?ejzj6>Nb%&^-YT zpF**Ki(de5;#{m<=LYp(rxy?H#3<{puVmjDyfA z6$&(33FbJ@@)6bIUqpx{w&o8P?C;5`+0`KLG=qi)F<`K|+GB_|gxOP9`6(vmVyA*>EJIol(G1JUeGf(c7;;vu+@HAm)T>;~g=^ zrjXM3F@A80@Ar`ED>Nf#*t$t^cQdz`oOep!*-c(c#Z?zJB#oWvd~mu|=w*j|QlYL{ z)z-64=>nt5cHbx>9|;fdQ+-bu7KBiJQ@_X*6I8Z3ixv|S%C0n4la-y*gU5~6$C1lN zJ9+$OFSz=&ld3uQ;jK*K3LDg%(^uXDLi3{fs*gktrQ8>no8;dwBGnxdLfyA(bi?-Q zCuC*0XBLTO_#Q5ccZ7#95&iOs_;KTVDve!k%rBje4a~Cz>&|TCZtyRkbW`h0t(H&1 z#`FwW`69bVyJO~pQ~G4CW>eaZcm8TEVkcV%`7Slw^zxPN#If$6fA#7OYfS^n%32u; ze+3~ey-Q(PcW&tD$EeQDtwIXV1`TGoj?z~#ns%UZ7g2(|RD2-vtJs!t^vea1%n~>CH<=aI$J%>~y zfA62IXw^KnfioAT(3lC66HRxi`x2bfvtHIfIGxjX^5HKOm3%ioS<&b<%Wu^>SSy<% zDR8Ao`P;K@LX9I=cW(4{|6aCEoL6DPu8)MY5Tmx*u$9eOmNm0zrzGp)!;6m|N~4$x zt+G0{l?E4axn?o731h)-5-&%CE&LR+mMGMXKiRfsG=#g%=9MN+Bh8Msb{b-Y^_gCI z_}h3moI5`0rD@O@wsZ7~_4a|t=+2#^8*Zh3914SwSyPKhng%XK@%B2MfIkGBt^0UO z8b8PdIGn?^!7}zAl9CZfIm&~VQYOMY(FmO`S2sNtw{lf;HEhV4Bb&0YZ9VLh2^ ziE4mKsZYDDPMPomykOrVX8F$+Xtmw>h32b{J|kh0N<#i>kPh}DZIN4og4 zPYp(nV|$Atv9m18Qi2RX>R;PJ4OJ|oPe~OKNbW}b$D5xYNRs(FO!xnp?DW`gJ&R$; z>S;nxsTpOZWLTdY(B%2((+EYB<2pZ$j@HWjMxZ>PVgnp5q6|x8q-Pj+Fklx2Ar3+C zWe1`p)yHHkQT~=;mG+PaA*qniYn;qS)$9L!9B9i;BdVx_=lC)f?(UR|C4d2Q;`-BQ!) zp|IcIPU@9ia!urK5wbUG!?^I&>XU6Q>{^*gh<0ay4SPbQc;uh`G2M^BP~Bj<@&f+9 zx5QM7=<~`52YCqa0~Gv9clG*uxK4I#H>8UF+C6}td(vnbV-Jqea!|SPauG`Tc&S(4 zjWt@C#V01{yae3ZD+}@5Zi6k)SO2L9X_1rPA_{tUo<;nYl}&o z;g`Jv#eXvSN!s*wJBx~w*yE?MTdWJbpcDjzvr105D`NFhK)FWSAC9 zKq9aw$2edGanj%njT`lEXZFhlj2oYPM@#beRB8D#IP9jF$iK@cUyyq%S-`x5jFxnmS(@UA`ah$>p``s z+KpN15T{Z*q2}}Y*u-Jcjc)7qI19RPr7=1p;P1!3ffTZ0f3_7?obZ-VR3L-z&GHnx7Ihz#O-9&$8U1v_$?oot(V{BW-Tg{xQeh^f}N zZ+6vukn_{*3!gk~%%5tEgz@-gQgjkfowz1m{e+6^TWi$za+W^>2>|h3y|VA%r(5S5 zEBj%x-?Ae+6ae=W>?tq)rO6H9>L;`Os-`e>A5h$oTY0l=%Io92%8e!H!{wxV)ezQe z;sZ^6To#%W#x~|ulD6MLc>3sWX8Dg}RZqxWqDLB!kj+}HlJfGDN5X2ot42k5l^uPe zKzcMVQ1}JXKLj5((c%s(NS7ZCY0lZ`OSA#VC>@pe%gmCTX=U{z`UQ55rrp1g#XNeY zbz3RX21$^3bHtyLqn=>{m5dXb`WpUf-K2W&E0EzUmt;?BjQB^jyzQ8I;;hmH^&+!2 zDtll>hy2&iP*uC#%2Q#pa_#a>&O^LnQEjwu%{Y7?l5cu+rFFwYWCFzA?JD^sD(=K!y+@O_g3R$`F{?i9Y5~|Op0j?^ zc`{l(Q2iy-Cu#5Iz0mF4`Un&b&;sl8qh?hPmNrREeMG!3j{uCe*O$niJIJVKzm}m% zs<~GQ1mMU0Rh|3rUkTV_Uf5JnJ4z#+GNfCwg2<6%9 zB*88rE~?&o7Ry4($s9}05wt|d&KE)1*6S02^OrIjAm0AtO%z)d{E}-5JVH}z;pXjC z&Q>AyB)hS-g;!y+C_21&2iVJa4fo@l{~-ZEGJ^~<*k~nz%J7i`R-jfv1!0Pl_9m?w zG|M;!NOaLMwJXa2NRAip5@70-4$`<3l^%L_=c5Z{6zay4s;1S`K|1A)lWxok&p3lI zA@WHCa)Cx%uFPMaO_D%!PUoW0o`SBL0ZSW}Leo`9!W;+PY%m3B_$7rFOzfi&Yn5H; z5bKvUTBi;afoY0j3I$v)0O{BwnK7|nJ5jcE_Q@}0?5~D)NzjEUu$;aT_M%wbMtX-X z5F4y;sM27dn5nmm<+}Hl2$89{B|_wk?xbTajtrFn0o4(4sRmG3v)EUGaAqgS? z;LpY2gz%Z!?*>>p`3_>r*8OH9zIYyC$u>$Gy@YVR6+q^}$T=VHaL$jG530g3GfWOi3kZ4 zb?av<+$d7aG+ZNr>Efl%9ekn447#Nn)GZAf98Rx(P>bqz2ha&tMlfBQS$n@%t91~4 zGtth4R+dn(p%IKijo>pomjHIFRJ@of;>XzwpOA{mvK3Vu4FiE>*ak{S2n3P}=)*(8 z&srjM>0fPrkm}|EwRU~(;5js{=A0gF)yO=Py#Qb6?Vf6&31=zB{8ae7bvN`<*dF!+ zbD}&mO)n**3TiL9e(BJ9D5THf#t&NPt3jk&AUv_T%QK-;P>l^X+DK51rGS+q^2`Ji zpOivdNTXJeJg8~JG*3U2AWV5JW)n#8%y87mKt0cFc{Y$o);@5s&0uZSgVTsk#!0A@ zU`&LXQ7E<;{E_hUeKRcq80Ymb0|p&K-$erIA*3*?f4ST0gh{MdNhud10%<@QzydJ? zGlla;XHn)2kf@tm;c=rE*$i|qCPxOjtWrO3l$LEILdUGaAE<_DUOCit4TW&J0BA{Q zR@Ja?tdFyrFa?XHx*iDedmD;?L3#b^ZRwd+iROzo^gQg2Z>sF^t)LbykHJq=YFkm$ zK-+E_sibO*#DWT`w1)zLNM8P{Qmu?anH7ZH5pj!?;PCNMB#D3LB+`ub3WxcrADhK| zl)q{=4XelKGhtAm0T;<0Ao4|~eiY9c3QiK zuCYtaW>BtS8;Mje;uI9`MO4}z8^B~C;y1QEXCI556uqd&-M-?o&I zpuEvv?YYroq=#j`BR!11$nhKYvk`gNI7vouPBDc%NQxXQ)9*ff*jJ#Tn*KtR|LbqmCR$248B*e&#Mm0`Ugty}o@Qo!Jr-9HF_5DPdIj!~fV z2t923fRez!08hyfGH+RA4dwS|7u$(EyO-%&nKTy)mD(!9II1y3;Fp+KR7P~k0L>?u zH`BCTFx~qP(L^JhlPN?4Dq0JY(zNLsI2pD$U0f^l;?r_=n-AAJMip#MYk@)S&f>e% zcjs)%9Kw`xo55-oJle3@oX{hV%;)Xb-bT}MPRBX-lLo;x3<^~N^_eM*$+(B#d-u5Q z{YWrE>p>nDCRp!a;ty2ed{6=?4l1f-C)?2AsbG#AGlu`l2u!L5nN&Dvl;LZsn401) zZ3EbiVa5l{cOY^oO!!`@J{2c<8Yxv)zlr!BxUo5f3w;HT@%-^b_seLQ~u+;{hVb&c~pkMlU5 z$MZN|=aWKY_b&n~_w^N(Y1@=1nn`ylFGin}f`sM5dPGjkdJs2bdNb@GPGfS6^-N;0 z;(;CL!O22HRscvo?w~Ef#h4RP*oc>~P=p(UNct?cGtLs2C@}M7>N_(X;a4$}+DyKG zpSPv}Ts3zv4SNA+forFzIt3bo)6V29WZJ2_=Y(ju=Rx*WZ49sxct}W7wACWxDcmDb z{8{h$ny~|JA@Nwr3R5}pRHu*@8xN!W2c7Rh;9fzD(8DePNXM-#;9!yW)ph? z?;)~><_h3}+P+sLS1H@ojec4#hCH-mKhMs%r7E|VXzqxIh@m(!2T>Z#-T-VwNUMNJ zhs*}JXo{!6g%=|nbp!H8=Mrg(&G`>uoQz`{V=ou!{c^O0#P&g8t|eZhHKDyguGdMd zNzAM{^62BQRq-yr0}c5=>O;_$sL4?~JO|0XXf$caVd3|EZuo&h59w%1Je)4?F)HI> zl9cAv6Aaw6hXbzoXV6qYuOt$#SJNTs6)(mD%-7HYhvEp5x_>5gG1LyoB{YmlmtA-s zQL|C!KvG_6Hb}ZmQHFrp7nLV!@25WSZ`ua(1X4Rd%oQCr7YJ6uXU79U2l>P2Z_EfF zB1IrfUq`df#xGF_7$sdI{3LP!7Bjtkd^=9 z1=W-4J_hYskcFK#q1PJnk8?3!wn6gvb|*4X#OrG24sr$B4HO7Tl%ASW;uI!XKAn%Q z$dH}ZrJBB0r%EvG89$AN5qe>9p(hY1J4{^)lYc3P`ww8H?4H9hU+QQDAsCGoAs&b7M8Y}&@br+pghO%? zzVD$$@H$wstX=GTfC`0uSo`T|yN*%&bwu@YB6AA`;raGoW&r6ihRLOt`{HquN{G4w zH3-}BNlx*Kitia*jl&LKl;1$&3J`s*=XT(JF{h$gXOiKet@F$FDy}D%X%G3|pP4&J znI*N7_m8i1q!LuTMSu2OBxa7eT~*4mJ7fTnE2rA%us7vx*HRS9x*3|t9XlF|erws# zGATa~*q%a+PRZ@)p)LT;N{}6(UE=cyMuDJ7Z7zeyxmy42iZ=M#KnPkMqdOHz1cdWr z1Lw|{m8Ug%vl+qQK@Dt>X4UFUQ`!y*y{{i|ccN@<6b586FL5TozbHkZ*BYea`mls~%u% z8h9W9FHijKf1gW34BZc1@vx~v=fEg8^r!X#D`SG0jPy)<0b!_hY?^^pAowb+4C0U~ zz-bfjfmsVo_EAY>p>sH*k{w&}caMEf}Hi2BAGtPw(OiU&|k`##0B{eVr2!daz z0Z0rpRG0eu3RS0h8o!fG6uBa6+c)un2xh#t*&IDxF?U8W|247oL3)PoUuM+2AdGBW zVYt40lG1H}uEXrAmd5M=GL&{Yo(g+pE^8!%h@mi2i%Y_-j~${$oXYL6zBqu?3RAI$ zdLu!#O!EB;0U!$?FYDlf00t}$=E`M^vxZvQm(2W~UPNedywwA$%rZ}~gF{`S8uo)H zW%h_B7Mos{@b=^y*_* z&1Q1PPf{3)L!e&Em`UO3;$6UN5z^WQ0kihXy9EFVk$x+n-uFdSPjn7&)=v#3y2Y*T#ZiCrt6MC#DCp#~ecl!&@-VX# zR!)8S?1egMd{GbV1!|qYS4YRIF{R}Z9MHk!Dy-q>8mD+baa79a4`vPTjQ3iIq(47_ za0qK5rH_U>&l==uVNU{M1MunfAXoDd=?u&zdd`3f5 z#Vl=t(Gds;LH!Q6Xjn`>1;RQZg#UVCUuNSp-rj;h6ckp)+UGXfMUDXc^ZUcJZP2H6-f3|L}f7&Jcz$(@(eJrX}tvCupo z02=1X8C=M}1_T;AeYg?1_#MU2of@+UArVv&y+fa_bp_#L5!nS22cNO&;#I<~<*&5^BTZu@hkgJT0pv4Hq=&yhb&(=w zxF;h&p*gW+r#XORDZQUqi^5Mm+M?+7zMz6_Kg6sp51=VvImM%sb_qFf$xuG@KR!Un zxO{}qgo)HaCej4*@ly*BX8!5ua79G!F1^eIT0D^Wtx~|UB2XqY-=y+zmIya3e9Z33r8c-jF6u-48r zdg`(10^;0BsP7SK5x*!6VJGm^r}5S9$uyHwzpPWakkGLLurix^G4!kjf|PVqD96Cu z;`k}Dfv)gTaENXup=Jlm(mk`B0%V4yi4}+CuonI0pD;?`UyhFW4R=S&Hw1j5Ij+YZ zfsiUDNeienvNZCA-*3m@`GGK}c@#{>gchj}%4L9GK-Q`zeyIw3$9u>o5KYl`HH#2kODV%^{-T(6jop%I3dKyogb%K&3!qkuYet5#2_sRzR>aFBlowx z9Bv{6yhO3ewpGlW0Bo@S3dMDW8wg5PZ{YrPA_3vIy?KGHZ z3U307j2KVE?Kjm)9vVcN4G_doR57XjkIp6;eT8Dz#=OW%tUX5y03!}G=zU(=gKCzQdQarPd7}2P=hH@0CS*!6*w{8BSN)UziOrW%=9Fm~o-z6zS#ZPpXo($BOA1#ga@uAS3VA? zH|(m5*t>*%BYF=^3?bhoM0R+`X-T?;jjGeVdNN2=&HVrlQQd2F-G%N+g1QU6u9QJ! zK(+u*$J%A*A5)=HP{jHG2Lov?9Uu6r{{GE^h~Uczv9@WFh9XD<%Ls3koQJ ziWgdjO#T=UOe6&2fRPDDv{2)vxaA|$892_fMey_ zW@7dQDufIWc{D8oHW*qBWMm;g$apd6jOrM;)E2jKafGQJgi^FFaFuWtk=J`s#jWhms3cA3(V##l z7wnxgn=}uvT~H@^_Y>0_Ec!iwuNEfnWzhSuuRJmrSoT^j#vOwk6Zi@cp|f1QeR30vQTT9oVW6W>c{qLMt>`6k`)v z(I8jJk^8L!2w}V95CeB$Lz*KL+`c+r-W$G?8JB7W2ZJVU+z7(TDgsFtI<`pPa ze1;~9>t-|`4OBLO>p`yW4?%j7{w7D<`Wyn+ob!eDo()JWe@2HG1{v3M;m6@lDO};L zPC~K~NAn6q^?B{T>q9HWz0-NX2Ie(oc`Irf%LBXKoMd#kEz5^d_x1k85UR^!6z?vB z%)JarEz+{6iq&ptp!kLH74s=U*dJgyz0!8c6!Z2w;DO5^O&c_PrmZ-98W6m#4cihQwC~1UJ&yeCPikKXe6kX0L4hMdTlfFLdY%vPD1Mx6cPw?S+>k} z=VR~!{{!tz1f&4?XIe5gdLoV{{Y*457Q&=P|KFf8B%uJ6qg8UC&FNBt*BgCcGNz8w zK8ldK;`eE4ujCxkU4;a!6J3+WmtkfVh<(2kBD6^^z<1p&=4}26OhFL`QPu2DAZ8>t z%_i*@&;npUzT)}={sNPgFVV}>P!RSgn!FU&tDt8OXBSJ;K;2+5D*6poMA;EJe?;$BUduO^NkK^+XZm`5kt zXc!9;BByBtsy~1<3GsKY7_xLE5EVdh>p{AfdL1?okhZc&I6_QhD&QBWeF9hf7^rO$ zlQ4fT+jBb)nG?4G z=eKYb+BJyL7(ICdmZqbwg9I zKh_0}+@ZWl4IKZu37d25sVP&UVIb~`Cbv>p3oJDNVMW({ap6g&MHB%%c<9C7v%E=$ zhrzIHw0whvMk?LqNEtjdSRsoF94j_^)*;P8ksUxG9ug^notBT>q5DckCJuqJ%qebTK*_km&wfe_~yy78&&sjxQMhBAteX?H>4S;xWmbPrb^6sO1* zvTL|r1(DS$j*g@l)cY&qHLL^M~w%xJV zOri@Zg_-0`XuiTcUEHlyT{z}J^3MGbNeN93R>+008+mtVLh6MEQ!Z%2gkBEv+9EUP z(}3s%RmHk;f22>%zW~UD4HGVZgKqTXBwYrZq!g&8$Y>ZIjrNXFO_9WjbQHgUufeIN zyDTNp#XuyxaA~##WlGRwNia9`U*g(g`H3)jxHYl47~3MFm|EDcG@9~^ok}d&1wtDm zsS;D(WfWABP9|NFY3$rjk~~0_RF{913Xp%)PXKtFnE3Ie8-@lBza2+24e$!+@E&%9 zjowmw=|(dE#rV-r!YL*lXW>Kq^wOT20dKKI3;V3rbLl{f))X(wb};r~)4-ZQJz)Jj zCL+4MH2VkLRz$4J0IEw7p{B@sW^lOz&3p}t4M5vIB3)4PKWHy?1Q)ryaEI4>K*7KH z72PcmrzpqI ze31Ed_#1)rfC7BuR%1%D&5#>>gYe|(D@MD?z&DUKqXOvJ=ha+8 zca*794PKC8VOtcg9nIC}2=4aSjZOpVg7)>;kq#3CAc-^Q^fqYB1)g5;GyQWA0y%YO ze;>_i=(aaA4saRZPTi#aR=uRL3D^7LdEl$aZ!Ls_6esGgIB>+RoFPYsGuw%3r+^&G zeR-?1=`ZtTeZ^9mC(DyRUAww?ruK8273~+^Gb*Mgsn>6p9g@&G*Z)ru$GgC=#T!}* zV}uqJ>Afwze_0~@ifWIUow!t8pv0O$;Sc8e`uYaD5_Ve*b&RN37+*Iw=xC{{t#xD6 z2ggUpnizLg_3&k?sF+@575ebB%R~x=F0L=+GiQu6HM0-4-qDL6Xr8KWG1S|fB@)|T z1U#z;t8SpNIV;$Fq^C1k-NJR`O4q4`;TE=%&fI36guNmoLxv)Q)xpX`8UOH^_cYcg zm=0toh?w;~$g;5LOZ5>M7ECZ6$@OnO#i|Te2}&4AHtq12-M7KxTfe_suY-TC$;hCf zMQqad59X}9BW@K8re7GJQk z#cjr*xB-zH>ikJ>{OdQD_p3IU+v9fJiJ&?kZh_rAswD_@V#A;7M zR3FbU*9&3OYXvMWvt6=m>Vu2Jg`O9-vrN(2=5-e!9P9 zsL9`1ttBqnNO?-jponr>Lf*S?;fAbJ^6vi5DsfAOL*3FN)xw7Rh8rudGA-WJJV`^TOnM=VhvZsnwsgGwJ%;=Q93x(+0*Z4G1!)nFu1B>xYdx=S|(!3 zjBFn%92Rc8V>M_Y)Zh1!nf1X;iP0%CtlvJ;7Q^Z+voL2e+ea$PJQ45Yz`1FdrX(#7>ng~2O@Oj*ONAA5iH^rs7|wQXcG=6_avze1O9 z$QBD2j02eP|TV0dM$GS(+n zeGJQ>q{I-$nNTs@uQJ?_`g)a9P}_!Dk^8YnnZvA&J3hJ}zqDB_f}qQ@2(usP+7{%ah0pc%lb6nT(ZdO6kl-qGgdvzzb`wf)4Ahy$RyTe zmgv5?;gY_^e8Y`_-98rQ8)Zil>_)t94Byc&R1xue-J5G=s~e+`aLXcfV$}7nBpv?8 zo(+=y5*Bu^%q}%>$5*{hJE_EC?b{~OSJ&BOI2haC#{wbS|DxqvyFHg>0hexV8~1NY zwnWAEiDLTIk{|QRd^WNYtJZR)tSx5~&wC;!e(}*3kwf!kwQkIvZnI?Kq}ey0*2-;s zpt_A^=Qs3G)p>K>DlZW!=4A2ixN~low{)-06gFFBHm7a!nSUxwc{@M)g!zSD-L|rL zYQYsdUhmq?ilvXOEcz>ljQN-6$%H)PGLDi+Ng51WX>KqySh1qaDc{P(-8*C4l0`j6 zyYyUZD>Y8a)@$15O|9L2Hqpr~WTV5BkpSI)dP1ZeU9?WttV;>Geav3P@j8hJHyzT^d_4EOoz-Mg-PjTj3<#+anZGO66|3$5WL9m3?oeL&L z`Z4SMYxY>_TSUaE4tx$AX~BhRXj2~F^>eyuQNU83fylZ_ch zMi*AOE19d8WL~*u>Q&cZ_Ov{|hI!xwugV+249*OL#F&p)e!bcJz+cnBCs^OL@N+yxns%;b22Hx4`hQ@2YyO-4*h8 z6igfgIxiis6S))$BFU|HzB1!h&ls-E&2LYSS*&?uuinq?rheY7S8iB5EjV#nsNu)0 z>WkkrT@H@x+qZuEH_>N9HK7B>g$|5GYdnIQyf?dl3Mz@*Qg&UsFG{yjY^r;;mHlk{ zDJq(pijTV%$PY*Bu3FLOS-U;(ADxu^hcCEfu9}{7GMxDJ;*tY#hmS7oUDK^Ln0WrP zweW$hZ8d8hZ~NRo#9ky5x?D!^?5y4?p!jeEC&%N>AieOU_~ouW3`tk3LwjI-ki%yTBMMGP-^NZz*4B`)7y zev`N;d32oNfsD_uVv=kQ!jPnW~j z-sXmTZgV+ztJqQ_@~KvPcTds&S27MJmmK`I-doyVCK{#~ls@xj<(CsWiM$EgtQ^7P zd8?T&8>~!JvtIx5^IhSgz*%auYE@j4`xBfmDc&$1?|kX_)N5}iPKo0$2`QZUjNf2z zPG8UTlqnoOGfmXFymnmEaeVl_<(pISQh|mGZpPjX4~0U_E`^`<^*DcrH^N2Ze$e8W zgN@ZsU&s`izj<--TTII5v#;NNy_{K~l>J54lcD~F*C~ItcIVxkz2ALBJ;rCx`JVqg zX~8n(ohLG@SI)4$akFo=R%nf<@AjT&X%g3M-|swi?SlBV#gRPkx475oEAZ|Ki_ZK0 z$vrk=iEGLd*G+pO*G6;b$(~Ux{dTeR+x!kg~L+-dj9 zTdB6=Q+K%Imm^X#;@>*^il<-T;gUP{ZCY;OktusO_};&8=vjP3b%ms)+yeZIFNTgt zxi)WuyGuOVy}S%VpUv~;JI?k>@bQ8jP1D7i4qW>u^)1g_->KOvxR|BNUhX&jcrNA5 zx6XV0y)MY%`Lms@Sz;THH)bd6UZd4tW7X%SZuqXdV$th? z{a!p`j^^7#*u-v&@>i-}TXlbdrN*b!X(9_GXJp@Xlzem4YlGPQBZme&B~Ds%KY!SJ z5S}8lYiUO{M{k>C5wG4M{>mEVE}Lr$f;_%9*Q;{N9JGHvx9qxetW&|^jSEtz!$a&f z);r99HJxWiuLLI#KJ1mf#1VX$*gE*T@GzT0Yj>}4y|SJCk=RxI3eIIVHFx1FB>36s z2XN-hd$spSr?OJ+G5q6n9%iSq*K3Jf`=o~TiyEh8dwD#3e8K)PK5Rwu+7`; zh+a!c73O>Zf8cNAd7W|EYaPDc?Y+c5Gs;RH!u!PGeT}>+8yrpqq}yzghG{9N5tEwA zU*y02<8b8M8Rd`MH%$!PV*hHv^LN{Gteh`6v_8H)Up}Jkkk`hN9940t1rLoEHl{`J zpN~?SZN+u`>7y&#Cq7itk@ng$nI}N0%!Cu%>X$@%+VxNw~AM)>?UaMI&qkJ!P z5PQqrxV81h6QkA7`veU5!^5Kkg-?gaEModi@qav-XU1e6vz?YDPv=HXe(xvHt0N~M zo1fCJqo9@%YxH8lQF*hTs+uUk;sg(C}EsPuQ`e$UX4@#fn=j-yo;BBF-=ON=w^)l1_)0FORyBHjtb18iJW=FL% zXVp~B=^VK7Zs_Px;EdjsB(8@cQXx~=$L(Vs|71CI+2xTH@1l?-78n20Cy|C8C#{Mu z3kC3A(mGSp_QKzM`6{Q-qM7*>)gqk9owD>KLsOHX3m zYjS9PyNc(Z*Fjtk0sXyP#(m7{idCRE-<+h!#xfg9NeZ5r|10oqARn4!R;=|26S((;Nr~Acch{p1lR9f#+S{Susv4O|HP+7uAS8j^B zMFOj{Cn>2uQZQYRPuCs5KI>PKRhES@qbq?`Se6hQZ`|9{QC7dI+|0Dkl+|13JQys< z8W^@<=~WC@SEj2Zj9jx|^#xq-8|rDzkhQfHu^1fcFJy|8S(q?;+^js>MIu>sDOP+Q z<-!rHzFNMlgpr}zkutV_vVCl`3K#P!?_+hhCDpr?SC;T4yh%y26)`umuo(O`qUX^j zBGSvP(k2qmxNN}+2Hf56Z#dXJ5*aqw-IlJx>g`I1wdm_M(C(;bTO}eia+N>MxVLdQ zlGW>+#imj|+ugnHbXAHmZG$2_P(ZiLyvZk;Z7e9x9HcM9hLPk z-5nil%vFl{?d7rN*SlKE22#fUTv$bXO2wIxbvP!Wbg^!J8% ztTI?E=g63^H&_>aZA4`;(|g#8yQSYTq>mMo7IQIhD8*S_q?FayrnhPp>({RimU&-g zhflAea=fwGo>o4Uggs?_7K0+IM)adtznndS9L{tj9B^r0 zwJ(BAgT*ZJVJqY+=N@eHNbz7bWEAEK`kdm6c=JYt!HNu)iMH@_Vt&e>QQ{&0Az_+@ zf3R(WQlX?aYm=}*bN0wLlOd^EU8h!Af2D|DjS0t#POi9J;-MVH;{M1N_-?pS#JASX zOgPTOZ0PObD}(w&X;zU=*G-KEb47*!^h|GI#P*VVVWuUnO3o?%iz^NY92)EwQQPd=G4)b_tA5FjVwF1I6z`?#ms(u)3wIPBbvJp=Uu`?Yh|POAbBD69 znvkBzS09f{Zf$+JN=GV`JU$H>cde=q4;ubyJGEh;YuJo!xm#k#MAkvJSmU%0D<;;j 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

Y*%T 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 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 019/132] =?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 020/132] =?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 021/132] =?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 022/132] =?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 023/132] =?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 024/132] =?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 025/132] =?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 026/132] =?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 027/132] =?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 028/132] =?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 029/132] =?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 030/132] =?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 031/132] =?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 032/132] =?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 033/132] =?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 034/132] =?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 035/132] =?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 036/132] =?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 037/132] =?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 038/132] =?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 039/132] =?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 040/132] =?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 041/132] =?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 042/132] 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 043/132] =?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 044/132] =?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 045/132] =?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 046/132] 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 047/132] =?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 048/132] =?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 14a07fd5d50463ff07a4e0efd413a6343a616b04 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 13:32:48 +0300 Subject: [PATCH 049/132] =?UTF-8?q?=D0=A0=D0=B5=D0=B4=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B0=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DetectedOperation/DetectedOperationDto.cs | 8 +- .../IDetectedOperationRepository.cs | 25 +- ...94602_Update_DetectedOperation.Designer.cs | 9399 +++++++++++++++++ ...20240401094602_Update_DetectedOperation.cs | 64 + .../AsbCloudDbContextModelSnapshot.cs | 754 +- AsbCloudDb/Model/DetectedOperation.cs | 8 +- .../Repository/DetectedOperationRepository.cs | 55 +- .../DetectedOperationService.cs | 2 +- .../WorkOperationDetection.cs | 2 +- .../SAUB/DetectedOperationController.cs | 290 +- 10 files changed, 10092 insertions(+), 515 deletions(-) create mode 100644 AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.Designer.cs create mode 100644 AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.cs diff --git a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs index e81a45fb..0aa2bae5 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 System.Text.Json.Serialization; namespace AsbCloudApp.Data.DetectedOperation; @@ -28,8 +29,7 @@ public class DetectedOperationDto: IId /// /// Id пользователя панели на момент начала операции /// - [Required] - public int IdUserAtStart { get; set; } + public int? IdUserAtStart { get; set; } /// /// Пользователь панели оператора @@ -75,8 +75,8 @@ public class DetectedOperationDto: IId /// /// название/описание операции /// - [Required] - public WellOperationCategoryDto OperationCategory { get; set; } = null!; + [JsonIgnore] + public WellOperationCategoryDto? OperationCategory { get; set; } /// /// Ключевой параметр операции diff --git a/AsbCloudApp/Repositories/IDetectedOperationRepository.cs b/AsbCloudApp/Repositories/IDetectedOperationRepository.cs index d7fe5865..3c9d335b 100644 --- a/AsbCloudApp/Repositories/IDetectedOperationRepository.cs +++ b/AsbCloudApp/Repositories/IDetectedOperationRepository.cs @@ -11,16 +11,16 @@ namespace AsbCloudApp.Repositories; /// /// Таблица автоматически определенных операций /// -public interface IDetectedOperationRepository : ICrudRepository +public interface IDetectedOperationRepository { /// /// Добавление записей /// - /// + /// /// /// /// - Task Insert(int? idUser, IEnumerable dtos, CancellationToken token); + Task InsertRange(int? idEditor, IEnumerable dtos, CancellationToken token); /// /// Получить автоматически определенные операции по телеметрии @@ -33,38 +33,27 @@ public interface IDetectedOperationRepository : ICrudRepository /// Редактирование записей /// - /// + /// /// /// /// - Task Update(int idUser, IEnumerable dtos, CancellationToken token); - - /// - /// Добавляет Dto у которых id == 0, изменяет dto у которых id != 0 - /// - /// - /// - /// - /// - Task UpdateOrInsert(int idUser, IEnumerable dtos, CancellationToken token); + Task UpdateRange(int idEditor, IEnumerable dtos, CancellationToken token); /// /// Удалить операции /// - /// /// /// /// - Task Delete(int idUser, DetectedOperationByTelemetryRequest request, CancellationToken token); + Task Delete(DetectedOperationByTelemetryRequest request, CancellationToken token); /// /// Удаление записей /// - /// /// /// /// - Task DeleteRange(int idUser, IEnumerable ids, CancellationToken token); + Task DeleteRange(IEnumerable ids, CancellationToken token); /// /// Получение дат последних определённых операций diff --git a/AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.Designer.cs b/AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.Designer.cs new file mode 100644 index 00000000..7b762673 --- /dev/null +++ b/AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.Designer.cs @@ -0,0 +1,9399 @@ +// +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("20240401094602_Update_DetectedOperation")] + partial class Update_DetectedOperation + { + /// + 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("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .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("ExtraData") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("extra_data") + .HasComment("доп. инфо по операции"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); + + 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/20240401094602_Update_DetectedOperation.cs b/AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.cs new file mode 100644 index 00000000..570f957e --- /dev/null +++ b/AsbCloudDb/Migrations/20240401094602_Update_DetectedOperation.cs @@ -0,0 +1,64 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + /// + public partial class Update_DetectedOperation : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "id_user", + table: "t_detected_operation", + type: "integer", + nullable: true, + comment: "Id пользователя по телеметрии на момент начала операции", + oldClrType: typeof(int), + oldType: "integer", + oldComment: "Id пользователя по телеметрии на момент начала операции"); + + migrationBuilder.AddColumn( + name: "creation", + table: "t_detected_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)), + comment: "дата создания"); + + migrationBuilder.AddColumn( + name: "id_editor", + table: "t_detected_operation", + type: "integer", + nullable: true, + comment: "Редактор"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "creation", + table: "t_detected_operation"); + + migrationBuilder.DropColumn( + name: "id_editor", + table: "t_detected_operation"); + + migrationBuilder.AlterColumn( + name: "id_user", + table: "t_detected_operation", + type: "integer", + nullable: false, + defaultValue: 0, + comment: "Id пользователя по телеметрии на момент начала операции", + oldClrType: typeof(int), + oldType: "integer", + oldNullable: true, + oldComment: "Id пользователя по телеметрии на момент начала операции"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 9957e235..e0941af4 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 => @@ -492,6 +497,11 @@ namespace AsbCloudDb.Migrations NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b.Property("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .HasComment("дата создания"); + b.Property("DateEnd") .HasColumnType("timestamp with time zone") .HasColumnName("date_end") @@ -528,11 +538,16 @@ namespace AsbCloudDb.Migrations .HasColumnName("id_category") .HasComment("Id категории операции"); + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); + b.Property("IdTelemetry") .HasColumnType("integer") .HasColumnName("id_telemetry"); - b.Property("IdUsersAtStart") + b.Property("IdUsersAtStart") .HasColumnType("integer") .HasColumnName("id_user") .HasComment("Id пользователя по телеметрии на момент начала операции"); @@ -548,75 +563,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 +601,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 +747,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 +775,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 +1176,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 +1228,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 +1258,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 +1288,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 +1319,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 +1360,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 +1403,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 +1452,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 +1482,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 +1529,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 +1557,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 +1640,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 +1662,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 +1721,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 +1751,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 +2778,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 +2899,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 +2919,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 +2962,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 +2982,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 +4300,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 +4592,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 +4649,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 +4701,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 +4757,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 +4785,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 +4854,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 +5073,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 +5105,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 +5173,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 +5200,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 +5261,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 +5299,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 +5342,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 +5408,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 +5479,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 +5560,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 +5601,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 +5940,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 +6046,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 +6075,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 +6102,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 +6192,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 +6234,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 +7324,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 +7347,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 +7583,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 +7660,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 +7678,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 +8421,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 +8451,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/DetectedOperation.cs b/AsbCloudDb/Model/DetectedOperation.cs index df5abbb1..611e933d 100644 --- a/AsbCloudDb/Model/DetectedOperation.cs +++ b/AsbCloudDb/Model/DetectedOperation.cs @@ -19,6 +19,12 @@ namespace AsbCloudDb.Model [Column("id_category"), Comment("Id категории операции")] public int IdCategory { get; set; } + + [Column("id_editor"), Comment("Редактор")] + public int? IdEditor { get; set; } + + [Column("creation"), Comment("дата создания")] + public DateTimeOffset Creation { get; set; } [Column("date_start", TypeName = "timestamp with time zone"), Comment("Дата начала операции")] public DateTimeOffset DateStart { get; set; } @@ -27,7 +33,7 @@ namespace AsbCloudDb.Model public DateTimeOffset DateEnd { get; set; } [Column("id_user"), Comment("Id пользователя по телеметрии на момент начала операции")] - public int IdUsersAtStart { get; set; } + public int? IdUsersAtStart { get; set; } [NotMapped] public double DurationMinutes => (DateEnd - DateStart).TotalMinutes; diff --git a/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs b/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs index 21db64ba..1dc63f37 100644 --- a/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs @@ -12,29 +12,30 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore.ChangeTracking; namespace AsbCloudInfrastructure.Repository; -public class DetectedOperationRepository : CrudRepositoryBase, - IDetectedOperationRepository +public class DetectedOperationRepository : IDetectedOperationRepository { + private readonly IAsbCloudDbContext dbContext; private readonly ITelemetryService telemetryService; - public DetectedOperationRepository(IAsbCloudDbContext context, + public DetectedOperationRepository(IAsbCloudDbContext dbContext, ITelemetryService telemetryService) - : base(context) { + this.dbContext = dbContext; this.telemetryService = telemetryService; } - public async Task Delete(int idUser, DetectedOperationByTelemetryRequest request, CancellationToken token) + public async Task Delete(DetectedOperationByTelemetryRequest request, CancellationToken token) { var query = BuildQuery(request); dbContext.Set().RemoveRange(query); return await dbContext.SaveChangesAsync(token); } - public async Task DeleteRange(int idUser, IEnumerable ids, CancellationToken token) + public async Task DeleteRange(IEnumerable ids, CancellationToken token) { var query = dbContext.Set() .Where(e => ids.Contains( e.Id)); @@ -66,7 +67,7 @@ public class DetectedOperationRepository : CrudRepositoryBase Insert(int? idUser, IEnumerable dtos, CancellationToken token) + public async Task InsertRange(int? idEditor, IEnumerable dtos, CancellationToken token) { if(!dtos.Any()) return 0; @@ -75,6 +76,10 @@ public class DetectedOperationRepository : CrudRepositoryBase(); foreach(var entity in entities) { + if (idEditor.HasValue) + entity.IdEditor = idEditor.Value; + + entity.Creation = DateTimeOffset.UtcNow; entity.Id = default; dbset.Add(entity); } @@ -82,7 +87,7 @@ public class DetectedOperationRepository : CrudRepositoryBase Update(int idUser, IEnumerable dtos, CancellationToken token) + public async Task UpdateRange(int idEditor, IEnumerable dtos, CancellationToken token) { if (!dtos.Any()) return 0; @@ -108,32 +113,22 @@ public class DetectedOperationRepository : CrudRepositoryBase + { + var entity = Convert(dto); + entity.IdEditor = idEditor; + return entity; + }) .ToArray(); - var entries = new Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry[entities.Length]; + var entries = new EntityEntry[entities.Length]; for(var i = 0; i < entities.Length; i++) entries[i] = dbSet.Update(entities[i]); var result = await dbContext.SaveChangesWithExceptionHandling(token); - for (var i = 0; i < entries.Length; i++) - entries[i].State = EntityState.Detached; - - return result; - } - - public async Task UpdateOrInsert(int idUser, IEnumerable dtos, CancellationToken token) - { - var result = 0; - - var itemsToInsert = dtos.Where(e => e.Id == 0); - if (itemsToInsert.Any()) - result += await Insert(idUser, itemsToInsert, token); - - var itemsToUpdate = dtos.Where(e => e.Id != 0); - if (itemsToUpdate.Any()) - result += await Update(idUser, itemsToUpdate, token); + foreach (var entry in entries) + entry.State = EntityState.Detached; return result; } @@ -182,7 +177,7 @@ public class DetectedOperationRepository : CrudRepositoryBase(); dto.DateStart = src.DateStart.ToOffset(offset); @@ -190,11 +185,11 @@ public class DetectedOperationRepository : CrudRepositoryBase(); entity.DateStart = src.DateStart.ToUniversalTime(); entity.DateEnd = src.DateEnd.ToUniversalTime(); return entity; } -} +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 36809ec3..88b2a5aa 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -209,7 +209,7 @@ public class DetectedOperationService : IDetectedOperationService return 0; var requestByTelemetry = new DetectedOperationByTelemetryRequest(well.IdTelemetry.Value, request); - var result = await operationRepository.Delete(-1, requestByTelemetry, token); + var result = await operationRepository.Delete(requestByTelemetry, token); return result; } diff --git a/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs b/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs index d001471e..e1e1212e 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs @@ -48,7 +48,7 @@ public class WorkOperationDetection: Work var detectedOperations = await detectedOperationService.DetectOperationsAsync(telemetryId, beginDate, token); if (detectedOperations.Any()) - await detectedOperationRepository.InsertRangeAsync(detectedOperations, token); + await detectedOperationRepository.InsertRange(null, detectedOperations, token); } } } diff --git a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs index c6bd6dda..b6886280 100644 --- a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs @@ -7,137 +7,191 @@ using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Exceptions; +using AsbCloudApp.Repositories; using AsbCloudInfrastructure.Services.DetectOperations; using Microsoft.AspNetCore.Http; namespace AsbCloudWebApi.Controllers.SAUB { - /// - /// Операции определенные по телеметрии САУБ - /// - [Route("api/[controller]")] - [ApiController] - [Authorize] - public class DetectedOperationController : ControllerBase - { - private readonly IDetectedOperationService detectedOperationService; - private readonly IWellService wellService; - private readonly DetectedOperationExportService detectedOperationExportService; - - public DetectedOperationController(IDetectedOperationService detectedOperationService, IWellService wellService, - DetectedOperationExportService detectedOperationExportService) - { - this.detectedOperationService = detectedOperationService; - this.wellService = wellService; - this.detectedOperationExportService = detectedOperationExportService; - } + /// + /// Операции определенные по телеметрии САУБ + /// + [Route("api/well/{idWell}/[controller]")] + [ApiController] + [Authorize] + public class DetectedOperationController : ControllerBase + { + private readonly IDetectedOperationRepository detectedOperationRepository; + private readonly IDetectedOperationService detectedOperationService; + private readonly IWellService wellService; + private readonly DetectedOperationExportService detectedOperationExportService; - /// - /// получить справочник операций. Отличается от операций заводимых вручную. - /// При задании id скважины вернет только те операции, которые определились в телеметрии этой скважины. - /// - /// [опционально] id скважины - /// - /// - [HttpGet("categories")] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetCategoriesAsync([FromQuery] int? idWell, CancellationToken token) - { - var result = await detectedOperationService.GetCategoriesAsync(idWell, token); - return Ok(result); - } + public DetectedOperationController(IDetectedOperationService detectedOperationService, + IWellService wellService, + DetectedOperationExportService detectedOperationExportService, + IDetectedOperationRepository detectedOperationRepository) + { + this.detectedOperationService = detectedOperationService; + this.wellService = wellService; + this.detectedOperationExportService = detectedOperationExportService; + this.detectedOperationRepository = detectedOperationRepository; + } - /// - /// Получить фильтрованный список операций по телеметрии САУБ - /// - /// - /// - /// - [HttpGet] - [ProducesResponseType(typeof(DetectedOperationListDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAsync( - [FromQuery] DetectedOperationByWellRequest request, - CancellationToken token) - { - if (!await UserHasAccessToWellAsync(request.IdWell, token)) - return Forbid(); + /// + /// Добавить операции + /// + /// + /// + /// + /// + [HttpPost] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + public async Task InsertRangeAsync(int idWell, IEnumerable dtos, CancellationToken token) + { + var idUser = await AssertUserHasAccessToWellAsync(idWell, token); - var result = await detectedOperationService.GetAsync(request, token); - return Ok(result); - } + var result = await detectedOperationRepository.InsertRange(idUser, dtos, token); - /// - /// Получить статистику по фильтрованному списку операций по телеметрии САУБ - /// - /// - /// - /// - [HttpGet("stat")] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetStatAsync( - [FromQuery] DetectedOperationByWellRequest request, - CancellationToken token) - { - if (!await UserHasAccessToWellAsync(request.IdWell, token)) - return Forbid(); + return Ok(result); + } - var result = await detectedOperationService.GetOperationsStatAsync(request, token); - return Ok(result); - } + /// + /// Обновить операции + /// + /// + /// + /// + /// + [HttpPut] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + public async Task UpdateRangeAsync(int idWell, IEnumerable dtos, CancellationToken token) + { + var idUser = await AssertUserHasAccessToWellAsync(idWell, token); - /// - /// Удалить операции. - /// Удаленные операции будут определены повторно сервисом автоматизированного определения операций. - /// Может потребоваться при изменении алгоритмов определения - /// - /// - /// - /// - [HttpDelete] - [Permission] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task DeleteAsync( - [FromQuery] DetectedOperationByWellRequest request, - CancellationToken token) - { - if (!await UserHasAccessToWellAsync(request.IdWell, token)) - return Forbid(); + var result = await detectedOperationRepository.UpdateRange(idUser, dtos, token); - var result = await detectedOperationService.DeleteAsync(request, token); - return Ok(result); - } + return Ok(result); + } - protected async Task UserHasAccessToWellAsync(int idWell, CancellationToken token) - { - var idCompany = User.GetCompanyId(); - if (idCompany is not null && - await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token) - .ConfigureAwait(false)) - return true; - return false; - } + /// + /// Удалить операции + /// + /// + /// + /// + /// + [HttpDelete] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + public async Task DeleteRangeAsync(int idWell, IEnumerable ids, CancellationToken token) + { + await AssertUserHasAccessToWellAsync(idWell, token); - /// - /// Создает excel файл с операциями по скважине - /// - /// id скважины - /// - [HttpGet("export")] - [Permission] - [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK, "application/octet-stream")] - [ProducesResponseType(StatusCodes.Status204NoContent)] - [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] - public async Task ExportAsync(int idWell, CancellationToken token) - { - var idCompany = User.GetCompanyId(); + var result = await detectedOperationRepository.DeleteRange(ids, token); - if (idCompany is null) - return Forbid(); + return Ok(result); + } - var host = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host}"; - var stream = await detectedOperationExportService.ExportAsync(idWell, host, token); - - return File(stream, "application/octet-stream", "operations.xlsx"); - } - } -} + /// + /// получить справочник операций. Отличается от операций заводимых вручную. + /// При задании id скважины вернет только те операции, которые определились в телеметрии этой скважины. + /// + /// [опционально] id скважины + /// + /// + [HttpGet] + [Route("/api/well/[controller]/categories")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task GetCategoriesAsync([FromQuery] int? idWell, CancellationToken token) + { + var result = await detectedOperationService.GetCategoriesAsync(idWell, token); + return Ok(result); + } + + /// + /// Получить фильтрованный список операций по телеметрии САУБ + /// + /// + /// + /// + /// + [HttpGet] + [ProducesResponseType(typeof(DetectedOperationDto), StatusCodes.Status200OK)] + public async Task GetAsync(int idWell, + [FromQuery] DetectedOperationRequest request, + CancellationToken token) + { + await AssertUserHasAccessToWellAsync(idWell, token); + + var well = await wellService.GetOrDefaultAsync(idWell, token); + + if (well?.IdTelemetry is null) + return NoContent(); + + var requestToService = new DetectedOperationByTelemetryRequest(well.IdTelemetry.Value, request); + + var result = await detectedOperationRepository.Get(requestToService, token); + return Ok(result); + } + + /// + /// Получить статистику по фильтрованному списку операций по телеметрии САУБ + /// + /// + /// + /// + /// + [HttpGet("stat")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task GetStatAsync(int idWell, [FromQuery] DetectedOperationRequest request, + CancellationToken token) + { + await AssertUserHasAccessToWellAsync(idWell, token); + + var requestToService = new DetectedOperationByWellRequest(idWell, request); + + var result = await detectedOperationService.GetOperationsStatAsync(requestToService, token); + return Ok(result); + } + + /// + /// Создает excel файл с операциями по скважине + /// + /// id скважины + /// + [HttpGet("export")] + [Permission] + [ProducesResponseType(typeof(PhysicalFileResult), StatusCodes.Status200OK, "application/octet-stream")] + [ProducesResponseType(StatusCodes.Status204NoContent)] + [ProducesResponseType(typeof(ValidationProblemDetails), (int)System.Net.HttpStatusCode.BadRequest)] + public async Task ExportAsync(int idWell, CancellationToken token) + { + var idCompany = User.GetCompanyId(); + + if (idCompany is null) + return Forbid(); + + var host = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host}"; + var stream = await detectedOperationExportService.ExportAsync(idWell, host, token); + + return File(stream, "application/octet-stream", "operations.xlsx"); + } + + private async Task AssertUserHasAccessToWellAsync(int idWell, CancellationToken token) + { + var idUser = User.GetUserId(); + var idCompany = User.GetCompanyId(); + + if (!idUser.HasValue) + throw new ForbidException("Неизвестный пользователь"); + + if (!idCompany.HasValue) + throw new ForbidException("Нет доступа к скважине"); + + if (!await wellService.IsCompanyInvolvedInWellAsync(idCompany.Value, idWell, token)) + throw new ForbidException("Нет доступа к скважине"); + + return idUser.Value; + } + } +} \ No newline at end of file From 02f821555f2273a21645dbe5d9632a0985eeacb6 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 13:35:21 +0300 Subject: [PATCH 050/132] merge fix --- AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs | 1 + AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs index 0aa2bae5..33cc19a5 100644 --- a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs +++ b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text.Json.Serialization; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Data.DetectedOperation; diff --git a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs index b6886280..b5a94856 100644 --- a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudInfrastructure.Services.DetectOperations; From 5bf30956c8983e8592cf58f41767246a67aefb08 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 1 Apr 2024 16:11:20 +0500 Subject: [PATCH 051/132] =?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 052/132] =?UTF-8?q?Revert=20"=D0=9F=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=80=D0=B0=D1=81=D1=87=D0=B5=D1=82=D0=B0=20?= =?UTF-8?q?=D1=81=D0=B2=D0=BE=D0=B4=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B8=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=B1=D1=83=D1=80=D0=B8=D0=BB=D1=8C=D1=89=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=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 e4f3adb101fe8c7dbbaaff6d822d86cdce374b9f Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 1 Apr 2024 16:17:52 +0500 Subject: [PATCH 053/132] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B1=D0=B0=D0=B3=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B0=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D0=B1=D1=83=D1=80=D0=B8=D0=BB?= =?UTF-8?q?=D1=8C=D1=89=D0=B8=D0=BA=D0=B0=D0=BC=20=D0=B8=20=D1=81=D0=BA?= =?UTF-8?q?=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Subsystems/SubsystemService.cs | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index ed2571a9..d2400ba3 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -67,22 +67,16 @@ internal class SubsystemService : ISubsystemService var detectedOperations = await detectedOperationService .GetOperationsAsync(byWellRequest, token); + var detectedOperationsByCurrentDriller = detectedOperations.Where(d => d.Driller?.Id == schedule.IdDriller); - var groupByDriller = detectedOperations - .Where(operation => operation.Driller is not null) - .GroupBy(operation => operation.Driller); - - foreach (var entry in groupByDriller) + 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 96f171d6f9fcc9c4761a78ced9a071b6f57a8bf7 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 1 Apr 2024 17:03:36 +0500 Subject: [PATCH 054/132] =?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 м); From ddbd84e933587954bc145cbf415391113c0d4cb4 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 2 Apr 2024 14:16:40 +0500 Subject: [PATCH 055/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BB=D1=8C=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BD=D0=B0=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BE=D0=BA=20=D0=BF=D0=BE=20=D0=BC=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D0=B8=D0=B2=D1=83=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B1=D1=83=D1=80=D0=B8=D0=BB=D1=8C=D1=89=D0=B8=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=9F=D0=BE=D0=B4=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0?= =?UTF-8?q?=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B1=D1=83=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=D1=89=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=B2=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8=20=D0=BE=D1=82=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=B9=20?= =?UTF-8?q?=D1=81=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/GetStatRequest.cs | 4 +- .../Repository/ScheduleRepository.cs | 6 +-- .../Controllers/DrillerController.cs | 40 ++++++++++++++++++- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/AsbCloudApp/Requests/GetStatRequest.cs b/AsbCloudApp/Requests/GetStatRequest.cs index 5ebb9550..fbc53dd0 100644 --- a/AsbCloudApp/Requests/GetStatRequest.cs +++ b/AsbCloudApp/Requests/GetStatRequest.cs @@ -14,7 +14,7 @@ public class GetStatRequest: RequestBase public IEnumerable IdsWells { get; set; } = new List(); /// - /// id + /// /// - public int? IdDriller { get; set; } + public IEnumerable IdsDrillers { get; set; } = new List(); } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/ScheduleRepository.cs b/AsbCloudInfrastructure/Repository/ScheduleRepository.cs index e7c2aa1f..29bf4f5b 100644 --- a/AsbCloudInfrastructure/Repository/ScheduleRepository.cs +++ b/AsbCloudInfrastructure/Repository/ScheduleRepository.cs @@ -57,11 +57,11 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetPageAsync(GetStatRequest request, CancellationToken token) { var idWell = request.IdsWells; - var idDriller = request.IdDriller; + var idsDrillers = request.IdsDrillers; var query = GetQuery().Where(s => request.IdsWells.Contains(s.IdWell)); - if (idDriller is not null) + if (idsDrillers.Any()) { - query.Where(s => s.IdDriller == idDriller); + query = query.Where(s => idsDrillers.Contains(s.IdDriller)); } var result = await query.ToArrayAsync(token); diff --git a/AsbCloudWebApi/Controllers/DrillerController.cs b/AsbCloudWebApi/Controllers/DrillerController.cs index 0fa84e4a..48efca2c 100644 --- a/AsbCloudWebApi/Controllers/DrillerController.cs +++ b/AsbCloudWebApi/Controllers/DrillerController.cs @@ -1,7 +1,13 @@ using AsbCloudApp.Data; +using AsbCloudApp.Requests; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; namespace AsbCloudWebApi.Controllers { @@ -13,8 +19,38 @@ namespace AsbCloudWebApi.Controllers [Authorize] public class DrillerController : CrudController> { - public DrillerController(ICrudRepository service) + private IScheduleRepository scheduleRepository; + + public DrillerController(ICrudRepository service, IScheduleRepository scheduleRepository) : base(service) - { } + { + this.scheduleRepository = scheduleRepository; + } + + /// + /// Получить список бурильщиков по ключам скважин + /// + /// массив ключей скважин + /// token + /// все записи + [HttpGet("/api/drillers")] + [Permission] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task GetAsync([FromQuery] IEnumerable idsWells, CancellationToken token) + { + var request = new GetStatRequest() + { + IdsWells = idsWells, + }; + var schedulePage = await scheduleRepository.GetPageAsync(request, token); + var drillers = schedulePage + .Select(s => s.Driller) + .Where(d => d is not null) + .GroupBy(d => d.Id) + .Select(group => group.First()) + .OrderBy(d => d.Surname); + + return Ok(drillers); + } } } From 377cb762ed83addbb97f50ac1fdaff7c92592c0a Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 2 Apr 2024 14:25:50 +0500 Subject: [PATCH 056/132] =?UTF-8?q?=D0=9A=D0=BE=D0=B4=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/GetStatRequest.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/AsbCloudApp/Requests/GetStatRequest.cs b/AsbCloudApp/Requests/GetStatRequest.cs index fbc53dd0..6a942f48 100644 --- a/AsbCloudApp/Requests/GetStatRequest.cs +++ b/AsbCloudApp/Requests/GetStatRequest.cs @@ -1,20 +1,19 @@ using System.Collections.Generic; -using System.Linq; namespace AsbCloudApp.Requests; /// -/// +/// Запрос на получение статистики использования подсистем бурильщиком /// -public class GetStatRequest: RequestBase +public class GetStatRequest : RequestBase { /// - /// id + /// id скважин /// public IEnumerable IdsWells { get; set; } = new List(); /// - /// + /// список ключей бурильщиков /// public IEnumerable IdsDrillers { get; set; } = new List(); } \ No newline at end of file From 11285f236d9db84266c1dcd0c0ba0a36fdbe5b8f Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 2 Apr 2024 17:28:38 +0500 Subject: [PATCH 057/132] =?UTF-8?q?=D0=98=D0=BD=D1=82=D0=B5=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B1=D1=83=D1=80=D0=B8=D0=BB=D1=8C=D1=89=D0=B8=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=BF=D0=BE=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B0?= =?UTF-8?q?=D0=BC=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Clients/IDrillerClient.cs | 11 +++ .../Controllers/DrillControllerTest.cs | 88 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 AsbCloudWebApi.IntegrationTests/Clients/IDrillerClient.cs create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/DrillControllerTest.cs diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IDrillerClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IDrillerClient.cs new file mode 100644 index 00000000..d8b9e26b --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Clients/IDrillerClient.cs @@ -0,0 +1,11 @@ +using AsbCloudApp.Data; +using Refit; + +namespace AsbCloudWebApi.IntegrationTests.Clients; + +public interface IDrillerClient +{ + + [Get("/api/drillers")] + Task>> GetAsync([Query(CollectionFormat.Multi)] IEnumerable idsWells, CancellationToken token); +} \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/DrillControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/DrillControllerTest.cs new file mode 100644 index 00000000..638630ca --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Controllers/DrillControllerTest.cs @@ -0,0 +1,88 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Requests; +using AsbCloudDb.Model; +using AsbCloudWebApi.IntegrationTests.Clients; +using AsbCloudWebApi.IntegrationTests.Data; +using System; +using Xunit; + +namespace AsbCloudWebApi.IntegrationTests.Controllers; + +public class DrillerControllerTest : BaseIntegrationTest +{ + private readonly IDrillerClient client; + + public DrillerControllerTest(WebAppFactoryFixture factory) + : base(factory) + { + client = factory.GetAuthorizedHttpClient(string.Empty); + + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + } + + [Fact] + public async Task GetByWellIds_returns_success() + { + //arrange + var well1 = CreateWellAsync(2); + var well2 = CreateWellAsync(3); + var well3 = CreateWellAsync(4); + dbContext.Wells.Add(well1); + dbContext.Wells.Add(well2); + dbContext.Wells.Add(well3); + + var driller1 = CreateDrillerAsync(1); + var driller2 = CreateDrillerAsync(2); + var driller3 = CreateDrillerAsync(3); + + var schedule1= CreateScheduleAsync(well1.Id, driller1); + var schedule2 = CreateScheduleAsync(well2.Id, driller2); + var schedule3 = CreateScheduleAsync(well3.Id, driller3); + + dbContext.Schedule.Add(schedule1); + dbContext.Schedule.Add(schedule2); + dbContext.Schedule.Add(schedule3); + + await dbContext.SaveChangesAsync(); + + ////act + var idsWells = dbContext.Wells.ToArray().Select(w => w.Id); + var response = await client.GetAsync(idsWells, CancellationToken.None); + + ////assert + Assert.NotNull(response.Content); + Assert.Equal(3, response.Content.Count()); + } + + private static Schedule CreateScheduleAsync(int idWell, Driller driller) => new() + { + IdWell = idWell, + ShiftStart = new TimeOnly(8, 0, 0), + ShiftEnd = new TimeOnly(20, 0, 0), + DrillStart = new DateTimeOffset(new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc)), + DrillEnd = new DateTimeOffset(new DateTime(2024, 2, 1, 0, 0, 0, DateTimeKind.Utc)), + Driller = driller + }; + + + private static Well CreateWellAsync(int idWell) => new() + { + Id = idWell, + IdWellType = 1, + IdState = 1, + Caption = $"Скважина {idWell}", + Latitude = 10, + Longitude = 20, + Timezone = Defaults.Timezone, + IdCluster = 1, + }; + + private static Driller CreateDrillerAsync(int idDriller) => new() + { + Id = idDriller, + Name = idDriller.ToString(), + Patronymic = idDriller.ToString(), + Surname= idDriller.ToString() + }; +} \ No newline at end of file From 396ada16c9f715555bb0b9d8158ad2cd393c21b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D1=8F=20=D0=91=D0=B8=D0=B7=D1=8E=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0?= Date: Wed, 3 Apr 2024 19:41:35 +0500 Subject: [PATCH 058/132] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=80=D1=8F=D0=B4=20=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D0=B9,=D0=BE=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE=D1=80=D0=B8=D0=B9=20"=D0=B1=D1=83=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=80=D0=BE=D1=82=D0=BE=D1=80=D0=BE=D0=BC?= =?UTF-8?q?"=20=D0=B8=20"=D0=B1=D1=83=D1=80=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D0=BB=D0=B0=D0=B9=D0=B4=D0=BE=D0=BC"=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D1=8E=20"?= =?UTF-8?q?=D0=B1=D1=83=D1=80=D0=B5=D0=BD=D0=B8=D0=B5"=20=D0=B2=20=D0=93?= =?UTF-8?q?=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Add_NewWellOperationCategories.Designer.cs | 9428 +++++++++++++++++ ...03143143_Add_NewWellOperationCategories.cs | 60 + .../AsbCloudDbContextModelSnapshot.cs | 175 +- AsbCloudDb/Model/WellOperationCategory.cs | 17 +- 4 files changed, 9612 insertions(+), 68 deletions(-) create mode 100644 AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.Designer.cs create mode 100644 AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.cs diff --git a/AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.Designer.cs b/AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.Designer.cs new file mode 100644 index 00000000..3f2746c7 --- /dev/null +++ b/AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.Designer.cs @@ -0,0 +1,9428 @@ +// +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("20240403143143_Add_NewWellOperationCategories")] + partial class Add_NewWellOperationCategories + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "8.0.3") + .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 = 3006, + 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 = 4019, + IdParent = 3006, + 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 = "Работа пакером в обсадной колонне" + }, + new + { + Id = 5113, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение" + }, + new + { + Id = 5114, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ТО оборудования" + }, + new + { + Id = 5115, + IdParent = 4019, + 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/20240403143143_Add_NewWellOperationCategories.cs b/AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.cs new file mode 100644 index 00000000..a0d0e2a9 --- /dev/null +++ b/AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.cs @@ -0,0 +1,60 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional + +namespace AsbCloudDb.Migrations +{ + /// + public partial class Add_NewWellOperationCategories : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.InsertData( + table: "t_well_operation_category", + columns: new[] { "id", "id_parent", "key_value_name", "key_value_units", "name" }, + values: new object[,] + { + { 3006, null, "dT", "мин", "Заключительные работы" }, + { 5113, 4001, "МСП", "м/ч", "Бурение" }, + { 5114, 4013, "dT", "мин", "ТО оборудования" }, + { 4019, 3006, "dT", "мин", "Заключительные операции" }, + { 5115, 4019, "dT", "мин", "Спуск НКТ" } + }); + + migrationBuilder.Sql + ("UPDATE public.t_well_operation SET id_category=5113 WHERE id_category=5002 OR id_category=5003;"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5113); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5114); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5115); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4019); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 3006); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 949de090..4e932c83 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.3") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); @@ -284,7 +284,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("date") .HasComment("Дата формирования отчёта"); - b.Property("DateLastUpdate") + b.Property("DateLastUpdate") .HasColumnType("timestamp with time zone") .HasColumnName("date_last_update") .HasComment("Дата последнего обновления"); @@ -482,7 +482,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_deposit", null, t => + b.ToTable("t_deposit", t => { t.HasComment("Месторождение"); }); @@ -553,7 +553,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_detected_operation", null, t => + b.ToTable("t_detected_operation", t => { t.HasComment("автоматически определенные операции по телеметрии"); }); @@ -591,7 +591,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_drill_test", null, t => + b.ToTable("t_drill_test", t => { t.HasComment("Drill_test"); }); @@ -629,7 +629,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_driller", null, t => + b.ToTable("t_driller", t => { t.HasComment("Бурильщик"); }); @@ -659,7 +659,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell", "IdFileCategory") .IsUnique(); - b.ToTable("t_drilling_program_part", null, t => + b.ToTable("t_drilling_program_part", t => { t.HasComment("части программ бурения"); }); @@ -737,7 +737,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdAuthorQuestion"); - b.ToTable("t_faq", null, t => + b.ToTable("t_faq", t => { t.HasComment("вопросы пользователей"); }); @@ -765,7 +765,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_file_category", null, t => + b.ToTable("t_file_category", t => { t.HasComment("Категории файлов"); }); @@ -1166,7 +1166,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_file_info", null, t => + b.ToTable("t_file_info", t => { t.HasComment("Файлы всех категорий"); }); @@ -1218,7 +1218,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_file_mark", null, t => + b.ToTable("t_file_mark", t => { t.HasComment("Действия с файлами."); }); @@ -1248,7 +1248,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_float", null, t => + b.ToTable("t_wits_float", t => { t.HasComment("таблица данных ГТИ с типом значения float"); }); @@ -1278,7 +1278,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_int", null, t => + b.ToTable("t_wits_int", t => { t.HasComment("таблица данных ГТИ с типом значения int"); }); @@ -1309,7 +1309,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime"); - b.ToTable("t_wits_string", null, t => + b.ToTable("t_wits_string", t => { t.HasComment("таблица данных ГТИ с типом значения string"); }); @@ -1350,7 +1350,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdCategory"); - b.ToTable("t_help_page", null, t => + b.ToTable("t_help_page", t => { t.HasComment("Справки"); }); @@ -1393,7 +1393,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_limiting_parameter", null, t => + b.ToTable("t_limiting_parameter", t => { t.HasComment("Ограничения по параметрам телеметрии"); }); @@ -1408,7 +1408,7 @@ namespace AsbCloudDb.Migrations NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("DateDownload") + b.Property("DateDownload") .HasColumnType("timestamp with time zone") .HasColumnName("date_download") .HasComment("Дата загрузки"); @@ -1442,7 +1442,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDirectory"); - b.ToTable("t_manual", null, t => + b.ToTable("t_manual", t => { t.HasComment("Инструкции"); }); @@ -1472,7 +1472,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdParent"); - b.ToTable("t_manual_directory", null, t => + b.ToTable("t_manual_directory", t => { t.HasComment("Директория для инструкций"); }); @@ -1519,7 +1519,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_measure", null, t => + b.ToTable("t_measure", t => { t.HasComment("Таблица c данными для вкладки 'Последние данные'"); }); @@ -1547,7 +1547,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_measure_category", null, t => + b.ToTable("t_measure_category", t => { t.HasComment("Категория последних данных"); }); @@ -1603,17 +1603,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("Дата отправки уведомления"); @@ -1630,7 +1630,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_notification", null, t => + b.ToTable("t_notification", t => { t.HasComment("Уведомления"); }); @@ -1652,7 +1652,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_notification_category", null, t => + b.ToTable("t_notification_category", t => { t.HasComment("Категории уведомлений"); }); @@ -1711,7 +1711,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_operationvalue", null, t => + b.ToTable("t_operationvalue", t => { t.HasComment("Целевые/нормативные показатели операции"); }); @@ -1741,7 +1741,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_permission", null, t => + b.ToTable("t_permission", t => { t.HasComment("Разрешения на доступ к данным"); }); @@ -2768,7 +2768,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_process_map_plan_drilling", null, t => + b.ToTable("t_process_map_plan_drilling", t => { t.HasComment("РТК план бурение"); }); @@ -2889,7 +2889,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_process_map_plan_ream", null, t => + b.ToTable("t_process_map_plan_ream", t => { t.HasComment("РТК проработка скважины"); }); @@ -2909,7 +2909,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_relation_company_well", null, t => + b.ToTable("t_relation_company_well", t => { t.HasComment("отношение скважин и компаний"); }); @@ -2929,7 +2929,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_relation_contact_well", (string)null); + b.ToTable("t_relation_contact_well"); }); modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => @@ -2952,7 +2952,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdDrillingProgramPart"); - b.ToTable("t_relation_user_drilling_program_part", null, t => + b.ToTable("t_relation_user_drilling_program_part", t => { t.HasComment("Отношение пользователей и частей ПБ"); }); @@ -2972,7 +2972,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdPermission"); - b.ToTable("t_relation_user_role_permission", null, t => + b.ToTable("t_relation_user_role_permission", t => { t.HasComment("Отношение ролей пользователей и разрешений доступа"); }); @@ -4290,7 +4290,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdInclude"); - b.ToTable("t_relation_user_role_user_role", null, t => + b.ToTable("t_relation_user_role_user_role", t => { t.HasComment("Отношение ролей к ролям"); }); @@ -4582,7 +4582,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUserRole"); - b.ToTable("t_relation_user_user_role", null, t => + b.ToTable("t_relation_user_user_role", t => { t.HasComment("Отношение пользователей и ролей"); }); @@ -4639,7 +4639,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_report_property", null, t => + b.ToTable("t_report_property", t => { t.HasComment("Отчеты с данными по буровым"); }); @@ -4691,7 +4691,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_schedule", null, t => + b.ToTable("t_schedule", t => { t.HasComment("График работы бурильщика"); }); @@ -4747,7 +4747,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_setpoints_rquest", null, t => + b.ToTable("t_setpoints_rquest", t => { t.HasComment("Запросы на изменение уставок панели оператора"); }); @@ -4775,7 +4775,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_subsystem", null, t => + b.ToTable("t_subsystem", t => { t.HasComment("Описание подсистем"); }); @@ -4844,7 +4844,7 @@ namespace AsbCloudDb.Migrations b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); - b.ToTable("t_telemetry", null, t => + b.ToTable("t_telemetry", t => { t.HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); }); @@ -5063,7 +5063,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_data_saub", null, t => + b.ToTable("t_telemetry_data_saub", t => { t.HasComment("набор основных данных по SAUB"); }); @@ -5163,7 +5163,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_data_spin", null, t => + b.ToTable("t_telemetry_data_spin", t => { t.HasComment("набор основных данных по SpinMaster"); }); @@ -5190,7 +5190,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdEvent"); - b.ToTable("t_telemetry_event", null, t => + b.ToTable("t_telemetry_event", t => { t.HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); }); @@ -5251,7 +5251,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdTelemetry"); - b.ToTable("t_telemetry_message", null, t => + b.ToTable("t_telemetry_message", t => { t.HasComment("Сообщения на буровых"); }); @@ -5289,7 +5289,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "IdUser"); - b.ToTable("t_telemetry_user", null, t => + b.ToTable("t_telemetry_user", t => { t.HasComment("Пользователи панели САУБ. Для сообщений."); }); @@ -5332,7 +5332,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry"); - b.ToTable("t_telemetry_wireline_run_out", null, t => + b.ToTable("t_telemetry_wireline_run_out", t => { t.HasComment("Наработка талевого каната"); }); @@ -5398,7 +5398,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_trajectory_fact", null, t => + b.ToTable("t_trajectory_fact", t => { t.HasComment("Загрузка фактической траектории"); }); @@ -5469,7 +5469,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell"); - b.ToTable("t_trajectory_plan", null, t => + b.ToTable("t_trajectory_plan", t => { t.HasComment("Загрузка плановой траектории"); }); @@ -5550,7 +5550,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("Login") .IsUnique(); - b.ToTable("t_user", null, t => + b.ToTable("t_user", t => { t.HasComment("Пользователи облака"); }); @@ -5591,7 +5591,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_user_role", null, t => + b.ToTable("t_user_role", t => { t.HasComment("Роли пользователей в системе"); }); @@ -5930,7 +5930,7 @@ namespace AsbCloudDb.Migrations b.HasKey("IdUser", "Key"); - b.ToTable("t_user_settings", null, t => + b.ToTable("t_user_settings", t => { t.HasComment("настройки интерфейса пользователя"); }); @@ -5976,7 +5976,9 @@ namespace AsbCloudDb.Migrations b.HasKey("IdTelemetry", "DateTime"); - b.ToTable("t_telemetry_wits_base", (string)null); + b.ToTable("t_telemetry_wits_base"); + + b.UseTptMappingStrategy(); }); modelBuilder.Entity("AsbCloudDb.Model.Well", b => @@ -6034,7 +6036,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellType"); - b.ToTable("t_well", null, t => + b.ToTable("t_well", t => { t.HasComment("скважины"); }); @@ -6063,7 +6065,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSrc"); - b.ToTable("t_well_composite", null, t => + b.ToTable("t_well_composite", t => { t.HasComment("Композитная скважина"); }); @@ -6090,7 +6092,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdUser"); - b.ToTable("t_well_final_documents", null, t => + b.ToTable("t_well_final_documents", t => { t.HasComment("Дело скважины"); }); @@ -6180,7 +6182,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSectionType"); - b.ToTable("t_well_operation", null, t => + b.ToTable("t_well_operation", t => { t.HasComment("Данные по операциям на скважине"); }); @@ -6222,7 +6224,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdParent"); - b.ToTable("t_well_operation_category", null, t => + b.ToTable("t_well_operation_category", t => { t.HasComment("Справочник операций на скважине"); }); @@ -6271,6 +6273,13 @@ namespace AsbCloudDb.Migrations Name = "Непроизводительное время (НПВ)" }, new + { + Id = 3006, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Заключительные работы" + }, + new { Id = 4000, IdParent = 3000, @@ -6423,6 +6432,14 @@ namespace AsbCloudDb.Migrations Name = "Незаложенные в ГГД операции" }, new + { + Id = 4019, + IdParent = 3006, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Заключительные операции" + }, + new { Id = 5000, IdParent = 4000, @@ -7309,6 +7326,30 @@ namespace AsbCloudDb.Migrations KeyValueName = "dT", KeyValueUnits = "мин", Name = "Работа пакером в обсадной колонне" + }, + new + { + Id = 5113, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение" + }, + new + { + Id = 5114, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ТО оборудования" + }, + new + { + Id = 5115, + IdParent = 4019, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск НКТ" }); }); @@ -7335,7 +7376,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_well_section_type", null, t => + b.ToTable("t_well_section_type", t => { t.HasComment("конструкция секции скважины"); }); @@ -7627,7 +7668,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWell", "IdSectionType") .IsUnique(); - b.ToTable("t_well_section_plan", (string)null); + b.ToTable("t_well_section_plan"); }); modelBuilder.Entity("AsbCloudDb.Model.WellType", b => @@ -7648,7 +7689,7 @@ namespace AsbCloudDb.Migrations b.HasKey("Id"); - b.ToTable("t_well_type", null, t => + b.ToTable("t_well_type", t => { t.HasComment("конструкция скважины"); }); @@ -7827,7 +7868,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_1", (string)null); + b.ToTable("t_telemetry_wits_1"); }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => @@ -7915,7 +7956,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_50", (string)null); + b.ToTable("t_telemetry_wits_50"); }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => @@ -7967,7 +8008,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_60", (string)null); + b.ToTable("t_telemetry_wits_60"); }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => @@ -8023,7 +8064,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_61", (string)null); + b.ToTable("t_telemetry_wits_61"); }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => @@ -8111,7 +8152,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_7", (string)null); + b.ToTable("t_telemetry_wits_7"); }); modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => @@ -8315,7 +8356,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("TelemetryId"); - b.ToTable("t_telemetry_wits_8", (string)null); + b.ToTable("t_telemetry_wits_8"); }); modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => diff --git a/AsbCloudDb/Model/WellOperationCategory.cs b/AsbCloudDb/Model/WellOperationCategory.cs index 5014ac14..279246bb 100644 --- a/AsbCloudDb/Model/WellOperationCategory.cs +++ b/AsbCloudDb/Model/WellOperationCategory.cs @@ -39,6 +39,11 @@ namespace AsbCloudDb.Model /// public const int IdNonProductiveTime = 3005; + /// + /// Заключительные работы + /// + public const int IdFinalWorks = 3006; + /// /// КНБК /// @@ -129,6 +134,11 @@ namespace AsbCloudDb.Model /// public const int IdOperationsNotIncludedGGD = 4017; + /// + /// Заключительные операции + /// + public const int IdFinalOperations = 4019; + /// /// Разборка КНБК /// @@ -240,6 +250,7 @@ namespace AsbCloudDb.Model new() { Id = IdGFR, Name = "ГФР", KeyValueName = "dT", KeyValueUnits = "мин" }, new() { Id = IdAuxiliaryOperations, Name = "Вспомогательные операции", KeyValueName = "dT", KeyValueUnits = "мин" }, new() { Id = IdNonProductiveTime, Name = "Непроизводительное время (НПВ)", KeyValueName = "dT", KeyValueUnits = "мин" }, + new() { Id = IdFinalWorks, Name = "Заключительные работы", KeyValueName = "dT", KeyValueUnits = "мин" }, }; /// @@ -265,6 +276,7 @@ namespace AsbCloudDb.Model new () {Id = IdEmergencyWork, IdParent = 3005, Name = "Аварийные работы", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = IdComplication, IdParent = 3005, Name = "Осложнение", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = IdOperationsNotIncludedGGD, IdParent = 3005, Name = "Незаложенные в ГГД операции", KeyValueName = "dT", KeyValueUnits = "мин" }, + new () {Id = IdFinalOperations, IdParent = IdFinalWorks, Name = "Заключительные операции", KeyValueName = "dT", KeyValueUnits = "мин" }, }; /// @@ -381,7 +393,10 @@ namespace AsbCloudDb.Model new () {Id = 5109, IdParent = 4018, Name = "Стыковка стингера с хвостовиком основного ствола", KeyValueName = "dT", KeyValueUnits = "мин"}, new () {Id = 5110, IdParent = 4018, Name = "Ориентирование и установка стыковочного узла хвостовика", KeyValueName = "dT", KeyValueUnits = "мин"}, new () {Id = 5111, IdParent = 4001, Name = "Бурение с отбором керна", KeyValueName = "МСП", KeyValueUnits = "м/ч"}, - new () {Id = 5112, IdParent = 4018, Name = "Работа пакером в обсадной колонне", KeyValueName = "dT", KeyValueUnits = "мин"} + new () {Id = 5112, IdParent = 4018, Name = "Работа пакером в обсадной колонне", KeyValueName = "dT", KeyValueUnits = "мин"}, + new () {Id = 5113, IdParent = 4001, Name = "Бурение", KeyValueName = "МСП", KeyValueUnits = "м/ч"}, + new () {Id = 5114, IdParent = 4013, Name = "ТО оборудования", KeyValueName = "dT", KeyValueUnits = "мин"}, + new () {Id = 5115, IdParent = IdFinalOperations, Name = "Спуск НКТ", KeyValueName = "dT", KeyValueUnits = "мин"}, }; #endregion From c4bb5f90407395aef884882582c86c6e97f00b88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 4 Apr 2024 07:41:00 +0300 Subject: [PATCH 059/132] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D0=BE=D1=82=20=D0=93=D0=A2=D0=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Добавлен новый Dto 2. Обновлён репозиторий 3. Обновление API --- AsbCloudApp/Data/GTR/GtrWitsDto.cs | 214 ++++++++++++++++++ AsbCloudApp/Repositories/IGtrRepository.cs | 12 + ...GtrWithGetDataRequest.cs => GtrRequest.cs} | 19 +- .../Repository/GtrWitsRepository.cs | 89 ++++++++ .../Clients/IGtrWitsClient.cs | 13 ++ .../Controllers/GtrControllerTests.cs | 68 ++++++ .../Controllers/GtrWitsController.cs | 65 ++++++ .../Controllers/SAUB/GtrWitsController.cs | 2 +- 8 files changed, 480 insertions(+), 2 deletions(-) create mode 100644 AsbCloudApp/Data/GTR/GtrWitsDto.cs rename AsbCloudApp/Requests/{GtrWithGetDataRequest.cs => GtrRequest.cs} (63%) create mode 100644 AsbCloudWebApi.IntegrationTests/Clients/IGtrWitsClient.cs create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/GtrControllerTests.cs create mode 100644 AsbCloudWebApi/Controllers/GtrWitsController.cs diff --git a/AsbCloudApp/Data/GTR/GtrWitsDto.cs b/AsbCloudApp/Data/GTR/GtrWitsDto.cs new file mode 100644 index 00000000..a8ecb939 --- /dev/null +++ b/AsbCloudApp/Data/GTR/GtrWitsDto.cs @@ -0,0 +1,214 @@ +namespace AsbCloudApp.Data.GTR; + +public class GtrWitsDto +{ + /// + /// Вес на крюке + /// + public float? HKLA { get; set; } + + /// + /// Высота крюка + /// + public float? BLKPOS { get; set; } + + /// + /// Нагрузка на долото + /// + public float? WOBA { get; set; } + + /// + /// Момент на роторе/ВСП + /// + public float? TORQA { get; set; } + + /// + /// Давление на входе (на стояке) + /// + public float? SPPA { get; set; } + + /// + /// Обороты ротора/ВСП + /// + public float? RPMA { get; set; } + + /// + /// Механическая скорость + /// + public float? ROPA { get; set; } + + /// + /// Скорость инструмента вверх + /// + public float? RSUX { get; set; } + + /// + /// Скорость инструмента вниз + /// + public float? RSDX { get; set; } + + /// + /// Расход на входе + /// + public float? MFIA { get; set; } + + /// + /// Расход на выходе + /// + public float? MFOA { get; set; } + + /// + /// Температура на входе + /// + public float? MTIA { get; set; } + + /// + /// Температура на выходе + /// + public float? MTOA { get; set; } + + /// + /// Ходы насоса №1 + /// + public float? SPM1 { get; set; } + + /// + /// Ходы насоса №2 + /// + public float? SPM2 { get; set; } + + /// + /// Ходы насоса №3 + /// + public float? SPM3 { get; set; } + + /// + /// Общий объем бурового раствора на поверхности + /// + public float? TVOLACT { get; set; } + + /// + /// Объем бурового раствора в доливной емкости №1 + /// + public float? TTVOL1 { get; set; } + + /// + /// Объем бурового раствора в доливной емкости №2 + /// + public float? TTVOL2 { get; set; } + + /// + /// Объем бурового раствора в емкости №1 + /// + public float? TVOL01 { get; set; } + + /// + /// Объем бурового раствора в емкости №2 + /// + public float? TVOL02 { get; set; } + + /// + /// Объем бурового раствора в емкости №3 + /// + public float? TVOL03 { get; set; } + + /// + /// Объем бурового раствора в емкости №4 + /// + public float? TVOL04 { get; set; } + + /// + /// Объем бурового раствора в емкости №5 + /// + public float? TVOL05 { get; set; } + + /// + /// Объем бурового раствора в емкости №6 + /// + public float? TVOL06 { get; set; } + + /// + /// Объем бурового раствора в емкости №7 + /// + public float? TVOL07 { get; set; } + + /// + /// Объем бурового раствора в емкости №8 + /// + public float? TVOL08 { get; set; } + + /// + /// Объем бурового раствора в емкости №9 + /// + public float? TVOL09 { get; set; } + + /// + /// Объем бурового раствора в емкости №10 + /// + public float? TVOL10 { get; set; } + + /// + /// Объем бурового раствора в емкости №11 + /// + public float? TVOL11 { get; set; } + + /// + /// Объем бурового раствора в емкости №12 + /// + public float? TVOL12 { get; set; } + + /// + /// Объем бурового раствора в емкости №13 + /// + public float? TVOL13 { get; set; } + + /// + /// Объем бурового раствора в емкости №14 + /// + public float? TVOL14 { get; set; } + + /// + /// Плотность (удельный вес) бурового раствора на выходе + /// + public float? MDOA { get; set; } + + /// + /// Плотность (удельный вес) бурового раствора на входе + /// + public float? MDIA { get; set; } + + /// + /// Процентное содержание метана + /// + public float? METHANE { get; set; } + + /// + /// Процентное содержание этана + /// + public float? ETHANE { get; set; } + + /// + /// Процентное содержание пропана + /// + public float? PROPANE { get; set; } + + /// + /// Процентное содержание бутана + /// + public float? IBUTANE { get; set; } + + /// + /// Процентное содержание пентана + /// + public float? NBUTANE { get; set; } + + /// + /// Процентное содержание углеводородов + /// + public float? HydrocarbonPercentage => METHANE + ETHANE + PROPANE + IBUTANE + NBUTANE; + + /// + /// Процентное содержание газов + /// + public float? GASA { get; set; } +} \ No newline at end of file diff --git a/AsbCloudApp/Repositories/IGtrRepository.cs b/AsbCloudApp/Repositories/IGtrRepository.cs index 0d597dde..1aadfb96 100644 --- a/AsbCloudApp/Repositories/IGtrRepository.cs +++ b/AsbCloudApp/Repositories/IGtrRepository.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Requests; namespace AsbCloudApp.Repositories { @@ -19,6 +20,14 @@ namespace AsbCloudApp.Repositories /// /// Task SaveDataAsync(int idTelemetry, IEnumerable dtos, CancellationToken token); + + /// + /// получить данные ГТИ + /// + /// + /// + /// + Task> GetAsync(GtrRequest request, CancellationToken token); /// /// получить данные для клиента @@ -29,6 +38,7 @@ namespace AsbCloudApp.Repositories /// кол-во элементов до которых эти данные прореживаются /// /// + [Obsolete] Task> GetAsync(int idWell, DateTime? dateBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default); @@ -39,6 +49,7 @@ namespace AsbCloudApp.Repositories /// /// /// + [Obsolete] IEnumerable GetLastDataByRecordId(int idWell, int idRecord); /// @@ -46,6 +57,7 @@ namespace AsbCloudApp.Repositories /// /// /// + [Obsolete] IEnumerable GetLastData(int idWell); } } diff --git a/AsbCloudApp/Requests/GtrWithGetDataRequest.cs b/AsbCloudApp/Requests/GtrRequest.cs similarity index 63% rename from AsbCloudApp/Requests/GtrWithGetDataRequest.cs rename to AsbCloudApp/Requests/GtrRequest.cs index 8e93a02c..8ba678b2 100644 --- a/AsbCloudApp/Requests/GtrWithGetDataRequest.cs +++ b/AsbCloudApp/Requests/GtrRequest.cs @@ -5,7 +5,7 @@ namespace AsbCloudApp.Requests; /// /// Параметры запроса для получения загруженных данных ГТИ по скважине /// -public class GtrWithGetDataRequest +public class GtrRequestBase { /// /// Дата начала выборки.По умолчанию: текущее время - IntervalSec @@ -20,5 +20,22 @@ public class GtrWithGetDataRequest /// /// Желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена. /// + [Obsolete] public int ApproxPointsCount { get; set; } = 1024; +} + +/// +/// Параметры запроса для получения загруженных данных ГТИ по скважине +/// +public class GtrRequest : GtrRequestBase +{ + public GtrRequest(int idWell, GtrRequestBase request) + { + IdWell = idWell; + Begin = request.Begin; + IntervalSec = request.IntervalSec; + ApproxPointsCount = request.ApproxPointsCount; + } + + public int IdWell { get; set; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs index 2a871553..5d0cda7b 100644 --- a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs +++ b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs @@ -12,11 +12,58 @@ using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Requests; +using Mapster; namespace AsbCloudInfrastructure.Repository { public class GtrWitsRepository : IGtrRepository { + private static IDictionary<(int, int), string> WitsParameters = new Dictionary<(int, int), string> + { + { (1, 14), nameof(GtrWitsDto.HKLA) }, + { (1, 12), nameof(GtrWitsDto.BLKPOS) }, + { (1, 16), nameof(GtrWitsDto.WOBA) }, + { (1, 18), nameof(GtrWitsDto.TORQA) }, + { (1, 21), nameof(GtrWitsDto.SPPA) }, + { (2, 15), nameof(GtrWitsDto.RPMA) }, + { (1, 13), nameof(GtrWitsDto.ROPA) }, + { (3, 16), nameof(GtrWitsDto.RSUX) }, + { (3, 17), nameof(GtrWitsDto.RSDX) }, + { (1, 30), nameof(GtrWitsDto.MFIA) }, + { (1, 29), nameof(GtrWitsDto.MFOA)}, + { (1, 34), nameof(GtrWitsDto.MTIA) }, + { (1, 33), nameof(GtrWitsDto.MTOA) }, + { (1, 23), nameof(GtrWitsDto.SPM1) }, + { (1, 24), nameof(GtrWitsDto.SPM2) }, + { (1, 25), nameof(GtrWitsDto.SPM3) }, + { (1, 26), nameof(GtrWitsDto.TVOLACT) }, + { (11, 29), nameof(GtrWitsDto.TTVOL1) }, + { (11, 30), nameof(GtrWitsDto.TTVOL2) }, + { (11, 15), nameof(GtrWitsDto.TVOL01) }, + { (11, 16), nameof(GtrWitsDto.TVOL02) }, + { (11, 17), nameof(GtrWitsDto.TVOL03) }, + { (11, 18), nameof(GtrWitsDto.TVOL04) }, + { (11, 19), nameof(GtrWitsDto.TVOL05) }, + { (11, 20), nameof(GtrWitsDto.TVOL06) }, + { (11, 21), nameof(GtrWitsDto.TVOL07) }, + { (11, 22), nameof(GtrWitsDto.TVOL08) }, + { (11, 23), nameof(GtrWitsDto.TVOL09) }, + { (11, 24), nameof(GtrWitsDto.TVOL10) }, + { (11, 25), nameof(GtrWitsDto.TVOL11) }, + { (11, 26), nameof(GtrWitsDto.TVOL12) }, + { (11, 27), nameof(GtrWitsDto.TVOL13) }, + { (11, 28), nameof(GtrWitsDto.TVOL14) }, + { (1, 31), nameof(GtrWitsDto.MDOA) }, + { (1, 32), nameof(GtrWitsDto.MDIA) }, + { (12, 12), nameof(GtrWitsDto.METHANE) }, + { (12, 13), nameof(GtrWitsDto.ETHANE) }, + { (12, 14), nameof(GtrWitsDto.PROPANE) }, + { (12, 15), nameof(GtrWitsDto.IBUTANE) }, + { (12, 16), nameof(GtrWitsDto.NBUTANE) }, + { (1, 40), nameof(GtrWitsDto.GASA) }, + }; + private readonly IAsbCloudDbContext db; private readonly ITelemetryService telemetryService; private static ConcurrentDictionary> cache = new(); @@ -28,6 +75,48 @@ namespace AsbCloudInfrastructure.Repository this.db = db; this.telemetryService = telemetryService; } + + public async Task> GetAsync(GtrRequest request, CancellationToken token) + { + var interval = TimeSpan.FromSeconds(10); + var query = BuildQuery(request); + var entities = await query.AsNoTracking().ToArrayAsync(token); + + var dtos = entities + .GroupBy(e => e.DateTime.Ticks / interval.Ticks) + .Select(Convert); + + return dtos; + } + + private static GtrWitsDto Convert(IEnumerable scr) + { + var values = scr.GroupBy(e => (e.IdRecord, e.IdItem)) + .ToDictionary(g => WitsParameters[g.Key], g => g.LastOrDefault()?.Value); + + var dto = values.Adapt(); + + return dto; + } + + private IQueryable BuildQuery(GtrRequest request) + where TEntity : WitsItemBase + where TType : notnull + { + var query = db.Set().OrderBy(e => e.DateTime) + .Where(e => e.Telemetry != null && + e.Telemetry.Well != null && + e.Telemetry.Well.Id == request.IdWell) + .Where(e => e.DateTime >= DateTime.UtcNow.AddSeconds(-request.IntervalSec)); + + if (request.Begin.HasValue) + { + var dateBeginUtc = request.Begin.Value.ToUniversalTime(); + query = query.Where(e => e.DateTime >= dateBeginUtc); + } + + return query; + } public async Task> GetAsync(int idWell, DateTime? dateBegin, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default) { diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IGtrWitsClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IGtrWitsClient.cs new file mode 100644 index 00000000..17f76a33 --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Clients/IGtrWitsClient.cs @@ -0,0 +1,13 @@ +using AsbCloudApp.Data.GTR; +using AsbCloudApp.Requests; +using Refit; + +namespace AsbCloudWebApi.IntegrationTests.Clients; + +public interface IGtrWitsClient +{ + private const string BaseRoute = "/api/well/{idWell}/gtrWits"; + + [Get(BaseRoute)] + Task>> GetAllAsync(int idWell, [Query] GtrRequestBase request); +} \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/GtrControllerTests.cs b/AsbCloudWebApi.IntegrationTests/Controllers/GtrControllerTests.cs new file mode 100644 index 00000000..eb1e96d8 --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Controllers/GtrControllerTests.cs @@ -0,0 +1,68 @@ +using System.Net; +using AsbCloudApp.Requests; +using AsbCloudDb.Model.GTR; +using AsbCloudWebApi.IntegrationTests.Clients; +using Xunit; + +namespace AsbCloudWebApi.IntegrationTests.Controllers; + +public class GtrControllerTests : BaseIntegrationTest +{ + private readonly IGtrWitsClient client; + + public GtrControllerTests(WebAppFactoryFixture factory) + : base(factory) + { + client = factory.GetAuthorizedHttpClient(string.Empty); + } + + [Fact] + public async Task GetAll_returns_success() + { + //arrange + var well = dbContext.Wells.First(); + + var witsItems = CreateWitsItems(well.IdTelemetry!.Value); + dbContext.WitsItemFloat.AddRange(witsItems); + await dbContext.SaveChangesAsync(); + + var request = new GtrRequestBase(); + + //act + var response = await client.GetAllAsync(well.Id, request); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.True(response.Content.Any()); + } + + private static IEnumerable CreateWitsItems(int idTelemetry) => + new[] + { + new WitsItemFloat + { + IdRecord = 1, + IdItem = 14, + Value = 4, + IdTelemetry = idTelemetry, + DateTime = DateTimeOffset.UtcNow + }, + new WitsItemFloat + { + IdRecord = 1, + IdItem = 14, + Value = 5, + IdTelemetry = idTelemetry, + DateTime = DateTimeOffset.UtcNow + }, + new WitsItemFloat + { + IdRecord = 1, + IdItem = 12, + Value = 5, + IdTelemetry = idTelemetry, + DateTime = DateTimeOffset.UtcNow.AddSeconds(10) + } + }; +} \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/GtrWitsController.cs b/AsbCloudWebApi/Controllers/GtrWitsController.cs new file mode 100644 index 00000000..69d8a7d2 --- /dev/null +++ b/AsbCloudWebApi/Controllers/GtrWitsController.cs @@ -0,0 +1,65 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.GTR; +using AsbCloudApp.Exceptions; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace AsbCloudWebApi.Controllers; + +[ApiController] +[Route("api/well/{idWell}/[controller]")] +[Authorize] +public class GtrWitsController : ControllerBase +{ + private readonly IWellService wellService; + private readonly IGtrRepository gtrRepository; + + public GtrWitsController(IWellService wellService, + IGtrRepository gtrRepository) + { + this.wellService = wellService; + this.gtrRepository = gtrRepository; + } + + /// + /// Получить значение от ГТИ + /// + /// + /// + /// + /// + [HttpGet] + [Permission] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task GetAllAsync(int idWell, [FromQuery] GtrRequestBase request, CancellationToken token) + { + await AssertUserHasAccessToWellAsync(idWell, token); + + var requestToRepository = new GtrRequest(idWell, request); + + var dtos = await gtrRepository.GetAsync(requestToRepository, token); + + return Ok(dtos); + } + + private async Task AssertUserHasAccessToWellAsync(int idWell, CancellationToken token) + { + var idUser = User.GetUserId(); + var idCompany = User.GetCompanyId(); + + if (!idUser.HasValue) + throw new ForbidException("Нет доступа к скважине"); + + if (!idCompany.HasValue) + throw new ForbidException("Нет доступа к скважине"); + + if (!await wellService.IsCompanyInvolvedInWellAsync(idCompany.Value, idWell, token)) + throw new ForbidException("Нет доступа к скважине"); + } +} \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs index f4cfe0b4..95662fe2 100644 --- a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs @@ -46,7 +46,7 @@ namespace AsbCloudWebApi.Controllers.SAUB /// [HttpGet("{idWell}")] public async Task>> GetDataAsync([Required] int idWell, - [FromQuery] GtrWithGetDataRequest request, + [FromQuery] GtrRequest request, CancellationToken token) { int? idCompany = User.GetCompanyId(); From 3f7724500b970164243c8854672b51b76a740b3a Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 4 Apr 2024 11:58:29 +0500 Subject: [PATCH 060/132] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=B9=20"=D0=A4=D1=80=D0=B5=D0=B7=D0=B5=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BA=D0=BD=D0=B0?= =?UTF-8?q?"=20=D0=B8=20"=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D1=82=D0=B2=D0=BE=D0=BB=D0=B0'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...dd_NewWellOperationCategories.Designer.cs} | 20 +++++++++++++++++-- ...4064028_Add_NewWellOperationCategories.cs} | 12 +++++++++++ .../AsbCloudDbContextModelSnapshot.cs | 18 ++++++++++++++++- AsbCloudDb/Model/WellOperationCategory.cs | 2 ++ 4 files changed, 49 insertions(+), 3 deletions(-) rename AsbCloudDb/Migrations/{20240403143143_Add_NewWellOperationCategories.Designer.cs => 20240404064028_Add_NewWellOperationCategories.Designer.cs} (99%) rename AsbCloudDb/Migrations/{20240403143143_Add_NewWellOperationCategories.cs => 20240404064028_Add_NewWellOperationCategories.cs} (81%) diff --git a/AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.Designer.cs b/AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.Designer.cs similarity index 99% rename from AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.Designer.cs rename to AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.Designer.cs index 3f2746c7..905664c7 100644 --- a/AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.Designer.cs +++ b/AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.Designer.cs @@ -13,7 +13,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace AsbCloudDb.Migrations { [DbContext(typeof(AsbCloudDbContext))] - [Migration("20240403143143_Add_NewWellOperationCategories")] + [Migration("20240404064028_Add_NewWellOperationCategories")] partial class Add_NewWellOperationCategories { /// @@ -22,7 +22,7 @@ namespace AsbCloudDb.Migrations #pragma warning disable 612, 618 modelBuilder .UseCollation("Russian_Russia.1251") - .HasAnnotation("ProductVersion", "8.0.3") + .HasAnnotation("ProductVersion", "8.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); @@ -7353,6 +7353,22 @@ namespace AsbCloudDb.Migrations KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск НКТ" + }, + new + { + Id = 5116, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Фрезерование \"Окна\"" + }, + new + { + Id = 5117, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Расширение ствола" }); }); diff --git a/AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.cs b/AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.cs similarity index 81% rename from AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.cs rename to AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.cs index a0d0e2a9..396700c4 100644 --- a/AsbCloudDb/Migrations/20240403143143_Add_NewWellOperationCategories.cs +++ b/AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.cs @@ -20,6 +20,8 @@ namespace AsbCloudDb.Migrations { 3006, null, "dT", "мин", "Заключительные работы" }, { 5113, 4001, "МСП", "м/ч", "Бурение" }, { 5114, 4013, "dT", "мин", "ТО оборудования" }, + { 5116, 4013, "dT", "мин", "Фрезерование \"Окна\"" }, + { 5117, 4013, "dT", "мин", "Расширение ствола" }, { 4019, 3006, "dT", "мин", "Заключительные операции" }, { 5115, 4019, "dT", "мин", "Спуск НКТ" } }); @@ -46,6 +48,16 @@ namespace AsbCloudDb.Migrations keyColumn: "id", keyValue: 5115); + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5116); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5117); + migrationBuilder.DeleteData( table: "t_well_operation_category", keyColumn: "id", diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 4e932c83..495d5897 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", "8.0.3") + .HasAnnotation("ProductVersion", "8.0.2") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); @@ -7350,6 +7350,22 @@ namespace AsbCloudDb.Migrations KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск НКТ" + }, + new + { + Id = 5116, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Фрезерование \"Окна\"" + }, + new + { + Id = 5117, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Расширение ствола" }); }); diff --git a/AsbCloudDb/Model/WellOperationCategory.cs b/AsbCloudDb/Model/WellOperationCategory.cs index 279246bb..a6e6fa57 100644 --- a/AsbCloudDb/Model/WellOperationCategory.cs +++ b/AsbCloudDb/Model/WellOperationCategory.cs @@ -397,6 +397,8 @@ namespace AsbCloudDb.Model new () {Id = 5113, IdParent = 4001, Name = "Бурение", KeyValueName = "МСП", KeyValueUnits = "м/ч"}, new () {Id = 5114, IdParent = 4013, Name = "ТО оборудования", KeyValueName = "dT", KeyValueUnits = "мин"}, new () {Id = 5115, IdParent = IdFinalOperations, Name = "Спуск НКТ", KeyValueName = "dT", KeyValueUnits = "мин"}, + new () {Id = 5116, IdParent = IdAuxiliaryWork, Name = "Фрезерование \"Окна\"", KeyValueName = "dT", KeyValueUnits = "мин"}, + new () {Id = 5117, IdParent = IdAuxiliaryWork, Name = "Расширение ствола", KeyValueName = "dT", KeyValueUnits = "мин"}, }; #endregion From 79929dc6d2b69bb7723b2bb970d9e6c81ab1b490 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, 8 Apr 2024 07:17:17 +0300 Subject: [PATCH 061/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B5=D0=BF=D0=BE?= =?UTF-8?q?=D0=B7=D0=B8=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 --- .../Repository/CrudRepositoryBase.cs | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs index f5d11f38..900e181c 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 AsbCloudApp.Exceptions; using Microsoft.EntityFrameworkCore.ChangeTracking; namespace AsbCloudInfrastructure.Repository @@ -120,15 +121,26 @@ namespace AsbCloudInfrastructure.Repository { if (!dtos.Any()) return 0; - - var ids = dtos.Select(d => d.Id); - - var countExistingEntities = await dbSet - .Where(d => ids.Contains(d.Id)) + + var ids = dtos + .Select(o => o.Id) + .Distinct() + .ToArray(); + + if (ids.Any(id => id == default)) + throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь Id"); + + if (ids.Length != dtos.Count()) + throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь уникальные Id"); + + var dbSet = dbContext.Set(); + + var existingEntitiesCount = await dbSet + .Where(o => ids.Contains(o.Id)) .CountAsync(token); - - if (ids.Count() > countExistingEntities) - return ICrudRepository.ErrorIdNotFound; + + if (ids.Length != existingEntitiesCount) + throw new ArgumentInvalidException(nameof(dtos), "Все записи должны существовать в БД"); var entities = dtos.Select(Convert); var entries = entities.Select(entity => dbSet.Update(entity)).Cast().ToList(); @@ -145,9 +157,8 @@ namespace AsbCloudInfrastructure.Repository .FirstOrDefault(e => e.Id == id); if (entity == default) return Task.FromResult(ICrudRepository.ErrorIdNotFound); - var entry = dbSet.Remove(entity); + dbSet.Remove(entity); var affected = dbContext.SaveChangesAsync(token); - entry.State = EntityState.Detached; return affected; } @@ -164,10 +175,8 @@ namespace AsbCloudInfrastructure.Repository 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; + dbContext.Set().RemoveRange(entities); + return await dbContext.SaveChangesAsync(token); } protected virtual TDto Convert(TEntity src) => src.Adapt(); From 25f35b77f5920df3879e8b6eb7b3144945cbbebe 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, 8 Apr 2024 07:26:24 +0300 Subject: [PATCH 062/132] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D1=8F,=20=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B2=D0=B8=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DetectedOperation/DetectedOperationDto.cs | 139 +++++++++--------- .../DetectedOperation/EnabledSubsystems.cs | 102 +++++++++++++ .../IDetectedOperationRepository.cs | 53 ++++--- .../Services/IDetectedOperationService.cs | 20 +++ .../PeriodicWorks/WorkDataSaubStat.cs | 4 +- AsbCloudInfrastructure/DependencyInjection.cs | 5 + .../Repository/DetectedOperationRepository.cs | 129 +++++----------- .../DetectedOperationExportService.cs | 3 +- .../DetectedOperationService.cs | 40 ++++- .../WorkOperationDetection.cs | 2 +- .../SAUB/DetectedOperationController.cs | 17 +-- 11 files changed, 309 insertions(+), 205 deletions(-) create mode 100644 AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs diff --git a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs index 33cc19a5..13af0e6e 100644 --- a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs +++ b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.Text.Json.Serialization; using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Data.DetectedOperation; @@ -9,84 +8,84 @@ namespace AsbCloudApp.Data.DetectedOperation; /// /// Автоматически определенная операция /// -public class DetectedOperationDto: IId +public class DetectedOperationDto : IId { - /// - [Required] - public int Id { get; set; } + /// + [Required] + public int Id { get; set; } - /// - /// Id телеметрии - /// - [Required] - public int IdTelemetry { get; set; } + /// + /// Id телеметрии + /// + [Required] + public int IdTelemetry { get; set; } - /// - /// Id названия/описания операции - /// - [Required] - public int IdCategory { get; set; } + /// + /// Id названия/описания операции + /// + [Required] + public int IdCategory { get; set; } - /// - /// Id пользователя панели на момент начала операции - /// - public int? IdUserAtStart { get; set; } - - /// - /// Пользователь панели оператора - /// - public string? TelemetryUserName { get; set; } + /// + /// Id пользователя панели на момент начала операции + /// + public int? IdUserAtStart { get; set; } + + /// + /// Id пользователя изменившего операцию + /// + public int? IdEditor { get; set; } - /// - /// Дата завершения операции в часовом поясе скважины - /// - [Required] - public DateTimeOffset DateEnd { get; set; } + /// + /// Дата завершения операции в часовом поясе скважины + /// + [Required] + public DateTimeOffset DateEnd { get; set; } - /// - /// Дата начала операции в часовом поясе скважины - /// - [Required] - public DateTimeOffset DateStart { get; set; } + /// + /// Дата начала операции в часовом поясе скважины + /// + [Required] + public DateTimeOffset DateStart { get; set; } - /// - /// глубина на завершения операции, м - /// - [Required] - public double DepthEnd { get; set; } + /// + /// глубина на завершения операции, м + /// + [Required] + public double DepthEnd { get; set; } - /// - /// глубина на начало операции, м - /// - [Required] - public double DepthStart { get; set; } + /// + /// глубина на начало операции, м + /// + [Required] + public double DepthStart { get; set; } - /// - /// Продолжительность операции в минутах - /// - [Required] - public double DurationMinutes => (DateEnd - DateStart).TotalMinutes; + /// + /// Продолжительность операции в минутах + /// + [Required] + public double DurationMinutes => (DateEnd - DateStart).TotalMinutes; + + /// + /// название/описание операции + /// + [Required] + public WellOperationCategoryDto OperationCategory { get; set; } = null!; + + /// + /// Включенные подсистемы + /// + [Required] + public EnabledSubsystems EnabledSubsystems { get; set; } - /// - /// Флаг включенной подсистемы - /// - [Required] - public int EnabledSubsystems { get; set; } + /// + /// Значение ключевой параметра операции + /// + [Required] + public double Value { get; set; } - /// - /// название/описание операции - /// - [JsonIgnore] - public WellOperationCategoryDto? OperationCategory { get; set; } - - /// - /// Ключевой параметр операции - /// - [Required] - public double Value { get; set; } - - /// - /// Доп. инфо по операции - /// - public IDictionary ExtraData { get; set; } = new Dictionary(); + /// + /// Доп. инфо по операции + /// + public IDictionary ExtraData { get; set; } = new Dictionary(); } \ No newline at end of file diff --git a/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs b/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs new file mode 100644 index 00000000..1183c2b8 --- /dev/null +++ b/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs @@ -0,0 +1,102 @@ +namespace AsbCloudApp.Data.DetectedOperation; + +/// +/// Включённые подсистемы +/// +public struct EnabledSubsystems +{ + private int value; + + private EnabledSubsystems(int value) + { + this.value = value; + } + + /// + public static implicit operator int(EnabledSubsystems param) => + param.value; + + /// + public static implicit operator EnabledSubsystems(int param) => + new(param); + + /// + /// Бурение ротором + /// + public bool IsAutoRotor + { + get => (value & (int)EnabledSubsystemsFlags.AutoRotor) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoRotor); + } + + /// + /// Бурение слайдом + /// + public bool IsAutoSlide + { + get => (value & (int)EnabledSubsystemsFlags.AutoSlide) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoSlide); + } + + /// + /// ПРОРАБОТКА + /// + public bool IsAutoConditionig + { + get => (value & (int)EnabledSubsystemsFlags.AutoConditionig) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoConditionig); + } + + /// + /// СПУСК СПО + /// + public bool IsAutoSinking + { + get => (value & (int)EnabledSubsystemsFlags.AutoSinking) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoSinking); + } + + /// + /// ПОДЪЕМ СПО + /// + public bool IsAutoLifting + { + get => (value & (int)EnabledSubsystemsFlags.AutoLifting) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoLifting); + } + + /// + /// ПОДЪЕМ С ПРОРАБОТКОЙ + /// + public bool IsAutoLiftingWithConditionig + { + get => (value & (int)EnabledSubsystemsFlags.AutoLiftingWithConditionig) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoLiftingWithConditionig); + } + + /// + /// Блокировка + /// + public bool IsAutoBlocknig + { + get => (value & (int)EnabledSubsystemsFlags.AutoBlocknig) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoBlocknig); + } + + /// + /// Осцилляция + /// + public bool IsAutoOscillation + { + get => (value & (int)EnabledSubsystemsFlags.AutoOscillation) > 0; + set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoOscillation); + } + + private void UpdateEnabledSubsystems(bool isEnable, EnabledSubsystemsFlags flag) + { + if (isEnable) + value |= (int)flag; + else + value &= ~(int)flag; + } +} \ No newline at end of file diff --git a/AsbCloudApp/Repositories/IDetectedOperationRepository.cs b/AsbCloudApp/Repositories/IDetectedOperationRepository.cs index 3c9d335b..a748984d 100644 --- a/AsbCloudApp/Repositories/IDetectedOperationRepository.cs +++ b/AsbCloudApp/Repositories/IDetectedOperationRepository.cs @@ -4,7 +4,8 @@ using AsbCloudApp.Requests; using System.Collections.Generic; using System.Threading.Tasks; using System.Threading; -using AsbCloudApp.Services; +using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; namespace AsbCloudApp.Repositories; @@ -14,14 +15,29 @@ namespace AsbCloudApp.Repositories; public interface IDetectedOperationRepository { /// - /// Добавление записей + /// Добавление нескольких записей + /// + /// + /// + /// количество добавленных + Task InsertRangeAsync(IEnumerable dtos, CancellationToken token); + + /// + /// Обновить несколько записей /// - /// /// /// /// - Task InsertRange(int? idEditor, IEnumerable dtos, CancellationToken token); + Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token); + /// + /// Удаление нескольких записей + /// + /// + /// + /// + Task DeleteRangeAsync(IEnumerable ids, CancellationToken token); + /// /// Получить автоматически определенные операции по телеметрии /// @@ -31,29 +47,12 @@ public interface IDetectedOperationRepository Task> Get(DetectedOperationByTelemetryRequest request, CancellationToken token); /// - /// Редактирование записей - /// - /// - /// - /// - /// - Task UpdateRange(int idEditor, IEnumerable dtos, CancellationToken token); - - /// - /// Удалить операции + /// Получить страницу списка операций /// /// /// /// - Task Delete(DetectedOperationByTelemetryRequest request, CancellationToken token); - - /// - /// Удаление записей - /// - /// - /// - /// - Task DeleteRange(IEnumerable ids, CancellationToken token); + Task> GetPageAsync(DetectedOperationByTelemetryRequest request, CancellationToken token); /// /// Получение дат последних определённых операций @@ -61,4 +60,12 @@ public interface IDetectedOperationRepository /// /// Task> GetLastDetectedDatesAsync(CancellationToken token); + + /// + /// Удалить операции + /// + /// + /// + /// + Task DeleteAsync(DetectedOperationByTelemetryRequest request, CancellationToken token); } diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs index 208706f7..9ab9189e 100644 --- a/AsbCloudApp/Services/IDetectedOperationService.cs +++ b/AsbCloudApp/Services/IDetectedOperationService.cs @@ -13,6 +13,26 @@ namespace AsbCloudApp.Services /// public interface IDetectedOperationService { + /// + /// Добавление операций + /// + /// + /// + /// + /// + /// + Task InsertRangeManualAsync(int idEditor, int idWell, IEnumerable dtos, CancellationToken token); + + /// + /// Редактирование операций + /// + /// + /// + /// + /// + /// + Task UpdateRangeManualAsync(int idEditor, int idWell, IEnumerable dtos, CancellationToken token); + /// /// Список названий операций. /// Если указан idWell, то возвращается список названий операций найденных на указанной скважине. diff --git a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs index 074c26ca..35979165 100644 --- a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs +++ b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs @@ -151,8 +151,6 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks private static DataSaubStatDto CalcStat(DetectedOperationDto operation, Span span) { - var hasOscillation = EnabledSubsystemsFlags.AutoOscillation.HasEnabledSubsystems(operation.EnabledSubsystems); - var aggregatedValues = CalcAggregate(span); var dateStart = span[0].DateTime; var dateEnd = span[^1].DateTime; @@ -181,7 +179,7 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks RotorSpeed = aggregatedValues.RotorSpeed, IdCategory = operation.IdCategory, EnabledSubsystems = operation.EnabledSubsystems, - HasOscillation = hasOscillation, + HasOscillation = operation.EnabledSubsystems.IsAutoOscillation, IdTelemetry = operation.IdTelemetry, Flow = aggregatedValues.Flow }; diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 1139dd3a..6e8b3e89 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -42,6 +42,7 @@ using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; +using AsbCloudApp.Data.DetectedOperation; using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; using AsbCloudInfrastructure.Services.WellOperations.Factories; @@ -51,6 +52,10 @@ namespace AsbCloudInfrastructure { public static void MapsterSetup() { + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .Ignore(source => source.OperationCategory); + TypeAdapterConfig.GlobalSettings.Default.Config .ForType() .Ignore(source => source.Driller); diff --git a/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs b/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs index 1dc63f37..3864b4e1 100644 --- a/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/DetectedOperationRepository.cs @@ -1,5 +1,4 @@ using AsbCloudApp.Data.DetectedOperation; -using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; @@ -12,38 +11,51 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore.ChangeTracking; +using AsbCloudApp.Data; namespace AsbCloudInfrastructure.Repository; -public class DetectedOperationRepository : IDetectedOperationRepository +public class DetectedOperationRepository : CrudRepositoryBase, IDetectedOperationRepository { - private readonly IAsbCloudDbContext dbContext; private readonly ITelemetryService telemetryService; - public DetectedOperationRepository(IAsbCloudDbContext dbContext, + public DetectedOperationRepository(IAsbCloudDbContext context, ITelemetryService telemetryService) + : base(context) { - this.dbContext = dbContext; this.telemetryService = telemetryService; } - - public async Task Delete(DetectedOperationByTelemetryRequest request, CancellationToken token) + + public async Task DeleteAsync(DetectedOperationByTelemetryRequest request, CancellationToken token) { var query = BuildQuery(request); dbContext.Set().RemoveRange(query); return await dbContext.SaveChangesAsync(token); } - public async Task DeleteRange(IEnumerable ids, CancellationToken token) + public async Task> GetPageAsync(DetectedOperationByTelemetryRequest request, CancellationToken token) { - var query = dbContext.Set() - .Where(e => ids.Contains( e.Id)); + var skip = request.Skip ?? 0; + var take = request.Take ?? 32; - dbContext.Set() - .RemoveRange(query); + var query = BuildQuery(request); - return await dbContext.SaveChangesAsync(token); + var entities = await query.Skip(skip) + .Take(take) + .AsNoTracking() + .ToArrayAsync(token); + + var offset = telemetryService.GetTimezone(request.IdTelemetry).Offset; + + var paginationContainer = new PaginationContainer + { + Skip = skip, + Take = take, + Count = await query.CountAsync(token), + Items = entities.Select(o => Convert(o, offset)) + }; + + return paginationContainer; } public async Task> GetLastDetectedDatesAsync(CancellationToken token) => @@ -60,82 +72,18 @@ public class DetectedOperationRepository : IDetectedOperationRepository { var query = BuildQuery(request) .Include(o => o.OperationCategory); - var entities = await query.ToArrayAsync(token); + var entities = await query.AsNoTracking().ToArrayAsync(token); var offset = telemetryService.GetTimezone(request.IdTelemetry).Offset; var dtos = entities.Select(o => Convert(o, offset)); return dtos; } - - public async Task InsertRange(int? idEditor, IEnumerable dtos, CancellationToken token) - { - if(!dtos.Any()) - return 0; - - var entities = dtos.Select(Convert); - var dbset = dbContext.Set(); - foreach(var entity in entities) - { - if (idEditor.HasValue) - entity.IdEditor = idEditor.Value; - - entity.Creation = DateTimeOffset.UtcNow; - entity.Id = default; - dbset.Add(entity); - } - - return await dbContext.SaveChangesWithExceptionHandling(token); - } - - public async Task UpdateRange(int idEditor, IEnumerable dtos, CancellationToken token) - { - if (!dtos.Any()) - return 0; - - var ids = dtos - .Select(o => o.Id) - .Distinct() - .ToArray(); - - if (ids.Any(id => id == default)) - throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь Id"); - - if (ids.Length != dtos.Count()) - throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь уникальные Id"); - - var dbSet = dbContext.Set(); - - var existingEntitiesCount = await dbSet - .Where(o => ids.Contains(o.Id)) - .CountAsync(token); - - if (ids.Length != existingEntitiesCount) - throw new ArgumentInvalidException(nameof(dtos), "Все записи должны существовать в БД"); - - var entities = dtos - .Select(dto => - { - var entity = Convert(dto); - entity.IdEditor = idEditor; - return entity; - }) - .ToArray(); - - var entries = new EntityEntry[entities.Length]; - for(var i = 0; i < entities.Length; i++) - entries[i] = dbSet.Update(entities[i]); - - var result = await dbContext.SaveChangesWithExceptionHandling(token); - - foreach (var entry in entries) - entry.State = EntityState.Detached; - - return result; - } - + private IQueryable BuildQuery(DetectedOperationByTelemetryRequest request) { var query = dbContext.Set() + .OrderBy(o => o.DateStart) + .ThenBy(o => o.DepthStart) .Where(o => o.IdTelemetry == request.IdTelemetry); if (request.IdsCategories.Any()) @@ -160,32 +108,21 @@ public class DetectedOperationRepository : IDetectedOperationRepository } if (request.SortFields?.Any() == true) - { query = query.SortBy(request.SortFields); - } - else - query = query - .OrderBy(o => o.DateStart) - .ThenBy(o => o.DepthStart); - - if (request.Skip.HasValue) - query = query.Skip((int)request.Skip); - - if (request.Take.HasValue) - query = query.Take((int)request.Take); return query; } - + private static DetectedOperationDto Convert(DetectedOperation src, TimeSpan offset) { var dto = src.Adapt(); dto.DateStart = src.DateStart.ToOffset(offset); dto.DateEnd = src.DateEnd.ToOffset(offset); + dto.EnabledSubsystems = src.EnabledSubsystems; return dto; } - private static DetectedOperation Convert(DetectedOperationDto src) + protected override DetectedOperation Convert(DetectedOperationDto src) { var entity = src.Adapt(); entity.DateStart = src.DateStart.ToUniversalTime(); diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs index 6ed731f6..00baba7f 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs @@ -162,8 +162,7 @@ public class DetectedOperationExportService private static string GetCategoryName(IEnumerable wellOperationCategories, DetectedOperationDto current) { var idCategory = current.IdCategory; - if (idCategory == WellOperationCategory.IdSlide && - EnabledSubsystemsFlags.AutoOscillation.HasEnabledSubsystems(current.EnabledSubsystems)) + if (idCategory == WellOperationCategory.IdSlide && current.EnabledSubsystems.IsAutoOscillation) return "Бурение в слайде с осцилляцией"; var category = wellOperationCategories.FirstOrDefault(o => o.Id == current.IdCategory); diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 15631c2c..167dc4de 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Exceptions; using AsbCloudInfrastructure.Services.DetectOperations.Detectors; namespace AsbCloudInfrastructure.Services.DetectOperations; @@ -80,6 +81,43 @@ public class DetectedOperationService : IDetectedOperationService return dtos; } + public async Task InsertRangeManualAsync(int idEditor, int idWell, IEnumerable dtos, CancellationToken token) + { + var idTelemetry = await GetIdTelemetryByWell(idWell, token); + + foreach (var dto in dtos) + { + dto.IdEditor = idEditor; + dto.IdTelemetry = idTelemetry; + } + + return await operationRepository.InsertRangeAsync(dtos, token); + } + + public async Task UpdateRangeManualAsync(int idEditor, int idWell, IEnumerable dtos, CancellationToken token) + { + var idTelemetry = await GetIdTelemetryByWell(idWell, token); + + foreach (var dto in dtos) + { + dto.IdEditor = idEditor; + dto.IdTelemetry = idTelemetry; + } + + return await operationRepository.UpdateRangeAsync(dtos, token); + } + + private async Task GetIdTelemetryByWell(int idWell, CancellationToken token) + { + var well = await wellService.GetOrDefaultAsync(idWell, token) ?? + throw new ArgumentInvalidException(nameof(idWell), "Well doesn`t exist"); + + var idTelemetry = well.IdTelemetry ?? + throw new ArgumentInvalidException(nameof(idWell), "У скважины отсутствует телеметрия"); + + return idTelemetry; + } + public async Task> GetCategoriesAsync(int? idWell, CancellationToken token) { if(idWell is null) @@ -213,7 +251,7 @@ public class DetectedOperationService : IDetectedOperationService return 0; var requestByTelemetry = new DetectedOperationByTelemetryRequest(well.IdTelemetry.Value, request); - var result = await operationRepository.Delete(requestByTelemetry, token); + var result = await operationRepository.DeleteAsync(requestByTelemetry, token); return result; } diff --git a/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs b/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs index e1e1212e..d001471e 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/WorkOperationDetection.cs @@ -48,7 +48,7 @@ public class WorkOperationDetection: Work var detectedOperations = await detectedOperationService.DetectOperationsAsync(telemetryId, beginDate, token); if (detectedOperations.Any()) - await detectedOperationRepository.InsertRange(null, detectedOperations, token); + await detectedOperationRepository.InsertRangeAsync(detectedOperations, token); } } } diff --git a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs index b5a94856..11d7451d 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; using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; @@ -52,7 +52,7 @@ namespace AsbCloudWebApi.Controllers.SAUB { var idUser = await AssertUserHasAccessToWellAsync(idWell, token); - var result = await detectedOperationRepository.InsertRange(idUser, dtos, token); + var result = await detectedOperationService.InsertRangeManualAsync(idUser, idWell, dtos, token); return Ok(result); } @@ -70,7 +70,7 @@ namespace AsbCloudWebApi.Controllers.SAUB { var idUser = await AssertUserHasAccessToWellAsync(idWell, token); - var result = await detectedOperationRepository.UpdateRange(idUser, dtos, token); + var result = await detectedOperationService.UpdateRangeManualAsync(idUser, idWell, dtos, token); return Ok(result); } @@ -88,7 +88,7 @@ namespace AsbCloudWebApi.Controllers.SAUB { await AssertUserHasAccessToWellAsync(idWell, token); - var result = await detectedOperationRepository.DeleteRange(ids, token); + var result = await detectedOperationRepository.DeleteRangeAsync(ids, token); return Ok(result); } @@ -117,9 +117,8 @@ namespace AsbCloudWebApi.Controllers.SAUB /// /// [HttpGet] - [ProducesResponseType(typeof(DetectedOperationDto), StatusCodes.Status200OK)] - public async Task GetAsync(int idWell, - [FromQuery] DetectedOperationRequest request, + [ProducesResponseType(typeof(PaginationContainer), StatusCodes.Status200OK)] + public async Task GetAsync(int idWell, [FromQuery] DetectedOperationRequest request, CancellationToken token) { await AssertUserHasAccessToWellAsync(idWell, token); @@ -131,7 +130,7 @@ namespace AsbCloudWebApi.Controllers.SAUB var requestToService = new DetectedOperationByTelemetryRequest(well.IdTelemetry.Value, request); - var result = await detectedOperationRepository.Get(requestToService, token); + var result = await detectedOperationRepository.GetPageAsync(requestToService, token); return Ok(result); } From c5a9f67ea004bbb91fd23723d99767bca5c91d82 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, 8 Apr 2024 07:27:17 +0300 Subject: [PATCH 063/132] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D0=B0?= =?UTF-8?q?=D0=BF=D0=B8=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=D1=91=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Clients/IDetectedOperationClient.cs | 23 +++ .../DetectedOperationControllerTests.cs | 182 ++++++++++++++++++ 2 files changed, 205 insertions(+) create mode 100644 AsbCloudWebApi.IntegrationTests/Clients/IDetectedOperationClient.cs create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/DetectedOperationControllerTests.cs diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IDetectedOperationClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IDetectedOperationClient.cs new file mode 100644 index 00000000..ecf37d37 --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Clients/IDetectedOperationClient.cs @@ -0,0 +1,23 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.DetectedOperation; +using AsbCloudApp.Requests; +using Refit; + +namespace AsbCloudWebApi.IntegrationTests.Clients; + +public interface IDetectedOperationClient +{ + private const string BaseRoute = "/api/well/{idWell}/DetectedOperation"; + + [Post(BaseRoute)] + Task> InsertRangeAsync(int idWell, IEnumerable dtos); + + [Put(BaseRoute)] + Task> UpdateRangeAsync(int idWell, IEnumerable dtos); + + [Delete(BaseRoute)] + Task> DeleteRangeAsync(int idWell, [Body] IEnumerable ids); + + [Get(BaseRoute)] + Task>> GetAsync(int idWell, [Query] DetectedOperationRequest request); +} \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/DetectedOperationControllerTests.cs b/AsbCloudWebApi.IntegrationTests/Controllers/DetectedOperationControllerTests.cs new file mode 100644 index 00000000..5f518884 --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Controllers/DetectedOperationControllerTests.cs @@ -0,0 +1,182 @@ +using System.Net; +using AsbCloudApp.Data.DetectedOperation; +using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Requests; +using AsbCloudDb.Model; +using AsbCloudWebApi.IntegrationTests.Clients; +using AsbCloudWebApi.IntegrationTests.Data; +using Mapster; +using Microsoft.EntityFrameworkCore; +using Xunit; + +namespace AsbCloudWebApi.IntegrationTests.Controllers; + +public class DetectedOperationControllerTests : BaseIntegrationTest +{ + private readonly IDetectedOperationClient client; + + private readonly DetectedOperationDto dto = new() + { + IdCategory = WellOperationCategory.IdRotor, + DateStart = new DateTimeOffset(new DateTime(2023, 5, 12, 1,0,0, DateTimeKind.Utc)), + DateEnd = new DateTimeOffset(new DateTime(2023, 5, 12, 1,0,0, DateTimeKind.Utc)), + DepthStart = 0, + DepthEnd = 80, + OperationCategory = new WellOperationCategoryDto + { + Id = WellOperationCategory.IdRotor, + IdParent = WellOperationCategory.IdDrilling, + Name = "Бурение ротором" + }, + EnabledSubsystems = new EnabledSubsystems + { + IsAutoRotor = true + }, + Value = 400, + }; + + public DetectedOperationControllerTests(WebAppFactoryFixture factory) + : base(factory) + { + client = factory.GetAuthorizedHttpClient(string.Empty); + + dbContext.CleanupDbSet(); + } + + [Fact] + public async Task InsertRangeAsync_returns_success() + { + //arrange + var well = dbContext.Wells.First(); + dto.IdTelemetry = well.IdTelemetry!.Value; + + //act + var response = await client.InsertRangeAsync(well.Id, new[] { dto }); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Equal(1, response.Content); + } + + [Fact] + public async Task UpdateRangeAsync_returns_success() + { + //arrange + var well = dbContext.Wells.First(); + dto.IdTelemetry = well.IdTelemetry!.Value; + + var entity = dto.Adapt(); + dbContext.DetectedOperations.Add(entity); + await dbContext.SaveChangesAsync(); + dto.Id = entity.Id; + + //act + var response = await client.UpdateRangeAsync(well.Id, new[] { dto }); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Equal(1, response.Content); + } + + [Fact] + public async Task UpdateRangeAsync_returns_bad_request_when_id_is_invalid() + { + //arrange + var well = dbContext.Wells.First(); + + //act + var response = await client.UpdateRangeAsync(well.Id, new[] { dto }); + + //assert + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + } + + + [Fact] + public async Task DeleteRangeAsync_returns_success() + { + //arrange + var well = dbContext.Wells.First(); + dto.IdTelemetry = well.IdTelemetry!.Value; + + var entity = dto.Adapt(); + dbContext.DetectedOperations.Add(entity); + await dbContext.SaveChangesAsync(); + + var ids = await dbContext.DetectedOperations.Select(d => d.Id).ToArrayAsync(); + + //act + var response = await client.DeleteRangeAsync(well.Id, ids); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Equal(1, response.Content); + } + + [Fact] + public async Task GetAsync_returns_first_page() + { + //arrange + const int pageSize = 10; + const int pageIndex = 0; + + var request = new DetectedOperationRequest + { + Skip = pageIndex, + Take = pageSize, + IdsCategories = new[] { dto.IdCategory } + }; + + var well = dbContext.Wells.First(); + dto.IdTelemetry = well.IdTelemetry!.Value; + + var entity = dto.Adapt(); + dbContext.DetectedOperations.Add(entity); + await dbContext.SaveChangesAsync(); + + //act + var response = await client.GetAsync(well.Id, request); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + + var totalExpected = response.Content.Count - pageSize * pageIndex; + + Assert.Equal(totalExpected, response.Content.Items.Count()); + } + + [Fact] + public async Task GetAsync_returns_first_operation() + { + //arrange + var well = dbContext.Wells.First(); + dto.IdTelemetry = well.IdTelemetry!.Value; + + var entity = dto.Adapt(); + dbContext.DetectedOperations.Add(entity); + await dbContext.SaveChangesAsync(); + + var request = new DetectedOperationRequest + { + IdsCategories = new[] { dto.IdCategory } + }; + + //act + var response = await client.GetAsync(well.Id, request); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + + var firstOperation = response.Content.Items.ElementAt(0); + + Assert.Equal(well.IdTelemetry, firstOperation.IdTelemetry); + Assert.Equal(dto.EnabledSubsystems, firstOperation.EnabledSubsystems); + Assert.Equal(dto.DateStart.ToOffset(TimeSpan.FromHours(Defaults.Timezone.Hours)), firstOperation.DateStart); + Assert.Equal(dto.DateEnd.ToOffset(TimeSpan.FromHours(Defaults.Timezone.Hours)), firstOperation.DateEnd); + } +} \ No newline at end of file From 979ed91e786f7e027a64c2b093d3a4eb0c665eeb 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, 8 Apr 2024 14:32:00 +0300 Subject: [PATCH 064/132] =?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 --- AsbCloudApp/Data/GTR/GtrWitsDto.cs | 20 ++++++ AsbCloudApp/Repositories/IGtrRepository.cs | 3 +- AsbCloudApp/Requests/GtrRequest.cs | 18 +---- .../Repository/GtrWitsRepository.cs | 68 +++++++++++++------ .../Clients/IGtrWitsClient.cs | 4 +- .../Controllers/GtrControllerTests.cs | 2 +- .../Controllers/GtrWitsController.cs | 65 ------------------ .../Controllers/SAUB/GtrWitsController.cs | 36 ++++++++++ 8 files changed, 108 insertions(+), 108 deletions(-) delete mode 100644 AsbCloudWebApi/Controllers/GtrWitsController.cs diff --git a/AsbCloudApp/Data/GTR/GtrWitsDto.cs b/AsbCloudApp/Data/GTR/GtrWitsDto.cs index a8ecb939..20d08dd6 100644 --- a/AsbCloudApp/Data/GTR/GtrWitsDto.cs +++ b/AsbCloudApp/Data/GTR/GtrWitsDto.cs @@ -1,7 +1,27 @@ +using System; + namespace AsbCloudApp.Data.GTR; +/// +/// ГТИ +/// public class GtrWitsDto { + /// + /// Дата получения записи + /// + public DateTimeOffset DateTime { get; set; } + + /// + /// Забой (скважины), м + /// + public float? DEPTMEAS { get; set; } + + /// + /// Долото, м + /// + public float DEPTBITM { get; set; } + /// /// Вес на крюке /// diff --git a/AsbCloudApp/Repositories/IGtrRepository.cs b/AsbCloudApp/Repositories/IGtrRepository.cs index 1aadfb96..706b6be2 100644 --- a/AsbCloudApp/Repositories/IGtrRepository.cs +++ b/AsbCloudApp/Repositories/IGtrRepository.cs @@ -24,10 +24,11 @@ namespace AsbCloudApp.Repositories /// /// получить данные ГТИ /// + /// /// /// /// - Task> GetAsync(GtrRequest request, CancellationToken token); + Task> GetAsync(int idWell, GtrRequest request, CancellationToken token); /// /// получить данные для клиента diff --git a/AsbCloudApp/Requests/GtrRequest.cs b/AsbCloudApp/Requests/GtrRequest.cs index 8ba678b2..43de25c4 100644 --- a/AsbCloudApp/Requests/GtrRequest.cs +++ b/AsbCloudApp/Requests/GtrRequest.cs @@ -5,7 +5,7 @@ namespace AsbCloudApp.Requests; /// /// Параметры запроса для получения загруженных данных ГТИ по скважине /// -public class GtrRequestBase +public class GtrRequest { /// /// Дата начала выборки.По умолчанию: текущее время - IntervalSec @@ -22,20 +22,4 @@ public class GtrRequestBase /// [Obsolete] public int ApproxPointsCount { get; set; } = 1024; -} - -/// -/// Параметры запроса для получения загруженных данных ГТИ по скважине -/// -public class GtrRequest : GtrRequestBase -{ - public GtrRequest(int idWell, GtrRequestBase request) - { - IdWell = idWell; - Begin = request.Begin; - IntervalSec = request.IntervalSec; - ApproxPointsCount = request.ApproxPointsCount; - } - - public int IdWell { get; set; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs index 5d0cda7b..022532f2 100644 --- a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs +++ b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs @@ -21,6 +21,8 @@ namespace AsbCloudInfrastructure.Repository { private static IDictionary<(int, int), string> WitsParameters = new Dictionary<(int, int), string> { + { (1, 8), nameof(GtrWitsDto.DEPTBITM) }, + { (1, 10), nameof(GtrWitsDto.DEPTMEAS) }, { (1, 14), nameof(GtrWitsDto.HKLA) }, { (1, 12), nameof(GtrWitsDto.BLKPOS) }, { (1, 16), nameof(GtrWitsDto.WOBA) }, @@ -75,39 +77,60 @@ namespace AsbCloudInfrastructure.Repository this.db = db; this.telemetryService = telemetryService; } - - public async Task> GetAsync(GtrRequest request, CancellationToken token) + + public async Task> GetAsync(int idWell, GtrRequest request, CancellationToken token) => + await GetAsync(idWell, request, token); + + private async Task> GetAsync(int idWell, GtrRequest request, CancellationToken token) + where TEntity : WitsItemBase + where TType : notnull { - var interval = TimeSpan.FromSeconds(10); - var query = BuildQuery(request); - var entities = await query.AsNoTracking().ToArrayAsync(token); + var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell); + if (telemetry is null) + return Enumerable.Empty(); + + var timezone = telemetryService.GetTimezone(telemetry.Id); + var timezoneOffset = TimeSpan.FromHours(timezone.Hours); + + var query = BuildQuery(telemetry.Id, request); + + if (!await query.AnyAsync(token)) + return Enumerable.Empty(); + + var interval = TimeSpan.FromSeconds(10); + + var entities = await query + .OrderBy(e => e.DateTime) + .AsNoTracking() + .ToArrayAsync(token); + var dtos = entities .GroupBy(e => e.DateTime.Ticks / interval.Ticks) - .Select(Convert); + .Select(groupByInterval => + { + var items = groupByInterval.Select(e => e); + var values = items.GroupBy(e => (e.IdRecord, e.IdItem)) + .Where(parameter => parameter.Any()) + .ToDictionary(parameter => WitsParameters[parameter.Key], g => g.Last().Value.ToString()); + + var dto = values.Adapt(); + dto.DateTime = items.Last().DateTime.ToOffset(timezoneOffset); + return dto; + }); return dtos; } - private static GtrWitsDto Convert(IEnumerable scr) - { - var values = scr.GroupBy(e => (e.IdRecord, e.IdItem)) - .ToDictionary(g => WitsParameters[g.Key], g => g.LastOrDefault()?.Value); - - var dto = values.Adapt(); - - return dto; - } - - private IQueryable BuildQuery(GtrRequest request) + private IQueryable BuildQuery(int idTelemetry, GtrRequest request) where TEntity : WitsItemBase where TType : notnull { - var query = db.Set().OrderBy(e => e.DateTime) - .Where(e => e.Telemetry != null && - e.Telemetry.Well != null && - e.Telemetry.Well.Id == request.IdWell) - .Where(e => e.DateTime >= DateTime.UtcNow.AddSeconds(-request.IntervalSec)); + var dateIntervalStart = DateTime.UtcNow.AddSeconds(-request.IntervalSec); + + var query = db.Set() + .Where(e => e.IdTelemetry == idTelemetry) + .Where(e => e.DateTime >= dateIntervalStart); if (request.Begin.HasValue) { @@ -118,6 +141,7 @@ namespace AsbCloudInfrastructure.Repository return query; } + [Obsolete] public async Task> GetAsync(int idWell, DateTime? dateBegin, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default) { var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell); diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IGtrWitsClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IGtrWitsClient.cs index 17f76a33..517b98ef 100644 --- a/AsbCloudWebApi.IntegrationTests/Clients/IGtrWitsClient.cs +++ b/AsbCloudWebApi.IntegrationTests/Clients/IGtrWitsClient.cs @@ -6,8 +6,8 @@ namespace AsbCloudWebApi.IntegrationTests.Clients; public interface IGtrWitsClient { - private const string BaseRoute = "/api/well/{idWell}/gtrWits"; + private const string BaseRoute = "/api/gtrWits"; [Get(BaseRoute)] - Task>> GetAllAsync(int idWell, [Query] GtrRequestBase request); + Task>> GetAllAsync(int idWell, [Query] GtrRequest request); } \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/GtrControllerTests.cs b/AsbCloudWebApi.IntegrationTests/Controllers/GtrControllerTests.cs index eb1e96d8..e951c13e 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/GtrControllerTests.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/GtrControllerTests.cs @@ -26,7 +26,7 @@ public class GtrControllerTests : BaseIntegrationTest dbContext.WitsItemFloat.AddRange(witsItems); await dbContext.SaveChangesAsync(); - var request = new GtrRequestBase(); + var request = new GtrRequest(); //act var response = await client.GetAllAsync(well.Id, request); diff --git a/AsbCloudWebApi/Controllers/GtrWitsController.cs b/AsbCloudWebApi/Controllers/GtrWitsController.cs deleted file mode 100644 index 69d8a7d2..00000000 --- a/AsbCloudWebApi/Controllers/GtrWitsController.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data.GTR; -using AsbCloudApp.Exceptions; -using AsbCloudApp.Repositories; -using AsbCloudApp.Requests; -using AsbCloudApp.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; - -namespace AsbCloudWebApi.Controllers; - -[ApiController] -[Route("api/well/{idWell}/[controller]")] -[Authorize] -public class GtrWitsController : ControllerBase -{ - private readonly IWellService wellService; - private readonly IGtrRepository gtrRepository; - - public GtrWitsController(IWellService wellService, - IGtrRepository gtrRepository) - { - this.wellService = wellService; - this.gtrRepository = gtrRepository; - } - - /// - /// Получить значение от ГТИ - /// - /// - /// - /// - /// - [HttpGet] - [Permission] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task GetAllAsync(int idWell, [FromQuery] GtrRequestBase request, CancellationToken token) - { - await AssertUserHasAccessToWellAsync(idWell, token); - - var requestToRepository = new GtrRequest(idWell, request); - - var dtos = await gtrRepository.GetAsync(requestToRepository, token); - - return Ok(dtos); - } - - private async Task AssertUserHasAccessToWellAsync(int idWell, CancellationToken token) - { - var idUser = User.GetUserId(); - var idCompany = User.GetCompanyId(); - - if (!idUser.HasValue) - throw new ForbidException("Нет доступа к скважине"); - - if (!idCompany.HasValue) - throw new ForbidException("Нет доступа к скважине"); - - if (!await wellService.IsCompanyInvolvedInWellAsync(idCompany.Value, idWell, token)) - throw new ForbidException("Нет доступа к скважине"); - } -} \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs index 95662fe2..8f38b2ad 100644 --- a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs @@ -8,7 +8,9 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Exceptions; using AsbCloudApp.Requests; +using Microsoft.AspNetCore.Http; namespace AsbCloudWebApi.Controllers.SAUB { @@ -36,6 +38,25 @@ namespace AsbCloudWebApi.Controllers.SAUB this.wellService = wellService; this.telemetryHubContext = telemetryHubContext; } + + /// + /// Получить значение от ГТИ + /// + /// + /// + /// + /// + [HttpGet] + [Permission] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task GetAllAsync(int idWell, [FromQuery] GtrRequest request, CancellationToken token) + { + await AssertUserHasAccessToWellAsync(idWell, token); + + var dtos = await gtrRepository.GetAsync(idWell, request, token); + + return Ok(dtos); + } /// /// Получить загруженные данные ГТИ по скважине @@ -114,6 +135,21 @@ namespace AsbCloudWebApi.Controllers.SAUB .SendAsync(SignalRMethodGetDataName, dtos), CancellationToken.None); return Ok(); } + + private async Task AssertUserHasAccessToWellAsync(int idWell, CancellationToken token) + { + var idUser = User.GetUserId(); + var idCompany = User.GetCompanyId(); + + if (!idUser.HasValue) + throw new ForbidException("Нет доступа к скважине"); + + if (!idCompany.HasValue) + throw new ForbidException("Нет доступа к скважине"); + + if (!await wellService.IsCompanyInvolvedInWellAsync(idCompany.Value, idWell, token)) + throw new ForbidException("Нет доступа к скважине"); + } } } From 12a9e06f1d2e8c40178412c5245551d8d56ad294 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, 8 Apr 2024 14:49:15 +0300 Subject: [PATCH 065/132] =?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=20EnabledSubsystems?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DetectedOperation/EnabledSubsystems.cs | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs b/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs index 1183c2b8..ee3c3459 100644 --- a/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs +++ b/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs @@ -6,7 +6,7 @@ namespace AsbCloudApp.Data.DetectedOperation; public struct EnabledSubsystems { private int value; - + private EnabledSubsystems(int value) { this.value = value; @@ -25,7 +25,7 @@ public struct EnabledSubsystems /// public bool IsAutoRotor { - get => (value & (int)EnabledSubsystemsFlags.AutoRotor) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoRotor); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoRotor); } @@ -34,7 +34,7 @@ public struct EnabledSubsystems /// public bool IsAutoSlide { - get => (value & (int)EnabledSubsystemsFlags.AutoSlide) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoSlide); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoSlide); } @@ -43,7 +43,7 @@ public struct EnabledSubsystems /// public bool IsAutoConditionig { - get => (value & (int)EnabledSubsystemsFlags.AutoConditionig) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoConditionig); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoConditionig); } @@ -52,7 +52,7 @@ public struct EnabledSubsystems /// public bool IsAutoSinking { - get => (value & (int)EnabledSubsystemsFlags.AutoSinking) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoSinking); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoSinking); } @@ -61,7 +61,7 @@ public struct EnabledSubsystems /// public bool IsAutoLifting { - get => (value & (int)EnabledSubsystemsFlags.AutoLifting) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoLifting); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoLifting); } @@ -70,7 +70,7 @@ public struct EnabledSubsystems /// public bool IsAutoLiftingWithConditionig { - get => (value & (int)EnabledSubsystemsFlags.AutoLiftingWithConditionig) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoLiftingWithConditionig); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoLiftingWithConditionig); } @@ -79,7 +79,7 @@ public struct EnabledSubsystems /// public bool IsAutoBlocknig { - get => (value & (int)EnabledSubsystemsFlags.AutoBlocknig) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoBlocknig); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoBlocknig); } @@ -88,10 +88,13 @@ public struct EnabledSubsystems /// public bool IsAutoOscillation { - get => (value & (int)EnabledSubsystemsFlags.AutoOscillation) > 0; + get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoOscillation); set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoOscillation); } + private bool IsEnabledSubsystem(EnabledSubsystemsFlags flag) => + (value & (int)flag) > 0; + private void UpdateEnabledSubsystems(bool isEnable, EnabledSubsystemsFlags flag) { if (isEnable) From 96b96a0a22e3c8008e2614fa1a9723a951c59972 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 9 Apr 2024 15:12:40 +0500 Subject: [PATCH 066/132] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04064028_Add_NewWellOperationCategories.cs | 72 -- ...dd_NewWellOperationCategories.Designer.cs} | 150 ++- ...08112202_Add_NewWellOperationCategories.cs | 1035 +++++++++++++++++ .../AsbCloudDbContextModelSnapshot.cs | 148 ++- AsbCloudDb/Model/WellOperationCategory.cs | 4 +- .../ExcelServices/ExcelTemplateService.cs | 39 + .../Templates/WellOperationFactTemplate.xlsx | Bin 45673 -> 37120 bytes .../Services/WellService.cs | 2 +- .../Controllers/WellOperationController.cs | 20 +- AsbCloudWebApi/appsettings.json | 6 +- 10 files changed, 1393 insertions(+), 83 deletions(-) delete mode 100644 AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.cs rename AsbCloudDb/Migrations/{20240404064028_Add_NewWellOperationCategories.Designer.cs => 20240408112202_Add_NewWellOperationCategories.Designer.cs} (98%) create mode 100644 AsbCloudDb/Migrations/20240408112202_Add_NewWellOperationCategories.cs create mode 100644 AsbCloudInfrastructure/Services/ExcelServices/ExcelTemplateService.cs diff --git a/AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.cs b/AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.cs deleted file mode 100644 index 396700c4..00000000 --- a/AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.cs +++ /dev/null @@ -1,72 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional - -namespace AsbCloudDb.Migrations -{ - /// - public partial class Add_NewWellOperationCategories : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.InsertData( - table: "t_well_operation_category", - columns: new[] { "id", "id_parent", "key_value_name", "key_value_units", "name" }, - values: new object[,] - { - { 3006, null, "dT", "мин", "Заключительные работы" }, - { 5113, 4001, "МСП", "м/ч", "Бурение" }, - { 5114, 4013, "dT", "мин", "ТО оборудования" }, - { 5116, 4013, "dT", "мин", "Фрезерование \"Окна\"" }, - { 5117, 4013, "dT", "мин", "Расширение ствола" }, - { 4019, 3006, "dT", "мин", "Заключительные операции" }, - { 5115, 4019, "dT", "мин", "Спуск НКТ" } - }); - - migrationBuilder.Sql - ("UPDATE public.t_well_operation SET id_category=5113 WHERE id_category=5002 OR id_category=5003;"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DeleteData( - table: "t_well_operation_category", - keyColumn: "id", - keyValue: 5113); - - migrationBuilder.DeleteData( - table: "t_well_operation_category", - keyColumn: "id", - keyValue: 5114); - - migrationBuilder.DeleteData( - table: "t_well_operation_category", - keyColumn: "id", - keyValue: 5115); - - migrationBuilder.DeleteData( - table: "t_well_operation_category", - keyColumn: "id", - keyValue: 5116); - - migrationBuilder.DeleteData( - table: "t_well_operation_category", - keyColumn: "id", - keyValue: 5117); - - migrationBuilder.DeleteData( - table: "t_well_operation_category", - keyColumn: "id", - keyValue: 4019); - - migrationBuilder.DeleteData( - table: "t_well_operation_category", - keyColumn: "id", - keyValue: 3006); - } - } -} diff --git a/AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.Designer.cs b/AsbCloudDb/Migrations/20240408112202_Add_NewWellOperationCategories.Designer.cs similarity index 98% rename from AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.Designer.cs rename to AsbCloudDb/Migrations/20240408112202_Add_NewWellOperationCategories.Designer.cs index 905664c7..caa012fc 100644 --- a/AsbCloudDb/Migrations/20240404064028_Add_NewWellOperationCategories.Designer.cs +++ b/AsbCloudDb/Migrations/20240408112202_Add_NewWellOperationCategories.Designer.cs @@ -13,7 +13,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace AsbCloudDb.Migrations { [DbContext(typeof(AsbCloudDbContext))] - [Migration("20240404064028_Add_NewWellOperationCategories")] + [Migration("20240408112202_Add_NewWellOperationCategories")] partial class Add_NewWellOperationCategories { /// @@ -6205,6 +6205,9 @@ namespace AsbCloudDb.Migrations .HasColumnName("id_parent") .HasComment("id родительской категории"); + b.Property("IsHidden") + .HasColumnType("boolean"); + b.Property("KeyValueName") .HasMaxLength(32) .HasColumnType("character varying(32)") @@ -6236,6 +6239,7 @@ namespace AsbCloudDb.Migrations new { Id = 3000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "м/ч", Name = "БУРЕНИЕ" @@ -6243,6 +6247,7 @@ namespace AsbCloudDb.Migrations new { Id = 3001, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО" @@ -6250,6 +6255,7 @@ namespace AsbCloudDb.Migrations new { Id = 3002, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "КРЕПЛЕНИЕ" @@ -6257,6 +6263,7 @@ namespace AsbCloudDb.Migrations new { Id = 3003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ГФР" @@ -6264,6 +6271,7 @@ namespace AsbCloudDb.Migrations new { Id = 3004, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Вспомогательные операции" @@ -6271,6 +6279,7 @@ namespace AsbCloudDb.Migrations new { Id = 3005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Непроизводительное время (НПВ)" @@ -6278,6 +6287,7 @@ namespace AsbCloudDb.Migrations new { Id = 3006, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Заключительные работы" @@ -6286,6 +6296,7 @@ namespace AsbCloudDb.Migrations { Id = 4000, IdParent = 3000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "КНБК" @@ -6294,6 +6305,7 @@ namespace AsbCloudDb.Migrations { Id = 4001, IdParent = 3000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "м/ч", Name = "Механическое. бурение" @@ -6302,6 +6314,7 @@ namespace AsbCloudDb.Migrations { Id = 4002, IdParent = 3000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Статический замер" @@ -6310,6 +6323,7 @@ namespace AsbCloudDb.Migrations { Id = 4003, IdParent = 3000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Нормализация диаметра скважины" @@ -6318,6 +6332,7 @@ namespace AsbCloudDb.Migrations { Id = 4004, IdParent = 3000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Наращивание" @@ -6326,6 +6341,7 @@ namespace AsbCloudDb.Migrations { Id = 4005, IdParent = 3001, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО" @@ -6334,6 +6350,7 @@ namespace AsbCloudDb.Migrations { Id = 4006, IdParent = 3002, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск обсадной колонны" @@ -6342,6 +6359,7 @@ namespace AsbCloudDb.Migrations { Id = 4018, IdParent = 3002, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Крепление" @@ -6350,6 +6368,7 @@ namespace AsbCloudDb.Migrations { Id = 4007, IdParent = 3002, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Цементирование" @@ -6358,6 +6377,7 @@ namespace AsbCloudDb.Migrations { Id = 4008, IdParent = 3002, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Вспомогательные работы при креплении" @@ -6366,6 +6386,7 @@ namespace AsbCloudDb.Migrations { Id = 4009, IdParent = 3003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка/разборка приборов ГИС" @@ -6374,6 +6395,7 @@ namespace AsbCloudDb.Migrations { Id = 4010, IdParent = 3003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО" @@ -6382,6 +6404,7 @@ namespace AsbCloudDb.Migrations { Id = 4011, IdParent = 3003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ГИС" @@ -6390,6 +6413,7 @@ namespace AsbCloudDb.Migrations { Id = 4012, IdParent = 3004, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Промывка, ОБР" @@ -6398,6 +6422,7 @@ namespace AsbCloudDb.Migrations { Id = 4013, IdParent = 3004, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Вспомогательные работы" @@ -6406,6 +6431,7 @@ namespace AsbCloudDb.Migrations { Id = 4014, IdParent = 3005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ремонт оборудования" @@ -6414,6 +6440,7 @@ namespace AsbCloudDb.Migrations { Id = 4015, IdParent = 3005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Аварийные работы" @@ -6422,6 +6449,7 @@ namespace AsbCloudDb.Migrations { Id = 4016, IdParent = 3005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Осложнение" @@ -6430,6 +6458,7 @@ namespace AsbCloudDb.Migrations { Id = 4017, IdParent = 3005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Незаложенные в ГГД операции" @@ -6438,6 +6467,7 @@ namespace AsbCloudDb.Migrations { Id = 4019, IdParent = 3006, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Заключительные операции" @@ -6446,6 +6476,7 @@ namespace AsbCloudDb.Migrations { Id = 5000, IdParent = 4000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Разборка КНБК" @@ -6454,6 +6485,7 @@ namespace AsbCloudDb.Migrations { Id = 5001, IdParent = 4000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка КНБК" @@ -6462,6 +6494,7 @@ namespace AsbCloudDb.Migrations { Id = 5002, IdParent = 4001, + IsHidden = false, KeyValueName = "МСП", KeyValueUnits = "м/ч", Name = "Бурение слайдом" @@ -6470,6 +6503,7 @@ namespace AsbCloudDb.Migrations { Id = 5003, IdParent = 4001, + IsHidden = false, KeyValueName = "МСП", KeyValueUnits = "м/ч", Name = "Бурение ротором" @@ -6478,6 +6512,7 @@ namespace AsbCloudDb.Migrations { Id = 5004, IdParent = 4002, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Замер ЗТС (запись MWD)" @@ -6486,6 +6521,7 @@ namespace AsbCloudDb.Migrations { Id = 5005, IdParent = 4003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Промывка перед наращиванием" @@ -6494,6 +6530,7 @@ namespace AsbCloudDb.Migrations { Id = 5006, IdParent = 4003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Проработка во время бурения" @@ -6502,6 +6539,7 @@ namespace AsbCloudDb.Migrations { Id = 5007, IdParent = 4003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Проработка" @@ -6510,6 +6548,7 @@ namespace AsbCloudDb.Migrations { Id = 5008, IdParent = 4003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Шаблонировка во время бурения" @@ -6518,6 +6557,7 @@ namespace AsbCloudDb.Migrations { Id = 5009, IdParent = 4003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Шаблонировка перед наращиванием" @@ -6526,6 +6566,7 @@ namespace AsbCloudDb.Migrations { Id = 5010, IdParent = 4004, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Наращивание" @@ -6534,6 +6575,7 @@ namespace AsbCloudDb.Migrations { Id = 5011, IdParent = 4004, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Удержание в клиньях" @@ -6542,6 +6584,7 @@ namespace AsbCloudDb.Migrations { Id = 5012, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Подъем инструмента" @@ -6550,6 +6593,7 @@ namespace AsbCloudDb.Migrations { Id = 5013, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Подъем КНБК" @@ -6558,6 +6602,7 @@ namespace AsbCloudDb.Migrations { Id = 5014, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск инструмента" @@ -6566,6 +6611,7 @@ namespace AsbCloudDb.Migrations { Id = 5015, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск КНБК" @@ -6574,6 +6620,7 @@ namespace AsbCloudDb.Migrations { Id = 5016, IdParent = 4006, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Промывка при спуске ОК" @@ -6582,6 +6629,7 @@ namespace AsbCloudDb.Migrations { Id = 5017, IdParent = 4006, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск ОК" @@ -6590,6 +6638,7 @@ namespace AsbCloudDb.Migrations { Id = 5018, IdParent = 4007, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ОЗЦ" @@ -6598,6 +6647,7 @@ namespace AsbCloudDb.Migrations { Id = 5019, IdParent = 4007, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Цементирование" @@ -6606,6 +6656,7 @@ namespace AsbCloudDb.Migrations { Id = 5020, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Опрессовка БИ" @@ -6614,6 +6665,7 @@ namespace AsbCloudDb.Migrations { Id = 5021, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Опрессовка ОК" @@ -6622,6 +6674,7 @@ namespace AsbCloudDb.Migrations { Id = 5022, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ПЗР при спуске ОК" @@ -6630,6 +6683,7 @@ namespace AsbCloudDb.Migrations { Id = 5023, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ПЗР при цементировании" @@ -6638,6 +6692,7 @@ namespace AsbCloudDb.Migrations { Id = 5024, IdParent = 4009, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Разборка комплекса приборов ГИС" @@ -6646,6 +6701,7 @@ namespace AsbCloudDb.Migrations { Id = 5025, IdParent = 4009, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка комплекса приборов ГИС" @@ -6654,6 +6710,7 @@ namespace AsbCloudDb.Migrations { Id = 5026, IdParent = 4010, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Подъем приборов ГИС (на трубах)" @@ -6662,6 +6719,7 @@ namespace AsbCloudDb.Migrations { Id = 5027, IdParent = 4010, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск приборов ГИС (на трубах)" @@ -6670,6 +6728,7 @@ namespace AsbCloudDb.Migrations { Id = 5028, IdParent = 4011, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Комплекс ГИС на жестком кабеле" @@ -6678,6 +6737,7 @@ namespace AsbCloudDb.Migrations { Id = 5029, IdParent = 4011, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Комплекс ГИС на кабеле" @@ -6686,6 +6746,7 @@ namespace AsbCloudDb.Migrations { Id = 5030, IdParent = 4011, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Комплекс ГИС на трубах" @@ -6694,6 +6755,7 @@ namespace AsbCloudDb.Migrations { Id = 5031, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Закачка/прокачка пачки" @@ -6702,6 +6764,7 @@ namespace AsbCloudDb.Migrations { Id = 5032, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Обработка БР" @@ -6710,6 +6773,7 @@ namespace AsbCloudDb.Migrations { Id = 5033, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ориентирование ТС при бурении" @@ -6718,6 +6782,7 @@ namespace AsbCloudDb.Migrations { Id = 5034, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Перезапись гаммы-каротажа" @@ -6726,6 +6791,7 @@ namespace AsbCloudDb.Migrations { Id = 5035, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Приготовление БР" @@ -6734,6 +6800,7 @@ namespace AsbCloudDb.Migrations { Id = 5036, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Промывка" @@ -6742,6 +6809,7 @@ namespace AsbCloudDb.Migrations { Id = 5037, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Разбуривание тех.оснастки" @@ -6750,6 +6818,7 @@ namespace AsbCloudDb.Migrations { Id = 5038, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск инструмента с проработкой" @@ -6758,6 +6827,7 @@ namespace AsbCloudDb.Migrations { Id = 5039, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ВМР" @@ -6766,6 +6836,7 @@ namespace AsbCloudDb.Migrations { Id = 5040, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Демонтаж ПВО" @@ -6774,6 +6845,7 @@ namespace AsbCloudDb.Migrations { Id = 5041, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Долив затруба при подъёме" @@ -6782,6 +6854,7 @@ namespace AsbCloudDb.Migrations { Id = 5042, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Монтаж ПВО" @@ -6790,6 +6863,7 @@ namespace AsbCloudDb.Migrations { Id = 5043, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Наработка жёлоба" @@ -6798,6 +6872,7 @@ namespace AsbCloudDb.Migrations { Id = 5044, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Обвязка устья с циркуляционной системой" @@ -6806,6 +6881,7 @@ namespace AsbCloudDb.Migrations { Id = 5045, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Оборудование устья" @@ -6814,6 +6890,7 @@ namespace AsbCloudDb.Migrations { Id = 5046, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Опрессовка ПВО" @@ -6822,6 +6899,7 @@ namespace AsbCloudDb.Migrations { Id = 5047, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Перемонтаж ПВО " @@ -6830,6 +6908,7 @@ namespace AsbCloudDb.Migrations { Id = 5048, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Перетяжка талевого каната" @@ -6838,6 +6917,7 @@ namespace AsbCloudDb.Migrations { Id = 5049, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ПЗР при сборке КНБК" @@ -6846,6 +6926,7 @@ namespace AsbCloudDb.Migrations { Id = 5050, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Полная замена талевого каната" @@ -6854,6 +6935,7 @@ namespace AsbCloudDb.Migrations { Id = 5051, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ПР перед забуркой направления" @@ -6862,6 +6944,7 @@ namespace AsbCloudDb.Migrations { Id = 5052, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Продувка манифольда" @@ -6870,6 +6953,7 @@ namespace AsbCloudDb.Migrations { Id = 5053, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Срезка" @@ -6878,6 +6962,7 @@ namespace AsbCloudDb.Migrations { Id = 5054, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Тайм-дриллинг" @@ -6886,6 +6971,7 @@ namespace AsbCloudDb.Migrations { Id = 5055, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Тех.отстой" @@ -6894,6 +6980,7 @@ namespace AsbCloudDb.Migrations { Id = 5056, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Учебная тревога \"Выброс\"" @@ -6902,6 +6989,7 @@ namespace AsbCloudDb.Migrations { Id = 5057, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Чистка ЦСГО/емкостного блока" @@ -6910,6 +6998,7 @@ namespace AsbCloudDb.Migrations { Id = 5058, IdParent = 4014, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ремонт бурового оборудования" @@ -6918,6 +7007,7 @@ namespace AsbCloudDb.Migrations { Id = 5059, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ловильные работы" @@ -6926,6 +7016,7 @@ namespace AsbCloudDb.Migrations { Id = 5060, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ожидание" @@ -6934,6 +7025,7 @@ namespace AsbCloudDb.Migrations { Id = 5061, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Определение места прихвата и ЛМ" @@ -6942,6 +7034,7 @@ namespace AsbCloudDb.Migrations { Id = 5062, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Работа яссом" @@ -6950,6 +7043,7 @@ namespace AsbCloudDb.Migrations { Id = 5063, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Расхаживание" @@ -6958,6 +7052,7 @@ namespace AsbCloudDb.Migrations { Id = 5064, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО - колокол" @@ -6966,6 +7061,7 @@ namespace AsbCloudDb.Migrations { Id = 5065, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО - метчик" @@ -6974,6 +7070,7 @@ namespace AsbCloudDb.Migrations { Id = 5066, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО - овершот" @@ -6982,6 +7079,7 @@ namespace AsbCloudDb.Migrations { Id = 5067, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО - труболовка" @@ -6990,6 +7088,7 @@ namespace AsbCloudDb.Migrations { Id = 5068, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Торпедирование (встряхивание)" @@ -6998,6 +7097,7 @@ namespace AsbCloudDb.Migrations { Id = 5069, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Торпедирование (отстрел)" @@ -7006,6 +7106,7 @@ namespace AsbCloudDb.Migrations { Id = 5070, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Установка ванн" @@ -7014,6 +7115,7 @@ namespace AsbCloudDb.Migrations { Id = 5071, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Фрезеровка" @@ -7022,6 +7124,7 @@ namespace AsbCloudDb.Migrations { Id = 5072, IdParent = 4016, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Контролируемое ГНВП" @@ -7030,6 +7133,7 @@ namespace AsbCloudDb.Migrations { Id = 5073, IdParent = 4016, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Поглощение" @@ -7038,6 +7142,7 @@ namespace AsbCloudDb.Migrations { Id = 5074, IdParent = 4016, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сальникообразование" @@ -7046,6 +7151,7 @@ namespace AsbCloudDb.Migrations { Id = 5075, IdParent = 4016, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Утяжеление БР" @@ -7054,6 +7160,7 @@ namespace AsbCloudDb.Migrations { Id = 5076, IdParent = 4017, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "НПВ / прочее" @@ -7062,6 +7169,7 @@ namespace AsbCloudDb.Migrations { Id = 5077, IdParent = 4017, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Обработка раствора (несоответствие параметров)" @@ -7070,6 +7178,7 @@ namespace AsbCloudDb.Migrations { Id = 5078, IdParent = 4017, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "подъем ОК" @@ -7078,6 +7187,7 @@ namespace AsbCloudDb.Migrations { Id = 5079, IdParent = 4017, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ревизия КНБК/инструмента/ЗТС" @@ -7086,6 +7196,7 @@ namespace AsbCloudDb.Migrations { Id = 5082, IdParent = 4000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка устройства ориентирования КО" @@ -7094,6 +7205,7 @@ namespace AsbCloudDb.Migrations { Id = 5083, IdParent = 4003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Проработка принудительная" @@ -7102,6 +7214,7 @@ namespace AsbCloudDb.Migrations { Id = 5084, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Шаблонировка подъем БИ, продувка" @@ -7110,6 +7223,7 @@ namespace AsbCloudDb.Migrations { Id = 5085, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск бурильного инструмента со сборкой с мостков" @@ -7118,6 +7232,7 @@ namespace AsbCloudDb.Migrations { Id = 5086, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Подъем БИ с выбросом на мостки" @@ -7126,6 +7241,7 @@ namespace AsbCloudDb.Migrations { Id = 5087, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск БИ со сборкой с мостков" @@ -7134,6 +7250,7 @@ namespace AsbCloudDb.Migrations { Id = 5088, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка и спуск ТБТ" @@ -7142,6 +7259,7 @@ namespace AsbCloudDb.Migrations { Id = 5089, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск КО на транспотрной колонне" @@ -7150,6 +7268,7 @@ namespace AsbCloudDb.Migrations { Id = 5090, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Отворот допускной трубы" @@ -7158,6 +7277,7 @@ namespace AsbCloudDb.Migrations { Id = 5091, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Активация подвески, опрессовка" @@ -7166,6 +7286,7 @@ namespace AsbCloudDb.Migrations { Id = 5092, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Монтаж, опрессовка ФА" @@ -7174,6 +7295,7 @@ namespace AsbCloudDb.Migrations { Id = 5093, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка хвостовика 114мм (согласно схеме)" @@ -7182,6 +7304,7 @@ namespace AsbCloudDb.Migrations { Id = 5094, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ПЗР к спуску УЭЦН" @@ -7190,6 +7313,7 @@ namespace AsbCloudDb.Migrations { Id = 5095, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Активация подвески (потайной колонны, хвостовика)" @@ -7198,6 +7322,7 @@ namespace AsbCloudDb.Migrations { Id = 5096, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Шаблонирование перед спуском" @@ -7206,6 +7331,7 @@ namespace AsbCloudDb.Migrations { Id = 5097, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Промывка - перевод скважины на новый раствор" @@ -7214,6 +7340,7 @@ namespace AsbCloudDb.Migrations { Id = 5098, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка БИ с мостков на подсвечник" @@ -7222,6 +7349,7 @@ namespace AsbCloudDb.Migrations { Id = 5099, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Подготовка ствола скважины. Перезапись ГК в интервале установки КО." @@ -7230,6 +7358,7 @@ namespace AsbCloudDb.Migrations { Id = 5100, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Смена рабочего переводника ВСП" @@ -7238,6 +7367,7 @@ namespace AsbCloudDb.Migrations { Id = 5101, IdParent = 4014, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ремонт" @@ -7246,6 +7376,7 @@ namespace AsbCloudDb.Migrations { Id = 5102, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск пакера" @@ -7254,6 +7385,7 @@ namespace AsbCloudDb.Migrations { Id = 5103, IdParent = 4011, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Запись гамма-каратожа" @@ -7262,6 +7394,7 @@ namespace AsbCloudDb.Migrations { Id = 5104, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Шаблонирование спуск БИ" @@ -7270,6 +7403,7 @@ namespace AsbCloudDb.Migrations { Id = 5105, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка клин-отклонителя" @@ -7278,6 +7412,7 @@ namespace AsbCloudDb.Migrations { Id = 5106, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ориентирование и посадка клина-отклонителя" @@ -7286,6 +7421,7 @@ namespace AsbCloudDb.Migrations { Id = 5107, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Протяжка подъемного патрубка подвески" @@ -7294,6 +7430,7 @@ namespace AsbCloudDb.Migrations { Id = 5108, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Подъем клина-отклонителя" @@ -7302,6 +7439,7 @@ namespace AsbCloudDb.Migrations { Id = 5109, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Стыковка стингера с хвостовиком основного ствола" @@ -7310,6 +7448,7 @@ namespace AsbCloudDb.Migrations { Id = 5110, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ориентирование и установка стыковочного узла хвостовика" @@ -7318,6 +7457,7 @@ namespace AsbCloudDb.Migrations { Id = 5111, IdParent = 4001, + IsHidden = false, KeyValueName = "МСП", KeyValueUnits = "м/ч", Name = "Бурение с отбором керна" @@ -7326,6 +7466,7 @@ namespace AsbCloudDb.Migrations { Id = 5112, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Работа пакером в обсадной колонне" @@ -7334,6 +7475,7 @@ namespace AsbCloudDb.Migrations { Id = 5113, IdParent = 4001, + IsHidden = false, KeyValueName = "МСП", KeyValueUnits = "м/ч", Name = "Бурение" @@ -7342,6 +7484,7 @@ namespace AsbCloudDb.Migrations { Id = 5114, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ТО оборудования" @@ -7350,6 +7493,7 @@ namespace AsbCloudDb.Migrations { Id = 5115, IdParent = 4019, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск НКТ" @@ -7358,14 +7502,16 @@ namespace AsbCloudDb.Migrations { Id = 5116, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", - Name = "Фрезерование \"Окна\"" + Name = "Вырезка окна" }, new { Id = 5117, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Расширение ствола" diff --git a/AsbCloudDb/Migrations/20240408112202_Add_NewWellOperationCategories.cs b/AsbCloudDb/Migrations/20240408112202_Add_NewWellOperationCategories.cs new file mode 100644 index 00000000..dfa7431e --- /dev/null +++ b/AsbCloudDb/Migrations/20240408112202_Add_NewWellOperationCategories.cs @@ -0,0 +1,1035 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional + +namespace AsbCloudDb.Migrations +{ + /// + public partial class Add_NewWellOperationCategories : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "IsHidden", + table: "t_well_operation_category", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 3000, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 3001, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 3002, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 3003, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 3004, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 3005, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4000, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4001, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4002, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4003, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4004, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4005, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4006, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4007, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4008, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4009, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4010, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4011, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4012, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4013, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4014, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4015, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4016, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4017, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4018, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5000, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5001, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5002, + column: "IsHidden", + value: true); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5003, + column: "IsHidden", + value: true); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5004, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5005, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5006, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5007, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5008, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5009, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5010, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5011, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5012, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5013, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5014, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5015, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5016, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5017, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5018, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5019, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5020, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5021, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5022, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5023, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5024, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5025, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5026, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5027, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5028, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5029, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5030, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5031, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5032, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5033, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5034, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5035, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5036, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5037, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5038, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5039, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5040, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5041, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5042, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5043, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5044, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5045, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5046, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5047, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5048, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5049, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5050, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5051, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5052, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5053, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5054, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5055, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5056, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5057, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5058, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5059, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5060, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5061, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5062, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5063, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5064, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5065, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5066, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5067, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5068, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5069, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5070, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5071, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5072, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5073, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5074, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5075, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5076, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5077, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5078, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5079, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5082, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5083, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5084, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5085, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5086, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5087, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5088, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5089, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5090, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5091, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5092, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5093, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5094, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5095, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5096, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5097, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5098, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5099, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5100, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5101, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5102, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5103, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5104, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5105, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5106, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5107, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5108, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5109, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5110, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5111, + column: "IsHidden", + value: false); + + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5112, + column: "IsHidden", + value: false); + + migrationBuilder.InsertData( + table: "t_well_operation_category", + columns: new[] { "id", "id_parent", "IsHidden", "key_value_name", "key_value_units", "name" }, + values: new object[,] + { + { 3006, null, false, "dT", "мин", "Заключительные работы" }, + { 5113, 4001, false, "МСП", "м/ч", "Бурение" }, + { 5114, 4013, false, "dT", "мин", "ТО оборудования" }, + { 5116, 4013, false, "dT", "мин", "Вырезка окна" }, + { 5117, 4013, false, "dT", "мин", "Расширение ствола" }, + { 4019, 3006, false, "dT", "мин", "Заключительные операции" }, + { 5115, 4019, false, "dT", "мин", "Спуск НКТ" } + }); + + migrationBuilder.Sql + ("UPDATE public.t_well_operation SET id_category=5113 WHERE id_category=5002 OR id_category=5003;"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5113); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5114); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5115); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5116); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5117); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 4019); + + migrationBuilder.DeleteData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 3006); + + migrationBuilder.DropColumn( + name: "IsHidden", + table: "t_well_operation_category"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 495d5897..a42f3052 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -6202,6 +6202,9 @@ namespace AsbCloudDb.Migrations .HasColumnName("id_parent") .HasComment("id родительской категории"); + b.Property("IsHidden") + .HasColumnType("boolean"); + b.Property("KeyValueName") .HasMaxLength(32) .HasColumnType("character varying(32)") @@ -6233,6 +6236,7 @@ namespace AsbCloudDb.Migrations new { Id = 3000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "м/ч", Name = "БУРЕНИЕ" @@ -6240,6 +6244,7 @@ namespace AsbCloudDb.Migrations new { Id = 3001, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО" @@ -6247,6 +6252,7 @@ namespace AsbCloudDb.Migrations new { Id = 3002, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "КРЕПЛЕНИЕ" @@ -6254,6 +6260,7 @@ namespace AsbCloudDb.Migrations new { Id = 3003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ГФР" @@ -6261,6 +6268,7 @@ namespace AsbCloudDb.Migrations new { Id = 3004, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Вспомогательные операции" @@ -6268,6 +6276,7 @@ namespace AsbCloudDb.Migrations new { Id = 3005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Непроизводительное время (НПВ)" @@ -6275,6 +6284,7 @@ namespace AsbCloudDb.Migrations new { Id = 3006, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Заключительные работы" @@ -6283,6 +6293,7 @@ namespace AsbCloudDb.Migrations { Id = 4000, IdParent = 3000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "КНБК" @@ -6291,6 +6302,7 @@ namespace AsbCloudDb.Migrations { Id = 4001, IdParent = 3000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "м/ч", Name = "Механическое. бурение" @@ -6299,6 +6311,7 @@ namespace AsbCloudDb.Migrations { Id = 4002, IdParent = 3000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Статический замер" @@ -6307,6 +6320,7 @@ namespace AsbCloudDb.Migrations { Id = 4003, IdParent = 3000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Нормализация диаметра скважины" @@ -6315,6 +6329,7 @@ namespace AsbCloudDb.Migrations { Id = 4004, IdParent = 3000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Наращивание" @@ -6323,6 +6338,7 @@ namespace AsbCloudDb.Migrations { Id = 4005, IdParent = 3001, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО" @@ -6331,6 +6347,7 @@ namespace AsbCloudDb.Migrations { Id = 4006, IdParent = 3002, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск обсадной колонны" @@ -6339,6 +6356,7 @@ namespace AsbCloudDb.Migrations { Id = 4018, IdParent = 3002, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Крепление" @@ -6347,6 +6365,7 @@ namespace AsbCloudDb.Migrations { Id = 4007, IdParent = 3002, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Цементирование" @@ -6355,6 +6374,7 @@ namespace AsbCloudDb.Migrations { Id = 4008, IdParent = 3002, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Вспомогательные работы при креплении" @@ -6363,6 +6383,7 @@ namespace AsbCloudDb.Migrations { Id = 4009, IdParent = 3003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка/разборка приборов ГИС" @@ -6371,6 +6392,7 @@ namespace AsbCloudDb.Migrations { Id = 4010, IdParent = 3003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО" @@ -6379,6 +6401,7 @@ namespace AsbCloudDb.Migrations { Id = 4011, IdParent = 3003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ГИС" @@ -6387,6 +6410,7 @@ namespace AsbCloudDb.Migrations { Id = 4012, IdParent = 3004, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Промывка, ОБР" @@ -6395,6 +6419,7 @@ namespace AsbCloudDb.Migrations { Id = 4013, IdParent = 3004, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Вспомогательные работы" @@ -6403,6 +6428,7 @@ namespace AsbCloudDb.Migrations { Id = 4014, IdParent = 3005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ремонт оборудования" @@ -6411,6 +6437,7 @@ namespace AsbCloudDb.Migrations { Id = 4015, IdParent = 3005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Аварийные работы" @@ -6419,6 +6446,7 @@ namespace AsbCloudDb.Migrations { Id = 4016, IdParent = 3005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Осложнение" @@ -6427,6 +6455,7 @@ namespace AsbCloudDb.Migrations { Id = 4017, IdParent = 3005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Незаложенные в ГГД операции" @@ -6435,6 +6464,7 @@ namespace AsbCloudDb.Migrations { Id = 4019, IdParent = 3006, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Заключительные операции" @@ -6443,6 +6473,7 @@ namespace AsbCloudDb.Migrations { Id = 5000, IdParent = 4000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Разборка КНБК" @@ -6451,6 +6482,7 @@ namespace AsbCloudDb.Migrations { Id = 5001, IdParent = 4000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка КНБК" @@ -6459,6 +6491,7 @@ namespace AsbCloudDb.Migrations { Id = 5002, IdParent = 4001, + IsHidden = false, KeyValueName = "МСП", KeyValueUnits = "м/ч", Name = "Бурение слайдом" @@ -6467,6 +6500,7 @@ namespace AsbCloudDb.Migrations { Id = 5003, IdParent = 4001, + IsHidden = false, KeyValueName = "МСП", KeyValueUnits = "м/ч", Name = "Бурение ротором" @@ -6475,6 +6509,7 @@ namespace AsbCloudDb.Migrations { Id = 5004, IdParent = 4002, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Замер ЗТС (запись MWD)" @@ -6483,6 +6518,7 @@ namespace AsbCloudDb.Migrations { Id = 5005, IdParent = 4003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Промывка перед наращиванием" @@ -6491,6 +6527,7 @@ namespace AsbCloudDb.Migrations { Id = 5006, IdParent = 4003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Проработка во время бурения" @@ -6499,6 +6536,7 @@ namespace AsbCloudDb.Migrations { Id = 5007, IdParent = 4003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Проработка" @@ -6507,6 +6545,7 @@ namespace AsbCloudDb.Migrations { Id = 5008, IdParent = 4003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Шаблонировка во время бурения" @@ -6515,6 +6554,7 @@ namespace AsbCloudDb.Migrations { Id = 5009, IdParent = 4003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Шаблонировка перед наращиванием" @@ -6523,6 +6563,7 @@ namespace AsbCloudDb.Migrations { Id = 5010, IdParent = 4004, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Наращивание" @@ -6531,6 +6572,7 @@ namespace AsbCloudDb.Migrations { Id = 5011, IdParent = 4004, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Удержание в клиньях" @@ -6539,6 +6581,7 @@ namespace AsbCloudDb.Migrations { Id = 5012, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Подъем инструмента" @@ -6547,6 +6590,7 @@ namespace AsbCloudDb.Migrations { Id = 5013, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Подъем КНБК" @@ -6555,6 +6599,7 @@ namespace AsbCloudDb.Migrations { Id = 5014, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск инструмента" @@ -6563,6 +6608,7 @@ namespace AsbCloudDb.Migrations { Id = 5015, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск КНБК" @@ -6571,6 +6617,7 @@ namespace AsbCloudDb.Migrations { Id = 5016, IdParent = 4006, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Промывка при спуске ОК" @@ -6579,6 +6626,7 @@ namespace AsbCloudDb.Migrations { Id = 5017, IdParent = 4006, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск ОК" @@ -6587,6 +6635,7 @@ namespace AsbCloudDb.Migrations { Id = 5018, IdParent = 4007, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ОЗЦ" @@ -6595,6 +6644,7 @@ namespace AsbCloudDb.Migrations { Id = 5019, IdParent = 4007, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Цементирование" @@ -6603,6 +6653,7 @@ namespace AsbCloudDb.Migrations { Id = 5020, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Опрессовка БИ" @@ -6611,6 +6662,7 @@ namespace AsbCloudDb.Migrations { Id = 5021, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Опрессовка ОК" @@ -6619,6 +6671,7 @@ namespace AsbCloudDb.Migrations { Id = 5022, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ПЗР при спуске ОК" @@ -6627,6 +6680,7 @@ namespace AsbCloudDb.Migrations { Id = 5023, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ПЗР при цементировании" @@ -6635,6 +6689,7 @@ namespace AsbCloudDb.Migrations { Id = 5024, IdParent = 4009, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Разборка комплекса приборов ГИС" @@ -6643,6 +6698,7 @@ namespace AsbCloudDb.Migrations { Id = 5025, IdParent = 4009, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка комплекса приборов ГИС" @@ -6651,6 +6707,7 @@ namespace AsbCloudDb.Migrations { Id = 5026, IdParent = 4010, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Подъем приборов ГИС (на трубах)" @@ -6659,6 +6716,7 @@ namespace AsbCloudDb.Migrations { Id = 5027, IdParent = 4010, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск приборов ГИС (на трубах)" @@ -6667,6 +6725,7 @@ namespace AsbCloudDb.Migrations { Id = 5028, IdParent = 4011, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Комплекс ГИС на жестком кабеле" @@ -6675,6 +6734,7 @@ namespace AsbCloudDb.Migrations { Id = 5029, IdParent = 4011, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Комплекс ГИС на кабеле" @@ -6683,6 +6743,7 @@ namespace AsbCloudDb.Migrations { Id = 5030, IdParent = 4011, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Комплекс ГИС на трубах" @@ -6691,6 +6752,7 @@ namespace AsbCloudDb.Migrations { Id = 5031, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Закачка/прокачка пачки" @@ -6699,6 +6761,7 @@ namespace AsbCloudDb.Migrations { Id = 5032, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Обработка БР" @@ -6707,6 +6770,7 @@ namespace AsbCloudDb.Migrations { Id = 5033, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ориентирование ТС при бурении" @@ -6715,6 +6779,7 @@ namespace AsbCloudDb.Migrations { Id = 5034, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Перезапись гаммы-каротажа" @@ -6723,6 +6788,7 @@ namespace AsbCloudDb.Migrations { Id = 5035, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Приготовление БР" @@ -6731,6 +6797,7 @@ namespace AsbCloudDb.Migrations { Id = 5036, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Промывка" @@ -6739,6 +6806,7 @@ namespace AsbCloudDb.Migrations { Id = 5037, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Разбуривание тех.оснастки" @@ -6747,6 +6815,7 @@ namespace AsbCloudDb.Migrations { Id = 5038, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск инструмента с проработкой" @@ -6755,6 +6824,7 @@ namespace AsbCloudDb.Migrations { Id = 5039, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ВМР" @@ -6763,6 +6833,7 @@ namespace AsbCloudDb.Migrations { Id = 5040, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Демонтаж ПВО" @@ -6771,6 +6842,7 @@ namespace AsbCloudDb.Migrations { Id = 5041, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Долив затруба при подъёме" @@ -6779,6 +6851,7 @@ namespace AsbCloudDb.Migrations { Id = 5042, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Монтаж ПВО" @@ -6787,6 +6860,7 @@ namespace AsbCloudDb.Migrations { Id = 5043, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Наработка жёлоба" @@ -6795,6 +6869,7 @@ namespace AsbCloudDb.Migrations { Id = 5044, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Обвязка устья с циркуляционной системой" @@ -6803,6 +6878,7 @@ namespace AsbCloudDb.Migrations { Id = 5045, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Оборудование устья" @@ -6811,6 +6887,7 @@ namespace AsbCloudDb.Migrations { Id = 5046, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Опрессовка ПВО" @@ -6819,6 +6896,7 @@ namespace AsbCloudDb.Migrations { Id = 5047, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Перемонтаж ПВО " @@ -6827,6 +6905,7 @@ namespace AsbCloudDb.Migrations { Id = 5048, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Перетяжка талевого каната" @@ -6835,6 +6914,7 @@ namespace AsbCloudDb.Migrations { Id = 5049, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ПЗР при сборке КНБК" @@ -6843,6 +6923,7 @@ namespace AsbCloudDb.Migrations { Id = 5050, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Полная замена талевого каната" @@ -6851,6 +6932,7 @@ namespace AsbCloudDb.Migrations { Id = 5051, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ПР перед забуркой направления" @@ -6859,6 +6941,7 @@ namespace AsbCloudDb.Migrations { Id = 5052, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Продувка манифольда" @@ -6867,6 +6950,7 @@ namespace AsbCloudDb.Migrations { Id = 5053, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Срезка" @@ -6875,6 +6959,7 @@ namespace AsbCloudDb.Migrations { Id = 5054, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Тайм-дриллинг" @@ -6883,6 +6968,7 @@ namespace AsbCloudDb.Migrations { Id = 5055, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Тех.отстой" @@ -6891,6 +6977,7 @@ namespace AsbCloudDb.Migrations { Id = 5056, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Учебная тревога \"Выброс\"" @@ -6899,6 +6986,7 @@ namespace AsbCloudDb.Migrations { Id = 5057, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Чистка ЦСГО/емкостного блока" @@ -6907,6 +6995,7 @@ namespace AsbCloudDb.Migrations { Id = 5058, IdParent = 4014, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ремонт бурового оборудования" @@ -6915,6 +7004,7 @@ namespace AsbCloudDb.Migrations { Id = 5059, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ловильные работы" @@ -6923,6 +7013,7 @@ namespace AsbCloudDb.Migrations { Id = 5060, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ожидание" @@ -6931,6 +7022,7 @@ namespace AsbCloudDb.Migrations { Id = 5061, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Определение места прихвата и ЛМ" @@ -6939,6 +7031,7 @@ namespace AsbCloudDb.Migrations { Id = 5062, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Работа яссом" @@ -6947,6 +7040,7 @@ namespace AsbCloudDb.Migrations { Id = 5063, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Расхаживание" @@ -6955,6 +7049,7 @@ namespace AsbCloudDb.Migrations { Id = 5064, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО - колокол" @@ -6963,6 +7058,7 @@ namespace AsbCloudDb.Migrations { Id = 5065, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО - метчик" @@ -6971,6 +7067,7 @@ namespace AsbCloudDb.Migrations { Id = 5066, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО - овершот" @@ -6979,6 +7076,7 @@ namespace AsbCloudDb.Migrations { Id = 5067, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "СПО - труболовка" @@ -6987,6 +7085,7 @@ namespace AsbCloudDb.Migrations { Id = 5068, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Торпедирование (встряхивание)" @@ -6995,6 +7094,7 @@ namespace AsbCloudDb.Migrations { Id = 5069, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Торпедирование (отстрел)" @@ -7003,6 +7103,7 @@ namespace AsbCloudDb.Migrations { Id = 5070, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Установка ванн" @@ -7011,6 +7112,7 @@ namespace AsbCloudDb.Migrations { Id = 5071, IdParent = 4015, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Фрезеровка" @@ -7019,6 +7121,7 @@ namespace AsbCloudDb.Migrations { Id = 5072, IdParent = 4016, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Контролируемое ГНВП" @@ -7027,6 +7130,7 @@ namespace AsbCloudDb.Migrations { Id = 5073, IdParent = 4016, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Поглощение" @@ -7035,6 +7139,7 @@ namespace AsbCloudDb.Migrations { Id = 5074, IdParent = 4016, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сальникообразование" @@ -7043,6 +7148,7 @@ namespace AsbCloudDb.Migrations { Id = 5075, IdParent = 4016, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Утяжеление БР" @@ -7051,6 +7157,7 @@ namespace AsbCloudDb.Migrations { Id = 5076, IdParent = 4017, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "НПВ / прочее" @@ -7059,6 +7166,7 @@ namespace AsbCloudDb.Migrations { Id = 5077, IdParent = 4017, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Обработка раствора (несоответствие параметров)" @@ -7067,6 +7175,7 @@ namespace AsbCloudDb.Migrations { Id = 5078, IdParent = 4017, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "подъем ОК" @@ -7075,6 +7184,7 @@ namespace AsbCloudDb.Migrations { Id = 5079, IdParent = 4017, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ревизия КНБК/инструмента/ЗТС" @@ -7083,6 +7193,7 @@ namespace AsbCloudDb.Migrations { Id = 5082, IdParent = 4000, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка устройства ориентирования КО" @@ -7091,6 +7202,7 @@ namespace AsbCloudDb.Migrations { Id = 5083, IdParent = 4003, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Проработка принудительная" @@ -7099,6 +7211,7 @@ namespace AsbCloudDb.Migrations { Id = 5084, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Шаблонировка подъем БИ, продувка" @@ -7107,6 +7220,7 @@ namespace AsbCloudDb.Migrations { Id = 5085, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск бурильного инструмента со сборкой с мостков" @@ -7115,6 +7229,7 @@ namespace AsbCloudDb.Migrations { Id = 5086, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Подъем БИ с выбросом на мостки" @@ -7123,6 +7238,7 @@ namespace AsbCloudDb.Migrations { Id = 5087, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск БИ со сборкой с мостков" @@ -7131,6 +7247,7 @@ namespace AsbCloudDb.Migrations { Id = 5088, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка и спуск ТБТ" @@ -7139,6 +7256,7 @@ namespace AsbCloudDb.Migrations { Id = 5089, IdParent = 4005, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск КО на транспотрной колонне" @@ -7147,6 +7265,7 @@ namespace AsbCloudDb.Migrations { Id = 5090, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Отворот допускной трубы" @@ -7155,6 +7274,7 @@ namespace AsbCloudDb.Migrations { Id = 5091, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Активация подвески, опрессовка" @@ -7163,6 +7283,7 @@ namespace AsbCloudDb.Migrations { Id = 5092, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Монтаж, опрессовка ФА" @@ -7171,6 +7292,7 @@ namespace AsbCloudDb.Migrations { Id = 5093, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка хвостовика 114мм (согласно схеме)" @@ -7179,6 +7301,7 @@ namespace AsbCloudDb.Migrations { Id = 5094, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ПЗР к спуску УЭЦН" @@ -7187,6 +7310,7 @@ namespace AsbCloudDb.Migrations { Id = 5095, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Активация подвески (потайной колонны, хвостовика)" @@ -7195,6 +7319,7 @@ namespace AsbCloudDb.Migrations { Id = 5096, IdParent = 4008, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Шаблонирование перед спуском" @@ -7203,6 +7328,7 @@ namespace AsbCloudDb.Migrations { Id = 5097, IdParent = 4012, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Промывка - перевод скважины на новый раствор" @@ -7211,6 +7337,7 @@ namespace AsbCloudDb.Migrations { Id = 5098, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка БИ с мостков на подсвечник" @@ -7219,6 +7346,7 @@ namespace AsbCloudDb.Migrations { Id = 5099, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Подготовка ствола скважины. Перезапись ГК в интервале установки КО." @@ -7227,6 +7355,7 @@ namespace AsbCloudDb.Migrations { Id = 5100, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Смена рабочего переводника ВСП" @@ -7235,6 +7364,7 @@ namespace AsbCloudDb.Migrations { Id = 5101, IdParent = 4014, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ремонт" @@ -7243,6 +7373,7 @@ namespace AsbCloudDb.Migrations { Id = 5102, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск пакера" @@ -7251,6 +7382,7 @@ namespace AsbCloudDb.Migrations { Id = 5103, IdParent = 4011, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Запись гамма-каратожа" @@ -7259,6 +7391,7 @@ namespace AsbCloudDb.Migrations { Id = 5104, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Шаблонирование спуск БИ" @@ -7267,6 +7400,7 @@ namespace AsbCloudDb.Migrations { Id = 5105, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Сборка клин-отклонителя" @@ -7275,6 +7409,7 @@ namespace AsbCloudDb.Migrations { Id = 5106, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ориентирование и посадка клина-отклонителя" @@ -7283,6 +7418,7 @@ namespace AsbCloudDb.Migrations { Id = 5107, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Протяжка подъемного патрубка подвески" @@ -7291,6 +7427,7 @@ namespace AsbCloudDb.Migrations { Id = 5108, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Подъем клина-отклонителя" @@ -7299,6 +7436,7 @@ namespace AsbCloudDb.Migrations { Id = 5109, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Стыковка стингера с хвостовиком основного ствола" @@ -7307,6 +7445,7 @@ namespace AsbCloudDb.Migrations { Id = 5110, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Ориентирование и установка стыковочного узла хвостовика" @@ -7315,6 +7454,7 @@ namespace AsbCloudDb.Migrations { Id = 5111, IdParent = 4001, + IsHidden = false, KeyValueName = "МСП", KeyValueUnits = "м/ч", Name = "Бурение с отбором керна" @@ -7323,6 +7463,7 @@ namespace AsbCloudDb.Migrations { Id = 5112, IdParent = 4018, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Работа пакером в обсадной колонне" @@ -7331,6 +7472,7 @@ namespace AsbCloudDb.Migrations { Id = 5113, IdParent = 4001, + IsHidden = false, KeyValueName = "МСП", KeyValueUnits = "м/ч", Name = "Бурение" @@ -7339,6 +7481,7 @@ namespace AsbCloudDb.Migrations { Id = 5114, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "ТО оборудования" @@ -7347,6 +7490,7 @@ namespace AsbCloudDb.Migrations { Id = 5115, IdParent = 4019, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Спуск НКТ" @@ -7355,14 +7499,16 @@ namespace AsbCloudDb.Migrations { Id = 5116, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", - Name = "Фрезерование \"Окна\"" + Name = "Вырезка окна" }, new { Id = 5117, IdParent = 4013, + IsHidden = false, KeyValueName = "dT", KeyValueUnits = "мин", Name = "Расширение ствола" diff --git a/AsbCloudDb/Model/WellOperationCategory.cs b/AsbCloudDb/Model/WellOperationCategory.cs index a6e6fa57..4b73de9b 100644 --- a/AsbCloudDb/Model/WellOperationCategory.cs +++ b/AsbCloudDb/Model/WellOperationCategory.cs @@ -397,7 +397,7 @@ namespace AsbCloudDb.Model new () {Id = 5113, IdParent = 4001, Name = "Бурение", KeyValueName = "МСП", KeyValueUnits = "м/ч"}, new () {Id = 5114, IdParent = 4013, Name = "ТО оборудования", KeyValueName = "dT", KeyValueUnits = "мин"}, new () {Id = 5115, IdParent = IdFinalOperations, Name = "Спуск НКТ", KeyValueName = "dT", KeyValueUnits = "мин"}, - new () {Id = 5116, IdParent = IdAuxiliaryWork, Name = "Фрезерование \"Окна\"", KeyValueName = "dT", KeyValueUnits = "мин"}, + new () {Id = 5116, IdParent = IdAuxiliaryWork, Name = "Вырезка окна", KeyValueName = "dT", KeyValueUnits = "мин"}, new () {Id = 5117, IdParent = IdAuxiliaryWork, Name = "Расширение ствола", KeyValueName = "dT", KeyValueUnits = "мин"}, }; #endregion @@ -418,6 +418,8 @@ namespace AsbCloudDb.Model [Column("key_value_units"), Comment("Единицы измерения ключевого показателя операции"), StringLength(16)] public string? KeyValueUnits { get; set; } + public bool IsHidden { get; set; } = false; + [JsonIgnore] [ForeignKey(nameof(IdParent))] public virtual WellOperationCategory? Parent { get; set; } = null!; diff --git a/AsbCloudInfrastructure/Services/ExcelServices/ExcelTemplateService.cs b/AsbCloudInfrastructure/Services/ExcelServices/ExcelTemplateService.cs new file mode 100644 index 00000000..75aa1f20 --- /dev/null +++ b/AsbCloudInfrastructure/Services/ExcelServices/ExcelTemplateService.cs @@ -0,0 +1,39 @@ +using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Requests.ExportOptions; +using AsbCloudApp.Services; +using AsbCloudInfrastructure.Repository; +using AsbCloudInfrastructure.Services.ExcelServices.Templates; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services.ExcelServices +{ + public class ExcelTemplateService : ExcelExportService + where TTemplate : class, ITemplateParameters, new() + { + private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; + + public ExcelTemplateService(IWellOperationCategoryRepository wellOperationCategoryRepository, + IWellService wellService) + { + this.wellOperationCategoryRepository = wellOperationCategoryRepository; + } + + protected override async Task BuildFileNameAsync(WellOperationExportRequest options, CancellationToken token) + { + return "WellOperationFactTemplate"; + } + + protected override async Task> GetDtosAsync(WellOperationExportRequest options, CancellationToken token) + { + var dtos = wellOperationCategoryRepository.Get(false); + return dtos; + } + } +} diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx index 065dc2070b20c533bc426b21237f4e4cf062c581..97e0f79a5f1dc05ca7461d5e50aa8c858cfff777 100644 GIT binary patch literal 37120 zcmeFa2UJzfmhTIQM2V6lXHXCjHaUqPK|nx}BsqiR3=)J*lqkqX$vFr}&Pk%cmYgL? zmYg#i-dghY?Y{4g{`#GJPT%hDw7SLucFi@besfmU`j4u$##WZUfl7pgfq{Y4ZycV-a)9T;=;o)bT(<(ZU%$O~%sc%MBQ3j5LAH(#Lj8r&hN2=QqYb)u zBz2qcR(NS^guS=VrD4{Lf(`o&7qh%>$P3L7lm=!aubejcrM){RUr)Ms2Z4ahGh4}f z4v|Vv4!+GvbZ5SHih6?eb6-(@0C~k|!x%~QVUUB)3s>$-1nLQKOaigoXH2|m;IrHBaqryXl2s&#qg&qU zBpIrTphLWeuYUM&yS8T8!Orjit*4&QpUceYwIYL;tio0bF%^&AlTfYX3;6PFWqEXr zfOts!77&D96eJ|&e>Y5cfQ6eCr>m{QD??k`R~&BER^h6XHbW2by;j)1eJTp!w2&lk z&wD$RD?2p|J1WtdT<}=+82di0jrHhJ{SK9^C(?Z0C)5kSbD3}7?Pa9`+=?4`>RvB@ zOS}__3%lvMoC=AdXY?LpzzvqlR?rSu?3pO%p^e~E&3rG9Ojm=fh}#haxd5<|rdu!xMzmwev zQ^A;Dbzf7meT28dv#b?TX$vLm42*g zxjpgpLA9V+d^@FJK3yx$Av+HH@+g9Hr06^{c(>uq{i^0nWm?U3WD`wm2d`YWr#LJ2 zQ3q=Q&W1^y z-N{J&M2G7h$?9-4`F-t#v$}XT4tvCyl|2cYd3GK(`}{W|?5=YbL@Eu=nFNc#!E35n z@$c&*o10tC*)l_SD^(yNM>#ZhotDFNVk$Add{|dxEKx}_`Wc*(4&@4OX!r{Kzs9>N z_E@7EUr>Pk7wL<`Z79%py-@$G|KeQtUq>f*D-%bs_inzFw^`sLn>i-(E49vuV|wYk z*&Ozgbov%r(kwO`I$j+V1H=(?nLfiZ3eVFRPGj-w*Zk>2Br?Ln;QG`M2y*tPuc=YeTysP#5cxHJq z&Bc(9(Wv)OmdKK>OM1;O>fp%`w=J?!lukMk^ZVPhls6vP?rOuI-SSO&kR>pvpyOIj z<{u(N&CI_GVg5Lumf#;YtSk5IWR*0fWBEWeAR&P^C2)^NffnuEC(MA&?BeZL_63DM zcY{hbwA*)Iz~mrQAG4(zXWuuST+Tmg8g^zbB*vk@yYXIilgBFdc}MF;=pLrjdt)wl zyvG=9ZekR9LwU(GHP7)SIrxxO1X}4B&}eZph*?&i&7k}UJCb?&;82$u>3DE&g!_y< zh_b`X_8ICP#k4n36u;LlhiH1y9Ww&Y8+W$f_tZD7XH?aGr2R_4-NE3_jfXNU@_D^S zx|`Cr(tSQYaCc~ck|rnQE6v@=*w5&v-(#gtLqyG5Sns9qWOrjO7+_)e3Va--$f|DC z%{s7%?avY7kAZJSB^woUE7WC2rR2`uX%Q==UrQF0+m+;!!3-A5WZ*?oK^uuaU^q)G z2w5;dz3~WV!LCu?%| z)=R%_F8Y23_oTR(uad>cl8`))%^*EneoeJ`J~ zvjbJ0^O{JK{x=RXIj+}{g&ZIL<-eETs^-c;=EfZ}V#V!(^ap)+$&VBLEQnSc7=jq` z2FC_GL%F@sQI0}ozPRsV90;T8il9JkYUYz=Yp9;#WR{=Jlj+^dFO0sk)tGM#*S|e- zW+zGn8zLDPPba;(^zC&YInUPWJ32?9PTUW@LY)yujAl@+Z6;%$`82%B z@8mJ*MBa#o)6gipP1Q!d>HnM54TSGax#5qH4j9kG;jv+=M!KUCZ;V_qnsQm6T3Rnm89*3RecVH(p+cos7c(~2(7 z>d7N7>w34!wP8Zp5p(+PG40Tt7yJCJ%*}yA-}kLcIBocMFT6ybTg=%t0DXhE1 zl=6YihMkVRE&ReRc|4NcRY0lDK#*y)gncx>bljLhqt{;NPS8@ifDDz4UqtI=8-js? zX#_opp2{8-#p^SnKBtc)%iUV)lhqG6^C#VP)GQLm6Dm)qoGAro zJ2W3`YPqR-DNuMc^s235H+;7qN?#?<8x*k#yYPsKJ#4IS?UJd8Q{8RAbS_$vnh)LT zP7|Gj9#u|!8m!ReFN>Wy8q|M3AmTx|QrC^Jz8~_%-y^PqXK9OK^0OFox3zY|bZkmO zr996we$8awZR;;XOD&aGwebaI^>X>P&W6nHR4dMwpJR8eJ(BolV~;%crJML}p2PQ- z3}UfktJu$zR zIXNJ_UuWz~-jJ(}aCIMg!Zp2WspoA*q^A(-^3ZW8lVg&DV@SmIM$%I?>uFns^TCv- zV&)AEy6rW0nCApoimuFUX<(H%&bYmcTwOHI@(ZhM%DpE^DmH~SArq|MkvSGdgBsqh zGV*1)TI4LV@r&I5xs^05J}zj%NxfWPeRgn+Sk#_y4ga|1&HhcmGli+AgY`B~mNBa; z8KrdhH~5%^@Y-^zxMNQMp6R2b#|WaIHU)awt`;^n#nDgU3Zy#0`z%;6Y@W{*h$gBz z5sq~i+;eI5y4rzBT`hk31a`SWl+Dqjn()~>AD7M4##5a48g!BB&9c*7g2k-k zbZ4`IoK`=5-1a%+2w12+f4EtcYQ&43>Ba8^o${J*SFG1oJ@bAxfxPCiy}Zyr*QJe@ z=`N%YUPo^DFk@D7YrrGc} zJp8@dSzY@GkQP7lLy8}MStr0HnOYYF8rh$7po=_k8a{df`^ zH}GVFy<1v2_(ODL4SjwZkkXYXxs5L|mtf0n;E8U~Gvekh+2V=nFJ02L)U*h=ync@X zYsQGW(bCPqAEkq_sBdmUitO-EV`2%d6nm_txgXBavhZe)n?F*ga{e=UV@-pkc^%#-vX`tL@2sM=Z_yH^`L1mU6ZI9-DaNIH;@DTQ;t#eR=kol^Na;qZ!Z$@j&Nq=Rl0OVl+v$LS5WVhfUBw?K)1+YQ?wDdf zq75Z3e$Zn0c;Z7sJGF5M3ZJw_0V{=L**KJ4?MnwnD6xT2N2)s(MHX|ud^V5t);ZT9#Mp^uM={y$_dpqAd1Szmf*5Y1zTn=i6 zNPPb8^s-MztPyvj1R@%03?nU-_S}A(V<7QTxUOEoDA61#bv{GLhIa%KX z2V+Q~ZUke{($k|5APdu@7(b7cLD3BIHdHA#$d_9fktx z#s>^qW`9XLdi@nCBtbe#6e46{Rul}ZIsDA1jm#*!yL6O(MA1n^gwc-#hB*XXRAr5W zawUr&m6koCFGxKaed3}f>rd>bA7E@2Ae9`0X=zqu92C&zVvglU5}iasn0B+GNTYP< z5q&v6>U~Dx`;3pUE!7=6pN8V61<;xkln&8LnM-Wu;Z9f(7_MMqX!&oHV-RRXQPct- z(3jg`{`%lu?9GZK5#yl8!3FHve#CUbY>)hjhfR;7l8EVAu;TO|clN&Jden%f{CbsG zn4Jg(JMK+@VNk#$eF^IY^^Ia>40df4lDAYOSi&!*zdR~weMDEhgQ3CdqQQzvGCX&) z9Tz*`OACX3+PFa)zJ~G&Gtn<6k=IU0NQOhggOi8}TCgJZAGh_s#W1+(tifn#_SnC; zg+YU$q>TQNhD6fyka0}{x`G`{HL0n(iuB97?>*8Z{;&^FDyIKs?1oS~9-Vq~` z_?RYoSptmOaw9#%}j>u;P%+2B~H zZ5(?sDL2m~-O;0`SaBA0ZWl{pA4}!H+#46_HujS(;e0o$c7S`#$)mnp`~3?wNYRr7 zGsjZ71wILLui&Gj4;A(r4qil6122vwNEH+HvI8s*8Hc8Iw0I}5bU(Ptu{MS0PkwVs zoScg2WiQvn$hT=b=A_W6?lTYQDSMwLqg*xEAfy<&Kax0`Ph&#g{QF}?X0&3LoM?1 zv)`6={Onm6nOu3ihhTn%JHf{yN1U=)p`GRKomXW|I9#i!s3~%1hSX$~`phX}!Gm3M zmHX9-T={_WuHHm0i(I8{LJ4Ple!-_m9jdo_OkL`(Uyl(EX)&4bu9^$>8JM2-_bc&p zgPa7;WOdENtIN5SARp1ogOi2UqDXPki<~+`Hq5b0x5f`NljaHQ?=J$EsV`4Yj=wgE zUhM6xw>HsS?e4(aU`>^q$Kf2yIRhM|UTb4=hwMDIRci@t5uF!N<1VLqpjP}W9P6}< ziG)O{{%2Z|;s2u*uh-}PRWbfrsSA&UW3_PMKR)(;{GmZ^{gG6>3&W$TXX3PsLy&P1 z+4=SD9_f-FElb}T90P}(@PuP1I*jWVl!ve|gjQqi<6GSYKD+i;(E~DU4tFw4B|1aaoKvb zV9rQgU$5nK`V~7ny_z)Ak4VL6`Qhs8W6W1t#b4gizZ9tC1i@QI9>nDWSmelm22S+H z8il!mgNgBTCkG1~vtLUU6VZ0C^GJd?_NV;!GagXAuoQ1!&ie8enB02$ND zFd=vKc3iZ)1iink6ywzM?{QBmoAqz$Hnwc=uho3h-QZpP_Wk0J6bIfbXx4ktyRB^+ zM13J9n5Jut-M;H-Bk+z|mPwV5Ki-Es`88kS$zhxf!j1yx7vR9T)m?%J3Rk_-`{vw(q{9d*)aq5PRq5CT-4# z`}Lj7(g(FJPD4q~D^qt|b@`{%YqvPqT-C--NOfqQz@!7CSr@nkDQXKMor%5q3{(_- z#~pPX&73BryV14zQuQtF#I5n*`@-&bys!GCWS~y0(LZbwFo}Ab%Ig!{>ujSoJ?Es= z3#a>O#Slf_ioU6iuW>lb7~)>yg~}iuFF*-!f-(P zVHS)dVuKnk_Kt2*59#quV%J(_ehPT`(e8_MKSd_JF+;+|aaU|W z!g=b_IkYfps2~4p(rWB9e{dI>!cJR>;QL?|OXW(t_9U6`!1#rG=Nu8-s5C_~o%QIb{(McV1l{J|1 zyE@rA5z{UEAL52%E~D&i`{;}O^c1(Q7;a9T>DszvXasNKNpa!NzMsY!coFO-xI%I1 ztR6L1_dquIgjZuU^&YY}GtSsKUUgK957r$|Y^RiG{dN&pmJ~ID8f87KCo7+4kfS^9 z{iMvbBYC#0)P$g2oDIc!XJ~vsQ=KMC$Eo*Z9WptCf1EhzV_F@qKrv! z?XqH}%PUU^QIw=ZB(2}iYWnHgP%7u~gd#gH%gBH&f>tHfmF?LDW&uI+yOIts_|hju zUplTwvceR>xUmpLEc&7#K8!rm+x2?Raf-w@0w|pGA*d>`1(+Y;yDq^Z-*iX9e&;AfrLmlGr18*FDr+7+&~%5`~T3!fS$1GGXn$X_Hr#pE5b zdb^@JQ{6>#;4pTBFBX{w=QF92JKuNPmQf1TT?OS%)hmO!ASPNnYTtWOP4@7rA}jx{ z_sMR!%q}{NIxo7FPjYT-eyNLk@N_pE_jz{yc-n_t&Pj$NW8ESxOq{#^h_tNsXRzZ{ z${#H;V~!$N@hr;Oyu?lAunNfY&h?ifs5YzS4ZVXp2SW1Ha&Lv@<(~)0HS_QaF%sYw zhauTraBl>l7({T;TdHasASu5bH_pg1z@&%mo zKfq``_}O}184z!kuDS}s75`id##;hjg3=>>IM4+Tps z=tq~O^qc(*kl`PxIlU!gCpX#w`(wn&tcSr22$D-e2`F_g}^CJ(o8@WaA4og4aeHD>Lr%*b6>+{cP zvS$j;!!NAMZwvFee&*t6E$uNT4oLhU`$c{$wDwg;ogL9odQR)b!>l3xl0sFlHurJj z_aTIokLjK!1s2;(Vq)=f&i+W8&h%3zHrTn9;E5ONKc=xm4~az}H}NlyK`ynZdmAf} zD>PS6^u`6B8Sadp2}W&JvVL{(!=I1JGTM!Nzm4|2Wn8N?j`AD7lcz3~`@!2=KhxvR z;)zPPM4q99Y%4$7yPwBUZo^Zph&#>LGjJ?1@b<9)Kc>Yv5|yFLp?U~>rawOQtW-P& z`+M8C&ivDz$5BoaTzZG-q~ot?b|QX~b3A#cYUc3KKk_24z`3hbUe7e?P|_vKjwk8L zx4rNbX)dtvHoY6^+}I0(Qh6Ddr&ZjWMl)jOUIIU1&CY3B%5K4NaK3~rs2K5+sn$9M z4SS-n^n7nR->SGlCBY;5+a5*AH!H~;MdzHP8>5IknMb?Fd=@G z8jH(&Ie)puJupYE?n&V`$1);H#-zPhQ|Xx)#ZDs6aCHMzV_R{<$qIlBwc!3UHTK7n zrLltnuvTQ|$oa=F55OhMq^KTTKQ4U#ZLymZbwr|Mk|#CzDGzD%B}vU6RVh|sH8v)m5QNRcqPCJWR+u}O@g4OE4GM0dKVt)y48?)oajrHJZ!d^z#1QZ*s< zD?XMBfz1cQHJ2743uu@SBL%%q!pbqPGZ$9jJ6%V| z=MODMxA!x3-?@b~KYZ~%m8*I@+<eVcOhpOG zh3|c=9@Qv$m%SEWKO|nXrtN1~N7eTk4dN$5uoA>;>|1=!4^~^JkG&9EpU0d^ik{e_ ze-G9&4MwHgdsrHet!ezzq~TztlLz+XDO~GOAg+EtebbYVPc#bWRK~E%iSAp&GSTDy!TU2yj}=9wn~e7`dtT-fIBGjwo=f8bw~Pg2*+nF`jZ@AiAvU8E@?d zjzFvOqnm@|3MhU`TG+MRq?`xeK9&+5rT$2FVq`g-36>kLwC?X{7(P_mnOvKzp&219 zeSHs&RVgx@QQ=0#7g4jQTT9Z*yp45woGR1-1iNxSZ!+63J=y+(V=!Xc0zLCrb!MRW7 zN19q5y_f_>7lw8-hHx}56CB|IM1x4g*{A0-71r^QO8PDzES_jv1>84y^L3{$=v&jT zRE?5$h+6?2dFoG7h5v6;WngFbYskK9wrQpP^))$rtSc&4>`M_ZXKg7e$MJxTod;xQFI5*&P4u&#ci3nh%!n$HzYkz7AZ#e> zPrrd${=;>{+KIZuoYpu*Uoy1v!I@x(gpC0{ol>ddTbBh|!zW*HT(l@Km7aRz=`&>e ztCAfN6rk|#lF|y@Ua33L%XQcj(9>{1PjO3h<~q@p`f*FIwfFIWt0|HgTQ{Tjv!kD0 zwwb}J%opvR5j!5-&Ca^Zkd&FCuoqh_1>*6RI)5+oX zzm2Dnv!j!(H5k(NXt;QT=18VTtg{8(HO!(9cqkUW^zi1);+CjjwqQ zxOJ*RIq(H0OU;a`&8nN`s!_0`RH}T- zEj02QH?UV=*@BG=Kgn5m#c}(dg=3mPtE%^uFY(5AQcP1=BVd{c<18Wl*}L?U)0fo37V$I$&8F_=#wm=ETP-?fDXOd{HZrxDGGSPj4AOcr zs!J=c_$W$1dQ8iaxHpcAFQ+=B|O5B&b zZ$OxyNotFb1OzqeRsRIqaKyDs8$s>!b6n^0xVaa$QrbMv5KG5RX`0eDC$W~pDJC_$2pBq*-EgGY zZN8-wSibr7G^T`3D1EZr>q<&DeRpQDjnx`4ZS~{eNtFjO)hi{`j@{NE+nk?yeKz;~ zCt=9KFN70b=Cn=h;q)l&>ONX?bvVET6F8%XaC`$KP!0Y6hmrvAs{eNL^OusSpH?Z; z`RcrReC&xuGFue9m0VUADL+`)mVBfTYwN()$e-6uq40z_v=}DTIi)FZv*Zvm#>SFS0bwGwU0wDZ7tJEpHi7GQ=GdBEpDzG^`<$eRUk<5nU+yd6dz=PZQ zw)Yj_Ra9?NukqAXXFGvL@9MO*P^>9MufDzMbd^n9&z9`-F``QE>f~s8a<<`W1OU6b z71W#o?1FC^0`Y&%X3nI?x@e_eD40`Zr#{+a?#1%i#nPn#PW6%Vy-9X01@ePL3v4IdvyUo z!STNC&bh8}HtqN{o!Z&-HAl`~4sDCqcQyI!*By)N?IG5EE`s=H8&1y<3AWU_%RW~N z=i6fS-QpMP$3S%IQi^tZ5@s7N7hJc+8-wtQj*q^sTqx1Z?AbP6%q_h0KAwxWz1rF3 zy*%r2o%O08;cPlNGdlJ`?4V3GUd;Q{dz~Z1JrQShc<6_77~Z>0S5-<)7ba)BvR9Xf zO^t|!9LG~Ip-zZ}$*QZ12WM{6>NMiHN>#hN!B;zH3*sRuv+Z$u^_NkXt368F%S9^} zCObn#i23QO{nh8EC+#WX6_Ih5OFllAPM1eR+X;9yCo5$qcDPq#RkQV1h#*%!Z|7~X z1?sEQOfgTc)8&N{pOaFArT0n8)yYnXh)hb~`KFQ?;@I}`V7U&j>BrE^Gn1n^Chywz zBI=oDASZL$vtDOSG)gCRV?J)jp?JIN;*GDbj?VjRH*=I$k7vF2dlG0C;ocrS+j>{< zpsLe3aUc&vK7dgXjd)h%3S!74`>Ol+E5jMQaq;3JdVeL3QoJd%;cUd~4BoVOb`dQ< zwdB(;|9vG6vKwvWbyBz==OcG@5&cWP&f5CjT1@H+smyx zXu4RR?kjR_Uq8+9$?`cI68|8Mxat}MT5&Wc-iX*I756^#LJZ|!9`x<>aUSgIp_$De z`m9}2TveVN3|5!n@n7t=i(MuhPv^|e(|GUJ;jN~4pRbMSAyyYA&!Z-4XJg!!j5GirT zKDskka9Z50s~?vGUC*bktQ)S*_b#{L=S`g3S0?zR$3FH~KNs(BUF98KrU14>Kn1@V z<<^1_p98MRnZNv+KYHWj#37PpNAR?r!1JlMJ(}#i;~xCETZFg$EvqF?&OhSdOczZ?84SgKS4cS`P1(R;ug`@0t<5(nm=P^*{)ehDn+z|B%(fQghtM0Z?e)3n zLz=q;s_#s6s}yz&2veZDEPSz})QA9F3*$z}0Iv7#54OJgA`2GNqBAoBuHQk~q5;H@O3b@u3tY!mT--l1sv9rLI+Da2O zV6uh|nol|8D;?C}4o4jD5EH=?po}T{gElM%9$lC?QkvM~bJi*D4On07OJDkCoZOb# zm5G?|qs%uEd>wb~pa`E^p_rXm_n>ud2xZoBU|O@?C*uzyrWK-nGq_YJ>EjU`v006SZKYb?i9s!D8S< zC`T5T1vXsmzWlllEYQS412}~+hQSA`*(aXl!?F%JtaE|fxm{xJB-#G=Q?B-+O;+Q%Z==T)?i^|Olxxm{A0_SwXOzs*m>b>n~* zzVo-&BnPr!F;ZGSbKN+gg|aQx?BPIXE4S3t+P-ca&_YH7ZCD488m$WU23JiXSe6lR zVv4rokY6b^W^2%b&D60|!3Rr#6QP_yT$Uq%t$Sa7TL%_lvZ?``LKqX_gEatl5iIMN zL;h>26FYE{BJ4F;1+mrPgRkR$IR#Gim@B1DAa=e9aF>s5rGd}&E$yH?p2P^w%Q&|6 zEeF%|=KXDM0BW#p!0Da8qoxo*y*g5QFmv5Dpn4offRlRnvwY9uAhhYg;az0=vv-*wU5`i~{ap1e5{2x`v$}?A1VT1jb@V>68Xg zMkr^+0q+4qxAnKWwz+J!yPe1b}mDq*SBx}I>6<7hCmtMx`v$-be;d7>Kf45T`TH) z$S_YoCK`jg$p&|+4eur!YTk!W)?GInK$4wz(9{Jpp$6Z}bJY|x_~W1tVc~$YfCYJ4 zFeM<*n139Eaw7JcV&I&lG*apbOm|8ee;l&&A@IErAbp;|JotRO)U)M}LyAyI8wMO! zOV2CVQ-Im}HthOfigueX^_&NKP0A;e)8RVyl;S^*cWt);GayE%s`ueJGbX40e;gr< z$<^#BV2{eN)D$}e+Q@!=$TRM?nVhx(sS$heXDB^NvMUUOr(sTFj7dszq>*x@eR8CD zPl{6B&j{ZaZ2P8M&~sG3UFg{Q)oTwLN`LpMp<&PQD?fLo+RBC};6d;Pfp^Pa^P1-OhxK-S*NRT0oTYXtMU#Wwa)n-> z+SQP<4Aw~kZG+!#CiIG+ev10?0Id15%D^Ajq8BvH-yYT5C0H*y3Hz68zx~U#7nz6Z zp2I+!UI7iLj9^X9_@xs1M$qnf;6^{+yuPv2x}=*Z zyI(e@w>t;;Jpi0s2&KD4P%BA^_$D=YR!?CMXS7uwNFTB-dJjmcAj z{>UhA)I){>ng9grri{J#lIbRzkN*inCyl`+#(_+p_*;a^mJ-gD6I|TylHe%vi;w?h z#tF^R6)RFM$(veCS_33ZR9V)Ce#p;oqx{~yM^%0PaGE6Q%Nu_*MgiJ6fgzD3*CR=RN9l1H@BO8Dm>}kuIEIg)@%R~J zEw{;0hzJ`fneIa371JbC&6SDCjRVNq@r(QMOQU`+v0A4Mgkj^XJ%ZNvr*gKj2I2<> z(gsR#%7oksH#ISjxd82|)3DM>de0D&k(nnw;|PKc8(1-(ZAATW`mFoOt+ka+8Ki9~Z{7V^aq z0O8>P{-bvQLU{T>7!l6B$54fV)aL*~)Z4(+w;%#>xM`tz6dU=$TeN0+06`PtuL&Yl zm_y1QLv03VwIQse0K!H(-3~o~u=hA)f|DFI4DDuyL<@*OhLc7HB0M1Pi5f^XhREK* z(UJxbddx9;L4?!+bCPg0xeSRRb9`O^p;%h7S{lqkxHOM7#GC?WUK&~pBJh)=2!IIo zkofQniA8f|L2}~=0HJ>Xe-K0{%oqrx!m*TrP7S2Gf?0?Rq>Tg-sKZSU&7(xgog&fZ z7ytw>h`$$zfG~&b%Rny&Xx~6sX#s>=nRNJ!00Osc#)Jg9e-s*1rUX_9fIx?nMh7BD zlK0RKrUpY~>2cy^0R&&GQao&WJ-V z2Yo^aAjpxUJOL46A@PNo66_Yr^5l!r0D}G?zF{hLuLXH(jfk6Ai`q{2+tE}#2{@Zg!L|fz@A0N#RMQYJjs}NPL3Lj z_Bc!88HjKXC+!}H@PfRjcrdj9BFl#J{Rx1eV}YRyB77M%CxM}bWJwrV;A?_oL0(co z9?Swvnx_I{ejmqB9{L?bcu9_;4Ir-aGl0+z@oxta!Yv?<3Q+1H+D-^7H-Mm!O{dHZ zjs=B`2@`Vvk7y>@67e7c4^A2nh+szE^KdA&A0i9EAy)(tvMeyNK?LO?b67lDUbaNO z1^z2=EGSC4DS}x@kmi|ynDgPJD?%-A0|?gSC^jI%G$ejATcX}V*_M1U0YG>&gzpyv zAmHQ-gbCo>dkPI3N?ic6kQkVn2qFlEoAy{lIg%eFqDim-2&)kPRS;ps0#f!A`gw?U z1Hvi{AXw$l*|C6Q;c3Q%D>-U1T0oA(JcuBIlO_TpxRdwv52YSJWJPhblmLWH3ydug z;m43UNeWt5j>NtNz85$alq9Q_z$~Ol^B^GR;yCk4&@&LhhaBY%h=9x+kCQ8bYN_l? zZk!4r;1A;i?=mj2-p?Hflfbc5hEfivqPGKCNDHJ*0}&pDn-W__1&}+Xp&76O2spg{ zI7|Qnl_g|f87ekRi_gm{1t5gw(nYa?V?iZjB81#O9W5(Y;@(>T;W19yV-O*fyhndH zm5f(b8Yf-_K;X5+;Clif*bSS*GSF6YC4?>UBf+ttB6*?$W+79WhmO}=7Ki>B^eqv9 z@QxfM8bn~?jlZ8Kp`fja6UbQ77VAd0SHl9fvH&_f_%8C zj%8FF`9T(%?_B`l0k8i95W&O}!t)&3J4_4VWmN? zi0~9A?J06|%tEd- z&tqP56&yoVC^<2JkU@@;2_nex#w&i3cyFnkMQ)r2AaIS~bH@S*)}IE#p5v^kLPbVW zmB1`~3Z(r6BB+L&W?4q%kvn}tOS=akyx{eJ0U{JyLL6T}bw_A5cv;l|gm0hd`tN~b z;YG$oA-R7(+R`V9S`a}UCruqhC?fB9Gm@&$E31J+t_C2qTViy82vH;EumZHZ`4VtT z{4#JXs7bo1fmtY&=CR;4*TP9xgMI=LD#%ePK?G~wc{JC48=&tPu$p$(Y`bFMkm593)$cI{eFN6aRP53Z0-(GBPyj(5 z{S}|^wKdSF2XF6E7Tl#|AAoBLX_QS|TLX;>RZ*DJSDXV7djAg)md$4hpb5@)fb3EO zHDY2XenKp$#X@ge%oI2kCuaoRo-@sY9)j|5yr8Ao<9`+X3d!GB`*i?CW$;*9dY+)K zgCevsE(H@5!--QzdHe}_T(I}5+F0Nxw^?%Do#NBZ57{vsWTS6Cwy zcQhSZ@e@!!Oq2yopz?Vkq>(?-tmRZpLRIh>P(JK)`u9QQ^LemY3lML=tnY*34HNwp zCMe!waYrp(uB~4U0OCzvKm$0^eWWd*!2#+cPAYa=m*PZR*if?rD5nCTOQ4)O7;OGan-A1$ zqVuo+Fr}I*03Tx$ct^*__Q#`U;6C1;sG5IFe1J8ve^;3Ob4B`pP^bEh`p-C3{Lbp{ ztp26%b-z3Ce`*IVnBLI07Sc$-9nA)GQ>9%oa7b~wuIg_B8*M|)-<^v2z>T&5Xa)F` zR1NTy6uWy8bNZsc-ubizB;c=T{Z(W8PtZMnBm8$5q`$N9I}887 z`S$mu`d@p`{XLxjiF?5NiPkQ~z?zdh`a1Z2qPl;L@y#9tx#`)a=q;Gb+>{)*OLHMai*-QzdHe}_T(I}5+F z0Nxw^?%Do#NBY0tkA3XL6ZezFD@ zL%O>JG=L+UH1DT=RyXK{Ee|XnWMx^2csx4(41Zh4G_}E1yAHAVbB2kVg*iCAq`cRVr6t}XW%5C5oTY^1w{5H@QP$N zF3FmH8hEmJ{{WYyqnW!Q^{2kd#I;|*c{q1Ra|;-4A}V$uroa5=LbFsl1T@Id;Rk-{ z(8ng%egWr@ZZdRiFayd?#km{Te$#Ma(svg04Jg@%u;1eTZH+Ean<@LemhAlExFEmQ zES5DzTK={s?`yTq_QAQC1lc9gd|(}LU{K1b?-Q`TS1v+OX2y#<`mbgGfG89UnOo4; zn!NxPBDIo(C(6jtU#;40D`xH`zxX5k|D_T7OQ!XAqyKLWpx=@H9qE6zo5Jrt{XeWv zkFJe$^i~xj{AH+;cuK_N@?&ALNVT)pxP{f!=}DjQSz8-D z55k0|h6h)Ar^jby4Q7Zri8#?Zhm*a0HrH8i$DI?c*FMJ`h_6a!FV7=$Qm6_G#rGjw3|M1PoC{5VutT(50Y ze)B-zJ3rZHy3oYs%;6~g&S4I8*P>t1Am^pKYrMp9$;-Why138``&9&|^AK4C-uA8Y z4E3C#SJ^|m2Xf~w<2pvii3+v*it!drRIaVwGvz^wJn?#cCw8xelC2`~`cm@UKdj6m zQa|>baVC^uZ|uF!=#qF1OYv@9w<^V!4b*ujAJ^73)>o!1YB}19`iyI>;I;HwSGc}jca2k}+KqQszqFY*#&we~i=id&$K&X@`~h`5>s~x!(OthoYC4 zOBDI9n*0f@ygM-}ml?*-vci5mwM7``oJioctZ^D)B}}Ja(QpUEn9ZH7q2HQo(66+A z#Z49VT_$Ehv0ry+_D+~?Z!gE;l2h@%X4MLBSIqwOsBYEE3l|Z~^VUMsVZNb#oZapO z)9<*tKS^t;#xoPTpqB?rslvO(6Ppn(hYJ;ut7G$_1?%Hg_?E8IWPN1O%+JCk#M%t0 z7){kQ^|Y5sW0I8@S(d z7C6y`H+4x9>qWd|`WupI<_DbYlasdW-D=0esGajSljB!YUv3ySR&gqJ47q%#DW6`# zJ?GT5j&Nz5q9|YKYw0a-dVPtz@R*0vCj9ugZaXFEV#&^+dNQVYQ+{kY&P8Zsf3e+- z`@?Kj`%B-2!&#jI4->QEx=BUv;Tb9gvy~j7P@2t+MgA3AFFu=aR~JM3H{p?I=P^o^ zBuzdCXZlm#drrl(-_)r2g4iOzo+AcqBQ6~d#$0E6XnI{|sSt?jvfQF05}MkkvffBO zao~$X5K8D`XP477q~avgcx`p!REXlzPI0}&)y18v&)SI(kN50Eyeiy$ig#(iZ^|L5 zw?1ApMMCnDKt)oPM@At+B0|Ezz(DFZ4%P^Whs19IUvkt7d<_yd@biEFcm0)gzrKd< z|9v6S7l+$W;36+nBqY55?JAc4r>?t4K^O?40K6d4DhCk3A6Nt{!QL*NjTf*ItQMMeV$bjLfnQ>CgJzM!p-GY zpA2B;C_2{41p1tX73|-O)Xzr2CT>9#TFq;pPROUUB`aWaA-aZYN&DPoDTNKo(%gVn zV7jsK)EcrHBDbKYr>>ySXl5;cltJ!6>`nDOpVd5L@o^k&GZo={UJHo#J{+gf=2C&n yC(2kSIw3LK^ij<(FbSfdObcb{!Qc6pAgNO)7BOzU) z@Xfg{)O$aB@9+4&AMdZ{y?=OcAM2WHu6fRJj&q!2P9?chr-{(cpkbn+p#yQfYb=UN)TlRpNX}t7>BHVajP>IL0~J9)W0}w?@7mQywj35>N$TxTrnmEEJDm?o z3UUq5PXramETrp(JnKr}Eo*HY-m2cDBcL-Z&58Gxe}dNZ$iba2+Fa;C{SYy?GQqwv zGbcx~dh~VNNR2u6LH|8&qW)Z$xQ%y*UNx(PHFl{_!M@YIOTHI!@{jdiz(=nTBj z)?s)5W(3x(tD&_dn_5BM;mv-l&GI&}N*66|8-I~!{hBA0bkjvH8etPsKh$TMQSL^& zP)0jeE?drZwxQp_<-ro;#n^~}0z2Cz7mB(^(#3N|Fa;G@)UaWc?UGA(F9A%;Df5IWTpkVOp1ZT{z2YfNXX%)YArNnHK%cz{< z-`FQQ#%voEr8=bIIolCLN@97$8x2&d*USBS{~iNB%vvgFS-So?&6Av^+->e4mf7S_ z+amsXQz>5T^heJw+TK!c@(?c9G2z#Yu)cVAOBOeWUMFIf^2G$1QWsBCw=|~U(^DxT zdsX{YynG68Ogfw_+R|xRgEJ($gSGa8N5mI5ucfFbr_f=5Y6)Ae}*i#8}`^)_3B~@vXPYK<>#7Mc!U#;T8&D1pKXiM4Ud@HQqtn=TeZ}+ywF12qdcf~Hwg+S@Te0C1ro==YzZyQwJpvmS}c@Wd! z8Lp;H!DA@$S}v-&MeHe=KC5Q|ZiS@Q+0kB*N4TWt*P7UVKWJz0qjTp#BT9tU=!1_x!~3 zMht58JM>>k`bDR%e+v&UVtN?1_v7=tNOw8a3R^nnxaV7)-0((E-_x(pcD;|yoSAVr z+ULc}OZ8VyzK}LUz&6sBC_;Lrq&(Wx6`%T95i@f_Zs^q#NvzP%&kJrO8)pQi;V5w9 zni)Rh(mu)0T(3uD<{fG+dEKi~=*-O?qpD}Zx`PDaOE<7F7q7Z%Z?qTm8mwRBm+6w! z73L_(!+Y3{ZXb1p3CkcveomJB`UTA$u5q2q(;FvBX1x2-C`lPuYW=BU^!t%T?cHUo?2v@7c;iD~(ERJ)T_K;0 zBF0Mid}^`%H7^bQG@a;MO*h4u85TYzlepE--!vCuDW8i;j>iyQacZ?93tc zcApe;z3k*bNYW+GJSEJ91y0FJ?O!jwPw}?6>#MuOvh>m2?kf4d0RL=ZVQu-EQK8VZ z|2Iil%N%y+CCN(H<`~wHg#2x@EqmuT&wJ#eLRa?CLsu8JdNra#yRrM$?vVA&K zSv_7k#=@lIEtzhG-g%BBY(eW?c07l7sOP5Z_wBMe&#Qc?lCch(zb*5!>ao+EY&s)*EpB?SDSH8?2&t4`0fc$r|bLNu9Uq?qnqoYJa zJCB0wQya%8hEE~M4Qh3nPxIo{kSqvdRtSc&$vq}5BYDhtlK2zxIXZNw1<6RJIA1qx zzwXahcD^*!+?+^mq56T-MsE8e+;D{9R~(u)x-b1pqrEO%;}>d2zqk}i7*)b~dd^hX z>MxSD)eEJJ*t|a4`1-D*LcNGOz=N)*^~U`W6?f5}>ppI6>R9DT`1L$^ArYrsn?F?< zUo_;WHBlO$c^Z0xzB_>D!J4LgkoCP_YL*aYg}^eC3MsN)c@hFA69@lb9wsW1P4(!^ z&1ZdB3QXEoS{0Ems$UJTad^m_REkn(#2hZ#Z%Et=e<68qj4%$7v}xB7!-YdykrIxO!bDW=L?1#bg^F zPg5s{d2HAliz$0l@;i?%TjGgl-Q_uD>_Ondl|9HWZBmrum6I{aseDogHJv>-O?fZ zYp?I@;^qn%Bx1L}Y$g6#O>1#G;DKRj!WqvxMv5IqM|`mu?RoQfE$s6LSbn5zGaib@ zdmS4BKa*wx#S|{?(2~h-vPoYxd?OGWuSAthAZ~*7=!CeW62`em4XuG2>k(V2tJc^Q z^?e#A=E!FI?7g|Hby?CsT)Qk2>Z~?5{Ju<;MD1>K(2q0cPZpT6**ct4%r^H{Xgu{v zw(0b&LR}jArehJAm8jL^&;6$%+yq?XiECMRu*xQ6uYP=59;-oPcWCdCAE1Mi-~Rjt zXRIEhMA=^owCEDq)A*%cNoK1kOGpWOYkyEoui?~@( zt50{DQvJx(HzoO~fHN^T{5B4WUv;ArH{tZhTi@m!6N*ada4%tTTu|BNvuqGijWxV~ zX;*Sht!+x)p^{gKQcgcP{z;A;ar-RhJFZE4|F`&-i4{NEHy590%+072C8WMP+o9!H zoZRxfW`1Rx{{f+G-^2gtqEAj~ay11aH^Txpn zt@wM)$Iy{&i?MUi5 zs&R2X%!n4NY2SmPN97}OYdZ;(lN1w%gLW?- zyp*P3BiKbwcd6J6%?$2ks` zI^CYr*6p7fMM+Q21aCT6wq4s68nr9WHB2ObWw;sG!ctkz9xuU~mR)$+$CN7mn~-*H zbx`!3L_s19mZY3ijr{EE1b1R{%z}u@$CSu>!bZ9_)i$Yp+Rx>Ds@tF4d?4Q@Y&@#} zUhUJ&VV$EIQID$fRbs=<_m<3g(@txQulR;oIJ>s%w%jrb%>+)8vkMqLwW(xPs8&>t zZ9gYHI*dW9QGol>Iq?blIVw`qnUE#@Sl_$dsr|R4!@kiniC@ysq$2&9hqp+y94s1P zDTP`4Ipy`KU#}|r1Xp*uE#6hkWsNR=YBX`|UMQQjX-*y0p5Pvx+j~4c`tid3vON<1 zPm$UQ_hLTmzDZ%}zVo(vBJliHvnSKLs_|3H40dl;VlPp2JlQWZDZOsqYi6rEYO?=w zsK!<>Rj|dL>{CKVp>~Fz*3{-@4|}J;47%izig%j!L|w{{SiY`5BWV6i*gUs6w?DeY7zy2zbEkl^=k>%ym0QVw=&(Yiw$m#BX3_~We1DQjmY>pUTxbC zAn(n~F*Vz`k5R&*Sh~tKtczJELsyyV{w158t;81_Jej}l-h6f zybgYs_uhxP@?Y=gUz5MT{$ufJB#uavWXw!Qn-Ya)gIHDk?52UEAgSBY*#71Nex}?< z0N`wG#NbxYy%;y`m!kcb4X5?un~x9c`A%cXAv0vf{5yv9aK8+^O=S<#P;? zyx?-h{MKxaZ)&*^v)nEHjtwcTa5kT74SIb(w6*0jM(bK4+Q#ceIWqqIK`f8l%ca$4 zBd^45CwHVwH8^d%L>jZcey`Y{RuPrfAjT_L^KOz5uacXU5gZy%HL*IG`Me44Mi$-XVC(He6 ze~TQG_>5=oswcn7B^qlKGX>qBzS{7n-UF*KyS#f7SK5*@3Hyq#db5d8gBY2_+75Gp zOop_ITlo18J$Ozf0SclPqgL#hn`WHREqr~~^D`WO+~j&gjHg9$`uTjo2Ya8<)QLHJ zj;R?tqXl!f9alA30*GjL<=9_aUKC5oTk6Ko}rzj^W3La|G2?g(W-Vb4dy z2;bH3Cm5DEMDmvRPoSI8Djx1+|P8ZcNYp{QAL`^7c-S>rR&Wdy1ms zEdQ6U{C}FG`C$t)Y2deuQ;2I{KR8b*wSe{T1V*3U4cX}2+bwl{3xwE5Pfo?y-KeKD zIL&GQ{CT?l12SdJyV7(X>SELO`9+fU@*lQd%Ir642KY%h$yW+8(5bFQKO5T?=$5u#xd885CNaig^DZ+V87!%)M{g_3y#x5M!*wk7 zFbaujI9g|a{HWFrS*~PLl`GaBsa@x}?jjQ9HaNJ*AW}{Jy4mO*m*w;mSp)V{*`?cl z@+(~?^pnjK;jQunFSBchLO4Sn*ez;hk%U?&Z_Q{@_ppmn3X2*Nb$NatBt0V;?4o zsNT2P%A>H~OX=W8HyzCC86+F~C|=q?rfY61pa1rDl1WZw{_>LLtyk;MIBi=*LbAmw zD#T=Yqm4fcz3M0|6B9|$8{GY({=znIR*1a;+totewa3g*v&FxAnya&Sw|Q{43O-yC zVrW<{TNM`g>^rd^H~bmza$JV7Sdkbf=V)&u-h|gjRrw+lW(FOj46~agH(dzt_Hed+ zJUjM!@E-Y!2p@a;vijD!=E3pTSrw;^jmp|+ZhL5t)-(9c(wkODX0MYAXZ_;SS{d=z zTR7X0>QpB1C2_)_)W<%?ZeV3;BXsw537!2#?qY?VG)(jQvXY@m1DvP{hEbKc&(Rb8 zcYJ~b0)s{v1XWM-RhyaQG&E2&H&BFCGke4p%HN_0Gh_51mtt6<45Oq6e-sQeNKN%N zDfJqZ&?vMlFkH}`IUTr2LHL%|VR-4ajC*Mi!*#o?m#4mW$NNc8vh=;~^ZzVGxGg~L znr%P+UO?j`mNTyx&IQd6W3*}oN6r^@a}u7Fe<*J^biG77r1&AL?@qzTgNqRd{efh< zh8%BSDfi)Ua~Bld`qUy_O2}nu6H$63B9)U6tel#g_idL`WyK5rFu&$iNQOfz82$0< z!NqS8tOkP%v5(Hw3F4k5?Q&p<6|-z;ebmg|hYeQn{jk!{NGK;JxG&H+g%s-}$x8#) zyuEbe6iO`fD>CIVTz$crk9_;ejZ-e4UNt&vzRLMZR$gL;c^E4|xxzSw=5&}km&&fZ zf!71^wnt-pefS<&^t5&p64ICq;qo~946@=^lMQCR$4O(=d4={>T7cIO%1W*6J*X;Q zDQ)q`muD(xv|(6W=d&Lg>f#7Xtnu^3`@$0`B&+_UjSnBbEmdwpLIS?6MX{?U z^r?xx62f4bKqqm+ZE7&hB9_9S=hqjZmBSZevoPw?A_A#zqMmqQD-6=s#tk99HFKm)i1fSp4K>7ZG36^8jz(^^{W5c&q$-yaUr?k zq3z-U4bcmH9W2;+mn=M^mNuU_@>#E@41BXW?04I4F6ueAzCRXak(6*q`}6%__mB0h zDFtG!)Pqfpw#wXq?WK27O}HGx#sig2V+JRM1N%)0C3G_GGqSGQ>`eV?sl6|dIq*~D zr3L+?2)4|9vJUU1P%3`hb3KOZ(r&*9ZB8fMt$U-SN^wDky;iL5R!PCeCSCqi3iDej z{f3iERapf&S^i731M8DSiAjUCw>M{nLel%=Di#V00>%@qT}u4Tr#rIVD@4vxd;34h z)89EYfz@^{O?fcAC!ytaBzezS-CGWoQLk{U5;T;?Iw^E+oN&dKY)FXb6X;}liuWTh zzs5gz+qBSM-O4J$<#{>!+q$irSIY8UCt+*!cF@SONTcojlEcC1FTTS?`dL#8=ZHy( zUddworwRqbW?SL==nlR7ID7U{E0^$|c@6{TS4RYfxwQ(j6O%F_65sA$Iy_ign(ldZ z~jGfOe4Iq@7$}%V6AbN7{)-Q(} zDavCtBP%mGWljA4XMCIS3r1Btm*tjLYo6lgucP^VI=SzgpIkv{DRQr4Uh7gUekI;3 ztJ4!NtO#gu-n21^O7~JNoHwaaV{+KX3u!H*A@cY9eKuk5BjRFIcE9 z&`rtnY?%~YDVg@}9q!pN#wgA#W-RtJ#{Ig_{PRe&9mmdJ+(RMeHsNEEzKZj@xKq{a zH63OFG|iJY$Jkph3D&xCzWO*P9-c&<+iE-0qhro~^%HZONSLz4NcQymm&2NiQE2TN zRx7fjkDcXQ37-9Mz36BfkTYQRG4_i6%R4u|rHa|-_Op;&t4gV@dib>ALM_=n50zit zXKM!5>jL24Rgc$X(q{ybKi_%0AtJkynKDVw^qTIomKcf7n`I8EN-u2v3O%o3olI5c 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 z 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 diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index 96d5f5f9..c8648dba 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -16,6 +16,9 @@ using AsbCloudApp.Requests.ExportOptions; using AsbCloudApp.Requests.ParserOptions; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.WellOperations.Factories; +using ClosedXML.Excel; +using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; +using AsbCloudApp.Services.Export; namespace AsbCloudWebApi.Controllers; @@ -40,13 +43,15 @@ public class WellOperationController : ControllerBase private readonly WellOperationParserFactory wellOperationParserFactory; private readonly WellOperationExportServiceFactory wellOperationExportServiceFactory; + //private readonly IExportService templateService; - public WellOperationController(IWellOperationRepository wellOperationRepository, + public WellOperationController(IWellOperationRepository wellOperationRepository, IWellOperationCategoryRepository wellOperationCategoryRepository, IWellService wellService, IUserRepository userRepository, WellOperationParserFactory wellOperationParserFactory, WellOperationExportServiceFactory wellOperationExportServiceFactory) + //IExportService templateService { this.wellOperationRepository = wellOperationRepository; this.wellOperationCategoryRepository = wellOperationCategoryRepository; @@ -54,7 +59,9 @@ public class WellOperationController : ControllerBase this.userRepository = userRepository; this.wellOperationParserFactory = wellOperationParserFactory; this.wellOperationExportServiceFactory = wellOperationExportServiceFactory; - } + //this.templateService = templateService; + + } /// /// Добавляет новые операции на скважине @@ -317,12 +324,19 @@ public class WellOperationController : ControllerBase [HttpGet("template")] [AllowAnonymous] [ProducesResponseType(typeof(PhysicalFileResult), StatusCodes.Status200OK, "application/octet-stream")] - public IActionResult GetTemplate(int idType) + public async Task GetTemplate(int idType) { var parser = wellOperationParserFactory.CreateParser(idType); var stream = parser.GetTemplateFile(); + //using var workbook = new XLWorkbook(stream); + //AddDtosToWorkbook(workbook, dtos); + return File(stream, "application/octet-stream", templateNames[idType]); + + //var exportOptions = new WellRelatedExportRequest(5); + //var (fileName, file) = await templateService.ExportAsync(exportOptions, CancellationToken.None); + //return File(file, "application/octet-stream", fileName); } private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token) diff --git a/AsbCloudWebApi/appsettings.json b/AsbCloudWebApi/appsettings.json index 72d50f57..5294ebe7 100644 --- a/AsbCloudWebApi/appsettings.json +++ b/AsbCloudWebApi/appsettings.json @@ -7,10 +7,10 @@ } }, "ConnectionStrings": { - "DefaultConnection": "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True", - "DebugConnection": "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True;Include Error Detail=True", + "DefaultConnection": "Host=localhost;Database=postgres2;Username=postgres;Password=q;Persist Security Info=True", + "DebugConnection": "Host=localhost;Database=postgres2;Username=postgres;Password=q;Persist Security Info=True;Include Error Detail=True", "TestConnection": "Host=localhost;Database=test;Username=postgres;Password=q;Persist Security Info=True;Include Error Detail=True", - "LocalConnection": "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True" + "LocalConnection": "Host=localhost;Database=postgres2;Username=postgres;Password=q;Persist Security Info=True" }, "AllowedHosts": "*", "ContentPath": "../data", From 200b0e3ae596ea4cb7f2c0e4627d2d5fdc21bb33 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, 10 Apr 2024 06:27:51 +0300 Subject: [PATCH 067/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=88=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Templates/ProcessMapPlanReamTemplate.xlsx | Bin 7912 -> 48997 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Templates/ProcessMapPlanReamTemplate.xlsx b/AsbCloudInfrastructure/Services/ProcessMapPlan/Templates/ProcessMapPlanReamTemplate.xlsx index 5217eb02c2e65ad757890bc8bfef1ed4a29aa5b3..5f5be35bfd62215272aeead11ffc54df97cc49c8 100644 GIT binary patch literal 48997 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 NGPV%qAENQM{{v`ry1W1Y literal 7912 zcmbVxby!@_k~Z!R3GOa~yIT?%G%&aXcXxs_I0X0L1cyLyw*;5q8r)rj%R=sco80W) z-ydJi(=$EuoT@Wj{q|dRsuX3QVQ?T25D*~pBvjNP{t)D+`8x+=D@PXQ=l8PM4*9RF zC_zUaVGNgC3!(_w`AxD?P2`*;?Nl~|HKDoRz^50I*jOkZD!)eBd;2^XeSMcW2=q%JJ^T0oDY4mZ?{ z6~Johp-$!_`Ook5Q*wz_X=KlG^{h?Z%jNs#!jI>usyMfhB(rGmY7jRofg%fhpTda``?;yAtWi9z_!^Q`+W=gb6^6O* zp22pj5opQ!1hjVOe*zoozrg0`GP7^8ydW>Z z>@{t9FqT!P4JI|V7$;tKz(}CqLK+ce3_V!3wYjlqw0HvOP8o8o`ZM4HC_a5i>;ZJ0 zeyK1BOK+n7Zr*3bH3KB)dIrvz4H)az9P<^Cjfq#Uh#~M@^=y`!oYS)~{>bV6LnNmF z3P4o%j&dDd#kKQQA-{A>rJtzONIZumsS^6@5EDGr5!{DC;0UP_k#vH3w0UV%Y(b(t z1+~J2bl+&6+~xs;Z?i{HVql1`aRYauMIAZirw^Z%Rnq8`p=5VjXzn5shi8Djf|}Mg zOr(V*rNjVvxqJiPv3Ta!+O&OJiIBou$q=oU$yz9uM95=48On zHXpK+PCAxexkVJ8x+qp;k1jnlnbD>G^Pp*VaQfmTvgttBo1_d_j(nqV&{JDvJ2N$} z_pxfRR!s!nn*E@HBmil*M0U?Lzh$9XXt+8~H-oTo?v`sk*QKm2x2Sd~O27}QqEJAU zBHi$4JDI-P@aqk&(M+H0m$*YC@aIR{l{vypSly$!pvh~KaVmw&r6Kvg3Sv375;wTA z7LDSJH}DlfQ1`;4;H953cA6a4?35rZlh;!WD~Ys-3~TA$V7t~B2=Cc8#<46hf>P?C zfOaNzP+B-#!6lD;?vydu^-H8{aA4~#D82-)tGQ1*wFquNgy+iViR0lB5Ybo=WuJ~9 zIr%>wL%iRd?`URh?BvMu>x1q2L@uZgMb2|$v|iGK$fwms9(b(aoA#Vtv}}0_c@Rek z0dKj##1}?aw=62#dPTO1jVdc<9We6RPLR|0#csfalR?huHm?ubdAH(+aR_*xU?^LH z8_1aOXLY~U0McNXsQMg?+FCyfAI&C4(;;FSBa+MtFzw^6*#>EKA9W!an)~@nM(iiV z@3h-XR&=sqp(d`v@M5m9#a3*{y!k|wt4JDFwAN(P6N)Kqm8;*LnFD@>iFh0UyN5?R zMz@kofp{4HLi*L`19H#U*63V7K7va6feR!A zzIlA~^!;NuJS<~#x5ns>_#J-{m}^rd^4k!Yhm| z=U9!h^61!p0RfqyVsaM%`6aEr&jFTX*p3Q00SmC1yehg{;d$r+pvOx&T7}IG^v8H( zCYR>`ImnhV&a-^dE02?g1F8h2)VIeMvsyDMR!(QNjaQbv>0WjBrSn~HurYrG3wz6| z*bR?FmT@uRtLX&68eWEdI&Wl<=0}3H4V&odYpwvmOrUZv%C?*?64iVYNXJ-yajg_K zuqVi+tiu+)i-IV+0zlkAx;rH}&~2NxaG8gdk4|7LWrgQfBqhha7M94wPd0S}(@R;p z_H&Nd<~TBJ_DJ}Gw%@@rzbaDP8Hk6oB-cp0HpZ%^&<}}=GpQNE6Y`BZPNKRgj}}NL z^PMX^Y5I`(d5XodG9~34InG;u?5r)UPt~N-xzng^rKYvH%f;l27elXV?zDSOU&KYV z_D#yDyneMiD^kteJ;7_8^1^Hr{W_Jpz2sA_B`>N`x8B*Q)yCxrXXPFEvkEH-#3>@S zvFkE+=^{QgWK0URsfjx2?dEn3$cdpDVt&GncQp1kRQ%M4W|rkz7|RaToCCEFNI?h(I5il(Py@MZ0a(&PMG_Q@fc zp#2#)dHhB5-i+@`gOAt!0ySF;gE6CI`-5q~)v&vp5d&tvNdOknQ78$g#aq5*k2es>7q*1Z3JJ%Fl2YRbwXYo}<1L zuVV}je&m;)uFTqkA4GOvB+~A@Mc#>P!l@@m3weLi^R?HBA)`^Gi@)Gzt#*$DPgqnD z^>7KF>D)BK`4Alhlxs$GT7OK^5rG$T%u=)y!3}&c&9am9#bw)|im5BQ#w*QA4-VZPd0;^= zdt`%s9i2m~pC(u-N%0<%l5jIGiFi|9+MoX`o8utrsti<65edeR*F1#ym0X|1%9op( z^st1huWj0`gW9E%(Sl9Scabbr{s~$g~)rx}A**B4i>FP@s{+{BNtMJew#^?Kboo03ReF zBj9kERH4gznY|Dvq=8vUN}o5(Na!GCLi-~#s8AS`QGH*;(m{R0=A+gol6|p0&)WQh zNVoDNIxri5D@zt=sZQ`ANV{~PTTkn*PVWx=nO)DuK_z&w5D@kl{~zqi{>-i|sXA)& zycj`8mugp6E()R40^~c=W6;&2br^ctq8hb2+tvUM!jTHQ2&y4wN#EKg5p&k`$mhj^o7px#2nz>7@j-k!Ks@ zjl88f2xL+PksWJe@g*BP2e$+*g{YjwR8v3%WF)wRw**uQcjDBX(3#C3HZ-%uqQD#7 z(oOF`2ypLZ2Jd$k!&tFYMGU85)0@*I)r1l3(_S@xmZ8EqG{@nic zRzA1$5eqku_r zIR$*jVZ6jjZB=kC>dZ(ikPunJjN=seilutmF+*PE=^H5Uc92Ewgqak{~q!x5YVI1!d|Is~LRMzS7b;aY~b9`j4OjmJ;OXJe6R#ywv< z@Sm_mT?(I1PKU*VcDVXf^#-CwqLgWFTssy<>t^LBOiouVPxnko`+7t(hE2}CwrwHu z5g8k~IRR&;=hw8Dhcz5d?gzM98Ty9yt-AZ2kKK;$B29=2q$QhiR-Eo5cO=FnGp2=^ z?&Pt3s8Cv8_z=x1Rf{;K0_-2o>D@3A#aE7j$=%%cq46pQQ+bcN9p03}AN_n)7eduk z$_#qij@CVeBXw+VRcbn2+;!q}S&vGYwurjFii4Pf1>Co;s|wJ$iD_2JnBWrV*4?+b zaEEJszGG9Eh)Tq`0`0Zu9dzE(omh}1<`SUWZ@mJQ!?C6QBvzZ)6{HKp+On@%{k-Ww zXv0MpjK(PWfpu75&l1ftU?U0jVO=5kD75k@g-k2wB@PB5ga5Q^!`c9g1JfG|g&L6Z z!2qZw#%t2VLgB)j%V^2baLKWzTQFV00pbCwU5Z9FQe_})ub=IMK!>9%2-z=nHzddt zB$rZH*J~AECqzTLy}g%AT+L#8GdkK)0KWjHrlMfc=9`GBJ0`nX?Wg!wBC2)38fZ#NpwCooCkL-EUY5Xn+OEQc!ACf_aa25uSaYgItk`ChaMpJHxA z6-s7Ur)tp)?sg~bfzQ@y!L`e&fO>i8sF)<(ACEZm#EQkaRr)z{PebKt=+NQ`vcBR` zdUKkZlDFu04Q@IGt!>g_EPTurt+tDV8tvh*l7pXn?;OH-mfsyzwzQ^+$5Ro-EFZcH zkPhEIO`-o1vlu>jVWY)Xw-;U2q+_n%@Rl(&OR}`^=zV=h_hxjgrU8hjKrF|7oNTnj zd}NBCRv%fo5|+ohqo;Nm82S34J+Wv&A#?dBCL>!<+Q&(oYo-2tX+T3n@wfMbg+QjM zh+-d=%J9e72Zd)ePu9daMLd;uLec&S%>@5K^S>&te^wKJRbN|Tzgs+2UxSalkaBNV zsR#`tcw6Gd%C#;by5FvjeB+M2D6kcY`Tz)2a-kEz@4L9X6}6Z;I{Ty>;}+2&suG{Y zT0iqapY^!eqrMUB++;ywUm2TOL5f{+M_U2O5_?!#?cRlp zs7}&GSw1!N9A*BT3!K@!N|sA-fRBDpD=D!}jznHB@x4wR2=Kv~@6kP6)k}bQHi(1+YuC=vE0oKsaSP7MF)Z z=qP|-$)dqfMKiTF;$TUuUr!k~PWXq%_nn5!oz-?mTXbNRrV$;I__|+~bBAO~_R#yC zB?<*X3M8dTD0U~94==CffX3pMunNVASt!s48syp73>?)QuW9fs8=>W$^zb|V=QZsO zN=txDi1!rK%e*M2$zXC=HW*j`R-zZ9(v?}cpR7O|Fi2t9P-vZIM6j5`j;M5>%f0P- zVdFR)%it990JGsId&#cc4`7d*l2- z0rSqbi^|^S8g}8176Gv(p$WtGSMc=~$(il*HX(%PWST)jK+ON+Ha+F`zqd)>&hB}a z(qsCbng>s5yWlG$d+W3^@**NNsSs=|BJmYfzBOsf_!(6z;O#|ynVE-)eAUjass6w{ zucSa)8hazTd0I3A7hchMKKaqXSt&)#nYaua-Un2^EJ_*go<$l%`%@$x9E3S8qrDa# z#a+GdTswQZJ;j|NP9)M!a|yX6#&%lhB}xm0Dk^&VLm`V$2NM=i2O4IVhc-p?W!_A! z8hAptv>M(yF}L*y-GwPPwrUH>jC^vR(3#vCFx1Ld>8tQv8c!kfkzn5Nxcd4>Ma@*w zx`)z!XAManz+Occu75#IVfJ7N&e?-le9AWYP*r2xbu%0t1LR1;E8!!&mKOpH<-={u zJA(55=>!iB5xU=peSX2-(B?}z){{S*p2mM}Fkt`bPeW%%CtK@ZE*<`Y)X9nyxUx`y zFgp)|j~S~D=M?~5MlaSvI@{J*;!RP3Li+ak4T6;hXgIuTP%FKd(zm z!q&#g*v9D{$lcD^QRjJGT`EHgPwQ$sQ)6mLt!eMTtLo^8%8d;%Ri3XatMvW^KzM99 z$PZYCK@87G{n@hAxnmLoP9RgSp##lu6q>= zyKuZfo4IDX1WF580Nzh>S%Y||Ri=qU2)n$ijHdH(e6(Jg9+l4e@XQwx43{tg5eZ%Q zHs3z_*+^j{B=?NiF!EAySlmM=koz@%10ozYWH9GB%PrREG+VT^2hT5N=ZA~4KE*m? zUp-SM#X|-N7Rw){>Pp#>+X8Jx9Y4z!qaSik;g+SUBHnX<*$^4+xytmc57S&$SPWWQ zyhWeg5MIqCeq3m{3(v)f_+HA*{6q1jeEEY6OO7&jNc($xH<-FGzngs*iDpOMW96FJ zF?YcCL|gOLaCG*u=9h859?6BFGEyy{@TU#;yjPG=I1swu;kicpTL|I*=f3}|V*9t1 zKeNw&x8jcSe_HufnfTkvpHcrgQ~fR3SpQna-+Alb7XFNi&)LCmv3>E&!hgsW{Ke7d$iBZwbNwL;E+c{cYe+ hfd0Dyy(g#q9|WQ(1N($!2ngh-SNBt-LLqwo_FqfUtJnYl From a91d4888e62503f3db0b19f0b868bd9eb84be4d4 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, 10 Apr 2024 09:09:48 +0300 Subject: [PATCH 068/132] =?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=BF=D0=BE=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20Wits?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/GtrWitsRepository.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs index 022532f2..57b36ef2 100644 --- a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs +++ b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs @@ -12,6 +12,7 @@ using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Exceptions; using AsbCloudApp.Requests; using Mapster; @@ -19,7 +20,7 @@ namespace AsbCloudInfrastructure.Repository { public class GtrWitsRepository : IGtrRepository { - private static IDictionary<(int, int), string> WitsParameters = new Dictionary<(int, int), string> + private static IDictionary<(int IdRecord, int IdItem), string> WitsParameters = new Dictionary<(int, int), string> { { (1, 8), nameof(GtrWitsDto.DEPTBITM) }, { (1, 10), nameof(GtrWitsDto.DEPTMEAS) }, @@ -90,8 +91,10 @@ namespace AsbCloudInfrastructure.Repository if (telemetry is null) return Enumerable.Empty(); - var timezone = telemetryService.GetTimezone(telemetry.Id); - var timezoneOffset = TimeSpan.FromHours(timezone.Hours); + if (telemetry.TimeZone is null) + throw new ArgumentInvalidException(nameof(idWell),$"Telemetry id: {telemetry.Id} can't find timezone"); + + var timezoneOffset = TimeSpan.FromHours(telemetry.TimeZone.Hours); var query = BuildQuery(telemetry.Id, request); @@ -100,7 +103,10 @@ namespace AsbCloudInfrastructure.Repository var interval = TimeSpan.FromSeconds(10); + var idsRecord = WitsParameters.Select(p => p.Key.IdRecord); + var entities = await query + .Where(e => idsRecord.Contains(e.IdRecord)) .OrderBy(e => e.DateTime) .AsNoTracking() .ToArrayAsync(token); From 878dfb3daaa83557db753d31966d03769cf34b04 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 10 Apr 2024 12:19:32 +0500 Subject: [PATCH 069/132] =?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=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExcelServices/ExcelTemplateService.cs | 39 ------------------- .../Services/WellService.cs | 2 +- .../Controllers/WellOperationController.cs | 14 +------ AsbCloudWebApi/appsettings.json | 6 +-- 4 files changed, 6 insertions(+), 55 deletions(-) delete mode 100644 AsbCloudInfrastructure/Services/ExcelServices/ExcelTemplateService.cs diff --git a/AsbCloudInfrastructure/Services/ExcelServices/ExcelTemplateService.cs b/AsbCloudInfrastructure/Services/ExcelServices/ExcelTemplateService.cs deleted file mode 100644 index 75aa1f20..00000000 --- a/AsbCloudInfrastructure/Services/ExcelServices/ExcelTemplateService.cs +++ /dev/null @@ -1,39 +0,0 @@ -using AsbCloudApp.Data.WellOperation; -using AsbCloudApp.Repositories; -using AsbCloudApp.Requests; -using AsbCloudApp.Requests.ExportOptions; -using AsbCloudApp.Services; -using AsbCloudInfrastructure.Repository; -using AsbCloudInfrastructure.Services.ExcelServices.Templates; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudInfrastructure.Services.ExcelServices -{ - public class ExcelTemplateService : ExcelExportService - where TTemplate : class, ITemplateParameters, new() - { - private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; - - public ExcelTemplateService(IWellOperationCategoryRepository wellOperationCategoryRepository, - IWellService wellService) - { - this.wellOperationCategoryRepository = wellOperationCategoryRepository; - } - - protected override async Task BuildFileNameAsync(WellOperationExportRequest options, CancellationToken token) - { - return "WellOperationFactTemplate"; - } - - protected override async Task> GetDtosAsync(WellOperationExportRequest options, CancellationToken token) - { - var dtos = wellOperationCategoryRepository.Get(false); - return dtos; - } - } -} diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 795d944b..6ed241a0 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -71,7 +71,7 @@ namespace AsbCloudInfrastructure.Services return DateTimeOffset.MinValue; var datesRange = telemetryService.GetDatesRange(well.IdTelemetry.Value); - return datesRange.To; + return datesRange.To.DateTime; } /// diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index c8648dba..00c72656 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -51,7 +51,6 @@ public class WellOperationController : ControllerBase IUserRepository userRepository, WellOperationParserFactory wellOperationParserFactory, WellOperationExportServiceFactory wellOperationExportServiceFactory) - //IExportService templateService { this.wellOperationRepository = wellOperationRepository; this.wellOperationCategoryRepository = wellOperationCategoryRepository; @@ -59,8 +58,6 @@ public class WellOperationController : ControllerBase this.userRepository = userRepository; this.wellOperationParserFactory = wellOperationParserFactory; this.wellOperationExportServiceFactory = wellOperationExportServiceFactory; - //this.templateService = templateService; - } ///

@@ -324,19 +321,12 @@ public class WellOperationController : ControllerBase [HttpGet("template")] [AllowAnonymous] [ProducesResponseType(typeof(PhysicalFileResult), StatusCodes.Status200OK, "application/octet-stream")] - public async Task GetTemplate(int idType) - { + public IActionResult GetTemplate(int idType) + { var parser = wellOperationParserFactory.CreateParser(idType); var stream = parser.GetTemplateFile(); - //using var workbook = new XLWorkbook(stream); - //AddDtosToWorkbook(workbook, dtos); - return File(stream, "application/octet-stream", templateNames[idType]); - - //var exportOptions = new WellRelatedExportRequest(5); - //var (fileName, file) = await templateService.ExportAsync(exportOptions, CancellationToken.None); - //return File(file, "application/octet-stream", fileName); } private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token) diff --git a/AsbCloudWebApi/appsettings.json b/AsbCloudWebApi/appsettings.json index 5294ebe7..72d50f57 100644 --- a/AsbCloudWebApi/appsettings.json +++ b/AsbCloudWebApi/appsettings.json @@ -7,10 +7,10 @@ } }, "ConnectionStrings": { - "DefaultConnection": "Host=localhost;Database=postgres2;Username=postgres;Password=q;Persist Security Info=True", - "DebugConnection": "Host=localhost;Database=postgres2;Username=postgres;Password=q;Persist Security Info=True;Include Error Detail=True", + "DefaultConnection": "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True", + "DebugConnection": "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True;Include Error Detail=True", "TestConnection": "Host=localhost;Database=test;Username=postgres;Password=q;Persist Security Info=True;Include Error Detail=True", - "LocalConnection": "Host=localhost;Database=postgres2;Username=postgres;Password=q;Persist Security Info=True" + "LocalConnection": "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True" }, "AllowedHosts": "*", "ContentPath": "../data", From dfa7f628ecdb2d2647d04d10a759a881156aaef4 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 10 Apr 2024 12:21:11 +0500 Subject: [PATCH 070/132] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/WellOperationController.cs | 548 +++++++++--------- 1 file changed, 272 insertions(+), 276 deletions(-) diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index 00c72656..90072dd3 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -16,9 +16,6 @@ using AsbCloudApp.Requests.ExportOptions; using AsbCloudApp.Requests.ParserOptions; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.WellOperations.Factories; -using ClosedXML.Excel; -using AsbCloudInfrastructure.Services.ProcessMapPlan.Export; -using AsbCloudApp.Services.Export; namespace AsbCloudWebApi.Controllers; @@ -30,324 +27,323 @@ namespace AsbCloudWebApi.Controllers; [Authorize] public class WellOperationController : ControllerBase { - private readonly IDictionary templateNames = new Dictionary - { - { WellOperation.IdOperationTypeFact, "ЕЦП_шаблон_файла_фактические_операции.xlsx" }, - { WellOperation.IdOperationTypePlan, "ЕЦП_шаблон_файла_плановые_операции.xlsx" } - }; + 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 IUserRepository userRepository; + private readonly IWellOperationRepository wellOperationRepository; + private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; + private readonly IWellService wellService; - private readonly WellOperationParserFactory wellOperationParserFactory; - private readonly WellOperationExportServiceFactory wellOperationExportServiceFactory; - //private readonly IExportService templateService; + 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; + 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(); + /// + /// Добавляет новые операции на скважине + /// + /// 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(); + if (!await CanUserEditWellOperationsAsync(idWell, cancellationToken)) + return Forbid(); - foreach (var dto in dtos) - { - dto.IdWell = idWell; - dto.LastUpdateDate = null; - dto.IdUser = User.GetUserId(); - } + foreach (var dto in dtos) + { + dto.IdWell = idWell; + dto.LastUpdateDate = null; + dto.IdUser = User.GetUserId(); + } - var result = await wellOperationRepository.InsertRangeAsync(dtos, deleteBeforeInsert, cancellationToken); + var result = await wellOperationRepository.InsertRangeAsync(dtos, deleteBeforeInsert, cancellationToken); - return Ok(result); - } + 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(); + /// + /// Обновляет выбранную операцию на скважине + /// + /// 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(); + if (!await CanUserEditWellOperationsAsync(idWell, token)) + return Forbid(); - foreach (var dto in dtos) - { - dto.IdWell = idWell; - dto.IdUser = User.GetUserId(); - dto.LastUpdateDate = DateTimeOffset.UtcNow; - } + foreach (var dto in dtos) + { + dto.IdWell = idWell; + dto.IdUser = User.GetUserId(); + dto.LastUpdateDate = DateTimeOffset.UtcNow; + } - var result = await wellOperationRepository.UpdateRangeAsync(dtos, token); + var result = await wellOperationRepository.UpdateRangeAsync(dtos, token); - return Ok(result); - } + return Ok(result); + } - /// - /// Возвращает словарь типов секций - /// - /// - [HttpGet("sectionTypes")] - [Permission] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public IActionResult GetSectionTypes() - { - var result = wellOperationRepository.GetSectionTypes(); - 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] WellOperationRequestBase request, - CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) - return Forbid(); + /// + /// Статистика операций по скважине, группированная по категориям + /// + /// 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, new[] { idWell }); - - var result = await wellOperationRepository.GetGroupOperationsStatAsync(requestToservice, token); - return Ok(result); - } + var requestToservice = new WellOperationRequest(request, new[] { idWell }); - /// - /// Возвращает список имен типов операций на скважине - /// - /// флаг, нужно ли включать родителей в список - /// - [HttpGet("categories")] - [Permission] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public IActionResult GetCategories(bool includeParents = true) - { - var result = wellOperationCategoryRepository.Get(includeParents); - return Ok(result); - } + var result = await wellOperationRepository.GetGroupOperationsStatAsync(requestToservice, token); + return Ok(result); + } - /// - /// Постраничный список операций на скважине. - /// - /// id скважины - /// - /// - /// Список операций на скважине - [HttpGet] - [Permission] - [ProducesResponseType(typeof(PaginationContainer), StatusCodes.Status200OK)] - public async Task GetPageOperationsAsync( - [FromRoute] int idWell, - [FromQuery] WellOperationRequestBase request, - CancellationToken token) - { - if (!await CanUserAccessToWellAsync(idWell, token)) - return Forbid(); + /// + /// Возвращает список имен типов операций на скважине + /// + /// флаг, нужно ли включать родителей в список + /// + [HttpGet("categories")] + [Permission] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public IActionResult GetCategories(bool includeParents = true) + { + var result = wellOperationCategoryRepository.Get(includeParents); + return Ok(result); + } - var requestToService = new WellOperationRequest(request, new[] { idWell }); - - var result = await wellOperationRepository.GetPageAsync(requestToService, token); - return Ok(result); - } + /// + /// Постраничный список операций на скважине. + /// + /// id скважины + /// + /// + /// Список операций на скважине + [HttpGet] + [Permission] + [ProducesResponseType(typeof(PaginationContainer), StatusCodes.Status200OK)] + public async Task GetPageOperationsAsync( + [FromRoute] int idWell, + [FromQuery] WellOperationRequestBase request, + CancellationToken token) + { + if (!await CanUserAccessToWellAsync(idWell, token)) + return Forbid(); - /// - /// Создает 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(); + var requestToService = new WellOperationRequest(request, new[] { idWell }); - if (idCompany is null) - return Forbid(); + var result = await wellOperationRepository.GetPageAsync(requestToService, token); + return Ok(result); + } - if (!await wellService.IsCompanyInvolvedInWellAsync(idCompany.Value, idWell, token)) - return Forbid(); + /// + /// Создает 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(); - var stream = await scheduleReportService.MakeReportAsync(idWell, token); - var fileName = await wellService.GetWellCaptionByIdAsync(idWell, token) + "_ScheduleReport.xlsx"; - return File(stream, "application/octet-stream", fileName); - } + if (idCompany is null) + return Forbid(); - /// - /// Удаляет выбранную операцию на скважине - /// - /// 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 wellService.IsCompanyInvolvedInWellAsync(idCompany.Value, idWell, token)) + return Forbid(); - if (!await CanUserEditWellOperationsAsync(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); + } - var result = await wellOperationRepository.DeleteRangeAsync(new[] { idOperation }, token); + /// + /// Удаляет выбранную операцию на скважине + /// + /// 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(); - return Ok(result); - } + if (!await CanUserEditWellOperationsAsync(idWell, token)) + return Forbid(); - /// - /// Формирование 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 result = await wellOperationRepository.DeleteRangeAsync(new[] { idOperation }, token); - var (fileName, file) = await exportService.ExportAsync(options, token); + return Ok(result); + } - return File(file, "application/octet-stream", fileName); - } + /// + /// Формирование 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); - /// - /// Парсинг ГГД из 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(); + var (fileName, file) = await exportService.ExportAsync(options, token); - if (!await CanUserEditWellOperationsAsync(idWell, token)) - return Forbid(); + return File(file, "application/octet-stream", fileName); + } - var stream = file.GetExcelFile(); + /// + /// Парсинг ГГД из 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(); - try - { - var timezone = wellService.GetTimezone(idWell); - var options = new WellOperationParserRequest(idWell, idType, timezone); - var parser = wellOperationParserFactory.CreateParser(idType); - var result = parser.Parse(stream, options); + if (!await CanUserEditWellOperationsAsync(idWell, token)) + return Forbid(); - return Ok(result); - } - catch (FileFormatException ex) - { - return this.ValidationBadRequest(nameof(file), ex.Message); - } - } + var stream = file.GetExcelFile(); - /// - /// Получение шаблона для заполнения ГГД - /// - /// - [HttpGet("template")] - [AllowAnonymous] - [ProducesResponseType(typeof(PhysicalFileResult), StatusCodes.Status200OK, "application/octet-stream")] + 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")] public IActionResult GetTemplate(int idType) { - var parser = wellOperationParserFactory.CreateParser(idType); - var stream = parser.GetTemplateFile(); + var parser = wellOperationParserFactory.CreateParser(idType); + var stream = parser.GetTemplateFile(); - return File(stream, "application/octet-stream", templateNames[idType]); - } + 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 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(); + private async Task CanUserEditWellOperationsAsync(int idWell, CancellationToken token) + { + var idUser = User.GetUserId(); - if (!idUser.HasValue) - return false; + if (!idUser.HasValue) + return false; - var well = await wellService.GetOrDefaultAsync(idWell, token); + var well = await wellService.GetOrDefaultAsync(idWell, token); - if (well is null) - return false; + if (well is null) + return false; - return well.IdState != 2 || userRepository.HasPermission(idUser.Value, "WellOperation.editCompletedWell"); - } + return well.IdState != 2 || userRepository.HasPermission(idUser.Value, "WellOperation.editCompletedWell"); + } } \ No newline at end of file From dc8f9214a71ff6b94ce6db0c03f7208c853a0163 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 10 Apr 2024 12:23:01 +0500 Subject: [PATCH 071/132] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B5-3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudWebApi/Controllers/WellOperationController.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index 90072dd3..01ba2021 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -40,7 +40,6 @@ public class WellOperationController : ControllerBase private readonly WellOperationParserFactory wellOperationParserFactory; private readonly WellOperationExportServiceFactory wellOperationExportServiceFactory; - public WellOperationController(IWellOperationRepository wellOperationRepository, IWellOperationCategoryRepository wellOperationCategoryRepository, IWellService wellService, From a91d95bc2e402058adac75bba8c0ee9b16bbe036 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 10 Apr 2024 12:24:20 +0500 Subject: [PATCH 072/132] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B5-4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudWebApi/Controllers/WellOperationController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index 01ba2021..90072dd3 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -40,6 +40,7 @@ public class WellOperationController : ControllerBase private readonly WellOperationParserFactory wellOperationParserFactory; private readonly WellOperationExportServiceFactory wellOperationExportServiceFactory; + public WellOperationController(IWellOperationRepository wellOperationRepository, IWellOperationCategoryRepository wellOperationCategoryRepository, IWellService wellService, From b5369c4363974420d4c5703aea3ae8164572a2e5 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 10 Apr 2024 15:05:15 +0500 Subject: [PATCH 073/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BB=D1=8C=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D1=8F=D0=BC=20=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D1=86=D0=B8=D0=B8:=20=D0=B2=20=D0=93=D0=93=D0=94?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D1=8F=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=82=D0=B5,=20=D1=83?= =?UTF-8?q?=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D0=BE=D0=B3=D0=BE=20isHidden?= =?UTF-8?q?=20=3D=20false?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IWellOperationCategoryRepository.cs | 2 +- .../WellOperationCategoryRepository.cs | 4 +++- .../Templates/WellOperationPlanTemplate.xlsx | Bin 68320 -> 40098 bytes .../Controllers/WellOperationController.cs | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/AsbCloudApp/Repositories/IWellOperationCategoryRepository.cs b/AsbCloudApp/Repositories/IWellOperationCategoryRepository.cs index ecf915cd..044dbd44 100644 --- a/AsbCloudApp/Repositories/IWellOperationCategoryRepository.cs +++ b/AsbCloudApp/Repositories/IWellOperationCategoryRepository.cs @@ -12,6 +12,6 @@ namespace AsbCloudApp.Repositories /// список названий операций /// /// - IEnumerable Get(bool includeParents); + IEnumerable Get(bool includeParents, bool includeHidden = true); } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/WellOperationCategoryRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationCategoryRepository.cs index 927a424e..49d146bd 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationCategoryRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationCategoryRepository.cs @@ -19,11 +19,13 @@ public class WellOperationCategoryRepository : IWellOperationCategoryRepository this.memoryCache = memoryCache; } - public IEnumerable Get(bool includeParents) + public IEnumerable Get(bool includeParents, bool includeHidden = true) { var categories = memoryCache .GetOrCreateBasic(db.Set()); + categories = categories.Where(o => includeHidden ? true : o.IsHidden == false); + if (!includeParents) { var parentIds = categories diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationPlanTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationPlanTemplate.xlsx index c5d53089457739c709596e91c6dafae799099e27..8d7abef627dfb3bc09de848f65fa76a6d387773e 100644 GIT binary patch literal 40098 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 literal 68320 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, StatusCodes.Status200OK)] public IActionResult GetCategories(bool includeParents = true) { - var result = wellOperationCategoryRepository.Get(includeParents); + var result = wellOperationCategoryRepository.Get(includeParents, false); return Ok(result); } From ed2d4ae01b626176dcef07809adadecbc14b4eea 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, 10 Apr 2024 13:05:20 +0300 Subject: [PATCH 074/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=8D=D0=BA?= =?UTF-8?q?=D1=81=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 --- .../ProcessMapPlan/Export/ProcessMapPlanExportService.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs index 458877d1..07cc6a13 100644 --- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -26,7 +27,11 @@ public abstract class ProcessMapPlanExportService : ExportExcelService> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token) { - var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell); + var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell) + { + Moment = DateTimeOffset.UtcNow + }; + var dtos = await processMapPlanRepository.Get(request, token); return dtos; } From 80ed5f848fb781299d0465a1f2cc523cffac0a5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 11 Apr 2024 07:33:53 +0300 Subject: [PATCH 075/132] =?UTF-8?q?=D0=AE=D0=BD=D0=B8=D1=82=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=20=D0=B4=D0=BB=D1=8F=20=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=B2=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnabledSubsystemsTests.cs | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs diff --git a/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs b/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs new file mode 100644 index 00000000..f949deb3 --- /dev/null +++ b/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs @@ -0,0 +1,42 @@ +using AsbCloudApp.Data.DetectedOperation; +using Xunit; + +namespace AsbCloudWebApi.Tests.Services.DetectedOperations; + +public class EnabledSubsystemsTests +{ + [Fact] + public void Create_enable_subsystem_with_the_systems_turned_off() + { + //act + EnabledSubsystems enableSubsystem = 0; + + //arrange + Assert.False(enableSubsystem.IsAutoRotor); + Assert.False(enableSubsystem.IsAutoSlide); + Assert.False(enableSubsystem.IsAutoConditionig); + Assert.False(enableSubsystem.IsAutoSinking); + Assert.False(enableSubsystem.IsAutoLifting); + Assert.False(enableSubsystem.IsAutoLiftingWithConditionig); + Assert.False(enableSubsystem.IsAutoBlocknig); + Assert.False(enableSubsystem.IsAutoOscillation); + } + + [Fact] + public void Create_detected_operation_with_with_the_auto_slide_subsystem_enabled() + { + //act + EnabledSubsystems enableSubsystem = 2; + + //arrange + Assert.True(enableSubsystem.IsAutoSlide); + + Assert.False(enableSubsystem.IsAutoRotor); + Assert.False(enableSubsystem.IsAutoConditionig); + Assert.False(enableSubsystem.IsAutoSinking); + Assert.False(enableSubsystem.IsAutoLifting); + Assert.False(enableSubsystem.IsAutoLiftingWithConditionig); + Assert.False(enableSubsystem.IsAutoBlocknig); + Assert.False(enableSubsystem.IsAutoOscillation); + } +} \ No newline at end of file From 801c4b8c49039878387be0e22662778d820491c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 11 Apr 2024 07:35:28 +0300 Subject: [PATCH 076/132] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=BD=D0=B0=D0=B7=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DetectedOperations/EnabledSubsystemsTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs b/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs index f949deb3..97f459aa 100644 --- a/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs +++ b/AsbCloudWebApi.Tests/Services/DetectedOperations/EnabledSubsystemsTests.cs @@ -23,7 +23,7 @@ public class EnabledSubsystemsTests } [Fact] - public void Create_detected_operation_with_with_the_auto_slide_subsystem_enabled() + public void Create_enable_subsystem_with_the_auto_slide_subsystem() { //act EnabledSubsystems enableSubsystem = 2; From 8192a41d19a8bb8a3c30a3874f577f3df7c80293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 11 Apr 2024 08:12:03 +0300 Subject: [PATCH 077/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=81=D1=83?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=88=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/DailyReportRepository.cs | 6 ++++-- .../DailyReport/DailyReportExportService.cs | 4 ++-- .../DailyReport/DailyReportTemplate.xlsx | Bin 15806 -> 15810 bytes 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/DailyReportRepository.cs b/AsbCloudInfrastructure/Repository/DailyReportRepository.cs index f7f582fa..afa131d3 100644 --- a/AsbCloudInfrastructure/Repository/DailyReportRepository.cs +++ b/AsbCloudInfrastructure/Repository/DailyReportRepository.cs @@ -64,10 +64,12 @@ public class DailyReportRepository : CrudRepositoryBase d.IdWell == idWell && d.Date == date, cancellationToken); - return entity is null ? null : Convert(entity); + var timezoneOffset = wellService.GetTimezone(idWell).Offset; + + return entity is null ? null : Convert(entity, timezoneOffset); } - protected DailyReportDto Convert(DailyReport src, TimeSpan timezoneOffset) + private static DailyReportDto Convert(DailyReport src, TimeSpan timezoneOffset) { var dto = new DailyReportDto { diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportExportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportExportService.cs index e593da8c..05831ab1 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportExportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportExportService.cs @@ -185,11 +185,11 @@ public class DailyReportExportService : IDailyReportExportService sheet.Cell(rowСurrent, columnSubsystemName).SetCellValue(subsystem.Name); sheet.Cell(rowСurrent, columnUseSubsystemPerDayUsedTimeHours).SetCellValue(subsystem.UsagePerDay?.UsedTimeHours); sheet.Cell(rowСurrent, columnUseSubsystemPerDaySumDepthInterval).SetCellValue(subsystem.UsagePerDay?.SumDepthInterval); - sheet.Cell(rowСurrent, columnUseSubsystemPerDayKUsage).SetCellValue(subsystem.UsagePerDay?.KUsage); + sheet.Cell(rowСurrent, columnUseSubsystemPerDayKUsage).SetCellValue(subsystem.UsagePerDay?.KUsage * 100); sheet.Cell(rowСurrent, columnUseSubsystemPerWellUsedTimeHours).SetCellValue(subsystem.UsagePerWell?.UsedTimeHours); sheet.Cell(rowСurrent, columnUseSubsystemPerWellSumDepthInterval).SetCellValue(subsystem.UsagePerWell?.SumDepthInterval); - sheet.Cell(rowСurrent, columnUseSubsystemPerWellKUsage).SetCellValue(subsystem.UsagePerWell?.KUsage); + sheet.Cell(rowСurrent, columnUseSubsystemPerWellKUsage).SetCellValue(subsystem.UsagePerWell?.KUsage * 100); rowСurrent++; } diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportTemplate.xlsx b/AsbCloudInfrastructure/Services/DailyReport/DailyReportTemplate.xlsx index 54949f17caad81bdce14c9b28ecdf6ba8b071683..5201a3099c814ec0ca121bf2d28fc2e94c32045b 100644 GIT binary patch delta 7287 zcmaiZWmKHavNaHbJA=CfcZVPuW^i{45C{+m7ThxlHn6 zl%jwz;ctiA1Mng3_xO<8d|Pi%Wb?omFHEan748=n_owi#iUGQKsPNCFE5eg{D|}hM z2a53`Ip80Zs3vN{zRx3XMnAG+6kFZLF>s)7V+ho;!?y~`26DDmRX#Y>XKY!&A(e6Y zj_D+|;mwD!E%ZW%kpIqVLwa^x;{)%`EB@?|`P zUe`lxo}*pD;f-=dD>2E;<$`-3B>Us)$)>ou2v1*0qkA!NoT|6ztRD;^NQ!!%AmS*; z7IW-n2rFYJkI%b_?g-$zfQ#pBA%g50*Gj|c=kF(U6M(qPuMRD-TyJ{-hqH!McqMzmVp2iwU`%(1FZ$MFc72_@v{qN+)n{?1);dAx+$pp7V)CQAZ;TG~A z0G5gnRFEeqtwW?S!aK_8j~8d#h=0=&BVkHn^xOL;Yu>c6@NLX>loBCR;w>7?aTyAQ z%^{F78@PES?Te{wf!9=36MV}<+?6&+*}ebeJcE*_&uGC5scKSV^7kLQ(Qxe*`!Omx zw6!)IPwa9n=re1beM>TcDU zF%J?q9Dk7G{01XNrxJO|_BC9eoEn(7|z0wp1S#tLUauNs%yR@KS}sKGf@ z1mdO&SRMT%K!HLQHpq-B)&8LmwPHC1kP6n(lwtZ)b*zu45UM^XNAoI6e@eH)V?+?z6F z)^7DiNoawfDH^}_g;2EaKW3%0x$)PBx^^G4KTSyKv8g)O$Yu`d6Px_3+ZH1%j1X~U zilN;$42}UW#26}~vkErTz8qH`+^Ph4QA1TfZF`wUsiMp|h-p44c^;;j>Snv*m)`pT z@mvJ&TGxKag!UkyNPLQ}Xs3C|^QA4`S_aL2ww#dx<^CU~Q;Z(wLBm}4()%VecgDU4 zPEnDszIs~4Y&~mXNT8qQktj6lT3~cdoQQv;JI}{Q#%!a*n`EXPWX|99Ks8?;W7-I`nq{M8XouB)0xuN>qO7GTfZ%L}+ zAWpD5YPOnxHFuFfUNLTyj%}w}c}F~@HA|GDd3|CNb3{dfBUApaNEUf@d2`XcBbWOS z^l*Kt#r0ay#0vWA8p(gQ(3eHRuZm6^igtol>;Kn}6 zh>yd5dH>17A*rHu(Q$R5VURy7S+@KcUnuB)wYv`IR2hj}yY~9?(BsrxeYJF8xP#+m zhCDtBs#t1m@9Y-8_c!alXYmT$rGi51K$>gO4u!&4bQ0Dg5tuaQA%9u|#B}wiYvJ~EDb3sXeP*E{6 zAY^74*k$yn zTY8>%JzO2gJ>2I0`TZG7>x7&k)itf%$0x7F^ys}Ygb;<`t&f(4m-Ba+Q5v@~u(i6; z#DcC_t8n<%K2KR>fWZhd%5Qca;MnZ@$J?*7W1g3vtYX$B$fv7gQ6p_`Zs_Qz(kaq% z_8_a70=L+06NxmvCDx}l=z?@x{3){#z^s7lDhV4F@bGz8jH~rEMCtX9=Qeuo- z5xh@+H{camy`j7s40<+DXne^VU1XJbJdE~v>TMo$_HBQmh-zaZ{j-7jx-a9I3Q~tx zEJsa4>GDq_1=-%aK?WnF0!D~u_jS`r|mlm)~Bn#8LF^-!V4e6II9Lr z8mPxD1?`4C)F>z+1E&IJkd;Nvta>1!{e$WPYFoTv&Z)3KNMrS@-+@eIuoquBh^7*> znW&QV`bkOPfn5nvk>t9z0Navsg`~lEc*DHbx(uS(BLFP|k{$B_R)Lqalw%3neS)l| z5pN{GCl_J*>S#>&9}~huafTDJnc)e2AguCqba}S_Ci)cT-_-t>OXS~NkVmqOFaH{h z`DkgQE<^xwkMfoO#I!@SXMis?K4<75=|XrwE6|7~^*+Z9+Vzm}Lg;gRv9X> z?8l#uiGv^2cp}RuJ^e?icQTRH1j*7@l(QJAgi=8q!QzYNDB)=`m=&Tl!JMnE2KD(lm z?!h~$OaWzsx^e7i_vBB><5y5Abd*KyeeroWKz8xsEFB?%mslzh;?B#iSfyAR3@Q#Q zTMsAWZ+#7sN~f=RKHxd+u~Pn1$Iqu*{Sy`NHTAli1VIEC*oL4kXoI!$iLoXw=wc4g`NWN8}^F+{eTK$$IxMuNFVB%5;50Lu>p z*>&@J=+CVzs3CQ?J-r@x-a}>SBBgW`3NX8|)HC)4(*sbXj!siN74>1Oxf9daz71 z%~#TFVC#EaDR#1Kos`rO(q)J?mC-GEDOpJ7n*%Q4J;tW%3d-r;YOZD?7ex9zpu=vp z0qh{mW=A_BssFBQb0P-hfqO**Goat337N$kqlBh!U+$&9G?P4%_AfaZbVOi9OM8w` zL1zL%`s3qt)9Fk;+At62FJ`1#^V<^>)& z)xup(!RWPwKE%DOPTSJwwH7BHn+Dk_ZLvtC5 zuD6S3inVs?d~iXA`!+3?g#P2$gd#u{J$#0WRCpqw+FIMLT-sd^SBrPw^X%~gTC{1#BjUJv&^VM-zgok#rKYpnR+!NGlV`2 zGzI=DA3>5(od0nUZx~%6adBa2vPujDxz@tM^A$N;c2wbXJq_SXffsViEz?3)&`}ng z@vaE)+5$x)$2>caLcys>*fZ)Wy1Dl?ZPGqq#ABGIe_#3bzQ)3Tdr{~6vmTsTKM(-E zK@}l7*&<9G@aOsnJ(HJwdN0+N#2ZabgcXxg@-d znvC>8k+m-$=GBwdeOo2Hs{Q(+E*U{2-neR^GEGt`A_iAA+euC1#0V5uQ8@d) zY;$wkF-Af!%P`+p)lhF7(V{{q&p?s2WxEtel8S!^gE-~AtxI{(bd=ha8;rdgeJd_B zCMmHKCoF5ymqou}SE9IJKijV^xZ8)Q9{;gn*Eix(A6AxyzuB6h!8TTfmy|Vt7?w%0 z{!XLO`nk@*oQrks4Ed4i+`lmF*sb1;M+&h63%IjE=z5mC{j4`5bA-#MyYOP#7W-v* zO;FhzYKV?>nn^_4w-@lydHucR5yn>aO!R@s2k^V@C}XJjH_$;k>+kd)k~Loi;g}4S z1gY!wDaIqY?n9v^dasS3BL?pb2Q4rc4QKhNZVMjMuY^%NZsR2f@#f0YK48km51!N< zlL+;~F`2JgB~ySCA|(`zbxpo6GEaKw59O^UFCi;=rtp2AwHkq9>~ULF5g;%}O$2!M z5=(@W+qrV0!Cxyx*V~Q?e|Hszp*v2e<6)nF&iFHJJ=F7Lfg>qY_G~U$M-SJ^Zs}4) zO<|0@B^>`TO?!5bn6GSxOsZ)Qi>`m0vgWMcd*U6GrS4BlCa3wK4m3~l<0rE>^+JT; z3?#d@M3dLLyi9>oe?HtMo0E?JO`;%Aa1HF!c1H0Pk2S?mxdO-LKt!g_tkTwg)m$fU z!2+XPmb62ci$)*X9ElZ!F@kz~V3HVZPh4Q7xx4KL^4f^OyIZDCFVxktq5I+J;Ai*4 z$=sjYJBa02|lU0siQ2okM62#m^LC{?s|0IXg%rrq3e^;=PW>GofePtQ%%iL0;l1?%EaL;fa3mo7yq}sYLPq*LCsTkwUw3Yy~;_a`Qy-#`kZBZ)h_;${>$` z@7MQlAFeCr#v+lu=fvD3{_(Mk@j%H^E*{TrBu0EgZq=7^B&CRtt791#;rS6e-}H%V zx4#B_p1*QS0QBbiwf0y!4rWG_Rz!CqwhVZ^%nT1xS=9aaLbK>Xz_zjYL^db|^Y$7x zvWD!|n4A;XH5aq)u0gK@&wErul^W0hJ>ABw|KwHq@I*}Z zZFGX#p95pZ^0M`q@K)kFl0`I%2u^VImr^mfLbi|bZM=7YT?lydvvtTUJ@mRL)Mzps z>P1J~nBlC{<+7?D7LqCYWePYANToQc$NThHWpEPcfe4*bR7+W(q+ak4w+{9;I_50{ zHv_OSMN6~PFh#|(|K9H-z~A8WQ-OhcJJO=hKwpbl62HAs_;#L7PhPKRk&acly}p3` zG4&LIe0fLN7q>kSL?4lfuMVu(2Br`55;qaU`12vdTB#v3RXu$=+AP)iqf^{81 z62kby981wG0j}N^dNpui@ZW5XnfO>5M&b}4B=!9g7|5XI<1;GmUeeJe8jTaj=46`@ z%8Q%YWBI*6JGJejb~##&jUJoD_>-))7K~|aL-{0qNr=G~uq(e;{^i5${h8&O$h~=s zYgo`#W$NdkjRhRIHz#i5X9HgD^IFY+%8I{CZoA*GEpIM8qJFUfjQVl|Vc|4&GhwLv zW9cP@>XONl5xK2H?Ca8k*SV*XDRxEOBaZvLjU`9-llnn6@;M9M=p!;;#S8RlWK~S{ z-a*Q*VEzWWygPSOizG>kbRq6n!>v-F((;&w?M$FY?E=F60%*C{JP;I?J3ZsCqg7Qp z-Ll}EIY_z;2uEeR~q|vS51;mWBqSBLN$cMGoQY`>*-S5%vYLPD${X9*sJ$S%$*c-7s_(2=$=W z7=Gz=emnP2>}p{Jv4Fx-&h;{(EGY>9KT*&?3M zeoGCEk|4^>F4>i1g9!yqKp_3>rJQ&1R2L>RmkejaJak&qd)$09V}=^jlblQ;c>bhb zY!Pxjd#RC9W6baRNWCl+>Nq-LL$Z<-)|}6V9il9PJrZ?kE=eByQo*viFUK)Bi&9y? zV6YaY!e5O$7F>U3rHMHOzaOX6VvSyJ!DdaczQog-MkU#k32I2RhFs#6a!os+muo!w zb_vHPX&?^RAbK4y=>>?B@hzCedzwoi$dNVfW0D1M?x&aT{}3BSH-_)1{&%bJ1ALj| zo`I5yjkVHR2JBh3LzoopJm}+9R+MN28DdW9)hR-6RwFZ&v5;@jUADakYQ!jeT(+y3 zuhC}(DHcLg2DKq%BD$>BIoP_<3y=tAlu?W%FQUSA*moUt>>~OYNv=!c`)eWvtW?{g zo4m9LElnkv4yAL>)TgKPdgil=Uy8r&!w=+m#25^lmu5we3k-e4UgtZ#KK7dJ-bj5L zTd@DW`^TE5-OZfRGFw-_vur1UosQAL)ff^r@d&w)du%G_6WzYGeYDTtGG)qJnLb)I zvql_L)zltK!OeYuz)4d)$m)+@@;N}b)Egf$j@WqlE&uq&kLYpjW{a=}xnFxq!L|xrNi~FLyXE0m_SlRzeLoKLlcO=0n!`unFk; z&0mwht@4Y%1GYJmNTfCk6Ig@4V6 zx$`b0B~s7e!M-<3)2-Br6T{7u;iV|`Qj^A_9|Ox~>95!KzZd01t38{!Q8~1VU-hEh z#3J;hJ3|L%mT#Ts&#KXG-{IY*WCDVgQPG5OQ0IwmDm%s*a-;A^+UW*u$iCYGu@1)H zh@Tg9lKi@noNSd4G@A|$#MM2R)LqQ?_kMgm{59^bbMJ<7$$;hCt!CuJd QqdLM;WLPkirT&`z7ilT^oB#j- delta 7292 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 Date: Thu, 11 Apr 2024 09:37:11 +0300 Subject: [PATCH 078/132] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B8=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?,=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B9=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D1=8F=D0=B5=D1=82=20=D0=BF=D0=B0=D0=B3?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D1=86=D0=B8=D1=8E=20=D0=B2=20=D0=93=D0=93?= =?UTF-8?q?=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Clients/IWellOperationClient.cs | 2 +- .../WellOperationControllerTest.cs | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs index 84906a77..b9e63518 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] WellOperationRequestBase request); + Task>> GetPageOperationsAsync(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 4d6dd3c0..1a700189 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs @@ -89,9 +89,12 @@ public class WellOperationControllerTest : BaseIntegrationTest ///
/// [Fact] - public async Task GetPageOperationsPlanAsync_returns_success() + public async Task GetPageOperationsAsync_returns_first_page() { //arrange + const int pageSize = 10; + const int pageIndex = 0; + var well = await dbContext.Wells.FirstAsync(); var entity = CreateWellOperation(well.Id); dbContext.WellOperations.Add(entity); @@ -104,17 +107,22 @@ public class WellOperationControllerTest : BaseIntegrationTest var request = new WellOperationRequestBase { - OperationType = WellOperation.IdOperationTypePlan + OperationType = WellOperation.IdOperationTypePlan, + Skip = pageIndex, + Take = pageSize, }; //act - var response = await client.GetPageOperationsPlanAsync(well.Id, request); + var response = await client.GetPageOperationsAsync(well.Id, request); //assert Assert.Equal(response.StatusCode, HttpStatusCode.OK); Assert.NotNull(response.Content); - Assert.Single(response.Content.Items); + var totalExpected = response.Content.Count - pageSize * pageIndex; + Assert.Equal(totalExpected, response.Content.Items.Count()); + + Assert.Single(response.Content.Items); var actualDto = response.Content.Items.First(); MatchHelper.Match(dto, actualDto); From 0f4a579e70e917dde13856946d9b3f23f4a71c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 11 Apr 2024 11:59:20 +0300 Subject: [PATCH 079/132] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=BE=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=87=D1=87=D0=B8=D0=B2=D0=B0=D1=8E=D1=89?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Services/LimitingParameterService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/Services/LimitingParameterService.cs b/AsbCloudInfrastructure/Services/LimitingParameterService.cs index 5dee9f53..808df22f 100644 --- a/AsbCloudInfrastructure/Services/LimitingParameterService.cs +++ b/AsbCloudInfrastructure/Services/LimitingParameterService.cs @@ -18,10 +18,10 @@ namespace AsbCloudInfrastructure.Services private readonly Dictionary feedRegulatorData = new () { { LimitingParameterDto.NoLimit, "Нет ограничения" }, - { LimitingParameterDto.RopPlan, "МСП" }, + { LimitingParameterDto.RopPlan, "Скорость блока" }, { LimitingParameterDto.Pressure, "Давление" }, { LimitingParameterDto.AxialLoad, "Осевая нагрузка" }, - { LimitingParameterDto.RotorTorque, "Момент" } + { LimitingParameterDto.RotorTorque, "Момент на роторе" } }; public LimitingParameterService(ILimitingParameterRepository limitingParameterRepository, From b734ed929eb5a85c2c248b1c8699140b83aeaba9 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, 12 Apr 2024 09:47:17 +0300 Subject: [PATCH 080/132] Fix well service --- .../Services/SAUB/TelemetryDataCache.cs | 13 +++++++------ AsbCloudInfrastructure/Services/WellService.cs | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs index a75c7bf3..0dcfe080 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs @@ -148,17 +148,18 @@ namespace AsbCloudInfrastructure.Services.SAUB { if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem)) return null; - - var from = cacheItem.FirstByDate?.DateTime; + if (!cacheItem.LastData.Any()) return null; + var from = cacheItem.FirstByDate.DateTime; var to = cacheItem.LastData[^1].DateTime; - from = from ?? cacheItem.LastData[0].DateTime; - return new DatesRangeDto { - From = from.Value.ToUtcDateTimeOffset(cacheItem.TimezoneHours), - To = to.ToUtcDateTimeOffset(cacheItem.TimezoneHours) }; + return new DatesRangeDto + { + From = new DateTimeOffset(from, TimeSpan.FromHours(cacheItem.TimezoneHours)), + To = new DateTimeOffset(to, TimeSpan.FromHours(cacheItem.TimezoneHours)) + }; } public DatesRangeDto? GetOrDefaultCachedDateRange(int idTelemetry) diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 6ed241a0..795d944b 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -71,7 +71,7 @@ namespace AsbCloudInfrastructure.Services return DateTimeOffset.MinValue; var datesRange = telemetryService.GetDatesRange(well.IdTelemetry.Value); - return datesRange.To.DateTime; + return datesRange.To; } /// From 71e0e6356a2432a7a519097b4d0c3fe1e78d513f 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, 15 Apr 2024 07:48:58 +0300 Subject: [PATCH 081/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B8=D0=BC?= =?UTF-8?q?=D0=BF=D0=BE=D1=80=D1=82=20=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43251_Update_WellOperationName.Designer.cs | 9399 +++++++++++++++++ ...20240415043251_Update_WellOperationName.cs | 32 + .../AsbCloudDbContextModelSnapshot.cs | 12 +- AsbCloudDb/Model/WellOperationCategory.cs | 2 +- .../Templates/WellOperationFactTemplate.xlsx | Bin 45673 -> 45635 bytes .../Templates/WellOperationPlanTemplate.xlsx | Bin 68320 -> 68458 bytes .../WellOperations/WellOperationParser.cs | 4 +- 7 files changed, 9440 insertions(+), 9 deletions(-) create mode 100644 AsbCloudDb/Migrations/20240415043251_Update_WellOperationName.Designer.cs create mode 100644 AsbCloudDb/Migrations/20240415043251_Update_WellOperationName.cs diff --git a/AsbCloudDb/Migrations/20240415043251_Update_WellOperationName.Designer.cs b/AsbCloudDb/Migrations/20240415043251_Update_WellOperationName.Designer.cs new file mode 100644 index 00000000..93fe961c --- /dev/null +++ b/AsbCloudDb/Migrations/20240415043251_Update_WellOperationName.Designer.cs @@ -0,0 +1,9399 @@ +// +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("20240415043251_Update_WellOperationName")] + partial class Update_WellOperationName + { + /// + 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("Creation") + .HasColumnType("timestamp with time zone") + .HasColumnName("creation") + .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("ExtraData") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("extra_data") + .HasComment("доп. инфо по операции"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("IdEditor") + .HasColumnType("integer") + .HasColumnName("id_editor") + .HasComment("Редактор"); + + 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/20240415043251_Update_WellOperationName.cs b/AsbCloudDb/Migrations/20240415043251_Update_WellOperationName.cs new file mode 100644 index 00000000..ddb3c3ea --- /dev/null +++ b/AsbCloudDb/Migrations/20240415043251_Update_WellOperationName.cs @@ -0,0 +1,32 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + /// + public partial class Update_WellOperationName : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5089, + column: "name", + value: "Спуск КО на транспортной колонне"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "t_well_operation_category", + keyColumn: "id", + keyValue: 5089, + column: "name", + value: "Спуск КО на транспотрной колонне"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 640170a2..2267e5f4 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -284,7 +284,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("date") .HasComment("Дата формирования отчёта"); - b.Property("DateLastUpdate") + b.Property("DateLastUpdate") .HasColumnType("timestamp with time zone") .HasColumnName("date_last_update") .HasComment("Дата последнего обновления"); @@ -1418,7 +1418,7 @@ namespace AsbCloudDb.Migrations NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("DateDownload") + b.Property("DateDownload") .HasColumnType("timestamp with time zone") .HasColumnName("date_download") .HasComment("Дата загрузки"); @@ -1613,17 +1613,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("Дата отправки уведомления"); @@ -7136,7 +7136,7 @@ namespace AsbCloudDb.Migrations IdParent = 4005, KeyValueName = "dT", KeyValueUnits = "мин", - Name = "Спуск КО на транспотрной колонне" + Name = "Спуск КО на транспортной колонне" }, new { diff --git a/AsbCloudDb/Model/WellOperationCategory.cs b/AsbCloudDb/Model/WellOperationCategory.cs index 5014ac14..9fb6ce43 100644 --- a/AsbCloudDb/Model/WellOperationCategory.cs +++ b/AsbCloudDb/Model/WellOperationCategory.cs @@ -358,7 +358,7 @@ namespace AsbCloudDb.Model new () {Id = 5086, IdParent = 4005, Name = "Подъем БИ с выбросом на мостки", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = 5087, IdParent = 4005, Name = "Спуск БИ со сборкой с мостков", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = 5088, IdParent = 4005, Name = "Сборка и спуск ТБТ", KeyValueName = "dT", KeyValueUnits = "мин" }, - new () {Id = 5089, IdParent = 4005, Name = "Спуск КО на транспотрной колонне", KeyValueName = "dT", KeyValueUnits = "мин" }, + new () {Id = 5089, IdParent = 4005, Name = "Спуск КО на транспортной колонне", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = 5090, IdParent = 4008, Name = "Отворот допускной трубы", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = 5091, IdParent = 4008, Name = "Активация подвески, опрессовка", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = 5092, IdParent = 4008, Name = "Монтаж, опрессовка ФА", KeyValueName = "dT", KeyValueUnits = "мин" }, diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx index 065dc2070b20c533bc426b21237f4e4cf062c581..cf75fde6740a1553b153ea1c0e2d88624518be73 100644 GIT binary patch literal 45635 zcmeEu_aoKq|37I-p_7ym5s_K8LJ>vB-g}fSn~dW`W|SSWvqMIi8HW%Zd+(8%y*Kf_ zUgxO0`+nc|U-0?fKS(aG>-D^z{U&n0G?OHQVmN66RFtMjS$959b@Q_`^-tjX z=S5DZXa&19#qtz>tLa%UU!#N385Cs1cu79R`D*Ow%KO$rK)0%klv572V|3#ddxG-Y z+eG0iQ*51n+nglrnJx)uf__?T$xSuGRA*&9XuLgC-ewwzp$DQ|EyEgLUqm-N)43mp zKZ!K35o1xz{%~-=-FodaTDa6jjnmFg$gN%Vn5!G%&M{n$3hT&zW*_fD`NdegmZ{Yzqpws`Wp%*oYvX4zXR2g#u3L%u%C(F3 z@uPv!aSMG4-NqJZ_#Igr#BDsH( zPM!Yz+QVfV4+rP)5D!Q8Z&iCi8)a||RP6{TN&--|IyMGRZQ0qNum8VV{|}ewA4mTX zA_d30MeM!gen`_;erJG*w*4u)*tC@XPuyFPKXrK{gOW>rZaomTODLprj>&O|bBf$B z{FLOFM2vU_3m3z8k1^~hRjz{nEG|BEKGf!c|GaqB3)-g{bD0~Q{!Ehzy&FP)AI1_r z+2{}5F55p;{^~CHS<{41HO%I+`uZcH40_G5$t&I?()oXC(SA?ys+lsPrJYi|64MT z(o^-Im4~39$Z<~NIzDB`R*i$DjoD*MOEaj|{i+~b(C$Dg3W|1d1IifX*j%)2!qv0O^`q-6g_QN+A zKT#ep>5pzMIHSEKqq24NWdUc&7U9L$;<;ID>^v>KX3{eHrT1vl`Q&vYt3BQ*YEW_+ z2)%+sY>g{&!6=+fYyk1OnRHa_MkGOG&eI^RT4 zrzmtgg;Rr_-ZqcvY#?%W_aie`)7?!Q<-=Kmf6JUp9W;hP0BCoPTF)@*T_L=KHZt+J_eOMxHQDq{i z5A%Gh`GTety=Ii;)qW{b{u0$O@e85t{Yk>Z1Gikc-`(97x=B%o_+ICdZouXEtMS8+BOOc3qrgxhOI2VPHkLHb=x~%uYdTy z^1Zv(iqDQAxRa{r9eu$~<@U$tmNE`2HcUU(rBp3CK3ql_lFO20KSiIe;0iQ0Bur;5 zS6_SkI%&P;>d!Z%?r6pPDUu~dpKhtxTc0Jr=wvB9A^AkkE_Oiu{%qOhugON0JEdpr zdiL$kB#O|yOX|6?t9tUVl{u<3aYwZvK&|K?&mH}(>B|idubm+RBj*Or>jVWa@ujZa{%GlK*cMAu0A=ahrzect2S35zwx4A$@ZA_IeB!k- zP{E+V&#e=c)6}%^Fh-Zx?m}l{kmK#g#jT-#mMM^BYF zAd(zPyFx3@yefGDJHzlqGSO%##RfGYf3}(Et-^?q*yBz&1qbP!6{gQYj`YlDtccD_ zL{%8BJvO&weLcu<`r&hS;>{^N*vpu4(c<_g!_s~g&IKVlAT|FN_7EK6=T}bP;Lu&c z!8wObURyh-rv|nV+;yroS&Z`#qb^O~IbCumgavL!R(Q#b;TUNzDFNLH=V`HU#^{&N z&-ym^vu+MnqwbF+)KTpcqABdX-x%~={~3*=apEO?fZ=u%k&(CJ;ZF{!dbU6k7zL|2 z@3rT~v&!E!NFkki_4-A@ERB?`(1V-P&+Mca1)HzAofmr$Mb2FOyu&b0J8H9Dp4S_h z6v8uK=hRKyfAZVQvaPq1Ivms{kC|M|d)Zxk;@povU?G7`NoX5?wc}_-j!ax4G!lMP zV>W&@A=G`*Y0w$y9cqx?*!>_1c)uMdaR~)$Msls+$iuOA6nNE)Jd<{@7Fa;Z6#3 zb8OaTeV?;eT{v1UZJfi!%W9~oE%?OqTBbW1n_Uetbt3rafa?;m!UI9V*1Ekun$6B=cr7e-dGi{%(dnCvNna22(Vdn;k-F-QTed=7ez!$1T5C!Y>?obhF#`bCe40vjYeBtXGQ1ent7v^krhgVfL-Kpf@svmwd}>WH~R4cR!q&a*F*_Ku1K4&wf#Ui`S}JNFmBV zhk8qFSrI)Z=~&7ma0UJ(A?9fYoV0%ObP>m>gWt#VR&gb}^=q>)Ql}>5KgA{$ooP^W z%1fwwf%>tq!KZt{zAa~#bOJFvdL`e|d#J3!x zTo4CoZM2f4TzXuYrHR$A)w8^q?|&A2rJT7QU|D9`rrTxwxeva)89O>kIbzWH%v(1= zoRS5$DSP46?$iMTtWE69%ZwtSjbQ@W=23Gv)uo! zQrsPqQ%vz0Nh(?Cw_!?A8Rq^ZpNC{AT0;Ap))d#S`qUF-^nTfyT+@|A3mOePDOT*A zIQZhENYbJpcazj$t=Q_uhjHg+hCtpfrdv%LU)G#qhRAVu(c~?mMWK)i>fCO zALu!CO(mNs01@}}1OXM9=|u3{lc<;K%}MPK#Y1PVF^W(>Nuwg$|3ExTG9Pp|%<94E zivGlRcs~P6+wLrFHd_{zOuZkN?X59!YMw5fw5v@T&=}zynA$cQALzcQQ@DMJuQyyH zRy(qCD<_euS?Oc>$m?_KwH}N`Wy5&$*PrDqL{U>VJl!cYDY$LXYHqJJV6qd?g|fes zbf?aNyf?NXS0hzVZETIk-NE^FDqTWfNs+1pNt2v0)AtoOSZ)7>+Nrgv<-7md8}68M zz`uYM5kPgXVS58aY;27U4D4)=*fHiW9KX4-XW$pVs+%NYTX+Ze9TB13UT5zs@X{75 z{lI&?+kbK(B4~@`CnAs1pmK83s%4TVdQTvo!jLeSrL*Li*Tj=c#<|Oge%1=%k9@O( zB>1cXL3$l*s3<&X=|{eGL8=!CK6=T~{k&ZLyr%DC0DgLq&{UsZF9t+PoY{r=( z36H0mH#V$o;{RKBq>0LAj|VHkw{UPS|Bna$I{O=qCY$lv^QbhYrOGjy2z{|JYFW|G z`lbdZ*^#Fd6CQT(SWJk}p9QU!^&xRvYAy`xV2 zF&7tkAheE?mBcPIrM4t=BQsz1^=|i<+z~iw=;J6h!=!_)9wYXu=Q$bUU%8t7#5iVM zA7va|s&hT)XuB`>{QZ=K{1%R$od51xi8dAC$u9l432S>OxS?D={GQ77ZO7nS}LH{c}_f1-}>B&%9@>8R@*9C$jV9c zd9eoSEy)h-szp0X*4-Pe&)MTCwHryr$VT*UE(L~D$aMG41`@i&N!KSbSaoG?#k`@ntUYJ{+Xku>owC6E?t>D4kWb}Qp=Sy8HO-dp3p|>Ne zls6FeA6;SxyT|DobjyBhA_B#Nb)?2vc1}iI5i0P`O(<646k&ky1Xv* zcDW3Bko9!+v%}P-7>!2pc_KCW~MDSEgxA3%6HuXtu zSLBBIid9^4p3}LAQH6rnJ{>Y?65KDEJSz#G5+SAi&QexxX~#WQt}?8l?rQNlId}!O zjMh@Rw9~&}>cZKs=I&|sz2qs*I3vEj1X<0~R80}OF1egD!Jw)yE&;y}*fUegs`%2gU z_H5-$E$6%WrO1+eZ*Lh<_uQ-dQmO$3LpOTom);yxFB~NamP~7YmKJodcjv@-6AMd^ zm7jR3f@P_Kc;e64#9QA_MlF%5E*v--B(vJ)4)NRAFMT*R{;U>t>xn3bQ6n9RXhnsB zd4?hETF7XpA?%E$2%?4LH7{pD6Uzg-jvJgE;$tMQHPQ@8uZ7IKK|dx~SHF5ucc_GW zO;s=Qd8BBeKFrG@zJRaKkmm+V2YYBWqpkZ+wx~GVut=-kTjWf~vgNHvFX!vaGA1St zicYW8)dq!LP1GkkPrl{%S83Y+RE#9OK{}kGQNY_lp7U(qW{(BN{K_J?13kxTV{nV^ zLBY^G`(USDy5i1x%6lfFsH+Llrn(C6=F6lMtZi>os-{zDRk}3@Gg(T#zQc5!$y%D> zoC3T|lVvE(ixdBP86FnJL}#x*x>IMDET;GDm~nL{13S}xOql76QEl^?4T_Z!v%2LflWyvmA7P5|kVs*AhJgq3 zZOcS^0<@GS-3>O@pemk^8;k}-dB&p`IM!{&@*mDM)l`R{bbdqop!7`}%@(nYsB%OI z_fv_ahd0I&N&(UpYjT(rRA=KQ!P7}?h)4>ebT1`8R3qVVpp+@?TJlV0IYai?x&Mj_ zL-HnLv>IIIj>)`dr)mxHg^`!}3@>AY-iV#QFDY|}Y##io-{r^7>R&4^gnVLr{Bp)5 zY+qVDY7Sb?Y;_Q6FIB4{?zr&rR2Huv$*uVnv3cP+(h$8s_Qyo(ML~nMi1P@S`nZ?S z4+1}Vf0DYy?=6OUDOO*C*QD>p{`i7=ky(Qn^W)GQL2)XM|+O*JnI!iK`%*r#1KFsAke=Fn*pDu||ur(L*4 z9}HPDHZdIXB>MXSz2_{`Q#pzI?%|5E`}MNikF1*vmgObAGlJ{&j(;WhQ%z|^pUE8( zpw(8p@2{G?@$_Q6ho|zH8ZUR4k5P!q^{HY>f{jaDp*0Tn*5QWs@`YE18GU<4wBBqeUFngq zHF!!LFe)awwo|MssZhWpMZu#fYu-CYQ}?jJF}%#TL9OJyGZ~lLlW{xZlNJDRM;lT* zoaeZWuhhu}|4=`eV!oG9e8Y4))sU?@!S(J7s>!UkMJMK&Y|k6I$?4E<41Fqk9UJSBMe)A3%S+z_g7VIrgO zE1%!Vm$m1!2NW9T;d4tU+w)l~I6l3{c3x&Blw7eA(r);nMjds&lsM4(_=vYPjFvD5 z&3IS5m1_E&2}+UCafdkgTOlopdw(BqUc8}C9^PEPmH2M2w$8Mr!Zh8OB-gshC)WIN zuhyQHO`}tJX?YBJ9!5mpcW&$-s@4-e^AmBGij=uvcB!r8oEFhoIUB0M{1t8O==~wK zZ`5}xp5F@Wo)UQze>L-){X~nV1>4Qu8)%_WIm^EE@#26U)!7J~dKK%1M+0UEI1=Wz zi@fY)`YNNtygQ23AwcQgOp>reW;@d*?y|&+vd6a77c0oM-Q|BapFwr3e0c?ZUuL!} zkuq@y^KFrP4hcDHTH+`@<2$;3HQ`H|IrHofNlNgKcDAE3HIsmaqU$b*bvTnsbeSJ4ZJI9!aL_^@An?Rr>11h zg8m-g_3xADD^1-CS0k++PwzY;Hm%I!OKsx2b^E*DGc7P}Ti}zo)*;1n@*pu)dCP)}u@=~ z{cXXdUB%kGmZtrh8DlPG#m9s5<6rcUXPi7YiE(jryQK+SVttw z$I~yFc<(E!?%7qbV0*!->)Xm7T8LK&t?#w@j-teJNf$eOzh7U@FqIF#I@UmUt7erW zU}J|b<-R9t6JBNyrZ1-hV@o2>yKmGxp+!XT8W}k_DwtTK)3ngIfU;i_Us(K}fP|Z<_6{)t|h^ z^y%UaCvwpuBt)Vy?e{&z z?8K~^x!W1|Lo>*5UcC}KsUMt;uOUMjcUddS)aYftp=XFi$@xd*Cym{H^rcf}#Tb1s zQxoT2^JFH?qv1@FM_&0znr!o$!Z?}Zg#U-~l7%oWKH0e>>mjNt2^<0MC*Q7I@BZ>K z;CoG0OQ>B{#hJX<7iu+Lo=C5zpGkg73=6pMDkRt9)hK)3iw7b1lg+=vh^r{fG|w4N zN^ugpXP+V?@+ofV%4KG)>X>1^=~92OHb;KH>x&3S+`Zx=k1uguNud)b-AQbj#YQV} z^{lQcN|y6qwHo_O_le~&;9@HOLdL@Y4xjdCqII}YDkNcz3dMA7Dg3MEGkBBcLWWk; z83c%Ha=M51U4rF`1T8m`BfBL1l|;L^LTBcfSN)XK&Ubxyl&)cMO|{m(;6#sbB6()b z4W+HKCxmaY&Pj4gsg^yecF+5fRbuj^_^PbHXzceQ1OJ=OV@k|-zg=ljm%B8#Qv-QYxDD0V-ecv3d}uG+S$q$b~e(PYE4}(Igw^g&r`Zg zb}S0IKU->)!sfZ^QR4-f{5jKm{B_Ky*D?z5>uWryoOczF-^T!#)DGNX-jP^h2l)dNI<@l?Zu`>V^7 zQ#uugONR@k6?dN>G(^NxQK5v)uDR^4PEDod=(rwi?yRvdJ$K&T-fZ9vynENh^e~#5 z`mU?XUct}6_{07EhL(8h;R7oYctc{y@re|%so-eULk$nyi%CjtlC<9iN74uMMt zyDOs|Jwo4p_z+oE6uKTp#19|te|@;Oy;yX1Yh~d_#s0<*SEsG*l^;Ac@x!i;hZ_-3 zTBD7qN057#t_SPeI}7nbTtkPdn?*}5^W(0S%hV$kd;8myD|I;|`J-`Lu8iCj&kuH; zC}#GSo;!|^Xu8g~2;JS^o|Mt;HN`f;Phdc>-Jv6@}cXdPGBJQ;o8su z5z*oJF6YnI68nJ?`-SRwD(XWUsly`b;laVe1kh||M*G+gcWf0pK3T*ek^4I%)X(>K zeSC5U%J-IcX*S3#HC2dqTYRO%Lc zM%oX%CWOSPH}`kH&M6-p65gsiZ1ogym4_W3X3rkHr8r#K=_4Y#i~2d|ljG{RzwA14 zxV(|JX{n8JvcJ8+u3auLw0*egDs=F3b@`y>t`>d4beo5z>-Oa0XhSK_g{WoA?v4%W z{l%60h%?4bvzP~vTkKZb!TANv1=qVa; z-P&1MYUvMe`&5x1*~jy4a)9TXy>nUFPs7{7{f))SKNr?fSkzI$S^w(|3- z@PV{9h*y+|v9`jyv_D|p=jpQw=;?cI%eCVPOAsBWfAW10PtI4&9X6p^bu%$p>Ptw7 zSuEqsi+9PV+(T|zExvePLo1AL!=`sxu02&w0$m{eX8oQlco=<|Z|k1o|qI?%OOYS-71(eVW z?4cK|5&OU-%(?_Ay>|DE?>2kTHQ+yFr8Rn0V~f7O645U7>{|)uNx=_RMBvHqR4fd3 zXj)p|#TRN3d~Y5x>5wmXyY-wb6`)#`Mw; z-cSv&^DR2lSW@#vNxlnfgqAx3S_2P;u(b*P)4E5A2A<{vzZ!un|ncj>wuZI3Fy?y?3azA_~7ycnV4jVA+`1&0i0l1a`O5zY>)w zM&we0cT|3WQ))uHK?|7Os%r9HiYFp;yXm2jF6vbed4M0sR3LsUi!|5`JrKF# zZ;oRYhCJwf=}LS+6f#PD&Mkfc$u{T#lFg1NoGxUVYD|_XeU^%+_!O`gIuL!EplS%P z4U>e3Uf_L@gpgs-%RxYC22t61G>ve!blXynQ+ZoT&Iz z!+G$cUvZiLog9(^uU-O=8fsx*|LkwCm)C?-oq1@EjX*%@-z^)9euX{CmH#-(-}n0C zD5L*-6pZsBYyZtx|Mmjf8AW@dhY8Q;Am5I@7n^t*?8xTC_q%>Nzo~y z6Zc7=a^JE7`~R!u7Y3np0?r3z4W-4e^vCS=k7z>jn3(>4 z(La))%=168=I;jl1&+%whhLcfrwekxVSo#gy#DTjx8c8BaPhxf04@Bh3snBw1=~ok-9nmf?OEC{C@jC{qkSc^mnVUet}8kKpCL;4CLA$7f_eGXhn~NuGHQ zsWRF%=8002c^Z8U-MVqTzfsTA<5ApA<4khDNz#C-`-$h`s`9E_)`Luwvcy-(7nlX~ zT9xfd8(2Sh`G`_9dKvlh^b^Ru%3Qc{9Z4W_IbVsj)`lQ(l&0-u#Hd=Lzfg6DB1NqC zSzhBzXa7l3!)mbMvug0db3SS5JnDpG7Ol$MR~lF~eZX!mK47=oL^2BI>r@W~(O=1lmRn)j6?{~QY2pPU!i97^f^C%K(k&-UHb)Nfgw?p{AtLEYT zM0V@+q%iX&{LdOJ%$rRjHqQ`}`Sd6{LSAF$y%5i*k?&ZAKRxY#klDU#NJSTv75_N# zoYT2J{tfz544*`NwO};{RmI2KKbcTuJ?aSG4tZ^hE=x6^g%j%POHm*tj+GuC_`P=4 z5v;ME3FB_av9uqYK+IxXgXo(eK_in)O$Ku!GlCzQrfI zaJBLG>uz6%UKeA^jK^^a#vw@3V!^>7$Q(C>Pv6l|V|y!SCAw6F-7@a(y0papYm{os`zg09;_h*MUSd!&$skt_l2z4qW3gn1CA|Y z$Cb;&{dz%X?A8p$YJW`3ZU~;3+A4jrF$$&v7o&CtEt} z35>uFQq#~v=(1O5(|!yHe`4A2CvNs4ktX_Deq6sf&&ZeEdfsqe!+q=x!&wj;Pp)P! zK53BD!x40%(m9>LS^8%tH3=mRvn*W#@3R?E>-12dW8zYfoJ6!pxQhg(#k9tbAmL8T zD=+=>6+y!DvD)wZ8$DhY)UbEMhp3;^ zB%B8)MdAm?BKL(UkiOS$i$xD5h>wJ9@hMpSuvum|1E>GCI6qF*@2E5OLAuRQTP&Y` z$vX9T%Os9ocYa$0@mOCSHTaV+UjZbUr_+K<^l${FXk!%5F05VPQstec%cegxY;;11 z1tH%$>&SaMvn4w_GcJZsI6Et^)8qGbbWFHB85Z;I;QX$uAHMsb?1u;{&1bCd+|-Z0 zyos|`?~F7p@h21j=rHfWY=kbk3klKzvtZq6DyAT69AA-ar?~UFL5yK{_qIzSf_7%q z`av?#^~yL^wHAG1r`fTk+3mRB4jq3MI{pFX_-Amm2m^pu*Xi}$HdlO5;1FvH`F%q# zKNL-%^dBA5B7A2EIY;ju);ZO8#X$MJ?b$@nAko6zA542r+_CipS1b6Y#`;}5Fz05DN%U@rM}b<$1050R>0>O$P!j!c_bZ$L zev=yLjCf<6K;V=><%jaDk!|rq(dl_RN5xn+mVUExK1sRWBtLSRP>Y4Ge;bK!oM^=U zX01ss!8%@YIYB$REa~>m7;bZrAD+|49#3DnFQu_cRre&3b%kCbXxe6(4~pa2#T&?R z1m&_=bm4?xK%FRv3J1L(+o`v}+K~uirvAE~HGfsPmUjNg!3a8iIj5@J;d-#ZRuaTE zn=t+P+ocVbuJCPGT0remSla8h$$R$QyWlL1#?-FUAbFmMjgtkvdw}Fx303Hwwz+u+ zlROj)*yM4MYXhZuGba{TLC2;Nvv!(FtCGxoj}GbU@c`@Ed@11B6^v(J*x_2`0~cG5 zy*Gxt-~$XwXTRYgeknv8KoHI+aY5$Y5YGp*CLkgX!J~HZ0>yDDsPhsfK@zhG#WL;+ z&YLWK3|B#v>ugEb zJQ9TO0YmBD%R|Ytio`cbA+S!N3IQNfvyyDhE)kR>1frr~JY$o4*9-|T=5q>iKf$t$ z-C8;wV`;xO$IrzLH#baq=$5#tIM>Mzz(ba_FT6Af>B*N`f)kP(Ly0AkN>G^szVQu( zrvNn6)9&B_&4M%^N*?i!6URHC-5bW7Xf@@ zA2g_$5vfi0N#v22#`wl|*2D&NYl*gchRlliJ{);%-i~IW^Zv?N9Ndk0H5(NFFxPI# zaVLy#kof6o1Rv8t#{>nr)5%-_%!#a$iSVFNp96;Oq#<1dN5t=Kus}Y8oz4)@o7U)y z2=XW)_MD}e0VnW~8P^V}lm)S;SD>7=krgvTCb8cVO`oUVUksD%JjijhO#)!$8!A7J zM8A1eLh0BBAw;4a1fdg1-z3=-OEiLVssL#NI$|@%J!I(wLGK;T79csC0z<9jkD&QG zW=$`hp!YrGx@x&UT<3&wU1#TspianjH`0H*F8QpCmblD@>>&J`%*F=*9_|@w=$%>! zlZ`6B(6Vm$U+(gvR3iGyiSx88&j>9v^Su-N)?0AWR^?6liFCH(8P4Ls`E-&>SWNa) z(jvTV0-*<8=H|-A*{d2|c~DQ2Sk74WOt3W25viILsmbt32EP%Y=#P+aSKDX?T_DBGo-`gR_h^Sn;sSKbKApxM%P37q9?j}&$%w!ViW#ERKY;TJ$CF0Z+_eSc&c9@Ed%57VhCD~yl?#}maIuh|~A zd;{QZ1RaV_xa2wpHYuNWLN2q>x}>Wa4ZitN{0Ov#Dr_egH-%h=n?vB34W$d7)*nCv z$80%ckK2p!*r&`Rk43Vp5w)9&Y2>`AxUea^Oiy)YkM6z^$c^teNShbwKuMv=a;aW+ zNAXy7?dn=uh*F>s8y~)Z7D(5BL;Q4UhZ|N2BT;IkEojr?hN+~d(^ zO~943WDeCwzQdL8SNid|Y|R29JW}o)WjgMVgWkGM)bX4eu>J zs`hfvCF>C2jwyJzN56W*;rJh68 z+|Tew(Sers=f1)N#v)NX+c2VZp4|{SOiSa@v}WgL>WWZhT%;%ULmf|8Go@*p`Zx`M zd8L0GzeJ|c{5{xd;jRlKTXv#enZ;3l<+A!ryORd8~{GW>?T$u5dTbcKqHq_Tf2g(D29G;0nb@2J$A)Ia-<|-3BxG5;T)u#Qi(X-PPJOC;^O0aF z8nM9wK*qErV*x6(p>37y9@T@XhB1%A%|b`Qr=feN8*2#T&J#Y zt(q*)HW)U`p#;tsCC@Y)N5pt;&5maRrl${H+)&n|&2OBXM!2I z0`fb-w|H?~hc{(D@=J>a{<6zhs0@x%J4jug)l&B*S(CSAO zXcdBOP}Wbp)A+b6%2dXdJDW_b%h4*iD37FO& z#|JLmrxP(}mjLR+SYIrNJx_F~%0t=c(0vpZ$-JXLJvsvE;dg@9CjgECU?3r82#xg3 z(-H&Yvk-szUkL*a`72@OfP3n#oS#Mf!dy(D{*^Fj=R3yfDH{*4`7|a(hMV;aTTu`z z{uM*}@?cEHY|&2?4Wy>tZUkc z$(syLIwHfFm+E%_j2V^I<{f2?Jc|8RbH=(q>bO-;DbxaHoIwyVfZYEJP4c24xPhuD z?z$}p7LEbu$2!Mv4gw<}R{-!^qCJ`+FxdoV2u$u`iSkkSX0?G8pd$k+qPYYi5Q=W> zi4Vkhe)$@Z>!mJcC1~#Wql$1G%GX5t;8sNKyMRAo@)iju-SH2#oNi@3-0iAOwlsE| zEJN_d%$hYQd>2ld_k^M*KEDQ7>j;iM=O^0%f`h^6h0u;AZ2&L;L_pPgmZ`A6;g5ve z@@NFoCyrc}dxS60NX9n+=;!ZTdemje*Nv&ds`r>mnh(WaQu6NDP@Xz!H9#|gb}h&B z;!A<_6%|)NPXTAgAkf$j=^q&b=-}@l?NFVv>bV2V!LP7hGJzPt3VwAA%kPW<0|SV< zb~@mEzwr~GIn3n4vuD@rHb2^x1BXIIRybUbs^QCAak&PSSy)0U>*wG3f^8!)N&xIJ zDd7xejy$dLo$zICgJQk%un`DFe)aZQn%Gcmm;M!wYG**90e(U=g>@ms2ce#csoDav z0PeUUP-S|ZU^79fO*9m#nHUx<`ap^V1YME9UEJtWM=*Q>C_o>z?*vDb*uBi1|HVSk zbdD9z#a^n90dgZS)EUC_!J7;XN5xJg0bmxSELQ3G)mE@>nSx{M2-_lfG{DU97yvIS z_=vY)k|}DUpj`h~Tltj{P`@`St#^hGkN>J@A7BaOF-VQ5>C46_2iW#m4}>9*!P<-< zFk??u+8~a{r0EV0=s?idH3_;Z}+s7xf2Lk~w zVi~Y_!GOM-ohz zJnH6+m|BCBYtRA#CKG){hCs*+A^mlyOOU|4JA^SEnzjMQ(dHj5-_`BsMb)j8)yP1c zw@(Utwq($QurRZI6imTp!Lxj!uB*ev}5m=yEzyhUaxAsNz@k#MH@C%@b(?A3I%bmbA$BNA$ z4G^>oL8&9c3Sf2;T$j|HQlyXzHNXVV$?edQ80uJ1{`%ay?=Qv_tK5Ot-@* zKz}u>@BI2YsUXSr{~B)G(Z#%W{D-#*jwsh<;@AKGzAE&=LsG0;21! zX4CahAnQZS!~%b51Kj`oarn2PSl(eE4TRHXH%N~FET{-Wseh9|(3|j-fi&{VLWna% zc8EcGGQ^4(-N!E2K{N-GF+Bh*;w~1@m#N5va$d#uav=UL*@FthK4^fQtiC=$3pusQ z!+&QJh6Tu*0|ClLFS>9B5d*4>v)NPt52B2axB*QRKlCwedjSlGyMVP%lmpdgFXXf_ z_uWWn8MOOfcBbzoC#V>dV`%P^8G!7VAUp+W4{#KVXlP7A{6ckX5kXoiL}SQ;AQmtS z{s{&tr<@}s#qvAQkD#sOyLga+w#15N2#GD&Cz*Dr$$-3|(Xs^0y$TUFx<1c#``qQAlmCt1jEo;`)y9MB=SKk63%xK5x|o2NZiyPWhQUr4N*b#}W|-V^0j&V? zKOF|l=Y#qG3l z!5uGX*tyLRieXw1kp?)`BlPxp2ZhOp%^_wHBX)3~gBde+d46IyC}%>>6$($$VIbtA z;*r6in*%OA{=tvu`PQT1Id9oHtiPpJ)koZ$$TrcSLpGro=|M}9NdCARGXc?2`!&_| z`rj9Mw>C3?(hX&tNEW0^LW~+CFbfxSgPV}c0ZQEi+qcj|5aI)F1#JL$9ty++N>RUl zaA-&<1+axC3xepAu*S~s%vt+4W_;u)CUU7)aoSs6OB=)iXHT&xiqObys_ zOS}22ok7wErk`P%rFO=VK4Cb2)F`aWad8owERmrAVliXG1-tTJjPt|Rb)oH_{IfgaflMv|j(`gb>w?}<)ONdX!H-f_@)&?EQ=$*JFX6Yc^|gS@#x zA6#n+K|dzEp5@ZG7WJ-twKl4<2vo5DZd00(yf@(S!%4)kX;ATbmhLcf`TZL|cqSce6o|7f%F zTN2eDAB|wjIxqzQ4;2vIoEKI)D0VTT5eArkiAFux$qduU2nIJF7ez*grnYcw2vaiXH%$J$1@hN{K~$Lrhggfd&!Sy&|?sxKFARN_yr_z zATxJEhWIk|%ALgXzW{v`G`bb8E|3k7D7Hagid8Ydz5uzfYY%jQx&>%z`C_f{MU3JK z{)vsDOrsev`bezyJ4ct-^?}LdtITG-Uis)A41BTzaM=_fb$%0)&;e8Mt}-$(k2<+m zn8L*u5KI@HF|`c9IYP?1iz3&q+U`q$UT?y7VKN=%$APS?pwpfzEH@yRZrd&*7wt6`BRXBCAwHE{_jm+I z$?69Ic}3K4C51%|JsR1+LOU{spce)X-qq{Osb9nhZG(G;pZGrr|7b=wl{;cymsk zeOY~OE^C*{2(mTNyo~bm8Vg{?FbbV5a1bzaBA@{gQUY-n`+<-Q!C@5Wtp5xKG-QmO zRaFDT=C37h;D7obpz&eb%ov`c_45=2akqsn%A@)fB-WB)I-1kYcWdI@5T-VHf53CTRRL= zh5^L_l zAQAJI=&^_?cC5&$%?RD?L9px>57cICn*FB6*p`(6eV$?pRI*wa7(yW|CxOIU;1>)< zQ~*ohz|co6%AJ+5vPCx#K*L7u*!kaQV8}@j`nru_pmS{# zrX0X;9XeGeI9; z_?``heuM!EB+5O##FBJGYV(GR~-4Rmy!4C)M{NMds7 z6lTzHPG|)A1vmzKSl%5WJs?Of!C#j%f$j%pBj~6z+K;uxx&g_8`6!qJA^^pHEC#xD z`A02bMjOm3M%9z}tClcBD74par4L+t!ZHP+>l#;xtYPyB@HuO9Aen&Dp2YVkTy+5V zQ;Vb_8^HXAkR$Q>0H=>(99#fl7cplC8V0!HQJIBG5vWqw!vjeNx+DA>YrtaGQQw~e zBP#|&eoUrmVjq7PxlDCd|SSqlNI}PlmjX zDWVb?Ac8^A3NznFP(oA#0!g5xQ^A`Tk1z?S;TYDG0r&~@KAw)>F$Fh+;B?S90l0IP zC3die@(9u~pxvP97ignqd04r$6wK7W=M2mZi5aIkMqG9v@a1`q;piFQ>T|_G0lK$3 zD|2}h4LZy1QjmSFON9`e;S=Zn5F9NR`il9S%VhcDDb|A2EW~k8%;1fC*T#P&N@2-% zDCk_+nU5Dx<|KC9!Hs5u$$4o=ki)pg#l0DQbVh4wp!ciEfg;)fA9a8jGx*>eMBRrV zzhQ9~6#FmS#mqjKq&@<f5l*S2^aDT=JP0kF?V4Z9To)gSD>4V4G{?XAYo7& zgcm57(&13g!1g#SZ2sQyxArqr#0iMv2s02(MTP+I04)P3>EHuz;8xQFz-WhlIZ!9aq_-el3DX+E<;3aUJV^cp;~BWG16tqd49xWl2781|z!loIe>Z?w zaPI-;@S{t)qM&u`)zdHZ1vRzB2Qs|7Xpw$wDHT`?QlO%Ort>epELDL3*Ch^5a{Ryz zMWxn&b`_*N4a7(eLqi#v#oN%|-B2HB7vN_(|F69_52v#2!p4)slk_xT;i_y70x9&hif z?Y{SYUDsOYI?r>hO$B+^ul-h%rY{_>5CaZzh9_3~g$n z_XAT(dy$omoda!!x&i-H7zeYab&uKWoP5c(6;*{b z4akM&$1d~=vvjr$MzX^^px)FnXe)-ibYVF0BZ7ixHnS#eJCu>Be6 zc;Zos_SRpk%|-(!1x_%&to^5-09BN@DN+#yPB39OW50cHifs%G0XGJk&0xJL3%!Y_W@&;y`-~gLz;M1&JPv=@GaiIyzkuO7+so_ixa31Pmt5TO*w=~9<(L;332zEq zJ>@XE8>Q3bj@7y169u(jB)>jjNIi2*NJ-LGt_T#ObGao4Je-6(%5NdFHZRYVeAFm< zvXK^PrY#;#)>CUol-h<|9V8J=G{Im#kVi$*Jcp-lDvi&h_l2nM2N|BD|~<6;W9ldh%xO z3=c6aL3X;odrJ!QrKQHc&IzCR&Dve=G-XHljdAxShNdRZJYKUDwBdW|%p4M8S}A)H zI9+?!_3K27(Nom>waQ9jDmQ*2^r5ZFY5M(bGrzu!Y1cSU8?6Z1za8ow_y+#Q*^`?=!?9*ze$x!am2{l91 zXy~1!E~ZzuhW=Ra$L1&m_u{9_AmXoF^+eH7oRrrHWeYvUtC(?Ji@QkCnqK)+XD4r* zfMt3-sndE*Ted2^-R-fcae)hO@&;HwIOiIngVKwB);<=+(D7$TLEErSBcNm%M8zZL zghDqFdR+-K)XG9C#(^d+gmE1>;g*4MgDVBhQ1i)YU@ujoUY*)iFw1Qa;_0G8f>4{J zWWA{3fQ}#v;o8AQQwZTOR=D(rCG|^o_3s0b&Og~Gyzn{6AP3UrWFdKVFM3Dcew}3= zun)pX5#kWMyhD&tkW2HJFY%jY>cZZvD3daFNZ3rj`LNH|nAkIgU=-lO3pIl!^Wi)y zq|AOTUC8B)Kf_~Nl>y#6>F{7*W4KB6bGH~0aknIKYy1$jF}rcK2!DH4LDuha6m*h{7Rg5I zMDXJ+-hiU?j1~2Z%dg`@n8ojzJaly5Q9VoQUD1=Tv}JV_mFjD=-> zvMxioCLf0ns$y@fnBdTwqmBtek)*4Aum+D)V|E-&Abpc^_^*^oN^O!S4m08bb4xyc(ei00vVnOD zpK8AVg#P0RQ>>6HlRkNx_t0)eD_k<8N-S9GoeS9w+fph%C;)K=j~^MQHK!|hjPu}I zZZiZWu?51l%%i;zM?3R&1RN%-<_X$Z?;_LHn1QV$Ia{mF5db~H2Yz~(*Y4JARpUm} zxK@(=p=3xj>oo`821pvCB?e{f61+9ed{Z$d{)!3S6P?8>?xf%Lp4;q@E?UdIe5G0f z?`Oa{2jY~uN^qdzgoRCZXK6&1jvF{6h^?a^G&jzCxl#c&s*Be_CZK>YEtZ}?j{2!qZd0GAQ8DSx_K!^#B z9|~qoG7{N|;`yW!P48pA9a(vNCdt|(8*yazOBw$L78C~F^0k9&^5GJwZohE@q3+xB zpF_G6Li`xG9PM#zBSSrcu&fO`GgILvOX1@?#6CutwJNux@^Ol~bfM`2xr4#(UQmwv zw{uTK7VImvNDlad&Y(Ma0fbScibKMui)MvtyB+20ZZo8!QAI6RkDD{3a%I874-zbV zRZ*0WkO)sFeI$#VLrRx z=kIis*XD^2_N^Hg7*O@-NiL9F!hA8c{os$)PbfDZml(g9d|^mwu)gueJ&bi}1Vg14 za=Q`Ao?;;H0WO#2TqGtlWOY?HT2c=s|8qoFi9P@JJv;8zpjaU`47% zf5_$VZ)rfdH`#<}-%jS^PBCs=kTSkJo%F0t)9k%-DC6C2#9F|>2C(fD2+~MqCl{!m zP$`07`zmsnd>SKk51=KAISU2zp@(Iq9o0CN7o#2+E;WO*YBO>&CVq-)yxl zbR1bG{T`{|sDv0o@E#`n0>8*5T?L-=;0P6p*R!U~lud7RcL_t$F5Apdejs0~w?5Kn zH)T%Z5C4rPQ<=;P9-Y{x$1NM~F^d*HO=qee(4Rp{0or#F<8?PFL@gaqRW2g4Rs@O- zZXJq~;JY>UX(aZpzDVh$&l?`&-4wk~&Y|de3vh9|NS!mw`7rko`{n8ws8F2?CMZC@ zUgP4mJe@X6vyaSLw`W3ibJ-8T#pUeP#-AIVL!kZo3+1k2@W_!t)5|M6S8Hh?%B7eMub`k|{(!Csw* z56l2*Iz??>E@g(RFJrYiqv?(%)u9AYXF0WV8555*m%dCmi!FiABuivMW>K1ygefO z{M@$)Ccj?oyeA%Ub?$#@2eL99h`OygUyv`c@+u%8Jg@rpUzmwr*_=Ixg^eK+pwbYG zZF9nxg5T*z>}GJ7SeC}(JkvWhqO1CKIuLr=k;})iJc#opD0Jtzcx(1o0y>GqQN-!% zajJ@_mi6CalU2K10IoTNHbJqx+M`5evG!UX_LipiD>y5XdG7gaV2ZvpCnolqAkgRM}pEiTD6?lb9CD7su!qQ7*me zjizhw()XuqD~syb3(VtPI;nk)pbXH#G~J<))GjuH4pyUs>>D@e&E{yc z2T6Hky$12F@&Fki+B8&&nx&pYf+mV%-Z_W~54`;^@bRLpLh1(%^6vYclisN=i`s5) z>xHw$y1)VpJP1G+Rv=_}FAFW1Y_)U2d1_h5-g~bJPGYML05fp@oGn8VW z3gL>a0tUsQgVO(3=Ob8#ZaCzOS?T1anHXQ0`TAYvr~ZpV7gi|WwK}Tc_ zk{g=J?nF@qa_x8(?F)E8IQBYV{WF1Lj=+^rl7!sY4;&6TA?PHs!MWgn!bLDD54KmS z-lCdNrnMBwhlGp{34KvyU%SkMUUz<5_oHCoCr7DQ1(~ugk=6f?je<4;K}3g+UA5oWIf^6 zqE)_H0>eWj`7EF%;>cGDl1^*yejKX~EE)d!PnL{sS@S$j(yWqWPO%!>M%g>yuBDwQ zWWZhaI>+lEyJR6mtV zyWtHx59DG#5T5rVz?$H#~eHZt}EL-zCj=K*qohX^RWAuDfV@1HVNHwY+j70@uj|T;9z9dyQugF z;^I$bK?7M@jGreI;9=%0J_|w|e1yzM&__NgsE8+$P;v}m;Jrg|zDz(yraVu?NvMTL z7VsN=*Y$?L=Hw!oT(TFk{$W;G+RvM++O>$l7|$TNo*7{enNGB-DyxvGFuwvf1=`lS zh7DV$ZSMmp*bB%M^D&*6myA(*!-e}io&Z5U>b&?wYZPNMC~Ef))MDELZQwJBk$KOKRln9vYw@4dw4G>ARIZV=CCh@i#+lP*-OK^fd>pQE+tl>oA7t%)- z2_Q0Bo~6h#Bn3_e6WYZb8-0lOZHKJ_%#ieg2mPa1k?R(`c#fQ1^n@PNv;cYJMP7Jw zB;m3{0;<=Tn-b>;?wObABZ7({HyIcCGC5|!5dx)fMN#-!3aFOzDD4YmTf~6(oklgc zp90{F3IW#5%x6VMp#}D+LC&1Z8cyI6DXsy*iIE;ZEm9cBKM~-VyJAg+dqb&!&jGsmsSi+GsN9U03uQk?MPODSc05&S$E*arn4XlaDc=> zb^hc*$NtS2@+i(li;$rLRzGtCCg&3%51xXmG9-xo`$PAzXDj(Us~YV>F5!YpA}er) zaG|Y3zPO@rBn21{@IX`%9b#xiV4;VokZ2G+iO7zlYN51WSsIoLaLOhVqv%mkWkyZ~ z(^MxyTv`L1IfD4#%|#%Oy)w*&&V#3i5Dm^0_OBgV7D_sf%#E-4?OY8*^dpNr9Z5dC zsqK--NLojjWKb?g>t<4FyvpJwD(EM9h=QI1PlO8kKD9kVJ?f1#kdRC|_lHY7DCyO& zvl5Bs+Oemh8v!sS^M9LH=n|xApc>h+eE^4;r&!TCXC^>Eh65qN+(~63ZxvV-xX>gm zKVwbT9s)iL4}>?a(RA|k6|1n0NWy02mCeAODDw0?f$8&ZMZ0rwn-j1stkkiJeFj!5 z<~#CCgnSjn8gOI2~<`rV+a&j`sx|6tH=xexkj+a`8<>pqP>udh>rIW z#MR0yummU2k!cc#06X-xm;3UiAoNL)mY_coa6gbH1UDGjLuJb|DbI?b2Y_J(34=mQ z=|cj=iY+i`1y%xXnxLJVG2W5m0R(E9f#%C=nshx
  • +Q?PIA?0+D9Lh zV=}6|=p=Pa#BXB~p!hi9n-TghkUPQ_-{B;%FRakxv<1uI0r2_&$BMyN=JE$e-Z}*M zFRF$D(|5~>4hRT$!dQhY9%t5#Z?S!bVD|G15367W9x{j7AQ_zFLIn`ODMKjm9~r=K z4Lybgg$X>;J(8cU9bRyq^=u_RxRiTcpLZOo_L=&ooOe+5b5(@p@F#%9I@P#T`+V%W~@?_afA$S zPOJMJHTzLhhQL&S1>BJ!4ADnntjtaG7M~=;#uBWS&{U{-hr{q3L=|o=Ahr0bwLsht z{4NwsIfTEYjHE^lvX_WPTkhFx5nXJBQ@avCK#Y z+-MRTibX2Yi|>{cTsUQ~e1APgB~FcGngQ<+fKBxvt> z-uruc1Cy7=f%O6A+{d$70X(|1=UvWP&3g+t7X`IKa7n?EJ7pETw#|6;s1InDIR8Nk z--=|u744DW4a=L^C;p^7LadmqjV(&!<=Bn2sC%bDez@m z&R^EBa{>*##E`b?Le*e6D$gB)%{K^2wprr)cJ3-p z@aOEtpA{o6{E|IesTNt4OeR+mSOR3a+ohm(Z*0@JJ2X*o;}r~EL>}Aq93VMp%2j!q z0%nA<{1NCh6_stUvOfjB#5-HXiKw=*@3;WC++E7YbV|i*MKy^<#&Tb4kA$V*j-Nt{ zna1^ZQJ^q~$H<6;30-widVB3f(9a&LW z58NIjxHaapwLEc_BF20~(b5fl>^)ITAzJHT{+!8QR0 zm}w}dwyPnB=DHSxf(^22V7izigYV9V%uVDfXX++J;V!tKK5U(sU>g<=h+d-Rl-+fc zUUIC<)hf;*fqNy`rN|$;yeF&r4SblSZ$X2^2Im|-HCToizPt~0p%tEz(%Su*BvbtB zR%8Pp)y3@lx@XMrMDcZ|xaXY<{6s?!_ggm84hGT;rO<0u1L z0v9xPJQPMt}s z!+fSt#=wp&=DGz$zSvS7^9`urOJDse?rF~05k)s5THO=#K-8E0SPk8Ju{8`4DB;*G zKw-!a&6Y#FAT@c>V<1J1_lj_roPM{!LBXK=ousxhKoCNZAdaT=IJWJPv>VdW=Kzp# zQo-?HDUN6+z^5sKUB}}GF|)%xZ2y-4pfj)RgAl?Ue(0NfU7G1%Bf%i~9C5ny+PHB} zRJKOZa6ubW#ah@alR@-`b9=Q=DMAKARaKVKAOg2cpav+$kSFl=yk~0Ti#5xdNe2eD zTGCVe@st2iZWLpEtDhjh9C=mVN665l10$a5k&G>8_2Mgp#^yk7o@RJLVb1cHM)(_ATef!)a!^&v0U@gd9jJdCza_1f=Y z-Bva))$|I)0W=cu>wpyD-z1>@{(!4v)3^A(CGKF;_)X|t!Q=o64iic^+tMG0`=HJ* z8mcM#b(q*8MEVH&zQ<#1>Dsu7*+~ZYL*6O);;66q@du)7aGXJi$V|-x)d^?0bNyx+R@olT0 zV1`4`IiSpvkFb_QsDR*(X>&Usf8JfTsBlqfPzXTtL(){tmCVjG$@!c#Mt*dfTs z#nvL1bRZhH8H<9d1~U#&3A&(Pg~9G5j59D5AH5}6t3}yP%LE#w^ZQnpAhwNYAy#!o}CVC5GR0#BC;oo_UUls)_{J6c%1rGnW*n%2ek!G?whBP(~gg*D|OR$@< z^*<#86Ad^-%ed`!m!!#{tpVH)g8G!Mi{zH|DJ*`>__Sb<3wfcAVAX7r2_K&qi3(3O z^un0^1g2X!qlz%3LK!5OD&hW*qQMyqCU|yaq(>Z$0w7&PxaP!@Fx4wz-YnP&wFN0j zR9|Q2V{pqL#+I2z@J`^2!QV`f@qb(b0D`Vz##v)5GRmnEc*FsNL@OG!LhS++>_Cc9 z6@ddEB1TluF?pj{0j3|MaYv_Sruhf;>WFNOTyntR=GIpzv0bP^YP1Wo2s9Z+Y?=VKzlOjFG(nR(;5NBcNFZ~T*OZuI%Y=X;$5Qyl zpf_LD*EubC`q0sv4uIj$mcUBS_j0jELreS6pQduGa z>K7&v-2SkHJNANo1Dz9!n()EekAY7fBo~Z+Syk3NZnts~kzZ(RD&uXEpSJOF@-*XPtE8gkvuGw{F=H^3mn>`PbdYF zs%yil6xsb#4o@8E#5Q4snT^-$9!Nmw*uiu8NV!BKXE_&10>U0nMUF)4n&>4*>>n=$ zKbkT}^Ch@bKz6y^X;nVml3%MJJtg2h`7u?lf}lhOQfSL%f+YKx2pEO>O#&50or*$e zzqf8bLTmleNK>DBVRfuRtDtuHodejz-N84#cs$3d%6^QypRM4&)gq}0&hSk}X3q^< z;QPt&*(~mhhzvI_;AlX6iJ^>o5-U0)!771whoLy@U*r{EFTVwOXNI+Tt0nJwPRvV8;~A3dP`7PcG$J53frgw{e9;5rkAd#G5Tz z2SRsje%f+gt_EiWPeOpHf-8=>$YH{%71A?v^11|V1UzBY06Bvvx`@{GbsiX0_1Sw) zLhyCRUSLYVin_3cX(eOr{tm{`tk<+=NIHTES)_;|yh^S#P$6azka)up^eVDxfK{UX zK8eNvU}hG~7Q%_4X%D*;%&hQ#r9XZYd|NM5M=(nXCy7Y<2H0t$4GB^lI%V$zNN@4% z0D49b48!TFPzYz5mk4#tnW$q7Cjjljy9k>c+sSp$UtmvP0>un5t=A4#7aky{X=A@m z8|Nk5RS1tk;sHw-R8{es5R*gj$8 zK#xGT?kTEYGc3b&e^q*P3FsiA>7D2R91R3>Q32tW?l}TO1VkHf3?$3jtIuGqJ|j2H zMHCT*$Lm1@CWtq?5Hp9FKu}VWoS8NSxU-YcrGE}GurUpfAN*b1SP_4=#IURP!dGrRy#6LT$djl7a)YtJ;#C=3aWO?%TrW>OexR^ z2gf)f!Xuvs7!!IyRMP=v~xAq@!D9?StLJVkCf7@nw>p=~>iTc9wSFyq$1EF*zD&q+@Sf zRW>nb44I2y7$po+vOpBa#PKxn%u_<3j<15DzMVYGatPeiRAAi4{gME&FFc;aL@gI; zm1AQTQUUrsFc?HZ%?W5(J;XEE_(Dcp)7eYV6!L%;8y<2bm`%))MW;27v6(e2Q965^!&S{HF!tY=PT zh0X&ohc8^YrGqB*XUchJM=vBv=rPQIiJNAtN%DJkfYSwYP5l(NCg$KW^LQk^5R*b~ zJ5U6i({@yIoVls8Tf)mAo|k%pUjh)>u@@FyQxW>YgR zZX8gs>;;lgKX5w+%?N?G0L(+G3d~S|5g6Gwb6yBg(FasF=RQounlp9f48nZ1WFia@ zs5;~4TV$aFB*inXc#kP4m;TSFN^A(q5V&wGoHtp8O>(u88g9{_QtfXWf3sUYPvRT6tcHU5z}v; zd&A1j7BkHed|IGQjNP)(2R({}X@n$ez=D*J-AJVa_Y`WQu+sy(=Tw3VK)D9;35eo9 z==vEr`~|Yar2Jna=D_)pV%A=S`8oc02r*j&GU>XBiRxA&a4batoT1~y91SLV+!)hP z?{rP|?lb)`&+>b;2w@t!BPtLOPpFrSu@gxgnEWM_53|{Vf(5M9MrY84*nq&+54JrJ z3h1MeM3|imWdj|S=m2U75?4Qz7(oX9I?`j#H#YAFlJ;n3djmJ)y4Vb-GVNA_nW0F1 z7_r1EoQCI1JoZmg$Uj|pM{1Rf)f;o=XuTH?hTU09zi4UTvVL)o^&`P`J~H##*6XiT z67G>#KlGkIH?qFc-M?*n)txh6gFa_*ty*_lUMAhe($dm;Z;qtvMBkLItBb9pbzgUT zTU)SmM*<}?%gJ$|d8qiSuI?49>A+|~x=Pyq*DE`!MP0~KT{O<|p&KO1*k?Awoatd& zv2508!9b^A*mT!eC#^WaWo)QF*Uta{ukJO?x+diXS= zhbGcUF0Oq;X(ZW^=4w~V#C0;{HBI9bC zGZC7VIniFO(Lr)KolmwLE$Zv)>hF5(Nuv!UD7E)cf07cmKX$d6KFYCv(r8*3_HW>G zY_)EV)b#hh@%6IleG|Kf8Vow+S+2v&cJL?JaEw`ZaI+{X<*ddD(Ti z<-TanM1S)1s`b<31J$JI^72V4eY&fS=1FsweKXSD*b$geOr6NLpQbfTPxX>0<6-ov z&Nn%Z3=Re(l4D)(bYE)=8}+{BzH_Tbb!F<`!8{8}VD5@>nY;>^Gc|AGNoGvYSMJmVs z+hg7l7?l5UQZ_2iE_4jEXZXK--Z{dN1(U51;Rhen4ubaSrQ**cO( zC)#fnZ`YMgzcMw^_S%!Jnv_teTSigOaT)sFG)^aRq_QOx>r%Fe+OBFXy^4z-5;IYHPS;nTD(4Iyv}~waC*`7 zxc&5%x;lH;D-8Gzr6Y8gpRJ`FN*WBm{`K-YG2>IN{{9z^ZxIfNs&Y*iExaElb7gRF zIF4fPH1easPyNrH|}pyYJIv_{{JTWz8(Y;DUY z3?~+i4i1xAs9A&2X=PzkkDkenPRot?)(&yxop+s#`C5B?y-a400hw(|tOr*66paztlQU(#~H-7A={6_1$;&NB*`v%`ZfFG#eSR$}+ATFs}QP-(dD|ubqk>joWW9nZcM3%=DJfGZPIFPIENcq&(>#tGf&C$O^ z*4b)v^gK?PLgVDEYbk3Tnj|&8@V@M_@V7|}8WYdY$rKLUK@<5n9Lf4R!d9sF^D`TR z$niU+(G$z0-RhM)o%6hw|6Il$x~e;x_1(9_gQDFb`X7|^GAv= zIOral>^^|C&V?+OJ@9@}tZjzFd2 z+X!`NGLys@tM#Y3wbx z?(*IqjXk3CDSXX$o~0z&*^jC$DAR-0vLma$^0#~*zLEE|)=en0k6&wdlCZ4Y4Uxt4 zJ{YsP-6O=vzw-5W`OAJk#3o9Q{LIx+x7qN8yZnS5 z*RJB^`Z~S2^XRiZ?Dbq{zjLv1J@t`gUE*67x8wH=hPBs?8d=Zwb~&NzwNEbc=(Ws_ zj1l*~K|{S;*NQ(C_upXDihkMNzN$G|>_CRsdvO_3O<{}0ewN1y9TmdI4sWDenvc#_ z9Zaa;zMWdWl5DuhC$~vAHt+tV@a&K+vp2114r{g;Js=iJyBoH|Y~;uJ6TEdHCE1Z^d*kzqUnXp!8}~_{)R)7M&=(b9$q6^m-Hi ztJcCR&xS_2ANp)De3?zD(xKqmu|ECNYR7~|_I=NcUJ;d`7Gh)2Ku#ERyuvCh>1bLf{T4u#uC}DkHnqp&63u% z@&{R*x7H`z^!o61Kni z@9x(6OMgh6WwzCGeSfh30(1M^)3Yi~Sl0C@I*Wf-{>DizUc2?n0g1!c8xuLhWd(Zd zwyjKHPtfw?K|b8%*gm0oA^T-Xzo*)H!h=S+Te?Zmg5l@4c< zmzkv0xa~Z2u;0PF(yIT#meZ^5T+Y{vS*h+bcZb)u9T`{Mo7@F!`$M08e;B1uCcR7H zTDw}Guk@|q!FhSKitS^9Z&;SvRa8A$a(HFp*Hv?3N?M(*MH+aH58VljDtNerQoXZi z!v`M2w^yk=^ZR{gU0mHYaqF&){KmPQ5pp{$#d2zbP1!DGNDb$98^+OhaqM~~D5wx( zyZH8}k1j8y9jwGyoeKB9_LXjp?)X%FXMsYs$kDYETNVV86-qc?3eYPY7xkozbW)b* zwS=ZTF)n#7aL&-6FXpyG%FfuOhh)8vx?Pq|C0o;jc7~+1^qcWN0@7mdh?R%O8=|>%1R5zG1bP#lg9q zE4;Y6>d*QcrAIye6y4S7S^D0lw$meg7OghmL#b%%voBZgXdDlG$y2TEz3TBBnK_c5 zSyx8h6Yri{YJNcPLYGNzrdh;X+k-pW^t37WdANV-`ZR*(!)w{D6 z`id{!ziXe>(udjKA0;n{ALM15JLbA!q4}e1HOE44%PIb-sO&bDf=}lI&K!>2dv4y6 zi%Q%BthUE|yi=zQa_`j4vSAb3tjK-o+MAeH>lU4w$IUaZsVj5yCH_Zi+iR8`mr1&? zo>xroa9fz)N3QTpKko;J48KL)zqFf8>x0dM=G^9`JT}`KOb;wv_e^=M45M}LtCEAs zYgum&JI8b^8(reQv;Jez6CbS~4exgrUbVkqvg6cZw!2$z_oPktFB`YIJonz2`bRg$ z&VMtrbXoB*a$QZ{`8wI7k1m__(Ve}{Y40u>yQT1L*}lWAFWMgL*H)Y^-#NENQPK9D z^-%G4o%*AVxnF|o;rG4gPUf?Jw3$6RFa5P}PXvX-rZoF?pV})Y+JSt*+tX@V|J(}I zx%Id|WO4PvhN7F1F`DJxap!hwY&f@3kKOLj!!>ozJ~y@Q%ZV@k^v%tu!11$#1gGxJ zkG?FO@ZZ$j$?uysDEBxd_O39}aNj2AdiF#4a*0n09`oZ@v2Lslr%5F{bssdFe#sv< z`so6RwI?f6`8qpqc)6DJwVD8K$zrR#Sk?Yz!B*ds*PqqD5%`31!!i4NYnc;O=7ucESy;a(1gi|o4~ z(amSAt*`H~eikk-xjgk+1U2>itM{^9%d($@&Wiu3sK+MyKy~-VbpEL|F%z=?$q64B z9*H_Ki-qOxY!;T~Ec0jSkuIIEB3W3AUb3~eA(1-t@+f z74CGlaSosHiV?1q82NkVZaY(5-o+mlOO^Azt@y@2ahl>swyCbm-OfRm zwv2q*J@@{#JqO=D$y#PsoVN39f)WqQp%+1ELpm0`H7J;3r&uWPWhb!L9GU|GdY#KCAQO zBzKKRd%dc;di23+m5Adb1wS5k)$wF;iVA)_v@Y3m$1U!pT|83Z94D_n2(58k6_vYs zhxVA831FrJVm+Y5k#)jkC{l8tf?H;W@iE zO{}PI?a}JJFFIY|cLW_1T3zwniX3)!e)I|5e|}tS{gC`={MgrfQr2%u<3m=~$^Iq(B}vR`ygjZ%WHm$hE&D6{NLKp)FZg~Z+?7+GRX^-lnzgZy z!<+uRWs|&`Uliw)$1yjbaNQ10OpD{Q+g3-Ol=do*iaSuBwXdbLyF0))`{h#+9%0@+ zNAw;%nZLp`{Y30etuN7i^X02f<{CE$@jPWcEB4%+q!hKNipN3x-n^DM-#!U%(cU3_ z#I(caTB5$`gNh~l4>?-Y@F<3g7A-U_q;xK{2-;+S_WIKhDG%*;XBi$pgbFl8pG!n7 znH};^%)#qc+`hBk8OF12>x+v=U)`?bkookomP!LOHe*EkD1HJhic?oPV!VO(&8 zJUqyIx)-k_`H6|eeB(`T~6M#>7OUWE*zz-{22F*gLSW6 z_DNCo)iKW5ugZ^K6zhpk>KAeg-I4S@m0>jL`nqlLE5nCXKYLfcZs-<_YB*t27-|rG zk9LVx-7{G2CL3$0akp}wse)|f>5M{MUZXbB$zeZPwnkaKu+EnGI%S$c-4g4@@7~~! zTj!OrF1)DKb+=jk+)M2NXIu7VcAwjBA2V=9&~ue9-<+FQmoA+xcVPbfS$rFQe{s!n z{(hGKI)8!sNT)nFe=SxPmZg6J*FP2({|~od%b0&ce2dL1b}Y@KD`XvNb*}CV;7_(X zrzR4^wp7@x_KoG{H|lHmB{diYE+2ez@k+s&=aFc+RC~#L697(oy`W{s-^f zL&?I!gri?ts|w6eZl+PS-8$Hs?N|9A+|e76Ur*t(CATS{9$H)&vY$FWzGc44 z7`12R^k>p!HdTfP&Wx>VV#VeY`Kk&KF&X~VXd{&NH93F(Sfn$hc28Vfqk=Pi-2c1gMO8EtA@xB{R`$H z*7)x~+J{I0gyuH7XB;i`t5js8IJ8{dIjRB$Td|{$*>??db1+ zU#Rpv>Yp*V;3#|>?_U>o!m|Jh6W7|4tV}PGNT%q$|MNa8%lQl*z?+ZGVPQcC|NGBI za7f`kf8OEW58=E^VOif?7M4wGSyseTiMY6E`hr0Rq4gO}Nf8OA8)SowC^3#7`{%>CJ y`vy0k;}!g$u!Mi#^zUNx`<5&$H)H>JCT8h5p*$B(l7(dn{3j05i+{uq9xw| literal 45673 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%0AtJkynKDVw^qTIomKcf7n`I8EN-u2v3O%o3olI5c zt_WkM))$6le(W!-8hc`$FINyUQsUux5Lppuxm<6)Ip`y?i%(zer5R^Hbc5!lG7QU%Vl?Pn+BtYVq)yF&Q|oTE_sPl1!LsCN z=F!o7st@j~9d~(K6AyAGvTP4`w}ZC(_eBa19exfay%OP`j`2U*_Q7>`{EDg7a z_H)y7B9TJqXexE0*4f}0AHksNq%OfjBi$zFk3sxiZ)G?ZBB$?dSQCt);VYa(e?9uT zqU+Ro2V4Ivtl`FrO>_Di{0v`b+bFv}u29EVK3v$B#WVeo&!5r7&w2f;|AO4Qr9DAV zX96SP1^ZLUx~dZ*{w2L-jQS7mJyiLIp~<~@T@wEmErp)BpT#;(^NYSQ28qoj;%|(c z0X|~Kl1d#i^^`hfmu2im#?kPospsZZmr;@7uNHvx;^%cSaOb3 ztXs)4h9urTZkKmDc`ea8*b-cLewec6Ls{VX2 zI$hjM8lE^j?Pfk-0@&XWv+vuBHZM<#_R?Ob9_u3xc(@xIigi=yF~|E3yHBobL@RfSbU&+9f7yLG^W91B zS+FZ9ZFsj0ZTlHomH;W=c2UyHx9r%}2eH-Fynje$5i9FdoRrs=LjR~roL9eCwv@(* zUf3p1gewu>f74UaM$)qTT0f&eSPm&#K!D^KgOCC&?b{TI7jOwK2aZ%%;BfY;hoAv$ijKb_4ylv?q83F9`!e3(W&2If|c4h2Bgv zYa+m_Cx5JS{?V)gH;zXE1}U!3`<|gf)+_Y`-&n7@v|ng`qw;g8PMj<8#`|}kb%{f% zVKZkuh@P@aPJTF{XGyIlUoAjwIaN+q#CG)ZLWaOf&aIbRKK*tQEhl0%h$1>w-_!M_ z3v8HuJ2h)2Vr03HbIzGo`N5IxkZ`ryxgO@Um?8O~I}$@YVc(WmH~jBt;Sc4>W^0?% zYBt-Jq7RFukmWWq-`T}R7vsFLB+sp&StZ-xQ9PetVKV=oT1jX!;p;oYpsP+(cUVPR zDSPfJQxh-A$LwvCNmO_FI@>=Jx@*ZUlpNotR6i!+@t`j%kteg{gz5}?(i{BAwph9} z^9k1X=UX_+-3pX!M+GvMiLCFuQ|`W|^G@eUWs`WWRt2uNH-=uHf`#dIOA*P;%>%NL z8f#-h_LpDTx2CUN>d1|*;?Wr&A(H!?px|^z-?k|z&FCB* zwNKuwhF5i#*fOqnTb{kWs{VNOTGO{aJerYWgQbpIw@o#vlBq66m0m9nc~&C)rl^pJ zZ9Dbt>D9ySH%THQ2b;g5-dv&*sjb$kakSc8KHNO;xg_Fp*f1J*^i$OSXyeD+$Z(5& zlDot1`sC)X(YV?%_v-!O)uZ{Nz3&{j_Ye2BGY<}0jPo1j-&k01tvUL3 zI8ga!Lg=Tb8@9jYJ(>ni&6Sy1!FYjkt>nx%?PAu)nl=G`u~rryo%LXrQutb{7}dy(;oZ zTh67AeS5RAXSe5Yr!pz7B6VYZa^Ai6Xnmb;_mcL|oALOvIOElEQMbL#U+yK1@Azun z9b8=YY`XZ3jy{Qtx;gHx9`v+Ktn9Js9DN=xi2V|`RW{GZF;TK{WbZ3@c$0AFr;OIm zTHV>Px9W$}9mSWvySwaWzIs*bxVHz6U)J_i4+J?Ts@#5U3~l@v`qq3jdh}~8s^gcB z=uex768GYFBRaRXR&d=btB-!vdnfTADg=zHO`0gWkwU)&2OBgmNvuRK5Djz zerwun*7N9y;x?8J1skxumbBJ;H4frjgkOtVy~Ba^5B zzLlwO`SVB7!#TX3)AuS4mkuj1?unwi4Vz7j<0h!@~0Tc(boFx-9^8}xL zU-EwPc=VOX;#2Q576c=LMtF8y^UYWQ3qJKmXku~54A zdA!^s+Uo^zZI&H}giDM6?FXL|lzOf52`Gi}Y_@Lna-QiH#*Ok8_ zmn|GKM|g@vXd3)tlG#GQJ<6fX7jw!pQ7h_`ETfw9M-GQi+H_~@r^l^Rs72PU$S^eC za(j~QVT$_;{kCg>gqXv3ZAGF+##(wmYLNqd)(dLRKR6tIf*~F!3gel4i9du&;3?dI zBX}P?$1Rj5I?eb%KpC(485mIU{F5yD(9aJiZ$1cN!i@X?rieW$M<7;${x;%l4yh-4 z_XiqfysGE35@I$Ok#rslxDUYuPchH2c}S*EN1yKS^LRwaCUd%vsZpKgQNDn8s=WKh z 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 : ExcelWellRelatedParser : ExcelWellRelatedParser Date: Mon, 15 Apr 2024 08:38:41 +0300 Subject: [PATCH 082/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=D0=B0=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=BA=D0=B8=D1=85=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B5?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs index 900e181c..944dabd5 100644 --- a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs @@ -142,11 +142,9 @@ namespace AsbCloudInfrastructure.Repository if (ids.Length != existingEntitiesCount) throw new ArgumentInvalidException(nameof(dtos), "Все записи должны существовать в БД"); - var entities = dtos.Select(Convert); - 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; + var entities = dbContext.Set().Where(e => ids.Contains(e.Id)); + dbContext.Set().UpdateRange(entities); + return await dbContext.SaveChangesAsync(token); } /// From 5f30d95d60f99db7882e47c1604407ff6de1d22c Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 15 Apr 2024 10:42:01 +0500 Subject: [PATCH 083/132] =?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 --- AsbCloudDb/Model/WellOperationCategory.cs | 4 ++-- .../Repository/WellOperationCategoryRepository.cs | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/AsbCloudDb/Model/WellOperationCategory.cs b/AsbCloudDb/Model/WellOperationCategory.cs index 4b73de9b..376e8863 100644 --- a/AsbCloudDb/Model/WellOperationCategory.cs +++ b/AsbCloudDb/Model/WellOperationCategory.cs @@ -285,8 +285,8 @@ namespace AsbCloudDb.Model public static WellOperationCategory[] WorkCategories { get; } = new WellOperationCategory[]{ new () {Id = IdBhaDisassembly, IdParent = 4000, Name = "Разборка КНБК", KeyValueName = "dT", KeyValueUnits = "мин" }, new () {Id = IdBhaAssembly, IdParent = 4000, Name = "Сборка КНБК", KeyValueName = "dT", KeyValueUnits = "мин" }, - new () {Id = IdSlide, IdParent = 4001, Name = "Бурение слайдом", KeyValueName = "МСП", KeyValueUnits = "м/ч" }, - new () {Id = IdRotor, IdParent = 4001, Name = "Бурение ротором", KeyValueName = "МСП", KeyValueUnits = "м/ч" }, + new () {Id = IdSlide, IsHidden = true, IdParent = 4001, Name = "Бурение слайдом", KeyValueName = "МСП", KeyValueUnits = "м/ч" }, + new () {Id = IdRotor, IsHidden = true, IdParent = 4001, Name = "Бурение ротором", KeyValueName = "МСП", KeyValueUnits = "м/ч" }, 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 = "мин" }, diff --git a/AsbCloudInfrastructure/Repository/WellOperationCategoryRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationCategoryRepository.cs index 49d146bd..d171dc46 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationCategoryRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationCategoryRepository.cs @@ -24,7 +24,8 @@ public class WellOperationCategoryRepository : IWellOperationCategoryRepository var categories = memoryCache .GetOrCreateBasic(db.Set()); - categories = categories.Where(o => includeHidden ? true : o.IsHidden == false); + if (!includeHidden) + categories = categories.Where(o => o.IsHidden == false); if (!includeParents) { From beb0d08ff5615d2761d3e2e41e8e0a14801024b1 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 15 Apr 2024 11:24:08 +0500 Subject: [PATCH 084/132] fix PeriodicBackgroundWorkerTest.Enqueue_Continues_AfterExceptions --- .../Background/PeriodicBackgroundWorkerTest.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/AsbCloudWebApi.Tests/Background/PeriodicBackgroundWorkerTest.cs b/AsbCloudWebApi.Tests/Background/PeriodicBackgroundWorkerTest.cs index 2701c26e..9fc0f6d9 100644 --- a/AsbCloudWebApi.Tests/Background/PeriodicBackgroundWorkerTest.cs +++ b/AsbCloudWebApi.Tests/Background/PeriodicBackgroundWorkerTest.cs @@ -67,10 +67,12 @@ public class PeriodicBackgroundWorkerTest { var expectadResult = 42; var result = 0; + using var semaphore = new SemaphoreSlim(0, 1); Task workAction(string id, IServiceProvider services, Action callback, CancellationToken token) { result = expectadResult; + semaphore.Release(); return Task.CompletedTask; } var goodWork = Work.CreateByDelegate("", workAction); @@ -85,12 +87,12 @@ public class PeriodicBackgroundWorkerTest service.Add(badWork, TimeSpan.FromSeconds(2)); service.Add(goodWork, TimeSpan.FromSeconds(2)); - await Task.Delay(TimeSpan.FromMilliseconds(256)); + await semaphore.WaitAsync(4_100); //assert - Assert.Equal(expectadResult, result); Assert.Equal(1, badWork.CountErrors); Assert.Equal(1, goodWork.CountComplete); Assert.Equal(1, goodWork.CountStart); + Assert.Equal(expectadResult, result); } } From f2867794d1c16ef76afbc523a8d75cf357212766 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 15 Apr 2024 11:30:06 +0500 Subject: [PATCH 085/132] fix WorkTest.ExecutionWork_ShouldReturn_FailsWithInfo --- AsbCloudWebApi.Tests/Background/WorkTest.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AsbCloudWebApi.Tests/Background/WorkTest.cs b/AsbCloudWebApi.Tests/Background/WorkTest.cs index 41fc486d..97a0c6c2 100644 --- a/AsbCloudWebApi.Tests/Background/WorkTest.cs +++ b/AsbCloudWebApi.Tests/Background/WorkTest.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using AsbCloudInfrastructure.Background; @@ -87,7 +88,7 @@ public class WorkTest Assert.Equal(expectedProgress, currentState.Progress); } - [Fact] + [Fact, MethodImpl(MethodImplOptions.NoOptimization)] public async Task ExecutionWork_ShouldReturn_FailsWithInfo() { //arrange From 139a66a2c9626d30b5e3ddfecac6ba11f8cfbc4a 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, 15 Apr 2024 10:09:07 +0300 Subject: [PATCH 086/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D1=85=20=D1=81=D1=83=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D1=8B=D1=85=20=D0=BE=D1=82=D1=87=D1=91=D1=82=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DailyReport/DailyReportService.cs | 3 +-- AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index 21fba541..3f498ad9 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -177,8 +177,7 @@ public class DailyReportService : IDailyReportService datesRange.To = finishDate; } - result.Count = (int)(Math.Ceiling((datesRange.To - DateTimeOffset.UnixEpoch).TotalDays) - - Math.Floor((datesRange.From - DateTimeOffset.UnixEpoch).TotalDays)); + result.Count = (datesRange.To.Day - DateTimeOffset.UnixEpoch.Day) - (datesRange.From.Day - DateTimeOffset.UnixEpoch.Day); var existingDailyReports = await dailyReportRepository.GetAsync(idWell, request, cancellationToken); diff --git a/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs b/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs index 38f1959e..90c00957 100644 --- a/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/DailyReportServiceTest.cs @@ -157,7 +157,7 @@ public class DailyReportServiceTest IdParentCategory = 4001, IdWellSectionType = 1, OperationCategoryName = "Механическое. бурение", - DateStart = new DateTime(2023, 10, 26), + DateStart = new DateTime(2023, 10, 26, 0, 0, 0), DepthStart = 80, DepthEnd = 150, DurationHours = 8, @@ -169,7 +169,7 @@ public class DailyReportServiceTest OperationCategoryName = "Механическое. бурение", IdWellSectionType = 1, IdParentCategory = 4001, - DateStart = new DateTime(2023, 10, 26), + DateStart = new DateTime(2023, 10, 26, 23, 59, 59), DepthStart = 150, DepthEnd = 200, DurationHours = 8, @@ -507,7 +507,7 @@ public class DailyReportServiceTest public async Task GetAsync_ShouldReturn_FictiveDailyReport() { //arrange - var expectedCount = (fakeLastFactWellOperation.DateStart - fakeFirstFactWellOperation.DateStart).TotalDays + 1; + var expectedCount = fakeLastFactWellOperation.DateStart.Day - fakeFirstFactWellOperation.DateStart.Day; //act var result = await dailyReportService.GetAsync(idWell, new FileReportRequest(), CancellationToken.None); From 989b2287bf269b5176e9c186e4edcdd9e6db9190 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, 15 Apr 2024 11:00:06 +0300 Subject: [PATCH 087/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D0=B8=20Dto=20=D0=B2=20?= =?UTF-8?q?=D0=A0=D0=A2=D0=9A=20=D0=BF=D0=BB=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs index 9ae3c6ff..c2ce713a 100644 --- a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs +++ b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs @@ -45,6 +45,6 @@ public abstract class ProcessMapPlanBaseDto : ChangeLogAbstract, IId, IWellRelat public virtual IEnumerable Validate(ValidationContext validationContext) { if (DepthEnd <= DepthStart) - yield return new("Глубина окончания должна быть больше глубины начала", new string[] { nameof(DepthEnd), nameof(DepthStart) }); + yield return new("Глубина окончания должна быть больше глубины начала", new string[] { nameof(DepthEnd) }); } } \ No newline at end of file From 28a583c606e5448d8e0c7fe4c77519d4d23d9268 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, 16 Apr 2024 11:09:11 +0300 Subject: [PATCH 088/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B8=20=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudDb/Model/WellOperation.cs | 2 +- .../OperationsStatService.cs | 102 +++++++----------- .../Controllers/OperationStatController.cs | 8 +- 3 files changed, 43 insertions(+), 69 deletions(-) diff --git a/AsbCloudDb/Model/WellOperation.cs b/AsbCloudDb/Model/WellOperation.cs index 9926f0b1..06b330df 100644 --- a/AsbCloudDb/Model/WellOperation.cs +++ b/AsbCloudDb/Model/WellOperation.cs @@ -66,7 +66,7 @@ namespace AsbCloudDb.Model [JsonIgnore] [ForeignKey(nameof(IdPlan))] - public virtual WellOperation? OperationPlan { get; set; } = null!; + public virtual WellOperation? OperationPlan { get; set; } } } diff --git a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs index 638232f3..87fdc3a2 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs @@ -420,46 +420,20 @@ public class OperationsStatService : IOperationsStatService public async Task>> GetTvdAsync(int idWell, CancellationToken token) { - var wellOperations = await db.WellOperations - .Include(o => o.OperationCategory) - .Include(o => o.WellSectionType) - .Include(o => o.OperationPlan) - .Where(o => o.IdWell == idWell) - .OrderBy(o => o.DateStart) - .ThenBy(o => o.DepthEnd) - .AsNoTracking() - .ToListAsync(token) - .ConfigureAwait(false); - - var wellOperationsPlan = wellOperations - .Where(o => o.IdType == WellOperation.IdOperationTypePlan) - .OrderBy(o => o.DateStart) - .ThenBy(o => o.DepthEnd); - - var wellOperationsFact = wellOperations - .Where(o => o.IdType == WellOperation.IdOperationTypeFact) - .OrderBy(o => o.DateStart) - .ThenBy(o => o.DepthEnd); - - var sectionsIds = wellOperations - .Select(o => o.IdWellSectionType) - .Distinct(); - - var tzOffsetHours = wellService.GetTimezone(idWell).Hours; - - var merged = MergeArraysBySections(sectionsIds, wellOperationsPlan, wellOperationsFact).ToList(); - if (merged.Count ==0) + var wellOperations = (await GetOperationsAsync(idWell, token)).ToArray(); + if (!wellOperations.Any()) return Enumerable.Empty>(); - - var tvd = new List>(merged.Count); - var (Plan, Fact) = merged.FirstOrDefault(); + + var tzOffsetHours = wellService.GetTimezone(idWell).Hours; + var tvd = new List>(wellOperations.Length); + var (Plan, Fact) = wellOperations.FirstOrDefault(); var dateStart = Plan?.DateStart ?? Fact!.DateStart; int? iLastMatch = null; int iLastFact = 0; var nptHours = 0d; - for (int i = 0; i < merged.Count; i++) + for (int i = 0; i < wellOperations.Length; i++) { - var item = merged[i]; + var item = wellOperations[i]; var plan = item.Plan; var fact = item.Fact; @@ -483,23 +457,23 @@ public class OperationsStatService : IOperationsStatService iLastFact = i; } - tvd.Add(planFactPredict); + tvd.Add(planFactPredict); } - if (iLastMatch is null || iLastMatch == merged.Count - 1) + if (iLastMatch is null || iLastMatch == wellOperations.Length - 1) return tvd; - var lastMatchPlan = merged[iLastMatch.Value].Plan!; + var lastMatchPlan = wellOperations[iLastMatch.Value].Plan!; var lastMatchPlanOperationEnd = lastMatchPlan.DateStart.AddHours(lastMatchPlan.DurationHours); - var lastFact = merged[iLastFact].Fact!; + var lastFact = wellOperations[iLastFact].Fact!; var lastFactDateEnd = lastFact.DateStart.AddHours(lastFact.DurationHours); var startOffset = lastFactDateEnd - lastMatchPlanOperationEnd; - for (int i = iLastMatch.Value + 1; i < merged.Count; i++) + for (int i = iLastMatch.Value + 1; i < wellOperations.Length; i++) { - if (merged[i].Plan is null) + if (wellOperations[i].Plan is null) continue; - var predict = Convert(merged[i].Plan!, tzOffsetHours); + var predict = Convert(wellOperations[i].Plan!, tzOffsetHours); predict.IdType = 2; predict.DateStart = predict.DateStart + startOffset; predict.Day = (predict.DateStart - dateStart).TotalDays; @@ -509,33 +483,33 @@ public class OperationsStatService : IOperationsStatService return tvd; } - private static IEnumerable<(WellOperation? Plan, WellOperation? Fact)> MergeArraysBySections( - IEnumerable sectionsIds, - IOrderedEnumerable wellOperationsPlan, - IOrderedEnumerable wellOperationsFact) + private async Task> GetOperationsAsync(int idWell, CancellationToken token) { - var merged = new List<(WellOperation? Plan, WellOperation? Fact)>(wellOperationsPlan.Count()); - foreach (var sectionId in sectionsIds) - { - var sectionOperationsPlan = wellOperationsPlan - .Where(o => o.IdWellSectionType == sectionId); - var sectionOperationsFact = wellOperationsFact - .Where(o => o.IdWellSectionType == sectionId); - var sectionMerged = MergeArrays(sectionOperationsPlan, sectionOperationsFact); - merged.AddRange(sectionMerged); - } - return merged; - } + var query = db.WellOperations + .Include(o => o.OperationCategory) + .Include(o => o.WellSectionType) + .Where(o => o.IdWell == idWell) + .OrderBy(o => o.DateStart) + .ThenBy(o => o.DepthEnd); - private static IEnumerable<(WellOperation? Plan, WellOperation? Fact)> MergeArrays(IEnumerable operationsPlan, IEnumerable operationsFact) - { - var operationsFactWithNoPlan = operationsFact.Where(x => x.IdPlan == null).ToArray(); - var operationsFactWithPlan = operationsFact.Where(x => x.IdPlan != null).ToArray(); + var operationsFactWithNoPlan = await query.Where(o => o.IdPlan == null && o.IdType == WellOperation.IdOperationTypeFact) + .AsNoTracking() + .ToArrayAsync(token); - var idsPlanWithFact = operationsFact.Where(x => x.IdPlan is not null).Select(x => x.IdPlan).Distinct(); - var operationsPlanWithNoFact = operationsPlan.Where(x => !idsPlanWithFact.Contains(x.IdPlan)).ToArray(); + var operationsFactWithPlan = await query.Where(o => o.IdPlan != null && o.IdType == WellOperation.IdOperationTypeFact) + .Include(o => o.OperationPlan) + .ThenInclude(o => o!.WellSectionType) + .Include(o => o.OperationPlan) + .ThenInclude(o => o!.OperationCategory) + .AsNoTracking() + .ToArrayAsync(token); - var result = new List<(WellOperation? Plan, WellOperation? Fact)>(operationsFactWithNoPlan.Length + operationsFactWithPlan.Length + operationsPlanWithNoFact.Length); + var idsPlanWithFact = operationsFactWithPlan.Select(o => o.IdPlan).Distinct(); + var operationsPlanWithNoFact = await query + .Where(o => o.IdType == WellOperation.IdOperationTypePlan && !idsPlanWithFact.Contains(o.IdPlan)).ToArrayAsync(token); + + var capacity = operationsFactWithNoPlan.Length + operationsFactWithPlan.Length + operationsPlanWithNoFact.Length; + var result = new List<(WellOperation? Plan, WellOperation? Fact)>(capacity); foreach (var operation in operationsFactWithPlan) result.Add((operation.OperationPlan, operation)); diff --git a/AsbCloudWebApi/Controllers/OperationStatController.cs b/AsbCloudWebApi/Controllers/OperationStatController.cs index 7126c5f5..81a9431f 100644 --- a/AsbCloudWebApi/Controllers/OperationStatController.cs +++ b/AsbCloudWebApi/Controllers/OperationStatController.cs @@ -1,4 +1,5 @@ -using AsbCloudApp.Data; +using System; +using AsbCloudApp.Data; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -150,9 +151,8 @@ namespace AsbCloudWebApi.Controllers { if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - - var result = await operationsStatService.GetTvdAsync(idWell, token) - .ConfigureAwait(false); + + var result = await operationsStatService.GetTvdAsync(idWell, token); return Ok(result); } From 76c845a705cc898e534b211345f1fadd75ad807f Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 17 Apr 2024 09:18:08 +0500 Subject: [PATCH 089/132] Fix GtrWitsRepository.GetAsync() --- .../Repository/GtrWitsRepository.cs | 27 +++++++++---------- .../Controllers/SAUB/GtrWitsController.cs | 4 +-- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs index 57b36ef2..cbf87456 100644 --- a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs +++ b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs @@ -94,15 +94,8 @@ namespace AsbCloudInfrastructure.Repository if (telemetry.TimeZone is null) throw new ArgumentInvalidException(nameof(idWell),$"Telemetry id: {telemetry.Id} can't find timezone"); - var timezoneOffset = TimeSpan.FromHours(telemetry.TimeZone.Hours); - var query = BuildQuery(telemetry.Id, request); - if (!await query.AnyAsync(token)) - return Enumerable.Empty(); - - var interval = TimeSpan.FromSeconds(10); - var idsRecord = WitsParameters.Select(p => p.Key.IdRecord); var entities = await query @@ -111,6 +104,12 @@ namespace AsbCloudInfrastructure.Repository .AsNoTracking() .ToArrayAsync(token); + if (!entities.Any()) + return Enumerable.Empty(); + + var interval = TimeSpan.FromSeconds(10); + var timezoneOffset = TimeSpan.FromHours(telemetry.TimeZone.Hours); + var dtos = entities .GroupBy(e => e.DateTime.Ticks / interval.Ticks) .Select(groupByInterval => @@ -131,17 +130,17 @@ namespace AsbCloudInfrastructure.Repository private IQueryable BuildQuery(int idTelemetry, GtrRequest request) where TEntity : WitsItemBase where TType : notnull - { - var dateIntervalStart = DateTime.UtcNow.AddSeconds(-request.IntervalSec); - + { var query = db.Set() - .Where(e => e.IdTelemetry == idTelemetry) - .Where(e => e.DateTime >= dateIntervalStart); + .Where(e => e.IdTelemetry == idTelemetry); if (request.Begin.HasValue) { - var dateBeginUtc = request.Begin.Value.ToUniversalTime(); - query = query.Where(e => e.DateTime >= dateBeginUtc); + var dateBegin = request.Begin.Value.ToUniversalTime(); + var dateEnd = dateBegin.AddSeconds(request.IntervalSec); + query = query + .Where(e => e.DateTime >= dateBegin) + .Where(e => e.DateTime <= dateEnd); } return query; diff --git a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs index 8f38b2ad..a339f1b8 100644 --- a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs @@ -38,7 +38,7 @@ namespace AsbCloudWebApi.Controllers.SAUB this.wellService = wellService; this.telemetryHubContext = telemetryHubContext; } - + /// /// Получить значение от ГТИ /// @@ -49,7 +49,7 @@ namespace AsbCloudWebApi.Controllers.SAUB [HttpGet] [Permission] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task GetAllAsync(int idWell, [FromQuery] GtrRequest request, CancellationToken token) + public async Task GetAllAsync([Required] int idWell, [FromQuery] GtrRequest request, CancellationToken token) { await AssertUserHasAccessToWellAsync(idWell, token); From 9ead473975ca3d775be14075beb99f47d0c69352 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 17 Apr 2024 09:44:30 +0500 Subject: [PATCH 090/132] =?UTF-8?q?=D0=A0=D0=B0=D1=81=D1=87=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B4=D0=BD=D1=8F=20(=D0=B4=D0=BB=D1=8F=20=D0=B3=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=B7=D0=BE=D0=BD=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=BE=D1=81=D0=B8=20=D0=B3=D1=80=D0=B0=D1=84=D0=B8?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2)=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE?= =?UTF-8?q?=D0=B7=D0=B8=D1=82=D0=BD=D0=BE=D0=B9=20=D1=81=D0=BA=D0=B2=D0=B0?= =?UTF-8?q?=D0=B6=D0=B8=D0=BD=D1=8B=20+=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B0=D0=BD=D0=B0=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C,=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0?= =?UTF-8?q?=D1=8E=D1=89=D0=B0=D1=8F=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5?= =?UTF-8?q?=20(=D0=BD=D0=BE=D0=B2=D0=B0=D1=8F=20WellCompositeOperationDto)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/WellCompositeOperationDto.cs | 26 ++++++ .../IWellCompositeOperationService.cs | 6 +- .../Services/WellCompositeOperationService.cs | 56 ++++++++----- .../WellCompositeOperationServiceTest.cs | 82 +++++++------------ .../WellCompositeOperationController.cs | 2 +- 5 files changed, 94 insertions(+), 78 deletions(-) create mode 100644 AsbCloudApp/Data/WellCompositeOperationDto.cs diff --git a/AsbCloudApp/Data/WellCompositeOperationDto.cs b/AsbCloudApp/Data/WellCompositeOperationDto.cs new file mode 100644 index 00000000..f6b98b4d --- /dev/null +++ b/AsbCloudApp/Data/WellCompositeOperationDto.cs @@ -0,0 +1,26 @@ +using AsbCloudApp.Data.WellOperation; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudApp.Data +{ + /// + /// Хранение операций по композитной скважине + /// и по скважинам, на основе которых была рассчитана композитная скважина + /// + public class WellCompositeOperationDto + { + /// + /// Список операций композитной скважины + /// + public List WellOperationsComposite { get; set; } = new(); + + /// + /// Список операций, сгруппированный по скважинам + /// + public Dictionary WellOperationsGroupedByWell { get; set; } = new(); + } +} diff --git a/AsbCloudApp/Services/IWellCompositeOperationService.cs b/AsbCloudApp/Services/IWellCompositeOperationService.cs index 96dbcf2b..f1af9865 100644 --- a/AsbCloudApp/Services/IWellCompositeOperationService.cs +++ b/AsbCloudApp/Services/IWellCompositeOperationService.cs @@ -1,7 +1,7 @@ -using System.Collections.Generic; +using AsbCloudApp.Data; +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/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs index 8beb3c3e..79fb45ee 100644 --- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs @@ -9,6 +9,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Data.WellOperation; +using Mapster; namespace AsbCloudInfrastructure.Services { @@ -134,7 +135,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); @@ -153,13 +154,16 @@ namespace AsbCloudInfrastructure.Services }; var operations = await wellOperationRepository.GetAsync(wellOperationRequest, token); - var renamedOperations = operations.Select(o => UpdateIdWellSectionAndIdCategory(o, sectionsDict, categoriesDict)); + var operationsForComposite = operations.Select(o => CreateCompositeOperation(o, sectionsDict, categoriesDict)); var wellOperationsWithComposite = new List>(); var compositeDepth = 0d; + var result = new WellCompositeOperationDto(); + + var prevDay = 0.0; foreach ((int IdSection, int IdCategory) in WellSectionTypesWithCategories) { - var filteredByTemplate = renamedOperations + var filteredByTemplate = operationsForComposite .Where(o => o.IdWellSectionType == IdSection) .Where(o => o.IdCategory == IdCategory); @@ -179,42 +183,50 @@ namespace AsbCloudInfrastructure.Services WellSectionTypeCaption = g.First().WellSectionTypeCaption, }); - var composite = aggreagtedByWell.OrderBy(o => o.DurationHours). - ThenByDescending(o => o.DepthStart) - .First(); + var compositeOperation = aggreagtedByWell.OrderBy(o => o.DurationHours). + ThenByDescending(o => o.DepthStart) + .First(); - composite.IdWell = 0; - if (compositeDepth > composite.DepthStart) - composite.DepthStart = compositeDepth; + compositeOperation.IdWell = 0; + compositeOperation.Day = prevDay + compositeOperation.DurationHours; + + if (compositeDepth > compositeOperation.DepthStart) + compositeOperation.DepthStart = compositeDepth; - compositeDepth = composite.DepthStart; + compositeDepth = compositeOperation.DepthStart; - var resultItem = aggreagtedByWell.ToDictionary(o => o.IdWell); - resultItem.Add(0, composite); + result.WellOperationsComposite.Add(compositeOperation); - wellOperationsWithComposite.Add(resultItem); + prevDay = compositeOperation.Day; } - return wellOperationsWithComposite; + + var groupedByWellOperations = operations + .GroupBy(o => o.IdWell) + .ToDictionary(o => o.Key, o => o.ToArray()); + result.WellOperationsGroupedByWell = groupedByWellOperations; + + return result; } - private static WellOperationDto UpdateIdWellSectionAndIdCategory( + private static WellOperationDto CreateCompositeOperation( WellOperationDto dto, IDictionary sectionTypes, IDictionary operationCategories) { - if (dto.IdWellSectionType == wellSectionTransportTable) + var newDto = dto.Adapt(); + if (newDto.IdWellSectionType == wellSectionTransportTable) { - dto.IdWellSectionType = wellSectionProductionString; - dto.WellSectionTypeCaption = sectionTypes[dto.IdWellSectionType]; + newDto.IdWellSectionType = wellSectionProductionString; + newDto.WellSectionTypeCaption = sectionTypes[newDto.IdWellSectionType]; } - if ((SettingsForSectionCategoryChange.TryGetValue((dto.IdWellSectionType, dto.IdCategory), out int newIdCategory))) + if ((SettingsForSectionCategoryChange.TryGetValue((newDto.IdWellSectionType, newDto.IdCategory), out int newIdCategory))) { - dto.IdCategory = newIdCategory; - dto.OperationCategoryName = operationCategories[dto.IdCategory] ?? string.Empty; + newDto.IdCategory = newIdCategory; + newDto.OperationCategoryName = operationCategories[newDto.IdCategory] ?? string.Empty; } - return dto; + return newDto; } } } diff --git a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs index 4018417c..cf9904d0 100644 --- a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs @@ -174,8 +174,8 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation /// /// На вход подаются 2 операции с одинаковыми секциями (id = 2), но разными категориями (ids = 5096, 5008) и ключами скважин (ids = 55, 64) - /// Метод возвращает список из одной операции в разрезе 3-х скважин: 2 текущие скважины и одна композитная - /// Операция должна иметь категорию 5013 для всех трех скважин + /// Метод возвращает объект с одной композитной операцией и списком операций в разрезе 2-х скважин + /// Композитная операция должна иметь категорию 5013 /// /// [Fact] @@ -191,25 +191,19 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation var result = await service.GetAsync(idsWell, CancellationToken.None); // assert - var compositeWellOperation = result.SelectMany(o => o.Values.Where(o => o.IdWell == 0)).FirstOrDefault(); - Assert.NotNull(compositeWellOperation); - Assert.Equal(5013, compositeWellOperation.IdCategory); - Assert.Equal(1, compositeWellOperation.DurationHours); - Assert.Equal(84, compositeWellOperation.DepthStart); + var compositeWellOperations = result.WellOperationsComposite; + Assert.Single(compositeWellOperations); + Assert.Equal(5013, compositeWellOperations.FirstOrDefault()?.IdCategory); + Assert.Equal(1, compositeWellOperations.FirstOrDefault()?.DurationHours); + Assert.Equal(84, compositeWellOperations.FirstOrDefault()?.DepthStart); - var currentWellOperations = result.SelectMany(o => o.Values.Where(o => o.IdWell != 0)); - var categories = currentWellOperations.Select(o => o.IdCategory).Distinct(); - Assert.NotNull(categories); - Assert.Single(categories); - Assert.Equal(5013, categories.First()); - - var categoryName = currentWellOperations.Select(o => o.OperationCategoryName).First(); + var categoryName = compositeWellOperations.Select(o => o.OperationCategoryName).First(); Assert.Equal("Подъем КНБК", categoryName); } /// /// На вход подаются 2 операции с одинаковыми секциями (id = 2) и категориями (id = 5003), но разными ключами скважин (ids = 55, 64) - /// Метод возвращает список из одной операции в разрезе 3-х скважин: 2 текущие скважины и одна композитная + /// Метод возвращает объект с одной композитной операцией и списком операций в разрезе 2-х скважин /// Операция композитной скважины должна содержать данные той операции, которая содержит минимальный duration_hours /// /// @@ -226,16 +220,16 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation var result = await service.GetAsync(idsWell, CancellationToken.None); // assert - var compositeWellOperation = result.SelectMany(o => o.Values.Where(o => o.IdWell == 0)).FirstOrDefault(); - Assert.NotNull(compositeWellOperation); - Assert.Equal(5003, compositeWellOperation.IdCategory); - Assert.Equal(1.5, compositeWellOperation.DurationHours); - Assert.Equal(10, compositeWellOperation.DepthStart); + var compositeWellOperations = result.WellOperationsComposite; + Assert.Single (compositeWellOperations); + Assert.Equal(5003, compositeWellOperations.FirstOrDefault()!.IdCategory); + Assert.Equal(1.5, compositeWellOperations.FirstOrDefault()!.DurationHours); + Assert.Equal(10, compositeWellOperations.FirstOrDefault()!.DepthStart); } /// /// На вход подаются 2 операции с одинаковыми секциями (id = 3) и категориями (id = 5036), но разными ключами скважин (ids = 55, 64) - /// Метод возвращает список из одной операции в разрезе 3-х скважин: 2 текущие скважины и одна композитная + /// Метод возвращает объект с одной композитной операцией и списком операций в разрезе 2-х скважин /// Операция композитной скважины должна содержать данные той операции, которая содержит минимальный duration_hours /// /// @@ -252,21 +246,19 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation var result = await service.GetAsync(idsWell, CancellationToken.None); // assert - var compositeWellOperation = result.SelectMany(o => o.Values.Where(o => o.IdWell == 0)).FirstOrDefault(); - Assert.NotNull(compositeWellOperation); - Assert.Equal(5036, compositeWellOperation.IdCategory); - Assert.Equal(3, compositeWellOperation.DurationHours); - Assert.Equal(1372, compositeWellOperation.DepthStart); + var compositeWellOperations = result.WellOperationsComposite; + Assert.Single(compositeWellOperations); + Assert.Equal(5036, compositeWellOperations.FirstOrDefault()!.IdCategory); + Assert.Equal(3, compositeWellOperations.FirstOrDefault()!.DurationHours); + Assert.Equal(1372, compositeWellOperations.FirstOrDefault()!.DepthStart); } /// /// На вход подаются 3 операции с одинаковыми секциями (id = 31), но разными категориями (ids = 5012, 5083) и ключами скважин (ids = 55, 64) - /// Метод возвращает список из одной операции в разрезе 3-х скважин: 2 текущие скважины и одна композитная + /// Метод возвращает объект с одной композитной операцией и списком операций в разрезе 2-х скважин /// Операция композитной скважины должна содержать: /// данные той операции, которая содержит минимальный duration_hours /// категорию с ключом 5013 - /// Операции по скважине с ключом 55 должны объединиться в одну, - /// при этом их длительность складывается, а depth_start берется минимальный из двух /// /// [Fact] @@ -282,30 +274,16 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation var result = await service.GetAsync(idsWell, CancellationToken.None); // assert - var currentWellOperations = result.SelectMany(o => o.Values.Where(o => o.IdWell != 0)); - var categories = currentWellOperations.Select(o => o.IdCategory).Distinct(); - Assert.NotNull(categories); - Assert.Single(categories); - Assert.Equal(5013, categories.First()); - - var currentOperationByWell55 = currentWellOperations.Where(o => o.IdWell == 55).FirstOrDefault(); - Assert.NotNull(currentOperationByWell55); - Assert.Equal(15, currentOperationByWell55.DurationHours); - Assert.Equal(500, currentOperationByWell55.DepthStart); - - var categoryName = currentWellOperations.Select(o => o.OperationCategoryName).First(); - Assert.Equal("Подъем КНБК", categoryName); - - var compositeWellOperation = result.SelectMany(o => o.Values.Where(o => o.IdWell == 0)).FirstOrDefault(); - Assert.NotNull(compositeWellOperation); - Assert.Equal(5013, compositeWellOperation.IdCategory); - Assert.Equal(5, compositeWellOperation.DurationHours); - Assert.Equal(600, compositeWellOperation.DepthStart); + var compositeWellOperations = result.WellOperationsComposite; + Assert.Single(compositeWellOperations); + Assert.Equal(5013, compositeWellOperations.FirstOrDefault()!.IdCategory); + Assert.Equal(5, compositeWellOperations.FirstOrDefault()!.DurationHours); + Assert.Equal(600, compositeWellOperations.FirstOrDefault()!.DepthStart); } /// /// На вход подаются список разных операций с разными ключами скважин (ids = 55, 64) - /// Метод возвращает список из 4-х операций в разрезе 3-х скважин: 2 текущие скважины и одна композитная + /// Метод возвращает объект с одной композитной операцией и списком операций в разрезе 2-х скважин /// Операция композитной скважины должна содержать глубину забоя = 1372 /// /// @@ -328,10 +306,10 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation var result = await service.GetAsync(idsWell, CancellationToken.None); // assert - Assert.Equal(4, result.Count()); + var wellOperationsCount = result.WellOperationsGroupedByWell.SelectMany(v => v.Value).Count(); + Assert.Equal(wellOperations.Count(), wellOperationsCount); - var lastOperation = result.Last(); - var lastOperationComposite = lastOperation[0]; + var lastOperationComposite = result.WellOperationsComposite.Last(); Assert.Equal(1372, lastOperationComposite.DepthStart); } } diff --git a/AsbCloudWebApi/Controllers/WellCompositeOperationController.cs b/AsbCloudWebApi/Controllers/WellCompositeOperationController.cs index ab4555c0..964addae 100644 --- a/AsbCloudWebApi/Controllers/WellCompositeOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellCompositeOperationController.cs @@ -25,7 +25,7 @@ namespace AsbCloudWebApi.Controllers } [HttpGet] - [ProducesResponseType(typeof(IList>), (int)System.Net.HttpStatusCode.OK)] + [ProducesResponseType(typeof(WellCompositeOperationDto), (int)System.Net.HttpStatusCode.OK)] public async Task GetAsync([FromQuery] IEnumerable idsWells, CancellationToken token) { foreach (var idWell in idsWells) From cb54d40774f42f08de68398340bbf57009221165 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 17 Apr 2024 11:10:56 +0500 Subject: [PATCH 091/132] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/WellCompositeOperationDto.cs | 6 +-- .../Services/WellCompositeOperationService.cs | 47 +++++++++++++------ .../WellCompositeOperationServiceTest.cs | 34 +++++++------- 3 files changed, 51 insertions(+), 36 deletions(-) diff --git a/AsbCloudApp/Data/WellCompositeOperationDto.cs b/AsbCloudApp/Data/WellCompositeOperationDto.cs index f6b98b4d..ce8e44f9 100644 --- a/AsbCloudApp/Data/WellCompositeOperationDto.cs +++ b/AsbCloudApp/Data/WellCompositeOperationDto.cs @@ -16,11 +16,11 @@ namespace AsbCloudApp.Data /// /// Список операций композитной скважины /// - public List WellOperationsComposite { get; set; } = new(); + public IEnumerable WellOperationsComposite { get; set; } = null!; /// - /// Список операций, сгруппированный по скважинам + /// Список операций, на основе которых были рассчитаны операции по композитной скважине /// - public Dictionary WellOperationsGroupedByWell { get; set; } = new(); + public IEnumerable WellCompositeSourceOperations { get; set; } = null!; } } diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs index 79fb45ee..2a4d0330 100644 --- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs @@ -1,23 +1,24 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; +using Mapster; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using AsbCloudApp.Data.WellOperation; -using Mapster; namespace AsbCloudInfrastructure.Services { public class WellCompositeOperationService : IWellCompositeOperationService { - private ICrudRepository wellSectionTypeRepository; - private IWellOperationCategoryRepository wellOperationCategoryRepository; - private IWellOperationRepository wellOperationRepository; + private readonly ICrudRepository wellSectionTypeRepository; + private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; + private readonly IWellOperationRepository wellOperationRepository; + private readonly IWellService wellService; /// /// Тип секции "Транспортный стол" @@ -128,11 +129,13 @@ namespace AsbCloudInfrastructure.Services public WellCompositeOperationService( ICrudRepository wellSectionTypeRepository, IWellOperationCategoryRepository wellOperationCategoryRepository, - IWellOperationRepository wellOperationRepository) + IWellOperationRepository wellOperationRepository, + IWellService wellService) { this.wellSectionTypeRepository = wellSectionTypeRepository; this.wellOperationCategoryRepository = wellOperationCategoryRepository; this.wellOperationRepository = wellOperationRepository; + this.wellService = wellService; } public async Task GetAsync(IEnumerable idsWells, CancellationToken token) @@ -143,6 +146,9 @@ namespace AsbCloudInfrastructure.Services var categories = wellOperationCategoryRepository.Get(true); var categoriesDict = categories.ToDictionary(s => s.Id, s => s.Name); + var wells = await wellService.GetAsync(new WellRequest { Ids = idsWells }, token); + var wellsDict = wells.ToDictionary(w => w.Id, w => w.Caption); + var idsWellSectionTypes = WellSectionTypesWithCategories.Select(t => t.IdSectionType).Distinct(); var usedCategories = WellSectionTypesWithCategories.Select(c => c.IdCategory).Distinct(); @@ -158,9 +164,10 @@ namespace AsbCloudInfrastructure.Services var wellOperationsWithComposite = new List>(); var compositeDepth = 0d; + var compositeDay = 0d; var result = new WellCompositeOperationDto(); - var prevDay = 0.0; + var compositeOperations = new List(); foreach ((int IdSection, int IdCategory) in WellSectionTypesWithCategories) { var filteredByTemplate = operationsForComposite @@ -188,22 +195,32 @@ namespace AsbCloudInfrastructure.Services .First(); compositeOperation.IdWell = 0; - compositeOperation.Day = prevDay + compositeOperation.DurationHours; - + compositeOperation.Day = compositeDay + compositeOperation.DurationHours; + if (compositeDepth > compositeOperation.DepthStart) compositeOperation.DepthStart = compositeDepth; + compositeOperations.Add(compositeOperation); + compositeDepth = compositeOperation.DepthStart; - - result.WellOperationsComposite.Add(compositeOperation); - - prevDay = compositeOperation.Day; + compositeDay = compositeOperation.Day; } var groupedByWellOperations = operations .GroupBy(o => o.IdWell) - .ToDictionary(o => o.Key, o => o.ToArray()); - result.WellOperationsGroupedByWell = groupedByWellOperations; + .ToDictionary(o => o.Key, o => o.ToArray()) + .Select(o => new WellCompositeOperationSourceDto() + { + Operations = o.Value, + Well = new WellDto() + { + Id = o.Key, + Caption = wellsDict.TryGetValue(o.Key, out string? caption) ? caption : string.Empty, + } + }); + + result.WellOperationsComposite = compositeOperations; + result.WellCompositeSourceOperations = groupedByWellOperations; return result; } diff --git a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs index cf9904d0..14224abd 100644 --- a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs @@ -1,22 +1,16 @@ -using AsbCloudApp.Requests; -using AsbCloudDb.Model; -using AsbCloudInfrastructure.Repository; -using AsbCloudInfrastructure.Services.ProcessMaps.Report; +using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; using AsbCloudInfrastructure.Services; using NSubstitute; -using ProtoBuf.Meta; -using SignalRSwaggerGen.Enums; using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; using Xunit; -using AsbCloudApp.Repositories; -using AsbCloudApp.Data; -using AsbCloudApp.Data.WellOperation; -using AsbCloudApp.Services; namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation { @@ -30,8 +24,10 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation = Substitute.For(); private IWellOperationRepository wellOperationRepository = Substitute.For(); + private IWellService wellService + = Substitute.For(); + - private readonly static IEnumerable operationCategories = new List() { @@ -61,7 +57,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation IdWell = 55, IdWellSectionType = 2, OperationCategoryName = "Шаблонирование перед спуском", - WellSectionTypeCaption = "Направление" + WellSectionTypeCaption = "Направление" }, new() { @@ -167,9 +163,10 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation .Returns(operationCategories); service = new WellCompositeOperationService( - wellSectionTypeRepository, + wellSectionTypeRepository, wellOperationCategoryRepository, - wellOperationRepository); + wellOperationRepository, + wellService); } /// @@ -185,7 +182,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .Returns(wellOperations1); - var idsWell = new List() { 55, 64 }; + var idsWell = new List() { 55, 64 }; // act var result = await service.GetAsync(idsWell, CancellationToken.None); @@ -221,7 +218,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation // assert var compositeWellOperations = result.WellOperationsComposite; - Assert.Single (compositeWellOperations); + Assert.Single(compositeWellOperations); Assert.Equal(5003, compositeWellOperations.FirstOrDefault()!.IdCategory); Assert.Equal(1.5, compositeWellOperations.FirstOrDefault()!.DurationHours); Assert.Equal(10, compositeWellOperations.FirstOrDefault()!.DepthStart); @@ -306,7 +303,8 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation var result = await service.GetAsync(idsWell, CancellationToken.None); // assert - var wellOperationsCount = result.WellOperationsGroupedByWell.SelectMany(v => v.Value).Count(); + var wellOperationsCount = result.WellCompositeSourceOperations + .SelectMany(o => o.Operations).Count(); Assert.Equal(wellOperations.Count(), wellOperationsCount); var lastOperationComposite = result.WellOperationsComposite.Last(); From 411e420a615fc70f4ab5d4e24f8a427b9063e238 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 17 Apr 2024 11:31:20 +0500 Subject: [PATCH 092/132] =?UTF-8?q?WellCompositeOperationSourceDto=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/WellCompositeOperationSourceDto.cs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 AsbCloudApp/Data/WellCompositeOperationSourceDto.cs diff --git a/AsbCloudApp/Data/WellCompositeOperationSourceDto.cs b/AsbCloudApp/Data/WellCompositeOperationSourceDto.cs new file mode 100644 index 00000000..fd5d819c --- /dev/null +++ b/AsbCloudApp/Data/WellCompositeOperationSourceDto.cs @@ -0,0 +1,21 @@ +using AsbCloudApp.Data.WellOperation; +using System.Collections.Generic; + +namespace AsbCloudApp.Data +{ + /// + /// Операции по скважине, по которой рассчитывается композитная скважина + /// + public class WellCompositeOperationSourceDto + { + /// + /// Скважина + /// + public WellDto Well { get; set; } = new(); + + /// + /// Операции по скважине + /// + public IEnumerable Operations { get; set; } = null!; + } +} From 033411e5343d9eb87f879ae22ae2cc553c2cc2ce Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 17 Apr 2024 15:46:14 +0500 Subject: [PATCH 093/132] fix GtrWitsRepository.GetAsync(..) --- AsbCloudApp/Repositories/IGtrRepository.cs | 11 ++++ AsbCloudApp/Requests/GtrRequest.cs | 2 +- .../Repository/GtrWitsRepository.cs | 55 ++++++++++++++++++- .../Controllers/SAUB/GtrWitsController.cs | 30 +++++++++- 4 files changed, 94 insertions(+), 4 deletions(-) diff --git a/AsbCloudApp/Repositories/IGtrRepository.cs b/AsbCloudApp/Repositories/IGtrRepository.cs index 706b6be2..39fbef07 100644 --- a/AsbCloudApp/Repositories/IGtrRepository.cs +++ b/AsbCloudApp/Repositories/IGtrRepository.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using AsbCloudApp.Requests; +using AsbCloudApp.Data; namespace AsbCloudApp.Repositories { @@ -60,5 +61,15 @@ namespace AsbCloudApp.Repositories /// [Obsolete] IEnumerable GetLastData(int idWell); + + /// + /// Доступные даты по скважине + /// + /// + /// + /// + /// + /// + Task GetRangeAsync(int idWell, DateTimeOffset? geDate, DateTimeOffset? leDate, CancellationToken token); } } diff --git a/AsbCloudApp/Requests/GtrRequest.cs b/AsbCloudApp/Requests/GtrRequest.cs index 43de25c4..89d281a3 100644 --- a/AsbCloudApp/Requests/GtrRequest.cs +++ b/AsbCloudApp/Requests/GtrRequest.cs @@ -10,7 +10,7 @@ public class GtrRequest /// /// Дата начала выборки.По умолчанию: текущее время - IntervalSec /// - public DateTime? Begin { get; set; } + public DateTimeOffset? Begin { get; set; } /// /// Интервал времени даты начала выборки, секунды diff --git a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs index cbf87456..3f8333c9 100644 --- a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs +++ b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs @@ -15,6 +15,8 @@ using System.Threading.Tasks; using AsbCloudApp.Exceptions; using AsbCloudApp.Requests; using Mapster; +using AsbCloudApp.Data; +using System.ComponentModel.DataAnnotations; namespace AsbCloudInfrastructure.Repository { @@ -82,6 +84,42 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetAsync(int idWell, GtrRequest request, CancellationToken token) => await GetAsync(idWell, request, token); + public async Task GetRangeAsync(int idWell, DateTimeOffset? geDate, DateTimeOffset? leDate, CancellationToken token) + { + var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell); + + if (telemetry is null) + return null; + + var rangeQuery = db + .Set() + .Where(e => e.IdTelemetry == telemetry.Id); + + if (geDate is not null) + rangeQuery = rangeQuery.Where(e => e.DateTime >= geDate); + + if (leDate is not null) + rangeQuery = rangeQuery.Where(e => e.DateTime <= leDate); + + var groupedQuery = rangeQuery.GroupBy(e => e.IdTelemetry) + .Select(group => new + { + Min = group.Min(e => e.DateTime), + Max = group.Max(e => e.DateTime) + }); + var range = await groupedQuery.FirstOrDefaultAsync(token); + + if (range is null) + return null; + + var result = new DatesRangeDto + { + From = range.Min.ToOffset(telemetry.TimeZone!.Offset), + To = range.Max.ToOffset(telemetry.TimeZone!.Offset), + }; + return result; + } + private async Task> GetAsync(int idWell, GtrRequest request, CancellationToken token) where TEntity : WitsItemBase where TType : notnull @@ -116,8 +154,8 @@ namespace AsbCloudInfrastructure.Repository { var items = groupByInterval.Select(e => e); var values = items.GroupBy(e => (e.IdRecord, e.IdItem)) - .Where(parameter => parameter.Any()) - .ToDictionary(parameter => WitsParameters[parameter.Key], g => g.Last().Value.ToString()); + .Where(group => WitsParameters.ContainsKey(group.Key)) + .ToDictionary(group => WitsParameters[group.Key], g => (object)g.Last().Value); var dto = values.Adapt(); dto.DateTime = items.Last().DateTime.ToOffset(timezoneOffset); @@ -142,6 +180,19 @@ namespace AsbCloudInfrastructure.Repository .Where(e => e.DateTime >= dateBegin) .Where(e => e.DateTime <= dateEnd); } + else + { + var lastDate = query + .OrderBy(e=>e.DateTime) + .LastOrDefault() + ?.DateTime + ?? DateTimeOffset.UtcNow; + var dateBegin = lastDate.AddSeconds(-request.IntervalSec); + var dateEnd = lastDate; + query = query + .Where(e => e.DateTime >= dateBegin) + .Where(e => e.DateTime <= dateEnd); + } return query; } diff --git a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs index a339f1b8..f234d33c 100644 --- a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs @@ -11,6 +11,9 @@ using System.Threading.Tasks; using AsbCloudApp.Exceptions; using AsbCloudApp.Requests; using Microsoft.AspNetCore.Http; +using AsbCloudApp.Data; +using System; +using Org.BouncyCastle.Asn1.Ocsp; namespace AsbCloudWebApi.Controllers.SAUB { @@ -58,6 +61,31 @@ namespace AsbCloudWebApi.Controllers.SAUB return Ok(dtos); } + /// + /// Возвращает диапазон дат за которые есть телеметрия за период времени + /// + /// + /// + /// + /// + /// + [HttpGet("{idWell}/dateRange")] + [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] + [ProducesResponseType((int)System.Net.HttpStatusCode.NotFound)] + [ProducesResponseType((int)System.Net.HttpStatusCode.NoContent)] + public virtual async Task> GetRangeAsync( + [FromRoute] int idWell, + DateTimeOffset? geDate, + DateTimeOffset? leDate, + CancellationToken token) + { + await AssertUserHasAccessToWellAsync(idWell, token); + + var range = await gtrRepository.GetRangeAsync(idWell, geDate, leDate, token); + + return Ok(range); + } + /// /// Получить загруженные данные ГТИ по скважине /// @@ -81,7 +109,7 @@ namespace AsbCloudWebApi.Controllers.SAUB if (!isCompanyOwnsWell) return Forbid(); - var content = await gtrRepository.GetAsync(idWell, request.Begin, + var content = await gtrRepository.GetAsync(idWell, request.Begin?.DateTime, request.IntervalSec, request.ApproxPointsCount, token).ConfigureAwait(false); return Ok(content); From ef8d559739831af741b867797926971c62bc492f Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 17 Apr 2024 16:17:52 +0500 Subject: [PATCH 094/132] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B2=D1=8C=D1=8E-2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/WellCompositeOperationSourceDto.cs | 2 +- .../Services/WellCompositeOperationService.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AsbCloudApp/Data/WellCompositeOperationSourceDto.cs b/AsbCloudApp/Data/WellCompositeOperationSourceDto.cs index fd5d819c..04ec7b3b 100644 --- a/AsbCloudApp/Data/WellCompositeOperationSourceDto.cs +++ b/AsbCloudApp/Data/WellCompositeOperationSourceDto.cs @@ -11,7 +11,7 @@ namespace AsbCloudApp.Data /// /// Скважина /// - public WellDto Well { get; set; } = new(); + public WellDto Well { get; set; } = null!; /// /// Операции по скважине diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs index 2a4d0330..783228c3 100644 --- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs @@ -147,7 +147,7 @@ namespace AsbCloudInfrastructure.Services var categoriesDict = categories.ToDictionary(s => s.Id, s => s.Name); var wells = await wellService.GetAsync(new WellRequest { Ids = idsWells }, token); - var wellsDict = wells.ToDictionary(w => w.Id, w => w.Caption); + var wellsDict = wells.ToDictionary(w => w.Id); var idsWellSectionTypes = WellSectionTypesWithCategories.Select(t => t.IdSectionType).Distinct(); var usedCategories = WellSectionTypesWithCategories.Select(c => c.IdCategory).Distinct(); @@ -215,7 +215,7 @@ namespace AsbCloudInfrastructure.Services Well = new WellDto() { Id = o.Key, - Caption = wellsDict.TryGetValue(o.Key, out string? caption) ? caption : string.Empty, + Caption = wellsDict[o.Key].Caption, } }); From f5c4f63b2fd0d0773ea9f1cbccebcdd8c405c682 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 17 Apr 2024 16:23:36 +0500 Subject: [PATCH 095/132] format WellCompositeOperationService --- .../Services/WellCompositeOperationService.cs | 423 +++++++++--------- 1 file changed, 208 insertions(+), 215 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs index 783228c3..d1312e6e 100644 --- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs @@ -11,239 +11,232 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; -namespace AsbCloudInfrastructure.Services +namespace AsbCloudInfrastructure.Services; + +public class WellCompositeOperationService : IWellCompositeOperationService { - public class WellCompositeOperationService : IWellCompositeOperationService + private readonly ICrudRepository wellSectionTypeRepository; + private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; + private readonly IWellOperationRepository wellOperationRepository; + private readonly IWellService wellService; + + /// + /// Тип секции "Транспортный стол" + /// + private const int wellSectionTransportTable = 5; + + /// + /// Тип секции "Эксплуатационная колонна" + /// + private const int wellSectionProductionString = 4; + + + /// + /// набор настроек для замены одной категории секции на другую + /// + private static Dictionary<(int, int), int> SettingsForSectionCategoryChange = new Dictionary<(int, int), int>() { + { (2, 5096), 5013 }, + { (2, 5008), 5013 }, + { (3, 5096), 5084 }, + { (3, 5008), 5084 }, + { (3, 5085), 5015 }, + { (3, 5014), 5015 }, + { (31, 5014), 5015 }, + { (31, 5012), 5013 }, + { (31, 5083), 5013 }, + { (4, 5085), 5015 }, + { (4, 5087), 5015 }, + { (4, 5014), 5015 }, + { (4, 5053), 5037 }, + { (4, 5084), 5096 }, + { (4, 5086), 5013 }, + { (6, 5085), 5015 }, + { (6, 5036), 5034 }, + { (6, 5035), 5097 } + }; + + private HashSet<(int IdSectionType, int IdCategory)> WellSectionTypesWithCategories = new HashSet<(int IdSectionType, int IdCategory)>() { - private readonly ICrudRepository wellSectionTypeRepository; - private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; - private readonly IWellOperationRepository wellOperationRepository; - private readonly IWellService wellService; + { (2, 5001) }, + { (2, 5003) }, + { (2, 5013) }, + { (2, 5000) }, + { (2, 5022) }, + { (2, 5017) }, + { (2, 5023) }, + { (2, 4007) }, + { (2, 5090) }, + { (3, 5001) }, + { (3, 5015) }, + { (3, 5037) }, + { (3, 5057) }, + { (3, 5003) }, + { (3, 5036) }, + { (3, 5084) }, + { (3, 5013) }, + { (3, 5000) }, + { (3, 5022) }, + { (3, 5017) }, + { (3, 4007) }, + { (3, 5090) }, + { (3, 5045) }, + { (3, 5042) }, + { (3, 5046) }, + { (31, 5001) }, + { (31, 5015) }, + { (31, 5037) }, + { (31, 5057) }, + { (31, 5003) }, + { (31, 5036) }, + { (31, 5013) }, + { (31, 5022) }, + { (31, 5017) }, + { (31, 5023) }, + { (31, 4007) }, + { (31, 5045) }, + { (31, 5042) }, + { (31, 5046) }, + { (4, 5001) }, + { (4, 5015) }, + { (4, 5046) }, + { (4, 5037) }, + { (4, 5097) }, + { (4, 5057) }, + { (4, 5003) }, + { (4, 5036) }, + { (4, 5008) }, + { (4, 5003) }, + { (4, 5036) }, + { (4, 5013) }, + { (4, 5000) }, + { (4, 5029) }, + { (4, 5022) }, + { (4, 5017) }, + { (4, 5019) }, + { (4, 5042) }, + { (4, 5046) }, + { (6, 5001) }, + { (6, 5015) }, + { (6, 5034) }, + { (6, 5037) }, + { (6, 5097) }, + { (6, 5057) }, + { (6, 5003) } + }; - /// - /// Тип секции "Транспортный стол" - /// - private const int wellSectionTransportTable = 5; + public WellCompositeOperationService( + ICrudRepository wellSectionTypeRepository, + IWellOperationCategoryRepository wellOperationCategoryRepository, + IWellOperationRepository wellOperationRepository, + IWellService wellService) + { + this.wellSectionTypeRepository = wellSectionTypeRepository; + this.wellOperationCategoryRepository = wellOperationCategoryRepository; + this.wellOperationRepository = wellOperationRepository; + this.wellService = wellService; + } - /// - /// Тип секции "Эксплуатационная колонна" - /// - private const int wellSectionProductionString = 4; + public async Task GetAsync(IEnumerable idsWells, CancellationToken token) + { + var sections = await wellSectionTypeRepository.GetAllAsync(token); + var sectionsDict = sections.ToDictionary(s => s.Id, s => s.Caption); + var categories = wellOperationCategoryRepository.Get(true); + var categoriesDict = categories.ToDictionary(s => s.Id, s => s.Name); - /// - /// набор настроек для замены одной категории секции на другую - /// - private static Dictionary<(int, int), int> SettingsForSectionCategoryChange = new Dictionary<(int, int), int>() { - { (2, 5096), 5013 }, - { (2, 5008), 5013 }, - { (3, 5096), 5084 }, - { (3, 5008), 5084 }, - { (3, 5085), 5015 }, - { (3, 5014), 5015 }, - { (31, 5014), 5015 }, - { (31, 5012), 5013 }, - { (31, 5083), 5013 }, - { (4, 5085), 5015 }, - { (4, 5087), 5015 }, - { (4, 5014), 5015 }, - { (4, 5053), 5037 }, - { (4, 5084), 5096 }, - { (4, 5086), 5013 }, - { (6, 5085), 5015 }, - { (6, 5036), 5034 }, - { (6, 5035), 5097 } + var wells = await wellService.GetAsync(new WellRequest { Ids = idsWells }, token); + var wellsDict = wells.ToDictionary(w => w.Id); + + var idsWellSectionTypes = WellSectionTypesWithCategories.Select(t => t.IdSectionType).Distinct(); + var usedCategories = WellSectionTypesWithCategories.Select(c => c.IdCategory).Distinct(); + + var wellOperationRequest = new WellOperationRequest(idsWells) + { + OperationCategoryIds = usedCategories, + SectionTypeIds = idsWellSectionTypes, + OperationType = WellOperation.IdOperationTypeFact }; + var operations = await wellOperationRepository.GetAsync(wellOperationRequest, token); - private HashSet<(int IdSectionType, int IdCategory)> WellSectionTypesWithCategories = new HashSet<(int IdSectionType, int IdCategory)>() + var operationsForComposite = operations.Select(o => CreateCompositeOperation(o, sectionsDict, categoriesDict)); + + var wellOperationsWithComposite = new List>(); + var compositeDepth = 0d; + var compositeDay = 0d; + var result = new WellCompositeOperationDto(); + + var compositeOperations = new List(); + foreach ((int IdSection, int IdCategory) in WellSectionTypesWithCategories) { - { (2, 5001) }, - { (2, 5003) }, - { (2, 5013) }, - { (2, 5000) }, - { (2, 5022) }, - { (2, 5017) }, - { (2, 5023) }, - { (2, 4007) }, - { (2, 5090) }, - { (3, 5001) }, - { (3, 5015) }, - { (3, 5037) }, - { (3, 5057) }, - { (3, 5003) }, - { (3, 5036) }, - { (3, 5084) }, - { (3, 5013) }, - { (3, 5000) }, - { (3, 5022) }, - { (3, 5017) }, - { (3, 4007) }, - { (3, 5090) }, - { (3, 5045) }, - { (3, 5042) }, - { (3, 5046) }, - { (31, 5001) }, - { (31, 5015) }, - { (31, 5037) }, - { (31, 5057) }, - { (31, 5003) }, - { (31, 5036) }, - { (31, 5013) }, - { (31, 5022) }, - { (31, 5017) }, - { (31, 5023) }, - { (31, 4007) }, - { (31, 5045) }, - { (31, 5042) }, - { (31, 5046) }, - { (4, 5001) }, - { (4, 5015) }, - { (4, 5046) }, - { (4, 5037) }, - { (4, 5097) }, - { (4, 5057) }, - { (4, 5003) }, - { (4, 5036) }, - { (4, 5008) }, - { (4, 5003) }, - { (4, 5036) }, - { (4, 5013) }, - { (4, 5000) }, - { (4, 5029) }, - { (4, 5022) }, - { (4, 5017) }, - { (4, 5019) }, - { (4, 5042) }, - { (4, 5046) }, - { (6, 5001) }, - { (6, 5015) }, - { (6, 5034) }, - { (6, 5037) }, - { (6, 5097) }, - { (6, 5057) }, - { (6, 5003) } - }; + var filteredByTemplate = operationsForComposite + .Where(o => o.IdWellSectionType == IdSection) + .Where(o => o.IdCategory == IdCategory); + if (!filteredByTemplate.Any()) + continue; + var groupedByWell = filteredByTemplate.GroupBy(o => o.IdWell); - public WellCompositeOperationService( - ICrudRepository wellSectionTypeRepository, - IWellOperationCategoryRepository wellOperationCategoryRepository, - IWellOperationRepository wellOperationRepository, - IWellService wellService) - { - this.wellSectionTypeRepository = wellSectionTypeRepository; - this.wellOperationCategoryRepository = wellOperationCategoryRepository; - this.wellOperationRepository = wellOperationRepository; - this.wellService = wellService; + var aggreagtedByWell = groupedByWell.Select(g => new WellOperationDto + { + IdCategory = IdCategory, + IdWell = g.Key, + IdWellSectionType = IdSection, + DepthStart = g.Min(o => o.DepthStart), + DurationHours = g.Sum(o => o.DurationHours), + OperationCategoryName = g.First().OperationCategoryName, + WellSectionTypeCaption = g.First().WellSectionTypeCaption, + }); + + var compositeOperation = aggreagtedByWell.OrderBy(o => o.DurationHours). + ThenByDescending(o => o.DepthStart) + .First(); + + compositeOperation.IdWell = 0; + + if (compositeDepth > compositeOperation.DepthStart) + compositeOperation.DepthStart = compositeDepth; + compositeDepth = compositeOperation.DepthStart; + + compositeDay += compositeOperation.DurationHours; + compositeOperation.Day = compositeDay; + + compositeOperations.Add(compositeOperation); } - public async Task GetAsync(IEnumerable idsWells, CancellationToken token) + var groupedByWellOperations = operations + .GroupBy(o => o.IdWell) + .ToDictionary(o => o.Key, o => o.ToArray()) + .Select(o => new WellCompositeOperationSourceDto() + { + Operations = o.Value, + Well = wellsDict[o.Key], + }); + + result.WellOperationsComposite = compositeOperations; + result.WellCompositeSourceOperations = groupedByWellOperations; + + return result; + } + + private static WellOperationDto CreateCompositeOperation( + WellOperationDto dto, + IDictionary sectionTypes, + IDictionary operationCategories) + { + var newDto = dto.Adapt(); + if (newDto.IdWellSectionType == wellSectionTransportTable) { - var sections = await wellSectionTypeRepository.GetAllAsync(token); - var sectionsDict = sections.ToDictionary(s => s.Id, s => s.Caption); - - var categories = wellOperationCategoryRepository.Get(true); - var categoriesDict = categories.ToDictionary(s => s.Id, s => s.Name); - - var wells = await wellService.GetAsync(new WellRequest { Ids = idsWells }, token); - var wellsDict = wells.ToDictionary(w => w.Id); - - var idsWellSectionTypes = WellSectionTypesWithCategories.Select(t => t.IdSectionType).Distinct(); - var usedCategories = WellSectionTypesWithCategories.Select(c => c.IdCategory).Distinct(); - - var wellOperationRequest = new WellOperationRequest(idsWells) - { - OperationCategoryIds = usedCategories, - SectionTypeIds = idsWellSectionTypes, - OperationType = WellOperation.IdOperationTypeFact - }; - var operations = await wellOperationRepository.GetAsync(wellOperationRequest, token); - - var operationsForComposite = operations.Select(o => CreateCompositeOperation(o, sectionsDict, categoriesDict)); - - var wellOperationsWithComposite = new List>(); - var compositeDepth = 0d; - var compositeDay = 0d; - var result = new WellCompositeOperationDto(); - - var compositeOperations = new List(); - foreach ((int IdSection, int IdCategory) in WellSectionTypesWithCategories) - { - var filteredByTemplate = operationsForComposite - .Where(o => o.IdWellSectionType == IdSection) - .Where(o => o.IdCategory == IdCategory); - - if (!filteredByTemplate.Any()) - continue; - - var groupedByWell = filteredByTemplate.GroupBy(o => o.IdWell); - - var aggreagtedByWell = groupedByWell.Select(g => new WellOperationDto - { - IdCategory = IdCategory, - IdWell = g.Key, - IdWellSectionType = IdSection, - DepthStart = g.Min(o => o.DepthStart), - DurationHours = g.Sum(o => o.DurationHours), - OperationCategoryName = g.First().OperationCategoryName, - WellSectionTypeCaption = g.First().WellSectionTypeCaption, - }); - - var compositeOperation = aggreagtedByWell.OrderBy(o => o.DurationHours). - ThenByDescending(o => o.DepthStart) - .First(); - - compositeOperation.IdWell = 0; - compositeOperation.Day = compositeDay + compositeOperation.DurationHours; - - if (compositeDepth > compositeOperation.DepthStart) - compositeOperation.DepthStart = compositeDepth; - - compositeOperations.Add(compositeOperation); - - compositeDepth = compositeOperation.DepthStart; - compositeDay = compositeOperation.Day; - } - - var groupedByWellOperations = operations - .GroupBy(o => o.IdWell) - .ToDictionary(o => o.Key, o => o.ToArray()) - .Select(o => new WellCompositeOperationSourceDto() - { - Operations = o.Value, - Well = new WellDto() - { - Id = o.Key, - Caption = wellsDict[o.Key].Caption, - } - }); - - result.WellOperationsComposite = compositeOperations; - result.WellCompositeSourceOperations = groupedByWellOperations; - - return result; + newDto.IdWellSectionType = wellSectionProductionString; + newDto.WellSectionTypeCaption = sectionTypes[newDto.IdWellSectionType]; } - private static WellOperationDto CreateCompositeOperation( - WellOperationDto dto, - IDictionary sectionTypes, - IDictionary operationCategories) + if ((SettingsForSectionCategoryChange.TryGetValue((newDto.IdWellSectionType, newDto.IdCategory), out int newIdCategory))) { - var newDto = dto.Adapt(); - if (newDto.IdWellSectionType == wellSectionTransportTable) - { - newDto.IdWellSectionType = wellSectionProductionString; - newDto.WellSectionTypeCaption = sectionTypes[newDto.IdWellSectionType]; - } - - if ((SettingsForSectionCategoryChange.TryGetValue((newDto.IdWellSectionType, newDto.IdCategory), out int newIdCategory))) - { - newDto.IdCategory = newIdCategory; - newDto.OperationCategoryName = operationCategories[newDto.IdCategory] ?? string.Empty; - } - - return newDto; + newDto.IdCategory = newIdCategory; + newDto.OperationCategoryName = operationCategories[newDto.IdCategory] ?? string.Empty; } + + return newDto; } } From 6e34f5f4c6a692412e882601e23d2b07b16f94d0 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 18 Apr 2024 10:06:46 +0500 Subject: [PATCH 096/132] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B0=D0=B2=D1=82=D0=BE=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WellCompositeOperationServiceTest.cs | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs index 14224abd..271e9c7e 100644 --- a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs @@ -26,9 +26,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation = Substitute.For(); private IWellService wellService = Substitute.For(); - - - + private List idsWells; private readonly static IEnumerable operationCategories = new List() { new(){Id = 5096, Name = "Шаблонирование перед спуском"}, @@ -47,6 +45,12 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation new() {Id = 31, Caption = "Техническая колонна", Order = 2} }; + private readonly static IEnumerable wells = new List() + { + new() {Id = 55, Caption = "Скважина с ключом 55"}, + new() {Id = 64, Caption = "Скважина с ключом 64"}, + }; + private readonly static IEnumerable wellOperations1 = new List() { new() @@ -162,6 +166,11 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation wellOperationCategoryRepository.Get(Arg.Any()) .Returns(operationCategories); + idsWells = new List() { 55, 64 }; + + wellService.GetAsync(Arg.Any(), Arg.Any()) + .Returns(wells); + service = new WellCompositeOperationService( wellSectionTypeRepository, wellOperationCategoryRepository, @@ -182,10 +191,8 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .Returns(wellOperations1); - var idsWell = new List() { 55, 64 }; - // act - var result = await service.GetAsync(idsWell, CancellationToken.None); + var result = await service.GetAsync(idsWells, CancellationToken.None); // assert var compositeWellOperations = result.WellOperationsComposite; @@ -211,10 +218,8 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .Returns(wellOperations2); - var idsWell = new List() { 55, 64 }; - // act - var result = await service.GetAsync(idsWell, CancellationToken.None); + var result = await service.GetAsync(idsWells, CancellationToken.None); // assert var compositeWellOperations = result.WellOperationsComposite; @@ -237,10 +242,8 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .Returns(wellOperations3); - var idsWell = new List() { 55, 64 }; - // act - var result = await service.GetAsync(idsWell, CancellationToken.None); + var result = await service.GetAsync(idsWells, CancellationToken.None); // assert var compositeWellOperations = result.WellOperationsComposite; @@ -265,10 +268,8 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .Returns(wellOperations4); - var idsWell = new List() { 55, 64 }; - // act - var result = await service.GetAsync(idsWell, CancellationToken.None); + var result = await service.GetAsync(idsWells, CancellationToken.None); // assert var compositeWellOperations = result.WellOperationsComposite; @@ -297,10 +298,8 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation wellOperationRepository.GetAsync(Arg.Any(), Arg.Any()) .Returns(wellOperations); - var idsWell = new List() { 55, 64 }; - // act - var result = await service.GetAsync(idsWell, CancellationToken.None); + var result = await service.GetAsync(idsWells, CancellationToken.None); // assert var wellOperationsCount = result.WellCompositeSourceOperations From f18886639123574a3b8a9ac399c3d32bb9879590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 18 Apr 2024 09:40:43 +0300 Subject: [PATCH 097/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2=D0=BE=D0=BA=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/DependencyInjection.cs | 5 +++++ AsbCloudInfrastructure/Repository/CacheBase.cs | 2 +- .../Repository/SetpointsRequestRepository.cs | 5 +++++ AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs | 6 ++---- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 6e8b3e89..713f5614 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -52,6 +52,11 @@ namespace AsbCloudInfrastructure { public static void MapsterSetup() { + TypeAdapterConfig.GlobalSettings.Default.Config + .ForType() + .Ignore(source => source.Author) + .Ignore(source => source.Well); + TypeAdapterConfig.GlobalSettings.Default.Config .ForType() .Ignore(source => source.OperationCategory); diff --git a/AsbCloudInfrastructure/Repository/CacheBase.cs b/AsbCloudInfrastructure/Repository/CacheBase.cs index 28d07f07..84f702df 100644 --- a/AsbCloudInfrastructure/Repository/CacheBase.cs +++ b/AsbCloudInfrastructure/Repository/CacheBase.cs @@ -53,7 +53,7 @@ namespace AsbCloudInfrastructure.Repository cacheEntry.AbsoluteExpirationRelativeToNow = CacheObsolescence; cacheEntry.SlidingExpiration = CacheObsolescence; - var entities = await this.GetQuery().ToArrayAsync(token); + var entities = await GetQuery().AsNoTracking().ToArrayAsync(token); cacheEntry.Value = entities; return entities.AsEnumerable(); }); diff --git a/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs b/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs index 2c1f7905..c2b359db 100644 --- a/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs +++ b/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs @@ -40,9 +40,14 @@ namespace AsbCloudInfrastructure.Repository { var entity = Convert(dto); var entry = dbSet.Update(entity); + entry.State = EntityState.Detached; } var affected = await dbContext.SaveChangesAsync(token); + + if(affected > 0) + DropCache(); + return affected; } diff --git a/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs b/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs index d06e0b4c..383c587f 100644 --- a/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs @@ -2,7 +2,6 @@ using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudInfrastructure.Repository; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using System; using System.Collections.Generic; @@ -62,9 +61,8 @@ namespace AsbCloudInfrastructure.Services.SAUB var all = await setpointsRepository.GetAllAsync(token); var filtered = all.Where(s => s.IdWell == idWell && - s.IdState == 1 && - s.UploadDate.AddSeconds(s.ObsolescenceSec) > DateTime.UtcNow) - .ToList(); + s.IdState == 1 && + s.UploadDate.AddSeconds(s.ObsolescenceSec) > DateTime.UtcNow); if (!filtered.Any()) return Enumerable.Empty(); From 60091b36cb97ebc7f5759614183a2065f4a1a3c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 18 Apr 2024 13:53:05 +0300 Subject: [PATCH 098/132] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B.=20=D0=9D?= =?UTF-8?q?=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=BE=D0=B9=20=D1=80=D0=B5?= =?UTF-8?q?=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/SetpointsRequestRepository.cs | 42 +++++++++------ .../Services/SAUB/SetpointsService.cs | 5 +- .../Clients/ISetpointsClient.cs | 12 +++++ .../Controllers/SetpointsControllerTest.cs | 53 +++++++++++++++++++ 4 files changed, 93 insertions(+), 19 deletions(-) create mode 100644 AsbCloudWebApi.IntegrationTests/Clients/ISetpointsClient.cs create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/SetpointsControllerTest.cs diff --git a/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs b/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs index c2b359db..2a728bd5 100644 --- a/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs +++ b/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using System.Threading; using System.Linq; +using AsbCloudApp.Exceptions; namespace AsbCloudInfrastructure.Repository { @@ -23,28 +24,37 @@ namespace AsbCloudInfrastructure.Repository this.wellService = wellService; } + //TODO: заметка для рефакторинга. Использовать метод из базового репозитория public virtual async Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) { - var ids = dtos.Select(d => d.Id); - var existingEntities = await dbSet - .AsNoTracking() - .Where(d => ids.Contains(d.Id)) - .Select(d => d.Id) - .ToListAsync(token) - .ConfigureAwait(false); + if (!dtos.Any()) + return 0; + + var ids = dtos + .Select(o => o.Id) + .Distinct() + .ToArray(); + + if (ids.Any(id => id == default)) + throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь Id"); + + if (ids.Length != dtos.Count()) + throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь уникальные Id"); + + var existingEntitiesCount = await dbContext.Set() + .Where(o => ids.Contains(o.Id)) + .CountAsync(token); + + if (ids.Length != existingEntitiesCount) + throw new ArgumentInvalidException(nameof(dtos), "Все записи должны существовать в БД"); - if (ids.Count() > existingEntities.Count) - return ICrudRepository.ErrorIdNotFound; - - foreach (var dto in dtos) - { - var entity = Convert(dto); - var entry = dbSet.Update(entity); - entry.State = EntityState.Detached; - } + var entities = dtos.Select(Convert); + var entries = entities.Select(entity => dbContext.Set().Update(entity)).ToList(); var affected = await dbContext.SaveChangesAsync(token); + entries.ForEach(entry => entry.State = EntityState.Detached); + if(affected > 0) DropCache(); diff --git a/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs b/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs index 383c587f..e68eeef3 100644 --- a/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs @@ -62,15 +62,14 @@ namespace AsbCloudInfrastructure.Services.SAUB var filtered = all.Where(s => s.IdWell == idWell && s.IdState == 1 && - s.UploadDate.AddSeconds(s.ObsolescenceSec) > DateTime.UtcNow); + s.UploadDate.AddSeconds(s.ObsolescenceSec).UtcDateTime > DateTime.UtcNow) + .ToArray(); if (!filtered.Any()) return Enumerable.Empty(); foreach (var item in filtered) - { item.IdState = 2; - } await setpointsRepository.UpdateRangeAsync(filtered, token); diff --git a/AsbCloudWebApi.IntegrationTests/Clients/ISetpointsClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/ISetpointsClient.cs new file mode 100644 index 00000000..c8e6e523 --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Clients/ISetpointsClient.cs @@ -0,0 +1,12 @@ +using AsbCloudApp.Data.SAUB; +using Refit; + +namespace AsbCloudWebApi.IntegrationTests.Clients; + +public interface ISetpointsClient +{ + private const string BaseRoute = "/api/telemetry/{uid}/Setpoints"; + + [Get(BaseRoute)] + Task>> GetByTelemetryUidAsync(string uid); +} \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/SetpointsControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/SetpointsControllerTest.cs new file mode 100644 index 00000000..d73148de --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Controllers/SetpointsControllerTest.cs @@ -0,0 +1,53 @@ +using System.Net; +using AsbCloudDb.Model; +using AsbCloudWebApi.IntegrationTests.Clients; +using Microsoft.EntityFrameworkCore; +using Xunit; + +namespace AsbCloudWebApi.IntegrationTests.Controllers; + +public class SetpointsControllerTest : BaseIntegrationTest +{ + private readonly ISetpointsClient client; + + public SetpointsControllerTest(WebAppFactoryFixture factory) + : base(factory) + { + client = factory.GetAuthorizedHttpClient(string.Empty); + } + + [Fact] + public async Task GetByTelemetryUidAsync_returns_success() + { + //arrange + var well = await dbContext.Wells + .Include(w => w.Telemetry) + .FirstAsync(); + + var entity = new SetpointsRequest + { + IdWell = well.Id, + UploadDate = DateTimeOffset.UtcNow, + ObsolescenceSec = 15, + IdState = 1, + IdAuthor = 1 + }; + + var entry = dbContext.SetpointsRequests.Add(entity); + await dbContext.SaveChangesAsync(); + entry.State = EntityState.Detached; + + //act + var response = await client.GetByTelemetryUidAsync(well.Telemetry!.RemoteUid); + + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.Single(response.Content); + + var setpoints = await dbContext.SetpointsRequests.ToArrayAsync(); + + foreach (var setpoint in setpoints) + Assert.Equal(2, setpoint.IdState); + } +} \ No newline at end of file From 29ba3222036c470e6b9ff3443cd3d89ea0931f12 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 19 Apr 2024 12:35:32 +0500 Subject: [PATCH 099/132] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=20=D1=87=D0=B0=D1=81=D0=BE=D0=B2=20=D0=B2=20=D0=B4=D0=BD?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE?= =?UTF-8?q?=D0=B7=D0=B8=D1=82=D0=BD=D0=BE=D0=B9=20=D1=81=D0=BA=D0=B2=D0=B0?= =?UTF-8?q?=D0=B6=D0=B8=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/WellCompositeOperationService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs index d1312e6e..fe1f4880 100644 --- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs @@ -199,7 +199,7 @@ public class WellCompositeOperationService : IWellCompositeOperationService compositeDepth = compositeOperation.DepthStart; compositeDay += compositeOperation.DurationHours; - compositeOperation.Day = compositeDay; + compositeOperation.Day = compositeDay / 24; compositeOperations.Add(compositeOperation); } From 4a878f5124cb49892ae3b4577c33d80b18eeda70 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 22 Apr 2024 09:17:42 +0500 Subject: [PATCH 100/132] Well operation refactor --- AsbCloudApp/Requests/WellOperationRequest.cs | 2 +- .../Repository/WellOperationRepository.cs | 617 ++++++++++-------- 2 files changed, 333 insertions(+), 286 deletions(-) diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs index 356ef52d..08b7fad8 100644 --- a/AsbCloudApp/Requests/WellOperationRequest.cs +++ b/AsbCloudApp/Requests/WellOperationRequest.cs @@ -80,5 +80,5 @@ public class WellOperationRequest : WellOperationRequestBase /// /// Идентификаторы скважин /// - public IEnumerable? IdsWell { get; } + public IEnumerable IdsWell { get; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 3b67eb54..bc3cee39 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data; +using AsbCloudApp.Data; using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; @@ -14,350 +9,402 @@ using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository; public class WellOperationRepository : CrudRepositoryBase, - IWellOperationRepository + IWellOperationRepository { - private readonly IMemoryCache memoryCache; - private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; - private readonly IWellService wellService; + 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 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 IEnumerable GetSectionTypes() => + memoryCache + .GetOrCreateBasic(dbContext.WellSectionTypes) + .OrderBy(s => s.Order) + .Select(s => s.Adapt()); - public async Task> GetAsync(WellOperationRequest request, CancellationToken token) - { - var query = BuildQuery(request); + public async Task> GetAsync(WellOperationRequest request, CancellationToken token) + { + var (items, _) = await GetPrivateAsync(request, token); + return items; + } - if (request.Skip.HasValue) - query = query.Skip(request.Skip.Value); + public async Task> GetPageAsync(WellOperationRequest request, CancellationToken token) + { + var skip = request.Skip ?? 0; + var take = request.Take ?? 32; - if (request.Take.HasValue) - query = query.Take(request.Take.Value); + var (items, count) = await GetPrivateAsync(request, token); - var entities = await query.AsNoTracking() - .ToArrayAsync(token); + var paginationContainer = new PaginationContainer + { + Skip = skip, + Take = take, + Count = count, + Items = items + }; - return await ConvertWithDrillingDaysAndNpvHoursAsync(entities, token); - } + return paginationContainer; + } - public async Task> GetPageAsync(WellOperationRequest request, CancellationToken token) - { - var skip = request.Skip ?? 0; - var take = request.Take ?? 32; + public async Task> GetGroupOperationsStatAsync(WellOperationRequest request, CancellationToken token) + { + var query = BuildQuery(request, token); + var entities = (await query) + .Select(o => new + { + o.IdCategory, + DurationMinutes = o.DurationHours * 60, + DurationDepth = o.DepthEnd - o.DepthStart + }) + .ToArray(); - var query = BuildQuery(request); + var parentRelationDictionary = wellOperationCategoryRepository.Get(true) + .ToDictionary(c => c.Id, c => new + { + c.Name, + c.IdParent + }); - var entities = await query.Skip(skip) - .Take(take) - .AsNoTracking() - .ToArrayAsync(token); + 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 + }); - var paginationContainer = new PaginationContainer - { - Skip = skip, - Take = take, - Count = await query.CountAsync(token), - Items = await ConvertWithDrillingDaysAndNpvHoursAsync(entities, token) - }; + 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 paginationContainer; - } + return dtos; + } - 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); + public async Task InsertRangeAsync(IEnumerable dtos, + bool deleteBeforeInsert, + CancellationToken token) + { + EnsureValidWellOperations(dtos); - var parentRelationDictionary = wellOperationCategoryRepository.Get(true) - .ToDictionary(c => c.Id, c => new - { - c.Name, - c.IdParent - }); + if (!deleteBeforeInsert) + return await InsertRangeAsync(dtos, token); - 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 - }); + var idType = dtos.First().IdType; + var idWell = dtos.First().IdWell; - 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; - }); - } + var existingOperationIds = await dbContext.WellOperations + .Where(e => e.IdWell == idWell && e.IdType == idType) + .Select(e => e.Id) + .ToArrayAsync(token); - return dtos; - } + await DeleteRangeAsync(existingOperationIds, token); - public async Task InsertRangeAsync(IEnumerable dtos, - bool deleteBeforeInsert, - CancellationToken token) - { - EnsureValidWellOperations(dtos); + return await InsertRangeAsync(dtos, token); + } - if (!deleteBeforeInsert) - return await InsertRangeAsync(dtos, token); + public override Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) + { + EnsureValidWellOperations(dtos); - var idType = dtos.First().IdType; - var idWell = dtos.First().IdWell; + return base.UpdateRangeAsync(dtos, token); + } - var existingOperationIds = await dbContext.WellOperations - .Where(e => e.IdWell == idWell && e.IdType == idType) - .Select(e => e.Id) - .ToArrayAsync(token); + private static void EnsureValidWellOperations(IEnumerable dtos) + { + if (dtos.GroupBy(d => d.IdType).Count() > 1) + throw new ArgumentInvalidException(nameof(dtos), "Все операции должны быть одного типа"); - await DeleteRangeAsync(existingOperationIds, token); + if (dtos.GroupBy(d => d.IdType).Count() > 1) + throw new ArgumentInvalidException(nameof(dtos), "Все операции должны принадлежать одной скважине"); + } - return await InsertRangeAsync(dtos, token); - } + private async Task> GetByIdsWells(IEnumerable idsWells, CancellationToken token) + { + var query = GetQuery() + .Where(e => idsWells.Contains(e.IdWell)) + .OrderBy(e => e.DateStart); + var entities = await query.ToArrayAsync(token); + return entities; + } - public override Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) - { - EnsureValidWellOperations(dtos); + private async Task<(IEnumerable items, int count)> GetPrivateAsync(WellOperationRequest request, CancellationToken token) + { + var skip = request.Skip ?? 0; + var take = request.Take ?? 32; - return base.UpdateRangeAsync(dtos, token); - } + /* + каунт = сумма всех фильтеред1 + for{ + все записи по скважине и типу план/факт = wellOperationswithType + из wellOperationswithType выбираем первую операцию + из wellOperationswithType все НПВ + к wellOperationswithType применяем оставшиеся фильтры из buildquery = фильтеред1 + к фильтеред1 применить скип тэйк = фильтеред2 + фильтеред2 конвертировать в дто и рассчитать дэй и время нпв + ... + } + */ - private static void EnsureValidWellOperations(IEnumerable dtos) - { - if (dtos.GroupBy(d => d.IdType).Count() > 1) - throw new ArgumentInvalidException(nameof(dtos), "Все операции должны быть одного типа"); + var entities = await GetByIdsWells(request.IdsWell, token); + var entitiesByWellAndType = entities + .GroupBy(e => new { e.IdWell, e.IdType }) + .Select(grp => grp.ToArray()); - if (dtos.GroupBy(d => d.IdType).Count() > 1) - throw new ArgumentInvalidException(nameof(dtos), "Все операции должны принадлежать одной скважине"); - } + var result = new List(); + foreach (var wellOperationswithType in entitiesByWellAndType) + { + var firstWellOperation = wellOperationswithType + .OrderBy(e => e.DateStart) + .FirstOrDefault(); - private IQueryable BuildQuery(WellOperationRequest request) - { - var query = GetQuery() - .Where(e => request.IdsWell != null && request.IdsWell.Contains(e.IdWell)) - .OrderBy(e => e.DateStart) - .AsQueryable(); + //НПВ + var operationsWithNpt = wellOperationswithType + .Where(o => WellOperationCategory.NonProductiveTimeSubIds.Contains(o.IdCategory)); - if (request.OperationType.HasValue) - query = query.Where(e => e.IdType == request.OperationType.Value); + var filteredWellOperations = FilterOperations(wellOperationswithType, request); - if (request.SectionTypeIds?.Any() is true) - query = query.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); + var filteredWellOperationsPart = filteredWellOperations + .Skip(skip) + .Take(take); - if (request.OperationCategoryIds?.Any() is true) - query = query.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); + var dtos = filteredWellOperationsPart + .Select(o => ConvertWithDrillingDaysAndNpvHours(o, firstWellOperation, operationsWithNpt, token)); + result.AddRange(dtos); + } - if (request.GeDepth.HasValue) - query = query.Where(e => e.DepthEnd >= request.GeDepth.Value); + return (result, entities.Count()); + } - if (request.LeDepth.HasValue) - query = query.Where(e => e.DepthEnd <= request.LeDepth.Value); + private IEnumerable FilterOperations(IEnumerable entities, WellOperationRequest request) + { + if (request.OperationType.HasValue) + entities = entities.Where(e => e.IdType == request.OperationType.Value); + if (request.SectionTypeIds?.Any() is true) + entities = entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); + if (request.OperationCategoryIds?.Any() is true) + entities = entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); + if (request.GeDepth.HasValue) + entities = entities.Where(e => e.DepthEnd >= request.GeDepth.Value); + if (request.LeDepth.HasValue) + entities = entities.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.GeDate.HasValue) + { + var geDateUtc = request.GeDate.Value.UtcDateTime; + entities = entities.Where(e => e.DateStart >= geDateUtc); + } - if (request.LeDate.HasValue) - { - var leDateUtc = request.LeDate.Value.UtcDateTime; - query = query.Where(e => e.DateStart <= leDateUtc); - } + if (request.LeDate.HasValue) + { + var leDateUtc = request.LeDate.Value.UtcDateTime; + entities = entities.Where(e => e.DateStart <= leDateUtc); + } + if (request.SortFields?.Any() is true) + entities = entities.AsQueryable().SortBy(request.SortFields); - if (request.SortFields?.Any() is true) - query = query.SortBy(request.SortFields); + return entities; + } - return query; - } + private async Task> BuildQuery(WellOperationRequest request, CancellationToken token) + { + var entities = await GetByIdsWells(request.IdsWell, token); - public async Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token) - { - const string keyCacheSections = "OperationsBySectionSummarties"; + if (request.OperationType.HasValue) + entities = entities.Where(e => e.IdType == request.OperationType.Value); - var cache = await memoryCache.GetOrCreateAsync(keyCacheSections, async (entry) => - { - entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30); + if (request.SectionTypeIds?.Any() is true) + entities = entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); - 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, + if (request.OperationCategoryIds?.Any() is true) + entities = entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); - First = group - .OrderBy(operation => operation.DateStart) - .Select(operation => new - { - operation.DateStart, - operation.DepthStart, - }) - .First(), + if (request.GeDepth.HasValue) + entities = entities.Where(e => e.DepthEnd >= request.GeDepth.Value); - Last = group - .OrderByDescending(operation => operation.DateStart) - .Select(operation => new - { - operation.DateStart, - operation.DurationHours, - operation.DepthEnd, - }) - .First(), - }) - .Where(s => idsWells.Contains(s.IdWell)); - var dbData = await query.ToArrayAsync(token); - var sections = dbData.Select( - item => new SectionByOperationsDto - { - IdWell = item.IdWell, - IdType = item.IdType, - IdWellSectionType = item.IdWellSectionType, + if (request.LeDepth.HasValue) + entities = entities.Where(e => e.DepthEnd <= request.LeDepth.Value); - Caption = item.Caption, + if (request.GeDate.HasValue) + { + var geDateUtc = request.GeDate.Value.UtcDateTime; + entities = entities.Where(e => e.DateStart >= geDateUtc); + } - DateStart = item.First.DateStart, - DepthStart = item.First.DepthStart, + if (request.LeDate.HasValue) + { + var leDateUtc = request.LeDate.Value.UtcDateTime; + entities = entities.Where(e => e.DateStart <= leDateUtc); + } - DateEnd = item.Last.DateStart.AddHours(item.Last.DurationHours), - DepthEnd = item.Last.DepthEnd, - }) - .ToArray() - .AsEnumerable(); + if (request.SortFields?.Any() is true) + entities = entities.AsQueryable().SortBy(request.SortFields); - entry.Value = sections; - return sections; - }); + return entities; + } - return cache; - } + public async Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token) + { + const string keyCacheSections = "OperationsBySectionSummarties"; - public async Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken) - { - var query = dbContext.WellOperations.Where(o => o.IdWell == idWell && o.IdType == idType); + var cache = await memoryCache.GetOrCreateAsync(keyCacheSections, async (entry) => + { + entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30); - if (!await query.AnyAsync(cancellationToken)) - return null; + 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, - var timeZoneOffset = wellService.GetTimezone(idWell).Offset; - - var minDate = await query.MinAsync(o => o.DateStart, cancellationToken); - var maxDate = await query.MaxAsync(o => o.DateStart, cancellationToken); + First = group + .OrderBy(operation => operation.DateStart) + .Select(operation => new + { + operation.DateStart, + operation.DepthStart, + }) + .First(), - return new DatesRangeDto - { - From = minDate.ToOffset(timeZoneOffset), - To = maxDate.ToOffset(timeZoneOffset) - }; - } + Last = group + .OrderByDescending(operation => operation.DateStart) + .Select(operation => new + { + operation.DateStart, + operation.DurationHours, + operation.DepthEnd, + }) + .First(), + }) + .Where(s => idsWells.Contains(s.IdWell)); + var dbData = await query.ToArrayAsync(token); + var sections = dbData.Select( + item => new SectionByOperationsDto + { + IdWell = item.IdWell, + IdType = item.IdType, + IdWellSectionType = item.IdWellSectionType, - private async Task> ConvertWithDrillingDaysAndNpvHoursAsync(IEnumerable entities, - CancellationToken token) - { - var idsWell = entities.Select(e => e.IdWell).Distinct(); + Caption = item.Caption, - var currentWellOperations = GetQuery() - .Where(entity => idsWell.Contains(entity.IdWell)); + DateStart = item.First.DateStart, + DepthStart = item.First.DepthStart, - 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); + DateEnd = item.Last.DateStart.AddHours(item.Last.DurationHours), + DepthEnd = item.Last.DepthEnd, + }) + .ToArray() + .AsEnumerable(); - 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); + entry.Value = sections; + return sections; + }); - var dtos = entities.Select(entity => - { - var dto = Convert(entity); + return cache; + } - if (dateFirstDrillingOperationByIdWell.TryGetValue(entity.IdWell, out var dateFirstDrillingOperation)) - dto.Day = (entity.DateStart - dateFirstDrillingOperation).TotalDays; + public async Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken) + { + var query = dbContext.WellOperations.Where(o => o.IdWell == idWell && o.IdType == idType); - if (operationsWithNptByIdWell.TryGetValue(entity.IdWell, out var wellOperationsWithNtp)) - dto.NptHours = wellOperationsWithNtp - .Where(o => o.DateStart <= entity.DateStart) - .Sum(e => e.DurationHours); + if (!await query.AnyAsync(cancellationToken)) + return null; - return dto; - }); + var timeZoneOffset = wellService.GetTimezone(idWell).Offset; - return dtos; - } + var minDate = await query.MinAsync(o => o.DateStart, cancellationToken); + var maxDate = await query.MaxAsync(o => o.DateStart, cancellationToken); - protected override WellOperation Convert(WellOperationDto src) - { - var entity = src.Adapt(); - entity.DateStart = src.DateStart.UtcDateTime; - return entity; - } + return new DatesRangeDto + { + From = minDate.ToOffset(timeZoneOffset), + To = maxDate.ToOffset(timeZoneOffset) + }; + } - 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; - } + private WellOperationDto ConvertWithDrillingDaysAndNpvHours( + WellOperation entity, + WellOperation firstOperation, + IEnumerable wellOperationsWithNtp, + CancellationToken token) + { + var dto = Convert(entity); + dto.Day = (entity.DateStart - firstOperation.DateStart).TotalDays; + dto.NptHours = wellOperationsWithNtp + .Where(o => o.DateStart <= entity.DateStart) + .Sum(e => e.DurationHours); + + return dto; + } + + protected override WellOperation Convert(WellOperationDto src) + { + var entity = src.Adapt(); + 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 60381a68ec051a155f66b70418f5341d7198bd29 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 22 Apr 2024 09:38:00 +0500 Subject: [PATCH 101/132] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/WellCompositeOperationService.cs | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs index fe1f4880..cc944835 100644 --- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs @@ -37,28 +37,41 @@ public class WellCompositeOperationService : IWellCompositeOperationService private static Dictionary<(int, int), int> SettingsForSectionCategoryChange = new Dictionary<(int, int), int>() { { (2, 5096), 5013 }, { (2, 5008), 5013 }, + { (2, 5002), 5113 }, + { (2, 5003), 5113 }, { (3, 5096), 5084 }, { (3, 5008), 5084 }, { (3, 5085), 5015 }, { (3, 5014), 5015 }, + { (3, 5002), 5113 }, + { (3, 5003), 5113 }, { (31, 5014), 5015 }, { (31, 5012), 5013 }, { (31, 5083), 5013 }, + { (31, 5002), 5113 }, + { (31, 5003), 5113 }, { (4, 5085), 5015 }, { (4, 5087), 5015 }, { (4, 5014), 5015 }, { (4, 5053), 5037 }, { (4, 5084), 5096 }, { (4, 5086), 5013 }, + { (4, 5002), 5113 }, + { (4, 5003), 5113 }, { (6, 5085), 5015 }, { (6, 5036), 5034 }, - { (6, 5035), 5097 } + { (6, 5035), 5097 }, + { (6, 5002), 5113 }, + { (6, 5003), 5113 }, + { (6, 5021), 5095 }, + { (6, 5086), 5012 } + }; private HashSet<(int IdSectionType, int IdCategory)> WellSectionTypesWithCategories = new HashSet<(int IdSectionType, int IdCategory)>() { { (2, 5001) }, - { (2, 5003) }, + { (2, 5113) }, { (2, 5013) }, { (2, 5000) }, { (2, 5022) }, @@ -70,7 +83,7 @@ public class WellCompositeOperationService : IWellCompositeOperationService { (3, 5015) }, { (3, 5037) }, { (3, 5057) }, - { (3, 5003) }, + { (3, 5113) }, { (3, 5036) }, { (3, 5084) }, { (3, 5013) }, @@ -86,7 +99,7 @@ public class WellCompositeOperationService : IWellCompositeOperationService { (31, 5015) }, { (31, 5037) }, { (31, 5057) }, - { (31, 5003) }, + { (31, 5113) }, { (31, 5036) }, { (31, 5013) }, { (31, 5022) }, @@ -102,7 +115,7 @@ public class WellCompositeOperationService : IWellCompositeOperationService { (4, 5037) }, { (4, 5097) }, { (4, 5057) }, - { (4, 5003) }, + { (4, 5113) }, { (4, 5036) }, { (4, 5008) }, { (4, 5003) }, @@ -121,7 +134,17 @@ public class WellCompositeOperationService : IWellCompositeOperationService { (6, 5037) }, { (6, 5097) }, { (6, 5057) }, - { (6, 5003) } + { (6, 5113) }, + { (6, 5036) }, + { (6, 5013) }, + { (6, 5000) }, + { (6, 5022) }, + { (6, 5093) }, + { (6, 5017) }, + { (6, 5095) }, + { (6, 5012) }, + { (6, 5040) }, + { (6, 5092) } }; public WellCompositeOperationService( From 0ba1b5c5fc7b519b39f609c4253a2473084aa938 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 22 Apr 2024 11:16:23 +0500 Subject: [PATCH 102/132] =?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=20(?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B4=D0=BE=D0=BB=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/WellOperationRequest.cs | 115 +++++++++--------- .../Repository/WellOperationRepository.cs | 81 ++++-------- 2 files changed, 81 insertions(+), 115 deletions(-) diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs index 08b7fad8..2dc6405b 100644 --- a/AsbCloudApp/Requests/WellOperationRequest.cs +++ b/AsbCloudApp/Requests/WellOperationRequest.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; namespace AsbCloudApp.Requests; @@ -8,44 +9,44 @@ namespace AsbCloudApp.Requests; /// public class WellOperationRequestBase : RequestBase { - /// - /// Больше или равно дате начала операции - /// - public DateTimeOffset? GeDate { get; set; } + /// + /// Больше или равно дате начала операции + /// + public DateTimeOffset? GeDate { get; set; } - /// - /// Меньше или равно дате окончания операции - /// - public DateTimeOffset? LeDate { get; set; } + /// + /// Меньше или равно дате окончания операции + /// + public DateTimeOffset? LeDate { get; set; } - /// - /// Больше или равно глубины скважины на начало операции. - /// - public double? GeDepth { get; set; } + /// + /// Больше или равно глубины скважины на начало операции. + /// + public double? GeDepth { get; set; } - /// - /// Меньше или равно глубины скважины на конец операции. - /// - public double? LeDepth { get; set; } + /// + /// Меньше или равно глубины скважины на конец операции. + /// + public double? LeDepth { get; set; } - /// - /// Идентификаторы категорий операции - /// - public IEnumerable? OperationCategoryIds { get; set; } + /// + /// Идентификаторы категорий операции + /// + public IEnumerable? OperationCategoryIds { get; set; } - /// - /// Тип операций - /// - /// 0 - плановая операция - /// 1 - фактическая операция - /// - /// - public int? OperationType { get; set; } + /// + /// Тип операций + /// + /// 0 - плановая операция + /// 1 - фактическая операция + /// + /// + public int? OperationType { get; set; } - /// - /// Идентификаторы конструкций секции - /// - public IEnumerable? SectionTypeIds { get; set; } + /// + /// Идентификаторы конструкций секции + /// + public IEnumerable? SectionTypeIds { get; set; } } /// @@ -53,32 +54,34 @@ public class WellOperationRequestBase : RequestBase /// public class WellOperationRequest : WellOperationRequestBase { - /// - public WellOperationRequest(IEnumerable idsWell) - { - IdsWell = idsWell; - } + /// + public WellOperationRequest(IEnumerable idsWell) + { + IdsWell = idsWell; + } - /// - public WellOperationRequest(WellOperationRequestBase request, IEnumerable idsWell) - : this(idsWell) - { - GeDepth = request.GeDepth; - LeDepth = request.LeDepth; - GeDate = request.GeDate; - LeDate = request.LeDate; + /// + 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; + OperationCategoryIds = request.OperationCategoryIds; + OperationType = request.OperationType; + SectionTypeIds = request.SectionTypeIds; - Skip = request.Skip; - Take = request.Take; - SortFields = request.SortFields; - } + Skip = request.Skip; + Take = request.Take; + SortFields = request.SortFields; + } - /// - /// Идентификаторы скважин - /// - public IEnumerable IdsWell { get; } + /// + /// Идентификаторы скважин + /// + [Required] + [Length(1, 1)] + public IEnumerable IdsWell { get; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index bc3cee39..959ad0d9 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -28,8 +28,7 @@ public class WellOperationRepository : CrudRepositoryBase dbSet.Include(e => e.WellSectionType) - .Include(e => e.OperationCategory)) + : base(context, dbSet => dbSet) { this.memoryCache = memoryCache; this.wellOperationCategoryRepository = wellOperationCategoryRepository; @@ -44,7 +43,7 @@ public class WellOperationRepository : CrudRepositoryBase> GetAsync(WellOperationRequest request, CancellationToken token) { - var (items, _) = await GetPrivateAsync(request, token); + var (items, _) = await GetAsyncWithDaysAndNpv(request, token); return items; } @@ -53,7 +52,7 @@ public class WellOperationRepository : CrudRepositoryBase { @@ -166,61 +165,52 @@ public class WellOperationRepository : CrudRepositoryBase> GetByIdsWells(IEnumerable idsWells, CancellationToken token) { var query = GetQuery() + .Include(e => e.WellSectionType) + .Include(e => e.OperationCategory) .Where(e => idsWells.Contains(e.IdWell)) .OrderBy(e => e.DateStart); var entities = await query.ToArrayAsync(token); return entities; } - private async Task<(IEnumerable items, int count)> GetPrivateAsync(WellOperationRequest request, CancellationToken token) + private async Task<(IEnumerable items, int count)> GetAsyncWithDaysAndNpv(WellOperationRequest request, CancellationToken token) { var skip = request.Skip ?? 0; var take = request.Take ?? 32; - /* - каунт = сумма всех фильтеред1 - for{ - все записи по скважине и типу план/факт = wellOperationswithType - из wellOperationswithType выбираем первую операцию - из wellOperationswithType все НПВ - к wellOperationswithType применяем оставшиеся фильтры из buildquery = фильтеред1 - к фильтеред1 применить скип тэйк = фильтеред2 - фильтеред2 конвертировать в дто и рассчитать дэй и время нпв - ... - } - */ - var entities = await GetByIdsWells(request.IdsWell, token); var entitiesByWellAndType = entities .GroupBy(e => new { e.IdWell, e.IdType }) .Select(grp => grp.ToArray()); var result = new List(); - foreach (var wellOperationswithType in entitiesByWellAndType) + var count = 0; + foreach (var wellOperationsWithType in entitiesByWellAndType) { - var firstWellOperation = wellOperationswithType + var firstWellOperation = wellOperationsWithType .OrderBy(e => e.DateStart) - .FirstOrDefault(); + .FirstOrDefault()!; - //НПВ - var operationsWithNpt = wellOperationswithType + var operationsWithNpt = wellOperationsWithType .Where(o => WellOperationCategory.NonProductiveTimeSubIds.Contains(o.IdCategory)); - var filteredWellOperations = FilterOperations(wellOperationswithType, request); + var filteredWellOperations = GetByRequest(wellOperationsWithType, request); var filteredWellOperationsPart = filteredWellOperations .Skip(skip) .Take(take); var dtos = filteredWellOperationsPart - .Select(o => ConvertWithDrillingDaysAndNpvHours(o, firstWellOperation, operationsWithNpt, token)); + .Select(o => ConvertWithDrillingDaysAndNpvHours(o, firstWellOperation, operationsWithNpt)); + result.AddRange(dtos); + count += filteredWellOperations.Count(); } - return (result, entities.Count()); + return (result, count); } - private IEnumerable FilterOperations(IEnumerable entities, WellOperationRequest request) + private IEnumerable GetByRequest(IEnumerable entities, WellOperationRequest request) { if (request.OperationType.HasValue) entities = entities.Where(e => e.IdType == request.OperationType.Value); @@ -253,36 +243,7 @@ public class WellOperationRepository : CrudRepositoryBase> BuildQuery(WellOperationRequest request, CancellationToken token) { var entities = await GetByIdsWells(request.IdsWell, token); - - if (request.OperationType.HasValue) - entities = entities.Where(e => e.IdType == request.OperationType.Value); - - if (request.SectionTypeIds?.Any() is true) - entities = entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); - - if (request.OperationCategoryIds?.Any() is true) - entities = entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); - - if (request.GeDepth.HasValue) - entities = entities.Where(e => e.DepthEnd >= request.GeDepth.Value); - - if (request.LeDepth.HasValue) - entities = entities.Where(e => e.DepthEnd <= request.LeDepth.Value); - - if (request.GeDate.HasValue) - { - var geDateUtc = request.GeDate.Value.UtcDateTime; - entities = entities.Where(e => e.DateStart >= geDateUtc); - } - - if (request.LeDate.HasValue) - { - var leDateUtc = request.LeDate.Value.UtcDateTime; - entities = entities.Where(e => e.DateStart <= leDateUtc); - } - - if (request.SortFields?.Any() is true) - entities = entities.AsQueryable().SortBy(request.SortFields); + entities = GetByRequest(entities, request); return entities; } @@ -378,8 +339,7 @@ public class WellOperationRepository : CrudRepositoryBase wellOperationsWithNtp, - CancellationToken token) + IEnumerable wellOperationsWithNtp) { var dto = Convert(entity); dto.Day = (entity.DateStart - firstOperation.DateStart).TotalDays; @@ -401,6 +361,9 @@ public class WellOperationRepository : CrudRepositoryBase e.WellSectionType) + // .Include(e => e.OperationCategory) var timeZoneOffset = wellService.GetTimezone(src.IdWell).Offset; var dto = src.Adapt(); dto.DateStart = src.DateStart.ToOffset(timeZoneOffset); From 4576a40ab00b361cfaffbf07b5c483fa3e299752 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, 22 Apr 2024 11:40:14 +0300 Subject: [PATCH 103/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20Drill=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Repositories/IDrillTestRepository.cs | 4 ++-- .../Repository/DrillTestRepository.cs | 14 +++++++++----- AsbCloudWebApi/Controllers/DrillTestController.cs | 11 ++++++----- .../SignalR/Clients/ITelemetryHubClient.cs | 4 ++-- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/AsbCloudApp/Repositories/IDrillTestRepository.cs b/AsbCloudApp/Repositories/IDrillTestRepository.cs index 22f11a06..b009273b 100644 --- a/AsbCloudApp/Repositories/IDrillTestRepository.cs +++ b/AsbCloudApp/Repositories/IDrillTestRepository.cs @@ -33,9 +33,9 @@ namespace AsbCloudApp.Repositories /// Сохранить данные drill_test /// /// ключ телеметрии - /// запись drill test + /// записи drill test /// /// - Task SaveDataAsync(int idTelemetry, DrillTestBaseDto dto, CancellationToken token); + Task SaveDataAsync(int idTelemetry, IEnumerable dtos, CancellationToken token); } } diff --git a/AsbCloudInfrastructure/Repository/DrillTestRepository.cs b/AsbCloudInfrastructure/Repository/DrillTestRepository.cs index d8700929..961dd67b 100644 --- a/AsbCloudInfrastructure/Repository/DrillTestRepository.cs +++ b/AsbCloudInfrastructure/Repository/DrillTestRepository.cs @@ -63,16 +63,20 @@ namespace AsbCloudInfrastructure.Repository return dto; } - public async Task SaveDataAsync(int idTelemetry, DrillTestBaseDto dto, CancellationToken token) + public async Task SaveDataAsync(int idTelemetry, IEnumerable dtos, CancellationToken token) { - var entity = dto.Adapt(); - entity.IdTelemetry = idTelemetry; - db.DrillTests.Add(entity); + var entities = dtos.Select(dto => + { + var entity = dto.Adapt(); + entity.IdTelemetry = idTelemetry; + return entity; + }); + db.DrillTests.AddRange(entities); var result = await db.SaveChangesAsync(token); return result; } - private DrillTestDto Convert(DrillTest entity) + private static DrillTestDto Convert(DrillTest entity) { var dto = entity.Adapt(); dto.TimeStampStart = dto.TimeStampStart.ToRemoteDateTime(dto.Telemetry?.TimeZone?.Hours ?? 0); diff --git a/AsbCloudWebApi/Controllers/DrillTestController.cs b/AsbCloudWebApi/Controllers/DrillTestController.cs index 8562e54c..18a30bf4 100644 --- a/AsbCloudWebApi/Controllers/DrillTestController.cs +++ b/AsbCloudWebApi/Controllers/DrillTestController.cs @@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Net; using System.Threading; @@ -51,27 +52,27 @@ public class DrillTestController : ControllerBase /// Сохраняет в БД. /// /// уникальный идентификатор записи drill_test - /// запись drill test + /// записи drill test /// /// [AllowAnonymous] [HttpPost("api/telemetry/{uid}/[controller]")] public async Task PostDataAsync( - string uid, - [FromBody] DrillTestBaseDto dto, + string uid, + [FromBody] IEnumerable dtos, CancellationToken token) { var telemetry = telemetryService.GetOrCreateTelemetryByUid(uid); if (telemetry is null) throw new Exception($"Telemetry with RemoteUid: {uid} does not exist."); - await drillTestRepository.SaveDataAsync(telemetry.Id, dto, token); + await drillTestRepository.SaveDataAsync(telemetry.Id, dtos, token); var idWell = telemetryService.GetIdWellByTelemetryUid(uid); if (idWell is not null) _ = Task.Run(async () => { var clients = telemetryHubContext.Clients.Group($"well_{idWell}"); - await clients.ReceiveDrilltestData(dto, token); + await clients.ReceiveDrilltestData(dtos, token); }, CancellationToken.None); return Ok(); diff --git a/AsbCloudWebApi/SignalR/Clients/ITelemetryHubClient.cs b/AsbCloudWebApi/SignalR/Clients/ITelemetryHubClient.cs index 2e831d1e..5e8869cf 100644 --- a/AsbCloudWebApi/SignalR/Clients/ITelemetryHubClient.cs +++ b/AsbCloudWebApi/SignalR/Clients/ITelemetryHubClient.cs @@ -17,10 +17,10 @@ namespace AsbCloudWebApi.SignalR.Clients /// Отправка клиенту уведомления о доставке с панели drill test данных. /// Для подписки на метод необходимо отправить сообщение в формате $"well_{idWell}" /// - /// + /// /// /// - Task ReceiveDrilltestData(DrillTestBaseDto dto, CancellationToken token); + Task ReceiveDrilltestData(IEnumerable dtos, CancellationToken token); /// /// Обновление записей РТК From 9926d3fcf21383528fd018cbaae211eb9d8bf521 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 22 Apr 2024 15:31:04 +0500 Subject: [PATCH 104/132] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B5=D0=BA=D1=86=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D0=B9?= =?UTF-8?q?=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20Lazy=20+=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D1=80=D1=83=D1=8E=D1=89=D0=B8=D0=B9=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80=20=D0=B2?= =?UTF-8?q?=D0=BD=D1=83=D1=82=D1=80=D0=B8=20WellOperationRequestBase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/WellOperationRequest.cs | 43 ++++++++++----- .../Repository/WellOperationRepository.cs | 53 +++++++++---------- 2 files changed, 55 insertions(+), 41 deletions(-) diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs index 2dc6405b..71f5e7d0 100644 --- a/AsbCloudApp/Requests/WellOperationRequest.cs +++ b/AsbCloudApp/Requests/WellOperationRequest.cs @@ -47,6 +47,34 @@ public class WellOperationRequestBase : RequestBase /// Идентификаторы конструкций секции /// public IEnumerable? SectionTypeIds { get; set; } + + /// + /// + /// + public WellOperationRequestBase() + { + + } + + /// + /// + /// + /// + public WellOperationRequestBase(WellOperationRequestBase request) + { + 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; + } } /// @@ -62,20 +90,9 @@ public class WellOperationRequest : WellOperationRequestBase /// public WellOperationRequest(WellOperationRequestBase request, IEnumerable idsWell) - : this(idsWell) + : base(request) { - 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; + IdsWell = idsWell; } /// diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 959ad0d9..ba457362 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -23,6 +23,8 @@ public class WellOperationRepository : CrudRepositoryBase> LazyWellCategories { get; } + private Lazy> LazyWellSectionTypes { get; } public WellOperationRepository(IAsbCloudDbContext context, IMemoryCache memoryCache, @@ -33,6 +35,9 @@ public class WellOperationRepository : CrudRepositoryBase wellOperationCategoryRepository.Get(true, false).ToDictionary(c => c.Id)); + LazyWellSectionTypes = new(() => GetSectionTypes().ToDictionary(c => c.Id)); } public IEnumerable GetSectionTypes() => @@ -43,7 +48,7 @@ public class WellOperationRepository : CrudRepositoryBase> GetAsync(WellOperationRequest request, CancellationToken token) { - var (items, _) = await GetAsyncWithDaysAndNpv(request, token); + var (items, _) = await GetWithDaysAndNpvAsync(request, token); return items; } @@ -52,7 +57,7 @@ public class WellOperationRepository : CrudRepositoryBase { @@ -165,27 +170,24 @@ public class WellOperationRepository : CrudRepositoryBase> GetByIdsWells(IEnumerable idsWells, CancellationToken token) { var query = GetQuery() - .Include(e => e.WellSectionType) - .Include(e => e.OperationCategory) .Where(e => idsWells.Contains(e.IdWell)) .OrderBy(e => e.DateStart); var entities = await query.ToArrayAsync(token); return entities; } - private async Task<(IEnumerable items, int count)> GetAsyncWithDaysAndNpv(WellOperationRequest request, CancellationToken token) + private async Task<(IEnumerable items, int count)> GetWithDaysAndNpvAsync(WellOperationRequest request, CancellationToken token) { var skip = request.Skip ?? 0; var take = request.Take ?? 32; var entities = await GetByIdsWells(request.IdsWell, token); - var entitiesByWellAndType = entities - .GroupBy(e => new { e.IdWell, e.IdType }) - .Select(grp => grp.ToArray()); + var groupedByWellAndType = entities + .GroupBy(e => new { e.IdWell, e.IdType }); var result = new List(); var count = 0; - foreach (var wellOperationsWithType in entitiesByWellAndType) + foreach (var wellOperationsWithType in groupedByWellAndType) { var firstWellOperation = wellOperationsWithType .OrderBy(e => e.DateStart) @@ -201,8 +203,16 @@ public class WellOperationRepository : CrudRepositoryBase ConvertWithDrillingDaysAndNpvHours(o, firstWellOperation, operationsWithNpt)); - + .Select(entity => + { + var dto = Convert(entity); + dto.Day = (entity.DateStart - firstWellOperation.DateStart).TotalDays; + dto.NptHours = operationsWithNpt + .Where(o => o.DateStart <= entity.DateStart) + .Sum(e => e.DurationHours); + return dto; + }); + result.AddRange(dtos); count += filteredWellOperations.Count(); } @@ -336,20 +346,6 @@ public class WellOperationRepository : CrudRepositoryBase wellOperationsWithNtp) - { - var dto = Convert(entity); - dto.Day = (entity.DateStart - firstOperation.DateStart).TotalDays; - dto.NptHours = wellOperationsWithNtp - .Where(o => o.DateStart <= entity.DateStart) - .Sum(e => e.DurationHours); - - return dto; - } - protected override WellOperation Convert(WellOperationDto src) { var entity = src.Adapt(); @@ -361,13 +357,14 @@ public class WellOperationRepository : CrudRepositoryBase e.WellSectionType) - // .Include(e => e.OperationCategory) var timeZoneOffset = wellService.GetTimezone(src.IdWell).Offset; + var dto = src.Adapt(); dto.DateStart = src.DateStart.ToOffset(timeZoneOffset); dto.LastUpdateDate = src.LastUpdateDate.ToOffset(timeZoneOffset); + + dto.OperationCategoryName = LazyWellCategories.Value.TryGetValue(src.IdCategory, out WellOperationCategoryDto? category) ? category.Name : string.Empty; + dto.WellSectionTypeCaption = LazyWellSectionTypes.Value.TryGetValue(src.IdWellSectionType, out WellSectionTypeDto? sectionType) ? sectionType.Caption : string.Empty; return dto; } } \ No newline at end of file From 910f838eece612f72a45060a3f1a9a553fb901e0 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, 22 Apr 2024 14:16:11 +0300 Subject: [PATCH 105/132] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D1=8F.=20=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=93?= =?UTF-8?q?=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/CrudRepositoryBase.cs | 16 ++++++++++------ AsbCloudInfrastructure/Services/WellService.cs | 1 + 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs index 944dabd5..80bc3a99 100644 --- a/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs @@ -133,18 +133,22 @@ namespace AsbCloudInfrastructure.Repository if (ids.Length != dtos.Count()) throw new ArgumentInvalidException(nameof(dtos), "Все записи должны иметь уникальные Id"); - var dbSet = dbContext.Set(); - - var existingEntitiesCount = await dbSet + var existingEntitiesCount = await dbContext.Set() .Where(o => ids.Contains(o.Id)) .CountAsync(token); if (ids.Length != existingEntitiesCount) throw new ArgumentInvalidException(nameof(dtos), "Все записи должны существовать в БД"); + + var entities = dtos.Select(Convert); - var entities = dbContext.Set().Where(e => ids.Contains(e.Id)); - dbContext.Set().UpdateRange(entities); - return await dbContext.SaveChangesAsync(token); + var entries = entities.Select(entity => dbContext.Set().Update(entity)).ToList(); + + var affected = await dbContext.SaveChangesAsync(token); + + entries.ForEach(entry => entry.State = EntityState.Detached); + + return affected; } /// diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 795d944b..a10ff824 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -274,6 +274,7 @@ namespace AsbCloudInfrastructure.Services dto.Timezone = GetTimezone(entity.Id); dto.StartDate = dbContext.WellOperations.Where(e => e.IdType == WellOperation.IdOperationTypeFact) + .AsNoTracking() .MinOrDefault(e => e.DateStart)?.ToRemoteDateTime(dto.Timezone.Hours); dto.WellType = entity.WellType.Caption; dto.Cluster = entity.Cluster.Caption; From 59970afcb73d4cf6b85d8999cc1cf9ea8ceb870c 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, 22 Apr 2024 15:31:27 +0300 Subject: [PATCH 106/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20API=20=D0=B0?= =?UTF-8?q?=D0=B2=D1=82=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/IDetectedOperationService.cs | 1 + .../DetectedOperationService.cs | 1 + .../SAUB/DetectedOperationController.cs | 20 +++++++++---------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs index 9ab9189e..262b193f 100644 --- a/AsbCloudApp/Services/IDetectedOperationService.cs +++ b/AsbCloudApp/Services/IDetectedOperationService.cs @@ -72,6 +72,7 @@ namespace AsbCloudApp.Services /// /// /// + [Obsolete] Task> GetOperationsStatAsync(DetectedOperationByWellRequest request, CancellationToken token); /// diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 167dc4de..0cac62b2 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -143,6 +143,7 @@ public class DetectedOperationService : IDetectedOperationService } } + [Obsolete] public async Task> GetOperationsStatAsync(DetectedOperationByWellRequest request, CancellationToken token) { var well = await wellService.GetOrDefaultAsync(request.IdWell, token); diff --git a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs index 11d7451d..fe5f289e 100644 --- a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs @@ -1,4 +1,5 @@ -using AsbCloudApp.Data.DetectedOperation; +using System; +using AsbCloudApp.Data.DetectedOperation; using AsbCloudApp.Requests; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; @@ -110,7 +111,7 @@ namespace AsbCloudWebApi.Controllers.SAUB } /// - /// Получить фильтрованный список операций по телеметрии САУБ + /// Получить список автоопределенных операций для редактирования /// /// /// @@ -118,7 +119,7 @@ namespace AsbCloudWebApi.Controllers.SAUB /// [HttpGet] [ProducesResponseType(typeof(PaginationContainer), StatusCodes.Status200OK)] - public async Task GetAsync(int idWell, [FromQuery] DetectedOperationRequest request, + public async Task GetPageAsync(int idWell, [FromQuery] DetectedOperationRequest request, CancellationToken token) { await AssertUserHasAccessToWellAsync(idWell, token); @@ -133,24 +134,23 @@ namespace AsbCloudWebApi.Controllers.SAUB var result = await detectedOperationRepository.GetPageAsync(requestToService, token); return Ok(result); } - + /// - /// Получить статистику по фильтрованному списку операций по телеметрии САУБ + /// Получить статистику по автоопределенным операциям /// /// /// /// /// [HttpGet("stat")] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] - public async Task GetStatAsync(int idWell, [FromQuery] DetectedOperationRequest request, - CancellationToken token) + [ProducesResponseType(typeof(DetectedOperationListDto), StatusCodes.Status200OK)] + public async Task GetAsync(int idWell, [FromQuery] DetectedOperationRequest request, CancellationToken token) { await AssertUserHasAccessToWellAsync(idWell, token); - + var requestToService = new DetectedOperationByWellRequest(idWell, request); - var result = await detectedOperationService.GetOperationsStatAsync(requestToService, token); + var result = await detectedOperationService.GetAsync(requestToService, token); return Ok(result); } From cfa85fc270ec1ff920ab370bd6f8b4eb3e5c755c Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 23 Apr 2024 09:29:29 +0500 Subject: [PATCH 107/132] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3=20=D1=81=20=D0=BE=D0=B1?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=B0=20=D1=83=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=B2=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs b/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs index e68eeef3..d91c893d 100644 --- a/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/SetpointsService.cs @@ -96,7 +96,7 @@ namespace AsbCloudInfrastructure.Services.SAUB return 0; entity.IdState = setpointsRequestDto.IdState; - var affected = await setpointsRepository.UpdateAsync(entity, token); + var affected = await setpointsRepository.UpdateRangeAsync(new[] { entity }, token); return affected; } From dc96d03740ce7127cabdfb10cd53652b5df98abd Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 23 Apr 2024 14:43:17 +0500 Subject: [PATCH 108/132] =?UTF-8?q?=D0=98=D0=BD=D1=82=D0=B5=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D0=B9=20=D0=BC=D0=B5?= =?UTF-8?q?=D0=B6=D0=B4=D1=83=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D0=B0/?= =?UTF-8?q?=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20=D0=93=D0=93?= =?UTF-8?q?=D0=94=20=D0=B8=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D1=8F=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=B2=20=D0=91=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Templates/WellOperationFactTemplate.xlsx | Bin 37120 -> 37024 bytes .../Templates/WellOperationPlanTemplate.xlsx | Bin 40098 -> 40045 bytes .../Clients/IWellOperationClient.cs | 6 + .../WellOperationControllerTest.cs | 362 ++++++++++-------- 4 files changed, 208 insertions(+), 160 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx index 97e0f79a5f1dc05ca7461d5e50aa8c858cfff777..928ffeb6977c7f45eca8206b5ac11b7ef5ca5829 100644 GIT binary patch literal 37024 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 diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs index b9e63518..9a9a5b7e 100644 --- a/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs +++ b/AsbCloudWebApi.IntegrationTests/Clients/IWellOperationClient.cs @@ -29,4 +29,10 @@ public interface IWellOperationClient [Get(BaseRoute + "/export")] Task> ExportAsync(int idWell, int idType); + + [Get(BaseRoute + "/template")] + Task> GetTemplate(int idWell, int idType); + + [Get(BaseRoute + "/categories")] + Task>> GetCategories(int idWell, bool includeParents, bool includeHidden); } \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs index 1a700189..0c4b3dea 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs @@ -1,208 +1,250 @@ -using System.Net; -using System.Reflection; using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Requests; using AsbCloudDb.Model; +using AsbCloudInfrastructure; using AsbCloudWebApi.IntegrationTests.Clients; using AsbCloudWebApi.IntegrationTests.Data; +using ClosedXML.Excel; using Mapster; using Microsoft.EntityFrameworkCore; using Refit; +using System.Net; +using System.Reflection; using Xunit; namespace AsbCloudWebApi.IntegrationTests.Controllers.WellOperations; public class WellOperationControllerTest : BaseIntegrationTest { - private IWellOperationClient client; + private IWellOperationClient client; - public WellOperationControllerTest(WebAppFactoryFixture factory) - : base(factory) - { - client = factory.GetAuthorizedHttpClient(string.Empty); + public WellOperationControllerTest(WebAppFactoryFixture factory) + : base(factory) + { + client = factory.GetAuthorizedHttpClient(string.Empty); - dbContext.CleanupDbSet(); - } + dbContext.CleanupDbSet(); + } - /// - /// Успешное добавление операций (без предварительной очистки данных) - /// - /// - [Fact] - public async Task InsertRange_returns_success() - { - //arrange - var well = await dbContext.Wells.FirstAsync(); - var entity = CreateWellOperation(well.Id); - var dtos = new[] { entity.Adapt() }; + /// + /// Успешное добавление операций (без предварительной очистки данных) + /// + /// + [Fact] + public async Task InsertRange_returns_success() + { + //arrange + var well = await dbContext.Wells.FirstAsync(); + var entity = CreateWellOperation(well.Id); + var dtos = new[] { entity.Adapt() }; - //act - var response = await client.InsertRangeAsync(well.Id, false, dtos); + //act + var response = await client.InsertRangeAsync(well.Id, false, dtos); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - } + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } - /// - /// Успешное добавление операций (с предварительной очисткой данных) - /// - /// - [Fact] - public async Task InsertRangeWithDeleteBefore_returns_success() - { - //arrange - var well = await dbContext.Wells.FirstAsync(); - var entity = CreateWellOperation(well.Id); - var dtos = new[] { entity.Adapt() }; + /// + /// Успешное добавление операций (с предварительной очисткой данных) + /// + /// + [Fact] + public async Task InsertRangeWithDeleteBefore_returns_success() + { + //arrange + var well = await dbContext.Wells.FirstAsync(); + var entity = CreateWellOperation(well.Id); + var dtos = new[] { entity.Adapt() }; - //act - var response = await client.InsertRangeAsync(well.Id, true, dtos); + //act + var response = await client.InsertRangeAsync(well.Id, true, dtos); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - } + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } - /// - /// Успешное обновление операций - /// - /// - [Fact] - public async Task UpdateRangeAsync_returns_success() - { - //arrange - var well = await dbContext.Wells.FirstAsync(); - var entity = CreateWellOperation(well.Id); - dbContext.WellOperations.Add(entity); - await dbContext.SaveChangesAsync(); + /// + /// Успешное обновление операций + /// + /// + [Fact] + public async Task UpdateRangeAsync_returns_success() + { + //arrange + var well = await dbContext.Wells.FirstAsync(); + var entity = CreateWellOperation(well.Id); + dbContext.WellOperations.Add(entity); + await dbContext.SaveChangesAsync(); - var dtos = new[] { entity.Adapt() }; + var dtos = new[] { entity.Adapt() }; - //act - var response = await client.UpdateRangeAsync(well.Id, dtos); + //act + var response = await client.UpdateRangeAsync(well.Id, dtos); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - } + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } - /// - /// Получение плановых операций - /// - /// - [Fact] - public async Task GetPageOperationsAsync_returns_first_page() - { - //arrange - const int pageSize = 10; - const int pageIndex = 0; - - var well = await dbContext.Wells.FirstAsync(); - var entity = CreateWellOperation(well.Id); - dbContext.WellOperations.Add(entity); - await dbContext.SaveChangesAsync(); + /// + /// Получение плановых операций + /// + /// + [Fact] + public async Task GetPageOperationsAsync_returns_first_page() + { + //arrange + const int pageSize = 10; + const int pageIndex = 0; - var dto = entity.Adapt(); - var timezoneOffset = TimeSpan.FromHours(well.Timezone.Hours); - dto.DateStart = dto.DateStart.ToOffset(timezoneOffset); - dto.LastUpdateDate = dto.LastUpdateDate?.ToOffset(timezoneOffset); + var well = await dbContext.Wells.FirstAsync(); + var entity = CreateWellOperation(well.Id); + dbContext.WellOperations.Add(entity); + await dbContext.SaveChangesAsync(); - var request = new WellOperationRequestBase - { - OperationType = WellOperation.IdOperationTypePlan, - Skip = pageIndex, - Take = pageSize, - }; + var dto = entity.Adapt(); + var timezoneOffset = TimeSpan.FromHours(well.Timezone.Hours); + dto.DateStart = dto.DateStart.ToOffset(timezoneOffset); + dto.LastUpdateDate = dto.LastUpdateDate?.ToOffset(timezoneOffset); - //act - var response = await client.GetPageOperationsAsync(well.Id, request); + var request = new WellOperationRequestBase + { + OperationType = WellOperation.IdOperationTypePlan, + Skip = pageIndex, + Take = pageSize, + }; - //assert - Assert.Equal(response.StatusCode, HttpStatusCode.OK); - Assert.NotNull(response.Content); + //act + var response = await client.GetPageOperationsAsync(well.Id, request); - var totalExpected = response.Content.Count - pageSize * pageIndex; - Assert.Equal(totalExpected, response.Content.Items.Count()); + //assert + Assert.Equal(response.StatusCode, HttpStatusCode.OK); + Assert.NotNull(response.Content); - Assert.Single(response.Content.Items); - var actualDto = response.Content.Items.First(); + var totalExpected = response.Content.Count - pageSize * pageIndex; + Assert.Equal(totalExpected, response.Content.Items.Count()); - MatchHelper.Match(dto, actualDto); - } + Assert.Single(response.Content.Items); + var actualDto = response.Content.Items.First(); - [Theory] - [InlineData(WellOperation.IdOperationTypePlan, "PlanWellOperations.xlsx")] - [InlineData(WellOperation.IdOperationTypeFact, "FactWellOperations.xlsx")] - public async Task ParseAsync_returns_success(int idType, string fileName) - { - //arrange - var well = await dbContext.Wells.FirstAsync(); + MatchHelper.Match(dto, actualDto); + } - 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", - }; + [Theory] + [InlineData(WellOperation.IdOperationTypePlan, "PlanWellOperations.xlsx")] + [InlineData(WellOperation.IdOperationTypeFact, "FactWellOperations.xlsx")] + public async Task ParseAsync_returns_success(int idType, string fileName) + { + //arrange + var well = await dbContext.Wells.FirstAsync(); - var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); + 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 streamPart = new StreamPart(stream, fileName, "application/octet-stream"); + var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName); - //act - var response = await client.ParseAsync(well.Id, idType, streamPart); + var streamPart = new StreamPart(stream, fileName, "application/octet-stream"); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.NotNull(response.Content); + //act + var response = await client.ParseAsync(well.Id, idType, streamPart); - var actualDto = response.Content.Item.First().Item; + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); - MatchHelper.Match(expectedDto, actualDto); - } + var actualDto = response.Content.Item.First().Item; - [Theory] - [InlineData(WellOperation.IdOperationTypePlan)] - [InlineData(WellOperation.IdOperationTypeFact)] - public async Task ExportAsync_returns_success(int idType) - { - //arrange - var well = await dbContext.Wells.FirstAsync(); + MatchHelper.Match(expectedDto, actualDto); + } - var entity = CreateWellOperation(well.Id, idType); - dbContext.WellOperations.Add(entity); - await dbContext.SaveChangesAsync(); + [Theory] + [InlineData(WellOperation.IdOperationTypePlan)] + [InlineData(WellOperation.IdOperationTypeFact)] + public async Task ExportAsync_returns_success(int idType) + { + //arrange + var well = await dbContext.Wells.FirstAsync(); - //act - var response = await client.ExportAsync(well.Id, idType); + var entity = CreateWellOperation(well.Id, idType); + dbContext.WellOperations.Add(entity); + await dbContext.SaveChangesAsync(); - //assert - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal("application/octet-stream", response.ContentHeaders?.ContentType?.MediaType); - Assert.True(response.ContentHeaders?.ContentLength > 0); - } + //act + var response = await client.ExportAsync(well.Id, idType); - private static WellOperation CreateWellOperation(int idWell, int idType = WellOperation.IdOperationTypePlan) => - new() - { - IdWell = idWell, - IdWellSectionType = 2, - IdCategory = WellOperationCategory.IdSlide, - IdPlan = null, - 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, - }; + //assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal("application/octet-stream", response.ContentHeaders?.ContentType?.MediaType); + Assert.True(response.ContentHeaders?.ContentLength > 0); + } + + [Theory] + [InlineData(WellOperation.IdOperationTypePlan)] + [InlineData(WellOperation.IdOperationTypeFact)] + public async Task MatchCategoriesFromTemplateAndDb_returns_success(int idType) + { + //arrange + var well = await dbContext.Wells.FirstAsync(); + var responseTemplate = await client.GetTemplate(well.Id, idType); + var stream = responseTemplate.Content; + + using var workbook = new XLWorkbook(stream); + var sheet = workbook.GetWorksheet("Справочники"); + + var count = sheet.RowsUsed().Count() - 1; + + var categoryCaptionsInTemplate = new List(); + for (var i = 0; i < count; i++) + { + var xlRow = sheet.Row(i + 2); + var rowNumber = xlRow.RowNumber(); + + var xlCell = xlRow.Cell(1); + var cellValue = xlCell.GetText().Trim(); + + categoryCaptionsInTemplate.Add(cellValue); + } + + var responseCategories = await client.GetCategories(well.Id, false, false); + var categories = responseCategories.Content; + var categoryCaptionsInDb = categories!.Select(c => c.Name.Trim()); + + var notExistedInTemplate = categoryCaptionsInDb.Except(categoryCaptionsInTemplate); + var notExistedInDb = categoryCaptionsInTemplate.Except(categoryCaptionsInDb); + + //assert + Assert.True(categoryCaptionsInDb.Count() == categoryCaptionsInTemplate.Count()); + Assert.True(notExistedInTemplate.Count() == 0); + Assert.True(notExistedInDb.Count() == 0); + } + + private static WellOperation CreateWellOperation(int idWell, int idType = WellOperation.IdOperationTypePlan) => + new() + { + IdWell = idWell, + IdWellSectionType = 2, + IdCategory = WellOperationCategory.IdSlide, + IdPlan = null, + 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, + }; } \ No newline at end of file From 7363fc5fb01d936b6ea3051ba096223160fc06a3 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 23 Apr 2024 14:43:51 +0500 Subject: [PATCH 109/132] =?UTF-8?q?=D1=81=D0=BC=D0=B5=D0=BD=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=20=D0=B8=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/WellOperations/WellOperationControllerTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs index 0c4b3dea..9d05aea6 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs @@ -193,7 +193,7 @@ public class WellOperationControllerTest : BaseIntegrationTest [Theory] [InlineData(WellOperation.IdOperationTypePlan)] [InlineData(WellOperation.IdOperationTypeFact)] - public async Task MatchCategoriesFromTemplateAndDb_returns_success(int idType) + public async Task MatchCategoriesBetweenTemplateAndDb_returns_success(int idType) { //arrange var well = await dbContext.Wells.FirstAsync(); From 148a05b29509e49624ab61ecce3436419f4967fb Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 23 Apr 2024 15:53:06 +0500 Subject: [PATCH 110/132] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE?= =?UTF-8?q?=D0=B7=D0=B8=D1=82=D0=BD=D0=BE=D0=B9=20=D1=81=D0=BA=D0=B2=D0=B0?= =?UTF-8?q?=D0=B6=D0=B8=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WellCompositeOperationServiceTest.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs index 271e9c7e..c6f5f5cf 100644 --- a/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/WellCompositeOperation/WellCompositeOperationServiceTest.cs @@ -36,6 +36,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation new(){Id = 5036, Name = "Промывка"}, new(){Id = 5012, Name = "Подъем инструмента"}, new(){Id = 5083, Name = "Проработка принудительная"}, + new(){Id = 5113, Name = "Бурение"}, }; private readonly static IEnumerable sectionTypes = new List() @@ -224,7 +225,7 @@ namespace AsbCloudWebApi.Tests.Services.WellCompositeOperation // assert var compositeWellOperations = result.WellOperationsComposite; Assert.Single(compositeWellOperations); - Assert.Equal(5003, compositeWellOperations.FirstOrDefault()!.IdCategory); + Assert.Equal(5113, compositeWellOperations.FirstOrDefault()!.IdCategory); Assert.Equal(1.5, compositeWellOperations.FirstOrDefault()!.DurationHours); Assert.Equal(10, compositeWellOperations.FirstOrDefault()!.DepthStart); } From 1c3f779f7445a320bd232bf939f680b37a4e2633 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 24 Apr 2024 12:28:37 +0500 Subject: [PATCH 111/132] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/WellOperationRequest.cs | 2 +- .../Repository/WellOperationRepository.cs | 32 +++++++++++-------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs index 71f5e7d0..fa866378 100644 --- a/AsbCloudApp/Requests/WellOperationRequest.cs +++ b/AsbCloudApp/Requests/WellOperationRequest.cs @@ -99,6 +99,6 @@ public class WellOperationRequest : WellOperationRequestBase /// Идентификаторы скважин /// [Required] - [Length(1, 1)] + [Length(1, 100)] public IEnumerable IdsWell { get; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index ba457362..bdbd1f0c 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -196,7 +196,7 @@ public class WellOperationRepository : CrudRepositoryBase WellOperationCategory.NonProductiveTimeSubIds.Contains(o.IdCategory)); - var filteredWellOperations = GetByRequest(wellOperationsWithType, request); + IEnumerable filteredWellOperations = FilterByRequest(wellOperationsWithType.AsQueryable(), request); var filteredWellOperationsPart = filteredWellOperations .Skip(skip) @@ -220,42 +220,46 @@ public class WellOperationRepository : CrudRepositoryBase GetByRequest(IEnumerable entities, WellOperationRequest request) + private T FilterByRequest(T entities, WellOperationRequest request) + where T : IQueryable, IEnumerable { if (request.OperationType.HasValue) - entities = entities.Where(e => e.IdType == request.OperationType.Value); + entities = (T)entities.Where(e => e.IdType == request.OperationType.Value); if (request.SectionTypeIds?.Any() is true) - entities = entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); + entities = (T)entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); if (request.OperationCategoryIds?.Any() is true) - entities = entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); + entities = (T)entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); if (request.GeDepth.HasValue) - entities = entities.Where(e => e.DepthEnd >= request.GeDepth.Value); + entities = (T)entities.Where(e => e.DepthEnd >= request.GeDepth.Value); if (request.LeDepth.HasValue) - entities = entities.Where(e => e.DepthEnd <= request.LeDepth.Value); + entities = (T)entities.Where(e => e.DepthEnd <= request.LeDepth.Value); if (request.GeDate.HasValue) { var geDateUtc = request.GeDate.Value.UtcDateTime; - entities = entities.Where(e => e.DateStart >= geDateUtc); + entities = (T)entities.Where(e => e.DateStart >= geDateUtc); } if (request.LeDate.HasValue) { var leDateUtc = request.LeDate.Value.UtcDateTime; - entities = entities.Where(e => e.DateStart <= leDateUtc); + entities = (T)entities.Where(e => e.DateStart <= leDateUtc); } if (request.SortFields?.Any() is true) - entities = entities.AsQueryable().SortBy(request.SortFields); + entities = (T)entities.AsQueryable().SortBy(request.SortFields); return entities; } - private async Task> BuildQuery(WellOperationRequest request, CancellationToken token) + private async Task> BuildQuery(WellOperationRequest request, CancellationToken token) { - var entities = await GetByIdsWells(request.IdsWell, token); - entities = GetByRequest(entities, request); + var query = GetQuery() + .Where(e => request.IdsWell.Contains(e.IdWell)) + .OrderBy(e => e.DateStart) + .AsQueryable(); + query = FilterByRequest(query, request); - return entities; + return query; } public async Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token) From 811a24a085a335036b27ee2116e1e86f11cb1994 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 24 Apr 2024 14:41:46 +0500 Subject: [PATCH 112/132] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20Days=20=D0=B8=20Npv=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20wellOperations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WellOperationControllerTest.cs | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs index 1a700189..006379d2 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs @@ -188,7 +188,61 @@ public class WellOperationControllerTest : BaseIntegrationTest Assert.True(response.ContentHeaders?.ContentLength > 0); } - private static WellOperation CreateWellOperation(int idWell, int idType = WellOperation.IdOperationTypePlan) => + [Theory] + [InlineData(WellOperation.IdOperationTypePlan)] + [InlineData(WellOperation.IdOperationTypeFact)] + public async Task GetPageOperationsAsyncWithDaysAndNpv_returns_success(int idType) + { + //arrange + const int pageSize = 10; + const int pageIndex = 0; + + var well = await dbContext.Wells.FirstAsync(); + var entity1 = CreateWellOperation(well.Id); + + var entity2 = entity1.Adapt(); + entity2.DateStart = entity2.DateStart.AddDays(1); + entity2.IdCategory = WellOperationCategory.IdNonProductiveTime; + entity2.DurationHours = 2; + + var entity3 = entity2.Adapt(); + entity3.DateStart = entity3.DateStart.AddDays(1); + entity3.IdCategory = WellOperationCategory.IdNonProductiveTime; + entity3.DurationHours = 3; + + dbContext.WellOperations.Add(entity1); + dbContext.WellOperations.Add(entity2); + dbContext.WellOperations.Add(entity3); + + await dbContext.SaveChangesAsync(); + + + var request = new WellOperationRequestBase + { + OperationType = WellOperation.IdOperationTypePlan, + Skip = pageIndex, + Take = pageSize, + }; + + //act + var response = await client.GetPageOperationsAsync(well.Id, request); + + //assert + Assert.Equal(response.StatusCode, HttpStatusCode.OK); + Assert.NotNull(response.Content); + + var items = response.Content.Items.ToArray(); + + Assert.Equal(0, items[0].Day); + Assert.Equal(1, items[1].Day); + Assert.Equal(2, items[2].Day); + + Assert.Equal(0, items[0].NptHours); + Assert.Equal(2, items[1].NptHours); + Assert.Equal(5, items[2].NptHours); + } + + private static WellOperation CreateWellOperation(int idWell, int idType = WellOperation.IdOperationTypePlan) => new() { IdWell = idWell, From 7dbe43a72ac9b0f57a87e8558c82ce1c2f8375d7 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 24 Apr 2024 15:21:16 +0500 Subject: [PATCH 113/132] nit --- .../Repositories/IWellOperationRepository.cs | 2 +- .../Repository/WellOperationRepository.cs | 31 ++++++++++--------- .../WellOperationControllerTest.cs | 10 +++--- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/AsbCloudApp/Repositories/IWellOperationRepository.cs b/AsbCloudApp/Repositories/IWellOperationRepository.cs index 0409969e..d37a1e90 100644 --- a/AsbCloudApp/Repositories/IWellOperationRepository.cs +++ b/AsbCloudApp/Repositories/IWellOperationRepository.cs @@ -54,7 +54,7 @@ namespace AsbCloudApp.Repositories /// /// Обновить существующую операцию /// - /// + /// /// /// Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token); diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index bdbd1f0c..9bcc718b 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -72,15 +72,15 @@ public class WellOperationRepository : CrudRepositoryBase> GetGroupOperationsStatAsync(WellOperationRequest request, CancellationToken token) { - var query = BuildQuery(request, token); - var entities = (await query) + var query = BuildQuery(request); + var entities = await query .Select(o => new { o.IdCategory, DurationMinutes = o.DurationHours * 60, DurationDepth = o.DepthEnd - o.DepthStart }) - .ToArray(); + .ToArrayAsync(token); var parentRelationDictionary = wellOperationCategoryRepository.Get(true) .ToDictionary(c => c.Id, c => new @@ -220,38 +220,39 @@ public class WellOperationRepository : CrudRepositoryBase(T entities, WellOperationRequest request) - where T : IQueryable, IEnumerable + private static IQueryable FilterByRequest(IQueryable entities, WellOperationRequest request) { if (request.OperationType.HasValue) - entities = (T)entities.Where(e => e.IdType == request.OperationType.Value); + entities = entities.Where(e => e.IdType == request.OperationType.Value); if (request.SectionTypeIds?.Any() is true) - entities = (T)entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); + entities = entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); if (request.OperationCategoryIds?.Any() is true) - entities = (T)entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); + entities = entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); if (request.GeDepth.HasValue) - entities = (T)entities.Where(e => e.DepthEnd >= request.GeDepth.Value); + entities = entities.Where(e => e.DepthEnd >= request.GeDepth.Value); if (request.LeDepth.HasValue) - entities = (T)entities.Where(e => e.DepthEnd <= request.LeDepth.Value); + entities = entities.Where(e => e.DepthEnd <= request.LeDepth.Value); if (request.GeDate.HasValue) { var geDateUtc = request.GeDate.Value.UtcDateTime; - entities = (T)entities.Where(e => e.DateStart >= geDateUtc); + entities = entities.Where(e => e.DateStart >= geDateUtc); } if (request.LeDate.HasValue) { var leDateUtc = request.LeDate.Value.UtcDateTime; - entities = (T)entities.Where(e => e.DateStart <= leDateUtc); + entities = entities.Where(e => e.DateStart <= leDateUtc); } if (request.SortFields?.Any() is true) - entities = (T)entities.AsQueryable().SortBy(request.SortFields); + entities = entities.AsQueryable().SortBy(request.SortFields); + else + entities = entities.AsQueryable().OrderBy(e => e.DateStart); return entities; } - private async Task> BuildQuery(WellOperationRequest request, CancellationToken token) + private IQueryable BuildQuery(WellOperationRequest request) { var query = GetQuery() .Where(e => request.IdsWell.Contains(e.IdWell)) @@ -328,7 +329,7 @@ public class WellOperationRepository : CrudRepositoryBase GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken) diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs index 006379d2..13ed2fbc 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs @@ -202,12 +202,12 @@ public class WellOperationControllerTest : BaseIntegrationTest var entity2 = entity1.Adapt(); entity2.DateStart = entity2.DateStart.AddDays(1); - entity2.IdCategory = WellOperationCategory.IdNonProductiveTime; + entity2.IdCategory = WellOperationCategory.IdEquipmentDrillingRepair; entity2.DurationHours = 2; var entity3 = entity2.Adapt(); entity3.DateStart = entity3.DateStart.AddDays(1); - entity3.IdCategory = WellOperationCategory.IdNonProductiveTime; + entity3.IdCategory = WellOperationCategory.IdEquipmentDrillingRepair; entity3.DurationHours = 3; dbContext.WellOperations.Add(entity1); @@ -216,19 +216,19 @@ public class WellOperationControllerTest : BaseIntegrationTest await dbContext.SaveChangesAsync(); - var request = new WellOperationRequestBase { OperationType = WellOperation.IdOperationTypePlan, Skip = pageIndex, Take = pageSize, - }; + SortFields = [nameof(WellOperation.DateStart)] + }; //act var response = await client.GetPageOperationsAsync(well.Id, request); //assert - Assert.Equal(response.StatusCode, HttpStatusCode.OK); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.NotNull(response.Content); var items = response.Content.Items.ToArray(); From 873ed10688cdcf469774b25471d05e01a14534e2 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 24 Apr 2024 16:14:53 +0500 Subject: [PATCH 114/132] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=20=D1=84=D0=B0=D0=B9=D0=BB=20=D1=81=20=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D1=8F=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DefaultData/WellOperationCategories.xlsx | Bin 14470 -> 14765 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/AsbCloudDb/Model/DefaultData/WellOperationCategories.xlsx b/AsbCloudDb/Model/DefaultData/WellOperationCategories.xlsx index 1f41a051cada21c34d6ec366d6cd0bfb75163271..7d257567c6d02fce77cb666caf7d4335de68a58a 100644 GIT binary patch delta 13091 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 delta 12830 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

    e?3%?~7Qm;N-U_uYt3ry>xXTv*tl?k} zBobhctE-0~6&Ifbxh~m8_Zm^xgsYMFNT|R3E{OKz3|GD~5k2 zC*IT?N=Qoldjh9&bB%ON?#iJzS6^BH?&&<`xbqe9-xC3{)A<}=MB`ZBgVLPLzBR`D zg(oI@I7>3JdLgvWSoTX?m#b8N=(#stcYERi)hX?+UF^J{f99hN2zX6TIOl88XWXlA z2)vCB2sRVEY?_8k=a1EjD_2yc3Qj!`tv|$)Q7H`12Jnej6+)Yju*TlUu*6B7*i3zUU49SCrD>tV#DQqx0&hQrkE7#)Fio%OT%D_ z-0)6Sk^E|Hc93@A^h3BTf%<6p@7~*HtyIT+*gQe>WQo0 zTr^+PTocb69--=G-whQRwhJk<~ zS@8<}0*kJ0P?|kN4&g%iz>a(+S(qXmmiw{MK5=v~@q<*vjsWn%S=L;R|4(+ebFr5b zYo&%;!2-)6MCP;!9tCJ z`06r%t4HR`pA-P6L~9qCJBQy(7;2&Tm}WJq*2)nzt&~-r(8zHc4$Z_Sy#Zx$BuETZ;#$z*DYxBTcD8%e7;$r<~D7Az}3n-M=WYVZkY2b?hDTpZAb z3)L&l-+o95v5>Xid8O~Z`KoINUwdoTshxA_x6OLtAGAj(S8{Yt4I=V;Z^dhs7_d5(NUqiWG|Ei|%2mkj5 z^3fQ|WD5@mxAq)+{2X_T{*Q3^L`)uPV92qD6Z_MNf8^kPvLLF#+gOdlvSP)fH(@K( zR-#C{5e|LqVU1Pr_<~-lb$j<#CgswrbRWsu8j7fWG7=Cm^-4z@s3|X@CA1N*dgLec zL-2+27+9XVR*(;zQAqr8Q2TYw34;wZ_f5jvf7`HT>S=iH%6wk0F4SSdys=+z1>|t8 z6D)Wl!vkgW$eLN=L7$=iHym0Y1V?w~E+=FttoW`VxbQ;x0*wul?)AqBJ6!&l^NDWR zNUvcsH|37Vej-ZaKEkR|-@SiX(;US)i9_{yGHJcoR6sEFH{(N6_zo+~d`xfQzt?J= z*M@5LGzF6NFPI90zo&8ea(HSQau^wQpW9@}hzLAv5w(M}{~-L`X=$T#>aU-7TFdkH zzk;<5c&Goh#GsCcuk7E4^*TQv=HFEZ{~h9;NF%_h@VDfjQFxgDh`WP>yMFPn$U8T8 zAA1Y8zj1f!O7IAHaR0NG;eRH!60-yZss6RR;UCWee Date: Wed, 24 Apr 2024 17:12:21 +0500 Subject: [PATCH 115/132] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B2?= =?UTF-8?q?=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Templates/WellOperationFactTemplate.xlsx | Bin 37120 -> 36997 bytes .../Templates/WellOperationPlanTemplate.xlsx | Bin 40098 -> 40000 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx index 97e0f79a5f1dc05ca7461d5e50aa8c858cfff777..bd41063d318ebd7542ab71f25b2a88c4d7eabfbc 100644 GIT binary patch delta 11402 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 DYpvnH delta 11365 zcmb7qcT`i|wl7U-O0QBv6HyQlks>83NRy@_MM`LbD81KgX#yfeB1NhqMFgaTCM`f5J?YUO;2dWqOROgNFQPXfx(9zLR z{BVq|Ixj{^eR_w>Q?^k38Nl|bg#mYr0?#~-Bcj^vWBNtQ@Xhb9ExG5;oy|FC{C+bc zO~R5#mqWs-E0@vtTEK6C#*O>{9e0xlZx7^LF4bYY*e>4^BYHpyy2PSS=+Y% z?!0|%f_Y%ZnGx8-3_I2#da4oa-e2LRjAIsg`|V9*#5?>m!knyVDP1e%mJSE-Ot@ET zEh2eeZ%odE(jnP8pF{jDyAVJ19S^Kk|ATYkdDjY+M)j=&YIvgJZVHMkV&%o(Equs| zdOdEV``~DmJFjbb-y}LKODONw{W-{2p~d3z@)6?AQoD zs5q`0bU7*Y3+?gGRL$c!HRm>oD|y$8`sgus40Pd2??(9w8(M7&_gzwd6yH>Y^=~HU zI#kN(Hx(u4eM0fJsh5ka!M~gE9;tZ!; z*o7XsX(`tf!plj>xsinw%Pa1;GPO!C+iUHrE=MVT)rs7{$*`h(&N5E~THsj@%w%%#(Vv!*QV?S?!62CRo9NPhD z9$ndxq;lzue}BUwRxMWc3pRM2ISsbU@~;hFzJSY)aN$^O5seWo8J!vljh73fr8U%C_`>zA)i=UEH+z^ehHmyG9!`hS$8y4dMXt!r#OD=9 z&QR`=bKk2GRaID>h|(j1Oqp}x{?l)r)HY(ieeYLaiTjeX zbND`o)IH`tzQI)MtfXp`IFn`u5pXIVf;(4Qm2%!g)o$ib$TbvB_AnqXsy;wfCmG~l z@P=o}irBSn*BC_8zjCNdQ`~qNaq*Ecbc!sMn*B0G)THq{kNEuO@l{3NV5IMb*0bkZ zT6MMsIs`YP9sr$gpQc4PWhCM)AI7F|XB55==Bm`Ad?@up@=R1iaJV%C9kzjZa+udt z5dh4Q0&oY1kj^r-CjWbuwfI}52-^=OOERSal2XN?X+bIqALm*0>v(yv zH}j2&XBvU-!5$|E23WW_rb@sJ^x3s)nB?5401bA60pHp1u!Xe8DK&+IB^ThmZ&qbD zp73|Uj^ErB8bgOkEu1UZ961Po+a75DTrMZvBxa;DJ8p>N2<^Bjt=4hX&${26pEn;C zCmRuWPO*E$@7)axSAC7;n4n;u$=&%h=bl5=eFwDPNqdlA0{7o^}*9AMjakZ9(iYH;NNgu{5JmYePSD1P2zb$? zUBs9`a_4|-x#!h3w%Y0=^~)Y^Y8B5XaDx~!rSUylIzCPEH_bB?6k=)=6#wz>3v;8t z476kqrXagmySIZFxR}*D#m<5v!v_lQ)$VqENfCWynpo=H&i0FqH8z~m(`@u|sz&IJ zO2ZY8U$ZHZC_7w&9M20-{FW9+`t;4G>5<;W53l(Y z!D`G`#U$Njicl?I@m2#{< zkDG1WM%}E2ecy2{_dPa4He8b_MFv@$x@1ph)g90J@hhXcEUs-n4m1tZ=L>EbGF@eC z`RO*6zj~o$RMq`8AsCi=&{`YNt6iIJf^DJqt60%oh~Mh_poWe-teg2fT5F>SPX*== zM{VDZs0OpGH1!ePuEu?f3Qn)RzO==M{Gu-2=VsM1mztMVcklWGMT^`U+iu^+mfGsb zjhSWeX5CT`KYQ^Yffc`JUsADd!8r=3)WhICEri0Elm5LW`*~EemDsy?Nv1OedQ;qE zD+@D)EOwUNrpG>M^HY})Mr#SJ2swZuAjoQ)uO=G!RK57bw4kV_#6Jw3w@)k_LMVK+ zoBveIO-jkMLvowUY<4{jefK3x17;BFle4_~Sr;~TVzZe!>+4N~hJ4)9pw?|n3c((j^}8Kfw{#ofI!1u*Q_=eCaByTp*jc>PN)5g~w9m0tH}I?*y~Y8*k@JXXAy zC8aw`wK;kCH37x@ZrRy%I?r#fHK)+OxydQixhUU1R^2V#22~j2yZZUvHh`Co#x$PX z+N^l*aD%ZROwl)THf*8OpxMd<4}CC0xfZ;=jQN4?wPG&tozNCX0f)>H@>TW3S}i#( z4z04UO$wa>{ZFqUo?kqCB>m<}oAUTOz9rgY>H5&AXFi67ap8n7uXYUA8yZ5BEL&-p zLa2`gMNr*KCl0$U@9^VmVV~4_KH*po*vvq(rOfZ~p6}IfjZ0d!IGW0+xR6R}K6qVx zyUo^h{@qfH?atf>4-G(54Q<(3W^?;M19?SL%?=rB5k@n??8Ya&Mvr8Ov4A4c#^fIj zVL8Q=EJK_h2h_AFsLoPkNZL{eqOGs#&H2z!l&qhhlVsTljtc9P2pDFiSp1?WUwP}> zIx7>`>>{U{S>!`64R%JFR>38EcRWKZgt>tSU7`IogYVm&HVWWHJS)}7+xV}nQbLho zzZL}Bc5B#985tO3?LZCY!j#6+f@i9-i4`8?IXx`-2lMR>YG&(5=pr2YnzgP$XmL!?{vx3ZGF;;$<}m>wojjM zQ+nSrpIJIv%?M1jegDxf-G+IwE2o%b-GiYB=%+xpIhV)e~l{fXEs#q$y2Pw$t%VIYB~!nsws!b6m;w%vtoxraqS=C zPHq}eztxY@l6_sXQinqEoR!zw?C;KGWOWKU zR#7QvnU_iM`M{?mrA)td(ZzGxIpk$^sykLO(7VlM90)scV$o}41Ie1aZx2+DYjLIWkIXNpUcZLoR>8(jU-VyB*G*uD4N8g*q0BFjg)=$Nr2*G zwsO1@U8aOkM}pj<)Pj(v$TQq`3DA(RwCAt-f>=&CFJfcqG-)4Zc?s8}gg zM5r7eCTYlu*g9*zaQ*2;r$e)mOqXn+%yc^rc#*?KSrFw(r%$tyK_?_0rQs=JyP`>< zEX+^EL8&4^MaO_Pj7FQFwMBI+ON>lJ&xL_p<{iV%-482AyVT>|99d|>Y3Uc zRmYgSv1L+L5uCy*l6Rsw$DIz7b2x?D7}9O;_6)s}z0-QuIAoPmMT&!pG5tlfeN6Nn z+uLp!vyDn)Iw>nEu2%wF3@Vmd-|kca?RSJLcj(L|{LLk3xW>_EI++-wzqN_leweoV zz+!H^BF^y_CFvg&F0S#ogxDNT);5MD+q)e@ujuT~_?e5@JKv3}Y!fwSt%8f(F~6Pj zFmBp{Rk&=2-c)n8sWzW<`E781;=lN#jVeX{@<-gvVXp%I2%y=^V*d)fH#|GDFW$WC znr@56us5(U0Sk<@lxO|qbd@$bDy^x)Xyl^Wp;42!Gj8X^voWd2yQbd)-9C@5l)3h2 zT2P|EUc8V*3c z%SS0&8x+C3CY#M;G~y{3MyF220K)L{41Huq)B154y}o3wl%x(iCW%~r@p{EbDd`rC z(745|Yq^4GRXocJ9R?xH4D%_oGUl4GB3Spw{*X-s45)FY(s!bPpF zL5M*uKKaBmmCGwtz*~GMJw9;iHz1jHf=zB5k(=@jZmzL<`^Z$jLNCkNr&<@IaQkUk z?BQWXt(UoX7)Slcqr=<~{~P!2&hYEa1or{L`*a0`!o{k%T7~xDP&IJDx7k#ur~NgJLx6gL!uuGwPU4T#{bNS%*&R_kY1a9pd*yzA&fYTT5*Vd^_ix2@55my*(=SMaXigO~~A z%H3U}_;aQig-g1ed5g7Hg+b7gdN;Q5Mgs#2Ro;2-CzFDB-$YEXl*Ovt^A+8i5kD+s z=F=tJI-9I2nat9%&q>w-uK>u!UbBF19MSs&tf0U5D?w^L4Py0^3_h_d&XUPBv&bfs z&?_;38fpIs(_WDTRwEQQ*-O$-kpf#YK**u(7!mjy}3N4Rc;8ew;5y&VA}V|V&H z(hzl*fZwi+R32&@6c2mRazXB1k8zUN7wFgma7%CB3VC)~8kW^ptzIMWS>x z#bzJ=OxLUXZhOwAwQWOj?dyQe#*M{+pM(SM^Zi50&O?NuZ7Zi3L4vyS2OCGmPHd>V z(i=gYizW(+nSfkwh(h+!LAo|EfbFw+-(s$#`0m#Yz;oeAT}Ghn?x1m%`GZP%Gk(L@ zsd^7_DZLB7&Hd#b^7j}$@!3f)K5la?qCs%wUW|Vj?YgY%C6#s6z)+0#VF|LgcOX#u zgVx^ISGG?rVUiz;d@#esaORdvitM5qo!B?R4}2<=QhCp83KeHuZSE1*+Hdst9n0}s zndJ?zQ3Phq8n>h+15BrmxUE5YX<9E+BrtNye2ryEew~Td&b~8ReY92z z?`>Up)7P%Egr{BYdRzb5$j*$@{Kxo{Xe150K-lO0F#JYie(_Oz*!e!g+A+S86>`f8K&~vm{+>V6+fBO#x0M<(&EOuRL?2mi<&+eanN~F{Bn*xuj)>dp#Da9 z5khhI3}t+!NVnODv^>YqHzK2B?&X$z@Vu@3LVFNYyU6ysVU6D}wpeP<$C0sUI%+NP zRe`eH$f;6S3R$-8*9-JZ6RB(M+P{^;B82t;)jmT?Zt8h1S?SB_Be(r#Nq+I=$zwlQ zx^q@j=M-amdGvQWs+8Zx-hXCX=h>N~o$xXfbLB)jQH};wpdFTZWD1deif%%?B>k^T7;F-yD+Fp0E&dVej=_)U{eld98}*DtU= zFy%if)v-srs3^jBjx2g+7H{L>|Is{llUY-i1@(6B{K%u&K;;!alAl@fRMRz`*rOZf zlkcxkLdDNdoiH~fw*d^ip^UzH4}N$iGCbq^s%#D)lsH=XGEbS(b>%nzCr_>i%SH&I z&>|}S{2P16s|9ADWNYWfS)-wMAE^4nUjt&A>lc^l-oOoeN!f-C;R7|F!4W`1vr@jR zY&R!mHHQ=KLMyU1=nlX2GaH#r)(8Dh4r%OGq6wz@k=-0q>kqEE0w3YZ_+VLK|QG9di9}3`-fl2SM+3jUQ$GrBT<`b zakF|czn7D_f_>7y&1b9?{yszfbEF9nxqAJhUbIlcm5T$J*Si3X=n=72@879c&c8m| zmVfyyOY8$>8=Kg(8kX^_@m0Z}ohBw(Jgv`z!Cw-Q3oaC#_!ujiK+)Fg59GTDDM9DIa2o|F{Pbv>sg z>N7qnrr!M4lzhz)o51w2sC4>6#wQu1=%J%c#bf&Om!pUu3OgU9;a2&7wZW!*R2eca z85iB)MAW3!%0KK`w^XHZUwzs#GzwVn-@GTN`%2~By@%1d->=`eDaOiF`I^F$Ah!`s zWtS)|^324_j>6b-+VNxIovD3=vi81S{z{dKeL*EVh=+NvEnOsy;MNTmqOdy%rmh1zQDVrEslT%G~-RKljVAUYQ)tG*FZb(Z**ABmzyBz=B@dSbG|nNpQkv7 z>eg!LLqGJz2tMh$i4XDl*7og3IZc97>8(;uh71eAkRN5}0ppU+o-1Naf{nnAjH!Lk zs=?XktS-?*Y0vo?RbQI2ULno|Ok}+`ZkfHQ!J4$lqW>~A@oRxXb?~=yNYceDbw_M= z?uAhJ*lQ-;&f;5%bortt-(K-$lmnA0@==$g>rO7+?6hushSFkNWXy`stGoLd?8${E z$g=$+4c2Mc`HxO2bdFt6fA3Vh8ouu?dZj^|?DWRS1t<4v097xQlM-busL>o`|^8^=YhW8 z_#?L(b`^zyFS63@)q{?l(b*X~-|lV2H$Lxb^5huHFK#E?DjZX+DmMx12%6@68^^|f zSJ*J;Wu-fkp5cZJ>R0w$L4+}<-OjnJQ0DlkDf1l>`BWk$LUD0Qp7dC7sI?BDthHD@ zf=nwvu-}=)D<^N(Np$;1uq-4OI$)FDZlC?xHvPCdoqs^lH`GQTX#dr@-}&kIOpfX; z)dy5@+s1cxua=0`xL?&%QFPU7zifVAEl6KC&tQAvc7GQZyHdl09b0}cN|&+9ql@XqpM z3iQizc9B4C^wcBP>U-M$hV^or4)f|y!<2rfefRtD*f=mYy(7A6?^Bs> zkQPW=awF&qW}$q6=t~o7JQuBYzt)9jCrfeN6D3psS%ht+kLT*2uEAX7{>K{3oZ_Dk ztWyB@7ikn94?Hw^<~PpszT3$_Gj#4r&t={-CNa}j24c+pS0|+^juHVGwgqS=OvTv z4-tgkJ3aGq^!+J@8cthPXEB2|lb3aqpJ^Q0>x}QSD@FS*7EN;2N>2c1Oy7o$P< zrGxoc-RU~FA6+fu2Sz){HS|}|1b21Fm9r8?NeN>5)V1H#oRiNjX)WJqZGy<$7mQ}b z>i%Z07Ke*vUczpubt1L`fR`Fp>&*^Eaq-GLMbXvnG1SM@or{uwTMR<6-k?Ot^6495&0{Gcvu7g^Gh;vBLJYl&X2;1B0Cliq5 z)hPgaf&n8=h*^r;h$GK%&^&RuAB6zOF$nxxX#j*w8pKtgh-;gtayw{AM92x|^cgtH z1Cz$gwn;mftSM9|{w@l@O@tmi0}hDm9>CFVu_R$4iJbeqnK-xIO2iMMfMy~-357UD z6OFi!v4a7p5P>J#Q1U6P8e|jFdK_TAodtrBkK4=D5qXg2PQ>x5BpBks^94t&hmemB z=a8rt^2DiYWWr=%x)DT8ZFU7gP$HA9U5;WbiDUI3aLI9K)i#2Jn_a?H0E87V2@MWw zI0UI@kAtDW$z1(5`C#lkaEycijU<4GjYox@%$+ELN$K^d(4%Akhi?k-P!HW?t{|@t zf}4ZLDDuwg`ZgJfB;$nxNxNnU;(=Knfb{@~gY_Wwq@?YQco2%Pr3fJnV=BCxgKwy( zsr!+JJy3+>IT_Lk_o;h_!@vppDhb;JOl{{@99Q+B=Qafb@oN>~7z!%m3cP$IsGnf3rp2gM@D^+pK76FgRjOgccc5;4U- z$A6OQOT-}S$%Je8z&SGz_>)mR78^_6!DGO2d8p2GNHZy!v^r?CyY=j7 z%a|(QsG9f;delZf+KE%u&Ko}2G;${5JV^V?P0Wa2W0v?QhvK^&u7g`c$cHDx9-Bb1(JBrF-5bmTE%rl$2e%>Q{+Rk>H25?XW56j_ z1qfW2v_c$vQbg{`Aa0bMd7<%`WINkhG#czh8zETc?DpwuyDPQY=xY93_wQ`0^IAgs>~R|Isf9~T3K zz`+m_%PyFDQSOrXIN$*3pwk&Z~&~4_{eof`=bqTW<>(F zQ=OEBn=3{wfS}kW=G8pt$=VczxQaoZ%pO6Y&!%NAV5+cFt^?g&D8l#-M1Imibh`5N zfiymi0G=K>V78Cc4;@5jl)#Fucux`-pxZ+ov8WTE$Bd`LG33oWC?E9ZUS7mWJT3^5 zeQcCaoCoxxn$Im1+cx8skCDT@N6N=4zPsG%K}yLJ!9wdx;bp_LyZnTM;2^S0q_wgrCX;qa#3ka%Ujl|Ca5^9CMQ%DE z;rdTdGTQ*6nVf#xb(Y*k{0M7mAddx;SC)u*={Ue0Qv_<|!8tHvFOLl7^pX`#h z`%e%u+vF!K+&I9C{Cn~07P;hrly}NIcBPF6}5E zcd~{WLcPxFEcop9KMYKSdYyA!l94$GWFb$g6PcA_!y|eA`~<%1SXo31on@vfCoB~T zGUo?~GQIA&=EY(jtz+-W&BUZp=WR0Px$oW{?xj@8M7u1U!owdM$@r$6e?p7DMbyjo zBGW)eIFJ)7b~b(Cmx-gK_6;uW?Z^BX@zfz+wz48|-+PrBcxU?Vmv@b*@X`8XzIpPS zC!S)fFePfAV()qFZ*_-LDpv~8ii@3MzloGgImJ%oZ_)6!)n(G}4Zj*Ec6MsCoLr_dJ44U(tOSNma`H>#%d=n4D-YC zq%KI#KT)odx|FumQLV`a>-YAys7{4HPJ;(n7)tfW{h__-Sgg*rN^@N*gT+b7{(tdv zN^9~G{QdWE@Zry&Ap`bkdfHzFPT>)$D+e&-BOiwe-YwYp2hCpvc1a^^K+WC7W!WJ@^y^i#`S3KSd$j%nwWyG}2TJ&uIy5m}ML< z3W77aPktY~*-segFm*d~(M@vq7vI`ZJudpHZ2l3wb+gBunE!AHLbpN1kT zE0t;TkHPkE2HN$%c{nA(KIrLjoodLYQijQ;2|TEvlT;2?dLyhL`L9GZTddmtKfSm#+H3*4 zW}|cA)ZG6?6MV!<`7E5pDv%P+;6OzwH9XQDcdp9f-zD--T$EVdO>deHk6_|r2e0s# z{Zl=IdNAzsd%XWUGS;Pt3Jy3uIs;F4rKFTNE%Hlp9ZpaFRRaG+39Z@i*Z9-2RVekW z6g;gC*f%#L-alq|{u6H_O;=O2t=iv$_ArHec~+l++4{Brx!|^bos|Dy3C9NhZwapq z=sjz3LiP^`Xu5Ch%+u}Bc~|0+8?~T%Gl|Ju?l50Q>=sq5gc{$DLauBsuTz~@&;5zW zLm`~;<$&ZviSqG7t^onR;Uk~G+>4KD9_zJH9;!l{aW>oYFK@6d6vKu9O;|bbKE|FV|r_Xt;3+UT4rk*9T!-Qq@w>1O9BdOk~MNv-szdGW}ortk1)rb(9? zRaUt34W`L|(_r^w?(&t5J#`Ujbbds;F8??;b_RZd_W7#kwn4#e?j!j3sGBtK+z4rE zU~+Auk7W`|pYH6PX3f)Q;cs_Eyx)1I^J{ht_gPG4RcH@R`(XesIP?y0!UklxdTFGG z=};=fL%uP_Z_r$Q5&QJZz+q<5+*Um?!7|>2G z;$gvNyUlsmy+>f+aE*kNIc#lh#dYR%=XqEI98-eo&=z8o3Jyy2#m)OF5Qt`x`-|wo z<#=R$Q~w4t5(d*3J%A+5E6}3!P4mDfHM+R_7P0(CiV^eE$UEbnj9}hKP`tb^L+pt@0K*)MPx+&5lEB;=K|DM)%k@eQ&ZKuX# zAImL&kFb;CK%cBB+POyrV5)J#5<;Lyu(ccv(&8%0%R6d;8bR)K@P(wbt-}$VHW`YG z`3OoR`R|_|I#S24j3jB3mGD@zbj2wdkDpb90WI&9g@u?%ixbFIl6QqAX^F4&IUH zm@dfbjU??ay;s3j&TJ<7A7EtzhO#{7SRYUY-hPGoG{68&3e z`D#{%+lFcoAtWZu-Ru1B2{>HSc3uu)$1r=f>le$lcBOZw)@BOI&)F5am03|>qHo!ks9CCpg5%8fT1@P(n5YdQM9Z#AA zaf7+$m^+%l0>sMd9xx<(b#bR&`ioWeE!?iBYFKR`P>BWoY1MEwyWtj{C@8{i)0`fq zqNL)W_`gS4VZsRte>cn?C){K@J;`eRU&pRs`3YA+f2O{u{MT+9&%c^G|J1i$MgQ7Tn#f1RD+n79 zxWN2B&BdOQXhAThBnkRIYX5dOVBjQ9s>?z!($+dwBZD*m-*X>2UlH4dyj~#j@I|Wc+Evg#ACH#YACaNy2}L3UYs(S(*94T hd>DJO$ls9s_o)A8*c`-R+XR+pB?`2hOm1HroNH5^x;$HAENYJ?O zyI)s;pY`mFE$unjLHRzqQK9+XRsW5b!FLY0zKP&w*<9u%$}07Vx78oTUIwnO*80X-R)-{xnB?{TUQS5u1wEXB3?-qYq2|a z5sEUqUuQ)--@bH+l)1dTBQM*BvGi=+=)yyh06QHu=ldw5!0*1A>!HN9rcW|Qy|8M1 zR zuMJd&(;;6YRuU3OK2?9WvoYMo?y4pBy=Ut1QvQ~Ql-$oWGO7o9G9g;2r-<()O0qb( zeo4@zpMVp(FJ8Ey^cUSk0BE>aayVPtJvX$re$MXl!ZJ*C!fHT-&|~TD*LTH19Ohya zE&0I%c~X;uar>oO6Z38>ZX@I0o?eE{h4qM>V$9`VB=c-U-ZJ^Y%a92Z9Gy!1_R!v> zJ5&+};Ui$Llq5|=+^|N3BToPLb`fm*yX81Jq2$dwDxKM{A}3$n#+jGQ@>3lteLaFd zb)BD~nsc$&(J@*~)KNW-)`ltOT{^bBZ#ZbR@xlF2<MT)C}MjSG=+C@<9=L|lnWqP($r*9%xP~O7@Y8nn^xpcRRD+pJF5Z#}}hRGG7Lz7>LL-4~LD{?A#zzq)o|p zY!0RAp4;l44Hy2v(L+;x)3;UoT6D`HBXVV_kx$puHSEwV)FF;`h;mX zsBj%(Bc|L?wB%Z0Spw~;$Zsg9o+BRd>bhoH>SL0$+DP9mR~lLC)lYETmrmp0Bi1mo zh0Ln!9+>*6Yw89~F}(RG#?0#&BcM=%YL0}9+$?J|!uI0W3Lf|IeFjMc)}g_Gj7y>G z$l#=tNNWQIID9ECoQXi9vaNUoV zc$PRp+Sk8fi9W!%{6VLe*!W76ly^Ua6MOHYpS=POV~;lO*=I#(7RF1zY~APG*Pzg6 zKw5jAN+Waf8Veqg-btgCz8LEN&h~x5WpVcXi_n|zXsnoochwlBF}6hli74O6Cgc@M zOyfm6kT)IJ<39G&66sJ%$u)P+G7l06Ad)Jwy-Kurm>^D@U1^lV$m#uAHbI5dBBy9V z3+v+BaO`FFBysc1szdy2v5Lo$q@KquS*2rCYO~*4N3$|cuM#oPs&Zx6RI;zTYLS}D zx}9cxUE)!8h+!a>*Un*y+8A0au5b9%U+kD7{oJ)#0+S}I%tJzb@pT{VQKtJvI!1E2 zsTR81mlNd!R*f=ECBKu3M}~xn-jI|294Hj%W7E-*_*wvmAp;quELRtE>2n>_oh!8d zHb%f!OERhVsl~BYw*fXsk8w%@3%g1y?=0VP_S@q zPok5uxYBh!!GCL@k&-4SD1e5gC${M2(RiHrSkOaLpL?vS4{|yoS)y0_Nr|BuJTjgh zHK8j5m-}-0d15+VM5PjyK)+f&q7zVVcq}KV^+@%hee~QVeSacc;V)uCI0hGoe0Fc4 zLZ5u;qxJQa!Hd!7HeDiZqj(UV!<%{iF4gxW?Wrz!v>N+|rx+N@>OYgjS8Jr_yrKD- zdD~Ym2VZI4eE9gViz8~KPvjcP%>Z6@Q_G7}d`H%br2)g1lAS4mykk3oWXg!1tAFiY zLIy53)-=%@7*E$~ZKxo{tJw7WZ48Gn`SLGGi;iS>uMB)PW|(qOlb)qVlI6bA&fxU8 zOKK5*TiR?vfmj*Xsovwm`6!-s&K_1r6)vg1++`vl4^IO$D6Eav*UTmYvx|J zjbXi$DWb2CN!fw4TEe5S%6CRB;O4*m9%D=hca%}=47XM3b5OWLvGY39R)Hl!D{6|* zhBx|-2U%Ao^FSqSZ=DO)dWdBD2))e~?(W25uq6HB2dSaR{&ykI-17^|WK4FQbr`h| z*YchOOr*v(lGC2B=?k1VSiTy5Av$q);3~O=|BVVn;(;#IWOCqvm`P>i56+Z|NUHTx zS4iMu`Ap2x{jrd=okq)uBQMF`ZsDGAU(I6q54mvgdTW{T)O|7i4db){*bn9gUPYqv zXX-aw{VT6fJ{S;k?F~oIn+sTcyH;_XS1=-c%wJvadU#?S$J`Tcp|~rb;ENG}4t4YbwK12X*^-))BO3_%M8kXp zR?0dNN5@Zn<<<>^P5BF*c+HrWR;ZC@LT;`B+r|r5f6H!6%`~e{LQUDlMCRxDl+Rm< z=3DXGhz>q}C0GhVw%Y~lh*QQrHl#ur*4+t_=k{5oY>TqhU=Ow*{K&XGx~@1WT&Aqz z$S*IQ#29cn_}ohH#n~_h{R4O@qn8Ln%To;1W6*86#aArZ*mF`LgaS zVPV4dx5ynGd-1pNHSbzSc8`lrHF{?G(6V$)PN$@rWS?9Oe=mP|^n#GKu<|fLEfU$I zm|V~!`av&Xf?#C0=IfqXNgaXu+K*g;h(OlZT(^voq;6U^CugFONVD3nVb&<>S9BYn z98C;$-udvP#9>tw^C;`Q(eX*!o|V_scu#>|MV;D* z(`d?7S0U>h4Su2RvWIsIEH}(OX#7q#={%ijgi>;HsEtv#(ap9f$}z9$I949M!Jf6| z*s`9RFF&EVB#%CXdb&*^xySa|`5x1ZBs-pRJ)BvqnQ%C%TV6G&3xelS6-9@fmQ1e0 z7fQcvKfZT$Zj0SRklL@#Xy$aY>)Vg6m6#1H^|b{zN)sotO9V7UEp8k?l8jvgOtTe} z3gH|lJYEgs!v1=9Iw;e45J=aU6@4zPVy(3ok)f@9JLWcoo-F>!T6RLj@2qJwusVVS z2*lSEBRW{M8^un`I$VxyZ&>=A@M_c{Yk%6;N;};@J>KPnEdI@SOjJ@yHM0c*5pJ%22zf?bOu(=9%tfxSDPawaBq_EaNw4<|hM)H?j~ zF9i&w3a;16)@z(bKaJdJUm^Bwv;THk2q$^rXeD$iobe?u^=uabNmY%!!kQ2gJ&R=> zSA(3TNac1z*G4qw4txz)U$L#zx}-h%;!{uVVowKajPS_BZjZ+)SDjSHijdXqWY?u7 z0@G!h8rhQ%vNxR)-wdE5bog_1_)BCbyyCl1^UmhR>pRt5Ndmn_#Y+P(PYcSPp;MAQ z$v^Q~@O#?owIXUJm{0Az-x^V9ZzF= zrkI-3Hcls!djiN)Q&oI(7xYr?V!oajZ-1Qam}pC^OH7EZPB>j*>7H295PaFTxlZM{ zzu&S>l~C7Q-b0b<@g&7#-*8_up$<{*jMp>uP=W2l$zrNyS0}+UJa>aUwLTa4CxqHs z<2o0D+tg*B&v<`-v8*e?xF9o?+wr8-PWSq<+cv8!Mf-p`F7<(S~K9-Y8 zo!k)>zqWt+h6Z1x+=gx5^?5!{I#$sooOI2axRtLJ3PG#&iEr$y-Pr5(PB9~+l{c_;n;>;;FALu>5PgKnfA{>E%ZGvuE6q6itgr9 zuIHoNDPQ(kjP0$NoT~$01kM$j5KZJ{jXufZeR=-*=TPxhe8cLR-hm;}_3j>NuVE+t z+qkA9$6Grxt4py%8NvLjY5^9jN;*^)d1CU8dD-|CLmA=xgK7b8t4exQ6nSD|j%IK1 z!-g_~_@Qb6Cab+qskHLM=AmpR2zi@cES&#ayiL0Whu`Kk^ZDc&7wUem&&_KFhyMjJ(7@{b zm+JoWqUBd`eBQq-dWAWC{!rl+oSk>s=MP1H0~h=c6};ipyvu(q`Z%aw{bem7-eoxa zzZC=4X|Mi*){R$i4Bo#+^cK^3|Cg$Cyf=K{f1T*x$nyR#RK4Luyf^+@(Z_My=l|5_ znFT|LwNt3=qD(Ul$y}b@K$cJdlYdmk#CApSd zGUhvUd!5^$8ZsfTVcq0Oa_vpYtS=eUIPoyS2#HPg)l!62Fl9`|C~ZmS9WkhS5U&bBV$*!b6=8c!8K@W~ z44FI(MpbX(RS`&Ry04ZJjEgyg`n3{~Odf<$)sJ`;28qq^9an-mGG_?AR-%*1BVtqy zB3>1T#Afua%T#@>m#EV~JN~AhFrL<0>#mmW=w>N(M4{oQ$f8#H(_U*c@N2$FK^P zjH%a3wlaBqjH)Tbs|t|VT;K7>usxOx)N3VgnLJTO)ePcQB}irMuBtWuOr zo;0IsHu0(oBsSl7TovYcCqpP!DMKbtnNc;LcvTe=`_5NO4OVd{LpN5bR3=Z8QT09X z>Jvz8f$z8)Z0}BnXRK1AOr8OwYANxm1|+u7SL+Fk>uyGBtWuv$o;jmx1@WpDB=)`U z_!F4p-HiHJrCFIgTSnDt;?<{+*dkvoby&sSjHy_qEtx!5M%6mvRb5DIvG2G#Z0~Lc zDpm?ylMf7t?(V!f;qBf)W<0q$mW$Ys*Vw_T0&w!`f6#z zD%din;*@M<^QswDzY(umL1HU?$F*U5Y#FFHC2!fhMn=_H;#C_+Y?ZIpQy3R}26enr zlx$uHqv|5@svRV@+IRdZ%#l4qC|)T;Hm{FSb%l7<0TTPkS4#(0!JeTTuT(0VH^!*? zgLu^m5?kXtt^?a+&+v>_YLv~JWmMfFUUh-Q*7|Dc!nimxQsb5SWb;-SRriQj-5{}b zzT>(uM~;m8c%@m{ye&r6BjQzeNNl~YmL9BvBV#IFX-hWmh*1?uyy^*wZSWn}gY9u- zpyHJ<zJkPl_SMpdaox+HPEaC}%Y)ojy+pF=1Bq?)9oL6B-m6}QBVC?J z3^?ETI3#ejCZ30>Viv!-===A#A6EpfPOMV-e?!#7jN1els5?8W{D)d+mo%vL^ZVPJ zjeC{_&NrN5lVeg-clJ>wzx#6kHP6zkiPM)!fT7>?_Fq4`>U@0Q5Hh;^9`$1HT61by z;H(Kc)r3eO$C`6JkLToo{dy^;^NoFI$S9{rfPrLPa|w_-_w=~d1U~Gdcd{J7(Z7om zS@ZPE(o*fiS8sl@IfXW~b+Z^x*Z0XPxW-fAgo~61Qw=Du8_nXf$8Q};3sZVqktcT> zN_Ne?DGQ|wvHxUj$sa<+6=L6c-@gXAtZCuE{0pq4$7iU^YQbFXuRkLsN6!nj^RVVwWk@ z{sEPlCRguvQt@le0nJ#o@;lbgznk#;mswn0blfm8<2NX)KYsBGR9A~AuDZ(KtIB~ls=?`sA=o1h_o^)JEpRo?B;jLUpK^g_Nn?*3 zP6WT}&^Lzm%_M~bUvfdSIsirPDhqB6a(UjWoaRO~J2~$^IZO*h=06!9?t^{t*NSefDci{FoNVr52eX3+Q z2yG~Z8u|Y2E3pGPQ(qi%1M~Y$4^oJzjeLK;AGObUK!5fXy(#}KJK#cR@1Df&KuYk! zz&9(Q?fD$^tUm;LlfwfkYlBO;AW;ue2>GONwPOhR1|U&8v`=5ii!aDYisREa4U3C+ zJBTmP(p&!SD_?7VdiOwFZ4#n-pp$f9-C@qHrhvc_E~44wa9kSjy5E!}|3iuLH>K-D z;kW7B2OzUzFy18JO?f6?0?4cxaT8App%8;_mULk4if{W_U3;=Zpx_^WWdw8{xX@K9 zu<$nBb`A->A_sk0QeZoPCMYicgoMa-fG8>;u-$^59_aHnA(5uMxCZ$EdDKtk#MIji zg`q32r4I7s6iG;)v^prfeW{w03%Pvv89z(^!#e{5;(oE5DP$|u9JxytO--E%3Ly>= zox4z517o?RN1r5(-I8ic?&o0M`j&P7p}ZkrH|pH(1Hf)CVAq`|y&zgMZfmrJmiwuW zrAF(sW}ngCy-`+#i=_tP%_4Sg)_Fb6!g%XPdKOtcCvCKWvIrMf=VVmHbw67hn&Rdk zYRABe3$L4kQ@Qrf1HGo@lD^n-8K;viz3AK@Jp>yY@E`ZJ0+zgua1cwpg@rt}ggTEJ zn+?z#1CxqQ$H%?jez0p<&;R^c(uN#*R`T?HW!gT6lD zkmnq|t?lt}A6S1QE#4TyiH7`)OY_;kfBZqgsTM*V{oZ(L@wB-?O1$lXJL(?3a{$4% z)$q11O1A#0=hgWIw;8bjOi1R4yr6G~xd-y_!@&Y!s&hyFw@ZCCNZCmD>o0j@5b`$1 zaa#sd5lt&@WWqUl{RBPn)BI0k6h(Pt4$3b#SV~4TeoUscwzJK2w5vii^C4~Ou4M6Q z70nyfCoduu%XH*vMr=3j{Gaq~&&CdTl#G!!=jJZ##Msy4RSLhE>bLS>ZZp>HSzBxO zsM5yCM=dOex9Leo99vX)x=3{+xr++3kZVP{{xt<^M>_>OH4`=!@3L=Jopf!RAJiBg zqo+@2`9i&z`rN9ImaM&w_tU1)he+XiJ&L$k6x>6a6ehAL?5FzrcrjW;RpRc(zxAT?(CawSjCVWGm5&C)#))!W**;pc#EfF z^@v4B#TktWuEWk9#D&4gE?hun|Is?^t^aEs_I%U(f3L=#ZGVSFATBrEBYbq=`6!`I zdJQI?0}UTNSmF8@lbZBnx< zZ;^9vMZtI9^7icL+a$y+JnXg!cK9z_qu=xfi+hNuNB2qIwIk0m5p56YZRb|2Fy2bW z_~9e%))7MocRl#FK8z(nFET$WK9%XmVz{VEPv7`Gy1!mk>!w_2SbT%cK8+*0Y2EW; z@3D#?daSjS#Eq|sCob!K#SaEn)%f+=7s}>K7o_NO`o}sZ%jNc4T-KM;Qm;;jrtOjR)pSr~Cazvx16SFZ*R)?6))!;67zT^QPqHfC%LuljZGBaepbK?){5zcGuoKGM&=w$6Kl>5_sOJ*~^6z8)=(s2`c5?t_tl5 z|G0Zy$1jbI_8p7<%cAGqwI7>oj;?e_kVa}rz3X{(iC#OX-TE=ltST9;nYrvNCr0M` zTqjnOw8@N%WNCiTn=EafMD z-L*bV$j?#-)?BAkGbm221kBkq9ZXFC@9sQ`N3OoC(0#KYSNNsp;McUq?sb& z5kj*s_wtP~{TWlUn=aqXpvS5vblJ?^z0E_7a7Nz#SgBba-Jx+;iP2~!^*vCO?7#C`fivTN$9EvbiG+XV|#Po*kr<@DJa zf2P2Kz8~&}N*1aTRX0x}X+8Nw?%u5kjnUsW0PZhz=c*TvMU92?mS@^LB2ko5>uTMZY?=k8l&VI)5& zR??UkeO;7AKwJ0kLXY{^WYpsvo!5;M& zwyzUQgjCmP+tHf{=cdTPn|{5=mG1O=M56oy!}nN>Q{Q3SoGb6eLC{u9dwvaSy{ohk z?tpERq>2fX8Xcq&;d}#8WWLXCx81a<@69r_`OULY`u&oM3;fHi59x?am+tSZ2Vs(C zvTwd$@5ulB19BlCmBMhsyX5iDn<4jh-Jyvomqlkp$GS34%a#ktL;Sy#*ymV<8Ms(N`@*c zJT!b4$XUC!*@v2p#tP`9I4p43#9R2J$Ma?}3<-5*AP#zt!?d?%{Y3o4!$|j*f-jG{ z2J*_z=sZ{bx)VFW5FFi+Y3pvFPIrMlRFsjO4r79ItU`cnGyL8?@g^y(z)wG3>S*mD zzkSOUCzF2iB7J^C$?`+H{R_8jnE`y%8xv-oXN062g%TGdvrY6eg*JKLj9khN!gH6U zk%*=H_$av4CMT)*-mMh&%>=(r{Z)ys$x9Y<5yy{JpBjd&6P=9g1>_lS?9+XGTbUJ% z{76trXJ@0d`7lF2sbDiSyIW`hkEQwuL+VYPI?VdgVuo1i4j!T+NRb=8Xy=cw& zJo`!1gGiOsnOD?V6lWzR$Nin@tf5TV z7y|Yf8}hOZ@~K|W4!a&Yhj(J@-p)#r(bcN($7BiXHcl0D`jBVUuv}P$q>uRa1!*Xi z*VOwHhSx3V`z$fC#CPoTXP>pFn0Qf`Z2i7<5_?$u_*_wJajtAievr(o9k$oaN|PS6 zF0-@axNVaW5a>N>C1z~koOxyFaFkK?p4eU+_ozb*< zJf5Jt1MLTaxrO!2tL(O)B<8w116O~zB)e(Ps=ikU_b+L=F%-|H3tsaVJ|7yVG1^U_h zS9N`d9Y;gH;vK=Vm9)r+vrSTud(PRCeXZk;uU!TWUmipn!{)Jt3q`zKe3hGd8 zYu0V0!J~I={$!P0vKS&lqtmPQ6!)8Jx(kuDk^8BbKR%64$HXINj>q&P6hattodc5d zWFoU<9-_I|s+A`mgw;*nb;lgpU%xOheM^Yw#gb2HxXi;M)lKD>a%;(gQX}<;U3ujO zQZWlWIY&a5OQF;mpW^$Zmx7Z(otpV~b`+3bl&r&sdc}8t%C2ABSkYl{kKNU!x_IC=|cyWBFiMynXeYSluk1 z|6x$*p6RoFt}N@)BN|=aDw5W4udh}~uU&DA>hfi64ae`X4=7-g#hCl`qOxzS#hL49 z;}l=tbL^hOUb#PvQh8kad9B4psqWCP7H23zk3JnZ4~2LuY<*(^5_tV`OAz|(L{)BV z7wVVVey zzSwm$SfzaB<@!4L$eJzQ#INy*`Qt;~V1&9?JB9+a%KK35_)$Sk>b}Fol|+M;a9Fbi#AZ@pNVdFda{&R#k}RM zgb*jK>GI|vK&NX$YnQw%=KULY2dh!$LG#!U=rcLJcB5L6$N3&+J7=_QT?z$Y7J2s% zvq*~bEb=^O{{11yv#hx;y2k=IG#aqsaXIT`j^XCBP~N)NqQ%+=7h09)dcSZ-@8?qUkaz4KoQPNqZ|uC)jdBTX6j6Jfey?gY%;4T;?aQi9aK{=8YTL5tv=SPU zf>Wjv436lZ6(&ozAD@2lrJLT3GPzs*R+MRN-$_I#e(`+{Bj)(6oN*^?vkA3yrvP6s zgSL7aDyz(wiJa|0xLtM$kq`R%Um4C6u;0hoT{%3C-m;F`Ung1|naPb^6pC1V^L0-c zF}P%8#m;}j8dAfQQEQAiVx5@2Um!vAL-*v&LpF;gE8_rv*&iMdB?2^zte+{_S=-oi zJhQel1_y$N3IaGyOIW)@7PXN-4;3+H%*V=Ox^^en3zk#SsFXFME&vg`=AXn)j74?n?@FR zt^Nrsk36n9J{bu$F3-^sVU3CQ`Jw8in{LU`6Pw)#whe)w$by+Qab zeyz(w8mnO}+L(=;z{0HEwHTsCruUeS$3h6SzRPJ!JNMcskH^5>tQTn~e>i1*tBO5F zK|GU%>px`qt8f*}z1rR##a+Zsz$9|P9FJW~1WqtE8~Sha21`q2Mn+zeHWSR4UwGKk zFva7q^EA2EK=E_iMOGda0k7up)2PiVqj#f+eoH1KLLAy1kroP?_t(ComhVF5e$G5( zUpNkb_v|M+D*B#G6R&2Zwu~V~O2pvJ53zWb#ybbwTaMa}pXDcwAs;!9`C3J-3<&8I%jAQd=4lOO+VGsT zZbB3lJPGt~<@l=J*e5Ey$hCEymY-y)=1?!sZktz6!wDzN<&ERLLtXKit9s4dkNTWV zE(qN+CT3@Oxm(Yp^2LD!Whf-+@-T6RpTj;$aYMcJ&H>3VjeJE>=X#ED%JAVu@~saU z7e4jAe!|sP!5)$s74}v}Sw?giMzo#oYjQZezFaHlh0S5YC%rMass8NH%^7tC^rwpK z&@M6H&)Pq{HIV$?pU)ia9jsq~E^UcMSoq!}^*`{q+#&R=_7T;fXxK;0><{+vB5`Op zZj87b|NGbVFCXmQ*QpF)CqVPjpmCVAYD=deL*hIcg!c=85uE2i1qM{ z^t~7M1Y3-0m+mrQ*#iNN<_|8Itv0$Jy&IqBbdA)knn+98s_PWTy>%PCR?xQUR6V6? zwc?_=@+{C^JYBZwDmDcs=9Q(m9KQPbWeO%PVf-GIFo-cc>CVVOke|)vJu-iG2_dJIMG>nX2)#PL9oyw52ML+QkMJ-@1dnqH^ zLRCRQa3_vD?1xb;vD$|V&#I$YC}xC$MNEQiHQz2f9^aTw-^z=Z8=?S(X6 z$#v6HzkwsEb$gnv#;ZF1AAYnQ#gx+VXHI3Z${w1dZ#5ghXXH+U zCt5KLx%utDS{S`O&vE>Ht>=3(&q=wp5PEe&(W|ye&jU?U-C8q^{8_*;h3cx|Ky7wS zSWlx}qBf>Ikw+&>is*o8uf1;s9O@_W9B8qTlkJlp^sajWM_LbuP)ozn)-7Q@>l;M} zUFv%7=$`@34KLAvC6Aqf+}0ZRMo>aL}OED;rSjxq7D)dR|9EJ11MS4^9?NDjQC^ za?xvt1(eoPp#<3xDd?@C31Q@Bh!<)hV7lRCU|Ps4*z53kheo&Pkn~*~6thcmdE9jMt+QvlpOf1>Igw&%~(>&3q(kSG_bRGIAdP5l9=H+s- zH^DL0fZU!nMimR!qK}W%P_sSLr}H(%UiD4!)?NokH1(e7S$h}HI_K$z1uu8hYpJLxXmf&teK66dlrFI86 z|E!5vOe@;6^Yg0d@H#o55zbQdJoNH%D;_fTJW3)^cXRuM?yeAW-(BJ;BydI}ygZLC z9#2H*jrZuq2-oTKSP!9*L-8A4X!mRL>IXj`{M<^L{<>70;(juFcmAk(zu@T9+sgx$ z=^EsD9PM&2AKyIPfSjKwPV;JP>sg5(+mSszWOv`+BtP9B>9Ix<(4cpkuQ!gQc^x!! z)OXh(HWT!iZVu$`&tLBcgNLY`?uY-_fOl@HBto^#H zcZ9ML_Zo|TDqOcf%3*Hp>6nJv<}eqodm9u_xpw4nifDL?-iR%pCVzK^6K zx0-Vg9?yH7lo~Xcg|@Zom2=YE^xApW?A50c5vJcvebejY*)w$JY(!YY{8A~+&5qWi z>aDSzBlPL*uU<>?E-1I7D-DpH`CLaKPjXMe9UAzF{pJX8vRD|$YllCO2EO%uX~Eh{ zrnRSIIwPi`>T5Hyc=$xGc*Co%9=&&r(!(jWL0>tDP$-&1z28Iq*h5aNom7q-p!so| zkvD(Rqd&rZulY_JG+mHgl_q%f_=QZTU$U%eNG}_YxT?`+sLWiA5GCA9# zbN5g^YbV0R8|d14^oS_sB)Soq6_Z>;N|4!nSi)@a#(qUTV39om!V$7@Jo zphLMp1G`|SwtP>#nt*E*TaXbv?{PL~7pWCzau=>kZa&@)c_2b8%-A647r%VH?ei1V zwn_xf)<#z!8iK=VLx>5A;+R7gSKh!zxX4{E*Zem4a*8izvW-3|ej$v3v+4>?0G&49 zJ9A#Q%GuAnlo|n;JA~3#@xL_swLb~BxD`GX#alv*V>0(yL7W&aYio0-EH;ZGB+Ho% z|7(kP9q+vxQD0_^C?`WL7xSLXFQKfj{Xh{Plz zmcAO^-bmH~n3fEmqT?%Jz{y$o90!FdetJ zt`kRsurt(DV3lRytY&43XVm5^Fy?z1zxbu>jRsIhEG@^5=rHbh(ruyH{ax5{A&q-G z;^xs(*eRyu7E}0K1Z7Ja-xGx0K06}Fn6H$TDULBZ;b~k9BKrNCp|Ur1=f;7$AcouV ziwk8&cTFo;O*hVs0}ay$br|zivyOFYvLVK5fXmMtmNK-{RA86=X!j2?JygSbJ#Mk7 z?5Real%cIAJ7`)BVYkPQ@H4J10qPi|HJ-+W0KI-XRQ43;wSgu(D^M52a4mju4(PS| z(U0}-8>Txq$4|q#8?w7L%tNd#LN+Wyte>m@DLWOc>KkA;u7GXO2elYiR{`{DY>2Xd#$+P8df|+e+eLnrEkP%+iI4@K4Ftx(~0vpHrD_| z5JM=UALxZlL0tA8yKHkAlob%-#I45WPvb1J)e!wj=uQT7Hv_t#0X@us9)ElIGG>lL zA-I80^Uv9Fi$CieAm}0UWl$gr{qKy;>&`m|^f1cTR+9o4gXTkJAEwSb2lP;?sfslW z2+aozO}C9Q2UgiOP%z9sjq3&mrdtJTowFu?T=p|SFh<+3%Ps-fby{&#HLO&K{!%~? zOY_EO+XL9TY_c0VapA@*8h{95c!TH%hMr7uT=oI`xzRQNyW4mL#8yZ2Cwtuq5RPk3 zL(CF<-(<4?67fASt&2$b&Er33=4Jd@-vB`mSt@e?sSAu(0BW#rfQa(7*W?GNSBALu)2Hz1(++FYGLP4OvhXRJ=dt$bVdde`hK1(O zsdM8%!{Wrr2s_ZRHCk~s&gcCG8jkw%y=)Tj;bKwT;!mCPep>+%E3Ibb0XVA*j9uO0 z7aPk2HR5o9;83z7nt?#3T4<(D8M~IS62t*@;=}=nZ5zOJu2x*GvnDkw0uI(ieVHv2 z1Wo71Ew1PQmv8F>b+Qb$RjdSnY1eoE7}MsS9|>vLzvN!o+Jd>)N4k8DbZLro`Jz<8 zsu#RH+J z9V)A>Lu?yr>aqfLK@9Bii;F;%tt(iqH_B=?;;w^r^g#$?S1`)jY>0^(;PS;5uuf{u zPE!{&{pA0tX>Q^A=$_&QOx7bTS)nEsLEz1lFDim9Wm<8S&gb0*kfOdUmeqohcpta; zc%#g{>9-uo^HUrub6?eoQ`GpaNX-Qywu6AsxWD@&l%%xCZppVh z)Nthf~cwE!W}!9bu;y-+j_>DF$b#e(Xbz^ ziYKKdqWlTuy_$1#8fKpj5Vgqey3o&ctgJ6KFY2a9?KBTeZ?3FZA0F=VxO?(v0)`aD z1z{<5?p2coB<7yM$2Wx}ka%fXfDsi*QjWg)pg`07@_2&ymyYyZ5s$r^m+~8CF^8r% zgH{9Q7~KSkwv-(Aw`c8&72Y}r0DT)_@?ktCe)tCW<1*Ot)2z(jt|id$YGx{In7uVT zy-B|I+qDV*aqW@xn)PAc9*_Gl&;d&-LMZe5|LKZk;#!gfHPs)0V~0ANM8 zg5#IB#J|8t#t;FBI{v8dro|1j%_9I9VC2wIe2e&DYM{$SftN=%)#`cjJ0?_c)0MS7Ao znMQ$HiSxoj-dd;eM&lwSw}d;<$`_Q_E;y2iG+iLZjZ}Jth543}_7VmQBroUHCpKDd z3<#c-jYt!w3T-5@Hz`ClS>zjYq>?w*6^5s@7?>>NQhg$w*zau9t*E3nMVfGkMIs4( zNQvHt()wWy$tdxVFub9~xCCL5QWEXFtfCRw?_8PWA2l*eINF|l;9%=j#$0Euz|C@ukBrx<*fFzd!e8VVQQv z%%BtEaNfRj1!y}7fbc4l&X*oQpm>x;&O)IYjGdS%nhPS3;fa!g2zM#EwEAe(q03}= zK92x|GBezA5W%9)%p?T+Tc&80nG!pIF#1Sr<`ICf5F$~o2gSXCcUc1NO9UWrQouMt zglEtsx-8KSv&j1tA3_0yq&~toAcAOCA1ei3v;;h-kJbW=LYTiz7>IB)%w*iGmz&~C z7`Edr0KpoHWdkD2nL%$#!rS}O?V#CLf|g_!xd6prICgcG=mv;DjVDSC zB0Qw%TJ58K30V84C;;J3KOt*0fMD>pkM$N_zZ9IipEewfLX`hz z6o|kOWbh-7@ra_mP@Gi;#2rzS8F=+rHxZlj=H8xeYsFb;q3V@&? zBc?9{M&Y$Yc`g+94qmVf{4I!}Mgda;5elG52HB#T=8;b*KEwhDpZW=FK?LvYK2}yd zVp(`=KW!Npg*bnkI1qs?%*4XHSBv6H9CigGfKUm=ssa)0%%RD$@a6vWPtbOD0AVJZ zZh;Y;3$j_{dK824*hkr-ULe9fJkfg~f&oR>0m>hr*Y>pcOB2WyNeNVuC zm?Ii#u4Dwx1v#;FIWP)|66FXe?gP9|IXILAKrp3%nSuyC&?N61(G2rQGYV)DfFLtK zC>H}DWaRX*a^b1S!=DV$4uerh^50AX5xB!l%FKH$Da4bphi(H16Hu&45aE+KbV45P zGLSw6ZRY_HF67c-F@bYIA&cCWLiG(cd9G+1h`@&@$_FCYQ*V4Km5aBvkQe&Pdr$uBa1vCpluoxt?d<`JX=Jl~k;`J-Tod#*CTYxBJ`EO={2vT7t zFpJ(u3h}qtWGn!}EiNnu5JAQQs;vS~7)-y-)h-Pnh~(3Wvw(9!C5t?kLNyy(Ghb94 zM3BW3l?4&vDY`xl(sFPu%i>*p3?LX<;64KpItR^6ae5jt2=(K?IC&x?N#NZFVg|{&0*pvW8oWpcQzsuw|?b}qW5}bZ;E^EH|q!KdT?4+YL0>1=2$6QbjpzQF|P(tGULk~N=(Xs(~iNvmX*-dnA8Lyy!l%Y`f4?C zc-CgXv&irWviNC!1wPTVE-vgKGcEWW)cZ)w5j7@vVj%yZEa#!DDPT^kSAzemiOg?&JMIR`ZYX53nZo7ZbC8 zFHiq}G^l=|{yW|(ens_HRR5))b-xDi|JwmvGuAlnP{K`BC=cXKmb3aVz>T(_{f*u8f8O2S?Exro7qM}l&r?9ael}jtU7ba-`D!N1OIXgb?&WyRp0&_43A$3{|uA# zR}_9l;U9RvJ$nTGx~cw;J#&9e=l^~>rB*T@|^*De$Tk~hj(eJU_{OYLvu2a>llZ7Lvno5RIf!v&JJ z?brCj=1zcZKpSYrkW`Xa11OpCxeg@?<)CdqI{--Dc$*se!Q@Ra8}10~*q&(vox0IN zgg;CKCT}cMg#+v7+CVcc%;7dAKoRFqT+#p22&Pc$^OYHJqrXJFY%7H6%$@e`Q&0LQ<{z|4n@ zs&HamA6Rn&7Q(WD%%{kv1SsMh)+_qofaL8=n;lHv{NRq@vXv`f0(d|1OxqD$wz^AM zco$6GwD~nE$3WY_LYOR&ygi-O*8!8aDZm7fyaAcl3fN5O9Pol3_(PYVT}= z(mJy^PB)EY+9gIc6Z)&ya=Q*=JYp~&rE@9Ylb7`L9kT~e5FRN3NFG|)X3+3*=e*SbTbR78|7m}(Wf9J7N4ZW3ye|oxg zA5{2j(eMkB)pJlH&C?tHvTe*sPF9OZ2d^y zjj}b@JEOwdYqoJ452o&FI(i6fRFkX1=XYS3F)DHsQhVbItb*ULD*ClX_A6`-{w;g3 zxpcp|eK(hGbLoERr){%0HhbfD+Z&AoyrNedOLjC%r%}MZZ~2IY1zv8d zOC7A+vVRWKz}z!`|5K4BQF?u8=(dLu#XN=WET9e~5T^T6o9`jqIN~ZxE%bl(Y7v~@ zpR|~axm+0hoO`82o^?9wS(G&^YyQ6Ikx9HXW4*)vZ;fBxLq8-{o(*z9gzxmYUd#pA zhDrH&imsg)+$M<)rxRG1@_dU>M&u49XX{G(5+C6;nc6(u?YUt9(UO=L%3wW{uUtSQ zigOK5|6~105{y9y0TT_HKzSURiYb7I*}K6j=mcO|90)HHY3R3f}d@QIA%WW2=glIP#=t zhX_O6uO0&`^2TZoAZdGj-HibEL_URwvgX{^Bzw`GUkAJ<01H001#BB+QQ1csq4C+o z{b0pR5ahB&bF8y!&@>-AtKFG}ohUZ~l`C1#2FM-pYNNY(Wp)S_Kji#Yecvwfh^~tS1W%r6%Jzl$f zj$tZL>4IZSoY4vr((?G?g&j{wVKw)9K0M`>X|=PcC=#DEI0Xjd5nhD77xBU$JYk-& zZQHiN&Ymof`|J|-k{0414ML=(m!Z$~vC6EobLw1$yMgqfvydqNMHmdRPPG@}_At`X z&ZIk6F_Vnvhi!$yw0IcIeVzF67P}aN3#O;oS<9|cXJoaFBj|`kh&#A;U1u6lkd5i& z>f+3Qw&ATEG3)EhUas{+iz?D>vNSmel7cXBXw5YZ5pAFmae+1cwO-hkw=hxp+tY?K@e#`E}P#Kxq zj@a6hqXnIfE^mu*4T57W^QP`N@l5e^s+dOV8blH_a^4FpXh&mReffmCbAsN{h$v_| z%R<~@)s=U;W~D#A@b`#QCjYvvs?vXY>E5c+dfNR>!bnlF-XfpVHRVF1oo`?hto3fROz6J^WR#1S;NH&pgj0Xr>%x`1}ODNUNbj zLi#Wbnzjx&p@-nqDUHAArgMOXk0YPAvzvpZv$F%Q&jZJ3oe8HwDeAzbYh6X9k$iTt z;EuvagDAz%L&U0BR)2jI(f_8 zrsuH&2|85FT_a722GqPlLn6nf&G|}ZYtix3C29o*h}Orv;JDAhoFwxKxes+lUnh-H zP0@?8*WOs@^Yl!RmG;z2W^v(4EXpEQ^<4O-bz0Sv%A9acHceyily zM4SSt=UMI$<^*daRy})^Ro~@4b`^03x!D>ty*M)v!>t}6W;z)3^4U|)(F(Um1+od6 zuTIl;FU;wlTmT_1Y4$`WY7t_aswXawhsF`BTVC`q?7WG1h^=t$25;&^_SDE_5AAZ; zmsoGuS3L@oqg1*4>1O3a(cITg8E6Vlty)qtWsi#2rbB3o zeBURWy9mx4lX+;>+vadd`_quLJ>8?!uG90ZVci3h?@=Qq7||SF+uhnD&A^xIJO(=w zDr>hUt`Z9`-Kltb@0`xCZ#ZxugCpW{*(W z=Fv?|Ze!2j)Vk??KWK&}!|g;{_|fU`5_zUMTG%Dq-0!ij1mnw;LPrAZ3TUDOi$P_d z65r9G&t6jRnor}0FJrx9e<(0?1Brfb_)`8HzV05rj@It@!MkRp5;GxmacZ9~)Mg^a zw91jvktEWHev(L9@HF`wlRl6&MZ99j0J|4&-|h82F^}=v8~pCM2{|PxO8)QmME3N- z=Ij{fpc5rbKB}eoHXS6BMTy{XSdr_?Vsbg&Jpw305wjDQd1XP&ZIlL_--sW`{XPQJBto1+ohU!)z^^D zPQ~veyK6~U(<6}`q-vCZHGX4wp|q*FZlKgNL&?FnO`ecBw>(f@Zy~9l^Dr7zx5dK)1T5$f{cLu!&3341msUh__4;+eON&;Z!u zCeG90n;q$NAt&-15)|)OntW0&_l+i1Xt|MG+IZR>(6EB2u6xcB&LHqk&{treU`V`V zWmoeH~z!4^j5{K#XtuC& zP+)09EGoNlvaD4XI?i>@bN1!Eor# z73|}??fopsAZ5x#bD{f7be&+qgnW@4`fE&!X+~4shy-2UH^!$=YwE41$$hI=nhSvz z=AgDH$RAO(eZQrB(9IXW+%I(j>t}%|XE21{klR*qy4rl&m64b0>7@@_Pid#D*kA)I z{7GR{t2|s@3nI1_5s;<+!R{eQFp# zb<;&80TOt=yPA8jnx(JNhiElQA#0S)Ws`JgV&Rbj+rk^g;kbdKsCxm0CFROCJKiQ7 zMh7dXyWtbhpR`OTp(8u7@8wh>us{3C@ZI_k}L;WC`~;7jh^W zr9CUZvBH>2)n@w6LOhk(fJlI8s*_F4?9*kF4V9aZxvDq^msLD3nsi-SSyf+DD4Fk* z{jAmbnr9-JRrE5&m5XSXiU%es28kW-pjJUo3koc*Z#?h~bL=5B$aMNhZJ@G{%I#3d z=yD0G3bGu~C7_mTTh701`HRrSx3 z<(gVSqFe(s3g!j^YKN4=^PN{KI9JYiS2N)h9eQjiQe>l3dAG@_LjPt;7 zs0DqRR_LE)n|$kqo87{?j5RjbeVU$9IETj6`_Mla)LWnXV&SVOc}K!z&0Fb>v32H7 zS#7!dP24w&+9^|s2eW}&4plVMlP{ffwE~V0s2`kDXHd%N-io7w!<(npGOPEtzv(@2 ze!|oIBK%1Fxv(tHt;VhLTWH;?{jw(2xxfH#A8!W9XJPr5t$og8U7ksD?M+v6pjFQ8 zZXfyNtu961`ixD>4bbP5ytN*b?&P2HyfAj9`{+ANYzCda;&|NnWzMPbrks+PX&(Kd zQ|-9IvP1nsf$c@6clE2gZQSd56wl3?>S~)r1Gl<&?K4bc=il=td|hwL)8EK5sVF&d zed(C@LG-8`zP%rX2|US5h}m?l_$=uxV5F})Qas|vkf(C)!@S)r3s&o~aOFLJON%+!6Og*=Jx~d;4+uzsK-?;Yq`df9$1CAKxuxhlbUw(=4 zdUt2W>UM9+t*&j%CDl4hC8@?4FJ1%vU=A1(WN)~I*dG;TBYZUs#E z-!xdxE4Mu*%%yX7xz(}9vL`O!@j=fzv(mf$7rfKgwk;0bML+KJ?g|~d!w=F-@^_Gu z58ib*Qnb!rI_g{>kXRcC8n<4zPFcQ*!Hwm)f660Nup`+p-e+!BxprSN(`fW_NWOod zM58)fmrB@Y=`i((OI6)$DkXfO+Y%d+`|%WScjM9_sVa**_)PnPN{zL-A-R@ zePV8d2YOk5uy?8;N^+WLR4+63iug+{q;6}9?yCXU=Ce~m;y%ZAR?fsW3q8be!w%p2 zn2ucUv$0c}3eK6)Qz89g;(nvwznXaNtdD;+x!Bm5yAKpPb>y;FIo z^HtvBD|d;I>!hX%f{5#b9~?5=hW*8Awv`;E4@Bz>97O}K!-ANsFUVql{1$xO?A9sZ zHv%zyS?F~b!o>PQ=E&yss~71V`PySz_r`Q>Tu+f?rFXyuBQV}mIJZ;k8z9`dc|F9K z?xG9n{AicOga>HC9#p^NJ{HFA1#=%0%4n}jYhOQPtYVEcnM^mE-w0B_nhqBf*>D8W zo9fm1-Q-rh-+Q#Vt^952$?)y-o|?KQI@vn>X{5_)9()7 zCiLvrFo9~(M-Sho_3YO%fojut58tNnj3?zGJgtSacIi07Tl*G9U-Okf&t#^Y!q_{6 zg3o2)3~%GxO8S}u0zI>tEed1!=~Dy*M5Lq_sij!5q=G|&5dPOrq-2NA%YP0m*fjzW+|-Fav}1f{1O%UlBqgwg|*u z5QFN;Z>1R+-?aRm@OUdt!uXfPSB1wjS%g%gzauE9>SnTjPwZ6Kxb&SNG5Jg4mP;QY z$zKsid4#{CMM4tj()U-z(HiYv(js)>KSlDlh$9&Lf3HeJBJ0Bcw~3=b=zpVn#f6`M zws56XREiD9$Ja7M}BJ|sxvHLkPv_ffR1IP?c9+*Wj znS<(>L#rjNP8&bOmby!C2AZi zp|I>ja1ca_43>q2Xvi>eXM>V7D3npe976~YM1~BOjV#iTG2zY@NYY?XMp1DLg@Yh+ zWUw40L{lb%J6kJB@Ak2qI4g%S9Gx%1m-+yCrFeDWfiP48?*Vie#`CNQjmU z)79*RBn=g16eq_}A_$^P2FpVhX~~#e%`Q*UFj7YGatx(_Aa}@M`ACSiOvcshfg}wF zWt0%dP&x>rMg}WD7HP{&Ud`T0((qSCNpK8hf*=}XFccD^Bf|vA20hV;Qbx&h4CR6# zT4b<7WRZ@H2_#$KiAK6IN{wTv00hw?gB2kmx-uD%Y^^66#mcC=97Dw*$Xzm6F|tTk zW)hO^_C%vz8D+{bR0@LVlfg=mkh?NW*Rm6yXrPr*HXK70Ac!Fu>?N}3u8hgG?D8iX z6Urzjj-hH0#Fz~B3JKAZ$+(t1@I+%p8Rf+>R1boflEF%mMS3!m*Rr>sXdEk}f;fhn zK@f8?SQ!$cFT=!>4NBIaP(g)p47GtEmSnKk$Rd3i6P|2=WDN!tR1C*ZCkSFi1}jHG z3}iBRvbB;muBo7sIfl?6hz%L60$F4rGs%xlEK~}A%-$c*RvCn zHB?kk`5Z%oAc#E~tP)vdC}VOxyF6LLNCowZV`vlvaU_FPAt6RG8P~H1k~JJuP*og5 z6Cj8a8LS#vWF#|rJ$oxz!(Ro}#4$7tg1C^uYLF0P87AIrP>M#B3hEul&^!p@Mh2@z z78%Q!@Ma67Xr!y4dN_ubKoAcySRE2#B9pfV4-gPdnzPR^9 z>8$YaJ}hzU2GE>BV@DZWB9f`5qpUQwJ!aYHtk}2fVVG^DlZKuNrBw&c*Z0yTP8r<{ zJ~?C$GF@6b{lznO><0ER6D)H3qpTOB$f<62uRC0?b2(kH0U$~I{|mlyzFubcQoDM* zX94pCvU$2C&x$b*Ik>~T+Dgrt3B|MxG_vzX40KbbtyDO8|O-AAKD_wboM#; zY&Pdb@xhjv!WQcP{80-+!9C6D`(w$wbkDD)4ayk3((n_ zR4Nj6N|I{@N+i7=qCWPb`Zra@5Ax?*^rnUW?~n5>AD1t0I*2j{z?gyRECGY3XWJ@@ z-P4fYRk@Jo$SmwYt-=}95&>de1GnNo3uDdg{L0_teIT9okUxl{sq4%>&KGPAe_RH= zG@IT-$}AwW&%M{M{P?}Bynfo__vt+m;#SD@8{d5gFU9}RiWknH@qJIaM*CIuzT9Pj z))6bYDG&KCvnI%wkr55c5%1gTNsSVzeFw?n!;xh$GC-f&SMg6Dont+Gpejd{e}yeL zq6|hu^E4*n6kF?voSeBR8$krA5iL!~as(+0o8zC9T%dna>i?6H!k?5F|FhDRoJbmy zRFzAPlx)@(#0JfvW@Sg_Dn;~p$ROjWV>nr52FYk-Wd1|R{)bX_0aokjf;}4>l!=B_ z4p|%tRFFeb)4bwjlNqF;k&&xOiy&21kRzp;wP$PnnA#KJ82d4uQ7;j6x5wj-mA{T! zCMQ?Pv*oP!d#JPOiFClHI>4u41s}+--52F4zxDiF@8FAvPXw9h$1gvbwVT7+hyrYU zhlW@z+~Jb1Qn2<(dtc_3FL-4lS3q3VR{!Q;Vf>orrRTgtJoB$DTKp;0Q^3iaLuD*5 zk6S`$f#={0FTx5`DA7Ll`f=boP=@s-bxQO@c=c6|!7CNSJgwQ)a<`zv##_u8Qjhcd(b0*qEr%bJw;WgsyvCA>uXbe{68KZZF+uda; z39L%pC+y(@=D`~i&Xoh-mf`N*txamZk#yN4WA^?@SGkP}_``g$z`*52zm$^d@b&eY zPE1GO8{?PNnR|Sl$5#zX4VO>1CCskOtj}9vR2pva2zS_~JMHc|8VAHAv>n|IWM!Ih zI=pJnm#Dtt(V700chYd(L_!1`%;PJ%)XRK%ZgLaR=YAcx(7dx6^!VKJ`PP&e5)eme zdQH^e;L*{h-NrJj`1*i$eN@8iQ3`jUwx@U^TGhjk#JyVL@f?1Wr}x#py;(uh6(3cJ z+mq}Qy%20U)1<S)IH^2~+y<-qHqc4`bGhS(pIC=sp~`mlEaZ z%Qu0w%N^Boj@?@ny_IdI)lUE6*z@D{!qRdxxXZmLv=NAaqPzac*U! zTmJP->q1wfd)T1IIk7~BcUBGa8iVAdqRUTQ)7pGRUU~Ob7B3tNk0A{G!Q#J26t+p=G7 zXfX6R?4-!gsiBVzrPI8(D7EarPv&4)_Vy8*kw_IE9=vtP%C{N8LeY zl@G)qRyj5{3w1j)hzSG3?NMesMIbeD)z)b?Slk!EanLP<$L2(ZaVGpg2Gf|p<9=aub4#KN;|MA(cmU$ z>Avvp-eAYvXM|4!KP=<9>UnuL_hp`w1p{8mbVzII;nHTSu|$TS;ZwDOs0zW&ez`fP z0HG%z-nHvENf;5m_IB=U4-ne6l)#L^1#aAZf9G-hQ<8_ZLv)HH5)VDF)}lhJ)p^&A zdU7hh@Q9$x*BcUG_f15i%8P>HD_{G#TJpq*^UhaXx$et}{$6oLPWQCqMEN%!MKltv zz|KG;WzSmZNI)^<2xDtj9S_!i5}d_xJ*1Q9{DbkhkvPXGx*a;WNU5~G>?g$RCt{cb zL6=2~d*8S(;fQ0ZehWb|Q<_0WlJ5ad@WhABG~edky^fOr(F@^{n8G0Sm^o+d+EioH zFPV~;VpY{RzcNeos4te^-kq8sy0fSxfl$xPvk?@8qdFh?i9X?bu^Xin0OE?LzuHI= zUS<7o)rDN`4bgok5eFCI^v@1!$!{w}qJ*1NIWHH@e<_tvV)IDo+*e5az+Ae)E<1ys zX-VKS66>#O~ipM-X~7+^A45U!pn7!;SsLM>!x@3j?x4fpa}G_4-SoF3|F&Dv?Y9VtHv6PIrMHrdj7SNZW4sqi!FB$VKN z9gFGPG-1-kU;8iRK5Al8+R0%V=g<=sB^C9&R^GC~A3ge#lvCejkbIh0fBlnA&PTeT z_DF>z>7e-IKt-B4D($!m1t#%2?+%lQ+w`HA*$ESEcZggRmKX z{bwIv-G1o&!GI}C;?8{>=!P(J!lzTLWS_3fsmY!`Y}`zaGg~;8UT$y9W14gysN}w` zmaUQHsbY+~XWQ0rI}D>gGKqZyLt7SS4$k|2;WAh zDWz$W5^Pe$g(S09jTB~UW}7E+L-%L`5u?OY=#s-dmP54+BLk{4v8o_vY|o@|!$ZMQMrG$S=oHs}##&y?BH zd%;WR_5LxngN8|4Xd+p@6_}~;hL-A?c*$^GlXG9KLf}K^O&wAF3uRPBXIMVRGYM*A z!rz`_W%(lRRwQ*4O+NifBtkiVrya&`J*u0an@|1_E*dY?Kyf}d#ChkbfJrCWc;r#J zpr!iaUQyoLxX^KCuzgqemZ>O-w%;xk)u+{*Tq<0InMY@fh*KL9JFk^{m)6`nXVzCXCfp2T zI9ThCIFzF_B=kj_fIXvUGKOjTCsKtMs@{&@jiw6WOB&7#7raNg)+lC~m9UmlMjJL(a}BD4cp*&Tz5O zpD4<1Y*;6I?c|}n>j?E)x=W~^Mft%p8>p@6b>HF>jbQ(%`{}K#4aE;0al(A0Uz!dQ zt~*`nsww5UbMr+p?0POkvM!|@oYI_$wwY{`2}LH;^+DTcXr5$$B02SAP&d^g&AA#a zmDR9jTyk^Hmk*!zJ@g!i8;x@Bn7+$4QmQ7Jo#d&0b>_CnO5KJ9*eA1zcP@tz&5sL1 ztz>N5;;QOsOK9M3AA|Qvi|Vdj(V;aGwN!N?BE9Qzf&ba^)j46L@kwJ|ENhK%(GWpK z;be7{Z-ciDp`F%~OVhYiX`=gP@NQllOR zoRte2-n!x&pR-e$z$h)l|G`qQhV|SPm;SFPK1UDgn?mPa-QYzu>{^{qeYT?bmSg|+ zWaXCkB6q&5TI^wnBB%2`qpM-uOBQ_P*n>OxuO^vVe=TA?_sqEz*nq4uXK`WZ(jOW?Q|jM@}iD&0Wh~nuzNMGvROlzo-NaibX*8Z4<$f(EVR!NWfPr*s+RBuA-V3VOQLI)NR&)=( z0?FXGb*5iPBWnO8Y}&Q-=-j4}>$&dM3vYb-#rN9}H}H1_ zGUB?aLiwqY8xm*6>*;P?ls%}W&Xi&{m!-FrsaCBfZ)#MHtKSq!?Mg{4{50G%9u<1A z6ZUM2KwxgluI(OW?D3k+Du5#%G+@emCO;|I9dl=GT9IukuHR-I&m858Oiy-v}hn zJ)UD{xc6A3F-f}AX#dnZ&AGmIp@h8xXUW*;>kqZOxWz7g*xNsrvLD&leqkE#^SDJy zHz|w1W-Qu*|9gXfO&!9s-u|*{c|v9xGi~t+SJ`R4g!M|BCD$tBb|mZcPQ1;v+85GX zD|=p2CMgRq^En7VUCICCMQl5vo8=Xbgj;krF*7;k_@~}@A4%Hn_B2kge<0X$rkGcN zWM}!{C}Gn%es7g#VRWY8$$~`ew`X0ulIWo&D<@vji_T>AT-goQ=tG`~X@O#S<~7sf zA0Bd9C|mvn@R$GYol_b>!^-)dhMTjCJKsHLH*5Sr2-GrBNAS}H?(4-h$zG*40h>pr z-KuT>`uJV7;ky2L<-z2@6Mu@cLY|vz&;8YUG4`UKiY%i^m|YGCu# zy7K$|_kzhELUp5&XPMq+`3604yX~7ht0_$W=DfN1eRj$Ph%AG{`Hr#gltW!aYOGAP zP9EJQh`RPin|yZ(Vp_k0N6igdc-k_uOF0!h-tZh)6&jlC5})bRkfs~}-ysN9H>9W& zqG#UeN-e*zmo<~)!Opci6`@o!u@-9bS;YiL)O?-!`LSjoYrU?kl&_y7(v7l9X7(nb zXc9x}=)rnWrIat7d^=aR`uj)h(6oLLU-iw>{ft>^VbP5-S{K*TVGh|P^|Mk~MG@m0 z231b8wN99V6jOn`I__@Y0n zw8Y|CU2{sOrkQ7}$wWTpfXFF4m2<}On&TN+zq7c2_a_YaiL1QOMrIETqg&edIOIVyWCo>1D`3rmhxr&iqO~GU?(TO$h;Plb%JCmcIVL z4CS^ZVy0h7lIioTlK;R|Zsx36+sN(yYMWCMT(?2ISN(UIgtgi|Xt9n*0TK1Wc-(UF zU2}3*&%}nnWZz~r&^+kfzcJ>deDRcQQCjt`rVAJmsa&S`D(6`9tcT96Ct;i}mkSM4@;}cf%zKY+oQXb967$0N!JGDNz=O%bwXQa8Av32wiA!8m!I#h z&G`HvUwS*?E3L#OChb55gx=f&(&s(Gi)OJ;<}R@;*A6Q=b-ADzU)viW!gnsFRUs`7 z`Q4-S-)xi=UG+>#lVA9aT`2DS=2bhTZsE1Jw2kp>yvk9_DtzI#55S6<>y)Z@3UJ+h&i@t=Y&rlu6XKLH))CTzwW;<44`h@zs6>!xmrbn z)EKy|AEOcJCeQhtJ%5vJViJ2<%ueM@cAmYCnwt1_@}=lCs|Jwnn^X5{6Rv`1BpylG zJaRR7@zwL_;&j#~D&@{7*zt>do~q{ZvnGyq8xB(Y*8?np?0WJVOK??bXt&LqQv$2| zrAqlP2$wDCMf$jF!=LqBqrX*h;+4BH%U$QN6{_)US(Ntss=}C7>qe91lZb!51o$n-CGlSCJoJgcT01Y_Pr4bITN#D zr){WfRoJy^Qg}(?^WFv6lO=J&{PNoG)Q**>KRS}l$UR&+Pw{bqCU9ls{Mf5uhXF|) zQ$n7?6zNV*uM@7Li`eE^8-nJ~#Xcc&NDQ&b--j)+FrBTIXTnYgW;m zi8p~bIn$iYsW0u^4=|ICGds%Fey5on)QR40wuL(vd@byCx{jPkJ}sszmTpwgKE6fS zt-fh0^Ud3BhYTOUDKm_FFc84IB!5F5f&WhZ^E-z>@`#2>&DiG(UTgcu0p!yA_uGp; z)fatwnu=(j+M}9bC)vD77AIyf=R>5D!{%lqj@@CsT2)ewb6}9?pAxQm|LOHBi@<0~7@e%rgk)3`xr2^=#HlNp355SGMlPfRxlVb&}5=?}1LKs8Lgx8%t%y;%e1 z+kR>D@zz@D)XDdw<9+7C$#iDm_sL^8W;3(N=eRAlwE5&{p6_UVf^V@{?>Gu*X7RWe zUe{`dIbg1Rmp+YIPcJpab*GnNzfZ1gOk+Iana$wG3-$Y%*okTQcH6{KF$O(~%U%h@ z%%{Np;KjX}y?hcK&4KM9q$xw@&Zl!)%3y-U9q_O zf$#g(N1e_R0eOqt9ZkpIB;8V`0}tmVakJsLE$k=B2FXJB$s*t)%;7vG96MnKZ@|Kj zH!G$Cx7X@NC9%%VO+mQZ*vXXXra%n#o@BtGdMR#pw;s3I)*0J;yy1+UIG#CdGdtNE zH48ZEXvXZ0PB-BE0uH()jyHEVg0>HF;#f#$vEIDw^1UV8(c*6A6m~9C(*O8a7=ARd zpE<|egxOl#J}(&t-=7yY!(oI0XJaG(9PW4*(0N%(%Oa}(x}+^iX3 zfFJBlhWE~5RvHgCZ{p^U)enU;;ka4F=0JG2uw;NwG!W*sYG$Y1?cS!NK8)FP^V_Ok z$>ULBz_H<_O(%O8=|;&=vy)>Sb~B~pd#j4EznKQ>DRYHS7geaKxOz-^U! zOEylOFI{5B`R{b7H{XCCWp42S!(ze=cd)3Qi81{`8b}y7`9(; z3QNLH=%aVXNQG8kZ&pjf_V~cqu>-N7%g3+d9iL?~m^Db^GMh=arw`d0;LRrwfgk4! zJSCbaC7&Ovw_t7_tYn53WFne7kw!CfSF(;J$vj zx{j-w!Ug)`_7^bIDf>8qh^XV{8o0;Sg?-$RA5I<6U0%RQ{^*qWEH)EgN81%Que)+O zz^As8_8{qGj#Pr9S%i>%^XlQkRdI!85#p+?loUVl2)J_$mW#3dt@K&EXt*<{z2!oU zAPKpP-O`FB=@%m-5t@C=&8YuS(b9#Uib}T1O=r+$$EhvERiuoHWRW%DB4Y%CBK{@g zusmbq6<2c(s;>5sj0kq(l(`ult7{6d3kn;Cj8CHo{awxZ*&duFd>yhll zqhDs8;Z1WZY~(OLO(INpGuHu38{Dk92AIB%9F&{8=}A?7ifJFU-PQy$pvWF>~sS9n3c$NxGLLFRYp* z)1uuh4b*s4*l*PGaHVh<-7L1g>7Vk`I4v5abcYxH!TQ799(#kHsh`GyGC5Ep+Re?N z{7Hpja)mcg{b$4R?O)2D87Dg~{DVvvdmHfbpdVV-mhr^5&y^eFO&29Ed^1U=K)YE0 zWh(5iYk25^Ue^{`*ZQR_w3Zv|17#p39$s_@(Cb%Q6XV^}y^F$c4w)VVsiaR2UYH)b zFg<)>dgRp~vSV-XY6{;C`edLDIZzbZ%@v?8HcbBeyJ&Ak@a&q2X`<3V|I3Ve|D}7Ab)3V2Sg!H z7d_yY@}qNrU?ZC^hXP}8pvW3{x#CCX01=OLH2?#lu^TSmnX+EiPmaM0#nxJ$3}9gH z*c2;M2lb=Ro0PJVzfm#5&G&xTgr$Ytj371T1WA2(&UyNYxrjbm)5+qXa$IR^W z{_I;PK;2`#jHlK^5BR72=o=u|$d<}I@YKcDwZMdVSN>T)nE~jYBQLreKv}mpSO8YJ(bC<(3BSVVp|^H;(FkkbGM;lla72ug!+}7G50{HKqPNTq zF7p6ok?d3{3$uV}^-3P~jdF4QWDK5$g1F^A8UKST}=NH<7HH5!vKN8)#P!6pr3<0YU+chXU`P-3E~2 z+h@zg@u4V8URX0prblmC8khp1aINLx147|jZ0!p~xud*6A1DJU8S|piK$NHK4WY57v)cd?TO``r7awG!>*#_h>qF#kPbB;E8lFsihzjftBzAexTs%J? z752?`>%(?{RYDiNRp@OXVe#9;7Rd#u;lo#Gn5+(r0kYp7kdnBofdqbOQXei409I>t z{ofwNxk&U@Brs|MfMr~JqdcJXw?_`7Zk!A}jtknAJej~sPMiGm;YjeAD-W0hMpR~z z_2E!GPiEO~PkcKqpaz8IQ0MnhV3MpEv5HHA1BY=Q5*#MtoF?L2CgR+UL0WzrZ%z*U zVih(SZ;A6Ttt4myX@hu7W<@wjzPp8l@p?xjR8kOgo;eNsNL>})(V2hc(bCsVx%R}t zadbGkQ6zpbyr6k*aL{aXbGh{3#6u1+^gO}`De8adQcKS@a6-4M7x4J#nuG#i0S1=vTu+VBpNqUJf;VVVy29Ur#2>~E_JZ40K)6gQ|a2Y!6& zL@GNs{X}RS`|&N;$lv}`-7=t0`tS~glIA(Vk>BdxSoy8)cH)THrshiNK?%@-G0_~K zn9J&N;?5b30X3haXzhZ&0DW=?`cwxPF;SrF?Vpc~ASta#IhW$^%GTX$3hxLn1;9oD zu$73pn||Unn?zoFTeEI_8tIGOqBRC2!Yea2w}Fank!N2U{N@d(B?T!-nIoE^*s>tH zz1%m<9hju_N`@1fxmXrB^6*L@a~_s^PoWk_VF$0{NRJf8BnfadN3nD8BwX&PEW=aZ zID?U=*{NBwPmvKT-jpII&;n_wp7u17A|M2T<7R@9Brl{`I0&wSP(mSfnk?A_WET`` zqzH($1mbc+k|=fNr6xt=Wj6tYT9ZH~ z*MJ(#jwGhcmX?dqJljG_IZGO88lwdQcPI5_aX=%;DD7n)Tav2Vl4>aKxFx;lvlV(s zteGvXYa4gol1}!mjO=@voRr)*59I}Up(qNbAP}@rY0yLLZrPBmUIS>(B5w=6hj=JE4^SFcN0L6 zQjk?tz(*lQUeF7QVxn|YKuqBg#KEEBcmzLa+HkJ)o^9VPFftZE*y*R+R+5cS!bc%dUN8-c;-oBBLO6i{1T}D|8Xn;}G;Q~Vw1i!sI+!R4 zKtK*qha~_A=kxlzxG6=I5pe@qFYr-F3VWM`N4Oeoqi#p71EzaIti%Bz6hV1Qw5A4h}WPBeX)( z&gV;q+4Wg~kxu~xxXeRNIl(;1N6qZL89WH}j<%?c$vAb3sj(R1F`6XYzt`P?QLzfEpr( z7C>+Vhq~br7NKdd0_h&RK6fxt27vHlkUAfapj*)2B}!SRhA11%TE#~pBkXMk9ziVH zX4;P02Tb>zIFbuM*n%Rr@CZwGP+4`vz#z*m)b62!0egC-38J+ zcmxT`SqVHs5V(71Fbe~Xkfi*k4j|y{NKYvP2t-4+LRrK#DCslyaUuA*pdqWMfsaC# zydW_QB~9t3fw)WuARxh^NIU{LEKL_BeZju(AsCqrAV7zxg^~aSPgH-GEai~~LTV_B zx&w$pPMA~<9zibJhRdG%5jZJ_xR4t_xBx?5-~bT#?4bxvgyj&+C77)|fG~t&9plE& z1j}Qm$Mh<1M!XgwYAzA=}f<37s9wBMSw(14(jY4Tv z`?y5>T+ot@(85O{PhJoLLn%|1Yaw3Y5t6~7$#?`_Sej>{w5fex3YaJ#KxiMLeuqbR zQrO>hhf-7<(KnO@1rW;e!`|lO5mcjXob9Qff$0i}KU@V6L}5r#Jc749v`rhaHN=d#dT*c1?om_(~FguEvvPc??H0A+ctW^b`BIJp5eHk$ta&k3ylmpc)LNO}V9mkT?$@punLhJc1T1?MabzzI|UI z7+C}$=nPZeeF7j<7WH@OQu^s4%!jk|@lhxalPbm|+>N%Wwx@mtPAVo|h5!hrFr+CS zq1hfvcoz{m%whqv)dvvhidipS!_S4gxd!Fn7bV2ki>15p2nLk126%)w;O-a0S$41p zL&~DN0K%v}=@=g2&9H6NOJdhz=}G&zY5?Jso-C;zJ_@ho1>ImMV@d%%L=PUJ4jfvC zNAQBBRTfLH+xOLjiAn*4FT>P}c!c5N{w`C>Iz7bq;j93B6iUP1mf{i2qHS>Y)NjFb zWyEAW0757X8Hz_BaS#&IPox@ofq*TW-*|MDvE(WvPe0l~RKH@pCC#IZlc_|BBuewn zthwr}d8BF2KucQpZ`!J&`j0KiNgT*YRCe5wsYV>Verh`mv{=$KL;wgX{{w_v-wGa7DUielFwD`qb zRzs#gp&G%bkCqkWBr8Cg_Os}ROa9K*e>iZL@zyg^;cHAKKhj^D^Hd{0Qq*l5z%f6( z^{?vNe}m!i3*nz(lKzUquPFTd3i?N^x4#zE|K;!8U(@-oPv_xP^XsDeQB)&2K<1O| zQU*M7e0s~~FM-Ubzs1m_>;jPayhb7_kwE5C3nXtav7g$NUxDO}gRz7IpSKBjy z)GoOVByT*k=GXDb+pB>VLm&z{2tXTX=CLIii31rvc>^*XdoRE?pba!*Nv9&B4?H<3 z#U5pMD}K|C0+KiV))qs2@@AZes7(7!8|c)<4iMD{2%o$`m`eUILiAtW{aWl+CRxF6 z)j8c2)&H@h)(v4S`MFI96#aC`-`Dz22jWw}&m|sZKXwz-bw%`l?%Lr~z#rcFSM}|` z!SMKn@Xs(we?{R}6#jwh?XN}kfA>50*L42t)4624ML<+vo&*h~R^+r)$@olZK$!%c z#>A70u=Xf>3?xMSv*xMz6z!!)*}t;7Bh>llW*CX^HT=P*npH&iN7J9Dwa!0MueL~+ zpZj9!a*lUr&2RlU$i)}^WBl_wn_>T6p8i)JCBORq?>P5=MfF!y|E0gYehuJ%t^u6R z#8ZG+@F;r*%)8`UI zx~EG88*q(nRxWI;GjPxb+>%lyaTsj*gg||w;8CVl z@tbxyki3bswus`BH}O1#CvZ#Zhqfp_d845kp}{9_SD8u%SMj#P@y&E_$GDUMj~t)+ zvU!FL-Zr331tf2-NQ5W;qL(jl3koXsQyb{ijYn4)ORnIPH*HbOAjI-uU z_~h;RK+7LS=&_ypxsyfZbQk~9<+JzH=}&%pxpC^p)u?dV*`J$Q&m+c4T3h^ny!VJN z`r(qlul1h}yal9ytv~O4iPO9`c!=2j@y=%hkOKbj*1xK6{|$!6FNA-FN%|`azoPID zTyK9Zs{gy+xxc3K-!Pql_Y;9VCm@%?Z(ChsEV+iye2hf(tH)dFJj#HLFcl#4F`hLy z!Dl{G11)tx^7cd91fRSC@9yE>Puv3DPki9@Q+oyfexja;KJetERC|;;0m<94IiQ^a zByTmXEp_#i@5mlTjh(%qr5 zmO{h|1!*2W08t>I1OrjhZbqDum$PZfDx$5_N(mGYkwpfXOhS0Y#E=jW zNRT9ZZ(xRyp*y>F|EN1TxpOnQ=Xbup`#ZmLA9FKzK6dTE3wm3@o437A<$U>aYoMF< zT|cE%0ZWhvL5dduH*bd4?%>VaWhxPT@|FQe{MSQx{r3|MDfxxH8xr_${=8hy)|;B! z|AX={58>BvkeX+~JPXU0p#R1B)_hX^rPthYeI=90&yxkT`DeMh|9Sr*hv~!9i-<4B z|4wi63Ej3~q9lH!^VlKwzP2v^uN@-}oQ9u+e{&9+P|){D5`pzBd?8oWF^voygPPKh8>ji^8Qh$^1eaV9@&b|{$np#q!+AE8vA2F)ZJ=o#FG`D&(#x- z|qej>xmUkBLg}ea+xl>KO91v9suIx9lS&zVhA9ZpAMq$`iO1&G7 zcXR`Deu&3<6C0nXQQabbwoqQw7%zBofDx2xUlDq$UmjgcKYN9o^g-T2xeQ-?@az`u z0S54RkGmMub&Ka8wd(s0W+THVSldA@!5IdM<+L1c*!CSzk6)!$c>=}t#|UT+8*I0J z>(kwaYy_x%hjWODJFPqVt_t zpZk;poPpr&h`}0pE%&+ez=!9x*LIdPc%$szwYjjEqnj#Xz+Jj_mF#l_*E{gXG3Xtx>r9l$?LxT z*dmi(=?f$HUhWp6kN*ZC04NVgOD1Qx9NWTncvoDD&w4eP=IiL8K%<3Q;G4D0VzqQh ze&lvfHn~;t@S`0WB;6$WpGnRw*K=*PTm`<#uB&Gu*Z~KR%MowU1}$VGr{ZRgQ|8kK zi%C9%%KY@X;)?rAl0!8#%%GH`z@{k|m0vUq`2nwZ+7HF5Q{1GXXYqv`Km}fflBNep zDsjckn1687P7W)RXWGPm)QPws`F=0yb(Hg(LTru`Al3}ay3Jf&i|n^(dz}=Rxpvjh;A8vUwJ9r^NX7(OLC1)r^%k} z#QO{vJ36Q1P?R~E>QRdF(<^oEm>BG^^k^?_Crz4?L61bV(dI;$ip-OQ`c_eBR#QFV zW_K@|Xd@Ewb1Hi;JgOsv&Cj1Be#s}y!S5**KV?x~3~^7X6eVIYzD30y(Xe;Y+H`73 z2PHr^%OTL=5)Pq2pV=49^CL4*jV^lsqR-vKz9nledcQhTi)qptILQ`_(pNU|5Qy_fZ$l1;Y$qz#{bk;3P}nd#x=a>pJW{({N)N8px1awV=I5;VVQr(`aLw7s%{dwXfZcqF4E8rUJ$^ vskH*{d9I59GZipCWY$hbzn5u!7>dn+pgJ6~X*0O5R=@`X6tc&4@YlZp*Ro1x From 81b10e1fa1f111a6e6248c16e884dec1382a94eb Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 25 Apr 2024 11:19:16 +0500 Subject: [PATCH 116/132] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B8=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=B0=20=D1=81=20=D0=B8=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=BC?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC=D0=B8=20+=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20=D1=81=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D0=93=D0=93=D0=94=20(=D0=BF=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=20=20/=20=D1=84=D0=B0=D0=BA=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Templates/WellOperationFactTemplate.xlsx | Bin 36997 -> 37060 bytes .../Templates/WellOperationPlanTemplate.xlsx | Bin 40000 -> 40035 bytes .../Files/FactWellOperations.xlsx | Bin 45419 -> 37157 bytes .../Files/PlanWellOperations.xlsx | Bin 68419 -> 37167 bytes .../WellOperationControllerTest.cs | 29 ++++-------------- 5 files changed, 6 insertions(+), 23 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx index bd41063d318ebd7542ab71f25b2a88c4d7eabfbc..12fc2a44b491dfb1fd53c425f0a7264617ff2623 100644 GIT binary patch delta 7998 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 delta 7966 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 diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationPlanTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationPlanTemplate.xlsx index e64452e1a2f14a223a27c17c36ccff5c80d484ab..ca2d01c71aaf2350a53811fd8e9071cca4d2e366 100644 GIT binary patch delta 8713 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 agAs7zPj$lNaP@L0afX>3hu^3E$owC5@c<$K diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/Files/FactWellOperations.xlsx b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/Files/FactWellOperations.xlsx index 45ee8a0bb72a6425cf5d0362aeed27e61025d7af..a7af081435c0e1b304d95450b6a994b3eb5d30c7 100644 GIT binary patch literal 37157 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 N!dPHJ-qZ`?0RXjKz61aO literal 45419 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 F{|jT-On9uK-^Yc72zI)Cksw-h&lA+o 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 - /// Успешное добавление операций (без предварительной очистки данных) + /// ( ) ///

    /// [Fact] @@ -46,7 +46,7 @@ public class WellOperationControllerTest : BaseIntegrationTest } /// - /// Успешное добавление операций (с предварительной очисткой данных) + /// ( ) /// /// [Fact] @@ -65,7 +65,7 @@ public class WellOperationControllerTest : BaseIntegrationTest } /// - /// Успешное обновление операций + /// /// /// [Fact] @@ -87,7 +87,7 @@ public class WellOperationControllerTest : BaseIntegrationTest } /// - /// Получение плановых операций + /// /// /// [Fact] @@ -144,7 +144,7 @@ public class WellOperationControllerTest : BaseIntegrationTest IdWellSectionType = 2, IdCategory = WellOperationCategory.IdSlide, IdPlan = null, - CategoryInfo = "Доп.инфо", + CategoryInfo = ".", IdType = idType, DepthStart = 10.0, DepthEnd = 20.0, @@ -201,7 +201,7 @@ public class WellOperationControllerTest : BaseIntegrationTest var stream = responseTemplate.Content; using var workbook = new XLWorkbook(stream); - var sheet = workbook.GetWorksheet("Справочники"); + var sheet = workbook.GetWorksheet(""); var count = sheet.RowsUsed().Count() - 1; @@ -230,23 +230,6 @@ public class WellOperationControllerTest : BaseIntegrationTest Assert.True(notExistedInDb.Count() == 0); } - private static WellOperation CreateWellOperation(int idWell, int idType = WellOperation.IdOperationTypePlan) => - new() - { - IdWell = idWell, - IdWellSectionType = 2, - IdCategory = WellOperationCategory.IdSlide, - IdPlan = null, - 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, - }; [Theory] [InlineData(WellOperation.IdOperationTypePlan)] [InlineData(WellOperation.IdOperationTypeFact)] From ecb6a41d372879aa1182544f9e8831bcca32bad3 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 2 May 2024 09:41:37 +0500 Subject: [PATCH 117/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=80=D0=B0?= =?UTF-8?q?=D1=81=D1=87=D0=B5=D1=82=D0=B0=20Day=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/WellCompositeOperationService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs index cc944835..53eedbaa 100644 --- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs @@ -221,8 +221,8 @@ public class WellCompositeOperationService : IWellCompositeOperationService compositeOperation.DepthStart = compositeDepth; compositeDepth = compositeOperation.DepthStart; - compositeDay += compositeOperation.DurationHours; compositeOperation.Day = compositeDay / 24; + compositeDay += compositeOperation.DurationHours; compositeOperations.Add(compositeOperation); } From e1748ebfe42dba426e2304ffe4132db9335e128a Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 3 May 2024 15:45:49 +0500 Subject: [PATCH 118/132] =?UTF-8?q?=D0=9C=D0=B0=D1=82=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9,=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B0=D1=89=D0=B0=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Services/WellInfoService.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/WellInfoService.cs b/AsbCloudInfrastructure/Services/WellInfoService.cs index 23054a2d..5d5f3bf3 100644 --- a/AsbCloudInfrastructure/Services/WellInfoService.cs +++ b/AsbCloudInfrastructure/Services/WellInfoService.cs @@ -37,7 +37,8 @@ public class WellInfoService var telemetryDataSaubCache = services.GetRequiredService>(); var messageHub = services.GetRequiredService>(); - var wells = await wellService.GetAllAsync(token); + var entries = await wellService.GetAllAsync(token); + var wells = entries.ToList(); var activeWells = wells.Where(well => well.IdState == 1); var wellsIds = activeWells.Select(w => w.Id); From 9006e1e36c353d4f3eccbe0c8a32aa71783d12cc Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 6 May 2024 10:17:28 +0500 Subject: [PATCH 119/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B3=D0=B0=20=D0=BD=D0=B5=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20?= =?UTF-8?q?=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/WellOperations/WellOperationExport.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs b/AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs index 430bf92f..3e3cd1a6 100644 --- a/AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs +++ b/AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs @@ -42,7 +42,9 @@ public class WellOperationExport : ExcelExportService Date: Mon, 6 May 2024 10:49:47 +0500 Subject: [PATCH 120/132] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B3=D0=B0=20=D0=BD=D0=B5=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20?= =?UTF-8?q?=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/WellOperationRepository.cs | 23 +++++++++---------- .../WellOperations/WellOperationExport.cs | 2 -- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 9bcc718b..522895a7 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -54,15 +54,15 @@ public class WellOperationRepository : CrudRepositoryBase> GetPageAsync(WellOperationRequest request, CancellationToken token) { - var skip = request.Skip ?? 0; - var take = request.Take ?? 32; + request.Skip = request.Skip ?? 0; + request.Take = request.Take ?? 32; var (items, count) = await GetWithDaysAndNpvAsync(request, token); var paginationContainer = new PaginationContainer { - Skip = skip, - Take = take, + Skip = request.Skip!.Value, + Take = request.Take!.Value, Count = count, Items = items }; @@ -178,9 +178,6 @@ public class WellOperationRepository : CrudRepositoryBase items, int count)> GetWithDaysAndNpvAsync(WellOperationRequest request, CancellationToken token) { - var skip = request.Skip ?? 0; - var take = request.Take ?? 32; - var entities = await GetByIdsWells(request.IdsWell, token); var groupedByWellAndType = entities .GroupBy(e => new { e.IdWell, e.IdType }); @@ -198,11 +195,14 @@ public class WellOperationRepository : CrudRepositoryBase filteredWellOperations = FilterByRequest(wellOperationsWithType.AsQueryable(), request); - var filteredWellOperationsPart = filteredWellOperations - .Skip(skip) - .Take(take); + count += filteredWellOperations.Count(); - var dtos = filteredWellOperationsPart + if (request.Skip != null) + filteredWellOperations = filteredWellOperations.Skip((int)request.Skip); + if (request.Take != null) + filteredWellOperations = filteredWellOperations.Take((int)request.Take); + + var dtos = filteredWellOperations .Select(entity => { var dto = Convert(entity); @@ -214,7 +214,6 @@ public class WellOperationRepository : CrudRepositoryBase : ExcelExportService Date: Wed, 8 May 2024 10:47:31 +0500 Subject: [PATCH 121/132] =?UTF-8?q?=D0=A5=D1=80=D0=B0=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B2=D0=BE=D0=B9=20=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BD=D0=B5=D0=B9=20=D0=BE?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=B5=D1=88=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/IWellOperationRepository.cs | 53 ++++++++------- .../Repository/DepositRepository.cs | 11 ++-- .../Repository/WellOperationRepository.cs | 66 ++++++++++++++++++- .../Services/WellService.cs | 25 ++++--- 4 files changed, 111 insertions(+), 44 deletions(-) diff --git a/AsbCloudApp/Repositories/IWellOperationRepository.cs b/AsbCloudApp/Repositories/IWellOperationRepository.cs index d37a1e90..12246578 100644 --- a/AsbCloudApp/Repositories/IWellOperationRepository.cs +++ b/AsbCloudApp/Repositories/IWellOperationRepository.cs @@ -1,9 +1,9 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Requests; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using AsbCloudApp.Data.WellOperation; -using AsbCloudApp.Requests; namespace AsbCloudApp.Repositories { @@ -17,8 +17,8 @@ namespace AsbCloudApp.Repositories ///
    /// IEnumerable GetSectionTypes(); - - /// + + /// /// Получить страницу списка операций /// /// @@ -26,7 +26,7 @@ namespace AsbCloudApp.Repositories /// Task> GetAsync(WellOperationRequest request, CancellationToken token); - /// + /// /// Получить страницу списка операций /// /// @@ -34,7 +34,7 @@ namespace AsbCloudApp.Repositories /// Task> GetPageAsync(WellOperationRequest request, CancellationToken token); - /// + /// /// Получить статистику операции по скважине с группировкой по категориям /// /// @@ -42,14 +42,14 @@ namespace AsbCloudApp.Repositories /// Task> GetGroupOperationsStatAsync(WellOperationRequest request, CancellationToken token); - /// - /// Добавить несколько операций - /// - /// - /// - /// - /// - Task InsertRangeAsync(IEnumerable dtos, bool deleteBeforeInsert, CancellationToken token); + /// + /// Добавить несколько операций + /// + /// + /// + /// + /// + Task InsertRangeAsync(IEnumerable dtos, bool deleteBeforeInsert, CancellationToken token); /// /// Обновить существующую операцию @@ -75,13 +75,20 @@ namespace AsbCloudApp.Repositories /// Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token); - /// - /// Получить диапазон дат выполнения операций - /// - /// - /// - /// - /// - Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken); - } + /// + /// Получить диапазон дат выполнения операций + /// + /// + /// + /// + /// + Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken); + + /// + /// Возвращает первую и последнюю фактическую операцию + /// + /// + /// + (WellOperationDto First, WellOperationDto Last)? GetFirstAndLastFact(int idWell); + } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/DepositRepository.cs b/AsbCloudInfrastructure/Repository/DepositRepository.cs index 804d130e..f7bc4fdd 100644 --- a/AsbCloudInfrastructure/Repository/DepositRepository.cs +++ b/AsbCloudInfrastructure/Repository/DepositRepository.cs @@ -16,12 +16,12 @@ namespace AsbCloudInfrastructure.Repository public class DepositRepository : IDepositRepository { private readonly IAsbCloudDbContext db; - private readonly IWellService wellService; + private readonly ITelemetryService telemetryService; - public DepositRepository(IAsbCloudDbContext db, IWellService wellService) + public DepositRepository(IAsbCloudDbContext db, ITelemetryService telemetryService) { this.db = db; - this.wellService = wellService; + this.telemetryService = telemetryService; } /// @@ -112,8 +112,9 @@ namespace AsbCloudInfrastructure.Repository { var dto = well.Adapt(); dto.WellType = well.WellType.Caption; - dto.LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id) - .ToOffset(TimeSpan.FromHours(well.Timezone.Hours)); + dto.LastTelemetryDate = well.IdTelemetry != null + ? telemetryService.GetDatesRange(well.IdTelemetry.Value).To.ToOffset(TimeSpan.FromHours(well.Timezone.Hours)) + : DateTimeOffset.MinValue; 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 522895a7..95905314 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -20,6 +20,7 @@ namespace AsbCloudInfrastructure.Repository; public class WellOperationRepository : CrudRepositoryBase, IWellOperationRepository { + private const string cacheKeyWellOperations = "FirstAndLastFactWellsOperations"; private readonly IMemoryCache memoryCache; private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; private readonly IWellService wellService; @@ -148,14 +149,26 @@ public class WellOperationRepository : CrudRepositoryBase 0) + memoryCache.Remove(cacheKeyWellOperations); + + return result; + } - public override Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) + public override async Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) { EnsureValidWellOperations(dtos); - return base.UpdateRangeAsync(dtos, token); + var result = await base.UpdateRangeAsync(dtos, token); + + if (result > 0) + memoryCache.Remove(cacheKeyWellOperations); + + return result; + } private static void EnsureValidWellOperations(IEnumerable dtos) @@ -350,6 +363,53 @@ public class WellOperationRepository : CrudRepositoryBase + { + entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5); + var query = dbContext.Set() + .Where(o => o.IdType == WellOperation.IdOperationTypeFact) + .GroupBy(o => o.IdWell) + .Select(group => new + { + IdWell = group.Key, + FirstFact = group.OrderBy(o => o.DateStart).First(), + LastFact = group.OrderBy(o => o.DateStart).Last(), + }); + + var entities = query.ToArray(); + + var dictionary = entities.ToDictionary(s => s.IdWell, s => (Convert(s.FirstFact), Convert(s.LastFact))); + entry.Value = dictionary; + + return dictionary; + + })!; + + var firstAndLast = cachedDictionary.GetValueOrDefault(idWell); + return firstAndLast; + + } + + public override async Task DeleteAsync(int id, CancellationToken token) + { + var result = await base.DeleteAsync(id, token); + if (result > 0) + memoryCache.Remove(cacheKeyWellOperations); + + return result; + } + + public override async Task DeleteRangeAsync(IEnumerable ids, CancellationToken token) + { + var result = await base.DeleteRangeAsync(ids, token); + if (result > 0) + memoryCache.Remove(cacheKeyWellOperations); + + return result; + } + protected override WellOperation Convert(WellOperationDto src) { var entity = src.Adapt(); diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index a10ff824..2c361e38 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; } @@ -272,10 +272,9 @@ namespace AsbCloudInfrastructure.Services if (entity.Timezone is null) dto.Timezone = GetTimezone(entity.Id); - - dto.StartDate = dbContext.WellOperations.Where(e => e.IdType == WellOperation.IdOperationTypeFact) - .AsNoTracking() - .MinOrDefault(e => e.DateStart)?.ToRemoteDateTime(dto.Timezone.Hours); + + dto.StartDate = wellOperationRepository + .GetFirstAndLastFact(entity.Id)?.First?.DateStart; dto.WellType = entity.WellType.Caption; dto.Cluster = entity.Cluster.Caption; dto.Deposit = entity.Cluster.Deposit.Caption; From a975643fd15a65886da462a4a66d98a64e1e0e86 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 8 May 2024 11:53:49 +0500 Subject: [PATCH 122/132] =?UTF-8?q?=D0=9B=D0=B8=D1=88=D0=BD=D0=B5=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=20?= =?UTF-8?q?=D0=BA=D1=83=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Repository/DepositRepository.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/DepositRepository.cs b/AsbCloudInfrastructure/Repository/DepositRepository.cs index f7bc4fdd..497ef3b6 100644 --- a/AsbCloudInfrastructure/Repository/DepositRepository.cs +++ b/AsbCloudInfrastructure/Repository/DepositRepository.cs @@ -112,9 +112,12 @@ namespace AsbCloudInfrastructure.Repository { var dto = well.Adapt(); dto.WellType = well.WellType.Caption; - dto.LastTelemetryDate = well.IdTelemetry != null - ? telemetryService.GetDatesRange(well.IdTelemetry.Value).To.ToOffset(TimeSpan.FromHours(well.Timezone.Hours)) - : DateTimeOffset.MinValue; + + dto.LastTelemetryDate = DateTimeOffset.MinValue; + + if (well.IdTelemetry != null) + dto.LastTelemetryDate = telemetryService.GetDatesRange(well.IdTelemetry.Value).To; + dto.Cluster = gCluster.Key.Caption; dto.Deposit = gDeposit.Key.Caption; return dto; From 65ceedfd0a384e4dc37deacaa26e46878c5e3aa4 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 8 May 2024 12:08:23 +0500 Subject: [PATCH 123/132] =?UTF-8?q?Fix=20WirkTests.=20=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B0=20=D0=BE=D0=BF=D1=82=D0=B8?= =?UTF-8?q?=D0=BC=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D0=BE=D0=B2=20=D1=84=D0=BE=D0=BD=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D1=85=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87,=20=D1=87=D1=82=D0=BE?= =?UTF-8?q?=D0=B1=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=81=D1=80=D0=B0=D0=B1=D0=B0=D1=82=D1=8B=D0=B2=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudWebApi.Tests/Background/WorkTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudWebApi.Tests/Background/WorkTest.cs b/AsbCloudWebApi.Tests/Background/WorkTest.cs index 97a0c6c2..75628370 100644 --- a/AsbCloudWebApi.Tests/Background/WorkTest.cs +++ b/AsbCloudWebApi.Tests/Background/WorkTest.cs @@ -21,7 +21,7 @@ public class WorkTest ((ISupportRequiredService)serviceProviderMock).GetRequiredService(typeof(IServiceScopeFactory)).Returns(serviceScopeFactoryMock); } - [Fact] + [Fact, MethodImpl(MethodImplOptions.NoOptimization)] public async Task Start_ShouldReturn_Success() { //arrange @@ -50,7 +50,7 @@ public class WorkTest Assert.InRange(lastState.ExecutionTime, TimeSpan.Zero, executionTime); } - [Fact] + [Fact, MethodImpl(MethodImplOptions.NoOptimization)] public async Task ExecutionWork_Invokes_Callback() { //arrange From 04f0b4e2754d9e0703f0ca15cff6d293f58989bf Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 13 May 2024 09:56:02 +0500 Subject: [PATCH 124/132] Fix TelemetryController.PostMessagesAsync(..) Time to utc. --- .../Services/SAUB/MessageService.cs | 5 +- .../Clients/ITelemetryControllerClient.cs | 23 ++++ .../Controllers/TelemetryControllerTest.cs | 109 ++++++++++++++++++ 3 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 AsbCloudWebApi.IntegrationTests/Clients/ITelemetryControllerClient.cs create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index 17d92d8d..ea6cc79e 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -142,14 +142,13 @@ namespace AsbCloudInfrastructure.Services.SAUB return Task.CompletedTask; var telemetry = telemetryService.GetOrCreateTelemetryByUid(uid); - var timezone = telemetryService.GetTimezone(telemetry.Id); - + foreach (var dto in dtos) { var entity = dto.Adapt(); entity.Id = 0; entity.IdTelemetry = telemetry.Id; - entity.DateTime = dto.Date.ToOffset(TimeSpan.FromHours(timezone.Hours)); + entity.DateTime = dto.Date.ToUniversalTime(); db.TelemetryMessages.Add(entity); } diff --git a/AsbCloudWebApi.IntegrationTests/Clients/ITelemetryControllerClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/ITelemetryControllerClient.cs new file mode 100644 index 00000000..94f4293e --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Clients/ITelemetryControllerClient.cs @@ -0,0 +1,23 @@ +using AsbCloudApp.Data.SAUB; +using Refit; + +namespace AsbCloudWebApi.IntegrationTests.Clients; +public interface ITelemetryControllerClient +{ + private const string BaseRoute = "/api/telemetry"; + + [Get($"{BaseRoute}/Active")] + Task GetTelemetriesInfoByLastData(CancellationToken token); + + [Post($"{BaseRoute}/{{uid}}/info")] + Task PostInfoAsync(string uid, [Body] TelemetryInfoDto info, CancellationToken token); + + [Post($"{BaseRoute}/{{uid}}/message")] + Task PostMessagesAsync(string uid, [Body] IEnumerable dtos, CancellationToken token); + + [Post($"{BaseRoute}/{{uid}}/event")] + Task PostEventsAsync(string uid, [Body] IEnumerable dtos, CancellationToken token); + + [Post($"{BaseRoute}/{{uid}}/user")] + Task PostUsersAsync(string uid, [Body] IEnumerable dtos, CancellationToken token); +} diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs new file mode 100644 index 00000000..e8abd06f --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs @@ -0,0 +1,109 @@ +using AsbCloudApp.Data.SAUB; +using AsbCloudDb.Model; +using AsbCloudWebApi.IntegrationTests.Clients; +using Xunit; + +namespace AsbCloudWebApi.IntegrationTests.Controllers; +public class TelemetryControllerTest : BaseIntegrationTest +{ + private ITelemetryControllerClient client; + static readonly string uid = DateTime.UtcNow.ToString("yyyyMMdd_HHmmssfff"); + + private static readonly SimpleTimezone timezone = new() {TimezoneId = "a", Hours = 5 }; + private static readonly Telemetry telemetry = new Telemetry() {Id = 1, RemoteUid = uid, TimeZone = timezone, Info = new() }; + private readonly IEnumerable events = [new() { Id = 1, EventType = 1, IdCategory = 1, IdSound = 1, Message = "there is no spoon {tag1}", Tag = "tag1" }]; + private readonly IEnumerable users = [new TelemetryUserDto() { Id = 1, Level = 0, Name = "Neo", Patronymic = "Kianovich", Surname = "Theone" }]; + private readonly IEnumerable messages = [new TelemetryMessageDto() { Id = 100, IdEvent = 1, WellDepth = 5, Date = DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(5)), Arg0 = "3.14", IdTelemetryUser = 1 }]; + private readonly IEnumerable telemetryDataSaubEntities = [new TelemetryDataSaub() + { + IdTelemetry = telemetry.Id, + DateTime = DateTimeOffset.UtcNow, + AxialLoad = 2, + WellDepth = 5, + BitDepth = 5, + BlockPosition = 5, + BlockSpeed = 5, + }]; + + public TelemetryControllerTest(WebAppFactoryFixture factory) + : base(factory) + { + client = factory.GetAuthorizedHttpClient(string.Empty); + } + + [Fact] + public async Task GetTelemetriesInfoByLastData() + { + // Arrange + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.Set().AddRange(telemetryDataSaubEntities); + dbContext.SaveChanges(); + + // Act + var response = await client.GetTelemetriesInfoByLastData(CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task PostUsersAsync() + { + // arrange + dbContext.CleanupDbSet(); + + // act + var response = await client.PostUsersAsync(uid, users, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + var telemetryUserCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + Assert.Equal(1, telemetryUserCount); + } + + [Fact] + public async Task PostEventsAsync() + { + // arrange + dbContext.CleanupDbSet(); + + // act + var response = await client.PostEventsAsync(uid, events, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + var telemetryEventCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + Assert.Equal(1, telemetryEventCount); + } + + [Fact] + public async Task PostMessagesAsync() + { + // arrange + dbContext.CleanupDbSet(); + + // act + _ = await client.PostEventsAsync(uid, events, CancellationToken.None); + _ = await client.PostUsersAsync(uid, users, CancellationToken.None); + var response = await client.PostMessagesAsync(uid, messages, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + var telemetryEventCount = dbContext.Set().Count(); + var telemetryUserCount = dbContext.Set().Count(); + var telemetryMessageCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + Assert.Equal(1, telemetryEventCount); + Assert.Equal(1, telemetryUserCount); + Assert.Equal(1, telemetryMessageCount); + } +} From c66d937e7aa9eb9798ea80d6d0a7601804f735fb Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 13 May 2024 11:06:41 +0500 Subject: [PATCH 125/132] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B=20=D0=BF=D1=80=D0=B8=20=D1=85=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B2=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=B8=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BD?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B4=D0=B0=D1=82=D1=8B=20=D0=BE=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20=D0=BA=D0=B5=D1=88?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/WellOperationRepository.cs | 20 +++++- .../Clients/IWellClient.cs | 12 ++++ .../Controllers/WellControllerTest.cs | 67 +++++++++++++++++++ 3 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 AsbCloudWebApi.IntegrationTests/Clients/IWellClient.cs create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 9bcc718b..920702b1 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -135,8 +135,18 @@ public class WellOperationRepository : CrudRepositoryBase 0) + memoryCache.Remove(cacheKeyWellOperations); + + return result; + } + var idType = dtos.First().IdType; var idWell = dtos.First().IdWell; @@ -148,7 +158,13 @@ public class WellOperationRepository : CrudRepositoryBase 0) + memoryCache.Remove(cacheKeyWellOperations); + + return result; + } public override Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IWellClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IWellClient.cs new file mode 100644 index 00000000..1e6961a5 --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Clients/IWellClient.cs @@ -0,0 +1,12 @@ +using AsbCloudApp.Data; +using Refit; + +namespace AsbCloudWebApi.IntegrationTests.Clients; + +public interface IWellClient +{ + private const string BaseRoute = "/api/well"; + + [Get(BaseRoute)] + Task>> GetWellsAsync(); +} diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs new file mode 100644 index 00000000..329240fe --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs @@ -0,0 +1,67 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; +using AsbCloudDb.Model; +using AsbCloudInfrastructure; +using AsbCloudWebApi.IntegrationTests.Clients; +using Mapster; +using Microsoft.EntityFrameworkCore; +using System.Net; +using Xunit; + +namespace AsbCloudWebApi.IntegrationTests.Controllers; + +public class WellControllerTest : BaseIntegrationTest +{ + + private static readonly WellOperationDto wellOperationDto = new() + { + DateStart = DateTimeOffset.UtcNow, + Day = 1, + DepthEnd = 1000, + DepthStart = 500, + DurationHours = 5, + Id = 1, + IdCategory = 5095, + IdPlan = null, + IdType = 1, + IdUser = 1, + IdWell = 1, + IdWellSectionType = 1, + NptHours = 5 + }; + + private readonly IWellClient wellClient; + private readonly IWellOperationClient wellOperationClient; + + public WellControllerTest(WebAppFactoryFixture factory) + : base(factory) + { + wellClient = factory.GetAuthorizedHttpClient(string.Empty); + wellOperationClient = factory.GetAuthorizedHttpClient(string.Empty); + } + + [Fact] + public async Task CheckDateStartForWell_returns_success() + { + //act + var wellOperationDto1 = wellOperationDto.Adapt(); + wellOperationDto1.DateStart = DateTimeOffset.UtcNow; + wellOperationDto1.Id = 2; + + var wellOperations = new List() { wellOperationDto, wellOperationDto1 }; + var insertedRedult = await wellOperationClient.InsertRangeAsync(1, false, wellOperations); + + var wellResponse = await wellClient.GetWellsAsync(); + + //assert + Assert.Equal(HttpStatusCode.OK, wellResponse.StatusCode); + Assert.NotNull(wellResponse.Content); + + var expectedCount = await dbContext.Wells.CountAsync(); + Assert.Equal(expectedCount, wellResponse.Content.Count()); + + var wellStartDate = wellResponse.Content.ElementAt(0).StartDate!.Value.ToUniversalTime(); + var expectedDate = wellOperations.MinByOrDefault(o => o.DateStart)!.DateStart.ToUniversalTime(); + Assert.Equal(expectedDate.ToString(), wellStartDate.ToString()); + } +} \ No newline at end of file From 0f8bc45e80d41af41ce42e1c59c20a943a077449 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 13 May 2024 11:18:24 +0500 Subject: [PATCH 126/132] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/WellControllerTest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs index 329240fe..fe3fea64 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs @@ -60,8 +60,8 @@ public class WellControllerTest : BaseIntegrationTest var expectedCount = await dbContext.Wells.CountAsync(); Assert.Equal(expectedCount, wellResponse.Content.Count()); - var wellStartDate = wellResponse.Content.ElementAt(0).StartDate!.Value.ToUniversalTime(); - var expectedDate = wellOperations.MinByOrDefault(o => o.DateStart)!.DateStart.ToUniversalTime(); - Assert.Equal(expectedDate.ToString(), wellStartDate.ToString()); + var actualFirstStartDate = wellResponse.Content.ElementAt(0).StartDate!.Value.ToUniversalTime(); + var expectedFirstStartDate = wellOperations.MinByOrDefault(o => o.DateStart)!.DateStart.ToUniversalTime(); + Assert.Equal(expectedFirstStartDate.ToString(), actualFirstStartDate.ToString()); } } \ No newline at end of file From d5deafeb0f02e40c298740483526beb778d89a78 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 13 May 2024 12:20:47 +0500 Subject: [PATCH 127/132] Fix Test for TelemetryController.PostMessagesAsync(..) Time to utc. --- .../Controllers/TelemetryControllerTest.cs | 126 +++++++++++++++++- 1 file changed, 125 insertions(+), 1 deletion(-) diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs index e8abd06f..8622f11b 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs @@ -24,6 +24,12 @@ public class TelemetryControllerTest : BaseIntegrationTest BlockPosition = 5, BlockSpeed = 5, }]; + private readonly TelemetryInfoDto telemetryInfoDto = new() + { + TimeZoneId = timezone.TimezoneId, + TimeZoneOffsetTotalHours = timezone.Hours, + Cluster = "cluster1", + }; public TelemetryControllerTest(WebAppFactoryFixture factory) : base(factory) @@ -48,12 +54,69 @@ public class TelemetryControllerTest : BaseIntegrationTest } [Fact] - public async Task PostUsersAsync() + public async Task PostInfoAsync() { // arrange dbContext.CleanupDbSet(); // act + var response = await client.PostInfoAsync(uid, telemetryInfoDto, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + } + + [Fact] + public async Task PostInfoAsync_twice_should_be_ok() + { + // arrange + dbContext.CleanupDbSet(); + + // act + _ = await client.PostInfoAsync(uid, telemetryInfoDto, CancellationToken.None); + var response = await client.PostInfoAsync(uid, telemetryInfoDto, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + } + + [Fact] + public async Task PostUsersAsync() + { + // arrange + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + + // act + var response = await client.PostUsersAsync(uid, users, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + var telemetryUserCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + Assert.Equal(1, telemetryUserCount); + } + + [Fact] + public async Task PostUsers_twice_should_be_ok() + { + // arrange + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + + // act + _ = await client.PostUsersAsync(uid, users, CancellationToken.None); var response = await client.PostUsersAsync(uid, users, CancellationToken.None); // Assert @@ -69,7 +132,10 @@ public class TelemetryControllerTest : BaseIntegrationTest public async Task PostEventsAsync() { // arrange + dbContext.CleanupDbSet(); dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); // act var response = await client.PostEventsAsync(uid, events, CancellationToken.None); @@ -83,12 +149,40 @@ public class TelemetryControllerTest : BaseIntegrationTest Assert.Equal(1, telemetryEventCount); } + [Fact] + public async Task PostEventsAsync_twice_should_be_ok() + { + // arrange + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + + // act + _ = await client.PostEventsAsync(uid, events, CancellationToken.None); + var response = await client.PostEventsAsync(uid, events, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + var telemetryEventCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + Assert.Equal(1, telemetryEventCount); + } + [Fact] public async Task PostMessagesAsync() { // arrange + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + // act _ = await client.PostEventsAsync(uid, events, CancellationToken.None); _ = await client.PostUsersAsync(uid, users, CancellationToken.None); @@ -106,4 +200,34 @@ public class TelemetryControllerTest : BaseIntegrationTest Assert.Equal(1, telemetryUserCount); Assert.Equal(1, telemetryMessageCount); } + + [Fact] + public async Task PostMessagesAsync_twice_should_be_ok() + { + // arrange + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + + // act + _ = await client.PostEventsAsync(uid, events, CancellationToken.None); + _ = await client.PostUsersAsync(uid, users, CancellationToken.None); + _ = await client.PostMessagesAsync(uid, messages, CancellationToken.None); + var response = await client.PostMessagesAsync(uid, messages, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + var telemetryEventCount = dbContext.Set().Count(); + var telemetryUserCount = dbContext.Set().Count(); + var telemetryMessageCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + Assert.Equal(1, telemetryEventCount); + Assert.Equal(1, telemetryUserCount); + Assert.Equal(2, telemetryMessageCount); + } } From d0eeddaca4386284a475c407a5bddf4f55ce9123 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 13 May 2024 16:48:47 +0500 Subject: [PATCH 128/132] =?UTF-8?q?Fix=20DrillTestController.PostDataAsync?= =?UTF-8?q?(..).=20=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B6=D0=BD=D0=BE=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D1=8F=D1=8E?= =?UTF-8?q?=D1=89=D0=B8=D0=B5=D1=81=D1=8F=20=D0=B4=D1=80=D0=B8=D0=BB=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudDb/EFExtensions.cs | 2 +- .../Repository/DrillTestRepository.cs | 6 +- .../Clients/IDrillTestControllerClient.cs | 29 +++++++ .../Controllers/DrillControllerTest.cs | 3 - .../Controllers/DrillTestControllerTest.cs | 77 +++++++++++++++++++ 5 files changed, 111 insertions(+), 6 deletions(-) create mode 100644 AsbCloudWebApi.IntegrationTests/Clients/IDrillTestControllerClient.cs create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/DrillTestControllerTest.cs diff --git a/AsbCloudDb/EFExtensions.cs b/AsbCloudDb/EFExtensions.cs index 9da4c626..4b8361e7 100644 --- a/AsbCloudDb/EFExtensions.cs +++ b/AsbCloudDb/EFExtensions.cs @@ -227,7 +227,7 @@ namespace AsbCloudDb DateTime vDate => $"'{FormatDateValue(vDate)}'", DateTimeOffset vDate => $"'{FormatDateValue(vDate.UtcDateTime)}'", IFormattable vFormattable => FormatFormattableValue(vFormattable), - _ => System.Text.Json.JsonSerializer.Serialize(v), + _ => $"'{EscapeCurlyBraces(JsonSerializer.Serialize(v))}'", }; private static string EscapeCurlyBraces(string vStr) diff --git a/AsbCloudInfrastructure/Repository/DrillTestRepository.cs b/AsbCloudInfrastructure/Repository/DrillTestRepository.cs index 961dd67b..96ba0ece 100644 --- a/AsbCloudInfrastructure/Repository/DrillTestRepository.cs +++ b/AsbCloudInfrastructure/Repository/DrillTestRepository.cs @@ -2,6 +2,7 @@ using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; +using AsbCloudDb; using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; @@ -68,11 +69,12 @@ namespace AsbCloudInfrastructure.Repository var entities = dtos.Select(dto => { var entity = dto.Adapt(); + entity.TimeStampStart = dto.TimeStampStart.ToUniversalTime(); entity.IdTelemetry = idTelemetry; return entity; }); - db.DrillTests.AddRange(entities); - var result = await db.SaveChangesAsync(token); + + var result = await db.Database.ExecInsertOrUpdateAsync(db.Set(), entities, token); return result; } diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IDrillTestControllerClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IDrillTestControllerClient.cs new file mode 100644 index 00000000..ba622557 --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Clients/IDrillTestControllerClient.cs @@ -0,0 +1,29 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.DrillTestReport; +using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Requests; +using Microsoft.AspNetCore.Mvc; +using Refit; + +namespace AsbCloudWebApi.IntegrationTests.Clients; + +public interface IDrillTestControllerClient +{ + [Post("/api/telemetry/{uid}/DrillTest")] + Task PostDataAsync( + string uid, + IEnumerable dtos, + CancellationToken token); + + [Get("/api/well/{idWell}/DrillTest")] + Task> GenerateReportAsync( + int idWell, + int id, + CancellationToken cancellationToken); + + [HttpGet("/api/well/{idWell}/DrillTest/all")] + Task>> GetListAsync( + int idWell, + FileReportRequest request, + CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/DrillControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/DrillControllerTest.cs index 638630ca..ed15f095 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/DrillControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/DrillControllerTest.cs @@ -1,9 +1,6 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Requests; using AsbCloudDb.Model; using AsbCloudWebApi.IntegrationTests.Clients; using AsbCloudWebApi.IntegrationTests.Data; -using System; using Xunit; namespace AsbCloudWebApi.IntegrationTests.Controllers; diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/DrillTestControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/DrillTestControllerTest.cs new file mode 100644 index 00000000..5b1da11b --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Controllers/DrillTestControllerTest.cs @@ -0,0 +1,77 @@ +using AsbCloudApp.Data.SAUB; +using AsbCloudDb.Model; +using AsbCloudWebApi.IntegrationTests.Clients; +using Xunit; + +namespace AsbCloudWebApi.IntegrationTests.Controllers; + +public class DrillTestControllerTest : BaseIntegrationTest +{ + private readonly IDrillTestControllerClient client; + static readonly string uid = DateTime.UtcNow.ToString("yyyyMMdd_HHmmssfff"); + private static readonly SimpleTimezone timezone = new() { TimezoneId = "a", Hours = 5 }; + private static readonly Telemetry telemetry = new Telemetry() { Id = 1, RemoteUid = uid, TimeZone = timezone, Info = new() }; + private readonly IEnumerable drillTests = [new DrillTestBaseDto { + DepthStart = 12, + Id = 1, + Params = [ new DrillTestParamsDto() { + DepthDrillStep = 1, + DepthSpeed = 2, + Speed = 3, + Step = 4, + TimeDrillStep = 5, + Workload = 6, + }, new DrillTestParamsDto() { + DepthDrillStep = 7, + DepthSpeed = 8, + Speed = 9, + Step = 10, + TimeDrillStep = 11, + Workload = 12, + }], + TimeStampStart = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(5)) + }]; + + public DrillTestControllerTest(WebAppFactoryFixture factory) + : base(factory) + { + client = factory.GetAuthorizedHttpClient(string.Empty); + } + + [Fact] + public async Task PostDataAsync() + { + // arrange + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + + // act + var response = await client.PostDataAsync(uid, drillTests, CancellationToken.None); + + // assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var count = dbContext.Set().Count(); + Assert.Equal(1, count); + } + + [Fact] + public async Task PostDataAsync_twice_should_be_ok() + { + // arrange + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + + // act + _ = await client.PostDataAsync(uid, drillTests, CancellationToken.None); + var response = await client.PostDataAsync(uid, drillTests, CancellationToken.None); + + // assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var count = dbContext.Set().Count(); + Assert.Equal(1, count); + } +} \ No newline at end of file From 3d0fa5d5efad22e7d84f9b48fe63a82a818099bd Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 13 May 2024 17:12:50 +0500 Subject: [PATCH 129/132] =?UTF-8?q?Fix=20TelemetryDataSaubController.GetBy?= =?UTF-8?q?WellAsync(..).=20=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA?= =?UTF-8?q?=20UTC=20=D0=BF=D1=80=D0=B8=20=D0=B4=D0=B5=D1=84=D0=BE=D0=BB?= =?UTF-8?q?=D1=82=D0=BD=D0=BE=D0=B9=20=D0=B4=D0=B0=D1=82=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/SAUB/TelemetryDataBaseService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs index 53ed062b..0e07ee09 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 ?? DateTimeOffset.UtcNow) + dateBeginUtc = (dateRange?.To.ToUniversalTime() ?? DateTimeOffset.UtcNow) .AddSeconds(-intervalSec); } else From 36395e73226c4de8b1481966034a4eccf1ac26a8 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 14 May 2024 09:33:25 +0500 Subject: [PATCH 130/132] =?UTF-8?q?=D0=9F=D0=BE=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D0=BD=D0=BE=D0=B9=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6?= =?UTF-8?q?=D0=B8=D0=BD=D1=8B=20=D1=81=20=D0=BD=D0=B5=D0=BE=D0=B1=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D0=BC=D1=8B=D0=BC=D0=B8=20=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D1=8F=D0=BC=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D1=81=D0=B5=D0=BA=D1=86=D0=B8=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/WellCompositeOperationService.cs | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs index 53eedbaa..735a80a0 100644 --- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs @@ -144,7 +144,63 @@ public class WellCompositeOperationService : IWellCompositeOperationService { (6, 5095) }, { (6, 5012) }, { (6, 5040) }, - { (6, 5092) } + { (6, 5092) }, + + { (5, 5001) }, + { (5, 5015) }, + { (5, 5046) }, + { (5, 5037) }, + { (5, 5097) }, + { (5, 5057) }, + { (5, 5113) }, + { (5, 5036) }, + { (5, 5008) }, + { (5, 5003) }, + { (5, 5036) }, + { (5, 5013) }, + { (5, 5000) }, + { (5, 5029) }, + { (5, 5022) }, + { (5, 5017) }, + { (5, 5019) }, + { (5, 5042) }, + { (5, 5046) }, + + { (2, 5096) }, + { (2, 5008) }, + { (2, 5002) }, + { (2, 5003) }, + + { (3, 5096) }, + { (3, 5008) }, + { (3, 5002) }, + { (3, 5003) }, + { (3, 5085) }, + { (3, 5014) }, + + { (31, 5002) }, + { (31, 5003) }, + { (31, 5014) }, + { (31, 5012) }, + { (31, 5083) }, + + { (4, 5002) }, + { (4, 5003) }, + { (4, 5085) }, + { (4, 5087) }, + { (4, 5014) }, + { (4, 5053) }, + { (4, 5084) }, + { (4, 5086) }, + + { (6, 5002) }, + { (6, 5003) }, + { (6, 5085) }, + { (6, 5036) }, + { (6, 5035) }, + { (6, 5021) }, + { (6, 5086) }, + }; public WellCompositeOperationService( From 794831699de7f6119e705bf51964e742fad31167 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 15 May 2024 17:11:56 +0500 Subject: [PATCH 131/132] =?UTF-8?q?=D0=9F=D0=B0=D0=BA=D0=B5=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/WellOperationController.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index 245b1f17..e3f361a7 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -250,6 +250,29 @@ public class WellOperationController : ControllerBase return Ok(result); } + /// + /// Удаляет выбранные операции по скважине + /// + /// id скважины + /// ids выбранных операций + /// Токен отмены задачи + /// Количество удаленных из БД строк + [HttpDelete] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + public async Task DeleteRangeAsync([FromRoute] int idWell, IEnumerable ids, CancellationToken token) + { + if (!await CanUserAccessToWellAsync(idWell, token)) + return Forbid(); + + if (!await CanUserEditWellOperationsAsync(idWell, token)) + return Forbid(); + + var result = await wellOperationRepository.DeleteRangeAsync(ids, token); + + return Ok(result); + } + /// /// Формирование excel файла с операциями на скважине /// From ae620038c74f6656cc2d84d468a79162bc6ba5b0 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 15 May 2024 17:22:52 +0500 Subject: [PATCH 132/132] =?UTF-8?q?=D0=92=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudWebApi/Controllers/WellOperationController.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index e3f361a7..5c6383a2 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -16,6 +16,7 @@ using AsbCloudApp.Requests.ExportOptions; using AsbCloudApp.Requests.ParserOptions; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.WellOperations.Factories; +using System.Linq; namespace AsbCloudWebApi.Controllers; @@ -268,8 +269,14 @@ public class WellOperationController : ControllerBase if (!await CanUserEditWellOperationsAsync(idWell, token)) return Forbid(); + if (!ids.Any()) + return this.ValidationBadRequest(nameof(ids), "Пустой список операций"); + var result = await wellOperationRepository.DeleteRangeAsync(ids, token); + if(result == ICrudRepository.ErrorIdNotFound) + return this.ValidationBadRequest(nameof(ids), "Минимум одна из операций не найдена в базе"); + return Ok(result); }