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);
+ }
+ }
+}