Fix telemetryDataDateRange timezone offset

This commit is contained in:
ngfrolov 2024-06-24 17:05:04 +05:00
parent 07be69a368
commit a213c27fbf
Signed by: ng.frolov
GPG Key ID: E99907A0357B29A7
4 changed files with 338 additions and 334 deletions

View File

@ -49,7 +49,7 @@ namespace AsbCloudApp.Repositories
/// </summary> /// </summary>
/// <param name="idTelemetry"></param> /// <param name="idTelemetry"></param>
/// <returns></returns> /// <returns></returns>
DatesRangeDto? GetOrDefaultCachedDateRange(int idTelemetry); DatesRangeDto? GetOrDefaultCachedDataDateRange(int idTelemetry);
/// <summary> /// <summary>
/// Получить диапазон дат телеметрии. /// Получить диапазон дат телеметрии.
@ -57,7 +57,7 @@ namespace AsbCloudApp.Repositories
/// </summary> /// </summary>
/// <param name="idTelemetry"></param> /// <param name="idTelemetry"></param>
/// <returns></returns> /// <returns></returns>
DatesRangeDto? GetOrDefaultDataDateRange(int idTelemetry); DatesRangeDto? GetOrDefaultWellDataDateRange(int idTelemetry);
/// <summary> /// <summary>
/// Получение первой и последней записи телеметрии. /// Получение первой и последней записи телеметрии.

View File

@ -12,6 +12,7 @@ using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Requests; using AsbCloudApp.Requests;
using Mapster;
namespace AsbCloudInfrastructure.Services.SAUB namespace AsbCloudInfrastructure.Services.SAUB
{ {
@ -67,10 +68,10 @@ namespace AsbCloudInfrastructure.Services.SAUB
}); });
var stopwatch = Stopwatch.StartNew(); var stopwatch = Stopwatch.StartNew();
var dbset = db.Set<TEntity>(); var dbSet = db.Set<TEntity>();
try try
{ {
return await db.Database.ExecInsertOrUpdateAsync(dbset, entities, token).ConfigureAwait(false); return await db.Database.ExecInsertOrUpdateAsync(dbSet, entities, token).ConfigureAwait(false);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -101,7 +102,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
DateTimeOffset dateBeginUtc; DateTimeOffset dateBeginUtc;
if (dateBegin == default) if (dateBegin == default)
{ {
var dateRange = telemetryDataCache.GetOrDefaultDataDateRange(telemetry.Id); var dateRange = telemetryDataCache.GetOrDefaultWellDataDateRange(telemetry.Id);
dateBeginUtc = (dateRange?.To.ToUniversalTime() ?? DateTimeOffset.UtcNow) dateBeginUtc = (dateRange?.To.ToUniversalTime() ?? DateTimeOffset.UtcNow)
.AddSeconds(-intervalSec); .AddSeconds(-intervalSec);
} }
@ -226,17 +227,17 @@ namespace AsbCloudInfrastructure.Services.SAUB
if ((DateTimeOffset.UtcNow - geDate) < TimeSpan.FromHours(12)) if ((DateTimeOffset.UtcNow - geDate) < TimeSpan.FromHours(12))
{ {
// пробуем обойтись кешем // пробуем обойтись кэшем
var cechedRange = telemetryDataCache.GetOrDefaultCachedDateRange(telemetry.Id); var cachedRange = telemetryDataCache.GetOrDefaultCachedDataDateRange(telemetry.Id);
if (cechedRange?.From <= geDate) if (cachedRange is not null)
{ {
var datesRange = new DatesRangeDto var datesRange = new DatesRangeDto {From = cachedRange.From, To = cachedRange.To };
{ if (geDate >= cachedRange.From)
From = geDate.DateTime, datesRange.From = geDate.ToOffset(cachedRange.From.Offset);
To = cechedRange.To
}; if (leDate.HasValue && leDate <= cachedRange.To)
if (leDate.HasValue && leDate > geDate) datesRange.To = leDate.Value.ToOffset(cachedRange.To.Offset);
datesRange.To = leDate.Value.Date;
return datesRange; return datesRange;
} }
} }
@ -248,7 +249,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
if(leDate.HasValue) if(leDate.HasValue)
query = query.Where(entity => entity.DateTime <= leDate.Value.ToUniversalTime()); query = query.Where(entity => entity.DateTime <= leDate.Value.ToUniversalTime());
var gquery = query var groupQuery = query
.GroupBy(entity => entity.IdTelemetry) .GroupBy(entity => entity.IdTelemetry)
.Select(group => new .Select(group => new
{ {
@ -256,14 +257,14 @@ namespace AsbCloudInfrastructure.Services.SAUB
MaxDate = group.Max(entity => entity.DateTime), MaxDate = group.Max(entity => entity.DateTime),
}); });
var result = await gquery.FirstOrDefaultAsync(token); var result = await groupQuery.FirstOrDefaultAsync(token);
if (result is null) if (result is null)
return null; return null;
var range = new DatesRangeDto var range = new DatesRangeDto
{ {
From = result.MinDate.ToOffset(TimeSpan.FromHours(telemetry.TimeZone!.Hours)).DateTime, From = result.MinDate.ToOffset(telemetry.TimeZone!.Offset),
To = result.MaxDate.ToOffset(TimeSpan.FromHours(telemetry.TimeZone!.Hours)).DateTime, To = result.MaxDate.ToOffset(telemetry.TimeZone!.Offset),
}; };
return range; return range;
} }
@ -274,7 +275,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
if (telemetry is null) if (telemetry is null)
return default; return default;
return telemetryDataCache.GetOrDefaultDataDateRange(telemetry.Id); return telemetryDataCache.GetOrDefaultWellDataDateRange(telemetry.Id);
} }
protected abstract TDto Convert(TEntity src, double timezoneOffset); protected abstract TDto Convert(TEntity src, double timezoneOffset);

View File

@ -13,8 +13,8 @@ using AsbCloudApp.Data;
using AsbCloudApp.Requests; using AsbCloudApp.Requests;
using AsbCloudApp.Repositories; using AsbCloudApp.Repositories;
namespace AsbCloudInfrastructure.Services.SAUB namespace AsbCloudInfrastructure.Services.SAUB;
{
public class TelemetryDataCache<TDto> : ITelemetryDataCache<TDto> where TDto : AsbCloudApp.Data.ITelemetryData public class TelemetryDataCache<TDto> : ITelemetryDataCache<TDto> where TDto : AsbCloudApp.Data.ITelemetryData
{ {
class TelemetryDataCacheItem class TelemetryDataCacheItem
@ -22,6 +22,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
public TDto FirstByDate { get; init; } = default!; public TDto FirstByDate { get; init; } = default!;
public CyclicArray<TDto> LastData { get; init; } = null!; public CyclicArray<TDto> LastData { get; init; } = null!;
public double TimezoneHours { get; init; } = 5; public double TimezoneHours { get; init; } = 5;
public TimeSpan TimezoneOffset => TimeSpan.FromHours(TimezoneHours);
} }
private const int activeWellCapacity = 12 * 60 * 60; private const int activeWellCapacity = 12 * 60 * 60;
@ -144,7 +145,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
return cacheItem.LastData.LastOrDefault(); return cacheItem.LastData.LastOrDefault();
} }
public DatesRangeDto? GetOrDefaultDataDateRange(int idTelemetry) public DatesRangeDto? GetOrDefaultWellDataDateRange(int idTelemetry)
{ {
if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem)) if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem))
return null; return null;
@ -152,17 +153,13 @@ namespace AsbCloudInfrastructure.Services.SAUB
if (!cacheItem.LastData.Any()) if (!cacheItem.LastData.Any())
return null; return null;
var from = DateTime.SpecifyKind(cacheItem.FirstByDate.DateTime, DateTimeKind.Unspecified); var to = FromDate(cacheItem.FirstByDate.DateTime, cacheItem.TimezoneOffset);
var to = DateTime.SpecifyKind(cacheItem.LastData[^1].DateTime, DateTimeKind.Unspecified); var from = FromDate(cacheItem.LastData[^1].DateTime, cacheItem.TimezoneOffset);
return new DatesRangeDto return new DatesRangeDto { From = from, To = to };
{
From = new DateTimeOffset(from, TimeSpan.FromHours(cacheItem.TimezoneHours)),
To = new DateTimeOffset(to, TimeSpan.FromHours(cacheItem.TimezoneHours))
};
} }
public DatesRangeDto? GetOrDefaultCachedDateRange(int idTelemetry) public DatesRangeDto? GetOrDefaultCachedDataDateRange(int idTelemetry)
{ {
if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem)) if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem))
return null; return null;
@ -170,8 +167,8 @@ namespace AsbCloudInfrastructure.Services.SAUB
if (cacheItem.LastData.Count < 2) if (cacheItem.LastData.Count < 2)
return null; return null;
var to = cacheItem.LastData[^1].DateTime; var to = FromDate(cacheItem.LastData[^1].DateTime, cacheItem.TimezoneOffset);
var from = cacheItem.LastData[0].DateTime; var from = FromDate(cacheItem.LastData[0].DateTime, cacheItem.TimezoneOffset);
return new DatesRangeDto { From = from, To = to }; return new DatesRangeDto { From = from, To = to };
} }
@ -355,5 +352,11 @@ namespace AsbCloudInfrastructure.Services.SAUB
var telemetryIds = data.Select(item => item.Key); var telemetryIds = data.Select(item => item.Key);
return telemetryIds; return telemetryIds;
} }
private static DateTimeOffset FromDate(DateTime dateTime, TimeSpan timezoneOffset)
{
var dateTimeNoKind = DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified);
var dateTimeOffset = new DateTimeOffset(dateTimeNoKind, timezoneOffset);
return dateTimeOffset;
} }
} }

View File

@ -51,7 +51,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
public DatesRangeDto GetDatesRange(int idTelemetry) public DatesRangeDto GetDatesRange(int idTelemetry)
{ {
var cacheDataRange = dataSaubCache.GetOrDefaultDataDateRange(idTelemetry) var cacheDataRange = dataSaubCache.GetOrDefaultWellDataDateRange(idTelemetry)
?? new (); ?? new ();
return cacheDataRange; return cacheDataRange;
} }