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 { /* ## Инфо от АПГ от 26112021 * - осевая нагрузка // есть 1034 Рабочая нагрузка на долото * диф давление в слайде * диф давление роторе * крутящий момент * - обороты ВСП * - расход промывочной жидкости * скорость в слайде * скорость роторе * скорость проработки * - скорость обратной проработке */ private static readonly Dictionary 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 cacheSetpoints; private readonly ITelemetryService telemetryService; public SetpointsService(IAsbCloudDbContext db, CacheDb cacheDb, ITelemetryService telemetryService) { cacheSetpoints = cacheDb.GetCachedTable( (AsbCloudDbContext)db, new List { nameof(SetpointsRequest.Author), nameof(SetpointsRequest.Well), }); this.telemetryService = telemetryService; } public async Task InsertAsync(SetpointsRequestDto setpoints, CancellationToken token) { setpoints.IdState = 1; setpoints.UploadDate = DateTime.Now; var inserted = await cacheSetpoints.InsertAsync(Convert(setpoints), token) .ConfigureAwait(false); return inserted?.Id ?? 0; } public async Task> 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> GetForPanelAsync(string uid, CancellationToken token) { var idWell = telemetryService.GetidWellByTelemetryUid(uid) ?? -1; if (idWell < 0) return null; var entities = (await cacheSetpoints.WhereAsync(s => s.IdWell == idWell && s.IdState == 1 && s.UploadDate.AddSeconds(s.ObsolescenceSec) > DateTime.Now, token) .ConfigureAwait(false)) .ToList();// без .ToList() работает не правильно. if (!entities.Any()) return null; foreach (var entity in entities) entity.IdState = 2; await cacheSetpoints.UpsertAsync(entities, token) .ConfigureAwait(false); var dtos = entities.Select(Convert); return dtos; } public async Task UpdateStateAsync(string uid, int id, SetpointsRequestDto setpointsRequestDto, CancellationToken token) { 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); if (entity is null) return 0; entity.IdState = setpointsRequestDto.IdState; await cacheSetpoints.UpsertAsync(entity, token) .ConfigureAwait(false); return 1; } public async Task 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(); return entity; } public SetpointsRequestDto Convert(SetpointsRequest src) { var dto = src.Adapt(); return dto; } public IEnumerable GetSetpointsNames(int idWell) => SetpointInfos.Values; } }