forked from ddrilling/AsbCloudServer
Add DetectorFlashing
This commit is contained in:
parent
7b99e0fc88
commit
48cee90d91
@ -65,7 +65,7 @@ namespace AsbCloudDb
|
|||||||
{
|
{
|
||||||
var factory = GetQueryStringFactory(dbSet);
|
var factory = GetQueryStringFactory(dbSet);
|
||||||
var query = factory.MakeInsertOrUpdateSql(items);
|
var query = factory.MakeInsertOrUpdateSql(items);
|
||||||
|
|
||||||
return database.ExecuteSqlRawAsync(query, token);
|
return database.ExecuteSqlRawAsync(query, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +130,10 @@ namespace AsbCloudDb
|
|||||||
pk = pkColsNames is null ? string.Empty : $"({string.Join(", ", pkColsNames)})";
|
pk = pkColsNames is null ? string.Empty : $"({string.Join(", ", pkColsNames)})";
|
||||||
|
|
||||||
TableName = dbset.EntityType.GetTableName()!;
|
TableName = dbset.EntityType.GetTableName()!;
|
||||||
getters = properties.Select(p => p.GetGetter());
|
getters = properties
|
||||||
|
.Where(p => !p.IsShadowProperty())
|
||||||
|
.Select(p => p.GetGetter()).ToList();
|
||||||
|
|
||||||
Columns = properties.Select(p => $"\"{p.GetColumnBaseName()}\"");
|
Columns = properties.Select(p => $"\"{p.GetColumnBaseName()}\"");
|
||||||
var colunmsString = $"({string.Join(", ", Columns)})";
|
var colunmsString = $"({string.Join(", ", Columns)})";
|
||||||
|
|
||||||
@ -175,13 +178,21 @@ namespace AsbCloudDb
|
|||||||
private static string FormatValue(object? v)
|
private static string FormatValue(object? v)
|
||||||
=> v switch
|
=> v switch
|
||||||
{
|
{
|
||||||
string vStr => $"'{vStr}'",
|
string vStr => $"'{EscapeCurlyBraces(vStr)}'",
|
||||||
DateTime vDate => $"'{FormatDateValue(vDate)}'",
|
DateTime vDate => $"'{FormatDateValue(vDate)}'",
|
||||||
DateTimeOffset vDate => $"'{FormatDateValue(vDate.UtcDateTime)}'",
|
DateTimeOffset vDate => $"'{FormatDateValue(vDate.UtcDateTime)}'",
|
||||||
IFormattable vFormattable => FormatFormattableValue(vFormattable),
|
IFormattable vFormattable => FormatFormattableValue(vFormattable),
|
||||||
_ => System.Text.Json.JsonSerializer.Serialize(v),
|
_ => System.Text.Json.JsonSerializer.Serialize(v),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private static string EscapeCurlyBraces(string vStr)
|
||||||
|
{
|
||||||
|
var result = vStr
|
||||||
|
.Replace("{", "{{")
|
||||||
|
.Replace("}", "}}");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
private static string FormatFormattableValue(IFormattable v)
|
private static string FormatFormattableValue(IFormattable v)
|
||||||
=> v switch
|
=> v switch
|
||||||
{
|
{
|
||||||
|
6089
AsbCloudDb/Migrations/20220719050312_Add_Well_operation_Flashing.Designer.cs
generated
Normal file
6089
AsbCloudDb/Migrations/20220719050312_Add_Well_operation_Flashing.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,25 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace AsbCloudDb.Migrations
|
||||||
|
{
|
||||||
|
public partial class Add_Well_operation_Flashing : Migration
|
||||||
|
{
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.InsertData(
|
||||||
|
table: "t_well_operation_category",
|
||||||
|
columns: new[] { "id", "code", "name" },
|
||||||
|
values: new object[] { 20, 0, "Промывка перед наращиванием" });
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DeleteData(
|
||||||
|
table: "t_well_operation_category",
|
||||||
|
keyColumn: "id",
|
||||||
|
keyValue: 20);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -4175,6 +4175,12 @@ namespace AsbCloudDb.Migrations
|
|||||||
Name = "Шаблонировка перед наращиванием"
|
Name = "Шаблонировка перед наращиванием"
|
||||||
},
|
},
|
||||||
new
|
new
|
||||||
|
{
|
||||||
|
Id = 20,
|
||||||
|
Code = 0,
|
||||||
|
Name = "Шаблонировка перед наращиванием"
|
||||||
|
},
|
||||||
|
new
|
||||||
{
|
{
|
||||||
Id = 1001,
|
Id = 1001,
|
||||||
Code = 0,
|
Code = 0,
|
||||||
@ -4732,7 +4738,7 @@ namespace AsbCloudDb.Migrations
|
|||||||
|
|
||||||
b.HasKey("IdTelemetry", "DateTime");
|
b.HasKey("IdTelemetry", "DateTime");
|
||||||
|
|
||||||
b.ToTable("RecordBase");
|
b.ToTable("t_telemetry_wits_base");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b =>
|
modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b =>
|
||||||
|
@ -683,6 +683,7 @@ namespace AsbCloudDb.Model
|
|||||||
new WellOperationCategory {Id = 17, Name = "На поверхности", Code = 0 },
|
new WellOperationCategory {Id = 17, Name = "На поверхности", Code = 0 },
|
||||||
new WellOperationCategory {Id = 18, Name = "Проработка перед наращиванием", Code = 0 },
|
new WellOperationCategory {Id = 18, Name = "Проработка перед наращиванием", Code = 0 },
|
||||||
new WellOperationCategory {Id = 19, Name = "Шаблонировка перед наращиванием", Code = 0 },
|
new WellOperationCategory {Id = 19, Name = "Шаблонировка перед наращиванием", Code = 0 },
|
||||||
|
new WellOperationCategory {Id = 20, Name = "Промывка перед наращиванием", Code = 0 },
|
||||||
|
|
||||||
// Операции ручного ввода
|
// Операции ручного ввода
|
||||||
new WellOperationCategory {Id = 1001, Name = "Бурение", Code = 0 },
|
new WellOperationCategory {Id = 1001, Name = "Бурение", Code = 0 },
|
||||||
|
@ -195,10 +195,13 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
|
|
||||||
private bool CheckPassword(string passwordHash, string password)
|
private bool CheckPassword(string passwordHash, string password)
|
||||||
{
|
{
|
||||||
if (passwordHash.Length == 0 && password.Length == 0)
|
if (passwordHash?.Length == 0 && password.Length == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (passwordHash.Length < PasswordSaltLength)
|
if (passwordHash?.Length < PasswordSaltLength)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (passwordHash is null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
var salt = passwordHash[0..PasswordSaltLength];
|
var salt = passwordHash[0..PasswordSaltLength];
|
||||||
|
@ -258,6 +258,27 @@ namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static bool DeviatesFromBegin(
|
||||||
|
DetectableTelemetry[] telemetry,
|
||||||
|
Func<DetectableTelemetry, double> getter,
|
||||||
|
int begin,
|
||||||
|
int count,
|
||||||
|
double deviation)
|
||||||
|
{
|
||||||
|
var beginPointValue = getter(telemetry[begin]);
|
||||||
|
var end = begin + count;
|
||||||
|
end = end < telemetry.Length ? end : telemetry.Length;
|
||||||
|
var step = count > 15 ? count / 5 : count > 3 ? 3 : 1;
|
||||||
|
for (var i = begin; i < end; i += step)
|
||||||
|
{
|
||||||
|
var item = telemetry[i];
|
||||||
|
var itemValue = getter(item);
|
||||||
|
if (Math.Abs(beginPointValue - itemValue) > deviation)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
using AsbCloudDb.Model;
|
||||||
|
|
||||||
|
namespace AsbCloudInfrastructure.Services.DetectOperations.Detectors
|
||||||
|
{
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Промывка перед наращиванием
|
||||||
|
/// </summary>
|
||||||
|
internal class DetectorFlashing : DetectorAbstract
|
||||||
|
{
|
||||||
|
public DetectorFlashing()
|
||||||
|
: base(20) { }
|
||||||
|
|
||||||
|
protected override double CalcValue(DetectableTelemetry[] telemetry, int begin, int end)
|
||||||
|
=> CalcDeltaMinutes(telemetry, begin, end);
|
||||||
|
|
||||||
|
protected override bool DetectBegin(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation)
|
||||||
|
{
|
||||||
|
if (!((previousOperation?.IdCategory == 2) ||
|
||||||
|
(previousOperation?.IdCategory == 3)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var point0 = telemetry[position];
|
||||||
|
var delta = point0.WellDepth - point0.BitDepth;
|
||||||
|
if (delta > 0.05d)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (point0.Pressure < 15)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (point0.BlockPosition > 3)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool DetectEnd(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation)
|
||||||
|
{
|
||||||
|
var point0 = telemetry[position];
|
||||||
|
var delta = point0.WellDepth - point0.BitDepth;
|
||||||
|
if ((delta > 0.03d )
|
||||||
|
&& (point0.Pressure > 15)
|
||||||
|
&& DeviatesFromBegin(telemetry, t=>t.BlockPosition, position, 300, 1))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool IsValid(DetectableTelemetry[] telemetry, int begin, int end)
|
||||||
|
=> IsValidByWellDepthDoesNotChange(telemetry, begin, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
}
|
||||||
|
|
@ -25,6 +25,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations
|
|||||||
new DetectorDevelopment(),
|
new DetectorDevelopment(),
|
||||||
new DetectorTemplating(),
|
new DetectorTemplating(),
|
||||||
new DetectorSlipsTime(),
|
new DetectorSlipsTime(),
|
||||||
|
new DetectorFlashing(),
|
||||||
};
|
};
|
||||||
|
|
||||||
public OperationDetectionBackgroundService(IConfiguration configuration)
|
public OperationDetectionBackgroundService(IConfiguration configuration)
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
# Алгоритм определения промывки перед проработкой/ шаблонировкой перед наращиванием
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
Промывка перед проработкой/ шаблонировкой перед наращиванием – операция, во время которой после добуривания очередной трубы происходит снижение осевой нагрузки и дифференциального давления, талевый блок остается условно неподвижным.
|
||||||
|
|
||||||
|
Проработка перед наращиванием определяется как время между:
|
||||||
|
- окончанием операции бурения (ротор/ слайд/ ручное бурение)
|
||||||
|
- началом операции проработки/ шаблонировки перед наращивании
|
||||||
|
|
||||||
|
## Метод определения
|
||||||
|
|
||||||
|
Признак начала операции =
|
||||||
|
( предыдущая операция == бурение в роторе или слайде)
|
||||||
|
( расстояние от долота до забоя < 0,05м ) И
|
||||||
|
( давление > 15 атм ) И
|
||||||
|
( положение блока < 3м )
|
||||||
|
|
||||||
|
Признак окончания операции =
|
||||||
|
( расстояние от долота до забоя > 0.03м ) И
|
||||||
|
( давление > 15 атм ) И
|
||||||
|
( высота блока изменяется больше чем на 1м в течении 300 сек с начала операции);
|
||||||
|
|
||||||
|
|
||||||
|
## Ключевой параметр
|
||||||
|
Продолжительность операции.
|
@ -1,4 +1,5 @@
|
|||||||
using AsbCloudApp.Services;
|
using AsbCloudApp.Services;
|
||||||
|
using AsbCloudDb;
|
||||||
using AsbCloudDb.Model;
|
using AsbCloudDb.Model;
|
||||||
using Mapster;
|
using Mapster;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
@ -71,8 +72,9 @@ namespace AsbCloudInfrastructure.Services
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
|
||||||
var timezoneHours = telemetryService.GetTimezone(idTelemetry).Hours;
|
var timezoneHours = telemetryService.GetTimezone(idTelemetry).Hours;
|
||||||
var entities = dtos.Select(dto => Convert(dto, idTelemetry, timezoneHours));
|
var entities = dtos
|
||||||
|
.DistinctBy(d => d.DateTime)
|
||||||
|
.Select(dto => Convert(dto, idTelemetry, timezoneHours));
|
||||||
dbset.AddRange(entities);
|
dbset.AddRange(entities);
|
||||||
return db.SaveChangesAsync(token);
|
return db.SaveChangesAsync(token);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user