From 7dd92be567412c853dbb46a5248b16b45dea4165 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 8 Feb 2024 17:33:38 +0500 Subject: [PATCH] =?UTF-8?q?WorkDataSaubStat=20=D0=B8=D0=B7=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=D1=81=D1=8F=20=D0=BE=D1=82=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=91?= =?UTF-8?q?=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ITelemetryDataSaubService.cs | 12 +++ .../PeriodicWorks/WorkDataSaubStat.cs | 88 ++++++++++--------- .../Services/SAUB/TelemetryDataSaubService.cs | 24 +++++ AsbCloudWebApi/AsbCloudWebApi.csproj | 1 - .../SAUB/DetectedOperationController.cs | 1 - 5 files changed, 82 insertions(+), 44 deletions(-) diff --git a/AsbCloudApp/Services/ITelemetryDataSaubService.cs b/AsbCloudApp/Services/ITelemetryDataSaubService.cs index a0bb271d..e13240c0 100644 --- a/AsbCloudApp/Services/ITelemetryDataSaubService.cs +++ b/AsbCloudApp/Services/ITelemetryDataSaubService.cs @@ -12,6 +12,18 @@ namespace AsbCloudApp.Services /// public interface ITelemetryDataSaubService : ITelemetryDataService { + /// + /// Получение телеметрии для РТК статистики + /// + /// + /// + /// + /// + /// + /// + /// + Task> Get(int idTelemetry, bool isBitOnBottom, DateTimeOffset geDate, DateTimeOffset leDate, int take, CancellationToken token); + /// /// усредненная статистика по 1м за весь период /// diff --git a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs index cbfe1f80..d7daf9ad 100644 --- a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs +++ b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs @@ -1,10 +1,11 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.DetectedOperation; using AsbCloudApp.Data.SAUB; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; +using AsbCloudApp.Services; using AsbCloudDb.Model; -using AsbCloudInfrastructure.Services.DetectOperations.Detectors; -using Microsoft.EntityFrameworkCore; +using AsbCloudInfrastructure.Services.DetectOperations; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; @@ -19,7 +20,6 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks /// internal class WorkDataSaubStat : Work { - private int MechanicalDrillingCategoryId = 4001; private int Gap = 60; public WorkDataSaubStat() : base("Generate DataSaubStat entries and save them into Db") @@ -29,7 +29,6 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) { - using var db = services.GetRequiredService(); var telemetryDataCache = services.GetRequiredService>(); @@ -43,96 +42,102 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks return; var dataSaubStatRepo = services.GetRequiredService(); + var dataSaubService = services.GetRequiredService(); + var detectedOperationRepository = services.GetRequiredService(); var stats = await dataSaubStatRepo.GetLastsAsync(idTelemetries, token); for( var i =0; i < idTelemetries.Length; i++) { var idTelemetry = idTelemetries[i]; var lastDate = stats.FirstOrDefault(s => s.IdTelemetry == idTelemetry)?.DateEnd.ToUniversalTime() ?? DateTimeOffset.UnixEpoch; - var statsCount = await CreateStatForTelemetryFromDate(db, idTelemetry, lastDate, dataSaubStatRepo, token); + var statsCount = await CreateStatForTelemetryFromDate(idTelemetry, lastDate, dataSaubService, dataSaubStatRepo, detectedOperationRepository, token); onProgressCallback($"Calculate stat for telemetry: {idTelemetry}; from {lastDate}; results count: {statsCount};", 100*i / idTelemetries.Length); } } - private async Task CreateStatForTelemetryFromDate(IAsbCloudDbContext db, int idTelemetry, DateTimeOffset begin, IDataSaubStatRepository dataSaubStatRepo, CancellationToken token) + private static async Task CreateStatForTelemetryFromDate( + int idTelemetry, + DateTimeOffset begin, + ITelemetryDataSaubService dataSaubService, + IDataSaubStatRepository dataSaubStatRepo, + IDetectedOperationRepository detectedOperationRepository, + CancellationToken token) { - var detectedOperations = await db.Set() - .Where(o => o.IdTelemetry == idTelemetry) - .Where(o => o.DateStart > begin) - .Where(o => o.OperationCategory.IdParent == MechanicalDrillingCategoryId) - .OrderBy(o => o.DateStart) - .Take(250) - .ToArrayAsync(token); + var detectedOperationRequest = new DetectedOperationByTelemetryRequest { + GeDateStart = begin, + IdTelemetry = idTelemetry, + IdsCategories = WellOperationCategory.MechanicalDrillingSubIds, + SortFields = new[] {nameof(DetectedOperation.DateStart) }, + Take = 250, + }; + + var detectedOperations = await detectedOperationRepository.Get(detectedOperationRequest, token); if (!detectedOperations.Any()) return 0; - var minDate = detectedOperations.First().DateStart; - var maxDate = detectedOperations.OrderByDescending(d => d.DateEnd).First().DateEnd; + var geDate = detectedOperations.First().DateStart; + var leDate = detectedOperations.OrderByDescending(d => d.DateEnd).First().DateEnd; - var telemetryDataSaub = await db.Set() - .Where(t => t.IdTelemetry == idTelemetry) - .Where(t => t.DateTime >= minDate) - .Where(t => t.DateTime <= maxDate) - .Where(t => Math.Abs(t.BitDepth - t.WellDepth) < 0.0001) - .OrderBy(t => t.DateTime) - .Take(100_000) - .ToArrayAsync(token); + var dataSaub = await dataSaubService.Get(idTelemetry, true, geDate, leDate, 100_000, token); - if (!telemetryDataSaub.Any()) + if (!dataSaub.Any()) return 0; - var dataSaubStats = CreateDataSaubStat(detectedOperations, telemetryDataSaub); + if(dataSaub is not TelemetryDataSaubDto[] dataSaubArray) + dataSaubArray = dataSaub.ToArray(); + + var dataSaubStats = CreateDataSaubStat(detectedOperations, dataSaubArray); return await dataSaubStatRepo.InsertRangeAsync(dataSaubStats, token); } - private static IEnumerable CreateDataSaubStat(IEnumerable detectedOperations, TelemetryDataSaub[] telemetryDataSaub) + private static IEnumerable CreateDataSaubStat(IEnumerable detectedOperations, TelemetryDataSaubDto[] dataSaub) { var indexStart = 0; var indexEnd = 0; var result = new List(); - if (!telemetryDataSaub.Any()) + if (!dataSaub.Any()) return result; foreach (var operation in detectedOperations) { - indexStart = Array.FindIndex(telemetryDataSaub, indexEnd, t => t.DateTime >= operation.DateStart); + indexStart = Array.FindIndex(dataSaub, indexEnd, t => t.DateTime >= operation.DateStart); if (indexStart < 0) break; - indexEnd = Array.FindIndex(telemetryDataSaub, indexStart, t => t.DateTime > operation.DateEnd); + indexEnd = Array.FindIndex(dataSaub, indexStart, t => t.DateTime > operation.DateEnd); if (indexEnd < 0) - indexEnd = telemetryDataSaub.Length - 1; + indexEnd = dataSaub.Length - 1; if (indexEnd == indexStart) continue; var length = indexEnd - indexStart; - var subset = telemetryDataSaub.AsSpan(indexStart, length); + var subset = dataSaub.AsSpan(indexStart, length); var stats = CalcStats(operation, subset); result.AddRange(stats); } return result; } - private static IEnumerable CalcStats(DetectedOperation operation, Span telemetryDataSaub) + private static IEnumerable CalcStats(DetectedOperationDto operation, Span dataSaub) { var result = new List(); var indexStart = 0; - for (var i = 1; i < telemetryDataSaub.Length; i++) + for (var i = 1; i < dataSaub.Length; i++) { - var previous = telemetryDataSaub[i - 1]; - var current = telemetryDataSaub[i]; + var previous = dataSaub[i - 1]; + var current = dataSaub[i]; - if (IsNewCacheItem(previous, current) || i == telemetryDataSaub.Length - 1) + if (IsNewCacheItem(previous, current) || i == dataSaub.Length - 1) { var length = i - indexStart; - var span = telemetryDataSaub.Slice(indexStart, length); + var span = dataSaub.Slice(indexStart, length); indexStart = i; if (length <= 2 || (span[^1].WellDepth - span[0].WellDepth) < 0.001) continue; // мелкие выборки не учитываем. @@ -144,10 +149,9 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks return result; } - private static DataSaubStatDto CalcStat(DetectedOperation operation, Span span) + private static DataSaubStatDto CalcStat(DetectedOperationDto operation, Span span) { - var hasOscillation = operation.ExtraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out object? hasOscillationObject) - && hasOscillationObject is true; + var hasOscillation = EnabledSubsystemsFlags.AutoOscillation.HasEnabledSubsystems(operation.EnabledSubsystems); var aggregatedValues = CalcAggregate(span); var processMapDrillingCacheItem = new DataSaubStatDto @@ -184,7 +188,7 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks double RotorTorque, double RotorSpeed, double Flow - ) CalcAggregate(Span span) + ) CalcAggregate(Span span) { var sumPressure = 0.0; var sumAxialLoad = 0.0; @@ -210,7 +214,7 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks ); } - private static bool IsNewCacheItem(TelemetryDataSaub previous, TelemetryDataSaub current) + private static bool IsNewCacheItem(TelemetryDataSaubDto previous, TelemetryDataSaubDto current) { return !(current.Mode == previous.Mode) || !(current.WellDepth >= previous.WellDepth) diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs index d918f384..43356941 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs @@ -6,6 +6,7 @@ using AsbCloudApp.Services; using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; +using Org.BouncyCastle.Asn1.Pkcs; using System; using System.Collections.Generic; using System.IO; @@ -33,6 +34,29 @@ namespace AsbCloudInfrastructure.Services.SAUB this.telemetryUserService = telemetryUserService; } + public async Task> Get(int idTelemetry, bool isBitOnBottom, DateTimeOffset geDate, DateTimeOffset leDate, int take, CancellationToken token) + { + var offset = telemetryService.GetTimezone(idTelemetry).Offset; + var geDateUtc = geDate.ToUniversalTime(); + var leDateUtc = leDate.ToUniversalTime(); + + var query = db.Set() + .Where(t => t.IdTelemetry == idTelemetry) + .Where(t => t.DateTime >= geDateUtc) + .Where(t => t.DateTime <= leDateUtc); + + if (isBitOnBottom) + query = query.Where(t => Math.Abs(t.BitDepth - t.WellDepth) < 0.0001); + + query = query + .OrderBy(t => t.DateTime) + .Take(take); + + var entities = await query.ToArrayAsync(token); + var dtos = entities.Select(e => Convert(e, offset.TotalHours)); + return dtos; + } + public async Task> GetTelemetryDataStatAsync(int idTelemetry, CancellationToken token) { var timezone = telemetryService.GetTimezone(idTelemetry); diff --git a/AsbCloudWebApi/AsbCloudWebApi.csproj b/AsbCloudWebApi/AsbCloudWebApi.csproj index 6b29ff20..d0485b9a 100644 --- a/AsbCloudWebApi/AsbCloudWebApi.csproj +++ b/AsbCloudWebApi/AsbCloudWebApi.csproj @@ -10,7 +10,6 @@ - all diff --git a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs index 1f487773..c6bd6dda 100644 --- a/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/DetectedOperationController.cs @@ -5,7 +5,6 @@ using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; using System.Threading; using System.Threading.Tasks; using AsbCloudInfrastructure.Services.DetectOperations;