Фикс авто определения операций

This commit is contained in:
Степанов Дмитрий 2023-12-18 13:51:40 +05:00
parent 7a6f922a97
commit 0570c4f4e4
7 changed files with 88 additions and 95 deletions

View File

@ -0,0 +1,50 @@
using System;
namespace AsbCloudApp.Data.DetectedOperation;
/// <summary>
/// Флаги включенных подсистем
/// </summary>
[Flags]
public enum EnabledSubsystemsFlags
{
/// <summary>
/// Автоподача долота
/// </summary>
AutoRotor = 1 << 0,
/// <summary>
/// БУРЕНИЕ В СЛАЙДЕ
/// </summary>
AutoSlide = 1 << 1,
/// <summary>
/// ПРОРАБОТКА
/// </summary>
AutoConditionig = 1 << 2,
/// <summary>
/// СПУСК СПО
/// </summary>
AutoSinking = 1 << 3,
/// <summary>
/// ПОДЪЕМ СПО
/// </summary>
AutoLifting = 1 << 4,
/// <summary>
/// ПОДЪЕМ С ПРОРАБОТКОЙ
/// </summary>
AutoLiftingWithConditionig = 1 << 5,
/// <summary>
/// блокировка
/// </summary>
AutoBlocknig = 1 << 6,
/// <summary>
/// осцилляция
/// </summary>
AutoOscillation = 1 << 7,
}

View File

@ -41,7 +41,7 @@ namespace AsbCloudDb.Model
[Column("value"), Comment("Ключевой показатель операции")] [Column("value"), Comment("Ключевой показатель операции")]
public double Value { get; set; } public double Value { get; set; }
[Column("enabled_subsystems"), Comment("флаги аключенных подсистем")] [Column("enabled_subsystems"), Comment("флаги включенных подсистем")]
public int EnabledSubsystems { get; set; } public int EnabledSubsystems { get; set; }
[Column("extra_data", TypeName = "jsonb"), Comment("доп. инфо по операции")] [Column("extra_data", TypeName = "jsonb"), Comment("доп. инфо по операции")]
@ -57,61 +57,5 @@ namespace AsbCloudDb.Model
public override string ToString() public override string ToString()
=> $"{IdCategory}\t{DateStart:G}\t{DateEnd:G}\t{DurationMinutes:#0.#}\t{DepthStart:#0.#}\t{DepthEnd:#0.#}"; => $"{IdCategory}\t{DateStart:G}\t{DateEnd:G}\t{DurationMinutes:#0.#}\t{DepthStart:#0.#}\t{DepthEnd:#0.#}";
/// <summary>
/// Флаги аключенных подсистем
/// </summary>
[Flags]
public enum EnabledSubsystemsFlags
{
/// <summary>
/// Автоподача долота
/// </summary>
AutoRotor = 1 << 0,
/// <summary>
/// БУРЕНИЕ В СЛАЙДЕ
/// </summary>
AutoSlide = 1 << 1,
/// <summary>
/// ПРОРАБОТКА
/// </summary>
AutoConditionig = 1 << 2,
/// <summary>
/// СПУСК СПО
/// </summary>
AutoSinking = 1 << 3,
/// <summary>
/// ПОДЪЕМ СПО
/// </summary>
AutoLifting = 1 << 4,
/// <summary>
/// ПОДЪЕМ С ПРОРАБОТКОЙ
/// </summary>
AutoLiftingWithConditionig = 1 << 5,
/// <summary>
/// блокировка
/// </summary>
AutoBlocknig = 1 << 6,
/// <summary>
/// Спин-мастер
/// </summary>
AutoSpinMaster = 1 << 7,
}
/// <summary>
/// Есть ли флаг подсистемы у операции
/// </summary>
/// <param name="flag"></param>
/// <returns></returns>
public bool HasSubsystemFlag(EnabledSubsystemsFlags flag)
=> HasSubsystemFlag((int)flag);
/// <summary>
/// Есть ли флаг/флаги подсистемы у операции
/// </summary>
/// <param name="flags"></param>
/// <returns></returns>
public bool HasSubsystemFlag(int flags)
=> (EnabledSubsystems & flags) > 0;
} }
} }

View File

@ -8,8 +8,8 @@ using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using AsbCloudApp.Data.DetectedOperation;
using AsbCloudInfrastructure.Services.DetectOperations.Detectors; using AsbCloudInfrastructure.Services.DetectOperations.Detectors;
using AsbCloudApp.Repositories;
namespace AsbCloudInfrastructure.Services.DetectOperations; namespace AsbCloudInfrastructure.Services.DetectOperations;
@ -46,13 +46,11 @@ public class DetectedOperationExportService
private const int columnComment = 10; private const int columnComment = 10;
private readonly IAsbCloudDbContext dbContext; private readonly IAsbCloudDbContext dbContext;
private readonly IWellOperationRepository wellOperationRepository;
public DetectedOperationExportService(IAsbCloudDbContext dbContext, IWellOperationRepository wellOperationRepository) public DetectedOperationExportService(IAsbCloudDbContext dbContext)
{ {
this.dbContext = dbContext; this.dbContext = dbContext;
this.wellOperationRepository = wellOperationRepository; }
}
public async Task<Stream> ExportAsync(int idWell, int idDomain, CancellationToken cancellationToken) public async Task<Stream> ExportAsync(int idWell, int idDomain, CancellationToken cancellationToken)
{ {
@ -151,8 +149,8 @@ public class DetectedOperationExportService
private static string GetCategoryName(IEnumerable<WellOperationCategory> wellOperationCategories, DetectedOperation current) private static string GetCategoryName(IEnumerable<WellOperationCategory> wellOperationCategories, DetectedOperation current)
{ {
var idCategory = current.IdCategory; var idCategory = current.IdCategory;
if (idCategory == WellOperationCategory.IdSlide if (idCategory == WellOperationCategory.IdSlide &&
&& current.HasSubsystemFlag(DetectedOperation.EnabledSubsystemsFlags.AutoSpinMaster)) EnabledSubsystemsFlags.AutoOscillation.HasEnabledSubsystems(current.EnabledSubsystems))
return "Бурение в слайде с осцилляцией"; return "Бурение в слайде с осцилляцией";
var category = wellOperationCategories.FirstOrDefault(o => o.Id == current.IdCategory); var category = wellOperationCategories.FirstOrDefault(o => o.Id == current.IdCategory);

View File

@ -1,6 +1,7 @@
using AsbCloudDb.Model; using AsbCloudDb.Model;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using AsbCloudApp.Data.DetectedOperation;
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
{ {
@ -159,39 +160,35 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
private static int DetectEnabledSubsystems(DetectableTelemetry[] telemetry, int begin, int end, IDictionary<string, object> extraData) private static int DetectEnabledSubsystems(DetectableTelemetry[] telemetry, int begin, int end, IDictionary<string, object> extraData)
{ {
var enabledSubsystems = 0; var enabledSubsystems = 0;
if(extraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out var hasOscillation)
&& hasOscillation is true)
{
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSpinMaster;
return enabledSubsystems;
}
for (var i = begin; i < end; i += 2) for (var i = begin; i < end; i += 2)
{ {
var mode = telemetry[i].Mode; var mode = telemetry[i].Mode;
if (extraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out var hasOscillation)
&& hasOscillation is true)
enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoOscillation;
if(mode == 1) if(mode == 1)
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoRotor; enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoRotor;
if (mode == 3) if (mode == 3)
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSlide; enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoSlide;
if (mode == 2) if (mode == 2)
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoConditionig; enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoConditionig;
if (mode == 4) if (mode == 4)
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoSinking; enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoSinking;
if (mode == 5) if (mode == 5)
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoLifting; enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoLifting;
if (mode == 6) if (mode == 6)
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoLiftingWithConditionig; enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoLiftingWithConditionig;
if (mode == 10) if (mode == 10)
enabledSubsystems |= (int)DetectedOperation.EnabledSubsystemsFlags.AutoBlocknig; enabledSubsystems |= (int)EnabledSubsystemsFlags.AutoBlocknig;
} }
return enabledSubsystems; return enabledSubsystems;

View File

@ -64,7 +64,7 @@ public class DetectorDrilling : DetectorAbstract
{ {
[ExtraDataKeyAvgRotorSpeed] = avgRotorSpeed, [ExtraDataKeyAvgRotorSpeed] = avgRotorSpeed,
[ExtraDataKeyDispersionOfNormalizedRotorSpeed] = dispersionOfNormalizedRotorSpeed, [ExtraDataKeyDispersionOfNormalizedRotorSpeed] = dispersionOfNormalizedRotorSpeed,
[ExtraDataKeyHasOscillation] = avgRotorSpeed > 5 && dispersionOfNormalizedRotorSpeed > dispersionOfNormalizedRotorSpeedThreshold [ExtraDataKeyHasOscillation] = avgRotorSpeed > 1 && dispersionOfNormalizedRotorSpeed > dispersionOfNormalizedRotorSpeedThreshold
}; };
return (idCategory, extraData); return (idCategory, extraData);
} }
@ -73,19 +73,8 @@ public class DetectorDrilling : DetectorAbstract
{ {
var telemetryRange = telemetry[begin..end] var telemetryRange = telemetry[begin..end]
.OrderBy(t => t.DateTime).ToList(); .OrderBy(t => t.DateTime).ToList();
for (var i = telemetryRange.Count - 1; i >= 0 && telemetryRange.Count > 1; i--) var avgRotorSpeed = telemetryRange.Average(t => t.RotorSpeed);
{
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)); var dispersion = telemetryRange.Average(t => Math.Pow(t.RotorSpeed / avgRotorSpeed - 1, 2));
return (avgRotorSpeed, dispersion); return (avgRotorSpeed, dispersion);
} }

View File

@ -0,0 +1,15 @@
using AsbCloudApp.Data.DetectedOperation;
namespace AsbCloudInfrastructure.Services.DetectOperations;
public static class EnabledSubsystemsFlagsExtensions
{
/// <summary>
/// Есть ли флаг подсистемы у операции
/// </summary>
/// <param name="flags"></param>
/// <param name="enabledSubsystems"></param>
/// <returns></returns>
public static bool HasEnabledSubsystems(this EnabledSubsystemsFlags flags, int enabledSubsystems)
=> (enabledSubsystems & (int)flags) > 0;
}

View File

@ -24,4 +24,4 @@
## Метод определения бурения в роторе, слайде с осцилляцией ## Метод определения бурения в роторе, слайде с осцилляцией
Необходимо рассчитать десперсию нормированных оборотов ротора по(по среднему значению) Необходимо рассчитать десперсию нормированных оборотов ротора по(по среднему значению)
1. Если полученное значение больше константы(0,2), то мы подтвердили что бурение в роторе. 1. Если полученное значение больше константы(0,2), то мы подтвердили что бурение в роторе.
2. Если полученное значение меньше константы, то это бурение в слайде с осцилляцией. 2. Если полученное значение меньше константы, и средние обороты ротора больше 1, то это бурение ~~~~в слайде с осцилляцией.