forked from ddrilling/AsbCloudServer
Merge branch 'feature/#34164243-add-process-maps-apis' of http://test.digitaldrilling.ru:8080/DDrilling/AsbCloudServer into feature/#34164243-add-process-maps-apis
This commit is contained in:
commit
f47fc4f384
@ -49,7 +49,7 @@ namespace AsbCloudApp.Repositories
|
||||
/// </summary>
|
||||
/// <param name="idTelemetry"></param>
|
||||
/// <returns></returns>
|
||||
DatesRangeDto? GetOrDefaultCachedDateRange(int idTelemetry);
|
||||
DatesRangeDto? GetOrDefaultCachedDataDateRange(int idTelemetry);
|
||||
|
||||
/// <summary>
|
||||
/// Получить диапазон дат телеметрии.
|
||||
@ -57,7 +57,7 @@ namespace AsbCloudApp.Repositories
|
||||
/// </summary>
|
||||
/// <param name="idTelemetry"></param>
|
||||
/// <returns></returns>
|
||||
DatesRangeDto? GetOrDefaultDataDateRange(int idTelemetry);
|
||||
DatesRangeDto? GetOrDefaultWellDataDateRange(int idTelemetry);
|
||||
|
||||
/// <summary>
|
||||
/// Получение первой и последней записи телеметрии.
|
||||
|
@ -12,6 +12,7 @@ using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using AsbCloudApp.Requests;
|
||||
using Mapster;
|
||||
|
||||
namespace AsbCloudInfrastructure.Services.SAUB
|
||||
{
|
||||
@ -67,10 +68,10 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
});
|
||||
|
||||
var stopwatch = Stopwatch.StartNew();
|
||||
var dbset = db.Set<TEntity>();
|
||||
var dbSet = db.Set<TEntity>();
|
||||
try
|
||||
{
|
||||
return await db.Database.ExecInsertOrUpdateAsync(dbset, entities, token).ConfigureAwait(false);
|
||||
return await db.Database.ExecInsertOrUpdateAsync(dbSet, entities, token).ConfigureAwait(false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@ -101,7 +102,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
DateTimeOffset dateBeginUtc;
|
||||
if (dateBegin == default)
|
||||
{
|
||||
var dateRange = telemetryDataCache.GetOrDefaultDataDateRange(telemetry.Id);
|
||||
var dateRange = telemetryDataCache.GetOrDefaultWellDataDateRange(telemetry.Id);
|
||||
dateBeginUtc = (dateRange?.To.ToUniversalTime() ?? DateTimeOffset.UtcNow)
|
||||
.AddSeconds(-intervalSec);
|
||||
}
|
||||
@ -226,17 +227,17 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
|
||||
if ((DateTimeOffset.UtcNow - geDate) < TimeSpan.FromHours(12))
|
||||
{
|
||||
// пробуем обойтись кешем
|
||||
var cechedRange = telemetryDataCache.GetOrDefaultCachedDateRange(telemetry.Id);
|
||||
if (cechedRange?.From <= geDate)
|
||||
// пробуем обойтись кэшем
|
||||
var cachedRange = telemetryDataCache.GetOrDefaultCachedDataDateRange(telemetry.Id);
|
||||
if (cachedRange is not null)
|
||||
{
|
||||
var datesRange = new DatesRangeDto
|
||||
{
|
||||
From = geDate.DateTime,
|
||||
To = cechedRange.To
|
||||
};
|
||||
if (leDate.HasValue && leDate > geDate)
|
||||
datesRange.To = leDate.Value.Date;
|
||||
var datesRange = new DatesRangeDto {From = cachedRange.From, To = cachedRange.To };
|
||||
if (geDate >= cachedRange.From)
|
||||
datesRange.From = geDate.ToOffset(cachedRange.From.Offset);
|
||||
|
||||
if (leDate.HasValue && leDate <= cachedRange.To)
|
||||
datesRange.To = leDate.Value.ToOffset(cachedRange.To.Offset);
|
||||
|
||||
return datesRange;
|
||||
}
|
||||
}
|
||||
@ -248,7 +249,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
if(leDate.HasValue)
|
||||
query = query.Where(entity => entity.DateTime <= leDate.Value.ToUniversalTime());
|
||||
|
||||
var gquery = query
|
||||
var groupQuery = query
|
||||
.GroupBy(entity => entity.IdTelemetry)
|
||||
.Select(group => new
|
||||
{
|
||||
@ -256,14 +257,14 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
MaxDate = group.Max(entity => entity.DateTime),
|
||||
});
|
||||
|
||||
var result = await gquery.FirstOrDefaultAsync(token);
|
||||
var result = await groupQuery.FirstOrDefaultAsync(token);
|
||||
if (result is null)
|
||||
return null;
|
||||
|
||||
var range = new DatesRangeDto
|
||||
{
|
||||
From = result.MinDate.ToOffset(TimeSpan.FromHours(telemetry.TimeZone!.Hours)).DateTime,
|
||||
To = result.MaxDate.ToOffset(TimeSpan.FromHours(telemetry.TimeZone!.Hours)).DateTime,
|
||||
From = result.MinDate.ToOffset(telemetry.TimeZone!.Offset),
|
||||
To = result.MaxDate.ToOffset(telemetry.TimeZone!.Offset),
|
||||
};
|
||||
return range;
|
||||
}
|
||||
@ -274,7 +275,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
if (telemetry is null)
|
||||
return default;
|
||||
|
||||
return telemetryDataCache.GetOrDefaultDataDateRange(telemetry.Id);
|
||||
return telemetryDataCache.GetOrDefaultWellDataDateRange(telemetry.Id);
|
||||
}
|
||||
|
||||
protected abstract TDto Convert(TEntity src, double timezoneOffset);
|
||||
|
@ -13,15 +13,16 @@ using AsbCloudApp.Data;
|
||||
using AsbCloudApp.Requests;
|
||||
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
|
||||
{
|
||||
public TDto FirstByDate { get; init; } = default!;
|
||||
public CyclicArray<TDto> LastData { get; init; } = null!;
|
||||
public double TimezoneHours { get; init; } = 5;
|
||||
public TimeSpan TimezoneOffset => TimeSpan.FromHours(TimezoneHours);
|
||||
}
|
||||
|
||||
private const int activeWellCapacity = 12 * 60 * 60;
|
||||
@ -144,7 +145,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
return cacheItem.LastData.LastOrDefault();
|
||||
}
|
||||
|
||||
public DatesRangeDto? GetOrDefaultDataDateRange(int idTelemetry)
|
||||
public DatesRangeDto? GetOrDefaultWellDataDateRange(int idTelemetry)
|
||||
{
|
||||
if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem))
|
||||
return null;
|
||||
@ -152,17 +153,13 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
if (!cacheItem.LastData.Any())
|
||||
return null;
|
||||
|
||||
var from = DateTime.SpecifyKind(cacheItem.FirstByDate.DateTime, DateTimeKind.Unspecified);
|
||||
var to = DateTime.SpecifyKind(cacheItem.LastData[^1].DateTime, DateTimeKind.Unspecified);
|
||||
var to = FromDate(cacheItem.FirstByDate.DateTime, cacheItem.TimezoneOffset);
|
||||
var from = FromDate(cacheItem.LastData[^1].DateTime, cacheItem.TimezoneOffset);
|
||||
|
||||
return new DatesRangeDto
|
||||
{
|
||||
From = new DateTimeOffset(from, TimeSpan.FromHours(cacheItem.TimezoneHours)),
|
||||
To = new DateTimeOffset(to, TimeSpan.FromHours(cacheItem.TimezoneHours))
|
||||
};
|
||||
return new DatesRangeDto { From = from, To = to };
|
||||
}
|
||||
|
||||
public DatesRangeDto? GetOrDefaultCachedDateRange(int idTelemetry)
|
||||
public DatesRangeDto? GetOrDefaultCachedDataDateRange(int idTelemetry)
|
||||
{
|
||||
if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem))
|
||||
return null;
|
||||
@ -170,8 +167,8 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
if (cacheItem.LastData.Count < 2)
|
||||
return null;
|
||||
|
||||
var to = cacheItem.LastData[^1].DateTime;
|
||||
var from = cacheItem.LastData[0].DateTime;
|
||||
var to = FromDate(cacheItem.LastData[^1].DateTime, cacheItem.TimezoneOffset);
|
||||
var from = FromDate(cacheItem.LastData[0].DateTime, cacheItem.TimezoneOffset);
|
||||
|
||||
return new DatesRangeDto { From = from, To = to };
|
||||
}
|
||||
@ -355,5 +352,11 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
var telemetryIds = data.Select(item => item.Key);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
|
||||
public DatesRangeDto GetDatesRange(int idTelemetry)
|
||||
{
|
||||
var cacheDataRange = dataSaubCache.GetOrDefaultDataDateRange(idTelemetry)
|
||||
var cacheDataRange = dataSaubCache.GetOrDefaultWellDataDateRange(idTelemetry)
|
||||
?? new ();
|
||||
return cacheDataRange;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user