From 8d1ae1af846810af1cdc3f891f7bb9e5c6580394 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 16 May 2023 09:17:17 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=93?= =?UTF-8?q?=D0=A2=D0=98=20=D0=BF=D0=BE=20Record=20Id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/GTR/WitsItemRecordDto.cs | 30 +++++++++ AsbCloudApp/Repositories/IGtrRepository.cs | 9 +++ .../Repository/GtrWitsRepository.cs | 63 +++++++++++++++++++ .../Controllers/SAUB/GtrWitsController.cs | 20 ++++++ 4 files changed, 122 insertions(+) create mode 100644 AsbCloudApp/Data/GTR/WitsItemRecordDto.cs diff --git a/AsbCloudApp/Data/GTR/WitsItemRecordDto.cs b/AsbCloudApp/Data/GTR/WitsItemRecordDto.cs new file mode 100644 index 00000000..d2bb2722 --- /dev/null +++ b/AsbCloudApp/Data/GTR/WitsItemRecordDto.cs @@ -0,0 +1,30 @@ +using System; + +namespace AsbCloudApp.Data.GTR +{ + /// + /// Запись WITS + /// + public class WitsItemRecordDto + { + /// + /// Record Id + /// + public int IdRecord { get; set; } + + /// + /// Item Id + /// + public int IdItem { get; set; } + + /// + /// Дата создания записи + /// + public DateTime Date { get; set; } + + /// + /// Значение + /// + public object Value { get; set; } + } +} \ No newline at end of file diff --git a/AsbCloudApp/Repositories/IGtrRepository.cs b/AsbCloudApp/Repositories/IGtrRepository.cs index 4082a4cc..9b8c35f6 100644 --- a/AsbCloudApp/Repositories/IGtrRepository.cs +++ b/AsbCloudApp/Repositories/IGtrRepository.cs @@ -34,6 +34,15 @@ namespace AsbCloudApp.Repositories Task> GetAsync(int idWell, DateTime? dateBegin, double intervalSec = 600d, int approxPointsCount = 1024, CancellationToken token = default); + + /// + /// получение данных по record id + /// + /// + /// + /// + /// + Task> GetByRecordAsync(int idWell, int idRecord, CancellationToken token = default); } #nullable disable } diff --git a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs index d3e395d3..1d211734 100644 --- a/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs +++ b/AsbCloudInfrastructure/Repository/GtrWitsRepository.cs @@ -61,6 +61,35 @@ namespace AsbCloudInfrastructure.Repository return dtos; } + public async Task> GetByRecordAsync(int idWell, int idRecord, CancellationToken token = default) + { + var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell); + if (telemetry is null) + return Enumerable.Empty(); + + var timezone = telemetryService.GetTimezone(telemetry.Id); + + var recordAllInt = await GetItemsOrDefaultByRecordAsync(telemetry.Id, idRecord, timezone.Hours, token); + var recordAllFloat = await GetItemsOrDefaultByRecordAsync(telemetry.Id, idRecord, timezone.Hours, token); + var recordAllString = await GetItemsOrDefaultByRecordAsync(telemetry.Id, idRecord, timezone.Hours, token); + + var dtos = (recordAllFloat.Union(recordAllInt)).Union(recordAllString) + .GroupBy(g => new + { + g.IdRecord, + g.IdTelemetry, + g.IdItem + }) + .Select(g => new WitsItemRecordDto() + { + IdRecord = g.Key.IdRecord, + IdItem = g.Key.IdItem, + Date = g.MaxBy(i => i.Date)!.Date, + Value = g.MaxBy(i => i.Date)!.Item.Value, + }).ToArray(); + return dtos; + } + private async Task> GetItemsOrDefaultAsync( int idTelemetry, DateTimeOffset? dateBegin, @@ -111,6 +140,40 @@ namespace AsbCloudInfrastructure.Repository return items; } + private async Task> GetItemsOrDefaultByRecordAsync( + int idTelemetry, + int idRecord, + double timezoneHours, + CancellationToken token) + where TEntity : WitsItemBase + where TValue : notnull + { + var query = db.Set() + .Where(i => i.IdTelemetry == idTelemetry) + .Where(i => i.IdRecord == idRecord); + + var fullDataCount = await query.CountAsync(token); + + if (fullDataCount == 0) + return Enumerable.Empty(); + + var entities = await query + .OrderBy(d => d.DateTime) + .AsNoTracking() + .ToListAsync(token) + .ConfigureAwait(false); + + var items = entities.Select(e => new ItemRecord + { + IdRecord = e.IdRecord, + IdTelemetry = e.IdTelemetry, + Date = e.DateTime.ToRemoteDateTime(timezoneHours), + IdItem = e.IdItem, + Item = new JsonValue(e.Value) + }); + return items; + } + public async Task SaveDataAsync(int idTelemetry, WitsRecordDto dto, CancellationToken token) { var timezoneHours = telemetryService.GetTimezone(idTelemetry).Hours; diff --git a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs index 895d4721..e97d551a 100644 --- a/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/GtrWitsController.cs @@ -68,6 +68,26 @@ namespace AsbCloudWebApi.Controllers.SAUB return Ok(content); } + [HttpGet("{idWell}/{idRecord}")] + [Permission] + public async Task>> GetDataByRecordAsync(int idWell, int idRecord, CancellationToken token = default) + { + int? idCompany = User.GetCompanyId(); + + if (idCompany is null) + return Forbid(); + + bool isCompanyOwnsWell = await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, + idWell, token).ConfigureAwait(false); + + if (!isCompanyOwnsWell) + return Forbid(); + + var content = await gtrRepository.GetByRecordAsync(idWell, idRecord, token).ConfigureAwait(false); + + return Ok(content); + } + /// /// Метод для получения WITS записи от панели оператора. /// Сохраняет в БД.