forked from ddrilling/AsbCloudServer
Вынес логику получения ствола скважины в отдельный сервис
This commit is contained in:
parent
3702cf2e8c
commit
24637f5254
@ -74,23 +74,6 @@ namespace AsbCloudApp.Repositories
|
|||||||
WellOperationRequest request,
|
WellOperationRequest request,
|
||||||
CancellationToken token);
|
CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Получение ствола скважины
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="idWell"></param>
|
|
||||||
/// <param name="idSection"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<WellboreDto?> GetWellboreAsync(int idWell, int idSection, CancellationToken cancellationToken);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Получение стволов скважин
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="request"></param>
|
|
||||||
/// <param name="cancellationToken"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<IEnumerable<WellboreDto>> GetWellboresAsync(WellboreRequest request, CancellationToken cancellationToken);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Добавить несколько операций за один раз
|
/// Добавить несколько операций за один раз
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
30
AsbCloudApp/Services/IWellboreService.cs
Normal file
30
AsbCloudApp/Services/IWellboreService.cs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using AsbCloudApp.Data;
|
||||||
|
using AsbCloudApp.Requests;
|
||||||
|
|
||||||
|
namespace AsbCloudApp.Services;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Сервис для ствола скважины
|
||||||
|
/// </summary>
|
||||||
|
public interface IWellboreService
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Получение ствола скважины
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="idWell"></param>
|
||||||
|
/// <param name="idSection"></param>
|
||||||
|
/// <param name="cancellationToken"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<WellboreDto?> GetWellboreAsync(int idWell, int idSection, CancellationToken cancellationToken);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получение стволов скважин
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
/// <param name="cancellationToken"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<IEnumerable<WellboreDto>> GetWellboresAsync(WellboreRequest request, CancellationToken cancellationToken);
|
||||||
|
}
|
@ -222,6 +222,8 @@ namespace AsbCloudInfrastructure
|
|||||||
services.AddTransient<IAutoGeneratedDailyReportService, AutoGeneratedDailyReportService>();
|
services.AddTransient<IAutoGeneratedDailyReportService, AutoGeneratedDailyReportService>();
|
||||||
services.AddTransient<IAutoGeneratedDailyReportMakerService, AutoGeneratedDailyReportMakerService>();
|
services.AddTransient<IAutoGeneratedDailyReportMakerService, AutoGeneratedDailyReportMakerService>();
|
||||||
|
|
||||||
|
services.AddTransient<IWellboreService, WellboreService>();
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,91 +255,6 @@ namespace AsbCloudInfrastructure.Repository
|
|||||||
return dtos;
|
return dtos;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<WellboreDto?> GetWellboreAsync(int idWell, int idSection, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
var well = await db.Wells.Include(w => w.WellOperations)
|
|
||||||
.FirstOrDefaultAsync(w => w.Id == idWell, cancellationToken);
|
|
||||||
|
|
||||||
var section = await db.WellSectionTypes
|
|
||||||
.FirstOrDefaultAsync(w => w.Id == idSection, cancellationToken);
|
|
||||||
|
|
||||||
if (well is null || section is null)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
var factOperations = well.WellOperations
|
|
||||||
.Where(o => o.IdType == WellOperation.IdOperationTypeFact &&
|
|
||||||
o.IdWellSectionType == section.Id)
|
|
||||||
.OrderBy(o => o.DateStart);
|
|
||||||
|
|
||||||
if (!factOperations.Any())
|
|
||||||
return null;
|
|
||||||
|
|
||||||
var firstOperation = factOperations.First();
|
|
||||||
var lastOperation = factOperations.Last();
|
|
||||||
|
|
||||||
return new WellboreDto
|
|
||||||
{
|
|
||||||
Id = section.Id,
|
|
||||||
Name = section.Caption,
|
|
||||||
IdWell = well.Id,
|
|
||||||
WellName = well.Caption,
|
|
||||||
IdWellState = well.IdState,
|
|
||||||
IdWellTelemetry = well.IdTelemetry,
|
|
||||||
WellTimezone = well.Timezone.Adapt<SimpleTimezoneDto>(),
|
|
||||||
DepthFrom = firstOperation.DepthStart,
|
|
||||||
DepthTo = lastOperation.DepthEnd,
|
|
||||||
DateFrom = firstOperation.DateStart,
|
|
||||||
DateTo = lastOperation.DateStart.AddHours(lastOperation.DurationHours),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<IEnumerable<WellboreDto>> GetWellboresAsync(WellboreRequest request, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
var wellbores = new List<WellboreDto>();
|
|
||||||
var skip = request.Skip ?? 0;
|
|
||||||
var take = request.Take ?? 10;
|
|
||||||
|
|
||||||
var sections = GetSectionTypes()
|
|
||||||
.ToDictionary(w => w.Id, w => w);
|
|
||||||
|
|
||||||
foreach (var (idWell, idSection) in request.Ids)
|
|
||||||
{
|
|
||||||
var well = await db.Wells.Include(w => w.WellOperations)
|
|
||||||
.FirstOrDefaultAsync(w => w.Id == idWell, cancellationToken);
|
|
||||||
|
|
||||||
if (well is null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var factOperations = well.WellOperations
|
|
||||||
.Where(o => o.IdType == WellOperation.IdOperationTypeFact)
|
|
||||||
.OrderBy(o => o.DateStart)
|
|
||||||
.GroupBy(o => o.IdWellSectionType);
|
|
||||||
|
|
||||||
if(idSection.HasValue)
|
|
||||||
factOperations = factOperations.Where(w => w.Key == idSection);
|
|
||||||
|
|
||||||
wellbores.AddRange(from factOperation in factOperations
|
|
||||||
let firstOperation = factOperation.First()
|
|
||||||
let lastOperation = factOperation.Last()
|
|
||||||
select new WellboreDto
|
|
||||||
{
|
|
||||||
Id = sections[factOperation.Key].Id,
|
|
||||||
Name = sections[factOperation.Key].Caption,
|
|
||||||
IdWell = well.Id,
|
|
||||||
WellName = well.Caption,
|
|
||||||
IdWellState = well.IdState,
|
|
||||||
IdWellTelemetry = well.IdTelemetry,
|
|
||||||
WellTimezone = well.Timezone.Adapt<SimpleTimezoneDto>(),
|
|
||||||
DepthFrom = firstOperation.DepthStart,
|
|
||||||
DepthTo = lastOperation.DepthEnd,
|
|
||||||
DateFrom = firstOperation.DateStart,
|
|
||||||
DateTo = lastOperation.DateStart.AddHours(lastOperation.DurationHours),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return wellbores.Skip(skip).Take(take);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public async Task<int> InsertRangeAsync(
|
public async Task<int> InsertRangeAsync(
|
||||||
IEnumerable<WellOperationDto> wellOperationDtos,
|
IEnumerable<WellOperationDto> wellOperationDtos,
|
||||||
|
117
AsbCloudInfrastructure/Services/WellboreService.cs
Normal file
117
AsbCloudInfrastructure/Services/WellboreService.cs
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using AsbCloudApp.Data;
|
||||||
|
using AsbCloudApp.Repositories;
|
||||||
|
using AsbCloudApp.Requests;
|
||||||
|
using AsbCloudApp.Services;
|
||||||
|
using AsbCloudDb.Model;
|
||||||
|
using Mapster;
|
||||||
|
|
||||||
|
namespace AsbCloudInfrastructure.Services;
|
||||||
|
|
||||||
|
public class WellboreService : IWellboreService
|
||||||
|
{
|
||||||
|
private readonly IWellService wellService;
|
||||||
|
private readonly IWellOperationRepository wellOperationRepository;
|
||||||
|
|
||||||
|
public WellboreService(IWellService wellService, IWellOperationRepository wellOperationRepository)
|
||||||
|
{
|
||||||
|
this.wellService = wellService;
|
||||||
|
this.wellOperationRepository = wellOperationRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<WellboreDto?> GetWellboreAsync(int idWell, int idSection, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var well = await wellService.GetOrDefaultAsync(idWell, cancellationToken);
|
||||||
|
|
||||||
|
var section = wellOperationRepository.GetSectionTypes()
|
||||||
|
.FirstOrDefault(w => w.Id == idSection);
|
||||||
|
|
||||||
|
if (well is null || section is null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var factOperations = await GetFactOperationsAsync(idWell, idSection, cancellationToken);
|
||||||
|
|
||||||
|
if (!factOperations.Any())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var firstOperation = factOperations.First();
|
||||||
|
var lastOperation = factOperations.Last();
|
||||||
|
|
||||||
|
return new WellboreDto
|
||||||
|
{
|
||||||
|
Id = section.Id,
|
||||||
|
Name = section.Caption,
|
||||||
|
IdWell = well.Id,
|
||||||
|
WellName = well.Caption,
|
||||||
|
IdWellState = well.IdState,
|
||||||
|
IdWellTelemetry = well.IdTelemetry,
|
||||||
|
WellTimezone = well.Timezone.Adapt<SimpleTimezoneDto>(),
|
||||||
|
DepthFrom = firstOperation.DepthStart,
|
||||||
|
DepthTo = lastOperation.DepthEnd,
|
||||||
|
DateFrom = firstOperation.DateStart,
|
||||||
|
DateTo = lastOperation.DateStart.AddHours(lastOperation.DurationHours),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<WellboreDto>> GetWellboresAsync(WellboreRequest request,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var wellbores = new List<WellboreDto>();
|
||||||
|
var skip = request.Skip ?? 0;
|
||||||
|
var take = request.Take ?? 10;
|
||||||
|
|
||||||
|
var sections = wellOperationRepository.GetSectionTypes()
|
||||||
|
.ToDictionary(w => w.Id, w => w);
|
||||||
|
|
||||||
|
foreach (var (idWell, idSection) in request.Ids)
|
||||||
|
{
|
||||||
|
var well = await wellService.GetOrDefaultAsync(idWell, cancellationToken);
|
||||||
|
|
||||||
|
if (well is null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var factOperations = (await GetFactOperationsAsync(well.Id, idSection, cancellationToken))
|
||||||
|
.GroupBy(o => o.IdWellSectionType);
|
||||||
|
|
||||||
|
wellbores.AddRange(from factOperation in factOperations
|
||||||
|
let firstOperation = factOperation.First()
|
||||||
|
let lastOperation = factOperation.Last()
|
||||||
|
select new WellboreDto
|
||||||
|
{
|
||||||
|
Id = sections[factOperation.Key].Id,
|
||||||
|
Name = sections[factOperation.Key].Caption,
|
||||||
|
IdWell = well.Id,
|
||||||
|
WellName = well.Caption,
|
||||||
|
IdWellState = well.IdState,
|
||||||
|
IdWellTelemetry = well.IdTelemetry,
|
||||||
|
WellTimezone = well.Timezone.Adapt<SimpleTimezoneDto>(),
|
||||||
|
DepthFrom = firstOperation.DepthStart,
|
||||||
|
DepthTo = lastOperation.DepthEnd,
|
||||||
|
DateFrom = firstOperation.DateStart,
|
||||||
|
DateTo = lastOperation.DateStart.AddHours(lastOperation.DurationHours),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return wellbores.Skip(skip).Take(take);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<IOrderedEnumerable<WellOperationDto>> GetFactOperationsAsync(int idWell, int? idSection,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var request = new WellOperationRequest
|
||||||
|
{
|
||||||
|
IdWell = idWell,
|
||||||
|
OperationType = WellOperation.IdOperationTypeFact,
|
||||||
|
SortFields = new[] { "DateStart asc" },
|
||||||
|
};
|
||||||
|
|
||||||
|
if (idSection.HasValue)
|
||||||
|
request.SectionTypeIds = new[] { idSection.Value };
|
||||||
|
|
||||||
|
return (await wellOperationRepository.GetAsync(request, cancellationToken))
|
||||||
|
.OrderBy(o => o.DateStart);
|
||||||
|
}
|
||||||
|
}
|
@ -3,8 +3,8 @@ using System.Threading;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using AsbCloudApp.Data;
|
using AsbCloudApp.Data;
|
||||||
using AsbCloudApp.Exceptions;
|
using AsbCloudApp.Exceptions;
|
||||||
using AsbCloudApp.Repositories;
|
|
||||||
using AsbCloudApp.Requests;
|
using AsbCloudApp.Requests;
|
||||||
|
using AsbCloudApp.Services;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
@ -19,11 +19,11 @@ namespace AsbCloudWebApi.Controllers;
|
|||||||
[Route("api/well/[controller]")]
|
[Route("api/well/[controller]")]
|
||||||
public class WellboreController : ControllerBase
|
public class WellboreController : ControllerBase
|
||||||
{
|
{
|
||||||
private readonly IWellOperationRepository wellOperationRepository;
|
private readonly IWellboreService wellboreService;
|
||||||
|
|
||||||
public WellboreController(IWellOperationRepository wellOperationRepository)
|
public WellboreController(IWellboreService wellboreService)
|
||||||
{
|
{
|
||||||
this.wellOperationRepository = wellOperationRepository;
|
this.wellboreService = wellboreService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -39,7 +39,7 @@ public class WellboreController : ControllerBase
|
|||||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||||
public async Task<IActionResult> GetAsync(int idWell, int idSection, CancellationToken cancellationToken)
|
public async Task<IActionResult> GetAsync(int idWell, int idSection, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var wellbore = await wellOperationRepository.GetWellboreAsync(idWell, idSection, cancellationToken);
|
var wellbore = await wellboreService.GetWellboreAsync(idWell, idSection, cancellationToken);
|
||||||
|
|
||||||
if (wellbore is null)
|
if (wellbore is null)
|
||||||
return NoContent();
|
return NoContent();
|
||||||
@ -69,7 +69,7 @@ public class WellboreController : ControllerBase
|
|||||||
Take = take
|
Take = take
|
||||||
};
|
};
|
||||||
|
|
||||||
return Ok(await wellOperationRepository.GetWellboresAsync(request, cancellationToken));
|
return Ok(await wellboreService.GetWellboresAsync(request, cancellationToken));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IEnumerable<(int, int?)> ParseIds(IEnumerable<string> ids)
|
private static IEnumerable<(int, int?)> ParseIds(IEnumerable<string> ids)
|
||||||
|
Loading…
Reference in New Issue
Block a user