From 9f996003eb1181de4897a5655c64d4faeb51de2f Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 13 Jan 2023 14:34:26 +0500 Subject: [PATCH] ProcessMapReport. Add GetTelemetryDataStatAsync(..) to TelemetryDataSaubService. --- .../Data/SAUB/TelemetryDataSaubStatDto.cs | 117 ++++++++++++++++++ .../Services/ITelemetryDataSaubService.cs | 26 ++++ AsbCloudApp/Services/ITelemetryDataService.cs | 3 +- AsbCloudInfrastructure/DependencyInjection.cs | 2 +- .../ProcessMap/ProcessMapReportService.cs | 11 +- .../Services/ProcessMap/ProcessMapService.cs | 75 +++-------- .../ProcessMap/ProcessTelemetrySaubStat.cs | 35 ------ .../Services/SAUB/TelemetryDataBaseService.cs | 4 +- .../Services/SAUB/TelemetryDataSaubService.cs | 55 +++++++- 9 files changed, 219 insertions(+), 109 deletions(-) create mode 100644 AsbCloudApp/Data/SAUB/TelemetryDataSaubStatDto.cs create mode 100644 AsbCloudApp/Services/ITelemetryDataSaubService.cs delete mode 100644 AsbCloudInfrastructure/Services/ProcessMap/ProcessTelemetrySaubStat.cs diff --git a/AsbCloudApp/Data/SAUB/TelemetryDataSaubStatDto.cs b/AsbCloudApp/Data/SAUB/TelemetryDataSaubStatDto.cs new file mode 100644 index 00000000..90bbd5f0 --- /dev/null +++ b/AsbCloudApp/Data/SAUB/TelemetryDataSaubStatDto.cs @@ -0,0 +1,117 @@ +using System; + +namespace AsbCloudApp.Data.SAUB +{ +#nullable enable + /// + /// Статистика телеметрии САУБ (усредненные значения) по интервалам глубины + /// + public class TelemetryDataSaubStatDto + { + /// + /// Кол-во записей в интервале + /// + public int Count { get; set; } + + /// + /// Дата начала интервала + /// + public DateTime DateMin { get; set; } + + /// + /// Дата окончания интервала + /// + public DateTime DateMax { get; set; } + + /// + /// Глубина начала интервала + /// + public float WellDepthMin { get; set; } + + /// + /// Глубина окончания интервала + /// + public float WellDepthMax { get; set; } + + /// + /// Давление + /// + public float Pressure { get; set; } + + /// + /// действующее задание давления + /// + public float PressureSp { get; set; } + + /// + /// Давление при холостом ходе. + /// + public float PressureIdle { get; set; } + + /// + /// задание давления для роторного режима + /// + public float PressureSpRotor { get; set; } + + /// + /// задание давления для режима слайда + /// + public float PressureSpSlide { get; set; } + + /// + /// ограничение макс перепада давления + /// + public float PressureDeltaLimitMax { get; set; } + + /// + /// осевая нагрузка + /// + public float AxialLoad { get; set; } + + /// + /// задание осевой нагрузки + /// + public float AxialLoadSp { get; set; } + + /// + /// ограничение макс. осевой нагрузки + /// + public float AxialLoadLimitMax { get; set; } + + /// + /// момент ротора + /// + public float RotorTorque { get; set; } + + /// + /// задание момента ротора + /// + public float RotorTorqueSp { get; set; } + + /// + /// момент ротора на х.х. + /// + public float RotorTorqueLimitMax { get; set; } + + /// + /// Талевый блок. Скорость + /// + public float BlockSpeed { get; set; } + + /// + /// Талевый блок. Задание скорости + /// + public float BlockSpeedSp { get; set; } + + /// + /// Талевый блок. Задание скорости для роторного бурения + /// + public float BlockSpeedSpRotor { get; set; } + + /// + /// Талевый блок. Задание скорости для режима слайда + /// + public float BlockSpeedSpSlide { get; set; } + } +#nullable disable +} diff --git a/AsbCloudApp/Services/ITelemetryDataSaubService.cs b/AsbCloudApp/Services/ITelemetryDataSaubService.cs new file mode 100644 index 00000000..d6bdcb6f --- /dev/null +++ b/AsbCloudApp/Services/ITelemetryDataSaubService.cs @@ -0,0 +1,26 @@ +using AsbCloudApp.Data.SAUB; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +namespace AsbCloudApp.Services +{ + /// + /// Телеметрия САУБ + /// + public interface ITelemetryDataSaubService : ITelemetryDataService + { + /// + /// усредненная статистика по 1м за весь период + /// + /// МЕДЛЕННЫЙ ЗАПРОС + /// + /// + /// + /// + /// + Task> GetTelemetryDataStatAsync(int idTelemetry, CancellationToken token); + } +} +#nullable disable \ No newline at end of file diff --git a/AsbCloudApp/Services/ITelemetryDataService.cs b/AsbCloudApp/Services/ITelemetryDataService.cs index 8efc74ae..585843ff 100644 --- a/AsbCloudApp/Services/ITelemetryDataService.cs +++ b/AsbCloudApp/Services/ITelemetryDataService.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; + #nullable enable namespace AsbCloudApp.Services { @@ -33,7 +34,7 @@ namespace AsbCloudApp.Services /// /// /// - Task UpdateDataAsync(string uid, IEnumerable dtos, CancellationToken token = default); + Task UpdateDataAsync(string uid, IEnumerable dtos, CancellationToken token); } } #nullable disable \ No newline at end of file diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 6a2f9fca..1b7b05d1 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -184,7 +184,7 @@ namespace AsbCloudInfrastructure services.AddTransient, CrudCacheRepositoryBase>(); // TelemetryData services - services.AddTransient, TelemetryDataSaubService>(); + services.AddTransient(); services.AddTransient, TelemetryDataSpinService>(); // Wits diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs index fa80efe4..c8357a2a 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapReportService.cs @@ -30,16 +30,9 @@ namespace AsbCloudInfrastructure.Services.ProcessMap var stream = GetExcelTemplateStream(); using var workbook = new XLWorkbook(stream, XLEventTracking.Disabled); - var data = processMapService.GetProcessMapAsync(idWell, token); + var data = await processMapService.GetProcessMapAsync(idWell, token); - //var dtos = await processMapRepository.GetByIdWellAsync(idWell, token).ConfigureAwait(false); - //if (dtos is not null) - //{ - // var processMapReportDto = await processMapService.GetProcessMapAsync(dtos, token).ConfigureAwait(false); - // FillProcessMapToWorkbook(workbook, processMapReportDto); - //} - - FillProcessMapToWorkbook(workbook, new List()); + FillProcessMapToWorkbook(workbook, data); MemoryStream memoryStream = new MemoryStream(); workbook.SaveAs(memoryStream, new SaveOptions { }); diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs index 13c0db9f..c29ffd8e 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs @@ -5,7 +5,6 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; -using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; @@ -21,17 +20,23 @@ namespace AsbCloudInfrastructure.Services.ProcessMap private readonly IWellOperationRepository wellOperationRepository; private readonly IProcessMapRepository processMapRepository; private readonly ITelemetryService telemetryService; + private readonly ITelemetryDataSaubService telemetryDataSaubService; + private readonly ILimitingParameterRepository limitingParameterRepository; public ProcessMapService( IAsbCloudDbContext db, IWellOperationRepository wellOperationService, IProcessMapRepository processMapRepository, - ITelemetryService telemetryService) + ITelemetryService telemetryService, + ITelemetryDataSaubService telemetryDataSaubService, + ILimitingParameterRepository limitingParameterRepository) { this.db = db; this.wellOperationRepository = wellOperationService; this.processMapRepository = processMapRepository; this.telemetryService = telemetryService; + this.telemetryDataSaubService = telemetryDataSaubService; + this.limitingParameterRepository = limitingParameterRepository; } public async Task> GetProcessMapAsync(int idWell, CancellationToken token) @@ -49,7 +54,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap var processMapDtos = (await processMapRepository.GetByIdWellAsync(idWell, token))!; var idTelemetry = telemetryService.GetOrDefaultIdTelemetryByIdWell(idWell)!.Value; - IEnumerable telemetryDataStat = await GetTelemetryDataAsync(idTelemetry, token); + IEnumerable telemetryDataStat = await telemetryDataSaubService.GetTelemetryDataStatAsync(idTelemetry, token); var result = allFactDrillingOperations .GroupBy(o => o.IdWellSectionType) @@ -63,59 +68,10 @@ namespace AsbCloudInfrastructure.Services.ProcessMap return result; } - private async Task> GetTelemetryDataAsync(int idTelemetry, CancellationToken token) - { - var timezone = telemetryService.GetTimezone(idTelemetry); - var timezoneOffset = TimeSpan.FromHours(timezone.Hours); - - var query = db.Set() - .Where(t => t.IdTelemetry == idTelemetry) - .Where(t => t.BlockPosition > 0.0001) - .Where(t => t.WellDepth > 0.0001) - .Where(t => t.WellDepth - t.BitDepth < 0.01) - .GroupBy(t => new { H = t.DateTime.Hour, W = Math.Truncate(t.WellDepth!.Value) }) - .Select(g => new ProcessTelemetrySaubStat - { - Count = g.Count(), - - DateMin = g.Min(t => t.DateTime.UtcDateTime), - DateMax = g.Max(t => t.DateTime.UtcDateTime), - - WellDepthMin = g.Min(t => t.WellDepth!.Value), - WellDepthMax = g.Max(t => t.WellDepth!.Value), - - Pressure = g.Average(t => t.Pressure!.Value), - PressureSp = g.Average(t => t.PressureSp!.Value), - PressureSpRotor = g.Average(t => t.PressureSpRotor!.Value), - PressureSpSlide = g.Average(t => t.PressureSpSlide!.Value), - PressureIdle = g.Average(t => t.PressureIdle!.Value), - PressureDeltaLimitMax = g.Average(t => t.PressureDeltaLimitMax!.Value), - - AxialLoad = g.Average(t => t.AxialLoad!.Value), - AxialLoadSp = g.Average(t => t.AxialLoadSp!.Value), - AxialLoadLimitMax = g.Average(t => t.AxialLoadLimitMax!.Value), - - RotorTorque = g.Average(t => t.RotorTorque!.Value), - RotorTorqueSp = g.Average(t => t.RotorTorqueSp!.Value), - RotorTorqueLimitMax = g.Average(t => t.RotorTorqueLimitMax!.Value), - - BlockSpeed = g.Average(t => t.BlockSpeed!.Value), - BlockSpeedSp = g.Average(t => t.BlockSpeedSp!.Value), - BlockSpeedSpRotor = g.Average(t => t.BlockSpeedSpRotor!.Value), - BlockSpeedSpSlide = g.Average(t => t.BlockSpeedSpSlide!.Value), - }) - .Where(s => s.WellDepthMin != s.WellDepthMax) - .Where(s => s.Count > 3) - .OrderBy(t => t.DateMin); - - var data = await query.ToArrayAsync(token); - return data; - } - private static IEnumerable HandleSections( IEnumerable sectionOperations, IEnumerable sectionProcessMap, - IEnumerable telemetryDataStat) + IEnumerable telemetryDataStat) { var minDepth = sectionOperations.Min(o => o.DepthStart); var maxDepth = sectionOperations.Max(o => o.DepthEnd); @@ -133,7 +89,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap (double min, double max) depthInterval, IEnumerable sectionOperations, IEnumerable sectionProcessMap, - IEnumerable telemetryDataStat) + IEnumerable telemetryDataStat) { var dto = new ProcessMapReportDto{ DepthStart = depthInterval.min @@ -161,9 +117,9 @@ namespace AsbCloudInfrastructure.Services.ProcessMap return dto; } - private static ProcessTelemetrySaubStat? CalcIntervalTelemetryDataStat((double min, double max) depthInterval, IEnumerable telemetryDataStat) + private static TelemetryDataSaubStatDto? CalcIntervalTelemetryDataStat((double min, double max) depthInterval, IEnumerable telemetryDataStat) { - ProcessTelemetrySaubStat[] data = telemetryDataStat + TelemetryDataSaubStatDto[] data = telemetryDataStat .Where(d => d.WellDepthMin <= depthInterval.max && d.WellDepthMax >= depthInterval.min) .ToArray(); @@ -173,8 +129,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap if (data.Length == 1) return data.First(); - - var result = new ProcessTelemetrySaubStat + var result = new TelemetryDataSaubStatDto { WellDepthMin = data.Min(d => d.WellDepthMin), WellDepthMax = data.Max(d => d.WellDepthMax), @@ -200,7 +155,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap result.RotorTorque += item.RotorTorque * itemWeight; result.RotorTorqueSp += item.RotorTorqueSp * itemWeight; result.RotorTorqueLimitMax += item.RotorTorqueLimitMax * itemWeight; - + result.BlockSpeed += item.BlockSpeed * itemWeight; result.BlockSpeedSp += item.BlockSpeedSp * itemWeight; result.BlockSpeedSpRotor += item.BlockSpeedSpRotor * itemWeight; @@ -214,7 +169,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap (double min, double max) depthInterval, IEnumerable intervalModeOperations, IEnumerable intervalProcessMap, - ProcessTelemetrySaubStat? telemetryDataStat) + TelemetryDataSaubStatDto? telemetryDataStat) { var dto = new ProcessMapReportRowDto(); if (intervalModeOperations.Any()) diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessTelemetrySaubStat.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessTelemetrySaubStat.cs deleted file mode 100644 index 9c09d2ea..00000000 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessTelemetrySaubStat.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; - -namespace AsbCloudInfrastructure.Services.ProcessMap -{ -#nullable enable - class ProcessTelemetrySaubStat { - public int Count { get; set; } - public DateTime DateMin { get; set; } - public DateTime DateMax { get; set; } - - public float WellDepthMin { get; set; } - public float WellDepthMax { get; set; } - - public float Pressure { get; set; } - public float PressureSp { get; set; } - public float PressureIdle { get; set; } - public float PressureSpRotor { get; set; } - public float PressureSpSlide { get; set; } - public float PressureDeltaLimitMax { get; set; } - - public float AxialLoad { get; set; } - public float AxialLoadSp { get; set; } - public float AxialLoadLimitMax { get; set; } - - public float RotorTorque { get; set; } - public float RotorTorqueSp { get; set; } - public float RotorTorqueLimitMax { get; set; } - - public float BlockSpeed { get; set; } - public float BlockSpeedSp { get; set; } - public float BlockSpeedSpRotor { get; set; } - public float BlockSpeedSpSlide { get; set; } - } -#nullable disable -} diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs index 941bc012..d8f7736c 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs @@ -17,8 +17,8 @@ namespace AsbCloudInfrastructure.Services.SAUB where TEntity : class, ITelemetryData { protected readonly IAsbCloudDbContext db; - private readonly ITelemetryService telemetryService; - private readonly TelemetryDataCache telemetryDataCache; + protected readonly ITelemetryService telemetryService; + protected readonly TelemetryDataCache telemetryDataCache; public TelemetryDataBaseService( IAsbCloudDbContext db, diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs index 9d666c1c..7839b83b 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs @@ -2,12 +2,17 @@ using AsbCloudApp.Services; using AsbCloudDb.Model; using Mapster; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; using System.Linq; +using System.Threading; +using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.SAUB { #nullable enable - public class TelemetryDataSaubService : TelemetryDataBaseService + public class TelemetryDataSaubService : TelemetryDataBaseService, ITelemetryDataSaubService { private readonly ITelemetryUserService telemetryUserService; @@ -21,6 +26,54 @@ namespace AsbCloudInfrastructure.Services.SAUB this.telemetryUserService = telemetryUserService; } + public async Task> GetTelemetryDataStatAsync(int idTelemetry, CancellationToken token) + { + var timezone = telemetryService.GetTimezone(idTelemetry); + var timezoneOffset = TimeSpan.FromHours(timezone.Hours); + + var query = db.Set() + .Where(t => t.IdTelemetry == idTelemetry) + .Where(t => t.BlockPosition > 0.0001) + .Where(t => t.WellDepth > 0.0001) + .Where(t => t.WellDepth - t.BitDepth < 0.01) + .GroupBy(t => new { H = t.DateTime.Hour, W = Math.Truncate(t.WellDepth!.Value) }) + .Select(g => new TelemetryDataSaubStatDto + { + Count = g.Count(), + + DateMin = g.Min(t => t.DateTime.UtcDateTime), + DateMax = g.Max(t => t.DateTime.UtcDateTime), + + WellDepthMin = g.Min(t => t.WellDepth!.Value), + WellDepthMax = g.Max(t => t.WellDepth!.Value), + + Pressure = g.Average(t => t.Pressure!.Value), + PressureSp = g.Average(t => t.PressureSp!.Value), + PressureSpRotor = g.Average(t => t.PressureSpRotor!.Value), + PressureSpSlide = g.Average(t => t.PressureSpSlide!.Value), + PressureIdle = g.Average(t => t.PressureIdle!.Value), + PressureDeltaLimitMax = g.Average(t => t.PressureDeltaLimitMax!.Value), + + AxialLoad = g.Average(t => t.AxialLoad!.Value), + AxialLoadSp = g.Average(t => t.AxialLoadSp!.Value), + AxialLoadLimitMax = g.Average(t => t.AxialLoadLimitMax!.Value), + + RotorTorque = g.Average(t => t.RotorTorque!.Value), + RotorTorqueSp = g.Average(t => t.RotorTorqueSp!.Value), + RotorTorqueLimitMax = g.Average(t => t.RotorTorqueLimitMax!.Value), + + BlockSpeed = g.Average(t => t.BlockSpeed!.Value), + BlockSpeedSp = g.Average(t => t.BlockSpeedSp!.Value), + BlockSpeedSpRotor = g.Average(t => t.BlockSpeedSpRotor!.Value), + BlockSpeedSpSlide = g.Average(t => t.BlockSpeedSpSlide!.Value), + }) + .Where(s => s.WellDepthMin != s.WellDepthMax) + .Where(s => s.Count > 3) + .OrderBy(t => t.DateMin); + + return await query.ToArrayAsync(token); + } + public override TelemetryDataSaub Convert(TelemetryDataSaubDto src, double timezoneOffset) { var entity = src.Adapt();