forked from ddrilling/AsbCloudServer
DepositRepository.GetAsync(..) полная материализация ответа, чтобы понять где именно возникает ошибка на проде.
This commit is contained in:
parent
43b89b8db8
commit
478297a871
@ -19,15 +19,6 @@ namespace AsbCloudApp.Repositories
|
|||||||
Task<IEnumerable<DepositDto>> GetAsync(int idCompany,
|
Task<IEnumerable<DepositDto>> GetAsync(int idCompany,
|
||||||
CancellationToken token);
|
CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Список месторождений/кустов/скважин у которых заполненны параметры бурения
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="idCompany"></param>
|
|
||||||
/// <param name="token"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<IEnumerable<DepositDto>> GetAllWithDrillParamsAsync(int idCompany,
|
|
||||||
CancellationToken token = default);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Список кустов месторождения доступных компании
|
/// Список кустов месторождения доступных компании
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -10,122 +10,100 @@ using System.Linq;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace AsbCloudInfrastructure.Repository
|
namespace AsbCloudInfrastructure.Repository;
|
||||||
|
|
||||||
|
public class DepositRepository : IDepositRepository
|
||||||
{
|
{
|
||||||
|
private readonly IAsbCloudDbContext db;
|
||||||
|
private readonly ITelemetryService telemetryService;
|
||||||
|
|
||||||
public class DepositRepository : IDepositRepository
|
public DepositRepository(IAsbCloudDbContext db, ITelemetryService telemetryService)
|
||||||
{
|
{
|
||||||
private readonly IAsbCloudDbContext db;
|
this.db = db;
|
||||||
private readonly ITelemetryService telemetryService;
|
this.telemetryService = telemetryService;
|
||||||
|
|
||||||
public DepositRepository(IAsbCloudDbContext db, ITelemetryService telemetryService)
|
|
||||||
{
|
|
||||||
this.db = db;
|
|
||||||
this.telemetryService = telemetryService;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public async Task<IEnumerable<DepositDto>> GetAsync(int idCompany,
|
|
||||||
CancellationToken token = default)
|
|
||||||
{
|
|
||||||
var wellEntities = await (from well in db.Wells
|
|
||||||
.Include(w => w.RelationCompaniesWells)
|
|
||||||
.Include(w => w.WellType)
|
|
||||||
.Include(w => w.Cluster)
|
|
||||||
.ThenInclude(c => c.Deposit)
|
|
||||||
where well.RelationCompaniesWells.Any(r => r.IdCompany == idCompany)
|
|
||||||
select well).ToListAsync(token)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
var gDepositEntities = GroupWells(wellEntities);
|
|
||||||
|
|
||||||
var dtos = CreateDepositDto(gDepositEntities);
|
|
||||||
|
|
||||||
return dtos;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public async Task<IEnumerable<DepositDto>> GetAllWithDrillParamsAsync(int idCompany,
|
|
||||||
CancellationToken token = default)
|
|
||||||
{
|
|
||||||
var wellEntities = await (from well in db.Wells
|
|
||||||
.Include(w => w.RelationCompaniesWells)
|
|
||||||
.Include(w => w.WellType)
|
|
||||||
.Include(w => w.Cluster)
|
|
||||||
.ThenInclude(c => c.Deposit)
|
|
||||||
where well.RelationCompaniesWells.Any(r => r.IdCompany == idCompany)
|
|
||||||
select well).ToListAsync(token)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
var gDepositEntities = GroupWells(wellEntities);
|
|
||||||
|
|
||||||
var dtos = CreateDepositDto(gDepositEntities);
|
|
||||||
|
|
||||||
return dtos;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
|
||||||
public async Task<IEnumerable<ClusterDto>> GetClustersAsync(int idCompany,
|
|
||||||
int depositId, CancellationToken token = default)
|
|
||||||
{
|
|
||||||
var entities = await GetWellsForCompany(idCompany)
|
|
||||||
.Select(e => e.Cluster)
|
|
||||||
.Where(e => e.IdDeposit == depositId)
|
|
||||||
.Distinct()
|
|
||||||
.AsNoTracking()
|
|
||||||
.ToListAsync(token)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
var dtos = entities.Adapt<IEnumerable<ClusterDto>>();
|
|
||||||
|
|
||||||
return dtos;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static IEnumerable<IGrouping<Deposit, IGrouping<Cluster, Well>>> GroupWells(IEnumerable<Well> wellEntities)
|
|
||||||
=> wellEntities
|
|
||||||
.GroupBy(w => w.Cluster)
|
|
||||||
.GroupBy(c => c.Key.Deposit);
|
|
||||||
|
|
||||||
private IQueryable<Well> GetWellsForCompany(int idCompany)
|
|
||||||
=> db.Wells
|
|
||||||
.Include(w => w.RelationCompaniesWells)
|
|
||||||
.ThenInclude(r => r.Company)
|
|
||||||
.Include(w => w.Cluster)
|
|
||||||
.ThenInclude(c => c.Deposit)
|
|
||||||
.Where(w => w.RelationCompaniesWells.Any(c => c.IdCompany == idCompany));
|
|
||||||
|
|
||||||
private IEnumerable<DepositDto> CreateDepositDto(IEnumerable<IGrouping<Deposit, IGrouping<Cluster, Well>>> gDepositEntities)
|
|
||||||
{
|
|
||||||
var dtos = gDepositEntities.Select(gDeposit => new DepositDto
|
|
||||||
{
|
|
||||||
Id = gDeposit.Key.Id,
|
|
||||||
Caption = gDeposit.Key.Caption,
|
|
||||||
Latitude = gDeposit.Key.Latitude,
|
|
||||||
Longitude = gDeposit.Key.Longitude,
|
|
||||||
Clusters = gDeposit.Select(gCluster => new ClusterDto
|
|
||||||
{
|
|
||||||
Id = gCluster.Key.Id,
|
|
||||||
Caption = gCluster.Key.Caption,
|
|
||||||
Latitude = gCluster.Key.Latitude,
|
|
||||||
Longitude = gCluster.Key.Longitude,
|
|
||||||
Wells = gCluster.Select(well =>
|
|
||||||
{
|
|
||||||
var dto = well.Adapt<WellDto>();
|
|
||||||
dto.WellType = well.WellType.Caption;
|
|
||||||
|
|
||||||
dto.LastTelemetryDate = DateTimeOffset.MinValue;
|
|
||||||
|
|
||||||
if (well.IdTelemetry != null)
|
|
||||||
dto.LastTelemetryDate = telemetryService.GetDatesRange(well.IdTelemetry.Value).To;
|
|
||||||
|
|
||||||
dto.Cluster = gCluster.Key.Caption;
|
|
||||||
dto.Deposit = gDeposit.Key.Caption;
|
|
||||||
return dto;
|
|
||||||
}),
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
return dtos;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public async Task<IEnumerable<DepositDto>> GetAsync(int idCompany,
|
||||||
|
CancellationToken token = default)
|
||||||
|
{
|
||||||
|
var wellsQuery = db.Set<Well>()
|
||||||
|
.Include(w => w.RelationCompaniesWells)
|
||||||
|
.Include(w => w.WellType)
|
||||||
|
.Include(w => w.Cluster)
|
||||||
|
.ThenInclude(c => c.Deposit)
|
||||||
|
.Where(well => well.RelationCompaniesWells.Any(r => r.IdCompany == idCompany));
|
||||||
|
|
||||||
|
var wellEntities = await wellsQuery.ToArrayAsync(token);
|
||||||
|
|
||||||
|
var gDepositEntities = GroupWells(wellEntities);
|
||||||
|
|
||||||
|
var dtos = CreateDepositDto(gDepositEntities)
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
return dtos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public async Task<IEnumerable<ClusterDto>> GetClustersAsync(int idCompany,
|
||||||
|
int depositId, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
var entities = await GetWellsForCompany(idCompany)
|
||||||
|
.Select(e => e.Cluster)
|
||||||
|
.Where(e => e.IdDeposit == depositId)
|
||||||
|
.Distinct()
|
||||||
|
.AsNoTracking()
|
||||||
|
.ToListAsync(token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
var dtos = entities.Adapt<IEnumerable<ClusterDto>>();
|
||||||
|
|
||||||
|
return dtos;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<IGrouping<Deposit, IGrouping<Cluster, Well>>> GroupWells(IEnumerable<Well> wellEntities)
|
||||||
|
=> wellEntities
|
||||||
|
.GroupBy(w => w.Cluster)
|
||||||
|
.GroupBy(c => c.Key.Deposit);
|
||||||
|
|
||||||
|
private IQueryable<Well> GetWellsForCompany(int idCompany)
|
||||||
|
=> db.Set<Well>()
|
||||||
|
.Include(w => w.RelationCompaniesWells)
|
||||||
|
.ThenInclude(r => r.Company)
|
||||||
|
.Include(w => w.Cluster)
|
||||||
|
.ThenInclude(c => c.Deposit)
|
||||||
|
.Where(w => w.RelationCompaniesWells.Any(c => c.IdCompany == idCompany));
|
||||||
|
|
||||||
|
private IEnumerable<DepositDto> CreateDepositDto(IEnumerable<IGrouping<Deposit, IGrouping<Cluster, Well>>> gDepositEntities)
|
||||||
|
{
|
||||||
|
var dtos = gDepositEntities.Select(gDeposit => new DepositDto
|
||||||
|
{
|
||||||
|
Id = gDeposit.Key.Id,
|
||||||
|
Caption = gDeposit.Key.Caption,
|
||||||
|
Latitude = gDeposit.Key.Latitude,
|
||||||
|
Longitude = gDeposit.Key.Longitude,
|
||||||
|
Clusters = gDeposit.Select(gCluster => new ClusterDto
|
||||||
|
{
|
||||||
|
Id = gCluster.Key.Id,
|
||||||
|
Caption = gCluster.Key.Caption,
|
||||||
|
Latitude = gCluster.Key.Latitude,
|
||||||
|
Longitude = gCluster.Key.Longitude,
|
||||||
|
Wells = gCluster.Select(well =>
|
||||||
|
{
|
||||||
|
var dto = well.Adapt<WellDto>();
|
||||||
|
dto.WellType = well.WellType.Caption;
|
||||||
|
|
||||||
|
dto.LastTelemetryDate = DateTimeOffset.MinValue;
|
||||||
|
|
||||||
|
if (well.IdTelemetry != null)
|
||||||
|
dto.LastTelemetryDate = telemetryService.GetDatesRange(well.IdTelemetry.Value).To;
|
||||||
|
|
||||||
|
dto.Cluster = gCluster.Key.Caption;
|
||||||
|
dto.Deposit = gDeposit.Key.Caption;
|
||||||
|
return dto;
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
return dtos;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,26 +43,6 @@ namespace AsbCloudWebApi.Controllers
|
|||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Получает список доступных пользователю месторождений (только скважины с параметрами бурения)
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="token"> Токен отмены задачи </param>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpGet("drillParamsWells")]
|
|
||||||
[Permission]
|
|
||||||
[ProducesResponseType(typeof(IEnumerable<DepositDto>), (int)System.Net.HttpStatusCode.OK)]
|
|
||||||
public async Task<IActionResult> GetDepositsDrillParamsAsync(CancellationToken token)
|
|
||||||
{
|
|
||||||
int? idCompany = User.GetCompanyId();
|
|
||||||
|
|
||||||
if (idCompany is null)
|
|
||||||
return Forbid();
|
|
||||||
|
|
||||||
var result = await depositService.GetAllWithDrillParamsAsync((int)idCompany,
|
|
||||||
token).ConfigureAwait(false);
|
|
||||||
return Ok(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получает список доступных пользователю кустов месторождения
|
/// Получает список доступных пользователю кустов месторождения
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -44,6 +44,9 @@ namespace AsbCloudWebApi.Middlewares
|
|||||||
}
|
}
|
||||||
catch (Exception ex) // TODO: find explicit exception. Use Trace. Add body size to message.
|
catch (Exception ex) // TODO: find explicit exception. Use Trace. Add body size to message.
|
||||||
{
|
{
|
||||||
|
if (context.Response.HasStarted)
|
||||||
|
throw;
|
||||||
|
|
||||||
context.Response.Clear();
|
context.Response.Clear();
|
||||||
context.Response.StatusCode = 500;
|
context.Response.StatusCode = 500;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user