DD.WellWorkover.Cloud/AsbCloudInfrastructure/Services/DetectOperations/Detectors/OperationDetector.cs

67 lines
2.3 KiB
C#

using AsbCloudDb.Model;
using System;
using System.Collections.Generic;
using System.Linq;
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
{
class OperationDetectorResult
{
public int TelemetryBegin { get; set; }
public int TelemetryEnd { get; set; }
public DetectedOperation Operation { get; set; }
}
internal class OperationDetector : IOperationDetector
{
private readonly int idOperation;
protected Func<DetectableTelemetry[], int, int, bool> isValid = (_,_,_) => true;
protected Func<DetectableTelemetry[], int, int, double> calcValue = (_, _, _) => 0d;
public OperationDetector(int idOperation)
{
this.idOperation = idOperation;
}
public bool TryDetect(int idTelemetry, DetectableTelemetry[] telemetryFragment, int begin, int end, out IEnumerable<OperationDetectorResult> operations)
{
if(!telemetryFragment.Any() || !isValid(telemetryFragment, begin, end))
{
operations = Enumerable.Empty<OperationDetectorResult>();
return false;
}
var operation = MakeOperation(idTelemetry, telemetryFragment, begin, end);
operations = new List<OperationDetectorResult> { operation };
return true;
}
private OperationDetectorResult MakeOperation(int idTelemetry, DetectableTelemetry[] telemetryFragment, int begin, int end)
{
var pBegin = telemetryFragment[begin];
var pEnd = telemetryFragment[end];
var result = new OperationDetectorResult
{
TelemetryBegin = begin,
TelemetryEnd = end,
Operation = new DetectedOperation
{
IdTelemetry = idTelemetry,
IdCategory = idOperation,
IdUsersAtStart = pBegin.IdUser ?? -1,
DateStart = pBegin.DateTime,
DateEnd = pEnd.DateTime,
DepthStart = (double)pBegin.WellDepth,
DepthEnd = (double)pEnd.WellDepth,
Value = calcValue(telemetryFragment, begin, end),
},
};
return result;
}
}
}