forked from ddrilling/AsbCloudServer
Merge branch 'dev' into feature/trajectory_import
This commit is contained in:
commit
102eadb301
59
AsbCloudApp/Requests/TelemetryRequest.cs
Normal file
59
AsbCloudApp/Requests/TelemetryRequest.cs
Normal file
@ -0,0 +1,59 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace AsbCloudApp.Requests;
|
||||
|
||||
/// <summary>
|
||||
/// Параметры запроса телеметрии
|
||||
/// </summary>
|
||||
public class TelemetryDataRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// Максимально допустимое кол-во строк данных
|
||||
/// </summary>
|
||||
public const int MaxTake = 3072;
|
||||
|
||||
/// <summary>
|
||||
/// greater or equal then Date
|
||||
/// </summary>
|
||||
public DateTimeOffset? GeDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// less or equal then Date
|
||||
/// </summary>
|
||||
public DateTimeOffset? LeDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Делитель для прореживания выборки.
|
||||
/// <list type="bullet">
|
||||
/// <item>1 - без прореживания (default); </item>
|
||||
/// <item>2 - каждое 2-е значение; </item>
|
||||
/// <item>10 - каждое 10-е значение; </item>
|
||||
/// </list>
|
||||
/// </summary>
|
||||
[Range(0, 300)]
|
||||
public int Divider { get; set; } = 1;
|
||||
|
||||
/// <summary>
|
||||
/// сортировка/выравнивание данных в запросе по дате
|
||||
/// <list type="bullet">
|
||||
/// <item>0 - более ранние данные вперед; </item>
|
||||
/// <item>1 - более поздние данные вперед; </item>
|
||||
/// </list>
|
||||
/// </summary>
|
||||
[Range(0, 1)]
|
||||
public int Order { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// Пропустить с начала
|
||||
/// </summary>
|
||||
[Range(0, int.MaxValue)]
|
||||
public int Skip { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// Кол-во возвращаемых, но не больше MaxTake
|
||||
/// </summary>
|
||||
[Range(1, MaxTake)]
|
||||
public int Take { get; set; } = 1024;
|
||||
|
||||
}
|
@ -6,9 +6,9 @@ using System.Threading.Tasks;
|
||||
namespace AsbCloudApp.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// Сервис формирования РТК
|
||||
/// Сервис РТК
|
||||
/// </summary>
|
||||
public interface IProcessMapReportService
|
||||
public interface IProcessMapService
|
||||
{
|
||||
/// <summary>
|
||||
/// Получение моделей РТК
|
||||
|
@ -1,4 +1,5 @@
|
||||
using AsbCloudApp.Data;
|
||||
using AsbCloudApp.Requests;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
@ -25,6 +26,7 @@ namespace AsbCloudApp.Services
|
||||
Task<IEnumerable<TDto>> GetAsync(int idWell,
|
||||
DateTime dateBegin = default, double intervalSec = 600d,
|
||||
int approxPointsCount = 1024, CancellationToken token = default);
|
||||
Task<IEnumerable<TDto>> GetAsync(int idWell, TelemetryDataRequest request, CancellationToken token);
|
||||
|
||||
/// <summary>
|
||||
/// Получение статистики за период
|
||||
|
8413
AsbCloudDb/Migrations/20230913063219_Add_New_Permissions.Designer.cs
generated
Normal file
8413
AsbCloudDb/Migrations/20230913063219_Add_New_Permissions.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
53
AsbCloudDb/Migrations/20230913063219_Add_New_Permissions.cs
Normal file
53
AsbCloudDb/Migrations/20230913063219_Add_New_Permissions.cs
Normal file
@ -0,0 +1,53 @@
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace AsbCloudDb.Migrations
|
||||
{
|
||||
public partial class Add_New_Permissions : Migration
|
||||
{
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.InsertData(
|
||||
table: "t_permission",
|
||||
columns: new[] { "id", "description", "name" },
|
||||
values: new object[,]
|
||||
{
|
||||
{ 525, "Разрешение на редактирование РТК у завершенной скважины", "ProcessMap.editCompletedWell" },
|
||||
{ 526, "Разрешение на редактирование операций у завершенной скважины", "WellOperation.editCompletedWell" }
|
||||
});
|
||||
|
||||
migrationBuilder.InsertData(
|
||||
table: "t_relation_user_role_permission",
|
||||
columns: new[] { "id_permission", "id_user_role" },
|
||||
values: new object[,]
|
||||
{
|
||||
{ 525, 1 },
|
||||
{ 526, 1 }
|
||||
});
|
||||
}
|
||||
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DeleteData(
|
||||
table: "t_relation_user_role_permission",
|
||||
keyColumns: new[] { "id_permission", "id_user_role" },
|
||||
keyValues: new object[] { 525, 1 });
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "t_relation_user_role_permission",
|
||||
keyColumns: new[] { "id_permission", "id_user_role" },
|
||||
keyValues: new object[] { 526, 1 });
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "t_permission",
|
||||
keyColumn: "id",
|
||||
keyValue: 525);
|
||||
|
||||
migrationBuilder.DeleteData(
|
||||
table: "t_permission",
|
||||
keyColumn: "id",
|
||||
keyValue: 526);
|
||||
}
|
||||
}
|
||||
}
|
@ -2163,6 +2163,18 @@ namespace AsbCloudDb.Migrations
|
||||
Id = 522,
|
||||
Description = "Разрешить удаление всех настроек пользователя",
|
||||
Name = "UserSettings.delete"
|
||||
},
|
||||
new
|
||||
{
|
||||
Id = 525,
|
||||
Description = "Разрешение на редактирование РТК у завершенной скважины",
|
||||
Name = "ProcessMap.editCompletedWell"
|
||||
},
|
||||
new
|
||||
{
|
||||
Id = 526,
|
||||
Description = "Разрешение на редактирование операций у завершенной скважины",
|
||||
Name = "WellOperation.editCompletedWell"
|
||||
});
|
||||
});
|
||||
|
||||
@ -3705,6 +3717,16 @@ namespace AsbCloudDb.Migrations
|
||||
{
|
||||
IdUserRole = 1,
|
||||
IdPermission = 522
|
||||
},
|
||||
new
|
||||
{
|
||||
IdUserRole = 1,
|
||||
IdPermission = 525
|
||||
},
|
||||
new
|
||||
{
|
||||
IdUserRole = 1,
|
||||
IdPermission = 526
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -156,6 +156,9 @@
|
||||
new() { Id = 521, Name = "HelpPage.edit", Description = "Разрешить создание справок по страницам"},
|
||||
|
||||
new() { Id = 522, Name = "UserSettings.delete", Description = "Разрешить удаление всех настроек пользователя"},
|
||||
|
||||
new (){ Id = 525, Name = "ProcessMap.editCompletedWell", Description = "Разрешение на редактирование РТК у завершенной скважины"},
|
||||
new (){ Id = 526, Name = "WellOperation.editCompletedWell", Description = "Разрешение на редактирование операций у завершенной скважины"}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -58,7 +58,6 @@ namespace AsbCloudDb.Model.DefaultData
|
||||
new (){ IdUserRole = 2005, IdPermission = 247}, new (){ IdUserRole = 2005, IdPermission = 205}, new (){ IdUserRole = 2005, IdPermission = 204},
|
||||
new (){ IdUserRole = 2006, IdPermission = 243}, new (){ IdUserRole = 2006, IdPermission = 205}, new (){ IdUserRole = 2006, IdPermission = 204},
|
||||
new (){ IdUserRole = 2007, IdPermission = 241}, new (){ IdUserRole = 2007, IdPermission = 205}, new (){ IdUserRole = 2007, IdPermission = 204},
|
||||
//new (){ IdUserRole = 1, IdPermission = 500}, new (){ IdUserRole = 1, IdPermission = 501}, new (){ IdUserRole = 1, IdPermission = 502}, new (){ IdUserRole = 1, IdPermission = 503}, new (){ IdUserRole = 1, IdPermission = 504}, new (){ IdUserRole = 1, IdPermission = 505}, new (){ IdUserRole = 1, IdPermission = 506}, new (){ IdUserRole = 1, IdPermission = 510}, new (){ IdUserRole = 1, IdPermission = 511}, new (){ IdUserRole = 1, IdPermission = 512}, new (){ IdUserRole = 1, IdPermission = 513}, new (){ IdUserRole = 1, IdPermission = 514}, new (){ IdUserRole = 1, IdPermission = 515},
|
||||
};
|
||||
var allPermissions = (new EntityFillerPermission()).GetData();
|
||||
foreach ( var permission in allPermissions)
|
||||
|
@ -144,7 +144,7 @@ namespace AsbCloudInfrastructure
|
||||
services.AddTransient<IFileCategoryService, FileCategoryService>();
|
||||
services.AddTransient<ILimitingParameterService, LimitingParameterService>();
|
||||
services.AddTransient<IProcessMapReportMakerService, ProcessMapReportMakerService>();
|
||||
services.AddTransient<IProcessMapReportService, ProcessMapReportService>();
|
||||
services.AddTransient<IProcessMapService, ProcessMapService>();
|
||||
services.AddTransient<WellInfoService>();
|
||||
services.AddTransient<IHelpPageService, HelpPageService>();
|
||||
|
||||
|
@ -67,8 +67,6 @@ public class AutoGeneratedDailyReportService : IAutoGeneratedDailyReportService
|
||||
if (datesRange is null)
|
||||
return result;
|
||||
|
||||
result.Count = (int)(Math.Ceiling((datesRange.To - DateTime.UnixEpoch).TotalDays) - Math.Floor((datesRange.From - DateTime.UnixEpoch).TotalDays));
|
||||
|
||||
if (request.StartDate.HasValue)
|
||||
{
|
||||
var startDate = new DateTime(request.StartDate.Value.Year, request.StartDate.Value.Month,
|
||||
@ -87,6 +85,9 @@ public class AutoGeneratedDailyReportService : IAutoGeneratedDailyReportService
|
||||
datesRange.To = finishDate;
|
||||
}
|
||||
|
||||
if (datesRange.From.AddDays(result.Skip) <= datesRange.To)
|
||||
result.Count = (int)(Math.Ceiling((datesRange.To - DateTime.UnixEpoch).TotalDays) - Math.Floor((datesRange.From - DateTime.UnixEpoch).TotalDays));
|
||||
|
||||
for (int day = result.Skip; (day - result.Skip) < result.Take && (datesRange.From.AddDays(day)) <= datesRange.To; day++)
|
||||
{
|
||||
var reportDate = DateOnly.FromDateTime(datesRange.From.AddDays(day));
|
||||
@ -149,8 +150,8 @@ public class AutoGeneratedDailyReportService : IAutoGeneratedDailyReportService
|
||||
|
||||
return new DatesRangeDto
|
||||
{
|
||||
From = factOperations.Min(o => o.DateStart),
|
||||
To = factOperations.Max(o => o.DateStart)
|
||||
From = factOperations.Min(o => o.DateStart).Date,
|
||||
To = factOperations.Max(o => o.DateStart).Date
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -17,9 +17,9 @@ namespace AsbCloudInfrastructure.Services.ProcessMap
|
||||
|
||||
const int headerRowsCount = 5;
|
||||
|
||||
private readonly IProcessMapReportService processMapService;
|
||||
private readonly IProcessMapService processMapService;
|
||||
|
||||
public ProcessMapReportMakerService(IProcessMapReportService processMapService)
|
||||
public ProcessMapReportMakerService(IProcessMapService processMapService)
|
||||
{
|
||||
this.processMapService = processMapService;
|
||||
}
|
||||
|
@ -12,14 +12,14 @@ using System.Threading.Tasks;
|
||||
namespace AsbCloudInfrastructure.Services.ProcessMap
|
||||
{
|
||||
|
||||
public partial class ProcessMapReportService : IProcessMapReportService
|
||||
public partial class ProcessMapService : IProcessMapService
|
||||
{
|
||||
private readonly IWellService wellService;
|
||||
private readonly IWellOperationRepository wellOperationRepository;
|
||||
private readonly IProcessMapPlanRepository processMapPlanRepository;
|
||||
private readonly ITelemetryDataSaubService telemetryDataSaubService;
|
||||
|
||||
public ProcessMapReportService(
|
||||
public ProcessMapService(
|
||||
IWellService wellService,
|
||||
IWellOperationRepository wellOperationRepository,
|
||||
IProcessMapPlanRepository processMapPlanRepository,
|
@ -1,4 +1,5 @@
|
||||
using AsbCloudApp.Data;
|
||||
using AsbCloudApp.Exceptions;
|
||||
using AsbCloudApp.Services;
|
||||
using AsbCloudDb;
|
||||
using AsbCloudDb.Model;
|
||||
@ -137,10 +138,67 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
}
|
||||
|
||||
var entities = await query
|
||||
.OrderBy(d => d.DateTime)
|
||||
.AsNoTracking()
|
||||
.ToListAsync(token)
|
||||
.ConfigureAwait(false);
|
||||
.ToArrayAsync(token);
|
||||
|
||||
var dtos = entities.Select(e => Convert(e, timezone.Hours));
|
||||
|
||||
return dtos;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public virtual async Task<IEnumerable<TDto>> GetAsync(int idWell, AsbCloudApp.Requests.TelemetryDataRequest request, CancellationToken token)
|
||||
{
|
||||
var telemetry = telemetryService.GetOrDefaultTelemetryByIdWell(idWell);
|
||||
if (telemetry is null)
|
||||
return Enumerable.Empty<TDto>();
|
||||
|
||||
var timezone = telemetryService.GetTimezone(telemetry.Id);
|
||||
|
||||
var cache = telemetryDataCache.GetOrDefault(telemetry.Id, request);
|
||||
if(cache is not null)
|
||||
return cache;
|
||||
|
||||
var dbSet = db.Set<TEntity>();
|
||||
|
||||
var query = dbSet
|
||||
.Where(d => d.IdTelemetry == telemetry.Id)
|
||||
.AsNoTracking();
|
||||
|
||||
if (request.GeDate.HasValue)
|
||||
{
|
||||
var geDate = request.GeDate.Value.UtcDateTime;
|
||||
query = query.Where(d => d.DateTime >= geDate);
|
||||
}
|
||||
|
||||
if (request.LeDate.HasValue)
|
||||
{
|
||||
var leDate = request.LeDate.Value.UtcDateTime;
|
||||
query = query.Where(d => d.DateTime <= leDate);
|
||||
}
|
||||
|
||||
if (request.Divider > 1)
|
||||
query = query.Where((d) => (((d.DateTime.DayOfYear * 24 + d.DateTime.Hour) * 60 + d.DateTime.Minute) * 60 + d.DateTime.Second) % request.Divider == 0);
|
||||
|
||||
switch (request.Order)
|
||||
{
|
||||
case 1:// Поздние вперед
|
||||
query = query
|
||||
.OrderByDescending(d => d.DateTime)
|
||||
.Skip(request.Skip)
|
||||
.Take(request.Take)
|
||||
.OrderBy(d => d.DateTime);
|
||||
break;
|
||||
default:// Ранние вперед
|
||||
query = query
|
||||
.OrderBy(d => d.DateTime)
|
||||
.Skip(request.Skip)
|
||||
.Take(request.Take);
|
||||
break;
|
||||
}
|
||||
|
||||
var entities = await query
|
||||
.ToArrayAsync(token);
|
||||
|
||||
var dtos = entities.Select(e => Convert(e, timezone.Hours));
|
||||
|
||||
|
@ -11,6 +11,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using AsbCloudInfrastructure.Background;
|
||||
using System.Threading;
|
||||
using AsbCloudApp.Data;
|
||||
using AsbCloudApp.Requests;
|
||||
|
||||
namespace AsbCloudInfrastructure.Services.SAUB
|
||||
{
|
||||
@ -21,6 +22,7 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
{
|
||||
public TDto? FirstByDate { get; init; }
|
||||
public CyclycArray<TDto> LastData { get; init; } = null!;
|
||||
public double TimezoneHours { get; init; } = 5;
|
||||
}
|
||||
|
||||
private IServiceProvider provider = null!;
|
||||
@ -225,8 +227,62 @@ namespace AsbCloudInfrastructure.Services.SAUB
|
||||
{
|
||||
FirstByDate = first,
|
||||
LastData = cacheItem,
|
||||
TimezoneHours = hoursOffset,
|
||||
};
|
||||
return item;
|
||||
}
|
||||
|
||||
public IEnumerable<TDto>? GetOrDefault(int idTelemetry, TelemetryDataRequest request)
|
||||
{
|
||||
if (!caches.TryGetValue(idTelemetry, out TelemetryDataCacheItem? cacheItem))
|
||||
return null;
|
||||
|
||||
IEnumerable<TDto> data = cacheItem.LastData;
|
||||
|
||||
if (!data.Any())
|
||||
return null;
|
||||
|
||||
if (request.GeDate.HasValue)
|
||||
{
|
||||
var geDate = request.GeDate.Value.ToRemoteDateTime(cacheItem.TimezoneHours);
|
||||
if (data.First().DateTime > geDate)
|
||||
return null;
|
||||
|
||||
data = data.Where(d => d.DateTime >= geDate);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (request.Order == 0)
|
||||
return null;
|
||||
}
|
||||
|
||||
if (request.LeDate.HasValue)
|
||||
{
|
||||
var leDate = request.LeDate.Value.ToRemoteDateTime(cacheItem.TimezoneHours);
|
||||
data = data.Where(d => d.DateTime >= request.LeDate);
|
||||
}
|
||||
|
||||
if (request.Divider > 1)
|
||||
data = data.Where((d) => (((d.DateTime.DayOfYear * 24 + d.DateTime.Hour) * 60 + d.DateTime.Minute) * 60 + d.DateTime.Second) % request.Divider == 0);
|
||||
|
||||
switch (request.Order)
|
||||
{
|
||||
case 1: // Поздние вперед
|
||||
data = data
|
||||
.OrderByDescending(d => d.DateTime)
|
||||
.Skip(request.Skip)
|
||||
.Take(request.Take)
|
||||
.OrderBy(d => d.DateTime);
|
||||
break;
|
||||
default: // Ранние вперед
|
||||
data = data
|
||||
.OrderBy(d => d.DateTime)
|
||||
.Skip(request.Skip)
|
||||
.Take(request.Take);
|
||||
break;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -29,7 +29,10 @@ namespace AsbCloudInfrastructure.Services
|
||||
{
|
||||
Caption = c.Caption,
|
||||
Id = c.Id,
|
||||
Users = c.Users.Select(u => new UserContactDto()
|
||||
Users = c.Users
|
||||
.Where(u => u.IdState == 1)
|
||||
.OrderBy(u => u.Surname)
|
||||
.Select(u => new UserContactDto()
|
||||
{
|
||||
Id = u.Id,
|
||||
Name = u.Name,
|
||||
|
@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
@ -58,8 +59,8 @@ public class WellboreService : IWellboreService
|
||||
Id = group.Key,
|
||||
Name = sections[group.Key].Caption,
|
||||
Well = well.Adapt<WellWithTimezoneDto>(),
|
||||
DateStart = group.Min(operation => operation.DateStart),
|
||||
DateEnd = group.Max(operation => operation.DateStart.AddHours(operation.DurationHours)),
|
||||
DateStart = group.Min(operation => operation.DateStart).ToUtcDateTimeOffset(well.Timezone.Hours).ToOffset(TimeSpan.FromHours(well.Timezone.Hours)),
|
||||
DateEnd = group.Max(operation => operation.DateStart.AddHours(operation.DurationHours)).ToUtcDateTimeOffset(well.Timezone.Hours).ToOffset(TimeSpan.FromHours(well.Timezone.Hours)),
|
||||
DepthStart = group.Min(operation => operation.DepthStart),
|
||||
DepthEnd = group.Max(operation => operation.DepthEnd),
|
||||
});
|
||||
|
@ -27,8 +27,9 @@ namespace AsbCloudWebApi.Controllers
|
||||
private readonly ITelemetryService telemetryService;
|
||||
private readonly IHubContext<TelemetryHub> telemetryHubContext;
|
||||
private readonly IProcessMapReportMakerService processMapReportService;
|
||||
private readonly IProcessMapReportService processMapService;
|
||||
private readonly IProcessMapService processMapService;
|
||||
private readonly IProcessMapPlanImportService processMapPlanImportService;
|
||||
private readonly IUserRepository userRepository;
|
||||
|
||||
private const string SirnalRMethodGetDataName = "UpdateProcessMap";
|
||||
|
||||
@ -36,10 +37,11 @@ namespace AsbCloudWebApi.Controllers
|
||||
IWellService wellService,
|
||||
IProcessMapPlanRepository repository,
|
||||
IProcessMapReportMakerService processMapReportService,
|
||||
IProcessMapReportService processMapService,
|
||||
IProcessMapService processMapService,
|
||||
ITelemetryService telemetryService,
|
||||
IHubContext<TelemetryHub> telemetryHubContext,
|
||||
IProcessMapPlanImportService processMapPlanImportService)
|
||||
IProcessMapPlanImportService processMapPlanImportService,
|
||||
IUserRepository userRepository)
|
||||
: base(wellService, repository)
|
||||
{
|
||||
this.telemetryService = telemetryService;
|
||||
@ -47,6 +49,7 @@ namespace AsbCloudWebApi.Controllers
|
||||
this.processMapReportService = processMapReportService;
|
||||
this.processMapService = processMapService;
|
||||
this.processMapPlanImportService = processMapPlanImportService;
|
||||
this.userRepository = userRepository;
|
||||
|
||||
}
|
||||
|
||||
@ -139,6 +142,9 @@ namespace AsbCloudWebApi.Controllers
|
||||
[HttpPost]
|
||||
public override async Task<ActionResult<int>> InsertAsync([FromBody] ProcessMapPlanDto value, CancellationToken token)
|
||||
{
|
||||
if (!await CanUserEditProcessMapAsync(value.IdWell, token))
|
||||
return Forbid();
|
||||
|
||||
value.IdUser = User.GetUserId() ?? -1;
|
||||
var result = await base.InsertAsync(value, token);
|
||||
await NotifyUsersBySignalR(value.IdWell, token);
|
||||
@ -154,6 +160,9 @@ namespace AsbCloudWebApi.Controllers
|
||||
[HttpPut]
|
||||
public override async Task<ActionResult<int>> UpdateAsync([FromBody] ProcessMapPlanDto value, CancellationToken token)
|
||||
{
|
||||
if (!await CanUserEditProcessMapAsync(value.IdWell, token))
|
||||
return Forbid();
|
||||
|
||||
value.IdUser = User.GetUserId() ?? -1;
|
||||
var result = await base.UpdateAsync(value, token);
|
||||
await NotifyUsersBySignalR(value.IdWell, token);
|
||||
@ -192,6 +201,9 @@ namespace AsbCloudWebApi.Controllers
|
||||
if (idUser is null)
|
||||
return Forbid();
|
||||
|
||||
if (!await CanUserEditProcessMapAsync(idWell, cancellationToken))
|
||||
return Forbid();
|
||||
|
||||
if (Path.GetExtension(file.FileName).ToLower() != ".xlsx")
|
||||
return BadRequest("Требуется xlsx файл.");
|
||||
|
||||
@ -239,6 +251,21 @@ namespace AsbCloudWebApi.Controllers
|
||||
return File(stream, "application/octet-stream", fileName);
|
||||
}
|
||||
|
||||
private async Task<bool> CanUserEditProcessMapAsync(int idWell, CancellationToken token)
|
||||
{
|
||||
var idUser = User.GetUserId();
|
||||
|
||||
if (!idUser.HasValue)
|
||||
return false;
|
||||
|
||||
var well = await wellService.GetOrDefaultAsync(idWell, token);
|
||||
|
||||
if (well is null)
|
||||
return false;
|
||||
|
||||
return well.IdState != 2 || userRepository.HasPermission(idUser.Value, "ProcessMap.editCompletedWell");
|
||||
}
|
||||
|
||||
private async Task NotifyUsersBySignalR(int idWell, CancellationToken token)
|
||||
{
|
||||
var dtos = await service.GetAllAsync(idWell, null, token);
|
||||
|
@ -1,4 +1,5 @@
|
||||
using AsbCloudApp.Data;
|
||||
using AsbCloudApp.Requests;
|
||||
using AsbCloudApp.Services;
|
||||
using AsbCloudWebApi.SignalR;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
@ -96,6 +97,36 @@ namespace AsbCloudWebApi.Controllers.SAUB
|
||||
return Ok(content);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Новая версия. Возвращает данные САУБ по скважине.
|
||||
/// По умолчанию за последние 10 минут.
|
||||
/// </summary>
|
||||
/// <param name="idWell">id скважины</param>
|
||||
/// <param name="request"></param>
|
||||
/// <param name="token">Токен завершения задачи</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("{idWell}/data")]
|
||||
[Permission]
|
||||
public virtual async Task<ActionResult<IEnumerable<TDto>>> GetData2Async(int idWell,
|
||||
[FromQuery]TelemetryDataRequest request,
|
||||
CancellationToken token)
|
||||
{
|
||||
int? idCompany = User.GetCompanyId();
|
||||
|
||||
if (idCompany is null)
|
||||
return Forbid();
|
||||
|
||||
bool isCompanyOwnsWell = await wellService.IsCompanyInvolvedInWellAsync((int)idCompany,
|
||||
idWell, token).ConfigureAwait(false);
|
||||
|
||||
if (!isCompanyOwnsWell)
|
||||
return Forbid();
|
||||
|
||||
var content = await telemetryDataService.GetAsync(idWell, request, token);
|
||||
|
||||
return Ok(content);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Возвращает диапазон дат за которые есть телеметрия за период времени
|
||||
/// </summary>
|
||||
|
@ -26,12 +26,16 @@ namespace AsbCloudWebApi.Controllers
|
||||
private readonly IWellOperationRepository operationRepository;
|
||||
private readonly IWellService wellService;
|
||||
private readonly IWellOperationImportService wellOperationImportService;
|
||||
private readonly IUserRepository userRepository;
|
||||
|
||||
public WellOperationController(IWellOperationRepository operationService, IWellService wellService, IWellOperationImportService wellOperationImportService)
|
||||
public WellOperationController(IWellOperationRepository operationService, IWellService wellService,
|
||||
IWellOperationImportService wellOperationImportService,
|
||||
IUserRepository userRepository)
|
||||
{
|
||||
this.operationRepository = operationService;
|
||||
this.wellService = wellService;
|
||||
this.wellOperationImportService = wellOperationImportService;
|
||||
this.userRepository = userRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -199,7 +203,10 @@ namespace AsbCloudWebApi.Controllers
|
||||
[FromBody] IEnumerable<WellOperationDto> values,
|
||||
CancellationToken token)
|
||||
{
|
||||
if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false))
|
||||
if (!await CanUserAccessToWellAsync(idWell, token))
|
||||
return Forbid();
|
||||
|
||||
if (!await CanUserEditWellOperationsAsync(idWell, token))
|
||||
return Forbid();
|
||||
|
||||
foreach (var value in values)
|
||||
@ -229,7 +236,10 @@ namespace AsbCloudWebApi.Controllers
|
||||
public async Task<IActionResult> UpdateAsync(int idWell, int idOperation,
|
||||
[FromBody] WellOperationDto value, CancellationToken token)
|
||||
{
|
||||
if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false))
|
||||
if (!await CanUserAccessToWellAsync(idWell, token))
|
||||
return Forbid();
|
||||
|
||||
if (!await CanUserEditWellOperationsAsync(idWell, token))
|
||||
return Forbid();
|
||||
|
||||
value.IdWell = idWell;
|
||||
@ -254,8 +264,10 @@ namespace AsbCloudWebApi.Controllers
|
||||
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
|
||||
public async Task<IActionResult> DeleteAsync(int idWell, int idOperation, CancellationToken token)
|
||||
{
|
||||
if (!await CanUserAccessToWellAsync(idWell,
|
||||
token).ConfigureAwait(false))
|
||||
if (!await CanUserAccessToWellAsync(idWell, token))
|
||||
return Forbid();
|
||||
|
||||
if (!await CanUserEditWellOperationsAsync(idWell, token))
|
||||
return Forbid();
|
||||
|
||||
var result = await operationRepository.DeleteAsync(new int[] { idOperation }, token)
|
||||
@ -286,6 +298,12 @@ namespace AsbCloudWebApi.Controllers
|
||||
if (idCompany is null || idUser is null)
|
||||
return Forbid();
|
||||
|
||||
if (!await CanUserAccessToWellAsync(idWell, token))
|
||||
return Forbid();
|
||||
|
||||
if (!await CanUserEditWellOperationsAsync(idWell, token))
|
||||
return Forbid();
|
||||
|
||||
if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany,
|
||||
idWell, token).ConfigureAwait(false))
|
||||
return Forbid();
|
||||
@ -376,6 +394,21 @@ namespace AsbCloudWebApi.Controllers
|
||||
return File(stream, "application/octet-stream", fileName);
|
||||
}
|
||||
|
||||
private async Task<bool> CanUserEditWellOperationsAsync(int idWell, CancellationToken token)
|
||||
{
|
||||
var idUser = User.GetUserId();
|
||||
|
||||
if (!idUser.HasValue)
|
||||
return false;
|
||||
|
||||
var well = await wellService.GetOrDefaultAsync(idWell, token);
|
||||
|
||||
if (well is null)
|
||||
return false;
|
||||
|
||||
return well.IdState != 2 || userRepository.HasPermission(idUser.Value, "WellOperation.editCompletedWell");
|
||||
}
|
||||
|
||||
private async Task<bool> CanUserAccessToWellAsync(int idWell, CancellationToken token)
|
||||
{
|
||||
int? idCompany = User.GetCompanyId();
|
||||
|
Loading…
Reference in New Issue
Block a user