- корректировка модели SubsystemStatDto

- корректировка метода GetDepthInterval
- корректировка валидатора в контроллере SubsystemOperationTime
This commit is contained in:
eugeniy_ivanov 2022-09-21 13:06:40 +05:00
parent 170cbb2258
commit 1613f9a9f4
4 changed files with 44 additions and 52 deletions

View File

@ -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>

View File

@ -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;

View File

@ -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)

View File

@ -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;
} }