diff --git a/AsbCloudDb/Model/DetectedOperation.cs b/AsbCloudDb/Model/DetectedOperation.cs
index 7300eb59..d2498ece 100644
--- a/AsbCloudDb/Model/DetectedOperation.cs
+++ b/AsbCloudDb/Model/DetectedOperation.cs
@@ -92,6 +92,10 @@ namespace AsbCloudDb.Model
/// блокировка
///
AutoBlocknig = 1 << 6,
+ ///
+ /// Спин-мастер
+ ///
+ AutoSpin = 1 << 7,
}
///
diff --git a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs
index 15dab40f..f833ae7d 100644
--- a/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs
+++ b/AsbCloudInfrastructure/Services/DetectOperations/DetectedOperationExportService.cs
@@ -152,8 +152,7 @@ public class DetectedOperationExportService
{
var idCategory = current.IdCategory;
if (idCategory == WellOperationCategory.IdSlide
- && current.ExtraData[DetectorDrilling.ExtraDataKeyHasOscillation] is bool hasOscillation
- && hasOscillation)
+ && current.HasSubsystemFlag(DetectedOperation.EnabledSubsystemsFlags.AutoSpin))
return "Бурение в слайде с осцилляцией";
var category = wellOperationCategories.FirstOrDefault(o => o.Id == current.IdCategory);
diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs
index 6da769bf..0fde1096 100644
--- a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs
+++ b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorAbstract.cs
@@ -1,7 +1,6 @@
using AsbCloudDb.Model;
using System;
using System.Collections.Generic;
-using System.Linq;
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
{
@@ -126,7 +125,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
DepthEnd = (double)pEnd.WellDepth,
ExtraData = ExtraData,
Value = CalcValue(telemetry, begin, end),
- EnabledSubsystems = DetectEnabledSubsystems(telemetry, begin, end)
+ EnabledSubsystems = DetectEnabledSubsystems(telemetry, begin, end, ExtraData)
};
return operation;
@@ -155,10 +154,19 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
///
///
///
+ ///
///
- private static int DetectEnabledSubsystems(DetectableTelemetry[] telemetry, int begin, int end)
+ private static int DetectEnabledSubsystems(DetectableTelemetry[] telemetry, int begin, int end, IDictionary extraData)
{
var enabledSubsystems = 0;
+
+ if(extraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out var hasOscillation)
+ && hasOscillation is true)
+ {
+ enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSpin;
+
+ return enabledSubsystems;
+ }
for (var i = begin; i < end; i += 2)
{
diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs
index 56aa2fd4..a26d04af 100644
--- a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs
+++ b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.Drawing;
using System.Linq;
using AsbCloudDb.Model;
@@ -65,14 +64,27 @@ public class DetectorDrilling : DetectorAbstract
{
[ExtraDataKeyAvgRotorSpeed] = avgRotorSpeed,
[ExtraDataKeyDispersionOfNormalizedRotorSpeed] = dispersionOfNormalizedRotorSpeed,
- [ExtraDataKeyHasOscillation] = dispersionOfNormalizedRotorSpeed > dispersionOfNormalizedRotorSpeedThreshold
+ [ExtraDataKeyHasOscillation] = avgRotorSpeed > 5 && dispersionOfNormalizedRotorSpeed > dispersionOfNormalizedRotorSpeedThreshold
};
return (idCategory, extraData);
}
private static (double avgRotorSpeed, double dispersionOfNormalizedRotorSpeed) CalcCriteries(DetectableTelemetry[] telemetry, int begin, int end)
{
- var telemetryRange = telemetry[begin..end];
+ var telemetryRange = telemetry[begin..end]
+ .OrderBy(t => t.DateTime).ToList();
+
+ for (var i = telemetryRange.Count - 1; i >= 0 && telemetryRange.Count > 1; i--)
+ {
+ if (Math.Abs(telemetryRange[i].WellDepth - telemetryRange[i - 1].WellDepth) < 0.001d)
+ {
+ telemetryRange.RemoveAt(i);
+ continue;
+ }
+
+ break;
+ }
+
var avgRotorSpeed = telemetryRange.Average(t => t.RotorSpeed);
var dispersion = telemetryRange.Average(t => Math.Pow(t.RotorSpeed / avgRotorSpeed - 1, 2));
return (avgRotorSpeed, dispersion);
@@ -85,10 +97,10 @@ public class DetectorDrilling : DetectorAbstract
if (avgRotorSpeed < 5)
return WellOperationCategory.IdSlide;
- if (dispersionOfNormalizedRotorSpeed < dispersionOfNormalizedRotorSpeedThreshold)
+ if(dispersionOfNormalizedRotorSpeed < dispersionOfNormalizedRotorSpeedThreshold)
return WellOperationCategory.IdRotor;
- else
- return idSlideWithOscillation;
- }
+
+ return idSlideWithOscillation;
+ }
}
\ No newline at end of file