From 3aa01ebe47bf7c98fe3f59094cb50a6d9000387e Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 31 Oct 2022 18:19:14 +0500 Subject: [PATCH 01/17] =?UTF-8?q?-=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8C=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=BC?= =?UTF-8?q?=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D0=B0=D0=BC=20-?= =?UTF-8?q?=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D1=80=D0=B0=D1=81=D1=87?= =?UTF-8?q?=D0=B5=D1=82=D0=B0=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BA=D0=B8=20-=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20=D0=B2=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=BB=D0=B5=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Subsystems/SubsystemActiveWellStatDto.cs | 20 +++++ .../SubsystemOperationTimeService.cs | 77 ++++++++++++++++++- .../SubsystemOperationTimeController.cs | 12 +++ 3 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs new file mode 100644 index 00000000..fd3c1054 --- /dev/null +++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; + +namespace AsbCloudApp.Data.Subsystems +{ + /// + /// Статистика наработки подсистем по активным скважинам + /// + public class SubsystemActiveWellStatDto + { + /// + /// Идентификатор скважины + /// + public int IdWell { get; set; } + /// + /// Наработки подсистем + /// + public IEnumerable listSubsystemStat { get; set; } + + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index cbef2343..b42e8835 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -101,7 +101,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems return null; var depthInterval = GetDepthInterval(detectedOperations); - var statList = CalcStat(data,depthInterval,request, token); + var statList = CalcStat(data,depthInterval); return statList; } @@ -125,7 +125,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems return items; } - private IEnumerable CalcStat(IEnumerable dtos, (double depthIntervalRotor, double depthIntervalSlide) depthInterval, SubsystemOperationTimeRequest request, CancellationToken token) + private IEnumerable CalcStat(IEnumerable dtos, (double depthIntervalRotor, double depthIntervalSlide) depthInterval) { var groupedDataSubsystems = dtos .GroupBy(o => o.IdSubsystem); @@ -153,8 +153,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems return result; } private (double depthIntervalRotor, double depthIntervalSlide) GetDepthInterval (IEnumerable detectedOperations) - { - + { var depthIntervalRotor = detectedOperations.Where(o => o.IdCategory == 1) .Sum(o => o.DepthEnd - o.DepthStart); var depthIntervalSlide = detectedOperations.Where(o => o.IdCategory == 3) @@ -185,6 +184,76 @@ namespace AsbCloudInfrastructure.Services.Subsystems } + + + private async Task> GetSubsystemOperationTimeAll(int idCompany, CancellationToken token) + { + var listWell = await wellService.GetWellsByCompanyAsync(idCompany, token); + var active = listWell.Where(w => w.IdState == 1); + return active; + } + + + public async Task?> GetStatByActiveWell(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token) + { + var activeWell = await GetSubsystemOperationTimeAll(idCompany, token); + var telemetryIds = activeWell.Select(w => w.IdTelemetry); + var query = db.SubsystemOperationTimes + .Include(o => o.Subsystem) + .Where(o => telemetryIds.Contains(o.IdTelemetry)) + .AsNoTracking(); + + if (query is null) + { + return null; + } + DateTime today = DateTime.Today; + if (gtDate.HasValue) + { + query = query.Where(o => o.DateEnd >= gtDate); + } + else + { + gtDate = today; + query = query.Where(o => o.DateEnd == gtDate); + } + + if (ltDate.HasValue) + { + query = query.Where(o => o.DateStart <= ltDate); + } + else + { + ltDate = today.AddDays(-1); + query = query.Where(o => o.DateStart == ltDate ); + } + var detectedOperationsRequest = new DetectedOperationRequest() + { + IdsCategories = new List() { + 1,3 + }, + LtDate = ltDate, + GtDate = gtDate, + }; + var detectedOperations = await detectedOperationService.GetOperationsAsync(detectedOperationsRequest, token); + var groupData = query.GroupBy(g => g.IdTelemetry); + var result = new List(); + foreach (var group in groupData) + { + var wellStat = new SubsystemActiveWellStatDto(); + wellStat.IdWell = activeWell.Where(w => w.IdTelemetry == group.Key).Select(w => w.Id).FirstOrDefault(); + var groupSubsystem = (IEnumerable>)group.GroupBy(g => g.IdSubsystem); + var detectedOperationsById = detectedOperations.Where(d => d.IdWell == wellStat.IdWell).ToList(); + var depthInterval = GetDepthInterval(detectedOperationsById); + wellStat.listSubsystemStat = CalcStat((IEnumerable)groupSubsystem, depthInterval); + result.Add(wellStat); + } + + return result; + } + + + /// public async Task GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token) { diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index d86a411f..e700d470 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -46,6 +46,18 @@ namespace AsbCloudWebApi.Controllers.Subsystems return Ok(subsystemResult); } + /// + /// получить статистику по активным скважинам + /// + [HttpGet("statByActiveWell")] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetStatByWellAsync([FromQuery] DateTime? GtDate, DateTime? LtDate, CancellationToken token = default) + { + + var subsystemResult = await subsystemOperationTimeService.GetStatAsync(request, token); + return Ok(subsystemResult); + } + /// /// получить список подсистем общий. /// From 562bf5b348fe80e943df8ca0872e0911ebee9cbe Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 31 Oct 2022 18:59:08 +0500 Subject: [PATCH 02/17] =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=D0=B0=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D0=BB=D0=B5=D1=80=D0=B5=20=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B0=20=D0=BD=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Subsystems/ISubsystemOperationTimeService.cs | 11 ++++++++++- .../Subsystems/SubsystemOperationTimeService.cs | 2 +- .../Subsystems/SubsystemOperationTimeController.cs | 11 ++++++++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs index 62ade194..88fd3cf4 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -46,7 +46,16 @@ namespace AsbCloudApp.Services.Subsystems /// /// /// - Task GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); + Task GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token); + /// + /// Получение статистики по наработке подсистем по активным скважинам + /// + /// + /// + /// + /// + /// + Task?> GetStatByActiveWell(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token); } #nullable disable } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index b42e8835..9aa1dd77 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -187,7 +187,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems private async Task> GetSubsystemOperationTimeAll(int idCompany, CancellationToken token) - { + { var listWell = await wellService.GetWellsByCompanyAsync(idCompany, token); var active = listWell.Where(w => w.IdState == 1); return active; diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index e700d470..55b3b26b 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -52,10 +52,15 @@ namespace AsbCloudWebApi.Controllers.Subsystems [HttpGet("statByActiveWell")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] public async Task GetStatByWellAsync([FromQuery] DateTime? GtDate, DateTime? LtDate, CancellationToken token = default) - { + { + var idCompany = User.GetCompanyId(); + if (idCompany.HasValue) + { + var subsystemResult = await subsystemOperationTimeService.GetStatByActiveWell(idCompany.Value, GtDate, LtDate, token); + return Ok(subsystemResult); + } + return Forbid(); - var subsystemResult = await subsystemOperationTimeService.GetStatAsync(request, token); - return Ok(subsystemResult); } /// From 0e5ff57d0fff28c595870ee24183f867d5af186b Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Tue, 1 Nov 2022 23:01:50 +0500 Subject: [PATCH 03/17] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=BC=20=D1=81?= =?UTF-8?q?=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Subsystems/SubsystemActiveWellStatDto.cs | 2 +- .../SubsystemOperationTimeService.cs | 96 ++++++++++--------- 2 files changed, 53 insertions(+), 45 deletions(-) diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs index fd3c1054..f940bfb1 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs @@ -14,7 +14,7 @@ namespace AsbCloudApp.Data.Subsystems /// /// Наработки подсистем /// - public IEnumerable listSubsystemStat { get; set; } + public List listSubsystemStat { get; set; } } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 9aa1dd77..9add54b0 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -184,71 +184,79 @@ namespace AsbCloudInfrastructure.Services.Subsystems } - + //TODO: + // скорее всего нужно доработать wellService - первое это метод + // GetWellsByCompanyAsync (получать сразу активные скважины ,а не вытягивать сначала все) + // второе - метод GetOperationsAsync - по умолчанию если не указан + // ИД скважины он заполняется как 0 , в нашем случае нужно получить опред операции по ВСЕМ + // скважинам + private async Task> GetSubsystemOperationTimeAll(int idCompany, CancellationToken token) - { + { var listWell = await wellService.GetWellsByCompanyAsync(idCompany, token); var active = listWell.Where(w => w.IdState == 1); return active; } - - public async Task?> GetStatByActiveWell(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token) { var activeWell = await GetSubsystemOperationTimeAll(idCompany, token); - var telemetryIds = activeWell.Select(w => w.IdTelemetry); + var telemetryIds = activeWell.Select(w => w.IdTelemetry).Distinct(); var query = db.SubsystemOperationTimes - .Include(o => o.Subsystem) .Where(o => telemetryIds.Contains(o.IdTelemetry)) - .AsNoTracking(); - + .AsNoTracking(); + if (query is null) { return null; } DateTime today = DateTime.Today; - if (gtDate.HasValue) - { - query = query.Where(o => o.DateEnd >= gtDate); - } - else + if (!gtDate.HasValue) { - gtDate = today; - query = query.Where(o => o.DateEnd == gtDate); - } + gtDate = today; + } + query = query.Where(o => o.DateStart >= gtDate.Value.ToUniversalTime()); - if (ltDate.HasValue) - { - query = query.Where(o => o.DateStart <= ltDate); - } - else + if (!ltDate.HasValue) { ltDate = today.AddDays(-1); - query = query.Where(o => o.DateStart == ltDate ); - } - var detectedOperationsRequest = new DetectedOperationRequest() - { - IdsCategories = new List() { - 1,3 - }, - LtDate = ltDate, - GtDate = gtDate, - }; - var detectedOperations = await detectedOperationService.GetOperationsAsync(detectedOperationsRequest, token); - var groupData = query.GroupBy(g => g.IdTelemetry); - var result = new List(); - foreach (var group in groupData) - { - var wellStat = new SubsystemActiveWellStatDto(); - wellStat.IdWell = activeWell.Where(w => w.IdTelemetry == group.Key).Select(w => w.Id).FirstOrDefault(); - var groupSubsystem = (IEnumerable>)group.GroupBy(g => g.IdSubsystem); - var detectedOperationsById = detectedOperations.Where(d => d.IdWell == wellStat.IdWell).ToList(); - var depthInterval = GetDepthInterval(detectedOperationsById); - wellStat.listSubsystemStat = CalcStat((IEnumerable)groupSubsystem, depthInterval); - result.Add(wellStat); - } + } + query = query.Where(o => o.DateEnd <= ltDate.Value.ToUniversalTime()); + var result = new List(); + var subsystemsOperationTime = query.ToList(); + var groupingSubsystemsOperationTime = subsystemsOperationTime.GroupBy(g => g.IdTelemetry).ToList(); + foreach (var group in groupingSubsystemsOperationTime) + { + var idWell = activeWell.Where(w => w.IdTelemetry == group.Key).Select(w => w.Id).FirstOrDefault(); + var wellStat = new SubsystemActiveWellStatDto() + { + IdWell = idWell, + listSubsystemStat = new List() + + }; + var detectedOperationsRequest = new DetectedOperationRequest() + { + IdWell = idWell, + IdsCategories = new List() {1,3}, + LtDate = ltDate, + GtDate = gtDate, + }; + var detectedOperations = await detectedOperationService.GetOperationsAsync(detectedOperationsRequest, token); + if (detectedOperations is not null && detectedOperations.Any()) + { + var depthInterval = GetDepthInterval(detectedOperations); + var groupSubsystem = group.GroupBy(g => g.IdSubsystem).ToList(); + + foreach (var subsystem in groupSubsystem) + { + var dto = subsystem.Select(s => s.Adapt()); + var subsystemStat = CalcStat(dto, depthInterval); + wellStat.listSubsystemStat.AddRange(subsystemStat); + } + result.Add(wellStat); + } + } return result; } From 0880c3b75c197b202079e768e69bf009cb43926b Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 2 Nov 2022 15:49:07 +0500 Subject: [PATCH 04/17] =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D1=8C=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D0=BA=D0=BE=D0=B4=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Subsystems/SubsystemActiveWellStatDto.cs | 2 +- .../SubsystemOperationTimeService.cs | 29 ++++++++++--------- .../SubsystemOperationTimeController.cs | 17 ++++++----- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs index f940bfb1..fd3c1054 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs @@ -14,7 +14,7 @@ namespace AsbCloudApp.Data.Subsystems /// /// Наработки подсистем /// - public List listSubsystemStat { get; set; } + public IEnumerable listSubsystemStat { get; set; } } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 9add54b0..65c68188 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -192,24 +192,21 @@ namespace AsbCloudInfrastructure.Services.Subsystems // скважинам - private async Task> GetSubsystemOperationTimeAll(int idCompany, CancellationToken token) + private async Task> GetActiveWellByCompany(int idCompany, CancellationToken token) { var listWell = await wellService.GetWellsByCompanyAsync(idCompany, token); var active = listWell.Where(w => w.IdState == 1); return active; - } + } + + public async Task?> GetStatByActiveWell(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token) { - var activeWell = await GetSubsystemOperationTimeAll(idCompany, token); + var activeWell = await GetActiveWellByCompany(idCompany, token); var telemetryIds = activeWell.Select(w => w.IdTelemetry).Distinct(); var query = db.SubsystemOperationTimes .Where(o => telemetryIds.Contains(o.IdTelemetry)) - .AsNoTracking(); - - if (query is null) - { - return null; - } + .AsNoTracking(); DateTime today = DateTime.Today; if (!gtDate.HasValue) { @@ -222,9 +219,13 @@ namespace AsbCloudInfrastructure.Services.Subsystems ltDate = today.AddDays(-1); } query = query.Where(o => o.DateEnd <= ltDate.Value.ToUniversalTime()); - var result = new List(); - var subsystemsOperationTime = query.ToList(); - var groupingSubsystemsOperationTime = subsystemsOperationTime.GroupBy(g => g.IdTelemetry).ToList(); + var result = new List(); + if (query is null) + { + return null; + } + var subsystemsOperationTime = await query.ToListAsync(token); + var groupingSubsystemsOperationTime = subsystemsOperationTime.GroupBy(g => g.IdTelemetry); foreach (var group in groupingSubsystemsOperationTime) { @@ -246,13 +247,13 @@ namespace AsbCloudInfrastructure.Services.Subsystems if (detectedOperations is not null && detectedOperations.Any()) { var depthInterval = GetDepthInterval(detectedOperations); - var groupSubsystem = group.GroupBy(g => g.IdSubsystem).ToList(); + var groupSubsystem = group.GroupBy(g => g.IdSubsystem); foreach (var subsystem in groupSubsystem) { var dto = subsystem.Select(s => s.Adapt()); var subsystemStat = CalcStat(dto, depthInterval); - wellStat.listSubsystemStat.AddRange(subsystemStat); + wellStat.listSubsystemStat.Concat(subsystemStat); } result.Add(wellStat); } diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index 55b3b26b..7790472f 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -49,18 +49,19 @@ namespace AsbCloudWebApi.Controllers.Subsystems /// /// получить статистику по активным скважинам /// + /// Больше или равно дате + /// Меньше или равно дате + /// Токен + /// [HttpGet("statByActiveWell")] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetStatByWellAsync([FromQuery] DateTime? GtDate, DateTime? LtDate, CancellationToken token = default) + public async Task GetStatByWellAsync(DateTime? GtDate, DateTime? LtDate, CancellationToken token = default) { var idCompany = User.GetCompanyId(); - if (idCompany.HasValue) - { - var subsystemResult = await subsystemOperationTimeService.GetStatByActiveWell(idCompany.Value, GtDate, LtDate, token); - return Ok(subsystemResult); - } - return Forbid(); - + if (!idCompany.HasValue) + return Forbid(); + var subsystemResult = await subsystemOperationTimeService.GetStatByActiveWell(idCompany.Value, GtDate, LtDate, token); + return Ok(subsystemResult); } /// From 494fd2a1073807daf54698a441c0ec7bfcfedfab Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 3 Nov 2022 00:01:44 +0500 Subject: [PATCH 05/17] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Subsystems/SubsystemActiveWellStatDto.cs | 4 +- .../SubsystemOperationTimeService.cs | 89 +++++++++++-------- 2 files changed, 56 insertions(+), 37 deletions(-) diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs index fd3c1054..a06f1064 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs @@ -8,9 +8,9 @@ namespace AsbCloudApp.Data.Subsystems public class SubsystemActiveWellStatDto { /// - /// Идентификатор скважины + /// Активная скважина /// - public int IdWell { get; set; } + public WellDto ActiveWell { get; set; } /// /// Наработки подсистем /// diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 65c68188..2852a52e 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -201,24 +201,40 @@ namespace AsbCloudInfrastructure.Services.Subsystems public async Task?> GetStatByActiveWell(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token) - { + { var activeWell = await GetActiveWellByCompany(idCompany, token); var telemetryIds = activeWell.Select(w => w.IdTelemetry).Distinct(); + var firstWell = activeWell.FirstOrDefault(); + if (firstWell == null) + return null; + var _well = wellService.GetOrDefault(firstWell.Id); + if (_well is null || _well.Timezone is null) + return null; + DateTimeOffset ExtractDate(DateTime dateTime) + { + var dateTimeOffset = dateTime.ToUtcDateTimeOffset(_well!.Timezone.Hours); + var date = new DateTimeOffset(dateTimeOffset.Year, dateTimeOffset.Month, dateTimeOffset.Day, 0, 0, 0, TimeSpan.Zero); + return date; + } + var query = db.SubsystemOperationTimes .Where(o => telemetryIds.Contains(o.IdTelemetry)) - .AsNoTracking(); - DateTime today = DateTime.Today; - if (!gtDate.HasValue) + .AsNoTracking(); + + if (gtDate is not null) { - gtDate = today; - } - query = query.Where(o => o.DateStart >= gtDate.Value.ToUniversalTime()); + var beginUTC = ExtractDate(gtDate.Value); + query = query.Where(d => d.DateStart >= beginUTC); + } + //query = query.Where(o => o.DateStart >= DateTime.Today.ToUtcDateTimeOffset(_well.Timezone.Hours)); - if (!ltDate.HasValue) + if (ltDate is not null) { - ltDate = today.AddDays(-1); - } - query = query.Where(o => o.DateEnd <= ltDate.Value.ToUniversalTime()); + var endUTC = ExtractDate(ltDate.Value); + query = query.Where(d => d.DateEnd <= endUTC); + } + //query = query.Where(o => o.DateEnd <= DateTime.Today.AddDays(-1).ToUtcDateTimeOffset(_well.Timezone.Hours)); + var result = new List(); if (query is null) { @@ -229,33 +245,36 @@ namespace AsbCloudInfrastructure.Services.Subsystems foreach (var group in groupingSubsystemsOperationTime) { - var idWell = activeWell.Where(w => w.IdTelemetry == group.Key).Select(w => w.Id).FirstOrDefault(); - var wellStat = new SubsystemActiveWellStatDto() + var well = activeWell.Where(w => w.IdTelemetry == group.Key).FirstOrDefault(); + if (well != null) { - IdWell = idWell, - listSubsystemStat = new List() - - }; - var detectedOperationsRequest = new DetectedOperationRequest() - { - IdWell = idWell, - IdsCategories = new List() {1,3}, - LtDate = ltDate, - GtDate = gtDate, - }; - var detectedOperations = await detectedOperationService.GetOperationsAsync(detectedOperationsRequest, token); - if (detectedOperations is not null && detectedOperations.Any()) - { - var depthInterval = GetDepthInterval(detectedOperations); - var groupSubsystem = group.GroupBy(g => g.IdSubsystem); - - foreach (var subsystem in groupSubsystem) + var wellStat = new SubsystemActiveWellStatDto() { - var dto = subsystem.Select(s => s.Adapt()); - var subsystemStat = CalcStat(dto, depthInterval); - wellStat.listSubsystemStat.Concat(subsystemStat); + ActiveWell = well, + listSubsystemStat = new List() + + }; + var detectedOperationsRequest = new DetectedOperationRequest() + { + IdWell = well.Id, + IdsCategories = new List() { 1, 3 }, + LtDate = ltDate, + GtDate = gtDate, + }; + var detectedOperations = await detectedOperationService.GetOperationsAsync(detectedOperationsRequest, token); + if (detectedOperations is not null && detectedOperations.Any()) + { + var depthInterval = GetDepthInterval(detectedOperations); + var groupSubsystem = group.GroupBy(g => g.IdSubsystem); + + foreach (var subsystem in groupSubsystem) + { + var dto = subsystem.Select(s => s.Adapt()); + var subsystemStat = CalcStat(dto, depthInterval); + wellStat.listSubsystemStat.Concat(subsystemStat); + } + result.Add(wellStat); } - result.Add(wellStat); } } return result; From bcdfb1933edb0a686d4768953a50ba7a0048cd10 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 3 Nov 2022 12:42:26 +0500 Subject: [PATCH 06/17] =?UTF-8?q?=D0=B2=D0=BD=D0=B5=D1=81=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=D0=BA=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B3=D0=BB=D0=B0=D1=81=D0=BD=D0=BE=20=D0=BA=D0=BE=D0=B4?= =?UTF-8?q?-=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Subsystems/SubsystemActiveWellStatDto.cs | 16 ++++++ .../Services/IDetectedOperationService.cs | 11 ++++ .../DetectedOperationService.cs | 19 +++++++ .../SubsystemOperationTimeService.cs | 50 ++++++++----------- 4 files changed, 66 insertions(+), 30 deletions(-) diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs index a06f1064..45bc7147 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs @@ -15,6 +15,22 @@ namespace AsbCloudApp.Data.Subsystems /// Наработки подсистем /// public IEnumerable listSubsystemStat { get; set; } + /// + /// Наработки подсистемы АКБ + /// + public SubsystemStatDto SubsystemAKB { get; set; } + /// + /// Наработки подсистемы МСЕ + /// + public SubsystemStatDto SubsystemMSE { get; set; } + /// + /// Наработки подсистемы СПИН + /// + public SubsystemStatDto SubsystemSpinMaster { get; set; } + /// + /// Наработки подсистемы ТОРК + /// + public SubsystemStatDto SubsystemTorqueMaster { get; set; } } } \ No newline at end of file diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs index 14a05665..7544f5c3 100644 --- a/AsbCloudApp/Services/IDetectedOperationService.cs +++ b/AsbCloudApp/Services/IDetectedOperationService.cs @@ -1,6 +1,7 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.DetectedOperation; using AsbCloudApp.Requests; +using System; using System.Collections.Generic; using System.IO; using System.Threading; @@ -39,6 +40,16 @@ namespace AsbCloudApp.Services /// Task?> GetOperationsAsync(DetectedOperationRequest request, CancellationToken token); + /// + /// Удалить операции + /// + /// + /// + /// + /// + /// кортеж - ид телеметрии, интервалы глубины забоя + Task?> GetDepthIntervalAllOperationsAsync(DateTime gtDate, DateTime ltDate, double wellTimezoneHours, CancellationToken token); + /// /// Удалить операции /// diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 3e8b3df2..3891af42 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -84,6 +84,25 @@ namespace AsbCloudInfrastructure.Services.DetectOperations return dtos; } + public async Task?> GetDepthIntervalAllOperationsAsync(DateTime gtDate, DateTime ltDate, double wellTimezoneHours ,CancellationToken token) + { + var query = db.Set() + .Include(o => o.OperationCategory) + .Where(o => o.DateStart >= gtDate.ToUtcDateTimeOffset(wellTimezoneHours)) + .Where(o => o.DateEnd <= ltDate.ToUtcDateTimeOffset(wellTimezoneHours)); + if (query is null) + return null; + var data = await query.ToListAsync(token); + var result = data.GroupBy(g => g.IdTelemetry) + .Select(g => + ( + g.Key, + g.Where(o => o.IdCategory == 1).Sum(o => o.DepthEnd - o.DepthStart), + g.Where(o => o.IdCategory == 3).Sum(o => o.DepthEnd - o.DepthStart) + )); + return result; + } + private static IEnumerable GetOperationsDrillersStat(IEnumerable operations) { var groups = operations.GroupBy(o => o.Driller); diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 2852a52e..05ba770e 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -183,15 +183,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems return depthIntervalSubsystem; } - - //TODO: - // скорее всего нужно доработать wellService - первое это метод - // GetWellsByCompanyAsync (получать сразу активные скважины ,а не вытягивать сначала все) - // второе - метод GetOperationsAsync - по умолчанию если не указан - // ИД скважины он заполняется как 0 , в нашем случае нужно получить опред операции по ВСЕМ - // скважинам - - + private async Task> GetActiveWellByCompany(int idCompany, CancellationToken token) { var listWell = await wellService.GetWellsByCompanyAsync(idCompany, token); @@ -207,39 +199,35 @@ namespace AsbCloudInfrastructure.Services.Subsystems var firstWell = activeWell.FirstOrDefault(); if (firstWell == null) return null; - var _well = wellService.GetOrDefault(firstWell.Id); - if (_well is null || _well.Timezone is null) - return null; - DateTimeOffset ExtractDate(DateTime dateTime) - { - var dateTimeOffset = dateTime.ToUtcDateTimeOffset(_well!.Timezone.Hours); - var date = new DateTimeOffset(dateTimeOffset.Year, dateTimeOffset.Month, dateTimeOffset.Day, 0, 0, 0, TimeSpan.Zero); - return date; - } var query = db.SubsystemOperationTimes .Where(o => telemetryIds.Contains(o.IdTelemetry)) - .AsNoTracking(); + .AsNoTracking(); - if (gtDate is not null) + if (gtDate is not null) { - var beginUTC = ExtractDate(gtDate.Value); + var beginUTC = gtDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours); query = query.Where(d => d.DateStart >= beginUTC); } - //query = query.Where(o => o.DateStart >= DateTime.Today.ToUtcDateTimeOffset(_well.Timezone.Hours)); - - if (ltDate is not null) + else { - var endUTC = ExtractDate(ltDate.Value); + var beginUTC = DateTime.Today.AddDays(-1).ToUtcDateTimeOffset(firstWell.Timezone.Hours); + query = query.Where(o => o.DateStart >= beginUTC ); + } + + if (ltDate is not null) + { + var endUTC = ltDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours); query = query.Where(d => d.DateEnd <= endUTC); } - //query = query.Where(o => o.DateEnd <= DateTime.Today.AddDays(-1).ToUtcDateTimeOffset(_well.Timezone.Hours)); + else + { + var endUTC = DateTime.Today.ToUtcDateTimeOffset(firstWell.Timezone.Hours); + query = query.Where(o => o.DateEnd <= endUTC); + } var result = new List(); - if (query is null) - { - return null; - } + var subsystemsOperationTime = await query.ToListAsync(token); var groupingSubsystemsOperationTime = subsystemsOperationTime.GroupBy(g => g.IdTelemetry); @@ -272,7 +260,9 @@ namespace AsbCloudInfrastructure.Services.Subsystems var dto = subsystem.Select(s => s.Adapt()); var subsystemStat = CalcStat(dto, depthInterval); wellStat.listSubsystemStat.Concat(subsystemStat); + //wellStat.Saub = subsystemStat.FirstOrDefault(s=>s.IdSubsystem == idSubsystemSaub) } + result.Add(wellStat); } } From a51208cb1d1a16fe612886969fc163ac9f517f43 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 3 Nov 2022 13:30:16 +0500 Subject: [PATCH 07/17] =?UTF-8?q?=D1=80=D0=B0=D1=81=D1=87=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B3=D0=BB=D1=83=D0=B1=D0=B8=D0=BD=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B0=D0=BC=20?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D0=B5=D0=BC=D0=B5=D1=82=D1=80=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=20=D0=B2=20=D0=BE?= =?UTF-8?q?=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=20DetectedOperations.=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=BC?= =?UTF-8?q?=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Subsystems/SubsystemActiveWellStatDto.cs | 14 ++-- .../Services/IDetectedOperationService.cs | 5 +- .../DetectedOperationService.cs | 33 +++++---- .../SubsystemOperationTimeService.cs | 67 +++++++------------ 4 files changed, 50 insertions(+), 69 deletions(-) diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs index 45bc7147..6cc3186c 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs @@ -10,27 +10,23 @@ namespace AsbCloudApp.Data.Subsystems /// /// Активная скважина /// - public WellDto ActiveWell { get; set; } - /// - /// Наработки подсистем - /// - public IEnumerable listSubsystemStat { get; set; } + public WellDto ActiveWell { get; set; } /// /// Наработки подсистемы АКБ /// - public SubsystemStatDto SubsystemAKB { get; set; } + public SubsystemStatDto? SubsystemAKB { get; set; } /// /// Наработки подсистемы МСЕ /// - public SubsystemStatDto SubsystemMSE { get; set; } + public SubsystemStatDto? SubsystemMSE { get; set; } /// /// Наработки подсистемы СПИН /// - public SubsystemStatDto SubsystemSpinMaster { get; set; } + public SubsystemStatDto? SubsystemSpinMaster { get; set; } /// /// Наработки подсистемы ТОРК /// - public SubsystemStatDto SubsystemTorqueMaster { get; set; } + public SubsystemStatDto? SubsystemTorqueMaster { get; set; } } } \ No newline at end of file diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs index 7544f5c3..278b375b 100644 --- a/AsbCloudApp/Services/IDetectedOperationService.cs +++ b/AsbCloudApp/Services/IDetectedOperationService.cs @@ -45,10 +45,9 @@ namespace AsbCloudApp.Services /// /// /// - /// - /// + /// /// кортеж - ид телеметрии, интервалы глубины забоя - Task?> GetDepthIntervalAllOperationsAsync(DateTime gtDate, DateTime ltDate, double wellTimezoneHours, CancellationToken token); + Task?> GetDepthIntervalAllOperationsAsync(DateTimeOffset gtDate, DateTimeOffset ltDate, CancellationToken token); /// /// Удалить операции diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 3891af42..bd11afe6 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -84,24 +84,28 @@ namespace AsbCloudInfrastructure.Services.DetectOperations return dtos; } - public async Task?> GetDepthIntervalAllOperationsAsync(DateTime gtDate, DateTime ltDate, double wellTimezoneHours ,CancellationToken token) + + + public async Task?> GetDepthIntervalAllOperationsAsync(DateTimeOffset gtDate, DateTimeOffset ltDate, CancellationToken token) { var query = db.Set() .Include(o => o.OperationCategory) - .Where(o => o.DateStart >= gtDate.ToUtcDateTimeOffset(wellTimezoneHours)) - .Where(o => o.DateEnd <= ltDate.ToUtcDateTimeOffset(wellTimezoneHours)); - if (query is null) - return null; + .Where(o => o.DateStart >= gtDate) + .Where(o => o.DateEnd <= ltDate); var data = await query.ToListAsync(token); - var result = data.GroupBy(g => g.IdTelemetry) - .Select(g => - ( - g.Key, - g.Where(o => o.IdCategory == 1).Sum(o => o.DepthEnd - o.DepthStart), - g.Where(o => o.IdCategory == 3).Sum(o => o.DepthEnd - o.DepthStart) - )); - return result; - } + if (data.Any()) + { + var result = data.GroupBy(g => g.IdTelemetry) + .Select(g => + ( + g.Key, + g.Where(o => o.IdCategory == 1).Sum(o => o.DepthEnd - o.DepthStart), + g.Where(o => o.IdCategory == 3).Sum(o => o.DepthEnd - o.DepthStart) + )); + return result; + } + return null; + } private static IEnumerable GetOperationsDrillersStat(IEnumerable operations) { @@ -320,6 +324,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations var exportService = new DetectedOperationExportService(db, wellService); return exportService.ExportAsync(idsWells, token); } + } #nullable disable } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 05ba770e..e462e7fa 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -25,6 +25,10 @@ namespace AsbCloudInfrastructure.Services.Subsystems private readonly IWellService wellService; private readonly ICrudService subsystemService; private readonly IDetectedOperationService detectedOperationService; + public const int IdSubsystemAKB = 1; + public const int IdSubsystemMSE = 2; + public const int IdSubsystemSpin = 65536; + public const int IdSubsystemTorque = 65537; public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService, ICrudService subsystemService, IDetectedOperationService detectedOperationService) { this.db = db; @@ -202,30 +206,19 @@ namespace AsbCloudInfrastructure.Services.Subsystems var query = db.SubsystemOperationTimes .Where(o => telemetryIds.Contains(o.IdTelemetry)) - .AsNoTracking(); - + .AsNoTracking(); + + var beginUTC = DateTime.Today.AddDays(-1).ToUtcDateTimeOffset(firstWell.Timezone.Hours); + var endUTC = DateTime.Today.ToUtcDateTimeOffset(firstWell.Timezone.Hours); if (gtDate is not null) { - var beginUTC = gtDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours); - query = query.Where(d => d.DateStart >= beginUTC); - } - else - { - var beginUTC = DateTime.Today.AddDays(-1).ToUtcDateTimeOffset(firstWell.Timezone.Hours); - query = query.Where(o => o.DateStart >= beginUTC ); - } - - if (ltDate is not null) - { - var endUTC = ltDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours); - query = query.Where(d => d.DateEnd <= endUTC); - } - else - { - var endUTC = DateTime.Today.ToUtcDateTimeOffset(firstWell.Timezone.Hours); - query = query.Where(o => o.DateEnd <= endUTC); + beginUTC = gtDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours); } + query = query.Where(d => d.DateStart >= beginUTC); + query = query.Where(o => o.DateEnd <= endUTC); + + var depthIntervals = await detectedOperationService.GetDepthIntervalAllOperationsAsync(beginUTC, endUTC, token); var result = new List(); var subsystemsOperationTime = await query.ToListAsync(token); @@ -238,33 +231,21 @@ namespace AsbCloudInfrastructure.Services.Subsystems { var wellStat = new SubsystemActiveWellStatDto() { - ActiveWell = well, - listSubsystemStat = new List() - + ActiveWell = well }; - var detectedOperationsRequest = new DetectedOperationRequest() + if (depthIntervals is not null) { - IdWell = well.Id, - IdsCategories = new List() { 1, 3 }, - LtDate = ltDate, - GtDate = gtDate, - }; - var detectedOperations = await detectedOperationService.GetOperationsAsync(detectedOperationsRequest, token); - if (detectedOperations is not null && detectedOperations.Any()) - { - var depthInterval = GetDepthInterval(detectedOperations); - var groupSubsystem = group.GroupBy(g => g.IdSubsystem); - - foreach (var subsystem in groupSubsystem) - { - var dto = subsystem.Select(s => s.Adapt()); - var subsystemStat = CalcStat(dto, depthInterval); - wellStat.listSubsystemStat.Concat(subsystemStat); - //wellStat.Saub = subsystemStat.FirstOrDefault(s=>s.IdSubsystem == idSubsystemSaub) - } - + var depthInterval = depthIntervals.Where(o => o.Item1 == well.IdTelemetry).Select(o => (o.Item2, o.Item3)).FirstOrDefault(); + //var groupSubsystem = group.GroupBy(g => g.IdSubsystem); + var dto = group.Select(s => s.Adapt()); + var subsystemStat = CalcStat(dto, depthInterval); + wellStat.SubsystemAKB = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemAKB); + wellStat.SubsystemMSE = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemMSE); + wellStat.SubsystemSpinMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemSpin); + wellStat.SubsystemTorqueMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemTorque); result.Add(wellStat); } + } } return result; From f3e5e27511c081087e48a51ddf25b0cc56caa952 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 3 Nov 2022 13:36:46 +0500 Subject: [PATCH 08/17] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=B2=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B8=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs index 6cc3186c..6ca35fcf 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs @@ -14,19 +14,19 @@ namespace AsbCloudApp.Data.Subsystems /// /// Наработки подсистемы АКБ /// - public SubsystemStatDto? SubsystemAKB { get; set; } + public SubsystemStatDto SubsystemAKB { get; set; } /// /// Наработки подсистемы МСЕ /// - public SubsystemStatDto? SubsystemMSE { get; set; } + public SubsystemStatDto SubsystemMSE { get; set; } /// /// Наработки подсистемы СПИН /// - public SubsystemStatDto? SubsystemSpinMaster { get; set; } + public SubsystemStatDto SubsystemSpinMaster { get; set; } /// /// Наработки подсистемы ТОРК /// - public SubsystemStatDto? SubsystemTorqueMaster { get; set; } + public SubsystemStatDto SubsystemTorqueMaster { get; set; } } } \ No newline at end of file From f10201d3ef9c18b0e22d10ac01f9c4f6bef306ce Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 3 Nov 2022 14:02:56 +0500 Subject: [PATCH 09/17] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8?= =?UTF-8?q?=D1=85=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SubsystemOperationTimeService.cs | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index e462e7fa..4601ddcf 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -170,17 +170,17 @@ namespace AsbCloudInfrastructure.Services.Subsystems { var depthIntervalSubsystem = 0d; //AKB - MSE - if (idSubsystem == 1 | idSubsystem == 2) + if (idSubsystem == IdSubsystemAKB | idSubsystem == IdSubsystemMSE) { depthIntervalSubsystem = depthInterval.depthIntervalRotor + depthInterval.depthIntervalSlide; } //Spin - if (idSubsystem == 65536) + if (idSubsystem == IdSubsystemSpin) { depthIntervalSubsystem = depthInterval.depthIntervalSlide; } //Torque - if (idSubsystem == 65537) + if (idSubsystem == IdSubsystemTorque) { depthIntervalSubsystem = depthInterval.depthIntervalRotor; } @@ -215,15 +215,12 @@ namespace AsbCloudInfrastructure.Services.Subsystems beginUTC = gtDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours); } query = query.Where(d => d.DateStart >= beginUTC); - query = query.Where(o => o.DateEnd <= endUTC); - + query = query.Where(o => o.DateEnd <= endUTC); var depthIntervals = await detectedOperationService.GetDepthIntervalAllOperationsAsync(beginUTC, endUTC, token); - var result = new List(); - + var result = new List(); var subsystemsOperationTime = await query.ToListAsync(token); - var groupingSubsystemsOperationTime = subsystemsOperationTime.GroupBy(g => g.IdTelemetry); - + var groupingSubsystemsOperationTime = subsystemsOperationTime.GroupBy(g => g.IdTelemetry); foreach (var group in groupingSubsystemsOperationTime) { var well = activeWell.Where(w => w.IdTelemetry == group.Key).FirstOrDefault(); @@ -235,8 +232,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems }; if (depthIntervals is not null) { - var depthInterval = depthIntervals.Where(o => o.Item1 == well.IdTelemetry).Select(o => (o.Item2, o.Item3)).FirstOrDefault(); - //var groupSubsystem = group.GroupBy(g => g.IdSubsystem); + var depthInterval = depthIntervals.Where(o => o.Item1 == well.IdTelemetry).Select(o => (o.Item2, o.Item3)).FirstOrDefault(); var dto = group.Select(s => s.Adapt()); var subsystemStat = CalcStat(dto, depthInterval); wellStat.SubsystemAKB = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemAKB); @@ -245,14 +241,11 @@ namespace AsbCloudInfrastructure.Services.Subsystems wellStat.SubsystemTorqueMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemTorque); result.Add(wellStat); } - } } return result; } - - /// public async Task GetDateRangeOperationTimeAsync(SubsystemOperationTimeRequest request, CancellationToken token) { From 9965f9daa877a68363366b6e000871d2378eab1d Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 3 Nov 2022 15:29:02 +0500 Subject: [PATCH 10/17] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B8=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Services/IDetectedOperationService.cs | 2 +- .../Services/Subsystems/SubsystemOperationTimeService.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs index 278b375b..14bfbb8a 100644 --- a/AsbCloudApp/Services/IDetectedOperationService.cs +++ b/AsbCloudApp/Services/IDetectedOperationService.cs @@ -41,7 +41,7 @@ namespace AsbCloudApp.Services Task?> GetOperationsAsync(DetectedOperationRequest request, CancellationToken token); /// - /// Удалить операции + /// Получить интервалы глубин по всем скважинам /// /// /// diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 4601ddcf..ff7a3c23 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -188,7 +188,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems } - private async Task> GetActiveWellByCompany(int idCompany, CancellationToken token) + private async Task> GetActiveWellsByCompany(int idCompany, CancellationToken token) { var listWell = await wellService.GetWellsByCompanyAsync(idCompany, token); var active = listWell.Where(w => w.IdState == 1); @@ -196,7 +196,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems } - public async Task?> GetStatByActiveWell(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token) + public async Task?> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token) { var activeWell = await GetActiveWellByCompany(idCompany, token); var telemetryIds = activeWell.Select(w => w.IdTelemetry).Distinct(); From 087a9e26fa48ccadeafcf6ec17167776255747d1 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 3 Nov 2022 15:32:40 +0500 Subject: [PATCH 11/17] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0?= =?UTF-8?q?=D1=82=D0=BA=D0=B8=20=D0=BD=D0=B5=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D1=83=D0=B5=D0=BC=D0=BE=D0=B3=D0=BE=20=D0=B0=D1=80?= =?UTF-8?q?=D0=B3=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Subsystems/SubsystemOperationTimeService.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index ff7a3c23..103adbc8 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -214,6 +214,10 @@ namespace AsbCloudInfrastructure.Services.Subsystems { beginUTC = gtDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours); } + if (ltDate is not null) + { + beginUTC = ltDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours); + } query = query.Where(d => d.DateStart >= beginUTC); query = query.Where(o => o.DateEnd <= endUTC); From f8502b68a126fa79a06aab2d875acfe7238df0d9 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 3 Nov 2022 15:57:45 +0500 Subject: [PATCH 12/17] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=B0?= =?UTF-8?q?=20=D0=B2=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B5=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=B0=D0=BB=D0=BE=D0=B2=20=D0=B3=D0=BB=D1=83?= =?UTF-8?q?=D0=B1=D0=B8=D0=BD,=20=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/IDetectedOperationService.cs | 5 ++-- .../ISubsystemOperationTimeService.cs | 2 +- .../DetectedOperationService.cs | 25 +++++++++++-------- .../SubsystemOperationTimeService.cs | 2 +- .../SubsystemOperationTimeController.cs | 2 +- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs index 14bfbb8a..7076b472 100644 --- a/AsbCloudApp/Services/IDetectedOperationService.cs +++ b/AsbCloudApp/Services/IDetectedOperationService.cs @@ -43,11 +43,12 @@ namespace AsbCloudApp.Services /// /// Получить интервалы глубин по всем скважинам /// + /// список ИД телеметрий активных скважин /// /// /// - /// кортеж - ид телеметрии, интервалы глубины забоя - Task?> GetDepthIntervalAllOperationsAsync(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 88fd3cf4..b4032552 100644 --- a/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs +++ b/AsbCloudApp/Services/Subsystems/ISubsystemOperationTimeService.cs @@ -55,7 +55,7 @@ namespace AsbCloudApp.Services.Subsystems /// /// /// - Task?> GetStatByActiveWell(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 bd11afe6..f163d4c1 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -82,25 +82,30 @@ namespace AsbCloudInfrastructure.Services.DetectOperations var schedules = await scheduleService.GetByIdWellAsync(request.IdWell, token); var dtos = data.Select(o => Convert(o, well, operationValues, schedules)); return dtos; - } + } - - - public async Task?> GetDepthIntervalAllOperationsAsync(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) .Where(o => o.DateStart >= gtDate) - .Where(o => o.DateEnd <= ltDate); + .Where(o => o.DateEnd <= ltDate) + .Where(o => telemetryIds.Contains(o.IdTelemetry)) + .GroupBy(g => g.IdTelemetry) + .Select(g => new + { + IdTelemetry = g.Key, + RotorDepthInterval = g.Where(o => o.IdCategory == 1).Sum(o => o.DepthEnd - o.DepthStart), + SlideDepthInterval = g.Where(o => o.IdCategory == 3).Sum(o => o.DepthEnd - o.DepthStart) + }); var data = await query.ToListAsync(token); if (data.Any()) { - var result = data.GroupBy(g => g.IdTelemetry) - .Select(g => + var result = data.Select(g => ( - g.Key, - g.Where(o => o.IdCategory == 1).Sum(o => o.DepthEnd - o.DepthStart), - g.Where(o => o.IdCategory == 3).Sum(o => o.DepthEnd - o.DepthStart) + g.IdTelemetry, + g.RotorDepthInterval, + g.SlideDepthInterval )); return result; } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 103adbc8..2ee9ea00 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -198,7 +198,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems public async Task?> GetStatByActiveWells(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token) { - var activeWell = await GetActiveWellByCompany(idCompany, token); + var activeWell = await GetActiveWellsByCompany(idCompany, token); var telemetryIds = activeWell.Select(w => w.IdTelemetry).Distinct(); var firstWell = activeWell.FirstOrDefault(); if (firstWell == null) diff --git a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs index 7790472f..0d832667 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/SubsystemOperationTimeController.cs @@ -60,7 +60,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems var idCompany = User.GetCompanyId(); if (!idCompany.HasValue) return Forbid(); - var subsystemResult = await subsystemOperationTimeService.GetStatByActiveWell(idCompany.Value, GtDate, LtDate, token); + var subsystemResult = await subsystemOperationTimeService.GetStatByActiveWells(idCompany.Value, GtDate, LtDate, token); return Ok(subsystemResult); } From e8225a375e6a8876c5130c053d581a66869a32be Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 3 Nov 2022 16:03:20 +0500 Subject: [PATCH 13/17] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D1=85=20=D0=BE=D0=BF=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Services/IDetectedOperationService.cs | 2 +- .../Services/DetectOperations/DetectedOperationService.cs | 2 +- .../Services/Subsystems/SubsystemOperationTimeService.cs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs index 7076b472..cb14cc9c 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/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index f163d4c1..f5816b1b 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) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 2ee9ea00..7a8a32fe 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -216,12 +216,12 @@ namespace AsbCloudInfrastructure.Services.Subsystems } if (ltDate is not null) { - beginUTC = ltDate.Value.ToUtcDateTimeOffset(firstWell.Timezone.Hours); + 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(beginUTC, endUTC, token); + var depthIntervals = await detectedOperationService.GetDepthIntervalAllOperationsAsync(telemetryIds, beginUTC, endUTC, token); var result = new List(); var subsystemsOperationTime = await query.ToListAsync(token); var groupingSubsystemsOperationTime = subsystemsOperationTime.GroupBy(g => g.IdTelemetry); From f1dea8f10ff29c59f165a851d6595e79b331ea9c Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 3 Nov 2022 17:13:39 +0500 Subject: [PATCH 14/17] =?UTF-8?q?=D0=BE=D1=82=D1=81=D1=83=D1=82=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B8=D0=B5=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D0=BA=D0=B8=20=D0=B7=D0=B0=20=D1=81=D0=BA=D0=B2?= =?UTF-8?q?=D0=B0=D0=B6=D0=B8=D0=BD=D1=83=20=D0=B1=D1=83=D0=B4=D0=B5=D1=82?= =?UTF-8?q?=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20=D0=BF=D1=83=D1=81=D1=82=D1=83=D1=8E=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Subsystems/SubsystemActiveWellStatDto.cs | 12 +++--- .../DetectedOperationService.cs | 6 +-- .../SubsystemOperationTimeService.cs | 39 +++++++++---------- 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs index 6ca35fcf..bdcdd301 100644 --- a/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs +++ b/AsbCloudApp/Data/Subsystems/SubsystemActiveWellStatDto.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; - namespace AsbCloudApp.Data.Subsystems { +#nullable enable /// /// Статистика наработки подсистем по активным скважинам /// @@ -14,19 +14,19 @@ namespace AsbCloudApp.Data.Subsystems /// /// Наработки подсистемы АКБ /// - public SubsystemStatDto SubsystemAKB { get; set; } + public SubsystemStatDto? SubsystemAKB { get; set; } /// /// Наработки подсистемы МСЕ /// - public SubsystemStatDto SubsystemMSE { get; set; } + public SubsystemStatDto? SubsystemMSE { get; set; } /// /// Наработки подсистемы СПИН /// - public SubsystemStatDto SubsystemSpinMaster { get; set; } + public SubsystemStatDto? SubsystemSpinMaster { get; set; } /// /// Наработки подсистемы ТОРК /// - public SubsystemStatDto SubsystemTorqueMaster { get; set; } - + public SubsystemStatDto? SubsystemTorqueMaster { get; set; } } +#nullable disable } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index f5816b1b..35970bca 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -18,7 +18,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations #nullable enable public class DetectedOperationService : IDetectedOperationService { - public const int IdOperationRotor = 1; + public const int IdOperationRotor = 2; public const int IdOperationSlide = 3; public const int IdOperationSlipsTime = 14; public const int idOperationFlushing = 22; @@ -95,8 +95,8 @@ namespace AsbCloudInfrastructure.Services.DetectOperations .Select(g => new { IdTelemetry = g.Key, - RotorDepthInterval = g.Where(o => o.IdCategory == 1).Sum(o => o.DepthEnd - o.DepthStart), - SlideDepthInterval = g.Where(o => o.IdCategory == 3).Sum(o => o.DepthEnd - o.DepthStart) + 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()) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 7a8a32fe..f155c8af 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -202,7 +202,11 @@ namespace AsbCloudInfrastructure.Services.Subsystems var telemetryIds = activeWell.Select(w => w.IdTelemetry).Distinct(); var firstWell = activeWell.FirstOrDefault(); if (firstWell == null) - return null; + return Enumerable.Empty(); + var result =activeWell.Select( t => new SubsystemActiveWellStatDto + { + ActiveWell = t + }); var query = db.SubsystemOperationTimes .Where(o => telemetryIds.Contains(o.IdTelemetry)) @@ -221,30 +225,25 @@ namespace AsbCloudInfrastructure.Services.Subsystems query = query.Where(d => d.DateStart >= beginUTC); query = query.Where(o => o.DateEnd <= endUTC); - var depthIntervals = await detectedOperationService.GetDepthIntervalAllOperationsAsync(telemetryIds, beginUTC, endUTC, token); - var result = new List(); + 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 = activeWell.Where(w => w.IdTelemetry == group.Key).FirstOrDefault(); - if (well != null) + var well = result.Where(w => w.ActiveWell.IdTelemetry == group.Key).FirstOrDefault(); + if (well is not null) { - var wellStat = new SubsystemActiveWellStatDto() - { - ActiveWell = well - }; - if (depthIntervals is not null) - { - var depthInterval = depthIntervals.Where(o => o.Item1 == well.IdTelemetry).Select(o => (o.Item2, o.Item3)).FirstOrDefault(); - var dto = group.Select(s => s.Adapt()); - var subsystemStat = CalcStat(dto, depthInterval); - wellStat.SubsystemAKB = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemAKB); - wellStat.SubsystemMSE = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemMSE); - wellStat.SubsystemSpinMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemSpin); - wellStat.SubsystemTorqueMaster = subsystemStat.FirstOrDefault(s => s.IdSubsystem == IdSubsystemTorque); - result.Add(wellStat); - } + 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); } } return result; From 5f9b4594fee6ef200425ccd1bf7d7937b0aa53f7 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 3 Nov 2022 17:46:55 +0500 Subject: [PATCH 15/17] =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D0=B5=D1=87=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=B2=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Subsystems/SubsystemOperationTimeService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index f155c8af..3cf1fb28 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -206,7 +206,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems var result =activeWell.Select( t => new SubsystemActiveWellStatDto { ActiveWell = t - }); + }).ToList(); var query = db.SubsystemOperationTimes .Where(o => telemetryIds.Contains(o.IdTelemetry)) From 266aa21b7c29b3da3f57c7099eb34a8a7a3f61de 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 16/17] #7554801 Printify --- .../Subsystems/SubsystemActiveWellStatDto.cs | 2 +- .../Services/IDetectedOperationService.cs | 2 +- .../ISubsystemOperationTimeService.cs | 2 +- .../DetectedOperationService.cs | 22 ++-- .../SubsystemOperationTimeService.cs | 111 ++++++++++-------- 5 files changed, 72 insertions(+), 67 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; } 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 17/17] #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();