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