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,45 +233,52 @@ 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);
saubDataCache.AddData(dataSaubDto); foreach (var dataSaub in dataSaubsToAnalyze)
if (saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry).Count() > 1)
{ {
var dataSaubs = saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry) var dataSaubDto = dataSaub.Adapt<TelemetryDataSaubDto>();
.OrderBy(d => d.Date);
var telemetryAnalysisDto = GetDrillingAnalysis(dataSaubs); saubDataCache.AddData(dataSaubDto);
if (saubDataCache.CurrentAnalysis is null) if (saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry).Count() > 1)
saubDataCache.CurrentAnalysis = telemetryAnalysisDto;
if (saubDataCache.CurrentAnalysis.IdOperation == telemetryAnalysisDto.IdOperation)
{ {
saubDataCache.CurrentAnalysis.DurationSec += var dataSaubs = saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry)
telemetryAnalysisDto.DurationSec; .OrderBy(d => d.Date);
saubDataCache.CurrentAnalysis.OperationEndDepth = dataSaubDto.WellDepth;
} var telemetryAnalysisDto = GetDrillingAnalysis(dataSaubs);
else
{ if (saubDataCache.CurrentAnalysis is null)
db.TelemetryAnalysis.Add(saubDataCache.CurrentAnalysis.Adapt<TelemetryAnalysis>()); saubDataCache.CurrentAnalysis = telemetryAnalysisDto;
saubDataCache.CurrentAnalysis = telemetryAnalysisDto;
saubDataCache.CurrentAnalysis.OperationStartDepth = dataSaubDto.WellDepth; if (saubDataCache.CurrentAnalysis.IdOperation == telemetryAnalysisDto.IdOperation)
{
saubDataCache.CurrentAnalysis.DurationSec +=
telemetryAnalysisDto.DurationSec;
saubDataCache.CurrentAnalysis.OperationEndDepth = dataSaubDto.WellDepth;
}
else
{
db.TelemetryAnalysis.Add(saubDataCache.CurrentAnalysis.Adapt<TelemetryAnalysis>());
saubDataCache.CurrentAnalysis = telemetryAnalysisDto;
saubDataCache.CurrentAnalysis.OperationStartDepth = dataSaubDto.WellDepth;
}
} }
} }
}
db.SaveChanges(); db.SaveChanges();
}
} }
} }
@ -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)
{ {