From 5b06b9d55707d60f5d6010b93749b82f6f836d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=90=D0=BB=D0=B5=D0=BA?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= Date: Fri, 4 Aug 2023 14:18:10 +0500 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20?= =?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 --- AsbCloudApp/Data/WellOperationDto.cs | 5 -- .../OperationsStatService.cs | 54 ++++++++++--------- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/AsbCloudApp/Data/WellOperationDto.cs b/AsbCloudApp/Data/WellOperationDto.cs index b3dc537c..31b50243 100644 --- a/AsbCloudApp/Data/WellOperationDto.cs +++ b/AsbCloudApp/Data/WellOperationDto.cs @@ -89,11 +89,6 @@ namespace AsbCloudApp.Data [DateValidation(GtDate = "2010-01-01T00:00:00")] public DateTime DateStart { get; set; } - /// - /// Дата окончания операции - /// - public DateTime DateEnd => DateStart.AddHours(DurationHours); - /// /// Продолжительность, часы /// diff --git a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs index 465f98f9..8be58bc6 100644 --- a/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationService/OperationsStatService.cs @@ -173,43 +173,49 @@ namespace AsbCloudInfrastructure.Services.WellOperationService var timezoneOffsetH = wellService.GetTimezone(well.Id).Hours; statWellDto.Sections = CalcSectionsStats(wellOperations, timezoneOffsetH); statWellDto.Total = GetStatTotal(wellOperations, well.IdState, timezoneOffsetH); - statWellDto.TvdLagPercent = CalcTvdLagPercent(well.IdTelemetry, wellOperations - .Select(x => x.Adapt())); + statWellDto.TvdLagPercent = CalcTvdLagPercent(well.IdTelemetry, wellOperations); return statWellDto; } - private double? CalcTvdLagPercent(int? idTelemetry, IEnumerable wellOperations) - { - if (!idTelemetry.HasValue) - return null; - + private double? CalcTvdLagPercent(int? idTelemetry, IOrderedEnumerable wellOperations) + { var currentDate = DateTime.UtcNow; + + var wellDepth = wellOperations + .LastOrDefault(o => o.IdType == WellOperation.IdOperationTypeFact)?.DepthEnd; + + if (idTelemetry.HasValue) + wellDepth = telemetryDataCache.GetLastOrDefault(idTelemetry.Value)?.WellDepth; - var lastFactOperation = telemetryDataCache.GetLastOrDefault(idTelemetry.Value); - - wellOperations = wellOperations - .Where(o => o.IdType == WellOperation.IdOperationTypePlan) - .OrderBy(o => o.DateEnd); + var planOperations = wellOperations + .Where(o => o.IdType == WellOperation.IdOperationTypePlan) + .OrderBy(o => o.DateStart.AddHours(o.DurationHours)); - var wellOperationFrom = wellOperations - .LastOrDefault(o => o.DateEnd <= currentDate); + var wellOperationFrom = planOperations + .LastOrDefault(o => o.DateStart.AddHours(o.DurationHours) <= currentDate); - var wellOperationTo = wellOperations - .FirstOrDefault(o => o.DateEnd >= currentDate); + var wellOperationTo = planOperations + .FirstOrDefault(o => o.DateStart >= currentDate); var wellOperationDepthFrom = wellOperationFrom?.DepthEnd; - var wellOperationDepthTo = wellOperationTo?.DepthStart ?? wellOperationDepthFrom; + var wellOperationDepthTo = wellOperationTo?.DepthStart ?? wellOperationDepthFrom; - var wellOperationDateFrom = wellOperationFrom?.DateEnd; - var wellOperationDateTo = wellOperationTo?.DateStart ?? wellOperationDateFrom; + var wellOperationDateFrom = wellOperationFrom?.DateStart.AddHours(wellOperationFrom.DurationHours); + var wellOperationDateTo = wellOperationTo?.DateStart ?? currentDate; - var planDepth = (wellOperationDateTo - wellOperationDateFrom)?.TotalHours * - (wellOperationDepthTo - wellOperationDepthFrom) / - (currentDate - wellOperationDateFrom)?.TotalHours + wellOperationDepthFrom; + if (wellOperationDateTo <= wellOperationDateFrom || + currentDate <= wellOperationDateFrom || + (wellOperationDateTo - wellOperationDateFrom)?.TotalHours is null or 0) + return null; - return (1 - lastFactOperation?.WellDepth / planDepth) * 100; - } + var planDepth = (currentDate - wellOperationDateFrom)?.TotalHours * + (wellOperationDepthTo - wellOperationDepthFrom) / + (wellOperationDateTo - wellOperationDateFrom)?.TotalHours + + wellOperationDepthFrom; + + return (1 - wellDepth / planDepth) * 100; + } private IEnumerable CalcSectionsStats(IEnumerable operations, double timezoneOffsetH) {