forked from ddrilling/AsbCloudServer
Merge branch 'dev' of http://test.digitaldrilling.ru:8080/DDrilling/AsbCloudServer into dev
This commit is contained in:
commit
1f293dfcf9
@ -43,6 +43,13 @@ namespace AsbCloudApp.Repositories
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
IEnumerable<TDto>? GetOrDefault(int idTelemetry, TelemetryDataRequest request);
|
IEnumerable<TDto>? GetOrDefault(int idTelemetry, TelemetryDataRequest request);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Диапазон дат находящийся в кеше
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="idTelemetry"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
DatesRangeDto? GetOrDefaultCachedaDateRange(int idTelemetry);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить диапазон дат телеметрии.
|
/// Получить диапазон дат телеметрии.
|
||||||
/// Дата первой записи телеметрии храниться отдельно и запоняется при инициализации
|
/// Дата первой записи телеметрии храниться отдельно и запоняется при инициализации
|
||||||
|
@ -37,13 +37,21 @@ namespace AsbCloudApp.Services
|
|||||||
Task<IEnumerable<TDto>> GetAsync(int idWell, TelemetryDataRequest request, CancellationToken token);
|
Task<IEnumerable<TDto>> GetAsync(int idWell, TelemetryDataRequest request, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получение периода за период
|
/// Период за который есть данные по скважине в рамках временного интервала
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idWell"></param>
|
/// <param name="idWell"></param>
|
||||||
/// <param name="start"></param>
|
/// <param name="geDate"></param>
|
||||||
/// <param name="end"></param>
|
/// <param name="leDate"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
DatesRangeDto? GetRange(int idWell, DateTimeOffset start, DateTimeOffset end);
|
Task<DatesRangeDto> GetRangeAsync(int idWell, DateTimeOffset geDate, DateTimeOffset? leDate, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Период за который есть данные по скважине
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="idWell"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
DatesRangeDto? GetRange(int idWell);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// добавить/изменить данные тех. процесса (используется панелью)
|
/// добавить/изменить данные тех. процесса (используется панелью)
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using AsbCloudApp.Data;
|
using AsbCloudApp.Data;
|
||||||
|
using AsbCloudApp.Exceptions;
|
||||||
using AsbCloudApp.Repositories;
|
using AsbCloudApp.Repositories;
|
||||||
using AsbCloudApp.Services;
|
using AsbCloudApp.Services;
|
||||||
using AsbCloudDb;
|
using AsbCloudDb;
|
||||||
@ -204,28 +205,60 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public DatesRangeDto? GetRange(int idWell, DateTimeOffset start, DateTimeOffset end)
|
public async Task<DatesRangeDto> GetRangeAsync(int idWell, DateTimeOffset geDate, DateTimeOffset? leDate, CancellationToken token)
|
||||||
|
{
|
||||||
|
var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell)
|
||||||
|
?? throw new ArgumentInvalidException(nameof(idWell), $"По скважине id:{idWell} нет телеметрии");
|
||||||
|
|
||||||
|
if ((DateTimeOffset.UtcNow - geDate) < TimeSpan.FromHours(12))
|
||||||
|
{
|
||||||
|
// пробуем обойтись кешем
|
||||||
|
var cechedRange = telemetryDataCache.GetOrDefaultCachedaDateRange(telemetry.Id);
|
||||||
|
if (cechedRange?.From <= geDate)
|
||||||
|
{
|
||||||
|
var datesRange = new DatesRangeDto
|
||||||
|
{
|
||||||
|
From = geDate.DateTime,
|
||||||
|
To = cechedRange.To
|
||||||
|
};
|
||||||
|
if (leDate.HasValue && leDate > geDate)
|
||||||
|
datesRange.To = leDate.Value.Date;
|
||||||
|
return datesRange;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var query = db.Set<TEntity>()
|
||||||
|
.Where(entity => entity.IdTelemetry == telemetry.Id)
|
||||||
|
.Where(entity => entity.DateTime >= geDate.ToUniversalTime());
|
||||||
|
|
||||||
|
if(leDate.HasValue)
|
||||||
|
query = query.Where(entity => entity.DateTime <= leDate.Value.ToUniversalTime());
|
||||||
|
|
||||||
|
var gquery = query
|
||||||
|
.GroupBy(entity => entity.IdTelemetry)
|
||||||
|
.Select(group => new
|
||||||
|
{
|
||||||
|
MinDate = group.Min(entity => entity.DateTime),
|
||||||
|
MaxDate = group.Max(entity => entity.DateTime),
|
||||||
|
});
|
||||||
|
|
||||||
|
var result = await gquery.FirstAsync(token);
|
||||||
|
|
||||||
|
var range = new DatesRangeDto
|
||||||
|
{
|
||||||
|
From = result.MinDate.ToOffset(TimeSpan.FromHours(telemetry.TimeZone!.Hours)).DateTime,
|
||||||
|
To = result.MaxDate.ToOffset(TimeSpan.FromHours(telemetry.TimeZone!.Hours)).DateTime,
|
||||||
|
};
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DatesRangeDto? GetRange(int idWell)
|
||||||
{
|
{
|
||||||
var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell);
|
var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell);
|
||||||
if (telemetry is null)
|
if (telemetry is null)
|
||||||
return default;
|
return default;
|
||||||
|
|
||||||
var datesRange = telemetryDataCache.GetOrDefaultDataDateRange(telemetry.Id);
|
return telemetryDataCache.GetOrDefaultDataDateRange(telemetry.Id);
|
||||||
|
|
||||||
if (datesRange is null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
var from = datesRange.From > start.DateTime
|
|
||||||
? datesRange.From : start.DateTime;
|
|
||||||
|
|
||||||
var to = datesRange.To < end.DateTime
|
|
||||||
? datesRange.To : end.DateTime;
|
|
||||||
|
|
||||||
return new DatesRangeDto
|
|
||||||
{
|
|
||||||
From = from,
|
|
||||||
To = to,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract TDto Convert(TEntity src, double timezoneOffset);
|
public abstract TDto Convert(TEntity src, double timezoneOffset);
|
||||||
|
@ -147,6 +147,20 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
|||||||
return new DatesRangeDto { From = from.Value, To = to };
|
return new DatesRangeDto { From = from.Value, To = to };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DatesRangeDto? GetOrDefaultCachedaDateRange(int idTelemetry)
|
||||||
|
{
|
||||||
|
if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
if (cacheItem.LastData.Count < 2)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var to = cacheItem.LastData[^1].DateTime;
|
||||||
|
var from = cacheItem.LastData[0].DateTime;
|
||||||
|
|
||||||
|
return new DatesRangeDto { From = from, To = to };
|
||||||
|
}
|
||||||
|
|
||||||
public (TDto First, TDto Last)? GetOrDefaultFirstLast(int idTelemetry)
|
public (TDto First, TDto Last)? GetOrDefaultFirstLast(int idTelemetry)
|
||||||
{
|
{
|
||||||
if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem))
|
if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem))
|
||||||
|
@ -131,15 +131,15 @@ namespace AsbCloudWebApi.Controllers.SAUB
|
|||||||
/// Возвращает диапазон дат за которые есть телеметрия за период времени
|
/// Возвращает диапазон дат за которые есть телеметрия за период времени
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idWell"></param>
|
/// <param name="idWell"></param>
|
||||||
/// <param name="start"></param>
|
/// <param name="geDate"></param>
|
||||||
/// <param name="end"></param>
|
/// <param name="leDate"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("{idWell}/dateRange")]
|
[HttpGet("{idWell}/dateRange")]
|
||||||
public virtual async Task<ActionResult<DatesRangeDto?>> GetRangeAsync(
|
public virtual async Task<ActionResult<DatesRangeDto?>> GetRangeAsync(
|
||||||
[FromRoute] int idWell,
|
[FromRoute] int idWell,
|
||||||
[Required] DateTimeOffset start,
|
[Required] DateTimeOffset geDate,
|
||||||
[Required] DateTimeOffset end,
|
DateTimeOffset? leDate,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
int? idCompany = User.GetCompanyId();
|
int? idCompany = User.GetCompanyId();
|
||||||
@ -153,7 +153,7 @@ namespace AsbCloudWebApi.Controllers.SAUB
|
|||||||
if (!isCompanyOwnsWell)
|
if (!isCompanyOwnsWell)
|
||||||
return Forbid();
|
return Forbid();
|
||||||
|
|
||||||
var content = telemetryDataService.GetRange(idWell, start, end);
|
var content = await telemetryDataService.GetRangeAsync(idWell, geDate, leDate, token);
|
||||||
|
|
||||||
return Ok(content);
|
return Ok(content);
|
||||||
}
|
}
|
||||||
|
@ -68,7 +68,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems
|
|||||||
if (!await UserHasAccesToWellAsync(idWell, token))
|
if (!await UserHasAccesToWellAsync(idWell, token))
|
||||||
return Forbid();
|
return Forbid();
|
||||||
|
|
||||||
var dateRange = telemetryDataSaubService.GetRange(idWell, DateTimeOffset.MinValue, DateTimeOffset.MaxValue);
|
var dateRange = telemetryDataSaubService.GetRange(idWell);
|
||||||
|
|
||||||
return Ok(dateRange);
|
return Ok(dateRange);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user