DD.WellWorkover.Cloud/AsbCloudInfrastructure/Services/SetpointsService.cs

165 lines
10 KiB
C#
Raw Normal View History

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 = "Минимальная скорость проходки для автоматического включения режима МСЕ, в % от заданной скорости" } },
};
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;
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 =>
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() работает не правильно.
if (!entities.Any())
return null;
foreach (var entity in entities)
entity.IdState = 2;
2021-11-24 17:58:53 +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)
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;
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;
}
}