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