From 06428838c5f8d2b64c6267caad2d36a467d2a8a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Fri, 4 Nov 2022 17:56:34 +0500 Subject: [PATCH] #7554801 Printify --- .../Subsystems/SubsystemActiveWellStatDto.cs | 2 +- .../Services/IDetectedOperationService.cs | 2 +- .../ISubsystemOperationTimeService.cs | 2 +- .../DetectedOperationService.cs | 22 ++-- .../SubsystemOperationTimeService.cs | 111 ++++++++++-------- .../SubsystemOperationTimeController.cs | 2 +- 6 files changed, 73 insertions(+), 68 deletions(-) diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs index bdcdd301..2b62f171 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs @@ -10,7 +10,7 @@ namespace AsbCloudApp.Data.Subsystems /// /// Активная скважина /// - public WellDto ActiveWell { get; set; } + public WellDto Well { get; set; } /// /// Наработки подсистемы АКБ /// diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs index cb14cc9c..8418557c 100644 --- a/AsbCloudApp/Services/IDetectedOperationService.cs +++ b/AsbCloudApp/Services/IDetectedOperationService.cs @@ -48,7 +48,7 @@ namespace AsbCloudApp.Services /// /// /// кортеж - ид телеметрии, интервалы глубины забоя (ротор,слайд) - Task?> GetDepthIntervalAllOperationsAsync(IEnumerable telemetryIds,DateTimeOffset gtDate, DateTimeOffset ltDate, CancellationToken token); + Task> GetDepthIntervalAllOperationsAsync(IEnumerable telemetryIds,DateTimeOffset gtDate, DateTimeOffset ltDate, CancellationToken token); /// /// Удалить операции diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs index b4032552..91b78023 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -55,7 +55,7 @@ namespace AsbCloudApp.Services.Subsystems /// /// /// - Task?> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token); + Task> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token); } #nullable disable } diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 35970bca..87decac8 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -84,7 +84,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations return dtos; } - public async Task?> GetDepthIntervalAllOperationsAsync(IEnumerable telemetryIds, DateTimeOffset gtDate, DateTimeOffset ltDate, CancellationToken token) + public async Task> GetDepthIntervalAllOperationsAsync(IEnumerable telemetryIds, DateTimeOffset gtDate, DateTimeOffset ltDate, CancellationToken token) { var query = db.Set() .Include(o => o.OperationCategory) @@ -98,18 +98,14 @@ namespace AsbCloudInfrastructure.Services.DetectOperations RotorDepthInterval = g.Where(o => o.IdCategory == IdOperationRotor).Sum(o => o.DepthEnd - o.DepthStart), SlideDepthInterval = g.Where(o => o.IdCategory == IdOperationSlide).Sum(o => o.DepthEnd - o.DepthStart) }); - var data = await query.ToListAsync(token); - if (data.Any()) - { - var result = data.Select(g => - ( - g.IdTelemetry, - g.RotorDepthInterval, - g.SlideDepthInterval - )); - return result; - } - return null; + var data = await query.ToArrayAsync(token); + var result = data.Select(g => + ( + g.IdTelemetry, + g.RotorDepthInterval, + g.SlideDepthInterval + )); + return result; } private static IEnumerable GetOperationsDrillersStat(IEnumerable operations) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 3cf1fb28..ada2ab42 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -79,7 +79,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems data = Trim(data, begin, end); } - var dtos = data.Select(o => Convert(o, well)); + var dtos = data.Select(o => Convert(o, well.Timezone.Hours)); return dtos; } @@ -156,7 +156,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems return result; } - private (double depthIntervalRotor, double depthIntervalSlide) GetDepthInterval (IEnumerable detectedOperations) + private static (double depthIntervalRotor, double depthIntervalSlide) GetDepthInterval (IEnumerable detectedOperations) { var depthIntervalRotor = detectedOperations.Where(o => o.IdCategory == 1) .Sum(o => o.DepthEnd - o.DepthStart); @@ -166,7 +166,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems return depthInterval; } - private double GetDepthIntervalSubsystem(int idSubsystem, (double depthIntervalRotor, double depthIntervalSlide) depthInterval) + private static double GetDepthIntervalSubsystem(int idSubsystem, (double depthIntervalRotor, double depthIntervalSlide) depthInterval) { var depthIntervalSubsystem = 0d; //AKB - MSE @@ -193,59 +193,67 @@ namespace AsbCloudInfrastructure.Services.Subsystems var listWell = await wellService.GetWellsByCompanyAsync(idCompany, token); var active = listWell.Where(w => w.IdState == 1); return active; - } + } - - public async Task?> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token) + /// + public async Task> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token) { - var activeWell = await GetActiveWellsByCompany(idCompany, token); - var telemetryIds = activeWell.Select(w => w.IdTelemetry).Distinct(); - var firstWell = activeWell.FirstOrDefault(); - if (firstWell == null) + var wells = await GetActiveWellsByCompany(idCompany, token); + if (!wells.Any()) return Enumerable.Empty(); - var result =activeWell.Select( t => new SubsystemActiveWellStatDto - { - ActiveWell = t - }).ToList(); + + var hoursOffset = wells + .FirstOrDefault(well => well.Timezone is not null) + ?.Timezone.Hours + ?? 5d; + + var beginUTC = gtDate.HasValue + ? gtDate.Value.ToUtcDateTimeOffset(hoursOffset) + :DateTime.Today.AddDays(-1).ToUtcDateTimeOffset(hoursOffset); + + var endUTC = ltDate.HasValue + ? ltDate.Value.ToUtcDateTimeOffset(hoursOffset) + : DateTime.Today.ToUtcDateTimeOffset(hoursOffset); + + var telemetryIds = wells + .Where(w => w.IdTelemetry is not null) + .Select(w => w.IdTelemetry) + .Distinct(); var query = db.SubsystemOperationTimes - .Where(o => telemetryIds.Contains(o.IdTelemetry)) + .Where(o => telemetryIds.Contains(o.IdTelemetry) && + o.DateStart >= beginUTC && + o.DateEnd <= endUTC) .AsNoTracking(); - var beginUTC = DateTime.Today.AddDays(-1).ToUtcDateTimeOffset(firstWell.Timezone.Hours); - var endUTC = DateTime.Today.ToUtcDateTimeOffset(firstWell.Timezone.Hours); - if (gtDate is not null) - { - beginUTC = gtDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours); - } - if (ltDate is not null) - { - endUTC = ltDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours); - } - query = query.Where(d => d.DateStart >= beginUTC); - query = query.Where(o => o.DateEnd <= endUTC); - - var depthIntervals = await detectedOperationService.GetDepthIntervalAllOperationsAsync(telemetryIds, beginUTC, endUTC, token); - if (depthIntervals is null) - { - return result; - } var subsystemsOperationTime = await query.ToListAsync(token); - var groupingSubsystemsOperationTime = subsystemsOperationTime.GroupBy(g => g.IdTelemetry); - foreach (var group in groupingSubsystemsOperationTime) - { - var well = result.Where(w => w.ActiveWell.IdTelemetry == group.Key).FirstOrDefault(); - if (well is not null) - { - var depthInterval = depthIntervals.Where(o => o.idTelemetry == well.ActiveWell.IdTelemetry).Select(o => (o.depthIntervalRotor, o.depthIntervalSlide)).FirstOrDefault(); - var dto = group.Select(s => s.Adapt()); - var subsystemStat = CalcStat(dto, depthInterval); - well.SubsystemAKB = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemAKB); - well.SubsystemMSE = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemMSE); - well.SubsystemSpinMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemSpin); - well.SubsystemTorqueMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemTorque); - } - } + + var depthIntervals = await detectedOperationService + .GetDepthIntervalAllOperationsAsync(telemetryIds, beginUTC, endUTC, token); + + var result = wells + .Select(well => { + var dtos = subsystemsOperationTime + .Where(s => s.IdTelemetry == well.IdTelemetry) + .Select(s => Convert(s, well.Timezone.Hours)); + + var (idTelemetry, depthIntervalRotor, depthIntervalSlide) = depthIntervals + .FirstOrDefault(i => i.idTelemetry == well.IdTelemetry); + + var subsystemStat = idTelemetry > 0 && dtos.Any() + ? CalcStat(dtos, (depthIntervalRotor, depthIntervalSlide)) + : Enumerable.Empty(); + + return new SubsystemActiveWellStatDto + { + Well = well, + SubsystemAKB = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemAKB), + SubsystemMSE = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemMSE), + SubsystemSpinMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemSpin), + SubsystemTorqueMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemTorque), + }; + }); + return result; } @@ -325,11 +333,12 @@ namespace AsbCloudInfrastructure.Services.Subsystems return query; } - private static SubsystemOperationTimeDto Convert(SubsystemOperationTime operationTime, WellDto well) + private static SubsystemOperationTimeDto Convert(SubsystemOperationTime operationTime, double? timezoneHours = null) { var dto = operationTime.Adapt(); - dto.DateStart = operationTime.DateStart.ToRemoteDateTime(well.Timezone.Hours); - dto.DateEnd = operationTime.DateEnd.ToRemoteDateTime(well.Timezone.Hours); + var hours = timezoneHours ?? operationTime.Telemetry.TimeZone.Hours; + dto.DateStart = operationTime.DateStart.ToRemoteDateTime(hours); + dto.DateEnd = operationTime.DateEnd.ToRemoteDateTime(hours); return dto; } diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index 0d832667..e2b1a945 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -54,7 +54,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems /// Токен /// [HttpGet("statByActiveWell")] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public async Task GetStatByWellAsync(DateTime? GtDate, DateTime? LtDate, CancellationToken token = default) { var idCompany = User.GetCompanyId();