2021-11-24 16:16:17 +05:00
using AsbCloudApp.Data ;
using AsbCloudApp.Services ;
using AsbCloudDb.Model ;
using AsbCloudInfrastructure.Services.Cache ;
using Mapster ;
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Threading ;
using System.Threading.Tasks ;
namespace AsbCloudInfrastructure.Services
{
public class SetpointsService : ISetpointsService , IConverter < SetpointsRequestDto , SetpointsRequest >
{
2021-11-24 17:58:53 +05:00
private static readonly Dictionary < string , SetpointInfoDto > SetpointInfos = new ( )
{
{ "pressureSp" , new SetpointInfoDto { Name = "pressureSp" , DisplayName = "Заданное давление в зависимости от режима" } } ,
{ "dPressureMaxSP" , new SetpointInfoDto { Name = "dPressureMaxSP" , DisplayName = "Заданное максимально допустимое дифференциальное рабочее давление" } } ,
{ "pressureRotorSp" , new SetpointInfoDto { Name = "pressureRotorSp" , DisplayName = "Заданное рабочее давление в роторе" } } ,
{ "pressureDevelopSp" , new SetpointInfoDto { Name = "pressureDevelopSp" , DisplayName = "Заданное рабочее давление при проработке" } } ,
{ "pressureSlideSp" , new SetpointInfoDto { Name = "pressureSlideSp" , DisplayName = "Заданное рабочее давление в слайде" } } ,
{ "dPressureMaxRotorSP" , new SetpointInfoDto { Name = "dPressureMaxRotorSP" , DisplayName = "Заданное дифференциальное рабочее давление при бурении в роторе" } } ,
{ "dPressureMaxDevelopSP" , new SetpointInfoDto { Name = "dPressureMaxDevelopSP" , DisplayName = "Заданное дифференциальное рабочее давление при проработке" } } ,
{ "dPressureMaxSlideSP" , new SetpointInfoDto { Name = "dPressureMaxSlideSP" , DisplayName = "Дифференциальное рабочее давление в слайде" } } ,
{ "torqueSp" , new SetpointInfoDto { Name = "torqueSp" , DisplayName = "Момент заданный" } } ,
{ "speedSp" , new SetpointInfoDto { Name = "speedSp" , DisplayName = "Скорость заданная" } } ,
{ "filterSpeedPidTime" , new SetpointInfoDto { Name = "filterSpeedPidTime" , DisplayName = "Время усреднения скорости для регулятора" } } ,
{ "filterSpeedHmiTime" , new SetpointInfoDto { Name = "filterSpeedHmiTime" , DisplayName = "Время усреднения скорости для панели" } } ,
{ "torqueSwitchModeSp" , new SetpointInfoDto { Name = "torqueSwitchModeSp" , DisplayName = "момент для переключения слайд/ротор" } } ,
{ "speedSwitchModeSp" , new SetpointInfoDto { Name = "speedSwitchModeSp" , DisplayName = "Скорость для переключения слайд/ротор" } } ,
{ "speedRotorSp" , new SetpointInfoDto { Name = "speedRotorSp" , DisplayName = "Задание скорости бурения в роторе" } } ,
{ "speedSlideSp" , new SetpointInfoDto { Name = "speedSlideSp" , DisplayName = "Задание скорости бурения в слайде" } } ,
{ "speedDevelopSp" , new SetpointInfoDto { Name = "speedDevelopSp" , DisplayName = "Задание скорости проработки" } } ,
{ "hookWeightSp" , new SetpointInfoDto { Name = "hookWeightSp" , DisplayName = "Рабочий вес накрюке" } } ,
{ "speedOutMax" , new SetpointInfoDto { Name = "speedOutMax" , DisplayName = "Верхний предел аналогового выхода по скорости" } } ,
{ "liftingSpeedMax" , new SetpointInfoDto { Name = "liftingSpeedMax" , DisplayName = "Макс скорость при подъёме" } } ,
{ "loweringSpeedMax" , new SetpointInfoDto { Name = "loweringSpeedMax" , DisplayName = "Макс скорость при спуске СПО" } } ,
{ "dDepthSwitchSp" , new SetpointInfoDto { Name = "dDepthSwitchSp" , DisplayName = "Высота над забоем для перехода на режим спускоподъёмных операций" } } ,
{ "speedSpMax" , new SetpointInfoDto { Name = "speedSpMax" , DisplayName = "Верхняя граница шкалы выходного сигнала задания скорости в инженерных единицах" } } ,
{ "speedSpMin" , new SetpointInfoDto { Name = "speedSpMin" , DisplayName = "Нижняя граница шкалы выходного сигнала задания скорости в инженерных единицах" } } ,
{ "ramp_dSP_g" , new SetpointInfoDto { Name = "ramp_dSP_g" , DisplayName = "темп изменения задания регулятору нагрузки" } } ,
{ "ramp_dSP_P" , new SetpointInfoDto { Name = "ramp_dSP_P" , DisplayName = "темп изменения задания регулятору дифперепада давления" } } ,
{ "ramp_dSP_M" , new SetpointInfoDto { Name = "ramp_dSP_M" , DisplayName = "темп изменения задания регулятору момента" } } ,
{ "T_IdleSp" , new SetpointInfoDto { Name = "T_IdleSp" , DisplayName = "Время контроля простоя в открытом стволе (МИНУТЫ!!!)" } } ,
{ "Break2Sp" , new SetpointInfoDto { Name = "Break2Sp" , DisplayName = "% вспом. тормоз" } } ,
{ "mseNVspMax" , new SetpointInfoDto { Name = "mseNVspMax" , DisplayName = "Задание оптимальной скорости вращения ВСП определённое в результате работы MSE" } } ,
{ "mseAutoSpeedLoAuto" , new SetpointInfoDto { Name = "mseAutoSpeedLoAuto" , DisplayName = "Минимальная скорость проходки для автоматического включения режима М С Е , в % от заданной скорости" } } ,
} ;
2021-11-24 16:16:17 +05:00
private readonly CacheTable < SetpointsRequest > cacheSetpoints ;
private readonly ITelemetryService telemetryService ;
public SetpointsService ( IAsbCloudDbContext db , CacheDb cacheDb , ITelemetryService telemetryService )
{
cacheSetpoints = cacheDb . GetCachedTable < SetpointsRequest > (
( AsbCloudDbContext ) db ,
new List < string > {
nameof ( SetpointsRequest . Author ) ,
nameof ( SetpointsRequest . Well ) ,
} ) ;
this . telemetryService = telemetryService ;
}
public async Task < int > InsertAsync ( SetpointsRequestDto setpoints , CancellationToken token )
{
setpoints . IdState = 1 ;
2021-11-24 17:58:53 +05:00
setpoints . UploadDate = DateTime . Now ;
2021-11-24 16:16:17 +05:00
var inserted = await cacheSetpoints . InsertAsync ( Convert ( setpoints ) , token )
. ConfigureAwait ( false ) ;
return inserted ? . Id ? ? 0 ;
}
public async Task < IEnumerable < SetpointsRequestDto > > GetAsync ( int idWell , CancellationToken token )
{
var entities = await cacheSetpoints . WhereAsync ( s = > s . IdWell = = idWell , token )
. ConfigureAwait ( false ) ;
var dtos = entities . Select ( s = > Convert ( s ) ) ;
return dtos ;
}
public async Task < IEnumerable < SetpointsRequestDto > > GetForPanelAsync ( string uid , CancellationToken token )
{
var idWell = telemetryService . GetidWellByTelemetryUid ( uid ) ? ? - 1 ;
if ( idWell < 0 )
return null ;
2021-11-24 17:58:53 +05:00
var entities = ( await cacheSetpoints . WhereAsync ( s = >
2021-11-24 16:16:17 +05:00
s . IdWell = = idWell & & s . IdState = = 1 & & s . UploadDate . AddSeconds ( s . ObsolescenceSec ) > DateTime . Now ,
token )
2021-11-24 17:58:53 +05:00
. ConfigureAwait ( false ) )
. ToList ( ) ; // без .ToList() работает не правильно.
2021-11-24 16:16:17 +05:00
if ( ! entities . Any ( ) )
return null ;
foreach ( var entity in entities )
entity . IdState = 2 ;
2021-11-24 17:58:53 +05:00
2021-11-24 16:16:17 +05:00
await cacheSetpoints . UpsertAsync ( entities , token )
. ConfigureAwait ( false ) ;
var dtos = entities . Select ( Convert ) ;
return dtos ;
}
public async Task < int > UpdateStateAsync ( string uid , int id , SetpointsRequestDto setpointsRequestDto , CancellationToken token )
{
2021-11-24 17:58:53 +05:00
if ( setpointsRequestDto . IdState ! = 3 & & setpointsRequestDto . IdState ! = 4 )
2021-11-24 16:16:17 +05:00
throw new ArgumentOutOfRangeException ( nameof ( setpointsRequestDto ) , $"{nameof(setpointsRequestDto.IdState)} = {setpointsRequestDto.IdState}. Mast be 3 or 4." ) ;
var idWell = telemetryService . GetidWellByTelemetryUid ( uid ) ? ? - 1 ;
if ( idWell < 0 )
return 0 ;
bool Predicate ( SetpointsRequest s ) = > s . Id = = id & & s . IdWell = = idWell & & s . IdState = = 2 ;
var entity = await cacheSetpoints . FirstOrDefaultAsync ( Predicate , token )
. ConfigureAwait ( false ) ;
2021-11-24 17:58:53 +05:00
if ( entity is null )
return 0 ;
2021-11-24 16:16:17 +05:00
entity . IdState = setpointsRequestDto . IdState ;
await cacheSetpoints . UpsertAsync ( entity , token )
. ConfigureAwait ( false ) ;
return 1 ;
}
public async Task < int > TryDelete ( int idWell , int id , CancellationToken token )
{
bool Predicate ( SetpointsRequest s ) = > s . Id = = id & & s . IdWell = = idWell & & s . IdState = = 1 ;
var isExist = await cacheSetpoints . ContainsAsync ( Predicate , token )
. ConfigureAwait ( false ) ;
if ( ! isExist )
return 0 ;
await cacheSetpoints . RemoveAsync ( Predicate , token )
. ConfigureAwait ( false ) ;
return 1 ;
}
public SetpointsRequest Convert ( SetpointsRequestDto src )
{
var entity = src . Adapt < SetpointsRequest > ( ) ;
return entity ;
}
public SetpointsRequestDto Convert ( SetpointsRequest src )
{
var dto = src . Adapt < SetpointsRequestDto > ( ) ;
return dto ;
}
2021-11-24 17:58:53 +05:00
public IEnumerable < SetpointInfoDto > GetSetpointsNames ( int idWell )
= > SetpointInfos . Values ;
2021-11-24 16:16:17 +05:00
}
}