diff --git a/AsbCloudApp/Services/WITS/IGtrService.cs b/AsbCloudApp/Services/WITS/IGtrService.cs
index c66831cf..012296b8 100644
--- a/AsbCloudApp/Services/WITS/IGtrService.cs
+++ b/AsbCloudApp/Services/WITS/IGtrService.cs
@@ -10,17 +10,16 @@ namespace AsbCloudApp.Services.WITS
///
/// данные ГТИ
///
- public interface IGtrService
-
+ public interface IGtrRepository
{
///
- /// добавить/изменить данные (для панели бурильщика)
+ /// добавить данные (для панели бурильщика)
///
- ///
- ///
+ ///
+ ///
///
///
- Task UpdateAsync(string uid, IEnumerable dtos, CancellationToken token);
+ Task SaveDataAsync(int idTelemetry, WitsRecordDto dto, CancellationToken token);
///
/// получить данные для клиента
diff --git a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs
index 4e16f277..8fc98c07 100644
--- a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs
+++ b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs
@@ -2,6 +2,9 @@
using AsbCloudApp.Services;
using AsbCloudApp.Services.WITS;
using AsbCloudDb.Model;
+using AsbCloudDb.Model.GTR;
+using Microsoft.EntityFrameworkCore;
+using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -11,17 +14,19 @@ using System.Threading.Tasks;
namespace AsbCloudInfrastructure.Repository
{
#nullable enable
- public class GtrWitsRepository: IGtrService
-
+ public class GtrWitsRepository : IGtrRepository
+ where T : WitsItemBase, ITelemetryData
{
-
private readonly IAsbCloudDbContext db;
private readonly ITelemetryService telemetryService;
+ private readonly DbSet dbset;
+ private static Random random = new Random((int)(DateTime.Now.Ticks % 0xFFFFFFFF));
public GtrWitsRepository(
IAsbCloudDbContext db,
ITelemetryService telemetryService)
{
+ dbset = db.Set();
this.db = db;
this.telemetryService = telemetryService;
}
@@ -57,9 +62,62 @@ namespace AsbCloudInfrastructure.Repository
- public Task UpdateAsync(string uid, IEnumerable dtos, CancellationToken token)
+ public async Task SaveDataAsync(int idTelemetry, WitsRecordDto dto, CancellationToken token)
{
- throw new NotImplementedException();
+ if (dto is null)
+ return;
+ var timezoneHours = telemetryService.GetTimezone(idTelemetry).Hours;
+ var entities = GetEntities(dto,idTelemetry,timezoneHours);
+ var dateMin = entities.Min(e => e.DateTime);
+ var dateMax = entities.Max(e => e.DateTime);
+ var existingEntities = await dbset
+ .Where(e => e.IdTelemetry == idTelemetry)
+ .Where(e => e.DateTime >= dateMin && e.DateTime <= dateMax)
+ .Select(e => e.DateTime)
+ .OrderBy(d => d)
+ .ToArrayAsync(token);
+ foreach (var entity in entities)
+ {
+ if (!existingEntities.Any(e => e == entity.DateTime))
+ {
+ dbset.Add((T)entity);
+ }
+ else
+ {
+ var dt = entity.DateTime;
+ entity.DateTime = new DateTimeOffset(
+ dt.Year,
+ dt.Month,
+ dt.Day,
+ dt.Hour,
+ dt.Minute,
+ dt.Second,
+ (dt.Millisecond + random.Next(1, 283)) % 1000,
+ dt.Offset);
+ dbset.Add((T)entity);
+ }
+ }
+ await db.SaveChangesAsync(token);
+ }
+
+ private static IEnumerable> GetEntities(WitsRecordDto recordItems, int idTelemetry, double timezoneHours)
+ {
+ var itemsCount = recordItems.Items.Count;
+ var entities = new List>(itemsCount);
+
+ foreach (var dtoItems in recordItems.Items)
+ {
+ var entityItems = new WitsItemBase
+ {
+ IdTelemetry = idTelemetry,
+ DateTime = recordItems.Date.ToUtcDateTimeOffset(timezoneHours),
+ IdRecord = recordItems.Id,
+ IdItem = dtoItems.Key,
+ Value = System.Text.Json.JsonSerializer.Deserialize(dtoItems.Value.ToString())
+ };
+ entities.Add(entityItems);
+ }
+ return entities;
}
}
#nullable disable