From 7f4b434a8ca124b20f5f1eded77c3d9cd4f3fb59 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 14 Jul 2022 03:47:11 +0500 Subject: [PATCH 01/21] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=91=D0=94=20,=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20=D0=94?= =?UTF-8?q?=D0=A2=D0=9E,=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=D1=8B,=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/Subsystems/SubsystemDto.cs | 27 ++++++ .../Subsystems/SubsystemOperationTimeDto.cs | 48 ++++++++++ .../Data/Subsystems/SubsystemStatisticsDto.cs | 38 ++++++++ .../ISubsystemOperationTimeService.cs | 12 +++ .../Services/Subsystems/ISubsystemService.cs | 6 ++ .../Subsystems/ISubsystemStatisticsService.cs | 16 ++++ AsbCloudDb/Model/Subsystems/Subsystem.cs | 26 +++++ .../Subsystems/SubsystemOperationTime.cs | 39 ++++++++ AsbCloudInfrastructure/DependencyInjection.cs | 4 + ...SubsystemOperationTimeBackgroundService.cs | 24 +++++ .../SubsystemOperationTimeService.cs | 14 +++ .../Services/Subsystems/SubsystemService.cs | 14 +++ .../Subsystems/SubsystemStatisticService.cs | 30 ++++++ .../Subsystems/AdminSubsystemController.cs | 23 +++++ .../OperatingTimeSubsystemController.cs | 22 +++++ .../StatisticSubsystemsController.cs | 94 +++++++++++++++++++ 16 files changed, 437 insertions(+) create mode 100644 AsbCloudApp/Data/Subsystems/SubsystemDto.cs create mode 100644 AsbCloudApp/Data/Subsystems/SubsystemOperationTimeDto.cs create mode 100644 AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs create mode 100644 AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs create mode 100644 AsbCloudApp/Services/Subsystems/ISubsystemService.cs create mode 100644 AsbCloudApp/Services/Subsystems/ISubsystemStatisticsService.cs create mode 100644 AsbCloudDb/Model/Subsystems/Subsystem.cs create mode 100644 AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs create mode 100644 AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs create mode 100644 AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs create mode 100644 AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs create mode 100644 AsbCloudInfrastructure/Services/Subsystems/SubsystemStatisticService.cs create mode 100644 AsbCloudWebApi/Controllers/Subsystems/AdminSubsystemController.cs create mode 100644 AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs create mode 100644 AsbCloudWebApi/Controllers/Subsystems/StatisticSubsystemsController.cs diff --git a/AsbCloudApp/Data/Subsystems/SubsystemDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemDto.cs new file mode 100644 index 00000000..7bf2c0b6 --- /dev/null +++ b/AsbCloudApp/Data/Subsystems/SubsystemDto.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudApp.Data.Subsystems +{ + /// + /// Описание параметров подсистемы + /// + public class SubsystemDto : IId + { + /// + /// Идентификатор подсистемы + /// + public int Id { get; set; } + /// + /// Наименование подсистемы + /// + public string Name { get; set; } + /// + /// Детальное описание подсистемы + /// + public string Description { get; set; } + } +} diff --git a/AsbCloudApp/Data/Subsystems/SubsystemOperationTimeDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemOperationTimeDto.cs new file mode 100644 index 00000000..ccb923d7 --- /dev/null +++ b/AsbCloudApp/Data/Subsystems/SubsystemOperationTimeDto.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudApp.Data.Subsystems +{ + /// + /// Модель информации о работе подсистемы + /// + public class SubsystemOperationTimeDto:IId + { + /// + /// Идентификатор + /// + public int Id { get; set; } + /// + /// ИД телеметрии по которой выдается информация + /// + public int IdTelemetry { get; set; } + public TelemetryBaseDto Telemetry { get; set; } + + /// + /// идентификатор подсистемы + /// + public int IdSubsystem { get; set; } + public SubsystemDto Subsystem { get; set; } + /// + /// дата/время включения подсистемы + /// + public DateTime DateStart { get; set; } + /// + /// дата/время выключения подсистемы + /// + public DateTime DateEnd { get; set; } + /// + /// глубина забоя на момент включения подсистемы + /// + public double DepthStart { get; set; } + /// + /// глубина забоя на момент выключения подсистемы + /// + public double DepthEnd { get; set; } + + + } +} diff --git a/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs new file mode 100644 index 00000000..6363bf2c --- /dev/null +++ b/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudApp.Data.Subsystems +{ + /// + /// Статистика подсистемы + /// + public class SubsystemStatisticsDto + { + + /// + /// Идентификатор подсистемы + /// + public int IdSubsystem { get; set; } + /// + /// Название подсистемы + /// + public string Subsystem { get; set; } + /// + /// наработка подсистемы + /// + public DateTime UsedTime { get; set; } + /// + /// коэффициент использования + /// + public TimeSpan KUsage { get; set; } + /// + /// коэффициент применения + /// + public TimeSpan K2 { get; set; } + + + } +} diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs new file mode 100644 index 00000000..44e0b2d4 --- /dev/null +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services.Subsystems +{ + public interface ISubsystemOperationTimeService + { + } +} diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemService.cs new file mode 100644 index 00000000..c9a51954 --- /dev/null +++ b/AsbCloudApp/Services/Subsystems/ISubsystemService.cs @@ -0,0 +1,6 @@ +namespace AsbCloudApp.Services.Subsystems +{ + internal interface ISubsystemService + { + } +} diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemStatisticsService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemStatisticsService.cs new file mode 100644 index 00000000..411baa9e --- /dev/null +++ b/AsbCloudApp/Services/Subsystems/ISubsystemStatisticsService.cs @@ -0,0 +1,16 @@ +using AsbCloudApp.Data.Subsystems; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services.Subsystems +{ + public interface ISubsystemStatisticsService + { + Task> GetStatisticsAsync(CancellationToken token); + Task> GetPeriodStatisticsAsync(DateTime periodBegin, + DateTime periodEnd, + CancellationToken token = default); + } +} diff --git a/AsbCloudDb/Model/Subsystems/Subsystem.cs b/AsbCloudDb/Model/Subsystems/Subsystem.cs new file mode 100644 index 00000000..b781d4cb --- /dev/null +++ b/AsbCloudDb/Model/Subsystems/Subsystem.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations.Schema; + +namespace AsbCloudDb.Model.Subsystems +{ + [Table("t_subsystem"), Comment("Описание подсистем")] + public class Subsystem : IId + { + [Key] + [Column("id")] + public int Id { get; set; } + + [Column("name")] + [StringLength(255)] + public string? Name { get; set; } + + [Column("description")] + [StringLength(255)] + public string? Description { get; set; } + } + +} diff --git a/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs b/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs new file mode 100644 index 00000000..3e86ca6d --- /dev/null +++ b/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs @@ -0,0 +1,39 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace AsbCloudDb.Model.Subsystems +{ + [Table("t_subsystem_operation_time"), Comment("наработки подсистем")] + public partial class SubsystemOperationTime : IId + { + [Key] + [Column("id")] + public int Id { get; set; } + + [Column("id_telemetry"), Comment("ИД телеметрии по которой выдается информация")] + public int IdTelemetry { get; set; } + + [Column("id_subsystem")] + public int IdSubsystem { get; set; } + + [Column("date_end"), Comment("дата/время включения подсистемы")] + public DateTime DateStart { get; set; } + [Column("date_end"), Comment("дата/время выключения подсистемы")] + public DateTime DateEnd { get; set; } + [Column("depth_start"), Comment("глубина забоя на момент включения подсистемы")] + public double DepthStart { get; set; } + [Column("depth_end"), Comment("глубина забоя на момент выключения подсистемы")] + public double DepthEnd { get; set; } + + [ForeignKey(nameof(IdSubsystem))] + public virtual Subsystem Subsystem { get; set; } + + [ForeignKey(nameof(IdTelemetry))] + public virtual Telemetry Telemetry { get; set; } + + + + } +} diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index c4cab363..de9a1889 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -1,7 +1,9 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Data.Subsystems; using AsbCloudApp.Services; using AsbCloudDb.Model; +using AsbCloudDb.Model.Subsystems; using AsbCloudInfrastructure.Repository; using AsbCloudInfrastructure.Services; using AsbCloudInfrastructure.Services.Cache; @@ -141,6 +143,8 @@ namespace AsbCloudInfrastructure dbSet => dbSet .Include(c => c.Wells) .Include(c => c.Deposit))); // может быть включен в сервис ClusterService + // Subsystem service + services.AddTransient, CrudCacheServiceBase>(); services.AddTransient, CrudCacheServiceBase>(); diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs new file mode 100644 index 00000000..e4538522 --- /dev/null +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services.Subsystems +{ + internal class SubsystemOperationTimeBackgroundService : BackgroundService + { + private readonly string connectionString; + public SubsystemOperationTimeBackgroundService(IConfiguration configuration) + { + connectionString = configuration.GetConnectionString("DefaultConnection"); + } + protected override Task ExecuteAsync(CancellationToken token) + { + throw new NotImplementedException(); + } + } +} diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs new file mode 100644 index 00000000..d756aec6 --- /dev/null +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -0,0 +1,14 @@ +using AsbCloudApp.Services.Subsystems; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services.Subsystems +{ + internal class SubsystemOperationTimeService: ISubsystemOperationTimeService + { + + } +} diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs new file mode 100644 index 00000000..f740c5fa --- /dev/null +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -0,0 +1,14 @@ +using AsbCloudApp.Data.Subsystems; +using AsbCloudDb.Model; +using AsbCloudDb.Model.Subsystems; +using AsbCloudInfrastructure.Repository; + +namespace AsbCloudInfrastructure.Services.Subsystems +{ + internal class SubsystemService : CrudCacheServiceBase + { + public SubsystemService(IAsbCloudDbContext dbContext) : base(dbContext) + { + } + } +} diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemStatisticService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemStatisticService.cs new file mode 100644 index 00000000..d083bf8b --- /dev/null +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemStatisticService.cs @@ -0,0 +1,30 @@ +using AsbCloudApp.Data.Subsystems; +using AsbCloudApp.Services.Subsystems; +using AsbCloudDb.Model; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services.Subsystems +{ + internal class SubsystemStatisticService : ISubsystemStatisticsService + { + + private readonly IAsbCloudDbContext db; + + public SubsystemStatisticService(IAsbCloudDbContext db) + { + this.db = db; + } + public Task> GetPeriodStatisticsAsync(DateTime periodBegin, DateTime periodEnd, CancellationToken token = default) + { + throw new NotImplementedException(); + } + + public Task> GetStatisticsAsync(CancellationToken token) + { + throw new NotImplementedException(); + } + } +} diff --git a/AsbCloudWebApi/Controllers/Subsystems/AdminSubsystemController.cs b/AsbCloudWebApi/Controllers/Subsystems/AdminSubsystemController.cs new file mode 100644 index 00000000..3663f5df --- /dev/null +++ b/AsbCloudWebApi/Controllers/Subsystems/AdminSubsystemController.cs @@ -0,0 +1,23 @@ +using AsbCloudApp.Data.Subsystems; +using AsbCloudApp.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace AsbCloudWebApi.Controllers.Subsystems +{ + /// + /// Редактор подсистем для админки + /// + [Route("api/admin/subsystem")] + [ApiController] + [Authorize] + public class AdminSubsystemController : CrudController> + { + public AdminSubsystemController(ICrudService service) + : base(service) + { + } + } + } + diff --git a/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs b/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs new file mode 100644 index 00000000..1e6d9451 --- /dev/null +++ b/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs @@ -0,0 +1,22 @@ +using AsbCloudApp.Data.Subsystems; +using AsbCloudApp.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudWebApi.Controllers.Subsystems +{ + /// + /// Наработка подсистем + /// + [Route("api/[OperatingTimeSubsystem]")] + [ApiController] + [Authorize] + + public class OperatingTimeSubsystemController : ControllerBase + { + } + } diff --git a/AsbCloudWebApi/Controllers/Subsystems/StatisticSubsystemsController.cs b/AsbCloudWebApi/Controllers/Subsystems/StatisticSubsystemsController.cs new file mode 100644 index 00000000..1fafe82b --- /dev/null +++ b/AsbCloudWebApi/Controllers/Subsystems/StatisticSubsystemsController.cs @@ -0,0 +1,94 @@ +using AsbCloudApp.Data.Subsystems; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudWebApi.Controllers.Subsystems +{ + /// + /// Статистика наработки подсистем + /// + [Route("api/statisticsSubsystem")] + [ApiController] + [Authorize] + public class StatisticSubsystemsController : ControllerBase + { + + /// + /// получить без временного периода в запросе. + /// + [HttpGet] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetStatisticsAsync(CancellationToken token = default) + { + var subsystemResult = new List() + { + new SubsystemStatisticsDto(){ + IdSubsystem = 1, + Subsystem = "test1", + UsedTime = System.DateTime.Now, + K2 = System.TimeSpan.MinValue, + KUsage = System.TimeSpan.MinValue + + }, + new SubsystemStatisticsDto(){ + IdSubsystem = 2, + Subsystem = "test2", + UsedTime = System.DateTime.Now, + K2 = System.TimeSpan.Zero, + KUsage = System.TimeSpan.Zero + }, + new SubsystemStatisticsDto(){ + IdSubsystem = 3, + Subsystem = "test3", + UsedTime = System.DateTime.Now, + K2 = System.TimeSpan.MaxValue, + KUsage = System.TimeSpan.MaxValue + } + }; + + return Ok(subsystemResult); + } + + + + //[HttpGet] + //[ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + //public async Task GetStatisticsPeriodAsync(CancellationToken token = default, DateTime dateBegin , DateTime dateEnd) + //{ + // var subsystemResult = new List() + // { + // new SubsystemStatisticsDto(){ + // IdSubsystem = 1, + // Subsystem = "test1", + // UsedTime = System.DateTime.Now, + // K2 = System.TimeSpan.MinValue, + // KUsage = System.TimeSpan.MinValue + + // }, + // new SubsystemStatisticsDto(){ + // IdSubsystem = 2, + // Subsystem = "test2", + // UsedTime = System.DateTime.Now, + // K2 = System.TimeSpan.Zero, + // KUsage = System.TimeSpan.Zero + // }, + // new SubsystemStatisticsDto(){ + // IdSubsystem = 3, + // Subsystem = "test3", + // UsedTime = System.DateTime.Now, + // K2 = System.TimeSpan.MaxValue, + // KUsage = System.TimeSpan.MaxValue + // } + // }; + + // return Ok(subsystemResult); + //} + + + } +} From 421c706ca1a2e06fb9bd5a930604c79e460fa0b3 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 18 Jul 2022 18:51:49 +0500 Subject: [PATCH 02/21] =?UTF-8?q?=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BB=D0=BB=D0=B5=D1=80=D0=BE=D0=B2=20=D0=B8?= =?UTF-8?q?=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/AsbCloudApp.csproj | 4 + .../Requests/SubsystemOperationTimeRequest.cs | 15 +++ .../ISubsystemOperationTimeService.cs | 10 +- .../Subsystems/ISubsystemStatisticsService.cs | 16 ---- AsbCloudDb/Model/AsbCloudDbContext.cs | 5 + ...SubsystemOperationTimeBackgroundService.cs | 33 ++++++- .../SubsystemOperationTimeService.cs | 68 +++++++++++++- .../Subsystems/SubsystemStatisticService.cs | 30 ------ .../OperatingTimeSubsystemController.cs | 93 +++++++++++++++++- .../StatisticSubsystemsController.cs | 94 ------------------- 10 files changed, 218 insertions(+), 150 deletions(-) create mode 100644 AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs delete mode 100644 AsbCloudApp/Services/Subsystems/ISubsystemStatisticsService.cs delete mode 100644 AsbCloudInfrastructure/Services/Subsystems/SubsystemStatisticService.cs delete mode 100644 AsbCloudWebApi/Controllers/Subsystems/StatisticSubsystemsController.cs diff --git a/AsbCloudApp/AsbCloudApp.csproj b/AsbCloudApp/AsbCloudApp.csproj index e84cf12c..200ee51b 100644 --- a/AsbCloudApp/AsbCloudApp.csproj +++ b/AsbCloudApp/AsbCloudApp.csproj @@ -6,6 +6,10 @@ disable + + + + diff --git a/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs b/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs new file mode 100644 index 00000000..4276ba75 --- /dev/null +++ b/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudApp.Requests +{ + /// + /// класс с фильтрами для запроса + /// + public class SubsystemOperationTimeRequest: RequestBase + { + } +} diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs index 44e0b2d4..d55a9167 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -1,12 +1,20 @@ -using System; +using AsbCloudApp.Data.Subsystems; +using AsbCloudApp.Requests; +using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace AsbCloudApp.Services.Subsystems { public interface ISubsystemOperationTimeService { + Task> GetSubsystemAsync(int? idWell, CancellationToken token); + Task> GetStatisticAsync(SubsystemOperationTimeRequest request, CancellationToken token); + Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token); + Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); + } } diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemStatisticsService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemStatisticsService.cs deleted file mode 100644 index 411baa9e..00000000 --- a/AsbCloudApp/Services/Subsystems/ISubsystemStatisticsService.cs +++ /dev/null @@ -1,16 +0,0 @@ -using AsbCloudApp.Data.Subsystems; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudApp.Services.Subsystems -{ - public interface ISubsystemStatisticsService - { - Task> GetStatisticsAsync(CancellationToken token); - Task> GetPeriodStatisticsAsync(DateTime periodBegin, - DateTime periodEnd, - CancellationToken token = default); - } -} diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 3fc9fa73..f061d084 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -481,6 +481,11 @@ namespace AsbCloudDb.Model new Permission{ Id = 124, Name="AdminWell.delete", Description="Разрешение удалять админ. Скважины"}, new Permission{ Id = 125, Name="AdminWell.edit", Description="Разрешение редактировать админ. Скважины"}, new Permission{ Id = 126, Name="AdminWell.get", Description="Разрешение просматривать админ. Скважины"}, + + new Permission{ Id = 127, Name="AdminSubsytem.delete", Description="Разрешение удалять админ. Подсистемы"}, + new Permission{ Id = 128, Name="AdminSubsytem.edit", Description="Разрешение редактировать админ. Подсистемы"}, + new Permission{ Id = 129, Name="AdminSubsytem.get", Description="Разрешение просматривать админ. Подсистемы"}, + new Permission{ Id = 200, Name="Auth.edit", Description="Разрешение редактировать 0"}, new Permission{ Id = 201, Name="Auth.get", Description="Разрешение просматривать 0"}, new Permission{ Id = 202, Name="Cluster.get", Description="Разрешение просматривать Кусты"}, diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index e4538522..6c6fe8d8 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -1,7 +1,10 @@ -using Microsoft.Extensions.Configuration; +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; @@ -16,9 +19,33 @@ namespace AsbCloudInfrastructure.Services.Subsystems { connectionString = configuration.GetConnectionString("DefaultConnection"); } - protected override Task ExecuteAsync(CancellationToken token) + protected override async Task ExecuteAsync(CancellationToken token) { - throw new NotImplementedException(); + var timeToStartAnalysis = DateTime.Now; + var options = new DbContextOptionsBuilder() + .UseNpgsql(connectionString) + .Options; + + while (!token.IsCancellationRequested) + { + if (DateTime.Now > timeToStartAnalysis) + { + timeToStartAnalysis = DateTime.Now + TimeSpan.FromHours(1); + try + { + + } + catch (Exception ex) + { + Trace.TraceError(ex.Message); + } + //GC.Collect(); + } + + var ms = (int)(timeToStartAnalysis - DateTime.Now).TotalMilliseconds; + ms = ms > 100 ? ms : 100; + await Task.Delay(ms, token).ConfigureAwait(false); + } } } } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index d756aec6..eb8d9e6c 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -1,14 +1,74 @@ -using AsbCloudApp.Services.Subsystems; +using AsbCloudApp.Data.Subsystems; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using AsbCloudApp.Services.Subsystems; +using AsbCloudDb.Model; using System; using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.Subsystems { - internal class SubsystemOperationTimeService: ISubsystemOperationTimeService + internal class SubsystemOperationTimeService : ISubsystemOperationTimeService { + private readonly IAsbCloudDbContext db; + private readonly IWellService wellService; + + public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService) + { + this.db = db; + this.wellService = wellService; + } + + public async Task> GetSubsystemAsync(int? idWell, CancellationToken token) + { + var result = new List() { + new SubsystemDto() + { + Id = 1, + Name = "test1", + Description = "test desription1" + }, + new SubsystemDto() + { + Id = 2, + Name = "test2", + Description = "test desription2" + }, + new SubsystemDto() + { + Id = 3, + Name = "test3", + Description = "test desription3" + } + }; + + return result; + + } + + + public async Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token) + { + throw new NotImplementedException(); + } + + public Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token) + { + throw new NotImplementedException(); + } + + + + Task> ISubsystemOperationTimeService.GetStatisticAsync(SubsystemOperationTimeRequest request, CancellationToken token) + { + throw new NotImplementedException(); + } + + + + } } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemStatisticService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemStatisticService.cs deleted file mode 100644 index d083bf8b..00000000 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemStatisticService.cs +++ /dev/null @@ -1,30 +0,0 @@ -using AsbCloudApp.Data.Subsystems; -using AsbCloudApp.Services.Subsystems; -using AsbCloudDb.Model; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudInfrastructure.Services.Subsystems -{ - internal class SubsystemStatisticService : ISubsystemStatisticsService - { - - private readonly IAsbCloudDbContext db; - - public SubsystemStatisticService(IAsbCloudDbContext db) - { - this.db = db; - } - public Task> GetPeriodStatisticsAsync(DateTime periodBegin, DateTime periodEnd, CancellationToken token = default) - { - throw new NotImplementedException(); - } - - public Task> GetStatisticsAsync(CancellationToken token) - { - throw new NotImplementedException(); - } - } -} diff --git a/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs b/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs index 1e6d9451..91697b30 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs @@ -1,5 +1,7 @@ using AsbCloudApp.Data.Subsystems; +using AsbCloudApp.Requests; using AsbCloudApp.Services; +using AsbCloudApp.Services.Subsystems; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -9,14 +11,101 @@ using System.Threading.Tasks; namespace AsbCloudWebApi.Controllers.Subsystems { + + /// /// Наработка подсистем /// - [Route("api/[OperatingTimeSubsystem]")] + [Route("api/[controller]")] [ApiController] [Authorize] public class OperatingTimeSubsystemController : ControllerBase { + private readonly ISubsystemOperationTimeService subsystemOperationTimeService; + private readonly IWellService wellService; + + public OperatingTimeSubsystemController(ISubsystemOperationTimeService subsystemOperationTimeService, IWellService wellService) + { + this.subsystemOperationTimeService = subsystemOperationTimeService; + this.wellService = wellService; + } + /// + /// получить статистику + /// + [HttpGet("statistic")] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetStatisticsAsync(CancellationToken token = default) + { + var subsystemResult = new List() + { + new SubsystemStatisticsDto(){ + IdSubsystem = 1, + Subsystem = "test1", + UsedTime = System.DateTime.Now, + K2 = System.TimeSpan.MinValue, + KUsage = System.TimeSpan.MinValue + + }, + new SubsystemStatisticsDto(){ + IdSubsystem = 2, + Subsystem = "test2", + UsedTime = System.DateTime.Now, + K2 = System.TimeSpan.Zero, + KUsage = System.TimeSpan.Zero + }, + new SubsystemStatisticsDto(){ + IdSubsystem = 3, + Subsystem = "test3", + UsedTime = System.DateTime.Now, + K2 = System.TimeSpan.MaxValue, + KUsage = System.TimeSpan.MaxValue + } + }; + + return Ok(subsystemResult); + } + + /// + /// получить список подсистем общий. + /// + [HttpGet("subsystem")] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetSubsystemAsync([FromQuery] int? idWell, CancellationToken token = default) + { + var result = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token); + return Ok(result); + } + + /// + /// получить список наработок подсистем + /// + [HttpGet("operationTime")] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetOperationTimeAsync( + [FromQuery] SubsystemOperationTimeRequest request, + CancellationToken token = default) + { + + var result = await subsystemOperationTimeService.GetOperationTimeAsync(request, token); + return Ok(result); + } + + /// + /// Удалить наработки. + /// + /// + /// + /// + [HttpDelete] + [Permission] + [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] + public async Task DeleteAsync( + [FromQuery] SubsystemOperationTimeRequest request, + CancellationToken token) + { + var result = await subsystemOperationTimeService.DeleteAsync(request, token); + return Ok(result); + } } - } +} diff --git a/AsbCloudWebApi/Controllers/Subsystems/StatisticSubsystemsController.cs b/AsbCloudWebApi/Controllers/Subsystems/StatisticSubsystemsController.cs deleted file mode 100644 index 1fafe82b..00000000 --- a/AsbCloudWebApi/Controllers/Subsystems/StatisticSubsystemsController.cs +++ /dev/null @@ -1,94 +0,0 @@ -using AsbCloudApp.Data.Subsystems; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudWebApi.Controllers.Subsystems -{ - /// - /// Статистика наработки подсистем - /// - [Route("api/statisticsSubsystem")] - [ApiController] - [Authorize] - public class StatisticSubsystemsController : ControllerBase - { - - /// - /// получить без временного периода в запросе. - /// - [HttpGet] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetStatisticsAsync(CancellationToken token = default) - { - var subsystemResult = new List() - { - new SubsystemStatisticsDto(){ - IdSubsystem = 1, - Subsystem = "test1", - UsedTime = System.DateTime.Now, - K2 = System.TimeSpan.MinValue, - KUsage = System.TimeSpan.MinValue - - }, - new SubsystemStatisticsDto(){ - IdSubsystem = 2, - Subsystem = "test2", - UsedTime = System.DateTime.Now, - K2 = System.TimeSpan.Zero, - KUsage = System.TimeSpan.Zero - }, - new SubsystemStatisticsDto(){ - IdSubsystem = 3, - Subsystem = "test3", - UsedTime = System.DateTime.Now, - K2 = System.TimeSpan.MaxValue, - KUsage = System.TimeSpan.MaxValue - } - }; - - return Ok(subsystemResult); - } - - - - //[HttpGet] - //[ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - //public async Task GetStatisticsPeriodAsync(CancellationToken token = default, DateTime dateBegin , DateTime dateEnd) - //{ - // var subsystemResult = new List() - // { - // new SubsystemStatisticsDto(){ - // IdSubsystem = 1, - // Subsystem = "test1", - // UsedTime = System.DateTime.Now, - // K2 = System.TimeSpan.MinValue, - // KUsage = System.TimeSpan.MinValue - - // }, - // new SubsystemStatisticsDto(){ - // IdSubsystem = 2, - // Subsystem = "test2", - // UsedTime = System.DateTime.Now, - // K2 = System.TimeSpan.Zero, - // KUsage = System.TimeSpan.Zero - // }, - // new SubsystemStatisticsDto(){ - // IdSubsystem = 3, - // Subsystem = "test3", - // UsedTime = System.DateTime.Now, - // K2 = System.TimeSpan.MaxValue, - // KUsage = System.TimeSpan.MaxValue - // } - // }; - - // return Ok(subsystemResult); - //} - - - } -} From d3bbbd5bd6373a7b8bba197d0ff8d90288b3c2d9 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 1 Aug 2022 13:55:51 +0500 Subject: [PATCH 03/21] =?UTF-8?q?=D0=BD=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=BE=D0=B2=201)=D1=84=D0=BE=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=202)=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B2=D0=B8=D1=81=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=20=D0=B0=D0=BF=D0=B8=20(OperationTimeService)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/AsbCloudApp.csproj | 6 +- .../Data/Subsystems/SubsystemStatisticsDto.cs | 4 +- .../Requests/SubsystemOperationTimeRequest.cs | 43 ++++ AsbCloudApp/Services/ICrudService.cs | 1 + AsbCloudApp/Services/IWellService.cs | 2 +- .../ISubsystemOperationTimeService.cs | 4 +- AsbCloudDb/Model/AsbCloudDbContext.cs | 7 +- AsbCloudDb/Model/IAsbCloudDbContext.cs | 5 +- AsbCloudDb/Model/Subsystems/Subsystem.cs | 3 + .../Subsystems/SubsystemOperationTime.cs | 11 +- AsbCloudInfrastructure/DependencyInjection.cs | 3 +- .../Repository/CrudServiceBase.cs | 2 +- .../Services/Subsystems/OperationTimeData.cs | 15 ++ ...SubsystemOperationTimeBackgroundService.cs | 169 +++++++++++++++- .../SubsystemOperationTimeService.cs | 188 ++++++++++++++---- .../OperatingTimeSubsystemController.cs | 10 +- 16 files changed, 409 insertions(+), 64 deletions(-) create mode 100644 AsbCloudInfrastructure/Services/Subsystems/OperationTimeData.cs diff --git a/AsbCloudApp/AsbCloudApp.csproj b/AsbCloudApp/AsbCloudApp.csproj index 200ee51b..6b214070 100644 --- a/AsbCloudApp/AsbCloudApp.csproj +++ b/AsbCloudApp/AsbCloudApp.csproj @@ -1,4 +1,4 @@ - + net6.0 @@ -6,10 +6,6 @@ disable - - - - diff --git a/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs index 6363bf2c..38707c72 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs @@ -23,7 +23,7 @@ namespace AsbCloudApp.Data.Subsystems /// /// наработка подсистемы /// - public DateTime UsedTime { get; set; } + public TimeSpan UsedTime { get; set; } /// /// коэффициент использования /// @@ -32,7 +32,5 @@ namespace AsbCloudApp.Data.Subsystems /// коэффициент применения /// public TimeSpan K2 { get; set; } - - } } diff --git a/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs b/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs index 4276ba75..449690a5 100644 --- a/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs +++ b/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs @@ -1,15 +1,58 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AsbCloudApp.Requests { +#nullable enable /// /// класс с фильтрами для запроса /// public class SubsystemOperationTimeRequest: RequestBase { + /// + /// идентификатор скважины, может не указыватся пользователем + /// + [Required] + public int IdWell { get; set; } + /// + /// идентификатор подсистемы + /// + public IEnumerable? IdsSubsystems { get; set; } + + /// + /// Больше или равно дате + /// + public DateTime? GtDate { get; set; } + + /// + /// Меньше или равно дате + /// + public DateTime? LtDate { get; set; } + + /// + /// Больше или равно глубины забоя + /// + public double? GtDepth { get; set; } + + /// + /// Меньше или равно глубины забоя + /// + public double? LtDepth { get; set; } + + /// + /// информация попадает в выборку, если интервал выборки частично или полностью пересекается с запрашиваемым интервалом + /// + public const int SelectModeOuter = 0; + /// + /// + /// + public const int SelectModeInner = 1; + public const int SelectModeTrim = 2; + public int SelectMode { get; set; } = SelectModeOuter; } +#nullable disable } diff --git a/AsbCloudApp/Services/ICrudService.cs b/AsbCloudApp/Services/ICrudService.cs index d9a2ad37..bbb7fce8 100644 --- a/AsbCloudApp/Services/ICrudService.cs +++ b/AsbCloudApp/Services/ICrudService.cs @@ -33,6 +33,7 @@ namespace AsbCloudApp.Services /// null if not found Task GetOrDefaultAsync(int id, CancellationToken token); + /// /// Получить запись по id /// diff --git a/AsbCloudApp/Services/IWellService.cs b/AsbCloudApp/Services/IWellService.cs index b655566a..faef9d1a 100644 --- a/AsbCloudApp/Services/IWellService.cs +++ b/AsbCloudApp/Services/IWellService.cs @@ -19,7 +19,7 @@ namespace AsbCloudApp.Services string GetStateText(int state); DateTimeOffset GetLastTelemetryDate(int idWell); Task> GetClusterWellsIdsAsync(int idWell, CancellationToken token); - SimpleTimezoneDto GetTimezone(int idWell); + SimpleTimezoneDto GetTimezone(int idWell); DatesRangeDto GetDatesRange(int idWell); Task EnshureTimezonesIsSetAsync(CancellationToken token); } diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs index d55a9167..f6ff4b0e 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -11,8 +11,8 @@ namespace AsbCloudApp.Services.Subsystems { public interface ISubsystemOperationTimeService { - Task> GetSubsystemAsync(int? idWell, CancellationToken token); - Task> GetStatisticAsync(SubsystemOperationTimeRequest request, CancellationToken token); + Task> GetSubsystemAsync(int idWell, CancellationToken token); + Task> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token); Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token); Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index f061d084..cfe9d7c9 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -1,4 +1,5 @@ -using Microsoft.EntityFrameworkCore; +using AsbCloudDb.Model.Subsystems; +using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -29,6 +30,8 @@ namespace AsbCloudDb.Model public virtual DbSet RelationUserUserRoles => Set(); public virtual DbSet ReportProperties => Set(); public virtual DbSet SetpointsRequests => Set(); + public virtual DbSet Subsystems => Set(); + public virtual DbSet SubsystemOperationTimes => Set(); public virtual DbSet Telemetries => Set(); public virtual DbSet TelemetryDataSaub => Set(); public virtual DbSet TelemetryDataSaubStats => Set(); @@ -99,7 +102,7 @@ namespace AsbCloudDb.Model entity.Property(e => e.Timezone) .HasJsonConversion(); - }); + }); modelBuilder.Entity(entity => { diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index ce965004..94bf7885 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -1,4 +1,5 @@ -using AsbCloudDb.Model.WITS; +using AsbCloudDb.Model.Subsystems; +using AsbCloudDb.Model.WITS; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using System; @@ -28,6 +29,8 @@ namespace AsbCloudDb.Model DbSet RelationUserRolePermissions { get; } DbSet RelationUserUserRoles { get; } DbSet ReportProperties { get; } + DbSet Subsystems { get; } + DbSet SubsystemOperationTimes { get; } DbSet Telemetries { get; } DbSet TelemetryDataSaub { get; } DbSet TelemetryDataSaubStats { get; } diff --git a/AsbCloudDb/Model/Subsystems/Subsystem.cs b/AsbCloudDb/Model/Subsystems/Subsystem.cs index b781d4cb..5fc7938c 100644 --- a/AsbCloudDb/Model/Subsystems/Subsystem.cs +++ b/AsbCloudDb/Model/Subsystems/Subsystem.cs @@ -21,6 +21,9 @@ namespace AsbCloudDb.Model.Subsystems [Column("description")] [StringLength(255)] public string? Description { get; set; } + + [InverseProperty(nameof(SubsystemOperationTime.Subsystem))] + public virtual ICollection SubsystemOperationTimes { get; set; } } } diff --git a/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs b/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs index 3e86ca6d..28a02365 100644 --- a/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs +++ b/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs @@ -2,6 +2,7 @@ using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.Text.Json.Serialization; namespace AsbCloudDb.Model.Subsystems { @@ -19,17 +20,19 @@ namespace AsbCloudDb.Model.Subsystems public int IdSubsystem { get; set; } [Column("date_end"), Comment("дата/время включения подсистемы")] - public DateTime DateStart { get; set; } + public DateTimeOffset DateStart { get; set; } [Column("date_end"), Comment("дата/время выключения подсистемы")] - public DateTime DateEnd { get; set; } + public DateTimeOffset DateEnd { get; set; } [Column("depth_start"), Comment("глубина забоя на момент включения подсистемы")] - public double DepthStart { get; set; } + public float? DepthStart { get; set; } [Column("depth_end"), Comment("глубина забоя на момент выключения подсистемы")] - public double DepthEnd { get; set; } + public float? DepthEnd { get; set; } + [JsonIgnore] [ForeignKey(nameof(IdSubsystem))] public virtual Subsystem Subsystem { get; set; } + [JsonIgnore] [ForeignKey(nameof(IdTelemetry))] public virtual Telemetry Telemetry { get; set; } diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index de9a1889..3e98c630 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -11,6 +11,7 @@ using AsbCloudInfrastructure.Services.DailyReport; using AsbCloudInfrastructure.Services.DetectOperations; using AsbCloudInfrastructure.Services.DrillingProgram; using AsbCloudInfrastructure.Services.SAUB; +using AsbCloudInfrastructure.Services.Subsystems; using AsbCloudInfrastructure.Services.WellOperationService; using AsbCloudInfrastructure.Validators; using FluentValidation.AspNetCore; @@ -86,7 +87,7 @@ namespace AsbCloudInfrastructure services.AddScoped(); services.AddHostedService(); - + //services.AddHostedService(); services.AddSingleton(new WitsInfoService()); services.AddSingleton(new CacheDb()); services.AddSingleton(new InstantDataRepository()); diff --git a/AsbCloudInfrastructure/Repository/CrudServiceBase.cs b/AsbCloudInfrastructure/Repository/CrudServiceBase.cs index 15c8dc4f..c6e96d09 100644 --- a/AsbCloudInfrastructure/Repository/CrudServiceBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudServiceBase.cs @@ -75,7 +75,7 @@ namespace AsbCloudInfrastructure.Repository return default; var dto = Convert(entity); return dto; - } + } /// public virtual TDto? GetOrDefault(int id) diff --git a/AsbCloudInfrastructure/Services/Subsystems/OperationTimeData.cs b/AsbCloudInfrastructure/Services/Subsystems/OperationTimeData.cs new file mode 100644 index 00000000..0002490d --- /dev/null +++ b/AsbCloudInfrastructure/Services/Subsystems/OperationTimeData.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services.Subsystems +{ + internal class OperationTimeData + { + public DateTimeOffset DateTime { get; internal set; } + public short? Mode { get; internal set; } + public float? Depth { get; internal set; } + } +} diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index 6c6fe8d8..ae97e8b7 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -1,4 +1,6 @@ using AsbCloudDb.Model; +using AsbCloudDb.Model.Subsystems; +using AsbCloudInfrastructure.Services.DetectOperations; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; @@ -15,9 +17,11 @@ namespace AsbCloudInfrastructure.Services.Subsystems internal class SubsystemOperationTimeBackgroundService : BackgroundService { private readonly string connectionString; + private readonly TimeSpan period = TimeSpan.FromHours(1); public SubsystemOperationTimeBackgroundService(IConfiguration configuration) { connectionString = configuration.GetConnectionString("DefaultConnection"); + } protected override async Task ExecuteAsync(CancellationToken token) { @@ -30,22 +34,179 @@ namespace AsbCloudInfrastructure.Services.Subsystems { if (DateTime.Now > timeToStartAnalysis) { - timeToStartAnalysis = DateTime.Now + TimeSpan.FromHours(1); + timeToStartAnalysis = DateTime.Now + period; try { - + using var context = new AsbCloudDbContext(options); + var added = await OperationTimeAllTelemetriesAsync(context, token); + Trace.TraceInformation($"Total operation time subsystem complete. Added {added} operations time."); } catch (Exception ex) { Trace.TraceError(ex.Message); } - //GC.Collect(); + GC.Collect(); } - var ms = (int)(timeToStartAnalysis - DateTime.Now).TotalMilliseconds; ms = ms > 100 ? ms : 100; await Task.Delay(ms, token).ConfigureAwait(false); } + } + + public override async Task StopAsync(CancellationToken token) + { + await base.StopAsync(token).ConfigureAwait(false); } + + private static async Task OperationTimeAllTelemetriesAsync(IAsbCloudDbContext db, CancellationToken token) + { + var lastDetectedDates = await db.DetectedOperations + .GroupBy(o => o.IdTelemetry) + .Select(g => new + { + IdTelemetry = g.Key, + LastDate = g.Max(o => o.DateEnd) + }) + .ToListAsync(token); + + var telemetryIds = await db.Telemetries + .Where(t => t.Info != null && t.TimeZone != null) + .Select(t => t.Id) + .ToListAsync(token); + + var JounedlastDetectedDates = telemetryIds + .GroupJoin(lastDetectedDates, + t => t, + o => o.IdTelemetry, + (outer, inner) => new + { + IdTelemetry = outer, + inner.SingleOrDefault()?.LastDate, + }); + var affected = 0; + foreach (var item in JounedlastDetectedDates) + { + var stopwatch = Stopwatch.StartNew(); + var newOperations = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); + stopwatch.Stop(); + if (newOperations.Any()) + { + db.SubsystemOperationTimes.AddRange(newOperations); + affected += await db.SaveChangesAsync(token); + } + } + return affected; + } + + private static async Task> OperationTimeSaubAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) + { + var query = db.TelemetryDataSaub + .AsNoTracking() + .Where(d => d.IdTelemetry == idTelemetry) + .Select(d => new OperationTimeData + { + DateTime = d.DateTime, + Mode = d.Mode, + Depth = d.WellDepth + }) + .OrderBy(d => d.DateTime); + + var take = 4 * 86_400; // 4 дня + var startDate = begin; + var resultSubsystemOperationTime = new List(); + var firstItem = query.FirstOrDefault(); + if (firstItem is null) + return null; + short? mode = firstItem.Mode; + DateTimeOffset dateBegin = firstItem.DateTime; + float? depthStart = firstItem.Depth; + while (true) + { + var data = await query + .Where(d => d.DateTime > startDate) + .Take(take) + .ToArrayAsync(token); + for(int i = 1;i<=data.Length ;i++) + { + if( data[i].Mode!= mode) + { + var operationTimeItem = new SubsystemOperationTime() + { + IdTelemetry = idTelemetry, + DateStart = dateBegin, + DateEnd = data[i - 1].DateTime, + DepthStart = depthStart, + DepthEnd = data[i - 1].Depth + + }; + resultSubsystemOperationTime.Add(operationTimeItem); + mode = data[i].Mode; + dateBegin = data[i].DateTime; + depthStart = data[i].Depth; + } + } + startDate = data.Last().DateTime; + } + return resultSubsystemOperationTime; + } + + //private static async Task> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) + //{ + // var query = db.TelemetryDataSpin + // .AsNoTracking() + // .Where(d => d.IdTelemetry == idTelemetry) + // .Select(d => new OperationTimeData + // { + // DateTime = d.DateTime, + // Mode = d.Mode + // // Depth = d.d + // }) + // .OrderBy(d => d.DateTime); + + // var take = 4 * 86_400; // 4 дня + // var startDate = begin; + // var operationTime = new List(); + // const int minOperationLength = 5; + // const int maxDetectorsInterpolationFrameLength = 30; + // const int gap = maxDetectorsInterpolationFrameLength + minOperationLength; + + // while (true) + // { + // var data = await query + // .Where(d => d.DateTime > startDate) + // .Take(take) + // .ToArrayAsync(token); + + // if (data.Length < gap) + // break; + + // short? modeCount = data[0].Mode; + // DateTimeOffset dateBegin = data[0].DateTime; + // float? depthStart = data[0].Depth; + // for (int i = 1; i <= data.Length; i++) + // { + // if (data[i].Mode != modeCount) + // { + // var operationTimeItem = new SubsystemOperationTime() + // { + // IdTelemetry = idTelemetry, + // DateStart = dateBegin, + // DateEnd = data[i - 1].DateTime, + // DepthStart = depthStart, + // DepthEnd = data[i - 1].Depth + + // }; + // operationTime.Add(operationTimeItem); + // modeCount = data[i].Mode; + // dateBegin = data[i].DateTime; + // depthStart = data[i].Depth; + // } + // } + // } + // var depths = db.TelemetryDataSaub.Where(t => true/*by date*/) + // .GroupBy(t => t.IdTelemetry) + // .Select(group => group.Min(t => t.WellDepth)); + // return operationTime; + //} } } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index eb8d9e6c..48991852 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -2,9 +2,14 @@ using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudApp.Services.Subsystems; +using AsbCloudDb; using AsbCloudDb.Model; +using AsbCloudDb.Model.Subsystems; +using Mapster; +using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -15,60 +20,173 @@ namespace AsbCloudInfrastructure.Services.Subsystems private readonly IAsbCloudDbContext db; private readonly IWellService wellService; + private readonly SubsystemService subsystemService; - public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService) + public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService, SubsystemService subsystemService) { this.db = db; - this.wellService = wellService; + this.wellService = wellService; + this.subsystemService = subsystemService; } - public async Task> GetSubsystemAsync(int? idWell, CancellationToken token) - { - var result = new List() { - new SubsystemDto() - { - Id = 1, - Name = "test1", - Description = "test desription1" - }, - new SubsystemDto() - { - Id = 2, - Name = "test2", - Description = "test desription2" - }, - new SubsystemDto() - { - Id = 3, - Name = "test3", - Description = "test desription3" - } - }; - - return result; + public async Task > GetSubsystemAsync(int idWell, CancellationToken token) + { + var well = await wellService.GetOrDefaultAsync(idWell, token); + if (well?.IdTelemetry is null || well.Timezone is null) + return null; + var wellSubsystem = db.SubsystemOperationTimes + .Include(e=>e.Subsystem) + .AsNoTracking() + .Where(o => o.IdTelemetry == well.IdTelemetry) + .DistinctBy(o => o.IdSubsystem) + .Select(d => new SubsystemDto + { + Id = d.Subsystem.Id, + Name = d.Subsystem.Name, + Description = d.Subsystem.Description, + }); + return wellSubsystem; } public async Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token) { - throw new NotImplementedException(); + var well = await wellService.GetOrDefaultAsync(request.IdWell, token); + if (well?.IdTelemetry is null || well.Timezone is null) + return 0; + var query = BuildQuery(request); + db.SubsystemOperationTimes.RemoveRange(query); + return await db.SaveChangesAsync(token); } - public Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token) + public async Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token) + { + + var query = BuildQuery(request) + .AsNoTracking(); + if (query is null) + return null; + var data = await query.ToListAsync(token); + var dtos = data.Select(o => Convert(o)); + + return dtos; + } + + + + public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token) + { + var query = BuildQuery(request) + ?.AsNoTracking(); + if (query is null) + return null; + var groupedData = await query + .GroupBy(o => o.IdSubsystem) + .ToListAsync(token); + var statList = CalcStat(groupedData,request); + return statList; + } + + + + private IEnumerable CalcStat(List> groupedData, SubsystemOperationTimeRequest request) { - throw new NotImplementedException(); + var result = new List(); + var periodGroupTotal = groupedData.Sum(g => g.Sum(o=> o.DateEnd.ToUnixTimeSeconds()-o.DateStart.ToUnixTimeSeconds())); + foreach (IEnumerable item in groupedData) + { + var periodGroup = item.Sum(g => g.DateEnd.ToUnixTimeSeconds() - g.DateStart.ToUnixTimeSeconds()); + var periodRequest = item.Where(o => o.DateStart==request.GtDate & o.DateEnd == request.LtDate) + .Sum(o => o.DateEnd.ToUnixTimeSeconds() - o.DateStart.ToUnixTimeSeconds()); + int idSubsystem = item.First().IdSubsystem; + var subsystemStat = new SubsystemStatisticsDto() + { + IdSubsystem = idSubsystem, + Subsystem = subsystemService.GetOrDefault(idSubsystem)?.Name ?? "unknown", + UsedTime = ConvertToTimeSpan(periodGroup), + KUsage = ConvertToTimeSpan(periodGroup / periodRequest), + K2 = ConvertToTimeSpan(periodGroup / periodGroupTotal), + }; + result.Add(subsystemStat); + } + return result; } - - - Task> ISubsystemOperationTimeService.GetStatisticAsync(SubsystemOperationTimeRequest request, CancellationToken token) + private TimeSpan ConvertToTimeSpan(long sec) { - throw new NotImplementedException(); + TimeSpan ts = TimeSpan.FromSeconds(sec); + return ts; } - + private IQueryable? BuildQuery(SubsystemOperationTimeRequest request) + { + var idTelemetry = wellService.GetOrDefault(request.IdWell)?.IdTelemetry; + if (idTelemetry is null) + return null; + + var query = db.SubsystemOperationTimes + .Include(o => o.Subsystem) + .Where(o => o.IdTelemetry == idTelemetry); + + if(request.IdsSubsystems?.Any() == true) + query = query.Where(o => request.IdsSubsystems.Contains(o.IdSubsystem)); + + switch(request.SelectMode) + { + case 0: + case 2: + if (request.GtDate is not null) + query = query.Where(o => o.DateStart >= request.GtDate.Value||o.DateEnd >= request.GtDate.Value); + + if (request.LtDate is not null) + query = query.Where(o => o.DateEnd <= request.LtDate.Value||o.DateStart <= request.LtDate.Value); + break; + + case 1: + if (request.GtDate is not null) + query = query.Where(o => o.DateStart >= request.GtDate.Value); + + if (request.LtDate is not null) + query = query.Where(o => o.DateEnd <= request.LtDate.Value); + break; + + } + + if (request.GtDepth is not null) + query = query.Where(o => o.DepthStart >= request.GtDepth.Value); + + if (request.LtDepth is not null) + query = query.Where(o => o.DepthEnd <= request.LtDepth.Value); + + + if (request?.SortFields?.Any() == true) + { + query = query.SortBy(request.SortFields); + } + else + query = query + .OrderBy(o => o.DateStart) + .ThenBy(o => o.DepthStart); + + if (request?.Skip > 0) + query = query.Skip((int)request.Skip); + + if (request?.Take > 0) + query = query.Take((int)request.Take); + else + query = query.Take(3000); + + return query; + } + + private SubsystemOperationTimeDto Convert(SubsystemOperationTime operationTime) + { + var dto = operationTime.Adapt(); + return dto; + } + + - } } diff --git a/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs b/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs index 91697b30..ccadc673 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs @@ -33,7 +33,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems /// /// получить статистику /// - [HttpGet("statistic")] + [HttpGet("stat")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public async Task GetStatisticsAsync(CancellationToken token = default) { @@ -42,7 +42,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems new SubsystemStatisticsDto(){ IdSubsystem = 1, Subsystem = "test1", - UsedTime = System.DateTime.Now, + UsedTime = System.TimeSpan.MinValue, K2 = System.TimeSpan.MinValue, KUsage = System.TimeSpan.MinValue @@ -50,14 +50,14 @@ namespace AsbCloudWebApi.Controllers.Subsystems new SubsystemStatisticsDto(){ IdSubsystem = 2, Subsystem = "test2", - UsedTime = System.DateTime.Now, + UsedTime = System.TimeSpan.MinValue, K2 = System.TimeSpan.Zero, KUsage = System.TimeSpan.Zero }, new SubsystemStatisticsDto(){ IdSubsystem = 3, Subsystem = "test3", - UsedTime = System.DateTime.Now, + UsedTime = System.TimeSpan.MinValue, K2 = System.TimeSpan.MaxValue, KUsage = System.TimeSpan.MaxValue } @@ -71,7 +71,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems /// [HttpGet("subsystem")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetSubsystemAsync([FromQuery] int? idWell, CancellationToken token = default) + public async Task GetSubsystemAsync([FromQuery] int idWell, CancellationToken token = default) { var result = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token); return Ok(result); From 9f23a45be78636ef059d938d97cdb653138bada4 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Tue, 2 Aug 2022 15:26:33 +0500 Subject: [PATCH 04/21] =?UTF-8?q?#=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BC=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC?= =?UTF-8?q?=20=D0=B8=20=D0=BD=D0=B0=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=BA=20#=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=20Su?= =?UTF-8?q?bsystemOperationTimeService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Subsystems/SubsystemStatisticsDto.cs | 6 +- .../Requests/SubsystemOperationTimeRequest.cs | 8 +- ...tem_and_SubsystemOperationTime.Designer.cs | 6200 +++++++++++++++++ ...le_Subsystem_and_SubsystemOperationTime.cs | 104 + .../AsbCloudDbContextModelSnapshot.cs | 117 + .../Subsystems/SubsystemOperationTime.cs | 2 +- .../SubsystemOperationTimeService.cs | 104 +- ...cs => SubsystemOperationTimeController.cs} | 27 +- 8 files changed, 6493 insertions(+), 75 deletions(-) create mode 100644 AsbCloudDb/Migrations/20220802095637_Add_Table_Subsystem_and_SubsystemOperationTime.Designer.cs create mode 100644 AsbCloudDb/Migrations/20220802095637_Add_Table_Subsystem_and_SubsystemOperationTime.cs rename AsbCloudWebApi/Controllers/Subsystems/{OperatingTimeSubsystemController.cs => SubsystemOperationTimeController.cs} (75%) diff --git a/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs index 38707c72..5f2c7e77 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs @@ -23,14 +23,14 @@ namespace AsbCloudApp.Data.Subsystems /// /// наработка подсистемы /// - public TimeSpan UsedTime { get; set; } + public TimeSpan UsedTimeHours { get; set; } /// /// коэффициент использования /// - public TimeSpan KUsage { get; set; } + public double KUsage { get; set; } /// /// коэффициент применения /// - public TimeSpan K2 { get; set; } + public double K2 { get; set; } } } diff --git a/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs b/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs index 449690a5..2cef174a 100644 --- a/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs +++ b/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs @@ -48,10 +48,16 @@ namespace AsbCloudApp.Requests /// public const int SelectModeOuter = 0; /// - /// + /// информация попадает в выборку, если интервал выборки строго полностью пересекается с запрашиваемым интервалом. /// public const int SelectModeInner = 1; + /// + /// аналогично outer, но интервалы в частично пересекающиеся укорачиваются по границам интервала выборки. + /// public const int SelectModeTrim = 2; + /// + /// Режим выборки элементов + /// public int SelectMode { get; set; } = SelectModeOuter; } #nullable disable diff --git a/AsbCloudDb/Migrations/20220802095637_Add_Table_Subsystem_and_SubsystemOperationTime.Designer.cs b/AsbCloudDb/Migrations/20220802095637_Add_Table_Subsystem_and_SubsystemOperationTime.Designer.cs new file mode 100644 index 00000000..1388f59a --- /dev/null +++ b/AsbCloudDb/Migrations/20220802095637_Add_Table_Subsystem_and_SubsystemOperationTime.Designer.cs @@ -0,0 +1,6200 @@ +// +using System; +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + [DbContext(typeof(AsbCloudDbContext))] + [Migration("20220802095637_Add_Table_Subsystem_and_SubsystemOperationTime")] + partial class Add_Table_Subsystem_and_SubsystemOperationTime + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdDeposit") + .HasColumnType("integer") + .HasColumnName("id_deposit"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.DailyReport", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("start_date") + .HasComment("Дата отчёта"); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Список параметров для отчёта"); + + b.HasKey("IdWell", "StartDate") + .HasName("t_id_well_date_start_pk"); + + b.ToTable("t_daily_report"); + + b.HasComment("Ежедневные отчёты"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.ToTable("t_deposit"); + + b.HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("Дата начала операции"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("Дата начала операции"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина после завершения операции, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина на начало операции, м"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUsersAtStart") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя по телеметрии на момент начала операции"); + + b.Property("Value") + .HasColumnType("double precision") + .HasColumnName("value") + .HasComment("Ключевой показатель операции"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_detected_operation"); + + b.HasComment("автоматически определенные операции по телеметрии"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Имя"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("Отчество"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("Фамилия"); + + b.HasKey("Id"); + + b.ToTable("t_driller"); + + b.HasComment("Бурильщик"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 with 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.DrillingProgramPart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdFileCategory") + .HasColumnType("integer") + .HasColumnName("id_file_category"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("Id"); + + b.HasIndex("IdFileCategory"); + + b.HasIndex("IdWell", "IdFileCategory") + .IsUnique(); + + b.ToTable("t_drilling_program_part"); + + b.HasComment("части программ бурения"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = "toolService" + }, + new + { + Id = 9, + Name = "Буровой подрядчик", + ShortName = "drillService" + }, + new + { + Id = 10, + Name = "Сервис по заканчиванию скважины", + ShortName = "closingService" + }, + new + { + Id = 12, + Name = "Рапорт", + ShortName = "report" + }, + new + { + Id = 1000, + Name = "Программа бурения" + }, + new + { + Id = 1001, + Name = "Задание от геологов" + }, + new + { + Id = 1002, + Name = "Профиль ствола скважины (ННБ)" + }, + new + { + Id = 1003, + Name = "Технологические расчеты (ННБ)" + }, + new + { + Id = 1004, + Name = "Долотная программа" + }, + new + { + Id = 1005, + Name = "Программа по растворам" + }, + new + { + Id = 1006, + Name = "Программа геофизических исследований" + }, + new + { + Id = 1007, + Name = "Планы спусков обсадных колонн" + }, + new + { + Id = 1008, + Name = "Программы цементирования обсадных колонн" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории файла"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Удален ли файл"); + + b.Property("Name") + .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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_created") + .HasComment("Дата совершенного действия"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла"); + + b.Property("IdMarkType") + .HasColumnType("integer") + .HasColumnName("id_mark_type") + .HasComment("0 - отклонен, 1 - согласован"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("id пользователя"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Помечен ли файл как удаленный"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdUser"); + + b.ToTable("t_file_mark"); + + b.HasComment("Действия с файлами."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.OperationValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Старотовая глубина"); + + b.Property("IdOperationCategory") + .HasColumnType("integer") + .HasColumnName("id_operation_category") + .HasComment("Ид категории операции"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Ид скважины"); + + b.Property("StandardValue") + .HasColumnType("double precision") + .HasColumnName("standard_value") + .HasComment("Нормативный показатель"); + + b.Property("TargetValue") + .HasColumnType("double precision") + .HasColumnName("target_value") + .HasComment("Целевой показатель"); + + b.HasKey("Id"); + + b.HasIndex("IdOperationCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_operationvalue"); + + b.HasComment("Целевые/нормативные показатели операции"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission"); + + b.HasComment("Разрешения на доступ к данным"); + + b.HasData( + new + { + Id = 100, + Description = "Разрешение удалять админ. Кусты", + Name = "AdminCluster.delete" + }, + new + { + Id = 101, + Description = "Разрешение редактировать админ. Кусты", + Name = "AdminCluster.edit" + }, + new + { + Id = 102, + Description = "Разрешение просматривать админ. Кусты", + Name = "AdminCluster.get" + }, + new + { + Id = 103, + Description = "Разрешение удалять админ. Компании", + Name = "AdminCompany.delete" + }, + new + { + Id = 104, + Description = "Разрешение редактировать админ. Компании", + Name = "AdminCompany.edit" + }, + new + { + Id = 105, + Description = "Разрешение просматривать админ. Компании", + Name = "AdminCompany.get" + }, + new + { + Id = 106, + Description = "Разрешение удалять админ. Типы компаний", + Name = "AdminCompanyType.delete" + }, + new + { + Id = 107, + Description = "Разрешение редактировать админ. Типы компаний", + Name = "AdminCompanyType.edit" + }, + new + { + Id = 108, + Description = "Разрешение просматривать админ. Типы компаний", + Name = "AdminCompanyType.get" + }, + new + { + Id = 109, + Description = "Разрешение удалять админ. Месторождения", + Name = "AdminDeposit.delete" + }, + new + { + Id = 110, + Description = "Разрешение редактировать админ. Месторождения", + Name = "AdminDeposit.edit" + }, + new + { + Id = 111, + Description = "Разрешение просматривать админ. Месторождения", + Name = "AdminDeposit.get" + }, + new + { + Id = 112, + Description = "Разрешение удалять админ. Разрешения", + Name = "AdminPermission.delete" + }, + new + { + Id = 113, + Description = "Разрешение редактировать админ. Разрешения", + Name = "AdminPermission.edit" + }, + new + { + Id = 114, + Description = "Разрешение просматривать админ. Разрешения", + Name = "AdminPermission.get" + }, + new + { + Id = 115, + Description = "Разрешение удалять админ. Телеметрию", + Name = "AdminTelemetry.delete" + }, + new + { + Id = 116, + Description = "Разрешение редактировать админ. Телеметрию", + Name = "AdminTelemetry.edit" + }, + new + { + Id = 117, + Description = "Разрешение просматривать админ. Телеметрию", + Name = "AdminTelemetry.get" + }, + new + { + Id = 118, + Description = "Разрешение удалять админ. Пользователей", + Name = "AdminUser.delete" + }, + new + { + Id = 119, + Description = "Разрешение редактировать админ. Пользователей", + Name = "AdminUser.edit" + }, + new + { + Id = 120, + Description = "Разрешение просматривать админ. Пользователей", + Name = "AdminUser.get" + }, + new + { + Id = 121, + Description = "Разрешение удалять админ. Роли пользователей", + Name = "AdminUserRole.delete" + }, + new + { + Id = 122, + Description = "Разрешение редактировать админ. Роли пользователей", + Name = "AdminUserRole.edit" + }, + new + { + Id = 123, + Description = "Разрешение просматривать админ. Роли пользователей", + Name = "AdminUserRole.get" + }, + new + { + Id = 124, + Description = "Разрешение удалять админ. Скважины", + Name = "AdminWell.delete" + }, + new + { + Id = 125, + Description = "Разрешение редактировать админ. Скважины", + Name = "AdminWell.edit" + }, + new + { + Id = 126, + Description = "Разрешение просматривать админ. Скважины", + Name = "AdminWell.get" + }, + new + { + Id = 127, + Description = "Разрешение удалять админ. Подсистемы", + Name = "AdminSubsytem.delete" + }, + new + { + Id = 128, + Description = "Разрешение редактировать админ. Подсистемы", + Name = "AdminSubsytem.edit" + }, + new + { + Id = 129, + Description = "Разрешение просматривать админ. Подсистемы", + Name = "AdminSubsytem.get" + }, + new + { + Id = 200, + Description = "Разрешение редактировать 0", + Name = "Auth.edit" + }, + new + { + Id = 201, + Description = "Разрешение просматривать 0", + Name = "Auth.get" + }, + new + { + Id = 202, + Description = "Разрешение просматривать Кусты", + Name = "Cluster.get" + }, + new + { + Id = 203, + Description = "Разрешение просматривать Месторождения", + Name = "Deposit.get" + }, + new + { + Id = 204, + Description = "Разрешение удалять РТК", + Name = "DrillFlowChart.delete" + }, + new + { + Id = 205, + Description = "Разрешение редактировать РТК", + Name = "DrillFlowChart.edit" + }, + new + { + Id = 206, + Description = "Разрешение просматривать РТК", + Name = "DrillFlowChart.get" + }, + new + { + Id = 207, + Description = "Разрешение удалять Программу бурения", + Name = "DrillingProgram.delete" + }, + new + { + Id = 208, + Description = "Разрешение редактировать Программу бурения", + Name = "DrillingProgram.edit" + }, + new + { + Id = 209, + Description = "Разрешение просматривать Программу бурения", + Name = "DrillingProgram.get" + }, + new + { + Id = 210, + Description = "Разрешение удалять Режимы бурения", + Name = "DrillParams.delete" + }, + new + { + Id = 211, + Description = "Разрешение редактировать Режимы бурения", + Name = "DrillParams.edit" + }, + new + { + Id = 212, + Description = "Разрешение просматривать Режимы бурения", + Name = "DrillParams.get" + }, + new + { + Id = 213, + Description = "Разрешение удалять Файлы", + Name = "File.delete" + }, + new + { + Id = 214, + Description = "Разрешение редактировать Файлы", + Name = "File.edit" + }, + new + { + Id = 215, + Description = "Разрешение просматривать Файлы", + Name = "File.get" + }, + new + { + Id = 216, + Description = "Разрешение удалять Измерения", + Name = "Measure.delete" + }, + new + { + Id = 217, + Description = "Разрешение редактировать Измерения", + Name = "Measure.edit" + }, + new + { + Id = 218, + Description = "Разрешение просматривать Измерения", + Name = "Measure.get" + }, + new + { + Id = 219, + Description = "Разрешение просматривать Сообщения телеметрии", + Name = "Message.get" + }, + new + { + Id = 220, + Description = "Разрешение просматривать Статистику по операциям", + Name = "OperationStat.get" + }, + new + { + Id = 221, + Description = "Разрешение редактировать Рапорта", + Name = "Report.edit" + }, + new + { + Id = 222, + Description = "Разрешение просматривать Рапорта", + Name = "Report.get" + }, + new + { + Id = 223, + Description = "Разрешение просматривать админ. Системная статистика", + Name = "RequestTracker.get" + }, + new + { + Id = 224, + Description = "Разрешение удалять Рекомендации уставок", + Name = "Setpoints.delete" + }, + new + { + Id = 225, + Description = "Разрешение редактировать Рекомендации уставок", + Name = "Setpoints.edit" + }, + new + { + Id = 226, + Description = "Разрешение просматривать Рекомендации уставок", + Name = "Setpoints.get" + }, + new + { + Id = 227, + Description = "Разрешение редактировать Телеметрии", + Name = "Telemetry.edit" + }, + new + { + Id = 228, + Description = "Разрешение просматривать Анализ телеметрии", + Name = "TelemetryAnalytics.get" + }, + new + { + Id = 229, + Description = "Разрешение редактировать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.edit" + }, + new + { + Id = 230, + Description = "Разрешение просматривать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.get" + }, + new + { + Id = 231, + Description = "Разрешение редактировать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.edit" + }, + new + { + Id = 232, + Description = "Разрешение просматривать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.get" + }, + new + { + Id = 233, + Description = "Разрешение редактировать Скважины", + Name = "Well.edit" + }, + new + { + Id = 234, + Description = "Разрешение просматривать Скважины", + Name = "Well.get" + }, + new + { + Id = 235, + Description = "Разрешение редактировать Композитные скважины", + Name = "WellComposite.edit" + }, + new + { + Id = 236, + Description = "Разрешение просматривать Композитные скважины", + Name = "WellComposite.get" + }, + new + { + Id = 237, + Description = "Разрешение удалять Операции по скважинам", + Name = "WellOperation.delete" + }, + new + { + Id = 238, + Description = "Разрешение редактировать Операции по скважинам", + Name = "WellOperation.edit" + }, + new + { + Id = 239, + Description = "Разрешение просматривать Операции по скважинам", + Name = "WellOperation.get" + }, + new + { + Id = 240, + Description = "Разрешение редактировать Файлы категории 1 (Растворный сервис)", + Name = "File.edit1" + }, + new + { + Id = 241, + Description = "Разрешение редактировать Файлы категории 2 (Цементирование)", + Name = "File.edit2" + }, + new + { + Id = 242, + Description = "Разрешение редактировать Файлы категории 3 (ННБ)", + Name = "File.edit3" + }, + new + { + Id = 243, + Description = "Разрешение редактировать Файлы категории 4 (ГТИ)", + Name = "File.edit4" + }, + new + { + Id = 244, + Description = "Разрешение редактировать Файлы категории 5 (Документы по скважине)", + Name = "File.edit5" + }, + new + { + Id = 245, + Description = "Разрешение редактировать Файлы категории 6 (Супервайзер)", + Name = "File.edit6" + }, + new + { + Id = 246, + Description = "Разрешение редактировать Файлы категории 7 (Мастер)", + Name = "File.edit7" + }, + new + { + Id = 247, + Description = "Разрешение редактировать Файлы категории 8 (Долотный сервис)", + Name = "File.edit8" + }, + new + { + Id = 248, + Description = "Разрешение редактировать Файлы категории 9 (Буровой подрядчик)", + Name = "File.edit9" + }, + new + { + Id = 249, + Description = "Разрешение редактировать Файлы категории 10 (Сервис по заканчиванию скважины)", + Name = "File.edit10" + }, + new + { + Id = 250, + Description = "Разрешение редактировать Файлы категории 11 (Рапорт)", + Name = "File.edit11" + }, + new + { + Id = 251, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit12" + }, + new + { + Id = 252, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit13" + }, + new + { + Id = 253, + Description = "Разрешение редактировать Файлы категории 13", + Name = "File.edit14" + }, + new + { + Id = 254, + Description = "Разрешение редактировать Файлы категории 14", + Name = "File.edit15" + }, + new + { + Id = 255, + Description = "Разрешение редактировать Файлы категории 15", + Name = "File.edit16" + }, + new + { + Id = 256, + Description = "Разрешение редактировать Файлы категории 16", + Name = "File.edit17" + }, + new + { + Id = 257, + Description = "Разрешение редактировать Файлы категории 17", + Name = "File.edit18" + }, + new + { + Id = 258, + Description = "Разрешение редактировать Файлы категории 18", + Name = "File.edit19" + }, + new + { + Id = 259, + Description = "Разрешение редактировать Файлы категории 19", + Name = "File.edit20" + }, + new + { + Id = 260, + Description = "Разрешение редактировать Файлы категории 20", + Name = "File.edit21" + }, + new + { + Id = 261, + Description = "Разрешение редактировать Файлы категории 21", + Name = "File.edit22" + }, + new + { + Id = 262, + Description = "Разрешение редактировать Файлы категории 22", + Name = "File.edit23" + }, + new + { + Id = 263, + Description = "Разрешение редактировать Файлы категории 23", + Name = "File.edit24" + }, + new + { + Id = 264, + Description = "Разрешение редактировать Файлы категории 24", + Name = "File.edit25" + }, + new + { + Id = 265, + Description = "Разрешение редактировать Файлы категории 25", + Name = "File.edit26" + }, + new + { + Id = 266, + Description = "Разрешение редактировать Файлы категории 26", + Name = "File.edit27" + }, + new + { + Id = 267, + Description = "Разрешение редактировать Файлы категории 27", + Name = "File.edit28" + }, + new + { + Id = 268, + Description = "Разрешение редактировать Файлы категории 28", + Name = "File.edit29" + }, + new + { + Id = 269, + Description = "Разрешение редактировать Файлы категории 29", + Name = "File.edit30" + }, + new + { + Id = 380, + Description = "Разрешение просматривать список бурильщиков", + Name = "Driller.get" + }, + new + { + Id = 381, + Description = "Разрешение редактировать бурильщика", + Name = "Driller.edit" + }, + new + { + Id = 382, + Description = "Разрешение удалять бурильщик", + Name = "Driller.delete" + }, + new + { + Id = 383, + Description = "Разрешение просматривать графики бурильщиков", + Name = "Schedule.get" + }, + new + { + Id = 384, + Description = "Разрешение редактировать график бурильщика", + Name = "Schedule.edit" + }, + new + { + Id = 385, + Description = "Разрешение удалять график бурильщика", + Name = "Schedule.delete" + }, + new + { + Id = 386, + Description = "Разрешение просматривать суточный рапорт", + Name = "DailyReport.get" + }, + new + { + Id = 387, + Description = "Разрешение редактировать суточный рапорт", + Name = "DailyReport.edit" + }, + new + { + Id = 388, + Description = "Разрешение просматривать авто. определенные операции", + Name = "DetectedOperation.get" + }, + new + { + Id = 389, + Description = "Разрешение просматривать целевые значения", + Name = "OperationValue.get" + }, + new + { + Id = 390, + Description = "Разрешение редактировать целевые значения", + Name = "OperationValue.edit" + }, + new + { + Id = 391, + Description = "Разрешение удалять целевые значения", + Name = "OperationValue.delete" + }, + new + { + Id = 400, + Description = "Разрешение просматривать инфо по wits параметрам", + Name = "WitsInfo.get" + }, + new + { + Id = 401, + Description = "Разрешение просматривать WITS record 1", + Name = "WitsRecord1.get" + }, + new + { + Id = 407, + Description = "Разрешение просматривать WITS record 7", + Name = "WitsRecord7.get" + }, + new + { + Id = 408, + Description = "Разрешение просматривать WITS record 8", + Name = "WitsRecord8.get" + }, + new + { + Id = 450, + Description = "Разрешение просматривать WITS record 50", + Name = "WitsRecord50.get" + }, + new + { + Id = 460, + Description = "Разрешение просматривать WITS record 60", + Name = "WitsRecord60.get" + }, + new + { + Id = 461, + Description = "Разрешение просматривать WITS record 61", + Name = "WitsRecord61.get" + }); + }); + + 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.RelationUserDrillingProgramPart", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdDrillingProgramPart") + .HasColumnType("integer") + .HasColumnName("id_drilling_program_part"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_role") + .HasComment("1 - publisher, 2 - approver"); + + b.HasKey("IdUser", "IdDrillingProgramPart") + .HasName("t_relation_user_drilling_program_part_pk"); + + b.HasIndex("IdDrillingProgramPart"); + + b.ToTable("t_relation_user_drilling_program_part"); + + b.HasComment("Отношение пользователей и частей ПБ"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission"); + + b.HasComment("Отношение ролей пользователей и разрешений доступа"); + + b.HasData( + new + { + IdUserRole = 1100, + IdPermission = 102 + }, + new + { + IdUserRole = 1100, + IdPermission = 111 + }, + new + { + IdUserRole = 1101, + IdPermission = 101 + }, + new + { + IdUserRole = 1101, + IdPermission = 100 + }, + new + { + IdUserRole = 1102, + IdPermission = 105 + }, + new + { + IdUserRole = 1102, + IdPermission = 108 + }, + new + { + IdUserRole = 1103, + IdPermission = 104 + }, + new + { + IdUserRole = 1103, + IdPermission = 103 + }, + new + { + IdUserRole = 1104, + IdPermission = 108 + }, + new + { + IdUserRole = 1105, + IdPermission = 107 + }, + new + { + IdUserRole = 1105, + IdPermission = 106 + }, + new + { + IdUserRole = 1106, + IdPermission = 111 + }, + new + { + IdUserRole = 1107, + IdPermission = 110 + }, + new + { + IdUserRole = 1107, + IdPermission = 109 + }, + new + { + IdUserRole = 1108, + IdPermission = 114 + }, + new + { + IdUserRole = 1109, + IdPermission = 113 + }, + new + { + IdUserRole = 1109, + IdPermission = 112 + }, + new + { + IdUserRole = 1110, + IdPermission = 123 + }, + new + { + IdUserRole = 1110, + IdPermission = 114 + }, + new + { + IdUserRole = 1111, + IdPermission = 122 + }, + new + { + IdUserRole = 1111, + IdPermission = 121 + }, + new + { + IdUserRole = 1112, + IdPermission = 117 + }, + new + { + IdUserRole = 1113, + IdPermission = 105 + }, + new + { + IdUserRole = 1113, + IdPermission = 123 + }, + new + { + IdUserRole = 1113, + IdPermission = 120 + }, + new + { + IdUserRole = 1114, + IdPermission = 119 + }, + new + { + IdUserRole = 1114, + IdPermission = 118 + }, + new + { + IdUserRole = 1114, + IdPermission = 200 + }, + new + { + IdUserRole = 1115, + IdPermission = 223 + }, + new + { + IdUserRole = 1116, + IdPermission = 105 + }, + new + { + IdUserRole = 1116, + IdPermission = 102 + }, + new + { + IdUserRole = 1116, + IdPermission = 117 + }, + new + { + IdUserRole = 1116, + IdPermission = 126 + }, + new + { + IdUserRole = 1117, + IdPermission = 125 + }, + new + { + IdUserRole = 1117, + IdPermission = 124 + }, + new + { + IdUserRole = 1200, + IdPermission = 203 + }, + new + { + IdUserRole = 1200, + IdPermission = 230 + }, + new + { + IdUserRole = 1201, + IdPermission = 202 + }, + new + { + IdUserRole = 1201, + IdPermission = 203 + }, + new + { + IdUserRole = 1201, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 203 + }, + new + { + IdUserRole = 1202, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 236 + }, + new + { + IdUserRole = 1202, + IdPermission = 212 + }, + new + { + IdUserRole = 1203, + IdPermission = 235 + }, + new + { + IdUserRole = 1204, + IdPermission = 202 + }, + new + { + IdUserRole = 1204, + IdPermission = 203 + }, + new + { + IdUserRole = 1205, + IdPermission = 215 + }, + new + { + IdUserRole = 1206, + IdPermission = 203 + }, + new + { + IdUserRole = 1206, + IdPermission = 206 + }, + new + { + IdUserRole = 1207, + IdPermission = 205 + }, + new + { + IdUserRole = 1208, + IdPermission = 218 + }, + new + { + IdUserRole = 1209, + IdPermission = 217 + }, + new + { + IdUserRole = 1210, + IdPermission = 203 + }, + new + { + IdUserRole = 1210, + IdPermission = 230 + }, + new + { + IdUserRole = 1210, + IdPermission = 219 + }, + new + { + IdUserRole = 1211, + IdPermission = 203 + }, + new + { + IdUserRole = 1211, + IdPermission = 220 + }, + new + { + IdUserRole = 1211, + IdPermission = 239 + }, + new + { + IdUserRole = 1212, + IdPermission = 238 + }, + new + { + IdUserRole = 1212, + IdPermission = 237 + }, + new + { + IdUserRole = 1213, + IdPermission = 203 + }, + new + { + IdUserRole = 1213, + IdPermission = 239 + }, + new + { + IdUserRole = 1213, + IdPermission = 212 + }, + new + { + IdUserRole = 1214, + IdPermission = 211 + }, + new + { + IdUserRole = 1214, + IdPermission = 210 + }, + new + { + IdUserRole = 1215, + IdPermission = 203 + }, + new + { + IdUserRole = 1215, + IdPermission = 222 + }, + new + { + IdUserRole = 1216, + IdPermission = 221 + }, + new + { + IdUserRole = 1217, + IdPermission = 226 + }, + new + { + IdUserRole = 1218, + IdPermission = 225 + }, + new + { + IdUserRole = 1218, + IdPermission = 224 + }, + new + { + IdUserRole = 1219, + IdPermission = 203 + }, + new + { + IdUserRole = 1219, + IdPermission = 206 + }, + new + { + IdUserRole = 1219, + IdPermission = 230 + }, + new + { + IdUserRole = 1219, + IdPermission = 232 + }, + new + { + IdUserRole = 1220, + IdPermission = 203 + }, + new + { + IdUserRole = 1220, + IdPermission = 228 + }, + new + { + IdUserRole = 1221, + IdPermission = 202 + }, + new + { + IdUserRole = 1221, + IdPermission = 203 + }, + new + { + IdUserRole = 1221, + IdPermission = 220 + }, + new + { + IdUserRole = 1221, + IdPermission = 234 + }, + new + { + IdUserRole = 1501, + IdPermission = 214 + }, + new + { + IdUserRole = 1501, + IdPermission = 213 + }, + new + { + IdUserRole = 1502, + IdPermission = 207 + }, + new + { + IdUserRole = 1502, + IdPermission = 208 + }, + new + { + IdUserRole = 2000, + IdPermission = 205 + }, + new + { + IdUserRole = 2000, + IdPermission = 204 + }, + new + { + IdUserRole = 2000, + IdPermission = 245 + }, + new + { + IdUserRole = 2001, + IdPermission = 244 + }, + new + { + IdUserRole = 2001, + IdPermission = 245 + }, + new + { + IdUserRole = 2002, + IdPermission = 244 + }, + new + { + IdUserRole = 2002, + IdPermission = 246 + }, + new + { + IdUserRole = 2002, + IdPermission = 237 + }, + new + { + IdUserRole = 2002, + IdPermission = 238 + }, + new + { + IdUserRole = 2003, + IdPermission = 240 + }, + new + { + IdUserRole = 2003, + IdPermission = 217 + }, + new + { + IdUserRole = 2003, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 242 + }, + new + { + IdUserRole = 2004, + IdPermission = 217 + }, + new + { + IdUserRole = 2004, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 205 + }, + new + { + IdUserRole = 2004, + IdPermission = 204 + }, + new + { + IdUserRole = 2005, + IdPermission = 247 + }, + new + { + IdUserRole = 2005, + IdPermission = 205 + }, + new + { + IdUserRole = 2005, + IdPermission = 204 + }, + new + { + IdUserRole = 2006, + IdPermission = 243 + }, + new + { + IdUserRole = 2006, + IdPermission = 205 + }, + new + { + IdUserRole = 2006, + IdPermission = 204 + }, + new + { + IdUserRole = 2007, + IdPermission = 241 + }, + new + { + IdUserRole = 2007, + IdPermission = 205 + }, + new + { + IdUserRole = 2007, + IdPermission = 204 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdInclude") + .HasColumnType("integer") + .HasColumnName("id_include_user_role"); + + b.HasKey("Id", "IdInclude") + .HasName("t_relation_user_role_user_role_pk"); + + b.HasIndex("IdInclude"); + + b.ToTable("t_relation_user_role_user_role"); + + b.HasComment("Отношение ролей к ролям"); + + b.HasData( + new + { + Id = 1101, + IdInclude = 1100 + }, + new + { + Id = 1103, + IdInclude = 1102 + }, + new + { + Id = 1105, + IdInclude = 1104 + }, + new + { + Id = 1107, + IdInclude = 1106 + }, + new + { + Id = 1109, + IdInclude = 1108 + }, + new + { + Id = 1111, + IdInclude = 1110 + }, + new + { + Id = 1114, + IdInclude = 1113 + }, + new + { + Id = 1117, + IdInclude = 1116 + }, + new + { + Id = 1203, + IdInclude = 1202 + }, + new + { + Id = 1207, + IdInclude = 1206 + }, + new + { + Id = 1209, + IdInclude = 1208 + }, + new + { + Id = 1212, + IdInclude = 1211 + }, + new + { + Id = 1214, + IdInclude = 1213 + }, + new + { + Id = 1216, + IdInclude = 1215 + }, + new + { + Id = 1218, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1200 + }, + new + { + Id = 2000, + IdInclude = 1201 + }, + new + { + Id = 2000, + IdInclude = 1202 + }, + new + { + Id = 2000, + IdInclude = 1204 + }, + new + { + Id = 2000, + IdInclude = 1205 + }, + new + { + Id = 2000, + IdInclude = 1206 + }, + new + { + Id = 2000, + IdInclude = 1208 + }, + new + { + Id = 2000, + IdInclude = 1210 + }, + new + { + Id = 2000, + IdInclude = 1211 + }, + new + { + Id = 2000, + IdInclude = 1213 + }, + new + { + Id = 2000, + IdInclude = 1215 + }, + new + { + Id = 2000, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1219 + }, + new + { + Id = 2000, + IdInclude = 1220 + }, + new + { + Id = 2000, + IdInclude = 1221 + }, + new + { + Id = 2000, + IdInclude = 1500 + }, + new + { + Id = 2000, + IdInclude = 1501 + }, + new + { + Id = 2000, + IdInclude = 1502 + }, + new + { + Id = 2001, + IdInclude = 1500 + }, + new + { + Id = 2001, + IdInclude = 1501 + }, + new + { + Id = 2001, + IdInclude = 1502 + }, + new + { + Id = 2002, + IdInclude = 1500 + }, + new + { + Id = 2002, + IdInclude = 1501 + }, + new + { + Id = 2002, + IdInclude = 1502 + }, + new + { + Id = 2003, + IdInclude = 1500 + }, + new + { + Id = 2003, + IdInclude = 1501 + }, + new + { + Id = 2003, + IdInclude = 1502 + }, + new + { + Id = 2004, + IdInclude = 1500 + }, + new + { + Id = 2004, + IdInclude = 1501 + }, + new + { + Id = 2004, + IdInclude = 1502 + }, + new + { + Id = 2005, + IdInclude = 1500 + }, + new + { + Id = 2005, + IdInclude = 1501 + }, + new + { + Id = 2005, + IdInclude = 1502 + }, + new + { + Id = 2006, + IdInclude = 1500 + }, + new + { + Id = 2006, + IdInclude = 1501 + }, + new + { + Id = 2006, + IdInclude = 1502 + }, + new + { + Id = 2007, + IdInclude = 1500 + }, + new + { + Id = 2007, + IdInclude = 1501 + }, + new + { + Id = 2007, + IdInclude = 1502 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role"); + + b.HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + IdUser = 1, + IdUserRole = 1 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Begin") + .HasColumnType("timestamp with time zone") + .HasColumnName("begin"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end") + .HasComment("timestamp with time zone"); + + b.Property("Format") + .HasColumnType("integer") + .HasColumnName("format") + .HasComment("Формат отчета"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла-родителя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("Step") + .HasColumnType("integer") + .HasColumnName("step") + .HasComment("размер шага в секундах"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdWell"); + + b.ToTable("t_report_property"); + + b.HasComment("Отчеты с данными по буровым"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DrillEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_end") + .HasComment("Конец вахты"); + + b.Property("DrillStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_start") + .HasComment("Начало вахты"); + + b.Property("IdDriller") + .HasColumnType("integer") + .HasColumnName("id_driller") + .HasComment("Идентификатор бурильщика"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Идентификатор скважины"); + + b.Property("ShiftEnd") + .HasColumnType("time without time zone") + .HasColumnName("shift_end") + .HasComment("Конец смены"); + + b.Property("ShiftStart") + .HasColumnType("time without time zone") + .HasColumnName("shift_start") + .HasComment("Начало смены"); + + b.HasKey("Id"); + + b.HasIndex("IdDriller"); + + b.HasIndex("IdWell"); + + b.ToTable("t_schedule"); + + b.HasComment("График работы бурильщика"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("комментарий для оператора"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("ObsolescenceSec") + .HasColumnType("integer") + .HasColumnName("obsolescence") + .HasComment("сек. до устаревания"); + + b.Property("Setpoints") + .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.Subsystems.Subsystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("t_subsystem"); + + b.HasComment("Описание подсистем"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Subsystems.SubsystemOperationTime", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("дата/время выключения подсистемы"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("дата/время включения подсистемы"); + + b.Property("DepthEnd") + .HasColumnType("real") + .HasColumnName("depth_end") + .HasComment("глубина забоя на момент выключения подсистемы"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depth_start") + .HasComment("глубина забоя на момент включения подсистемы"); + + b.Property("IdSubsystem") + .HasColumnType("integer") + .HasColumnName("id_subsystem"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("ИД телеметрии по которой выдается информация"); + + b.HasKey("Id"); + + b.HasIndex("IdSubsystem"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_subsystem_operation_time"); + + b.HasComment("наработки подсистем"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + b.Property("TimeZone") + .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.TelemetryDataSaub", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("AxialLoad") + .HasColumnType("real") + .HasColumnName("axial_load") + .HasComment("Осевая нагрузка"); + + b.Property("AxialLoadLimitMax") + .HasColumnType("real") + .HasColumnName("axial_load_limit_max") + .HasComment("Осевая нагрузка. Аварийная макс."); + + b.Property("AxialLoadSp") + .HasColumnType("real") + .HasColumnName("axial_load_sp") + .HasComment("Осевая нагрузка. Задание"); + + b.Property("BitDepth") + .HasColumnType("real") + .HasColumnName("bit_depth") + .HasComment("Положение инструмента"); + + b.Property("BlockPosition") + .HasColumnType("real") + .HasColumnName("block_position") + .HasComment("Высота талевого блока"); + + b.Property("BlockPositionMax") + .HasColumnType("real") + .HasColumnName("block_position_max") + .HasComment("Талевый блок. Макс положение"); + + b.Property("BlockPositionMin") + .HasColumnType("real") + .HasColumnName("block_position_min") + .HasComment("Талевый блок. Мин положение"); + + b.Property("BlockSpeed") + .HasColumnType("real") + .HasColumnName("block_speed") + .HasComment("Скорость талевого блока"); + + b.Property("BlockSpeedSp") + .HasColumnType("real") + .HasColumnName("block_speed_sp") + .HasComment("Скорости талевого блока. Задание"); + + b.Property("BlockSpeedSpDevelop") + .HasColumnType("real") + .HasColumnName("block_speed_sp_develop") + .HasComment("Талевый блок. Задание скорости для проработки"); + + b.Property("BlockSpeedSpRotor") + .HasColumnType("real") + .HasColumnName("block_speed_sp_rotor") + .HasComment("Талевый блок. Задание скорости для роторного бурения"); + + b.Property("BlockSpeedSpSlide") + .HasColumnType("real") + .HasColumnName("block_speed_sp_slide") + .HasComment("Талевый блок. Задание скорости для режима слайда"); + + b.Property("Flow") + .HasColumnType("real") + .HasColumnName("flow") + .HasComment("Расход"); + + b.Property("FlowDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("flow_delta_limit_max") + .HasComment("Расход. Аварийный макс."); + + b.Property("FlowIdle") + .HasColumnType("real") + .HasColumnName("flow_idle") + .HasComment("Расход. Холостой ход"); + + b.Property("HookWeight") + .HasColumnType("real") + .HasColumnName("hook_weight") + .HasComment("Вес на крюке"); + + b.Property("HookWeightIdle") + .HasColumnType("real") + .HasColumnName("hook_weight_idle") + .HasComment("Вес на крюке. Холостой ход"); + + b.Property("HookWeightLimitMax") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_max") + .HasComment("Вес на крюке. Затяжка"); + + b.Property("HookWeightLimitMin") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_min") + .HasComment("Вес на крюке. Посадка"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator") + .HasComment("Текущий критерий бурения"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Пользователь САУБ"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Режим САУБ"); + + b.Property("Mse") + .HasColumnType("real") + .HasColumnName("mse") + .HasComment("MSE"); + + b.Property("MseState") + .HasColumnType("smallint") + .HasColumnName("mse_state") + .HasComment("Текущее состояние работы MSE"); + + b.Property("Pressure") + .HasColumnType("real") + .HasColumnName("pressure") + .HasComment("Давление"); + + b.Property("PressureDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("pressure_delta_limit_max") + .HasComment("Давление дифф. Аварийное макс."); + + b.Property("PressureIdle") + .HasColumnType("real") + .HasColumnName("pressure_idle") + .HasComment("Давление. Холостой ход"); + + b.Property("PressureSp") + .HasColumnType("real") + .HasColumnName("pressure_sp") + .HasComment("Давление. Задание"); + + b.Property("PressureSpDevelop") + .HasColumnType("real") + .HasColumnName("pressure_sp_develop") + .HasComment("Давление. Задание для проработки"); + + b.Property("PressureSpRotor") + .HasColumnType("real") + .HasColumnName("pressure_sp_rotor") + .HasComment("Давление. Задание для роторного бурения"); + + b.Property("PressureSpSlide") + .HasColumnType("real") + .HasColumnName("pressure_sp_slide") + .HasComment("Давление. Задание для режима слайда"); + + b.Property("RotorSpeed") + .HasColumnType("real") + .HasColumnName("rotor_speed") + .HasComment("Обороты ротора"); + + b.Property("RotorTorque") + .HasColumnType("real") + .HasColumnName("rotor_torque") + .HasComment("Момент на роторе"); + + b.Property("RotorTorqueIdle") + .HasColumnType("real") + .HasColumnName("rotor_torque_idle") + .HasComment("Момент на роторе. Холостой ход"); + + b.Property("RotorTorqueLimitMax") + .HasColumnType("real") + .HasColumnName("rotor_torque_limit_max") + .HasComment("Момент на роторе. Аварийный макс."); + + b.Property("RotorTorqueSp") + .HasColumnType("real") + .HasColumnName("rotor_torque_sp") + .HasComment("Момент на роторе. Задание"); + + b.Property("WellDepth") + .HasColumnType("real") + .HasColumnName("well_depth") + .HasComment("Глубина забоя"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_data_saub"); + + b.HasComment("набор основных данных по SAUB"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaubStat", b => + { + b.Property("Count") + .HasColumnType("bigint") + .HasColumnName("count_items"); + + b.Property("DateMax") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_max"); + + b.Property("DateMin") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_min"); + + b.Property("DepthMax") + .HasColumnType("real") + .HasColumnName("depth_max"); + + b.Property("DepthMin") + .HasColumnType("real") + .HasColumnName("depth_min"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.ToView("mw_telemetry_datas_saub_stat"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("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", "DateTime"); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arg0") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg0") + .HasComment("Аргумент №0 для вставки в шаблон сообщения"); + + b.Property("Arg1") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg1"); + + b.Property("Arg2") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg2"); + + b.Property("Arg3") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg3"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdTelemetryUser") + .HasColumnType("integer") + .HasColumnName("id_telemetry_user") + .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); + + b.Property("WellDepth") + .HasColumnType("double precision") + .HasColumnName("well_depth"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_message"); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdState") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n100 - удален"); + + 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("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user"); + + b.HasComment("Пользователи облака"); + + b.HasData( + new + { + Id = 1, + IdCompany = 1, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b.HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "root", + IdType = 1 + }, + new + { + Id = 1100, + Caption = "admin_cluster.view", + IdType = 1 + }, + new + { + Id = 1101, + Caption = "admin_cluster.edit", + IdType = 1 + }, + new + { + Id = 1102, + Caption = "admin_company.view", + IdType = 1 + }, + new + { + Id = 1103, + Caption = "admin_company.edit", + IdType = 1 + }, + new + { + Id = 1104, + Caption = "admin_company_type.view", + IdType = 1 + }, + new + { + Id = 1105, + Caption = "admin_company_type.edit", + IdType = 1 + }, + new + { + Id = 1106, + Caption = "admin_deposit.view", + IdType = 1 + }, + new + { + Id = 1107, + Caption = "admin_deposit.edit", + IdType = 1 + }, + new + { + Id = 1108, + Caption = "admin_permission.view", + IdType = 1 + }, + new + { + Id = 1109, + Caption = "admin_permission.edit", + IdType = 1 + }, + new + { + Id = 1110, + Caption = "admin_role.view", + IdType = 1 + }, + new + { + Id = 1111, + Caption = "admin_role.edit", + IdType = 1 + }, + new + { + Id = 1112, + Caption = "admin_telemetry.view", + IdType = 1 + }, + new + { + Id = 1113, + Caption = "admin_user.view", + IdType = 1 + }, + new + { + Id = 1114, + Caption = "admin_user.edit", + IdType = 1 + }, + new + { + Id = 1115, + Caption = "admin_visit_log.view", + IdType = 1 + }, + new + { + Id = 1116, + Caption = "admin_well.view", + IdType = 1 + }, + new + { + Id = 1117, + Caption = "admin_well.edit", + IdType = 1 + }, + new + { + Id = 1200, + Caption = "archive.view", + IdType = 1 + }, + new + { + Id = 1201, + Caption = "cluster.view", + IdType = 1 + }, + new + { + Id = 1202, + Caption = "composite.view", + IdType = 1 + }, + new + { + Id = 1203, + Caption = "composite.edit", + IdType = 1 + }, + new + { + Id = 1204, + Caption = "deposit.view", + IdType = 1 + }, + new + { + Id = 1205, + Caption = "document.view", + IdType = 1 + }, + new + { + Id = 1206, + Caption = "drillProcessFlow.view", + IdType = 1 + }, + new + { + Id = 1207, + Caption = "drillProcessFlow.edit", + IdType = 1 + }, + new + { + Id = 1208, + Caption = "measure.view", + IdType = 1 + }, + new + { + Id = 1209, + Caption = "measure.edit", + IdType = 1 + }, + new + { + Id = 1210, + Caption = "message.view", + IdType = 1 + }, + new + { + Id = 1211, + Caption = "operations.view", + IdType = 1 + }, + new + { + Id = 1212, + Caption = "operations.edit", + IdType = 1 + }, + new + { + Id = 1213, + Caption = "params.view", + IdType = 1 + }, + new + { + Id = 1214, + Caption = "params.edit", + IdType = 1 + }, + new + { + Id = 1215, + Caption = "report.view", + IdType = 1 + }, + new + { + Id = 1216, + Caption = "report.edit", + IdType = 1 + }, + new + { + Id = 1217, + Caption = "setpoints.view", + IdType = 1 + }, + new + { + Id = 1218, + Caption = "setpoints.edit", + IdType = 1 + }, + new + { + Id = 1219, + Caption = "telemetry.view", + IdType = 1 + }, + new + { + Id = 1220, + Caption = "telemetryAnalysis.view", + IdType = 1 + }, + new + { + Id = 1221, + Caption = "well.view", + IdType = 1 + }, + new + { + Id = 1500, + Caption = "Просмотр всего", + IdType = 1 + }, + new + { + Id = 1501, + Caption = "file.edit", + IdType = 1 + }, + new + { + Id = 1502, + Caption = "drillingProgram.edit", + IdType = 1 + }, + new + { + Id = 2000, + Caption = "Заказчик", + IdType = 0 + }, + new + { + Id = 2001, + Caption = "Супервайзер", + IdType = 0 + }, + new + { + Id = 2002, + Caption = "Буровой подрядчик", + IdType = 0 + }, + new + { + Id = 2003, + Caption = "Растворщик", + IdType = 0 + }, + new + { + Id = 2004, + Caption = "Телеметрист", + IdType = 0 + }, + new + { + Id = 2005, + Caption = "Долотный сервис", + IdType = 0 + }, + new + { + Id = 2006, + Caption = "ГТИ", + IdType = 0 + }, + new + { + Id = 2007, + Caption = "Цементирование", + IdType = 0 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("Дата начала операции"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина после завершения операции, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина на начало операции, м"); + + b.Property("DurationHours") + .HasColumnType("double precision") + .HasColumnName("duration_hours") + .HasComment("Продолжительность, часы"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = 18, + Code = 0, + Name = "Проработка перед наращиванием" + }, + new + { + Id = 19, + 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 = 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 = 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 = "Промывка при спуске ОК" + }, + new + { + Id = 1051, + Code = 0, + Name = "Замер ТС" + }, + new + { + Id = 1052, + Code = 0, + Name = "Тех. отстой" + }, + new + { + Id = 1053, + Code = 0, + Name = "Циркуляция и Обработка БР" + }, + new + { + Id = 1054, + Code = 0, + Name = "Срезка ствола" + }, + new + { + Id = 1055, + Code = 0, + Name = "Вспомогательные работы" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.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 = "Хвостовик" + }, + new + { + Id = 7, + Caption = "Пилотный ствол 2" + }, + new + { + Id = 8, + Caption = "Направление 2" + }, + new + { + Id = 9, + Caption = "Кондуктор 2" + }, + new + { + Id = 10, + Caption = "Эксплуатационная колонна 2" + }, + new + { + Id = 11, + Caption = "Транспортный ствол 2" + }, + new + { + Id = 12, + Caption = "Хвостовик 2" + }, + new + { + Id = 13, + Caption = "Пилотный ствол 3" + }, + new + { + Id = 14, + Caption = "Направление 3" + }, + new + { + Id = 15, + Caption = "Кондуктор 3" + }, + new + { + Id = 16, + Caption = "Эксплуатационная колонна 3" + }, + new + { + Id = 17, + Caption = "Транспортный ствол 3" + }, + new + { + Id = 18, + Caption = "Хвостовик 3" + }, + new + { + Id = 19, + Caption = "Пилотный ствол 4" + }, + new + { + Id = 20, + Caption = "Направление 4" + }, + new + { + Id = 21, + Caption = "Кондуктор 4" + }, + new + { + Id = 22, + Caption = "Эксплуатационная колонна 4" + }, + new + { + Id = 23, + Caption = "Транспортный ствол 4" + }, + new + { + Id = 24, + Caption = "Хвостовик 4" + }, + new + { + Id = 25, + Caption = "Пилотный ствол 5" + }, + new + { + Id = 26, + Caption = "Направление 5" + }, + new + { + Id = 27, + Caption = "Кондуктор 5" + }, + new + { + Id = 28, + Caption = "Эксплуатационная колонна 5" + }, + new + { + Id = 29, + Caption = "Транспортный ствол 5" + }, + new + { + Id = 30, + Caption = "Хвостовик 5" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_type"); + + b.HasComment("конструкция скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Наклонно-направленная" + }, + new + { + Id = 2, + Caption = "Горизонтальная" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.RecordBase", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Actcod") + .HasColumnType("smallint") + .HasColumnName("ACTCOD"); + + b.Property("Date") + .HasColumnType("integer") + .HasColumnName("DATE"); + + b.Property("Recid") + .HasColumnType("smallint") + .HasColumnName("RECID"); + + b.Property("Seqid") + .HasColumnType("integer") + .HasColumnName("SEQID"); + + b.Property("Stknum") + .HasColumnType("smallint") + .HasColumnName("STKNUM"); + + b.Property("Time") + .HasColumnType("integer") + .HasColumnName("TIME"); + + b.Property("Wellid") + .HasColumnType("text") + .HasColumnName("WELLID"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("RecordBase"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Blkpos") + .HasColumnType("real") + .HasColumnName("BLKPOS"); + + b.Property("Chkp") + .HasColumnType("real") + .HasColumnName("CHKP"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptretm") + .HasColumnType("real") + .HasColumnName("DEPTRETM"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Gasa") + .HasColumnType("real") + .HasColumnName("GASA"); + + b.Property("Hkla") + .HasColumnType("real") + .HasColumnName("HKLA"); + + b.Property("Hklx") + .HasColumnType("real") + .HasColumnName("HKLX"); + + b.Property("Lagstks") + .HasColumnType("smallint") + .HasColumnName("LAGSTKS"); + + b.Property("Mcia") + .HasColumnType("real") + .HasColumnName("MCIA"); + + b.Property("Mcoa") + .HasColumnType("real") + .HasColumnName("MCOA"); + + b.Property("Mdia") + .HasColumnType("real") + .HasColumnName("MDIA"); + + b.Property("Mdoa") + .HasColumnType("real") + .HasColumnName("MDOA"); + + b.Property("Mfia") + .HasColumnType("real") + .HasColumnName("MFIA"); + + b.Property("Mfoa") + .HasColumnType("real") + .HasColumnName("MFOA"); + + b.Property("Mfop") + .HasColumnType("smallint") + .HasColumnName("MFOP"); + + b.Property("Mtia") + .HasColumnType("real") + .HasColumnName("MTIA"); + + b.Property("Mtoa") + .HasColumnType("real") + .HasColumnName("MTOA"); + + b.Property("Ropa") + .HasColumnType("real") + .HasColumnName("ROPA"); + + b.Property("Rpma") + .HasColumnType("smallint") + .HasColumnName("RPMA"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spm1") + .HasColumnType("smallint") + .HasColumnName("SPM1"); + + b.Property("Spm2") + .HasColumnType("smallint") + .HasColumnName("SPM2"); + + b.Property("Spm3") + .HasColumnType("smallint") + .HasColumnName("SPM3"); + + b.Property("Sppa") + .HasColumnType("real") + .HasColumnName("SPPA"); + + b.Property("Stkc") + .HasColumnType("integer") + .HasColumnName("STKC"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.Property("Torqa") + .HasColumnType("real") + .HasColumnName("TORQA"); + + b.Property("Torqx") + .HasColumnType("real") + .HasColumnName("TORQX"); + + b.Property("Tvolact") + .HasColumnType("real") + .HasColumnName("TVOLACT"); + + b.Property("Tvolcact") + .HasColumnType("real") + .HasColumnName("TVOLCACT"); + + b.Property("Woba") + .HasColumnType("real") + .HasColumnName("WOBA"); + + b.Property("Wobx") + .HasColumnType("real") + .HasColumnName("WOBX"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_1"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("DeptmeasGdpMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_GDP_mc"); + + b.Property("DeptmeasMcrstat") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_MCRSTAT"); + + b.Property("DeptmeasRa33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33_mc"); + + b.Property("DeptmeasRa33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F2_mc"); + + b.Property("DeptmeasRa33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F4_mc"); + + b.Property("DeptmeasRp33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33_mc"); + + b.Property("DeptmeasRp33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F2_mc"); + + b.Property("DeptmeasRp33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F4_mc"); + + b.Property("DeptmeasSlvlMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_SLVL_mc"); + + b.Property("GdpMc") + .HasColumnType("real") + .HasColumnName("GDP_mc"); + + b.Property("Mcrstat") + .HasColumnType("real") + .HasColumnName("MCRSTAT"); + + b.Property("Ra33Mc") + .HasColumnType("real") + .HasColumnName("RA33_mc"); + + b.Property("Ra33f2Mc") + .HasColumnType("real") + .HasColumnName("RA33F2_mc"); + + b.Property("Ra33f4Mc") + .HasColumnType("real") + .HasColumnName("RA33F4_mc"); + + b.Property("Rp33Mc") + .HasColumnType("real") + .HasColumnName("RP33_mc"); + + b.Property("Rp33f2Mc") + .HasColumnType("real") + .HasColumnName("RP33F2_mc"); + + b.Property("Rp33f4Mc") + .HasColumnType("real") + .HasColumnName("RP33F4_mc"); + + b.Property("SlvlMc") + .HasColumnType("real") + .HasColumnName("SLVL_mc"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_50"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Btot") + .HasColumnType("real") + .HasColumnName("Btot"); + + b.Property("Bx") + .HasColumnType("real") + .HasColumnName("Bx"); + + b.Property("By") + .HasColumnType("real") + .HasColumnName("By"); + + b.Property("Bz") + .HasColumnType("real") + .HasColumnName("Bz"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Gtot") + .HasColumnType("real") + .HasColumnName("Gtot"); + + b.Property("Gx") + .HasColumnType("real") + .HasColumnName("Gx"); + + b.Property("Gy") + .HasColumnType("real") + .HasColumnName("Gy"); + + b.Property("Gz") + .HasColumnType("real") + .HasColumnName("Gz"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_60"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Att06h") + .HasColumnType("real") + .HasColumnName("ATT06H"); + + b.Property("Att06l") + .HasColumnType("real") + .HasColumnName("ATT06L"); + + b.Property("Att10h") + .HasColumnType("real") + .HasColumnName("ATT10H"); + + b.Property("Att10l") + .HasColumnType("real") + .HasColumnName("ATT10L"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Phl1f1") + .HasColumnType("real") + .HasColumnName("PHL1F1"); + + b.Property("Phl1f2") + .HasColumnType("real") + .HasColumnName("PHL1F2"); + + b.Property("Phl2f1") + .HasColumnType("real") + .HasColumnName("PHL2F1"); + + b.Property("Phl2f2") + .HasColumnType("real") + .HasColumnName("PHL2F2"); + + b.Property("Status") + .HasColumnType("real") + .HasColumnName("Status"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_61"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptsvym") + .HasColumnType("real") + .HasColumnName("DEPTSVYM"); + + b.Property("Deptsvyv") + .HasColumnType("real") + .HasColumnName("DEPTSVYV"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Svyazc") + .HasColumnType("real") + .HasColumnName("SVYAZC"); + + b.Property("Svyazu") + .HasColumnType("real") + .HasColumnName("SVYAZU"); + + b.Property("Svydls") + .HasColumnType("real") + .HasColumnName("SVYDLS"); + + b.Property("Svyew") + .HasColumnType("real") + .HasColumnName("SVYEW"); + + b.Property("Svygtf") + .HasColumnType("real") + .HasColumnName("SVYGTF"); + + b.Property("Svyinc") + .HasColumnType("real") + .HasColumnName("SVYINC"); + + b.Property("Svymtf") + .HasColumnType("real") + .HasColumnName("SVYMTF"); + + b.Property("Svyns") + .HasColumnType("real") + .HasColumnName("SVYNS"); + + b.Property("Svytype") + .HasColumnType("text") + .HasColumnName("SVYTYPE"); + + b.Property("Svywalk") + .HasColumnType("real") + .HasColumnName("SVYWALK"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_7"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptcalm") + .HasColumnType("real") + .HasColumnName("DEPTCALM"); + + b.Property("Deptcalv") + .HasColumnType("real") + .HasColumnName("DEPTCALV"); + + b.Property("Deptfdm") + .HasColumnType("real") + .HasColumnName("DEPTFDM"); + + b.Property("Deptfdv") + .HasColumnType("real") + .HasColumnName("DEPTFDV"); + + b.Property("Deptgr1m") + .HasColumnType("real") + .HasColumnName("DEPTGR1M"); + + b.Property("Deptgr1v") + .HasColumnType("real") + .HasColumnName("DEPTGR1V"); + + b.Property("Deptgr2m") + .HasColumnType("real") + .HasColumnName("DEPTGR2M"); + + b.Property("Deptgr2v") + .HasColumnType("real") + .HasColumnName("DEPTGR2V"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptp1m") + .HasColumnType("real") + .HasColumnName("DEPTP1M"); + + b.Property("Deptp1v") + .HasColumnType("real") + .HasColumnName("DEPTP1V"); + + b.Property("Deptp2m") + .HasColumnType("real") + .HasColumnName("DEPTP2M"); + + b.Property("Deptp2v") + .HasColumnType("real") + .HasColumnName("DEPTP2V"); + + b.Property("Deptrs1m") + .HasColumnType("real") + .HasColumnName("DEPTRS1M"); + + b.Property("Deptrs1v") + .HasColumnType("real") + .HasColumnName("DEPTRS1V"); + + b.Property("Deptrs2m") + .HasColumnType("real") + .HasColumnName("DEPTRS2M"); + + b.Property("Deptrs2v") + .HasColumnType("real") + .HasColumnName("DEPTRS2V"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Mclp") + .HasColumnType("real") + .HasColumnName("MCLP"); + + b.Property("Mfd") + .HasColumnType("real") + .HasColumnName("MFD"); + + b.Property("Mffp") + .HasColumnType("real") + .HasColumnName("MFFP"); + + b.Property("Mfpp") + .HasColumnType("real") + .HasColumnName("MFPP"); + + b.Property("Mfrann") + .HasColumnType("real") + .HasColumnName("MFRANN"); + + b.Property("Mfrpipe") + .HasColumnType("real") + .HasColumnName("MFRPIPE"); + + b.Property("Mftann") + .HasColumnType("real") + .HasColumnName("MFTANN"); + + b.Property("Mftpipe") + .HasColumnType("real") + .HasColumnName("MFTPIPE"); + + b.Property("Mg1") + .HasColumnType("real") + .HasColumnName("MG1"); + + b.Property("Mg1c") + .HasColumnType("real") + .HasColumnName("MG1C"); + + b.Property("Mg2") + .HasColumnType("real") + .HasColumnName("MG2"); + + b.Property("Mg2c") + .HasColumnType("real") + .HasColumnName("MG2C"); + + b.Property("Mpo1") + .HasColumnType("real") + .HasColumnName("MPO1"); + + b.Property("Mpo2") + .HasColumnType("real") + .HasColumnName("MPO2"); + + b.Property("Mr1") + .HasColumnType("real") + .HasColumnName("MR1"); + + b.Property("Mr1c") + .HasColumnType("real") + .HasColumnName("MR1C"); + + b.Property("Mr2") + .HasColumnType("real") + .HasColumnName("MR2"); + + b.Property("Mr2c") + .HasColumnType("real") + .HasColumnName("MR2C"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spare6") + .HasColumnType("real") + .HasColumnName("SPARE6"); + + b.Property("Spare7") + .HasColumnType("real") + .HasColumnName("SPARE7"); + + b.Property("Spare8") + .HasColumnType("real") + .HasColumnName("SPARE8"); + + b.Property("Spare9") + .HasColumnType("real") + .HasColumnName("SPARE9"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_8"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.HasOne("AsbCloudDb.Model.Deposit", "Deposit") + .WithMany("Clusters") + .HasForeignKey("IdDeposit") + .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.DailyReport", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdFileCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("DrillingProgramParts") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_drill_params_t_well_section_type_id_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_file_mark_t_file_info_fk"); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_user_t_file_mark_fk"); + + b.Navigation("FileInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.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.OperationValue", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdOperationCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_company_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_well_id_fk"); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.DrillingProgramPart", "DrillingProgramPart") + .WithMany("RelatedUsers") + .HasForeignKey("IdDrillingProgramPart") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DrillingProgramPart"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.HasOne("AsbCloudDb.Model.Permission", "Permission") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.HasOne("AsbCloudDb.Model.UserRole", "Role") + .WithMany("RelationUserRoleUserRoles") + .HasForeignKey("Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "IncludeRole") + .WithMany() + .HasForeignKey("IdInclude") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IncludeRole"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.HasOne("AsbCloudDb.Model.FileInfo", "File") + .WithMany() + .HasForeignKey("IdFile") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("File"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => + { + b.HasOne("AsbCloudDb.Model.Driller", "Driller") + .WithMany("Schedule") + .HasForeignKey("IdDriller") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_schedule_t_driller_id_driller"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Driller"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Subsystems.SubsystemOperationTime", b => + { + b.HasOne("AsbCloudDb.Model.Subsystems.Subsystem", "Subsystem") + .WithMany("SubsystemOperationTimes") + .HasForeignKey("IdSubsystem") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Subsystem"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_event_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_messages_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_user_t_company_id_fk"); + + b.Navigation("Company"); + }); + + 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") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_well_t_telemetry_id_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_src_t_well_id_fk"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + + b.Navigation("WellSrc"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.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.WITS.Record1", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record1", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record50", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record60", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record61", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record7", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record8", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Navigation("Wells"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => + { + b.Navigation("Companies"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Navigation("Clusters"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Navigation("RelatedUsers"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Navigation("FileMarks"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Navigation("Measures"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Navigation("RelationUserRolePermissions"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Subsystems.Subsystem", b => + { + b.Navigation("SubsystemOperationTimes"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Navigation("DataSaub"); + + b.Navigation("DataSpin"); + + b.Navigation("Events"); + + b.Navigation("Messages"); + + b.Navigation("Users"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Navigation("FileMarks"); + + b.Navigation("Files"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("RelationUserRolePermissions"); + + b.Navigation("RelationUserRoleUserRoles"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("DrillingProgramParts"); + + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellComposites"); + + b.Navigation("WellOperations"); + }); + + 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/20220802095637_Add_Table_Subsystem_and_SubsystemOperationTime.cs b/AsbCloudDb/Migrations/20220802095637_Add_Table_Subsystem_and_SubsystemOperationTime.cs new file mode 100644 index 00000000..36eb3890 --- /dev/null +++ b/AsbCloudDb/Migrations/20220802095637_Add_Table_Subsystem_and_SubsystemOperationTime.cs @@ -0,0 +1,104 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class Add_Table_Subsystem_and_SubsystemOperationTime : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "t_subsystem", + columns: table => new + { + id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + name = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), + description = table.Column(type: "character varying(255)", maxLength: 255, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_t_subsystem", x => x.id); + }, + comment: "Описание подсистем"); + + migrationBuilder.CreateTable( + name: "t_subsystem_operation_time", + columns: table => new + { + id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + id_telemetry = table.Column(type: "integer", nullable: false, comment: "ИД телеметрии по которой выдается информация"), + id_subsystem = table.Column(type: "integer", nullable: false), + date_start = table.Column(type: "timestamp with time zone", nullable: false, comment: "дата/время включения подсистемы"), + date_end = table.Column(type: "timestamp with time zone", nullable: false, comment: "дата/время выключения подсистемы"), + depth_start = table.Column(type: "real", nullable: true, comment: "глубина забоя на момент включения подсистемы"), + depth_end = table.Column(type: "real", nullable: true, comment: "глубина забоя на момент выключения подсистемы") + }, + constraints: table => + { + table.PrimaryKey("PK_t_subsystem_operation_time", x => x.id); + table.ForeignKey( + name: "FK_t_subsystem_operation_time_t_subsystem_id_subsystem", + column: x => x.id_subsystem, + principalTable: "t_subsystem", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_t_subsystem_operation_time_t_telemetry_id_telemetry", + column: x => x.id_telemetry, + principalTable: "t_telemetry", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }, + comment: "наработки подсистем"); + + migrationBuilder.InsertData( + table: "t_permission", + columns: new[] { "id", "description", "name" }, + values: new object[,] + { + { 127, "Разрешение удалять админ. Подсистемы", "AdminSubsytem.delete" }, + { 128, "Разрешение редактировать админ. Подсистемы", "AdminSubsytem.edit" }, + { 129, "Разрешение просматривать админ. Подсистемы", "AdminSubsytem.get" } + }); + + migrationBuilder.CreateIndex( + name: "IX_t_subsystem_operation_time_id_subsystem", + table: "t_subsystem_operation_time", + column: "id_subsystem"); + + migrationBuilder.CreateIndex( + name: "IX_t_subsystem_operation_time_id_telemetry", + table: "t_subsystem_operation_time", + column: "id_telemetry"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "t_subsystem_operation_time"); + + migrationBuilder.DropTable( + name: "t_subsystem"); + + migrationBuilder.DeleteData( + table: "t_permission", + keyColumn: "id", + keyValue: 127); + + migrationBuilder.DeleteData( + table: "t_permission", + keyColumn: "id", + keyValue: 128); + + migrationBuilder.DeleteData( + table: "t_permission", + keyColumn: "id", + keyValue: 129); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 93a2a636..66f943a8 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -1114,6 +1114,24 @@ namespace AsbCloudDb.Migrations Name = "AdminWell.get" }, new + { + Id = 127, + Description = "Разрешение удалять админ. Подсистемы", + Name = "AdminSubsytem.delete" + }, + new + { + Id = 128, + Description = "Разрешение редактировать админ. Подсистемы", + Name = "AdminSubsytem.edit" + }, + new + { + Id = 129, + Description = "Разрешение просматривать админ. Подсистемы", + Name = "AdminSubsytem.get" + }, + new { Id = 200, Description = "Разрешение редактировать 0", @@ -2746,6 +2764,81 @@ namespace AsbCloudDb.Migrations b.HasComment("Запросы на изменение уставок панели оператора"); }); + modelBuilder.Entity("AsbCloudDb.Model.Subsystems.Subsystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("t_subsystem"); + + b.HasComment("Описание подсистем"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Subsystems.SubsystemOperationTime", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("дата/время выключения подсистемы"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("дата/время включения подсистемы"); + + b.Property("DepthEnd") + .HasColumnType("real") + .HasColumnName("depth_end") + .HasComment("глубина забоя на момент выключения подсистемы"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depth_start") + .HasComment("глубина забоя на момент включения подсистемы"); + + b.Property("IdSubsystem") + .HasColumnType("integer") + .HasColumnName("id_subsystem"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("ИД телеметрии по которой выдается информация"); + + b.HasKey("Id"); + + b.HasIndex("IdSubsystem"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_subsystem_operation_time"); + + b.HasComment("наработки подсистем"); + }); + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => { b.Property("Id") @@ -5727,6 +5820,25 @@ namespace AsbCloudDb.Migrations b.Navigation("Well"); }); + modelBuilder.Entity("AsbCloudDb.Model.Subsystems.SubsystemOperationTime", b => + { + b.HasOne("AsbCloudDb.Model.Subsystems.Subsystem", "Subsystem") + .WithMany("SubsystemOperationTimes") + .HasForeignKey("IdSubsystem") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Subsystem"); + + b.Navigation("Telemetry"); + }); + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => { b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") @@ -6016,6 +6128,11 @@ namespace AsbCloudDb.Migrations b.Navigation("RelationUserRolePermissions"); }); + modelBuilder.Entity("AsbCloudDb.Model.Subsystems.Subsystem", b => + { + b.Navigation("SubsystemOperationTimes"); + }); + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => { b.Navigation("DataSaub"); diff --git a/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs b/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs index 28a02365..e8b0c35b 100644 --- a/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs +++ b/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs @@ -19,7 +19,7 @@ namespace AsbCloudDb.Model.Subsystems [Column("id_subsystem")] public int IdSubsystem { get; set; } - [Column("date_end"), Comment("дата/время включения подсистемы")] + [Column("date_start"), Comment("дата/время включения подсистемы")] public DateTimeOffset DateStart { get; set; } [Column("date_end"), Comment("дата/время выключения подсистемы")] public DateTimeOffset DateEnd { get; set; } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 48991852..fb39fded 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -15,6 +15,7 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.Subsystems { +#nullable enable internal class SubsystemOperationTimeService : ISubsystemOperationTimeService { @@ -61,63 +62,86 @@ namespace AsbCloudInfrastructure.Services.Subsystems } public async Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token) - { - + { var query = BuildQuery(request) .AsNoTracking(); if (query is null) return null; - var data = await query.ToListAsync(token); + + var data = await query.ToListAsync(token); + + if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeInner) + { + if (request.GtDate is not null) + query = query.Where(o => o.DateStart >= request.GtDate.Value || o.DateEnd >= request.GtDate.Value); + + if (request.LtDate is not null) + query = query.Where(o => o.DateEnd <= request.LtDate.Value || o.DateStart <= request.LtDate.Value); + } + if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeTrim) + { + var begin = request.GtDate ?? throw new ArgumentNullException(nameof(request.GtDate)); + var end = request.GtDate ?? throw new ArgumentNullException(nameof(request.LtDate)); + data = Trim(data, begin,end ); + } var dtos = data.Select(o => Convert(o)); - return dtos; } public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token) - { - var query = BuildQuery(request) - ?.AsNoTracking(); - if (query is null) - return null; - var groupedData = await query - .GroupBy(o => o.IdSubsystem) - .ToListAsync(token); - var statList = CalcStat(groupedData,request); + { + var data = await GetOperationTimeAsync(request, token); + var statList = CalcStat(data, request); return statList; } - + private List Trim(List data, DateTime gtDate, DateTime ltDate) + { + var itemsToTrim = data.Where(q => true) + .Select(o => new SubsystemOperationTime + { + Id = o.Id, + DateStart = gtDate < o.DateStart ? gtDate : o.DateStart, + DateEnd = ltDate > o.DateEnd ? ltDate : o.DateEnd, + IdSubsystem = o.IdSubsystem, + IdTelemetry = o.IdTelemetry, + DepthEnd = o.DepthEnd, + DepthStart = o.DepthStart, + Subsystem = o.Subsystem, + Telemetry = o.Telemetry + }) + .ToList(); + return itemsToTrim; + } - private IEnumerable CalcStat(List> groupedData, SubsystemOperationTimeRequest request) + private IEnumerable CalcStat(IEnumerable groupedData, SubsystemOperationTimeRequest request) { var result = new List(); - var periodGroupTotal = groupedData.Sum(g => g.Sum(o=> o.DateEnd.ToUnixTimeSeconds()-o.DateStart.ToUnixTimeSeconds())); + var periodGroupTotal = groupedData + .GroupBy(x => x.IdSubsystem) + .Sum(g => g.Sum(o=> (o.DateEnd - o.DateStart).TotalHours)); foreach (IEnumerable item in groupedData) { - var periodGroup = item.Sum(g => g.DateEnd.ToUnixTimeSeconds() - g.DateStart.ToUnixTimeSeconds()); + + var periodGroup = item.Sum(g => (g.DateEnd - g.DateStart).TotalHours); var periodRequest = item.Where(o => o.DateStart==request.GtDate & o.DateEnd == request.LtDate) - .Sum(o => o.DateEnd.ToUnixTimeSeconds() - o.DateStart.ToUnixTimeSeconds()); + .Sum(o => (o.DateEnd - o.DateStart).TotalHours); int idSubsystem = item.First().IdSubsystem; var subsystemStat = new SubsystemStatisticsDto() { IdSubsystem = idSubsystem, Subsystem = subsystemService.GetOrDefault(idSubsystem)?.Name ?? "unknown", - UsedTime = ConvertToTimeSpan(periodGroup), - KUsage = ConvertToTimeSpan(periodGroup / periodRequest), - K2 = ConvertToTimeSpan(periodGroup / periodGroupTotal), + UsedTimeHours = TimeSpan.FromHours(periodGroup), + KUsage = 1d*periodGroup / periodRequest, + K2 = 1d*periodGroup / periodGroupTotal, }; result.Add(subsystemStat); } return result; } - - private TimeSpan ConvertToTimeSpan(long sec) - { - TimeSpan ts = TimeSpan.FromSeconds(sec); - return ts; - } + private IQueryable? BuildQuery(SubsystemOperationTimeRequest request) { @@ -132,26 +156,13 @@ namespace AsbCloudInfrastructure.Services.Subsystems if(request.IdsSubsystems?.Any() == true) query = query.Where(o => request.IdsSubsystems.Contains(o.IdSubsystem)); - switch(request.SelectMode) - { - case 0: - case 2: - if (request.GtDate is not null) - query = query.Where(o => o.DateStart >= request.GtDate.Value||o.DateEnd >= request.GtDate.Value); + + if (request.GtDate is not null) + query = query.Where(o => o.DateStart >= request.GtDate.Value); - if (request.LtDate is not null) - query = query.Where(o => o.DateEnd <= request.LtDate.Value||o.DateStart <= request.LtDate.Value); - break; - - case 1: - if (request.GtDate is not null) - query = query.Where(o => o.DateStart >= request.GtDate.Value); - - if (request.LtDate is not null) - query = query.Where(o => o.DateEnd <= request.LtDate.Value); - break; - - } + if (request.LtDate is not null) + query = query.Where(o => o.DateEnd <= request.LtDate.Value); + if (request.GtDepth is not null) query = query.Where(o => o.DepthStart >= request.GtDepth.Value); @@ -189,4 +200,5 @@ namespace AsbCloudInfrastructure.Services.Subsystems } +#nullable disable } diff --git a/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs similarity index 75% rename from AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs rename to AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index ccadc673..b10b21d2 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/OperatingTimeSubsystemController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -20,12 +20,12 @@ namespace AsbCloudWebApi.Controllers.Subsystems [ApiController] [Authorize] - public class OperatingTimeSubsystemController : ControllerBase + public class SubsystemOperationTimeController : ControllerBase { private readonly ISubsystemOperationTimeService subsystemOperationTimeService; private readonly IWellService wellService; - public OperatingTimeSubsystemController(ISubsystemOperationTimeService subsystemOperationTimeService, IWellService wellService) + public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService, IWellService wellService) { this.subsystemOperationTimeService = subsystemOperationTimeService; this.wellService = wellService; @@ -39,28 +39,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems { var subsystemResult = new List() { - new SubsystemStatisticsDto(){ - IdSubsystem = 1, - Subsystem = "test1", - UsedTime = System.TimeSpan.MinValue, - K2 = System.TimeSpan.MinValue, - KUsage = System.TimeSpan.MinValue - - }, - new SubsystemStatisticsDto(){ - IdSubsystem = 2, - Subsystem = "test2", - UsedTime = System.TimeSpan.MinValue, - K2 = System.TimeSpan.Zero, - KUsage = System.TimeSpan.Zero - }, - new SubsystemStatisticsDto(){ - IdSubsystem = 3, - Subsystem = "test3", - UsedTime = System.TimeSpan.MinValue, - K2 = System.TimeSpan.MaxValue, - KUsage = System.TimeSpan.MaxValue - } + }; return Ok(subsystemResult); From 2c4d6a9a536ff537bc8c540c3e00b947f05b2430 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 3 Aug 2022 16:35:21 +0500 Subject: [PATCH 05/21] =?UTF-8?q?=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=84=D0=BE=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=20=D0=BD=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BE=D0=BA=20=D0=B4=D0=BE=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=BD=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D0=BB=D0=B5=D1=80=20=D0=BD=D0=B0=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BE=D0=BA=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B8=20=D0=94=D0=A2=D0=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...emStatisticsDto.cs => SubsystemStatDto.cs} | 2 +- .../ISubsystemOperationTimeService.cs | 2 +- AsbCloudInfrastructure/DependencyInjection.cs | 6 +- ...SubsystemOperationTimeBackgroundService.cs | 129 +++++++++--------- .../SubsystemOperationTimeService.cs | 8 +- .../SubsystemOperationTimeController.cs | 31 ++--- 6 files changed, 89 insertions(+), 89 deletions(-) rename AsbCloudApp/Data/Subsystems/{SubsystemStatisticsDto.cs => SubsystemStatDto.cs} (96%) diff --git a/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs similarity index 96% rename from AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs rename to AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs index 5f2c7e77..4ef6d98d 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemStatisticsDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs @@ -9,7 +9,7 @@ namespace AsbCloudApp.Data.Subsystems /// /// Статистика подсистемы /// - public class SubsystemStatisticsDto + public class SubsystemStatDto { /// diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs index f6ff4b0e..d03f8114 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -12,7 +12,7 @@ namespace AsbCloudApp.Services.Subsystems public interface ISubsystemOperationTimeService { Task> GetSubsystemAsync(int idWell, CancellationToken token); - Task> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token); + Task> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token); Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token); Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 3e98c630..b7a3cd8e 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -2,6 +2,7 @@ using AsbCloudApp.Data.SAUB; using AsbCloudApp.Data.Subsystems; using AsbCloudApp.Services; +using AsbCloudApp.Services.Subsystems; using AsbCloudDb.Model; using AsbCloudDb.Model.Subsystems; using AsbCloudInfrastructure.Repository; @@ -87,7 +88,7 @@ namespace AsbCloudInfrastructure services.AddScoped(); services.AddHostedService(); - //services.AddHostedService(); + services.AddHostedService(); services.AddSingleton(new WitsInfoService()); services.AddSingleton(new CacheDb()); services.AddSingleton(new InstantDataRepository()); @@ -118,10 +119,11 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + //services.AddTransient(); // admin crud services: services.AddTransient, CrudServiceBase>(s => diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index ae97e8b7..809f63eb 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -87,11 +87,17 @@ namespace AsbCloudInfrastructure.Services.Subsystems foreach (var item in JounedlastDetectedDates) { var stopwatch = Stopwatch.StartNew(); - var newOperations = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); + var newOperationsSaub = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); + var newOperationsSpin = await OperationTimeSpinAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); stopwatch.Stop(); - if (newOperations.Any()) + if (newOperationsSaub.Any()) { - db.SubsystemOperationTimes.AddRange(newOperations); + db.SubsystemOperationTimes.AddRange(newOperationsSaub); + affected += await db.SaveChangesAsync(token); + } + if (newOperationsSpin.Any()) + { + db.SubsystemOperationTimes.AddRange(newOperationsSpin); affected += await db.SaveChangesAsync(token); } } @@ -109,19 +115,18 @@ namespace AsbCloudInfrastructure.Services.Subsystems Mode = d.Mode, Depth = d.WellDepth }) - .OrderBy(d => d.DateTime); + .OrderBy(d => d.DateTime); var take = 4 * 86_400; // 4 дня - var startDate = begin; - var resultSubsystemOperationTime = new List(); + var startDate = begin; var firstItem = query.FirstOrDefault(); if (firstItem is null) return null; short? mode = firstItem.Mode; DateTimeOffset dateBegin = firstItem.DateTime; float? depthStart = firstItem.Depth; - while (true) - { + var resultSubsystemOperationTime = new List(); + var data = await query .Where(d => d.DateTime > startDate) .Take(take) @@ -134,6 +139,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems { IdTelemetry = idTelemetry, DateStart = dateBegin, + IdSubsystem = (int)data[i - 1].Mode, DateEnd = data[i - 1].DateTime, DepthStart = depthStart, DepthEnd = data[i - 1].Depth @@ -146,67 +152,64 @@ namespace AsbCloudInfrastructure.Services.Subsystems } } startDate = data.Last().DateTime; - } + return resultSubsystemOperationTime; } - //private static async Task> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) - //{ - // var query = db.TelemetryDataSpin - // .AsNoTracking() - // .Where(d => d.IdTelemetry == idTelemetry) - // .Select(d => new OperationTimeData - // { - // DateTime = d.DateTime, - // Mode = d.Mode - // // Depth = d.d - // }) - // .OrderBy(d => d.DateTime); - // var take = 4 * 86_400; // 4 дня - // var startDate = begin; - // var operationTime = new List(); - // const int minOperationLength = 5; - // const int maxDetectorsInterpolationFrameLength = 30; - // const int gap = maxDetectorsInterpolationFrameLength + minOperationLength; + private static async Task> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) + { + var query = db.TelemetryDataSpin + .AsNoTracking() + .Where(d => d.IdTelemetry == idTelemetry) + .Select(d => new OperationTimeData + { + DateTime = d.DateTime, + Mode = d.Mode, + Depth = db.TelemetryDataSaub.Where(t => t.DateTime == d.DateTime & t.IdTelemetry ==idTelemetry) + .GroupBy(t => t.IdTelemetry) + .Select(group => group.Min(t => t.WellDepth)) + .FirstOrDefault() + }) + .OrderBy(d => d.DateTime); - // while (true) - // { - // var data = await query - // .Where(d => d.DateTime > startDate) - // .Take(take) - // .ToArrayAsync(token); + var take = 4 * 86_400; // 4 дня + var startDate = begin; + var firstItem = query.FirstOrDefault(); + if (firstItem is null) + return null; + short? mode = firstItem.Mode; + DateTimeOffset dateBegin = firstItem.DateTime; + float? depthStart = firstItem.Depth; + var resultSubsystemOperationTime = new List(); + var data = await query + .Where(d => d.DateTime > startDate) + .Take(take) + .ToArrayAsync(token); + + for (int i = 1; i <= data.Length; i++) + { + if (data[i].Mode != mode) + { + var operationTimeItem = new SubsystemOperationTime() + { + IdTelemetry = idTelemetry, + DateStart = dateBegin, + IdSubsystem = (int)data[i - 1].Mode, + DateEnd = data[i - 1].DateTime, + DepthStart = depthStart, + DepthEnd = data[i - 1].Depth - // if (data.Length < gap) - // break; + }; + resultSubsystemOperationTime.Add(operationTimeItem); + mode = data[i].Mode; + dateBegin = data[i].DateTime; + depthStart = data[i].Depth; + } + } + startDate = data.Last().DateTime; - // short? modeCount = data[0].Mode; - // DateTimeOffset dateBegin = data[0].DateTime; - // float? depthStart = data[0].Depth; - // for (int i = 1; i <= data.Length; i++) - // { - // if (data[i].Mode != modeCount) - // { - // var operationTimeItem = new SubsystemOperationTime() - // { - // IdTelemetry = idTelemetry, - // DateStart = dateBegin, - // DateEnd = data[i - 1].DateTime, - // DepthStart = depthStart, - // DepthEnd = data[i - 1].Depth - - // }; - // operationTime.Add(operationTimeItem); - // modeCount = data[i].Mode; - // dateBegin = data[i].DateTime; - // depthStart = data[i].Depth; - // } - // } - // } - // var depths = db.TelemetryDataSaub.Where(t => true/*by date*/) - // .GroupBy(t => t.IdTelemetry) - // .Select(group => group.Min(t => t.WellDepth)); - // return operationTime; - //} + return resultSubsystemOperationTime; + } } } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index fb39fded..5e37104c 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -90,7 +90,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems - public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token) + public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token) { var data = await GetOperationTimeAsync(request, token); var statList = CalcStat(data, request); @@ -116,9 +116,9 @@ namespace AsbCloudInfrastructure.Services.Subsystems return itemsToTrim; } - private IEnumerable CalcStat(IEnumerable groupedData, SubsystemOperationTimeRequest request) + private IEnumerable CalcStat(IEnumerable groupedData, SubsystemOperationTimeRequest request) { - var result = new List(); + var result = new List(); var periodGroupTotal = groupedData .GroupBy(x => x.IdSubsystem) .Sum(g => g.Sum(o=> (o.DateEnd - o.DateStart).TotalHours)); @@ -129,7 +129,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems var periodRequest = item.Where(o => o.DateStart==request.GtDate & o.DateEnd == request.LtDate) .Sum(o => (o.DateEnd - o.DateStart).TotalHours); int idSubsystem = item.First().IdSubsystem; - var subsystemStat = new SubsystemStatisticsDto() + var subsystemStat = new SubsystemStatDto() { IdSubsystem = idSubsystem, Subsystem = subsystemService.GetOrDefault(idSubsystem)?.Name ?? "unknown", diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index b10b21d2..f7763e58 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -10,38 +10,28 @@ using System.Threading; using System.Threading.Tasks; namespace AsbCloudWebApi.Controllers.Subsystems -{ - - +{ /// /// Наработка подсистем /// [Route("api/[controller]")] [ApiController] [Authorize] - public class SubsystemOperationTimeController : ControllerBase { private readonly ISubsystemOperationTimeService subsystemOperationTimeService; - private readonly IWellService wellService; - - public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService, IWellService wellService) + public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService) { - this.subsystemOperationTimeService = subsystemOperationTimeService; - this.wellService = wellService; + this.subsystemOperationTimeService = subsystemOperationTimeService; } /// /// получить статистику /// [HttpGet("stat")] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetStatisticsAsync(CancellationToken token = default) + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetStatAsync([FromQuery] SubsystemOperationTimeRequest request, CancellationToken token = default) { - var subsystemResult = new List() - { - - }; - + var subsystemResult = await subsystemOperationTimeService.GetStatAsync(request, token); return Ok(subsystemResult); } @@ -52,8 +42,14 @@ namespace AsbCloudWebApi.Controllers.Subsystems [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public async Task GetSubsystemAsync([FromQuery] int idWell, CancellationToken token = default) { + if (idWell != null) + { + var resultIdWell = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token); + return Ok(resultIdWell); + } var result = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token); return Ok(result); + } /// @@ -64,8 +60,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems public async Task GetOperationTimeAsync( [FromQuery] SubsystemOperationTimeRequest request, CancellationToken token = default) - { - + { var result = await subsystemOperationTimeService.GetOperationTimeAsync(request, token); return Ok(result); } From 1e694216a9e77c80b7ae8eca4ff429300cd1a5ab Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Fri, 5 Aug 2022 17:10:56 +0500 Subject: [PATCH 06/21] =?UTF-8?q?=D0=B4=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BE=D0=BA=20=20=D0=B8=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B8.=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=BB=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=20=D0=B4=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=20?= =?UTF-8?q?=D1=8D=D0=BA=D1=88=D0=BD=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=20=D0=B8?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=B4=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=83=D0=BF=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=20=D0=BA=20=D1=81?= =?UTF-8?q?=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ISubsystemOperationTimeService.cs | 2 +- AsbCloudInfrastructure/DependencyInjection.cs | 6 +- ...SubsystemOperationTimeBackgroundService.cs | 22 +++--- .../SubsystemOperationTimeService.cs | 68 ++++++++++++------- .../SubsystemOperationTimeController.cs | 43 ++++++++---- 5 files changed, 92 insertions(+), 49 deletions(-) diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs index d03f8114..86b685e6 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -11,7 +11,7 @@ namespace AsbCloudApp.Services.Subsystems { public interface ISubsystemOperationTimeService { - Task> GetSubsystemAsync(int idWell, CancellationToken token); + Task> GetSubsystemAsync(int? idWell, CancellationToken token); Task> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token); Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token); Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index b7a3cd8e..87fc1fa7 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -123,7 +123,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - //services.AddTransient(); + services.AddTransient(); // admin crud services: services.AddTransient, CrudServiceBase>(s => @@ -139,6 +139,10 @@ namespace AsbCloudInfrastructure new CrudCacheServiceBase( s.GetService(), dbSet => dbSet.Include(c => c.CompanyType))); + + + + services.AddTransient, CrudCacheServiceBase>(); services.AddTransient, CrudCacheServiceBase>(s => new CrudCacheServiceBase( diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index 809f63eb..4eb973d3 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -126,20 +126,20 @@ namespace AsbCloudInfrastructure.Services.Subsystems DateTimeOffset dateBegin = firstItem.DateTime; float? depthStart = firstItem.Depth; var resultSubsystemOperationTime = new List(); - - var data = await query - .Where(d => d.DateTime > startDate) - .Take(take) - .ToArrayAsync(token); - for(int i = 1;i<=data.Length ;i++) - { - if( data[i].Mode!= mode) + + var data = await query + .Where(d => d.DateTime > startDate) + .Take(take) + .ToArrayAsync(token); + for (int i = 1; i < data.Length; i++) + { + if (data[i].Mode != mode) { var operationTimeItem = new SubsystemOperationTime() { IdTelemetry = idTelemetry, DateStart = dateBegin, - IdSubsystem = (int)data[i - 1].Mode, + IdSubsystem = (int)data[i - 1].Mode, DateEnd = data[i - 1].DateTime, DepthStart = depthStart, DepthEnd = data[i - 1].Depth @@ -151,7 +151,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems depthStart = data[i].Depth; } } - startDate = data.Last().DateTime; + startDate = data.Last().DateTime; return resultSubsystemOperationTime; } @@ -187,7 +187,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems .Take(take) .ToArrayAsync(token); - for (int i = 1; i <= data.Length; i++) + for (int i = 1; i < data.Length; i++) { if (data[i].Mode != mode) { diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 5e37104c..c46a19ff 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -5,6 +5,7 @@ using AsbCloudApp.Services.Subsystems; using AsbCloudDb; using AsbCloudDb.Model; using AsbCloudDb.Model.Subsystems; +using AsbCloudInfrastructure.Repository; using Mapster; using Microsoft.EntityFrameworkCore; using System; @@ -21,35 +22,50 @@ namespace AsbCloudInfrastructure.Services.Subsystems private readonly IAsbCloudDbContext db; private readonly IWellService wellService; - private readonly SubsystemService subsystemService; + private readonly ICrudService subsystemService; + - public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService, SubsystemService subsystemService) + + public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService, ICrudService subsystemService) { this.db = db; this.wellService = wellService; this.subsystemService = subsystemService; } - public async Task > GetSubsystemAsync(int idWell, CancellationToken token) - { - var well = await wellService.GetOrDefaultAsync(idWell, token); - if (well?.IdTelemetry is null || well.Timezone is null) - return null; - var wellSubsystem = db.SubsystemOperationTimes - .Include(e=>e.Subsystem) - .AsNoTracking() - .Where(o => o.IdTelemetry == well.IdTelemetry) - .DistinctBy(o => o.IdSubsystem) - .Select(d => new SubsystemDto - { - Id = d.Subsystem.Id, - Name = d.Subsystem.Name, - Description = d.Subsystem.Description, + private async Task> GetSubsystemAsync(int idWell, CancellationToken token) + { + var well = await wellService.GetOrDefaultAsync(idWell, token); + if (well?.IdTelemetry is null || well.Timezone is null) + return null; + var wellSubsystem = await db.SubsystemOperationTimes + .Include(e => e.Subsystem) + .AsNoTracking() + .Where(o => o.IdTelemetry == well.IdTelemetry) + .DistinctBy(o => o.IdSubsystem) + .Select(d => new SubsystemDto + { + Id = d.Subsystem.Id, + Name = d.Subsystem.Name, + Description = d.Subsystem.Description, - }); - return wellSubsystem; + }) + .ToListAsync(token); + return wellSubsystem; } - + + public async Task> GetSubsystemAsync(int? idWell, CancellationToken token) + { + if (idWell is null) + { + var subsystem = await subsystemService.GetAllAsync(token); + return subsystem; + } + var subsystemWell = await GetSubsystemAsync(idWell, token); + return subsystemWell; + + } + public async Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token) { @@ -119,20 +135,24 @@ namespace AsbCloudInfrastructure.Services.Subsystems private IEnumerable CalcStat(IEnumerable groupedData, SubsystemOperationTimeRequest request) { var result = new List(); + var groupedDataSubsystems = groupedData + .GroupBy(x => x.IdSubsystem); var periodGroupTotal = groupedData .GroupBy(x => x.IdSubsystem) .Sum(g => g.Sum(o=> (o.DateEnd - o.DateStart).TotalHours)); - foreach (IEnumerable item in groupedData) - { - + foreach (var item in groupedDataSubsystems) + { var periodGroup = item.Sum(g => (g.DateEnd - g.DateStart).TotalHours); - var periodRequest = item.Where(o => o.DateStart==request.GtDate & o.DateEnd == request.LtDate) + var gtDate = request.GtDate ?? item.Min(d => d.DateStart); + var ltDate = request.LtDate ?? item.Max(d => d.DateEnd); + var periodRequest = item.Where(o => o.DateStart>=gtDate && o.DateEnd <= ltDate) .Sum(o => (o.DateEnd - o.DateStart).TotalHours); int idSubsystem = item.First().IdSubsystem; var subsystemStat = new SubsystemStatDto() { IdSubsystem = idSubsystem, Subsystem = subsystemService.GetOrDefault(idSubsystem)?.Name ?? "unknown", + //Subsystem = db.Subsystems.Where(n => n.Id == idSubsystem).FirstOrDefault()?.Name ?? "unknown", UsedTimeHours = TimeSpan.FromHours(periodGroup), KUsage = 1d*periodGroup / periodRequest, K2 = 1d*periodGroup / periodGroupTotal, diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index f7763e58..ba75773a 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -20,9 +20,13 @@ namespace AsbCloudWebApi.Controllers.Subsystems public class SubsystemOperationTimeController : ControllerBase { private readonly ISubsystemOperationTimeService subsystemOperationTimeService; - public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService) + private readonly ICrudService subsystemService; + private readonly IWellService wellService; + public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService, ICrudService subsystemService, IWellService wellService) { - this.subsystemOperationTimeService = subsystemOperationTimeService; + this.subsystemOperationTimeService = subsystemOperationTimeService; + this.subsystemService = subsystemService; + this.wellService = wellService; } /// /// получить статистику @@ -31,6 +35,8 @@ namespace AsbCloudWebApi.Controllers.Subsystems [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public async Task GetStatAsync([FromQuery] SubsystemOperationTimeRequest request, CancellationToken token = default) { + if (!await UserHasAccesToWellAsync(request.IdWell, token)) + return Forbid(); var subsystemResult = await subsystemOperationTimeService.GetStatAsync(request, token); return Ok(subsystemResult); } @@ -40,16 +46,14 @@ namespace AsbCloudWebApi.Controllers.Subsystems /// [HttpGet("subsystem")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetSubsystemAsync([FromQuery] int idWell, CancellationToken token = default) + public async Task GetSubsystemAsync([FromQuery] int? idWell, CancellationToken token = default) { - if (idWell != null) - { - var resultIdWell = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token); - return Ok(resultIdWell); - } - var result = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token); - return Ok(result); - + if (idWell.HasValue) + if (!await UserHasAccesToWellAsync(idWell.Value, token)) + return Forbid(); + + var result = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token); + return Ok(result); } /// @@ -57,10 +61,13 @@ namespace AsbCloudWebApi.Controllers.Subsystems /// [HttpGet("operationTime")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetOperationTimeAsync( [FromQuery] SubsystemOperationTimeRequest request, CancellationToken token = default) - { + { + if (!await UserHasAccesToWellAsync(request.IdWell, token)) + return Forbid(); var result = await subsystemOperationTimeService.GetOperationTimeAsync(request, token); return Ok(result); } @@ -78,8 +85,20 @@ namespace AsbCloudWebApi.Controllers.Subsystems [FromQuery] SubsystemOperationTimeRequest request, CancellationToken token) { + if (!await UserHasAccesToWellAsync(request.IdWell, token)) + return Forbid(); var result = await subsystemOperationTimeService.DeleteAsync(request, token); return Ok(result); } + + protected async Task UserHasAccesToWellAsync(int idWell, CancellationToken token) + { + var idCompany = User.GetCompanyId(); + if (idCompany is not null && + await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token) + .ConfigureAwait(false)) + return true; + return false; + } } } From ca261f1eb79f09eabfa2b8122b97a2987c6e59f9 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 8 Aug 2022 16:53:01 +0500 Subject: [PATCH 07/21] before merge --- .../Subsystems/ISubsystemOperationTimeService.cs | 8 +++++--- AsbCloudDb/Model/Subsystems/Subsystem.cs | 6 ++---- .../SubsystemOperationTimeBackgroundService.cs | 16 ++++++++-------- .../Subsystems/SubsystemOperationTimeService.cs | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs index 86b685e6..c5f75fc7 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -9,12 +9,14 @@ using System.Threading.Tasks; namespace AsbCloudApp.Services.Subsystems { +#nullable enable public interface ISubsystemOperationTimeService { - Task> GetSubsystemAsync(int? idWell, CancellationToken token); - Task> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token); + Task?> GetSubsystemAsync(int? idWell, CancellationToken token); + Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token); Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token); - Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); + Task?> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); } +#nullable disable } diff --git a/AsbCloudDb/Model/Subsystems/Subsystem.cs b/AsbCloudDb/Model/Subsystems/Subsystem.cs index 5fc7938c..70160f6e 100644 --- a/AsbCloudDb/Model/Subsystems/Subsystem.cs +++ b/AsbCloudDb/Model/Subsystems/Subsystem.cs @@ -16,14 +16,12 @@ namespace AsbCloudDb.Model.Subsystems [Column("name")] [StringLength(255)] - public string? Name { get; set; } + public string Name { get; set; } = null!; [Column("description")] [StringLength(255)] public string? Description { get; set; } - - [InverseProperty(nameof(SubsystemOperationTime.Subsystem))] - public virtual ICollection SubsystemOperationTimes { get; set; } + } } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index 4eb973d3..ca25f361 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -88,18 +88,18 @@ namespace AsbCloudInfrastructure.Services.Subsystems { var stopwatch = Stopwatch.StartNew(); var newOperationsSaub = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); - var newOperationsSpin = await OperationTimeSpinAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); + //var newOperationsSpin = await OperationTimeSpinAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); stopwatch.Stop(); if (newOperationsSaub.Any()) { db.SubsystemOperationTimes.AddRange(newOperationsSaub); affected += await db.SaveChangesAsync(token); } - if (newOperationsSpin.Any()) - { - db.SubsystemOperationTimes.AddRange(newOperationsSpin); - affected += await db.SaveChangesAsync(token); - } + //if (newOperationsSpin.Any()) + //{ + // db.SubsystemOperationTimes.AddRange(newOperationsSpin); + // affected += await db.SaveChangesAsync(token); + //} } return affected; } @@ -109,7 +109,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems var query = db.TelemetryDataSaub .AsNoTracking() .Where(d => d.IdTelemetry == idTelemetry) - .Select(d => new OperationTimeData + .Select(d => new { DateTime = d.DateTime, Mode = d.Mode, @@ -162,7 +162,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems var query = db.TelemetryDataSpin .AsNoTracking() .Where(d => d.IdTelemetry == idTelemetry) - .Select(d => new OperationTimeData + .Select(d => new { DateTime = d.DateTime, Mode = d.Mode, diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index c46a19ff..2a793d1a 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -33,7 +33,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems this.subsystemService = subsystemService; } - private async Task> GetSubsystemAsync(int idWell, CancellationToken token) + private async Task> GetSubsystemByIdWellAsync(int idWell, CancellationToken token) { var well = await wellService.GetOrDefaultAsync(idWell, token); if (well?.IdTelemetry is null || well.Timezone is null) From d1aec0ad2a5fa68c06fa9bd8e22c2d3bd53e1c0c Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 8 Aug 2022 17:03:26 +0500 Subject: [PATCH 08/21] Add new Permissions --- AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs index acce78e0..649a4ce2 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs @@ -30,6 +30,11 @@ new (){ Id = 124, Name="AdminWell.delete", Description="Разрешение удалять админ. Скважины"}, new (){ Id = 125, Name="AdminWell.edit", Description="Разрешение редактировать админ. Скважины"}, new (){ Id = 126, Name="AdminWell.get", Description="Разрешение просматривать админ. Скважины"}, + + new (){ Id = 127, Name="AdminSubsytem.delete", Description="Разрешение удалять админ. Подсистемы"}, + new (){ Id = 128, Name="AdminSubsytem.edit", Description="Разрешение редактировать админ. Подсистемы"}, + new (){ Id = 129, Name="AdminSubsytem.get", Description="Разрешение просматривать админ. Подсистемы"}, + new (){ Id = 200, Name="Auth.edit", Description="Разрешение редактировать 0"}, new (){ Id = 201, Name="Auth.get", Description="Разрешение просматривать 0"}, new (){ Id = 202, Name="Cluster.get", Description="Разрешение просматривать Кусты"}, From 62384b5673eb827a5599fbea75e39cdfb81e7168 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 15 Aug 2022 01:17:00 +0500 Subject: [PATCH 09/21] =?UTF-8?q?-=D0=94=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=20=D1=84=D0=BE=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D1=81?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=B8=D1=81=20-=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D0=B0=20=D0=B2=20Data=20Spin=20=D1=84=D0=BE=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=20-=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9=20(=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B1=D0=B5=D0=BB=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B8=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D1=85=20=D0=B1=D0=B8?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA)=20-=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE?= =?UTF-8?q?=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E=20=D0=BE=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=B0=D1=85=20(?= =?UTF-8?q?=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20Entity=20Filler)=20-=20=D0=B2?= =?UTF-8?q?=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B5=20Convert=20=D0=B2=20Su?= =?UTF-8?q?bsystemOperationTimeService=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B4=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/Subsystems/SubsystemDto.cs | 8 +- .../Subsystems/SubsystemOperationTimeDto.cs | 18 +-- .../Data/Subsystems/SubsystemStatDto.cs | 8 +- .../Subsystems/SubsystemsSpinWithDepthDto.cs | 30 ++++ AsbCloudDb/Model/DefaultData/DefaultData.cs | 1 + .../DefaultData/EntityFillerSubsystem.cs | 24 ++++ ...SubsystemOperationTimeBackgroundService.cs | 134 +++++++++++------- .../SubsystemOperationTimeService.cs | 67 ++++----- .../SubsystemOperationTimeController.cs | 8 +- 9 files changed, 175 insertions(+), 123 deletions(-) create mode 100644 AsbCloudApp/Data/Subsystems/SubsystemsSpinWithDepthDto.cs create mode 100644 AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs diff --git a/AsbCloudApp/Data/Subsystems/SubsystemDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemDto.cs index 7bf2c0b6..515c69a7 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemDto.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AsbCloudApp.Data.Subsystems +namespace AsbCloudApp.Data.Subsystems { /// /// Описание параметров подсистемы diff --git a/AsbCloudApp/Data/Subsystems/SubsystemOperationTimeDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemOperationTimeDto.cs index ccb923d7..98047c84 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemOperationTimeDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemOperationTimeDto.cs @@ -1,9 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace AsbCloudApp.Data.Subsystems { /// @@ -15,17 +10,14 @@ namespace AsbCloudApp.Data.Subsystems /// Идентификатор /// public int Id { get; set; } - /// - /// ИД телеметрии по которой выдается информация - /// - public int IdTelemetry { get; set; } - public TelemetryBaseDto Telemetry { get; set; } - /// /// идентификатор подсистемы /// public int IdSubsystem { get; set; } - public SubsystemDto Subsystem { get; set; } + /// + /// Название подсистемы + /// + public string SubsystemName { get; set; } /// /// дата/время включения подсистемы /// @@ -42,7 +34,5 @@ namespace AsbCloudApp.Data.Subsystems /// глубина забоя на момент выключения подсистемы /// public double DepthEnd { get; set; } - - } } diff --git a/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs index 4ef6d98d..8e6f8bf4 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs @@ -1,17 +1,11 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace AsbCloudApp.Data.Subsystems { /// /// Статистика подсистемы /// public class SubsystemStatDto - { - + { /// /// Идентификатор подсистемы /// diff --git a/AsbCloudApp/Data/Subsystems/SubsystemsSpinWithDepthDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemsSpinWithDepthDto.cs new file mode 100644 index 00000000..196d3ac9 --- /dev/null +++ b/AsbCloudApp/Data/Subsystems/SubsystemsSpinWithDepthDto.cs @@ -0,0 +1,30 @@ +using System; +namespace AsbCloudDb.Model.Subsystems +{ + /// + /// Результат запроса в t_telemetry_data_spin, используется фоновым сервисом анализирующим наработки подсистем + /// + public class SubsystemsSpinWithDepthDto + { + /// + /// Режим работы + /// + public short Mode { get; set; } + /// + /// Состояние + /// + public int State { get; set; } + /// + /// Дата + /// + public DateTimeOffset Date { get; set; } + /// + /// Глубина забоя + /// + public float Depth { get; set; } + /// + /// ИД + /// + public int IdSubsystem { get; set; } + } +} diff --git a/AsbCloudDb/Model/DefaultData/DefaultData.cs b/AsbCloudDb/Model/DefaultData/DefaultData.cs index bc405ecb..0bfe29a7 100644 --- a/AsbCloudDb/Model/DefaultData/DefaultData.cs +++ b/AsbCloudDb/Model/DefaultData/DefaultData.cs @@ -22,6 +22,7 @@ namespace AsbCloudDb.Model.DefaultData new EntityFillerWellType(), new EntityFillerMeasureCategory(), new EntityFillerCompanyType(), + new EntityFillerSubsystem(), }; foreach (var filler in fillers) diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs b/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs new file mode 100644 index 00000000..9e32c4ed --- /dev/null +++ b/AsbCloudDb/Model/DefaultData/EntityFillerSubsystem.cs @@ -0,0 +1,24 @@ +using AsbCloudDb.Model.Subsystems; +namespace AsbCloudDb.Model.DefaultData +{ + internal class EntityFillerSubsystem : EntityFiller + { + protected override Subsystem[] GetData() => new Subsystem[]{ + // САУБ - ид подсистем с 1 до 65_535 + new () {Id = 1, Name = "Ручной", Description = "Ручной"}, + new () {Id = 2, Name = "Бурение в роторе", Description = "Бурение в роторе"}, + new () {Id = 3, Name = "Проработка", Description = "Проработка"}, + new () {Id = 4, Name = "Бурение в слайде", Description = "Бурение в слайде"}, + new () {Id = 5, Name = "Спуск СПО", Description = "Спуск СПО"}, + new () {Id = 6, Name = "Подъем СПО", Description = "Подъем СПО"}, + new () {Id = 7, Name = "Подъем с проработкой", Description = "Подъем с проработкой"}, + new () {Id = 11, Name = "Блокировка", Description = "Блокировка"}, + + //Spin master - id подсистем с 65_536 до 131_071 + new () {Id = 65536, Name = "Spin master", Description = "Spin master"}, + new () {Id = 65537, Name = "Torque master", Description = "Torque master"} + + + }; + } +} diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index ca25f361..f70e181d 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -6,6 +6,8 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; +using System.Data; +using System.Data.Common; using System.Diagnostics; using System.Linq; using System.Text; @@ -18,10 +20,12 @@ namespace AsbCloudInfrastructure.Services.Subsystems { private readonly string connectionString; private readonly TimeSpan period = TimeSpan.FromHours(1); + private const int idSubsytemTorqueMaster = 65537; + private const int idSubsytemSpinMaster = 65536; + public SubsystemOperationTimeBackgroundService(IConfiguration configuration) { connectionString = configuration.GetConnectionString("DefaultConnection"); - } protected override async Task ExecuteAsync(CancellationToken token) { @@ -39,7 +43,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems { using var context = new AsbCloudDbContext(options); var added = await OperationTimeAllTelemetriesAsync(context, token); - Trace.TraceInformation($"Total operation time subsystem complete. Added {added} operations time."); + Trace.TraceInformation($"Total subsystem operation time complete. Added {added} operations time."); } catch (Exception ex) { @@ -60,7 +64,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems private static async Task OperationTimeAllTelemetriesAsync(IAsbCloudDbContext db, CancellationToken token) { - var lastDetectedDates = await db.DetectedOperations + var lastDetectedDates = await db.SubsystemOperationTimes .GroupBy(o => o.IdTelemetry) .Select(g => new { @@ -87,19 +91,19 @@ namespace AsbCloudInfrastructure.Services.Subsystems foreach (var item in JounedlastDetectedDates) { var stopwatch = Stopwatch.StartNew(); - var newOperationsSaub = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); - //var newOperationsSpin = await OperationTimeSpinAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); + var newOperationsSaub = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); stopwatch.Stop(); - if (newOperationsSaub.Any()) + if (newOperationsSaub is not null && newOperationsSaub.Any()) { db.SubsystemOperationTimes.AddRange(newOperationsSaub); affected += await db.SaveChangesAsync(token); } - //if (newOperationsSpin.Any()) - //{ - // db.SubsystemOperationTimes.AddRange(newOperationsSpin); - // affected += await db.SaveChangesAsync(token); - //} + var newOperationsSpin = await OperationTimeSpinAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); + if (newOperationsSpin is not null && newOperationsSpin.Any()) + { + db.SubsystemOperationTimes.AddRange(newOperationsSpin); + affected += await db.SaveChangesAsync(token); + } } return affected; } @@ -115,8 +119,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems Mode = d.Mode, Depth = d.WellDepth }) - .OrderBy(d => d.DateTime); - + .OrderBy(d => d.DateTime); var take = 4 * 86_400; // 4 дня var startDate = begin; var firstItem = query.FirstOrDefault(); @@ -125,8 +128,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems short? mode = firstItem.Mode; DateTimeOffset dateBegin = firstItem.DateTime; float? depthStart = firstItem.Depth; - var resultSubsystemOperationTime = new List(); - + var resultSubsystemOperationTime = new List(); var data = await query .Where(d => d.DateTime > startDate) .Take(take) @@ -139,11 +141,10 @@ namespace AsbCloudInfrastructure.Services.Subsystems { IdTelemetry = idTelemetry, DateStart = dateBegin, - IdSubsystem = (int)data[i - 1].Mode, + IdSubsystem = (int)data[i - 1].Mode + 1, DateEnd = data[i - 1].DateTime, DepthStart = depthStart, DepthEnd = data[i - 1].Depth - }; resultSubsystemOperationTime.Add(operationTimeItem); mode = data[i].Mode; @@ -151,64 +152,97 @@ namespace AsbCloudInfrastructure.Services.Subsystems depthStart = data[i].Depth; } } - startDate = data.Last().DateTime; - + startDate = data.Last().DateTime; return resultSubsystemOperationTime; } - - private static async Task> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) { - var query = db.TelemetryDataSpin - .AsNoTracking() - .Where(d => d.IdTelemetry == idTelemetry) - .Select(d => new + Predicate isSubsystemTorqueState = (int state) => state == 7; + Predicate isSubsystemTorqueMode = (short mode) => (mode & 2) > 0; + Predicate isSubsystemSpin = (int state) => state != 0 & state != 6 & state != 7; + var operationTimeSpinWithDepth = + $"select tspin.\"date\", tspin.\"mode\", tspin.\"state\", tsaub.\"well_depth\"" + + $" from (select \"date\" ,\"mode\" ,lag(mode, 1) over (order by \"date\") as mode_pre, state , " + + $"lag(state, 1) over (order by \"date\") as state_pre from t_telemetry_data_spin where id_telemetry = {idTelemetry}) as tspin " + + $"join (select \"date\", well_depth from t_telemetry_data_saub where id_telemetry = {idTelemetry}) as tsaub " + + $"on EXTRACT(EPOCH from tspin.date) = EXTRACT(EPOCH from tsaub.date) " + + $"where mode!=mode_pre or state != state_pre order by \"date\";"; + using var command = db.Database.GetDbConnection().CreateCommand(); + command.CommandText = operationTimeSpinWithDepth; + db.Database.OpenConnection(); + using var result = command.ExecuteReader(); + var query = new List(); + //DataTable dt = new DataTable(); + //dt.Load(result); + //var query = from c in dt.AsEnumerable() + // select new + // { + // Date = (DateTimeOffset)c["date"], + // Mode = (short)c["mode"], + // State = (int)c["state"], + // Depth = (float)c["float"] + // }; + if (result.HasRows) + while (result.Read()) { - DateTime = d.DateTime, - Mode = d.Mode, - Depth = db.TelemetryDataSaub.Where(t => t.DateTime == d.DateTime & t.IdTelemetry ==idTelemetry) - .GroupBy(t => t.IdTelemetry) - .Select(group => group.Min(t => t.WellDepth)) - .FirstOrDefault() - }) - .OrderBy(d => d.DateTime); - + var itemEntity = new SubsystemsSpinWithDepthDto() + { + Date = result.GetFieldValue(0), + Mode = result.GetFieldValue(1), + State = result.GetFieldValue(2), + Depth = result.GetFieldValue(3) + }; + int? subsystemId = isSubsystemTorqueState(itemEntity.State) && isSubsystemTorqueMode(itemEntity.Mode) + ? idSubsytemTorqueMaster + : isSubsystemSpin(itemEntity.State) + ? idSubsytemSpinMaster + : 0; + if (subsystemId.HasValue) + { + itemEntity.IdSubsystem = subsystemId.Value; + query.Add(itemEntity); + } + } var take = 4 * 86_400; // 4 дня var startDate = begin; var firstItem = query.FirstOrDefault(); if (firstItem is null) - return null; - short? mode = firstItem.Mode; - DateTimeOffset dateBegin = firstItem.DateTime; + return null; + int idSubsystem = firstItem.IdSubsystem; + DateTimeOffset dateBegin = firstItem.Date; float? depthStart = firstItem.Depth; var resultSubsystemOperationTime = new List(); - var data = await query - .Where(d => d.DateTime > startDate) + var data = query + .Where(d => d.Date > startDate) .Take(take) - .ToArrayAsync(token); + .ToArray(); + if (data.Length==0) + return null; for (int i = 1; i < data.Length; i++) { - if (data[i].Mode != mode) + if (data[i].IdSubsystem != idSubsystem) { var operationTimeItem = new SubsystemOperationTime() { IdTelemetry = idTelemetry, DateStart = dateBegin, - IdSubsystem = (int)data[i - 1].Mode, - DateEnd = data[i - 1].DateTime, + IdSubsystem = data[i - 1].IdSubsystem, + DateEnd = data[i - 1].Date, DepthStart = depthStart, DepthEnd = data[i - 1].Depth - }; - resultSubsystemOperationTime.Add(operationTimeItem); - mode = data[i].Mode; - dateBegin = data[i].DateTime; + }; + dateBegin = data[i].Date; depthStart = data[i].Depth; + idSubsystem = data[i].IdSubsystem; + if (data[i-1].IdSubsystem != 0) + { + resultSubsystemOperationTime.Add(operationTimeItem); + } } - } - startDate = data.Last().DateTime; - + } + startDate = data.LastOrDefault().Date; return resultSubsystemOperationTime; } } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 2a793d1a..ff379581 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -1,11 +1,11 @@ -using AsbCloudApp.Data.Subsystems; +using AsbCloudApp.Data; +using AsbCloudApp.Data.Subsystems; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudApp.Services.Subsystems; using AsbCloudDb; using AsbCloudDb.Model; using AsbCloudDb.Model.Subsystems; -using AsbCloudInfrastructure.Repository; using Mapster; using Microsoft.EntityFrameworkCore; using System; @@ -23,9 +23,6 @@ namespace AsbCloudInfrastructure.Services.Subsystems private readonly IAsbCloudDbContext db; private readonly IWellService wellService; private readonly ICrudService subsystemService; - - - public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService, ICrudService subsystemService) { this.db = db; @@ -33,7 +30,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems this.subsystemService = subsystemService; } - private async Task> GetSubsystemByIdWellAsync(int idWell, CancellationToken token) + private async Task?> GetSubsystemByIdWellAsync(int idWell, CancellationToken token) { var well = await wellService.GetOrDefaultAsync(idWell, token); if (well?.IdTelemetry is null || well.Timezone is null) @@ -53,39 +50,37 @@ namespace AsbCloudInfrastructure.Services.Subsystems .ToListAsync(token); return wellSubsystem; } - - public async Task> GetSubsystemAsync(int? idWell, CancellationToken token) + public async Task?> GetSubsystemAsync(int? idWell, CancellationToken token) { - if (idWell is null) + if (idWell.HasValue) { - var subsystem = await subsystemService.GetAllAsync(token); - return subsystem; - } - var subsystemWell = await GetSubsystemAsync(idWell, token); - return subsystemWell; - + var subsystemWell = await GetSubsystemByIdWellAsync(idWell.Value, token); + return subsystemWell; + } + var subsystem = await subsystemService.GetAllAsync(token); + return subsystem; } - - public async Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token) { var well = await wellService.GetOrDefaultAsync(request.IdWell, token); if (well?.IdTelemetry is null || well.Timezone is null) return 0; var query = BuildQuery(request); + if (query is null) + return 0; db.SubsystemOperationTimes.RemoveRange(query); return await db.SaveChangesAsync(token); } - public async Task> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token) - { - var query = BuildQuery(request) - .AsNoTracking(); + public async Task?> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token) + { + var well = await wellService.GetOrDefaultAsync(request.IdWell, token); + if (well?.IdTelemetry is null || well.Timezone is null) + return null; + var query = BuildQuery(request); if (query is null) return null; - var data = await query.ToListAsync(token); - if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeInner) { if (request.GtDate is not null) @@ -100,22 +95,20 @@ namespace AsbCloudInfrastructure.Services.Subsystems var end = request.GtDate ?? throw new ArgumentNullException(nameof(request.LtDate)); data = Trim(data, begin,end ); } - var dtos = data.Select(o => Convert(o)); + var dtos = data.Select(o => Convert(o,well)); return dtos; } - - - public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token) { var data = await GetOperationTimeAsync(request, token); + if (data is null) + return null; var statList = CalcStat(data, request); return statList; } - private List Trim(List data, DateTime gtDate, DateTime ltDate) { - var itemsToTrim = data.Where(q => true) + var itemsToTrim = data.Where(q => q.DateStart == gtDate & q.DateEnd == ltDate) .Select(o => new SubsystemOperationTime { Id = o.Id, @@ -131,7 +124,6 @@ namespace AsbCloudInfrastructure.Services.Subsystems .ToList(); return itemsToTrim; } - private IEnumerable CalcStat(IEnumerable groupedData, SubsystemOperationTimeRequest request) { var result = new List(); @@ -151,8 +143,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems var subsystemStat = new SubsystemStatDto() { IdSubsystem = idSubsystem, - Subsystem = subsystemService.GetOrDefault(idSubsystem)?.Name ?? "unknown", - //Subsystem = db.Subsystems.Where(n => n.Id == idSubsystem).FirstOrDefault()?.Name ?? "unknown", + Subsystem = subsystemService.GetOrDefault(idSubsystem)?.Name ?? "unknown", UsedTimeHours = TimeSpan.FromHours(periodGroup), KUsage = 1d*periodGroup / periodRequest, K2 = 1d*periodGroup / periodGroupTotal, @@ -161,8 +152,6 @@ namespace AsbCloudInfrastructure.Services.Subsystems } return result; } - - private IQueryable? BuildQuery(SubsystemOperationTimeRequest request) { var idTelemetry = wellService.GetOrDefault(request.IdWell)?.IdTelemetry; @@ -210,15 +199,13 @@ namespace AsbCloudInfrastructure.Services.Subsystems return query; } - - private SubsystemOperationTimeDto Convert(SubsystemOperationTime operationTime) + private SubsystemOperationTimeDto Convert(SubsystemOperationTime operationTime, WellDto well) { - var dto = operationTime.Adapt(); + var dto = operationTime.Adapt(); + dto.DateStart = operationTime.DateStart.ToRemoteDateTime(well.Timezone.Hours); + dto.DateEnd = operationTime.DateEnd.ToRemoteDateTime(well.Timezone.Hours); return dto; } - - - } #nullable disable } diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index ba75773a..e4d15ebc 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -19,13 +19,11 @@ namespace AsbCloudWebApi.Controllers.Subsystems [Authorize] public class SubsystemOperationTimeController : ControllerBase { - private readonly ISubsystemOperationTimeService subsystemOperationTimeService; - private readonly ICrudService subsystemService; + private readonly ISubsystemOperationTimeService subsystemOperationTimeService; private readonly IWellService wellService; - public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService, ICrudService subsystemService, IWellService wellService) + public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService, IWellService wellService) { - this.subsystemOperationTimeService = subsystemOperationTimeService; - this.subsystemService = subsystemService; + this.subsystemOperationTimeService = subsystemOperationTimeService; this.wellService = wellService; } /// From 20f79f461f3eaf5868f2ad23b2dd5bc8a50419ad Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 15 Aug 2022 15:08:17 +0500 Subject: [PATCH 10/21] =?UTF-8?q?-=20=D0=92=20SubsystemStatDto=20=D1=81?= =?UTF-8?q?=D0=B2=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE=20UsedTimeHours=20do?= =?UTF-8?q?uble.=20TimeSpan.=20-=20=D0=92=20SubsystemDto=20=D1=81=D0=B2?= =?UTF-8?q?=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE=20Subsystem=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B8=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=B2=20SubsystemName=20-=20=D0=BC=D0=B8=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20Subsystem=20?= =?UTF-8?q?-=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20bsystemOperationTimeServic?= =?UTF-8?q?e.GetSubsystemByIdWellAsync=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D1=81=D0=B5=D0=BD=20=D0=B2=20SubsystemService.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Subsystems/SubsystemStatDto.cs | 4 +- .../ISubsystemOperationTimeService.cs | 6 +- .../Services/Subsystems/ISubsystemService.cs | 12 +- ...AddDataDefault_SubsystemFiller.Designer.cs | 6469 +++++++++++++++++ ...15093950_AddDataDefault_SubsystemFiller.cs | 104 + .../AsbCloudDbContextModelSnapshot.cs | 70 +- AsbCloudInfrastructure/DependencyInjection.cs | 1 + .../Services/Subsystems/OperationTimeData.cs | 15 - .../SubsystemOperationTimeService.cs | 37 +- .../Services/Subsystems/SubsystemService.cs | 54 +- .../SubsystemOperationTimeController.cs | 13 +- 11 files changed, 6714 insertions(+), 71 deletions(-) create mode 100644 AsbCloudDb/Migrations/20220815093950_AddDataDefault_SubsystemFiller.Designer.cs create mode 100644 AsbCloudDb/Migrations/20220815093950_AddDataDefault_SubsystemFiller.cs delete mode 100644 AsbCloudInfrastructure/Services/Subsystems/OperationTimeData.cs diff --git a/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs index 8e6f8bf4..d86c6bb3 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemStatDto.cs @@ -13,11 +13,11 @@ namespace AsbCloudApp.Data.Subsystems /// /// Название подсистемы /// - public string Subsystem { get; set; } + public string SubsystemName { get; set; } /// /// наработка подсистемы /// - public TimeSpan UsedTimeHours { get; set; } + public double UsedTimeHours { get; set; } /// /// коэффициент использования /// diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs index c5f75fc7..dbc79fd0 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -11,12 +11,10 @@ namespace AsbCloudApp.Services.Subsystems { #nullable enable public interface ISubsystemOperationTimeService - { - Task?> GetSubsystemAsync(int? idWell, CancellationToken token); + { Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token); Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token); - Task?> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); - + Task?> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); } #nullable disable } diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemService.cs index c9a51954..7daf7d68 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemService.cs @@ -1,6 +1,14 @@ -namespace AsbCloudApp.Services.Subsystems +using AsbCloudApp.Data.Subsystems; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services.Subsystems { - internal interface ISubsystemService +#nullable enable + public interface ISubsystemService { + Task?> GetSubsystemAsync(int? idWell, CancellationToken token); } +#nullable disable } diff --git a/AsbCloudDb/Migrations/20220815093950_AddDataDefault_SubsystemFiller.Designer.cs b/AsbCloudDb/Migrations/20220815093950_AddDataDefault_SubsystemFiller.Designer.cs new file mode 100644 index 00000000..59fe624b --- /dev/null +++ b/AsbCloudDb/Migrations/20220815093950_AddDataDefault_SubsystemFiller.Designer.cs @@ -0,0 +1,6469 @@ +// +using System; +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + [DbContext(typeof(AsbCloudDbContext))] + [Migration("20220815093950_AddDataDefault_SubsystemFiller")] + partial class AddDataDefault_SubsystemFiller + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack"); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdDeposit") + .HasColumnType("integer") + .HasColumnName("id_deposit"); + + b.Property("Latitude") + .HasColumnType("double precision") + .HasColumnName("latitude"); + + b.Property("Longitude") + .HasColumnType("double precision") + .HasColumnName("longitude"); + + b.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.DailyReport.DailyReport", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("start_date") + .HasComment("Дата отчёта"); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Список параметров для отчёта"); + + b.HasKey("IdWell", "StartDate") + .HasName("t_id_well_date_start_pk"); + + b.ToTable("t_daily_report"); + + b.HasComment("Ежедневные отчёты"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + b.HasKey("Id"); + + b.ToTable("t_deposit"); + + b.HasComment("Месторождение"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("Дата начала операции"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("Дата начала операции"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина после завершения операции, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина на начало операции, м"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUsersAtStart") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя по телеметрии на момент начала операции"); + + b.Property("Value") + .HasColumnType("double precision") + .HasColumnName("value") + .HasComment("Ключевой показатель операции"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_detected_operation"); + + b.HasComment("автоматически определенные операции по телеметрии"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Имя"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("Отчество"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("Фамилия"); + + b.HasKey("Id"); + + b.ToTable("t_driller"); + + b.HasComment("Бурильщик"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 with 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.DrillingProgramPart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdFileCategory") + .HasColumnType("integer") + .HasColumnName("id_file_category"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("Id"); + + b.HasIndex("IdFileCategory"); + + b.HasIndex("IdWell", "IdFileCategory") + .IsUnique(); + + b.ToTable("t_drilling_program_part"); + + b.HasComment("части программ бурения"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillParams", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 = "toolService" + }, + new + { + Id = 9, + Name = "Буровой подрядчик", + ShortName = "drillService" + }, + new + { + Id = 10, + Name = "Сервис по заканчиванию скважины", + ShortName = "closingService" + }, + new + { + Id = 12, + Name = "Рапорт", + ShortName = "report" + }, + new + { + Id = 1000, + Name = "Программа бурения" + }, + new + { + Id = 1001, + Name = "Задание от геологов" + }, + new + { + Id = 1002, + Name = "Профиль ствола скважины (ННБ)" + }, + new + { + Id = 1003, + Name = "Технологические расчеты (ННБ)" + }, + new + { + Id = 1004, + Name = "Долотная программа" + }, + new + { + Id = 1005, + Name = "Программа по растворам" + }, + new + { + Id = 1006, + Name = "Программа геофизических исследований" + }, + new + { + Id = 1007, + Name = "Планы спусков обсадных колонн" + }, + new + { + Id = 1008, + Name = "Программы цементирования обсадных колонн" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("id категории файла"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Удален ли файл"); + + b.Property("Name") + .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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateCreated") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_created") + .HasComment("Дата совершенного действия"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла"); + + b.Property("IdMarkType") + .HasColumnType("integer") + .HasColumnName("id_mark_type") + .HasComment("0 - отклонен, 1 - согласован"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("id пользователя"); + + b.Property("IsDeleted") + .HasColumnType("boolean") + .HasColumnName("is_deleted") + .HasComment("Помечен ли файл как удаленный"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdUser"); + + b.ToTable("t_file_mark"); + + b.HasComment("Действия с файлами."); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Measure", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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 with 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.OperationValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Старотовая глубина"); + + b.Property("IdOperationCategory") + .HasColumnType("integer") + .HasColumnName("id_operation_category") + .HasComment("Ид категории операции"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Ид скважины"); + + b.Property("StandardValue") + .HasColumnType("double precision") + .HasColumnName("standard_value") + .HasComment("Нормативный показатель"); + + b.Property("TargetValue") + .HasColumnType("double precision") + .HasColumnName("target_value") + .HasComment("Целевой показатель"); + + b.HasKey("Id"); + + b.HasIndex("IdOperationCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_operationvalue"); + + b.HasComment("Целевые/нормативные показатели операции"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description") + .HasComment("Краткое описание"); + + b.Property("Name") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_permission"); + + b.HasComment("Разрешения на доступ к данным"); + + b.HasData( + new + { + Id = 100, + Description = "Разрешение удалять админ. Кусты", + Name = "AdminCluster.delete" + }, + new + { + Id = 101, + Description = "Разрешение редактировать админ. Кусты", + Name = "AdminCluster.edit" + }, + new + { + Id = 102, + Description = "Разрешение просматривать админ. Кусты", + Name = "AdminCluster.get" + }, + new + { + Id = 103, + Description = "Разрешение удалять админ. Компании", + Name = "AdminCompany.delete" + }, + new + { + Id = 104, + Description = "Разрешение редактировать админ. Компании", + Name = "AdminCompany.edit" + }, + new + { + Id = 105, + Description = "Разрешение просматривать админ. Компании", + Name = "AdminCompany.get" + }, + new + { + Id = 106, + Description = "Разрешение удалять админ. Типы компаний", + Name = "AdminCompanyType.delete" + }, + new + { + Id = 107, + Description = "Разрешение редактировать админ. Типы компаний", + Name = "AdminCompanyType.edit" + }, + new + { + Id = 108, + Description = "Разрешение просматривать админ. Типы компаний", + Name = "AdminCompanyType.get" + }, + new + { + Id = 109, + Description = "Разрешение удалять админ. Месторождения", + Name = "AdminDeposit.delete" + }, + new + { + Id = 110, + Description = "Разрешение редактировать админ. Месторождения", + Name = "AdminDeposit.edit" + }, + new + { + Id = 111, + Description = "Разрешение просматривать админ. Месторождения", + Name = "AdminDeposit.get" + }, + new + { + Id = 112, + Description = "Разрешение удалять админ. Разрешения", + Name = "AdminPermission.delete" + }, + new + { + Id = 113, + Description = "Разрешение редактировать админ. Разрешения", + Name = "AdminPermission.edit" + }, + new + { + Id = 114, + Description = "Разрешение просматривать админ. Разрешения", + Name = "AdminPermission.get" + }, + new + { + Id = 115, + Description = "Разрешение удалять админ. Телеметрию", + Name = "AdminTelemetry.delete" + }, + new + { + Id = 116, + Description = "Разрешение редактировать админ. Телеметрию", + Name = "AdminTelemetry.edit" + }, + new + { + Id = 117, + Description = "Разрешение просматривать админ. Телеметрию", + Name = "AdminTelemetry.get" + }, + new + { + Id = 118, + Description = "Разрешение удалять админ. Пользователей", + Name = "AdminUser.delete" + }, + new + { + Id = 119, + Description = "Разрешение редактировать админ. Пользователей", + Name = "AdminUser.edit" + }, + new + { + Id = 120, + Description = "Разрешение просматривать админ. Пользователей", + Name = "AdminUser.get" + }, + new + { + Id = 121, + Description = "Разрешение удалять админ. Роли пользователей", + Name = "AdminUserRole.delete" + }, + new + { + Id = 122, + Description = "Разрешение редактировать админ. Роли пользователей", + Name = "AdminUserRole.edit" + }, + new + { + Id = 123, + Description = "Разрешение просматривать админ. Роли пользователей", + Name = "AdminUserRole.get" + }, + new + { + Id = 124, + Description = "Разрешение удалять админ. Скважины", + Name = "AdminWell.delete" + }, + new + { + Id = 125, + Description = "Разрешение редактировать админ. Скважины", + Name = "AdminWell.edit" + }, + new + { + Id = 126, + Description = "Разрешение просматривать админ. Скважины", + Name = "AdminWell.get" + }, + new + { + Id = 127, + Description = "Разрешение удалять админ. Подсистемы", + Name = "AdminSubsytem.delete" + }, + new + { + Id = 128, + Description = "Разрешение редактировать админ. Подсистемы", + Name = "AdminSubsytem.edit" + }, + new + { + Id = 129, + Description = "Разрешение просматривать админ. Подсистемы", + Name = "AdminSubsytem.get" + }, + new + { + Id = 200, + Description = "Разрешение редактировать 0", + Name = "Auth.edit" + }, + new + { + Id = 201, + Description = "Разрешение просматривать 0", + Name = "Auth.get" + }, + new + { + Id = 202, + Description = "Разрешение просматривать Кусты", + Name = "Cluster.get" + }, + new + { + Id = 203, + Description = "Разрешение просматривать Месторождения", + Name = "Deposit.get" + }, + new + { + Id = 204, + Description = "Разрешение удалять РТК", + Name = "DrillFlowChart.delete" + }, + new + { + Id = 205, + Description = "Разрешение редактировать РТК", + Name = "DrillFlowChart.edit" + }, + new + { + Id = 206, + Description = "Разрешение просматривать РТК", + Name = "DrillFlowChart.get" + }, + new + { + Id = 207, + Description = "Разрешение удалять Программу бурения", + Name = "DrillingProgram.delete" + }, + new + { + Id = 208, + Description = "Разрешение редактировать Программу бурения", + Name = "DrillingProgram.edit" + }, + new + { + Id = 209, + Description = "Разрешение просматривать Программу бурения", + Name = "DrillingProgram.get" + }, + new + { + Id = 210, + Description = "Разрешение удалять Режимы бурения", + Name = "DrillParams.delete" + }, + new + { + Id = 211, + Description = "Разрешение редактировать Режимы бурения", + Name = "DrillParams.edit" + }, + new + { + Id = 212, + Description = "Разрешение просматривать Режимы бурения", + Name = "DrillParams.get" + }, + new + { + Id = 213, + Description = "Разрешение удалять Файлы", + Name = "File.delete" + }, + new + { + Id = 214, + Description = "Разрешение редактировать Файлы", + Name = "File.edit" + }, + new + { + Id = 215, + Description = "Разрешение просматривать Файлы", + Name = "File.get" + }, + new + { + Id = 216, + Description = "Разрешение удалять Измерения", + Name = "Measure.delete" + }, + new + { + Id = 217, + Description = "Разрешение редактировать Измерения", + Name = "Measure.edit" + }, + new + { + Id = 218, + Description = "Разрешение просматривать Измерения", + Name = "Measure.get" + }, + new + { + Id = 219, + Description = "Разрешение просматривать Сообщения телеметрии", + Name = "Message.get" + }, + new + { + Id = 220, + Description = "Разрешение просматривать Статистику по операциям", + Name = "OperationStat.get" + }, + new + { + Id = 221, + Description = "Разрешение редактировать Рапорта", + Name = "Report.edit" + }, + new + { + Id = 222, + Description = "Разрешение просматривать Рапорта", + Name = "Report.get" + }, + new + { + Id = 223, + Description = "Разрешение просматривать админ. Системная статистика", + Name = "RequestTracker.get" + }, + new + { + Id = 224, + Description = "Разрешение удалять Рекомендации уставок", + Name = "Setpoints.delete" + }, + new + { + Id = 225, + Description = "Разрешение редактировать Рекомендации уставок", + Name = "Setpoints.edit" + }, + new + { + Id = 226, + Description = "Разрешение просматривать Рекомендации уставок", + Name = "Setpoints.get" + }, + new + { + Id = 227, + Description = "Разрешение редактировать Телеметрии", + Name = "Telemetry.edit" + }, + new + { + Id = 228, + Description = "Разрешение просматривать Анализ телеметрии", + Name = "TelemetryAnalytics.get" + }, + new + { + Id = 229, + Description = "Разрешение редактировать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.edit" + }, + new + { + Id = 230, + Description = "Разрешение просматривать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.get" + }, + new + { + Id = 231, + Description = "Разрешение редактировать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.edit" + }, + new + { + Id = 232, + Description = "Разрешение просматривать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.get" + }, + new + { + Id = 233, + Description = "Разрешение редактировать Скважины", + Name = "Well.edit" + }, + new + { + Id = 234, + Description = "Разрешение просматривать Скважины", + Name = "Well.get" + }, + new + { + Id = 235, + Description = "Разрешение редактировать Композитные скважины", + Name = "WellComposite.edit" + }, + new + { + Id = 236, + Description = "Разрешение просматривать Композитные скважины", + Name = "WellComposite.get" + }, + new + { + Id = 237, + Description = "Разрешение удалять Операции по скважинам", + Name = "WellOperation.delete" + }, + new + { + Id = 238, + Description = "Разрешение редактировать Операции по скважинам", + Name = "WellOperation.edit" + }, + new + { + Id = 239, + Description = "Разрешение просматривать Операции по скважинам", + Name = "WellOperation.get" + }, + new + { + Id = 240, + Description = "Разрешение редактировать Файлы категории 1 (Растворный сервис)", + Name = "File.edit1" + }, + new + { + Id = 241, + Description = "Разрешение редактировать Файлы категории 2 (Цементирование)", + Name = "File.edit2" + }, + new + { + Id = 242, + Description = "Разрешение редактировать Файлы категории 3 (ННБ)", + Name = "File.edit3" + }, + new + { + Id = 243, + Description = "Разрешение редактировать Файлы категории 4 (ГТИ)", + Name = "File.edit4" + }, + new + { + Id = 244, + Description = "Разрешение редактировать Файлы категории 5 (Документы по скважине)", + Name = "File.edit5" + }, + new + { + Id = 245, + Description = "Разрешение редактировать Файлы категории 6 (Супервайзер)", + Name = "File.edit6" + }, + new + { + Id = 246, + Description = "Разрешение редактировать Файлы категории 7 (Мастер)", + Name = "File.edit7" + }, + new + { + Id = 247, + Description = "Разрешение редактировать Файлы категории 8 (Долотный сервис)", + Name = "File.edit8" + }, + new + { + Id = 248, + Description = "Разрешение редактировать Файлы категории 9 (Буровой подрядчик)", + Name = "File.edit9" + }, + new + { + Id = 249, + Description = "Разрешение редактировать Файлы категории 10 (Сервис по заканчиванию скважины)", + Name = "File.edit10" + }, + new + { + Id = 250, + Description = "Разрешение редактировать Файлы категории 11 (Рапорт)", + Name = "File.edit11" + }, + new + { + Id = 251, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit12" + }, + new + { + Id = 252, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit13" + }, + new + { + Id = 253, + Description = "Разрешение редактировать Файлы категории 13", + Name = "File.edit14" + }, + new + { + Id = 254, + Description = "Разрешение редактировать Файлы категории 14", + Name = "File.edit15" + }, + new + { + Id = 255, + Description = "Разрешение редактировать Файлы категории 15", + Name = "File.edit16" + }, + new + { + Id = 256, + Description = "Разрешение редактировать Файлы категории 16", + Name = "File.edit17" + }, + new + { + Id = 257, + Description = "Разрешение редактировать Файлы категории 17", + Name = "File.edit18" + }, + new + { + Id = 258, + Description = "Разрешение редактировать Файлы категории 18", + Name = "File.edit19" + }, + new + { + Id = 259, + Description = "Разрешение редактировать Файлы категории 19", + Name = "File.edit20" + }, + new + { + Id = 260, + Description = "Разрешение редактировать Файлы категории 20", + Name = "File.edit21" + }, + new + { + Id = 261, + Description = "Разрешение редактировать Файлы категории 21", + Name = "File.edit22" + }, + new + { + Id = 262, + Description = "Разрешение редактировать Файлы категории 22", + Name = "File.edit23" + }, + new + { + Id = 263, + Description = "Разрешение редактировать Файлы категории 23", + Name = "File.edit24" + }, + new + { + Id = 264, + Description = "Разрешение редактировать Файлы категории 24", + Name = "File.edit25" + }, + new + { + Id = 265, + Description = "Разрешение редактировать Файлы категории 25", + Name = "File.edit26" + }, + new + { + Id = 266, + Description = "Разрешение редактировать Файлы категории 26", + Name = "File.edit27" + }, + new + { + Id = 267, + Description = "Разрешение редактировать Файлы категории 27", + Name = "File.edit28" + }, + new + { + Id = 268, + Description = "Разрешение редактировать Файлы категории 28", + Name = "File.edit29" + }, + new + { + Id = 269, + Description = "Разрешение редактировать Файлы категории 29", + Name = "File.edit30" + }, + new + { + Id = 380, + Description = "Разрешение просматривать список бурильщиков", + Name = "Driller.get" + }, + new + { + Id = 381, + Description = "Разрешение редактировать бурильщика", + Name = "Driller.edit" + }, + new + { + Id = 382, + Description = "Разрешение удалять бурильщик", + Name = "Driller.delete" + }, + new + { + Id = 383, + Description = "Разрешение просматривать графики бурильщиков", + Name = "Schedule.get" + }, + new + { + Id = 384, + Description = "Разрешение редактировать график бурильщика", + Name = "Schedule.edit" + }, + new + { + Id = 385, + Description = "Разрешение удалять график бурильщика", + Name = "Schedule.delete" + }, + new + { + Id = 386, + Description = "Разрешение просматривать суточный рапорт", + Name = "DailyReport.get" + }, + new + { + Id = 387, + Description = "Разрешение редактировать суточный рапорт", + Name = "DailyReport.edit" + }, + new + { + Id = 388, + Description = "Разрешение просматривать авто. определенные операции", + Name = "DetectedOperation.get" + }, + new + { + Id = 389, + Description = "Разрешение просматривать целевые значения", + Name = "OperationValue.get" + }, + new + { + Id = 390, + Description = "Разрешение редактировать целевые значения", + Name = "OperationValue.edit" + }, + new + { + Id = 391, + Description = "Разрешение удалять целевые значения", + Name = "OperationValue.delete" + }, + new + { + Id = 400, + Description = "Разрешение просматривать инфо по wits параметрам", + Name = "WitsInfo.get" + }, + new + { + Id = 401, + Description = "Разрешение просматривать WITS record 1", + Name = "WitsRecord1.get" + }, + new + { + Id = 407, + Description = "Разрешение просматривать WITS record 7", + Name = "WitsRecord7.get" + }, + new + { + Id = 408, + Description = "Разрешение просматривать WITS record 8", + Name = "WitsRecord8.get" + }, + new + { + Id = 450, + Description = "Разрешение просматривать WITS record 50", + Name = "WitsRecord50.get" + }, + new + { + Id = 460, + Description = "Разрешение просматривать WITS record 60", + Name = "WitsRecord60.get" + }, + new + { + Id = 461, + Description = "Разрешение просматривать WITS record 61", + Name = "WitsRecord61.get" + }); + }); + + 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.RelationUserDrillingProgramPart", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdDrillingProgramPart") + .HasColumnType("integer") + .HasColumnName("id_drilling_program_part"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_role") + .HasComment("1 - publisher, 2 - approver"); + + b.HasKey("IdUser", "IdDrillingProgramPart") + .HasName("t_relation_user_drilling_program_part_pk"); + + b.HasIndex("IdDrillingProgramPart"); + + b.ToTable("t_relation_user_drilling_program_part"); + + b.HasComment("Отношение пользователей и частей ПБ"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdPermission") + .HasColumnType("integer") + .HasColumnName("id_permission"); + + b.HasKey("IdUserRole", "IdPermission"); + + b.HasIndex("IdPermission"); + + b.ToTable("t_relation_user_role_permission"); + + b.HasComment("Отношение ролей пользователей и разрешений доступа"); + + b.HasData( + new + { + IdUserRole = 1100, + IdPermission = 102 + }, + new + { + IdUserRole = 1100, + IdPermission = 111 + }, + new + { + IdUserRole = 1101, + IdPermission = 101 + }, + new + { + IdUserRole = 1101, + IdPermission = 100 + }, + new + { + IdUserRole = 1102, + IdPermission = 105 + }, + new + { + IdUserRole = 1102, + IdPermission = 108 + }, + new + { + IdUserRole = 1103, + IdPermission = 104 + }, + new + { + IdUserRole = 1103, + IdPermission = 103 + }, + new + { + IdUserRole = 1104, + IdPermission = 108 + }, + new + { + IdUserRole = 1105, + IdPermission = 107 + }, + new + { + IdUserRole = 1105, + IdPermission = 106 + }, + new + { + IdUserRole = 1106, + IdPermission = 111 + }, + new + { + IdUserRole = 1107, + IdPermission = 110 + }, + new + { + IdUserRole = 1107, + IdPermission = 109 + }, + new + { + IdUserRole = 1108, + IdPermission = 114 + }, + new + { + IdUserRole = 1109, + IdPermission = 113 + }, + new + { + IdUserRole = 1109, + IdPermission = 112 + }, + new + { + IdUserRole = 1110, + IdPermission = 123 + }, + new + { + IdUserRole = 1110, + IdPermission = 114 + }, + new + { + IdUserRole = 1111, + IdPermission = 122 + }, + new + { + IdUserRole = 1111, + IdPermission = 121 + }, + new + { + IdUserRole = 1112, + IdPermission = 117 + }, + new + { + IdUserRole = 1113, + IdPermission = 105 + }, + new + { + IdUserRole = 1113, + IdPermission = 123 + }, + new + { + IdUserRole = 1113, + IdPermission = 120 + }, + new + { + IdUserRole = 1114, + IdPermission = 119 + }, + new + { + IdUserRole = 1114, + IdPermission = 118 + }, + new + { + IdUserRole = 1114, + IdPermission = 200 + }, + new + { + IdUserRole = 1115, + IdPermission = 223 + }, + new + { + IdUserRole = 1116, + IdPermission = 105 + }, + new + { + IdUserRole = 1116, + IdPermission = 102 + }, + new + { + IdUserRole = 1116, + IdPermission = 117 + }, + new + { + IdUserRole = 1116, + IdPermission = 126 + }, + new + { + IdUserRole = 1117, + IdPermission = 125 + }, + new + { + IdUserRole = 1117, + IdPermission = 124 + }, + new + { + IdUserRole = 1200, + IdPermission = 203 + }, + new + { + IdUserRole = 1200, + IdPermission = 230 + }, + new + { + IdUserRole = 1201, + IdPermission = 202 + }, + new + { + IdUserRole = 1201, + IdPermission = 203 + }, + new + { + IdUserRole = 1201, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 203 + }, + new + { + IdUserRole = 1202, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 236 + }, + new + { + IdUserRole = 1202, + IdPermission = 212 + }, + new + { + IdUserRole = 1203, + IdPermission = 235 + }, + new + { + IdUserRole = 1204, + IdPermission = 202 + }, + new + { + IdUserRole = 1204, + IdPermission = 203 + }, + new + { + IdUserRole = 1205, + IdPermission = 215 + }, + new + { + IdUserRole = 1206, + IdPermission = 203 + }, + new + { + IdUserRole = 1206, + IdPermission = 206 + }, + new + { + IdUserRole = 1207, + IdPermission = 205 + }, + new + { + IdUserRole = 1208, + IdPermission = 218 + }, + new + { + IdUserRole = 1209, + IdPermission = 217 + }, + new + { + IdUserRole = 1210, + IdPermission = 203 + }, + new + { + IdUserRole = 1210, + IdPermission = 230 + }, + new + { + IdUserRole = 1210, + IdPermission = 219 + }, + new + { + IdUserRole = 1211, + IdPermission = 203 + }, + new + { + IdUserRole = 1211, + IdPermission = 220 + }, + new + { + IdUserRole = 1211, + IdPermission = 239 + }, + new + { + IdUserRole = 1212, + IdPermission = 238 + }, + new + { + IdUserRole = 1212, + IdPermission = 237 + }, + new + { + IdUserRole = 1213, + IdPermission = 203 + }, + new + { + IdUserRole = 1213, + IdPermission = 239 + }, + new + { + IdUserRole = 1213, + IdPermission = 212 + }, + new + { + IdUserRole = 1214, + IdPermission = 211 + }, + new + { + IdUserRole = 1214, + IdPermission = 210 + }, + new + { + IdUserRole = 1215, + IdPermission = 203 + }, + new + { + IdUserRole = 1215, + IdPermission = 222 + }, + new + { + IdUserRole = 1216, + IdPermission = 221 + }, + new + { + IdUserRole = 1217, + IdPermission = 226 + }, + new + { + IdUserRole = 1218, + IdPermission = 225 + }, + new + { + IdUserRole = 1218, + IdPermission = 224 + }, + new + { + IdUserRole = 1219, + IdPermission = 203 + }, + new + { + IdUserRole = 1219, + IdPermission = 206 + }, + new + { + IdUserRole = 1219, + IdPermission = 230 + }, + new + { + IdUserRole = 1219, + IdPermission = 232 + }, + new + { + IdUserRole = 1220, + IdPermission = 203 + }, + new + { + IdUserRole = 1220, + IdPermission = 228 + }, + new + { + IdUserRole = 1221, + IdPermission = 202 + }, + new + { + IdUserRole = 1221, + IdPermission = 203 + }, + new + { + IdUserRole = 1221, + IdPermission = 220 + }, + new + { + IdUserRole = 1221, + IdPermission = 234 + }, + new + { + IdUserRole = 1501, + IdPermission = 214 + }, + new + { + IdUserRole = 1501, + IdPermission = 213 + }, + new + { + IdUserRole = 1502, + IdPermission = 207 + }, + new + { + IdUserRole = 1502, + IdPermission = 208 + }, + new + { + IdUserRole = 2000, + IdPermission = 205 + }, + new + { + IdUserRole = 2000, + IdPermission = 204 + }, + new + { + IdUserRole = 2000, + IdPermission = 245 + }, + new + { + IdUserRole = 2001, + IdPermission = 244 + }, + new + { + IdUserRole = 2001, + IdPermission = 245 + }, + new + { + IdUserRole = 2002, + IdPermission = 244 + }, + new + { + IdUserRole = 2002, + IdPermission = 246 + }, + new + { + IdUserRole = 2002, + IdPermission = 237 + }, + new + { + IdUserRole = 2002, + IdPermission = 238 + }, + new + { + IdUserRole = 2003, + IdPermission = 240 + }, + new + { + IdUserRole = 2003, + IdPermission = 217 + }, + new + { + IdUserRole = 2003, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 242 + }, + new + { + IdUserRole = 2004, + IdPermission = 217 + }, + new + { + IdUserRole = 2004, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 205 + }, + new + { + IdUserRole = 2004, + IdPermission = 204 + }, + new + { + IdUserRole = 2005, + IdPermission = 247 + }, + new + { + IdUserRole = 2005, + IdPermission = 205 + }, + new + { + IdUserRole = 2005, + IdPermission = 204 + }, + new + { + IdUserRole = 2006, + IdPermission = 243 + }, + new + { + IdUserRole = 2006, + IdPermission = 205 + }, + new + { + IdUserRole = 2006, + IdPermission = 204 + }, + new + { + IdUserRole = 2007, + IdPermission = 241 + }, + new + { + IdUserRole = 2007, + IdPermission = 205 + }, + new + { + IdUserRole = 2007, + IdPermission = 204 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.Property("IdInclude") + .HasColumnType("integer") + .HasColumnName("id_include_user_role"); + + b.HasKey("Id", "IdInclude") + .HasName("t_relation_user_role_user_role_pk"); + + b.HasIndex("IdInclude"); + + b.ToTable("t_relation_user_role_user_role"); + + b.HasComment("Отношение ролей к ролям"); + + b.HasData( + new + { + Id = 1101, + IdInclude = 1100 + }, + new + { + Id = 1103, + IdInclude = 1102 + }, + new + { + Id = 1105, + IdInclude = 1104 + }, + new + { + Id = 1107, + IdInclude = 1106 + }, + new + { + Id = 1109, + IdInclude = 1108 + }, + new + { + Id = 1111, + IdInclude = 1110 + }, + new + { + Id = 1114, + IdInclude = 1113 + }, + new + { + Id = 1117, + IdInclude = 1116 + }, + new + { + Id = 1203, + IdInclude = 1202 + }, + new + { + Id = 1207, + IdInclude = 1206 + }, + new + { + Id = 1209, + IdInclude = 1208 + }, + new + { + Id = 1212, + IdInclude = 1211 + }, + new + { + Id = 1214, + IdInclude = 1213 + }, + new + { + Id = 1216, + IdInclude = 1215 + }, + new + { + Id = 1218, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1200 + }, + new + { + Id = 2000, + IdInclude = 1201 + }, + new + { + Id = 2000, + IdInclude = 1202 + }, + new + { + Id = 2000, + IdInclude = 1204 + }, + new + { + Id = 2000, + IdInclude = 1205 + }, + new + { + Id = 2000, + IdInclude = 1206 + }, + new + { + Id = 2000, + IdInclude = 1208 + }, + new + { + Id = 2000, + IdInclude = 1210 + }, + new + { + Id = 2000, + IdInclude = 1211 + }, + new + { + Id = 2000, + IdInclude = 1213 + }, + new + { + Id = 2000, + IdInclude = 1215 + }, + new + { + Id = 2000, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1219 + }, + new + { + Id = 2000, + IdInclude = 1220 + }, + new + { + Id = 2000, + IdInclude = 1221 + }, + new + { + Id = 2000, + IdInclude = 1500 + }, + new + { + Id = 2000, + IdInclude = 1501 + }, + new + { + Id = 2000, + IdInclude = 1502 + }, + new + { + Id = 2001, + IdInclude = 1500 + }, + new + { + Id = 2001, + IdInclude = 1501 + }, + new + { + Id = 2001, + IdInclude = 1502 + }, + new + { + Id = 2002, + IdInclude = 1500 + }, + new + { + Id = 2002, + IdInclude = 1501 + }, + new + { + Id = 2002, + IdInclude = 1502 + }, + new + { + Id = 2003, + IdInclude = 1500 + }, + new + { + Id = 2003, + IdInclude = 1501 + }, + new + { + Id = 2003, + IdInclude = 1502 + }, + new + { + Id = 2004, + IdInclude = 1500 + }, + new + { + Id = 2004, + IdInclude = 1501 + }, + new + { + Id = 2004, + IdInclude = 1502 + }, + new + { + Id = 2005, + IdInclude = 1500 + }, + new + { + Id = 2005, + IdInclude = 1501 + }, + new + { + Id = 2005, + IdInclude = 1502 + }, + new + { + Id = 2006, + IdInclude = 1500 + }, + new + { + Id = 2006, + IdInclude = 1501 + }, + new + { + Id = 2006, + IdInclude = 1502 + }, + new + { + Id = 2007, + IdInclude = 1500 + }, + new + { + Id = 2007, + IdInclude = 1501 + }, + new + { + Id = 2007, + IdInclude = 1502 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_user_role"); + + b.HasKey("IdUser", "IdUserRole"); + + b.HasIndex("IdUserRole"); + + b.ToTable("t_relation_user_user_role"); + + b.HasComment("Отношение пользователей и ролей"); + + b.HasData( + new + { + IdUser = 1, + IdUserRole = 1 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Begin") + .HasColumnType("timestamp with time zone") + .HasColumnName("begin"); + + b.Property("End") + .HasColumnType("timestamp with time zone") + .HasColumnName("end") + .HasComment("timestamp with time zone"); + + b.Property("Format") + .HasColumnType("integer") + .HasColumnName("format") + .HasComment("Формат отчета"); + + b.Property("IdFile") + .HasColumnType("integer") + .HasColumnName("id_file") + .HasComment("id файла-родителя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("Step") + .HasColumnType("integer") + .HasColumnName("step") + .HasComment("размер шага в секундах"); + + b.HasKey("Id"); + + b.HasIndex("IdFile"); + + b.HasIndex("IdWell"); + + b.ToTable("t_report_property"); + + b.HasComment("Отчеты с данными по буровым"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DrillEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_end") + .HasComment("Конец вахты"); + + b.Property("DrillStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_start") + .HasComment("Начало вахты"); + + b.Property("IdDriller") + .HasColumnType("integer") + .HasColumnName("id_driller") + .HasComment("Идентификатор бурильщика"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Идентификатор скважины"); + + b.Property("ShiftEnd") + .HasColumnType("time without time zone") + .HasColumnName("shift_end") + .HasComment("Конец смены"); + + b.Property("ShiftStart") + .HasColumnType("time without time zone") + .HasColumnName("shift_start") + .HasComment("Начало смены"); + + b.HasKey("Id"); + + b.HasIndex("IdDriller"); + + b.HasIndex("IdWell"); + + b.ToTable("t_schedule"); + + b.HasComment("График работы бурильщика"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("комментарий для оператора"); + + b.Property("IdAuthor") + .HasColumnType("integer") + .HasColumnName("id_author") + .HasComment("Id пользователя, загрузившего файл"); + + b.Property("IdState") + .HasColumnType("integer") + .HasColumnName("id_state") + .HasComment("0: неизвестно, 1:ожидает отправки, 2: отправлено, 3: принято оператором, 4: отклонено оператором, 5: устарело"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("id скважины"); + + b.Property("ObsolescenceSec") + .HasColumnType("integer") + .HasColumnName("obsolescence") + .HasComment("сек. до устаревания"); + + b.Property("Setpoints") + .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.Subsystems.Subsystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("description"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("t_subsystem"); + + b.HasComment("Описание подсистем"); + + b.HasData( + new + { + Id = 1, + Description = "Ручной", + Name = "Ручной" + }, + new + { + Id = 2, + Description = "Бурение в роторе", + Name = "Бурение в роторе" + }, + new + { + Id = 3, + Description = "Проработка", + Name = "Проработка" + }, + new + { + Id = 4, + Description = "Бурение в слайде", + Name = "Бурение в слайде" + }, + new + { + Id = 5, + Description = "Спуск СПО", + Name = "Спуск СПО" + }, + new + { + Id = 6, + Description = "Подъем СПО", + Name = "Подъем СПО" + }, + new + { + Id = 7, + Description = "Подъем с проработкой", + Name = "Подъем с проработкой" + }, + new + { + Id = 11, + Description = "Блокировка", + Name = "Блокировка" + }, + new + { + Id = 65536, + Description = "Spin master", + Name = "Spin master" + }, + new + { + Id = 65537, + Description = "Torque master", + Name = "Torque master" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Subsystems.SubsystemOperationTime", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("дата/время выключения подсистемы"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("дата/время включения подсистемы"); + + b.Property("DepthEnd") + .HasColumnType("real") + .HasColumnName("depth_end") + .HasComment("глубина забоя на момент выключения подсистемы"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depth_start") + .HasComment("глубина забоя на момент включения подсистемы"); + + b.Property("IdSubsystem") + .HasColumnType("integer") + .HasColumnName("id_subsystem"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("ИД телеметрии по которой выдается информация"); + + b.HasKey("Id"); + + b.HasIndex("IdSubsystem"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_subsystem_operation_time"); + + b.HasComment("наработки подсистем"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Информация с панели о скважине"); + + b.Property("RemoteUid") + .HasColumnType("text") + .HasColumnName("remote_uid") + .HasComment("Идентификатор передающего устройства. Может повторяться в списке, так как комплекты оборудования переезжают от скв. к скв."); + + b.Property("TimeZone") + .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.TelemetryDataSaub", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("AxialLoad") + .HasColumnType("real") + .HasColumnName("axial_load") + .HasComment("Осевая нагрузка"); + + b.Property("AxialLoadLimitMax") + .HasColumnType("real") + .HasColumnName("axial_load_limit_max") + .HasComment("Осевая нагрузка. Аварийная макс."); + + b.Property("AxialLoadSp") + .HasColumnType("real") + .HasColumnName("axial_load_sp") + .HasComment("Осевая нагрузка. Задание"); + + b.Property("BitDepth") + .HasColumnType("real") + .HasColumnName("bit_depth") + .HasComment("Положение инструмента"); + + b.Property("BlockPosition") + .HasColumnType("real") + .HasColumnName("block_position") + .HasComment("Высота талевого блока"); + + b.Property("BlockPositionMax") + .HasColumnType("real") + .HasColumnName("block_position_max") + .HasComment("Талевый блок. Макс положение"); + + b.Property("BlockPositionMin") + .HasColumnType("real") + .HasColumnName("block_position_min") + .HasComment("Талевый блок. Мин положение"); + + b.Property("BlockSpeed") + .HasColumnType("real") + .HasColumnName("block_speed") + .HasComment("Скорость талевого блока"); + + b.Property("BlockSpeedSp") + .HasColumnType("real") + .HasColumnName("block_speed_sp") + .HasComment("Скорости талевого блока. Задание"); + + b.Property("BlockSpeedSpDevelop") + .HasColumnType("real") + .HasColumnName("block_speed_sp_develop") + .HasComment("Талевый блок. Задание скорости для проработки"); + + b.Property("BlockSpeedSpRotor") + .HasColumnType("real") + .HasColumnName("block_speed_sp_rotor") + .HasComment("Талевый блок. Задание скорости для роторного бурения"); + + b.Property("BlockSpeedSpSlide") + .HasColumnType("real") + .HasColumnName("block_speed_sp_slide") + .HasComment("Талевый блок. Задание скорости для режима слайда"); + + b.Property("Flow") + .HasColumnType("real") + .HasColumnName("flow") + .HasComment("Расход"); + + b.Property("FlowDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("flow_delta_limit_max") + .HasComment("Расход. Аварийный макс."); + + b.Property("FlowIdle") + .HasColumnType("real") + .HasColumnName("flow_idle") + .HasComment("Расход. Холостой ход"); + + b.Property("HookWeight") + .HasColumnType("real") + .HasColumnName("hook_weight") + .HasComment("Вес на крюке"); + + b.Property("HookWeightIdle") + .HasColumnType("real") + .HasColumnName("hook_weight_idle") + .HasComment("Вес на крюке. Холостой ход"); + + b.Property("HookWeightLimitMax") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_max") + .HasComment("Вес на крюке. Затяжка"); + + b.Property("HookWeightLimitMin") + .HasColumnType("real") + .HasColumnName("hook_weight_limit_min") + .HasComment("Вес на крюке. Посадка"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator") + .HasComment("Текущий критерий бурения"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Пользователь САУБ"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Режим САУБ"); + + b.Property("Mse") + .HasColumnType("real") + .HasColumnName("mse") + .HasComment("MSE"); + + b.Property("MseState") + .HasColumnType("smallint") + .HasColumnName("mse_state") + .HasComment("Текущее состояние работы MSE"); + + b.Property("Pressure") + .HasColumnType("real") + .HasColumnName("pressure") + .HasComment("Давление"); + + b.Property("PressureDeltaLimitMax") + .HasColumnType("real") + .HasColumnName("pressure_delta_limit_max") + .HasComment("Давление дифф. Аварийное макс."); + + b.Property("PressureIdle") + .HasColumnType("real") + .HasColumnName("pressure_idle") + .HasComment("Давление. Холостой ход"); + + b.Property("PressureSp") + .HasColumnType("real") + .HasColumnName("pressure_sp") + .HasComment("Давление. Задание"); + + b.Property("PressureSpDevelop") + .HasColumnType("real") + .HasColumnName("pressure_sp_develop") + .HasComment("Давление. Задание для проработки"); + + b.Property("PressureSpRotor") + .HasColumnType("real") + .HasColumnName("pressure_sp_rotor") + .HasComment("Давление. Задание для роторного бурения"); + + b.Property("PressureSpSlide") + .HasColumnType("real") + .HasColumnName("pressure_sp_slide") + .HasComment("Давление. Задание для режима слайда"); + + b.Property("RotorSpeed") + .HasColumnType("real") + .HasColumnName("rotor_speed") + .HasComment("Обороты ротора"); + + b.Property("RotorTorque") + .HasColumnType("real") + .HasColumnName("rotor_torque") + .HasComment("Момент на роторе"); + + b.Property("RotorTorqueIdle") + .HasColumnType("real") + .HasColumnName("rotor_torque_idle") + .HasComment("Момент на роторе. Холостой ход"); + + b.Property("RotorTorqueLimitMax") + .HasColumnType("real") + .HasColumnName("rotor_torque_limit_max") + .HasComment("Момент на роторе. Аварийный макс."); + + b.Property("RotorTorqueSp") + .HasColumnType("real") + .HasColumnName("rotor_torque_sp") + .HasComment("Момент на роторе. Задание"); + + b.Property("WellDepth") + .HasColumnType("real") + .HasColumnName("well_depth") + .HasComment("Глубина забоя"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_data_saub"); + + b.HasComment("набор основных данных по SAUB"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaubStat", b => + { + b.Property("Count") + .HasColumnType("bigint") + .HasColumnName("count_items"); + + b.Property("DateMax") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_max"); + + b.Property("DateMin") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_min"); + + b.Property("DepthMax") + .HasColumnType("real") + .HasColumnName("depth_max"); + + b.Property("DepthMin") + .HasColumnType("real") + .HasColumnName("depth_min"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.ToView("mw_telemetry_datas_saub_stat"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("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", "DateTime"); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Arg0") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg0") + .HasComment("Аргумент №0 для вставки в шаблон сообщения"); + + b.Property("Arg1") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg1"); + + b.Property("Arg2") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg2"); + + b.Property("Arg3") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("arg3"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("IdEvent") + .HasColumnType("integer") + .HasColumnName("id_event"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdTelemetryUser") + .HasColumnType("integer") + .HasColumnName("id_telemetry_user") + .HasComment("Пользователь панели отправляющей телеметрию. не пользователь облака."); + + b.Property("WellDepth") + .HasColumnType("double precision") + .HasColumnName("well_depth"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_telemetry_message"); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("email") + .HasComment("должность"); + + b.Property("IdCompany") + .HasColumnType("integer") + .HasColumnName("id_company"); + + b.Property("IdState") + .HasColumnType("smallint") + .HasColumnName("state") + .HasComment("состояние:\n100 - удален"); + + 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("Surname") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("фамилия"); + + b.HasKey("Id"); + + b.HasIndex("IdCompany"); + + b.HasIndex("Login") + .IsUnique(); + + b.ToTable("t_user"); + + b.HasComment("Пользователи облака"); + + b.HasData( + new + { + Id = 1, + IdCompany = 1, + Login = "dev", + Name = "Разработчик", + PasswordHash = "Vlcj|4fa529103dde7ff72cfe76185f344d4aa87931f8e1b2044e8a7739947c3d18923464eaad93843e4f809c5e126d013072" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.Property("IdType") + .HasColumnType("integer") + .HasColumnName("id_type") + .HasComment("0-роль из стандартной матрицы, \n1-специальная роль для какого-либо пользователя"); + + b.HasKey("Id"); + + b.ToTable("t_user_role"); + + b.HasComment("Роли пользователей в системе"); + + b.HasData( + new + { + Id = 1, + Caption = "root", + IdType = 1 + }, + new + { + Id = 1100, + Caption = "admin_cluster.view", + IdType = 1 + }, + new + { + Id = 1101, + Caption = "admin_cluster.edit", + IdType = 1 + }, + new + { + Id = 1102, + Caption = "admin_company.view", + IdType = 1 + }, + new + { + Id = 1103, + Caption = "admin_company.edit", + IdType = 1 + }, + new + { + Id = 1104, + Caption = "admin_company_type.view", + IdType = 1 + }, + new + { + Id = 1105, + Caption = "admin_company_type.edit", + IdType = 1 + }, + new + { + Id = 1106, + Caption = "admin_deposit.view", + IdType = 1 + }, + new + { + Id = 1107, + Caption = "admin_deposit.edit", + IdType = 1 + }, + new + { + Id = 1108, + Caption = "admin_permission.view", + IdType = 1 + }, + new + { + Id = 1109, + Caption = "admin_permission.edit", + IdType = 1 + }, + new + { + Id = 1110, + Caption = "admin_role.view", + IdType = 1 + }, + new + { + Id = 1111, + Caption = "admin_role.edit", + IdType = 1 + }, + new + { + Id = 1112, + Caption = "admin_telemetry.view", + IdType = 1 + }, + new + { + Id = 1113, + Caption = "admin_user.view", + IdType = 1 + }, + new + { + Id = 1114, + Caption = "admin_user.edit", + IdType = 1 + }, + new + { + Id = 1115, + Caption = "admin_visit_log.view", + IdType = 1 + }, + new + { + Id = 1116, + Caption = "admin_well.view", + IdType = 1 + }, + new + { + Id = 1117, + Caption = "admin_well.edit", + IdType = 1 + }, + new + { + Id = 1200, + Caption = "archive.view", + IdType = 1 + }, + new + { + Id = 1201, + Caption = "cluster.view", + IdType = 1 + }, + new + { + Id = 1202, + Caption = "composite.view", + IdType = 1 + }, + new + { + Id = 1203, + Caption = "composite.edit", + IdType = 1 + }, + new + { + Id = 1204, + Caption = "deposit.view", + IdType = 1 + }, + new + { + Id = 1205, + Caption = "document.view", + IdType = 1 + }, + new + { + Id = 1206, + Caption = "drillProcessFlow.view", + IdType = 1 + }, + new + { + Id = 1207, + Caption = "drillProcessFlow.edit", + IdType = 1 + }, + new + { + Id = 1208, + Caption = "measure.view", + IdType = 1 + }, + new + { + Id = 1209, + Caption = "measure.edit", + IdType = 1 + }, + new + { + Id = 1210, + Caption = "message.view", + IdType = 1 + }, + new + { + Id = 1211, + Caption = "operations.view", + IdType = 1 + }, + new + { + Id = 1212, + Caption = "operations.edit", + IdType = 1 + }, + new + { + Id = 1213, + Caption = "params.view", + IdType = 1 + }, + new + { + Id = 1214, + Caption = "params.edit", + IdType = 1 + }, + new + { + Id = 1215, + Caption = "report.view", + IdType = 1 + }, + new + { + Id = 1216, + Caption = "report.edit", + IdType = 1 + }, + new + { + Id = 1217, + Caption = "setpoints.view", + IdType = 1 + }, + new + { + Id = 1218, + Caption = "setpoints.edit", + IdType = 1 + }, + new + { + Id = 1219, + Caption = "telemetry.view", + IdType = 1 + }, + new + { + Id = 1220, + Caption = "telemetryAnalysis.view", + IdType = 1 + }, + new + { + Id = 1221, + Caption = "well.view", + IdType = 1 + }, + new + { + Id = 1500, + Caption = "Просмотр всего", + IdType = 1 + }, + new + { + Id = 1501, + Caption = "file.edit", + IdType = 1 + }, + new + { + Id = 1502, + Caption = "drillingProgram.edit", + IdType = 1 + }, + new + { + Id = 2000, + Caption = "Заказчик", + IdType = 0 + }, + new + { + Id = 2001, + Caption = "Супервайзер", + IdType = 0 + }, + new + { + Id = 2002, + Caption = "Буровой подрядчик", + IdType = 0 + }, + new + { + Id = 2003, + Caption = "Растворщик", + IdType = 0 + }, + new + { + Id = 2004, + Caption = "Телеметрист", + IdType = 0 + }, + new + { + Id = 2005, + Caption = "Долотный сервис", + IdType = 0 + }, + new + { + Id = 2006, + Caption = "ГТИ", + IdType = 0 + }, + new + { + Id = 2007, + Caption = "Цементирование", + IdType = 0 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("key") + .HasComment("Ключ настроек пользователя"); + + b.Property("Value") + .HasColumnType("jsonb") + .HasColumnName("setting_value") + .HasComment("Значение настроек пользователя"); + + b.HasKey("IdUser", "Key"); + + b.ToTable("t_user_settings"); + + b.HasComment("настройки интерфейса пользователя"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + 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.Property("Timezone") + .HasColumnType("jsonb") + .HasColumnName("timezone") + .HasComment("Смещение часового пояса от UTC"); + + 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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CategoryInfo") + .HasColumnType("text") + .HasColumnName("category_info") + .HasComment("Доп. информация к выбраной категории"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарий"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("Дата начала операции"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина после завершения операции, м"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Глубина на начало операции, м"); + + b.Property("DurationHours") + .HasColumnType("double precision") + .HasColumnName("duration_hours") + .HasComment("Продолжительность, часы"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("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"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .HasColumnType("integer") + .HasColumnName("code") + .HasComment("Код операции"); + + b.Property("KeyValueName") + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .HasColumnName("key_value_name") + .HasComment("Название ключевого показателя операции"); + + b.Property("KeyValueUnits") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("key_value_units") + .HasComment("Единицы измерения ключевого показателя операции"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории операции"); + + b.HasKey("Id"); + + b.ToTable("t_well_operation_category"); + + b.HasComment("Справочник операций на скважине"); + + b.HasData( + new + { + Id = 1, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Невозможно определить операцию" + }, + new + { + Id = 2, + Code = 0, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Роторное бурение" + }, + new + { + Id = 3, + Code = 0, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Слайдирование" + }, + new + { + Id = 4, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Подъем с проработкой" + }, + new + { + Id = 5, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Спуск с проработкой" + }, + new + { + Id = 6, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Подъем с промывкой" + }, + new + { + Id = 7, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Спуск с промывкой" + }, + new + { + Id = 8, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Спуск в скважину" + }, + new + { + Id = 9, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Спуск с вращением" + }, + new + { + Id = 10, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Подъем из скважины" + }, + new + { + Id = 11, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Подъем с вращением" + }, + new + { + Id = 12, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Промывка в покое" + }, + new + { + Id = 13, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Промывка с вращением" + }, + new + { + Id = 14, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Удержание в клиньях" + }, + new + { + Id = 15, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Неподвижное состояние" + }, + new + { + Id = 16, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Вращение без циркуляции" + }, + new + { + Id = 17, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "На поверхности" + }, + new + { + Id = 18, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Проработка перед наращиванием" + }, + new + { + Id = 19, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Шаблонировка перед наращиванием" + }, + new + { + Id = 20, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Промывка перед наращиванием" + }, + new + { + Id = 21, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Статический замер телесистемы" + }, + new + { + Id = 22, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Промывка" + }, + new + { + Id = 1001, + Code = 0, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Бурение" + }, + new + { + Id = 1002, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "ГИС" + }, + new + { + Id = 1003, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "ГФР" + }, + new + { + Id = 1004, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Монтаж ПВО" + }, + new + { + Id = 1005, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Демонтаж ПВО" + }, + new + { + Id = 1006, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Установка ФА" + }, + new + { + Id = 1007, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Оборудование устья" + }, + new + { + Id = 1008, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "ОЗЦ" + }, + new + { + Id = 1011, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Начало цикла строительства скважины" + }, + new + { + Id = 1012, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Окончание цикла строительства скважины" + }, + new + { + Id = 1013, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Опрессовка ПВО" + }, + new + { + Id = 1014, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Опрессовка Ц.К." + }, + new + { + Id = 1015, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Опрессовка ВЗД" + }, + new + { + Id = 1016, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Перевод скв на другой тип промывочной жидкости" + }, + new + { + Id = 1017, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Перезапись каротажа" + }, + new + { + Id = 1018, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Перетяжка талевого каната" + }, + new + { + Id = 1019, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Наращивание, промывка" + }, + new + { + Id = 1020, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Подъем инструмента" + }, + new + { + Id = 1021, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Подъем инструмента с промывкой" + }, + new + { + Id = 1022, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Обратная проработка" + }, + new + { + Id = 1023, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Сборка инструмента с мостков" + }, + new + { + Id = 1024, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Подготовительные работы" + }, + new + { + Id = 1025, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Сборка КНБК" + }, + new + { + Id = 1026, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Разборка КНБК" + }, + new + { + Id = 1027, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Промывка" + }, + new + { + Id = 1028, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Промежуточная промывка" + }, + new + { + Id = 1029, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Прокачка пачек" + }, + new + { + Id = 1030, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Разбуривание тех.оснастки" + }, + new + { + Id = 1031, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Ремонт" + }, + new + { + Id = 1032, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Спуск инструмента" + }, + new + { + Id = 1033, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Спуск инструмента с промывкой" + }, + new + { + Id = 1034, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Прямая проработка" + }, + new + { + Id = 1035, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Принудительная проработка" + }, + new + { + Id = 1037, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Тех СПО-подъем" + }, + new + { + Id = 1038, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Тех СПО-спуск" + }, + new + { + Id = 1039, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Техническое обслуживание" + }, + new + { + Id = 1040, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Цементаж" + }, + new + { + Id = 1041, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Шаблонировка ствола" + }, + new + { + Id = 1042, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Геологическое осложнение" + }, + new + { + Id = 1043, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "НПВ" + }, + new + { + Id = 1044, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "ВМР" + }, + new + { + Id = 1045, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Прочее" + }, + new + { + Id = 1046, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Спуск КНБК" + }, + new + { + Id = 1047, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Подъем КНБК" + }, + new + { + Id = 1048, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Спуск ОК" + }, + new + { + Id = 1050, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Промывка при спуске ОК" + }, + new + { + Id = 1051, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Замер ТС" + }, + new + { + Id = 1052, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Тех. отстой" + }, + new + { + Id = 1053, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Циркуляция и Обработка БР" + }, + new + { + Id = 1054, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Срезка ствола" + }, + new + { + Id = 1055, + Code = 0, + KeyValueName = "Продолжительность", + KeyValueUnits = "мин", + Name = "Вспомогательные работы" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.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 = "Хвостовик" + }, + new + { + Id = 7, + Caption = "Пилотный ствол 2" + }, + new + { + Id = 8, + Caption = "Направление 2" + }, + new + { + Id = 9, + Caption = "Кондуктор 2" + }, + new + { + Id = 10, + Caption = "Эксплуатационная колонна 2" + }, + new + { + Id = 11, + Caption = "Транспортный ствол 2" + }, + new + { + Id = 12, + Caption = "Хвостовик 2" + }, + new + { + Id = 13, + Caption = "Пилотный ствол 3" + }, + new + { + Id = 14, + Caption = "Направление 3" + }, + new + { + Id = 15, + Caption = "Кондуктор 3" + }, + new + { + Id = 16, + Caption = "Эксплуатационная колонна 3" + }, + new + { + Id = 17, + Caption = "Транспортный ствол 3" + }, + new + { + Id = 18, + Caption = "Хвостовик 3" + }, + new + { + Id = 19, + Caption = "Пилотный ствол 4" + }, + new + { + Id = 20, + Caption = "Направление 4" + }, + new + { + Id = 21, + Caption = "Кондуктор 4" + }, + new + { + Id = 22, + Caption = "Эксплуатационная колонна 4" + }, + new + { + Id = 23, + Caption = "Транспортный ствол 4" + }, + new + { + Id = 24, + Caption = "Хвостовик 4" + }, + new + { + Id = 25, + Caption = "Пилотный ствол 5" + }, + new + { + Id = 26, + Caption = "Направление 5" + }, + new + { + Id = 27, + Caption = "Кондуктор 5" + }, + new + { + Id = 28, + Caption = "Эксплуатационная колонна 5" + }, + new + { + Id = 29, + Caption = "Транспортный ствол 5" + }, + new + { + Id = 30, + Caption = "Хвостовик 5" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("caption") + .HasComment("Название"); + + b.HasKey("Id"); + + b.ToTable("t_well_type"); + + b.HasComment("конструкция скважины"); + + b.HasData( + new + { + Id = 1, + Caption = "Наклонно-направленная" + }, + new + { + Id = 2, + Caption = "Горизонтальная" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.RecordBase", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Actcod") + .HasColumnType("smallint") + .HasColumnName("ACTCOD"); + + b.Property("Date") + .HasColumnType("integer") + .HasColumnName("DATE"); + + b.Property("Recid") + .HasColumnType("smallint") + .HasColumnName("RECID"); + + b.Property("Seqid") + .HasColumnType("integer") + .HasColumnName("SEQID"); + + b.Property("Stknum") + .HasColumnType("smallint") + .HasColumnName("STKNUM"); + + b.Property("Time") + .HasColumnType("integer") + .HasColumnName("TIME"); + + b.Property("Wellid") + .HasColumnType("text") + .HasColumnName("WELLID"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_wits_base"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Blkpos") + .HasColumnType("real") + .HasColumnName("BLKPOS"); + + b.Property("Chkp") + .HasColumnType("real") + .HasColumnName("CHKP"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptretm") + .HasColumnType("real") + .HasColumnName("DEPTRETM"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Gasa") + .HasColumnType("real") + .HasColumnName("GASA"); + + b.Property("Hkla") + .HasColumnType("real") + .HasColumnName("HKLA"); + + b.Property("Hklx") + .HasColumnType("real") + .HasColumnName("HKLX"); + + b.Property("Lagstks") + .HasColumnType("smallint") + .HasColumnName("LAGSTKS"); + + b.Property("Mcia") + .HasColumnType("real") + .HasColumnName("MCIA"); + + b.Property("Mcoa") + .HasColumnType("real") + .HasColumnName("MCOA"); + + b.Property("Mdia") + .HasColumnType("real") + .HasColumnName("MDIA"); + + b.Property("Mdoa") + .HasColumnType("real") + .HasColumnName("MDOA"); + + b.Property("Mfia") + .HasColumnType("real") + .HasColumnName("MFIA"); + + b.Property("Mfoa") + .HasColumnType("real") + .HasColumnName("MFOA"); + + b.Property("Mfop") + .HasColumnType("smallint") + .HasColumnName("MFOP"); + + b.Property("Mtia") + .HasColumnType("real") + .HasColumnName("MTIA"); + + b.Property("Mtoa") + .HasColumnType("real") + .HasColumnName("MTOA"); + + b.Property("Ropa") + .HasColumnType("real") + .HasColumnName("ROPA"); + + b.Property("Rpma") + .HasColumnType("smallint") + .HasColumnName("RPMA"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spm1") + .HasColumnType("smallint") + .HasColumnName("SPM1"); + + b.Property("Spm2") + .HasColumnType("smallint") + .HasColumnName("SPM2"); + + b.Property("Spm3") + .HasColumnType("smallint") + .HasColumnName("SPM3"); + + b.Property("Sppa") + .HasColumnType("real") + .HasColumnName("SPPA"); + + b.Property("Stkc") + .HasColumnType("integer") + .HasColumnName("STKC"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.Property("Torqa") + .HasColumnType("real") + .HasColumnName("TORQA"); + + b.Property("Torqx") + .HasColumnType("real") + .HasColumnName("TORQX"); + + b.Property("Tvolact") + .HasColumnType("real") + .HasColumnName("TVOLACT"); + + b.Property("Tvolcact") + .HasColumnType("real") + .HasColumnName("TVOLCACT"); + + b.Property("Woba") + .HasColumnType("real") + .HasColumnName("WOBA"); + + b.Property("Wobx") + .HasColumnType("real") + .HasColumnName("WOBX"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_1"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("DeptmeasGdpMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_GDP_mc"); + + b.Property("DeptmeasMcrstat") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_MCRSTAT"); + + b.Property("DeptmeasRa33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33_mc"); + + b.Property("DeptmeasRa33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F2_mc"); + + b.Property("DeptmeasRa33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F4_mc"); + + b.Property("DeptmeasRp33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33_mc"); + + b.Property("DeptmeasRp33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F2_mc"); + + b.Property("DeptmeasRp33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F4_mc"); + + b.Property("DeptmeasSlvlMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_SLVL_mc"); + + b.Property("GdpMc") + .HasColumnType("real") + .HasColumnName("GDP_mc"); + + b.Property("Mcrstat") + .HasColumnType("real") + .HasColumnName("MCRSTAT"); + + b.Property("Ra33Mc") + .HasColumnType("real") + .HasColumnName("RA33_mc"); + + b.Property("Ra33f2Mc") + .HasColumnType("real") + .HasColumnName("RA33F2_mc"); + + b.Property("Ra33f4Mc") + .HasColumnType("real") + .HasColumnName("RA33F4_mc"); + + b.Property("Rp33Mc") + .HasColumnType("real") + .HasColumnName("RP33_mc"); + + b.Property("Rp33f2Mc") + .HasColumnType("real") + .HasColumnName("RP33F2_mc"); + + b.Property("Rp33f4Mc") + .HasColumnType("real") + .HasColumnName("RP33F4_mc"); + + b.Property("SlvlMc") + .HasColumnType("real") + .HasColumnName("SLVL_mc"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_50"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Btot") + .HasColumnType("real") + .HasColumnName("Btot"); + + b.Property("Bx") + .HasColumnType("real") + .HasColumnName("Bx"); + + b.Property("By") + .HasColumnType("real") + .HasColumnName("By"); + + b.Property("Bz") + .HasColumnType("real") + .HasColumnName("Bz"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Gtot") + .HasColumnType("real") + .HasColumnName("Gtot"); + + b.Property("Gx") + .HasColumnType("real") + .HasColumnName("Gx"); + + b.Property("Gy") + .HasColumnType("real") + .HasColumnName("Gy"); + + b.Property("Gz") + .HasColumnType("real") + .HasColumnName("Gz"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_60"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Att06h") + .HasColumnType("real") + .HasColumnName("ATT06H"); + + b.Property("Att06l") + .HasColumnType("real") + .HasColumnName("ATT06L"); + + b.Property("Att10h") + .HasColumnType("real") + .HasColumnName("ATT10H"); + + b.Property("Att10l") + .HasColumnType("real") + .HasColumnName("ATT10L"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Phl1f1") + .HasColumnType("real") + .HasColumnName("PHL1F1"); + + b.Property("Phl1f2") + .HasColumnType("real") + .HasColumnName("PHL1F2"); + + b.Property("Phl2f1") + .HasColumnType("real") + .HasColumnName("PHL2F1"); + + b.Property("Phl2f2") + .HasColumnType("real") + .HasColumnName("PHL2F2"); + + b.Property("Status") + .HasColumnType("real") + .HasColumnName("Status"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_61"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptsvym") + .HasColumnType("real") + .HasColumnName("DEPTSVYM"); + + b.Property("Deptsvyv") + .HasColumnType("real") + .HasColumnName("DEPTSVYV"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Svyazc") + .HasColumnType("real") + .HasColumnName("SVYAZC"); + + b.Property("Svyazu") + .HasColumnType("real") + .HasColumnName("SVYAZU"); + + b.Property("Svydls") + .HasColumnType("real") + .HasColumnName("SVYDLS"); + + b.Property("Svyew") + .HasColumnType("real") + .HasColumnName("SVYEW"); + + b.Property("Svygtf") + .HasColumnType("real") + .HasColumnName("SVYGTF"); + + b.Property("Svyinc") + .HasColumnType("real") + .HasColumnName("SVYINC"); + + b.Property("Svymtf") + .HasColumnType("real") + .HasColumnName("SVYMTF"); + + b.Property("Svyns") + .HasColumnType("real") + .HasColumnName("SVYNS"); + + b.Property("Svytype") + .HasColumnType("text") + .HasColumnName("SVYTYPE"); + + b.Property("Svywalk") + .HasColumnType("real") + .HasColumnName("SVYWALK"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_7"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptcalm") + .HasColumnType("real") + .HasColumnName("DEPTCALM"); + + b.Property("Deptcalv") + .HasColumnType("real") + .HasColumnName("DEPTCALV"); + + b.Property("Deptfdm") + .HasColumnType("real") + .HasColumnName("DEPTFDM"); + + b.Property("Deptfdv") + .HasColumnType("real") + .HasColumnName("DEPTFDV"); + + b.Property("Deptgr1m") + .HasColumnType("real") + .HasColumnName("DEPTGR1M"); + + b.Property("Deptgr1v") + .HasColumnType("real") + .HasColumnName("DEPTGR1V"); + + b.Property("Deptgr2m") + .HasColumnType("real") + .HasColumnName("DEPTGR2M"); + + b.Property("Deptgr2v") + .HasColumnType("real") + .HasColumnName("DEPTGR2V"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptp1m") + .HasColumnType("real") + .HasColumnName("DEPTP1M"); + + b.Property("Deptp1v") + .HasColumnType("real") + .HasColumnName("DEPTP1V"); + + b.Property("Deptp2m") + .HasColumnType("real") + .HasColumnName("DEPTP2M"); + + b.Property("Deptp2v") + .HasColumnType("real") + .HasColumnName("DEPTP2V"); + + b.Property("Deptrs1m") + .HasColumnType("real") + .HasColumnName("DEPTRS1M"); + + b.Property("Deptrs1v") + .HasColumnType("real") + .HasColumnName("DEPTRS1V"); + + b.Property("Deptrs2m") + .HasColumnType("real") + .HasColumnName("DEPTRS2M"); + + b.Property("Deptrs2v") + .HasColumnType("real") + .HasColumnName("DEPTRS2V"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Mclp") + .HasColumnType("real") + .HasColumnName("MCLP"); + + b.Property("Mfd") + .HasColumnType("real") + .HasColumnName("MFD"); + + b.Property("Mffp") + .HasColumnType("real") + .HasColumnName("MFFP"); + + b.Property("Mfpp") + .HasColumnType("real") + .HasColumnName("MFPP"); + + b.Property("Mfrann") + .HasColumnType("real") + .HasColumnName("MFRANN"); + + b.Property("Mfrpipe") + .HasColumnType("real") + .HasColumnName("MFRPIPE"); + + b.Property("Mftann") + .HasColumnType("real") + .HasColumnName("MFTANN"); + + b.Property("Mftpipe") + .HasColumnType("real") + .HasColumnName("MFTPIPE"); + + b.Property("Mg1") + .HasColumnType("real") + .HasColumnName("MG1"); + + b.Property("Mg1c") + .HasColumnType("real") + .HasColumnName("MG1C"); + + b.Property("Mg2") + .HasColumnType("real") + .HasColumnName("MG2"); + + b.Property("Mg2c") + .HasColumnType("real") + .HasColumnName("MG2C"); + + b.Property("Mpo1") + .HasColumnType("real") + .HasColumnName("MPO1"); + + b.Property("Mpo2") + .HasColumnType("real") + .HasColumnName("MPO2"); + + b.Property("Mr1") + .HasColumnType("real") + .HasColumnName("MR1"); + + b.Property("Mr1c") + .HasColumnType("real") + .HasColumnName("MR1C"); + + b.Property("Mr2") + .HasColumnType("real") + .HasColumnName("MR2"); + + b.Property("Mr2c") + .HasColumnType("real") + .HasColumnName("MR2C"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spare6") + .HasColumnType("real") + .HasColumnName("SPARE6"); + + b.Property("Spare7") + .HasColumnType("real") + .HasColumnName("SPARE7"); + + b.Property("Spare8") + .HasColumnType("real") + .HasColumnName("SPARE8"); + + b.Property("Spare9") + .HasColumnType("real") + .HasColumnName("SPARE9"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_8"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.HasOne("AsbCloudDb.Model.Deposit", "Deposit") + .WithMany("Clusters") + .HasForeignKey("IdDeposit") + .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.DailyReport.DailyReport", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillFlowChart", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdFileCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("DrillingProgramParts") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_drill_params_t_well_section_type_id_fk"); + + 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") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_file_mark_t_file_info_fk"); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("FileMarks") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_user_t_file_mark_fk"); + + b.Navigation("FileInfo"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.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.OperationValue", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdOperationCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationCompanyWell", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_company_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("RelationCompaniesWells") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_relation_company_well_t_well_id_fk"); + + b.Navigation("Company"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserDrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.DrillingProgramPart", "DrillingProgramPart") + .WithMany("RelatedUsers") + .HasForeignKey("IdDrillingProgramPart") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DrillingProgramPart"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRolePermission", b => + { + b.HasOne("AsbCloudDb.Model.Permission", "Permission") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdPermission") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUserRolePermissions") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Permission"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserRoleUserRole", b => + { + b.HasOne("AsbCloudDb.Model.UserRole", "Role") + .WithMany("RelationUserRoleUserRoles") + .HasForeignKey("Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "IncludeRole") + .WithMany() + .HasForeignKey("IdInclude") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("IncludeRole"); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.RelationUserUserRole", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.UserRole", "UserRole") + .WithMany("RelationUsersUserRoles") + .HasForeignKey("IdUserRole") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ReportProperty", b => + { + b.HasOne("AsbCloudDb.Model.FileInfo", "File") + .WithMany() + .HasForeignKey("IdFile") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("File"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Schedule", b => + { + b.HasOne("AsbCloudDb.Model.Driller", "Driller") + .WithMany("Schedule") + .HasForeignKey("IdDriller") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_schedule_t_driller_id_driller"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Driller"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.SetpointsRequest", b => + { + b.HasOne("AsbCloudDb.Model.User", "Author") + .WithMany() + .HasForeignKey("IdAuthor") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Author"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Subsystems.SubsystemOperationTime", b => + { + b.HasOne("AsbCloudDb.Model.Subsystems.Subsystem", "Subsystem") + .WithMany() + .HasForeignKey("IdSubsystem") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Subsystem"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaub", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSaub") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_saub_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("DataSpin") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_data_spin_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryEvent", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Events") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_event_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryMessage", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Messages") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_messages_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryUser", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany("Users") + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_telemetry_user_t_telemetry_id_fk"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.HasOne("AsbCloudDb.Model.Company", "Company") + .WithMany("Users") + .HasForeignKey("IdCompany") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_user_t_company_id_fk"); + + b.Navigation("Company"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.HasOne("AsbCloudDb.Model.Cluster", "Cluster") + .WithMany("Wells") + .HasForeignKey("IdCluster") + .HasConstraintName("t_well_t_cluster_id_fk"); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithOne("Well") + .HasForeignKey("AsbCloudDb.Model.Well", "IdTelemetry") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("t_well_t_telemetry_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellType", "WellType") + .WithMany("Wells") + .HasForeignKey("IdWellType"); + + b.Navigation("Cluster"); + + b.Navigation("Telemetry"); + + b.Navigation("WellType"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellComposite", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("WellComposites") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_id_fk"); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany("WellComposites") + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_t_well_section_type_id_fk"); + + b.HasOne("AsbCloudDb.Model.Well", "WellSrc") + .WithMany("WellCompositeSrcs") + .HasForeignKey("IdWellSrc") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_well_сomposite_src_t_well_id_fk"); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + + b.Navigation("WellSrc"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.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.WITS.Record1", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record1", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record50", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record60", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record61", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record7", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record8", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Cluster", b => + { + b.Navigation("Wells"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Company", b => + { + b.Navigation("RelationCompaniesWells"); + + b.Navigation("Users"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b => + { + b.Navigation("Companies"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Deposit", b => + { + b.Navigation("Clusters"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Navigation("RelatedUsers"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b => + { + b.Navigation("FileMarks"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.MeasureCategory", b => + { + b.Navigation("Measures"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Permission", b => + { + b.Navigation("RelationUserRolePermissions"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => + { + b.Navigation("DataSaub"); + + b.Navigation("DataSpin"); + + b.Navigation("Events"); + + b.Navigation("Messages"); + + b.Navigation("Users"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.User", b => + { + b.Navigation("FileMarks"); + + b.Navigation("Files"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserRole", b => + { + b.Navigation("RelationUserRolePermissions"); + + b.Navigation("RelationUserRoleUserRoles"); + + b.Navigation("RelationUsersUserRoles"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Well", b => + { + b.Navigation("DrillingProgramParts"); + + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellComposites"); + + b.Navigation("WellOperations"); + }); + + 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/20220815093950_AddDataDefault_SubsystemFiller.cs b/AsbCloudDb/Migrations/20220815093950_AddDataDefault_SubsystemFiller.cs new file mode 100644 index 00000000..1f7d2130 --- /dev/null +++ b/AsbCloudDb/Migrations/20220815093950_AddDataDefault_SubsystemFiller.cs @@ -0,0 +1,104 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class AddDataDefault_SubsystemFiller : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "name", + table: "t_subsystem", + type: "character varying(255)", + maxLength: 255, + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "character varying(255)", + oldMaxLength: 255, + oldNullable: true); + + migrationBuilder.InsertData( + table: "t_subsystem", + columns: new[] { "id", "description", "name" }, + values: new object[,] + { + { 1, "Ручной", "Ручной" }, + { 2, "Бурение в роторе", "Бурение в роторе" }, + { 3, "Проработка", "Проработка" }, + { 4, "Бурение в слайде", "Бурение в слайде" }, + { 5, "Спуск СПО", "Спуск СПО" }, + { 6, "Подъем СПО", "Подъем СПО" }, + { 7, "Подъем с проработкой", "Подъем с проработкой" }, + { 11, "Блокировка", "Блокировка" }, + { 65536, "Spin master", "Spin master" }, + { 65537, "Torque master", "Torque master" } + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 1); + + migrationBuilder.DeleteData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 2); + + migrationBuilder.DeleteData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 3); + + migrationBuilder.DeleteData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 4); + + migrationBuilder.DeleteData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 5); + + migrationBuilder.DeleteData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 6); + + migrationBuilder.DeleteData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 7); + + migrationBuilder.DeleteData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 11); + + migrationBuilder.DeleteData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 65536); + + migrationBuilder.DeleteData( + table: "t_subsystem", + keyColumn: "id", + keyValue: 65537); + + migrationBuilder.AlterColumn( + name: "name", + table: "t_subsystem", + type: "character varying(255)", + maxLength: 255, + nullable: true, + oldClrType: typeof(string), + oldType: "character varying(255)", + oldMaxLength: 255); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index b3949f09..4c895f7b 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -2779,6 +2779,7 @@ namespace AsbCloudDb.Migrations .HasColumnName("description"); b.Property("Name") + .IsRequired() .HasMaxLength(255) .HasColumnType("character varying(255)") .HasColumnName("name"); @@ -2788,6 +2789,68 @@ namespace AsbCloudDb.Migrations b.ToTable("t_subsystem"); b.HasComment("Описание подсистем"); + + b.HasData( + new + { + Id = 1, + Description = "Ручной", + Name = "Ручной" + }, + new + { + Id = 2, + Description = "Бурение в роторе", + Name = "Бурение в роторе" + }, + new + { + Id = 3, + Description = "Проработка", + Name = "Проработка" + }, + new + { + Id = 4, + Description = "Бурение в слайде", + Name = "Бурение в слайде" + }, + new + { + Id = 5, + Description = "Спуск СПО", + Name = "Спуск СПО" + }, + new + { + Id = 6, + Description = "Подъем СПО", + Name = "Подъем СПО" + }, + new + { + Id = 7, + Description = "Подъем с проработкой", + Name = "Подъем с проработкой" + }, + new + { + Id = 11, + Description = "Блокировка", + Name = "Блокировка" + }, + new + { + Id = 65536, + Description = "Spin master", + Name = "Spin master" + }, + new + { + Id = 65537, + Description = "Torque master", + Name = "Torque master" + }); }); modelBuilder.Entity("AsbCloudDb.Model.Subsystems.SubsystemOperationTime", b => @@ -6023,7 +6086,7 @@ namespace AsbCloudDb.Migrations modelBuilder.Entity("AsbCloudDb.Model.Subsystems.SubsystemOperationTime", b => { b.HasOne("AsbCloudDb.Model.Subsystems.Subsystem", "Subsystem") - .WithMany("SubsystemOperationTimes") + .WithMany() .HasForeignKey("IdSubsystem") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); @@ -6339,11 +6402,6 @@ namespace AsbCloudDb.Migrations b.Navigation("RelationUserRolePermissions"); }); - modelBuilder.Entity("AsbCloudDb.Model.Subsystems.Subsystem", b => - { - b.Navigation("SubsystemOperationTimes"); - }); - modelBuilder.Entity("AsbCloudDb.Model.Telemetry", b => { b.Navigation("DataSaub"); diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index c03e6519..714e9409 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -151,6 +151,7 @@ namespace AsbCloudInfrastructure .Include(c => c.Deposit))); // может быть включен в сервис ClusterService // Subsystem service services.AddTransient, CrudCacheServiceBase>(); + services.AddTransient(); services.AddTransient, CrudCacheServiceBase>(); diff --git a/AsbCloudInfrastructure/Services/Subsystems/OperationTimeData.cs b/AsbCloudInfrastructure/Services/Subsystems/OperationTimeData.cs deleted file mode 100644 index 0002490d..00000000 --- a/AsbCloudInfrastructure/Services/Subsystems/OperationTimeData.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AsbCloudInfrastructure.Services.Subsystems -{ - internal class OperationTimeData - { - public DateTimeOffset DateTime { get; internal set; } - public short? Mode { get; internal set; } - public float? Depth { get; internal set; } - } -} diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index ff379581..edf984eb 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -28,38 +28,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems this.db = db; this.wellService = wellService; this.subsystemService = subsystemService; - } - - private async Task?> GetSubsystemByIdWellAsync(int idWell, CancellationToken token) - { - var well = await wellService.GetOrDefaultAsync(idWell, token); - if (well?.IdTelemetry is null || well.Timezone is null) - return null; - var wellSubsystem = await db.SubsystemOperationTimes - .Include(e => e.Subsystem) - .AsNoTracking() - .Where(o => o.IdTelemetry == well.IdTelemetry) - .DistinctBy(o => o.IdSubsystem) - .Select(d => new SubsystemDto - { - Id = d.Subsystem.Id, - Name = d.Subsystem.Name, - Description = d.Subsystem.Description, - - }) - .ToListAsync(token); - return wellSubsystem; - } - public async Task?> GetSubsystemAsync(int? idWell, CancellationToken token) - { - if (idWell.HasValue) - { - var subsystemWell = await GetSubsystemByIdWellAsync(idWell.Value, token); - return subsystemWell; - } - var subsystem = await subsystemService.GetAllAsync(token); - return subsystem; - } + } public async Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token) { var well = await wellService.GetOrDefaultAsync(request.IdWell, token); @@ -143,8 +112,8 @@ namespace AsbCloudInfrastructure.Services.Subsystems var subsystemStat = new SubsystemStatDto() { IdSubsystem = idSubsystem, - Subsystem = subsystemService.GetOrDefault(idSubsystem)?.Name ?? "unknown", - UsedTimeHours = TimeSpan.FromHours(periodGroup), + SubsystemName = subsystemService.GetOrDefault(idSubsystem)?.Name ?? "unknown", + UsedTimeHours =periodGroup, KUsage = 1d*periodGroup / periodRequest, K2 = 1d*periodGroup / periodGroupTotal, }; diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index f740c5fa..5f35a827 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -1,14 +1,62 @@ using AsbCloudApp.Data.Subsystems; +using AsbCloudApp.Services; +using AsbCloudApp.Services.Subsystems; using AsbCloudDb.Model; using AsbCloudDb.Model.Subsystems; using AsbCloudInfrastructure.Repository; +using Mapster; +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.Subsystems { - internal class SubsystemService : CrudCacheServiceBase - { - public SubsystemService(IAsbCloudDbContext dbContext) : base(dbContext) +#nullable enable + internal class SubsystemService : CrudCacheServiceBase, ISubsystemService + { + private readonly IWellService wellService; + public SubsystemService(IAsbCloudDbContext dbContext, IWellService wellService) : base(dbContext) + { + this.wellService = wellService; + } + + private async Task?> GetSubsystemByIdWellAsync(int idWell, CancellationToken token) { + var well = await wellService.GetOrDefaultAsync(idWell, token); + if (well?.IdTelemetry is null || well.Timezone is null) + return null; + var wellSubsystem = await dbContext.SubsystemOperationTimes + .Include(e => e.Subsystem) + .AsNoTracking() + .Where(o => o.IdTelemetry == well.IdTelemetry) + .DistinctBy(o => o.IdSubsystem) + .Select(d => Convert( new () + { + Id = d.Subsystem.Id, + Name = d.Subsystem.Name, + Description = d.Subsystem.Description, + + })) + .ToListAsync(token); + return wellSubsystem; + } + public async Task?> GetSubsystemAsync(int? idWell, CancellationToken token) + { + if (idWell.HasValue) + { + var subsystemWell = await GetSubsystemByIdWellAsync(idWell.Value, token); + return subsystemWell; + } + var subsystem = await GetAllAsync(token); + return subsystem; + } + new private static SubsystemDto Convert(Subsystem subsystem) + { + var dto = subsystem.Adapt(); + return dto; } } +#nullable disable } diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index e4d15ebc..d54fe10c 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -21,10 +21,14 @@ namespace AsbCloudWebApi.Controllers.Subsystems { private readonly ISubsystemOperationTimeService subsystemOperationTimeService; private readonly IWellService wellService; - public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService, IWellService wellService) + private readonly ICrudService subsystemServiceCrud; + private readonly ISubsystemService subsystemService; + public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService, IWellService wellService, ICrudService subsystemServiceCrud, ISubsystemService subsystemService) { - this.subsystemOperationTimeService = subsystemOperationTimeService; + this.subsystemOperationTimeService = subsystemOperationTimeService; this.wellService = wellService; + this.subsystemServiceCrud = subsystemServiceCrud; + this.subsystemService = subsystemService; } /// /// получить статистику @@ -48,9 +52,8 @@ namespace AsbCloudWebApi.Controllers.Subsystems { if (idWell.HasValue) if (!await UserHasAccesToWellAsync(idWell.Value, token)) - return Forbid(); - - var result = await subsystemOperationTimeService.GetSubsystemAsync(idWell, token); + return Forbid(); + var result = await subsystemService.GetSubsystemAsync(idWell, token); return Ok(result); } From 4f37564a7b4a583e3fb19faf70c49167a0b4e861 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Tue, 16 Aug 2022 02:22:16 +0500 Subject: [PATCH 11/21] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=84=D0=BE=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...SubsystemOperationTimeBackgroundService.cs | 159 +++++++++--------- .../SubsystemOperationTimeService.cs | 10 +- .../Subsystems/SubsystemsSpinWithDepth.cs | 19 +-- 3 files changed, 85 insertions(+), 103 deletions(-) rename AsbCloudApp/Data/Subsystems/SubsystemsSpinWithDepthDto.cs => AsbCloudInfrastructure/Services/Subsystems/SubsystemsSpinWithDepth.cs (54%) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index f70e181d..5919aa42 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -1,28 +1,25 @@ using AsbCloudDb.Model; using AsbCloudDb.Model.Subsystems; -using AsbCloudInfrastructure.Services.DetectOperations; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; using System.Data; -using System.Data.Common; using System.Diagnostics; using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.Subsystems { +#nullable enable internal class SubsystemOperationTimeBackgroundService : BackgroundService { private readonly string connectionString; private readonly TimeSpan period = TimeSpan.FromHours(1); private const int idSubsytemTorqueMaster = 65537; - private const int idSubsytemSpinMaster = 65536; - + private const int idSubsytemSpinMaster = 65536; public SubsystemOperationTimeBackgroundService(IConfiguration configuration) { connectionString = configuration.GetConnectionString("DefaultConnection"); @@ -33,7 +30,6 @@ namespace AsbCloudInfrastructure.Services.Subsystems var options = new DbContextOptionsBuilder() .UseNpgsql(connectionString) .Options; - while (!token.IsCancellationRequested) { if (DateTime.Now > timeToStartAnalysis) @@ -90,16 +86,14 @@ namespace AsbCloudInfrastructure.Services.Subsystems var affected = 0; foreach (var item in JounedlastDetectedDates) { - var stopwatch = Stopwatch.StartNew(); - var newOperationsSaub = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); - stopwatch.Stop(); - if (newOperationsSaub is not null && newOperationsSaub.Any()) + var newOperationsSaub = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); + if (newOperationsSaub?.Any() == true) { db.SubsystemOperationTimes.AddRange(newOperationsSaub); affected += await db.SaveChangesAsync(token); } var newOperationsSpin = await OperationTimeSpinAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); - if (newOperationsSpin is not null && newOperationsSpin.Any()) + if (newOperationsSpin?.Any() == true) { db.SubsystemOperationTimes.AddRange(newOperationsSpin); affected += await db.SaveChangesAsync(token); @@ -108,7 +102,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems return affected; } - private static async Task> OperationTimeSaubAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) + private static async Task?> OperationTimeSaubAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) { var query = db.TelemetryDataSaub .AsNoTracking() @@ -122,40 +116,48 @@ namespace AsbCloudInfrastructure.Services.Subsystems .OrderBy(d => d.DateTime); var take = 4 * 86_400; // 4 дня var startDate = begin; - var firstItem = query.FirstOrDefault(); - if (firstItem is null) - return null; - short? mode = firstItem.Mode; - DateTimeOffset dateBegin = firstItem.DateTime; - float? depthStart = firstItem.Depth; - var resultSubsystemOperationTime = new List(); - var data = await query + + var resultSubsystemOperationTime = new List(); + while (true) + { + var data = await query .Where(d => d.DateTime > startDate) .Take(take) - .ToArrayAsync(token); - for (int i = 1; i < data.Length; i++) - { + .ToArrayAsync(token); + var firstItem = data.FirstOrDefault(); + if (firstItem is null) + break; + short? mode = firstItem.Mode; + DateTimeOffset dateBegin = firstItem.DateTime; + float? depthStart = firstItem.Depth; + for (int i = 1; i < data.Length; i++) + { if (data[i].Mode != mode) { + var operationTimeItem = new SubsystemOperationTime() { IdTelemetry = idTelemetry, - DateStart = dateBegin, - IdSubsystem = (int)data[i - 1].Mode + 1, + DateStart = dateBegin, DateEnd = data[i - 1].DateTime, DepthStart = depthStart, DepthEnd = data[i - 1].Depth }; - resultSubsystemOperationTime.Add(operationTimeItem); + if (mode.HasValue) + { + operationTimeItem.IdSubsystem = (int)mode + 1; + resultSubsystemOperationTime.Add(operationTimeItem); + } mode = data[i].Mode; dateBegin = data[i].DateTime; depthStart = data[i].Depth; } } - startDate = data.Last().DateTime; + startDate = data.Last().DateTime; + } return resultSubsystemOperationTime; - } - private static async Task> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) + } + private static async Task?> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) { Predicate isSubsystemTorqueState = (int state) => state == 7; Predicate isSubsystemTorqueMode = (short mode) => (mode & 2) > 0; @@ -163,29 +165,20 @@ namespace AsbCloudInfrastructure.Services.Subsystems var operationTimeSpinWithDepth = $"select tspin.\"date\", tspin.\"mode\", tspin.\"state\", tsaub.\"well_depth\"" + $" from (select \"date\" ,\"mode\" ,lag(mode, 1) over (order by \"date\") as mode_pre, state , " + - $"lag(state, 1) over (order by \"date\") as state_pre from t_telemetry_data_spin where id_telemetry = {idTelemetry}) as tspin " + - $"join (select \"date\", well_depth from t_telemetry_data_saub where id_telemetry = {idTelemetry}) as tsaub " + + $"lag(state, 1) over (order by \"date\") as state_pre from t_telemetry_data_spin where id_telemetry = {idTelemetry} and date >= '{begin}') as tspin " + + $"join (select \"date\", well_depth from t_telemetry_data_saub where id_telemetry = {idTelemetry} and date >= '{begin}') as tsaub " + $"on EXTRACT(EPOCH from tspin.date) = EXTRACT(EPOCH from tsaub.date) " + $"where mode!=mode_pre or state != state_pre order by \"date\";"; - using var command = db.Database.GetDbConnection().CreateCommand(); + using var command = db.Database.GetDbConnection().CreateCommand(); command.CommandText = operationTimeSpinWithDepth; db.Database.OpenConnection(); - using var result = command.ExecuteReader(); - var query = new List(); - //DataTable dt = new DataTable(); - //dt.Load(result); - //var query = from c in dt.AsEnumerable() - // select new - // { - // Date = (DateTimeOffset)c["date"], - // Mode = (short)c["mode"], - // State = (int)c["state"], - // Depth = (float)c["float"] - // }; + using var result = await command.ExecuteReaderAsync(token); + var telemetryOpearationSpinSubsystems = new List(); if (result.HasRows) + { while (result.Read()) { - var itemEntity = new SubsystemsSpinWithDepthDto() + var itemEntity = new SubsystemsSpinWithDepth() { Date = result.GetFieldValue(0), Mode = result.GetFieldValue(1), @@ -200,50 +193,52 @@ namespace AsbCloudInfrastructure.Services.Subsystems if (subsystemId.HasValue) { itemEntity.IdSubsystem = subsystemId.Value; - query.Add(itemEntity); - } + telemetryOpearationSpinSubsystems.Add(itemEntity); + } } + } var take = 4 * 86_400; // 4 дня - var startDate = begin; - var firstItem = query.FirstOrDefault(); - if (firstItem is null) - return null; - int idSubsystem = firstItem.IdSubsystem; - DateTimeOffset dateBegin = firstItem.Date; - float? depthStart = firstItem.Depth; - var resultSubsystemOperationTime = new List(); - var data = query - .Where(d => d.Date > startDate) - .Take(take) - .ToArray(); - if (data.Length==0) - return null; - - for (int i = 1; i < data.Length; i++) + var startDate = begin; + var resultSubsystemOperationTime = new List(); + while (true) { - if (data[i].IdSubsystem != idSubsystem) + var data = telemetryOpearationSpinSubsystems + .Where(d => d.Date > startDate) + .Take(take) + .ToArray(); + var firstItem = data.FirstOrDefault(); + if (firstItem is null) + break; + int idSubsystem = firstItem.IdSubsystem; + DateTimeOffset dateBegin = firstItem.Date; + float? depthStart = firstItem.Depth; + for (int i = 1; i < data.Length; i++) { - var operationTimeItem = new SubsystemOperationTime() + if (data[i].IdSubsystem != idSubsystem) { - IdTelemetry = idTelemetry, - DateStart = dateBegin, - IdSubsystem = data[i - 1].IdSubsystem, - DateEnd = data[i - 1].Date, - DepthStart = depthStart, - DepthEnd = data[i - 1].Depth + var operationTimeItem = new SubsystemOperationTime() + { + IdTelemetry = idTelemetry, + DateStart = dateBegin, + IdSubsystem = data[i - 1].IdSubsystem, + DateEnd = data[i].Date, + DepthStart = depthStart, + DepthEnd = data[i].Depth - }; - dateBegin = data[i].Date; - depthStart = data[i].Depth; - idSubsystem = data[i].IdSubsystem; - if (data[i-1].IdSubsystem != 0) - { - resultSubsystemOperationTime.Add(operationTimeItem); - } - } - } - startDate = data.LastOrDefault().Date; + }; + dateBegin = data[i].Date; + depthStart = data[i].Depth; + idSubsystem = data[i].IdSubsystem; + if (data[i - 1].IdSubsystem != 0) + { + resultSubsystemOperationTime.Add(operationTimeItem); + } + } + } + startDate = data.LastOrDefault().Date; + } return resultSubsystemOperationTime; } } +#nullable disable } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index edf984eb..0bb1d58f 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -48,8 +48,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems return null; var query = BuildQuery(request); if (query is null) - return null; - var data = await query.ToListAsync(token); + return null; if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeInner) { if (request.GtDate is not null) @@ -62,13 +61,16 @@ namespace AsbCloudInfrastructure.Services.Subsystems { var begin = request.GtDate ?? throw new ArgumentNullException(nameof(request.GtDate)); var end = request.GtDate ?? throw new ArgumentNullException(nameof(request.LtDate)); - data = Trim(data, begin,end ); + var data = query.ToList(); + data = Trim(data, begin, end); + return data.Select(o => Convert(o, well)); } - var dtos = data.Select(o => Convert(o,well)); + var dtos = query.Select(o => Convert(o,well)); return dtos; } public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token) { + request.SelectMode = SubsystemOperationTimeRequest.SelectModeTrim; var data = await GetOperationTimeAsync(request, token); if (data is null) return null; diff --git a/AsbCloudApp/Data/Subsystems/SubsystemsSpinWithDepthDto.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemsSpinWithDepth.cs similarity index 54% rename from AsbCloudApp/Data/Subsystems/SubsystemsSpinWithDepthDto.cs rename to AsbCloudInfrastructure/Services/Subsystems/SubsystemsSpinWithDepth.cs index 196d3ac9..3abd4624 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemsSpinWithDepthDto.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemsSpinWithDepth.cs @@ -4,27 +4,12 @@ namespace AsbCloudDb.Model.Subsystems /// /// Результат запроса в t_telemetry_data_spin, используется фоновым сервисом анализирующим наработки подсистем /// - public class SubsystemsSpinWithDepthDto - { - /// - /// Режим работы - /// + internal class SubsystemsSpinWithDepth + { public short Mode { get; set; } - /// - /// Состояние - /// public int State { get; set; } - /// - /// Дата - /// public DateTimeOffset Date { get; set; } - /// - /// Глубина забоя - /// public float Depth { get; set; } - /// - /// ИД - /// public int IdSubsystem { get; set; } } } From dcda244e3ced7e91a9a7cd40bc10c8bf9613692e Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 17 Aug 2022 00:29:32 +0500 Subject: [PATCH 12/21] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20SubsystemOperationTimeServie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SubsystemOperationTimeService.cs | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 0bb1d58f..c252a21a 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -59,8 +59,8 @@ namespace AsbCloudInfrastructure.Services.Subsystems } if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeTrim) { - var begin = request.GtDate ?? throw new ArgumentNullException(nameof(request.GtDate)); - var end = request.GtDate ?? throw new ArgumentNullException(nameof(request.LtDate)); + var begin = request.GtDate ?? query.Min(d => d.DateStart).UtcDateTime; + var end = request.LtDate ?? query.Max(d => d.DateEnd).UtcDateTime; var data = query.ToList(); data = Trim(data, begin, end); return data.Select(o => Convert(o, well)); @@ -79,7 +79,9 @@ namespace AsbCloudInfrastructure.Services.Subsystems } private List Trim(List data, DateTime gtDate, DateTime ltDate) { - var itemsToTrim = data.Where(q => q.DateStart == gtDate & q.DateEnd == ltDate) + var itemsToTrim = data.Where(q => + (q.DateStart >= gtDate && q.DateStart <= ltDate)|| + (q.DateEnd >= gtDate && q.DateEnd <= ltDate)) .Select(o => new SubsystemOperationTime { Id = o.Id, @@ -87,29 +89,28 @@ namespace AsbCloudInfrastructure.Services.Subsystems DateEnd = ltDate > o.DateEnd ? ltDate : o.DateEnd, IdSubsystem = o.IdSubsystem, IdTelemetry = o.IdTelemetry, - DepthEnd = o.DepthEnd, - DepthStart = o.DepthStart, + DepthEnd = ltDate>o.DateEnd ? null : o.DepthEnd, + DepthStart = gtDate < o.DateStart ? null : o.DepthStart, Subsystem = o.Subsystem, Telemetry = o.Telemetry }) .ToList(); return itemsToTrim; } - private IEnumerable CalcStat(IEnumerable groupedData, SubsystemOperationTimeRequest request) + private IEnumerable CalcStat(IEnumerable listOperationTimeSubsystems, SubsystemOperationTimeRequest request) { var result = new List(); - var groupedDataSubsystems = groupedData + var groupedDataSubsystems = listOperationTimeSubsystems .GroupBy(x => x.IdSubsystem); - var periodGroupTotal = groupedData - .GroupBy(x => x.IdSubsystem) - .Sum(g => g.Sum(o=> (o.DateEnd - o.DateStart).TotalHours)); + var periodGroupTotal = groupedDataSubsystems + .Sum(g => g.Sum(o=> (o.DateEnd - o.DateStart).TotalHours)); + var gtDate = request.GtDate ?? listOperationTimeSubsystems.Min(d => d.DateStart); + var ltDate = request.LtDate ?? listOperationTimeSubsystems.Max(d => d.DateEnd); + var periodRequest = listOperationTimeSubsystems + .Sum(o => (o.DateEnd - o.DateStart).TotalHours); foreach (var item in groupedDataSubsystems) { var periodGroup = item.Sum(g => (g.DateEnd - g.DateStart).TotalHours); - var gtDate = request.GtDate ?? item.Min(d => d.DateStart); - var ltDate = request.LtDate ?? item.Max(d => d.DateEnd); - var periodRequest = item.Where(o => o.DateStart>=gtDate && o.DateEnd <= ltDate) - .Sum(o => (o.DateEnd - o.DateStart).TotalHours); int idSubsystem = item.First().IdSubsystem; var subsystemStat = new SubsystemStatDto() { @@ -125,23 +126,23 @@ namespace AsbCloudInfrastructure.Services.Subsystems } private IQueryable? BuildQuery(SubsystemOperationTimeRequest request) { - var idTelemetry = wellService.GetOrDefault(request.IdWell)?.IdTelemetry; - if (idTelemetry is null) + var well = wellService.GetOrDefault(request.IdWell); + if (well?.IdTelemetry is null || well.Timezone is null) return null; - var query = db.SubsystemOperationTimes .Include(o => o.Subsystem) - .Where(o => o.IdTelemetry == idTelemetry); + .Where(o => o.IdTelemetry == well.IdTelemetry); if(request.IdsSubsystems?.Any() == true) query = query.Where(o => request.IdsSubsystems.Contains(o.IdSubsystem)); - + if (request.GtDate is not null) - query = query.Where(o => o.DateStart >= request.GtDate.Value); + + query = query.Where(o => o.DateStart >= request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours)); if (request.LtDate is not null) - query = query.Where(o => o.DateEnd <= request.LtDate.Value); + query = query.Where(o => o.DateEnd <= request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours)); if (request.GtDepth is not null) From babd1076a462e1911eaf1ebb4ec3155075849a5b Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 17 Aug 2022 17:23:24 +0500 Subject: [PATCH 13/21] test new rep --- ...SubsystemOperationTimeBackgroundService.cs | 166 ++++++++---------- 1 file changed, 71 insertions(+), 95 deletions(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index 5919aa42..e67a969b 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -19,7 +19,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems private readonly string connectionString; private readonly TimeSpan period = TimeSpan.FromHours(1); private const int idSubsytemTorqueMaster = 65537; - private const int idSubsytemSpinMaster = 65536; + private const int idSubsytemSpinMaster = 65536; public SubsystemOperationTimeBackgroundService(IConfiguration configuration) { connectionString = configuration.GetConnectionString("DefaultConnection"); @@ -51,7 +51,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems ms = ms > 100 ? ms : 100; await Task.Delay(ms, token).ConfigureAwait(false); } - } + } public override async Task StopAsync(CancellationToken token) { @@ -101,62 +101,48 @@ namespace AsbCloudInfrastructure.Services.Subsystems } return affected; } - private static async Task?> OperationTimeSaubAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) { - var query = db.TelemetryDataSaub + var dateStart = db.TelemetryDataSaub .AsNoTracking() - .Where(d => d.IdTelemetry == idTelemetry) - .Select(d => new - { - DateTime = d.DateTime, - Mode = d.Mode, - Depth = d.WellDepth - }) - .OrderBy(d => d.DateTime); - var take = 4 * 86_400; // 4 дня - var startDate = begin; - + .Where(d => (d.IdTelemetry == idTelemetry) & (d.DateTime >= begin)) + .Min(d => d.DateTime); + var depthStart = db.TelemetryDataSaub + .AsNoTracking() + .Where(d => (d.IdTelemetry == idTelemetry) & (d.DateTime >= begin)) + .Min(d => d.WellDepth); + + var operationTimeSpinWithDepth = + $"select tt.date, tt.mode, tt.mode_prev, tt.well_depth" + + $" from (select date, mode, well_depth, lag(mode,1) over (order by date) as mode_prev" + + $" from t_telemetry_data_saub where id_telemetry = {idTelemetry}) as tt" + + $" where tt.mode != tt.mode_prev and tt.date >='{begin}' order by tt.date;"; + using var command = db.Database.GetDbConnection().CreateCommand(); + command.CommandText = operationTimeSpinWithDepth; + command. + db.Database.OpenConnection(); + using var result = await command.ExecuteReaderAsync(token); var resultSubsystemOperationTime = new List(); - while (true) + if (result.HasRows) { - var data = await query - .Where(d => d.DateTime > startDate) - .Take(take) - .ToArrayAsync(token); - var firstItem = data.FirstOrDefault(); - if (firstItem is null) - break; - short? mode = firstItem.Mode; - DateTimeOffset dateBegin = firstItem.DateTime; - float? depthStart = firstItem.Depth; - for (int i = 1; i < data.Length; i++) + while (result.Read()) { - if (data[i].Mode != mode) + var itemEntity = new SubsystemOperationTime() { - - var operationTimeItem = new SubsystemOperationTime() - { - IdTelemetry = idTelemetry, - DateStart = dateBegin, - DateEnd = data[i - 1].DateTime, - DepthStart = depthStart, - DepthEnd = data[i - 1].Depth - }; - if (mode.HasValue) - { - operationTimeItem.IdSubsystem = (int)mode + 1; - resultSubsystemOperationTime.Add(operationTimeItem); - } - mode = data[i].Mode; - dateBegin = data[i].DateTime; - depthStart = data[i].Depth; - } + IdTelemetry = idTelemetry, + DateStart = dateStart, + DateEnd = result.GetFieldValue(0), + DepthStart = depthStart, + DepthEnd = result.GetFieldValue(3), + IdSubsystem = result.GetFieldValue(2) + 1 + }; + dateStart = itemEntity.DateEnd; + depthStart = itemEntity.DepthStart; + resultSubsystemOperationTime.Add(itemEntity); } - startDate = data.Last().DateTime; } return resultSubsystemOperationTime; - } + } private static async Task?> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) { Predicate isSubsystemTorqueState = (int state) => state == 7; @@ -168,14 +154,14 @@ namespace AsbCloudInfrastructure.Services.Subsystems $"lag(state, 1) over (order by \"date\") as state_pre from t_telemetry_data_spin where id_telemetry = {idTelemetry} and date >= '{begin}') as tspin " + $"join (select \"date\", well_depth from t_telemetry_data_saub where id_telemetry = {idTelemetry} and date >= '{begin}') as tsaub " + $"on EXTRACT(EPOCH from tspin.date) = EXTRACT(EPOCH from tsaub.date) " + - $"where mode!=mode_pre or state != state_pre order by \"date\";"; - using var command = db.Database.GetDbConnection().CreateCommand(); + $"where mode!=mode_pre or state != state_pre order by \"date\";"; + using var command = db.Database.GetDbConnection().CreateCommand(); command.CommandText = operationTimeSpinWithDepth; db.Database.OpenConnection(); - using var result = await command.ExecuteReaderAsync(token); - var telemetryOpearationSpinSubsystems = new List(); + using var result = await command.ExecuteReaderAsync(token); + var telemetryOpearationSpinSubsystems = new List(); if (result.HasRows) - { + { while (result.Read()) { var itemEntity = new SubsystemsSpinWithDepth() @@ -194,51 +180,41 @@ namespace AsbCloudInfrastructure.Services.Subsystems { itemEntity.IdSubsystem = subsystemId.Value; telemetryOpearationSpinSubsystems.Add(itemEntity); - } - } - } - var take = 4 * 86_400; // 4 дня - var startDate = begin; - var resultSubsystemOperationTime = new List(); - while (true) - { - var data = telemetryOpearationSpinSubsystems - .Where(d => d.Date > startDate) - .Take(take) - .ToArray(); - var firstItem = data.FirstOrDefault(); - if (firstItem is null) - break; - int idSubsystem = firstItem.IdSubsystem; - DateTimeOffset dateBegin = firstItem.Date; - float? depthStart = firstItem.Depth; - for (int i = 1; i < data.Length; i++) - { - if (data[i].IdSubsystem != idSubsystem) - { - var operationTimeItem = new SubsystemOperationTime() - { - IdTelemetry = idTelemetry, - DateStart = dateBegin, - IdSubsystem = data[i - 1].IdSubsystem, - DateEnd = data[i].Date, - DepthStart = depthStart, - DepthEnd = data[i].Depth - - }; - dateBegin = data[i].Date; - depthStart = data[i].Depth; - idSubsystem = data[i].IdSubsystem; - if (data[i - 1].IdSubsystem != 0) - { - resultSubsystemOperationTime.Add(operationTimeItem); - } } - } - startDate = data.LastOrDefault().Date; + } + } + var resultSubsystemOperationTime = new List(); + var firstItem = telemetryOpearationSpinSubsystems.FirstOrDefault(); + if (firstItem is null) + return null; + int idSubsystem = firstItem.IdSubsystem; + DateTimeOffset dateBegin = firstItem.Date; + float? depthStart = firstItem.Depth; + for (int i = 1; i < telemetryOpearationSpinSubsystems.Count; i++) + { + if (telemetryOpearationSpinSubsystems[i].IdSubsystem != idSubsystem) + { + var operationTimeItem = new SubsystemOperationTime() + { + IdTelemetry = idTelemetry, + DateStart = dateBegin, + IdSubsystem = telemetryOpearationSpinSubsystems[i - 1].IdSubsystem, + DateEnd = telemetryOpearationSpinSubsystems[i].Date, + DepthStart = depthStart, + DepthEnd = telemetryOpearationSpinSubsystems[i].Depth + + }; + dateBegin = telemetryOpearationSpinSubsystems[i].Date; + depthStart = telemetryOpearationSpinSubsystems[i].Depth; + idSubsystem = telemetryOpearationSpinSubsystems[i].IdSubsystem; + if (telemetryOpearationSpinSubsystems[i - 1].IdSubsystem != 0) + { + resultSubsystemOperationTime.Add(operationTimeItem); + } + } } return resultSubsystemOperationTime; - } + } } #nullable disable } From 118ed4e701cacfdf120de4ceab27cf9c355bd396 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 18 Aug 2022 15:48:20 +0500 Subject: [PATCH 14/21] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=84=D0=BE=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AsbCloudInfrastructure.csproj | 1 + ...SubsystemOperationTimeBackgroundService.cs | 76 ++++++++++++------- 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 36035215..189f6383 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -35,6 +35,7 @@ + diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index e67a969b..e8e879c1 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; using System.Data; +using System.Data.SqlClient; using System.Diagnostics; using System.Linq; using System.Threading; @@ -15,7 +16,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems { #nullable enable internal class SubsystemOperationTimeBackgroundService : BackgroundService - { + { private readonly string connectionString; private readonly TimeSpan period = TimeSpan.FromHours(1); private const int idSubsytemTorqueMaster = 65537; @@ -102,43 +103,62 @@ namespace AsbCloudInfrastructure.Services.Subsystems return affected; } private static async Task?> OperationTimeSaubAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) - { - var dateStart = db.TelemetryDataSaub - .AsNoTracking() - .Where(d => (d.IdTelemetry == idTelemetry) & (d.DateTime >= begin)) - .Min(d => d.DateTime); - var depthStart = db.TelemetryDataSaub - .AsNoTracking() - .Where(d => (d.IdTelemetry == idTelemetry) & (d.DateTime >= begin)) - .Min(d => d.WellDepth); - - var operationTimeSpinWithDepth = - $"select tt.date, tt.mode, tt.mode_prev, tt.well_depth" + + { + var operationTimeSaub = + $"select tt.date, tt.mode, tt.well_depth" + $" from (select date, mode, well_depth, lag(mode,1) over (order by date) as mode_prev" + - $" from t_telemetry_data_saub where id_telemetry = {idTelemetry}) as tt" + - $" where tt.mode != tt.mode_prev and tt.date >='{begin}' order by tt.date;"; + $" from t_telemetry_data_saub where id_telemetry = @idTelemetry) as tt" + + $" where tt.mode != tt.mode_prev and tt.date >=@begin order by tt.date;"; using var command = db.Database.GetDbConnection().CreateCommand(); - command.CommandText = operationTimeSpinWithDepth; - command. + command.CommandText = operationTimeSaub; + SqlParameter telemetry = new SqlParameter("@idTelemetry", idTelemetry); + command.Parameters.Add(telemetry); + SqlParameter dateStart = new SqlParameter("@begin", begin); + command.Parameters.Add(dateStart); db.Database.OpenConnection(); using var result = await command.ExecuteReaderAsync(token); - var resultSubsystemOperationTime = new List(); + var telemetryOpearationSaubSubsystems = new List(); if (result.HasRows) { while (result.Read()) { - var itemEntity = new SubsystemOperationTime() + var itemEntity = new SubsystemsSpinWithDepth() + { + Date = result.GetFieldValue(0), + IdSubsystem = result.GetFieldValue(1)+1, + Depth = result.GetFieldValue(2) + }; + telemetryOpearationSaubSubsystems.Add(itemEntity); + } + } + var resultSubsystemOperationTime = new List(); + var firstItem = telemetryOpearationSaubSubsystems.FirstOrDefault(); + if (firstItem is null) + return null; + int idSubsystem = firstItem.IdSubsystem; + DateTimeOffset dateBegin = firstItem.Date; + float? depthStart = firstItem.Depth; + for (int i = 1; i < telemetryOpearationSaubSubsystems.Count; i++) + { + if (telemetryOpearationSaubSubsystems[i].IdSubsystem != idSubsystem) + { + var operationTimeItem = new SubsystemOperationTime() { IdTelemetry = idTelemetry, - DateStart = dateStart, - DateEnd = result.GetFieldValue(0), + DateStart = dateBegin, + IdSubsystem = telemetryOpearationSaubSubsystems[i - 1].IdSubsystem, + DateEnd = telemetryOpearationSaubSubsystems[i].Date, DepthStart = depthStart, - DepthEnd = result.GetFieldValue(3), - IdSubsystem = result.GetFieldValue(2) + 1 + DepthEnd = telemetryOpearationSaubSubsystems[i].Depth + }; - dateStart = itemEntity.DateEnd; - depthStart = itemEntity.DepthStart; - resultSubsystemOperationTime.Add(itemEntity); + dateBegin = telemetryOpearationSaubSubsystems[i].Date; + depthStart = telemetryOpearationSaubSubsystems[i].Depth; + idSubsystem = telemetryOpearationSaubSubsystems[i].IdSubsystem; + if (telemetryOpearationSaubSubsystems[i - 1].IdSubsystem != 0) + { + resultSubsystemOperationTime.Add(operationTimeItem); + } } } return resultSubsystemOperationTime; @@ -157,6 +177,10 @@ namespace AsbCloudInfrastructure.Services.Subsystems $"where mode!=mode_pre or state != state_pre order by \"date\";"; using var command = db.Database.GetDbConnection().CreateCommand(); command.CommandText = operationTimeSpinWithDepth; + SqlParameter telemetry = new SqlParameter("@idTelemetry", idTelemetry); + command.Parameters.Add(telemetry); + SqlParameter dateStart = new SqlParameter("@begin", begin); + command.Parameters.Add(dateStart); db.Database.OpenConnection(); using var result = await command.ExecuteReaderAsync(token); var telemetryOpearationSpinSubsystems = new List(); From e62d9907cde563e598e66c3523629394580a7d25 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 18 Aug 2022 15:51:25 +0500 Subject: [PATCH 15/21] correction subsystem background --- .../SubsystemOperationTimeBackgroundService.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index e8e879c1..bc8ae683 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -154,11 +154,9 @@ namespace AsbCloudInfrastructure.Services.Subsystems }; dateBegin = telemetryOpearationSaubSubsystems[i].Date; depthStart = telemetryOpearationSaubSubsystems[i].Depth; - idSubsystem = telemetryOpearationSaubSubsystems[i].IdSubsystem; - if (telemetryOpearationSaubSubsystems[i - 1].IdSubsystem != 0) - { - resultSubsystemOperationTime.Add(operationTimeItem); - } + idSubsystem = telemetryOpearationSaubSubsystems[i].IdSubsystem; + resultSubsystemOperationTime.Add(operationTimeItem); + } } return resultSubsystemOperationTime; @@ -226,7 +224,6 @@ namespace AsbCloudInfrastructure.Services.Subsystems DateEnd = telemetryOpearationSpinSubsystems[i].Date, DepthStart = depthStart, DepthEnd = telemetryOpearationSpinSubsystems[i].Depth - }; dateBegin = telemetryOpearationSpinSubsystems[i].Date; depthStart = telemetryOpearationSpinSubsystems[i].Depth; From 74901407c08a3a361e04813eaeb286ee6ae973d3 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Fri, 19 Aug 2022 00:00:30 +0500 Subject: [PATCH 16/21] -correction sql parameter on Background service -revision TRIM function on SubsystemOperationTimeService --- ...SubsystemOperationTimeBackgroundService.cs | 17 ++++--- .../SubsystemOperationTimeService.cs | 50 ++++++++++++------- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index bc8ae683..5885f8a1 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -3,6 +3,7 @@ using AsbCloudDb.Model.Subsystems; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; +using Npgsql; using System; using System.Collections.Generic; using System.Data; @@ -108,12 +109,12 @@ namespace AsbCloudInfrastructure.Services.Subsystems $"select tt.date, tt.mode, tt.well_depth" + $" from (select date, mode, well_depth, lag(mode,1) over (order by date) as mode_prev" + $" from t_telemetry_data_saub where id_telemetry = @idTelemetry) as tt" + - $" where tt.mode != tt.mode_prev and tt.date >=@begin order by tt.date;"; - using var command = db.Database.GetDbConnection().CreateCommand(); + $" where tt.mode != tt.mode_prev and tt.date >= @begin order by tt.date;"; + using var command = db.Database.GetDbConnection().CreateCommand(); command.CommandText = operationTimeSaub; - SqlParameter telemetry = new SqlParameter("@idTelemetry", idTelemetry); + var telemetry = new NpgsqlParameter("@idTelemetry", idTelemetry); command.Parameters.Add(telemetry); - SqlParameter dateStart = new SqlParameter("@begin", begin); + var dateStart = new NpgsqlParameter("@begin", begin); command.Parameters.Add(dateStart); db.Database.OpenConnection(); using var result = await command.ExecuteReaderAsync(token); @@ -169,15 +170,15 @@ namespace AsbCloudInfrastructure.Services.Subsystems var operationTimeSpinWithDepth = $"select tspin.\"date\", tspin.\"mode\", tspin.\"state\", tsaub.\"well_depth\"" + $" from (select \"date\" ,\"mode\" ,lag(mode, 1) over (order by \"date\") as mode_pre, state , " + - $"lag(state, 1) over (order by \"date\") as state_pre from t_telemetry_data_spin where id_telemetry = {idTelemetry} and date >= '{begin}') as tspin " + - $"join (select \"date\", well_depth from t_telemetry_data_saub where id_telemetry = {idTelemetry} and date >= '{begin}') as tsaub " + + $"lag(state, 1) over (order by \"date\") as state_pre from t_telemetry_data_spin where id_telemetry = @idTelemetry and date >= @begin) as tspin " + + $"join (select \"date\", well_depth from t_telemetry_data_saub where id_telemetry = @idTelemetry and date >= @begin) as tsaub " + $"on EXTRACT(EPOCH from tspin.date) = EXTRACT(EPOCH from tsaub.date) " + $"where mode!=mode_pre or state != state_pre order by \"date\";"; using var command = db.Database.GetDbConnection().CreateCommand(); command.CommandText = operationTimeSpinWithDepth; - SqlParameter telemetry = new SqlParameter("@idTelemetry", idTelemetry); + var telemetry = new NpgsqlParameter("@idTelemetry", idTelemetry); command.Parameters.Add(telemetry); - SqlParameter dateStart = new SqlParameter("@begin", begin); + var dateStart = new NpgsqlParameter("@begin", begin); command.Parameters.Add(dateStart); db.Database.OpenConnection(); using var result = await command.ExecuteReaderAsync(token); diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index c252a21a..22de29ac 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -28,7 +28,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems this.db = db; this.wellService = wellService; this.subsystemService = subsystemService; - } + } public async Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token) { var well = await wellService.GetOrDefaultAsync(request.IdWell, token); @@ -48,8 +48,8 @@ namespace AsbCloudInfrastructure.Services.Subsystems return null; var query = BuildQuery(request); if (query is null) - return null; - if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeInner) + return null; + if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeInner) { if (request.GtDate is not null) query = query.Where(o => o.DateStart >= request.GtDate.Value || o.DateEnd >= request.GtDate.Value); @@ -59,13 +59,17 @@ namespace AsbCloudInfrastructure.Services.Subsystems } if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeTrim) { - var begin = request.GtDate ?? query.Min(d => d.DateStart).UtcDateTime; - var end = request.LtDate ?? query.Max(d => d.DateEnd).UtcDateTime; + if (!request.GtDate.HasValue) + throw new ArgumentNullException(nameof(request.GtDate)); + var begin = request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); + if (!request.LtDate.HasValue) + throw new ArgumentNullException(nameof(request.LtDate)); + var end = request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); var data = query.ToList(); data = Trim(data, begin, end); return data.Select(o => Convert(o, well)); } - var dtos = query.Select(o => Convert(o,well)); + var dtos = query.Select(o => Convert(o, well)); return dtos; } public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token) @@ -77,25 +81,29 @@ namespace AsbCloudInfrastructure.Services.Subsystems var statList = CalcStat(data, request); return statList; } - private List Trim(List data, DateTime gtDate, DateTime ltDate) - { - var itemsToTrim = data.Where(q => - (q.DateStart >= gtDate && q.DateStart <= ltDate)|| - (q.DateEnd >= gtDate && q.DateEnd <= ltDate)) + private List Trim(List data, DateTimeOffset gtDate, DateTimeOffset ltDate) + { + var ItemsNormal = data.Where(q => + (q.DateStart >= gtDate) && (q.DateEnd <= ltDate)).ToList(); + var itemsToTrim = data.Where(q => + (q.DateStart < gtDate && q.DateEnd <= ltDate && q.DateEnd > gtDate) || + (q.DateStart >= gtDate && q.DateEnd > ltDate && q.DateStart < ltDate) || + (q.DateStart < gtDate && q.DateEnd > ltDate)) .Select(o => new SubsystemOperationTime { Id = o.Id, - DateStart = gtDate < o.DateStart ? gtDate : o.DateStart, - DateEnd = ltDate > o.DateEnd ? ltDate : o.DateEnd, + DateStart = (o.DateStart >= gtDate) && (o.DateStart <= ltDate) ? o.DateStart : gtDate, + DateEnd = (o.DateEnd >= gtDate) && (o.DateEnd <= ltDate) ? o.DateEnd : ltDate, IdSubsystem = o.IdSubsystem, IdTelemetry = o.IdTelemetry, - DepthEnd = ltDate>o.DateEnd ? null : o.DepthEnd, - DepthStart = gtDate < o.DateStart ? null : o.DepthStart, + DepthEnd = (o.DateEnd >= gtDate) && (o.DateEnd <= ltDate) ? o.DepthEnd : null , + DepthStart = (o.DateStart >= gtDate) && (o.DateStart <= ltDate) ? o.DepthStart : null, Subsystem = o.Subsystem, Telemetry = o.Telemetry }) .ToList(); - return itemsToTrim; + ItemsNormal.AddRange(itemsToTrim); + return ItemsNormal.OrderBy(o => o.DateStart).ToList(); } private IEnumerable CalcStat(IEnumerable listOperationTimeSubsystems, SubsystemOperationTimeRequest request) { @@ -137,11 +145,15 @@ namespace AsbCloudInfrastructure.Services.Subsystems query = query.Where(o => request.IdsSubsystems.Contains(o.IdSubsystem)); - if (request.GtDate is not null) - + if (request.GtDate is not null && request.LtDate is not null) + { + query = query.Where(o => (o.DateStart >= request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours)) + ||(o.DateEnd <= request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours))); + } + else if (request.GtDate is not null) query = query.Where(o => o.DateStart >= request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours)); - if (request.LtDate is not null) + else if (request.LtDate is not null) query = query.Where(o => o.DateEnd <= request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours)); From 4f27adf9ead6293dd94f289d5336d6cf41cb5e76 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Sun, 21 Aug 2022 20:58:55 +0500 Subject: [PATCH 17/21] correction SubsystemOperationTimeService --- .../SubsystemOperationTimeService.cs | 55 ++++++++++++------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 22de29ac..150970f2 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -65,9 +65,11 @@ namespace AsbCloudInfrastructure.Services.Subsystems if (!request.LtDate.HasValue) throw new ArgumentNullException(nameof(request.LtDate)); var end = request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); - var data = query.ToList(); + IEnumerable? data = query.ToList(); data = Trim(data, begin, end); - return data.Select(o => Convert(o, well)); + if (data is not null) + return data.Select(o => Convert(o, well)); + return null; } var dtos = query.Select(o => Convert(o, well)); return dtos; @@ -81,23 +83,23 @@ namespace AsbCloudInfrastructure.Services.Subsystems var statList = CalcStat(data, request); return statList; } - private List Trim(List data, DateTimeOffset gtDate, DateTimeOffset ltDate) + private IEnumerable? Trim(IEnumerable? data, DateTimeOffset gtDate, DateTimeOffset ltDate) { + if (data is null) + return null; var ItemsNormal = data.Where(q => (q.DateStart >= gtDate) && (q.DateEnd <= ltDate)).ToList(); var itemsToTrim = data.Where(q => - (q.DateStart < gtDate && q.DateEnd <= ltDate && q.DateEnd > gtDate) || - (q.DateStart >= gtDate && q.DateEnd > ltDate && q.DateStart < ltDate) || - (q.DateStart < gtDate && q.DateEnd > ltDate)) + q.DateStart < gtDate || ltDate < q.DateEnd) .Select(o => new SubsystemOperationTime { - Id = o.Id, - DateStart = (o.DateStart >= gtDate) && (o.DateStart <= ltDate) ? o.DateStart : gtDate, - DateEnd = (o.DateEnd >= gtDate) && (o.DateEnd <= ltDate) ? o.DateEnd : ltDate, + Id = o.Id, + DateStart = gtDate < o.DateStart ? o.DateStart : gtDate, + DateEnd = ltDate > o.DateEnd ? o.DateEnd : ltDate, IdSubsystem = o.IdSubsystem, - IdTelemetry = o.IdTelemetry, - DepthEnd = (o.DateEnd >= gtDate) && (o.DateEnd <= ltDate) ? o.DepthEnd : null , - DepthStart = (o.DateStart >= gtDate) && (o.DateStart <= ltDate) ? o.DepthStart : null, + IdTelemetry = o.IdTelemetry, + DepthStart = gtDate > o.DateEnd ? o.DepthStart : null, + DepthEnd = ltDate < o.DateStart ? o.DepthEnd : null, Subsystem = o.Subsystem, Telemetry = o.Telemetry }) @@ -140,21 +142,34 @@ namespace AsbCloudInfrastructure.Services.Subsystems var query = db.SubsystemOperationTimes .Include(o => o.Subsystem) .Where(o => o.IdTelemetry == well.IdTelemetry); - - if(request.IdsSubsystems?.Any() == true) + DateTimeOffset gtDateWellTime; + DateTimeOffset ltDateWellTime; + if (request.IdsSubsystems?.Any() == true) query = query.Where(o => request.IdsSubsystems.Contains(o.IdSubsystem)); - if (request.GtDate is not null && request.LtDate is not null) { - query = query.Where(o => (o.DateStart >= request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours)) - ||(o.DateEnd <= request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours))); + gtDateWellTime = request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); + ltDateWellTime = request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); + //query = query.Where(o => (o.DateStart >= gtDateWellTime) + //|| (o.DateEnd <= ltDateWellTime)); + query = query.Where(q => + (q.DateStart < gtDateWellTime && q.DateEnd <= ltDateWellTime && q.DateEnd > gtDateWellTime) || + (q.DateStart >= gtDateWellTime && q.DateEnd > ltDateWellTime && q.DateStart < ltDateWellTime) || + (q.DateStart < gtDateWellTime && q.DateEnd > ltDateWellTime) || + (q.DateStart >= gtDateWellTime && q.DateEnd <= ltDateWellTime)); + } + else if (request.GtDate is not null) + { + gtDateWellTime = request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); + query = query.Where(o => o.DateStart >= gtDateWellTime); } - else if (request.GtDate is not null) - query = query.Where(o => o.DateStart >= request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours)); else if (request.LtDate is not null) - query = query.Where(o => o.DateEnd <= request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours)); + { + ltDateWellTime = request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); + query = query.Where(o => o.DateEnd <= ltDateWellTime); + } if (request.GtDepth is not null) From 79108c754adef288f2f37ef9986d943eb787f82e Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 7 Sep 2022 18:01:39 +0500 Subject: [PATCH 18/21] fixed --- .../Requests/SubsystemOperationTimeRequest.cs | 3 + .../ISubsystemOperationTimeService.cs | 30 +- AsbCloudDb/Model/Subsystems/Subsystem.cs | 13 +- .../Subsystems/SubsystemOperationTime.cs | 19 +- ...SubsystemOperationTimeBackgroundService.cs | 267 ++++++++++-------- .../SubsystemOperationTimeService.cs | 174 ++++++------ .../Services/Subsystems/SubsystemService.cs | 23 +- .../Subsystems/AdminSubsystemController.cs | 2 +- .../SubsystemOperationTimeController.cs | 8 +- 9 files changed, 282 insertions(+), 257 deletions(-) diff --git a/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs b/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs index 2cef174a..3a4c3e56 100644 --- a/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs +++ b/AsbCloudApp/Requests/SubsystemOperationTimeRequest.cs @@ -47,14 +47,17 @@ namespace AsbCloudApp.Requests /// информация попадает в выборку, если интервал выборки частично или полностью пересекается с запрашиваемым интервалом /// public const int SelectModeOuter = 0; + /// /// информация попадает в выборку, если интервал выборки строго полностью пересекается с запрашиваемым интервалом. /// public const int SelectModeInner = 1; + /// /// аналогично outer, но интервалы в частично пересекающиеся укорачиваются по границам интервала выборки. /// public const int SelectModeTrim = 2; + /// /// Режим выборки элементов /// diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs index dbc79fd0..07e41895 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -1,19 +1,41 @@ using AsbCloudApp.Data.Subsystems; using AsbCloudApp.Requests; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; namespace AsbCloudApp.Services.Subsystems { #nullable enable + /// + /// Получение инфо о наработке подсистем + /// public interface ISubsystemOperationTimeService - { + { + /// + /// Статистика о наработке подсистем + /// + /// + /// + /// Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token); + + /// + /// Удаление наработки по подсистемам. + /// Если удаляется конец, то фоновый сервис подсчета наработки восстановит эти данные. + /// Может потребоваться для запуска повторного расчета по новому алгоритму. + /// + /// + /// + /// Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token); + + /// + /// Интервалы работы подсистем + /// + /// + /// + /// Task?> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); } #nullable disable diff --git a/AsbCloudDb/Model/Subsystems/Subsystem.cs b/AsbCloudDb/Model/Subsystems/Subsystem.cs index 70160f6e..37ac9fed 100644 --- a/AsbCloudDb/Model/Subsystems/Subsystem.cs +++ b/AsbCloudDb/Model/Subsystems/Subsystem.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; +using System.ComponentModel.DataAnnotations; using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations.Schema; @@ -9,9 +6,8 @@ namespace AsbCloudDb.Model.Subsystems { [Table("t_subsystem"), Comment("Описание подсистем")] public class Subsystem : IId - { - [Key] - [Column("id")] + { + [Column("id"), Key] public int Id { get; set; } [Column("name")] @@ -22,6 +18,5 @@ namespace AsbCloudDb.Model.Subsystems [StringLength(255)] public string? Description { get; set; } - } - + } } diff --git a/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs b/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs index e8b0c35b..9fd1833c 100644 --- a/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs +++ b/AsbCloudDb/Model/Subsystems/SubsystemOperationTime.cs @@ -9,8 +9,7 @@ namespace AsbCloudDb.Model.Subsystems [Table("t_subsystem_operation_time"), Comment("наработки подсистем")] public partial class SubsystemOperationTime : IId { - [Key] - [Column("id")] + [Column("id"), Key] public int Id { get; set; } [Column("id_telemetry"), Comment("ИД телеметрии по которой выдается информация")] @@ -20,23 +19,23 @@ namespace AsbCloudDb.Model.Subsystems public int IdSubsystem { get; set; } [Column("date_start"), Comment("дата/время включения подсистемы")] - public DateTimeOffset DateStart { get; set; } + public DateTimeOffset DateStart { get; set; } + [Column("date_end"), Comment("дата/время выключения подсистемы")] - public DateTimeOffset DateEnd { get; set; } + public DateTimeOffset DateEnd { get; set; } + [Column("depth_start"), Comment("глубина забоя на момент включения подсистемы")] public float? DepthStart { get; set; } + [Column("depth_end"), Comment("глубина забоя на момент выключения подсистемы")] public float? DepthEnd { get; set; } [JsonIgnore] - [ForeignKey(nameof(IdSubsystem))] - public virtual Subsystem Subsystem { get; set; } + [ForeignKey(nameof(IdSubsystem))] + public virtual Subsystem Subsystem { get; set; } = null!; [JsonIgnore] [ForeignKey(nameof(IdTelemetry))] - public virtual Telemetry Telemetry { get; set; } - - - + public virtual Telemetry Telemetry { get; set; } = null!; } } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs index 5885f8a1..0648c32f 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeBackgroundService.cs @@ -7,7 +7,6 @@ using Npgsql; using System; using System.Collections.Generic; using System.Data; -using System.Data.SqlClient; using System.Diagnostics; using System.Linq; using System.Threading; @@ -26,17 +25,18 @@ namespace AsbCloudInfrastructure.Services.Subsystems { connectionString = configuration.GetConnectionString("DefaultConnection"); } + protected override async Task ExecuteAsync(CancellationToken token) { - var timeToStartAnalysis = DateTime.Now; + var timeToStart = DateTime.Now; var options = new DbContextOptionsBuilder() .UseNpgsql(connectionString) .Options; while (!token.IsCancellationRequested) { - if (DateTime.Now > timeToStartAnalysis) + if (DateTime.Now > timeToStart) { - timeToStartAnalysis = DateTime.Now + period; + timeToStart = DateTime.Now + period; try { using var context = new AsbCloudDbContext(options); @@ -49,7 +49,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems } GC.Collect(); } - var ms = (int)(timeToStartAnalysis - DateTime.Now).TotalMilliseconds; + var ms = (int)(timeToStart - DateTime.Now).TotalMilliseconds; ms = ms > 100 ? ms : 100; await Task.Delay(ms, token).ConfigureAwait(false); } @@ -76,7 +76,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems .Select(t => t.Id) .ToListAsync(token); - var JounedlastDetectedDates = telemetryIds + var telemetryLastDetectedDates = telemetryIds .GroupJoin(lastDetectedDates, t => t, o => o.IdTelemetry, @@ -85,8 +85,9 @@ namespace AsbCloudInfrastructure.Services.Subsystems IdTelemetry = outer, inner.SingleOrDefault()?.LastDate, }); + var affected = 0; - foreach (var item in JounedlastDetectedDates) + foreach (var item in telemetryLastDetectedDates) { var newOperationsSaub = await OperationTimeSaubAsync(item.IdTelemetry, item.LastDate ?? DateTimeOffset.MinValue, db, token); if (newOperationsSaub?.Any() == true) @@ -103,139 +104,157 @@ namespace AsbCloudInfrastructure.Services.Subsystems } return affected; } - private static async Task?> OperationTimeSaubAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) - { - var operationTimeSaub = - $"select tt.date, tt.mode, tt.well_depth" + - $" from (select date, mode, well_depth, lag(mode,1) over (order by date) as mode_prev" + - $" from t_telemetry_data_saub where id_telemetry = @idTelemetry) as tt" + - $" where tt.mode != tt.mode_prev and tt.date >= @begin order by tt.date;"; - using var command = db.Database.GetDbConnection().CreateCommand(); - command.CommandText = operationTimeSaub; - var telemetry = new NpgsqlParameter("@idTelemetry", idTelemetry); - command.Parameters.Add(telemetry); - var dateStart = new NpgsqlParameter("@begin", begin); - command.Parameters.Add(dateStart); - db.Database.OpenConnection(); - using var result = await command.ExecuteReaderAsync(token); - var telemetryOpearationSaubSubsystems = new List(); - if (result.HasRows) + private static async Task> OperationTimeSaubAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) + { + static int? GetSubsytemId(short mode) { + return mode +1; + } + + var query = + $"select tt.date, tt.mode, tt.well_depth " + + $"from ( " + + $" select " + + $" date, " + + $" mode, " + + $" well_depth, " + + $" lag(mode,1) over (order by date) as mode_prev " + + $" from t_telemetry_data_saub " + + $" where id_telemetry = @idTelemetry " + + $" order by date ) as tt " + + $"where (tt.mode_prev is null or tt.mode != tt.mode_prev) and tt.date >= @begin " + + $"order by tt.date;"; + + var idTelemetryParam = new NpgsqlParameter("@idTelemetry", idTelemetry); + var beginParam = new NpgsqlParameter("@begin", begin); + + await db.Database.OpenConnectionAsync(token); + using var command = db.Database.GetDbConnection().CreateCommand(); + command.CommandText = query; + command.Parameters.Add(idTelemetryParam); + command.Parameters.Add(beginParam); + + using var result = await command.ExecuteReaderAsync(token); + + var subsystemOperationTime = new List(32); + + if (result.Read()) + { + var mode = result.GetFieldValue(1); + var idSubsystem = GetSubsytemId(mode); + var dateStart = result.GetFieldValue(0); + var depthStart = result.GetFieldValue(2); while (result.Read()) { - var itemEntity = new SubsystemsSpinWithDepth() + var dateEnd = result.GetFieldValue(0); + var depthEnd = result.GetFieldValue(2); + if (idSubsystem.HasValue) { - Date = result.GetFieldValue(0), - IdSubsystem = result.GetFieldValue(1)+1, - Depth = result.GetFieldValue(2) - }; - telemetryOpearationSaubSubsystems.Add(itemEntity); + var operationTimeItem = new SubsystemOperationTime() + { + IdTelemetry = idTelemetry, + IdSubsystem = idSubsystem.Value, + DateStart = dateStart, + DateEnd = dateEnd, + DepthStart = depthStart, + DepthEnd = depthEnd + }; + subsystemOperationTime.Add(operationTimeItem); + } + mode = result.GetFieldValue(1); + idSubsystem = GetSubsytemId(mode); + dateStart = dateEnd; + depthStart = depthEnd; } } - var resultSubsystemOperationTime = new List(); - var firstItem = telemetryOpearationSaubSubsystems.FirstOrDefault(); - if (firstItem is null) - return null; - int idSubsystem = firstItem.IdSubsystem; - DateTimeOffset dateBegin = firstItem.Date; - float? depthStart = firstItem.Depth; - for (int i = 1; i < telemetryOpearationSaubSubsystems.Count; i++) - { - if (telemetryOpearationSaubSubsystems[i].IdSubsystem != idSubsystem) - { - var operationTimeItem = new SubsystemOperationTime() - { - IdTelemetry = idTelemetry, - DateStart = dateBegin, - IdSubsystem = telemetryOpearationSaubSubsystems[i - 1].IdSubsystem, - DateEnd = telemetryOpearationSaubSubsystems[i].Date, - DepthStart = depthStart, - DepthEnd = telemetryOpearationSaubSubsystems[i].Depth - - }; - dateBegin = telemetryOpearationSaubSubsystems[i].Date; - depthStart = telemetryOpearationSaubSubsystems[i].Depth; - idSubsystem = telemetryOpearationSaubSubsystems[i].IdSubsystem; - resultSubsystemOperationTime.Add(operationTimeItem); - - } - } - return resultSubsystemOperationTime; + return subsystemOperationTime; } + private static async Task?> OperationTimeSpinAsync(int idTelemetry, DateTimeOffset begin, IAsbCloudDbContext db, CancellationToken token) { - Predicate isSubsystemTorqueState = (int state) => state == 7; - Predicate isSubsystemTorqueMode = (short mode) => (mode & 2) > 0; - Predicate isSubsystemSpin = (int state) => state != 0 & state != 6 & state != 7; - var operationTimeSpinWithDepth = - $"select tspin.\"date\", tspin.\"mode\", tspin.\"state\", tsaub.\"well_depth\"" + - $" from (select \"date\" ,\"mode\" ,lag(mode, 1) over (order by \"date\") as mode_pre, state , " + - $"lag(state, 1) over (order by \"date\") as state_pre from t_telemetry_data_spin where id_telemetry = @idTelemetry and date >= @begin) as tspin " + - $"join (select \"date\", well_depth from t_telemetry_data_saub where id_telemetry = @idTelemetry and date >= @begin) as tsaub " + - $"on EXTRACT(EPOCH from tspin.date) = EXTRACT(EPOCH from tsaub.date) " + - $"where mode!=mode_pre or state != state_pre order by \"date\";"; - using var command = db.Database.GetDbConnection().CreateCommand(); - command.CommandText = operationTimeSpinWithDepth; - var telemetry = new NpgsqlParameter("@idTelemetry", idTelemetry); - command.Parameters.Add(telemetry); - var dateStart = new NpgsqlParameter("@begin", begin); - command.Parameters.Add(dateStart); - db.Database.OpenConnection(); - using var result = await command.ExecuteReaderAsync(token); - var telemetryOpearationSpinSubsystems = new List(); - if (result.HasRows) + static int? GetSubsytemId(short mode, int state) { + if (state == 7 && (mode & 2) > 0) + return idSubsytemTorqueMaster; + + if (state != 0 & state != 6 & state != 7) + return idSubsytemSpinMaster; + + return null; + } + + var query = + $"select " + + $" tspin.date, " + + $" tspin.mode, " + + $" tspin.state, " + + $" tsaub.well_depth " + + $"from ( " + + $" select " + + $" date, " + + $" mode, " + + $" lag(mode, 1) over (order by date) as mode_pre, " + + $" state, " + + $" lag(state, 1) over (order by date) as state_pre " + + $" from t_telemetry_data_spin " + + $" where id_telemetry = @idTelemetry and date >= @begin" + + $" order by date ) as tspin " + + $"left outer join ( " + + $" select " + + $" date, " + + $" well_depth " + + $" from t_telemetry_data_saub " + + $" where id_telemetry = @idTelemetry and date >= @begin) as tsaub " + + $"on EXTRACT(EPOCH from tspin.date) = EXTRACT(EPOCH from tsaub.date) " + + $"where mode_pre is null or state_pre is null or mode != mode_pre or state != state_pre " + + $"order by date;"; + + var idTelemetryParam = new NpgsqlParameter("@idTelemetry", idTelemetry); + var beginParam = new NpgsqlParameter("@begin", begin); + + await db.Database.OpenConnectionAsync(token); + using var command = db.Database.GetDbConnection().CreateCommand(); + command.CommandText = query; + command.Parameters.Add(idTelemetryParam); + command.Parameters.Add(beginParam); + + using var result = await command.ExecuteReaderAsync(token); + + var subsystemOperationTime = new List(32); + + if (result.Read()) + { + var mode = result.GetFieldValue(1); + var state = result.GetFieldValue(2); + var idSubsystem = GetSubsytemId(mode, state); + var dateStart = result.GetFieldValue(0); + var depthStart = result.GetFieldValue(3); + while (result.Read()) { - var itemEntity = new SubsystemsSpinWithDepth() + var dateEnd = result.GetFieldValue(0); + var depthEnd = result.GetFieldValue(3); + if (idSubsystem.HasValue) { - Date = result.GetFieldValue(0), - Mode = result.GetFieldValue(1), - State = result.GetFieldValue(2), - Depth = result.GetFieldValue(3) - }; - int? subsystemId = isSubsystemTorqueState(itemEntity.State) && isSubsystemTorqueMode(itemEntity.Mode) - ? idSubsytemTorqueMaster - : isSubsystemSpin(itemEntity.State) - ? idSubsytemSpinMaster - : 0; - if (subsystemId.HasValue) - { - itemEntity.IdSubsystem = subsystemId.Value; - telemetryOpearationSpinSubsystems.Add(itemEntity); + var operationTimeItem = new SubsystemOperationTime() + { + IdTelemetry = idTelemetry, + IdSubsystem = idSubsystem.Value, + DateStart = dateStart, + DateEnd = dateEnd, + DepthStart = depthStart, + DepthEnd = depthEnd + }; + subsystemOperationTime.Add(operationTimeItem); } + mode = result.GetFieldValue(1); + state = result.GetFieldValue(2); + idSubsystem = GetSubsytemId(mode, state); + dateStart = dateEnd; + depthStart = depthEnd; } } - var resultSubsystemOperationTime = new List(); - var firstItem = telemetryOpearationSpinSubsystems.FirstOrDefault(); - if (firstItem is null) - return null; - int idSubsystem = firstItem.IdSubsystem; - DateTimeOffset dateBegin = firstItem.Date; - float? depthStart = firstItem.Depth; - for (int i = 1; i < telemetryOpearationSpinSubsystems.Count; i++) - { - if (telemetryOpearationSpinSubsystems[i].IdSubsystem != idSubsystem) - { - var operationTimeItem = new SubsystemOperationTime() - { - IdTelemetry = idTelemetry, - DateStart = dateBegin, - IdSubsystem = telemetryOpearationSpinSubsystems[i - 1].IdSubsystem, - DateEnd = telemetryOpearationSpinSubsystems[i].Date, - DepthStart = depthStart, - DepthEnd = telemetryOpearationSpinSubsystems[i].Depth - }; - dateBegin = telemetryOpearationSpinSubsystems[i].Date; - depthStart = telemetryOpearationSpinSubsystems[i].Depth; - idSubsystem = telemetryOpearationSpinSubsystems[i].IdSubsystem; - if (telemetryOpearationSpinSubsystems[i - 1].IdSubsystem != 0) - { - resultSubsystemOperationTime.Add(operationTimeItem); - } - } - } - return resultSubsystemOperationTime; + return subsystemOperationTime; } } #nullable disable diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 150970f2..9bfe0b85 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -29,6 +29,8 @@ namespace AsbCloudInfrastructure.Services.Subsystems this.wellService = wellService; this.subsystemService = subsystemService; } + + /// public async Task DeleteAsync(SubsystemOperationTimeRequest request, CancellationToken token) { var well = await wellService.GetOrDefaultAsync(request.IdWell, token); @@ -41,39 +43,40 @@ namespace AsbCloudInfrastructure.Services.Subsystems return await db.SaveChangesAsync(token); } + /// public async Task?> GetOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token) { var well = await wellService.GetOrDefaultAsync(request.IdWell, token); if (well?.IdTelemetry is null || well.Timezone is null) return null; + var query = BuildQuery(request); + if (query is null) return null; + + IEnumerable data = await query.ToListAsync(token); + if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeInner) { if (request.GtDate is not null) - query = query.Where(o => o.DateStart >= request.GtDate.Value || o.DateEnd >= request.GtDate.Value); + data = data.Where(o => o.DateStart >= request.GtDate.Value); if (request.LtDate is not null) - query = query.Where(o => o.DateEnd <= request.LtDate.Value || o.DateStart <= request.LtDate.Value); + data = data.Where(o => o.DateEnd <= request.LtDate.Value); } - if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeTrim) - { - if (!request.GtDate.HasValue) - throw new ArgumentNullException(nameof(request.GtDate)); - var begin = request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); - if (!request.LtDate.HasValue) - throw new ArgumentNullException(nameof(request.LtDate)); - var end = request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); - IEnumerable? data = query.ToList(); - data = Trim(data, begin, end); - if (data is not null) - return data.Select(o => Convert(o, well)); - return null; + else if (request.SelectMode == SubsystemOperationTimeRequest.SelectModeTrim) + { + var begin = request.GtDate?.ToUtcDateTimeOffset(well.Timezone.Hours); + var end = request.LtDate?.ToUtcDateTimeOffset(well.Timezone.Hours); + data = Trim(data, begin, end); } - var dtos = query.Select(o => Convert(o, well)); + + var dtos = data.Select(o => Convert(o, well)); return dtos; } + + /// public async Task?> GetStatAsync(SubsystemOperationTimeRequest request, CancellationToken token) { request.SelectMode = SubsystemOperationTimeRequest.SelectModeTrim; @@ -83,110 +86,104 @@ namespace AsbCloudInfrastructure.Services.Subsystems var statList = CalcStat(data, request); return statList; } - private IEnumerable? Trim(IEnumerable? data, DateTimeOffset gtDate, DateTimeOffset ltDate) + + private static IEnumerable Trim(IEnumerable data, DateTimeOffset? gtDate, DateTimeOffset? ltDate) { - if (data is null) - return null; - var ItemsNormal = data.Where(q => - (q.DateStart >= gtDate) && (q.DateEnd <= ltDate)).ToList(); - var itemsToTrim = data.Where(q => - q.DateStart < gtDate || ltDate < q.DateEnd) - .Select(o => new SubsystemOperationTime + var items = data.Select((item) => + { + if (gtDate.HasValue && item.DateStart < gtDate.Value) { - Id = o.Id, - DateStart = gtDate < o.DateStart ? o.DateStart : gtDate, - DateEnd = ltDate > o.DateEnd ? o.DateEnd : ltDate, - IdSubsystem = o.IdSubsystem, - IdTelemetry = o.IdTelemetry, - DepthStart = gtDate > o.DateEnd ? o.DepthStart : null, - DepthEnd = ltDate < o.DateStart ? o.DepthEnd : null, - Subsystem = o.Subsystem, - Telemetry = o.Telemetry - }) - .ToList(); - ItemsNormal.AddRange(itemsToTrim); - return ItemsNormal.OrderBy(o => o.DateStart).ToList(); + item.DateStart = gtDate.Value; + item.DepthStart = null; + } + if (ltDate.HasValue && item.DateEnd > ltDate.Value) + { + item.DateEnd = ltDate.Value; + item.DepthEnd = null; + } + return item; + }); + + return items; } - private IEnumerable CalcStat(IEnumerable listOperationTimeSubsystems, SubsystemOperationTimeRequest request) + + private IEnumerable CalcStat(IEnumerable dtos, SubsystemOperationTimeRequest request) { - var result = new List(); - var groupedDataSubsystems = listOperationTimeSubsystems - .GroupBy(x => x.IdSubsystem); - var periodGroupTotal = groupedDataSubsystems - .Sum(g => g.Sum(o=> (o.DateEnd - o.DateStart).TotalHours)); - var gtDate = request.GtDate ?? listOperationTimeSubsystems.Min(d => d.DateStart); - var ltDate = request.LtDate ?? listOperationTimeSubsystems.Max(d => d.DateEnd); - var periodRequest = listOperationTimeSubsystems - .Sum(o => (o.DateEnd - o.DateStart).TotalHours); - foreach (var item in groupedDataSubsystems) - { - var periodGroup = item.Sum(g => (g.DateEnd - g.DateStart).TotalHours); - int idSubsystem = item.First().IdSubsystem; + var groupedDataSubsystems = dtos + .GroupBy(o => o.IdSubsystem); + + var periodGroupTotal = dtos.Sum(o => (o.DateEnd - o.DateStart).TotalHours); + + var gtDate = request.GtDate ?? dtos.Min(o => o.DateStart); + var ltDate = request.LtDate ?? dtos.Max(o => o.DateEnd); + + var periodRequest = (ltDate - gtDate).TotalHours; + + var result = groupedDataSubsystems.Select(item => + { + var periodGroup = item.Sum(o => (o.DateEnd - o.DateStart).TotalHours); var subsystemStat = new SubsystemStatDto() { - IdSubsystem = idSubsystem, - SubsystemName = subsystemService.GetOrDefault(idSubsystem)?.Name ?? "unknown", - UsedTimeHours =periodGroup, - KUsage = 1d*periodGroup / periodRequest, - K2 = 1d*periodGroup / periodGroupTotal, + IdSubsystem = item.Key, + SubsystemName = subsystemService.GetOrDefault(item.Key)?.Name ?? "unknown", + UsedTimeHours = periodGroup, + KUsage = 1d * periodGroup / periodRequest, + K2 = 1d * periodGroup / periodGroupTotal, }; - result.Add(subsystemStat); - } + return subsystemStat; + }); + return result; } + private IQueryable? BuildQuery(SubsystemOperationTimeRequest request) { + if (request.SelectMode > 0 && request.GtDate is null && request.LtDate is null) + return null; + var well = wellService.GetOrDefault(request.IdWell); if (well?.IdTelemetry is null || well.Timezone is null) return null; + var query = db.SubsystemOperationTimes - .Include(o => o.Subsystem) - .Where(o => o.IdTelemetry == well.IdTelemetry); - DateTimeOffset gtDateWellTime; - DateTimeOffset ltDateWellTime; + .Include(o => o.Subsystem) + .Where(o => o.IdTelemetry == well.IdTelemetry) + .AsNoTracking(); + if (request.IdsSubsystems?.Any() == true) query = query.Where(o => request.IdsSubsystems.Contains(o.IdSubsystem)); - if (request.GtDate is not null && request.LtDate is not null) + // # Dates range condition + // [GtDate LtDate] + // [DateStart DateEnd] [DateStart DateEnd] + if (request.GtDate.HasValue) { - gtDateWellTime = request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); - ltDateWellTime = request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); - //query = query.Where(o => (o.DateStart >= gtDateWellTime) - //|| (o.DateEnd <= ltDateWellTime)); - query = query.Where(q => - (q.DateStart < gtDateWellTime && q.DateEnd <= ltDateWellTime && q.DateEnd > gtDateWellTime) || - (q.DateStart >= gtDateWellTime && q.DateEnd > ltDateWellTime && q.DateStart < ltDateWellTime) || - (q.DateStart < gtDateWellTime && q.DateEnd > ltDateWellTime) || - (q.DateStart >= gtDateWellTime && q.DateEnd <= ltDateWellTime)); - } - else if (request.GtDate is not null) - { - gtDateWellTime = request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); - query = query.Where(o => o.DateStart >= gtDateWellTime); + DateTimeOffset gtDate = request.GtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); + query = query.Where(o => o.DateEnd >= gtDate); } - else if (request.LtDate is not null) + if (request.LtDate.HasValue) { - ltDateWellTime = request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); - query = query.Where(o => o.DateEnd <= ltDateWellTime); + DateTimeOffset ltDate = request.LtDate.Value.ToUtcDateTimeOffset(well.Timezone.Hours); + query = query.Where(o => o.DateStart <= ltDate); } - - - if (request.GtDepth is not null) - query = query.Where(o => o.DepthStart >= request.GtDepth.Value); - if (request.LtDepth is not null) - query = query.Where(o => o.DepthEnd <= request.LtDepth.Value); - + if (request.GtDepth.HasValue) + query = query.Where(o => o.DepthEnd >= request.GtDepth.Value); + + if (request.LtDepth.HasValue) + query = query.Where(o => o.DepthStart <= request.LtDepth.Value); if (request?.SortFields?.Any() == true) { query = query.SortBy(request.SortFields); } else + { query = query .OrderBy(o => o.DateStart) .ThenBy(o => o.DepthStart); + } if (request?.Skip > 0) query = query.Skip((int)request.Skip); @@ -198,7 +195,8 @@ namespace AsbCloudInfrastructure.Services.Subsystems return query; } - private SubsystemOperationTimeDto Convert(SubsystemOperationTime operationTime, WellDto well) + + private static SubsystemOperationTimeDto Convert(SubsystemOperationTime operationTime, WellDto well) { var dto = operationTime.Adapt(); dto.DateStart = operationTime.DateStart.ToRemoteDateTime(well.Timezone.Hours); diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index 5f35a827..749dbbdf 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -27,21 +27,17 @@ namespace AsbCloudInfrastructure.Services.Subsystems var well = await wellService.GetOrDefaultAsync(idWell, token); if (well?.IdTelemetry is null || well.Timezone is null) return null; - var wellSubsystem = await dbContext.SubsystemOperationTimes + var entities = await dbContext.SubsystemOperationTimes .Include(e => e.Subsystem) .AsNoTracking() .Where(o => o.IdTelemetry == well.IdTelemetry) - .DistinctBy(o => o.IdSubsystem) - .Select(d => Convert( new () - { - Id = d.Subsystem.Id, - Name = d.Subsystem.Name, - Description = d.Subsystem.Description, - - })) - .ToListAsync(token); - return wellSubsystem; + .Select(o => o.Subsystem) + .Distinct() + .ToArrayAsync(token); + var dtos = entities.Select(e => e.Adapt()); + return dtos; } + public async Task?> GetSubsystemAsync(int? idWell, CancellationToken token) { if (idWell.HasValue) @@ -52,11 +48,6 @@ namespace AsbCloudInfrastructure.Services.Subsystems var subsystem = await GetAllAsync(token); return subsystem; } - new private static SubsystemDto Convert(Subsystem subsystem) - { - var dto = subsystem.Adapt(); - return dto; - } } #nullable disable } diff --git a/AsbCloudWebApi/Controllers/Subsystems/AdminSubsystemController.cs b/AsbCloudWebApi/Controllers/Subsystems/AdminSubsystemController.cs index 3663f5df..dc7ac408 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/AdminSubsystemController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/AdminSubsystemController.cs @@ -19,5 +19,5 @@ namespace AsbCloudWebApi.Controllers.Subsystems { } } - } +} diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index d54fe10c..881e738b 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -21,13 +21,11 @@ namespace AsbCloudWebApi.Controllers.Subsystems { private readonly ISubsystemOperationTimeService subsystemOperationTimeService; private readonly IWellService wellService; - private readonly ICrudService subsystemServiceCrud; private readonly ISubsystemService subsystemService; - public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService, IWellService wellService, ICrudService subsystemServiceCrud, ISubsystemService subsystemService) + public SubsystemOperationTimeController(ISubsystemOperationTimeService subsystemOperationTimeService, IWellService wellService, ISubsystemService subsystemService) { this.subsystemOperationTimeService = subsystemOperationTimeService; this.wellService = wellService; - this.subsystemServiceCrud = subsystemServiceCrud; this.subsystemService = subsystemService; } /// @@ -53,8 +51,8 @@ namespace AsbCloudWebApi.Controllers.Subsystems if (idWell.HasValue) if (!await UserHasAccesToWellAsync(idWell.Value, token)) return Forbid(); - var result = await subsystemService.GetSubsystemAsync(idWell, token); - return Ok(result); + var result = await subsystemService.GetSubsystemAsync(idWell, token); + return Ok(result); } /// From 74cc237f67807abeb94bef42e853eda89617d171 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 8 Sep 2022 09:43:51 +0500 Subject: [PATCH 19/21] clean --- .../AsbCloudInfrastructure.csproj | 1 - .../Subsystems/SubsystemsSpinWithDepth.cs | 15 --------------- 2 files changed, 16 deletions(-) delete mode 100644 AsbCloudInfrastructure/Services/Subsystems/SubsystemsSpinWithDepth.cs diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 189f6383..36035215 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -35,7 +35,6 @@ - diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemsSpinWithDepth.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemsSpinWithDepth.cs deleted file mode 100644 index 3abd4624..00000000 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemsSpinWithDepth.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -namespace AsbCloudDb.Model.Subsystems -{ - /// - /// Результат запроса в t_telemetry_data_spin, используется фоновым сервисом анализирующим наработки подсистем - /// - internal class SubsystemsSpinWithDepth - { - public short Mode { get; set; } - public int State { get; set; } - public DateTimeOffset Date { get; set; } - public float Depth { get; set; } - public int IdSubsystem { get; set; } - } -} From d3daef5b17e8778a12dd513cb40847a744ba2b47 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 8 Sep 2022 14:02:49 +0500 Subject: [PATCH 20/21] Fix dependencies --- AsbCloudInfrastructure/DependencyInjection.cs | 6 +----- AsbCloudWebApi/Controllers/CrudWellRelatedController.cs | 1 + 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index e0de37e8..8be22d57 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -118,8 +118,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient, CrudWellRelatedServiceBase>(); @@ -140,9 +139,6 @@ namespace AsbCloudInfrastructure s.GetService(), dbSet => dbSet.Include(c => c.CompanyType))); - - - services.AddTransient, CrudCacheServiceBase>(); services.AddTransient, CrudCacheServiceBase>(s => new CrudCacheServiceBase( diff --git a/AsbCloudWebApi/Controllers/CrudWellRelatedController.cs b/AsbCloudWebApi/Controllers/CrudWellRelatedController.cs index 236d13e1..7cdf5570 100644 --- a/AsbCloudWebApi/Controllers/CrudWellRelatedController.cs +++ b/AsbCloudWebApi/Controllers/CrudWellRelatedController.cs @@ -78,6 +78,7 @@ namespace AsbCloudWebApi.Controllers public override async Task> GetAsync(int id, CancellationToken token) { var actionResult = await base.GetAsync(id, token); + // TODO: this can be nullref var result = actionResult.Value; if (!await UserHasAccesToWellAsync(result.IdWell, token)) return Forbid(); From 9ca7bf75e7bf79fd8604b28ef19dfc82172152a9 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 9 Sep 2022 15:29:46 +0500 Subject: [PATCH 21/21] Update nuget packs --- AsbCloudDb/AsbCloudDb.csproj | 4 +- .../AsbCloudInfrastructure.csproj | 11 +- .../AsbCloudWebApi.Tests.csproj | 12 +- AsbCloudWebApi/AsbCloudWebApi.csproj | 12 +- ConsoleApp1/ConsoleApp1.csproj | 11 +- ConsoleApp1/GoogleDriveService.cs | 145 ------------------ 6 files changed, 23 insertions(+), 172 deletions(-) delete mode 100644 ConsoleApp1/GoogleDriveService.cs diff --git a/AsbCloudDb/AsbCloudDb.csproj b/AsbCloudDb/AsbCloudDb.csproj index 38f953fe..16b1354f 100644 --- a/AsbCloudDb/AsbCloudDb.csproj +++ b/AsbCloudDb/AsbCloudDb.csproj @@ -6,11 +6,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 36035215..b38c4f87 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -28,14 +28,13 @@ - - - - + + + - - + + diff --git a/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj b/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj index 3069a4b2..f8b181c5 100644 --- a/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj +++ b/AsbCloudWebApi.Tests/AsbCloudWebApi.Tests.csproj @@ -7,12 +7,12 @@ - - - - - - + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/AsbCloudWebApi/AsbCloudWebApi.csproj b/AsbCloudWebApi/AsbCloudWebApi.csproj index 820753a6..4a1f5733 100644 --- a/AsbCloudWebApi/AsbCloudWebApi.csproj +++ b/AsbCloudWebApi/AsbCloudWebApi.csproj @@ -9,12 +9,12 @@ - - - - - - + + + + + + diff --git a/ConsoleApp1/ConsoleApp1.csproj b/ConsoleApp1/ConsoleApp1.csproj index 173388d2..da0e1e97 100644 --- a/ConsoleApp1/ConsoleApp1.csproj +++ b/ConsoleApp1/ConsoleApp1.csproj @@ -8,13 +8,15 @@ + + + - - + @@ -32,9 +34,4 @@ - - - - - diff --git a/ConsoleApp1/GoogleDriveService.cs b/ConsoleApp1/GoogleDriveService.cs deleted file mode 100644 index b26ea93e..00000000 --- a/ConsoleApp1/GoogleDriveService.cs +++ /dev/null @@ -1,145 +0,0 @@ -using Google.Apis.Auth.OAuth2; -using Google.Apis.Auth.OAuth2.Flows; -using Google.Apis.Auth.OAuth2.Responses; -using Google.Apis.Drive.v3; -using Google.Apis.Drive.v3.Data; -using Google.Apis.Services; -using Google.Apis.Util.Store; -using System.IO; -using System.Linq; - -// usage example at the very bottom -namespace ConsoleApp1 -{ - public class GoogleDriveService - { - private readonly DriveService service; - - public GoogleDriveService() - { // ключи для почты asbautodrilling@gmail.com. - var tokenResponse = new TokenResponse - { - AccessToken = "ya29.a0ARrdaM-lM7q0TIC_DXixR4oW63QUftjSPHl-8nIdvZwtqA8Z1bXtlYpDrQXj9UFTjW8FW8uqPMrdamUSp4kO4a9JX7FddkBWxaJ_omSJpqzDfnHTHA_7-zGMUohaAsmPLsQtFz_GUmB5ZoVLmA8xWdbJxVxU", - RefreshToken = "1//04FeDguc19IfgCgYIARAAGAQSNwF-L9Ir8U7wX2seanUzsxXXGgFzOYQqjbtN9O27ZZybbOobZjVAo_4_eFNLMX1ElPKOFVWsrJQ" - }; - - var applicationName = "Files"; // Use the name of the project in Google Cloud - var username = "asbautodrilling@gmail.com"; // Use your email - - var apiCodeFlow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer - { - ClientSecrets = new ClientSecrets - { - ClientId = "1020584579240-f7amqg35qg7j94ta1ntgitajq27cgh49.apps.googleusercontent.com", - ClientSecret = "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" - }, - Scopes = new[] { DriveService.Scope.Drive }, - DataStore = new FileDataStore(applicationName) - }); - - var credential = new UserCredential(apiCodeFlow, username, tokenResponse); - - var newService = new DriveService(new BaseClientService.Initializer - { - HttpClientInitializer = credential, - ApplicationName = applicationName - }); - this.service = newService; - } - - // public IEnumerable GetAllFiles() // get file names - // { - // var fileList = service.Files.List(); - // fileList.Fields = "files(id, webViewLink, size)"; - // //fileList.Q =$"mimeType!='application/vnd.google-apps.folder' and '{folder}' in parents"; - // //fileList.Fields = "nextPageToken, files(id, name, size, mimeType)"; - // - // var result = new List(); - // string pageToken = null; - // do - // { - // fileList.PageToken = pageToken; - // var filesResult = fileList.Execute(); - // var files = filesResult.Files; - // pageToken = filesResult.NextPageToken; - // result.AddRange(files); - // } while (pageToken != null); - // - // return result; - // } - - public string GetFileWebLink(string idFile) - { - var fileList = service.Files.List(); - fileList.Fields = "files(id, webViewLink, size)"; - var filesResult = fileList.Execute(); - var file = filesResult.Files.FirstOrDefault(f => f.Id == idFile); - return file?.WebViewLink ?? string.Empty; - } - - // У Гугла почему-то folder это и папка, и файл. - public string CreateFolder(string folderName) - { - var driveFolder = new Google.Apis.Drive.v3.Data.File(); - driveFolder.Name = folderName; - driveFolder.MimeType = "application/vnd.google-apps.folder"; - //driveFolder.Parents = new string[] { parent }; - var command = service.Files.Create(driveFolder); - var file = command.Execute(); - return file.Id; - } - - public void CreatePublicPermissionForFile(string idFile) - { - var permission = new Permission() { Type = "anyone", Role = "reader" }; - var addPermissionRequest = service.Permissions.Create(permission, idFile); - addPermissionRequest.Execute(); - } - - public string UploadFile(Stream file, string fileName, string fileMime, string fileDescription) - { - var driveFile = new Google.Apis.Drive.v3.Data.File(); - driveFile.Name = fileName; - driveFile.Description = fileDescription; - driveFile.MimeType = fileMime; - //driveFile.Parents = new [] {folder}; - - var request = service.Files.Create(driveFile, file, fileMime); - request.Fields = "id"; - - var response = request.Upload(); - if (response.Status != Google.Apis.Upload.UploadStatus.Completed) - throw response.Exception; - - return request.ResponseBody.Id; - } - - public void DeleteFile(string fileId) - { - var command = service.Files.Delete(fileId); - var result = command.Execute(); - } - } -} - -// usage example: - -// var service = new GoogleDriveService(); -// -// //var files = serviceWrapper.GetAllFiles(); -// -// // foreach (var file in files) -// // { -// // var permission = new Permission() { Type = "anyone", Role = "reader"}; -// // var createRequest = service.Permissions.Create(permission, file.Id); -// // createRequest.Execute(); -// // Console.WriteLine(file.WebViewLink); -// // } -// -// var path = "/home/cult/First.xlsx"; -// var fileInfo = new FileInfo(path); -// var fileStream = System.IO.File.Open(path, FileMode.Open); -// var uploadedFileId = service.UploadFileAsync(fileStream, fileInfo.Name, "", "uploaded"); -// service.CreatePublicPermissionForFileAsync(uploadedFileId); -// var webLink = service.GetFileWebLinkAsync(uploadedFileId); -// Console.WriteLine(webLink); \ No newline at end of file