From fc0beb63197d9ec72c2ffa757ec47b1f37246b9c Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 5 Feb 2024 10:47:00 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=B9=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D0=B4=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D0=BC=D0=B8=20DataSaubStat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/IDataSaubStatRepository.cs | 29 ++++++++++++ .../PeriodicWorks/WorkDataSaubStat.cs | 36 +++++++-------- AsbCloudInfrastructure/DependencyInjection.cs | 1 + .../Repository/DataSaubStatRepository.cs | 44 +++++++++++++++++++ 4 files changed, 89 insertions(+), 21 deletions(-) create mode 100644 AsbCloudApp/Repositories/IDataSaubStatRepository.cs create mode 100644 AsbCloudInfrastructure/Repository/DataSaubStatRepository.cs diff --git a/AsbCloudApp/Repositories/IDataSaubStatRepository.cs b/AsbCloudApp/Repositories/IDataSaubStatRepository.cs new file mode 100644 index 00000000..6894fe41 --- /dev/null +++ b/AsbCloudApp/Repositories/IDataSaubStatRepository.cs @@ -0,0 +1,29 @@ +using AsbCloudApp.Data; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Repositories +{ + /// + /// Репозиторий работы с данными из таблицы t_data_daub_stat + /// + public interface IDataSaubStatRepository + { + /// + /// Получение последних дат по телеметриям + /// + /// ключи телеметрий + /// + /// + Task> GetLastDatesAsync(int[] idTelemetries, CancellationToken token); + + /// + /// Вставка записей статистики + /// + /// + /// + /// + Task InsertRangeAsync(IEnumerable dataSaubStats, CancellationToken token); + } +} diff --git a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs index d69b185e..406f7ddf 100644 --- a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs +++ b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs @@ -1,4 +1,5 @@ -using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Data; +using AsbCloudApp.Data.SAUB; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudDb.Model; @@ -29,37 +30,31 @@ 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>(); var cacheRequest = new TelemetryDataRequest() { - GeDate = DateTime.UtcNow.AddDays(-Gap) + GeDate = DateTime.UtcNow.AddDays(-Gap*100) }; var idTelemetries = telemetryDataCache.GetIds(cacheRequest).ToArray(); if (!idTelemetries.Any()) return; - var stats = await db.Set() - .Where(s => idTelemetries.Contains(s.IdTelemetry)) - .GroupBy(s => s.IdTelemetry) - .Select(g => new - { - IdTelemetry = g.Key, - DateEnd = g.Max(s => s.DateEnd), - }) - .ToArrayAsync(token); + var dataSaubStatRepo = services.GetRequiredService(); + var stats = await dataSaubStatRepo.GetLastDatesAsync(idTelemetries, token); for( var i =0; i < idTelemetries.Length; i++) { var idTelemetry = idTelemetries[i]; var lastDate = stats.FirstOrDefault(s => s.IdTelemetry == idTelemetry)?.DateEnd ?? DateTimeOffset.UnixEpoch; - var statsCount = await CreateStatForTelemetryFromDate(db, idTelemetry, lastDate, token); + var statsCount = await CreateStatForTelemetryFromDate(db, idTelemetry, lastDate, dataSaubStatRepo, 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, CancellationToken token) + private async Task CreateStatForTelemetryFromDate(IAsbCloudDbContext db, int idTelemetry, DateTimeOffset begin, IDataSaubStatRepository dataSaubStatRepo, CancellationToken token) { var detectedOperations = await db.Set() .Where(o => o.IdTelemetry == idTelemetry) @@ -89,15 +84,14 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks var dataSaubStats = CreateDataSaubStat(detectedOperations, telemetryDataSaub); - db.Set().AddRange(dataSaubStats); - return await db.SaveChangesAsync(token); + return await dataSaubStatRepo.InsertRangeAsync(dataSaubStats, token); } - private static IEnumerable CreateDataSaubStat(IEnumerable detectedOperations, TelemetryDataSaub[] telemetryDataSaub) + private static IEnumerable CreateDataSaubStat(IEnumerable detectedOperations, TelemetryDataSaub[] telemetryDataSaub) { var indexStart = 0; var indexEnd = 0; - var result = new List(); + var result = new List(); if (!telemetryDataSaub.Any()) return result; @@ -125,9 +119,9 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks return result; } - private static IEnumerable CalcStats(DetectedOperation operation, Span telemetryDataSaub) + private static IEnumerable CalcStats(DetectedOperation operation, Span telemetryDataSaub) { - var result = new List(); + var result = new List(); var indexStart = 0; for (var i = 1; i < telemetryDataSaub.Length; i++) @@ -150,13 +144,13 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks return result; } - private static DataSaubStat CalcStat(DetectedOperation operation, Span span) + private static DataSaubStatDto CalcStat(DetectedOperation operation, Span span) { var hasOscillation = operation.ExtraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out object? hasOscillationObject) && hasOscillationObject is true; var aggregatedValues = CalcAggregate(span); - var processMapDrillingCacheItem = new DataSaubStat + var processMapDrillingCacheItem = new DataSaubStatDto { DateStart = operation.DateStart, DateEnd = operation.DateEnd, diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 28a051ab..5b131299 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -222,6 +222,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient< IChangeLogRepository, diff --git a/AsbCloudInfrastructure/Repository/DataSaubStatRepository.cs b/AsbCloudInfrastructure/Repository/DataSaubStatRepository.cs new file mode 100644 index 00000000..cadb4d69 --- /dev/null +++ b/AsbCloudInfrastructure/Repository/DataSaubStatRepository.cs @@ -0,0 +1,44 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Repositories; +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.Repository +{ + public class DataSaubStatRepository : IDataSaubStatRepository + { + private readonly IAsbCloudDbContext db; + + public DataSaubStatRepository(IAsbCloudDbContext dbContext) + { + db = dbContext; + } + + public async Task> GetLastDatesAsync(int[] idTelemetries, CancellationToken token) + { + var stats = await db.Set() + .Where(s => idTelemetries.Contains(s.IdTelemetry)) + .GroupBy(s => s.IdTelemetry, (key, group) => new DataSaubStatDto() + { + IdTelemetry = key, + DateEnd = group.Max(s => s.DateEnd) + }) + .ToArrayAsync(token); + + return stats; + } + + public async Task InsertRangeAsync(IEnumerable dataSaubStats, CancellationToken token) + { + var entities = dataSaubStats.Select(data => data.Adapt()); + db.Set().AddRange(entities); + return await db.SaveChangesAsync(token); + } + } +}