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<DrillTest> DrillTests => Set<DrillTest>();
|
||||||
|
|
||||||
public DbSet<ProcessMapDrillingCache> ProcessMapDrillingCache => Set<ProcessMapDrillingCache>();
|
public DbSet<DataSaubStat> DataSaubStat => Set<DataSaubStat>();
|
||||||
public AsbCloudDbContext() : base()
|
public AsbCloudDbContext() : base()
|
||||||
{
|
{
|
||||||
Interlocked.Increment(ref referenceCount);
|
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<DrillTest> DrillTests { get; }
|
||||||
DbSet<TrajectoryFact> TrajectoriesFact { get; }
|
DbSet<TrajectoryFact> TrajectoriesFact { get; }
|
||||||
DbSet<WellSectionPlan> WellSectionsPlan { get; }
|
DbSet<WellSectionPlan> WellSectionsPlan { get; }
|
||||||
DbSet<ProcessMapDrillingCache> ProcessMapDrillingCache { get; }
|
DbSet<DataSaubStat> DataSaubStat { get; }
|
||||||
DatabaseFacade Database { get; }
|
DatabaseFacade Database { get; }
|
||||||
|
|
||||||
Task<int> RefreshMaterializedViewAsync(string mwName, CancellationToken token);
|
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>();
|
using var db = services.GetRequiredService<IAsbCloudDbContext>();
|
||||||
|
var dateEnd = db.Set<DataSaubStat>()
|
||||||
var dateFrom = db.ProcessMapDrillingCache
|
.OrderByDescending(c => c.DateEnd)
|
||||||
.OrderByDescending(c => c.DateTo)
|
.FirstOrDefault()?.DateEnd
|
||||||
.FirstOrDefault()?.DateTo
|
|
||||||
?? DateTimeOffset.MinValue;
|
?? DateTimeOffset.MinValue;
|
||||||
|
|
||||||
|
|
||||||
//а остальные операции, которые не вошли в 500 первых?
|
//а остальные операции, которые не вошли в 500 первых?
|
||||||
var detectedOperations = db.DetectedOperations
|
var detectedOperations = db.Set<DetectedOperation>()
|
||||||
.Where(o => o.DateStart > dateFrom)
|
.Where(o => o.DateStart > dateEnd)
|
||||||
.Where(o => o.OperationCategory.IdParent == MechanicalDrillingCategoryId)
|
.Where(o => o.OperationCategory.IdParent == MechanicalDrillingCategoryId)
|
||||||
.OrderBy(o => o.DateStart)
|
.OrderBy(o => o.DateStart)
|
||||||
.Take(500)
|
.Take(500)
|
||||||
@ -56,7 +55,7 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
|||||||
var minDate = detectedOperations.FirstOrDefault()?.DateStart;
|
var minDate = detectedOperations.FirstOrDefault()?.DateStart;
|
||||||
var maxDate = detectedOperations.OrderByDescending(d =>d.DateEnd).FirstOrDefault()?.DateEnd;
|
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 >= minDate)
|
||||||
.Where(t => t.DateTime <= maxDate)
|
.Where(t => t.DateTime <= maxDate)
|
||||||
.Where(t => Math.Abs(t.BitDepth - t.WellDepth) < 0.0001)
|
.Where(t => Math.Abs(t.BitDepth - t.WellDepth) < 0.0001)
|
||||||
@ -76,7 +75,6 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
|||||||
|
|
||||||
var subset = telemetryDataSaub.AsSpan(indexStart, length + 1);
|
var subset = telemetryDataSaub.AsSpan(indexStart, length + 1);
|
||||||
var result = CalcStats(operation, subset);
|
var result = CalcStats(operation, subset);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -98,13 +96,12 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
|||||||
var span = telemetryDataSaub.Slice(indexStart, length);
|
var span = telemetryDataSaub.Slice(indexStart, length);
|
||||||
indexStart = i;
|
indexStart = i;
|
||||||
var processMapDrillingCacheItem = CalcStat(operation, span);
|
var processMapDrillingCacheItem = CalcStat(operation, span);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ProcessMapDrillingCache CalcStat(DetectedOperation operation, Span<TelemetryDataSaub> span)
|
private DataSaubStat CalcStat(DetectedOperation operation, Span<TelemetryDataSaub> span)
|
||||||
{
|
{
|
||||||
var depthStart = span[0].WellDepth;
|
var depthStart = span[0].WellDepth;
|
||||||
var depthEnd = span[^1].WellDepth;
|
var depthEnd = span[^1].WellDepth;
|
||||||
@ -113,31 +110,30 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
|||||||
if (operation.ExtraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out object? HasOscillation))
|
if (operation.ExtraData.TryGetValue(DetectorDrilling.ExtraDataKeyHasOscillation, out object? HasOscillation))
|
||||||
hasOscillation = Convert.ToBoolean(HasOscillation);
|
hasOscillation = Convert.ToBoolean(HasOscillation);
|
||||||
|
|
||||||
var processMapDrillingCacheItem = new ProcessMapDrillingCache
|
var wavg = CalcWavg(span);
|
||||||
|
var processMapDrillingCacheItem = new DataSaubStat
|
||||||
{
|
{
|
||||||
DateDrillingStart = operation.DateStart,
|
DateStart = operation.DateStart,
|
||||||
DateDrillingEnd = operation.DateEnd,
|
DateEnd = operation.DateEnd,
|
||||||
DepthStart = depthStart,
|
DepthStart = depthStart,
|
||||||
DepthEnd = depthEnd,
|
DepthEnd = depthEnd,
|
||||||
Speed = (depthEnd - depthStart) / ((operation.DateEnd - operation.DateStart).TotalHours),
|
Speed = (depthEnd - depthStart) / ((operation.DateEnd - operation.DateStart).TotalHours),
|
||||||
BlockSpeedSp = span[0].BlockSpeedSp,
|
BlockSpeedSp = span[0].BlockSpeedSp,
|
||||||
Pressure = CalcValue(span, depthEnd - depthStart).Pressure,
|
Pressure = wavg.Pressure,
|
||||||
PressureIdle = span[0].PressureIdle,
|
PressureIdle = span[0].PressureIdle,
|
||||||
PressureSp = span[0].PressureSp,
|
PressureSp = span[0].PressureSp,
|
||||||
AxialLoad = CalcValue(span, depthEnd - depthStart).AxialLoad,
|
AxialLoad = wavg.AxialLoad,
|
||||||
AxialLoadSp = span[0].AxialLoadSp,
|
AxialLoadSp = span[0].AxialLoadSp,
|
||||||
AxialLoadLimitMax = span[0].AxialLoadLimitMax,
|
AxialLoadLimitMax = span[0].AxialLoadLimitMax,
|
||||||
RotorTorque = CalcValue(span, depthEnd - depthStart).RotorTorque,
|
RotorTorque = wavg.RotorTorque,
|
||||||
RotorTorqueSp = span[0].RotorTorqueSp,
|
RotorTorqueSp = span[0].RotorTorqueSp,
|
||||||
RotorTorqueLimitMax = span[0].RotorTorqueLimitMax,
|
RotorTorqueLimitMax = span[0].RotorTorqueLimitMax,
|
||||||
//Значение столбца id_feed_regulator из таблицы “Фильтрованная телеметрия”
|
|
||||||
//в границах временного интервала (диапазоне).
|
|
||||||
IdFeedRegulator = span[0].IdFeedRegulator,
|
IdFeedRegulator = span[0].IdFeedRegulator,
|
||||||
RotorSpeed = CalcValue(span, depthEnd - depthStart).RotorSpeed,
|
RotorSpeed = wavg.RotorSpeed,
|
||||||
//?
|
|
||||||
DetectedOperationCategoryId = operation.IdCategory,
|
DetectedOperationCategoryId = operation.IdCategory,
|
||||||
EnabledSubsystems = operation.EnabledSubsystems,
|
EnabledSubsystems = operation.EnabledSubsystems,
|
||||||
HasOscillation = hasOscillation
|
HasOscillation = hasOscillation,
|
||||||
|
IdTelemetry = operation.IdTelemetry,
|
||||||
};
|
};
|
||||||
return processMapDrillingCacheItem;
|
return processMapDrillingCacheItem;
|
||||||
}
|
}
|
||||||
@ -147,7 +143,7 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
|||||||
double AxialLoad,
|
double AxialLoad,
|
||||||
double RotorTorque,
|
double RotorTorque,
|
||||||
double RotorSpeed
|
double RotorSpeed
|
||||||
) CalcValue(Span<TelemetryDataSaub> span)
|
) CalcWavg(Span<TelemetryDataSaub> span)
|
||||||
{
|
{
|
||||||
var sumPressure = 0.0;
|
var sumPressure = 0.0;
|
||||||
var sumAxialLoad = 0.0;
|
var sumAxialLoad = 0.0;
|
||||||
@ -157,10 +153,10 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
|
|||||||
for (var i = 0; i < span.Length - 1; i++)
|
for (var i = 0; i < span.Length - 1; i++)
|
||||||
{
|
{
|
||||||
var weigth = span[i + 1].WellDepth - span[i].WellDepth;
|
var weigth = span[i + 1].WellDepth - span[i].WellDepth;
|
||||||
sumPressure += () * span[i].Pressure;
|
sumPressure += weigth * span[i].Pressure;
|
||||||
sumAxialLoad += (span[i + 1].WellDepth - span[i].WellDepth) * span[i].AxialLoad;
|
sumAxialLoad += weigth * span[i].AxialLoad;
|
||||||
sumRotorTorque += (span[i + 1].WellDepth - span[i].WellDepth) * span[i].RotorTorque;
|
sumRotorTorque += weigth * span[i].RotorTorque;
|
||||||
sumRotorSpeed += (span[i + 1].WellDepth - span[i].WellDepth) * span[i].RotorSpeed;
|
sumRotorSpeed += weigth * span[i].RotorSpeed;
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
Pressure: sumPressure / diffDepthTotal,
|
Pressure: sumPressure / diffDepthTotal,
|
||||||
|
Loading…
Reference in New Issue
Block a user