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) {