2023-10-09 17:04:05 +05:00
|
|
|
|
using System;
|
|
|
|
|
using AsbCloudApp.Data.SAUB;
|
|
|
|
|
|
2023-10-17 10:20:27 +05:00
|
|
|
|
namespace AsbCloudInfrastructure.Services.ProcessMaps.Report.Data;
|
2023-10-09 17:04:05 +05:00
|
|
|
|
|
|
|
|
|
internal class TelemetryStat
|
|
|
|
|
{
|
|
|
|
|
public ParamStat Pressure { get; }
|
|
|
|
|
public ParamStat AxialLoad { get; }
|
|
|
|
|
public ParamStat RotorTorque { get; }
|
|
|
|
|
public ParamStat BlockSpeed { get; }
|
|
|
|
|
|
|
|
|
|
private TelemetryDataSaubStatDto? previous;
|
|
|
|
|
private double depthSum = 0d;
|
|
|
|
|
private double hoursSum = 0d;
|
|
|
|
|
|
|
|
|
|
public double? Rop => hoursSum == 0d ? null : depthSum / hoursSum;
|
|
|
|
|
|
|
|
|
|
private double depthWithSaub = 0d;
|
|
|
|
|
public double UsageSaub { get; }
|
|
|
|
|
public double UsagePredictPlan { get; }
|
|
|
|
|
public DateTime DateStart { get; }
|
|
|
|
|
public float DeltaDepth { get; }
|
|
|
|
|
public int IdMode { get; }
|
|
|
|
|
public string ModeName { get; }
|
2023-10-17 10:20:27 +05:00
|
|
|
|
public double DrillingHours { get; }
|
2023-10-09 17:04:05 +05:00
|
|
|
|
|
|
|
|
|
public TelemetryStat(Span<TelemetryDataSaubStatDto> telemetry)
|
|
|
|
|
{
|
|
|
|
|
var telemetryFirst = telemetry[0];
|
|
|
|
|
var telemetryLast = telemetry[^1];
|
|
|
|
|
|
|
|
|
|
IdMode = telemetryFirst.IdMode;
|
|
|
|
|
ModeName = GetModeName(IdMode);
|
|
|
|
|
DateStart = telemetryFirst.DateMin;
|
|
|
|
|
DeltaDepth = telemetryLast.WellDepthMax - telemetryFirst.WellDepthMin;
|
2023-10-17 10:20:27 +05:00
|
|
|
|
DrillingHours = (telemetryLast.DateMax - telemetryFirst.DateMin).TotalHours;
|
2023-10-09 17:04:05 +05:00
|
|
|
|
|
|
|
|
|
BlockSpeed = new(t => t.BlockSpeedSp, t => t.BlockSpeed, null, 1, IdMode);
|
|
|
|
|
Pressure = new(t => t.PressureSpDelta, t => t.PressureDelta, t => t.PressureDeltaLimitMax, 2, IdMode);
|
|
|
|
|
RotorTorque = new(t => t.RotorTorqueSp, t => t.RotorTorque, t => t.RotorTorqueLimitMax, 3, IdMode);
|
|
|
|
|
AxialLoad = new(t => t.AxialLoadSp, t => t.AxialLoad, t => t.AxialLoadLimitMax, 4, IdMode);
|
|
|
|
|
|
|
|
|
|
foreach (var t in telemetry)
|
|
|
|
|
UpdateStat(t);
|
|
|
|
|
|
|
|
|
|
UsageSaub = 100d * depthWithSaub / depthSum;
|
|
|
|
|
UsagePredictPlan = IdMode != 0 ? 100d : 0d;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateStat(TelemetryDataSaubStatDto current)
|
|
|
|
|
{
|
|
|
|
|
if (previous is not null)
|
|
|
|
|
{
|
|
|
|
|
var deltaDepth = current.WellDepthMin - previous.WellDepthMin;
|
|
|
|
|
|
|
|
|
|
if (deltaDepth > 0)
|
|
|
|
|
{
|
|
|
|
|
var deltaHours = (current.DateMin - previous.DateMax).TotalHours;
|
|
|
|
|
depthSum += deltaDepth;
|
|
|
|
|
hoursSum += deltaHours;
|
|
|
|
|
|
|
|
|
|
if (current.IdMode == 1 || current.IdMode == 3)
|
|
|
|
|
depthWithSaub += deltaDepth;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
previous = current;
|
|
|
|
|
Pressure.UpdateStat(current);
|
|
|
|
|
AxialLoad.UpdateStat(current);
|
|
|
|
|
RotorTorque.UpdateStat(current);
|
|
|
|
|
BlockSpeed.UpdateStat(current);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string GetModeName(int idMode)
|
|
|
|
|
=> idMode switch
|
|
|
|
|
{
|
|
|
|
|
1 => "Ротор",
|
|
|
|
|
3 => "Слайд",
|
|
|
|
|
_ => "Ручной",
|
|
|
|
|
};
|
|
|
|
|
}
|