forked from ddrilling/AsbCloudServer
Merge branch 'dev' into feature/detected_operations
This commit is contained in:
commit
24ad2c01bb
234
AsbCloudApp/Data/GTR/GtrWitsDto.cs
Normal file
234
AsbCloudApp/Data/GTR/GtrWitsDto.cs
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace AsbCloudApp.Data.GTR;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ГТИ
|
||||||
|
/// </summary>
|
||||||
|
public class GtrWitsDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Дата получения записи
|
||||||
|
/// </summary>
|
||||||
|
public DateTimeOffset DateTime { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Забой (скважины), м
|
||||||
|
/// </summary>
|
||||||
|
public float? DEPTMEAS { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Долото, м
|
||||||
|
/// </summary>
|
||||||
|
public float DEPTBITM { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Вес на крюке
|
||||||
|
/// </summary>
|
||||||
|
public float? HKLA { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Высота крюка
|
||||||
|
/// </summary>
|
||||||
|
public float? BLKPOS { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Нагрузка на долото
|
||||||
|
/// </summary>
|
||||||
|
public float? WOBA { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Момент на роторе/ВСП
|
||||||
|
/// </summary>
|
||||||
|
public float? TORQA { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Давление на входе (на стояке)
|
||||||
|
/// </summary>
|
||||||
|
public float? SPPA { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Обороты ротора/ВСП
|
||||||
|
/// </summary>
|
||||||
|
public float? RPMA { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Механическая скорость
|
||||||
|
/// </summary>
|
||||||
|
public float? ROPA { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Скорость инструмента вверх
|
||||||
|
/// </summary>
|
||||||
|
public float? RSUX { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Скорость инструмента вниз
|
||||||
|
/// </summary>
|
||||||
|
public float? RSDX { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Расход на входе
|
||||||
|
/// </summary>
|
||||||
|
public float? MFIA { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Расход на выходе
|
||||||
|
/// </summary>
|
||||||
|
public float? MFOA { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Температура на входе
|
||||||
|
/// </summary>
|
||||||
|
public float? MTIA { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Температура на выходе
|
||||||
|
/// </summary>
|
||||||
|
public float? MTOA { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ходы насоса №1
|
||||||
|
/// </summary>
|
||||||
|
public float? SPM1 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ходы насоса №2
|
||||||
|
/// </summary>
|
||||||
|
public float? SPM2 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ходы насоса №3
|
||||||
|
/// </summary>
|
||||||
|
public float? SPM3 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Общий объем бурового раствора на поверхности
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOLACT { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в доливной емкости №1
|
||||||
|
/// </summary>
|
||||||
|
public float? TTVOL1 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в доливной емкости №2
|
||||||
|
/// </summary>
|
||||||
|
public float? TTVOL2 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №1
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL01 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №2
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL02 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №3
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL03 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №4
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL04 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №5
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL05 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №6
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL06 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №7
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL07 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №8
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL08 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №9
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL09 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №10
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL10 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №11
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL11 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №12
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL12 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №13
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL13 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Объем бурового раствора в емкости №14
|
||||||
|
/// </summary>
|
||||||
|
public float? TVOL14 { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Плотность (удельный вес) бурового раствора на выходе
|
||||||
|
/// </summary>
|
||||||
|
public float? MDOA { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Плотность (удельный вес) бурового раствора на входе
|
||||||
|
/// </summary>
|
||||||
|
public float? MDIA { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Процентное содержание метана
|
||||||
|
/// </summary>
|
||||||
|
public float? METHANE { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Процентное содержание этана
|
||||||
|
/// </summary>
|
||||||
|
public float? ETHANE { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Процентное содержание пропана
|
||||||
|
/// </summary>
|
||||||
|
public float? PROPANE { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Процентное содержание бутана
|
||||||
|
/// </summary>
|
||||||
|
public float? IBUTANE { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Процентное содержание пентана
|
||||||
|
/// </summary>
|
||||||
|
public float? NBUTANE { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Процентное содержание углеводородов
|
||||||
|
/// </summary>
|
||||||
|
public float? HydrocarbonPercentage => METHANE + ETHANE + PROPANE + IBUTANE + NBUTANE;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Процентное содержание газов
|
||||||
|
/// </summary>
|
||||||
|
public float? GASA { get; set; }
|
||||||
|
}
|
@ -3,6 +3,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using AsbCloudApp.Requests;
|
||||||
|
|
||||||
namespace AsbCloudApp.Repositories
|
namespace AsbCloudApp.Repositories
|
||||||
{
|
{
|
||||||
@ -19,6 +20,15 @@ namespace AsbCloudApp.Repositories
|
|||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task SaveDataAsync(int idTelemetry, IEnumerable<WitsRecordDto> dtos, CancellationToken token);
|
Task SaveDataAsync(int idTelemetry, IEnumerable<WitsRecordDto> dtos, CancellationToken token);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// получить данные ГТИ
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="idWell"></param>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<IEnumerable<GtrWitsDto>> GetAsync(int idWell, GtrRequest request, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// получить данные для клиента
|
/// получить данные для клиента
|
||||||
@ -29,6 +39,7 @@ namespace AsbCloudApp.Repositories
|
|||||||
/// <param name="approxPointsCount">кол-во элементов до которых эти данные прореживаются</param>
|
/// <param name="approxPointsCount">кол-во элементов до которых эти данные прореживаются</param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
|
[Obsolete]
|
||||||
Task<IEnumerable<WitsRecordDto>> GetAsync(int idWell,
|
Task<IEnumerable<WitsRecordDto>> GetAsync(int idWell,
|
||||||
DateTime? dateBegin, double intervalSec = 600d,
|
DateTime? dateBegin, double intervalSec = 600d,
|
||||||
int approxPointsCount = 1024, CancellationToken token = default);
|
int approxPointsCount = 1024, CancellationToken token = default);
|
||||||
@ -39,6 +50,7 @@ namespace AsbCloudApp.Repositories
|
|||||||
/// <param name="idWell"></param>
|
/// <param name="idWell"></param>
|
||||||
/// <param name="idRecord"></param>
|
/// <param name="idRecord"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
|
[Obsolete]
|
||||||
IEnumerable<WitsItemRecordDto> GetLastDataByRecordId(int idWell, int idRecord);
|
IEnumerable<WitsItemRecordDto> GetLastDataByRecordId(int idWell, int idRecord);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -46,6 +58,7 @@ namespace AsbCloudApp.Repositories
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="idWell"></param>
|
/// <param name="idWell"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
|
[Obsolete]
|
||||||
IEnumerable<WitsItemRecordDto> GetLastData(int idWell);
|
IEnumerable<WitsItemRecordDto> GetLastData(int idWell);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ namespace AsbCloudApp.Requests;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Параметры запроса для получения загруженных данных ГТИ по скважине
|
/// Параметры запроса для получения загруженных данных ГТИ по скважине
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class GtrWithGetDataRequest
|
public class GtrRequest
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Дата начала выборки.По умолчанию: текущее время - IntervalSec
|
/// Дата начала выборки.По умолчанию: текущее время - IntervalSec
|
||||||
@ -20,5 +20,6 @@ public class GtrWithGetDataRequest
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена.
|
/// Желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete]
|
||||||
public int ApproxPointsCount { get; set; } = 1024;
|
public int ApproxPointsCount { get; set; } = 1024;
|
||||||
}
|
}
|
@ -12,11 +12,61 @@ using System.Diagnostics;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using AsbCloudApp.Exceptions;
|
||||||
|
using AsbCloudApp.Requests;
|
||||||
|
using Mapster;
|
||||||
|
|
||||||
namespace AsbCloudInfrastructure.Repository
|
namespace AsbCloudInfrastructure.Repository
|
||||||
{
|
{
|
||||||
public class GtrWitsRepository : IGtrRepository
|
public class GtrWitsRepository : IGtrRepository
|
||||||
{
|
{
|
||||||
|
private static IDictionary<(int IdRecord, int IdItem), string> WitsParameters = new Dictionary<(int, int), string>
|
||||||
|
{
|
||||||
|
{ (1, 8), nameof(GtrWitsDto.DEPTBITM) },
|
||||||
|
{ (1, 10), nameof(GtrWitsDto.DEPTMEAS) },
|
||||||
|
{ (1, 14), nameof(GtrWitsDto.HKLA) },
|
||||||
|
{ (1, 12), nameof(GtrWitsDto.BLKPOS) },
|
||||||
|
{ (1, 16), nameof(GtrWitsDto.WOBA) },
|
||||||
|
{ (1, 18), nameof(GtrWitsDto.TORQA) },
|
||||||
|
{ (1, 21), nameof(GtrWitsDto.SPPA) },
|
||||||
|
{ (2, 15), nameof(GtrWitsDto.RPMA) },
|
||||||
|
{ (1, 13), nameof(GtrWitsDto.ROPA) },
|
||||||
|
{ (3, 16), nameof(GtrWitsDto.RSUX) },
|
||||||
|
{ (3, 17), nameof(GtrWitsDto.RSDX) },
|
||||||
|
{ (1, 30), nameof(GtrWitsDto.MFIA) },
|
||||||
|
{ (1, 29), nameof(GtrWitsDto.MFOA)},
|
||||||
|
{ (1, 34), nameof(GtrWitsDto.MTIA) },
|
||||||
|
{ (1, 33), nameof(GtrWitsDto.MTOA) },
|
||||||
|
{ (1, 23), nameof(GtrWitsDto.SPM1) },
|
||||||
|
{ (1, 24), nameof(GtrWitsDto.SPM2) },
|
||||||
|
{ (1, 25), nameof(GtrWitsDto.SPM3) },
|
||||||
|
{ (1, 26), nameof(GtrWitsDto.TVOLACT) },
|
||||||
|
{ (11, 29), nameof(GtrWitsDto.TTVOL1) },
|
||||||
|
{ (11, 30), nameof(GtrWitsDto.TTVOL2) },
|
||||||
|
{ (11, 15), nameof(GtrWitsDto.TVOL01) },
|
||||||
|
{ (11, 16), nameof(GtrWitsDto.TVOL02) },
|
||||||
|
{ (11, 17), nameof(GtrWitsDto.TVOL03) },
|
||||||
|
{ (11, 18), nameof(GtrWitsDto.TVOL04) },
|
||||||
|
{ (11, 19), nameof(GtrWitsDto.TVOL05) },
|
||||||
|
{ (11, 20), nameof(GtrWitsDto.TVOL06) },
|
||||||
|
{ (11, 21), nameof(GtrWitsDto.TVOL07) },
|
||||||
|
{ (11, 22), nameof(GtrWitsDto.TVOL08) },
|
||||||
|
{ (11, 23), nameof(GtrWitsDto.TVOL09) },
|
||||||
|
{ (11, 24), nameof(GtrWitsDto.TVOL10) },
|
||||||
|
{ (11, 25), nameof(GtrWitsDto.TVOL11) },
|
||||||
|
{ (11, 26), nameof(GtrWitsDto.TVOL12) },
|
||||||
|
{ (11, 27), nameof(GtrWitsDto.TVOL13) },
|
||||||
|
{ (11, 28), nameof(GtrWitsDto.TVOL14) },
|
||||||
|
{ (1, 31), nameof(GtrWitsDto.MDOA) },
|
||||||
|
{ (1, 32), nameof(GtrWitsDto.MDIA) },
|
||||||
|
{ (12, 12), nameof(GtrWitsDto.METHANE) },
|
||||||
|
{ (12, 13), nameof(GtrWitsDto.ETHANE) },
|
||||||
|
{ (12, 14), nameof(GtrWitsDto.PROPANE) },
|
||||||
|
{ (12, 15), nameof(GtrWitsDto.IBUTANE) },
|
||||||
|
{ (12, 16), nameof(GtrWitsDto.NBUTANE) },
|
||||||
|
{ (1, 40), nameof(GtrWitsDto.GASA) },
|
||||||
|
};
|
||||||
|
|
||||||
private readonly IAsbCloudDbContext db;
|
private readonly IAsbCloudDbContext db;
|
||||||
private readonly ITelemetryService telemetryService;
|
private readonly ITelemetryService telemetryService;
|
||||||
private static ConcurrentDictionary<int, ConcurrentDictionary<(int, int), WitsItemRecordDto>> cache = new();
|
private static ConcurrentDictionary<int, ConcurrentDictionary<(int, int), WitsItemRecordDto>> cache = new();
|
||||||
@ -29,6 +79,75 @@ namespace AsbCloudInfrastructure.Repository
|
|||||||
this.telemetryService = telemetryService;
|
this.telemetryService = telemetryService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<GtrWitsDto>> GetAsync(int idWell, GtrRequest request, CancellationToken token) =>
|
||||||
|
await GetAsync<WitsItemFloat, float>(idWell, request, token);
|
||||||
|
|
||||||
|
private async Task<IEnumerable<GtrWitsDto>> GetAsync<TEntity, TType>(int idWell, GtrRequest request, CancellationToken token)
|
||||||
|
where TEntity : WitsItemBase<TType>
|
||||||
|
where TType : notnull
|
||||||
|
{
|
||||||
|
var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell);
|
||||||
|
|
||||||
|
if (telemetry is null)
|
||||||
|
return Enumerable.Empty<GtrWitsDto>();
|
||||||
|
|
||||||
|
if (telemetry.TimeZone is null)
|
||||||
|
throw new ArgumentInvalidException(nameof(idWell),$"Telemetry id: {telemetry.Id} can't find timezone");
|
||||||
|
|
||||||
|
var timezoneOffset = TimeSpan.FromHours(telemetry.TimeZone.Hours);
|
||||||
|
|
||||||
|
var query = BuildQuery<TEntity, TType>(telemetry.Id, request);
|
||||||
|
|
||||||
|
if (!await query.AnyAsync(token))
|
||||||
|
return Enumerable.Empty<GtrWitsDto>();
|
||||||
|
|
||||||
|
var interval = TimeSpan.FromSeconds(10);
|
||||||
|
|
||||||
|
var idsRecord = WitsParameters.Select(p => p.Key.IdRecord);
|
||||||
|
|
||||||
|
var entities = await query
|
||||||
|
.Where(e => idsRecord.Contains(e.IdRecord))
|
||||||
|
.OrderBy(e => e.DateTime)
|
||||||
|
.AsNoTracking()
|
||||||
|
.ToArrayAsync(token);
|
||||||
|
|
||||||
|
var dtos = entities
|
||||||
|
.GroupBy(e => e.DateTime.Ticks / interval.Ticks)
|
||||||
|
.Select(groupByInterval =>
|
||||||
|
{
|
||||||
|
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());
|
||||||
|
|
||||||
|
var dto = values.Adapt<GtrWitsDto>();
|
||||||
|
dto.DateTime = items.Last().DateTime.ToOffset(timezoneOffset);
|
||||||
|
return dto;
|
||||||
|
});
|
||||||
|
|
||||||
|
return dtos;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IQueryable<TEntity> BuildQuery<TEntity, TType>(int idTelemetry, GtrRequest request)
|
||||||
|
where TEntity : WitsItemBase<TType>
|
||||||
|
where TType : notnull
|
||||||
|
{
|
||||||
|
var dateIntervalStart = DateTime.UtcNow.AddSeconds(-request.IntervalSec);
|
||||||
|
|
||||||
|
var query = db.Set<TEntity>()
|
||||||
|
.Where(e => e.IdTelemetry == idTelemetry)
|
||||||
|
.Where(e => e.DateTime >= dateIntervalStart);
|
||||||
|
|
||||||
|
if (request.Begin.HasValue)
|
||||||
|
{
|
||||||
|
var dateBeginUtc = request.Begin.Value.ToUniversalTime();
|
||||||
|
query = query.Where(e => e.DateTime >= dateBeginUtc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Obsolete]
|
||||||
public async Task<IEnumerable<WitsRecordDto>> GetAsync(int idWell, DateTime? dateBegin, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default)
|
public async Task<IEnumerable<WitsRecordDto>> GetAsync(int idWell, DateTime? dateBegin, double intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell);
|
var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell);
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@ -26,7 +27,11 @@ public abstract class ProcessMapPlanExportService<TDto> : ExportExcelService<TDt
|
|||||||
|
|
||||||
protected override async Task<IEnumerable<TDto>> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token)
|
protected override async Task<IEnumerable<TDto>> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token)
|
||||||
{
|
{
|
||||||
var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell);
|
var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell)
|
||||||
|
{
|
||||||
|
Moment = DateTimeOffset.UtcNow
|
||||||
|
};
|
||||||
|
|
||||||
var dtos = await processMapPlanRepository.Get(request, token);
|
var dtos = await processMapPlanRepository.Get(request, token);
|
||||||
return dtos;
|
return dtos;
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
13
AsbCloudWebApi.IntegrationTests/Clients/IGtrWitsClient.cs
Normal file
13
AsbCloudWebApi.IntegrationTests/Clients/IGtrWitsClient.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
using AsbCloudApp.Data.GTR;
|
||||||
|
using AsbCloudApp.Requests;
|
||||||
|
using Refit;
|
||||||
|
|
||||||
|
namespace AsbCloudWebApi.IntegrationTests.Clients;
|
||||||
|
|
||||||
|
public interface IGtrWitsClient
|
||||||
|
{
|
||||||
|
private const string BaseRoute = "/api/gtrWits";
|
||||||
|
|
||||||
|
[Get(BaseRoute)]
|
||||||
|
Task<IApiResponse<IEnumerable<GtrWitsDto>>> GetAllAsync(int idWell, [Query] GtrRequest request);
|
||||||
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
using System.Net;
|
||||||
|
using AsbCloudApp.Requests;
|
||||||
|
using AsbCloudDb.Model.GTR;
|
||||||
|
using AsbCloudWebApi.IntegrationTests.Clients;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace AsbCloudWebApi.IntegrationTests.Controllers;
|
||||||
|
|
||||||
|
public class GtrControllerTests : BaseIntegrationTest
|
||||||
|
{
|
||||||
|
private readonly IGtrWitsClient client;
|
||||||
|
|
||||||
|
public GtrControllerTests(WebAppFactoryFixture factory)
|
||||||
|
: base(factory)
|
||||||
|
{
|
||||||
|
client = factory.GetAuthorizedHttpClient<IGtrWitsClient>(string.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task GetAll_returns_success()
|
||||||
|
{
|
||||||
|
//arrange
|
||||||
|
var well = dbContext.Wells.First();
|
||||||
|
|
||||||
|
var witsItems = CreateWitsItems(well.IdTelemetry!.Value);
|
||||||
|
dbContext.WitsItemFloat.AddRange(witsItems);
|
||||||
|
await dbContext.SaveChangesAsync();
|
||||||
|
|
||||||
|
var request = new GtrRequest();
|
||||||
|
|
||||||
|
//act
|
||||||
|
var response = await client.GetAllAsync(well.Id, request);
|
||||||
|
|
||||||
|
//assert
|
||||||
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
|
Assert.NotNull(response.Content);
|
||||||
|
Assert.True(response.Content.Any());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<WitsItemFloat> CreateWitsItems(int idTelemetry) =>
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
new WitsItemFloat
|
||||||
|
{
|
||||||
|
IdRecord = 1,
|
||||||
|
IdItem = 14,
|
||||||
|
Value = 4,
|
||||||
|
IdTelemetry = idTelemetry,
|
||||||
|
DateTime = DateTimeOffset.UtcNow
|
||||||
|
},
|
||||||
|
new WitsItemFloat
|
||||||
|
{
|
||||||
|
IdRecord = 1,
|
||||||
|
IdItem = 14,
|
||||||
|
Value = 5,
|
||||||
|
IdTelemetry = idTelemetry,
|
||||||
|
DateTime = DateTimeOffset.UtcNow
|
||||||
|
},
|
||||||
|
new WitsItemFloat
|
||||||
|
{
|
||||||
|
IdRecord = 1,
|
||||||
|
IdItem = 12,
|
||||||
|
Value = 5,
|
||||||
|
IdTelemetry = idTelemetry,
|
||||||
|
DateTime = DateTimeOffset.UtcNow.AddSeconds(10)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
@ -8,7 +8,9 @@ using System.Collections.Generic;
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using AsbCloudApp.Exceptions;
|
||||||
using AsbCloudApp.Requests;
|
using AsbCloudApp.Requests;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
|
||||||
namespace AsbCloudWebApi.Controllers.SAUB
|
namespace AsbCloudWebApi.Controllers.SAUB
|
||||||
{
|
{
|
||||||
@ -36,6 +38,25 @@ namespace AsbCloudWebApi.Controllers.SAUB
|
|||||||
this.wellService = wellService;
|
this.wellService = wellService;
|
||||||
this.telemetryHubContext = telemetryHubContext;
|
this.telemetryHubContext = telemetryHubContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получить значение от ГТИ
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="idWell"></param>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
|
[Permission]
|
||||||
|
[ProducesResponseType(typeof(IEnumerable<GtrWitsDto>), StatusCodes.Status200OK)]
|
||||||
|
public async Task<IActionResult> GetAllAsync(int idWell, [FromQuery] GtrRequest request, CancellationToken token)
|
||||||
|
{
|
||||||
|
await AssertUserHasAccessToWellAsync(idWell, token);
|
||||||
|
|
||||||
|
var dtos = await gtrRepository.GetAsync(idWell, request, token);
|
||||||
|
|
||||||
|
return Ok(dtos);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить загруженные данные ГТИ по скважине
|
/// Получить загруженные данные ГТИ по скважине
|
||||||
@ -46,7 +67,7 @@ namespace AsbCloudWebApi.Controllers.SAUB
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("{idWell}")]
|
[HttpGet("{idWell}")]
|
||||||
public async Task<ActionResult<IEnumerable<WitsRecordDto>>> GetDataAsync([Required] int idWell,
|
public async Task<ActionResult<IEnumerable<WitsRecordDto>>> GetDataAsync([Required] int idWell,
|
||||||
[FromQuery] GtrWithGetDataRequest request,
|
[FromQuery] GtrRequest request,
|
||||||
CancellationToken token)
|
CancellationToken token)
|
||||||
{
|
{
|
||||||
int? idCompany = User.GetCompanyId();
|
int? idCompany = User.GetCompanyId();
|
||||||
@ -114,6 +135,21 @@ namespace AsbCloudWebApi.Controllers.SAUB
|
|||||||
.SendAsync(SignalRMethodGetDataName, dtos), CancellationToken.None);
|
.SendAsync(SignalRMethodGetDataName, dtos), CancellationToken.None);
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task AssertUserHasAccessToWellAsync(int idWell, CancellationToken token)
|
||||||
|
{
|
||||||
|
var idUser = User.GetUserId();
|
||||||
|
var idCompany = User.GetCompanyId();
|
||||||
|
|
||||||
|
if (!idUser.HasValue)
|
||||||
|
throw new ForbidException("Нет доступа к скважине");
|
||||||
|
|
||||||
|
if (!idCompany.HasValue)
|
||||||
|
throw new ForbidException("Нет доступа к скважине");
|
||||||
|
|
||||||
|
if (!await wellService.IsCompanyInvolvedInWellAsync(idCompany.Value, idWell, token))
|
||||||
|
throw new ForbidException("Нет доступа к скважине");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user