diff --git a/AsbCloudApp/Data/WellMapInfoDto.cs b/AsbCloudApp/Data/WellMapInfoDto.cs
index 27018e93..1d491644 100644
--- a/AsbCloudApp/Data/WellMapInfoDto.cs
+++ b/AsbCloudApp/Data/WellMapInfoDto.cs
@@ -15,9 +15,85 @@ namespace AsbCloudApp.Data
public int IdState { get; set; }
///
- /// Дата/время кода приходили данные последний раз
+ /// Режим АПД:
+ /// 0 - "РУЧНОЙ"
+ /// 1 - "БУРЕНИЕ В РОТОРЕ"
+ /// 2 - "ПРОРАБОТКА"
+ /// 3 - "БУРЕНИЕ В СЛАЙДЕ"
+ /// 4 - "СПУСК СПО"
+ /// 5 - "ПОДЪЕМ СПО"
+ /// 6 - "ПОДЪЕМ С ПРОРАБОТКОЙ"
+ /// 10 - "БЛОКИРОВКА"
///
- public DateTime LastTelemetryDate { get; set; }
+ public int IdMode { get; set; }
+
+ ///
+ /// Коэф-т использования автоподачи долота (суммарный ротор + слайд)
+ ///
+ public double SaubUsage { get; set; }
+
+ ///
+ /// Коэф-т использования осциллятора
+ ///
+ public double SpinUsage { get; set; }
+
+ ///
+ /// Коэф-т использования демпфера
+ ///
+ public double TorqueKUsage { get; set; }
+
+ ///
+ /// Состояние МСЕ
+ ///
+ public double IdStateMse { get; set; }
+
+ ///
+ /// Дата/время получения данных от системы АПД
+ ///
+ public DateTime LastTelemetrySaubDate { get; set; }
+
+ ///
+ /// Дата/время получения данных от системы осцилляции
+ ///
+ public DateTime LastTelemetrySpinDate { get; set; }
+
+ ///
+ /// Дата/время получения данных от ННБ
+ ///
+ public DateTime LastTelemetryDdsDate { get; set; }
+
+ ///
+ /// Дата/время получения данных от ГТИ
+ ///
+ public DateTime LastTelemetryGtrDate { get; set; }
+
+ ///
+ /// Дата/время получения данных от СКПБ
+ ///
+ public DateTime LastTelemetryDpcsDate { get; set; }
+
+ ///
+ /// Дата начала первой фактической операции
+ /// Используется как дата начала бурения
+ ///
+ public DateTime? FirstFactOperationDateStart { get; set; }
+
+ ///
+ /// Дата окончания последней прогнозируемой операции
+ /// Если скважина завершена, то дата окончания последней фактической операции
+ /// Используется как прогноз окончания бурения
+ ///
+ public DateTime? LastPredictOperationDateEnd { get; set; }
+
+ ///
+ /// Рейсовая скорость проходки, последнего рейса
+ ///
+ public PlanFactDto RaceSpeed { get; set; } = null!;
+
+ ///
+ /// Механическая скорость проходки, последней операции бурения
+ ///
+ public PlanFactDto ROP { get; set; } = null!;
///
/// Плановая и текущая глубина
@@ -29,24 +105,5 @@ namespace AsbCloudApp.Data
///
public double TvdLagPercent { get; set; }
- ///
- /// Механическая скорость проходки, последней операции бурения
- ///
- public PlanFactDto ROP { get; set; } = null!;
-
- ///
- /// Рейсовая скорость проходки, последнего рейса
- ///
- public PlanFactDto RaceSpeed { get; set; } = null!;
-
- ///
- /// Процент использования АКБ
- ///
- public double SaubUsage { get; set; }
-
- ///
- /// Процент использования Спин мастера
- ///
- public double SpinUsage { get; set; }
}
}
diff --git a/AsbCloudApp/Services/IWitsRepository.cs b/AsbCloudApp/Services/IWitsRepository.cs
index 17ae9d69..cc9bbbfa 100644
--- a/AsbCloudApp/Services/IWitsRepository.cs
+++ b/AsbCloudApp/Services/IWitsRepository.cs
@@ -37,7 +37,7 @@ namespace AsbCloudApp.Services
/// The id telemetry.
/// The token.
/// A Task.
- Task> GetLastAsync(int idTelemetry, CancellationToken token);
+ TDto? GetLastOrDefault(int idTelemetry);
///
/// получить статистику по всему архиву: дата самой ранней записи, самой поздней и общее количество
diff --git a/AsbCloudInfrastructure/Repository/WitsRecordRepository.cs b/AsbCloudInfrastructure/Repository/WitsRecordRepository.cs
index 2e0d5626..4b0906ec 100644
--- a/AsbCloudInfrastructure/Repository/WitsRecordRepository.cs
+++ b/AsbCloudInfrastructure/Repository/WitsRecordRepository.cs
@@ -3,6 +3,7 @@ using AsbCloudDb.Model;
using Mapster;
using Microsoft.EntityFrameworkCore;
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
@@ -10,16 +11,17 @@ using System.Threading.Tasks;
namespace AsbCloudInfrastructure.Repository
{
-
public class WitsRecordRepository : IWitsRecordRepository
where TEntity : AsbCloudDb.Model.WITS.RecordBase, ITelemetryData
where TDto : AsbCloudApp.Data.ITelemetryData
{
- private static Random random = new Random((int)(DateTime.Now.Ticks % 0xFFFFFFFF));
+ private static readonly Random random = new Random((int)(DateTime.Now.Ticks % 0xFFFFFFFF));
private readonly DbSet dbset;
private readonly IAsbCloudDbContext db;
private readonly ITelemetryService telemetryService;
+ private static readonly ConcurrentDictionary cache = new ();
+
public WitsRecordRepository(IAsbCloudDbContext db, ITelemetryService telemetryService)
{
dbset = db.Set();
@@ -56,25 +58,16 @@ namespace AsbCloudInfrastructure.Repository
return data.Select(d => Convert(d, timezoneHours));
}
- public async Task> GetLastAsync(int idTelemetry, CancellationToken token)
- {
- var timezoneHours = telemetryService.GetTimezone(idTelemetry).Hours;
- var query = dbset
- .Where(d => d.IdTelemetry == idTelemetry)
- .OrderBy(d => d.DateTime)
- .AsNoTracking();
- var data = await query.LastOrDefaultAsync(token);
- if(data is not null)
- return new TDto[] { Convert(data, timezoneHours) };
-
- return Enumerable.Empty();
- }
+ public TDto? GetLastOrDefault(int idTelemetry)
+ => cache.GetValueOrDefault(idTelemetry);
public async Task SaveDataAsync(int idTelemetry, IEnumerable dtos, CancellationToken token)
{
- if (dtos?.Any() != true)
+ if (!dtos.Any())
return;
+ cache.AddOrUpdate(idTelemetry, dtos.Last(), (_,_) => dtos.OrderBy(r => r.DateTime).Last());
+
var timezoneHours = telemetryService.GetTimezone(idTelemetry).Hours;
var entities = dtos
.DistinctBy(d => d.DateTime)
@@ -144,7 +137,5 @@ namespace AsbCloudInfrastructure.Repository
data.DateTime = entity.DateTime.ToRemoteDateTime(timezoneHours);
return data;
}
-
}
-
}
diff --git a/AsbCloudWebApi/Controllers/WITS/WitsControllerAbstract.cs b/AsbCloudWebApi/Controllers/WITS/WitsControllerAbstract.cs
index 3e6a46ef..41bfa725 100644
--- a/AsbCloudWebApi/Controllers/WITS/WitsControllerAbstract.cs
+++ b/AsbCloudWebApi/Controllers/WITS/WitsControllerAbstract.cs
@@ -67,16 +67,15 @@ namespace AsbCloudWebApi.Controllers.WITS
///
///
[HttpGet("{idWell}/last")]
- public async virtual Task>> GetLastDataAsync(
+ public virtual ActionResult> GetLastData(
int idWell,
- [FromServices] IWitsRecordRepository witsRecordRepository,
- CancellationToken token)
+ [FromServices] IWitsRecordRepository witsRecordRepository)
{
var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell);
if (telemetry is null)
return NoContent();
- var dtos = await witsRecordRepository.GetLastAsync(telemetry.Id, token);
- return Ok(dtos);
+ var dto = witsRecordRepository.GetLastOrDefault(telemetry.Id);
+ return Ok(new[] { dto });
}
///
diff --git a/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs b/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs
index 589d8f9f..a011599c 100644
--- a/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs
+++ b/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs
@@ -1,7 +1,6 @@
using AsbCloudApp.Exceptions;
using Microsoft.AspNetCore.Http;
using System;
-using System.IO;
using System.Threading.Tasks;
namespace AsbCloudWebApi.Middlewares
@@ -36,12 +35,15 @@ namespace AsbCloudWebApi.Middlewares
context.Response.Clear();
context.Response.StatusCode = 403;
}
- catch (TaskCanceledException ex)
+ catch (OperationCanceledException ex)
{
Console.WriteLine(ex.Message);
}
catch (Exception ex) // TODO: find explicit exception. Use Trace. Add body size to message.
{
+ context.Response.Clear();
+ context.Response.StatusCode = 500;
+
if (ex.Message.Contains("Reading the request body timed out due to data arriving too slowly. See MinRequestBodyDataRate."))
Console.WriteLine("Reading the request body timed out due to data arriving too slowly.");
else