Доработан метод получения статистики по активным скважинам

This commit is contained in:
eugeniy_ivanov 2022-11-01 23:01:50 +05:00
parent 562bf5b348
commit 0e5ff57d0f
2 changed files with 53 additions and 45 deletions

View File

@ -14,7 +14,7 @@ namespace AsbCloudApp.Data.Subsystems
/// <summary> /// <summary>
/// Наработки подсистем /// Наработки подсистем
/// </summary> /// </summary>
public IEnumerable<SubsystemStatDto> listSubsystemStat { get; set; } public List<SubsystemStatDto> listSubsystemStat { get; set; }
} }
} }

View File

@ -184,71 +184,79 @@ namespace AsbCloudInfrastructure.Services.Subsystems
} }
//TODO:
// скорее всего нужно доработать wellService - первое это метод
// GetWellsByCompanyAsync (получать сразу активные скважины ,а не вытягивать сначала все)
// второе - метод GetOperationsAsync - по умолчанию если не указан
// ИД скважины он заполняется как 0 , в нашем случае нужно получить опред операции по ВСЕМ
// скважинам
private async Task<IEnumerable<WellDto>> GetSubsystemOperationTimeAll(int idCompany, CancellationToken token) private async Task<IEnumerable<WellDto>> GetSubsystemOperationTimeAll(int idCompany, CancellationToken token)
{ {
var listWell = await wellService.GetWellsByCompanyAsync(idCompany, token); var listWell = await wellService.GetWellsByCompanyAsync(idCompany, token);
var active = listWell.Where(w => w.IdState == 1); var active = listWell.Where(w => w.IdState == 1);
return active; return active;
} }
public async Task<IEnumerable<SubsystemActiveWellStatDto>?> GetStatByActiveWell(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token) public async Task<IEnumerable<SubsystemActiveWellStatDto>?> GetStatByActiveWell(int idCompany, DateTime? gtDate, DateTime? ltDate, CancellationToken token)
{ {
var activeWell = await GetSubsystemOperationTimeAll(idCompany, token); var activeWell = await GetSubsystemOperationTimeAll(idCompany, token);
var telemetryIds = activeWell.Select(w => w.IdTelemetry); var telemetryIds = activeWell.Select(w => w.IdTelemetry).Distinct();
var query = db.SubsystemOperationTimes var query = db.SubsystemOperationTimes
.Include(o => o.Subsystem)
.Where(o => telemetryIds.Contains(o.IdTelemetry)) .Where(o => telemetryIds.Contains(o.IdTelemetry))
.AsNoTracking(); .AsNoTracking();
if (query is null) if (query is null)
{ {
return null; return null;
} }
DateTime today = DateTime.Today; DateTime today = DateTime.Today;
if (gtDate.HasValue) if (!gtDate.HasValue)
{
query = query.Where(o => o.DateEnd >= gtDate);
}
else
{ {
gtDate = today; gtDate = today;
query = query.Where(o => o.DateEnd == gtDate); }
} query = query.Where(o => o.DateStart >= gtDate.Value.ToUniversalTime());
if (ltDate.HasValue) if (!ltDate.HasValue)
{
query = query.Where(o => o.DateStart <= ltDate);
}
else
{ {
ltDate = today.AddDays(-1); ltDate = today.AddDays(-1);
query = query.Where(o => o.DateStart == ltDate ); }
} query = query.Where(o => o.DateEnd <= ltDate.Value.ToUniversalTime());
var detectedOperationsRequest = new DetectedOperationRequest() var result = new List<SubsystemActiveWellStatDto>();
{ var subsystemsOperationTime = query.ToList();
IdsCategories = new List<int>() { var groupingSubsystemsOperationTime = subsystemsOperationTime.GroupBy(g => g.IdTelemetry).ToList();
1,3
},
LtDate = ltDate,
GtDate = gtDate,
};
var detectedOperations = await detectedOperationService.GetOperationsAsync(detectedOperationsRequest, token);
var groupData = query.GroupBy(g => g.IdTelemetry);
var result = new List<SubsystemActiveWellStatDto>();
foreach (var group in groupData)
{
var wellStat = new SubsystemActiveWellStatDto();
wellStat.IdWell = activeWell.Where(w => w.IdTelemetry == group.Key).Select(w => w.Id).FirstOrDefault();
var groupSubsystem = (IEnumerable<IGrouping<int, SubsystemOperationTimeDto>>)group.GroupBy(g => g.IdSubsystem);
var detectedOperationsById = detectedOperations.Where(d => d.IdWell == wellStat.IdWell).ToList();
var depthInterval = GetDepthInterval(detectedOperationsById);
wellStat.listSubsystemStat = CalcStat((IEnumerable<SubsystemOperationTimeDto>)groupSubsystem, depthInterval);
result.Add(wellStat);
}
foreach (var group in groupingSubsystemsOperationTime)
{
var idWell = activeWell.Where(w => w.IdTelemetry == group.Key).Select(w => w.Id).FirstOrDefault();
var wellStat = new SubsystemActiveWellStatDto()
{
IdWell = idWell,
listSubsystemStat = new List<SubsystemStatDto>()
};
var detectedOperationsRequest = new DetectedOperationRequest()
{
IdWell = idWell,
IdsCategories = new List<int>() {1,3},
LtDate = ltDate,
GtDate = gtDate,
};
var detectedOperations = await detectedOperationService.GetOperationsAsync(detectedOperationsRequest, token);
if (detectedOperations is not null && detectedOperations.Any())
{
var depthInterval = GetDepthInterval(detectedOperations);
var groupSubsystem = group.GroupBy(g => g.IdSubsystem).ToList();
foreach (var subsystem in groupSubsystem)
{
var dto = subsystem.Select(s => s.Adapt<SubsystemOperationTimeDto>());
var subsystemStat = CalcStat(dto, depthInterval);
wellStat.listSubsystemStat.AddRange(subsystemStat);
}
result.Add(wellStat);
}
}
return result; return result;
} }