forked from ddrilling/AsbCloudServer
Правки по результатам ревью
This commit is contained in:
parent
aa94db6549
commit
f577adb1bc
@ -91,7 +91,7 @@ namespace AsbCloudDb.Model
|
||||
|
||||
public DbSet<DrillTest> DrillTests => Set<DrillTest>();
|
||||
|
||||
public DbSet<ProcessMapDrillingCache> ProcessMapDrillingCache => Set<ProcessMapDrillingCache>();
|
||||
public DbSet<DataSaubStat> DataSaubStat => Set<DataSaubStat>();
|
||||
public AsbCloudDbContext() : base()
|
||||
{
|
||||
Interlocked.Increment(ref referenceCount);
|
||||
|
82
AsbCloudDb/Model/DataSaubStat.cs
Normal file
82
AsbCloudDb/Model/DataSaubStat.cs
Normal file
@ -0,0 +1,82 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace AsbCloudDb.Model
|
||||
{
|
||||
[Table("t_data_saub_stat"), Comment("Кеш-таблица для хранения данных для РТК-отчета")]
|
||||
public class DataSaubStat : IId
|
||||
{
|
||||
[Key]
|
||||
[Column("id")]
|
||||
public int Id { get; set; }
|
||||
|
||||
[Column("date_start", TypeName = "timestamp with time zone"), Comment("Дата и время начала")]
|
||||
public DateTimeOffset DateStart { get; set; }
|
||||
|
||||
[Column("date_end", TypeName = "timestamp with time zone"), Comment("Дата и время окончания")]
|
||||
public DateTimeOffset DateEnd { get; set; }
|
||||
|
||||
[Column("depth_start"), Comment("Глубина забоя по стволу начальная")]
|
||||
public double DepthStart { get; set; }
|
||||
|
||||
[Column("depth_end"), Comment("Глубина забоя по стволу конечная")]
|
||||
public double DepthEnd { get; set; }
|
||||
|
||||
[Column("speed"), Comment("Скорость бурения")]
|
||||
public double Speed { get; set; }
|
||||
|
||||
[Column("block_speed_sp"), Comment("Ограничение скорости блока")]
|
||||
public double? BlockSpeedSp { get; set; }
|
||||
|
||||
[Column("pressure"), Comment("Давление")]
|
||||
public double Pressure { get; set; }
|
||||
|
||||
[Column("pressure_idle"), Comment("Давление холостого хода")]
|
||||
public double? PressureIdle { get; set; }
|
||||
|
||||
[Column("pressure_sp"), Comment("Ограничение фактического давления")]
|
||||
public double? PressureSp { get; set; }
|
||||
|
||||
[Column("axial_load"), Comment("Фактическая нагрузка")]
|
||||
public double AxialLoad { get; set; }
|
||||
|
||||
[Column("axial_load_sp"), Comment("Ограничение факт. нагрузки")]
|
||||
public double? AxialLoadSp { get; set; }
|
||||
|
||||
[Column("axial_load_limit_max"), Comment("Максимально допустимая нагрузка")]
|
||||
public double? AxialLoadLimitMax { get; set; }
|
||||
|
||||
[Column("rotor_torque"), Comment("Фактический момент")]
|
||||
public double RotorTorque { get; set; }
|
||||
|
||||
[Column("rotor_torque_sp"), Comment("Ограничение факт. момента")]
|
||||
public double? RotorTorqueSp { get; set; }
|
||||
|
||||
[Column("rotor_torque_limit_max"), Comment("Максимально допустимый момент")]
|
||||
public double? RotorTorqueLimitMax { get; set; }
|
||||
|
||||
[Column("id_feed_regulator"), Comment("Работа при достижении ограничения")]
|
||||
public short? IdFeedRegulator { get; set; }
|
||||
|
||||
[Column("rotor_speed"), Comment("Фактическая скорость оборотов ВСП")]
|
||||
public double RotorSpeed { get; set; }
|
||||
|
||||
[Column("detected_operation_category_id"), Comment("Название автоопределённой операции")]
|
||||
public int DetectedOperationCategoryId { get; set; }
|
||||
|
||||
[Column("enabled_subsystems"), Comment("Флаги подсистем")]
|
||||
public int EnabledSubsystems { get; set; }
|
||||
|
||||
[Column("has_oscillation"), Comment("Наличие или отсутствие осцилляции")]
|
||||
public bool HasOscillation { get; set; }
|
||||
|
||||
[Column("id_telemetry"), Comment("Ключ телеметрии")]
|
||||
public int IdTelemetry { get; set; }
|
||||
|
||||
[ForeignKey(nameof(IdTelemetry))]
|
||||
public virtual Telemetry Telemetry { get; set; } = null!;
|
||||
}
|
||||
}
|
@ -80,7 +80,7 @@ namespace AsbCloudDb.Model
|
||||
DbSet<DrillTest> DrillTests { get; }
|
||||
DbSet<TrajectoryFact> TrajectoriesFact { get; }
|
||||
DbSet<WellSectionPlan> WellSectionsPlan { get; }
|
||||
DbSet<ProcessMapDrillingCache> ProcessMapDrillingCache { get; }
|
||||
DbSet<DataSaubStat> DataSaubStat { get; }
|
||||
DatabaseFacade Database { get; }
|
||||
|
||||
Task<int> RefreshMaterializedViewAsync(string mwName, CancellationToken token);
|
||||
|
@ -1,142 +0,0 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace AsbCloudDb.Model
|
||||
{
|
||||
[Table("t_process_map_drilling_cache"), Comment("Кеш-таблица для хранения данных для РТК-отчета")]
|
||||
public class ProcessMapDrillingCache : IId
|
||||
{
|
||||
[Key]
|
||||
[Column("id")]
|
||||
public int Id { get; set; }
|
||||
|
||||
[Column("date_from", TypeName = "timestamp with time zone"), Comment("Дата начала")]
|
||||
public DateTimeOffset DateFrom { get; set; }
|
||||
|
||||
[Column("date_to", TypeName = "timestamp with time zone"), Comment("Дата окончания")]
|
||||
public DateTimeOffset DateTo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Дата и время начала бурения
|
||||
/// </summary>
|
||||
[Column("date_drilling_start", TypeName = "timestamp with time zone"), Comment("Дата и время начала бурения")]
|
||||
public DateTimeOffset DateDrillingStart { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Дата и время окончания бурения
|
||||
/// </summary>
|
||||
[Column("date_drilling_end", TypeName = "timestamp with time zone"), Comment("Дата и время окончания бурения")]
|
||||
public DateTimeOffset DateDrillingEnd { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Глубина забоя по стволу начальная
|
||||
/// </summary>
|
||||
[Column("depth_start"), Comment("Глубина забоя по стволу начальная")]
|
||||
public double DepthStart { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Глубина забоя по стволу конечная
|
||||
/// </summary>
|
||||
[Column("depth_end"), Comment("Глубина забоя по стволу конечная")]
|
||||
public double DepthEnd { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Скорость бурения
|
||||
/// </summary>
|
||||
[Column("speed"), Comment("Скорость бурения")]
|
||||
public double Speed { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Ограничение скорости блока
|
||||
/// </summary>
|
||||
[Column("block_speed_sp"), Comment("Ограничение скорости блока")]
|
||||
public float? BlockSpeedSp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Давление
|
||||
/// </summary>
|
||||
[Column("pressure"), Comment("Давление")]
|
||||
public double Pressure { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Давление холостого хода
|
||||
/// </summary>
|
||||
[Column("pressure_idle"), Comment("Давление холостого хода")]
|
||||
public float? PressureIdle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Ограничение фактического давления
|
||||
/// </summary>
|
||||
[Column("pressure_sp"), Comment("Ограничение фактического давления")]
|
||||
public float? PressureSp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Фактическая нагрузка
|
||||
/// </summary>
|
||||
[Column("axial_load"), Comment("Фактическая нагрузка")]
|
||||
public double AxialLoad { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Ограничение факт. нагрузки
|
||||
/// </summary>
|
||||
[Column("axial_load_sp"), Comment("Ограничение факт. нагрузки")]
|
||||
public float? AxialLoadSp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Максимально допустимая нагрузка
|
||||
/// </summary>
|
||||
[Column("axial_load_limit_max"), Comment("Максимально допустимая нагрузка")]
|
||||
public float? AxialLoadLimitMax { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Фактический момент
|
||||
/// </summary>
|
||||
[Column("rotor_torque"), Comment("Фактический момент")]
|
||||
public double RotorTorque { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Ограничение факт. момента
|
||||
/// </summary>
|
||||
[Column("rotor_torque_sp"), Comment("Ограничение факт. момента")]
|
||||
public float? RotorTorqueSp { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Максимально допустимый момент
|
||||
/// </summary>
|
||||
[Column("rotor_torque_limit_max"), Comment("Максимально допустимый момент")]
|
||||
public float? RotorTorqueLimitMax { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Работа при достижении ограничения
|
||||
/// </summary>
|
||||
[Column("id_feed_regulator"), Comment("Работа при достижении ограничения")]
|
||||
public short? IdFeedRegulator { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Фактическая скорость оборотов ВСП
|
||||
/// </summary>
|
||||
[Column("rotor_speed"), Comment("Фактическая скорость оборотов ВСП")]
|
||||
public double RotorSpeed { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Название автоопределённой операции
|
||||
/// </summary>
|
||||
[Column("detected_operation_category_id"), Comment("Название автоопределённой операции")]
|
||||
public int DetectedOperationCategoryId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Флаги подсистем
|
||||
/// </summary>
|
||||
[Column("enabled_subsystems"), Comment("Флаги подсистем")]
|
||||
public int EnabledSubsystems { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Наличие или отсутствие осцилляции
|
||||
/// </summary>
|
||||
|
||||
[Column("has_oscillation"), Comment("Наличие или отсутствие осцилляции")]
|
||||
public bool HasOscillation { get; set; }
|
||||
}
|
||||
}
|
@ -38,16 +38,15 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
||||
// параметры метода: массив из
|
||||
|
||||
using var db = services.GetRequiredService<IAsbCloudDbContext>();
|
||||
|
||||
var dateFrom = db.ProcessMapDrillingCache
|
||||
.OrderByDescending(c => c.DateTo)
|
||||
.FirstOrDefault()?.DateTo
|
||||
var dateEnd = db.Set<DataSaubStat>()
|
||||
.OrderByDescending(c => c.DateEnd)
|
||||
.FirstOrDefault()?.DateEnd
|
||||
?? DateTimeOffset.MinValue;
|
||||
|
||||
|
||||
//а остальные операции, которые не вошли в 500 первых?
|
||||
var detectedOperations = db.DetectedOperations
|
||||
.Where(o => o.DateStart > dateFrom)
|
||||
var detectedOperations = db.Set<DetectedOperation>()
|
||||
.Where(o => o.DateStart > dateEnd)
|
||||
.Where(o => o.OperationCategory.IdParent == MechanicalDrillingCategoryId)
|
||||
.OrderBy(o => o.DateStart)
|
||||
.Take(500)
|
||||
@ -56,7 +55,7 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
||||
var minDate = detectedOperations.FirstOrDefault()?.DateStart;
|
||||
var maxDate = detectedOperations.OrderByDescending(d =>d.DateEnd).FirstOrDefault()?.DateEnd;
|
||||
|
||||
var telemetryDataSaub = db.TelemetryDataSaub
|
||||
var telemetryDataSaub = db.Set<TelemetryDataSaub>()
|
||||
.Where(t => t.DateTime >= minDate)
|
||||
.Where(t => t.DateTime <= maxDate)
|
||||
.Where(t => Math.Abs(t.BitDepth - t.WellDepth) < 0.0001)
|
||||
@ -67,16 +66,15 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
||||
var indexEnd = 0;
|
||||
foreach (var operation in detectedOperations)
|
||||
{
|
||||
indexStart = Array.FindIndex(telemetryDataSaub, indexEnd, t => t.DateTime >= operation.DateStart );
|
||||
indexStart = Array.FindIndex(telemetryDataSaub, indexEnd, t => t.DateTime >= operation.DateStart);
|
||||
indexEnd = Array.FindIndex(telemetryDataSaub, indexStart, t => t.DateTime > operation.DateEnd) - 1;
|
||||
|
||||
if(indexStart >= 0 && indexEnd >= indexStart)
|
||||
if (indexStart >= 0 && indexEnd >= indexStart)
|
||||
{
|
||||
var length = indexEnd - indexStart;
|
||||
|
||||
var subset = telemetryDataSaub.AsSpan(indexStart, length + 1);
|
||||
var result = CalcStats(operation, subset);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -98,13 +96,12 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
||||
var span = telemetryDataSaub.Slice(indexStart, length);
|
||||
indexStart = i;
|
||||
var processMapDrillingCacheItem = CalcStat(operation, span);
|
||||
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private ProcessMapDrillingCache CalcStat(DetectedOperation operation, Span<TelemetryDataSaub> span)
|
||||
private DataSaubStat CalcStat(DetectedOperation operation, Span<TelemetryDataSaub> span)
|
||||
{
|
||||
var depthStart = span[0].WellDepth;
|
||||
var depthEnd = span[^1].WellDepth;
|
||||
@ -113,31 +110,30 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
||||
if (operation.ExtraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out object? HasOscillation))
|
||||
hasOscillation = Convert.ToBoolean(HasOscillation);
|
||||
|
||||
var processMapDrillingCacheItem = new ProcessMapDrillingCache
|
||||
var wavg = CalcWavg(span);
|
||||
var processMapDrillingCacheItem = new DataSaubStat
|
||||
{
|
||||
DateDrillingStart = operation.DateStart,
|
||||
DateDrillingEnd = operation.DateEnd,
|
||||
DateStart = operation.DateStart,
|
||||
DateEnd = operation.DateEnd,
|
||||
DepthStart = depthStart,
|
||||
DepthEnd = depthEnd,
|
||||
Speed = (depthEnd - depthStart) / ((operation.DateEnd - operation.DateStart).TotalHours),
|
||||
BlockSpeedSp = span[0].BlockSpeedSp,
|
||||
Pressure = CalcValue(span, depthEnd - depthStart).Pressure,
|
||||
Pressure = wavg.Pressure,
|
||||
PressureIdle = span[0].PressureIdle,
|
||||
PressureSp = span[0].PressureSp,
|
||||
AxialLoad = CalcValue(span, depthEnd - depthStart).AxialLoad,
|
||||
AxialLoad = wavg.AxialLoad,
|
||||
AxialLoadSp = span[0].AxialLoadSp,
|
||||
AxialLoadLimitMax = span[0].AxialLoadLimitMax,
|
||||
RotorTorque = CalcValue(span, depthEnd - depthStart).RotorTorque,
|
||||
RotorTorque = wavg.RotorTorque,
|
||||
RotorTorqueSp = span[0].RotorTorqueSp,
|
||||
RotorTorqueLimitMax = span[0].RotorTorqueLimitMax,
|
||||
//Значение столбца id_feed_regulator из таблицы “Фильтрованная телеметрия”
|
||||
//в границах временного интервала (диапазоне).
|
||||
IdFeedRegulator = span[0].IdFeedRegulator,
|
||||
RotorSpeed = CalcValue(span, depthEnd - depthStart).RotorSpeed,
|
||||
//?
|
||||
RotorSpeed = wavg.RotorSpeed,
|
||||
DetectedOperationCategoryId = operation.IdCategory,
|
||||
EnabledSubsystems = operation.EnabledSubsystems,
|
||||
HasOscillation = hasOscillation
|
||||
HasOscillation = hasOscillation,
|
||||
IdTelemetry = operation.IdTelemetry,
|
||||
};
|
||||
return processMapDrillingCacheItem;
|
||||
}
|
||||
@ -147,7 +143,7 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
||||
double AxialLoad,
|
||||
double RotorTorque,
|
||||
double RotorSpeed
|
||||
) CalcValue(Span<TelemetryDataSaub> span)
|
||||
) CalcWavg(Span<TelemetryDataSaub> span)
|
||||
{
|
||||
var sumPressure = 0.0;
|
||||
var sumAxialLoad = 0.0;
|
||||
@ -157,10 +153,10 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
||||
for (var i = 0; i < span.Length - 1; i++)
|
||||
{
|
||||
var weigth = span[i + 1].WellDepth - span[i].WellDepth;
|
||||
sumPressure += () * span[i].Pressure;
|
||||
sumAxialLoad += (span[i + 1].WellDepth - span[i].WellDepth) * span[i].AxialLoad;
|
||||
sumRotorTorque += (span[i + 1].WellDepth - span[i].WellDepth) * span[i].RotorTorque;
|
||||
sumRotorSpeed += (span[i + 1].WellDepth - span[i].WellDepth) * span[i].RotorSpeed;
|
||||
sumPressure += weigth * span[i].Pressure;
|
||||
sumAxialLoad += weigth * span[i].AxialLoad;
|
||||
sumRotorTorque += weigth * span[i].RotorTorque;
|
||||
sumRotorSpeed += weigth * span[i].RotorSpeed;
|
||||
}
|
||||
return (
|
||||
Pressure: sumPressure / diffDepthTotal,
|
||||
|
Loading…
Reference in New Issue
Block a user