CS2-119: Fixed incoming telemetry date transform

This commit is contained in:
KharchenkoVladimir 2021-11-18 14:25:11 +05:00
parent e62ac96bd7
commit 6b7f589ddc
3 changed files with 43 additions and 40 deletions

View File

@ -13,7 +13,8 @@ namespace AsbCloudApp.Services
int GetOrCreateTemetryIdByUid(string uid); int GetOrCreateTemetryIdByUid(string uid);
double GetTimezoneOffsetByTelemetryId(int idTelemetry); double GetTimezoneOffsetByTelemetryId(int idTelemetry);
Task UpdateInfoAsync(string uid, TelemetryInfoDto info, CancellationToken token); Task UpdateInfoAsync(string uid, TelemetryInfoDto info, CancellationToken token);
Task<DateTime> FixDateToTimeZoneAsync(int idTelemetry, DateTime date, Task<double?> GetTelemetryTimeZoneOffsetAsync(int idTelemetry, CancellationToken token);
DateTime FixDateToTimeZone(DateTime date, double offsetHours,
CancellationToken token); CancellationToken token);
Task<DatesRangeDto> FixDatesRangeByTimeZoneAsync(int telemetryId, DatesRangeDto result, Task<DatesRangeDto> FixDatesRangeByTimeZoneAsync(int telemetryId, DatesRangeDto result,
CancellationToken token); CancellationToken token);

View File

@ -60,16 +60,16 @@ namespace AsbCloudInfrastructure.Services
dtosList.Remove(duplicate); dtosList.Remove(duplicate);
} }
var tasks = dtosList.Select(async d => { var offsetHours = await telemetryService.GetTelemetryTimeZoneOffsetAsync(idTelemetry, token);
var entities = dtosList.Select(d => {
var e = Convert(d); var e = Convert(d);
e.IdTelemetry = idTelemetry; e.IdTelemetry = idTelemetry;
e.Date = await telemetryService.FixDateToTimeZoneAsync(idTelemetry, d.Date, token) if(offsetHours is not null)
.ConfigureAwait(false); e.Date = telemetryService.FixDateToTimeZone(d.Date, (double)offsetHours, token);
return e; return e;
}); });
var entities = await Task.WhenAll(tasks);
var dbset = db.Set<TModel>(); var dbset = db.Set<TModel>();
try try
{ {

View File

@ -31,6 +31,8 @@ namespace AsbCloudInfrastructure.Services
{ {
cacheTelemetry = cacheDb.GetCachedTable<Telemetry>((AsbCloudDbContext)db); cacheTelemetry = cacheDb.GetCachedTable<Telemetry>((AsbCloudDbContext)db);
cacheWells = cacheDb.GetCachedTable<Well>((AsbCloudDbContext)db); cacheWells = cacheDb.GetCachedTable<Well>((AsbCloudDbContext)db);
cacheClusters = cacheDb.GetCachedTable<Cluster>((AsbCloudDbContext)db);
cacheDeposits = cacheDb.GetCachedTable<Deposit>((AsbCloudDbContext)db);
this.db = db; this.db = db;
this.telemetryTracker = telemetryTracker; this.telemetryTracker = telemetryTracker;
} }
@ -99,46 +101,46 @@ namespace AsbCloudInfrastructure.Services
.ConfigureAwait(false); .ConfigureAwait(false);
} }
public async Task<DateTime> FixDateToTimeZoneAsync(int idTelemetry, DateTime date, public async Task<double?> GetTelemetryTimeZoneOffsetAsync(int idTelemetry, CancellationToken token)
CancellationToken token)
{ {
if(date.Kind == DateTimeKind.Utc)
return date;
if (date.Kind == DateTimeKind.Local)
return date.ToUniversalTime();
var telemetry = var telemetry =
await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == idTelemetry, token); await cacheTelemetry.FirstOrDefaultAsync(t => t.Id == idTelemetry, token);
if (telemetry is null) if (telemetry.TelemetryTimeZone is not null)
return date; return telemetry.TelemetryTimeZone.Hours;
if (telemetry.TelemetryTimeZone is null) var well = await cacheWells.FirstOrDefaultAsync(w => w.IdTelemetry == telemetry.Id, token)
.ConfigureAwait(false);
if (well is null)
return null;
var requestedTimeZoneInfo = await GetTimeZoneInfoAsync(well.Id, token)
.ConfigureAwait(false);
if (requestedTimeZoneInfo.TimezoneId is null)
return null;
telemetry.TelemetryTimeZone = new TelemetryTimeZone()
{ {
var well = await cacheWells.FirstOrDefaultAsync(w => w.IdTelemetry == telemetry.Id, token) Hours = requestedTimeZoneInfo.GmtOffset,
.ConfigureAwait(false); TimeZoneId = requestedTimeZoneInfo.TimezoneId
};
if (well is null) await cacheTelemetry.UpsertAsync(telemetry, token).ConfigureAwait(false);
return date;
var requestedTimeZoneInfo = await GetTimeZoneInfoAsync(well.Id, token) return telemetry.TelemetryTimeZone.Hours;
.ConfigureAwait(false); }
if (requestedTimeZoneInfo.TimezoneId is null) public DateTime FixDateToTimeZone(DateTime date, double offsetHours,
return date; CancellationToken token)
{
telemetry.TelemetryTimeZone = new TelemetryTimeZone() return date.Kind switch
{ {
Hours = requestedTimeZoneInfo.GmtOffset, DateTimeKind.Utc => date,
TimeZoneId = requestedTimeZoneInfo.TimezoneId DateTimeKind.Local => date.ToUniversalTime(),
}; _ => date.AddHours(-offsetHours)
};
await cacheTelemetry.UpsertAsync(telemetry, token).ConfigureAwait(false);
}
var offsetHours = telemetry.TelemetryTimeZone.Hours;
return date.AddHours(offsetHours * -1);
} }
public async Task<DatesRangeDto> FixDatesRangeByTimeZoneAsync(int telemetryId, DatesRangeDto result, public async Task<DatesRangeDto> FixDatesRangeByTimeZoneAsync(int telemetryId, DatesRangeDto result,