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()
{
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 &&
t.Date.Hour == (DateTime.UtcNow.Hour - 1)).ToList();
var analyzeStartDate = GetAnalyzeStartDate(idTelemetry);
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);
@ -274,6 +280,7 @@ namespace AsbCloudInfrastructure.Services
db.SaveChanges();
}
}
}
public async Task<DatesRangeDto> GetOperationsDateRangeAsync(int idWell,
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(
IEnumerable<(long IntervalStart, string OperationName, int OperationDuration)> operations, int intervalSeconds)
{