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 записи от панели оператора.
/// Сохраняет в БД.