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()
{
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);
saubDataCache.AddData(dataSaubDto);
if (saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry).Count() > 1)
foreach (var dataSaub in dataSaubsToAnalyze)
{
var dataSaubs = saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry)
.OrderBy(d => d.Date);
var dataSaubDto = dataSaub.Adapt<TelemetryDataSaubDto>();
var telemetryAnalysisDto = GetDrillingAnalysis(dataSaubs);
saubDataCache.AddData(dataSaubDto);
if (saubDataCache.CurrentAnalysis is null)
saubDataCache.CurrentAnalysis = telemetryAnalysisDto;
if (saubDataCache.CurrentAnalysis.IdOperation == telemetryAnalysisDto.IdOperation)
if (saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry).Count() > 1)
{
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;
var dataSaubs = saubDataCache.GetOrCreateCache(dataSaubDto.IdTelemetry)
.OrderBy(d => d.Date);
var telemetryAnalysisDto = GetDrillingAnalysis(dataSaubs);
if (saubDataCache.CurrentAnalysis is null)
saubDataCache.CurrentAnalysis = telemetryAnalysisDto;
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(
IEnumerable<(long IntervalStart, string OperationName, int OperationDuration)> operations, int intervalSeconds)
{