diff --git a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs index ffa39c9c..123c7191 100644 --- a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs +++ b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs @@ -7,19 +7,17 @@ using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository { #nullable enable - public class GtrWitsRepository : IGtrRepository - + public class GtrWitsRepository : IGtrRepository { private readonly IAsbCloudDbContext db; private readonly ITelemetryService telemetryService; - - private static Random random = new Random((int)(DateTime.Now.Ticks % 0xFFFFFFFF)); public GtrWitsRepository( IAsbCloudDbContext db, @@ -54,11 +52,9 @@ namespace AsbCloudInfrastructure.Repository if (dateBeginUtc == default) dateBeginUtc = DateTime.UtcNow.AddSeconds(-intervalSec); - //var cacheData = telemetryDataCache.GetOrDefault(telemetry.Id, dateBeginUtc.ToRemoteDateTime(timezone.Hours), intervalSec, approxPointsCount); //if (cacheData is not null) // return cacheData; - var dateEnd = dateBeginUtc.AddSeconds(intervalSec); var queryWitsInt = db.WitsItemInt @@ -71,11 +67,9 @@ namespace AsbCloudInfrastructure.Repository .Where(d => d.IdTelemetry == telemetry.Id && d.DateTime >= dateBeginUtc); - var recordAllInt = GetEntityIntAsync(queryWitsInt, dateEnd, filterByDateEnd, approxPointsCount, token).Result; - var recordAllFloat = GetEntityFloatAsync(queryWitsFloat, dateEnd, filterByDateEnd, approxPointsCount, token).Result; - var recordAllStr = GetEntityStrAsync(queryWitsStr, dateEnd, filterByDateEnd, approxPointsCount, token).Result; - - + var recordAllInt = await GetEntityIntAsync(queryWitsInt, dateEnd, filterByDateEnd, approxPointsCount, token); + var recordAllFloat = await GetEntityFloatAsync(queryWitsFloat, dateEnd, filterByDateEnd, approxPointsCount, token); + var recordAllStr = await GetEntityStrAsync(queryWitsStr, dateEnd, filterByDateEnd, approxPointsCount, token); var dtos = new List(); if (recordAllInt.Any()) { @@ -113,7 +107,6 @@ namespace AsbCloudInfrastructure.Repository { var dto = new WitsRecordDto { - IdTelemetry = record.IdTelemetry, Id = record.IdRecord, Date = record.DateTime.ToRemoteDateTime(timezone.Hours), @@ -156,44 +149,33 @@ namespace AsbCloudInfrastructure.Repository return dtos; } - - public async Task SaveDataAsync(int idTelemetry, WitsRecordDto dto, CancellationToken token) { - //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((TEntity)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((TEntity)entity); - // } - //} - //await db.SaveChangesAsync(token); + if (dto is null) + return; + var timezoneHours = telemetryService.GetTimezone(idTelemetry).Hours; + foreach (var item in dto.Items) + { + var jsonValue = item.Value; + var type = jsonValue.Value.GetType().Name; + if (type == "string") + { + var entity = GetEntityStr(dto, jsonValue, item.Key, timezoneHours); + db.WitsItemString.Add(entity); + } + else if (type == "int") + { + var entity = GetEntityInt(dto, jsonValue, item.Key, timezoneHours); + db.WitsItemInt.Add(entity); + } + else if (type == "float") + { + var entity = GetEntityFloat(dto, jsonValue, item.Key, timezoneHours); + db.WitsItemFloat.Add(entity); + } + } + + await db.SaveChangesAsync(token); } private static async Task> GetEntityIntAsync(IQueryable query, @@ -280,25 +262,44 @@ namespace AsbCloudInfrastructure.Repository return entities; } - //private static void GetEntities(WitsRecordDto recordItems, int idTelemetry, double timezoneHours) - //{ - // var itemsCount = recordItems.Items.Count; - // var entities = new List>(itemsCount); + private static WitsItemString GetEntityStr(WitsRecordDto record,JsonValue value,int idItems,double timezoneHours) + { + var entity = new WitsItemString + { + IdTelemetry = record.IdTelemetry, + DateTime = record.Date.ToUtcDateTimeOffset(timezoneHours), + IdRecord = record.Id, + IdItem = idItems, + Value = JsonSerializer.Deserialize(value.ToString())!, + }; + return entity; + } - // 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; - //} + private static WitsItemInt GetEntityInt(WitsRecordDto record, JsonValue value, int idItems, double timezoneHours) + { + var entity = new WitsItemInt + { + IdTelemetry = record.IdTelemetry, + DateTime = record.Date.ToUtcDateTimeOffset(timezoneHours), + IdRecord = record.Id, + IdItem = idItems, + Value = JsonSerializer.Deserialize(value.ToString())!, + }; + return entity; + } + + private static WitsItemFloat GetEntityFloat(WitsRecordDto record, JsonValue value, int idItems, double timezoneHours) + { + var entity = new WitsItemFloat + { + IdTelemetry = record.IdTelemetry, + DateTime = record.Date.ToUtcDateTimeOffset(timezoneHours), + IdRecord = record.Id, + IdItem = idItems, + Value = JsonSerializer.Deserialize(value.ToString())!, + }; + return entity; + } } #nullable disable }