From 12f6fda7b2c79bebb2d266f40727333640b38a76 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 28 Mar 2024 12:12:15 +0500 Subject: [PATCH 1/5] =?UTF-8?q?Fix=20ProcessMapReportDrillingService.CalcB?= =?UTF-8?q?yIntervals()=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B8=20GetSection()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/WellOperationRepository.cs | 14 +++++---- .../Report/ProcessMapReportDrillingService.cs | 30 ++++++++++++++++--- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 329d2502..acdb1ef0 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -430,7 +430,14 @@ public class WellOperationRepository : IWellOperationRepository .Where(subOp => subOp.IdType == 1) .Where(subOp => WellOperationCategory.NonProductiveTimeSubIds.Contains(subOp.IdCategory)); - // TODO: Вынести query.Select из метода BuildQuery + var firstOperations = db.Set() + .Where(o => o.IdWell == request.IdWell) + .GroupBy(o => o.IdType) + .Select(group => new { + idType = group.Key, + Date = group.Min(o => o.DateStart), + }).ToDictionary(e => e.idType, e => e.Date); + var dtos = query.Select(o => new WellOperationDto { Id = o.Id, @@ -455,10 +462,7 @@ public class WellOperationRepository : IWellOperationRepository .Select(subOp => subOp.DurationHours) .Sum(), - Day = (o.DateStart - currentWellOperations - .Where(subOp => subOp.IdType == o.IdType) - .Where(subOp => subOp.DateStart <= o.DateStart) - .Min(subOp => subOp.DateStart)) + Day = (o.DateStart - firstOperations[o.IdType]) .TotalDays, IdUser = o.IdUser, LastUpdateDate = o.LastUpdateDate, diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs index 5ee331d4..dae4f39b 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportDrillingService.cs @@ -64,6 +64,11 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService }; var wellOperations = await wellOperationRepository .GetAsync(requestWellOperationFact, token); + + var orderedWellOperations = wellOperations + .OrderBy(operation => operation.DateStart) + .ToArray(); + if (!wellOperations.Any()) return Enumerable.Empty(); @@ -76,13 +81,14 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService return Enumerable.Empty(); var wellOperationCategories = wellOperationCategoryRepository.Get(false); + var wellSectionTypes = wellOperationRepository.GetSectionTypes(); var result = CalcByIntervals( request, processMapPlanWellDrillings, - dataSaubStats, - wellOperations, + dataSaubStats, + orderedWellOperations, wellOperationCategories, wellSectionTypes); @@ -101,8 +107,23 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService var list = new List(); var firstElemInInterval = dataSaubStats[0]; - int GetSection(DataSaubStatDto data) - => wellOperations.MinBy(o => data.DateStart - o.DateStart)!.IdWellSectionType; + var orderedWellOperations = wellOperations + .OrderBy(o => o.DateStart) + .ToArray(); + + var lastFoundIndex = 1; + + int GetSection(DataSaubStatDto data) + { + if(lastFoundIndex < orderedWellOperations.Length - 1) + { + lastFoundIndex = Array.FindIndex(orderedWellOperations, lastFoundIndex, o => o.DateStart > data.DateStart) - 1; + lastFoundIndex = lastFoundIndex < 0 ? orderedWellOperations.Length - 1 : lastFoundIndex; + } + + var operation = orderedWellOperations[lastFoundIndex]; + return operation.IdWellSectionType; + } ProcessMapPlanDrillingDto? GetProcessMapPlan(int idWellSectionType, DataSaubStatDto data) => processMapPlanWellDrillings @@ -145,6 +166,7 @@ public class ProcessMapReportDrillingService : IProcessMapReportDrillingService .First(); var elem = CalcStat(processMapPlan, span, wellOperationCategoryName, wellSectionType); + if (elem is not null) list.Add(elem); } From dd934bb1c53bfbf5af750e655f27bf925b12b259 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 28 Mar 2024 15:15:52 +0500 Subject: [PATCH 2/5] Add todo --- .../Services/DetectOperations/DetectedOperationService.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 16eea6d7..63391899 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -142,6 +142,7 @@ public class DetectedOperationService : IDetectedOperationService const int minOperationLength = 5; const int maxDetectorsInterpolationFrameLength = 30; const int gap = maxDetectorsInterpolationFrameLength + minOperationLength; + var timeIncrement = TimeSpan.FromSeconds(1); while (true) { @@ -156,7 +157,7 @@ public class DetectedOperationService : IDetectedOperationService .Where(t => t.BlockPosition >= 0) .Select(t => new DetectableTelemetry { - DateTime = t.DateTime, + DateTime = t.DateTime,//TODO: <-- вот тут ошибка при присвоении DateTime с kind unspecified в DateTimeOffset времени назначается локальный часовой пояс. IdUser = t.IdUser, Mode = t.Mode, WellDepth = t.WellDepth, @@ -191,7 +192,9 @@ public class DetectedOperationService : IDetectedOperationService positionBegin += 1; } - beginDate = isDetected ? lastDetectedOperation!.DateEnd : detectableTelemetries[positionEnd].DateTime; + beginDate = isDetected + ? lastDetectedOperation!.DateEnd + : detectableTelemetries[positionEnd].DateTime; } return detectedOperations; From 38521940a68abd4f361feb585c38cebe5072e7d2 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 29 Mar 2024 08:49:26 +0500 Subject: [PATCH 3/5] DetectedOperationService temporary fix timezone problem --- .../DetectOperations/DetectedOperationService.cs | 4 +++- .../Services/SAUB/TelemetryDataSaubService.cs | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 63391899..c6bca518 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AsbCloudInfrastructure.Services.DetectOperations.Detectors; +using AsbCloudInfrastructure.Services.SAUB; namespace AsbCloudInfrastructure.Services.DetectOperations; @@ -142,7 +143,7 @@ public class DetectedOperationService : IDetectedOperationService const int minOperationLength = 5; const int maxDetectorsInterpolationFrameLength = 30; const int gap = maxDetectorsInterpolationFrameLength + minOperationLength; - var timeIncrement = TimeSpan.FromSeconds(1); + //var timezone = telemetryService.GetTimezone(idTelemetry); while (true) { @@ -155,6 +156,7 @@ public class DetectedOperationService : IDetectedOperationService var detectableTelemetries = (await telemetryDataSaubService.GetByTelemetryAsync(idTelemetry, request, token)) .Where(t => t.BlockPosition >= 0) + .Select(t => t as TelemetryNewDataSaubDto) .Select(t => new DetectableTelemetry { DateTime = t.DateTime,//TODO: <-- вот тут ошибка при присвоении DateTime с kind unspecified в DateTimeOffset времени назначается локальный часовой пояс. diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs index 92db8e4d..e6fb372b 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs @@ -16,6 +16,11 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.SAUB; +class TelemetryNewDataSaubDto : TelemetryDataSaubDto +{ + public new DateTimeOffset DateTime { get; set; } +} + public class TelemetryDataSaubService : TelemetryDataBaseService, ITelemetryDataSaubService { private readonly ITelemetryUserService telemetryUserService; @@ -124,10 +129,10 @@ public class TelemetryDataSaubService : TelemetryDataBaseService(); + var dto = src.Adapt(); var telemetryUser = telemetryUserService.GetOrDefault(src.IdTelemetry, src.IdUser ?? int.MinValue); dto.User = telemetryUser?.MakeDisplayName(); - dto.DateTime = src.DateTime.ToRemoteDateTime(timezoneOffset); + dto.DateTime = src.DateTime.ToOffset(TimeSpan.FromHours(timezoneOffset)); // src.DateTime.ToRemoteDateTime(timezoneOffset); dto.BitDepth = src.BitDepth <= src.WellDepth ? src.BitDepth : src.WellDepth; From 116cf4e3b0fb26b16e234b1fe7ef3c088329d889 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 29 Mar 2024 08:50:17 +0500 Subject: [PATCH 4/5] DetectedOperationService temporary fix timezone problem 2 --- .../Services/DetectOperations/DetectedOperationService.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index c6bca518..6bf0cdf5 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -143,7 +143,6 @@ public class DetectedOperationService : IDetectedOperationService const int minOperationLength = 5; const int maxDetectorsInterpolationFrameLength = 30; const int gap = maxDetectorsInterpolationFrameLength + minOperationLength; - //var timezone = telemetryService.GetTimezone(idTelemetry); while (true) { @@ -159,7 +158,7 @@ public class DetectedOperationService : IDetectedOperationService .Select(t => t as TelemetryNewDataSaubDto) .Select(t => new DetectableTelemetry { - DateTime = t.DateTime,//TODO: <-- вот тут ошибка при присвоении DateTime с kind unspecified в DateTimeOffset времени назначается локальный часовой пояс. + DateTime = t.DateTime, IdUser = t.IdUser, Mode = t.Mode, WellDepth = t.WellDepth, From 4d8a3798a08c2c38f1737bbd70a6f61d5c0c7f3a Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 29 Mar 2024 09:03:10 +0500 Subject: [PATCH 5/5] DetectedOperationService temporary fix timezone problem 3 --- .../Services/DetectOperations/DetectedOperationService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs index 6bf0cdf5..36809ec3 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationService.cs @@ -156,6 +156,7 @@ public class DetectedOperationService : IDetectedOperationService var detectableTelemetries = (await telemetryDataSaubService.GetByTelemetryAsync(idTelemetry, request, token)) .Where(t => t.BlockPosition >= 0) .Select(t => t as TelemetryNewDataSaubDto) + .Where (t => t is not null) .Select(t => new DetectableTelemetry { DateTime = t.DateTime,