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);