diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 5e13827e..bbe3a30e 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -75,16 +75,15 @@ public class WellOperationRepository : IWellOperationRepository OperationType = WellOperation.IdOperationTypePlan, }; - var entities = await BuildQuery(request) + var dtos = await BuildQuery(request) .AsNoTracking() - .ToArrayAsync(token) - .ConfigureAwait(false); + .ToArrayAsync(token); var dateLastAssosiatedPlanOperation = await GetDateLastAssosiatedPlanOperationAsync(idWell, currentDate, timezone.Hours, token); - + var result = new WellOperationPlanDto() { - WellOperationsPlan = entities, + WellOperationsPlan = dtos.Select(Convert), DateLastAssosiatedPlanOperation = dateLastAssosiatedPlanOperation }; @@ -226,7 +225,7 @@ public class WellOperationRepository : IWellOperationRepository var dtos = await query.ToArrayAsync(token); - return dtos; + return dtos.Select(Convert); } /// @@ -234,21 +233,19 @@ public class WellOperationRepository : IWellOperationRepository WellOperationRequest request, CancellationToken token) { - var query = BuildQuery(request) - .AsNoTracking(); - + var query = BuildQuery(request); + var result = new PaginationContainer { Skip = request.Skip ?? 0, Take = request.Take ?? 32, - Count = await query.CountAsync(token).ConfigureAwait(false), + Count = await query.CountAsync(token), }; - query = query - .Skip(result.Skip) - .Take(result.Take); + var dtos = await query.ToArrayAsync(token); + + result.Items = dtos.Select(Convert); - result.Items = await query.ToArrayAsync(token); return result; } @@ -350,11 +347,13 @@ public class WellOperationRepository : IWellOperationRepository OperationType = firstOperation.IdType, }; - var entities = await BuildQuery(request) + var dtos = await BuildQuery(request) .AsNoTracking() .ToArrayAsync(token); - var wellOperationsUnion = entities.Union(wellOperationDtos).OrderBy(o => o.DateStart); + var dtosWithRemoteDateTime = dtos.Select(Convert); + + var wellOperationsUnion = dtosWithRemoteDateTime.Union(dtos).OrderBy(o => o.DateStart); var results = Validate(wellOperationsUnion); return results; @@ -368,16 +367,17 @@ public class WellOperationRepository : IWellOperationRepository if (!enumerator.MoveNext()) yield break; + var timezone = wellService.GetTimezone(wellOperationDtos.First().IdWell); + var timezoneOffset = timezone.Hours; + var previous = enumerator.Current; while(enumerator.MoveNext()) { var current = enumerator.Current; - var previousDateStart = previous.DateStart.ToUniversalTime(); - var currentDateStart = current.DateStart.ToUniversalTime(); - - var previousDateEnd = previous.DateStart.AddHours(previous.DurationHours).ToUniversalTime(); - + var previousDateStart = previous.DateStart.DateTime.ToUtcDateTimeOffset(timezoneOffset); + var currentDateStart = current.DateStart.DateTime.ToUtcDateTimeOffset(timezoneOffset); + if (previousDateStart.AddDays(Gap) < currentDateStart) { yield return new ValidationResult( @@ -452,12 +452,13 @@ public class WellOperationRepository : IWellOperationRepository /// В результате попрежнему требуется конвертировать дату /// /// + /// /// private IQueryable BuildQuery(WellOperationRequest request) { var timezone = wellService.GetTimezone(request.IdWell); - var timeZoneOffset = TimeSpan.FromHours(timezone.Hours); - + var timeZoneOffset = timezone.Hours; + var query = db.WellOperations .Include(s => s.WellSectionType) .Include(s => s.OperationCategory) @@ -481,20 +482,20 @@ public class WellOperationRepository : IWellOperationRepository if (request.GeDate.HasValue) { - var geDateOffset = request.GeDate.Value.ToUtcDateTimeOffset(timezone.Hours); + var geDateOffset = request.GeDate.Value.ToUtcDateTimeOffset(timeZoneOffset); query = query.Where(e => e.DateStart >= geDateOffset); } if (request.LtDate.HasValue) { - var ltDateOffset = request.LtDate.Value.ToUtcDateTimeOffset(timezone.Hours); + var ltDateOffset = request.LtDate.Value.ToUtcDateTimeOffset(timeZoneOffset); query = query.Where(e => e.DateStart < ltDateOffset); } var currentWellOperations = db.WellOperations .Where(subOp => subOp.IdWell == request.IdWell); - var wellOperationsWithCategoryNPT = currentWellOperations + var wellOperationsWithCategoryNpt = currentWellOperations .Where(subOp => subOp.IdType == 1) .Where(subOp => WellOperationCategory.NonProductiveTimeSubIds.Contains(subOp.IdCategory)); @@ -510,14 +511,14 @@ public class WellOperationRepository : IWellOperationRepository CategoryName = o.OperationCategory.Name, WellSectionTypeName = o.WellSectionType.Caption, - DateStart = DateTime.SpecifyKind(o.DateStart.UtcDateTime + timeZoneOffset, DateTimeKind.Unspecified), + DateStart = o.DateStart, DepthStart = o.DepthStart, DepthEnd = o.DepthEnd, DurationHours = o.DurationHours, CategoryInfo = o.CategoryInfo, Comment = o.Comment, - NptHours = wellOperationsWithCategoryNPT + NptHours = wellOperationsWithCategoryNpt .Where(subOp => subOp.DateStart <= o.DateStart) .Select(subOp => subOp.DurationHours) .Sum(), @@ -528,21 +529,38 @@ public class WellOperationRepository : IWellOperationRepository .Min(subOp => subOp.DateStart)) .TotalDays, IdUser = o.IdUser, - LastUpdateDate = o.LastUpdateDate.ToOffset(TimeSpan.FromHours(timezone.Hours)) + LastUpdateDate = o.LastUpdateDate, }); if (request.SortFields?.Any() == true) { dtos = dtos.SortBy(request.SortFields); } - else - { - dtos = dtos - .OrderBy(e => e.DateStart) - .ThenBy(e => e.DepthEnd) - .ThenBy(e => e.Id); - } - return dtos; + dtos = dtos + .OrderBy(e => e.DateStart) + .ThenBy(e => e.DepthEnd) + .ThenBy(e => e.Id); + + if (request.Skip.HasValue) + dtos = dtos.Skip(request.Skip.Value); + + if (request.Take.HasValue) + dtos = dtos.Take(request.Take.Value); + + return dtos.AsNoTracking(); + } + + private WellOperationDto Convert(WellOperationDto dto) + { + var timezone = wellService.GetTimezone(dto.IdWell); + var timezoneOffset = TimeSpan.FromHours(timezone.Hours); + + var dtoWithRemoteDateTime = dto.Adapt(); + + dtoWithRemoteDateTime.DateStart = dto.DateStart.ToOffset(TimeSpan.FromHours(timezoneOffset.Hours)); + dtoWithRemoteDateTime.LastUpdateDate = dto.LastUpdateDate?.ToOffset(TimeSpan.FromHours(timezoneOffset.Hours)); + + return dtoWithRemoteDateTime; } } diff --git a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs index 3ed21dc2..800979e5 100644 --- a/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs +++ b/AsbCloudInfrastructure/Services/WellOperationImport/WellOperationImportService.cs @@ -75,6 +75,8 @@ public class WellOperationImportService : IWellOperationImportService throw new FileFormatException($"Лист '{sheet.Name}'. Строка '{row.Number}' некорректная длительность операции"); var timezone = wellService.GetTimezone(idWell); + var timezoneOffset = TimeSpan.FromHours(timezone.Hours); + var wellOperation = new WellOperationDto { IdWell = idWell, @@ -85,7 +87,7 @@ public class WellOperationImportService : IWellOperationImportService CategoryInfo = row.CategoryInfo, DepthStart = row.DepthStart, DepthEnd = row.DepthEnd, - DateStart = row.Date.ToUtcDateTimeOffset(timezone.Hours).ToRemoteDateTime(timezone.Hours), + DateStart = new DateTimeOffset(row.Date, timezoneOffset), DurationHours = row.Duration, Comment = row.Comment }; diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperationControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperationControllerTest.cs index 51f6ab0e..5a924a70 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperationControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperationControllerTest.cs @@ -4,6 +4,7 @@ using AsbCloudWebApi.IntegrationTests.Clients; using System.Net; using System.Reflection; using AsbCloudApp.Requests; +using AsbCloudWebApi.IntegrationTests.Data; using Refit; using Xunit; @@ -30,7 +31,7 @@ public class WellOperationControllerTest : BaseIntegrationTest DepthEnd = 20.0, Day = 0.0, NptHours = 0.0, - DateStart = new DateTimeOffset(new DateTime(2023, 02, 03, 1, 0, 0, DateTimeKind.Unspecified)), + DateStart = new DateTimeOffset(new DateTime(2023, 1, 10), TimeSpan.FromHours(Defaults.Wells[0].Timezone.Hours)), DurationHours = 1.0, Comment = "1", IdUser = 1, @@ -58,7 +59,7 @@ public class WellOperationControllerTest : BaseIntegrationTest IdPlan = null, IdUser = 1, IdWellSectionType = 1, - LastUpdateDate = DateTimeOffset.Now, + LastUpdateDate = null, NptHours = 1, WellSectionTypeName = null, UserName = null @@ -218,8 +219,6 @@ public class WellOperationControllerTest : BaseIntegrationTest public async Task ImportPlanDefaultExcelFileAsync_returns_success() { //arrange - const int timeZoneUtc = 5; - //TODO: вынести в метод расширения. Сделать когда доберёмся до рефакторинга операций по скважине var resourceName = Assembly.GetExecutingAssembly() .GetManifestResourceNames() @@ -246,6 +245,6 @@ public class WellOperationControllerTest : BaseIntegrationTest //assert Assert.NotNull(response.Content); Assert.Equal(4, response.Content.Count()); - Assert.True(response.Content.All(w => Math.Abs(w.DateStart.Offset.Hours - timeZoneUtc) < 0.1)); + Assert.True(response.Content.All(w => Math.Abs(w.DateStart.Offset.Hours - Defaults.Wells[0].Timezone.Hours) < 0.1)); } } \ No newline at end of file diff --git a/AsbCloudWebApi.Tests/Services/WellOperationExport/WellOperationExportServiceTest.cs b/AsbCloudWebApi.Tests/Services/WellOperationExport/WellOperationExportServiceTest.cs index 2590df26..3d66aab9 100644 --- a/AsbCloudWebApi.Tests/Services/WellOperationExport/WellOperationExportServiceTest.cs +++ b/AsbCloudWebApi.Tests/Services/WellOperationExport/WellOperationExportServiceTest.cs @@ -117,7 +117,7 @@ namespace AsbCloudWebApi.Tests.Services.WellOperationExport wellOperationImportTemplateService = new WellOperationImportTemplateService(); wellOperationExportService = new WellOperationExportService(wellOperationRepository, wellService, wellOperationImportTemplateService); - wellOperationImportService = new WellOperationImportService(wellOperationRepository); + wellOperationImportService = new WellOperationImportService(wellService, wellOperationRepository); wellOperationDefaultExcelParser = new WellOperationDefaultExcelParser(); this.output = output; } diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index 27827a62..3ac7e42c 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -285,7 +285,6 @@ namespace AsbCloudWebApi.Controllers foreach (var wellOperation in wellOperations) { wellOperation.IdWell = idWell; - wellOperation.LastUpdateDate = DateTimeOffset.UtcNow; wellOperation.IdUser = User.GetUserId(); wellOperation.IdType = idType; } @@ -338,7 +337,6 @@ namespace AsbCloudWebApi.Controllers value.IdWell = idWell; value.Id = idOperation; - value.LastUpdateDate = DateTimeOffset.UtcNow; value.IdUser = User.GetUserId(); var validationResult = await operationRepository.ValidateWithDbAsync(new[] { value }, token);