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 f5cb19a7..8c50e2d6 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 AsbCloudDb.Model;
using AsbCloudInfrastructure.Services.ProcessMap;
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();