From d361c9a9b432af143cc4480ed6c81fb617b931c5 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Mon, 22 Nov 2021 17:29:19 +0500 Subject: [PATCH 01/19] CS2-107: Added calculation of max and average Rop for cluster wells --- AsbCloudApp/Data/WellDto.cs | 2 + AsbCloudApp/Services/IWellService.cs | 1 + AsbCloudInfrastructure/DependencyInjection.cs | 2 +- ...tatService.cs => OperationsStatService.cs} | 67 ++++++++++++++++++- .../Services/WellService.cs | 16 +++++ .../ClusterOperationStatController.cs | 67 ------------------- ...ntroller.cs => OperationStatController.cs} | 48 +++++++++++-- 7 files changed, 129 insertions(+), 74 deletions(-) rename AsbCloudInfrastructure/Services/WellOperationService/{WellOperationsStatService.cs => OperationsStatService.cs} (88%) delete mode 100644 AsbCloudWebApi/Controllers/ClusterOperationStatController.cs rename AsbCloudWebApi/Controllers/{WellOperationStatController.cs => OperationStatController.cs} (65%) diff --git a/AsbCloudApp/Data/WellDto.cs b/AsbCloudApp/Data/WellDto.cs index 38bf79ce..d55e7549 100644 --- a/AsbCloudApp/Data/WellDto.cs +++ b/AsbCloudApp/Data/WellDto.cs @@ -10,6 +10,8 @@ namespace AsbCloudApp.Data public double? Longitude { get; set; } public string WellType { get; set; } public int IdWellType { get; set; } + + public int? IdCluster { get; set; } /// /// 0 - незвестно, diff --git a/AsbCloudApp/Services/IWellService.cs b/AsbCloudApp/Services/IWellService.cs index d6f08988..10c9512e 100644 --- a/AsbCloudApp/Services/IWellService.cs +++ b/AsbCloudApp/Services/IWellService.cs @@ -18,5 +18,6 @@ namespace AsbCloudApp.Services bool IsCompanyInvolvedInWell(int idCompany, int idWell); string GetStateText(int state); DateTime GetLastTelemetryDate(int idWell); + Task> GetClusterWellsIdsAsync(int idWell, CancellationToken token); } } diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 92805779..10dc2982 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -40,7 +40,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs similarity index 88% rename from AsbCloudInfrastructure/Services/WellOperationService/WellOperationsStatService.cs rename to AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs index d819d7c1..45cc8212 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs @@ -12,10 +12,11 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.WellOperationService { - public class WellOperationsStatService : IWellOperationsStatService + public class OperationsStatService : IOperationsStatService { private readonly IAsbCloudDbContext db; private readonly IWellService wellService; + private readonly ITelemetryService telemetryService; private readonly CacheTable cacheSectionsTypes; private readonly CacheTable cacheWellType; private readonly CacheTable cacheCluster; @@ -29,14 +30,33 @@ namespace AsbCloudInfrastructure.Services.WellOperationService private const int idOperationTypePlan = 0; private const int idOperationTypeFact = 1; - public WellOperationsStatService(IAsbCloudDbContext db, CacheDb cache, IWellService wellService) + public OperationsStatService(IAsbCloudDbContext db, CacheDb cache, IWellService wellService, + ITelemetryService telemetryService) { this.db = db; this.wellService = wellService; + this.telemetryService = telemetryService; cacheSectionsTypes = cache.GetCachedTable((DbContext)db); cacheWellType = cache.GetCachedTable((DbContext)db); cacheCluster = cache.GetCachedTable((DbContext)db); } + + public async Task GetRopStatByIdWellAsync(int idWell, + CancellationToken token) + { + return await GetRopStatAsync(idWell, token).ConfigureAwait(false); + } + + public async Task GetRopStatByUidAsync(string uid, + CancellationToken token) + { + var idWell = telemetryService.GetidWellByTelemetryUid(uid); + + if (idWell is null) + return null; + + return await GetRopStatAsync((int)idWell, token).ConfigureAwait(false); + } public async Task GetStatClusterAsync(int idCluster, int idCompany, CancellationToken token = default) { @@ -93,6 +113,49 @@ namespace AsbCloudInfrastructure.Services.WellOperationService return statWellDto; } + private async Task GetRopStatAsync(int idWell, CancellationToken token) + { + var clusterWellsIds = await wellService.GetClusterWellsIdsAsync(idWell, token) + .ConfigureAwait(false); + + if (clusterWellsIds is null) + return null; + + var idLastSectionType = await (from o in db.WellOperations + where o.IdWell == idWell && + o.IdType == 1 + orderby o.DepthStart + select o.IdWellSectionType) + .LastOrDefaultAsync(token) + .ConfigureAwait(false); + + var operations = await (from o in db.WellOperations + where clusterWellsIds.Contains(o.IdWell) && + o.IdType == 1 && + o.IdWellSectionType == idLastSectionType + select o) + .ToListAsync(token) + .ConfigureAwait(false); + + var statsList = clusterWellsIds.Select(clusterWellId => + { + var currentWellOps = operations.Where(o => o.IdWell == clusterWellId); + var stat = CalcStat(currentWellOps); + return stat; + }).Where(c => c is not null); + + if (!statsList.Any()) + return null; + + var clusterRops = new ClusterRopStatDto() + { + RopMax = statsList.Max(s => s.Rop), + RopAverage = statsList.Average(s => s.Rop) + }; + + return clusterRops; + } + private async Task CalcStatWellAsync(Well well, CancellationToken token = default) { var wellType = await cacheWellType.FirstOrDefaultAsync(t => t.Id == well.IdWellType, token); diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index 679da469..3e546705 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -138,12 +138,28 @@ namespace AsbCloudInfrastructure.Services }; } + public async Task> GetClusterWellsIdsAsync(int idWell, CancellationToken token) + { + var well = await cacheWells.FirstOrDefaultAsync(w => w.Id == idWell) + .ConfigureAwait(false); + + if (well is null) + return null; + + var clusterWells = await cacheWells.WhereAsync(w => w.IdCluster == well.IdCluster) + .ConfigureAwait(false); + + return clusterWells.Select(w => w.Id); + + } + private WellDto Convert(Well well) { return new WellDto { Id = well.Id, Caption = well.Caption, + IdCluster = well.IdCluster, Cluster = well.Cluster.Caption, Deposit = well.Cluster.Deposit.Caption, LastTelemetryDate = GetLastTelemetryDate(well.Id), diff --git a/AsbCloudWebApi/Controllers/ClusterOperationStatController.cs b/AsbCloudWebApi/Controllers/ClusterOperationStatController.cs deleted file mode 100644 index 60b652e0..00000000 --- a/AsbCloudWebApi/Controllers/ClusterOperationStatController.cs +++ /dev/null @@ -1,67 +0,0 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudWebApi.Controllers -{ - /// - /// Контроллер статистики вручную внесенных операций на кусту - /// - [Route("api/cluster")] - [ApiController] - [Authorize] - public class ClusterOperationStatController : ControllerBase - { - private readonly IWellOperationService operationService; - private readonly IWellService wellService; - private readonly IWellOperationImportService wellOperationImportService; - - public ClusterOperationStatController(IWellOperationService operationService, - IWellService wellService, IWellOperationImportService wellOperationImportService) - { - this.operationService = operationService; - this.wellService = wellService; - this.wellOperationImportService = wellOperationImportService; - } - - /// - /// Формирует данные по среднему и максимальному МСП на кусту - /// - /// id скважины с данного куста (через нее будут полуены данные) - /// - /// Возвращает данные по среднему и максимальному МСП на кусту - [HttpGet("{idWell}/ropStat")] - [ProducesResponseType(typeof(ClusterRopStatDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetClusterRopStatAsync([FromRoute] int idWell, - CancellationToken token = default) - { - if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) - return Forbid(); - - // var result = await operationService.GetOperationsAsync( - // idWell, token).ConfigureAwait(false); - - var result = new ClusterRopStatDto() - { - RopMax = 3.2, - RopAverage = 1.1 - }; - - return Ok(result); - } - - private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token = default) - { - int? idCompany = User.GetCompanyId(); - return idCompany is not null && await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, - idWell, token).ConfigureAwait(false); - } - } -} \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/WellOperationStatController.cs b/AsbCloudWebApi/Controllers/OperationStatController.cs similarity index 65% rename from AsbCloudWebApi/Controllers/WellOperationStatController.cs rename to AsbCloudWebApi/Controllers/OperationStatController.cs index f6235f8d..8f3fc356 100644 --- a/AsbCloudWebApi/Controllers/WellOperationStatController.cs +++ b/AsbCloudWebApi/Controllers/OperationStatController.cs @@ -10,21 +10,61 @@ using System.Threading.Tasks; namespace AsbCloudWebApi.Controllers { /// - /// Контроллер секций скважины + /// Контроллер статистики по операциям на скважине /// [ApiController] [Authorize] [Route("api")] - public class WellOperationStatController : ControllerBase + public class OperationStatController : ControllerBase { - private readonly IWellOperationsStatService operationsStatService; + private readonly IOperationsStatService operationsStatService; private readonly IWellService wellService; - public WellOperationStatController(IWellOperationsStatService sectionsService, IWellService wellService) + public OperationStatController(IOperationsStatService sectionsService, IWellService wellService) { this.operationsStatService = sectionsService; this.wellService = wellService; } + + /// + /// Формирует данные по среднему и максимальному МСП на кусту по id скважины + /// + /// id скважины с данного куста (через нее будут полуены данные) + /// + /// Возвращает данные по среднему и максимальному МСП на кусту + [HttpGet("cluster/{idWell}/idWellRopStat")] + [ProducesResponseType(typeof(ClusterRopStatDto), (int)System.Net.HttpStatusCode.OK)] + public async Task GetClusterRopStatByIdWellAsync([FromRoute] int idWell, + CancellationToken token = default) + { + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) + return Forbid(); + + var result = await operationsStatService.GetRopStatByIdWellAsync( + idWell, token).ConfigureAwait(false); + + return Ok(result); + } + + /// + /// Формирует данные по среднему и максимальному МСП на кусту по uid панели + /// + /// id передающей данные панели + /// + /// Возвращает данные по среднему и максимальному МСП на кусту + [HttpGet("cluster/{uid}/uidRopStat")] + [ProducesResponseType(typeof(ClusterRopStatDto), (int)System.Net.HttpStatusCode.OK)] + public async Task GetClusterRopStatByUidAsync([FromRoute] string uid, + CancellationToken token = default) + { + // if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) + // return Forbid(); + + var result = await operationsStatService.GetRopStatByUidAsync( + uid, token).ConfigureAwait(false); + + return Ok(result); + } /// /// Получает статстику по скважинам куста From 389b519f4b2227847aa4ea449c155c532da43528 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Tue, 23 Nov 2021 11:31:47 +0500 Subject: [PATCH 02/19] CS2-107: Small guard fix for default result of DB query --- ...WellOperationsStatService.cs => IOperationsStatService.cs} | 4 +++- .../Services/WellOperationService/OperationsStatService.cs | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) rename AsbCloudApp/Services/{IWellOperationsStatService.cs => IOperationsStatService.cs} (72%) diff --git a/AsbCloudApp/Services/IWellOperationsStatService.cs b/AsbCloudApp/Services/IOperationsStatService.cs similarity index 72% rename from AsbCloudApp/Services/IWellOperationsStatService.cs rename to AsbCloudApp/Services/IOperationsStatService.cs index dc71fb33..d0689b9e 100644 --- a/AsbCloudApp/Services/IWellOperationsStatService.cs +++ b/AsbCloudApp/Services/IOperationsStatService.cs @@ -5,8 +5,10 @@ using System.Threading.Tasks; namespace AsbCloudApp.Services { - public interface IWellOperationsStatService + public interface IOperationsStatService { + Task GetRopStatByIdWellAsync(int idWell, CancellationToken token); + Task GetRopStatByUidAsync(string uid, CancellationToken token); Task GetStatClusterAsync(int idCluster, int idCompany, CancellationToken token = default); Task GetStatWellAsync(int idWell, CancellationToken token = default); Task>> GetTvdAsync(int idWell, CancellationToken token); diff --git a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs index 45cc8212..5f20c8ac 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs @@ -129,6 +129,9 @@ namespace AsbCloudInfrastructure.Services.WellOperationService .LastOrDefaultAsync(token) .ConfigureAwait(false); + if (idLastSectionType == default) + return null; + var operations = await (from o in db.WellOperations where clusterWellsIds.Contains(o.IdWell) && o.IdType == 1 && From e0a453a1f6a3f482373e3a26d7a9742ca2777110 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Tue, 23 Nov 2021 11:41:27 +0500 Subject: [PATCH 03/19] CS2-107: Added lost data after merge conflict resolve (with dev) --- AsbCloudInfrastructure/Services/WellService.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index f34d68a6..39c52770 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -138,6 +138,20 @@ namespace AsbCloudInfrastructure.Services _ => "Незвестно", }; } + + public async Task> GetClusterWellsIdsAsync(int idWell, CancellationToken token) + { + var well = await cacheWells.FirstOrDefaultAsync(w => w.Id == idWell) + .ConfigureAwait(false); + + if (well is null) + return null; + + var clusterWells = await cacheWells.WhereAsync(w => w.IdCluster == well.IdCluster) + .ConfigureAwait(false); + + return clusterWells.Select(w => w.Id); + } private WellDto Convert(Well well) { @@ -145,6 +159,7 @@ namespace AsbCloudInfrastructure.Services { Id = well.Id, Caption = well.Caption, + IdCluster = well.IdCluster, Cluster = well.Cluster?.Caption, Deposit = well.Cluster?.Deposit?.Caption, LastTelemetryDate = GetLastTelemetryDate(well.Id), From 2a4c76611cb41de0343aea30755072c41a439de2 Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Tue, 23 Nov 2021 11:43:58 +0500 Subject: [PATCH 04/19] Returning 'using' to ef context creation --- AsbCloudInfrastructure/Services/TelemetryTracker.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/TelemetryTracker.cs b/AsbCloudInfrastructure/Services/TelemetryTracker.cs index f05b9dbc..fdab89e8 100644 --- a/AsbCloudInfrastructure/Services/TelemetryTracker.cs +++ b/AsbCloudInfrastructure/Services/TelemetryTracker.cs @@ -44,7 +44,7 @@ namespace AsbCloudInfrastructure.Services var options = new DbContextOptionsBuilder() .UseNpgsql(configuration.GetConnectionString("DefaultConnection")) .Options; - var db = new AsbCloudDbContext(options); + using var db = new AsbCloudDbContext(options); var cacheTelemetry = cacheDb.GetCachedTable(db); var keyValuePairs = new Dictionary(cacheTelemetry.Count()); From 6412c24a3e86a6fac38d29c5ca42f2cb6b1da22e Mon Sep 17 00:00:00 2001 From: KharchenkoVladimir Date: Tue, 23 Nov 2021 14:07:43 +0500 Subject: [PATCH 05/19] CS2-107: Fixed rop stat methods routes --- AsbCloudWebApi/Controllers/OperationStatController.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/AsbCloudWebApi/Controllers/OperationStatController.cs b/AsbCloudWebApi/Controllers/OperationStatController.cs index 8f3fc356..12edf1aa 100644 --- a/AsbCloudWebApi/Controllers/OperationStatController.cs +++ b/AsbCloudWebApi/Controllers/OperationStatController.cs @@ -32,7 +32,7 @@ namespace AsbCloudWebApi.Controllers /// id скважины с данного куста (через нее будут полуены данные) /// /// Возвращает данные по среднему и максимальному МСП на кусту - [HttpGet("cluster/{idWell}/idWellRopStat")] + [HttpGet("well/{idWell}/ropStat")] [ProducesResponseType(typeof(ClusterRopStatDto), (int)System.Net.HttpStatusCode.OK)] public async Task GetClusterRopStatByIdWellAsync([FromRoute] int idWell, CancellationToken token = default) @@ -52,8 +52,9 @@ namespace AsbCloudWebApi.Controllers /// id передающей данные панели /// /// Возвращает данные по среднему и максимальному МСП на кусту - [HttpGet("cluster/{uid}/uidRopStat")] + [HttpGet("telemetry/{uid}/ropStat")] [ProducesResponseType(typeof(ClusterRopStatDto), (int)System.Net.HttpStatusCode.OK)] + [AllowAnonymous] public async Task GetClusterRopStatByUidAsync([FromRoute] string uid, CancellationToken token = default) { From 3d8154ca2d31ac543f2df8bd0604e5240b9e13a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Tue, 23 Nov 2021 16:12:41 +0500 Subject: [PATCH 06/19] Fix TelemetryTracker dbContext disposing. --- .../Services/TelemetryTracker.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/AsbCloudInfrastructure/Services/TelemetryTracker.cs b/AsbCloudInfrastructure/Services/TelemetryTracker.cs index fdab89e8..349a0667 100644 --- a/AsbCloudInfrastructure/Services/TelemetryTracker.cs +++ b/AsbCloudInfrastructure/Services/TelemetryTracker.cs @@ -44,7 +44,7 @@ namespace AsbCloudInfrastructure.Services var options = new DbContextOptionsBuilder() .UseNpgsql(configuration.GetConnectionString("DefaultConnection")) .Options; - using var db = new AsbCloudDbContext(options); + var db = new AsbCloudDbContext(options); var cacheTelemetry = cacheDb.GetCachedTable(db); var keyValuePairs = new Dictionary(cacheTelemetry.Count()); @@ -65,7 +65,7 @@ namespace AsbCloudInfrastructure.Services Task.Run(async () => { - db.Database.SetCommandTimeout(2 * 60); + db.Database.SetCommandTimeout(2 * 60); var dates = await db.TelemetryDataSaub .GroupBy(d => d.IdTelemetry) .Select(g => new @@ -77,9 +77,7 @@ namespace AsbCloudInfrastructure.Services .AsNoTracking() .ToListAsync() .ConfigureAwait(false); - - db.Dispose(); - + var oldReqs = dates.Select(t => new { Uid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry)?.RemoteUid, @@ -91,9 +89,13 @@ namespace AsbCloudInfrastructure.Services { var telemetryStat = telemetriesStats.GetOrAdd(oldReq.Uid, (uid) => new TrackerStat { RemoteUid = uid }); telemetryStat.TelemetryDateMin = oldReq.DateMin; - telemetryStat.TelemetryDateMax = oldReq.DateMax; + telemetryStat.TelemetryDateMax = oldReq.DateMax; telemetryStat.LastTimeServer = oldReq.DateMax; } + }).ContinueWith((t) => + { + db.Dispose(); + return t; }); } From a74032eed59b4b0c68b2e5b123e87d5152b75fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Tue, 23 Nov 2021 16:12:41 +0500 Subject: [PATCH 07/19] Fix TelemetryTracker dbContext disposing. --- .../Services/TelemetryTracker.cs | 14 ++++++++------ .../Controllers/OperationStatController.cs | 3 --- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/AsbCloudInfrastructure/Services/TelemetryTracker.cs b/AsbCloudInfrastructure/Services/TelemetryTracker.cs index fdab89e8..349a0667 100644 --- a/AsbCloudInfrastructure/Services/TelemetryTracker.cs +++ b/AsbCloudInfrastructure/Services/TelemetryTracker.cs @@ -44,7 +44,7 @@ namespace AsbCloudInfrastructure.Services var options = new DbContextOptionsBuilder() .UseNpgsql(configuration.GetConnectionString("DefaultConnection")) .Options; - using var db = new AsbCloudDbContext(options); + var db = new AsbCloudDbContext(options); var cacheTelemetry = cacheDb.GetCachedTable(db); var keyValuePairs = new Dictionary(cacheTelemetry.Count()); @@ -65,7 +65,7 @@ namespace AsbCloudInfrastructure.Services Task.Run(async () => { - db.Database.SetCommandTimeout(2 * 60); + db.Database.SetCommandTimeout(2 * 60); var dates = await db.TelemetryDataSaub .GroupBy(d => d.IdTelemetry) .Select(g => new @@ -77,9 +77,7 @@ namespace AsbCloudInfrastructure.Services .AsNoTracking() .ToListAsync() .ConfigureAwait(false); - - db.Dispose(); - + var oldReqs = dates.Select(t => new { Uid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry)?.RemoteUid, @@ -91,9 +89,13 @@ namespace AsbCloudInfrastructure.Services { var telemetryStat = telemetriesStats.GetOrAdd(oldReq.Uid, (uid) => new TrackerStat { RemoteUid = uid }); telemetryStat.TelemetryDateMin = oldReq.DateMin; - telemetryStat.TelemetryDateMax = oldReq.DateMax; + telemetryStat.TelemetryDateMax = oldReq.DateMax; telemetryStat.LastTimeServer = oldReq.DateMax; } + }).ContinueWith((t) => + { + db.Dispose(); + return t; }); } diff --git a/AsbCloudWebApi/Controllers/OperationStatController.cs b/AsbCloudWebApi/Controllers/OperationStatController.cs index 12edf1aa..cece035b 100644 --- a/AsbCloudWebApi/Controllers/OperationStatController.cs +++ b/AsbCloudWebApi/Controllers/OperationStatController.cs @@ -58,9 +58,6 @@ namespace AsbCloudWebApi.Controllers public async Task GetClusterRopStatByUidAsync([FromRoute] string uid, CancellationToken token = default) { - // if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) - // return Forbid(); - var result = await operationsStatService.GetRopStatByUidAsync( uid, token).ConfigureAwait(false); From 18ad9fc91a9ba83f8a96b42b8a64ac5f3a5b1bae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Wed, 24 Nov 2021 16:16:17 +0500 Subject: [PATCH 08/19] =?UTF-8?q?CS2-124=20=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=BB?= =?UTF-8?q?=D0=B5=D1=80=20=D1=80=D0=B5=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD=D0=B4?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=D1=85=20=D1=83?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=B2=D0=BE=D0=BA=20=D0=B1=D1=83=D1=80=D0=B8?= =?UTF-8?q?=D0=BB=D1=8C=D1=89=D0=B8=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/SetpointsRequestDto.cs | 30 + AsbCloudApp/Services/ISetpointsService.cs | 19 + .../20211124111523_AddSetpoints.Designer.cs | 2841 +++++++++++++++++ .../Migrations/20211124111523_AddSetpoints.cs | 61 + .../AsbCloudDbContextModelSnapshot.cs | 73 + AsbCloudDb/Model/AsbCloudDbContext.cs | 1 + AsbCloudDb/Model/SetpointsRequest.cs | 43 + AsbCloudInfrastructure/DependencyInjection.cs | 1 + .../Services/Cache/CacheDb.cs | 5 +- .../Services/Cache/CacheTable.cs | 81 +- .../Services/SetpointsService.cs | 120 + .../Controllers/SetpointsController.cs | 162 + 12 files changed, 3413 insertions(+), 24 deletions(-) create mode 100644 AsbCloudApp/Data/SetpointsRequestDto.cs create mode 100644 AsbCloudApp/Services/ISetpointsService.cs create mode 100644 AsbCloudDb/Migrations/20211124111523_AddSetpoints.Designer.cs create mode 100644 AsbCloudDb/Migrations/20211124111523_AddSetpoints.cs create mode 100644 AsbCloudDb/Model/SetpointsRequest.cs create mode 100644 AsbCloudInfrastructure/Services/SetpointsService.cs create mode 100644 AsbCloudWebApi/Controllers/SetpointsController.cs diff --git a/AsbCloudApp/Data/SetpointsRequestDto.cs b/AsbCloudApp/Data/SetpointsRequestDto.cs new file mode 100644 index 00000000..1c219722 --- /dev/null +++ b/AsbCloudApp/Data/SetpointsRequestDto.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudApp.Data +{ + public class SetpointsRequestDto : IId + { + public int Id { get; set; } + + public int IdWell { get; set; } + + public int IdAuthor { get; set; } + + public int IdState { get; set; } + + public DateTime UploadDate { get; set; } + + public int ObsolescenceSec { get; set; } + + public Dictionary Setpoints { get; set; } + public string Comment { get; set; } + + public WellDto Well { get; set; } + + public UserDto Author { get; set; } + } +} diff --git a/AsbCloudApp/Services/ISetpointsService.cs b/AsbCloudApp/Services/ISetpointsService.cs new file mode 100644 index 00000000..acb07002 --- /dev/null +++ b/AsbCloudApp/Services/ISetpointsService.cs @@ -0,0 +1,19 @@ +using AsbCloudApp.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services +{ + public interface ISetpointsService + { + Task InsertAsync(SetpointsRequestDto setpoints, CancellationToken token); + Task> GetAsync(int idWell, CancellationToken token); + Task> GetForPanelAsync(string uid, CancellationToken token); + Task TryDelete(int idWell, int id, CancellationToken token); + Task UpdateStateAsync(string uid, int id, SetpointsRequestDto setpointsRequestDto, CancellationToken token); + } +} diff --git a/AsbCloudDb/Migrations/20211124111523_AddSetpoints.Designer.cs b/AsbCloudDb/Migrations/20211124111523_AddSetpoints.Designer.cs new file mode 100644 index 00000000..05dfb4f1 --- /dev/null +++ b/AsbCloudDb/Migrations/20211124111523_AddSetpoints.Designer.cs @@ -0,0 +1,2841 @@ +// +using System; +using System.Collections.Generic; +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace AsbCloudDb.Migrations +{ + [DbContext(typeof(AsbCloudDbContext))] + [Migration("20211124111523_AddSetpoints")] + partial class AddSetpoints + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasPostgresExtension("adminpack") + .HasAnnotation("Relational:Collation", "Russian_Russia.1251") + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.10") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .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.HasKey("Id"); + + b.HasIndex("IdDeposit"); + + b.ToTable("t_cluster"); + + b + .HasComment("Кусты"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .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") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.HasKey("Id"); + + b.ToTable("t_company_type"); + + b.HasData( + new + { + Id = 1, + Caption = "Недрапользователь" + }, + new + { + Id = 2, + Caption = "Буровой подрядчик" + }, + new + { + Id = 3, + Caption = "Сервис автоматизации бурения" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .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.HasKey("Id"); + + b.ToTable("t_deposit"); + + b + .HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AxialLoadMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_max") + .HasComment("Максимальная нагрузка"); + + b.Property("AxialLoadMin") + .HasColumnType("double precision") + .HasColumnName("axial_load_min") + .HasComment("Минимальная нагрузка"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина окончания интервала"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Стартовая глубина"); + + b.Property("FlowMax") + .HasColumnType("double precision") + .HasColumnName("flow_max") + .HasComment("Максимальный расход"); + + b.Property("FlowMin") + .HasColumnType("double precision") + .HasColumnName("flow_min") + .HasComment("Минимальный расход"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("well_id") + .HasComment("Id скважины"); + + b.Property("IdWellOperationCategory") + .HasColumnType("integer") + .HasColumnName("id_operation_category") + .HasComment("Id типа операции"); + + b.Property("LastUpdate") + .HasColumnType("timestamp without time zone") + .HasColumnName("last_update") + .HasComment("Дата последнего изменения"); + + b.Property("PressureMax") + .HasColumnType("double precision") + .HasColumnName("pressure_max") + .HasComment("Максимальное давление"); + + b.Property("PressureMin") + .HasColumnType("double precision") + .HasColumnName("pressure_min") + .HasComment("Минимальное давление"); + + b.Property("RotorSpeedMax") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_max") + .HasComment("Максимальные обороты на ВСП"); + + b.Property("RotorSpeedMin") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_min") + .HasComment("Минимальные обороты на ВСП"); + + b.Property("RotorTorqueMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_max") + .HasComment("Максимальный момент на ВСП"); + + b.Property("RotorTorqueMin") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_min") + .HasComment("Минимальный момент на ВСП"); + + b.HasKey("Id"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellOperationCategory"); + + b.ToTable("t_drill_flow_chart"); + + b + .HasComment("Параметры корридоров бурения (диапазоны параметров бурения)"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AxialLoadAvg") + .HasColumnType("double precision") + .HasColumnName("axial_load_avg") + .HasComment("Средняя нагрузка"); + + b.Property("AxialLoadMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_max") + .HasComment("Максимальная нагрузка"); + + b.Property("AxialLoadMin") + .HasColumnType("double precision") + .HasColumnName("axial_load_min") + .HasComment("Минимальная нагрузка"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина окончания интервала"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Стартовая глубина"); + + b.Property("FlowAvg") + .HasColumnType("double precision") + .HasColumnName("flow_avg") + .HasComment("Средний расход"); + + b.Property("FlowMax") + .HasColumnType("double precision") + .HasColumnName("flow_max") + .HasComment("Максимальный расход"); + + b.Property("FlowMin") + .HasColumnType("double precision") + .HasColumnName("flow_min") + .HasComment("Минимальный расход"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("well_id") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Id с типом секции скважины"); + + b.Property("PressureAvg") + .HasColumnType("double precision") + .HasColumnName("pressure_avg") + .HasComment("Среднее давление"); + + b.Property("PressureMax") + .HasColumnType("double precision") + .HasColumnName("pressure_max") + .HasComment("Максимальное давление"); + + b.Property("PressureMin") + .HasColumnType("double precision") + .HasColumnName("pressure_min") + .HasComment("Минимальное давление"); + + b.Property("RotorSpeedAvg") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_avg") + .HasComment("Средние обороты на ВСП"); + + b.Property("RotorSpeedMax") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_max") + .HasComment("Максимальные обороты на ВСП"); + + b.Property("RotorSpeedMin") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_min") + .HasComment("Минимальные обороты на ВСП"); + + b.Property("RotorTorqueAvg") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_avg") + .HasComment("Средний момент на ВСП"); + + b.Property("RotorTorqueMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_max") + .HasComment("Максимальный момент на ВСП"); + + b.Property("RotorTorqueMin") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_min") + .HasComment("Минимальный момент на ВСП"); + + b.HasKey("Id"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_drill_params"); + + b + .HasComment("Режим бурения в секции (диапазоны параметров бурения)"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_file_category"); + + b + .HasComment("Категории файлов"); + + b.HasData( + new + { + Id = 1, + Name = "Растворный сервис", + ShortName = "fluidService" + }, + new + { + Id = 2, + Name = "Цементирование", + ShortName = "cement" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "nnb" + }, + new + { + Id = 4, + Name = "ГТИ", + ShortName = "gti" + }, + new + { + Id = 5, + Name = "Документы по скважине", + ShortName = "wellDocuments" + }, + new + { + Id = 6, + Name = "Супервайзер", + ShortName = "supervisor" + }, + new + { + Id = 7, + Name = "Мастер", + ShortName = "master" + }, + new + { + Id = 8, + Name = "Последний замер бурового раствора ПЛАН", + ShortName = "fluidPlanLastData" + }, + new + { + Id = 9, + Name = "Последний замер бурового раствора ФАКТ", + ShortName = "fluidFactLastData" + }, + new + { + Id = 10, + Name = "Последние данные Шламограммы", + ShortName = "mudLastData" + }, + new + { + Id = 11, + Name = "Последние данные ННБ", + ShortName = "nnbLastData" + }, + new + { + Id = 12, + Name = "Рапорт", + ShortName = "report" + }, + new + { + Id = 13, + Name = "Программа бурения, части", + ShortName = "ПБч" + }, + new + { + Id = 14, + Name = "Программа бурения", + ShortName = "ПБ" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + 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") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название файла"); + + b.Property("PublishInfo") + .HasColumnType("jsonb") + .HasColumnName("publish_info") + .HasComment("Информация о файле в облаке"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("file_size") + .HasComment("Размер файла"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_file_info"); + + b + .HasComment("Файлы всех категорий"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp without 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 - Согласован"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("id пользователя"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Помечен ли файл как удаленный"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdUser"); + + b.ToTable("t_file_mark"); + + b + .HasComment("Действия с файлами."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property>("Data") + .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 without time zone") + .HasColumnName("timestamp") + .HasComment("время добавления"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_measure"); + + b + .HasComment("Таблица c данными для вкладки 'Последние данные'"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_measure_category"); + + b + .HasComment("Категория последних данных"); + + b.HasData( + new + { + Id = 1, + Name = "Показатели бурового раствора", + ShortName = "Раствор" + }, + new + { + Id = 2, + Name = "Шламограмма", + ShortName = "Шламограмма" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "ННБ" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("IdCompany", "IdWell"); + + b.HasIndex("IdWell"); + + b.ToTable("t_relation_company_well"); + + b + .HasComment("отношение скважин и компаний"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Begin") + .HasColumnType("timestamp with time zone") + .HasColumnName("begin"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end") + .HasComment("timestamp with time zone"); + + b.Property("Format") + .HasColumnType("integer") + .HasColumnName("format") + .HasComment("Формат отчета"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла-родителя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("Step") + .HasColumnType("integer") + .HasColumnName("step") + .HasComment("размер шага в секундах"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdWell"); + + b.ToTable("t_report_property"); + + b + .HasComment("Отчеты с данными по буровым"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + 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") + .HasColumnType("jsonb") + .HasColumnName("setpoint_set") + .HasComment("Набор уставок"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdWell"); + + b.ToTable("t_setpoints_rquest"); + + b + .HasComment("Запросы на изменение уставок панели оператора"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + b.Property("TelemetryTimeZone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); + + b.ToTable("t_telemetry"); + + b + .HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("DurationSec") + .HasColumnType("integer") + .HasColumnName("duration_sec") + .HasComment("Кол-во секунд после предыдущей операции"); + + b.Property("IdOperation") + .HasColumnType("integer") + .HasColumnName("id_operation"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IsBitPositionDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_bit_position_decreasing") + .HasComment("Долото поднимается"); + + b.Property("IsBitPositionIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_bit_position_increasing") + .HasComment("Долото спускается"); + + b.Property("IsBitPositionLt20") + .HasColumnType("boolean") + .HasColumnName("is_bit_posision_lt_20") + .HasComment("Положение долота меньше 20м"); + + b.Property("IsBlockPositionDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_block_posision_decresing") + .HasComment("Талевый блок поднимается"); + + b.Property("IsBlockPositionIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_block_posision_incresing") + .HasComment("Талевый блок спускается"); + + b.Property("IsHookWeightLt3") + .HasColumnType("boolean") + .HasColumnName("is_hook_weight_lt_3") + .HasComment("Вес на крюке менее 3т"); + + b.Property("IsHookWeightNotChanges") + .HasColumnType("boolean") + .HasColumnName("is_hook_weight_not_changes") + .HasComment("Вес на крюке не меняется"); + + b.Property("IsPressureGt20") + .HasColumnType("boolean") + .HasColumnName("is_pressure_gt_20") + .HasComment("Давоение более 20"); + + b.Property("IsPressureLt20") + .HasColumnType("boolean") + .HasColumnName("is_pressure_lt_20") + .HasComment("Давление менее 20"); + + b.Property("IsRotorSpeedGt5") + .HasColumnType("boolean") + .HasColumnName("is_rotor_speed_gt_3") + .HasComment("Обороты ротора выше 3"); + + b.Property("IsRotorSpeedLt5") + .HasColumnType("boolean") + .HasColumnName("is_rotor_speed_lt_3") + .HasComment("Обороты ротора ниже 3"); + + b.Property("IsWellDepthDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_well_depth_decreasing") + .HasComment("Глубина забоя не увеличивается"); + + b.Property("IsWellDepthIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_well_depth_increasing") + .HasComment("Глубина забоя увеличивается"); + + b.Property("OperationEndDepth") + .HasColumnType("double precision") + .HasColumnName("operation_end_depth") + .HasComment("Глубина, на которой закончилась операция"); + + b.Property("OperationStartDepth") + .HasColumnType("double precision") + .HasColumnName("operation_start_depth") + .HasComment("Глубина, на которой началась операция"); + + b.Property("UnixDate") + .HasColumnType("bigint") + .HasColumnName("unix_date") + .HasComment("Unix timestamp для Linq запросов с вычислением дат"); + + b.HasKey("Id"); + + b.HasIndex("IdOperation"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_analysis"); + + b + .HasComment("События на скважине"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("Date") + .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("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("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", "Date"); + + b.ToTable("t_telemetry_data_saub"); + + b + .HasComment("набор основных данных по SAUB"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("BreakAngleK") + .HasColumnType("real") + .HasColumnName("break_angle_k") + .HasComment("Коэффициент для расчёта за какой угол нужно тормозить"); + + b.Property("BreakAngleLeft") + .HasColumnType("real") + .HasColumnName("break_angle_left") + .HasComment("Угол торможения влево при работе по моменту"); + + b.Property("EncoderResolution") + .HasColumnType("real") + .HasColumnName("encoder_resolution") + .HasComment(" Разрешение энкодера"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Выбранный режим управления"); + + b.Property("PidMuxTorqueLeftLimit") + .HasColumnType("real") + .HasColumnName("pid_mux_torque_left_limit") + .HasComment(" Момент при котором определяется ехать назад по моменту или по скорости"); + + b.Property("PositionRight") + .HasColumnType("real") + .HasColumnName("position_right") + .HasComment("Крайний правый угол осциляции"); + + b.Property("PositionZero") + .HasColumnType("real") + .HasColumnName("position_zero") + .HasComment("Нулевая позиция осциляции"); + + b.Property("Ratio") + .HasColumnType("real") + .HasColumnName("ratio") + .HasComment(" Коэффициент редукции редектора"); + + b.Property("ReverseKTorque") + .HasColumnType("real") + .HasColumnName("reverse_k_torque") + .HasComment("Коэффициент на который умножается момент, для того чтобы система поняла что мы движемся в обратную сторону"); + + b.Property("ReverseSpeedSpZeroTime") + .HasColumnType("smallint") + .HasColumnName("reverse_speed_sp_zero_time") + .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("RotorTorqueAvg") + .HasColumnType("real") + .HasColumnName("rotor_torque_avg") + .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.Property("TopDriveSpeed") + .HasColumnType("real") + .HasColumnName("top_drive_speed") + .HasComment("Скорость СВП"); + + b.Property("TopDriveSpeedErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_speed_err"); + + b.Property("TopDriveSpeedMax") + .HasColumnType("real") + .HasColumnName("top_drive_speed_max") + .HasComment("верхний предел"); + + b.Property("TopDriveSpeedMin") + .HasColumnType("real") + .HasColumnName("top_drive_speed_min") + .HasComment("нижний предел"); + + b.Property("TopDriveSpeedOffset") + .HasColumnType("real") + .HasColumnName("top_drive_speed_offset") + .HasComment("смещение"); + + b.Property("TopDriveSpeedSpFrom") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from") + .HasComment("Заданная скорость c СВП"); + + b.Property("TopDriveSpeedSpFromErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_speed_sp_from_err"); + + b.Property("TopDriveSpeedSpFromMax") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from_max"); + + b.Property("TopDriveSpeedSpFromMin") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from_min"); + + b.Property("TopDriveSpeedSpFromOffset") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from_offset"); + + b.Property("TopDriveSpeedSpTo") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to") + .HasComment("Задание скорости на СВП"); + + b.Property("TopDriveSpeedSpToErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_speed_sp_to_err"); + + b.Property("TopDriveSpeedSpToMax") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to_max"); + + b.Property("TopDriveSpeedSpToMin") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to_min"); + + b.Property("TopDriveSpeedSpToOffset") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to_offset"); + + b.Property("TopDriveTorque") + .HasColumnType("real") + .HasColumnName("top_drive_torque") + .HasComment("Момент СВП"); + + b.Property("TopDriveTorqueErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_torque_err"); + + b.Property("TopDriveTorqueMax") + .HasColumnType("real") + .HasColumnName("top_drive_torque_max"); + + b.Property("TopDriveTorqueMin") + .HasColumnType("real") + .HasColumnName("top_drive_torque_min"); + + b.Property("TopDriveTorqueOffset") + .HasColumnType("real") + .HasColumnName("top_drive_torque_offset"); + + b.Property("TopDriveTorqueSpFrom") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from") + .HasComment("Заданный момент c СВП"); + + b.Property("TopDriveTorqueSpFromErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_torque_sp_from_err"); + + b.Property("TopDriveTorqueSpFromMax") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from_max"); + + b.Property("TopDriveTorqueSpFromMin") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from_min"); + + b.Property("TopDriveTorqueSpFromOffset") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from_offset"); + + b.Property("TopDriveTorqueSpTo") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to") + .HasComment("Задание момента на СВП"); + + b.Property("TopDriveTorqueSpToErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_torque_sp_to_err"); + + b.Property("TopDriveTorqueSpToMax") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to_max"); + + b.Property("TopDriveTorqueSpToMin") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to_min"); + + b.Property("TopDriveTorqueSpToOffset") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to_offset"); + + b.Property("TorqueLeftLimit") + .HasColumnType("real") + .HasColumnName("torque_left_limit") + .HasComment("Ограничение крутящего момента влево"); + + b.Property("TorqueRampTime") + .HasColumnType("real") + .HasColumnName("torque_ramp_time") + .HasComment("Время нарастания момента"); + + b.Property("TorqueRightLimit") + .HasColumnType("real") + .HasColumnName("torque_right_limit") + .HasComment("Ограничение крутящего момента вправо"); + + b.Property("TorqueStarting") + .HasColumnType("real") + .HasColumnName("torque_starting") + .HasComment(" Страгивающий момент"); + + b.Property("TurnLeftOnceByAngle") + .HasColumnType("real") + .HasColumnName("turn_left_once_by_angle") + .HasComment("Доворот по градусам единожды влево"); + + b.Property("TurnLeftOnceByRevols") + .HasColumnType("real") + .HasColumnName("turn_left_once_by_revols") + .HasComment("Доворот по оборотам единожды влево"); + + b.Property("TurnLeftOnceByTorque") + .HasColumnType("real") + .HasColumnName("turn_left_once_by_torque") + .HasComment("Доворот по моменту единожды влево"); + + b.Property("TurnRightOnceByAngle") + .HasColumnType("real") + .HasColumnName("turn_right_once_by_angle") + .HasComment("Доворот по градусам единожды вправо"); + + b.Property("TurnRightOnceByRevols") + .HasColumnType("real") + .HasColumnName("turn_right_once_by_revols") + .HasComment("Доворот по оборотам единожды вправо"); + + b.Property("TurnRightOnceByTorque") + .HasColumnType("real") + .HasColumnName("turn_right_once_by_torque") + .HasComment("Доворот по моменту единожды вправо"); + + b.Property("UnlockBySectorOut") + .HasColumnType("real") + .HasColumnName("unlock_by_sector_out") + .HasComment(" Градус отклонения от сектора для автоматического сброса блокировки"); + + b.Property("Ver") + .HasColumnType("real") + .HasColumnName("ver") + .HasComment("Версия ПО ПЛК"); + + b.Property("W2800") + .HasColumnType("smallint") + .HasColumnName("w2800") + .HasComment("Установка нуля энкодера"); + + b.Property("W2808") + .HasColumnType("smallint") + .HasColumnName("w2808") + .HasComment("Неисправность энкодера"); + + b.Property("W2810") + .HasColumnType("smallint") + .HasColumnName("w2810") + .HasComment(" автоматический сброс блокировки"); + + b.HasKey("IdTelemetry", "Date"); + + b.ToTable("t_telemetry_data_spin"); + + b + .HasComment("набор основных данных по SpinMaster"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.Property("MessageTemplate") + .HasColumnType("text") + .HasColumnName("message_template"); + + b.HasKey("IdTelemetry", "IdEvent"); + + b.ToTable("t_telemetry_event"); + + b + .HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + 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("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdTelemetryUser") + .HasColumnType("integer") + .HasColumnName("id_telemetry_user") + .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); + + b.Property("WellDepth") + .HasColumnType("double precision") + .HasColumnName("well_depth"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_message"); + + b + .HasComment("Сообщения на буровых"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic"); + + b.Property("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname"); + + b.HasKey("IdTelemetry", "IdUser"); + + b.ToTable("t_telemetry_user"); + + b + .HasComment("Пользователи панели САУБ. Для сообщений."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdRole") + .HasColumnType("integer") + .HasColumnName("id_role"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Login") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("login"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("имя"); + + b.Property("PasswordHash") + .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("State") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n100 - удален"); + + b.Property("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("IdRole"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user"); + + b + .HasComment("Пользователи облака"); + + b.HasData( + new + { + Id = 1, + IdCompany = 1, + IdRole = 1, + Level = 2147483647, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b + .HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор" + }, + new + { + Id = 2, + Caption = "Пользователь" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .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.HasKey("Id"); + + b.HasIndex("IdCluster"); + + b.HasIndex("IdTelemetry") + .IsUnique(); + + b.HasIndex("IdWellType"); + + b.ToTable("t_well"); + + b + .HasComment("скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины получателя"); + + b.Property("IdWellSrc") + .HasColumnType("integer") + .HasColumnName("id_well_src") + .HasComment("Id скважины композита"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции композита"); + + b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); + + b.HasIndex("IdWellSectionType"); + + b.HasIndex("IdWellSrc"); + + b.ToTable("t_well_сomposite"); + + b + .HasComment("Композитная скважина"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp without 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("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0 = План или 1 = Факт"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции скважины"); + + b.HasKey("Id"); + + b.HasIndex("DateStart"); + + b.HasIndex("DepthEnd"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_well_operation"); + + b + .HasComment("Данные по операциям на скважине"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Code") + .HasColumnType("integer") + .HasColumnName("code") + .HasComment("Код операции"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории операции"); + + b.HasKey("Id"); + + b.ToTable("t_well_operation_category"); + + b + .HasComment("Справочник операций на скважине"); + + b.HasData( + new + { + Id = 1, + Code = 0, + Name = "Невозможно определить операцию" + }, + new + { + Id = 2, + Code = 0, + Name = "Роторное бурение" + }, + new + { + Id = 3, + Code = 0, + Name = "Слайдирование" + }, + new + { + Id = 4, + Code = 0, + Name = "Подъем с проработкой" + }, + new + { + Id = 5, + Code = 0, + Name = "Спуск с проработкой" + }, + new + { + Id = 6, + Code = 0, + Name = "Подъем с промывкой" + }, + new + { + Id = 7, + Code = 0, + Name = "Спуск с промывкой" + }, + new + { + Id = 8, + Code = 0, + Name = "Спуск в скважину" + }, + new + { + Id = 9, + Code = 0, + Name = "Спуск с вращением" + }, + new + { + Id = 10, + Code = 0, + Name = "Подъем из скважины" + }, + new + { + Id = 11, + Code = 0, + Name = "Подъем с вращением" + }, + new + { + Id = 12, + Code = 0, + Name = "Промывка в покое" + }, + new + { + Id = 13, + Code = 0, + Name = "Промывка с вращением" + }, + new + { + Id = 14, + Code = 0, + Name = "Удержание в клиньях" + }, + new + { + Id = 15, + Code = 0, + Name = "Неподвижное состояние" + }, + new + { + Id = 16, + Code = 0, + Name = "Вращение без циркуляции" + }, + new + { + Id = 17, + Code = 0, + Name = "На поверхности" + }, + new + { + Id = 1001, + Code = 0, + Name = "Бурение" + }, + new + { + Id = 1002, + Code = 0, + Name = "ГИС" + }, + new + { + Id = 1003, + Code = 0, + Name = "ГФР" + }, + new + { + Id = 1004, + Code = 0, + Name = "Монтаж ПВО" + }, + new + { + Id = 1005, + Code = 0, + Name = "Демонтаж ПВО" + }, + new + { + Id = 1006, + Code = 0, + Name = "Установка ФА" + }, + new + { + Id = 1007, + Code = 0, + Name = "Оборудование устья" + }, + new + { + Id = 1008, + Code = 0, + Name = "ОЗЦ" + }, + new + { + Id = 1009, + Code = 0, + Name = "Оборудование устья" + }, + new + { + Id = 1010, + Code = 0, + Name = "ОЗЦ" + }, + new + { + Id = 1011, + Code = 0, + Name = "Начало цикла строительства скважины" + }, + new + { + Id = 1012, + Code = 0, + Name = "Окончание цикла строительства скважины" + }, + new + { + Id = 1013, + Code = 0, + Name = "Опрессовка ПВО" + }, + new + { + Id = 1014, + Code = 0, + Name = "Опресовка Ц.К." + }, + new + { + Id = 1015, + Code = 0, + Name = "Опрессовка ВЗД" + }, + new + { + Id = 1016, + Code = 0, + Name = "Перевод скв на другой тип промывочной жидкости" + }, + new + { + Id = 1017, + Code = 0, + Name = "Перезапись каротажа" + }, + new + { + Id = 1018, + Code = 0, + Name = "Перетяжка талевого каната" + }, + new + { + Id = 1019, + Code = 0, + Name = "Наращивание, промывка" + }, + new + { + Id = 1020, + Code = 0, + Name = "Подъем инструмента" + }, + new + { + Id = 1021, + Code = 0, + Name = "Подъем инструмента с промывкой" + }, + new + { + Id = 1022, + Code = 0, + Name = "Обратная проработка" + }, + new + { + Id = 1023, + Code = 0, + Name = "Сборка инструмента" + }, + new + { + Id = 1024, + Code = 0, + Name = "Подготовительные работы" + }, + new + { + Id = 1025, + Code = 0, + Name = "Сборка КНБК" + }, + new + { + Id = 1026, + Code = 0, + Name = "Разборка КНБК" + }, + new + { + Id = 1027, + Code = 0, + Name = "Промывка" + }, + new + { + Id = 1028, + Code = 0, + Name = "Промежуточная промывка" + }, + new + { + Id = 1029, + Code = 0, + Name = "Прокачка пачек" + }, + new + { + Id = 1030, + Code = 0, + Name = "Разбуривание тех.оснастки" + }, + new + { + Id = 1031, + Code = 0, + Name = "Ремонт" + }, + new + { + Id = 1032, + Code = 0, + Name = "Спуск инструмента" + }, + new + { + Id = 1033, + Code = 0, + Name = "Спуск инструмента с промывкой" + }, + new + { + Id = 1034, + Code = 0, + Name = "Прямая проработка" + }, + new + { + Id = 1035, + Code = 0, + Name = "Принудительная проработка" + }, + new + { + Id = 1036, + Code = 0, + Name = "Спуск обсадной колонны" + }, + new + { + Id = 1037, + Code = 0, + Name = "Тех СПО-подъем" + }, + new + { + Id = 1038, + Code = 0, + Name = "Тех СПО-спуск" + }, + new + { + Id = 1039, + Code = 0, + Name = "Техническое обслуживание" + }, + new + { + Id = 1040, + Code = 0, + Name = "Цементаж" + }, + new + { + Id = 1041, + Code = 0, + Name = "Шаблонировка ствола" + }, + new + { + Id = 1042, + Code = 0, + Name = "Геологическое осложнение" + }, + new + { + Id = 1043, + Code = 0, + Name = "НПВ" + }, + new + { + Id = 1044, + Code = 0, + Name = "ВМР" + }, + new + { + Id = 1045, + Code = 0, + Name = "Прочее" + }, + new + { + Id = 1046, + Code = 0, + Name = "Спуск КНБК" + }, + new + { + Id = 1047, + Code = 0, + Name = "Подъем КНБК" + }, + new + { + Id = 1048, + Code = 0, + Name = "Спуск ОК" + }, + new + { + Id = 1050, + Code = 0, + Name = "Промывка при спуске ОК" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_section_type"); + + b + .HasComment("конструкция секции скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Пилотный ствол" + }, + new + { + Id = 2, + Caption = "Направление" + }, + new + { + Id = 3, + Caption = "Кондуктор" + }, + new + { + Id = 4, + Caption = "Эксплуатационная колонна" + }, + new + { + Id = 5, + Caption = "Транспортный ствол" + }, + new + { + Id = 6, + Caption = "Хвостовик" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_type"); + + b + .HasComment("конструкция скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Наклонно-направленная" + }, + new + { + Id = 2, + Caption = "Горизонтальная" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.HasOne("AsbCloudDb.Model.Deposit", "Deposit") + .WithMany("Clusters") + .HasForeignKey("IdDeposit") + .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.DrillFlowChart", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("DrillParamsCollection") + .HasForeignKey("IdWellSectionType") + .HasConstraintName("t_drill_params_t_well_section_type_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + 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") + .HasConstraintName("t_file_mark_t_file_info_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .HasConstraintName("t_user_t_file_mark_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileInfo"); + + b.Navigation("User"); + }); + + 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.RelationCompanyWell", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdCompany") + .HasConstraintName("t_relation_company_well_t_company_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .HasConstraintName("t_relation_company_well_t_well_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + 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.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.TelemetryAnalysis", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Operation") + .WithMany("Analysis") + .HasForeignKey("IdOperation") + .HasConstraintName("t_analysis_t_operation_id_fk") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Analysis") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_analysis_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Operation"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_event_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_messages_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .HasConstraintName("t_user_t_company_id_fk") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("AsbCloudDb.Model.UserRole", "Role") + .WithMany("Users") + .HasForeignKey("IdRole"); + + b.Navigation("Company"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.HasOne("AsbCloudDb.Model.Cluster", "Cluster") + .WithMany("Wells") + .HasForeignKey("IdCluster") + .HasConstraintName("t_well_t_cluster_id_fk"); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithOne("Well") + .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry") + .HasConstraintName("t_well_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("AsbCloudDb.Model.WellType", "WellType") + .WithMany("Wells") + .HasForeignKey("IdWellType"); + + 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") + .HasConstraintName("t_well_сomposite_t_well_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .HasConstraintName("t_well_сomposite_src_t_well_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + + b.Navigation("WellSrc"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .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.Navigation("OperationCategory"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + 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"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Navigation("Clusters"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Navigation("FileMarks"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Navigation("Measures"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Navigation("Analysis"); + + 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"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("Users"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellComposites"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Navigation("Analysis"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Navigation("DrillParamsCollection"); + + 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/20211124111523_AddSetpoints.cs b/AsbCloudDb/Migrations/20211124111523_AddSetpoints.cs new file mode 100644 index 00000000..d8ddb8c1 --- /dev/null +++ b/AsbCloudDb/Migrations/20211124111523_AddSetpoints.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace AsbCloudDb.Migrations +{ + public partial class AddSetpoints : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "t_setpoints_rquest", + columns: table => new + { + id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + id_well = table.Column(type: "integer", nullable: false, comment: "id скважины"), + id_author = table.Column(type: "integer", nullable: false, comment: "Id пользователя, загрузившего файл"), + id_state = table.Column(type: "integer", nullable: false, comment: "0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело"), + date = table.Column(type: "timestamp with time zone", nullable: false), + obsolescence = table.Column(type: "integer", nullable: false, comment: "сек. до устаревания"), + setpoint_set = table.Column>(type: "jsonb", nullable: true, comment: "Набор уставок"), + comment = table.Column(type: "text", nullable: true, comment: "комментарий для оператора") + }, + constraints: table => + { + table.PrimaryKey("PK_t_setpoints_rquest", x => x.id); + table.ForeignKey( + name: "FK_t_setpoints_rquest_t_user_id_author", + column: x => x.id_author, + principalTable: "t_user", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_t_setpoints_rquest_t_well_id_well", + column: x => x.id_well, + principalTable: "t_well", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }, + comment: "Запросы на изменение уставок панели оператора"); + + migrationBuilder.CreateIndex( + name: "IX_t_setpoints_rquest_id_author", + table: "t_setpoints_rquest", + column: "id_author"); + + migrationBuilder.CreateIndex( + name: "IX_t_setpoints_rquest_id_well", + table: "t_setpoints_rquest", + column: "id_well"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "t_setpoints_rquest"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 22260841..bfb9eaeb 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -750,6 +750,60 @@ namespace AsbCloudDb.Migrations .HasComment("Отчеты с данными по буровым"); }); + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + 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") + .HasColumnType("jsonb") + .HasColumnName("setpoint_set") + .HasComment("Набор уставок"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdWell"); + + b.ToTable("t_setpoints_rquest"); + + b + .HasComment("Запросы на изменение уставок панели оператора"); + }); + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => { b.Property("Id") @@ -2491,6 +2545,25 @@ namespace AsbCloudDb.Migrations 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.TelemetryAnalysis", b => { b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Operation") diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 313d57c4..a4db4da3 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -21,6 +21,7 @@ namespace AsbCloudDb.Model public virtual DbSet Measures { get; set; } public virtual DbSet MeasureCategories { get; set; } public virtual DbSet ReportProperties { get; set; } + public virtual DbSet SetpointsRequests { get; set; } public virtual DbSet Telemetries { get; set; } public virtual DbSet TelemetryDataSaub { get; set; } public virtual DbSet TelemetryDataSpin { get; set; } diff --git a/AsbCloudDb/Model/SetpointsRequest.cs b/AsbCloudDb/Model/SetpointsRequest.cs new file mode 100644 index 00000000..e098a708 --- /dev/null +++ b/AsbCloudDb/Model/SetpointsRequest.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace AsbCloudDb.Model +{ + [Table("t_setpoints_rquest"), Comment("Запросы на изменение уставок панели оператора")] + public class SetpointsRequest : IId, IIdWell + { + [Key] + [Column("id")] + public int Id { get; set; } + + [Column("id_well"), Comment("id скважины")] + public int IdWell { get; set; } + + [Column("id_author"), Comment("Id пользователя, загрузившего файл")] + public int IdAuthor { get; set; } + + [Column("id_state"), Comment("0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело")] + public int IdState { get; set; } + + [Column("date", TypeName = "timestamp with time zone")] + public DateTime UploadDate { get; set; } + + [Column("obsolescence"), Comment("сек. до устаревания")] + public int ObsolescenceSec { get; set; } + + [Column("setpoint_set", TypeName = "jsonb"), Comment("Набор уставок")] + public Dictionary Setpoints { get; set; } + + [Column("comment"), Comment("комментарий для оператора")] + public string Comment { get; set; } + + [ForeignKey(nameof(IdWell))] + public virtual Well Well { get; set; } + + [ForeignKey(nameof(IdAuthor))] + public virtual User Author { get; set; } + } +} diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index fd1b36b3..4bacb366 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -48,6 +48,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); // admin crud services: services.AddTransient, CrudServiceBase>(); diff --git a/AsbCloudInfrastructure/Services/Cache/CacheDb.cs b/AsbCloudInfrastructure/Services/Cache/CacheDb.cs index f4624b68..bff205ad 100644 --- a/AsbCloudInfrastructure/Services/Cache/CacheDb.cs +++ b/AsbCloudInfrastructure/Services/Cache/CacheDb.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -10,7 +11,7 @@ namespace AsbCloudInfrastructure.Services.Cache private readonly ConcurrentDictionary cache = new ConcurrentDictionary(); - public CacheTable GetCachedTable(DbContext context) + public CacheTable GetCachedTable(DbContext context, IEnumerable includes = null) where TEntity : class { var nameOfTEntity = typeof(TEntity).FullName; @@ -18,7 +19,7 @@ namespace AsbCloudInfrastructure.Services.Cache NameOfTEntity = nameOfTEntity, Entities = new List(), }); - var tableCache = new CacheTable(context, cacheItem); + var tableCache = new CacheTable(context, cacheItem, includes); return tableCache; } diff --git a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs index 6b0ae9c5..b68637fa 100644 --- a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs +++ b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs @@ -18,17 +18,42 @@ namespace AsbCloudInfrastructure.Services.Cache private static readonly string nameOfTEntity = typeof(TEntity).Name; private readonly CacheTableDataStore data; + private readonly Func, IQueryable> configureDbSet; private readonly List cached; private readonly DbContext context; private readonly DbSet dbSet; - internal CacheTable(DbContext context, CacheTableDataStore data) + internal CacheTable(DbContext context, CacheTableDataStore data, IEnumerable includes = null) { this.context = context; this.data = data; dbSet = context.Set(); + + if (includes?.Any() == true) + configureDbSet = (DbSet dbSet) => + { + IQueryable result = dbSet; + foreach (var include in includes) + result = result.Include(include); + return result; + }; + + cached = (List)data.Entities; - if ((cached.Count == 0)||data.IsObsolete) + if ((cached.Count == 0) || data.IsObsolete) + Refresh(false); + } + + internal CacheTable(DbContext context, CacheTableDataStore data, Func, IQueryable> configureDbSet = null) + { + this.context = context; + this.data = data; + this.configureDbSet = configureDbSet; + + dbSet = context.Set(); + + cached = (List)data.Entities; + if ((cached.Count == 0) || data.IsObsolete) Refresh(false); } @@ -97,7 +122,8 @@ namespace AsbCloudInfrastructure.Services.Cache if (force || data.LastResreshDate + minPeriodRefresh < DateTime.Now) { cached.Clear(); - var entities = dbSet.AsNoTracking().ToList(); + IQueryable query = configureDbSet is null ? dbSet : configureDbSet(dbSet); + var entities = query.AsNoTracking().ToList(); //Trace.WriteLine($"CacheTable<{nameOfTEntity}> refresh"); cached.AddRange(entities); data.LastResreshDate = DateTime.Now; @@ -109,7 +135,8 @@ namespace AsbCloudInfrastructure.Services.Cache if (force || data.LastResreshDate + minPeriodRefresh < DateTime.Now) { cached.Clear(); - var entities = await context.Set().AsNoTracking() + IQueryable query = configureDbSet is null ? dbSet : configureDbSet(dbSet); + var entities = await query.AsNoTracking() .ToListAsync(token).ConfigureAwait(false); //Trace.WriteLine($"CacheTable<{nameOfTEntity}> refreshAsync"); cached.AddRange(entities); @@ -246,8 +273,9 @@ namespace AsbCloudInfrastructure.Services.Cache dbSet.Update(entity); else dbSet.Add(entity); - context.SaveChanges(); - InternalRefresh(true); + var affected = context.SaveChanges(); + if (affected > 0) + InternalRefresh(true); }); } @@ -257,8 +285,9 @@ namespace AsbCloudInfrastructure.Services.Cache dbSet.Update(entity); else dbSet.Add(entity); - await context.SaveChangesAsync(token).ConfigureAwait(false); - await InternalRefreshAsync(true, token).ConfigureAwait(false); + var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); + if(affected > 0) + await InternalRefreshAsync(true, token).ConfigureAwait(false); }, token); public void Upsert(IEnumerable entities) @@ -275,8 +304,9 @@ namespace AsbCloudInfrastructure.Services.Cache else dbSet.Add(entity); } - context.SaveChanges(); - InternalRefresh(true); + var affected = context.SaveChanges(); + if (affected > 0) + InternalRefresh(true); }); } @@ -294,8 +324,9 @@ namespace AsbCloudInfrastructure.Services.Cache else dbSet.Add(entity); } - await context.SaveChangesAsync(token).ConfigureAwait(false); - await InternalRefreshAsync(true, token).ConfigureAwait(false); + var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); + if (affected > 0) + await InternalRefreshAsync(true, token).ConfigureAwait(false); }, token); } @@ -303,15 +334,17 @@ namespace AsbCloudInfrastructure.Services.Cache => Sync(_ => { dbSet.RemoveRange(dbSet.Where(predicate)); - context.SaveChanges(); - InternalRefresh(true); + var affected = context.SaveChanges(); + if (affected > 0) + InternalRefresh(true); }); public Task RemoveAsync(Func predicate, CancellationToken token = default) => SyncAsync(async (wasFree, token) => { dbSet.RemoveRange(dbSet.Where(predicate)); - await context.SaveChangesAsync(token).ConfigureAwait(false); - await InternalRefreshAsync(true, token).ConfigureAwait(false); + var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); + if (affected > 0) + await InternalRefreshAsync(true, token).ConfigureAwait(false); }, token); public TEntity Insert(TEntity entity) @@ -320,8 +353,9 @@ namespace AsbCloudInfrastructure.Services.Cache Sync(_ => { var entry = dbSet.Add(entity); - context.SaveChanges(); - InternalRefresh(true); + var affected = context.SaveChanges(); + if (affected > 0) + InternalRefresh(true); result = entry.Entity; }); return result; @@ -333,8 +367,9 @@ namespace AsbCloudInfrastructure.Services.Cache await SyncAsync(async (wasFree, token) => { var entry = dbSet.Add(entity); - await context.SaveChangesAsync(token).ConfigureAwait(false); - await InternalRefreshAsync(true, token).ConfigureAwait(false); + var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); + if (affected > 0) + await InternalRefreshAsync(true, token).ConfigureAwait(false); result = entry.Entity; }, token); return result; @@ -346,7 +381,8 @@ namespace AsbCloudInfrastructure.Services.Cache Sync(_ => { dbSet.AddRange(newEntities); result = context.SaveChanges(); - InternalRefresh(true); + if (result > 0) + InternalRefresh(true); }); return result; } @@ -357,7 +393,8 @@ namespace AsbCloudInfrastructure.Services.Cache await SyncAsync(async (wasFree, token) => { dbSet.AddRange(newEntities); result = await context.SaveChangesAsync(token).ConfigureAwait(false); - await InternalRefreshAsync(true, token).ConfigureAwait(false); + if (result > 0) + await InternalRefreshAsync(true, token).ConfigureAwait(false); }, token); return result; } diff --git a/AsbCloudInfrastructure/Services/SetpointsService.cs b/AsbCloudInfrastructure/Services/SetpointsService.cs new file mode 100644 index 00000000..4f3bfd39 --- /dev/null +++ b/AsbCloudInfrastructure/Services/SetpointsService.cs @@ -0,0 +1,120 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services.Cache; +using Mapster; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services +{ + public class SetpointsService : ISetpointsService, IConverter + { + private readonly CacheTable cacheSetpoints; + private readonly ITelemetryService telemetryService; + + public SetpointsService(IAsbCloudDbContext db, CacheDb cacheDb, ITelemetryService telemetryService) + { + cacheSetpoints = cacheDb.GetCachedTable( + (AsbCloudDbContext)db, + new List { + nameof(SetpointsRequest.Author), + nameof(SetpointsRequest.Well), + }); + this.telemetryService = telemetryService; + } + + public async Task InsertAsync(SetpointsRequestDto setpoints, CancellationToken token) + { + setpoints.IdState = 1; + var inserted = await cacheSetpoints.InsertAsync(Convert(setpoints), token) + .ConfigureAwait(false); + return inserted?.Id ?? 0; + } + + public async Task> GetAsync(int idWell, CancellationToken token) + { + var entities = await cacheSetpoints.WhereAsync(s => s.IdWell == idWell, token) + .ConfigureAwait(false); + var dtos = entities.Select(s => Convert(s)); + return dtos; + } + + public async Task> GetForPanelAsync(string uid, CancellationToken token) + { + var idWell = telemetryService.GetidWellByTelemetryUid(uid) ?? -1; + + if (idWell < 0) + return null; + + var entities = await cacheSetpoints.WhereAsync(s => + s.IdWell == idWell && s.IdState == 1 && s.UploadDate.AddSeconds(s.ObsolescenceSec) > DateTime.Now, + token) + .ConfigureAwait(false); + + if (!entities.Any()) + return null; + + foreach (var entity in entities) + entity.IdState = 2; + + await cacheSetpoints.UpsertAsync(entities, token) + .ConfigureAwait(false); + + var dtos = entities.Select(Convert); + + return dtos; + } + + public async Task UpdateStateAsync(string uid, int id, SetpointsRequestDto setpointsRequestDto, CancellationToken token) + { + if (setpointsRequestDto.IdState != 3 || setpointsRequestDto.IdState != 4) + throw new ArgumentOutOfRangeException(nameof(setpointsRequestDto), $"{nameof(setpointsRequestDto.IdState)} = {setpointsRequestDto.IdState}. Mast be 3 or 4."); + + var idWell = telemetryService.GetidWellByTelemetryUid(uid) ?? -1; + + if (idWell < 0) + return 0; + + bool Predicate(SetpointsRequest s) => s.Id == id && s.IdWell == idWell && s.IdState == 2; + + var entity = await cacheSetpoints.FirstOrDefaultAsync(Predicate, token) + .ConfigureAwait(false); + entity.IdState = setpointsRequestDto.IdState; + await cacheSetpoints.UpsertAsync(entity, token) + .ConfigureAwait(false); + return 1; + } + + public async Task TryDelete(int idWell, int id, CancellationToken token) + { + bool Predicate(SetpointsRequest s) => s.Id == id && s.IdWell == idWell && s.IdState == 1; + var isExist = await cacheSetpoints.ContainsAsync(Predicate, token) + .ConfigureAwait(false); + + if (!isExist) + return 0; + + await cacheSetpoints.RemoveAsync(Predicate, token) + .ConfigureAwait(false); + + return 1; + } + + + public SetpointsRequest Convert(SetpointsRequestDto src) + { + var entity = src.Adapt(); + return entity; + } + + public SetpointsRequestDto Convert(SetpointsRequest src) + { + var dto = src.Adapt(); + return dto; + } + } +} diff --git a/AsbCloudWebApi/Controllers/SetpointsController.cs b/AsbCloudWebApi/Controllers/SetpointsController.cs new file mode 100644 index 00000000..882e6af0 --- /dev/null +++ b/AsbCloudWebApi/Controllers/SetpointsController.cs @@ -0,0 +1,162 @@ +using AsbCloudApp.Services; +using AsbCloudApp.Data; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Threading; + +namespace AsbCloudWebApi.Controllers +{ + [ApiController] + [Authorize] + public class SetpointsController : ControllerBase + { + private readonly ISetpointsService setpointsService; + private readonly IWellService wellService; + private const int ObsolescenceSecMin = 30; + private const int ObsolescenceSecMax = 6 * 60 * 60; + + public SetpointsController(ISetpointsService setpointsService, IWellService wellService) + { + this.setpointsService = setpointsService; + this.wellService = wellService; + } + + /// + /// Добавляет запрос на изменение заданий панели оператора. + /// + /// + /// + /// + /// + [HttpPost("api/well/{idWell}/setpoints")] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task InsertAsync(int idWell, SetpointsRequestDto setpoints, CancellationToken token = default) + { + int? idCompany = User.GetCompanyId(); + int? idUser = User.GetUserId(); + + if (idCompany is null || idUser is null) + return Forbid(); + + if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, + idWell, token).ConfigureAwait(false)) + return Forbid(); + + setpoints.IdAuthor = idUser ?? -1; + setpoints.IdWell = idWell; + setpoints.IdState = 1; + + if (setpoints is null + || setpoints.ObsolescenceSec > ObsolescenceSecMax + || setpoints.ObsolescenceSec < ObsolescenceSecMin) + return BadRequest("Wrong ObsolescenceSec"); + + if (!setpoints.Setpoints.Any()) + return BadRequest("Wrong Setpoints count"); + + var result = await setpointsService.InsertAsync(setpoints, token) + .ConfigureAwait(false); + + return Ok(result); + } + + /// + /// Получает список запросов на изменение уставок. + /// + /// + /// + /// + [HttpGet("api/well/{idWell}/setpoints")] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetByIdWellAsync([FromRoute] int idWell, CancellationToken token = default) + { + int? idCompany = User.GetCompanyId(); + int? idUser = User.GetUserId(); + + if (idCompany is null || idUser is null) + return Forbid(); + + var result = await setpointsService.GetAsync(idWell, token) + .ConfigureAwait(false); + + return Ok(result); + } + + /// + /// Отчет о принятии, или отклонении уставок оператором. + /// После уставка будет не изменяемой. + /// + /// + /// + /// можно передать только новый state eg.: {state:3} - принято + /// + /// + [HttpPut("api/telemetry/{uid}/setpoints/{id}")] + [ProducesResponseType(typeof(SetpointsRequestDto), (int)System.Net.HttpStatusCode.OK)] + [AllowAnonymous] + public async Task UpdateByTelemetryUidAsync([FromRoute] string uid, int id, SetpointsRequestDto setpointsRequestDto, CancellationToken token = default) + { + int? idCompany = User.GetCompanyId(); + int? idUser = User.GetUserId(); + + if (idCompany is null || idUser is null) + return Forbid(); + + var result = await setpointsService.UpdateStateAsync(uid, id, setpointsRequestDto, token) + .ConfigureAwait(false); + + return Ok(result); + } + + /// + /// Получает запросы на изменение уставок панели. + /// !!SIDE EFFECT: изменяет состояние запросов уставок на отправлено, это не позволит удалить эти уставки после отправки на панель. + /// + /// + /// + /// + [HttpGet("api/telemetry/{uid}/setpoints")] + [AllowAnonymous] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetByTelemetryUidAsync([FromRoute] string uid, CancellationToken token = default) + { + int? idCompany = User.GetCompanyId(); + int? idUser = User.GetUserId(); + + if (idCompany is null || idUser is null) + return Forbid(); + + var result = await setpointsService.GetForPanelAsync(uid, token) + .ConfigureAwait(false); + + return Ok(result); + } + + /// + /// Пробуем удалить запрос на изменение уставок. Это будет выполнено, если запрос еще не был отправлен. + /// + /// + /// + /// + /// 1 - удалено, <= 0 - не удалено + [HttpDelete("api/well/{idWell}/setpoints/{id}")] + public async Task TryDeleteByIdWellAsync(int idWell, int id, CancellationToken token = default) + { + int? idCompany = User.GetCompanyId(); + int? idUser = User.GetUserId(); + + if (idCompany is null || idUser is null) + return Forbid(); + + var result = await setpointsService.TryDelete(idWell, id, token) + .ConfigureAwait(false); + + return Ok(result); + } + } +} From 26ada6572b667c9c5bd437d06d74b474aded3e92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Wed, 24 Nov 2021 17:58:53 +0500 Subject: [PATCH 09/19] Add SetpointInfoDto --- AsbCloudApp/Data/SetpointInfoDto.cs | 12 +++++ AsbCloudApp/Services/ISetpointsService.cs | 1 + .../Services/SetpointsService.cs | 52 +++++++++++++++++-- .../Controllers/SetpointsController.cs | 24 ++++++++- 4 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 AsbCloudApp/Data/SetpointInfoDto.cs diff --git a/AsbCloudApp/Data/SetpointInfoDto.cs b/AsbCloudApp/Data/SetpointInfoDto.cs new file mode 100644 index 00000000..65a4d59b --- /dev/null +++ b/AsbCloudApp/Data/SetpointInfoDto.cs @@ -0,0 +1,12 @@ +namespace AsbCloudApp.Data +{ + public class SetpointInfoDto + { + public string DisplayName { get; set; } + public string Name { get; set; } + public string Units { get; set; } + public string Comment { get; set; } + public double Max { get; set; } + public double Min { get; set; } + } +} diff --git a/AsbCloudApp/Services/ISetpointsService.cs b/AsbCloudApp/Services/ISetpointsService.cs index acb07002..1def6ea4 100644 --- a/AsbCloudApp/Services/ISetpointsService.cs +++ b/AsbCloudApp/Services/ISetpointsService.cs @@ -15,5 +15,6 @@ namespace AsbCloudApp.Services Task> GetForPanelAsync(string uid, CancellationToken token); Task TryDelete(int idWell, int id, CancellationToken token); Task UpdateStateAsync(string uid, int id, SetpointsRequestDto setpointsRequestDto, CancellationToken token); + IEnumerable GetSetpointsNames(int idWell); } } diff --git a/AsbCloudInfrastructure/Services/SetpointsService.cs b/AsbCloudInfrastructure/Services/SetpointsService.cs index 4f3bfd39..7108cd75 100644 --- a/AsbCloudInfrastructure/Services/SetpointsService.cs +++ b/AsbCloudInfrastructure/Services/SetpointsService.cs @@ -13,6 +13,41 @@ namespace AsbCloudInfrastructure.Services { public class SetpointsService : ISetpointsService, IConverter { + private static readonly Dictionary SetpointInfos = new () + { + { "pressureSp", new SetpointInfoDto { Name = "pressureSp", DisplayName = "Заданное давление в зависимости от режима" } }, + { "dPressureMaxSP", new SetpointInfoDto { Name = "dPressureMaxSP", DisplayName = "Заданное максимально допустимое дифференциальное рабочее давление" } }, + { "pressureRotorSp", new SetpointInfoDto { Name = "pressureRotorSp", DisplayName = "Заданное рабочее давление в роторе" } }, + { "pressureDevelopSp", new SetpointInfoDto { Name = "pressureDevelopSp", DisplayName = "Заданное рабочее давление при проработке" } }, + { "pressureSlideSp", new SetpointInfoDto { Name = "pressureSlideSp", DisplayName = "Заданное рабочее давление в слайде" } }, + { "dPressureMaxRotorSP", new SetpointInfoDto { Name = "dPressureMaxRotorSP", DisplayName = "Заданное дифференциальное рабочее давление при бурении в роторе" } }, + { "dPressureMaxDevelopSP", new SetpointInfoDto { Name = "dPressureMaxDevelopSP", DisplayName = "Заданное дифференциальное рабочее давление при проработке" } }, + { "dPressureMaxSlideSP", new SetpointInfoDto { Name = "dPressureMaxSlideSP", DisplayName = "Дифференциальное рабочее давление в слайде" } }, + { "torqueSp", new SetpointInfoDto { Name = "torqueSp", DisplayName = "Момент заданный" } }, + { "speedSp", new SetpointInfoDto { Name = "speedSp", DisplayName = "Скорость заданная" } }, + { "filterSpeedPidTime", new SetpointInfoDto { Name = "filterSpeedPidTime", DisplayName = "Время усреднения скорости для регулятора" } }, + { "filterSpeedHmiTime", new SetpointInfoDto { Name = "filterSpeedHmiTime", DisplayName = "Время усреднения скорости для панели" } }, + { "torqueSwitchModeSp", new SetpointInfoDto { Name = "torqueSwitchModeSp", DisplayName = "момент для переключения слайд/ротор" } }, + { "speedSwitchModeSp", new SetpointInfoDto { Name = "speedSwitchModeSp", DisplayName = "Скорость для переключения слайд/ротор" } }, + { "speedRotorSp", new SetpointInfoDto { Name = "speedRotorSp", DisplayName = "Задание скорости бурения в роторе" } }, + { "speedSlideSp", new SetpointInfoDto { Name = "speedSlideSp", DisplayName = "Задание скорости бурения в слайде" } }, + { "speedDevelopSp", new SetpointInfoDto { Name = "speedDevelopSp", DisplayName = "Задание скорости проработки" } }, + { "hookWeightSp", new SetpointInfoDto { Name = "hookWeightSp", DisplayName = "Рабочий вес накрюке" } }, + { "speedOutMax", new SetpointInfoDto { Name = "speedOutMax", DisplayName = "Верхний предел аналогового выхода по скорости" } }, + { "liftingSpeedMax", new SetpointInfoDto { Name = "liftingSpeedMax", DisplayName = "Макс скорость при подъёме" } }, + { "loweringSpeedMax", new SetpointInfoDto { Name = "loweringSpeedMax", DisplayName = "Макс скорость при спуске СПО" } }, + { "dDepthSwitchSp", new SetpointInfoDto { Name = "dDepthSwitchSp", DisplayName = "Высота над забоем для перехода на режим спускоподъёмных операций" } }, + { "speedSpMax", new SetpointInfoDto { Name = "speedSpMax", DisplayName = "Верхняя граница шкалы выходного сигнала задания скорости в инженерных единицах" } }, + { "speedSpMin", new SetpointInfoDto { Name = "speedSpMin", DisplayName = "Нижняя граница шкалы выходного сигнала задания скорости в инженерных единицах" } }, + { "ramp_dSP_g", new SetpointInfoDto { Name = "ramp_dSP_g", DisplayName = "темп изменения задания регулятору нагрузки" } }, + { "ramp_dSP_P", new SetpointInfoDto { Name = "ramp_dSP_P", DisplayName = "темп изменения задания регулятору дифперепада давления" } }, + { "ramp_dSP_M", new SetpointInfoDto { Name = "ramp_dSP_M", DisplayName = "темп изменения задания регулятору момента" } }, + { "T_IdleSp", new SetpointInfoDto { Name = "T_IdleSp", DisplayName = "Время контроля простоя в открытом стволе (МИНУТЫ!!!)" } }, + { "Break2Sp", new SetpointInfoDto { Name = "Break2Sp", DisplayName = "% вспом. тормоз" } }, + { "mseNVspMax", new SetpointInfoDto { Name = "mseNVspMax", DisplayName = "Задание оптимальной скорости вращения ВСП определённое в результате работы MSE" } }, + { "mseAutoSpeedLoAuto", new SetpointInfoDto { Name = "mseAutoSpeedLoAuto", DisplayName = "Минимальная скорость проходки для автоматического включения режима МСЕ, в % от заданной скорости" } }, + }; + private readonly CacheTable cacheSetpoints; private readonly ITelemetryService telemetryService; @@ -30,6 +65,7 @@ namespace AsbCloudInfrastructure.Services public async Task InsertAsync(SetpointsRequestDto setpoints, CancellationToken token) { setpoints.IdState = 1; + setpoints.UploadDate = DateTime.Now; var inserted = await cacheSetpoints.InsertAsync(Convert(setpoints), token) .ConfigureAwait(false); return inserted?.Id ?? 0; @@ -50,17 +86,18 @@ namespace AsbCloudInfrastructure.Services if (idWell < 0) return null; - var entities = await cacheSetpoints.WhereAsync(s => + var entities = (await cacheSetpoints.WhereAsync(s => s.IdWell == idWell && s.IdState == 1 && s.UploadDate.AddSeconds(s.ObsolescenceSec) > DateTime.Now, token) - .ConfigureAwait(false); + .ConfigureAwait(false)) + .ToList();// без .ToList() работает не правильно. if (!entities.Any()) return null; foreach (var entity in entities) entity.IdState = 2; - + await cacheSetpoints.UpsertAsync(entities, token) .ConfigureAwait(false); @@ -71,7 +108,7 @@ namespace AsbCloudInfrastructure.Services public async Task UpdateStateAsync(string uid, int id, SetpointsRequestDto setpointsRequestDto, CancellationToken token) { - if (setpointsRequestDto.IdState != 3 || setpointsRequestDto.IdState != 4) + if (setpointsRequestDto.IdState != 3 && setpointsRequestDto.IdState != 4) throw new ArgumentOutOfRangeException(nameof(setpointsRequestDto), $"{nameof(setpointsRequestDto.IdState)} = {setpointsRequestDto.IdState}. Mast be 3 or 4."); var idWell = telemetryService.GetidWellByTelemetryUid(uid) ?? -1; @@ -83,6 +120,10 @@ namespace AsbCloudInfrastructure.Services var entity = await cacheSetpoints.FirstOrDefaultAsync(Predicate, token) .ConfigureAwait(false); + + if (entity is null) + return 0; + entity.IdState = setpointsRequestDto.IdState; await cacheSetpoints.UpsertAsync(entity, token) .ConfigureAwait(false); @@ -116,5 +157,8 @@ namespace AsbCloudInfrastructure.Services var dto = src.Adapt(); return dto; } + + public IEnumerable GetSetpointsNames(int idWell) + => SetpointInfos.Values; } } diff --git a/AsbCloudWebApi/Controllers/SetpointsController.cs b/AsbCloudWebApi/Controllers/SetpointsController.cs index 882e6af0..6bca8f0b 100644 --- a/AsbCloudWebApi/Controllers/SetpointsController.cs +++ b/AsbCloudWebApi/Controllers/SetpointsController.cs @@ -26,6 +26,26 @@ namespace AsbCloudWebApi.Controllers this.wellService = wellService; } + /// + /// Получает список запросов на изменение уставок. + /// + /// + /// + [HttpGet("api/well/{idWell}/setpointsNames")] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public IActionResult GetSetpointsNamesByIdWellAsync([FromRoute] int idWell) + { + int? idCompany = User.GetCompanyId(); + int? idUser = User.GetUserId(); + + if (idCompany is null || idUser is null) + return Forbid(); + + var result = setpointsService.GetSetpointsNames(idWell); + + return Ok(result); + } + /// /// Добавляет запрос на изменение заданий панели оператора. /// @@ -138,12 +158,12 @@ namespace AsbCloudWebApi.Controllers } /// - /// Пробуем удалить запрос на изменение уставок. Это будет выполнено, если запрос еще не был отправлен. + /// Пробует удалить запрос на изменение уставок. Это будет выполнено, если запрос еще не был отправлен на панель. /// /// /// /// - /// 1 - удалено, <= 0 - не удалено + /// 1 - удалено, 0 и меньше - не удалено [HttpDelete("api/well/{idWell}/setpoints/{id}")] public async Task TryDeleteByIdWellAsync(int idWell, int id, CancellationToken token = default) { From ee2172f64b270a85d4c59e14a75c630fbfeb89bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Fri, 26 Nov 2021 17:14:02 +0500 Subject: [PATCH 10/19] fix SetpointsController. Add AllowAnonymous. fix doc for backup db. --- AsbCloudDb/Readme.md | 2 +- .../Services/SetpointsService.cs | 62 +++++++++++-------- .../Controllers/SetpointsController.cs | 22 +------ 3 files changed, 40 insertions(+), 46 deletions(-) diff --git a/AsbCloudDb/Readme.md b/AsbCloudDb/Readme.md index b04de171..d3621a5a 100644 --- a/AsbCloudDb/Readme.md +++ b/AsbCloudDb/Readme.md @@ -17,7 +17,7 @@ dotnet ef migrations remvoe --project AsbCloudDb #backup ``` sudo -u postgres pg_dump -Fc -U postgres postgres -W | gzip > 2021-09-27_dump.sql.gz -sudo -u postgres pg_dump -Fc -U postgres postgres -W > 2021-11-13_dump.sql.gz +sudo -u postgres pg_dump -Fc -U postgres postgres -W > 2021-11-26_dump.sql ``` #restore diff --git a/AsbCloudInfrastructure/Services/SetpointsService.cs b/AsbCloudInfrastructure/Services/SetpointsService.cs index 7108cd75..db4597b5 100644 --- a/AsbCloudInfrastructure/Services/SetpointsService.cs +++ b/AsbCloudInfrastructure/Services/SetpointsService.cs @@ -13,39 +13,51 @@ namespace AsbCloudInfrastructure.Services { public class SetpointsService : ISetpointsService, IConverter { + /* ## Инфо от АПГ от 26112021 + * - осевая нагрузка // есть 1034 Рабочая нагрузка на долото + * диф давление в слайде + * диф давление роторе + * крутящий момент + * - обороты ВСП + * - расход промывочной жидкости + * скорость в слайде + * скорость роторе + * скорость проработки + * - скорость обратной проработке + */ private static readonly Dictionary SetpointInfos = new () { - { "pressureSp", new SetpointInfoDto { Name = "pressureSp", DisplayName = "Заданное давление в зависимости от режима" } }, - { "dPressureMaxSP", new SetpointInfoDto { Name = "dPressureMaxSP", DisplayName = "Заданное максимально допустимое дифференциальное рабочее давление" } }, - { "pressureRotorSp", new SetpointInfoDto { Name = "pressureRotorSp", DisplayName = "Заданное рабочее давление в роторе" } }, - { "pressureDevelopSp", new SetpointInfoDto { Name = "pressureDevelopSp", DisplayName = "Заданное рабочее давление при проработке" } }, - { "pressureSlideSp", new SetpointInfoDto { Name = "pressureSlideSp", DisplayName = "Заданное рабочее давление в слайде" } }, + //{ "pressureSp", new SetpointInfoDto { Name = "pressureSp", DisplayName = "Заданное давление в зависимости от режима" } }, + //{ "dPressureMaxSP", new SetpointInfoDto { Name = "dPressureMaxSP", DisplayName = "Заданное максимально допустимое дифференциальное рабочее давление" } }, + //{ "pressureRotorSp", new SetpointInfoDto { Name = "pressureRotorSp", DisplayName = "Заданное рабочее давление в роторе" } }, + //{ "pressureDevelopSp", new SetpointInfoDto { Name = "pressureDevelopSp", DisplayName = "Заданное рабочее давление при проработке" } }, + //{ "pressureSlideSp", new SetpointInfoDto { Name = "pressureSlideSp", DisplayName = "Заданное рабочее давление в слайде" } }, { "dPressureMaxRotorSP", new SetpointInfoDto { Name = "dPressureMaxRotorSP", DisplayName = "Заданное дифференциальное рабочее давление при бурении в роторе" } }, - { "dPressureMaxDevelopSP", new SetpointInfoDto { Name = "dPressureMaxDevelopSP", DisplayName = "Заданное дифференциальное рабочее давление при проработке" } }, + //{ "dPressureMaxDevelopSP", new SetpointInfoDto { Name = "dPressureMaxDevelopSP", DisplayName = "Заданное дифференциальное рабочее давление при проработке" } }, { "dPressureMaxSlideSP", new SetpointInfoDto { Name = "dPressureMaxSlideSP", DisplayName = "Дифференциальное рабочее давление в слайде" } }, { "torqueSp", new SetpointInfoDto { Name = "torqueSp", DisplayName = "Момент заданный" } }, - { "speedSp", new SetpointInfoDto { Name = "speedSp", DisplayName = "Скорость заданная" } }, - { "filterSpeedPidTime", new SetpointInfoDto { Name = "filterSpeedPidTime", DisplayName = "Время усреднения скорости для регулятора" } }, - { "filterSpeedHmiTime", new SetpointInfoDto { Name = "filterSpeedHmiTime", DisplayName = "Время усреднения скорости для панели" } }, - { "torqueSwitchModeSp", new SetpointInfoDto { Name = "torqueSwitchModeSp", DisplayName = "момент для переключения слайд/ротор" } }, - { "speedSwitchModeSp", new SetpointInfoDto { Name = "speedSwitchModeSp", DisplayName = "Скорость для переключения слайд/ротор" } }, + //{ "speedSp", new SetpointInfoDto { Name = "speedSp", DisplayName = "Скорость заданная" } }, + //{ "filterSpeedPidTime", new SetpointInfoDto { Name = "filterSpeedPidTime", DisplayName = "Время усреднения скорости для регулятора" } }, + //{ "filterSpeedHmiTime", new SetpointInfoDto { Name = "filterSpeedHmiTime", DisplayName = "Время усреднения скорости для панели" } }, + //{ "torqueSwitchModeSp", new SetpointInfoDto { Name = "torqueSwitchModeSp", DisplayName = "момент для переключения слайд/ротор" } }, + //{ "speedSwitchModeSp", new SetpointInfoDto { Name = "speedSwitchModeSp", DisplayName = "Скорость для переключения слайд/ротор" } }, { "speedRotorSp", new SetpointInfoDto { Name = "speedRotorSp", DisplayName = "Задание скорости бурения в роторе" } }, { "speedSlideSp", new SetpointInfoDto { Name = "speedSlideSp", DisplayName = "Задание скорости бурения в слайде" } }, { "speedDevelopSp", new SetpointInfoDto { Name = "speedDevelopSp", DisplayName = "Задание скорости проработки" } }, - { "hookWeightSp", new SetpointInfoDto { Name = "hookWeightSp", DisplayName = "Рабочий вес накрюке" } }, - { "speedOutMax", new SetpointInfoDto { Name = "speedOutMax", DisplayName = "Верхний предел аналогового выхода по скорости" } }, - { "liftingSpeedMax", new SetpointInfoDto { Name = "liftingSpeedMax", DisplayName = "Макс скорость при подъёме" } }, - { "loweringSpeedMax", new SetpointInfoDto { Name = "loweringSpeedMax", DisplayName = "Макс скорость при спуске СПО" } }, - { "dDepthSwitchSp", new SetpointInfoDto { Name = "dDepthSwitchSp", DisplayName = "Высота над забоем для перехода на режим спускоподъёмных операций" } }, - { "speedSpMax", new SetpointInfoDto { Name = "speedSpMax", DisplayName = "Верхняя граница шкалы выходного сигнала задания скорости в инженерных единицах" } }, - { "speedSpMin", new SetpointInfoDto { Name = "speedSpMin", DisplayName = "Нижняя граница шкалы выходного сигнала задания скорости в инженерных единицах" } }, - { "ramp_dSP_g", new SetpointInfoDto { Name = "ramp_dSP_g", DisplayName = "темп изменения задания регулятору нагрузки" } }, - { "ramp_dSP_P", new SetpointInfoDto { Name = "ramp_dSP_P", DisplayName = "темп изменения задания регулятору дифперепада давления" } }, - { "ramp_dSP_M", new SetpointInfoDto { Name = "ramp_dSP_M", DisplayName = "темп изменения задания регулятору момента" } }, - { "T_IdleSp", new SetpointInfoDto { Name = "T_IdleSp", DisplayName = "Время контроля простоя в открытом стволе (МИНУТЫ!!!)" } }, - { "Break2Sp", new SetpointInfoDto { Name = "Break2Sp", DisplayName = "% вспом. тормоз" } }, - { "mseNVspMax", new SetpointInfoDto { Name = "mseNVspMax", DisplayName = "Задание оптимальной скорости вращения ВСП определённое в результате работы MSE" } }, - { "mseAutoSpeedLoAuto", new SetpointInfoDto { Name = "mseAutoSpeedLoAuto", DisplayName = "Минимальная скорость проходки для автоматического включения режима МСЕ, в % от заданной скорости" } }, + //{ "hookWeightSp", new SetpointInfoDto { Name = "hookWeightSp", DisplayName = "Рабочий вес накрюке" } }, + //{ "speedOutMax", new SetpointInfoDto { Name = "speedOutMax", DisplayName = "Верхний предел аналогового выхода по скорости" } }, + //{ "liftingSpeedMax", new SetpointInfoDto { Name = "liftingSpeedMax", DisplayName = "Макс скорость при подъёме" } }, + //{ "loweringSpeedMax", new SetpointInfoDto { Name = "loweringSpeedMax", DisplayName = "Макс скорость при спуске СПО" } }, + //{ "dDepthSwitchSp", new SetpointInfoDto { Name = "dDepthSwitchSp", DisplayName = "Высота над забоем для перехода на режим спускоподъёмных операций" } }, + //{ "speedSpMax", new SetpointInfoDto { Name = "speedSpMax", DisplayName = "Верхняя граница шкалы выходного сигнала задания скорости в инженерных единицах" } }, + //{ "speedSpMin", new SetpointInfoDto { Name = "speedSpMin", DisplayName = "Нижняя граница шкалы выходного сигнала задания скорости в инженерных единицах" } }, + //{ "ramp_dSP_g", new SetpointInfoDto { Name = "ramp_dSP_g", DisplayName = "темп изменения задания регулятору нагрузки" } }, + //{ "ramp_dSP_P", new SetpointInfoDto { Name = "ramp_dSP_P", DisplayName = "темп изменения задания регулятору дифперепада давления" } }, + //{ "ramp_dSP_M", new SetpointInfoDto { Name = "ramp_dSP_M", DisplayName = "темп изменения задания регулятору момента" } }, + //{ "T_IdleSp", new SetpointInfoDto { Name = "T_IdleSp", DisplayName = "Время контроля простоя в открытом стволе (МИНУТЫ!!!)" } }, + //{ "Break2Sp", new SetpointInfoDto { Name = "Break2Sp", DisplayName = "% вспом. тормоз" } }, + //{ "mseNVspMax", new SetpointInfoDto { Name = "mseNVspMax", DisplayName = "Задание оптимальной скорости вращения ВСП определённое в результате работы MSE" } }, + //{ "mseAutoSpeedLoAuto", new SetpointInfoDto { Name = "mseAutoSpeedLoAuto", DisplayName = "Минимальная скорость проходки для автоматического включения режима МСЕ, в % от заданной скорости" } }, }; private readonly CacheTable cacheSetpoints; diff --git a/AsbCloudWebApi/Controllers/SetpointsController.cs b/AsbCloudWebApi/Controllers/SetpointsController.cs index 6bca8f0b..b11734cb 100644 --- a/AsbCloudWebApi/Controllers/SetpointsController.cs +++ b/AsbCloudWebApi/Controllers/SetpointsController.cs @@ -33,16 +33,10 @@ namespace AsbCloudWebApi.Controllers /// [HttpGet("api/well/{idWell}/setpointsNames")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + [AllowAnonymous] public IActionResult GetSetpointsNamesByIdWellAsync([FromRoute] int idWell) { - int? idCompany = User.GetCompanyId(); - int? idUser = User.GetUserId(); - - if (idCompany is null || idUser is null) - return Forbid(); - var result = setpointsService.GetSetpointsNames(idWell); - return Ok(result); } @@ -121,12 +115,6 @@ namespace AsbCloudWebApi.Controllers [AllowAnonymous] public async Task UpdateByTelemetryUidAsync([FromRoute] string uid, int id, SetpointsRequestDto setpointsRequestDto, CancellationToken token = default) { - int? idCompany = User.GetCompanyId(); - int? idUser = User.GetUserId(); - - if (idCompany is null || idUser is null) - return Forbid(); - var result = await setpointsService.UpdateStateAsync(uid, id, setpointsRequestDto, token) .ConfigureAwait(false); @@ -141,16 +129,10 @@ namespace AsbCloudWebApi.Controllers /// /// [HttpGet("api/telemetry/{uid}/setpoints")] - [AllowAnonymous] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + [AllowAnonymous] public async Task GetByTelemetryUidAsync([FromRoute] string uid, CancellationToken token = default) { - int? idCompany = User.GetCompanyId(); - int? idUser = User.GetUserId(); - - if (idCompany is null || idUser is null) - return Forbid(); - var result = await setpointsService.GetForPanelAsync(uid, token) .ConfigureAwait(false); From bc77b128b0526c13e40d03e8177b866839961a3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Tue, 30 Nov 2021 15:25:29 +0500 Subject: [PATCH 11/19] Fix setpoints dictionary by Oleg's info. Update default client build --- .../Services/SetpointsService.cs | 52 ++++--------------- AsbCloudWebApi/wwwroot/asset-manifest.json | 22 ++++---- AsbCloudWebApi/wwwroot/index.html | 2 +- 3 files changed, 23 insertions(+), 53 deletions(-) diff --git a/AsbCloudInfrastructure/Services/SetpointsService.cs b/AsbCloudInfrastructure/Services/SetpointsService.cs index db4597b5..688d5fa5 100644 --- a/AsbCloudInfrastructure/Services/SetpointsService.cs +++ b/AsbCloudInfrastructure/Services/SetpointsService.cs @@ -13,51 +13,19 @@ namespace AsbCloudInfrastructure.Services { public class SetpointsService : ISetpointsService, IConverter { - /* ## Инфо от АПГ от 26112021 - * - осевая нагрузка // есть 1034 Рабочая нагрузка на долото - * диф давление в слайде - * диф давление роторе - * крутящий момент - * - обороты ВСП - * - расход промывочной жидкости - * скорость в слайде - * скорость роторе - * скорость проработки - * - скорость обратной проработке - */ + // ## Инфо от АПГ от 26.11.2021, дополнения ШОВ от 26.11.2021 private static readonly Dictionary SetpointInfos = new () { - //{ "pressureSp", new SetpointInfoDto { Name = "pressureSp", DisplayName = "Заданное давление в зависимости от режима" } }, - //{ "dPressureMaxSP", new SetpointInfoDto { Name = "dPressureMaxSP", DisplayName = "Заданное максимально допустимое дифференциальное рабочее давление" } }, - //{ "pressureRotorSp", new SetpointInfoDto { Name = "pressureRotorSp", DisplayName = "Заданное рабочее давление в роторе" } }, - //{ "pressureDevelopSp", new SetpointInfoDto { Name = "pressureDevelopSp", DisplayName = "Заданное рабочее давление при проработке" } }, - //{ "pressureSlideSp", new SetpointInfoDto { Name = "pressureSlideSp", DisplayName = "Заданное рабочее давление в слайде" } }, - { "dPressureMaxRotorSP", new SetpointInfoDto { Name = "dPressureMaxRotorSP", DisplayName = "Заданное дифференциальное рабочее давление при бурении в роторе" } }, - //{ "dPressureMaxDevelopSP", new SetpointInfoDto { Name = "dPressureMaxDevelopSP", DisplayName = "Заданное дифференциальное рабочее давление при проработке" } }, + { "bitLoad", new SetpointInfoDto { Name = "bitLoad", DisplayName = "Осевая нагрузка" } }, + { "dPressureMaxRotorSP", new SetpointInfoDto { Name = "dPressureMaxRotorSP", DisplayName = "Дифференциальное рабочее давление в роторе" } }, { "dPressureMaxSlideSP", new SetpointInfoDto { Name = "dPressureMaxSlideSP", DisplayName = "Дифференциальное рабочее давление в слайде" } }, - { "torqueSp", new SetpointInfoDto { Name = "torqueSp", DisplayName = "Момент заданный" } }, - //{ "speedSp", new SetpointInfoDto { Name = "speedSp", DisplayName = "Скорость заданная" } }, - //{ "filterSpeedPidTime", new SetpointInfoDto { Name = "filterSpeedPidTime", DisplayName = "Время усреднения скорости для регулятора" } }, - //{ "filterSpeedHmiTime", new SetpointInfoDto { Name = "filterSpeedHmiTime", DisplayName = "Время усреднения скорости для панели" } }, - //{ "torqueSwitchModeSp", new SetpointInfoDto { Name = "torqueSwitchModeSp", DisplayName = "момент для переключения слайд/ротор" } }, - //{ "speedSwitchModeSp", new SetpointInfoDto { Name = "speedSwitchModeSp", DisplayName = "Скорость для переключения слайд/ротор" } }, - { "speedRotorSp", new SetpointInfoDto { Name = "speedRotorSp", DisplayName = "Задание скорости бурения в роторе" } }, - { "speedSlideSp", new SetpointInfoDto { Name = "speedSlideSp", DisplayName = "Задание скорости бурения в слайде" } }, - { "speedDevelopSp", new SetpointInfoDto { Name = "speedDevelopSp", DisplayName = "Задание скорости проработки" } }, - //{ "hookWeightSp", new SetpointInfoDto { Name = "hookWeightSp", DisplayName = "Рабочий вес накрюке" } }, - //{ "speedOutMax", new SetpointInfoDto { Name = "speedOutMax", DisplayName = "Верхний предел аналогового выхода по скорости" } }, - //{ "liftingSpeedMax", new SetpointInfoDto { Name = "liftingSpeedMax", DisplayName = "Макс скорость при подъёме" } }, - //{ "loweringSpeedMax", new SetpointInfoDto { Name = "loweringSpeedMax", DisplayName = "Макс скорость при спуске СПО" } }, - //{ "dDepthSwitchSp", new SetpointInfoDto { Name = "dDepthSwitchSp", DisplayName = "Высота над забоем для перехода на режим спускоподъёмных операций" } }, - //{ "speedSpMax", new SetpointInfoDto { Name = "speedSpMax", DisplayName = "Верхняя граница шкалы выходного сигнала задания скорости в инженерных единицах" } }, - //{ "speedSpMin", new SetpointInfoDto { Name = "speedSpMin", DisplayName = "Нижняя граница шкалы выходного сигнала задания скорости в инженерных единицах" } }, - //{ "ramp_dSP_g", new SetpointInfoDto { Name = "ramp_dSP_g", DisplayName = "темп изменения задания регулятору нагрузки" } }, - //{ "ramp_dSP_P", new SetpointInfoDto { Name = "ramp_dSP_P", DisplayName = "темп изменения задания регулятору дифперепада давления" } }, - //{ "ramp_dSP_M", new SetpointInfoDto { Name = "ramp_dSP_M", DisplayName = "темп изменения задания регулятору момента" } }, - //{ "T_IdleSp", new SetpointInfoDto { Name = "T_IdleSp", DisplayName = "Время контроля простоя в открытом стволе (МИНУТЫ!!!)" } }, - //{ "Break2Sp", new SetpointInfoDto { Name = "Break2Sp", DisplayName = "% вспом. тормоз" } }, - //{ "mseNVspMax", new SetpointInfoDto { Name = "mseNVspMax", DisplayName = "Задание оптимальной скорости вращения ВСП определённое в результате работы MSE" } }, - //{ "mseAutoSpeedLoAuto", new SetpointInfoDto { Name = "mseAutoSpeedLoAuto", DisplayName = "Минимальная скорость проходки для автоматического включения режима МСЕ, в % от заданной скорости" } }, + { "torque", new SetpointInfoDto { Name = "torque", DisplayName = "Крутящий момент" } }, + { "speedRotorSp", new SetpointInfoDto { Name = "speedRotorSp", DisplayName = "Скорость бурения в роторе" } }, + { "speedSlideSp", new SetpointInfoDto { Name = "speedSlideSp", DisplayName = "Скорость бурения в слайде" } }, + { "speedDevelopSp", new SetpointInfoDto { Name = "speedDevelopSp", DisplayName = "Скорость проработки" } }, + //{ "", new SetpointInfoDto { Name = "", DisplayName = "Скорость обратной проработки" } }, // Такая же что и прямой + //{ "", new SetpointInfoDto { Name = "", DisplayName = "Обороты ВСП" } }, // Оно в ПЛК спинмастера, пока сделать нельзя, позднее можно. + //{ "", new SetpointInfoDto { Name = "", DisplayName = "Расход промывочной жидкости" } }, // Нет в контроллере }; private readonly CacheTable cacheSetpoints; diff --git a/AsbCloudWebApi/wwwroot/asset-manifest.json b/AsbCloudWebApi/wwwroot/asset-manifest.json index d3f48946..52bab4e6 100644 --- a/AsbCloudWebApi/wwwroot/asset-manifest.json +++ b/AsbCloudWebApi/wwwroot/asset-manifest.json @@ -1,22 +1,24 @@ { "files": { - "main.css": "/static/css/main.2e1e40de.chunk.css", - "main.js": "/static/js/main.71c1bcb4.chunk.js", - "main.js.map": "/static/js/main.71c1bcb4.chunk.js.map", + "main.css": "/static/css/main.fb3df553.chunk.css", + "main.js": "/static/js/main.47b40915.chunk.js", + "main.js.map": "/static/js/main.47b40915.chunk.js.map", "runtime-main.js": "/static/js/runtime-main.6870c5e2.js", "runtime-main.js.map": "/static/js/runtime-main.6870c5e2.js.map", - "static/js/2.6a982f4d.chunk.js": "/static/js/2.6a982f4d.chunk.js", - "static/js/2.6a982f4d.chunk.js.map": "/static/js/2.6a982f4d.chunk.js.map", + "static/js/2.8306ac4d.chunk.js": "/static/js/2.8306ac4d.chunk.js", + "static/js/2.8306ac4d.chunk.js.map": "/static/js/2.8306ac4d.chunk.js.map", "static/js/3.c22d92b4.chunk.js": "/static/js/3.c22d92b4.chunk.js", "static/js/3.c22d92b4.chunk.js.map": "/static/js/3.c22d92b4.chunk.js.map", "index.html": "/index.html", - "static/css/main.2e1e40de.chunk.css.map": "/static/css/main.2e1e40de.chunk.css.map", - "static/js/2.6a982f4d.chunk.js.LICENSE.txt": "/static/js/2.6a982f4d.chunk.js.LICENSE.txt" + "static/css/main.fb3df553.chunk.css.map": "/static/css/main.fb3df553.chunk.css.map", + "static/js/2.8306ac4d.chunk.js.LICENSE.txt": "/static/js/2.8306ac4d.chunk.js.LICENSE.txt", + "static/media/ClusterIcon.a395f860.svg": "/static/media/ClusterIcon.a395f860.svg", + "static/media/DepositIcon.6de7c7ae.svg": "/static/media/DepositIcon.6de7c7ae.svg" }, "entrypoints": [ "static/js/runtime-main.6870c5e2.js", - "static/js/2.6a982f4d.chunk.js", - "static/css/main.2e1e40de.chunk.css", - "static/js/main.71c1bcb4.chunk.js" + "static/js/2.8306ac4d.chunk.js", + "static/css/main.fb3df553.chunk.css", + "static/js/main.47b40915.chunk.js" ] } \ No newline at end of file diff --git a/AsbCloudWebApi/wwwroot/index.html b/AsbCloudWebApi/wwwroot/index.html index da1446e2..3e80849f 100644 --- a/AsbCloudWebApi/wwwroot/index.html +++ b/AsbCloudWebApi/wwwroot/index.html @@ -1 +1 @@ -АСБ Vision
\ No newline at end of file +АСБ Vision
\ No newline at end of file From 04052af87434dbabe2f22e7a36bbcbeaa5668a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Wed, 1 Dec 2021 11:08:25 +0500 Subject: [PATCH 12/19] =?UTF-8?q?CS2-115=20TelemetryDataBaseService.Get()?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D1=80=D0=B5=D0=B6=D0=B8=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B6=D0=B5=D1=82=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BD=D0=B5=20=D0=BA=D0=BE=D1=80=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/TelemetryDataBaseService.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs index e3272ef5..42e86342 100644 --- a/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/TelemetryDataBaseService.cs @@ -125,6 +125,25 @@ namespace AsbCloudInfrastructure.Services if (fullDataCount > 1.75 * approxPointsCount) { var m = (int)Math.Round(1d * fullDataCount / approxPointsCount); + + switch (m) + { + //case var i when i <= 1: // тут для полноты, но никогда не сработает из-за условия выше + // break; + case var i when i < 10: + query = query.Where((d) => d.Date.Second % m == 0); + break; + case var i when i < 30: + query = query.Where((d) => (d.Date.Minute * 60 + d.Date.Second) % m == 0); + break; + case var i when i < 600: + query = query.Where((d) => ((d.Date.Hour * 60 + d.Date.Minute) * 60 + d.Date.Second) % m == 0); + break; + default: + query = query.Where((d) => (((d.Date.DayOfYear * 24 + d.Date.Hour) * 60 + d.Date.Minute) * 60 + d.Date.Second) % m == 0); + break; + } + if (m > 1) query = query.Where((d) => (((d.Date.DayOfYear*24 + d.Date.Hour)*60 + d.Date.Minute)*60 + d.Date.Second) % m == 0); } From 5c63c086ad6a0018c33f4b520a6e922efac451fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Wed, 1 Dec 2021 11:49:59 +0500 Subject: [PATCH 13/19] CS2-127 Add lazy service registration. --- AsbCloudInfrastructure/DependencyInjection.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 4bacb366..6d6ba6d6 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -8,6 +8,7 @@ using AsbCloudInfrastructure.Services.WellOperationService; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using System; namespace AsbCloudInfrastructure { @@ -66,5 +67,17 @@ namespace AsbCloudInfrastructure return services; } + + public static IServiceCollection AddTransientLazy(this IServiceCollection services) + where TService : class + where TImplementation : class, TService + => services.AddTransient() + .AddTransient(provider => new Lazy(provider.GetService)); + + public static IServiceCollection AddTransientLazy(this IServiceCollection services, Func implementationFactory) + where TService : class + where TImplementation : class, TService + => services.AddTransient(implementationFactory) + .AddTransient(provider => new Lazy(() => implementationFactory(provider))); } } From a74a7cbf58a11254232b0646ecc8f8310d1aef35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Wed, 1 Dec 2021 12:53:10 +0500 Subject: [PATCH 14/19] doc RequestTracker --- .../Controllers/RequerstTrackerController.cs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/AsbCloudWebApi/Controllers/RequerstTrackerController.cs b/AsbCloudWebApi/Controllers/RequerstTrackerController.cs index d8ada861..92a10221 100644 --- a/AsbCloudWebApi/Controllers/RequerstTrackerController.cs +++ b/AsbCloudWebApi/Controllers/RequerstTrackerController.cs @@ -16,6 +16,11 @@ namespace AsbCloudWebApi.Controllers this.service = service; } + /// + /// Получить последние `take` запросов к серверу + /// + /// от 1 до 1000 + /// [HttpGet] public IActionResult GetAll(int take = 512) { @@ -23,6 +28,11 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } + /// + /// Получить последние `take` быстрых запросов к серверу + /// + /// от 1 до 1000 + /// [HttpGet("fast")] public IActionResult GetFast(int take = 512) { @@ -30,6 +40,11 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } + /// + /// Получить последние `take` медленных запросов к серверу + /// + /// от 1 до 1000 + /// [HttpGet("slow")] public IActionResult GetSlow(int take = 512) { @@ -37,6 +52,11 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } + /// + /// Получить последние `take` ошибок при выполнении запросов + /// + /// от 1 до 1000 + /// [HttpGet("error")] public IActionResult GetError(int take = 512) { @@ -44,6 +64,11 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } + /// + /// Получить последних пользователей обращавшихся к серверу. Уникальность пользователя проверяется по логину и Ip. + /// + /// от 1 до 1000 + /// [HttpGet("users")] public IActionResult GetUsersStat(int take = 512) { From 06eb85e27517b617658a6f6fbf097e0601dcbd66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Thu, 2 Dec 2021 09:53:30 +0500 Subject: [PATCH 15/19] remove useless props "description" from ClusterDto, DepostDto --- AsbCloudApp/Data/ClusterDto.cs | 1 - AsbCloudApp/Data/DepositDto.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/AsbCloudApp/Data/ClusterDto.cs b/AsbCloudApp/Data/ClusterDto.cs index 9c1accd8..8751807a 100644 --- a/AsbCloudApp/Data/ClusterDto.cs +++ b/AsbCloudApp/Data/ClusterDto.cs @@ -6,7 +6,6 @@ namespace AsbCloudApp.Data { public int Id { get; set; } public string Caption { get; set; } - public string Description { get; set; } public double? Latitude { get; set; } public double? Longitude { get; set; } diff --git a/AsbCloudApp/Data/DepositDto.cs b/AsbCloudApp/Data/DepositDto.cs index a26cf6c1..dfc3d580 100644 --- a/AsbCloudApp/Data/DepositDto.cs +++ b/AsbCloudApp/Data/DepositDto.cs @@ -6,7 +6,6 @@ namespace AsbCloudApp.Data { public int Id { get; set; } public string Caption { get; set; } - public string Description { get; set; } public double? Latitude { get; set; } public double? Longitude { get; set; } From c55086bfee967310afa960d5df4c470fd26ab403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Thu, 2 Dec 2021 11:10:24 +0500 Subject: [PATCH 16/19] Fix ClusterService --- AsbCloudInfrastructure/Services/ClusterService.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/AsbCloudInfrastructure/Services/ClusterService.cs b/AsbCloudInfrastructure/Services/ClusterService.cs index d98fca2d..e4944329 100644 --- a/AsbCloudInfrastructure/Services/ClusterService.cs +++ b/AsbCloudInfrastructure/Services/ClusterService.cs @@ -129,14 +129,12 @@ namespace AsbCloudInfrastructure.Services Caption = gDeposit.Key.Caption, Latitude = gDeposit.Key.Latitude, Longitude = gDeposit.Key.Longitude, - Description = "", Clusters = gDeposit.Select(gCluster => new ClusterDto { Id = gCluster.Key.Id, Caption = gCluster.Key.Caption, Latitude = gCluster.Key.Latitude, Longitude = gCluster.Key.Longitude, - Description = "", Wells = gCluster.Select(well => { var dto = well.Adapt(); dto.WellType = well.WellType?.Caption; From fdf5a6ecd6c3d23662fcb9fa2af49ec30b0e89c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Thu, 2 Dec 2021 11:11:14 +0500 Subject: [PATCH 17/19] Add startup argument db_init to start just for migrate DB --- AsbCloudInfrastructure/DependencyInjection.cs | 10 ++++++ AsbCloudWebApi/Program.cs | 32 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 6d6ba6d6..57bead29 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -14,6 +14,15 @@ namespace AsbCloudInfrastructure { public static class DependencyInjection { + public static IAsbCloudDbContext MakeContext(string connectionString) + { + var options = new DbContextOptionsBuilder() + .UseNpgsql(connectionString) + .Options; + var context = new AsbCloudDbContext(options); + return context; + } + public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration) { services.AddDbContext(options => @@ -79,5 +88,6 @@ namespace AsbCloudInfrastructure where TImplementation : class, TService => services.AddTransient(implementationFactory) .AddTransient(provider => new Lazy(() => implementationFactory(provider))); + } } diff --git a/AsbCloudWebApi/Program.cs b/AsbCloudWebApi/Program.cs index 73cd343f..420abf0e 100644 --- a/AsbCloudWebApi/Program.cs +++ b/AsbCloudWebApi/Program.cs @@ -1,5 +1,8 @@ using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; +using System; +using System.Linq; namespace AsbCloudWebApi { @@ -8,6 +11,23 @@ namespace AsbCloudWebApi public static void Main(string[] args) { //new TraceListenerView(); // to trace mysterious errors + if(args?.Length > 1 ) + { + if (args.Contains("db_init")) { + var connectionStringName = "DefaultConnection"; + + IConfigurationRoot configuration = new ConfigurationBuilder() + .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) + .AddJsonFile("appsettings.json") + .Build(); + + AsbCloudInfrastructure.DependencyInjection.MakeContext(configuration.GetConnectionString(connectionStringName)); + Console.WriteLine(" ."); + return; + } + WriteHelp(); + } + CreateHostBuilder(args).Build().Run(); } @@ -17,5 +37,17 @@ namespace AsbCloudWebApi { webBuilder.UseStartup(); }); + + private static void WriteHelp() + { + Console.WriteLine(" ."); + Console.WriteLine(" :"); + Console.WriteLine("db_init - ."); + Console.WriteLine(" \"DefaultConnection\""); + Console.WriteLine(" , "); + Console.WriteLine(" , ."); + Console.WriteLine(" public"); + Console.WriteLine(""); + } } } From cdb8207c3528af7f09b2248e2b686147b5195dd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Thu, 2 Dec 2021 11:24:54 +0500 Subject: [PATCH 18/19] fix program args parsing --- AsbCloudWebApi/Program.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AsbCloudWebApi/Program.cs b/AsbCloudWebApi/Program.cs index 420abf0e..395ec1e7 100644 --- a/AsbCloudWebApi/Program.cs +++ b/AsbCloudWebApi/Program.cs @@ -11,7 +11,7 @@ namespace AsbCloudWebApi public static void Main(string[] args) { //new TraceListenerView(); // to trace mysterious errors - if(args?.Length > 1 ) + if(args?.Length > 0 ) { if (args.Contains("db_init")) { var connectionStringName = "DefaultConnection"; @@ -26,6 +26,7 @@ namespace AsbCloudWebApi return; } WriteHelp(); + return; } CreateHostBuilder(args).Build().Run(); From 8c3c621c7b001b31e632a235f64fa77065d925a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Thu, 2 Dec 2021 11:44:45 +0500 Subject: [PATCH 19/19] =?UTF-8?q?hotfix=20rename=20t=5Fwell=5F=D1=81omposi?= =?UTF-8?q?te=20(cyrilic=20c)=20to=20t=5Fwell=5Fcomposite.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4227_RenameTable_WellComposite.Designer.cs | 2841 +++++++++++++++++ ...0211202064227_RenameTable_WellComposite.cs | 59 + .../AsbCloudDbContextModelSnapshot.cs | 2 +- AsbCloudDb/Model/WellComposite.cs | 2 +- 4 files changed, 2902 insertions(+), 2 deletions(-) create mode 100644 AsbCloudDb/Migrations/20211202064227_RenameTable_WellComposite.Designer.cs create mode 100644 AsbCloudDb/Migrations/20211202064227_RenameTable_WellComposite.cs diff --git a/AsbCloudDb/Migrations/20211202064227_RenameTable_WellComposite.Designer.cs b/AsbCloudDb/Migrations/20211202064227_RenameTable_WellComposite.Designer.cs new file mode 100644 index 00000000..c42881f3 --- /dev/null +++ b/AsbCloudDb/Migrations/20211202064227_RenameTable_WellComposite.Designer.cs @@ -0,0 +1,2841 @@ +// +using System; +using System.Collections.Generic; +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace AsbCloudDb.Migrations +{ + [DbContext(typeof(AsbCloudDbContext))] + [Migration("20211202064227_RenameTable_WellComposite")] + partial class RenameTable_WellComposite + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasPostgresExtension("adminpack") + .HasAnnotation("Relational:Collation", "Russian_Russia.1251") + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.10") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .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.HasKey("Id"); + + b.HasIndex("IdDeposit"); + + b.ToTable("t_cluster"); + + b + .HasComment("Кусты"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .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") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption"); + + b.HasKey("Id"); + + b.ToTable("t_company_type"); + + b.HasData( + new + { + Id = 1, + Caption = "Недрапользователь" + }, + new + { + Id = 2, + Caption = "Буровой подрядчик" + }, + new + { + Id = 3, + Caption = "Сервис автоматизации бурения" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .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.HasKey("Id"); + + b.ToTable("t_deposit"); + + b + .HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AxialLoadMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_max") + .HasComment("Максимальная нагрузка"); + + b.Property("AxialLoadMin") + .HasColumnType("double precision") + .HasColumnName("axial_load_min") + .HasComment("Минимальная нагрузка"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина окончания интервала"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Стартовая глубина"); + + b.Property("FlowMax") + .HasColumnType("double precision") + .HasColumnName("flow_max") + .HasComment("Максимальный расход"); + + b.Property("FlowMin") + .HasColumnType("double precision") + .HasColumnName("flow_min") + .HasComment("Минимальный расход"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("well_id") + .HasComment("Id скважины"); + + b.Property("IdWellOperationCategory") + .HasColumnType("integer") + .HasColumnName("id_operation_category") + .HasComment("Id типа операции"); + + b.Property("LastUpdate") + .HasColumnType("timestamp without time zone") + .HasColumnName("last_update") + .HasComment("Дата последнего изменения"); + + b.Property("PressureMax") + .HasColumnType("double precision") + .HasColumnName("pressure_max") + .HasComment("Максимальное давление"); + + b.Property("PressureMin") + .HasColumnType("double precision") + .HasColumnName("pressure_min") + .HasComment("Минимальное давление"); + + b.Property("RotorSpeedMax") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_max") + .HasComment("Максимальные обороты на ВСП"); + + b.Property("RotorSpeedMin") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_min") + .HasComment("Минимальные обороты на ВСП"); + + b.Property("RotorTorqueMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_max") + .HasComment("Максимальный момент на ВСП"); + + b.Property("RotorTorqueMin") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_min") + .HasComment("Минимальный момент на ВСП"); + + b.HasKey("Id"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellOperationCategory"); + + b.ToTable("t_drill_flow_chart"); + + b + .HasComment("Параметры корридоров бурения (диапазоны параметров бурения)"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AxialLoadAvg") + .HasColumnType("double precision") + .HasColumnName("axial_load_avg") + .HasComment("Средняя нагрузка"); + + b.Property("AxialLoadMax") + .HasColumnType("double precision") + .HasColumnName("axial_load_max") + .HasComment("Максимальная нагрузка"); + + b.Property("AxialLoadMin") + .HasColumnType("double precision") + .HasColumnName("axial_load_min") + .HasComment("Минимальная нагрузка"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина окончания интервала"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Стартовая глубина"); + + b.Property("FlowAvg") + .HasColumnType("double precision") + .HasColumnName("flow_avg") + .HasComment("Средний расход"); + + b.Property("FlowMax") + .HasColumnType("double precision") + .HasColumnName("flow_max") + .HasComment("Максимальный расход"); + + b.Property("FlowMin") + .HasColumnType("double precision") + .HasColumnName("flow_min") + .HasComment("Минимальный расход"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("well_id") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Id с типом секции скважины"); + + b.Property("PressureAvg") + .HasColumnType("double precision") + .HasColumnName("pressure_avg") + .HasComment("Среднее давление"); + + b.Property("PressureMax") + .HasColumnType("double precision") + .HasColumnName("pressure_max") + .HasComment("Максимальное давление"); + + b.Property("PressureMin") + .HasColumnType("double precision") + .HasColumnName("pressure_min") + .HasComment("Минимальное давление"); + + b.Property("RotorSpeedAvg") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_avg") + .HasComment("Средние обороты на ВСП"); + + b.Property("RotorSpeedMax") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_max") + .HasComment("Максимальные обороты на ВСП"); + + b.Property("RotorSpeedMin") + .HasColumnType("double precision") + .HasColumnName("rotor_speed_min") + .HasComment("Минимальные обороты на ВСП"); + + b.Property("RotorTorqueAvg") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_avg") + .HasComment("Средний момент на ВСП"); + + b.Property("RotorTorqueMax") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_max") + .HasComment("Максимальный момент на ВСП"); + + b.Property("RotorTorqueMin") + .HasColumnType("double precision") + .HasColumnName("rotor_torque_min") + .HasComment("Минимальный момент на ВСП"); + + b.HasKey("Id"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_drill_params"); + + b + .HasComment("Режим бурения в секции (диапазоны параметров бурения)"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_file_category"); + + b + .HasComment("Категории файлов"); + + b.HasData( + new + { + Id = 1, + Name = "Растворный сервис", + ShortName = "fluidService" + }, + new + { + Id = 2, + Name = "Цементирование", + ShortName = "cement" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "nnb" + }, + new + { + Id = 4, + Name = "ГТИ", + ShortName = "gti" + }, + new + { + Id = 5, + Name = "Документы по скважине", + ShortName = "wellDocuments" + }, + new + { + Id = 6, + Name = "Супервайзер", + ShortName = "supervisor" + }, + new + { + Id = 7, + Name = "Мастер", + ShortName = "master" + }, + new + { + Id = 8, + Name = "Последний замер бурового раствора ПЛАН", + ShortName = "fluidPlanLastData" + }, + new + { + Id = 9, + Name = "Последний замер бурового раствора ФАКТ", + ShortName = "fluidFactLastData" + }, + new + { + Id = 10, + Name = "Последние данные Шламограммы", + ShortName = "mudLastData" + }, + new + { + Id = 11, + Name = "Последние данные ННБ", + ShortName = "nnbLastData" + }, + new + { + Id = 12, + Name = "Рапорт", + ShortName = "report" + }, + new + { + Id = 13, + Name = "Программа бурения, части", + ShortName = "ПБч" + }, + new + { + Id = 14, + Name = "Программа бурения", + ShortName = "ПБ" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + 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") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название файла"); + + b.Property("PublishInfo") + .HasColumnType("jsonb") + .HasColumnName("publish_info") + .HasComment("Информация о файле в облаке"); + + b.Property("Size") + .HasColumnType("bigint") + .HasColumnName("file_size") + .HasComment("Размер файла"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_file_info"); + + b + .HasComment("Файлы всех категорий"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileMark", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp without 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 - Согласован"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("id пользователя"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Помечен ли файл как удаленный"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdUser"); + + b.ToTable("t_file_mark"); + + b + .HasComment("Действия с файлами."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property>("Data") + .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 without time zone") + .HasColumnName("timestamp") + .HasComment("время добавления"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_measure"); + + b + .HasComment("Таблица c данными для вкладки 'Последние данные'"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории"); + + b.Property("ShortName") + .HasColumnType("text") + .HasColumnName("short_name") + .HasComment("Короткое название категории"); + + b.HasKey("Id"); + + b.ToTable("t_measure_category"); + + b + .HasComment("Категория последних данных"); + + b.HasData( + new + { + Id = 1, + Name = "Показатели бурового раствора", + ShortName = "Раствор" + }, + new + { + Id = 2, + Name = "Шламограмма", + ShortName = "Шламограмма" + }, + new + { + Id = 3, + Name = "ННБ", + ShortName = "ННБ" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("IdCompany", "IdWell"); + + b.HasIndex("IdWell"); + + b.ToTable("t_relation_company_well"); + + b + .HasComment("отношение скважин и компаний"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Begin") + .HasColumnType("timestamp with time zone") + .HasColumnName("begin"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end") + .HasComment("timestamp with time zone"); + + b.Property("Format") + .HasColumnType("integer") + .HasColumnName("format") + .HasComment("Формат отчета"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла-родителя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("Step") + .HasColumnType("integer") + .HasColumnName("step") + .HasComment("размер шага в секундах"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdWell"); + + b.ToTable("t_report_property"); + + b + .HasComment("Отчеты с данными по буровым"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + 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") + .HasColumnType("jsonb") + .HasColumnName("setpoint_set") + .HasComment("Набор уставок"); + + b.Property("UploadDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.HasKey("Id"); + + b.HasIndex("IdAuthor"); + + b.HasIndex("IdWell"); + + b.ToTable("t_setpoints_rquest"); + + b + .HasComment("Запросы на изменение уставок панели оператора"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + b.Property("TelemetryTimeZone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.HasIndex(new[] { "RemoteUid" }, "t_telemetry_remote_uid_index"); + + b.ToTable("t_telemetry"); + + b + .HasComment("таблица привязки телеметрии от комплектов к конкретной скважине."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryAnalysis", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("DurationSec") + .HasColumnType("integer") + .HasColumnName("duration_sec") + .HasComment("Кол-во секунд после предыдущей операции"); + + b.Property("IdOperation") + .HasColumnType("integer") + .HasColumnName("id_operation"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IsBitPositionDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_bit_position_decreasing") + .HasComment("Долото поднимается"); + + b.Property("IsBitPositionIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_bit_position_increasing") + .HasComment("Долото спускается"); + + b.Property("IsBitPositionLt20") + .HasColumnType("boolean") + .HasColumnName("is_bit_posision_lt_20") + .HasComment("Положение долота меньше 20м"); + + b.Property("IsBlockPositionDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_block_posision_decresing") + .HasComment("Талевый блок поднимается"); + + b.Property("IsBlockPositionIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_block_posision_incresing") + .HasComment("Талевый блок спускается"); + + b.Property("IsHookWeightLt3") + .HasColumnType("boolean") + .HasColumnName("is_hook_weight_lt_3") + .HasComment("Вес на крюке менее 3т"); + + b.Property("IsHookWeightNotChanges") + .HasColumnType("boolean") + .HasColumnName("is_hook_weight_not_changes") + .HasComment("Вес на крюке не меняется"); + + b.Property("IsPressureGt20") + .HasColumnType("boolean") + .HasColumnName("is_pressure_gt_20") + .HasComment("Давоение более 20"); + + b.Property("IsPressureLt20") + .HasColumnType("boolean") + .HasColumnName("is_pressure_lt_20") + .HasComment("Давление менее 20"); + + b.Property("IsRotorSpeedGt5") + .HasColumnType("boolean") + .HasColumnName("is_rotor_speed_gt_3") + .HasComment("Обороты ротора выше 3"); + + b.Property("IsRotorSpeedLt5") + .HasColumnType("boolean") + .HasColumnName("is_rotor_speed_lt_3") + .HasComment("Обороты ротора ниже 3"); + + b.Property("IsWellDepthDecreasing") + .HasColumnType("boolean") + .HasColumnName("is_well_depth_decreasing") + .HasComment("Глубина забоя не увеличивается"); + + b.Property("IsWellDepthIncreasing") + .HasColumnType("boolean") + .HasColumnName("is_well_depth_increasing") + .HasComment("Глубина забоя увеличивается"); + + b.Property("OperationEndDepth") + .HasColumnType("double precision") + .HasColumnName("operation_end_depth") + .HasComment("Глубина, на которой закончилась операция"); + + b.Property("OperationStartDepth") + .HasColumnType("double precision") + .HasColumnName("operation_start_depth") + .HasComment("Глубина, на которой началась операция"); + + b.Property("UnixDate") + .HasColumnType("bigint") + .HasColumnName("unix_date") + .HasComment("Unix timestamp для Linq запросов с вычислением дат"); + + b.HasKey("Id"); + + b.HasIndex("IdOperation"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_analysis"); + + b + .HasComment("События на скважине"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("Date") + .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("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("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", "Date"); + + b.ToTable("t_telemetry_data_saub"); + + b + .HasComment("набор основных данных по SAUB"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("BreakAngleK") + .HasColumnType("real") + .HasColumnName("break_angle_k") + .HasComment("Коэффициент для расчёта за какой угол нужно тормозить"); + + b.Property("BreakAngleLeft") + .HasColumnType("real") + .HasColumnName("break_angle_left") + .HasComment("Угол торможения влево при работе по моменту"); + + b.Property("EncoderResolution") + .HasColumnType("real") + .HasColumnName("encoder_resolution") + .HasComment(" Разрешение энкодера"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Выбранный режим управления"); + + b.Property("PidMuxTorqueLeftLimit") + .HasColumnType("real") + .HasColumnName("pid_mux_torque_left_limit") + .HasComment(" Момент при котором определяется ехать назад по моменту или по скорости"); + + b.Property("PositionRight") + .HasColumnType("real") + .HasColumnName("position_right") + .HasComment("Крайний правый угол осциляции"); + + b.Property("PositionZero") + .HasColumnType("real") + .HasColumnName("position_zero") + .HasComment("Нулевая позиция осциляции"); + + b.Property("Ratio") + .HasColumnType("real") + .HasColumnName("ratio") + .HasComment(" Коэффициент редукции редектора"); + + b.Property("ReverseKTorque") + .HasColumnType("real") + .HasColumnName("reverse_k_torque") + .HasComment("Коэффициент на который умножается момент, для того чтобы система поняла что мы движемся в обратную сторону"); + + b.Property("ReverseSpeedSpZeroTime") + .HasColumnType("smallint") + .HasColumnName("reverse_speed_sp_zero_time") + .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("RotorTorqueAvg") + .HasColumnType("real") + .HasColumnName("rotor_torque_avg") + .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.Property("TopDriveSpeed") + .HasColumnType("real") + .HasColumnName("top_drive_speed") + .HasComment("Скорость СВП"); + + b.Property("TopDriveSpeedErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_speed_err"); + + b.Property("TopDriveSpeedMax") + .HasColumnType("real") + .HasColumnName("top_drive_speed_max") + .HasComment("верхний предел"); + + b.Property("TopDriveSpeedMin") + .HasColumnType("real") + .HasColumnName("top_drive_speed_min") + .HasComment("нижний предел"); + + b.Property("TopDriveSpeedOffset") + .HasColumnType("real") + .HasColumnName("top_drive_speed_offset") + .HasComment("смещение"); + + b.Property("TopDriveSpeedSpFrom") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from") + .HasComment("Заданная скорость c СВП"); + + b.Property("TopDriveSpeedSpFromErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_speed_sp_from_err"); + + b.Property("TopDriveSpeedSpFromMax") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from_max"); + + b.Property("TopDriveSpeedSpFromMin") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from_min"); + + b.Property("TopDriveSpeedSpFromOffset") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_from_offset"); + + b.Property("TopDriveSpeedSpTo") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to") + .HasComment("Задание скорости на СВП"); + + b.Property("TopDriveSpeedSpToErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_speed_sp_to_err"); + + b.Property("TopDriveSpeedSpToMax") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to_max"); + + b.Property("TopDriveSpeedSpToMin") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to_min"); + + b.Property("TopDriveSpeedSpToOffset") + .HasColumnType("real") + .HasColumnName("top_drive_speed_sp_to_offset"); + + b.Property("TopDriveTorque") + .HasColumnType("real") + .HasColumnName("top_drive_torque") + .HasComment("Момент СВП"); + + b.Property("TopDriveTorqueErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_torque_err"); + + b.Property("TopDriveTorqueMax") + .HasColumnType("real") + .HasColumnName("top_drive_torque_max"); + + b.Property("TopDriveTorqueMin") + .HasColumnType("real") + .HasColumnName("top_drive_torque_min"); + + b.Property("TopDriveTorqueOffset") + .HasColumnType("real") + .HasColumnName("top_drive_torque_offset"); + + b.Property("TopDriveTorqueSpFrom") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from") + .HasComment("Заданный момент c СВП"); + + b.Property("TopDriveTorqueSpFromErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_torque_sp_from_err"); + + b.Property("TopDriveTorqueSpFromMax") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from_max"); + + b.Property("TopDriveTorqueSpFromMin") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from_min"); + + b.Property("TopDriveTorqueSpFromOffset") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_from_offset"); + + b.Property("TopDriveTorqueSpTo") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to") + .HasComment("Задание момента на СВП"); + + b.Property("TopDriveTorqueSpToErr") + .HasColumnType("smallint") + .HasColumnName("top_drive_torque_sp_to_err"); + + b.Property("TopDriveTorqueSpToMax") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to_max"); + + b.Property("TopDriveTorqueSpToMin") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to_min"); + + b.Property("TopDriveTorqueSpToOffset") + .HasColumnType("real") + .HasColumnName("top_drive_torque_sp_to_offset"); + + b.Property("TorqueLeftLimit") + .HasColumnType("real") + .HasColumnName("torque_left_limit") + .HasComment("Ограничение крутящего момента влево"); + + b.Property("TorqueRampTime") + .HasColumnType("real") + .HasColumnName("torque_ramp_time") + .HasComment("Время нарастания момента"); + + b.Property("TorqueRightLimit") + .HasColumnType("real") + .HasColumnName("torque_right_limit") + .HasComment("Ограничение крутящего момента вправо"); + + b.Property("TorqueStarting") + .HasColumnType("real") + .HasColumnName("torque_starting") + .HasComment(" Страгивающий момент"); + + b.Property("TurnLeftOnceByAngle") + .HasColumnType("real") + .HasColumnName("turn_left_once_by_angle") + .HasComment("Доворот по градусам единожды влево"); + + b.Property("TurnLeftOnceByRevols") + .HasColumnType("real") + .HasColumnName("turn_left_once_by_revols") + .HasComment("Доворот по оборотам единожды влево"); + + b.Property("TurnLeftOnceByTorque") + .HasColumnType("real") + .HasColumnName("turn_left_once_by_torque") + .HasComment("Доворот по моменту единожды влево"); + + b.Property("TurnRightOnceByAngle") + .HasColumnType("real") + .HasColumnName("turn_right_once_by_angle") + .HasComment("Доворот по градусам единожды вправо"); + + b.Property("TurnRightOnceByRevols") + .HasColumnType("real") + .HasColumnName("turn_right_once_by_revols") + .HasComment("Доворот по оборотам единожды вправо"); + + b.Property("TurnRightOnceByTorque") + .HasColumnType("real") + .HasColumnName("turn_right_once_by_torque") + .HasComment("Доворот по моменту единожды вправо"); + + b.Property("UnlockBySectorOut") + .HasColumnType("real") + .HasColumnName("unlock_by_sector_out") + .HasComment(" Градус отклонения от сектора для автоматического сброса блокировки"); + + b.Property("Ver") + .HasColumnType("real") + .HasColumnName("ver") + .HasComment("Версия ПО ПЛК"); + + b.Property("W2800") + .HasColumnType("smallint") + .HasColumnName("w2800") + .HasComment("Установка нуля энкодера"); + + b.Property("W2808") + .HasColumnType("smallint") + .HasColumnName("w2808") + .HasComment("Неисправность энкодера"); + + b.Property("W2810") + .HasColumnType("smallint") + .HasColumnName("w2810") + .HasComment(" автоматический сброс блокировки"); + + b.HasKey("IdTelemetry", "Date"); + + b.ToTable("t_telemetry_data_spin"); + + b + .HasComment("набор основных данных по SpinMaster"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.Property("MessageTemplate") + .HasColumnType("text") + .HasColumnName("message_template"); + + b.HasKey("IdTelemetry", "IdEvent"); + + b.ToTable("t_telemetry_event"); + + b + .HasComment("Справочник событий. События формируют сообщения. Разделено по версиям посылок от телеметрии."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + 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("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdTelemetryUser") + .HasColumnType("integer") + .HasColumnName("id_telemetry_user") + .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); + + b.Property("WellDepth") + .HasColumnType("double precision") + .HasColumnName("well_depth"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_message"); + + b + .HasComment("Сообщения на буровых"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic"); + + b.Property("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname"); + + b.HasKey("IdTelemetry", "IdUser"); + + b.ToTable("t_telemetry_user"); + + b + .HasComment("Пользователи панели САУБ. Для сообщений."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdRole") + .HasColumnType("integer") + .HasColumnName("id_role"); + + b.Property("Level") + .HasColumnType("integer") + .HasColumnName("level"); + + b.Property("Login") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("login"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("имя"); + + b.Property("PasswordHash") + .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("State") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n100 - удален"); + + b.Property("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("IdRole"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user"); + + b + .HasComment("Пользователи облака"); + + b.HasData( + new + { + Id = 1, + IdCompany = 1, + IdRole = 1, + Level = 2147483647, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b + .HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "Администратор" + }, + new + { + Id = 2, + Caption = "Пользователь" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .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.HasKey("Id"); + + b.HasIndex("IdCluster"); + + b.HasIndex("IdTelemetry") + .IsUnique(); + + b.HasIndex("IdWellType"); + + b.ToTable("t_well"); + + b + .HasComment("скважины"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины получателя"); + + b.Property("IdWellSrc") + .HasColumnType("integer") + .HasColumnName("id_well_src") + .HasComment("Id скважины композита"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции композита"); + + b.HasKey("IdWell", "IdWellSrc", "IdWellSectionType"); + + b.HasIndex("IdWellSectionType"); + + b.HasIndex("IdWellSrc"); + + b.ToTable("t_well_composite"); + + b + .HasComment("Композитная скважина"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp without 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("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0 = План или 1 = Факт"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_well_section_type") + .HasComment("Id тип секции скважины"); + + b.HasKey("Id"); + + b.HasIndex("DateStart"); + + b.HasIndex("DepthEnd"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_well_operation"); + + b + .HasComment("Данные по операциям на скважине"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Code") + .HasColumnType("integer") + .HasColumnName("code") + .HasComment("Код операции"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории операции"); + + b.HasKey("Id"); + + b.ToTable("t_well_operation_category"); + + b + .HasComment("Справочник операций на скважине"); + + b.HasData( + new + { + Id = 1, + Code = 0, + Name = "Невозможно определить операцию" + }, + new + { + Id = 2, + Code = 0, + Name = "Роторное бурение" + }, + new + { + Id = 3, + Code = 0, + Name = "Слайдирование" + }, + new + { + Id = 4, + Code = 0, + Name = "Подъем с проработкой" + }, + new + { + Id = 5, + Code = 0, + Name = "Спуск с проработкой" + }, + new + { + Id = 6, + Code = 0, + Name = "Подъем с промывкой" + }, + new + { + Id = 7, + Code = 0, + Name = "Спуск с промывкой" + }, + new + { + Id = 8, + Code = 0, + Name = "Спуск в скважину" + }, + new + { + Id = 9, + Code = 0, + Name = "Спуск с вращением" + }, + new + { + Id = 10, + Code = 0, + Name = "Подъем из скважины" + }, + new + { + Id = 11, + Code = 0, + Name = "Подъем с вращением" + }, + new + { + Id = 12, + Code = 0, + Name = "Промывка в покое" + }, + new + { + Id = 13, + Code = 0, + Name = "Промывка с вращением" + }, + new + { + Id = 14, + Code = 0, + Name = "Удержание в клиньях" + }, + new + { + Id = 15, + Code = 0, + Name = "Неподвижное состояние" + }, + new + { + Id = 16, + Code = 0, + Name = "Вращение без циркуляции" + }, + new + { + Id = 17, + Code = 0, + Name = "На поверхности" + }, + new + { + Id = 1001, + Code = 0, + Name = "Бурение" + }, + new + { + Id = 1002, + Code = 0, + Name = "ГИС" + }, + new + { + Id = 1003, + Code = 0, + Name = "ГФР" + }, + new + { + Id = 1004, + Code = 0, + Name = "Монтаж ПВО" + }, + new + { + Id = 1005, + Code = 0, + Name = "Демонтаж ПВО" + }, + new + { + Id = 1006, + Code = 0, + Name = "Установка ФА" + }, + new + { + Id = 1007, + Code = 0, + Name = "Оборудование устья" + }, + new + { + Id = 1008, + Code = 0, + Name = "ОЗЦ" + }, + new + { + Id = 1009, + Code = 0, + Name = "Оборудование устья" + }, + new + { + Id = 1010, + Code = 0, + Name = "ОЗЦ" + }, + new + { + Id = 1011, + Code = 0, + Name = "Начало цикла строительства скважины" + }, + new + { + Id = 1012, + Code = 0, + Name = "Окончание цикла строительства скважины" + }, + new + { + Id = 1013, + Code = 0, + Name = "Опрессовка ПВО" + }, + new + { + Id = 1014, + Code = 0, + Name = "Опресовка Ц.К." + }, + new + { + Id = 1015, + Code = 0, + Name = "Опрессовка ВЗД" + }, + new + { + Id = 1016, + Code = 0, + Name = "Перевод скв на другой тип промывочной жидкости" + }, + new + { + Id = 1017, + Code = 0, + Name = "Перезапись каротажа" + }, + new + { + Id = 1018, + Code = 0, + Name = "Перетяжка талевого каната" + }, + new + { + Id = 1019, + Code = 0, + Name = "Наращивание, промывка" + }, + new + { + Id = 1020, + Code = 0, + Name = "Подъем инструмента" + }, + new + { + Id = 1021, + Code = 0, + Name = "Подъем инструмента с промывкой" + }, + new + { + Id = 1022, + Code = 0, + Name = "Обратная проработка" + }, + new + { + Id = 1023, + Code = 0, + Name = "Сборка инструмента" + }, + new + { + Id = 1024, + Code = 0, + Name = "Подготовительные работы" + }, + new + { + Id = 1025, + Code = 0, + Name = "Сборка КНБК" + }, + new + { + Id = 1026, + Code = 0, + Name = "Разборка КНБК" + }, + new + { + Id = 1027, + Code = 0, + Name = "Промывка" + }, + new + { + Id = 1028, + Code = 0, + Name = "Промежуточная промывка" + }, + new + { + Id = 1029, + Code = 0, + Name = "Прокачка пачек" + }, + new + { + Id = 1030, + Code = 0, + Name = "Разбуривание тех.оснастки" + }, + new + { + Id = 1031, + Code = 0, + Name = "Ремонт" + }, + new + { + Id = 1032, + Code = 0, + Name = "Спуск инструмента" + }, + new + { + Id = 1033, + Code = 0, + Name = "Спуск инструмента с промывкой" + }, + new + { + Id = 1034, + Code = 0, + Name = "Прямая проработка" + }, + new + { + Id = 1035, + Code = 0, + Name = "Принудительная проработка" + }, + new + { + Id = 1036, + Code = 0, + Name = "Спуск обсадной колонны" + }, + new + { + Id = 1037, + Code = 0, + Name = "Тех СПО-подъем" + }, + new + { + Id = 1038, + Code = 0, + Name = "Тех СПО-спуск" + }, + new + { + Id = 1039, + Code = 0, + Name = "Техническое обслуживание" + }, + new + { + Id = 1040, + Code = 0, + Name = "Цементаж" + }, + new + { + Id = 1041, + Code = 0, + Name = "Шаблонировка ствола" + }, + new + { + Id = 1042, + Code = 0, + Name = "Геологическое осложнение" + }, + new + { + Id = 1043, + Code = 0, + Name = "НПВ" + }, + new + { + Id = 1044, + Code = 0, + Name = "ВМР" + }, + new + { + Id = 1045, + Code = 0, + Name = "Прочее" + }, + new + { + Id = 1046, + Code = 0, + Name = "Спуск КНБК" + }, + new + { + Id = 1047, + Code = 0, + Name = "Подъем КНБК" + }, + new + { + Id = 1048, + Code = 0, + Name = "Спуск ОК" + }, + new + { + Id = 1050, + Code = 0, + Name = "Промывка при спуске ОК" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_section_type"); + + b + .HasComment("конструкция секции скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Пилотный ствол" + }, + new + { + Id = 2, + Caption = "Направление" + }, + new + { + Id = 3, + Caption = "Кондуктор" + }, + new + { + Id = 4, + Caption = "Эксплуатационная колонна" + }, + new + { + Id = 5, + Caption = "Транспортный ствол" + }, + new + { + Id = 6, + Caption = "Хвостовик" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_type"); + + b + .HasComment("конструкция скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Наклонно-направленная" + }, + new + { + Id = 2, + Caption = "Горизонтальная" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.HasOne("AsbCloudDb.Model.Deposit", "Deposit") + .WithMany("Clusters") + .HasForeignKey("IdDeposit") + .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.DrillFlowChart", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("DrillParamsCollection") + .HasForeignKey("IdWellSectionType") + .HasConstraintName("t_drill_params_t_well_section_type_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + 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") + .HasConstraintName("t_file_mark_t_file_info_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .HasConstraintName("t_user_t_file_mark_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileInfo"); + + b.Navigation("User"); + }); + + 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.RelationCompanyWell", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdCompany") + .HasConstraintName("t_relation_company_well_t_company_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .HasConstraintName("t_relation_company_well_t_well_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + 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.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.TelemetryAnalysis", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Operation") + .WithMany("Analysis") + .HasForeignKey("IdOperation") + .HasConstraintName("t_analysis_t_operation_id_fk") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Analysis") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_analysis_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Operation"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_event_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_messages_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .HasConstraintName("t_user_t_company_id_fk") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("AsbCloudDb.Model.UserRole", "Role") + .WithMany("Users") + .HasForeignKey("IdRole"); + + b.Navigation("Company"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.HasOne("AsbCloudDb.Model.Cluster", "Cluster") + .WithMany("Wells") + .HasForeignKey("IdCluster") + .HasConstraintName("t_well_t_cluster_id_fk"); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithOne("Well") + .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry") + .HasConstraintName("t_well_t_telemetry_id_fk") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("AsbCloudDb.Model.WellType", "WellType") + .WithMany("Wells") + .HasForeignKey("IdWellType"); + + 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") + .HasConstraintName("t_well_сomposite_t_well_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .HasConstraintName("t_well_сomposite_src_t_well_id_fk") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + + b.Navigation("WellSrc"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .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.Navigation("OperationCategory"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + 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"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Navigation("Clusters"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Navigation("FileMarks"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Navigation("Measures"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Navigation("Analysis"); + + 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"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("Users"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellComposites"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellOperationCategory", b => + { + b.Navigation("Analysis"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Navigation("DrillParamsCollection"); + + 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/20211202064227_RenameTable_WellComposite.cs b/AsbCloudDb/Migrations/20211202064227_RenameTable_WellComposite.cs new file mode 100644 index 00000000..959b9639 --- /dev/null +++ b/AsbCloudDb/Migrations/20211202064227_RenameTable_WellComposite.cs @@ -0,0 +1,59 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace AsbCloudDb.Migrations +{ + public partial class RenameTable_WellComposite : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropPrimaryKey( + name: "PK_t_well_сomposite", + table: "t_well_сomposite"); + + migrationBuilder.RenameTable( + name: "t_well_сomposite", + newName: "t_well_composite"); + + migrationBuilder.RenameIndex( + name: "IX_t_well_сomposite_id_well_src", + table: "t_well_composite", + newName: "IX_t_well_composite_id_well_src"); + + migrationBuilder.RenameIndex( + name: "IX_t_well_сomposite_id_well_section_type", + table: "t_well_composite", + newName: "IX_t_well_composite_id_well_section_type"); + + migrationBuilder.AddPrimaryKey( + name: "PK_t_well_composite", + table: "t_well_composite", + columns: new[] { "id_well", "id_well_src", "id_well_section_type" }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropPrimaryKey( + name: "PK_t_well_composite", + table: "t_well_composite"); + + migrationBuilder.RenameTable( + name: "t_well_composite", + newName: "t_well_сomposite"); + + migrationBuilder.RenameIndex( + name: "IX_t_well_composite_id_well_src", + table: "t_well_сomposite", + newName: "IX_t_well_сomposite_id_well_src"); + + migrationBuilder.RenameIndex( + name: "IX_t_well_composite_id_well_section_type", + table: "t_well_сomposite", + newName: "IX_t_well_сomposite_id_well_section_type"); + + migrationBuilder.AddPrimaryKey( + name: "PK_t_well_сomposite", + table: "t_well_сomposite", + columns: new[] { "id_well", "id_well_src", "id_well_section_type" }); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index bfb9eaeb..b0086966 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -1794,7 +1794,7 @@ namespace AsbCloudDb.Migrations b.HasIndex("IdWellSrc"); - b.ToTable("t_well_сomposite"); + b.ToTable("t_well_composite"); b .HasComment("Композитная скважина"); diff --git a/AsbCloudDb/Model/WellComposite.cs b/AsbCloudDb/Model/WellComposite.cs index 0b4c2807..b0815454 100644 --- a/AsbCloudDb/Model/WellComposite.cs +++ b/AsbCloudDb/Model/WellComposite.cs @@ -5,7 +5,7 @@ using System.ComponentModel.DataAnnotations.Schema; #nullable disable namespace AsbCloudDb.Model { - [Table("t_well_сomposite"), Comment("Композитная скважина")] + [Table("t_well_composite"), Comment("Композитная скважина")] public class WellComposite : IIdWell { [Column("id_well"), Comment("Id скважины получателя")]