From 10497dcfbe1a5d903b8aaa7a03c6d04c5b08f223 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 1 Aug 2024 09:53:31 +0500 Subject: [PATCH 1/6] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0=20DataSaubS?= =?UTF-8?q?tat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Services/IDataSaubStatService.cs | 25 + .../PeriodicWorks/WorkDataSaubStat.cs | 210 +------- AsbCloudInfrastructure/DependencyInjection.cs | 1 + .../Services/DataSaubStatService.cs | 237 +++++++++ .../Services/DataSaubStatServiceTest.cs | 489 ++++++++++++++++++ 5 files changed, 758 insertions(+), 204 deletions(-) create mode 100644 AsbCloudApp/Services/IDataSaubStatService.cs create mode 100644 AsbCloudInfrastructure/Services/DataSaubStatService.cs create mode 100644 AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs diff --git a/AsbCloudApp/Services/IDataSaubStatService.cs b/AsbCloudApp/Services/IDataSaubStatService.cs new file mode 100644 index 00000000..0ac51f4d --- /dev/null +++ b/AsbCloudApp/Services/IDataSaubStatService.cs @@ -0,0 +1,25 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Requests; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services +{ + /// + /// Сервис записи данных в таблицу DataSaubStat, которая используется для построения РТК-отчета + /// + public interface IDataSaubStatService + { + /// + /// Создание записей таблицы DataSaubStat + /// + /// Временной интервал, за который будет рассчитываться статистика DataSaubStat + /// + /// + /// + Task CreateStatAsync(int gap, Action onProgressCallback, CancellationToken token); + + } +} diff --git a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs index c7ea36ff..3ef52a9f 100644 --- a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs +++ b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs @@ -16,11 +16,11 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Background.PeriodicWorks { /// - /// задача по добавлению данных в таблицу DataSaubStat, которая используется дл построения РТК-отчета + /// задача по добавлению данных в таблицу DataSaubStat, которая используется для построения РТК-отчета /// internal class WorkDataSaubStat : Work { - private int Gap = 60; + private int Gap = 1000; public WorkDataSaubStat() : base("Generate DataSaubStat entries and save them into Db") { @@ -29,209 +29,11 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) { + var dataSaubStatService = services.GetService(); - var telemetryDataCache = services.GetRequiredService>(); + if (dataSaubStatService != null ) + await dataSaubStatService.CreateStatAsync(Gap, onProgressCallback, token); - var cacheRequest = new TelemetryDataRequest() - { - GeDate = DateTime.UtcNow.AddDays(-Gap) - }; - var idTelemetries = telemetryDataCache.GetIds(cacheRequest).ToArray(); - - if (!idTelemetries.Any()) - 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(idTelemetry, lastDate, dataSaubService, dataSaubStatRepo, detectedOperationRepository, token); - onProgressCallback($"Calculate stat for telemetry: {idTelemetry}; from {lastDate}; results count: {statsCount};", 100*i / idTelemetries.Length); - } - } - - private static async Task CreateStatForTelemetryFromDate( - int idTelemetry, - DateTimeOffset begin, - ITelemetryDataSaubService dataSaubService, - IDataSaubStatRepository dataSaubStatRepo, - IDetectedOperationRepository detectedOperationRepository, - CancellationToken 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 geDate = detectedOperations.First().DateStart; - var leDate = detectedOperations.OrderByDescending(d => d.DateEnd).First().DateEnd; - - var dataSaub = await dataSaubService.Get(idTelemetry, true, geDate, leDate, 100_000, token); - - if (!dataSaub.Any()) - return 0; - - 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, TelemetryDataSaubDto[] dataSaub) - { - var indexStart = 0; - var indexEnd = 0; - var result = new List(); - - if (!dataSaub.Any()) - return result; - - foreach (var operation in detectedOperations) - { - indexStart = Array.FindIndex(dataSaub, indexEnd, t => t.DateTime >= operation.DateStart); - if (indexStart < 0) - break; - - indexEnd = Array.FindIndex(dataSaub, indexStart, t => t.DateTime > operation.DateEnd); - - if (indexEnd < 0) - indexEnd = dataSaub.Length - 1; - - if (indexEnd == indexStart) - continue; - - var length = indexEnd - indexStart; - - var subset = dataSaub.AsSpan(indexStart, length); - var stats = CalcStats(operation, subset); - result.AddRange(stats); - } - return result; - } - - private static IEnumerable CalcStats(DetectedOperationDto operation, Span dataSaub) - { - var result = new List(); - - var indexStart = 0; - for (var i = 1; i < dataSaub.Length; i++) - { - var previous = dataSaub[i - 1]; - var current = dataSaub[i]; - - if (IsNewCacheItem(previous, current) || i == dataSaub.Length - 1) - { - var length = i - indexStart; - var span = dataSaub.Slice(indexStart, length); - indexStart = i; - if (length <= 2 || (span[^1].WellDepth - span[0].WellDepth) < 0.001) - continue; // мелкие выборки не учитываем. - var stat = CalcStat(operation, span); - result.Add(stat); - } - } - - return result; - } - - private static DataSaubStatDto CalcStat(DetectedOperationDto operation, Span span) - { - var aggregatedValues = CalcAggregate(span); - var dateStart = span[0].DateTime; - var dateEnd = span[^1].DateTime; - var depthStart = span[0].WellDepth; - var depthEnd = span[^1].WellDepth; - var speed = ((depthEnd - depthStart) / (dateEnd - dateStart).TotalHours); - - var processMapDrillingCacheItem = new DataSaubStatDto - { - DateStart = dateStart, - DateEnd = dateEnd, - DepthStart = depthStart, - DepthEnd = depthEnd, - Speed = speed, - BlockSpeedSp = span[0].BlockSpeedSp, - Pressure = aggregatedValues.Pressure, - PressureIdle = span[0].PressureIdle, - PressureSp = span[0].PressureSp, - AxialLoad = aggregatedValues.AxialLoad, - AxialLoadSp = span[0].AxialLoadSp, - AxialLoadLimitMax = span[0].AxialLoadLimitMax, - RotorTorque = aggregatedValues.RotorTorque, - RotorTorqueSp = span[0].RotorTorqueSp, - RotorTorqueLimitMax = span[0].RotorTorqueLimitMax, - IdFeedRegulator = span[0].IdFeedRegulator, - RotorSpeed = aggregatedValues.RotorSpeed, - IdCategory = operation.IdCategory, - EnabledSubsystems = operation.EnabledSubsystems, - HasOscillation = operation.EnabledSubsystems.IsAutoOscillation, - IdTelemetry = operation.IdTelemetry, - Flow = aggregatedValues.Flow - }; - return processMapDrillingCacheItem; - } - - private static ( - double Pressure, - double AxialLoad, - double RotorTorque, - double RotorSpeed, - double Flow - ) CalcAggregate(Span span) - { - var sumPressure = 0.0; - var sumAxialLoad = 0.0; - var sumRotorTorque = 0.0; - var sumRotorSpeed = 0.0; - var flow = span[0].Flow ?? 0.0; - var diffDepthTotal = span[^1].WellDepth - span[0].WellDepth; - for (var i = 0; i < span.Length - 1; i++) - { - var diffDepth = span[i + 1].WellDepth - span[i].WellDepth; - sumPressure += diffDepth * span[i].Pressure; - sumAxialLoad += diffDepth * span[i].AxialLoad; - sumRotorTorque += diffDepth * span[i].RotorTorque; - sumRotorSpeed += diffDepth * span[i].RotorSpeed; - flow = span[i + 1].Flow > flow ? span[i + 1].Flow ?? 0.0 : flow; - } - return ( - Pressure: sumPressure / diffDepthTotal, - AxialLoad: sumAxialLoad / diffDepthTotal, - RotorTorque: sumRotorTorque / diffDepthTotal, - RotorSpeed: sumRotorSpeed / diffDepthTotal, - Flow: flow - ); - } - - private static bool IsNewCacheItem(TelemetryDataSaubDto previous, TelemetryDataSaubDto current) - { - return !(current.Mode == previous.Mode) - || !(current.WellDepth >= previous.WellDepth) - || !(current.BlockSpeedSp == previous.BlockSpeedSp) - || !(current.PressureIdle == previous.PressureIdle) - || !(current.PressureSp == previous.PressureSp) - || !(current.AxialLoadSp == previous.AxialLoadSp) - || !(current.AxialLoadLimitMax == previous.AxialLoadLimitMax) - || !(current.HookWeightIdle == previous.HookWeightIdle) - || !(current.RotorTorqueIdle == previous.RotorTorqueIdle) - || !(current.RotorTorqueSp == previous.RotorTorqueSp) - || !(current.RotorTorqueLimitMax == previous.RotorTorqueLimitMax) - || !(current.IdFeedRegulator == previous.IdFeedRegulator); - } + } } } diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 9fbe1721..5ce1ada0 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -316,6 +316,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient< IChangeLogRepository, diff --git a/AsbCloudInfrastructure/Services/DataSaubStatService.cs b/AsbCloudInfrastructure/Services/DataSaubStatService.cs new file mode 100644 index 00000000..b9bcc251 --- /dev/null +++ b/AsbCloudInfrastructure/Services/DataSaubStatService.cs @@ -0,0 +1,237 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.DetectedOperation; +using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services +{ + + public class DataSaubStatService : IDataSaubStatService + { + private IDataSaubStatRepository dataSaubStatRepository; + private ITelemetryDataCache telemetryDataCache; + private ITelemetryDataSaubService dataSaubService; + private IDetectedOperationRepository detectedOperationRepository; + + public DataSaubStatService( + IDataSaubStatRepository dataSaubStatRepository, + ITelemetryDataCache telemetryDataCache, + ITelemetryDataSaubService dataSaubService, + IDetectedOperationRepository detectedOperationRepository) + { + this.dataSaubStatRepository = dataSaubStatRepository; + this.telemetryDataCache = telemetryDataCache; + this.dataSaubService = dataSaubService; + this.detectedOperationRepository = detectedOperationRepository; + } + + public async Task CreateStatAsync(int gap, Action onProgressCallback, CancellationToken token) + { + var cacheRequest = new TelemetryDataRequest() + { + GeDate = DateTime.UtcNow.AddDays(-gap) + }; + var idTelemetries = telemetryDataCache.GetIds(cacheRequest).ToArray(); + + if (!idTelemetries.Any()) + return; + + var stats = await dataSaubStatRepository.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(idTelemetry, lastDate, token); + if(onProgressCallback != null) + onProgressCallback($"Calculate stat for telemetry: {idTelemetry}; from {lastDate}; results count: {statsCount};", 100 * i / idTelemetries.Length); + } + } + + private async Task CreateStatForTelemetryFromDate( + int idTelemetry, + DateTimeOffset begin, + CancellationToken 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 geDate = detectedOperations.First().DateStart; + var leDate = detectedOperations.OrderByDescending(d => d.DateEnd).First().DateEnd; + + var dataSaub = await dataSaubService.Get(idTelemetry, true, geDate, leDate, 100_000, token); + + if (!dataSaub.Any()) + return 0; + + if (dataSaub is not TelemetryDataSaubDto[] dataSaubArray) + dataSaubArray = dataSaub.ToArray(); + + var dataSaubStats = CreateDataSaubStat(detectedOperations, dataSaubArray); + + return await dataSaubStatRepository.InsertRangeAsync(dataSaubStats, token); + } + + private static IEnumerable CreateDataSaubStat(IEnumerable detectedOperations, TelemetryDataSaubDto[] dataSaub) + { + var indexStart = 0; + var indexEnd = 0; + var result = new List(); + + if (!dataSaub.Any()) + return result; + + foreach (var operation in detectedOperations) + { + indexStart = Array.FindIndex(dataSaub, indexEnd, t => t.DateTime >= operation.DateStart); + if (indexStart < 0) + break; + + indexEnd = Array.FindIndex(dataSaub, indexStart, t => t.DateTime > operation.DateEnd); + + if (indexEnd < 0) + indexEnd = dataSaub.Length - 1; + + if (indexEnd == indexStart) + continue; + + var length = indexEnd - indexStart; + + var subset = dataSaub.AsSpan(indexStart, length); + var stats = CalcStats(operation, subset); + result.AddRange(stats); + } + return result; + } + + private static IEnumerable CalcStats(DetectedOperationDto operation, Span dataSaub) + { + var result = new List(); + + var indexStart = 0; + for (var i = 1; i < dataSaub.Length; i++) + { + var previous = dataSaub[i - 1]; + var current = dataSaub[i]; + + if (IsNewCacheItem(previous, current) || i == dataSaub.Length - 1) + { + var length = i - indexStart; + var span = dataSaub.Slice(indexStart, length); + indexStart = i; + if (length <= 2 || (span[^1].WellDepth - span[0].WellDepth) < 0.001) + continue; // мелкие выборки не учитываем. + var stat = CalcStat(operation, span); + result.Add(stat); + } + } + + return result; + } + + private static DataSaubStatDto CalcStat(DetectedOperationDto operation, Span span) + { + var aggregatedValues = CalcAggregate(span); + var dateStart = span[0].DateTime; + var dateEnd = span[^1].DateTime; + var depthStart = span[0].WellDepth; + var depthEnd = span[^1].WellDepth; + var speed = ((depthEnd - depthStart) / (dateEnd - dateStart).TotalHours); + + var processMapDrillingCacheItem = new DataSaubStatDto + { + DateStart = dateStart, + DateEnd = dateEnd, + DepthStart = depthStart, + DepthEnd = depthEnd, + Speed = speed, + BlockSpeedSp = span[0].BlockSpeedSp, + Pressure = aggregatedValues.Pressure, + PressureIdle = span[0].PressureIdle, + PressureSp = span[0].PressureSp, + AxialLoad = aggregatedValues.AxialLoad, + AxialLoadSp = span[0].AxialLoadSp, + AxialLoadLimitMax = span[0].AxialLoadLimitMax, + RotorTorque = aggregatedValues.RotorTorque, + RotorTorqueSp = span[0].RotorTorqueSp, + RotorTorqueLimitMax = span[0].RotorTorqueLimitMax, + IdFeedRegulator = span[0].IdFeedRegulator, + RotorSpeed = aggregatedValues.RotorSpeed, + IdCategory = operation.IdCategory, + EnabledSubsystems = operation.EnabledSubsystems, + HasOscillation = operation.EnabledSubsystems.IsAutoOscillation, + IdTelemetry = operation.IdTelemetry, + Flow = aggregatedValues.Flow + }; + return processMapDrillingCacheItem; + } + + private static ( + double Pressure, + double AxialLoad, + double RotorTorque, + double RotorSpeed, + double Flow + ) CalcAggregate(Span span) + { + var sumPressure = 0.0; + var sumAxialLoad = 0.0; + var sumRotorTorque = 0.0; + var sumRotorSpeed = 0.0; + var flow = span[0].Flow ?? 0.0; + var diffDepthTotal = span[^1].WellDepth - span[0].WellDepth; + for (var i = 0; i < span.Length - 1; i++) + { + var diffDepth = span[i + 1].WellDepth - span[i].WellDepth; + sumPressure += diffDepth * span[i].Pressure; + sumAxialLoad += diffDepth * span[i].AxialLoad; + sumRotorTorque += diffDepth * span[i].RotorTorque; + sumRotorSpeed += diffDepth * span[i].RotorSpeed; + flow = span[i + 1].Flow > flow ? span[i + 1].Flow ?? 0.0 : flow; + } + return ( + Pressure: sumPressure / diffDepthTotal, + AxialLoad: sumAxialLoad / diffDepthTotal, + RotorTorque: sumRotorTorque / diffDepthTotal, + RotorSpeed: sumRotorSpeed / diffDepthTotal, + Flow: flow + ); + } + + private static bool IsNewCacheItem(TelemetryDataSaubDto previous, TelemetryDataSaubDto current) + { + return !(current.Mode == previous.Mode) + || !(current.WellDepth >= previous.WellDepth) + || !(current.BlockSpeedSp == previous.BlockSpeedSp) + || !(current.PressureIdle == previous.PressureIdle) + || !(current.PressureSp == previous.PressureSp) + || !(current.AxialLoadSp == previous.AxialLoadSp) + || !(current.AxialLoadLimitMax == previous.AxialLoadLimitMax) + || !(current.HookWeightIdle == previous.HookWeightIdle) + || !(current.RotorTorqueIdle == previous.RotorTorqueIdle) + || !(current.RotorTorqueSp == previous.RotorTorqueSp) + || !(current.RotorTorqueLimitMax == previous.RotorTorqueLimitMax) + || !(current.IdFeedRegulator == previous.IdFeedRegulator); + } + } + +} diff --git a/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs b/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs new file mode 100644 index 00000000..32595c0d --- /dev/null +++ b/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs @@ -0,0 +1,489 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data; +using AsbCloudApp.Data.DetectedOperation; +using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Data.User; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using AsbCloudInfrastructure.Repository; +using AsbCloudInfrastructure.Services; +using AsbCloudInfrastructure.Services.SAUB; +using NSubstitute; +using Xunit; + +namespace AsbCloudWebApi.Tests.Services; + +public class DataSaubStatServiceTest +{ + private readonly IDataSaubStatRepository dataSaubStatRepositoryMock = Substitute.For(); + private readonly ITelemetryDataCache telemetryDataCacheMock = Substitute.For>(); + private readonly IDetectedOperationRepository detectedOperationRepositoryMock = Substitute.For(); + private readonly ITelemetryDataSaubService dataSaubServiceMock = Substitute.For(); + + private DataSaubStatService dataSaubStatService; + + private int[] idTelemetries = [1, 2, 3]; + private IEnumerable dataSaubStatDtos = new List() + { + new DataSaubStatDto { + Id = 1, + AxialLoad = 1, + AxialLoadLimitMax = 1, + AxialLoadSp = 1, + BlockSpeedSp = 1, + DateEnd = DateTime.UtcNow, + DateStart = DateTime.UtcNow.AddHours(-1), + DepthEnd = 2, + DepthStart = 1, + EnabledSubsystems = 1, + Flow = 1, + HasOscillation = true, + IdCategory = 1, + IdFeedRegulator = 1, + IdTelemetry = 1, + Pressure = 1, + PressureIdle = 1, + PressureSp = 1, + RotorSpeed = 1, + RotorTorque = 1, + RotorTorqueLimitMax = 1, + RotorTorqueSp = 1, + Speed = 1 + }, + new DataSaubStatDto { + Id = 2, + AxialLoad = 2, + AxialLoadLimitMax = 2, + AxialLoadSp = 2, + BlockSpeedSp = 2, + DateEnd = DateTime.UtcNow, + DateStart = DateTime.UtcNow.AddHours(-1), + DepthEnd = 3, + DepthStart = 2, + EnabledSubsystems = 2, + Flow = 2, + HasOscillation = true, + IdCategory = 2, + IdFeedRegulator = 2, + IdTelemetry = 2, + Pressure = 2, + PressureIdle = 2, + PressureSp = 2, + RotorSpeed = 2, + RotorTorque = 2, + RotorTorqueLimitMax = 2, + RotorTorqueSp = 2, + Speed = 2 + }, + new DataSaubStatDto { + Id = 3, + AxialLoad = 3, + AxialLoadLimitMax = 3, + AxialLoadSp = 3, + BlockSpeedSp = 3, + DateEnd = DateTime.UtcNow, + DateStart = DateTime.UtcNow.AddHours(-1), + DepthEnd = 4, + DepthStart = 3, + EnabledSubsystems = 3, + Flow = 3, + HasOscillation = true, + IdCategory = 3, + IdFeedRegulator = 3, + IdTelemetry = 3, + Pressure = 3, + PressureIdle = 3, + PressureSp = 3, + RotorSpeed = 3, + RotorTorque = 3, + RotorTorqueLimitMax = 3, + RotorTorqueSp = 3, + Speed = 3 + }, + }; + + private IEnumerable detectedOperationDtos = new List() { + new DetectedOperationDto { + Id = 1, + DateEnd = DateTimeOffset.UtcNow, + DateStart = DateTimeOffset.UtcNow.AddHours(-1), + DepthStart = 1, + DepthEnd = 2, + IdCategory = 5002, + IdTelemetry = 1, + Value = 1, + IdEditor = 1, + IdUserAtStart = 1 + } + }; + + private IEnumerable telemetryDataSaubDtos1 = new List { + new TelemetryDataSaubDto() + { + IdTelemetry = 1, + DateTime = DateTime.UtcNow.AddMinutes(-30), + AxialLoad = 1, + AxialLoadLimitMax = 1, + AxialLoadSp = 1, + BitDepth = 1, + BlockPosition = 1, + BlockPositionMax = 1, + BlockPositionMin = 1, + BlockSpeed = 1, + BlockSpeedSp = 1, + BlockSpeedSpDevelop = 1, + BlockSpeedSpRotor = 1, + BlockSpeedSpSlide = 1, + Flow = 1, + FlowDeltaLimitMax = 1, + FlowIdle = 1, + HookWeight = 1, + HookWeightIdle = 1, + HookWeightLimitMax = 1, + HookWeightLimitMin = 1, + IdFeedRegulator = 1, + IdUser = 1, + Mode = 1, + Mse = 1, + MseState = 1, + Pressure = 1, + PressureDeltaLimitMax = 1, + PressureIdle = 1, + PressureSp = 1, + PressureSpDevelop = 1, + PressureSpRotor = 1, + PressureSpSlide = 1, + Pump0Flow = 1, + Pump1Flow = 1, + Pump2Flow = 1, + RotorSpeed = 1, + RotorTorque = 1, + RotorTorqueIdle = 1, + RotorTorqueSp = 1, + RotorTorqueLimitMax = 1, + WellDepth = 1, + }, + new TelemetryDataSaubDto() + { + IdTelemetry = 1, + DateTime = DateTime.UtcNow.AddMinutes(-20), + AxialLoad = 1, + AxialLoadLimitMax = 1, + AxialLoadSp = 1, + BitDepth = 1, + BlockPosition = 1, + BlockPositionMax = 1, + BlockPositionMin = 1, + BlockSpeed = 1, + BlockSpeedSp = 1, + BlockSpeedSpDevelop = 1, + BlockSpeedSpRotor = 1, + BlockSpeedSpSlide = 1, + Flow = 1, + FlowDeltaLimitMax = 1, + FlowIdle = 1, + HookWeight = 1, + HookWeightIdle = 1, + HookWeightLimitMax = 1, + HookWeightLimitMin = 1, + IdFeedRegulator = 1, + IdUser = 1, + Mode = 1, + Mse = 1, + MseState = 1, + Pressure = 1, + PressureDeltaLimitMax = 1, + PressureIdle = 1, + PressureSp = 1, + PressureSpDevelop = 1, + PressureSpRotor = 1, + PressureSpSlide = 1, + Pump0Flow = 1, + Pump1Flow = 1, + Pump2Flow = 1, + RotorSpeed = 1, + RotorTorque = 1, + RotorTorqueIdle = 1, + RotorTorqueSp = 1, + RotorTorqueLimitMax = 1, + WellDepth = 1, + }, + new TelemetryDataSaubDto() + { + IdTelemetry = 1, + DateTime = DateTime.UtcNow.AddMinutes(-10), + AxialLoad = 1, + AxialLoadLimitMax = 1, + AxialLoadSp = 1, + BitDepth = 1, + BlockPosition = 1, + BlockPositionMax = 1, + BlockPositionMin = 1, + BlockSpeed = 1, + BlockSpeedSp = 1, + BlockSpeedSpDevelop = 1, + BlockSpeedSpRotor = 1, + BlockSpeedSpSlide = 1, + Flow = 1, + FlowDeltaLimitMax = 1, + FlowIdle = 1, + HookWeight = 1, + HookWeightIdle = 1, + HookWeightLimitMax = 1, + HookWeightLimitMin = 1, + IdFeedRegulator = 1, + IdUser = 1, + Mode = 1, + Mse = 1, + MseState = 1, + Pressure = 1, + PressureDeltaLimitMax = 1, + PressureIdle = 1, + PressureSp = 1, + PressureSpDevelop = 1, + PressureSpRotor = 1, + PressureSpSlide = 1, + Pump0Flow = 1, + Pump1Flow = 1, + Pump2Flow = 1, + RotorSpeed = 1, + RotorTorque = 1, + RotorTorqueIdle = 1, + RotorTorqueSp = 1, + RotorTorqueLimitMax = 1, + WellDepth = 2, + }, + new TelemetryDataSaubDto() + { + IdTelemetry = 1, + DateTime = DateTime.UtcNow.AddMinutes(-5), + AxialLoad = 1, + AxialLoadLimitMax = 1, + AxialLoadSp = 1, + BitDepth = 1, + BlockPosition = 1, + BlockPositionMax = 1, + BlockPositionMin = 1, + BlockSpeed = 1, + BlockSpeedSp = 1, + BlockSpeedSpDevelop = 1, + BlockSpeedSpRotor = 1, + BlockSpeedSpSlide = 1, + Flow = 1, + FlowDeltaLimitMax = 1, + FlowIdle = 1, + HookWeight = 1, + HookWeightIdle = 1, + HookWeightLimitMax = 1, + HookWeightLimitMin = 1, + IdFeedRegulator = 1, + IdUser = 1, + Mode = 1, + Mse = 1, + MseState = 1, + Pressure = 1, + PressureDeltaLimitMax = 1, + PressureIdle = 1, + PressureSp = 1, + PressureSpDevelop = 1, + PressureSpRotor = 1, + PressureSpSlide = 1, + Pump0Flow = 1, + Pump1Flow = 1, + Pump2Flow = 1, + RotorSpeed = 1, + RotorTorque = 1, + RotorTorqueIdle = 1, + RotorTorqueSp = 1, + RotorTorqueLimitMax = 1, + WellDepth = 3, + }, + new TelemetryDataSaubDto() + { + IdTelemetry = 1, + DateTime = DateTime.UtcNow.AddMinutes(5), + AxialLoad = 1, + AxialLoadLimitMax = 1, + AxialLoadSp = 1, + BitDepth = 1, + BlockPosition = 1, + BlockPositionMax = 1, + BlockPositionMin = 1, + BlockSpeed = 1, + BlockSpeedSp = 1, + BlockSpeedSpDevelop = 1, + BlockSpeedSpRotor = 1, + BlockSpeedSpSlide = 1, + Flow = 1, + FlowDeltaLimitMax = 1, + FlowIdle = 1, + HookWeight = 1, + HookWeightIdle = 1, + HookWeightLimitMax = 1, + HookWeightLimitMin = 1, + IdFeedRegulator = 1, + IdUser = 1, + Mode = 1, + Mse = 1, + MseState = 1, + Pressure = 1, + PressureDeltaLimitMax = 1, + PressureIdle = 1, + PressureSp = 1, + PressureSpDevelop = 1, + PressureSpRotor = 1, + PressureSpSlide = 1, + Pump0Flow = 1, + Pump1Flow = 1, + Pump2Flow = 1, + RotorSpeed = 1, + RotorTorque = 1, + RotorTorqueIdle = 1, + RotorTorqueSp = 1, + RotorTorqueLimitMax = 1, + WellDepth = 1, + } + }; + + private IEnumerable telemetryDataSaubDtos2 = new List { + new TelemetryDataSaubDto() + { + IdTelemetry = 2, + DateTime = DateTime.Now.AddMinutes(-20), + AxialLoad = 1, + AxialLoadLimitMax = 1, + AxialLoadSp = 1, + BitDepth = 1, + BlockPosition = 1, + BlockPositionMax = 1, + BlockPositionMin = 1, + BlockSpeed = 1, + BlockSpeedSp = 1, + BlockSpeedSpDevelop = 1, + BlockSpeedSpRotor = 1, + BlockSpeedSpSlide = 1, + Flow = 1, + FlowDeltaLimitMax = 1, + FlowIdle = 1, + HookWeight = 1, + HookWeightIdle = 1, + HookWeightLimitMax = 1, + HookWeightLimitMin = 1, + IdFeedRegulator = 1, + IdUser = 1, + Mode = 1, + Mse = 1, + MseState = 1, + Pressure = 1, + PressureDeltaLimitMax = 1, + PressureIdle = 1, + PressureSp = 1, + PressureSpDevelop = 1, + PressureSpRotor = 1, + PressureSpSlide = 1, + Pump0Flow = 1, + Pump1Flow = 1, + Pump2Flow = 1, + RotorSpeed = 1, + RotorTorque = 1, + RotorTorqueIdle = 1, + RotorTorqueSp = 1, + RotorTorqueLimitMax = 1, + WellDepth = 1, + }, + new TelemetryDataSaubDto() + { + IdTelemetry = 2, + DateTime = DateTime.Now.AddMinutes(-20), + AxialLoad = 1, + AxialLoadLimitMax = 1, + AxialLoadSp = 1, + BitDepth = 1, + BlockPosition = 1, + BlockPositionMax = 1, + BlockPositionMin = 1, + BlockSpeed = 1, + BlockSpeedSp = 1, + BlockSpeedSpDevelop = 1, + BlockSpeedSpRotor = 1, + BlockSpeedSpSlide = 1, + Flow = 1, + FlowDeltaLimitMax = 1, + FlowIdle = 1, + HookWeight = 1, + HookWeightIdle = 1, + HookWeightLimitMax = 1, + HookWeightLimitMin = 1, + IdFeedRegulator = 1, + IdUser = 1, + Mode = 1, + Mse = 1, + MseState = 1, + Pressure = 1, + PressureDeltaLimitMax = 1, + PressureIdle = 1, + PressureSp = 1, + PressureSpDevelop = 1, + PressureSpRotor = 1, + PressureSpSlide = 1, + Pump0Flow = 1, + Pump1Flow = 1, + Pump2Flow = 1, + RotorSpeed = 1, + RotorTorque = 1, + RotorTorqueIdle = 1, + RotorTorqueSp = 1, + RotorTorqueLimitMax = 1, + WellDepth = 1, + } + }; + + public DataSaubStatServiceTest() + { + telemetryDataCacheMock + .GetIds(Arg.Any()) + .Returns(idTelemetries); + + dataSaubStatRepositoryMock + .GetLastsAsync(Arg.Any(), Arg.Any()) + .Returns(dataSaubStatDtos); + + detectedOperationRepositoryMock + .Get(Arg.Any(), Arg.Any()) + .Returns(detectedOperationDtos); + + dataSaubServiceMock + .Get(1, Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) + .Returns(telemetryDataSaubDtos1); + + dataSaubStatRepositoryMock + .InsertRangeAsync(Arg.Any>(), Arg.Any()) + .Returns(2); + + dataSaubStatService = new DataSaubStatService( + dataSaubStatRepositoryMock, + telemetryDataCacheMock, + dataSaubServiceMock, + detectedOperationRepositoryMock); + } + + [Fact] + public async Task GetByMarkId_ShouldReturn_FileInfo() + { + //act + //var data = await fileService.GetByMarkId(idMark, CancellationToken.None); + Action action = async (a, b) => { + ; + }; + await dataSaubStatService.CreateStatAsync(5, action, CancellationToken.None); + //assert + Assert.NotNull("sd"); + } +} \ No newline at end of file From 59f663992c85da6add6a4b36abfaf2374b93f0b7 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 2 Aug 2024 15:13:29 +0500 Subject: [PATCH 2/6] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=202-?= =?UTF-8?q?=D1=85=20=D0=BD=D0=B0=D0=B9=D0=B4=D0=B5=D0=BD=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D0=B1=D0=B0=D0=B3=D0=BE=D0=B2=20+=20=D1=8E=D0=BD=D0=B8?= =?UTF-8?q?=D1=82=20=D1=82=D0=B5=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DataSaubStatService.cs | 4 +- .../Services/DataSaubStatServiceTest.cs | 440 ++++++------------ 2 files changed, 132 insertions(+), 312 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DataSaubStatService.cs b/AsbCloudInfrastructure/Services/DataSaubStatService.cs index b9bcc251..6f3d48ea 100644 --- a/AsbCloudInfrastructure/Services/DataSaubStatService.cs +++ b/AsbCloudInfrastructure/Services/DataSaubStatService.cs @@ -114,7 +114,7 @@ namespace AsbCloudInfrastructure.Services if (indexEnd == indexStart) continue; - var length = indexEnd - indexStart; + var length = indexEnd - indexStart + 1; var subset = dataSaub.AsSpan(indexStart, length); var stats = CalcStats(operation, subset); @@ -135,7 +135,7 @@ namespace AsbCloudInfrastructure.Services if (IsNewCacheItem(previous, current) || i == dataSaub.Length - 1) { - var length = i - indexStart; + var length = i - indexStart + 1; var span = dataSaub.Slice(indexStart, length); indexStart = i; if (length <= 2 || (span[^1].WellDepth - span[0].WellDepth) < 0.001) diff --git a/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs b/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs index 32595c0d..baae9b4f 100644 --- a/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs @@ -1,27 +1,24 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Threading; -using System.Threading.Tasks; using AsbCloudApp.Data; using AsbCloudApp.Data.DetectedOperation; using AsbCloudApp.Data.SAUB; -using AsbCloudApp.Data.User; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; -using AsbCloudInfrastructure.Repository; using AsbCloudInfrastructure.Services; -using AsbCloudInfrastructure.Services.SAUB; +using Mapster; using NSubstitute; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; using Xunit; namespace AsbCloudWebApi.Tests.Services; public class DataSaubStatServiceTest { + private readonly int Gap = 5; private readonly IDataSaubStatRepository dataSaubStatRepositoryMock = Substitute.For(); private readonly ITelemetryDataCache telemetryDataCacheMock = Substitute.For>(); private readonly IDetectedOperationRepository detectedOperationRepositoryMock = Substitute.For(); @@ -29,7 +26,7 @@ public class DataSaubStatServiceTest private DataSaubStatService dataSaubStatService; - private int[] idTelemetries = [1, 2, 3]; + private int[] idTelemetries = [1]; private IEnumerable dataSaubStatDtos = new List() { new DataSaubStatDto { @@ -55,7 +52,7 @@ public class DataSaubStatServiceTest RotorTorque = 1, RotorTorqueLimitMax = 1, RotorTorqueSp = 1, - Speed = 1 + Speed = 1 }, new DataSaubStatDto { Id = 2, @@ -109,8 +106,8 @@ public class DataSaubStatServiceTest }, }; - private IEnumerable detectedOperationDtos = new List() { - new DetectedOperationDto { + private List detectedOperationDtos = new List() { + new DetectedOperationDto { Id = 1, DateEnd = DateTimeOffset.UtcNow, DateStart = DateTimeOffset.UtcNow.AddHours(-1), @@ -120,11 +117,11 @@ public class DataSaubStatServiceTest IdTelemetry = 1, Value = 1, IdEditor = 1, - IdUserAtStart = 1 + IdUserAtStart = 1 } }; - private IEnumerable telemetryDataSaubDtos1 = new List { + private List telemetryDataSaubDtos = new List { new TelemetryDataSaubDto() { IdTelemetry = 1, @@ -168,280 +165,7 @@ public class DataSaubStatServiceTest RotorTorqueIdle = 1, RotorTorqueSp = 1, RotorTorqueLimitMax = 1, - WellDepth = 1, - }, - new TelemetryDataSaubDto() - { - IdTelemetry = 1, - DateTime = DateTime.UtcNow.AddMinutes(-20), - AxialLoad = 1, - AxialLoadLimitMax = 1, - AxialLoadSp = 1, - BitDepth = 1, - BlockPosition = 1, - BlockPositionMax = 1, - BlockPositionMin = 1, - BlockSpeed = 1, - BlockSpeedSp = 1, - BlockSpeedSpDevelop = 1, - BlockSpeedSpRotor = 1, - BlockSpeedSpSlide = 1, - Flow = 1, - FlowDeltaLimitMax = 1, - FlowIdle = 1, - HookWeight = 1, - HookWeightIdle = 1, - HookWeightLimitMax = 1, - HookWeightLimitMin = 1, - IdFeedRegulator = 1, - IdUser = 1, - Mode = 1, - Mse = 1, - MseState = 1, - Pressure = 1, - PressureDeltaLimitMax = 1, - PressureIdle = 1, - PressureSp = 1, - PressureSpDevelop = 1, - PressureSpRotor = 1, - PressureSpSlide = 1, - Pump0Flow = 1, - Pump1Flow = 1, - Pump2Flow = 1, - RotorSpeed = 1, - RotorTorque = 1, - RotorTorqueIdle = 1, - RotorTorqueSp = 1, - RotorTorqueLimitMax = 1, - WellDepth = 1, - }, - new TelemetryDataSaubDto() - { - IdTelemetry = 1, - DateTime = DateTime.UtcNow.AddMinutes(-10), - AxialLoad = 1, - AxialLoadLimitMax = 1, - AxialLoadSp = 1, - BitDepth = 1, - BlockPosition = 1, - BlockPositionMax = 1, - BlockPositionMin = 1, - BlockSpeed = 1, - BlockSpeedSp = 1, - BlockSpeedSpDevelop = 1, - BlockSpeedSpRotor = 1, - BlockSpeedSpSlide = 1, - Flow = 1, - FlowDeltaLimitMax = 1, - FlowIdle = 1, - HookWeight = 1, - HookWeightIdle = 1, - HookWeightLimitMax = 1, - HookWeightLimitMin = 1, - IdFeedRegulator = 1, - IdUser = 1, - Mode = 1, - Mse = 1, - MseState = 1, - Pressure = 1, - PressureDeltaLimitMax = 1, - PressureIdle = 1, - PressureSp = 1, - PressureSpDevelop = 1, - PressureSpRotor = 1, - PressureSpSlide = 1, - Pump0Flow = 1, - Pump1Flow = 1, - Pump2Flow = 1, - RotorSpeed = 1, - RotorTorque = 1, - RotorTorqueIdle = 1, - RotorTorqueSp = 1, - RotorTorqueLimitMax = 1, - WellDepth = 2, - }, - new TelemetryDataSaubDto() - { - IdTelemetry = 1, - DateTime = DateTime.UtcNow.AddMinutes(-5), - AxialLoad = 1, - AxialLoadLimitMax = 1, - AxialLoadSp = 1, - BitDepth = 1, - BlockPosition = 1, - BlockPositionMax = 1, - BlockPositionMin = 1, - BlockSpeed = 1, - BlockSpeedSp = 1, - BlockSpeedSpDevelop = 1, - BlockSpeedSpRotor = 1, - BlockSpeedSpSlide = 1, - Flow = 1, - FlowDeltaLimitMax = 1, - FlowIdle = 1, - HookWeight = 1, - HookWeightIdle = 1, - HookWeightLimitMax = 1, - HookWeightLimitMin = 1, - IdFeedRegulator = 1, - IdUser = 1, - Mode = 1, - Mse = 1, - MseState = 1, - Pressure = 1, - PressureDeltaLimitMax = 1, - PressureIdle = 1, - PressureSp = 1, - PressureSpDevelop = 1, - PressureSpRotor = 1, - PressureSpSlide = 1, - Pump0Flow = 1, - Pump1Flow = 1, - Pump2Flow = 1, - RotorSpeed = 1, - RotorTorque = 1, - RotorTorqueIdle = 1, - RotorTorqueSp = 1, - RotorTorqueLimitMax = 1, - WellDepth = 3, - }, - new TelemetryDataSaubDto() - { - IdTelemetry = 1, - DateTime = DateTime.UtcNow.AddMinutes(5), - AxialLoad = 1, - AxialLoadLimitMax = 1, - AxialLoadSp = 1, - BitDepth = 1, - BlockPosition = 1, - BlockPositionMax = 1, - BlockPositionMin = 1, - BlockSpeed = 1, - BlockSpeedSp = 1, - BlockSpeedSpDevelop = 1, - BlockSpeedSpRotor = 1, - BlockSpeedSpSlide = 1, - Flow = 1, - FlowDeltaLimitMax = 1, - FlowIdle = 1, - HookWeight = 1, - HookWeightIdle = 1, - HookWeightLimitMax = 1, - HookWeightLimitMin = 1, - IdFeedRegulator = 1, - IdUser = 1, - Mode = 1, - Mse = 1, - MseState = 1, - Pressure = 1, - PressureDeltaLimitMax = 1, - PressureIdle = 1, - PressureSp = 1, - PressureSpDevelop = 1, - PressureSpRotor = 1, - PressureSpSlide = 1, - Pump0Flow = 1, - Pump1Flow = 1, - Pump2Flow = 1, - RotorSpeed = 1, - RotorTorque = 1, - RotorTorqueIdle = 1, - RotorTorqueSp = 1, - RotorTorqueLimitMax = 1, - WellDepth = 1, - } - }; - - private IEnumerable telemetryDataSaubDtos2 = new List { - new TelemetryDataSaubDto() - { - IdTelemetry = 2, - DateTime = DateTime.Now.AddMinutes(-20), - AxialLoad = 1, - AxialLoadLimitMax = 1, - AxialLoadSp = 1, - BitDepth = 1, - BlockPosition = 1, - BlockPositionMax = 1, - BlockPositionMin = 1, - BlockSpeed = 1, - BlockSpeedSp = 1, - BlockSpeedSpDevelop = 1, - BlockSpeedSpRotor = 1, - BlockSpeedSpSlide = 1, - Flow = 1, - FlowDeltaLimitMax = 1, - FlowIdle = 1, - HookWeight = 1, - HookWeightIdle = 1, - HookWeightLimitMax = 1, - HookWeightLimitMin = 1, - IdFeedRegulator = 1, - IdUser = 1, - Mode = 1, - Mse = 1, - MseState = 1, - Pressure = 1, - PressureDeltaLimitMax = 1, - PressureIdle = 1, - PressureSp = 1, - PressureSpDevelop = 1, - PressureSpRotor = 1, - PressureSpSlide = 1, - Pump0Flow = 1, - Pump1Flow = 1, - Pump2Flow = 1, - RotorSpeed = 1, - RotorTorque = 1, - RotorTorqueIdle = 1, - RotorTorqueSp = 1, - RotorTorqueLimitMax = 1, - WellDepth = 1, - }, - new TelemetryDataSaubDto() - { - IdTelemetry = 2, - DateTime = DateTime.Now.AddMinutes(-20), - AxialLoad = 1, - AxialLoadLimitMax = 1, - AxialLoadSp = 1, - BitDepth = 1, - BlockPosition = 1, - BlockPositionMax = 1, - BlockPositionMin = 1, - BlockSpeed = 1, - BlockSpeedSp = 1, - BlockSpeedSpDevelop = 1, - BlockSpeedSpRotor = 1, - BlockSpeedSpSlide = 1, - Flow = 1, - FlowDeltaLimitMax = 1, - FlowIdle = 1, - HookWeight = 1, - HookWeightIdle = 1, - HookWeightLimitMax = 1, - HookWeightLimitMin = 1, - IdFeedRegulator = 1, - IdUser = 1, - Mode = 1, - Mse = 1, - MseState = 1, - Pressure = 1, - PressureDeltaLimitMax = 1, - PressureIdle = 1, - PressureSp = 1, - PressureSpDevelop = 1, - PressureSpRotor = 1, - PressureSpSlide = 1, - Pump0Flow = 1, - Pump1Flow = 1, - Pump2Flow = 1, - RotorSpeed = 1, - RotorTorque = 1, - RotorTorqueIdle = 1, - RotorTorqueSp = 1, - RotorTorqueLimitMax = 1, - WellDepth = 1, + WellDepth = 10, } }; @@ -455,35 +179,131 @@ public class DataSaubStatServiceTest .GetLastsAsync(Arg.Any(), Arg.Any()) .Returns(dataSaubStatDtos); - detectedOperationRepositoryMock - .Get(Arg.Any(), Arg.Any()) - .Returns(detectedOperationDtos); + var telemetrySaubDto = telemetryDataSaubDtos.FirstOrDefault(); + if (telemetrySaubDto != null) + { + // : + // - 6 : + // - , DateStart DateEnd detectedOperation + // - 6- 2- , + // ( dataSaubStat) + // , 1 dataSaubStat (insertedDataSaubStatCount = 1) + var telemetrySaubDto1 = telemetrySaubDto.Adapt(); + telemetrySaubDto1.DateTime = DateTime.UtcNow.AddMinutes(-20); + telemetryDataSaubDtos.Add(telemetrySaubDto1); + + var telemetrySaubDto2 = telemetrySaubDto.Adapt(); + telemetrySaubDto2.DateTime = DateTime.UtcNow.AddMinutes(-10); + telemetrySaubDto2.RotorTorqueLimitMax = 2; + telemetryDataSaubDtos.Add(telemetrySaubDto2); + + var telemetrySaubDto3 = telemetrySaubDto.Adapt(); + telemetrySaubDto3.DateTime = DateTime.UtcNow.AddMinutes(-8); + telemetrySaubDto3.RotorTorqueLimitMax = 2; + telemetryDataSaubDtos.Add(telemetrySaubDto3); + + var telemetrySaubDto4 = telemetrySaubDto.Adapt(); + telemetrySaubDto4.DateTime = DateTime.UtcNow.AddMinutes(-6); + telemetrySaubDto4.RotorTorqueLimitMax = 2; + telemetryDataSaubDtos.Add(telemetrySaubDto4); + + var telemetrySaubDto5 = telemetrySaubDto.Adapt(); + telemetrySaubDto5.DateTime = DateTime.UtcNow.AddMinutes(-4); + telemetrySaubDto5.RotorTorqueLimitMax = 2; + telemetryDataSaubDtos.Add(telemetrySaubDto5); + + var telemetrySaubDto6 = telemetrySaubDto.Adapt(); + telemetrySaubDto6.DateTime = DateTime.UtcNow.AddMinutes(-2); + telemetrySaubDto6.RotorTorqueLimitMax = 3; + telemetrySaubDto6.WellDepth = 11; + telemetryDataSaubDtos.Add(telemetrySaubDto6); + } dataSaubServiceMock - .Get(1, Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) - .Returns(telemetryDataSaubDtos1); - - dataSaubStatRepositoryMock - .InsertRangeAsync(Arg.Any>(), Arg.Any()) - .Returns(2); + .Get(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()) + .Returns(telemetryDataSaubDtos); dataSaubStatService = new DataSaubStatService( - dataSaubStatRepositoryMock, - telemetryDataCacheMock, - dataSaubServiceMock, + dataSaubStatRepositoryMock, + telemetryDataCacheMock, + dataSaubServiceMock, detectedOperationRepositoryMock); } [Fact] - public async Task GetByMarkId_ShouldReturn_FileInfo() + public async Task Create_1DataSaubStatItems_ShouldReturn__Success() { - //act - //var data = await fileService.GetByMarkId(idMark, CancellationToken.None); - Action action = async (a, b) => { - ; + var insertedDataSaubStatCount = 1; + + detectedOperationRepositoryMock + .Get(Arg.Any(), Arg.Any()) + .Returns(detectedOperationDtos); + + + dataSaubStatRepositoryMock + .InsertRangeAsync(Arg.Any>(), Arg.Any()) + .Returns(insertedDataSaubStatCount); + + Action action = (message, count) => + { + //assert + Assert.Equal(insertedDataSaubStatCount, count); }; - await dataSaubStatService.CreateStatAsync(5, action, CancellationToken.None); - //assert - Assert.NotNull("sd"); + + //act + await dataSaubStatService.CreateStatAsync(Gap, action, CancellationToken.None); + } + + [Fact] + public async Task Create_2DataSaubStatItems_ShouldReturn__Success() + { + var insertedDataSaubStatCount = 2; + + var detectedOperationDto = detectedOperationDtos.FirstOrDefault(); + if (detectedOperationDto != null) + { + var detectedOperationDto1 = detectedOperationDto.Adapt(); + detectedOperationDto1.DateStart = DateTimeOffset.UtcNow.AddMinutes(1); + detectedOperationDto1.DateEnd = DateTimeOffset.UtcNow.AddHours(1); + + detectedOperationDtos.Add(detectedOperationDto1); + } + + var telemetryDataSaubDto = telemetryDataSaubDtos.LastOrDefault(); + if (telemetryDataSaubDto != null) + { + var telemetryDataSaubDto1 = telemetryDataSaubDto.Adapt(); + telemetryDataSaubDto1.DateTime = DateTime.UtcNow.AddMinutes(10); + telemetryDataSaubDto1.WellDepth = telemetryDataSaubDto.WellDepth + 1; + + var telemetryDataSaubDto2 = telemetryDataSaubDto.Adapt(); + telemetryDataSaubDto2.DateTime = DateTime.UtcNow.AddMinutes(20); + telemetryDataSaubDto2.WellDepth = telemetryDataSaubDto1.WellDepth + 1; + + var telemetryDataSaubDto3 = telemetryDataSaubDto.Adapt(); + telemetryDataSaubDto3.DateTime = DateTime.UtcNow.AddMinutes(30); + telemetryDataSaubDto3.WellDepth = telemetryDataSaubDto2.WellDepth + 1; + + telemetryDataSaubDtos.Add(telemetryDataSaubDto1); + telemetryDataSaubDtos.Add(telemetryDataSaubDto2); + telemetryDataSaubDtos.Add(telemetryDataSaubDto3); + } + + detectedOperationRepositoryMock + .Get(Arg.Any(), Arg.Any()) + .Returns(detectedOperationDtos); + + dataSaubStatRepositoryMock + .InsertRangeAsync(Arg.Any>(), Arg.Any()) + .Returns(insertedDataSaubStatCount); + + Action action = (message, count) => + { + //assert + Assert.Equal(insertedDataSaubStatCount, count); + }; + + //act + await dataSaubStatService.CreateStatAsync(Gap, action, CancellationToken.None); } } \ No newline at end of file From 7b03b46804ad386334f71b8a8436eb0d376f796a Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 2 Aug 2024 15:22:04 +0500 Subject: [PATCH 3/6] =?UTF-8?q?=D0=BC=D0=B5=D0=BB=D0=BA=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20+=20=D0=BA=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Background/PeriodicWorks/WorkDataSaubStat.cs | 4 ++-- .../Services/DataSaubStatServiceTest.cs | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs index 3ef52a9f..e63a4bd9 100644 --- a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs +++ b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs @@ -20,7 +20,7 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks /// internal class WorkDataSaubStat : Work { - private int Gap = 1000; + private int Gap = 60; public WorkDataSaubStat() : base("Generate DataSaubStat entries and save them into Db") { @@ -32,7 +32,7 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks var dataSaubStatService = services.GetService(); if (dataSaubStatService != null ) - await dataSaubStatService.CreateStatAsync(Gap, onProgressCallback, token); + var createdDataSaubStatCount = await dataSaubStatService.CreateStatAsync(Gap, onProgressCallback, token); } } diff --git a/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs b/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs index baae9b4f..5c70c411 100644 --- a/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs @@ -182,12 +182,12 @@ public class DataSaubStatServiceTest var telemetrySaubDto = telemetryDataSaubDtos.FirstOrDefault(); if (telemetrySaubDto != null) { - // : - // - 6 : - // - , DateStart DateEnd detectedOperation - // - 6- 2- , - // ( dataSaubStat) - // , 1 dataSaubStat (insertedDataSaubStatCount = 1) + //заполнение списка телеметрий следующим образом: + // - всего в списке 6 элементов: + // - все они попадают в диапазон, определенный датами DateStart и DateEnd соответствующей записи detectedOperation + // - из этих 6-х записей у 2-х записей меняется параметр, + // являющийся признаком начала нового интервала (новой записи dataSaubStat) + // таким образом, в базе данных должно создаться 1 новая запись dataSaubStat (insertedDataSaubStatCount = 1) var telemetrySaubDto1 = telemetrySaubDto.Adapt(); telemetrySaubDto1.DateTime = DateTime.UtcNow.AddMinutes(-20); telemetryDataSaubDtos.Add(telemetrySaubDto1); From 1aeb9599d1f824cc745ebb8bae3c1bac2176767f Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 5 Aug 2024 10:20:48 +0500 Subject: [PATCH 4/6] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=8E=D0=BD=D0=B8=D1=82-=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PeriodicWorks/WorkDataSaubStat.cs | 2 +- .../Services/DataSaubStatServiceTest.cs | 22 +++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs index e63a4bd9..7cef92d4 100644 --- a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs +++ b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs @@ -32,7 +32,7 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks var dataSaubStatService = services.GetService(); if (dataSaubStatService != null ) - var createdDataSaubStatCount = await dataSaubStatService.CreateStatAsync(Gap, onProgressCallback, token); + await dataSaubStatService.CreateStatAsync(Gap, onProgressCallback, token); } } diff --git a/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs b/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs index 5c70c411..ed03769e 100644 --- a/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs @@ -244,16 +244,24 @@ public class DataSaubStatServiceTest .InsertRangeAsync(Arg.Any>(), Arg.Any()) .Returns(insertedDataSaubStatCount); - Action action = (message, count) => + Action action = (message, percent) => { //assert - Assert.Equal(insertedDataSaubStatCount, count); + Assert.NotNull(percent); + Assert.InRange((double)percent, 0.0, 100.0); }; //act await dataSaubStatService.CreateStatAsync(Gap, action, CancellationToken.None); + + //assert + await dataSaubStatRepositoryMock.Received().InsertRangeAsync( + Arg.Is>(l => l.Count() == insertedDataSaubStatCount), + Arg.Any()); } + + [Fact] public async Task Create_2DataSaubStatItems_ShouldReturn__Success() { @@ -297,13 +305,19 @@ public class DataSaubStatServiceTest .InsertRangeAsync(Arg.Any>(), Arg.Any()) .Returns(insertedDataSaubStatCount); - Action action = (message, count) => + Action action = (message, percent) => { //assert - Assert.Equal(insertedDataSaubStatCount, count); + Assert.NotNull(percent); + Assert.InRange((double)percent, 0.0, 100.0); }; //act await dataSaubStatService.CreateStatAsync(Gap, action, CancellationToken.None); + + //assert + await dataSaubStatRepositoryMock.Received().InsertRangeAsync( + Arg.Is>(l => l.Count() == insertedDataSaubStatCount), + Arg.Any()); } } \ No newline at end of file From cbfce9eefcffac8340b2e0dd0a504588b8280bc3 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 5 Aug 2024 15:57:33 +0500 Subject: [PATCH 5/6] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Services/IDataSaubStatService.cs | 5 ++++- .../Background/PeriodicWorks/WorkDataSaubStat.cs | 2 +- AsbCloudInfrastructure/Services/DataSaubStatService.cs | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/AsbCloudApp/Services/IDataSaubStatService.cs b/AsbCloudApp/Services/IDataSaubStatService.cs index 0ac51f4d..38e9dece 100644 --- a/AsbCloudApp/Services/IDataSaubStatService.cs +++ b/AsbCloudApp/Services/IDataSaubStatService.cs @@ -15,7 +15,10 @@ namespace AsbCloudApp.Services /// /// Создание записей таблицы DataSaubStat /// - /// Временной интервал, за который будет рассчитываться статистика DataSaubStat + /// + /// Количество дней, которые необходимо вычесть из текущей даты для формирования начальной даты + /// сбора данных по телеметрии + /// /// /// /// diff --git a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs index 7cef92d4..6a2f92de 100644 --- a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs +++ b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs @@ -29,7 +29,7 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) { - var dataSaubStatService = services.GetService(); + var dataSaubStatService = services.GetRequiredService(); if (dataSaubStatService != null ) await dataSaubStatService.CreateStatAsync(Gap, onProgressCallback, token); diff --git a/AsbCloudInfrastructure/Services/DataSaubStatService.cs b/AsbCloudInfrastructure/Services/DataSaubStatService.cs index 6f3d48ea..509615a2 100644 --- a/AsbCloudInfrastructure/Services/DataSaubStatService.cs +++ b/AsbCloudInfrastructure/Services/DataSaubStatService.cs @@ -52,7 +52,7 @@ namespace AsbCloudInfrastructure.Services var lastDate = stats.FirstOrDefault(s => s.IdTelemetry == idTelemetry)?.DateEnd.ToUniversalTime() ?? DateTimeOffset.UnixEpoch; var statsCount = await CreateStatForTelemetryFromDate(idTelemetry, lastDate, token); if(onProgressCallback != null) - onProgressCallback($"Calculate stat for telemetry: {idTelemetry}; from {lastDate}; results count: {statsCount};", 100 * i / idTelemetries.Length); + onProgressCallback($"Calculate stat for telemetry: {idTelemetry}; from {lastDate}; results count: {statsCount};", i * 1d / idTelemetries.Length); } } From 6ab3fdadbde15176ea95625872630f705ddcfdb7 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 5 Aug 2024 16:07:41 +0500 Subject: [PATCH 6/6] - Doc - Fix callback test --- AsbCloudApp/Services/IDataSaubStatService.cs | 12 ++++-------- .../Services/DataSaubStatService.cs | 6 +++--- .../Services/DataSaubStatServiceTest.cs | 4 ++-- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/AsbCloudApp/Services/IDataSaubStatService.cs b/AsbCloudApp/Services/IDataSaubStatService.cs index 38e9dece..f72d4480 100644 --- a/AsbCloudApp/Services/IDataSaubStatService.cs +++ b/AsbCloudApp/Services/IDataSaubStatService.cs @@ -1,7 +1,4 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Requests; using System; -using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -13,16 +10,15 @@ namespace AsbCloudApp.Services public interface IDataSaubStatService { /// - /// Создание записей таблицы DataSaubStat + /// Расчет статистики DataSaubStat /// - /// - /// Количество дней, которые необходимо вычесть из текущей даты для формирования начальной даты - /// сбора данных по телеметрии + /// + /// Количество дней за которые должны были приходить данные, чтобы телеметрия попала в обработку. /// /// /// /// - Task CreateStatAsync(int gap, Action onProgressCallback, CancellationToken token); + Task CreateStatAsync(int lastDaysFilter, Action onProgressCallback, CancellationToken token); } } diff --git a/AsbCloudInfrastructure/Services/DataSaubStatService.cs b/AsbCloudInfrastructure/Services/DataSaubStatService.cs index 509615a2..e54a380d 100644 --- a/AsbCloudInfrastructure/Services/DataSaubStatService.cs +++ b/AsbCloudInfrastructure/Services/DataSaubStatService.cs @@ -33,11 +33,11 @@ namespace AsbCloudInfrastructure.Services this.detectedOperationRepository = detectedOperationRepository; } - public async Task CreateStatAsync(int gap, Action onProgressCallback, CancellationToken token) + public async Task CreateStatAsync(int lastDaysFilter, Action onProgressCallback, CancellationToken token) { var cacheRequest = new TelemetryDataRequest() { - GeDate = DateTime.UtcNow.AddDays(-gap) + GeDate = DateTime.UtcNow.AddDays(-lastDaysFilter) }; var idTelemetries = telemetryDataCache.GetIds(cacheRequest).ToArray(); @@ -52,7 +52,7 @@ namespace AsbCloudInfrastructure.Services var lastDate = stats.FirstOrDefault(s => s.IdTelemetry == idTelemetry)?.DateEnd.ToUniversalTime() ?? DateTimeOffset.UnixEpoch; var statsCount = await CreateStatForTelemetryFromDate(idTelemetry, lastDate, token); if(onProgressCallback != null) - onProgressCallback($"Calculate stat for telemetry: {idTelemetry}; from {lastDate}; results count: {statsCount};", i * 1d / idTelemetries.Length); + onProgressCallback($"Calculate stat for telemetry: {idTelemetry}; from {lastDate}; results count: {statsCount};", 1d * i / idTelemetries.Length); } } diff --git a/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs b/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs index ed03769e..6d65a1f2 100644 --- a/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/DataSaubStatServiceTest.cs @@ -248,7 +248,7 @@ public class DataSaubStatServiceTest { //assert Assert.NotNull(percent); - Assert.InRange((double)percent, 0.0, 100.0); + Assert.InRange(percent.Value, 0.0, 1.0); }; //act @@ -309,7 +309,7 @@ public class DataSaubStatServiceTest { //assert Assert.NotNull(percent); - Assert.InRange((double)percent, 0.0, 100.0); + Assert.InRange(percent.Value, 0.0, 1.0); }; //act