forked from ddrilling/AsbCloudServer
- корректировка модели SubsystemStatDto
- корректировка метода GetDepthInterval - корректировка валидатора в контроллере SubsystemOperationTime
This commit is contained in:
parent
170cbb2258
commit
1613f9a9f4
@ -25,7 +25,7 @@ namespace AsbCloudApp.Data.Subsystems
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// сумма изменения глубин
|
/// сумма изменения глубин
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public double SumDepthChange { get; set; }
|
public double SumDepthInterval { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// количество операций
|
/// количество операций
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -126,7 +126,7 @@ namespace AsbCloudInfrastructure.Services.Subsystems
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static List<SubsystemOperationTime> getSubsystemOperationTimes (List<DataRow> dataRows, Predicate<DataRow> satisfyCondition, int idSubsystem, int idTelemetry)
|
static List<SubsystemOperationTime> GetSubsystemOperationTimes (List<DataRow> dataRows, Predicate<DataRow> satisfyCondition, int idSubsystem, int idTelemetry)
|
||||||
{
|
{
|
||||||
if (dataRows is null)
|
if (dataRows is null)
|
||||||
return new List<SubsystemOperationTime>();
|
return new List<SubsystemOperationTime>();
|
||||||
@ -206,8 +206,8 @@ namespace AsbCloudInfrastructure.Services.Subsystems
|
|||||||
};
|
};
|
||||||
dataRowList.Add(dateRowItem);
|
dataRowList.Add(dateRowItem);
|
||||||
}
|
}
|
||||||
var akbOperationTimes = getSubsystemOperationTimes(dataRowList, d => isSubsytemAkb(d.Mode), idSubsytemAkb, idTelemetry);
|
var akbOperationTimes = GetSubsystemOperationTimes(dataRowList, d => isSubsytemAkb(d.Mode), idSubsytemAkb, idTelemetry);
|
||||||
var mseOperationTimes = getSubsystemOperationTimes(dataRowList, d => IsSubsystemMse(d.State), idSubsytemMse, idTelemetry);
|
var mseOperationTimes = GetSubsystemOperationTimes(dataRowList, d => IsSubsystemMse(d.State), idSubsytemMse, idTelemetry);
|
||||||
subsystemOperationTime.AddRange(akbOperationTimes);
|
subsystemOperationTime.AddRange(akbOperationTimes);
|
||||||
subsystemOperationTime.AddRange(mseOperationTimes);
|
subsystemOperationTime.AddRange(mseOperationTimes);
|
||||||
return subsystemOperationTime;
|
return subsystemOperationTime;
|
||||||
|
@ -23,11 +23,13 @@ namespace AsbCloudInfrastructure.Services.Subsystems
|
|||||||
private readonly IAsbCloudDbContext db;
|
private readonly IAsbCloudDbContext db;
|
||||||
private readonly IWellService wellService;
|
private readonly IWellService wellService;
|
||||||
private readonly ICrudService<SubsystemDto> subsystemService;
|
private readonly ICrudService<SubsystemDto> subsystemService;
|
||||||
public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService, ICrudService<SubsystemDto> subsystemService)
|
private readonly IDetectedOperationService detectedOperationService;
|
||||||
|
public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService, ICrudService<SubsystemDto> subsystemService, IDetectedOperationService detectedOperationService)
|
||||||
{
|
{
|
||||||
this.db = db;
|
this.db = db;
|
||||||
this.wellService = wellService;
|
this.wellService = wellService;
|
||||||
this.subsystemService = subsystemService;
|
this.subsystemService = subsystemService;
|
||||||
|
this.detectedOperationService = detectedOperationService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
@ -83,7 +85,7 @@ 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 = CalcStat(data, request);
|
var statList = CalcStat(data, request, token);
|
||||||
return statList;
|
return statList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,77 +109,65 @@ namespace AsbCloudInfrastructure.Services.Subsystems
|
|||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<SubsystemStatDto> CalcStat(IEnumerable<SubsystemOperationTimeDto> dtos, SubsystemOperationTimeRequest request)
|
private async Task<IEnumerable<SubsystemStatDto>> CalcStat(IEnumerable<SubsystemOperationTimeDto> dtos, SubsystemOperationTimeRequest request, CancellationToken token)
|
||||||
{
|
{
|
||||||
var groupedDataSubsystems = dtos
|
var groupedDataSubsystems = dtos
|
||||||
.GroupBy(o => o.IdSubsystem);
|
.GroupBy(o => o.IdSubsystem);
|
||||||
|
|
||||||
|
//var _detectOperations = await detectedOperationService.GetAsync(, 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 gtDate = request.GtDate ?? dtos.Min(o => o.DateStart);
|
||||||
var ltDate = request.LtDate ?? dtos.Max(o => o.DateEnd);
|
var ltDate = request.LtDate ?? dtos.Max(o => o.DateEnd);
|
||||||
|
|
||||||
|
var detectedOperations = db.DetectedOperations
|
||||||
|
.Where(a => a.DateStart >= gtDate & a.DateEnd <= ltDate)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
var periodRequest = (ltDate - gtDate).TotalHours;
|
var periodRequest = (ltDate - gtDate).TotalHours;
|
||||||
|
|
||||||
var result = groupedDataSubsystems.Select(item =>
|
var result = groupedDataSubsystems.Select(g =>
|
||||||
{
|
{
|
||||||
var periodGroup = item.Sum(o => (o.DateEnd - o.DateStart).TotalHours);
|
var periodGroup = g.Sum(o => (o.DateEnd - o.DateStart).TotalHours);
|
||||||
var periodGroupDepth = item.Sum(o => o.DepthEnd - o.DepthStart);
|
var periodGroupDepth = g.Sum(o => o.DepthEnd - o.DepthStart);
|
||||||
var depthChange = GetDepthChange(item.Key, gtDate, ltDate);
|
var depthInterval = GetDepthInterval(g.Key, detectedOperations);
|
||||||
var subsystemStat = new SubsystemStatDto()
|
var subsystemStat = new SubsystemStatDto()
|
||||||
{
|
{
|
||||||
IdSubsystem = item.Key,
|
IdSubsystem = g.Key,
|
||||||
SubsystemName = subsystemService.GetOrDefault(item.Key)?.Name ?? "unknown",
|
SubsystemName = subsystemService.GetOrDefault(g.Key)?.Name ?? "unknown",
|
||||||
UsedTimeHours = periodGroup,
|
UsedTimeHours = periodGroup,
|
||||||
//условие добавлено что бы избежать деление на ноль
|
KUsage = periodGroupDepth / depthInterval,
|
||||||
//чисто теоретически такое событие может произойти только в случае
|
SumDepthInterval = periodGroupDepth,
|
||||||
//если не было определенных операций по какому то из режимов
|
OperationCount = g.Count()
|
||||||
// тогда в этом поле статистики будет null
|
|
||||||
KUsage = depthChange==0? double.NaN : periodGroupDepth / depthChange,
|
|
||||||
SumDepthChange = periodGroupDepth,
|
|
||||||
OperationCount = item.Count()
|
|
||||||
};
|
};
|
||||||
return subsystemStat;
|
return subsystemStat;
|
||||||
});
|
});
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
private double GetDepthChange (int idSubsystem, DateTime gtDate, DateTime ltDate)
|
private double GetDepthInterval (int idSubsystem, List<DetectedOperation> detectedOperations)
|
||||||
{
|
{
|
||||||
double depthChange = 0;
|
var depthIntervalRotor = detectedOperations.Where(o => o.IdCategory == 3)
|
||||||
var detectOperations = db.DetectedOperations
|
|
||||||
.Where(a => a.DateStart >= gtDate & a.DateEnd <= ltDate)
|
|
||||||
.ToList();
|
|
||||||
//AKB - Rotor+Slide
|
|
||||||
if (idSubsystem == 1)
|
|
||||||
{
|
|
||||||
depthChange = detectOperations.Where(a => a.IdCategory == 1 & a.IdCategory == 3)
|
|
||||||
.Sum(o => o.DepthEnd - o.DepthStart);
|
.Sum(o => o.DepthEnd - o.DepthStart);
|
||||||
return depthChange;
|
var depthIntervalSlide = detectedOperations.Where(o => o.IdCategory == 3)
|
||||||
}
|
|
||||||
//Mse - all detect operations
|
|
||||||
if (idSubsystem == 2)
|
|
||||||
{
|
|
||||||
depthChange = detectOperations
|
|
||||||
.Sum(o => o.DepthEnd - o.DepthStart);
|
.Sum(o => o.DepthEnd - o.DepthStart);
|
||||||
return depthChange;
|
//AKB - MSE
|
||||||
}
|
if (idSubsystem == 1 | idSubsystem ==2)
|
||||||
|
{
|
||||||
|
return depthIntervalRotor + depthIntervalSlide;
|
||||||
|
}
|
||||||
//Slide
|
//Slide
|
||||||
if (idSubsystem == 65536)
|
if (idSubsystem == 65536)
|
||||||
{
|
{
|
||||||
depthChange = detectOperations.Where(o => o.IdCategory == 3)
|
return depthIntervalSlide;
|
||||||
.Sum(o => o.DepthEnd - o.DepthStart);
|
|
||||||
return depthChange;
|
|
||||||
}
|
}
|
||||||
//Rotor
|
//Rotor
|
||||||
if (idSubsystem == 65537)
|
if (idSubsystem == 65537)
|
||||||
{
|
{
|
||||||
depthChange = detectOperations.Where(o => o.IdCategory == 1)
|
return depthIntervalRotor;
|
||||||
.Sum(o => o.DepthEnd - o.DepthStart);
|
|
||||||
return depthChange;
|
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
return depthChange;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private IQueryable<SubsystemOperationTime>? BuildQuery(SubsystemOperationTimeRequest request)
|
private IQueryable<SubsystemOperationTime>? BuildQuery(SubsystemOperationTimeRequest request)
|
||||||
|
@ -40,7 +40,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems
|
|||||||
if (!await UserHasAccesToWellAsync(request.IdWell, token))
|
if (!await UserHasAccesToWellAsync(request.IdWell, token))
|
||||||
return Forbid();
|
return Forbid();
|
||||||
if (!await TimeRequestValidate(request, token))
|
if (!await TimeRequestValidate(request, token))
|
||||||
return BadRequest();
|
return BadRequest("Запрашиваемый диапазон должен заканчиваться за 2 часа до текущего времени(после приведения к UTC).");
|
||||||
var subsystemResult = await subsystemOperationTimeService.GetStatAsync(request, token);
|
var subsystemResult = await subsystemOperationTimeService.GetStatAsync(request, token);
|
||||||
return Ok(subsystemResult);
|
return Ok(subsystemResult);
|
||||||
}
|
}
|
||||||
@ -72,7 +72,7 @@ namespace AsbCloudWebApi.Controllers.Subsystems
|
|||||||
if (!await UserHasAccesToWellAsync(request.IdWell, token))
|
if (!await UserHasAccesToWellAsync(request.IdWell, token))
|
||||||
return Forbid();
|
return Forbid();
|
||||||
if (!await TimeRequestValidate(request, token))
|
if (!await TimeRequestValidate(request, token))
|
||||||
return BadRequest();
|
return BadRequest("Запрашиваемый диапазон должен заканчиваться за 2 часа до текущего времени(после приведения к UTC).");
|
||||||
|
|
||||||
var result = await subsystemOperationTimeService.GetOperationTimeAsync(request, token);
|
var result = await subsystemOperationTimeService.GetOperationTimeAsync(request, token);
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
@ -93,6 +93,8 @@ namespace AsbCloudWebApi.Controllers.Subsystems
|
|||||||
{
|
{
|
||||||
if (!await UserHasAccesToWellAsync(request.IdWell, token))
|
if (!await UserHasAccesToWellAsync(request.IdWell, token))
|
||||||
return Forbid();
|
return Forbid();
|
||||||
|
if (!await TimeRequestValidate(request, token))
|
||||||
|
return BadRequest("Запрашиваемый диапазон должен заканчиваться за 2 часа до текущего времени(после приведения к UTC).");
|
||||||
var result = await subsystemOperationTimeService.DeleteAsync(request, token);
|
var result = await subsystemOperationTimeService.DeleteAsync(request, token);
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
@ -113,8 +115,8 @@ namespace AsbCloudWebApi.Controllers.Subsystems
|
|||||||
{
|
{
|
||||||
var ltDate = (DateTimeOffset)request.LtDate;
|
var ltDate = (DateTimeOffset)request.LtDate;
|
||||||
var utcDateRequest = ltDate.ToRemoteDateTime(well.Timezone.Hours);
|
var utcDateRequest = ltDate.ToRemoteDateTime(well.Timezone.Hours);
|
||||||
var DateNow = ((DateTimeOffset)DateTime.Now).ToRemoteDateTime(well.Timezone.Hours);
|
|
||||||
if (utcDateRequest.AddHours(2)<DateNow)
|
if (utcDateRequest.AddHours(2) < DateTime.UtcNow)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user