diff --git a/AsbCloudApp/Services/IProcessMapRepository.cs b/AsbCloudApp/Repositories/IProcessMapRepository.cs similarity index 59% rename from AsbCloudApp/Services/IProcessMapRepository.cs rename to AsbCloudApp/Repositories/IProcessMapRepository.cs index 8c9ab6f0..0bc9ac7b 100644 --- a/AsbCloudApp/Services/IProcessMapRepository.cs +++ b/AsbCloudApp/Repositories/IProcessMapRepository.cs @@ -1,11 +1,14 @@ using AsbCloudApp.Data.ProcessMap; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -namespace AsbCloudApp.Services +namespace AsbCloudApp.Repositories { +#nullable enable /// /// /// @@ -20,5 +23,14 @@ namespace AsbCloudApp.Services /// Task> GetAllAsync(int idWell, DateTime? updateFrom, CancellationToken token = default); + + /// + /// + /// + /// + /// + /// + Task> GetProcessMapAsync(IEnumerable requests, CancellationToken token); } +#nullable disable } \ No newline at end of file diff --git a/AsbCloudApp/Repositories/IWellCompositeRepository.cs b/AsbCloudApp/Repositories/IWellCompositeRepository.cs index c14fd11c..8b24d32f 100644 --- a/AsbCloudApp/Repositories/IWellCompositeRepository.cs +++ b/AsbCloudApp/Repositories/IWellCompositeRepository.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.ProcessMap; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -27,6 +28,14 @@ namespace AsbCloudApp.Repositories /// /// Task SaveAsync(int idWell, IEnumerable wellComposites, CancellationToken token); + + /// + /// Получение РТК по композитной скважине + /// + /// + /// + /// + Task> GetCompositeProcessMap(int idWell, CancellationToken token); } #nullable disable } diff --git a/AsbCloudApp/Requests/MessageRequest.cs b/AsbCloudApp/Requests/MessageRequest.cs new file mode 100644 index 00000000..8f7f06f6 --- /dev/null +++ b/AsbCloudApp/Requests/MessageRequest.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; + +namespace AsbCloudApp.Requests +{ +#nullable enable + /// + /// параметры для запроса списка сообщений + /// + public class MessageRequestBase : RequestBase + { + /// + /// категория + /// + public IEnumerable? Categoryids { get; set; } + + + /// + /// начальная дата + /// + public DateTime? Begin { get; set; } + + /// + /// конечная дата + /// + public DateTime? End { get; set; } + + /// + /// строка поиска + /// + public string? SearchString { get; set; } + + } + + /// + /// параметры для запроса списка сообщений (с id скважины) + /// + public class MessageRequest : MessageRequestBase + { + + /// + /// id скважины + /// + public int IdWell { get; set; } + + /// + /// параметры для запроса списка сообщений (с id скважины) + /// + /// + /// + public MessageRequest(MessageRequestBase request, int idWell) + { + this.IdWell = idWell; + + this.Categoryids = request.Categoryids; + this.Begin = request.Begin; + this.End = request.End; + this.SearchString = request.SearchString; + + this.Skip = request.Skip; + this.Take = request.Take; + this.SortFields = request.SortFields; + } + + } +} diff --git a/AsbCloudApp/Requests/ProcessMapRequest.cs b/AsbCloudApp/Requests/ProcessMapRequest.cs new file mode 100644 index 00000000..55adb7fd --- /dev/null +++ b/AsbCloudApp/Requests/ProcessMapRequest.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; + +namespace AsbCloudApp.Requests +{ +#nullable enable + /// + /// Параметры для запроса получения РТК + /// + public class ProcessMapRequest + { + /// + /// Идентификатор скважины + /// + public int IdWell { get; set; } + + /// + /// Тип секции + /// + public int? IdWellSectionType { get; set; } + + /// + /// Дата обновления + /// + public DateTime? UpdateFrom { get; set; } + } +#nullable disable +} diff --git a/AsbCloudApp/Services/IMessageService.cs b/AsbCloudApp/Services/IMessageService.cs index 0b2261a4..b3abd842 100644 --- a/AsbCloudApp/Services/IMessageService.cs +++ b/AsbCloudApp/Services/IMessageService.cs @@ -1,5 +1,6 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Requests; using System; using System.Collections.Generic; using System.Threading; @@ -15,20 +16,10 @@ namespace AsbCloudApp.Services /// /// Получить сообщения по параметрам /// - /// - /// - /// - /// - /// - /// - /// + /// /// /// - Task> GetMessagesAsync(int idWell, - IEnumerable categoryids = default, DateTime begin = default, - DateTime end = default, string searchString = default, - int skip = 0, int take = 32, - CancellationToken token = default); + Task> GetMessagesAsync(MessageRequest request, CancellationToken token); /// /// Метод для сохранения сообщения от панели diff --git a/AsbCloudApp/Services/IProcessMapService.cs b/AsbCloudApp/Services/IProcessMapService.cs index 3d2eeff4..11bb2846 100644 --- a/AsbCloudApp/Services/IProcessMapService.cs +++ b/AsbCloudApp/Services/IProcessMapService.cs @@ -1,6 +1,5 @@ using AsbCloudApp.Data.ProcessMap; using System.Collections.Generic; -using System.IO; using System.Threading; using System.Threading.Tasks; diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs index eaaad0fc..4772aa0a 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs @@ -141,9 +141,6 @@ new (){ Id = 510, Name="PlannedTrajectory.get", Description="Разрешение просматривать плановая траектория"}, new (){ Id = 511, Name="PlannedTrajectory.edit", Description="Разрешение редактировать плановая траектория"}, new (){ Id = 512, Name="PlannedTrajectory.delete", Description="Разрешение удалять плановая траектория"}, - new (){ Id = 510, Name="TelemetryWirelineRunOut.get", Description="Разрешение просматривать плановая траектория"}, - new (){ Id = 511, Name="TelemetryWirelineRunOut.edit", Description="Разрешение редактировать плановая траектория"}, - new (){ Id = 512, Name="TelemetryWirelineRunOut.delete", Description="Разрешение удалять плановая траектория"}, new (){ Id = 513, Name="ProcessMap.get", Description="Разрешение просматривать РТК"}, new (){ Id = 514, Name="ProcessMap.edit", Description="Разрешение редактировать РТК"}, diff --git a/AsbCloudInfrastructure/PredicateBuilder.cs b/AsbCloudInfrastructure/PredicateBuilder.cs new file mode 100644 index 00000000..ff0bf720 --- /dev/null +++ b/AsbCloudInfrastructure/PredicateBuilder.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; + +namespace AsbCloudInfrastructure +{ +#nullable enable + /// + /// stolen from https://github.com/lotosbin/BinbinPredicateBuilder + /// + public static class PredicateBuilder + { + /// + /// Combines the first predicate with the second using the logical "and". + /// + public static Expression> And(this Expression> first, Expression> second) + { + return first.Compose(second, Expression.AndAlso); + } + + /// + /// Combines the first predicate with the second using the logical "or". + /// + public static Expression> Or(this Expression> first, Expression> second) + { + return first.Compose(second, Expression.OrElse); + } + + /// + /// Negates the predicate. + /// + public static Expression> Not(this Expression> expression) + { + var negated = Expression.Not(expression.Body); + return Expression.Lambda>(negated, expression.Parameters); + } + + private static Expression Compose(this Expression first, Expression second, Func merge) + { + var map = first.Parameters + .Select((f, i) => new { f, s = second.Parameters[i] }) + .ToDictionary(p => p.s, p => p.f); + + var tryReplaceParametr = (Expression node) => + { + if (node is ParameterExpression parameter) + if (map.TryGetValue(parameter, out ParameterExpression? replacement)) + return replacement; + return node; + }; + + var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body); + return Expression.Lambda(merge(first.Body, secondBody), first.Parameters); + } + + class ParameterRebinder : ExpressionVisitor + { + private readonly Dictionary map; + + private ParameterRebinder(Dictionary map) + { + this.map = map; + } + + public static Expression ReplaceParameters(Dictionary map, Expression exp) + { + return new ParameterRebinder(map).Visit(exp); + } + + protected override Expression VisitParameter(ParameterExpression parametr) + { + if (map.TryGetValue(parametr, out ParameterExpression? replacement)) + parametr = replacement; + return parametr; + } + } + } +} +#nullable disable \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs index f24ce61d..09f1f0a4 100644 --- a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs +++ b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs @@ -1,12 +1,17 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.ProcessMap; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; using AsbCloudApp.Services; using AsbCloudDb.Model; +using DocumentFormat.OpenXml.Spreadsheet; using Mapster; using Microsoft.EntityFrameworkCore; +using Org.BouncyCastle.Asn1.Ocsp; using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; @@ -30,7 +35,15 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetAllAsync(int idWell, DateTime? updateFrom, CancellationToken token) { - var entities = await BuildQuery(idWell, updateFrom) + var requests = new[] + { + new ProcessMapRequest { + IdWell = idWell, + UpdateFrom = updateFrom + } + }; + + var entities = await BuildQuery(requests) .OrderBy(e => e.DepthStart) .ThenBy(e => e.Id) .ToListAsync(token) @@ -40,6 +53,15 @@ namespace AsbCloudInfrastructure.Repository return dtos; } + public async Task> GetProcessMapAsync(IEnumerable requests, CancellationToken token) + { + var entities = await BuildQuery(requests) + .ToListAsync(token) + .ConfigureAwait(false); + var dtos = entities.Select(Convert).ToList(); + return dtos; + } + public override async Task InsertAsync(ProcessMapDto dto, CancellationToken token) { @@ -56,18 +78,31 @@ namespace AsbCloudInfrastructure.Repository return result; } - - private IQueryable BuildQuery(int idWell, DateTime? updateFrom) + private IQueryable BuildQuery(IEnumerable requests) { - var query = GetQuery().Where(e => e.IdWell == idWell); - - if (updateFrom is not null) + var query = GetQuery(); + if (requests.Any()) { - var timezone = wellService.GetTimezone(idWell); - var updateFromUtc = updateFrom?.ToUtcDateTimeOffset(timezone.Hours); - query.Where(e => e.LastUpdate >= updateFromUtc); - } + Expression> predicate = map => false; + foreach (var request in requests) + { + Expression> predicate2 = map => map.IdWell == request.IdWell; + if (request.IdWellSectionType is not null) + predicate2 = predicate2.And(map => map.IdWellSectionType == request.IdWellSectionType); + + if (request.UpdateFrom is not null) + { + var timezone = wellService.GetTimezone(request.IdWell); + var updateFromUtc = request.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); + predicate2 = predicate2.And(map => map.LastUpdate >= updateFromUtc); + } + + predicate = predicate.Or(predicate2); + } + query = query.Where(predicate); + + } return query; } protected override ProcessMapDto Convert(ProcessMap entity) diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index de56ee60..d9b7b8ab 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -1,8 +1,11 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.ProcessMap; using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -14,10 +17,12 @@ namespace AsbCloudInfrastructure.Repository public class WellCompositeRepository : IWellCompositeRepository { private readonly IAsbCloudDbContext db; + private readonly IProcessMapRepository processMapRepository; - public WellCompositeRepository(IAsbCloudDbContext db) + public WellCompositeRepository(IAsbCloudDbContext db, IProcessMapRepository processMapRepository) { this.db = db; + this.processMapRepository = processMapRepository; } /// @@ -44,6 +49,51 @@ namespace AsbCloudInfrastructure.Repository return db.SaveChangesAsync(token); } + /// + public async Task> GetCompositeProcessMap(int idWell, CancellationToken token) + { + var dtos = await GetAsync(idWell, token); + + var requests = dtos.Select(x => new ProcessMapRequest { + IdWell = x.IdWellSrc, + IdWellSectionType = x.IdWellSectionType + }); + + var processMap = await processMapRepository.GetProcessMapAsync(requests, token); + + var result = processMap.Select(x => new ProcessMapDto + { + IdWell = x.IdWell, + IdWellSectionType = x.IdWellSectionType, + RopPlan = x.RopPlan, + DepthStart = x.DepthStart, + DepthEnd = x.DepthEnd, + AxialLoad = new PlanFactDto + { + Plan = x.AxialLoad.Fact ?? x.AxialLoad.Plan, + }, + Flow = new PlanFactDto + { + Plan = x.Flow.Fact ?? x.Flow.Plan + }, + Pressure = new PlanFactDto + { + Plan = x.Pressure.Fact ?? x.Pressure.Plan + }, + TopDriveSpeed = new PlanFactDto + { + Plan = x.TopDriveSpeed.Fact ?? x.TopDriveSpeed.Plan + }, + TopDriveTorque = new PlanFactDto + { + Plan = x.TopDriveTorque.Fact ?? x.TopDriveTorque.Plan + }, + LastUpdate = DateTime.UtcNow + }); + + return result; + } + private static WellComposite Convert(int idWell, WellCompositeDto dto) { var entity = dto.Adapt(); diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs index 2b932368..0ede2e82 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs @@ -43,6 +43,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap this.subsystemOperationTimeService = subsystemOperationTimeService; } + /// public async Task> GetProcessMapAsync(int idWell, CancellationToken token) { var well = wellService.GetOrDefault(idWell) diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index 1911029a..cd4a1749 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -1,6 +1,8 @@ using AsbCloudApp.Data; using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Requests; using AsbCloudApp.Services; +using AsbCloudDb; using AsbCloudDb.Model; using AsbCloudInfrastructure.EfCache; using Mapster; @@ -11,6 +13,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +#nullable enable namespace AsbCloudInfrastructure.Services.SAUB { public class MessageService : IMessageService @@ -24,41 +27,39 @@ namespace AsbCloudInfrastructure.Services.SAUB this.telemetryService = telemetryService; } - public async Task> GetMessagesAsync( - int idWell, - IEnumerable categoryids = default, - DateTime begin = default, - DateTime end = default, - string searchString = default, - int skip = 0, - int take = 32, - CancellationToken token = default) + public async Task> GetMessagesAsync(MessageRequest request, CancellationToken token) { - var idTelemetry = telemetryService.GetOrDefaultIdTelemetryByIdWell(idWell); + var result = new PaginationContainer + { + Skip = request.Skip ?? 0, + Take = request.Take ?? 32, + }; + + var idTelemetry = telemetryService.GetOrDefaultIdTelemetryByIdWell(request.IdWell); if (idTelemetry is null) - return null; + return result; var allEvents = await db.TelemetryEvents.FromCacheAsync(token); var events = allEvents.Where(e => e.IdTelemetry == idTelemetry); if (!events.Any()) - return null; + return result; var query = db.TelemetryMessages.Where(m => m.IdTelemetry == idTelemetry) .OrderBy(m => m.DateTime).AsNoTracking(); - if (categoryids?.Any() == true || !string.IsNullOrEmpty(searchString)) + if (request.Categoryids?.Any() == true || !string.IsNullOrEmpty(request.SearchString)) { - if (!string.IsNullOrEmpty(searchString)) - events = events.Where(e => e.MessageTemplate.Contains(searchString, StringComparison.OrdinalIgnoreCase)); + if (!string.IsNullOrEmpty(request.SearchString)) + events = events.Where(e => e.MessageTemplate.Contains(request.SearchString, StringComparison.OrdinalIgnoreCase)); - if (categoryids?.Any() == true) - events = events.Where(e => categoryids.ToList().Contains(e.IdCategory)); + if (request.Categoryids?.Any() == true) + events = events.Where(e => request.Categoryids.ToList().Contains(e.IdCategory)); var eventIds = events.Select(e => e.IdEvent); if (!eventIds.Any()) - return null; + return result; query = query.Where(m => eventIds.Contains(m.IdEvent)); } @@ -67,30 +68,27 @@ namespace AsbCloudInfrastructure.Services.SAUB var timezone = telemetryService.GetTimezone(idTelemetry ?? default); - if (begin != default) + if (request.Begin is not null) { - var beginUtc = begin.ToUtcDateTimeOffset(timezone.Hours); + var beginUtc = request.Begin.Value.ToUtcDateTimeOffset(timezone.Hours); query = query.Where(m => m.DateTime >= beginUtc); } - if (end != default) + if (request.End is not null) { - var endUtc = end.ToUtcDateTimeOffset(timezone.Hours); + var endUtc = request.End.Value.ToUtcDateTimeOffset(timezone.Hours); query = query.Where(m => m.DateTime <= endUtc); } - var result = new PaginationContainer + result.Count = query.Count(); + + if (request.SortFields?.Any() == true) { - Skip = skip, - Take = take, - Count = query.Count() - }; - - if (skip > 0) - query = query.Skip(skip); - - var messagesList = await query.Take(take).AsNoTracking() - .ToListAsync(token).ConfigureAwait(false); + query = query.SortBy(request.SortFields); + } + var messagesList = await query.Skip(result.Skip) + .Take(result.Take).AsNoTracking() + .ToListAsync(token).ConfigureAwait(false); if (messagesList.Count == 0) return result; @@ -98,6 +96,9 @@ namespace AsbCloudInfrastructure.Services.SAUB var allUsers = await db.TelemetryUsers.FromCacheAsync(token); var users = allUsers.Where(u => u.IdTelemetry == idTelemetry); + var eventsDict = events.ToDictionary(x=>x.IdEvent, x => x); + var usersDict = users.ToDictionary(x => x.IdUser, x => x); + foreach (var message in messagesList) { var messageDto = new MessageDto @@ -110,17 +111,15 @@ namespace AsbCloudInfrastructure.Services.SAUB if (message.IdTelemetryUser is not null) { - if (users.Any()) + if (usersDict.TryGetValue((int)message.IdTelemetryUser, out TelemetryUser? user)) { - var user = users.FirstOrDefault(u => u.IdUser == message.IdTelemetryUser); messageDto.User = user.MakeDisplayName(); } else messageDto.User = message.IdTelemetryUser.ToString(); } - var e = events.FirstOrDefault(e => e.IdEvent == message.IdEvent); - if (e != null) + if (eventsDict.TryGetValue(message.IdEvent, out TelemetryEvent? e)) { messageDto.CategoryId = e.IdCategory; messageDto.Message = e.MakeMessageText(message); @@ -136,7 +135,7 @@ namespace AsbCloudInfrastructure.Services.SAUB CancellationToken token = default) { if (!dtos.Any()) - return null; + return Task.CompletedTask; var telemetryId = telemetryService.GetOrCreateTelemetryIdByUid(uid); var timezone = telemetryService.GetTimezone(telemetryId); @@ -154,3 +153,4 @@ namespace AsbCloudInfrastructure.Services.SAUB } } } +#nullable disable diff --git a/AsbCloudWebApi/Controllers/ProcessMapController.cs b/AsbCloudWebApi/Controllers/ProcessMapController.cs index 6f26f939..2837af73 100644 --- a/AsbCloudWebApi/Controllers/ProcessMapController.cs +++ b/AsbCloudWebApi/Controllers/ProcessMapController.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data.ProcessMap; +using AsbCloudApp.Repositories; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; diff --git a/AsbCloudWebApi/Controllers/SAUB/MessageController.cs b/AsbCloudWebApi/Controllers/SAUB/MessageController.cs index 00f6fd6e..89c40692 100644 --- a/AsbCloudWebApi/Controllers/SAUB/MessageController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/MessageController.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Requests; using AsbCloudApp.Services; using Microsoft.AspNetCore.Mvc; using System; @@ -28,29 +29,30 @@ namespace AsbCloudWebApi.Controllers.SAUB /// Выдает список сообщений по скважине /// /// id скважины - /// список категорий - /// дата начала - /// окончание - /// для пагинации кол-во записей пропустить - /// для пагинации кол-во записей - /// Строка поиска + /// Параметры запроса /// Токен для отмены задачи /// список сообщений по скважине [HttpGet] [Permission] [ProducesResponseType(typeof(PaginationContainer), (int)System.Net.HttpStatusCode.OK)] - public async Task GetMessagesAsync(int idWell, int skip = 0, int take = 32, - [FromQuery] IEnumerable categoryids = default, - DateTime begin = default, DateTime end = default, - string searchString = default, - CancellationToken token = default) + public async Task GetMessagesAsync( + [FromRoute] int idWell, + [FromQuery] MessageRequestBase request, + CancellationToken token = default) { - if (take > 1024) + + if (!await UserHasAccesToWellAsync(idWell, token)) + return Forbid(); + + if (request.Take > 1024) return BadRequest("limit mast be less then 1024"); - var result = await messageService.GetMessagesAsync(idWell, - categoryids, begin, end, searchString, - skip, take, token).ConfigureAwait(false); + var requestToService = new MessageRequest(request, idWell); + + var result = await messageService.GetMessagesAsync( + requestToService, + token) + .ConfigureAwait(false); if (result is null || result.Count == 0) return NoContent(); @@ -85,5 +87,15 @@ namespace AsbCloudWebApi.Controllers.SAUB return Ok(wellMessagesDatesRange); } + + protected async Task UserHasAccesToWellAsync(int idWell, CancellationToken token) + { + var idCompany = User.GetCompanyId(); + if (idCompany is not null && + await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, idWell, token) + .ConfigureAwait(false)) + return true; + return false; + } } } diff --git a/AsbCloudWebApi/Controllers/WellCompositeController.cs b/AsbCloudWebApi/Controllers/WellCompositeController.cs index c6f5c9cf..66a0d65b 100644 --- a/AsbCloudWebApi/Controllers/WellCompositeController.cs +++ b/AsbCloudWebApi/Controllers/WellCompositeController.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.ProcessMap; using AsbCloudApp.Repositories; using AsbCloudApp.Services; using Microsoft.AspNetCore.Authorization; @@ -21,7 +22,8 @@ namespace AsbCloudWebApi.Controllers private readonly IWellCompositeRepository wellCompositeRepository; private readonly IWellService wellService; - public WellCompositeController(IWellCompositeRepository wellCompositeRepository, IWellService wellService) + public WellCompositeController(IWellCompositeRepository wellCompositeRepository, + IWellService wellService) { this.wellCompositeRepository = wellCompositeRepository; this.wellService = wellService; @@ -63,6 +65,24 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } + /// + /// Получение РТК по композитной скважине + /// + /// + /// + /// + [HttpGet("getCompositeProcessMap")] + [Permission] + [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] + public async Task GetCompositeProcessMap(int idWell, CancellationToken token = default) + { + if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) + return Forbid(); + + var result = await wellCompositeRepository.GetCompositeProcessMap(idWell, token).ConfigureAwait(false); + return Ok(result); + } + private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token = default) { int? idCompany = User.GetCompanyId();