using AsbCloudDb.Model; namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors { #nullable enable /// /// Шаблонировка при бурении /// internal class DetectorTemplatingWhileDrilling : DetectorAbstract { public DetectorTemplatingWhileDrilling() : base(23) { } protected override double CalcValue(DetectableTelemetry[] telemetry, int begin, int end) => CalcDeltaMinutes(telemetry, begin, end); protected override bool DetectBegin(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation) { if (previousOperation?.IdCategory != 22) return false; var point0 = telemetry[position]; if (point0.Pressure < 15) return false; if (point0.RotorSpeed < 1) return false; if (RisesFromBegin(telemetry, t => t.BlockPosition, position, 30, 0.5)) return false; return true; } protected override int DetectEnd(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation) { var point0 = telemetry[position]; if (point0.Pressure < 15) return IdReasonOfEnd_PressureIsLo; if (RisesFromBegin(telemetry, t=>t.WellDepth, position, 10, 0.01)) return IdReasonOfEnd_WellDepthDeviates; var delta = point0.WellDepth - point0.BitDepth; if ( (delta > 0.03d ) && (point0.Pressure > 15) && (!ContainsDeviationApprox(telemetry, t=>t.BlockPosition, position, 60, 0.03))) return IdReasonOfEnd_Custom1; return IdReasonOfEnd_NotDetected; } protected override bool IsValid(DetectableTelemetry[] telemetry, int begin, int end) => IsValidByWellDepthDoesNotChange(telemetry, begin, end); } #nullable disable }