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