From 4a878f5124cb49892ae3b4577c33d80b18eeda70 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 22 Apr 2024 09:17:42 +0500 Subject: [PATCH 01/29] Well operation refactor --- AsbCloudApp/Requests/WellOperationRequest.cs | 2 +- .../Repository/WellOperationRepository.cs | 617 ++++++++++-------- 2 files changed, 333 insertions(+), 286 deletions(-) diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs index 356ef52d..08b7fad8 100644 --- a/AsbCloudApp/Requests/WellOperationRequest.cs +++ b/AsbCloudApp/Requests/WellOperationRequest.cs @@ -80,5 +80,5 @@ public class WellOperationRequest : WellOperationRequestBase /// /// Идентификаторы скважин /// - public IEnumerable? IdsWell { get; } + public IEnumerable IdsWell { get; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 3b67eb54..bc3cee39 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data; +using AsbCloudApp.Data; using AsbCloudApp.Data.WellOperation; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; @@ -14,350 +9,402 @@ using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository; public class WellOperationRepository : CrudRepositoryBase, - IWellOperationRepository + IWellOperationRepository { - private readonly IMemoryCache memoryCache; - private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; - private readonly IWellService wellService; + private readonly IMemoryCache memoryCache; + private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; + private readonly IWellService wellService; - public WellOperationRepository(IAsbCloudDbContext context, - IMemoryCache memoryCache, - IWellOperationCategoryRepository wellOperationCategoryRepository, - IWellService wellService) - : base(context, dbSet => dbSet.Include(e => e.WellSectionType) - .Include(e => e.OperationCategory)) - { - this.memoryCache = memoryCache; - this.wellOperationCategoryRepository = wellOperationCategoryRepository; - this.wellService = wellService; - } + public WellOperationRepository(IAsbCloudDbContext context, + IMemoryCache memoryCache, + IWellOperationCategoryRepository wellOperationCategoryRepository, + IWellService wellService) + : base(context, dbSet => dbSet.Include(e => e.WellSectionType) + .Include(e => e.OperationCategory)) + { + this.memoryCache = memoryCache; + this.wellOperationCategoryRepository = wellOperationCategoryRepository; + this.wellService = wellService; + } - public IEnumerable GetSectionTypes() => - memoryCache - .GetOrCreateBasic(dbContext.WellSectionTypes) - .OrderBy(s => s.Order) - .Select(s => s.Adapt()); + public IEnumerable GetSectionTypes() => + memoryCache + .GetOrCreateBasic(dbContext.WellSectionTypes) + .OrderBy(s => s.Order) + .Select(s => s.Adapt()); - public async Task> GetAsync(WellOperationRequest request, CancellationToken token) - { - var query = BuildQuery(request); + public async Task> GetAsync(WellOperationRequest request, CancellationToken token) + { + var (items, _) = await GetPrivateAsync(request, token); + return items; + } - if (request.Skip.HasValue) - query = query.Skip(request.Skip.Value); + public async Task> GetPageAsync(WellOperationRequest request, CancellationToken token) + { + var skip = request.Skip ?? 0; + var take = request.Take ?? 32; - if (request.Take.HasValue) - query = query.Take(request.Take.Value); + var (items, count) = await GetPrivateAsync(request, token); - var entities = await query.AsNoTracking() - .ToArrayAsync(token); + var paginationContainer = new PaginationContainer + { + Skip = skip, + Take = take, + Count = count, + Items = items + }; - return await ConvertWithDrillingDaysAndNpvHoursAsync(entities, token); - } + return paginationContainer; + } - public async Task> GetPageAsync(WellOperationRequest request, CancellationToken token) - { - var skip = request.Skip ?? 0; - var take = request.Take ?? 32; + public async Task> GetGroupOperationsStatAsync(WellOperationRequest request, CancellationToken token) + { + var query = BuildQuery(request, token); + var entities = (await query) + .Select(o => new + { + o.IdCategory, + DurationMinutes = o.DurationHours * 60, + DurationDepth = o.DepthEnd - o.DepthStart + }) + .ToArray(); - var query = BuildQuery(request); + var parentRelationDictionary = wellOperationCategoryRepository.Get(true) + .ToDictionary(c => c.Id, c => new + { + c.Name, + c.IdParent + }); - var entities = await query.Skip(skip) - .Take(take) - .AsNoTracking() - .ToArrayAsync(token); + var dtos = entities + .GroupBy(o => o.IdCategory) + .Select(g => new WellGroupOpertionDto + { + IdCategory = g.Key, + Category = parentRelationDictionary[g.Key].Name, + Count = g.Count(), + MinutesAverage = g.Average(o => o.DurationMinutes), + MinutesMin = g.Min(o => o.DurationMinutes), + MinutesMax = g.Max(o => o.DurationMinutes), + TotalMinutes = g.Sum(o => o.DurationMinutes), + DeltaDepth = g.Sum(o => o.DurationDepth), + IdParent = parentRelationDictionary[g.Key].IdParent + }); - var paginationContainer = new PaginationContainer - { - Skip = skip, - Take = take, - Count = await query.CountAsync(token), - Items = await ConvertWithDrillingDaysAndNpvHoursAsync(entities, token) - }; + while (dtos.All(x => x.IdParent != null)) + { + dtos = dtos + .GroupBy(o => o.IdParent!) + .Select(g => + { + var idCategory = g.Key ?? int.MinValue; + var category = parentRelationDictionary.GetValueOrDefault(idCategory); + var newDto = new WellGroupOpertionDto + { + IdCategory = idCategory, + Category = category?.Name ?? "unknown", + Count = g.Sum(o => o.Count), + DeltaDepth = g.Sum(o => o.DeltaDepth), + TotalMinutes = g.Sum(o => o.TotalMinutes), + Items = g.ToList(), + IdParent = category?.IdParent, + }; + return newDto; + }); + } - return paginationContainer; - } + return dtos; + } - public async Task> GetGroupOperationsStatAsync(WellOperationRequest request, CancellationToken token) - { - var query = BuildQuery(request); - var entities = await query - .Select(o => new - { - o.IdCategory, - DurationMinutes = o.DurationHours * 60, - DurationDepth = o.DepthEnd - o.DepthStart - }) - .ToArrayAsync(token); + public async Task InsertRangeAsync(IEnumerable dtos, + bool deleteBeforeInsert, + CancellationToken token) + { + EnsureValidWellOperations(dtos); - var parentRelationDictionary = wellOperationCategoryRepository.Get(true) - .ToDictionary(c => c.Id, c => new - { - c.Name, - c.IdParent - }); + if (!deleteBeforeInsert) + return await InsertRangeAsync(dtos, token); - var dtos = entities - .GroupBy(o => o.IdCategory) - .Select(g => new WellGroupOpertionDto - { - IdCategory = g.Key, - Category = parentRelationDictionary[g.Key].Name, - Count = g.Count(), - MinutesAverage = g.Average(o => o.DurationMinutes), - MinutesMin = g.Min(o => o.DurationMinutes), - MinutesMax = g.Max(o => o.DurationMinutes), - TotalMinutes = g.Sum(o => o.DurationMinutes), - DeltaDepth = g.Sum(o => o.DurationDepth), - IdParent = parentRelationDictionary[g.Key].IdParent - }); + var idType = dtos.First().IdType; + var idWell = dtos.First().IdWell; - while (dtos.All(x => x.IdParent != null)) - { - dtos = dtos - .GroupBy(o => o.IdParent!) - .Select(g => - { - var idCategory = g.Key ?? int.MinValue; - var category = parentRelationDictionary.GetValueOrDefault(idCategory); - var newDto = new WellGroupOpertionDto - { - IdCategory = idCategory, - Category = category?.Name ?? "unknown", - Count = g.Sum(o => o.Count), - DeltaDepth = g.Sum(o => o.DeltaDepth), - TotalMinutes = g.Sum(o => o.TotalMinutes), - Items = g.ToList(), - IdParent = category?.IdParent, - }; - return newDto; - }); - } + var existingOperationIds = await dbContext.WellOperations + .Where(e => e.IdWell == idWell && e.IdType == idType) + .Select(e => e.Id) + .ToArrayAsync(token); - return dtos; - } + await DeleteRangeAsync(existingOperationIds, token); - public async Task InsertRangeAsync(IEnumerable dtos, - bool deleteBeforeInsert, - CancellationToken token) - { - EnsureValidWellOperations(dtos); + return await InsertRangeAsync(dtos, token); + } - if (!deleteBeforeInsert) - return await InsertRangeAsync(dtos, token); + public override Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) + { + EnsureValidWellOperations(dtos); - var idType = dtos.First().IdType; - var idWell = dtos.First().IdWell; + return base.UpdateRangeAsync(dtos, token); + } - var existingOperationIds = await dbContext.WellOperations - .Where(e => e.IdWell == idWell && e.IdType == idType) - .Select(e => e.Id) - .ToArrayAsync(token); + private static void EnsureValidWellOperations(IEnumerable dtos) + { + if (dtos.GroupBy(d => d.IdType).Count() > 1) + throw new ArgumentInvalidException(nameof(dtos), "Все операции должны быть одного типа"); - await DeleteRangeAsync(existingOperationIds, token); + if (dtos.GroupBy(d => d.IdType).Count() > 1) + throw new ArgumentInvalidException(nameof(dtos), "Все операции должны принадлежать одной скважине"); + } - return await InsertRangeAsync(dtos, token); - } + private async Task> GetByIdsWells(IEnumerable idsWells, CancellationToken token) + { + var query = GetQuery() + .Where(e => idsWells.Contains(e.IdWell)) + .OrderBy(e => e.DateStart); + var entities = await query.ToArrayAsync(token); + return entities; + } - public override Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) - { - EnsureValidWellOperations(dtos); + private async Task<(IEnumerable items, int count)> GetPrivateAsync(WellOperationRequest request, CancellationToken token) + { + var skip = request.Skip ?? 0; + var take = request.Take ?? 32; - return base.UpdateRangeAsync(dtos, token); - } + /* + каунт = сумма всех фильтеред1 + for{ + все записи по скважине и типу план/факт = wellOperationswithType + из wellOperationswithType выбираем первую операцию + из wellOperationswithType все НПВ + к wellOperationswithType применяем оставшиеся фильтры из buildquery = фильтеред1 + к фильтеред1 применить скип тэйк = фильтеред2 + фильтеред2 конвертировать в дто и рассчитать дэй и время нпв + ... + } + */ - private static void EnsureValidWellOperations(IEnumerable dtos) - { - if (dtos.GroupBy(d => d.IdType).Count() > 1) - throw new ArgumentInvalidException(nameof(dtos), "Все операции должны быть одного типа"); + var entities = await GetByIdsWells(request.IdsWell, token); + var entitiesByWellAndType = entities + .GroupBy(e => new { e.IdWell, e.IdType }) + .Select(grp => grp.ToArray()); - if (dtos.GroupBy(d => d.IdType).Count() > 1) - throw new ArgumentInvalidException(nameof(dtos), "Все операции должны принадлежать одной скважине"); - } + var result = new List(); + foreach (var wellOperationswithType in entitiesByWellAndType) + { + var firstWellOperation = wellOperationswithType + .OrderBy(e => e.DateStart) + .FirstOrDefault(); - private IQueryable BuildQuery(WellOperationRequest request) - { - var query = GetQuery() - .Where(e => request.IdsWell != null && request.IdsWell.Contains(e.IdWell)) - .OrderBy(e => e.DateStart) - .AsQueryable(); + //НПВ + var operationsWithNpt = wellOperationswithType + .Where(o => WellOperationCategory.NonProductiveTimeSubIds.Contains(o.IdCategory)); - if (request.OperationType.HasValue) - query = query.Where(e => e.IdType == request.OperationType.Value); + var filteredWellOperations = FilterOperations(wellOperationswithType, request); - if (request.SectionTypeIds?.Any() is true) - query = query.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); + var filteredWellOperationsPart = filteredWellOperations + .Skip(skip) + .Take(take); - if (request.OperationCategoryIds?.Any() is true) - query = query.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); + var dtos = filteredWellOperationsPart + .Select(o => ConvertWithDrillingDaysAndNpvHours(o, firstWellOperation, operationsWithNpt, token)); + result.AddRange(dtos); + } - if (request.GeDepth.HasValue) - query = query.Where(e => e.DepthEnd >= request.GeDepth.Value); + return (result, entities.Count()); + } - if (request.LeDepth.HasValue) - query = query.Where(e => e.DepthEnd <= request.LeDepth.Value); + private IEnumerable FilterOperations(IEnumerable entities, WellOperationRequest request) + { + if (request.OperationType.HasValue) + entities = entities.Where(e => e.IdType == request.OperationType.Value); + if (request.SectionTypeIds?.Any() is true) + entities = entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); + if (request.OperationCategoryIds?.Any() is true) + entities = entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); + if (request.GeDepth.HasValue) + entities = entities.Where(e => e.DepthEnd >= request.GeDepth.Value); + if (request.LeDepth.HasValue) + entities = entities.Where(e => e.DepthEnd <= request.LeDepth.Value); - if (request.GeDate.HasValue) - { - var geDateUtc = request.GeDate.Value.UtcDateTime; - query = query.Where(e => e.DateStart >= geDateUtc); - } + if (request.GeDate.HasValue) + { + var geDateUtc = request.GeDate.Value.UtcDateTime; + entities = entities.Where(e => e.DateStart >= geDateUtc); + } - if (request.LeDate.HasValue) - { - var leDateUtc = request.LeDate.Value.UtcDateTime; - query = query.Where(e => e.DateStart <= leDateUtc); - } + if (request.LeDate.HasValue) + { + var leDateUtc = request.LeDate.Value.UtcDateTime; + entities = entities.Where(e => e.DateStart <= leDateUtc); + } + if (request.SortFields?.Any() is true) + entities = entities.AsQueryable().SortBy(request.SortFields); - if (request.SortFields?.Any() is true) - query = query.SortBy(request.SortFields); + return entities; + } - return query; - } + private async Task> BuildQuery(WellOperationRequest request, CancellationToken token) + { + var entities = await GetByIdsWells(request.IdsWell, token); - public async Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token) - { - const string keyCacheSections = "OperationsBySectionSummarties"; + if (request.OperationType.HasValue) + entities = entities.Where(e => e.IdType == request.OperationType.Value); - var cache = await memoryCache.GetOrCreateAsync(keyCacheSections, async (entry) => - { - entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30); + if (request.SectionTypeIds?.Any() is true) + entities = entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); - var query = dbContext.Set() - .GroupBy(operation => new - { - operation.IdWell, - operation.IdType, - operation.IdWellSectionType, - operation.WellSectionType.Caption, - }) - .Select(group => new - { - group.Key.IdWell, - group.Key.IdType, - group.Key.IdWellSectionType, - group.Key.Caption, + if (request.OperationCategoryIds?.Any() is true) + entities = entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); - First = group - .OrderBy(operation => operation.DateStart) - .Select(operation => new - { - operation.DateStart, - operation.DepthStart, - }) - .First(), + if (request.GeDepth.HasValue) + entities = entities.Where(e => e.DepthEnd >= request.GeDepth.Value); - Last = group - .OrderByDescending(operation => operation.DateStart) - .Select(operation => new - { - operation.DateStart, - operation.DurationHours, - operation.DepthEnd, - }) - .First(), - }) - .Where(s => idsWells.Contains(s.IdWell)); - var dbData = await query.ToArrayAsync(token); - var sections = dbData.Select( - item => new SectionByOperationsDto - { - IdWell = item.IdWell, - IdType = item.IdType, - IdWellSectionType = item.IdWellSectionType, + if (request.LeDepth.HasValue) + entities = entities.Where(e => e.DepthEnd <= request.LeDepth.Value); - Caption = item.Caption, + if (request.GeDate.HasValue) + { + var geDateUtc = request.GeDate.Value.UtcDateTime; + entities = entities.Where(e => e.DateStart >= geDateUtc); + } - DateStart = item.First.DateStart, - DepthStart = item.First.DepthStart, + if (request.LeDate.HasValue) + { + var leDateUtc = request.LeDate.Value.UtcDateTime; + entities = entities.Where(e => e.DateStart <= leDateUtc); + } - DateEnd = item.Last.DateStart.AddHours(item.Last.DurationHours), - DepthEnd = item.Last.DepthEnd, - }) - .ToArray() - .AsEnumerable(); + if (request.SortFields?.Any() is true) + entities = entities.AsQueryable().SortBy(request.SortFields); - entry.Value = sections; - return sections; - }); + return entities; + } - return cache; - } + public async Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token) + { + const string keyCacheSections = "OperationsBySectionSummarties"; - public async Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken) - { - var query = dbContext.WellOperations.Where(o => o.IdWell == idWell && o.IdType == idType); + var cache = await memoryCache.GetOrCreateAsync(keyCacheSections, async (entry) => + { + entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30); - if (!await query.AnyAsync(cancellationToken)) - return null; + var query = dbContext.Set() + .GroupBy(operation => new + { + operation.IdWell, + operation.IdType, + operation.IdWellSectionType, + operation.WellSectionType.Caption, + }) + .Select(group => new + { + group.Key.IdWell, + group.Key.IdType, + group.Key.IdWellSectionType, + group.Key.Caption, - var timeZoneOffset = wellService.GetTimezone(idWell).Offset; - - var minDate = await query.MinAsync(o => o.DateStart, cancellationToken); - var maxDate = await query.MaxAsync(o => o.DateStart, cancellationToken); + First = group + .OrderBy(operation => operation.DateStart) + .Select(operation => new + { + operation.DateStart, + operation.DepthStart, + }) + .First(), - return new DatesRangeDto - { - From = minDate.ToOffset(timeZoneOffset), - To = maxDate.ToOffset(timeZoneOffset) - }; - } + Last = group + .OrderByDescending(operation => operation.DateStart) + .Select(operation => new + { + operation.DateStart, + operation.DurationHours, + operation.DepthEnd, + }) + .First(), + }) + .Where(s => idsWells.Contains(s.IdWell)); + var dbData = await query.ToArrayAsync(token); + var sections = dbData.Select( + item => new SectionByOperationsDto + { + IdWell = item.IdWell, + IdType = item.IdType, + IdWellSectionType = item.IdWellSectionType, - private async Task> ConvertWithDrillingDaysAndNpvHoursAsync(IEnumerable entities, - CancellationToken token) - { - var idsWell = entities.Select(e => e.IdWell).Distinct(); + Caption = item.Caption, - var currentWellOperations = GetQuery() - .Where(entity => idsWell.Contains(entity.IdWell)); + DateStart = item.First.DateStart, + DepthStart = item.First.DepthStart, - var dateFirstDrillingOperationByIdWell = await currentWellOperations - .Where(entity => entity.IdType == WellOperation.IdOperationTypeFact) - .GroupBy(entity => entity.IdWell) - .ToDictionaryAsync(g => g.Key, g => g.Min(o => o.DateStart), token); + DateEnd = item.Last.DateStart.AddHours(item.Last.DurationHours), + DepthEnd = item.Last.DepthEnd, + }) + .ToArray() + .AsEnumerable(); - var operationsWithNptByIdWell = await currentWellOperations.Where(entity => - entity.IdType == WellOperation.IdOperationTypeFact && - WellOperationCategory.NonProductiveTimeSubIds.Contains(entity.IdCategory)) - .GroupBy(entity => entity.IdWell) - .ToDictionaryAsync(g => g.Key, g => g.Select(o => o), token); + entry.Value = sections; + return sections; + }); - var dtos = entities.Select(entity => - { - var dto = Convert(entity); + return cache; + } - if (dateFirstDrillingOperationByIdWell.TryGetValue(entity.IdWell, out var dateFirstDrillingOperation)) - dto.Day = (entity.DateStart - dateFirstDrillingOperation).TotalDays; + public async Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken) + { + var query = dbContext.WellOperations.Where(o => o.IdWell == idWell && o.IdType == idType); - if (operationsWithNptByIdWell.TryGetValue(entity.IdWell, out var wellOperationsWithNtp)) - dto.NptHours = wellOperationsWithNtp - .Where(o => o.DateStart <= entity.DateStart) - .Sum(e => e.DurationHours); + if (!await query.AnyAsync(cancellationToken)) + return null; - return dto; - }); + var timeZoneOffset = wellService.GetTimezone(idWell).Offset; - return dtos; - } + var minDate = await query.MinAsync(o => o.DateStart, cancellationToken); + var maxDate = await query.MaxAsync(o => o.DateStart, cancellationToken); - protected override WellOperation Convert(WellOperationDto src) - { - var entity = src.Adapt(); - entity.DateStart = src.DateStart.UtcDateTime; - return entity; - } + return new DatesRangeDto + { + From = minDate.ToOffset(timeZoneOffset), + To = maxDate.ToOffset(timeZoneOffset) + }; + } - protected override WellOperationDto Convert(WellOperation src) - { - //TODO: пока такое получение TimeZone скважины, нужно исправить на Lazy - //Хоть мы и тянем данные из кэша, но от получения TimeZone в этом методе нужно избавиться, пока так - var timeZoneOffset = wellService.GetTimezone(src.IdWell).Offset; - var dto = src.Adapt(); - dto.DateStart = src.DateStart.ToOffset(timeZoneOffset); - dto.LastUpdateDate = src.LastUpdateDate.ToOffset(timeZoneOffset); - return dto; - } + private WellOperationDto ConvertWithDrillingDaysAndNpvHours( + WellOperation entity, + WellOperation firstOperation, + IEnumerable wellOperationsWithNtp, + CancellationToken token) + { + var dto = Convert(entity); + dto.Day = (entity.DateStart - firstOperation.DateStart).TotalDays; + dto.NptHours = wellOperationsWithNtp + .Where(o => o.DateStart <= entity.DateStart) + .Sum(e => e.DurationHours); + + return dto; + } + + protected override WellOperation Convert(WellOperationDto src) + { + var entity = src.Adapt(); + entity.DateStart = src.DateStart.UtcDateTime; + return entity; + } + + protected override WellOperationDto Convert(WellOperation src) + { + //TODO: пока такое получение TimeZone скважины, нужно исправить на Lazy + //Хоть мы и тянем данные из кэша, но от получения TimeZone в этом методе нужно избавиться, пока так + var timeZoneOffset = wellService.GetTimezone(src.IdWell).Offset; + var dto = src.Adapt(); + dto.DateStart = src.DateStart.ToOffset(timeZoneOffset); + dto.LastUpdateDate = src.LastUpdateDate.ToOffset(timeZoneOffset); + return dto; + } } \ No newline at end of file From 0ba1b5c5fc7b519b39f609c4253a2473084aa938 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 22 Apr 2024 11:16:23 +0500 Subject: [PATCH 02/29] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20wellOperationRepository=20(?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B4=D0=BE=D0=BB=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/WellOperationRequest.cs | 115 +++++++++--------- .../Repository/WellOperationRepository.cs | 81 ++++-------- 2 files changed, 81 insertions(+), 115 deletions(-) diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs index 08b7fad8..2dc6405b 100644 --- a/AsbCloudApp/Requests/WellOperationRequest.cs +++ b/AsbCloudApp/Requests/WellOperationRequest.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; namespace AsbCloudApp.Requests; @@ -8,44 +9,44 @@ namespace AsbCloudApp.Requests; /// public class WellOperationRequestBase : RequestBase { - /// - /// Больше или равно дате начала операции - /// - public DateTimeOffset? GeDate { get; set; } + /// + /// Больше или равно дате начала операции + /// + public DateTimeOffset? GeDate { get; set; } - /// - /// Меньше или равно дате окончания операции - /// - public DateTimeOffset? LeDate { get; set; } + /// + /// Меньше или равно дате окончания операции + /// + public DateTimeOffset? LeDate { get; set; } - /// - /// Больше или равно глубины скважины на начало операции. - /// - public double? GeDepth { get; set; } + /// + /// Больше или равно глубины скважины на начало операции. + /// + public double? GeDepth { get; set; } - /// - /// Меньше или равно глубины скважины на конец операции. - /// - public double? LeDepth { get; set; } + /// + /// Меньше или равно глубины скважины на конец операции. + /// + public double? LeDepth { get; set; } - /// - /// Идентификаторы категорий операции - /// - public IEnumerable? OperationCategoryIds { get; set; } + /// + /// Идентификаторы категорий операции + /// + public IEnumerable? OperationCategoryIds { get; set; } - /// - /// Тип операций - /// - /// 0 - плановая операция - /// 1 - фактическая операция - /// - /// - public int? OperationType { get; set; } + /// + /// Тип операций + /// + /// 0 - плановая операция + /// 1 - фактическая операция + /// + /// + public int? OperationType { get; set; } - /// - /// Идентификаторы конструкций секции - /// - public IEnumerable? SectionTypeIds { get; set; } + /// + /// Идентификаторы конструкций секции + /// + public IEnumerable? SectionTypeIds { get; set; } } /// @@ -53,32 +54,34 @@ public class WellOperationRequestBase : RequestBase /// public class WellOperationRequest : WellOperationRequestBase { - /// - public WellOperationRequest(IEnumerable idsWell) - { - IdsWell = idsWell; - } + /// + public WellOperationRequest(IEnumerable idsWell) + { + IdsWell = idsWell; + } - /// - public WellOperationRequest(WellOperationRequestBase request, IEnumerable idsWell) - : this(idsWell) - { - GeDepth = request.GeDepth; - LeDepth = request.LeDepth; - GeDate = request.GeDate; - LeDate = request.LeDate; + /// + public WellOperationRequest(WellOperationRequestBase request, IEnumerable idsWell) + : this(idsWell) + { + GeDepth = request.GeDepth; + LeDepth = request.LeDepth; + GeDate = request.GeDate; + LeDate = request.LeDate; - OperationCategoryIds = request.OperationCategoryIds; - OperationType = request.OperationType; - SectionTypeIds = request.SectionTypeIds; + OperationCategoryIds = request.OperationCategoryIds; + OperationType = request.OperationType; + SectionTypeIds = request.SectionTypeIds; - Skip = request.Skip; - Take = request.Take; - SortFields = request.SortFields; - } + Skip = request.Skip; + Take = request.Take; + SortFields = request.SortFields; + } - /// - /// Идентификаторы скважин - /// - public IEnumerable IdsWell { get; } + /// + /// Идентификаторы скважин + /// + [Required] + [Length(1, 1)] + public IEnumerable IdsWell { get; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index bc3cee39..959ad0d9 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -28,8 +28,7 @@ public class WellOperationRepository : CrudRepositoryBase dbSet.Include(e => e.WellSectionType) - .Include(e => e.OperationCategory)) + : base(context, dbSet => dbSet) { this.memoryCache = memoryCache; this.wellOperationCategoryRepository = wellOperationCategoryRepository; @@ -44,7 +43,7 @@ public class WellOperationRepository : CrudRepositoryBase> GetAsync(WellOperationRequest request, CancellationToken token) { - var (items, _) = await GetPrivateAsync(request, token); + var (items, _) = await GetAsyncWithDaysAndNpv(request, token); return items; } @@ -53,7 +52,7 @@ public class WellOperationRepository : CrudRepositoryBase { @@ -166,61 +165,52 @@ public class WellOperationRepository : CrudRepositoryBase> GetByIdsWells(IEnumerable idsWells, CancellationToken token) { var query = GetQuery() + .Include(e => e.WellSectionType) + .Include(e => e.OperationCategory) .Where(e => idsWells.Contains(e.IdWell)) .OrderBy(e => e.DateStart); var entities = await query.ToArrayAsync(token); return entities; } - private async Task<(IEnumerable items, int count)> GetPrivateAsync(WellOperationRequest request, CancellationToken token) + private async Task<(IEnumerable items, int count)> GetAsyncWithDaysAndNpv(WellOperationRequest request, CancellationToken token) { var skip = request.Skip ?? 0; var take = request.Take ?? 32; - /* - каунт = сумма всех фильтеред1 - for{ - все записи по скважине и типу план/факт = wellOperationswithType - из wellOperationswithType выбираем первую операцию - из wellOperationswithType все НПВ - к wellOperationswithType применяем оставшиеся фильтры из buildquery = фильтеред1 - к фильтеред1 применить скип тэйк = фильтеред2 - фильтеред2 конвертировать в дто и рассчитать дэй и время нпв - ... - } - */ - var entities = await GetByIdsWells(request.IdsWell, token); var entitiesByWellAndType = entities .GroupBy(e => new { e.IdWell, e.IdType }) .Select(grp => grp.ToArray()); var result = new List(); - foreach (var wellOperationswithType in entitiesByWellAndType) + var count = 0; + foreach (var wellOperationsWithType in entitiesByWellAndType) { - var firstWellOperation = wellOperationswithType + var firstWellOperation = wellOperationsWithType .OrderBy(e => e.DateStart) - .FirstOrDefault(); + .FirstOrDefault()!; - //НПВ - var operationsWithNpt = wellOperationswithType + var operationsWithNpt = wellOperationsWithType .Where(o => WellOperationCategory.NonProductiveTimeSubIds.Contains(o.IdCategory)); - var filteredWellOperations = FilterOperations(wellOperationswithType, request); + var filteredWellOperations = GetByRequest(wellOperationsWithType, request); var filteredWellOperationsPart = filteredWellOperations .Skip(skip) .Take(take); var dtos = filteredWellOperationsPart - .Select(o => ConvertWithDrillingDaysAndNpvHours(o, firstWellOperation, operationsWithNpt, token)); + .Select(o => ConvertWithDrillingDaysAndNpvHours(o, firstWellOperation, operationsWithNpt)); + result.AddRange(dtos); + count += filteredWellOperations.Count(); } - return (result, entities.Count()); + return (result, count); } - private IEnumerable FilterOperations(IEnumerable entities, WellOperationRequest request) + private IEnumerable GetByRequest(IEnumerable entities, WellOperationRequest request) { if (request.OperationType.HasValue) entities = entities.Where(e => e.IdType == request.OperationType.Value); @@ -253,36 +243,7 @@ public class WellOperationRepository : CrudRepositoryBase> BuildQuery(WellOperationRequest request, CancellationToken token) { var entities = await GetByIdsWells(request.IdsWell, token); - - if (request.OperationType.HasValue) - entities = entities.Where(e => e.IdType == request.OperationType.Value); - - if (request.SectionTypeIds?.Any() is true) - entities = entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); - - if (request.OperationCategoryIds?.Any() is true) - entities = entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); - - if (request.GeDepth.HasValue) - entities = entities.Where(e => e.DepthEnd >= request.GeDepth.Value); - - if (request.LeDepth.HasValue) - entities = entities.Where(e => e.DepthEnd <= request.LeDepth.Value); - - if (request.GeDate.HasValue) - { - var geDateUtc = request.GeDate.Value.UtcDateTime; - entities = entities.Where(e => e.DateStart >= geDateUtc); - } - - if (request.LeDate.HasValue) - { - var leDateUtc = request.LeDate.Value.UtcDateTime; - entities = entities.Where(e => e.DateStart <= leDateUtc); - } - - if (request.SortFields?.Any() is true) - entities = entities.AsQueryable().SortBy(request.SortFields); + entities = GetByRequest(entities, request); return entities; } @@ -378,8 +339,7 @@ public class WellOperationRepository : CrudRepositoryBase wellOperationsWithNtp, - CancellationToken token) + IEnumerable wellOperationsWithNtp) { var dto = Convert(entity); dto.Day = (entity.DateStart - firstOperation.DateStart).TotalDays; @@ -401,6 +361,9 @@ public class WellOperationRepository : CrudRepositoryBase e.WellSectionType) + // .Include(e => e.OperationCategory) var timeZoneOffset = wellService.GetTimezone(src.IdWell).Offset; var dto = src.Adapt(); dto.DateStart = src.DateStart.ToOffset(timeZoneOffset); From 9926d3fcf21383528fd018cbaae211eb9d8bf521 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 22 Apr 2024 15:31:04 +0500 Subject: [PATCH 03/29] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B5=D0=BA=D1=86=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D0=B9?= =?UTF-8?q?=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20Lazy=20+=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D1=80=D1=83=D1=8E=D1=89=D0=B8=D0=B9=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80=20=D0=B2?= =?UTF-8?q?=D0=BD=D1=83=D1=82=D1=80=D0=B8=20WellOperationRequestBase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/WellOperationRequest.cs | 43 ++++++++++----- .../Repository/WellOperationRepository.cs | 53 +++++++++---------- 2 files changed, 55 insertions(+), 41 deletions(-) diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs index 2dc6405b..71f5e7d0 100644 --- a/AsbCloudApp/Requests/WellOperationRequest.cs +++ b/AsbCloudApp/Requests/WellOperationRequest.cs @@ -47,6 +47,34 @@ public class WellOperationRequestBase : RequestBase /// Идентификаторы конструкций секции /// public IEnumerable? SectionTypeIds { get; set; } + + /// + /// + /// + public WellOperationRequestBase() + { + + } + + /// + /// + /// + /// + public WellOperationRequestBase(WellOperationRequestBase request) + { + GeDepth = request.GeDepth; + LeDepth = request.LeDepth; + GeDate = request.GeDate; + LeDate = request.LeDate; + + OperationCategoryIds = request.OperationCategoryIds; + OperationType = request.OperationType; + SectionTypeIds = request.SectionTypeIds; + + Skip = request.Skip; + Take = request.Take; + SortFields = request.SortFields; + } } /// @@ -62,20 +90,9 @@ public class WellOperationRequest : WellOperationRequestBase /// public WellOperationRequest(WellOperationRequestBase request, IEnumerable idsWell) - : this(idsWell) + : base(request) { - GeDepth = request.GeDepth; - LeDepth = request.LeDepth; - GeDate = request.GeDate; - LeDate = request.LeDate; - - OperationCategoryIds = request.OperationCategoryIds; - OperationType = request.OperationType; - SectionTypeIds = request.SectionTypeIds; - - Skip = request.Skip; - Take = request.Take; - SortFields = request.SortFields; + IdsWell = idsWell; } /// diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 959ad0d9..ba457362 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -23,6 +23,8 @@ public class WellOperationRepository : CrudRepositoryBase> LazyWellCategories { get; } + private Lazy> LazyWellSectionTypes { get; } public WellOperationRepository(IAsbCloudDbContext context, IMemoryCache memoryCache, @@ -33,6 +35,9 @@ public class WellOperationRepository : CrudRepositoryBase wellOperationCategoryRepository.Get(true, false).ToDictionary(c => c.Id)); + LazyWellSectionTypes = new(() => GetSectionTypes().ToDictionary(c => c.Id)); } public IEnumerable GetSectionTypes() => @@ -43,7 +48,7 @@ public class WellOperationRepository : CrudRepositoryBase> GetAsync(WellOperationRequest request, CancellationToken token) { - var (items, _) = await GetAsyncWithDaysAndNpv(request, token); + var (items, _) = await GetWithDaysAndNpvAsync(request, token); return items; } @@ -52,7 +57,7 @@ public class WellOperationRepository : CrudRepositoryBase { @@ -165,27 +170,24 @@ public class WellOperationRepository : CrudRepositoryBase> GetByIdsWells(IEnumerable idsWells, CancellationToken token) { var query = GetQuery() - .Include(e => e.WellSectionType) - .Include(e => e.OperationCategory) .Where(e => idsWells.Contains(e.IdWell)) .OrderBy(e => e.DateStart); var entities = await query.ToArrayAsync(token); return entities; } - private async Task<(IEnumerable items, int count)> GetAsyncWithDaysAndNpv(WellOperationRequest request, CancellationToken token) + private async Task<(IEnumerable items, int count)> GetWithDaysAndNpvAsync(WellOperationRequest request, CancellationToken token) { var skip = request.Skip ?? 0; var take = request.Take ?? 32; var entities = await GetByIdsWells(request.IdsWell, token); - var entitiesByWellAndType = entities - .GroupBy(e => new { e.IdWell, e.IdType }) - .Select(grp => grp.ToArray()); + var groupedByWellAndType = entities + .GroupBy(e => new { e.IdWell, e.IdType }); var result = new List(); var count = 0; - foreach (var wellOperationsWithType in entitiesByWellAndType) + foreach (var wellOperationsWithType in groupedByWellAndType) { var firstWellOperation = wellOperationsWithType .OrderBy(e => e.DateStart) @@ -201,8 +203,16 @@ public class WellOperationRepository : CrudRepositoryBase ConvertWithDrillingDaysAndNpvHours(o, firstWellOperation, operationsWithNpt)); - + .Select(entity => + { + var dto = Convert(entity); + dto.Day = (entity.DateStart - firstWellOperation.DateStart).TotalDays; + dto.NptHours = operationsWithNpt + .Where(o => o.DateStart <= entity.DateStart) + .Sum(e => e.DurationHours); + return dto; + }); + result.AddRange(dtos); count += filteredWellOperations.Count(); } @@ -336,20 +346,6 @@ public class WellOperationRepository : CrudRepositoryBase wellOperationsWithNtp) - { - var dto = Convert(entity); - dto.Day = (entity.DateStart - firstOperation.DateStart).TotalDays; - dto.NptHours = wellOperationsWithNtp - .Where(o => o.DateStart <= entity.DateStart) - .Sum(e => e.DurationHours); - - return dto; - } - protected override WellOperation Convert(WellOperationDto src) { var entity = src.Adapt(); @@ -361,13 +357,14 @@ public class WellOperationRepository : CrudRepositoryBase e.WellSectionType) - // .Include(e => e.OperationCategory) var timeZoneOffset = wellService.GetTimezone(src.IdWell).Offset; + var dto = src.Adapt(); dto.DateStart = src.DateStart.ToOffset(timeZoneOffset); dto.LastUpdateDate = src.LastUpdateDate.ToOffset(timeZoneOffset); + + dto.OperationCategoryName = LazyWellCategories.Value.TryGetValue(src.IdCategory, out WellOperationCategoryDto? category) ? category.Name : string.Empty; + dto.WellSectionTypeCaption = LazyWellSectionTypes.Value.TryGetValue(src.IdWellSectionType, out WellSectionTypeDto? sectionType) ? sectionType.Caption : string.Empty; return dto; } } \ No newline at end of file From 1c3f779f7445a320bd232bf939f680b37a4e2633 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 24 Apr 2024 12:28:37 +0500 Subject: [PATCH 04/29] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BC=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Requests/WellOperationRequest.cs | 2 +- .../Repository/WellOperationRepository.cs | 32 +++++++++++-------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs index 71f5e7d0..fa866378 100644 --- a/AsbCloudApp/Requests/WellOperationRequest.cs +++ b/AsbCloudApp/Requests/WellOperationRequest.cs @@ -99,6 +99,6 @@ public class WellOperationRequest : WellOperationRequestBase /// Идентификаторы скважин /// [Required] - [Length(1, 1)] + [Length(1, 100)] public IEnumerable IdsWell { get; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index ba457362..bdbd1f0c 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -196,7 +196,7 @@ public class WellOperationRepository : CrudRepositoryBase WellOperationCategory.NonProductiveTimeSubIds.Contains(o.IdCategory)); - var filteredWellOperations = GetByRequest(wellOperationsWithType, request); + IEnumerable filteredWellOperations = FilterByRequest(wellOperationsWithType.AsQueryable(), request); var filteredWellOperationsPart = filteredWellOperations .Skip(skip) @@ -220,42 +220,46 @@ public class WellOperationRepository : CrudRepositoryBase GetByRequest(IEnumerable entities, WellOperationRequest request) + private T FilterByRequest(T entities, WellOperationRequest request) + where T : IQueryable, IEnumerable { if (request.OperationType.HasValue) - entities = entities.Where(e => e.IdType == request.OperationType.Value); + entities = (T)entities.Where(e => e.IdType == request.OperationType.Value); if (request.SectionTypeIds?.Any() is true) - entities = entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); + entities = (T)entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); if (request.OperationCategoryIds?.Any() is true) - entities = entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); + entities = (T)entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); if (request.GeDepth.HasValue) - entities = entities.Where(e => e.DepthEnd >= request.GeDepth.Value); + entities = (T)entities.Where(e => e.DepthEnd >= request.GeDepth.Value); if (request.LeDepth.HasValue) - entities = entities.Where(e => e.DepthEnd <= request.LeDepth.Value); + entities = (T)entities.Where(e => e.DepthEnd <= request.LeDepth.Value); if (request.GeDate.HasValue) { var geDateUtc = request.GeDate.Value.UtcDateTime; - entities = entities.Where(e => e.DateStart >= geDateUtc); + entities = (T)entities.Where(e => e.DateStart >= geDateUtc); } if (request.LeDate.HasValue) { var leDateUtc = request.LeDate.Value.UtcDateTime; - entities = entities.Where(e => e.DateStart <= leDateUtc); + entities = (T)entities.Where(e => e.DateStart <= leDateUtc); } if (request.SortFields?.Any() is true) - entities = entities.AsQueryable().SortBy(request.SortFields); + entities = (T)entities.AsQueryable().SortBy(request.SortFields); return entities; } - private async Task> BuildQuery(WellOperationRequest request, CancellationToken token) + private async Task> BuildQuery(WellOperationRequest request, CancellationToken token) { - var entities = await GetByIdsWells(request.IdsWell, token); - entities = GetByRequest(entities, request); + var query = GetQuery() + .Where(e => request.IdsWell.Contains(e.IdWell)) + .OrderBy(e => e.DateStart) + .AsQueryable(); + query = FilterByRequest(query, request); - return entities; + return query; } public async Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token) From 811a24a085a335036b27ee2116e1e86f11cb1994 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 24 Apr 2024 14:41:46 +0500 Subject: [PATCH 05/29] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20Days=20=D0=B8=20Npv=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20wellOperations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WellOperationControllerTest.cs | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs index 1a700189..006379d2 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs @@ -188,7 +188,61 @@ public class WellOperationControllerTest : BaseIntegrationTest Assert.True(response.ContentHeaders?.ContentLength > 0); } - private static WellOperation CreateWellOperation(int idWell, int idType = WellOperation.IdOperationTypePlan) => + [Theory] + [InlineData(WellOperation.IdOperationTypePlan)] + [InlineData(WellOperation.IdOperationTypeFact)] + public async Task GetPageOperationsAsyncWithDaysAndNpv_returns_success(int idType) + { + //arrange + const int pageSize = 10; + const int pageIndex = 0; + + var well = await dbContext.Wells.FirstAsync(); + var entity1 = CreateWellOperation(well.Id); + + var entity2 = entity1.Adapt(); + entity2.DateStart = entity2.DateStart.AddDays(1); + entity2.IdCategory = WellOperationCategory.IdNonProductiveTime; + entity2.DurationHours = 2; + + var entity3 = entity2.Adapt(); + entity3.DateStart = entity3.DateStart.AddDays(1); + entity3.IdCategory = WellOperationCategory.IdNonProductiveTime; + entity3.DurationHours = 3; + + dbContext.WellOperations.Add(entity1); + dbContext.WellOperations.Add(entity2); + dbContext.WellOperations.Add(entity3); + + await dbContext.SaveChangesAsync(); + + + var request = new WellOperationRequestBase + { + OperationType = WellOperation.IdOperationTypePlan, + Skip = pageIndex, + Take = pageSize, + }; + + //act + var response = await client.GetPageOperationsAsync(well.Id, request); + + //assert + Assert.Equal(response.StatusCode, HttpStatusCode.OK); + Assert.NotNull(response.Content); + + var items = response.Content.Items.ToArray(); + + Assert.Equal(0, items[0].Day); + Assert.Equal(1, items[1].Day); + Assert.Equal(2, items[2].Day); + + Assert.Equal(0, items[0].NptHours); + Assert.Equal(2, items[1].NptHours); + Assert.Equal(5, items[2].NptHours); + } + + private static WellOperation CreateWellOperation(int idWell, int idType = WellOperation.IdOperationTypePlan) => new() { IdWell = idWell, From 7dbe43a72ac9b0f57a87e8558c82ce1c2f8375d7 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 24 Apr 2024 15:21:16 +0500 Subject: [PATCH 06/29] nit --- .../Repositories/IWellOperationRepository.cs | 2 +- .../Repository/WellOperationRepository.cs | 31 ++++++++++--------- .../WellOperationControllerTest.cs | 10 +++--- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/AsbCloudApp/Repositories/IWellOperationRepository.cs b/AsbCloudApp/Repositories/IWellOperationRepository.cs index 0409969e..d37a1e90 100644 --- a/AsbCloudApp/Repositories/IWellOperationRepository.cs +++ b/AsbCloudApp/Repositories/IWellOperationRepository.cs @@ -54,7 +54,7 @@ namespace AsbCloudApp.Repositories /// /// Обновить существующую операцию /// - /// + /// /// /// Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token); diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index bdbd1f0c..9bcc718b 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -72,15 +72,15 @@ public class WellOperationRepository : CrudRepositoryBase> GetGroupOperationsStatAsync(WellOperationRequest request, CancellationToken token) { - var query = BuildQuery(request, token); - var entities = (await query) + var query = BuildQuery(request); + var entities = await query .Select(o => new { o.IdCategory, DurationMinutes = o.DurationHours * 60, DurationDepth = o.DepthEnd - o.DepthStart }) - .ToArray(); + .ToArrayAsync(token); var parentRelationDictionary = wellOperationCategoryRepository.Get(true) .ToDictionary(c => c.Id, c => new @@ -220,38 +220,39 @@ public class WellOperationRepository : CrudRepositoryBase(T entities, WellOperationRequest request) - where T : IQueryable, IEnumerable + private static IQueryable FilterByRequest(IQueryable entities, WellOperationRequest request) { if (request.OperationType.HasValue) - entities = (T)entities.Where(e => e.IdType == request.OperationType.Value); + entities = entities.Where(e => e.IdType == request.OperationType.Value); if (request.SectionTypeIds?.Any() is true) - entities = (T)entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); + entities = entities.Where(e => request.SectionTypeIds.Contains(e.IdWellSectionType)); if (request.OperationCategoryIds?.Any() is true) - entities = (T)entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); + entities = entities.Where(e => request.OperationCategoryIds.Contains(e.IdCategory)); if (request.GeDepth.HasValue) - entities = (T)entities.Where(e => e.DepthEnd >= request.GeDepth.Value); + entities = entities.Where(e => e.DepthEnd >= request.GeDepth.Value); if (request.LeDepth.HasValue) - entities = (T)entities.Where(e => e.DepthEnd <= request.LeDepth.Value); + entities = entities.Where(e => e.DepthEnd <= request.LeDepth.Value); if (request.GeDate.HasValue) { var geDateUtc = request.GeDate.Value.UtcDateTime; - entities = (T)entities.Where(e => e.DateStart >= geDateUtc); + entities = entities.Where(e => e.DateStart >= geDateUtc); } if (request.LeDate.HasValue) { var leDateUtc = request.LeDate.Value.UtcDateTime; - entities = (T)entities.Where(e => e.DateStart <= leDateUtc); + entities = entities.Where(e => e.DateStart <= leDateUtc); } if (request.SortFields?.Any() is true) - entities = (T)entities.AsQueryable().SortBy(request.SortFields); + entities = entities.AsQueryable().SortBy(request.SortFields); + else + entities = entities.AsQueryable().OrderBy(e => e.DateStart); return entities; } - private async Task> BuildQuery(WellOperationRequest request, CancellationToken token) + private IQueryable BuildQuery(WellOperationRequest request) { var query = GetQuery() .Where(e => request.IdsWell.Contains(e.IdWell)) @@ -328,7 +329,7 @@ public class WellOperationRepository : CrudRepositoryBase GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken) diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs index 006379d2..13ed2fbc 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/WellOperationControllerTest.cs @@ -202,12 +202,12 @@ public class WellOperationControllerTest : BaseIntegrationTest var entity2 = entity1.Adapt(); entity2.DateStart = entity2.DateStart.AddDays(1); - entity2.IdCategory = WellOperationCategory.IdNonProductiveTime; + entity2.IdCategory = WellOperationCategory.IdEquipmentDrillingRepair; entity2.DurationHours = 2; var entity3 = entity2.Adapt(); entity3.DateStart = entity3.DateStart.AddDays(1); - entity3.IdCategory = WellOperationCategory.IdNonProductiveTime; + entity3.IdCategory = WellOperationCategory.IdEquipmentDrillingRepair; entity3.DurationHours = 3; dbContext.WellOperations.Add(entity1); @@ -216,19 +216,19 @@ public class WellOperationControllerTest : BaseIntegrationTest await dbContext.SaveChangesAsync(); - var request = new WellOperationRequestBase { OperationType = WellOperation.IdOperationTypePlan, Skip = pageIndex, Take = pageSize, - }; + SortFields = [nameof(WellOperation.DateStart)] + }; //act var response = await client.GetPageOperationsAsync(well.Id, request); //assert - Assert.Equal(response.StatusCode, HttpStatusCode.OK); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.NotNull(response.Content); var items = response.Content.Items.ToArray(); From 873ed10688cdcf469774b25471d05e01a14534e2 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 24 Apr 2024 16:14:53 +0500 Subject: [PATCH 07/29] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=20=D1=84=D0=B0=D0=B9=D0=BB=20=D1=81=20=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D1=8F=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DefaultData/WellOperationCategories.xlsx | Bin 14470 -> 14765 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/AsbCloudDb/Model/DefaultData/WellOperationCategories.xlsx b/AsbCloudDb/Model/DefaultData/WellOperationCategories.xlsx index 1f41a051cada21c34d6ec366d6cd0bfb75163271..7d257567c6d02fce77cb666caf7d4335de68a58a 100644 GIT binary patch delta 13091 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 delta 12830 zcmZv@1y~%- zcYp8xx1OhGYU*>or>c6oySl4SRl0q0!BSUxfrtl(f`S4!tL>#*gGB?6_&1Zt2hRr7 zXBXIzz_i{tEGqt*PPuwrdF0aWUT1d%NyH09^j{;zet1Wxr9sQsx%TjSW3({lE&i(p zFH5VRS#>-cW3%Ri*{>N#3s63HZofu;M{7o}`r>TgTHWEb94WKuaA9CzRtUYpGIDl} zmQ`+&6;=+RFjXm+{*s4BQcwIoUwTj%ko~Ug4WD({dtECu>x%bqJe!WA=NZTG+>(|k z4wn){+zNV#OWecZR3jMg;ERzK4w5V~+(l3~oJDar$5}tBhRe6A`Mmpe{N+k%E0k9l zS_dzSOq&aOfu^!`BXfg99TLg7(;HC=4@}vyO6gD)bjvG;j7_?X7*{x5D@{=!0}6dB ziYAN_(Mg-4RI*#=_VUx!yGA16TQcMm>Ks{#xb&t%SSTsG4`aUesSK?AOa#^XPJ9F% zV#dX#sPfR&iq`|^jb2E*fI%XCDyOYYQX8&!04lkJBDuG*gzSfg2#g$3u2HF2SFOzTPm6JO7A^R@ zRehHi8y7v2@h5$1Bd1XD^7#6XR0lfU!JZhXxY(&N)wV(k?Dp`fnDMoOpA6i_cH9&; z_-u*7^e#|fAhwT1_n$2_B|5^-S=USob#1=0wBiH#8!PMM;F@?!e(BIo|E&g>zY^&pAKO+mIhRZBtMd`6Wh+X*sHfc!{xV9G>9-q`l`rnHM*nSw`p| zu`IBU@uSnqQ~$(wbkQ4sA#3%-&ke~k*!bq~ms_D4b~x6Voa@fJWV+p-@kcjN2@g;1 zXXaE&CWwBdO@rYyKA6(C3pbf2M3rFR#u3$oHUT9-@Jp%&o?jK?x;?5GcFs4ryLUWt z^DkZt^`g^Za3XrjXN&4iXw9gLuHBq@?^d-%5Qa@+R6bbKUUMh(b{H-pW=JnhX=E9E%K1R;kH8)= znY+!iNzJ<6=T56eZ~GA8hVY7;2fb+wPee-)IcEcst{0V^3KwqvJN?~J|E+$CB1Ca~ zXWpb9U%Ct#&vjVqwV`C0+i*Aw;7Ro5cB?vuAY){_TtI<19%@t@7>TI^@5=$D zb9GixIhw+8*=P7tMX%s8?)5WO^%9$i+>C%;S7a^b(GX4CclNEo^iu2{`*z@9hRyU3dz4SC^FBVNWy#Cs`hH$vzO6ipq0OL zz%XXs%2f=AFTcTPITqRf4Ha!oN-XU6_7-3LwQze1zYsV{_x3DNMiJ{RcGCfBo+QkI z4!7;Iielalr0%zv9+zK;2BMWl+eA#?#v6IeLb{$YLYxc;6X6gN5Pcj)V{!}6-FCwuNRYej>+I8ZP=KK42r2%@#OQkJ8 zLlebOpM87i``|i7Ee()4vqN_H3t78vlrDR*#t)oqX#~pXMK9|x(;zDaEEbJZjJ(UT zxf2@s zbID`yPFlEgBqB2(D)W|^v`6=oNVX0Jzya4y&=Yd6+kThSRf*#>N zPZa+G6jgzo(Z8$c#*zw&i)iwbvu^rO)t_7_VzrD*-hIolP?a4TS`)71{Pbj>eS4uK zzFh97*o;KiDgN^Wv-e^;zB!F9mEz|XtSSm%e`Pz@>^)$`#MIggf3@C(h#K9!M#wb8#hFSwedzZ}6K#|4*n1}y-jGZN z>zjrFo%^|ECX^kroB3rIlt$7Xd7{*a)RfFSc1S(GS{_u>>f{m`gH}`*xvm}bzyt!v zt5pWz@Ov4T3fStTY>jK!P^TuS3+L35sEj!>r32TjPV)!$R&Kguf4%qjK5|zN%Fq25 zWmvCcN}F(Hk|UdoNW`6@9iFVC&Ni#)7e>s04C=2JU@C3QBc_fx$dm@Y3GS$IO+T*; z$zs$41s?{y2-4$5T%2{vZc9^@M|K<)K$Rmv+DGylAyTqH!4U4f5WuqM10Gtv=6j<2 zJKVs%x?hn(f`j8#{@=q5+&>c0bKcvY!^+UgX zYV{Am`IsyuwlI5sY1+X&*B3SQv+wFcAQf;sEv*o@cZ$jrcR`(9A}nt7XeZA8>Qv0zVx=KJ#fz4=FjfQ%M`m8$I}ag$bO9X7(M)Po+j%JO^1b%~^}kl`7Y@E&r5`rXvg-b)l!?3}C+l*3xs3GNTto2zsoUmCxjtR$BYAV$F~13Jqx>6`Y4 z%Z#2T>Tmk?THsq;nV>4~`?PC5v4sW2q`F8nKJ?z5#I3cH9UgOap(ysDb%ca8}_Pxu; z2KJMdlq1i{Bi9ROR?DN80pRGV8S*hzHb;K}?yiAv7$SSCm+xJ{ zC8E^ZSf$~?$E=>OJXUdgrM(XU6v-WErXc-z4h153M~zk72W2B&HRp2+gKgzp$b3b6 zMiy!r5XBc|c*mq)>Wkx-b=|I^{8c-tgxa@z1-94S5ZH3#O%0?N7tyAd{f@;dx*?#! z$FV$f-;m#EW4qjAg{^6kO+601pVw51rij8A>3Q#gX_$7?b=A9TILjG4ss21nlj#p)MxD|V$npD zBV0mhX1<&Qhjv0pD3>lMUaJSr!7UD{HcRy@^`Z*9lJ)4dA7j)|d%>adS7+8KR@|Q# z>4s5;*xwz}DeC7fP}u^hj01vGgL391Jv?HAJeaU_itTi%oJ~AVB_XvCAIk(E%QvER zA)<9uISVE^#4wxPTdoaJw(azR$CjNpg6AQEZl4pMsyE4ssXSENy!|wDgm#z^k!-0c zztM-52+2<)zUG5}he@jl#9>e|b7_#KmtelJeT7pm`OX1O1N}3ACiyd$09!lF`aSrU zstZof_ozFPY4%V}y4ATM&WaF85fy)IAx(vOd!pGbMKR;J?=d?$s$nQFW-K@Sc$T9G ztRKPz7Yt>us6p?Cwc#K+hDo2cfJ19%N4AKto zF5|3bMyv=nc0T;ldy0tdoK%4xLl|bsHI+(I2YDd6 zM)rOW?2RpwcpK(icU0d1@=qSkqOMeCuTJHy!O<*@>|@%9E@D}Ksm4yW0u^|21Bv@? z7bgi|?@v}D++hxBq8Q^%9&biW)*je@$ky_e2KrJ*eryJ3W=?n*vLnC9loU(_3E`-bThEbv$; zHij8>IR^_}(Fo89MY<8zHFK~kBH2J_XoPg-P4rx~XmM^DwLdt4SNdVeQ8}jg>g-#4 zJ!OL%AT$!f7f`W?kiHjSp_k}LExhEZ+Vjo3LOSp}lQ|tJkw+jjVL}?HN_6qf0 zPCq+%=DtiN&zz86mEe`ABKcC6dwkFy+>5FCF2)6uv~YXMcY~AXhny9p!dLEA9*2?~ zr&jtW zZQ;}8?55Zrf7`9;3hLYsM!NKAX%lWJ+M`mLg3l<*EpoYgJ0<8}U=zH2RT)%NC{(!m zatQmO2CRzQoQ35qgb4;>H;~x}PH9qc54W8$LF{~Zz!kQ^jmam=u|4dk9@ zzK(lH;EEZ_QI7{aJ@ZO+Wc^&MYAMXh_zh&8!BZL*yhB+x%nD8=#(?u@KBIwLnvbO} zhdGn5fxJI>`a^Dd{%Dt^#EhOXfHYPj<|x%B-lzyZARUnEG`|Tqp?L7e_K}J=bRhZU zaig$gbSWu$W2R(HLYr$77+Rz*B@{rFOD6F}z55tnH7L|F5=Qv53n(ZRZ=CxorBUeA zCLaX0yeK4O;@4I>%?DkiMB`4FY+Y)x zSS_f`vI8JAeWx>nSH?^eWr*1`XsT=B)Cbo*@Bfa8g1un*60ga2yE!^r7MMf1Q2#{G zP8XWnM?E|q3?gHr;3xo};(fN>ZjQ~S*h~8RX>?bY@6JG%`Xq%r+5^`$$Wg_t+yreVKKG^g zz=WxQxwRyFEI}+0^Q;JxW7}6(zgsH=GsFt-WlEni%#F z*#ThCHGjjrW`e7>YgbVJ*`Q>?qHEW6H419_ip6q#mPlW`VsJ=Gf5SYe!lhPy7EjE~ z{Ozo(+74?Jn;mfypKQu27T4PG8A1Iu+bmXhJ{dm27Z6KP0b=tSr=yW?6o%uHQt}JW7Y$1?-VDOAfT9u%jga%zJCNZo`mSc95`xUZ| zt8X%@zgj<{dEQT2H6CxH;=EJ>ZYrDpd{m!9mqtU%*I$My`px8Py_VI|-UGzYBjP~T0e zxJs~3yyq7D;(r(;IAh-)s{rad{j7Ut?pyGa|6wJdjA47MB&cuivkv4F@45v){2#^$ z%CMCLutK4}-=Brg(0L2K=RdH-AS2Qq%N^?5Z*exiVd@j_v<2Vs7h?XdB)dx~>fpmT zX!7-g_Fl2!ZW_>cH7dtD1t~|D2X!QCu5x!ZRtz*M+plsME|x)Io>%)nT!<= zl7yBD-$RG9`dzFh28u|Wipt53YYw8qMMjT_S~(Hr>1w*7tRoGMsRYr>H!BCarc-Sp zqzmemfG%=>q{9!_0|KMi_Vzp6l4BMKSx`hF!ol8dsU5{qH{vw_M13ls8o>spmv2!H zbWf++`>SLGUr3Io!%x=#8QFPO9&k&}S|C(F5%vEnVUp~&U?jb{r>QLIYNIKL<^K9b zW+LVpJMJ1dgh*lm?u7g1k#4&6lZlvqocF>!%p#;0iu5@Z6Ne){BB=iNDK|e;*-Kdc zACzrud%*s@R&v|o#RwEB{jc*Le@w-S{Mt!Ld#tTL(=-N9ba(2+m6&vvtz+eSW70L3)PMnIh@ZG%GJ3QtCZ^ zV3d=hx%0#?TQc_Ve0Mp4=`s!UepbKc8!U4xxte~}z=8aXs6(Q*bvK-IYbF}uMp(J| zS1-QtH`M4`+hed_vpzQ?_r`jJ{lw5Em1f4%Wo=lasGuRK_qDi)C0Y%@6{KsrZq`!IKp94e{ToNgf^dIG!@e& z1A`5dHvjp#+bfN5xI{t9^#RV{v{9&N^a1g`C8mmL6v)5~#f;tfGgp9ZG!If-%$t5^ zR<`^(8U@hLd4V8n9RIrmTKW0AYH1+4rq-o@d_mBR(SbO#Qb=-kJ6oAILLAovIUBSFUeCMS}I8it;S;RTdC#=*Op)6clmq{8I z>IiWOPn-gmzhV<=IoLyV?(oFUycI3P>d-|f;oVne5!Bjd@k8tl&aX5sKtTWauB)y4 zU#cOT(3`_2g6i7xOik@Q+@I)i=6JX;xGq|kJ}+HrgcH-W zzKG6U+0r_Z2c?b)FqF!hq8mQgRN&3=q>mpR3>68aYF(6%;q*5%^lr)UlV-Q>Qmua zKG;>v$*J2i6Uz9u^$=C+WDz=KRZH`mn}%tw>i_GN}7Y z4U5f+@4uC*nGJ=`*+mW|=2@2cT=w0)$;!qhZN*RQ{}Z+18c5 z$JY}|?@Zff$f|t?Un4_fpI;5Ab5;E6^NKFC&u)$mL1~2`F4n_92l^H2A!Y=|KWHh* zxl>}Gj4CrUJV%&|{yQhs>T?;e$83l%z;580lDSR%+jfrS0Fap7>c7++!`XWZ(4B>> zUftB#IBST7tt45rUpJTc@m&VE)uy*r2DCmjTi=@*%$4MkR=4ZVN+kVjHpO7v|FHGb zv0EZcWoEXHQKAxPVw-jP<=OmXTJN4Yqp_N#4IWLcx7)A{cwBG2gbgfNfJMLPX`N>l zL$>QhUV?yRFE2;`0Z%XlnP?!>f+yAQtoOub$fH@G|K7}t>id#}L*wGnQ6}ktH&`uo z=Bl)8pwEdQYG|NX{P&hjvtFAmF6hZMpz-!n`~Hv7(|Sh*@CdHYs(QLwm!Nn$fKqlo z-2X7@csN}LyyzU_&vPcyQ3(Ls;V7D} zv=*!ju9LzZMXDL;E6-Dxg7m0Jp_}u?s;`dToQ$V;Nc!5n@q za_c5@oxG=U2uCVUJ&2LGR7nbenW-pkD-pE}y^b__Cr5x1&Yl~0BdcVJ0gh8cdoeog zVSo;n(0m_e_UqjXHi9RzoV;7+(ANqwoERXfDYcY2*I8?xnEjM5mwEN<8X{-=x4k9J4cj&HjL*$3QX{O4-Vgg2r<0|`KP-+r zhqBC#J2kUlcxu5pTmu!C&?hK^X&#UiE%;e|u#gtkRS-XmF$n?s`nmSbR&S3-Zpx*v zMa?9I{CRkL;M86ABcE*8us`jF6%4XYKH>*JrpXi$f(YGt#5b!-<-k6mER${9Yq>D#5uv!12 zCY-E{<9S-aZ$qDMuEUU>%AhSM#OCH|o5iivndGmwmeh=)$e!|hQM}Ui>ih7aP4am= zGyeC-l!+@l>-SNmsryoDb75X)89u~YGD`?6k!m_7?$V5_RycH2)G3Vc(j$AIBE-!! zWHvL3Y0g&wi3tU7m#B59exBA3R*k&0pg{ei%|R|w-z6*J_JFhr(uA?)t2~JCkvZE` zS$B$!#-h}qTd59!e4G*&i%TQMl(CI#A46{+V`)$K!J`3(ZFu(e!ti$_k@*I{t85}m zo(4V!WYWuQP#7lr7ZbSQjOFgM-ldTs-VwYs0sc{h| zd}elhCU$&gEE8pQ$=2{c#$}%UFa7Fn*lHc=g&Um@rni^;Z_g|g?-{=Z2h!g-{6JtVl2Z&GwN! zXRB_dkyr1a&w~xuMka zRHjL#2A$oahEPphaa*cp_1DD#EAIOdaq%5b2Nns6{`t5;ixE;#GM&4=6>!{eeP+4j z#qCPoQn**Ky28{G85|+1DQNZTKLeU1E$&rn z6oE*oS&OV{ipi4TQ{Jn+l)7ox00SslpZL+_8fr14H~;CLI@T zb(dFR@fNbJe(xvHq4k!+UWez@IBwzsEX^f@38N1dr(oKz7tYs%1dy`4&QVITl-GJ+8i^WLdeW4^O7 zq9)$x>rcHjN_&(OOI^6E;JP?m)Sxwu^BNn;f_inhSz1v(be!plsZ?5}=uWvs>9a>1o}e~> zL7iI!N5?I9F8?G{jbC&1bnv1*z4yW1(kCD#rTMGAfnMm0q$+*=6K`_b9A#S@WEXPA zzut*{-enSuYqa|bqCaI`r@D690_j=B8UehLJUw(p82dgVy}(RJ+M-)9 z&Him#s}Oz%O1)H?-?Mwvrrl7Q*^-wxDo#G6>;#4S_}swu?H)pf zH7{676ugYTNlK8+_}n+?Xf%u&aPBmuH@^7lR-IR#tx(8eyr7aq*-dnX_pcY zghgMbT$@A!$xFB+A9koXKWmoi%R9dc(DT-A{T&W$HlAXnKz;6|2gzrO{?OI1jmtBj z)Mz+7=qylbZ-5bEVjIJr5JF-deLjAVbzWi!X`s#Y#j=A2h$d7#PR~qn0 zl{CFsf(-3eR!jI~pxE&}r%OmeVT{;ca9u!hz`%B64Ac+8NId%qm&qsG^HtV{Bcco%WTj4$zqL)wipf0Q}XGn+4#v? z`o~F&-ac_MC5i=zbnmwysgUF`23Rs-<`xjqQ1!V1EBPNWVIMSQ2;LlZ5^{Sqkon?=suv

e?3%?~7Qm;N-U_uYt3ry>xXTv*tl?k} zBobhctE-0~6&Ifbxh~m8_Zm^xgsYMFNT|R3E{OKz3|GD~5k2 zC*IT?N=Qoldjh9&bB%ON?#iJzS6^BH?&&<`xbqe9-xC3{)A<}=MB`ZBgVLPLzBR`D zg(oI@I7>3JdLgvWSoTX?m#b8N=(#stcYERi)hX?+UF^J{f99hN2zX6TIOl88XWXlA z2)vCB2sRVEY?_8k=a1EjD_2yc3Qj!`tv|$)Q7H`12Jnej6+)Yju*TlUu*6B7*i3zUU49SCrD>tV#DQqx0&hQrkE7#)Fio%OT%D_ z-0)6Sk^E|Hc93@A^h3BTf%<6p@7~*HtyIT+*gQe>WQo0 zTr^+PTocb69--=G-whQRwhJk<~ zS@8<}0*kJ0P?|kN4&g%iz>a(+S(qXmmiw{MK5=v~@q<*vjsWn%S=L;R|4(+ebFr5b zYo&%;!2-)6MCP;!9tCJ z`06r%t4HR`pA-P6L~9qCJBQy(7;2&Tm}WJq*2)nzt&~-r(8zHc4$Z_Sy#Zx$BuETZ;#$z*DYxBTcD8%e7;$r<~D7Az}3n-M=WYVZkY2b?hDTpZAb z3)L&l-+o95v5>Xid8O~Z`KoINUwdoTshxA_x6OLtAGAj(S8{Yt4I=V;Z^dhs7_d5(NUqiWG|Ei|%2mkj5 z^3fQ|WD5@mxAq)+{2X_T{*Q3^L`)uPV92qD6Z_MNf8^kPvLLF#+gOdlvSP)fH(@K( zR-#C{5e|LqVU1Pr_<~-lb$j<#CgswrbRWsu8j7fWG7=Cm^-4z@s3|X@CA1N*dgLec zL-2+27+9XVR*(;zQAqr8Q2TYw34;wZ_f5jvf7`HT>S=iH%6wk0F4SSdys=+z1>|t8 z6D)Wl!vkgW$eLN=L7$=iHym0Y1V?w~E+=FttoW`VxbQ;x0*wul?)AqBJ6!&l^NDWR zNUvcsH|37Vej-ZaKEkR|-@SiX(;US)i9_{yGHJcoR6sEFH{(N6_zo+~d`xfQzt?J= z*M@5LGzF6NFPI90zo&8ea(HSQau^wQpW9@}hzLAv5w(M}{~-L`X=$T#>aU-7TFdkH zzk;<5c&Goh#GsCcuk7E4^*TQv=HFEZ{~h9;NF%_h@VDfjQFxgDh`WP>yMFPn$U8T8 zAA1Y8zj1f!O7IAHaR0NG;eRH!60-yZss6RR;UCWee Date: Wed, 24 Apr 2024 17:12:21 +0500 Subject: [PATCH 08/29] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B2?= =?UTF-8?q?=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Templates/WellOperationFactTemplate.xlsx | Bin 37120 -> 36997 bytes .../Templates/WellOperationPlanTemplate.xlsx | Bin 40098 -> 40000 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx index 97e0f79a5f1dc05ca7461d5e50aa8c858cfff777..bd41063d318ebd7542ab71f25b2a88c4d7eabfbc 100644 GIT binary patch delta 11402 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 DYpvnH delta 11365 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 From 81b10e1fa1f111a6e6248c16e884dec1382a94eb Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 25 Apr 2024 11:19:16 +0500 Subject: [PATCH 09/29] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B8=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=B0=20=D1=81=20=D0=B8=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=BC?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC=D0=B8=20+=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20=D1=81=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D0=93=D0=93=D0=94=20(=D0=BF=D0=BB=D0=B0?= =?UTF-8?q?=D0=BD=20=20/=20=D1=84=D0=B0=D0=BA=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Templates/WellOperationFactTemplate.xlsx | Bin 36997 -> 37060 bytes .../Templates/WellOperationPlanTemplate.xlsx | Bin 40000 -> 40035 bytes .../Files/FactWellOperations.xlsx | Bin 45419 -> 37157 bytes .../Files/PlanWellOperations.xlsx | Bin 68419 -> 37167 bytes .../WellOperationControllerTest.cs | 29 ++++-------------- 5 files changed, 6 insertions(+), 23 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationFactTemplate.xlsx index bd41063d318ebd7542ab71f25b2a88c4d7eabfbc..12fc2a44b491dfb1fd53c425f0a7264617ff2623 100644 GIT binary patch delta 7998 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 delta 7966 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 diff --git a/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationPlanTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperations/Templates/WellOperationPlanTemplate.xlsx index e64452e1a2f14a223a27c17c36ccff5c80d484ab..ca2d01c71aaf2350a53811fd8e9071cca4d2e366 100644 GIT binary patch delta 8713 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 agAs7zPj$lNaP@L0afX>3hu^3E$owC5@c<$K diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/Files/FactWellOperations.xlsx b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperations/Files/FactWellOperations.xlsx index 45ee8a0bb72a6425cf5d0362aeed27e61025d7af..a7af081435c0e1b304d95450b6a994b3eb5d30c7 100644 GIT binary patch literal 37157 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 N!dPHJ-qZ`?0RXjKz61aO literal 45419 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 F{|jT-On9uK-^Yc72zI)Cksw-h&lA+o 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 - /// Успешное добавление операций (без предварительной очистки данных) + /// ( ) ///

/// [Fact] @@ -46,7 +46,7 @@ public class WellOperationControllerTest : BaseIntegrationTest } /// - /// Успешное добавление операций (с предварительной очисткой данных) + /// ( ) /// /// [Fact] @@ -65,7 +65,7 @@ public class WellOperationControllerTest : BaseIntegrationTest } /// - /// Успешное обновление операций + /// /// /// [Fact] @@ -87,7 +87,7 @@ public class WellOperationControllerTest : BaseIntegrationTest } /// - /// Получение плановых операций + /// /// /// [Fact] @@ -144,7 +144,7 @@ public class WellOperationControllerTest : BaseIntegrationTest IdWellSectionType = 2, IdCategory = WellOperationCategory.IdSlide, IdPlan = null, - CategoryInfo = "Доп.инфо", + CategoryInfo = ".", IdType = idType, DepthStart = 10.0, DepthEnd = 20.0, @@ -201,7 +201,7 @@ public class WellOperationControllerTest : BaseIntegrationTest var stream = responseTemplate.Content; using var workbook = new XLWorkbook(stream); - var sheet = workbook.GetWorksheet("Справочники"); + var sheet = workbook.GetWorksheet(""); var count = sheet.RowsUsed().Count() - 1; @@ -230,23 +230,6 @@ public class WellOperationControllerTest : BaseIntegrationTest Assert.True(notExistedInDb.Count() == 0); } - private static WellOperation CreateWellOperation(int idWell, int idType = WellOperation.IdOperationTypePlan) => - new() - { - IdWell = idWell, - IdWellSectionType = 2, - IdCategory = WellOperationCategory.IdSlide, - IdPlan = null, - CategoryInfo = "Доп.инфо", - LastUpdateDate = new DateTimeOffset(new DateTime(2023, 1, 10)).ToUniversalTime(), - IdType = idType, - DepthStart = 10.0, - DepthEnd = 20.0, - DateStart = new DateTimeOffset(new DateTime(2023, 1, 10), TimeSpan.FromHours(Defaults.Timezone.Hours)).ToUniversalTime(), - DurationHours = 1.0, - Comment = "1", - IdUser = 1, - }; [Theory] [InlineData(WellOperation.IdOperationTypePlan)] [InlineData(WellOperation.IdOperationTypeFact)] From ecb6a41d372879aa1182544f9e8831bcca32bad3 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 2 May 2024 09:41:37 +0500 Subject: [PATCH 10/29] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=80=D0=B0?= =?UTF-8?q?=D1=81=D1=87=D0=B5=D1=82=D0=B0=20Day=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/WellCompositeOperationService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs index cc944835..53eedbaa 100644 --- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs @@ -221,8 +221,8 @@ public class WellCompositeOperationService : IWellCompositeOperationService compositeOperation.DepthStart = compositeDepth; compositeDepth = compositeOperation.DepthStart; - compositeDay += compositeOperation.DurationHours; compositeOperation.Day = compositeDay / 24; + compositeDay += compositeOperation.DurationHours; compositeOperations.Add(compositeOperation); } From e1748ebfe42dba426e2304ffe4132db9335e128a Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Fri, 3 May 2024 15:45:49 +0500 Subject: [PATCH 11/29] =?UTF-8?q?=D0=9C=D0=B0=D1=82=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9,=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B0=D1=89=D0=B0=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Services/WellInfoService.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/WellInfoService.cs b/AsbCloudInfrastructure/Services/WellInfoService.cs index 23054a2d..5d5f3bf3 100644 --- a/AsbCloudInfrastructure/Services/WellInfoService.cs +++ b/AsbCloudInfrastructure/Services/WellInfoService.cs @@ -37,7 +37,8 @@ public class WellInfoService var telemetryDataSaubCache = services.GetRequiredService>(); var messageHub = services.GetRequiredService>(); - var wells = await wellService.GetAllAsync(token); + var entries = await wellService.GetAllAsync(token); + var wells = entries.ToList(); var activeWells = wells.Where(well => well.IdState == 1); var wellsIds = activeWells.Select(w => w.Id); From 9006e1e36c353d4f3eccbe0c8a32aa71783d12cc Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 6 May 2024 10:17:28 +0500 Subject: [PATCH 12/29] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B3=D0=B0=20=D0=BD=D0=B5=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20?= =?UTF-8?q?=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/WellOperations/WellOperationExport.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs b/AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs index 430bf92f..3e3cd1a6 100644 --- a/AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs +++ b/AsbCloudInfrastructure/Services/WellOperations/WellOperationExport.cs @@ -42,7 +42,9 @@ public class WellOperationExport : ExcelExportService Date: Mon, 6 May 2024 10:49:47 +0500 Subject: [PATCH 13/29] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B1=D0=B0?= =?UTF-8?q?=D0=B3=D0=B0=20=D0=BD=D0=B5=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=8D=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20?= =?UTF-8?q?=D0=93=D0=93=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/WellOperationRepository.cs | 23 +++++++++---------- .../WellOperations/WellOperationExport.cs | 2 -- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 9bcc718b..522895a7 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -54,15 +54,15 @@ public class WellOperationRepository : CrudRepositoryBase> GetPageAsync(WellOperationRequest request, CancellationToken token) { - var skip = request.Skip ?? 0; - var take = request.Take ?? 32; + request.Skip = request.Skip ?? 0; + request.Take = request.Take ?? 32; var (items, count) = await GetWithDaysAndNpvAsync(request, token); var paginationContainer = new PaginationContainer { - Skip = skip, - Take = take, + Skip = request.Skip!.Value, + Take = request.Take!.Value, Count = count, Items = items }; @@ -178,9 +178,6 @@ public class WellOperationRepository : CrudRepositoryBase items, int count)> GetWithDaysAndNpvAsync(WellOperationRequest request, CancellationToken token) { - var skip = request.Skip ?? 0; - var take = request.Take ?? 32; - var entities = await GetByIdsWells(request.IdsWell, token); var groupedByWellAndType = entities .GroupBy(e => new { e.IdWell, e.IdType }); @@ -198,11 +195,14 @@ public class WellOperationRepository : CrudRepositoryBase filteredWellOperations = FilterByRequest(wellOperationsWithType.AsQueryable(), request); - var filteredWellOperationsPart = filteredWellOperations - .Skip(skip) - .Take(take); + count += filteredWellOperations.Count(); - var dtos = filteredWellOperationsPart + if (request.Skip != null) + filteredWellOperations = filteredWellOperations.Skip((int)request.Skip); + if (request.Take != null) + filteredWellOperations = filteredWellOperations.Take((int)request.Take); + + var dtos = filteredWellOperations .Select(entity => { var dto = Convert(entity); @@ -214,7 +214,6 @@ public class WellOperationRepository : CrudRepositoryBase : ExcelExportService Date: Wed, 8 May 2024 10:47:31 +0500 Subject: [PATCH 14/29] =?UTF-8?q?=D0=A5=D1=80=D0=B0=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B2=D0=BE=D0=B9=20=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BD=D0=B5=D0=B9=20=D0=BE?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=B5=D1=88=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/IWellOperationRepository.cs | 53 ++++++++------- .../Repository/DepositRepository.cs | 11 ++-- .../Repository/WellOperationRepository.cs | 66 ++++++++++++++++++- .../Services/WellService.cs | 25 ++++--- 4 files changed, 111 insertions(+), 44 deletions(-) diff --git a/AsbCloudApp/Repositories/IWellOperationRepository.cs b/AsbCloudApp/Repositories/IWellOperationRepository.cs index d37a1e90..12246578 100644 --- a/AsbCloudApp/Repositories/IWellOperationRepository.cs +++ b/AsbCloudApp/Repositories/IWellOperationRepository.cs @@ -1,9 +1,9 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; +using AsbCloudApp.Requests; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using AsbCloudApp.Data.WellOperation; -using AsbCloudApp.Requests; namespace AsbCloudApp.Repositories { @@ -17,8 +17,8 @@ namespace AsbCloudApp.Repositories /// /// IEnumerable GetSectionTypes(); - - /// + + /// /// Получить страницу списка операций /// /// @@ -26,7 +26,7 @@ namespace AsbCloudApp.Repositories /// Task> GetAsync(WellOperationRequest request, CancellationToken token); - /// + /// /// Получить страницу списка операций /// /// @@ -34,7 +34,7 @@ namespace AsbCloudApp.Repositories /// Task> GetPageAsync(WellOperationRequest request, CancellationToken token); - /// + /// /// Получить статистику операции по скважине с группировкой по категориям /// /// @@ -42,14 +42,14 @@ namespace AsbCloudApp.Repositories /// Task> GetGroupOperationsStatAsync(WellOperationRequest request, CancellationToken token); - /// - /// Добавить несколько операций - /// - /// - /// - /// - /// - Task InsertRangeAsync(IEnumerable dtos, bool deleteBeforeInsert, CancellationToken token); + /// + /// Добавить несколько операций + /// + /// + /// + /// + /// + Task InsertRangeAsync(IEnumerable dtos, bool deleteBeforeInsert, CancellationToken token); /// /// Обновить существующую операцию @@ -75,13 +75,20 @@ namespace AsbCloudApp.Repositories /// Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token); - /// - /// Получить диапазон дат выполнения операций - /// - /// - /// - /// - /// - Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken); - } + /// + /// Получить диапазон дат выполнения операций + /// + /// + /// + /// + /// + Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken); + + /// + /// Возвращает первую и последнюю фактическую операцию + /// + /// + /// + (WellOperationDto First, WellOperationDto Last)? GetFirstAndLastFact(int idWell); + } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/DepositRepository.cs b/AsbCloudInfrastructure/Repository/DepositRepository.cs index 804d130e..f7bc4fdd 100644 --- a/AsbCloudInfrastructure/Repository/DepositRepository.cs +++ b/AsbCloudInfrastructure/Repository/DepositRepository.cs @@ -16,12 +16,12 @@ namespace AsbCloudInfrastructure.Repository public class DepositRepository : IDepositRepository { private readonly IAsbCloudDbContext db; - private readonly IWellService wellService; + private readonly ITelemetryService telemetryService; - public DepositRepository(IAsbCloudDbContext db, IWellService wellService) + public DepositRepository(IAsbCloudDbContext db, ITelemetryService telemetryService) { this.db = db; - this.wellService = wellService; + this.telemetryService = telemetryService; } /// @@ -112,8 +112,9 @@ namespace AsbCloudInfrastructure.Repository { var dto = well.Adapt(); dto.WellType = well.WellType.Caption; - dto.LastTelemetryDate = wellService.GetLastTelemetryDate(well.Id) - .ToOffset(TimeSpan.FromHours(well.Timezone.Hours)); + dto.LastTelemetryDate = well.IdTelemetry != null + ? telemetryService.GetDatesRange(well.IdTelemetry.Value).To.ToOffset(TimeSpan.FromHours(well.Timezone.Hours)) + : DateTimeOffset.MinValue; dto.Cluster = gCluster.Key.Caption; dto.Deposit = gDeposit.Key.Caption; return dto; diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 522895a7..95905314 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -20,6 +20,7 @@ namespace AsbCloudInfrastructure.Repository; public class WellOperationRepository : CrudRepositoryBase, IWellOperationRepository { + private const string cacheKeyWellOperations = "FirstAndLastFactWellsOperations"; private readonly IMemoryCache memoryCache; private readonly IWellOperationCategoryRepository wellOperationCategoryRepository; private readonly IWellService wellService; @@ -148,14 +149,26 @@ public class WellOperationRepository : CrudRepositoryBase 0) + memoryCache.Remove(cacheKeyWellOperations); + + return result; + } - public override Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) + public override async Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) { EnsureValidWellOperations(dtos); - return base.UpdateRangeAsync(dtos, token); + var result = await base.UpdateRangeAsync(dtos, token); + + if (result > 0) + memoryCache.Remove(cacheKeyWellOperations); + + return result; + } private static void EnsureValidWellOperations(IEnumerable dtos) @@ -350,6 +363,53 @@ public class WellOperationRepository : CrudRepositoryBase + { + entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5); + var query = dbContext.Set() + .Where(o => o.IdType == WellOperation.IdOperationTypeFact) + .GroupBy(o => o.IdWell) + .Select(group => new + { + IdWell = group.Key, + FirstFact = group.OrderBy(o => o.DateStart).First(), + LastFact = group.OrderBy(o => o.DateStart).Last(), + }); + + var entities = query.ToArray(); + + var dictionary = entities.ToDictionary(s => s.IdWell, s => (Convert(s.FirstFact), Convert(s.LastFact))); + entry.Value = dictionary; + + return dictionary; + + })!; + + var firstAndLast = cachedDictionary.GetValueOrDefault(idWell); + return firstAndLast; + + } + + public override async Task DeleteAsync(int id, CancellationToken token) + { + var result = await base.DeleteAsync(id, token); + if (result > 0) + memoryCache.Remove(cacheKeyWellOperations); + + return result; + } + + public override async Task DeleteRangeAsync(IEnumerable ids, CancellationToken token) + { + var result = await base.DeleteRangeAsync(ids, token); + if (result > 0) + memoryCache.Remove(cacheKeyWellOperations); + + return result; + } + protected override WellOperation Convert(WellOperationDto src) { var entity = src.Adapt(); diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index a10ff824..2c361e38 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -116,12 +116,12 @@ namespace AsbCloudInfrastructure.Services if (well is null) return null; - + var wellInfo = wellInfoService.FirstOrDefault(well => well.Id == idWell); if (wellInfo is null) return well.Adapt(); - + wellInfo.IdState = well.IdState; return wellInfo; } @@ -153,7 +153,7 @@ namespace AsbCloudInfrastructure.Services { if (IsTelemetryAssignedToDifferentWell(dto)) throw new ArgumentInvalidException(nameof(dto), "Телеметрия уже была привязана к другой скважине."); - + if (dto.Id != 0 && (await GetCacheAsync(token)).Any(w => w.Id == dto.Id)) throw new ArgumentInvalidException(nameof(dto), $"Нельзя повторно добавить скважину с id: {dto.Id}"); @@ -177,12 +177,12 @@ namespace AsbCloudInfrastructure.Services throw new NotImplementedException(); } - public override async Task UpdateAsync(WellDto dto, + public override async Task UpdateAsync(WellDto dto, CancellationToken token) { if (IsTelemetryAssignedToDifferentWell(dto)) throw new ArgumentInvalidException(nameof(dto), "Телеметрия уже была привязана к другой скважине."); - + var oldRelations = (await GetCacheRelationCompanyWellAsync(token)) .Where(r => r.IdWell == dto.Id).ToArray(); @@ -192,16 +192,16 @@ namespace AsbCloudInfrastructure.Services dbContext.RelationCompaniesWells .RemoveRange(dbContext.RelationCompaniesWells .Where(r => r.IdWell == dto.Id)); - + DropCacheRelationCompanyWell(); var newRelations = dto.Companies .Select(c => new RelationCompanyWell { - IdWell = dto.Id, + IdWell = dto.Id, IdCompany = c.Id }); - + dbContext.RelationCompaniesWells.AddRange(newRelations); } @@ -215,7 +215,7 @@ namespace AsbCloudInfrastructure.Services public async Task GetWellCaptionByIdAsync(int idWell, CancellationToken token) { - var entity = await GetOrDefaultAsync(idWell, token).ConfigureAwait(false); + var entity = await GetOrDefaultAsync(idWell, token).ConfigureAwait(false); return entity!.Caption; } @@ -272,10 +272,9 @@ namespace AsbCloudInfrastructure.Services if (entity.Timezone is null) dto.Timezone = GetTimezone(entity.Id); - - dto.StartDate = dbContext.WellOperations.Where(e => e.IdType == WellOperation.IdOperationTypeFact) - .AsNoTracking() - .MinOrDefault(e => e.DateStart)?.ToRemoteDateTime(dto.Timezone.Hours); + + dto.StartDate = wellOperationRepository + .GetFirstAndLastFact(entity.Id)?.First?.DateStart; dto.WellType = entity.WellType.Caption; dto.Cluster = entity.Cluster.Caption; dto.Deposit = entity.Cluster.Deposit.Caption; From a975643fd15a65886da462a4a66d98a64e1e0e86 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 8 May 2024 11:53:49 +0500 Subject: [PATCH 15/29] =?UTF-8?q?=D0=9B=D0=B8=D1=88=D0=BD=D0=B5=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=20?= =?UTF-8?q?=D0=BA=D1=83=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Repository/DepositRepository.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/DepositRepository.cs b/AsbCloudInfrastructure/Repository/DepositRepository.cs index f7bc4fdd..497ef3b6 100644 --- a/AsbCloudInfrastructure/Repository/DepositRepository.cs +++ b/AsbCloudInfrastructure/Repository/DepositRepository.cs @@ -112,9 +112,12 @@ namespace AsbCloudInfrastructure.Repository { var dto = well.Adapt(); dto.WellType = well.WellType.Caption; - dto.LastTelemetryDate = well.IdTelemetry != null - ? telemetryService.GetDatesRange(well.IdTelemetry.Value).To.ToOffset(TimeSpan.FromHours(well.Timezone.Hours)) - : DateTimeOffset.MinValue; + + dto.LastTelemetryDate = DateTimeOffset.MinValue; + + if (well.IdTelemetry != null) + dto.LastTelemetryDate = telemetryService.GetDatesRange(well.IdTelemetry.Value).To; + dto.Cluster = gCluster.Key.Caption; dto.Deposit = gDeposit.Key.Caption; return dto; From 65ceedfd0a384e4dc37deacaa26e46878c5e3aa4 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 8 May 2024 12:08:23 +0500 Subject: [PATCH 16/29] =?UTF-8?q?Fix=20WirkTests.=20=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B0=20=D0=BE=D0=BF=D1=82=D0=B8?= =?UTF-8?q?=D0=BC=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BE=D0=B4=D0=BE=D0=B2=20=D1=84=D0=BE=D0=BD=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D1=85=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87,=20=D1=87=D1=82=D0=BE?= =?UTF-8?q?=D0=B1=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=81=D1=80=D0=B0=D0=B1=D0=B0=D1=82=D1=8B=D0=B2=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudWebApi.Tests/Background/WorkTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudWebApi.Tests/Background/WorkTest.cs b/AsbCloudWebApi.Tests/Background/WorkTest.cs index 97a0c6c2..75628370 100644 --- a/AsbCloudWebApi.Tests/Background/WorkTest.cs +++ b/AsbCloudWebApi.Tests/Background/WorkTest.cs @@ -21,7 +21,7 @@ public class WorkTest ((ISupportRequiredService)serviceProviderMock).GetRequiredService(typeof(IServiceScopeFactory)).Returns(serviceScopeFactoryMock); } - [Fact] + [Fact, MethodImpl(MethodImplOptions.NoOptimization)] public async Task Start_ShouldReturn_Success() { //arrange @@ -50,7 +50,7 @@ public class WorkTest Assert.InRange(lastState.ExecutionTime, TimeSpan.Zero, executionTime); } - [Fact] + [Fact, MethodImpl(MethodImplOptions.NoOptimization)] public async Task ExecutionWork_Invokes_Callback() { //arrange From 04f0b4e2754d9e0703f0ca15cff6d293f58989bf Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 13 May 2024 09:56:02 +0500 Subject: [PATCH 17/29] Fix TelemetryController.PostMessagesAsync(..) Time to utc. --- .../Services/SAUB/MessageService.cs | 5 +- .../Clients/ITelemetryControllerClient.cs | 23 ++++ .../Controllers/TelemetryControllerTest.cs | 109 ++++++++++++++++++ 3 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 AsbCloudWebApi.IntegrationTests/Clients/ITelemetryControllerClient.cs create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs diff --git a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs index 17d92d8d..ea6cc79e 100644 --- a/AsbCloudInfrastructure/Services/SAUB/MessageService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/MessageService.cs @@ -142,14 +142,13 @@ namespace AsbCloudInfrastructure.Services.SAUB return Task.CompletedTask; var telemetry = telemetryService.GetOrCreateTelemetryByUid(uid); - var timezone = telemetryService.GetTimezone(telemetry.Id); - + foreach (var dto in dtos) { var entity = dto.Adapt(); entity.Id = 0; entity.IdTelemetry = telemetry.Id; - entity.DateTime = dto.Date.ToOffset(TimeSpan.FromHours(timezone.Hours)); + entity.DateTime = dto.Date.ToUniversalTime(); db.TelemetryMessages.Add(entity); } diff --git a/AsbCloudWebApi.IntegrationTests/Clients/ITelemetryControllerClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/ITelemetryControllerClient.cs new file mode 100644 index 00000000..94f4293e --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Clients/ITelemetryControllerClient.cs @@ -0,0 +1,23 @@ +using AsbCloudApp.Data.SAUB; +using Refit; + +namespace AsbCloudWebApi.IntegrationTests.Clients; +public interface ITelemetryControllerClient +{ + private const string BaseRoute = "/api/telemetry"; + + [Get($"{BaseRoute}/Active")] + Task GetTelemetriesInfoByLastData(CancellationToken token); + + [Post($"{BaseRoute}/{{uid}}/info")] + Task PostInfoAsync(string uid, [Body] TelemetryInfoDto info, CancellationToken token); + + [Post($"{BaseRoute}/{{uid}}/message")] + Task PostMessagesAsync(string uid, [Body] IEnumerable dtos, CancellationToken token); + + [Post($"{BaseRoute}/{{uid}}/event")] + Task PostEventsAsync(string uid, [Body] IEnumerable dtos, CancellationToken token); + + [Post($"{BaseRoute}/{{uid}}/user")] + Task PostUsersAsync(string uid, [Body] IEnumerable dtos, CancellationToken token); +} diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs new file mode 100644 index 00000000..e8abd06f --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs @@ -0,0 +1,109 @@ +using AsbCloudApp.Data.SAUB; +using AsbCloudDb.Model; +using AsbCloudWebApi.IntegrationTests.Clients; +using Xunit; + +namespace AsbCloudWebApi.IntegrationTests.Controllers; +public class TelemetryControllerTest : BaseIntegrationTest +{ + private ITelemetryControllerClient client; + static readonly string uid = DateTime.UtcNow.ToString("yyyyMMdd_HHmmssfff"); + + private static readonly SimpleTimezone timezone = new() {TimezoneId = "a", Hours = 5 }; + private static readonly Telemetry telemetry = new Telemetry() {Id = 1, RemoteUid = uid, TimeZone = timezone, Info = new() }; + private readonly IEnumerable events = [new() { Id = 1, EventType = 1, IdCategory = 1, IdSound = 1, Message = "there is no spoon {tag1}", Tag = "tag1" }]; + private readonly IEnumerable users = [new TelemetryUserDto() { Id = 1, Level = 0, Name = "Neo", Patronymic = "Kianovich", Surname = "Theone" }]; + private readonly IEnumerable messages = [new TelemetryMessageDto() { Id = 100, IdEvent = 1, WellDepth = 5, Date = DateTimeOffset.Now.ToOffset(TimeSpan.FromHours(5)), Arg0 = "3.14", IdTelemetryUser = 1 }]; + private readonly IEnumerable telemetryDataSaubEntities = [new TelemetryDataSaub() + { + IdTelemetry = telemetry.Id, + DateTime = DateTimeOffset.UtcNow, + AxialLoad = 2, + WellDepth = 5, + BitDepth = 5, + BlockPosition = 5, + BlockSpeed = 5, + }]; + + public TelemetryControllerTest(WebAppFactoryFixture factory) + : base(factory) + { + client = factory.GetAuthorizedHttpClient(string.Empty); + } + + [Fact] + public async Task GetTelemetriesInfoByLastData() + { + // Arrange + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.Set().AddRange(telemetryDataSaubEntities); + dbContext.SaveChanges(); + + // Act + var response = await client.GetTelemetriesInfoByLastData(CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task PostUsersAsync() + { + // arrange + dbContext.CleanupDbSet(); + + // act + var response = await client.PostUsersAsync(uid, users, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + var telemetryUserCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + Assert.Equal(1, telemetryUserCount); + } + + [Fact] + public async Task PostEventsAsync() + { + // arrange + dbContext.CleanupDbSet(); + + // act + var response = await client.PostEventsAsync(uid, events, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + var telemetryEventCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + Assert.Equal(1, telemetryEventCount); + } + + [Fact] + public async Task PostMessagesAsync() + { + // arrange + dbContext.CleanupDbSet(); + + // act + _ = await client.PostEventsAsync(uid, events, CancellationToken.None); + _ = await client.PostUsersAsync(uid, users, CancellationToken.None); + var response = await client.PostMessagesAsync(uid, messages, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + var telemetryEventCount = dbContext.Set().Count(); + var telemetryUserCount = dbContext.Set().Count(); + var telemetryMessageCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + Assert.Equal(1, telemetryEventCount); + Assert.Equal(1, telemetryUserCount); + Assert.Equal(1, telemetryMessageCount); + } +} From c66d937e7aa9eb9798ea80d6d0a7601804f735fb Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 13 May 2024 11:06:41 +0500 Subject: [PATCH 18/29] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B=20=D0=BF=D1=80=D0=B8=20=D1=85=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B2=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=B8=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BD?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B4=D0=B0=D1=82=D1=8B=20=D0=BE=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20=D0=BA=D0=B5=D1=88?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/WellOperationRepository.cs | 20 +++++- .../Clients/IWellClient.cs | 12 ++++ .../Controllers/WellControllerTest.cs | 67 +++++++++++++++++++ 3 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 AsbCloudWebApi.IntegrationTests/Clients/IWellClient.cs create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs index 9bcc718b..920702b1 100644 --- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs @@ -135,8 +135,18 @@ public class WellOperationRepository : CrudRepositoryBase 0) + memoryCache.Remove(cacheKeyWellOperations); + + return result; + } + var idType = dtos.First().IdType; var idWell = dtos.First().IdWell; @@ -148,7 +158,13 @@ public class WellOperationRepository : CrudRepositoryBase 0) + memoryCache.Remove(cacheKeyWellOperations); + + return result; + } public override Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IWellClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IWellClient.cs new file mode 100644 index 00000000..1e6961a5 --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Clients/IWellClient.cs @@ -0,0 +1,12 @@ +using AsbCloudApp.Data; +using Refit; + +namespace AsbCloudWebApi.IntegrationTests.Clients; + +public interface IWellClient +{ + private const string BaseRoute = "/api/well"; + + [Get(BaseRoute)] + Task>> GetWellsAsync(); +} diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs new file mode 100644 index 00000000..329240fe --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs @@ -0,0 +1,67 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.WellOperation; +using AsbCloudDb.Model; +using AsbCloudInfrastructure; +using AsbCloudWebApi.IntegrationTests.Clients; +using Mapster; +using Microsoft.EntityFrameworkCore; +using System.Net; +using Xunit; + +namespace AsbCloudWebApi.IntegrationTests.Controllers; + +public class WellControllerTest : BaseIntegrationTest +{ + + private static readonly WellOperationDto wellOperationDto = new() + { + DateStart = DateTimeOffset.UtcNow, + Day = 1, + DepthEnd = 1000, + DepthStart = 500, + DurationHours = 5, + Id = 1, + IdCategory = 5095, + IdPlan = null, + IdType = 1, + IdUser = 1, + IdWell = 1, + IdWellSectionType = 1, + NptHours = 5 + }; + + private readonly IWellClient wellClient; + private readonly IWellOperationClient wellOperationClient; + + public WellControllerTest(WebAppFactoryFixture factory) + : base(factory) + { + wellClient = factory.GetAuthorizedHttpClient(string.Empty); + wellOperationClient = factory.GetAuthorizedHttpClient(string.Empty); + } + + [Fact] + public async Task CheckDateStartForWell_returns_success() + { + //act + var wellOperationDto1 = wellOperationDto.Adapt(); + wellOperationDto1.DateStart = DateTimeOffset.UtcNow; + wellOperationDto1.Id = 2; + + var wellOperations = new List() { wellOperationDto, wellOperationDto1 }; + var insertedRedult = await wellOperationClient.InsertRangeAsync(1, false, wellOperations); + + var wellResponse = await wellClient.GetWellsAsync(); + + //assert + Assert.Equal(HttpStatusCode.OK, wellResponse.StatusCode); + Assert.NotNull(wellResponse.Content); + + var expectedCount = await dbContext.Wells.CountAsync(); + Assert.Equal(expectedCount, wellResponse.Content.Count()); + + var wellStartDate = wellResponse.Content.ElementAt(0).StartDate!.Value.ToUniversalTime(); + var expectedDate = wellOperations.MinByOrDefault(o => o.DateStart)!.DateStart.ToUniversalTime(); + Assert.Equal(expectedDate.ToString(), wellStartDate.ToString()); + } +} \ No newline at end of file From 0f8bc45e80d41af41ce42e1c59c20a943a077449 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 13 May 2024 11:18:24 +0500 Subject: [PATCH 19/29] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/WellControllerTest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs index 329240fe..fe3fea64 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellControllerTest.cs @@ -60,8 +60,8 @@ public class WellControllerTest : BaseIntegrationTest var expectedCount = await dbContext.Wells.CountAsync(); Assert.Equal(expectedCount, wellResponse.Content.Count()); - var wellStartDate = wellResponse.Content.ElementAt(0).StartDate!.Value.ToUniversalTime(); - var expectedDate = wellOperations.MinByOrDefault(o => o.DateStart)!.DateStart.ToUniversalTime(); - Assert.Equal(expectedDate.ToString(), wellStartDate.ToString()); + var actualFirstStartDate = wellResponse.Content.ElementAt(0).StartDate!.Value.ToUniversalTime(); + var expectedFirstStartDate = wellOperations.MinByOrDefault(o => o.DateStart)!.DateStart.ToUniversalTime(); + Assert.Equal(expectedFirstStartDate.ToString(), actualFirstStartDate.ToString()); } } \ No newline at end of file From d5deafeb0f02e40c298740483526beb778d89a78 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 13 May 2024 12:20:47 +0500 Subject: [PATCH 20/29] Fix Test for TelemetryController.PostMessagesAsync(..) Time to utc. --- .../Controllers/TelemetryControllerTest.cs | 126 +++++++++++++++++- 1 file changed, 125 insertions(+), 1 deletion(-) diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs index e8abd06f..8622f11b 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/TelemetryControllerTest.cs @@ -24,6 +24,12 @@ public class TelemetryControllerTest : BaseIntegrationTest BlockPosition = 5, BlockSpeed = 5, }]; + private readonly TelemetryInfoDto telemetryInfoDto = new() + { + TimeZoneId = timezone.TimezoneId, + TimeZoneOffsetTotalHours = timezone.Hours, + Cluster = "cluster1", + }; public TelemetryControllerTest(WebAppFactoryFixture factory) : base(factory) @@ -48,12 +54,69 @@ public class TelemetryControllerTest : BaseIntegrationTest } [Fact] - public async Task PostUsersAsync() + public async Task PostInfoAsync() { // arrange dbContext.CleanupDbSet(); // act + var response = await client.PostInfoAsync(uid, telemetryInfoDto, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + } + + [Fact] + public async Task PostInfoAsync_twice_should_be_ok() + { + // arrange + dbContext.CleanupDbSet(); + + // act + _ = await client.PostInfoAsync(uid, telemetryInfoDto, CancellationToken.None); + var response = await client.PostInfoAsync(uid, telemetryInfoDto, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + } + + [Fact] + public async Task PostUsersAsync() + { + // arrange + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + + // act + var response = await client.PostUsersAsync(uid, users, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + var telemetryUserCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + Assert.Equal(1, telemetryUserCount); + } + + [Fact] + public async Task PostUsers_twice_should_be_ok() + { + // arrange + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + + // act + _ = await client.PostUsersAsync(uid, users, CancellationToken.None); var response = await client.PostUsersAsync(uid, users, CancellationToken.None); // Assert @@ -69,7 +132,10 @@ public class TelemetryControllerTest : BaseIntegrationTest public async Task PostEventsAsync() { // arrange + dbContext.CleanupDbSet(); dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); // act var response = await client.PostEventsAsync(uid, events, CancellationToken.None); @@ -83,12 +149,40 @@ public class TelemetryControllerTest : BaseIntegrationTest Assert.Equal(1, telemetryEventCount); } + [Fact] + public async Task PostEventsAsync_twice_should_be_ok() + { + // arrange + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + + // act + _ = await client.PostEventsAsync(uid, events, CancellationToken.None); + var response = await client.PostEventsAsync(uid, events, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + var telemetryEventCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + Assert.Equal(1, telemetryEventCount); + } + [Fact] public async Task PostMessagesAsync() { // arrange + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + // act _ = await client.PostEventsAsync(uid, events, CancellationToken.None); _ = await client.PostUsersAsync(uid, users, CancellationToken.None); @@ -106,4 +200,34 @@ public class TelemetryControllerTest : BaseIntegrationTest Assert.Equal(1, telemetryUserCount); Assert.Equal(1, telemetryMessageCount); } + + [Fact] + public async Task PostMessagesAsync_twice_should_be_ok() + { + // arrange + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + + // act + _ = await client.PostEventsAsync(uid, events, CancellationToken.None); + _ = await client.PostUsersAsync(uid, users, CancellationToken.None); + _ = await client.PostMessagesAsync(uid, messages, CancellationToken.None); + var response = await client.PostMessagesAsync(uid, messages, CancellationToken.None); + + // Assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var telemetriesCount = dbContext.Set().Count(); + var telemetryEventCount = dbContext.Set().Count(); + var telemetryUserCount = dbContext.Set().Count(); + var telemetryMessageCount = dbContext.Set().Count(); + + Assert.Equal(1, telemetriesCount); + Assert.Equal(1, telemetryEventCount); + Assert.Equal(1, telemetryUserCount); + Assert.Equal(2, telemetryMessageCount); + } } From d0eeddaca4386284a475c407a5bddf4f55ce9123 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 13 May 2024 16:48:47 +0500 Subject: [PATCH 21/29] =?UTF-8?q?Fix=20DrillTestController.PostDataAsync(.?= =?UTF-8?q?.).=20=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BC=D0=BE=D0=B6?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D1=8F=D1=8E=D1=89?= =?UTF-8?q?=D0=B8=D0=B5=D1=81=D1=8F=20=D0=B4=D1=80=D0=B8=D0=BB=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudDb/EFExtensions.cs | 2 +- .../Repository/DrillTestRepository.cs | 6 +- .../Clients/IDrillTestControllerClient.cs | 29 +++++++ .../Controllers/DrillControllerTest.cs | 3 - .../Controllers/DrillTestControllerTest.cs | 77 +++++++++++++++++++ 5 files changed, 111 insertions(+), 6 deletions(-) create mode 100644 AsbCloudWebApi.IntegrationTests/Clients/IDrillTestControllerClient.cs create mode 100644 AsbCloudWebApi.IntegrationTests/Controllers/DrillTestControllerTest.cs diff --git a/AsbCloudDb/EFExtensions.cs b/AsbCloudDb/EFExtensions.cs index 9da4c626..4b8361e7 100644 --- a/AsbCloudDb/EFExtensions.cs +++ b/AsbCloudDb/EFExtensions.cs @@ -227,7 +227,7 @@ namespace AsbCloudDb DateTime vDate => $"'{FormatDateValue(vDate)}'", DateTimeOffset vDate => $"'{FormatDateValue(vDate.UtcDateTime)}'", IFormattable vFormattable => FormatFormattableValue(vFormattable), - _ => System.Text.Json.JsonSerializer.Serialize(v), + _ => $"'{EscapeCurlyBraces(JsonSerializer.Serialize(v))}'", }; private static string EscapeCurlyBraces(string vStr) diff --git a/AsbCloudInfrastructure/Repository/DrillTestRepository.cs b/AsbCloudInfrastructure/Repository/DrillTestRepository.cs index 961dd67b..96ba0ece 100644 --- a/AsbCloudInfrastructure/Repository/DrillTestRepository.cs +++ b/AsbCloudInfrastructure/Repository/DrillTestRepository.cs @@ -2,6 +2,7 @@ using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; +using AsbCloudDb; using AsbCloudDb.Model; using Mapster; using Microsoft.EntityFrameworkCore; @@ -68,11 +69,12 @@ namespace AsbCloudInfrastructure.Repository var entities = dtos.Select(dto => { var entity = dto.Adapt(); + entity.TimeStampStart = dto.TimeStampStart.ToUniversalTime(); entity.IdTelemetry = idTelemetry; return entity; }); - db.DrillTests.AddRange(entities); - var result = await db.SaveChangesAsync(token); + + var result = await db.Database.ExecInsertOrUpdateAsync(db.Set(), entities, token); return result; } diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IDrillTestControllerClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IDrillTestControllerClient.cs new file mode 100644 index 00000000..ba622557 --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Clients/IDrillTestControllerClient.cs @@ -0,0 +1,29 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.DrillTestReport; +using AsbCloudApp.Data.SAUB; +using AsbCloudApp.Requests; +using Microsoft.AspNetCore.Mvc; +using Refit; + +namespace AsbCloudWebApi.IntegrationTests.Clients; + +public interface IDrillTestControllerClient +{ + [Post("/api/telemetry/{uid}/DrillTest")] + Task PostDataAsync( + string uid, + IEnumerable dtos, + CancellationToken token); + + [Get("/api/well/{idWell}/DrillTest")] + Task> GenerateReportAsync( + int idWell, + int id, + CancellationToken cancellationToken); + + [HttpGet("/api/well/{idWell}/DrillTest/all")] + Task>> GetListAsync( + int idWell, + FileReportRequest request, + CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/DrillControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/DrillControllerTest.cs index 638630ca..ed15f095 100644 --- a/AsbCloudWebApi.IntegrationTests/Controllers/DrillControllerTest.cs +++ b/AsbCloudWebApi.IntegrationTests/Controllers/DrillControllerTest.cs @@ -1,9 +1,6 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Requests; using AsbCloudDb.Model; using AsbCloudWebApi.IntegrationTests.Clients; using AsbCloudWebApi.IntegrationTests.Data; -using System; using Xunit; namespace AsbCloudWebApi.IntegrationTests.Controllers; diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/DrillTestControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/DrillTestControllerTest.cs new file mode 100644 index 00000000..5b1da11b --- /dev/null +++ b/AsbCloudWebApi.IntegrationTests/Controllers/DrillTestControllerTest.cs @@ -0,0 +1,77 @@ +using AsbCloudApp.Data.SAUB; +using AsbCloudDb.Model; +using AsbCloudWebApi.IntegrationTests.Clients; +using Xunit; + +namespace AsbCloudWebApi.IntegrationTests.Controllers; + +public class DrillTestControllerTest : BaseIntegrationTest +{ + private readonly IDrillTestControllerClient client; + static readonly string uid = DateTime.UtcNow.ToString("yyyyMMdd_HHmmssfff"); + private static readonly SimpleTimezone timezone = new() { TimezoneId = "a", Hours = 5 }; + private static readonly Telemetry telemetry = new Telemetry() { Id = 1, RemoteUid = uid, TimeZone = timezone, Info = new() }; + private readonly IEnumerable drillTests = [new DrillTestBaseDto { + DepthStart = 12, + Id = 1, + Params = [ new DrillTestParamsDto() { + DepthDrillStep = 1, + DepthSpeed = 2, + Speed = 3, + Step = 4, + TimeDrillStep = 5, + Workload = 6, + }, new DrillTestParamsDto() { + DepthDrillStep = 7, + DepthSpeed = 8, + Speed = 9, + Step = 10, + TimeDrillStep = 11, + Workload = 12, + }], + TimeStampStart = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(5)) + }]; + + public DrillTestControllerTest(WebAppFactoryFixture factory) + : base(factory) + { + client = factory.GetAuthorizedHttpClient(string.Empty); + } + + [Fact] + public async Task PostDataAsync() + { + // arrange + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + + // act + var response = await client.PostDataAsync(uid, drillTests, CancellationToken.None); + + // assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var count = dbContext.Set().Count(); + Assert.Equal(1, count); + } + + [Fact] + public async Task PostDataAsync_twice_should_be_ok() + { + // arrange + dbContext.CleanupDbSet(); + dbContext.CleanupDbSet(); + dbContext.Set().Add(telemetry); + dbContext.SaveChanges(); + + // act + _ = await client.PostDataAsync(uid, drillTests, CancellationToken.None); + var response = await client.PostDataAsync(uid, drillTests, CancellationToken.None); + + // assert + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + var count = dbContext.Set().Count(); + Assert.Equal(1, count); + } +} \ No newline at end of file From 3d0fa5d5efad22e7d84f9b48fe63a82a818099bd Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 13 May 2024 17:12:50 +0500 Subject: [PATCH 22/29] =?UTF-8?q?Fix=20TelemetryDataSaubController.GetByWe?= =?UTF-8?q?llAsync(..).=20=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA?= =?UTF-8?q?=20UTC=20=D0=BF=D1=80=D0=B8=20=D0=B4=D0=B5=D1=84=D0=BE=D0=BB?= =?UTF-8?q?=D1=82=D0=BD=D0=BE=D0=B9=20=D0=B4=D0=B0=D1=82=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/SAUB/TelemetryDataBaseService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs index 53ed062b..0e07ee09 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataBaseService.cs @@ -102,7 +102,7 @@ namespace AsbCloudInfrastructure.Services.SAUB if (dateBegin == default) { var dateRange = telemetryDataCache.GetOrDefaultDataDateRange(telemetry.Id); - dateBeginUtc = (dateRange?.To ?? DateTimeOffset.UtcNow) + dateBeginUtc = (dateRange?.To.ToUniversalTime() ?? DateTimeOffset.UtcNow) .AddSeconds(-intervalSec); } else From 36395e73226c4de8b1481966034a4eccf1ac26a8 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Tue, 14 May 2024 09:33:25 +0500 Subject: [PATCH 23/29] =?UTF-8?q?=D0=9F=D0=BE=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=B7?= =?UTF-8?q?=D0=B8=D1=82=D0=BD=D0=BE=D0=B9=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6?= =?UTF-8?q?=D0=B8=D0=BD=D1=8B=20=D1=81=20=D0=BD=D0=B5=D0=BE=D0=B1=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D0=BC=D1=8B=D0=BC=D0=B8=20=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D1=8F=D0=BC=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D1=81=D0=B5=D0=BA=D1=86=D0=B8=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/WellCompositeOperationService.cs | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs index 53eedbaa..735a80a0 100644 --- a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs +++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs @@ -144,7 +144,63 @@ public class WellCompositeOperationService : IWellCompositeOperationService { (6, 5095) }, { (6, 5012) }, { (6, 5040) }, - { (6, 5092) } + { (6, 5092) }, + + { (5, 5001) }, + { (5, 5015) }, + { (5, 5046) }, + { (5, 5037) }, + { (5, 5097) }, + { (5, 5057) }, + { (5, 5113) }, + { (5, 5036) }, + { (5, 5008) }, + { (5, 5003) }, + { (5, 5036) }, + { (5, 5013) }, + { (5, 5000) }, + { (5, 5029) }, + { (5, 5022) }, + { (5, 5017) }, + { (5, 5019) }, + { (5, 5042) }, + { (5, 5046) }, + + { (2, 5096) }, + { (2, 5008) }, + { (2, 5002) }, + { (2, 5003) }, + + { (3, 5096) }, + { (3, 5008) }, + { (3, 5002) }, + { (3, 5003) }, + { (3, 5085) }, + { (3, 5014) }, + + { (31, 5002) }, + { (31, 5003) }, + { (31, 5014) }, + { (31, 5012) }, + { (31, 5083) }, + + { (4, 5002) }, + { (4, 5003) }, + { (4, 5085) }, + { (4, 5087) }, + { (4, 5014) }, + { (4, 5053) }, + { (4, 5084) }, + { (4, 5086) }, + + { (6, 5002) }, + { (6, 5003) }, + { (6, 5085) }, + { (6, 5036) }, + { (6, 5035) }, + { (6, 5021) }, + { (6, 5086) }, + }; public WellCompositeOperationService( From 794831699de7f6119e705bf51964e742fad31167 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 15 May 2024 17:11:56 +0500 Subject: [PATCH 24/29] =?UTF-8?q?=D0=9F=D0=B0=D0=BA=D0=B5=D1=82=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8=D0=BD=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/WellOperationController.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index 245b1f17..e3f361a7 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -250,6 +250,29 @@ public class WellOperationController : ControllerBase return Ok(result); } + /// + /// Удаляет выбранные операции по скважине + /// + /// id скважины + /// ids выбранных операций + /// Токен отмены задачи + /// Количество удаленных из БД строк + [HttpDelete] + [ProducesResponseType(typeof(int), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + public async Task DeleteRangeAsync([FromRoute] int idWell, IEnumerable ids, CancellationToken token) + { + if (!await CanUserAccessToWellAsync(idWell, token)) + return Forbid(); + + if (!await CanUserEditWellOperationsAsync(idWell, token)) + return Forbid(); + + var result = await wellOperationRepository.DeleteRangeAsync(ids, token); + + return Ok(result); + } + /// /// Формирование excel файла с операциями на скважине /// From ae620038c74f6656cc2d84d468a79162bc6ba5b0 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Wed, 15 May 2024 17:22:52 +0500 Subject: [PATCH 25/29] =?UTF-8?q?=D0=92=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudWebApi/Controllers/WellOperationController.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index e3f361a7..5c6383a2 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -16,6 +16,7 @@ using AsbCloudApp.Requests.ExportOptions; using AsbCloudApp.Requests.ParserOptions; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.WellOperations.Factories; +using System.Linq; namespace AsbCloudWebApi.Controllers; @@ -268,8 +269,14 @@ public class WellOperationController : ControllerBase if (!await CanUserEditWellOperationsAsync(idWell, token)) return Forbid(); + if (!ids.Any()) + return this.ValidationBadRequest(nameof(ids), "Пустой список операций"); + var result = await wellOperationRepository.DeleteRangeAsync(ids, token); + if(result == ICrudRepository.ErrorIdNotFound) + return this.ValidationBadRequest(nameof(ids), "Минимум одна из операций не найдена в базе"); + return Ok(result); } From 2e27211505078666ef06279f0a071424f05b8d5d Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Thu, 16 May 2024 13:19:11 +0500 Subject: [PATCH 26/29] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?processMapPlanDrilling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/WellInfoService.cs | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellInfoService.cs b/AsbCloudInfrastructure/Services/WellInfoService.cs index 5d5f3bf3..9c407490 100644 --- a/AsbCloudInfrastructure/Services/WellInfoService.cs +++ b/AsbCloudInfrastructure/Services/WellInfoService.cs @@ -43,7 +43,10 @@ public class WellInfoService var wellsIds = activeWells.Select(w => w.Id); - var processMapPlanWellDrillingRequests = wellsIds.Select(id => new ProcessMapPlanBaseRequestWithWell(id)); + var processMapPlanWellDrillingRequests = wellsIds.Select(id => new ProcessMapPlanBaseRequestWithWell(id) + { + Moment = DateTimeOffset.UtcNow.AddDays(1) + }); var processMapPlanWellDrillings = new List(); foreach (var processMapPlanWellDrillingRequest in processMapPlanWellDrillingRequests) { @@ -97,14 +100,21 @@ public class WellInfoService int? idSection = wellLastFactSection?.Id; ProcessMapPlanDrillingDto? processMapPlanWellDrilling = null; - if (idSection.HasValue) + if(idSection.HasValue && currentDepth.HasValue) { - processMapPlanWellDrilling = wellProcessMaps.FirstOrDefault(p => p.IdWellSectionType == idSection); - } - else if (currentDepth.HasValue) + processMapPlanWellDrilling = wellProcessMaps + .Where(p => p.IdWellSectionType == idSection) + .Where(p => p.DepthStart <= currentDepth.Value && p.DepthEnd >= currentDepth.Value) + .FirstOrDefault(); + } + else if(currentDepth.HasValue) { processMapPlanWellDrilling = wellProcessMaps.FirstOrDefault(p => p.DepthStart <= currentDepth.Value && p.DepthEnd >= currentDepth.Value); } + else if (idSection.HasValue) + { + processMapPlanWellDrilling = wellProcessMaps.FirstOrDefault(p => p.IdWellSectionType == idSection); + } double? planTotalDepth = null; planTotalDepth = wellDepthByProcessMap.FirstOrDefault(p => p.Id == well.Id)?.DepthEnd; From 43b89b8db84847eb2502aa53476193e107f55f32 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 16 May 2024 15:10:21 +0500 Subject: [PATCH 27/29] =?UTF-8?q?Fix=20EFExtensions.ExecInsertOr*()=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B.=20=D0=9D=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=B0=D1=82=D1=8B=D0=B2=D0=B0=D0=BB=D1=81?= =?UTF-8?q?=D1=8F=20null.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudDb/EFExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/AsbCloudDb/EFExtensions.cs b/AsbCloudDb/EFExtensions.cs index 4b8361e7..8829462a 100644 --- a/AsbCloudDb/EFExtensions.cs +++ b/AsbCloudDb/EFExtensions.cs @@ -223,6 +223,7 @@ namespace AsbCloudDb private static string FormatValue(object? v) => v switch { + null => "NULL", string vStr => $"'{EscapeCurlyBraces(vStr)}'", DateTime vDate => $"'{FormatDateValue(vDate)}'", DateTimeOffset vDate => $"'{FormatDateValue(vDate.UtcDateTime)}'", From 478297a87189d36eddce4153d64cd9c17081fedf Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 20 May 2024 09:20:48 +0500 Subject: [PATCH 28/29] =?UTF-8?q?DepositRepository.GetAsync(..)=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B0=D1=8F=20=D0=BC=D0=B0=D1=82=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BE?= =?UTF-8?q?=D1=82=D0=B2=D0=B5=D1=82=D0=B0,=20=D1=87=D1=82=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=BE=D0=BD=D1=8F=D1=82=D1=8C=20=D0=B3=D0=B4?= =?UTF-8?q?=D0=B5=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=20=D0=B2=D0=BE?= =?UTF-8?q?=D0=B7=D0=BD=D0=B8=D0=BA=D0=B0=D0=B5=D1=82=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=B0=20=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/IDepositRepository.cs | 9 - .../Repository/DepositRepository.cs | 204 ++++++++---------- .../Controllers/DepositController.cs | 20 -- .../SimplifyExceptionsMiddleware.cs | 3 + 4 files changed, 94 insertions(+), 142 deletions(-) diff --git a/AsbCloudApp/Repositories/IDepositRepository.cs b/AsbCloudApp/Repositories/IDepositRepository.cs index 87f732fb..8f2e421a 100644 --- a/AsbCloudApp/Repositories/IDepositRepository.cs +++ b/AsbCloudApp/Repositories/IDepositRepository.cs @@ -19,15 +19,6 @@ namespace AsbCloudApp.Repositories Task> GetAsync(int idCompany, CancellationToken token); - /// - /// Список месторождений/кустов/скважин у которых заполненны параметры бурения - /// - /// - /// - /// - Task> GetAllWithDrillParamsAsync(int idCompany, - CancellationToken token = default); - /// /// Список кустов месторождения доступных компании /// diff --git a/AsbCloudInfrastructure/Repository/DepositRepository.cs b/AsbCloudInfrastructure/Repository/DepositRepository.cs index 497ef3b6..344ad0f7 100644 --- a/AsbCloudInfrastructure/Repository/DepositRepository.cs +++ b/AsbCloudInfrastructure/Repository/DepositRepository.cs @@ -10,122 +10,100 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; -namespace AsbCloudInfrastructure.Repository +namespace AsbCloudInfrastructure.Repository; + +public class DepositRepository : IDepositRepository { + private readonly IAsbCloudDbContext db; + private readonly ITelemetryService telemetryService; - public class DepositRepository : IDepositRepository + public DepositRepository(IAsbCloudDbContext db, ITelemetryService telemetryService) { - private readonly IAsbCloudDbContext db; - private readonly ITelemetryService telemetryService; - - public DepositRepository(IAsbCloudDbContext db, ITelemetryService telemetryService) - { - this.db = db; - this.telemetryService = telemetryService; - } - - /// - public async Task> GetAsync(int idCompany, - CancellationToken token = default) - { - var wellEntities = await (from well in db.Wells - .Include(w => w.RelationCompaniesWells) - .Include(w => w.WellType) - .Include(w => w.Cluster) - .ThenInclude(c => c.Deposit) - where well.RelationCompaniesWells.Any(r => r.IdCompany == idCompany) - select well).ToListAsync(token) - .ConfigureAwait(false); - - var gDepositEntities = GroupWells(wellEntities); - - var dtos = CreateDepositDto(gDepositEntities); - - return dtos; - } - - /// - public async Task> GetAllWithDrillParamsAsync(int idCompany, - CancellationToken token = default) - { - var wellEntities = await (from well in db.Wells - .Include(w => w.RelationCompaniesWells) - .Include(w => w.WellType) - .Include(w => w.Cluster) - .ThenInclude(c => c.Deposit) - where well.RelationCompaniesWells.Any(r => r.IdCompany == idCompany) - select well).ToListAsync(token) - .ConfigureAwait(false); - - var gDepositEntities = GroupWells(wellEntities); - - var dtos = CreateDepositDto(gDepositEntities); - - return dtos; - } - - /// - public async Task> GetClustersAsync(int idCompany, - int depositId, CancellationToken token = default) - { - var entities = await GetWellsForCompany(idCompany) - .Select(e => e.Cluster) - .Where(e => e.IdDeposit == depositId) - .Distinct() - .AsNoTracking() - .ToListAsync(token) - .ConfigureAwait(false); - - var dtos = entities.Adapt>(); - - return dtos; - } - - private static IEnumerable>> GroupWells(IEnumerable wellEntities) - => wellEntities - .GroupBy(w => w.Cluster) - .GroupBy(c => c.Key.Deposit); - - private IQueryable GetWellsForCompany(int idCompany) - => db.Wells - .Include(w => w.RelationCompaniesWells) - .ThenInclude(r => r.Company) - .Include(w => w.Cluster) - .ThenInclude(c => c.Deposit) - .Where(w => w.RelationCompaniesWells.Any(c => c.IdCompany == idCompany)); - - private IEnumerable CreateDepositDto(IEnumerable>> gDepositEntities) - { - var dtos = gDepositEntities.Select(gDeposit => new DepositDto - { - Id = gDeposit.Key.Id, - Caption = gDeposit.Key.Caption, - Latitude = gDeposit.Key.Latitude, - Longitude = gDeposit.Key.Longitude, - Clusters = gDeposit.Select(gCluster => new ClusterDto - { - Id = gCluster.Key.Id, - Caption = gCluster.Key.Caption, - Latitude = gCluster.Key.Latitude, - Longitude = gCluster.Key.Longitude, - Wells = gCluster.Select(well => - { - var dto = well.Adapt(); - dto.WellType = well.WellType.Caption; - - dto.LastTelemetryDate = DateTimeOffset.MinValue; - - if (well.IdTelemetry != null) - dto.LastTelemetryDate = telemetryService.GetDatesRange(well.IdTelemetry.Value).To; - - dto.Cluster = gCluster.Key.Caption; - dto.Deposit = gDeposit.Key.Caption; - return dto; - }), - }), - }); - return dtos; - } + this.db = db; + this.telemetryService = telemetryService; } + /// + public async Task> GetAsync(int idCompany, + CancellationToken token = default) + { + var wellsQuery = db.Set() + .Include(w => w.RelationCompaniesWells) + .Include(w => w.WellType) + .Include(w => w.Cluster) + .ThenInclude(c => c.Deposit) + .Where(well => well.RelationCompaniesWells.Any(r => r.IdCompany == idCompany)); + + var wellEntities = await wellsQuery.ToArrayAsync(token); + + var gDepositEntities = GroupWells(wellEntities); + + var dtos = CreateDepositDto(gDepositEntities) + .ToArray(); + + return dtos; + } + + /// + public async Task> GetClustersAsync(int idCompany, + int depositId, CancellationToken token = default) + { + var entities = await GetWellsForCompany(idCompany) + .Select(e => e.Cluster) + .Where(e => e.IdDeposit == depositId) + .Distinct() + .AsNoTracking() + .ToListAsync(token) + .ConfigureAwait(false); + + var dtos = entities.Adapt>(); + + return dtos; + } + + private static IEnumerable>> GroupWells(IEnumerable wellEntities) + => wellEntities + .GroupBy(w => w.Cluster) + .GroupBy(c => c.Key.Deposit); + + private IQueryable GetWellsForCompany(int idCompany) + => db.Set() + .Include(w => w.RelationCompaniesWells) + .ThenInclude(r => r.Company) + .Include(w => w.Cluster) + .ThenInclude(c => c.Deposit) + .Where(w => w.RelationCompaniesWells.Any(c => c.IdCompany == idCompany)); + + private IEnumerable CreateDepositDto(IEnumerable>> gDepositEntities) + { + var dtos = gDepositEntities.Select(gDeposit => new DepositDto + { + Id = gDeposit.Key.Id, + Caption = gDeposit.Key.Caption, + Latitude = gDeposit.Key.Latitude, + Longitude = gDeposit.Key.Longitude, + Clusters = gDeposit.Select(gCluster => new ClusterDto + { + Id = gCluster.Key.Id, + Caption = gCluster.Key.Caption, + Latitude = gCluster.Key.Latitude, + Longitude = gCluster.Key.Longitude, + Wells = gCluster.Select(well => + { + var dto = well.Adapt(); + dto.WellType = well.WellType.Caption; + + dto.LastTelemetryDate = DateTimeOffset.MinValue; + + if (well.IdTelemetry != null) + dto.LastTelemetryDate = telemetryService.GetDatesRange(well.IdTelemetry.Value).To; + + dto.Cluster = gCluster.Key.Caption; + dto.Deposit = gDeposit.Key.Caption; + return dto; + }), + }), + }); + return dtos; + } } diff --git a/AsbCloudWebApi/Controllers/DepositController.cs b/AsbCloudWebApi/Controllers/DepositController.cs index 9b8d0c91..4e9a287f 100644 --- a/AsbCloudWebApi/Controllers/DepositController.cs +++ b/AsbCloudWebApi/Controllers/DepositController.cs @@ -43,26 +43,6 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } - /// - /// Получает список доступных пользователю месторождений (только скважины с параметрами бурения) - /// - /// Токен отмены задачи - /// - [HttpGet("drillParamsWells")] - [Permission] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetDepositsDrillParamsAsync(CancellationToken token) - { - int? idCompany = User.GetCompanyId(); - - if (idCompany is null) - return Forbid(); - - var result = await depositService.GetAllWithDrillParamsAsync((int)idCompany, - token).ConfigureAwait(false); - return Ok(result); - } - /// /// Получает список доступных пользователю кустов месторождения /// diff --git a/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs b/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs index 3c444b4a..53191eaf 100644 --- a/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs +++ b/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs @@ -44,6 +44,9 @@ namespace AsbCloudWebApi.Middlewares } catch (Exception ex) // TODO: find explicit exception. Use Trace. Add body size to message. { + if (context.Response.HasStarted) + throw; + context.Response.Clear(); context.Response.StatusCode = 500; From 8590156dbde5753bb25ece2845188173341de341 Mon Sep 17 00:00:00 2001 From: Olga Nemt Date: Mon, 20 May 2024 09:22:52 +0300 Subject: [PATCH 29/29] =?UTF-8?q?=D0=A3=D1=81=D1=82=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20Kind=20=D0=B2=20unspecified=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20dateTime=20=D0=B2=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=20GetOrDefaultDataDateRange?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs index 0dcfe080..9d99c700 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataCache.cs @@ -152,8 +152,8 @@ namespace AsbCloudInfrastructure.Services.SAUB if (!cacheItem.LastData.Any()) return null; - var from = cacheItem.FirstByDate.DateTime; - var to = cacheItem.LastData[^1].DateTime; + var from = DateTime.SpecifyKind(cacheItem.FirstByDate.DateTime, DateTimeKind.Unspecified); + var to = DateTime.SpecifyKind(cacheItem.LastData[^1].DateTime, DateTimeKind.Unspecified); return new DatesRangeDto {