using AsbCloudApp.Data.SAUB; 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.SAUB { public class SetpointsService : ISetpointsService, IConverter { // ## Инфо от АПГ от 26.11.2021, дополнения ШОВ от 26.11.2021 private static readonly Dictionary SetpointInfos = new() { { "bitLoad", new SetpointInfoDto { Name = "bitLoad", DisplayName = "Осевая нагрузка, т" } }, { "dPressureMaxRotorSP", new SetpointInfoDto { Name = "dPressureMaxRotorSP", DisplayName = "Дифференциальное рабочее давление в роторе, атм" } }, { "dPressureMaxSlideSP", new SetpointInfoDto { Name = "dPressureMaxSlideSP", DisplayName = "Дифференциальное рабочее давление в слайде, атм" } }, { "torque", new SetpointInfoDto { Name = "torque", DisplayName = "Крутящий момент, кН*м" } }, { "speedRotorSp", new SetpointInfoDto { Name = "speedRotorSp", DisplayName = "Скорость бурения в роторе, м/ч" } }, { "speedSlideSp", new SetpointInfoDto { Name = "speedSlideSp", DisplayName = "Скорость бурения в слайде, м/ч" } }, { "speedDevelopSp", new SetpointInfoDto { Name = "speedDevelopSp", DisplayName = "Скорость проработки, м/ч" } }, { "torque_pid_out_limit", new SetpointInfoDto { Name = "torque_pid_out_limit", DisplayName = "Торк мастер. Допустимый процент отклонения от заданой скорости вращения" } }, // Такая же что и прямой //{ "", new SetpointInfoDto { Name = "", DisplayName = "Обороты ВСП, об/мин" } }, // Оно в ПЛК спинмастера, пока сделать нельзя, позднее можно. //{ "", new SetpointInfoDto { Name = "", DisplayName = "Расход промывочной жидкости, л/с" } }, // Нет в контроллере }; private readonly CacheTable cacheSetpoints; private readonly ITelemetryService telemetryService; public SetpointsService(IAsbCloudDbContext db, CacheDb cacheDb, ITelemetryService telemetryService) { cacheSetpoints = cacheDb.GetCachedTable( (AsbCloudDbContext)db, nameof(SetpointsRequest.Author), nameof(SetpointsRequest.Well)); this.telemetryService = telemetryService; } public async Task InsertAsync(SetpointsRequestDto setpoints, CancellationToken token) { setpoints.IdState = 1; setpoints.UploadDate = DateTime.UtcNow; var dto = Convert(setpoints); var inserted = await cacheSetpoints.InsertAsync(dto, 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; } }