Приведение записей из t_data_saub_stat ко времени куста

This commit is contained in:
Olga Nemt 2024-02-07 13:28:02 +05:00
parent 65f04090bf
commit 8bc66a0d85
2 changed files with 61 additions and 10 deletions

View File

@ -1,5 +1,6 @@
using AsbCloudApp.Data; using AsbCloudApp.Data;
using AsbCloudApp.Repositories; using AsbCloudApp.Repositories;
using AsbCloudApp.Services;
using AsbCloudDb.Model; using AsbCloudDb.Model;
using Mapster; using Mapster;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@ -14,27 +15,54 @@ namespace AsbCloudInfrastructure.Repository
public class DataSaubStatRepository : IDataSaubStatRepository public class DataSaubStatRepository : IDataSaubStatRepository
{ {
private readonly IAsbCloudDbContext db; private readonly IAsbCloudDbContext db;
private readonly ITelemetryService telemetryService;
public DataSaubStatRepository(IAsbCloudDbContext dbContext) public DataSaubStatRepository(IAsbCloudDbContext dbContext, ITelemetryService telemetryService)
{ {
db = dbContext; db = dbContext;
this.telemetryService = telemetryService;
} }
public async Task<IEnumerable<DataSaubStatDto>> GetLastsAsync(int[] idTelemetries, CancellationToken token) public async Task<IEnumerable<DataSaubStatDto>> GetLastsAsync(int[] idTelemetries, CancellationToken token)
{ {
var timeZoneOffsets = idTelemetries
.Distinct()
.ToDictionary(idTelemetry => idTelemetry, idTelemetry => TimeSpan.FromHours(telemetryService.GetTimezone(idTelemetry).Hours));
var stats = await db.Set<DataSaubStat>() var stats = await db.Set<DataSaubStat>()
.Where(s => idTelemetries.Contains(s.IdTelemetry)) .Where(s => idTelemetries.Contains(s.IdTelemetry))
.GroupBy(s => s.IdTelemetry, (key, group) => group.OrderByDescending(el => el.DateEnd).First().Adapt<DataSaubStatDto>()) .GroupBy(s => s.IdTelemetry, (key, group) => group.OrderByDescending(el => el.DateEnd).First())
.ToArrayAsync(token); .ToArrayAsync(token);
return stats; var result = stats.Select(s => ConvertToDto(s, timeZoneOffsets[s.IdTelemetry]));
return result;
} }
public async Task<int> InsertRangeAsync(IEnumerable<DataSaubStatDto> dataSaubStats, CancellationToken token) public async Task<int> InsertRangeAsync(IEnumerable<DataSaubStatDto> dataSaubStats, CancellationToken token)
{ {
var entities = dataSaubStats.Select(data => data.Adapt<DataSaubStat>()); var entities = dataSaubStats.Select(data => ConvertToEntity(data));
db.Set<DataSaubStat>().AddRange(entities); db.Set<DataSaubStat>().AddRange(entities);
return await db.SaveChangesAsync(token); return await db.SaveChangesAsync(token);
} }
private static DataSaubStatDto ConvertToDto(DataSaubStat entity, TimeSpan timeSpan)
{
var dto = entity.Adapt<DataSaubStatDto>();
dto.DateStart = dto.DateStart.ToOffset(timeSpan);
dto.DateEnd = dto.DateEnd.ToOffset(timeSpan);
return dto;
}
private static DataSaubStat ConvertToEntity(DataSaubStatDto dto)
{
var entity = dto.Adapt<DataSaubStat>();
entity.DateStart = dto.DateStart.ToUniversalTime();
entity.DateEnd = dto.DateEnd.ToUniversalTime();
return entity;
}
} }
} }

View File

@ -9,13 +9,15 @@ namespace AsbCloudWebApi.IntegrationTests.Repository
{ {
public class DataSaubStatRepositoryTest : BaseIntegrationTest public class DataSaubStatRepositoryTest : BaseIntegrationTest
{ {
private static readonly TimeSpan timeSpan = TimeSpan.FromHours(1);
private static readonly DataSaubStatDto[] statDtos = new DataSaubStatDto[2] private static readonly DataSaubStatDto[] statDtos = new DataSaubStatDto[2]
{ {
new DataSaubStatDto() new DataSaubStatDto()
{ {
IdTelemetry = 1, IdTelemetry = 1,
DateEnd = new DateTimeOffset(2024, 1, 1, 20, 25, 0, TimeSpan.Zero), DateEnd = new DateTimeOffset(2024, 1, 1, 20, 25, 0, timeSpan),
DateStart = new DateTimeOffset(2024, 1, 1, 20, 15, 0, TimeSpan.Zero), DateStart = new DateTimeOffset(2024, 1, 1, 20, 15, 0, timeSpan),
AxialLoad = 10.0, AxialLoad = 10.0,
AxialLoadLimitMax = 10.0, AxialLoadLimitMax = 10.0,
AxialLoadSp = 10.0, AxialLoadSp = 10.0,
@ -40,8 +42,8 @@ namespace AsbCloudWebApi.IntegrationTests.Repository
new DataSaubStatDto() new DataSaubStatDto()
{ {
IdTelemetry = 1, IdTelemetry = 1,
DateEnd = new DateTimeOffset(2024, 2, 2, 20, 25, 0, TimeSpan.Zero), DateEnd = new DateTimeOffset(2024, 2, 2, 20, 25, 0, timeSpan),
DateStart = new DateTimeOffset(2024, 2, 2, 20, 15, 0, TimeSpan.Zero), DateStart = new DateTimeOffset(2024, 2, 2, 20, 15, 0, timeSpan),
AxialLoad = 10.0, AxialLoad = 10.0,
AxialLoadLimitMax = 10.0, AxialLoadLimitMax = 10.0,
AxialLoadSp = 10.0, AxialLoadSp = 10.0,
@ -87,7 +89,7 @@ namespace AsbCloudWebApi.IntegrationTests.Repository
var dbSetSaubStat = dbContext.Set<DataSaubStat>(); var dbSetSaubStat = dbContext.Set<DataSaubStat>();
var dbSetCategories = dbContext.Set<WellOperationCategory>(); var dbSetCategories = dbContext.Set<WellOperationCategory>();
var entities = statDtos.Select(stat => stat.Adapt<DataSaubStat>()); var entities = statDtos.Select(stat => ConvertToEntity(stat));
dbSetCategories.Add(category); dbSetCategories.Add(category);
dbSetSaubStat.AddRange(entities); dbSetSaubStat.AddRange(entities);
@ -113,6 +115,10 @@ namespace AsbCloudWebApi.IntegrationTests.Repository
//act //act
var dbSet = dbContext.Set<DataSaubStat>(); var dbSet = dbContext.Set<DataSaubStat>();
dbSet.RemoveRange(dbSet); dbSet.RemoveRange(dbSet);
var dbSetCategories = dbContext.Set<WellOperationCategory>();
dbSetCategories.Add(category);
dbContext.SaveChanges(); dbContext.SaveChanges();
var result = await dataSaubStatRepository.InsertRangeAsync(statDtos, CancellationToken.None); var result = await dataSaubStatRepository.InsertRangeAsync(statDtos, CancellationToken.None);
@ -120,7 +126,7 @@ namespace AsbCloudWebApi.IntegrationTests.Repository
//assert //assert
Assert.Equal(statDtos.Length, result); Assert.Equal(statDtos.Length, result);
var statDtosFromDb = dbSet.Select(stat => stat.Adapt<DataSaubStatDto>()).ToArray(); var statDtosFromDb = dbSet.Select(stat => ConvertToDto(stat, timeSpan)).ToArray();
var excludedProps = new[] { var excludedProps = new[] {
nameof(DataSaubStat.Telemetry), nameof(DataSaubStat.Telemetry),
@ -136,7 +142,24 @@ namespace AsbCloudWebApi.IntegrationTests.Repository
MatchHelper.Match(statDtoFromDb, statDto, excludedProps); MatchHelper.Match(statDtoFromDb, statDto, excludedProps);
} }
}
private static DataSaubStat ConvertToEntity(DataSaubStatDto stat)
{
var entity = stat.Adapt<DataSaubStat>();
entity.DateStart = entity.DateStart.ToUniversalTime();
entity.DateEnd = entity.DateEnd.ToUniversalTime();
return entity;
}
private static DataSaubStatDto ConvertToDto(DataSaubStat stat, TimeSpan timeSpan)
{
var dto = stat.Adapt<DataSaubStatDto>();
dto.DateStart = dto.DateStart.ToOffset(timeSpan);
dto.DateEnd = dto.DateEnd.ToOffset(timeSpan);
return dto;
} }
} }
} }