diff --git a/AsbCloudApp/Repositories/IGtrRepository.cs b/AsbCloudApp/Repositories/IGtrRepository.cs
index 706b6be2..39fbef07 100644
--- a/AsbCloudApp/Repositories/IGtrRepository.cs
+++ b/AsbCloudApp/Repositories/IGtrRepository.cs
@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using AsbCloudApp.Requests;
+using AsbCloudApp.Data;
namespace AsbCloudApp.Repositories
{
@@ -60,5 +61,15 @@ namespace AsbCloudApp.Repositories
///
[Obsolete]
IEnumerable GetLastData(int idWell);
+
+ ///
+ /// Доступные даты по скважине
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task GetRangeAsync(int idWell, DateTimeOffset? geDate, DateTimeOffset? leDate, CancellationToken token);
}
}
diff --git a/AsbCloudApp/Requests/GtrRequest.cs b/AsbCloudApp/Requests/GtrRequest.cs
index 43de25c4..89d281a3 100644
--- a/AsbCloudApp/Requests/GtrRequest.cs
+++ b/AsbCloudApp/Requests/GtrRequest.cs
@@ -10,7 +10,7 @@ public class GtrRequest
///
/// Дата начала выборки.По умолчанию: текущее время - IntervalSec
///
- public DateTime? Begin { get; set; }
+ public DateTimeOffset? Begin { get; set; }
///
/// Интервал времени даты начала выборки, секунды
diff --git a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs
index cbf87456..3f8333c9 100644
--- a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs
+++ b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs
@@ -15,6 +15,8 @@ using System.Threading.Tasks;
using AsbCloudApp.Exceptions;
using AsbCloudApp.Requests;
using Mapster;
+using AsbCloudApp.Data;
+using System.ComponentModel.DataAnnotations;
namespace AsbCloudInfrastructure.Repository
{
@@ -82,6 +84,42 @@ namespace AsbCloudInfrastructure.Repository
public async Task> GetAsync(int idWell, GtrRequest request, CancellationToken token) =>
await GetAsync(idWell, request, token);
+ public async Task GetRangeAsync(int idWell, DateTimeOffset? geDate, DateTimeOffset? leDate, CancellationToken token)
+ {
+ var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell);
+
+ if (telemetry is null)
+ return null;
+
+ var rangeQuery = db
+ .Set()
+ .Where(e => e.IdTelemetry == telemetry.Id);
+
+ if (geDate is not null)
+ rangeQuery = rangeQuery.Where(e => e.DateTime >= geDate);
+
+ if (leDate is not null)
+ rangeQuery = rangeQuery.Where(e => e.DateTime <= leDate);
+
+ var groupedQuery = rangeQuery.GroupBy(e => e.IdTelemetry)
+ .Select(group => new
+ {
+ Min = group.Min(e => e.DateTime),
+ Max = group.Max(e => e.DateTime)
+ });
+ var range = await groupedQuery.FirstOrDefaultAsync(token);
+
+ if (range is null)
+ return null;
+
+ var result = new DatesRangeDto
+ {
+ From = range.Min.ToOffset(telemetry.TimeZone!.Offset),
+ To = range.Max.ToOffset(telemetry.TimeZone!.Offset),
+ };
+ return result;
+ }
+
private async Task> GetAsync(int idWell, GtrRequest request, CancellationToken token)
where TEntity : WitsItemBase
where TType : notnull
@@ -116,8 +154,8 @@ namespace AsbCloudInfrastructure.Repository
{
var items = groupByInterval.Select(e => e);
var values = items.GroupBy(e => (e.IdRecord, e.IdItem))
- .Where(parameter => parameter.Any())
- .ToDictionary(parameter => WitsParameters[parameter.Key], g => g.Last().Value.ToString());
+ .Where(group => WitsParameters.ContainsKey(group.Key))
+ .ToDictionary(group => WitsParameters[group.Key], g => (object)g.Last().Value);
var dto = values.Adapt();
dto.DateTime = items.Last().DateTime.ToOffset(timezoneOffset);
@@ -142,6 +180,19 @@ namespace AsbCloudInfrastructure.Repository
.Where(e => e.DateTime >= dateBegin)
.Where(e => e.DateTime <= dateEnd);
}
+ else
+ {
+ var lastDate = query
+ .OrderBy(e=>e.DateTime)
+ .LastOrDefault()
+ ?.DateTime
+ ?? DateTimeOffset.UtcNow;
+ var dateBegin = lastDate.AddSeconds(-request.IntervalSec);
+ var dateEnd = lastDate;
+ query = query
+ .Where(e => e.DateTime >= dateBegin)
+ .Where(e => e.DateTime <= dateEnd);
+ }
return query;
}
diff --git a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs
index a339f1b8..f234d33c 100644
--- a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs
+++ b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs
@@ -11,6 +11,9 @@ using System.Threading.Tasks;
using AsbCloudApp.Exceptions;
using AsbCloudApp.Requests;
using Microsoft.AspNetCore.Http;
+using AsbCloudApp.Data;
+using System;
+using Org.BouncyCastle.Asn1.Ocsp;
namespace AsbCloudWebApi.Controllers.SAUB
{
@@ -58,6 +61,31 @@ namespace AsbCloudWebApi.Controllers.SAUB
return Ok(dtos);
}
+ ///
+ /// Возвращает диапазон дат за которые есть телеметрия за период времени
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [HttpGet("{idWell}/dateRange")]
+ [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)]
+ [ProducesResponseType((int)System.Net.HttpStatusCode.NotFound)]
+ [ProducesResponseType((int)System.Net.HttpStatusCode.NoContent)]
+ public virtual async Task> GetRangeAsync(
+ [FromRoute] int idWell,
+ DateTimeOffset? geDate,
+ DateTimeOffset? leDate,
+ CancellationToken token)
+ {
+ await AssertUserHasAccessToWellAsync(idWell, token);
+
+ var range = await gtrRepository.GetRangeAsync(idWell, geDate, leDate, token);
+
+ return Ok(range);
+ }
+
///
/// Получить загруженные данные ГТИ по скважине
///
@@ -81,7 +109,7 @@ namespace AsbCloudWebApi.Controllers.SAUB
if (!isCompanyOwnsWell)
return Forbid();
- var content = await gtrRepository.GetAsync(idWell, request.Begin,
+ var content = await gtrRepository.GetAsync(idWell, request.Begin?.DateTime,
request.IntervalSec, request.ApproxPointsCount, token).ConfigureAwait(false);
return Ok(content);