CS2-88: Changed telemetry analysis interval (to 12 hours parts)

This commit is contained in:
KharchenkoVV 2021-09-27 16:50:56 +05:00
parent 40b83826a4
commit 6730d64df1

View File

@ -233,16 +233,22 @@ namespace AsbCloudInfrastructure.Services
public void SaveAnalytics() public void SaveAnalytics()
{ {
var alltelemetryIds = db.TelemetryDataSaub.Select(t => t.IdTelemetry).Distinct().ToList(); var allTelemetryIds = (from telemetry in db.TelemetryDataSaub
select telemetry.Id)
.Distinct()
.ToList();
foreach(var idTelemetry in alltelemetryIds) foreach(var idTelemetry in allTelemetryIds)
{ {
var telemetries = db.TelemetryDataSaub.Where(t => t.IdTelemetry == idTelemetry && var analyzeStartDate = GetAnalyzeStartDate(idTelemetry);
t.Date.Hour == (DateTime.UtcNow.Hour - 1)).ToList();
foreach(var telemetry in telemetries) while (GetDataSaubsToAnalyze(idTelemetry, analyzeStartDate).Any())
{ {
var dataSaubDto = telemetry.Adapt<TelemetryDataSaubDto>(); var dataSaubsToAnalyze = GetDataSaubsToAnalyze(idTelemetry, (long)analyzeStartDate);
foreach (var dataSaub in dataSaubsToAnalyze)
{
var dataSaubDto = dataSaub.Adapt<TelemetryDataSaubDto>();
saubDataCache.AddData(dataSaubDto); saubDataCache.AddData(dataSaubDto);
@ -274,6 +280,7 @@ namespace AsbCloudInfrastructure.Services
db.SaveChanges(); db.SaveChanges();
} }
} }
}
public async Task<DatesRangeDto> GetOperationsDateRangeAsync(int idWell, public async Task<DatesRangeDto> GetOperationsDateRangeAsync(int idWell,
CancellationToken token = default) CancellationToken token = default)
@ -305,6 +312,42 @@ namespace AsbCloudInfrastructure.Services
}; };
} }
private long GetAnalyzeStartDate(int idTelemetry)
{
var lastAnalysisInDb = (from analysis in db.TelemetryAnalysis
where analysis.Id == idTelemetry
orderby analysis.UnixDate
select analysis)
.DefaultIfEmpty()
.Last();
var analyzeStartDate = lastAnalysisInDb?.UnixDate;
if (analyzeStartDate is null)
{
var firstDataSaub = (from ds in db.TelemetryDataSaub
where ds.IdTelemetry == idTelemetry
select ds.Date).FirstOrDefault();
analyzeStartDate = (long)(firstDataSaub - new DateTime(1970, 1, 1)).TotalSeconds;
}
return (long)analyzeStartDate;
}
private IEnumerable<TelemetryDataSaub> GetDataSaubsToAnalyze(int idTelemetry, long analyzeStartDate)
{
return (from ds in db.TelemetryDataSaub
let lowerBorder = DateTimeOffset
.FromUnixTimeSeconds(analyzeStartDate)
let upperBorder = DateTimeOffset
.FromUnixTimeSeconds(analyzeStartDate).AddHours(12)
where ds.Id == idTelemetry
&& ds.Date > lowerBorder
&& ds.Date < upperBorder
select ds).ToList();
}
private static IEnumerable<(long IntervalStart, string OperationName, int OperationDuration)> DivideOperationsByIntervalLength( private static IEnumerable<(long IntervalStart, string OperationName, int OperationDuration)> DivideOperationsByIntervalLength(
IEnumerable<(long IntervalStart, string OperationName, int OperationDuration)> operations, int intervalSeconds) IEnumerable<(long IntervalStart, string OperationName, int OperationDuration)> operations, int intervalSeconds)
{ {