From cf0ba06b2c9e8e79a59da49eab1ee57535ffa48e Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 29 Jun 2023 10:36:30 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20WellMapInfoDto=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D0=BA=D0=BE=D0=B9=20=D0=BF=D0=BE=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=B0=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/WellMapInfoDto.cs | 99 +++++++++++++++++++++++------- 1 file changed, 78 insertions(+), 21 deletions(-) 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; } } } From 968f6db3483bdb6772ed572171a3af1f3216b0af Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 29 Jun 2023 10:37:21 +0500 Subject: [PATCH 2/2] Wits repository cache last received value. --- AsbCloudApp/Services/IWitsRepository.cs | 2 +- .../Repository/WitsRecordRepository.cs | 27 +++++++------------ .../WITS/WitsControllerAbstract.cs | 9 +++---- 3 files changed, 14 insertions(+), 24 deletions(-) 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 }); } ///