forked from ddrilling/AsbCloudServer
Корректировка методов расчета статистики по наработкам подсистем.
This commit is contained in:
parent
5672e0b149
commit
fcb1bb92d9
@ -30,6 +30,14 @@ namespace AsbCloudApp.Services
|
||||
/// <param name="token"></param>
|
||||
/// <returns></returns>
|
||||
Task<DetectedOperationListDto?> GetAsync(DetectedOperationRequest request, CancellationToken token);
|
||||
|
||||
/// <summary>
|
||||
/// Получить автоматически определенные по телеметрии операции
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <param name="token"></param>
|
||||
/// <returns></returns>
|
||||
Task<IEnumerable<DetectedOperationDto>?> GetOperationsAsync(DetectedOperationRequest request, CancellationToken token);
|
||||
|
||||
/// <summary>
|
||||
/// Удалить операции
|
||||
@ -37,6 +45,7 @@ namespace AsbCloudApp.Services
|
||||
/// <param name="request"></param>
|
||||
/// <param name="token"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
Task<int> DeleteAsync(DetectedOperationRequest request, CancellationToken token);
|
||||
|
||||
/// <summary>
|
||||
|
@ -64,7 +64,7 @@ namespace AsbCloudInfrastructure.Services.DetectOperations
|
||||
return result;
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<DetectedOperationDto>?> GetOperationsAsync(DetectedOperationRequest request, CancellationToken token)
|
||||
public async Task<IEnumerable<DetectedOperationDto>?> GetOperationsAsync(DetectedOperationRequest request, CancellationToken token)
|
||||
{
|
||||
var well = await wellService.GetOrDefaultAsync(request.IdWell, token);
|
||||
if (well?.IdTelemetry is null || well.Timezone is null)
|
||||
|
@ -86,7 +86,20 @@ namespace AsbCloudInfrastructure.Services.Subsystems
|
||||
var data = await GetOperationTimeAsync(request, token);
|
||||
if (data is null)
|
||||
return null;
|
||||
var statList = await CalcStatAsync(data, request, token);
|
||||
|
||||
var detectedOperationsRequest = new DetectedOperationRequest()
|
||||
{
|
||||
IdWell = request.IdWell,
|
||||
IdsCategories = new List<int>() {
|
||||
1,3
|
||||
},
|
||||
LtDate = request.LtDate,
|
||||
GtDate = request.GtDate,
|
||||
};
|
||||
var detectedOperations = await detectedOperationService.GetOperationsAsync(detectedOperationsRequest, token);
|
||||
var depthInterval = GetDepthInterval(detectedOperations);
|
||||
|
||||
var statList = CalcStat(data,depthInterval,request, token);
|
||||
return statList;
|
||||
}
|
||||
|
||||
@ -110,73 +123,59 @@ namespace AsbCloudInfrastructure.Services.Subsystems
|
||||
return items;
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<SubsystemStatDto>> CalcStatAsync(IEnumerable<SubsystemOperationTimeDto> dtos, SubsystemOperationTimeRequest request, CancellationToken token)
|
||||
private IEnumerable<SubsystemStatDto> CalcStat(IEnumerable<SubsystemOperationTimeDto> dtos, (double depthIntervalRotor, double depthIntervalSlide) depthInterval, SubsystemOperationTimeRequest request, CancellationToken token)
|
||||
{
|
||||
var groupedDataSubsystems = dtos
|
||||
.GroupBy(o => o.IdSubsystem);
|
||||
|
||||
var detectedOperationsRequest = new DetectedOperationRequest()
|
||||
{
|
||||
IdWell = request.IdWell,
|
||||
IdsCategories = new List<int>() {
|
||||
1,3
|
||||
},
|
||||
LtDate = request.LtDate,
|
||||
GtDate = request.GtDate,
|
||||
};
|
||||
var detectedOperations = await detectedOperationService.GetAsync(detectedOperationsRequest, token);
|
||||
|
||||
var periodGroupTotal = dtos.Sum(o => (o.DateEnd - o.DateStart).TotalHours);
|
||||
|
||||
var gtDate = request.GtDate ?? dtos.Min(o => o.DateStart);
|
||||
var ltDate = request.LtDate ?? dtos.Max(o => o.DateEnd);
|
||||
|
||||
|
||||
var periodRequest = (ltDate - gtDate).TotalHours;
|
||||
|
||||
var result = groupedDataSubsystems.Select(g =>
|
||||
{
|
||||
double depthIntervalSubsystem = 0;
|
||||
//AKB - MSE
|
||||
if (g.Key == 1 | g.Key == 2)
|
||||
{
|
||||
depthIntervalSubsystem = depthInterval.depthIntervalRotor + depthInterval.depthIntervalSlide;
|
||||
}
|
||||
//Spin
|
||||
if (g.Key == 65536)
|
||||
{
|
||||
depthIntervalSubsystem = depthInterval.depthIntervalSlide;
|
||||
}
|
||||
//Torque
|
||||
if (g.Key == 65537)
|
||||
{
|
||||
depthIntervalSubsystem = depthInterval.depthIntervalRotor;
|
||||
}
|
||||
|
||||
var periodGroup = g.Sum(o => (o.DateEnd - o.DateStart).TotalHours);
|
||||
var periodGroupDepth = g.Sum(o => o.DepthEnd - o.DepthStart);
|
||||
var depthInterval = GetDepthInterval(g.Key, detectedOperations.Operations);
|
||||
//
|
||||
var subsystemStat = new SubsystemStatDto()
|
||||
{
|
||||
IdSubsystem = g.Key,
|
||||
SubsystemName = subsystemService.GetOrDefault(g.Key)?.Name ?? "unknown",
|
||||
UsedTimeHours = periodGroup,
|
||||
KUsage = periodGroupDepth / depthInterval,
|
||||
KUsage = periodGroupDepth / depthIntervalSubsystem,
|
||||
SumDepthInterval = periodGroupDepth,
|
||||
OperationCount = g.Count()
|
||||
};
|
||||
if(subsystemStat.KUsage > 100)
|
||||
subsystemStat.KUsage = 100;
|
||||
return subsystemStat;
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
private double GetDepthInterval (int idSubsystem, IEnumerable<DetectedOperationDto>? detectedOperations)
|
||||
private (double,double) GetDepthInterval (IEnumerable<DetectedOperationDto>? detectedOperations)
|
||||
{
|
||||
var depthInterval = (depthIntervalRotor:(double)0, depthIntervalSlide: (double)0);
|
||||
if (detectedOperations is null)
|
||||
return 0;
|
||||
var depthIntervalRotor = detectedOperations.Where(o => o.IdCategory == 1)
|
||||
return depthInterval;
|
||||
depthInterval.depthIntervalRotor = detectedOperations.Where(o => o.IdCategory == 1)
|
||||
.Sum(o => o.DepthEnd - o.DepthStart);
|
||||
var depthIntervalSlide = detectedOperations.Where(o => o.IdCategory == 3)
|
||||
.Sum(o => o.DepthEnd - o.DepthStart);
|
||||
//AKB - MSE
|
||||
if (idSubsystem == 1 | idSubsystem ==2)
|
||||
{
|
||||
return depthIntervalRotor + depthIntervalSlide;
|
||||
}
|
||||
//Spin
|
||||
if (idSubsystem == 65536)
|
||||
{
|
||||
return depthIntervalSlide;
|
||||
}
|
||||
//Torque
|
||||
if (idSubsystem == 65537)
|
||||
{
|
||||
return depthIntervalRotor;
|
||||
}
|
||||
return 0;
|
||||
depthInterval.depthIntervalSlide = detectedOperations.Where(o => o.IdCategory == 3)
|
||||
.Sum(o => o.DepthEnd - o.DepthStart);
|
||||
return depthInterval;
|
||||
}
|
||||
|
||||
private IQueryable<SubsystemOperationTime>? BuildQuery(SubsystemOperationTimeRequest request)
|
||||
|
Loading…
Reference in New Issue
Block a user