diff --git a/AsbCloudInfrastructure/Repository/CrudWellRelatedCacheRepositoryBase.cs b/AsbCloudInfrastructure/Repository/CrudWellRelatedCacheRepositoryBase.cs index c02702b5..7afc8428 100644 --- a/AsbCloudInfrastructure/Repository/CrudWellRelatedCacheRepositoryBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudWellRelatedCacheRepositoryBase.cs @@ -32,6 +32,20 @@ namespace AsbCloudInfrastructure.Repository return dtos; } + public async Task RemoveByWellAsync(int idWell, CancellationToken cancellationToken) + { + var query = GetQuery().Where(x => x.IdWell == idWell); + + dbSet.RemoveRange(query); + + var result = await dbContext.SaveChangesAsync(cancellationToken); + + if(result > 0) + DropCache(); + + return result; + } + public async Task> GetByIdWellAsync(IEnumerable idsWells, CancellationToken token) { if (!idsWells.Any()) diff --git a/AsbCloudInfrastructure/Repository/CrudWellRelatedRepositoryBase.cs b/AsbCloudInfrastructure/Repository/CrudWellRelatedRepositoryBase.cs index 6af596bc..e75a8476 100644 --- a/AsbCloudInfrastructure/Repository/CrudWellRelatedRepositoryBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudWellRelatedRepositoryBase.cs @@ -29,6 +29,15 @@ namespace AsbCloudInfrastructure.Repository return dtos; } + public Task RemoveByWellAsync(int idWell, CancellationToken cancellationToken) + { + var query = GetQuery().Where(x => x.IdWell == idWell); + + dbSet.RemoveRange(query); + + return dbContext.SaveChangesAsync(cancellationToken); + } + public async Task> GetByIdWellAsync(IEnumerable idsWells, CancellationToken token) { if (!idsWells.Any()) diff --git a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs deleted file mode 100644 index 6597210b..00000000 --- a/AsbCloudInfrastructure/Repository/ProcessMapRepository.cs +++ /dev/null @@ -1,169 +0,0 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Data.ProcessMap; -using AsbCloudApp.Repositories; -using AsbCloudApp.Requests; -using AsbCloudApp.Services; -using AsbCloudDb.Model; -using Mapster; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudInfrastructure.Repository -{ - - public class ProcessMapRepository : CrudWellRelatedRepositoryBase, - IProcessMapPlanRepository - { - private readonly IWellService wellService; - - public ProcessMapRepository(IAsbCloudDbContext context, IWellService wellService) - : base(context, dbSet => - dbSet.Include(x => x.Well) - .Include(x => x.WellSectionType) - ) - { - this.wellService = wellService; - } - - public async Task> GetAllAsync(int idWell, - DateTime? updateFrom, CancellationToken token) - { - var requests = new[] - { - new ProcessMapRequest { - IdWell = idWell, - UpdateFrom = updateFrom - } - }; - - var entities = await BuildQuery(requests) - .OrderBy(e => e.DepthStart) - .ThenBy(e => e.Id) - .ToListAsync(token) - .ConfigureAwait(false); - - var dtos = entities.Select(Convert); - return dtos; - } - - public async Task> GetProcessMapAsync(IEnumerable requests, CancellationToken token) - { - var entities = await BuildQuery(requests) - .ToListAsync(token) - .ConfigureAwait(false); - var dtos = entities.Select(Convert).ToList(); - return dtos; - } - - public Task RemoveByWellAsync(int idWell, CancellationToken cancellationToken) - { - var query = dbContext.ProcessMap.Where(x => x.IdWell == idWell); - - dbContext.ProcessMap.RemoveRange(query); - - return dbContext.SaveChangesAsync(cancellationToken); - } - - public override async Task InsertAsync(ProcessMapPlanDto dto, - CancellationToken token) - { - dto.LastUpdate = DateTime.UtcNow; - var result = await base.InsertAsync(dto, token); - return result; - } - - public override async Task UpdateAsync(ProcessMapPlanDto dto, - CancellationToken token) - { - dto.LastUpdate = DateTime.UtcNow; - var result = await base.UpdateAsync(dto, token); - return result; - } - - private IQueryable BuildQuery(IEnumerable requests) - { - var query = GetQuery(); - if (requests.Any()) - { - Expression> predicate = map => false; - foreach (var request in requests) - { - Expression> predicate2 = map => map.IdWell == request.IdWell; - - if (request.IdWellSectionType is not null) - predicate2 = predicate2.And(map => map.IdWellSectionType == request.IdWellSectionType); - - if (request.UpdateFrom is not null) - { - var timezone = wellService.GetTimezone(request.IdWell); - var updateFromUtc = request.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); - predicate2 = predicate2.And(map => map.LastUpdate >= updateFromUtc); - } - - predicate = predicate.Or(predicate2); - } - query = query.Where(predicate); - - } - return query; - } - protected override ProcessMapPlanDto Convert(ProcessMap entity) - { - var dto = entity.Adapt(); - dto.LastUpdate = entity.LastUpdate.ToRemoteDateTime(entity.Well.Timezone.Hours); - dto.AxialLoad = new PlanLimitDto - { - LimitMax = entity.AxialLoadLimitMax, - Plan = entity.AxialLoadPlan - }; - dto.Flow = new PlanLimitDto - { - LimitMax = entity.FlowLimitMax, - Plan = entity.FlowPlan - }; - dto.Pressure = new PlanLimitDto - { - LimitMax = entity.PressureLimitMax, - Plan = entity.PressurePlan - }; - dto.TopDriveSpeed = new PlanLimitDto - { - LimitMax = entity.TopDriveSpeedLimitMax, - Plan = entity.TopDriveSpeedPlan - }; - dto.TopDriveTorque = new PlanLimitDto - { - LimitMax = entity.TopDriveTorqueLimitMax, - Plan = entity.TopDriveTorquePlan - }; - return dto; - } - - protected override ProcessMap Convert(ProcessMapPlanDto dto) - { - var entity = dto.Adapt(); - entity.AxialLoadPlan = dto.AxialLoad.Plan; - entity.AxialLoadLimitMax = dto.AxialLoad.LimitMax; - - entity.FlowPlan = dto.Flow.Plan; - entity.FlowLimitMax = dto.Flow.LimitMax; - - entity.PressurePlan = dto.Pressure.Plan; - entity.PressureLimitMax = dto.Pressure.LimitMax; - - entity.TopDriveSpeedPlan = dto.TopDriveSpeed.Plan; - entity.TopDriveSpeedLimitMax = dto.TopDriveSpeed.LimitMax; - - entity.TopDriveTorquePlan = dto.TopDriveTorque.Plan; - entity.TopDriveTorqueLimitMax = dto.TopDriveTorque.LimitMax; - - return entity; - } - } - -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/ProcessMapWellboreDevelopmentRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapWellboreDevelopmentRepository.cs deleted file mode 100644 index 95b7a4d8..00000000 --- a/AsbCloudInfrastructure/Repository/ProcessMapWellboreDevelopmentRepository.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using AsbCloudApp.Data.ProcessMap; -using AsbCloudApp.Repositories; -using AsbCloudApp.Services; -using AsbCloudDb.Model; -using Microsoft.EntityFrameworkCore; - -namespace AsbCloudInfrastructure.Repository; - -public class ProcessMapWellboreDevelopmentRepository : - CrudWellRelatedRepositoryBase, - IProcessMapWellboreDevelopmentRepository -{ - private readonly IWellService wellService; - - public ProcessMapWellboreDevelopmentRepository(IAsbCloudDbContext context, IWellService wellService) : base(context) - { - this.wellService = wellService; - } - - public async Task> GetAllAsync(int idWell, DateTime? updateFrom, - CancellationToken cancellationToken) - { - var query = dbContext.ProcessMapWellboreDevelopments - .Where(p => p.IdWell == idWell); - - if (updateFrom.HasValue) - { - var timezone = wellService.GetTimezone(idWell); - var updateFromUtc = updateFrom.Value.ToUtcDateTimeOffset(timezone.Hours); - query = query.Where(p => p.LastUpdate >= updateFromUtc); - } - - var entities = await query - .OrderBy(p => p.DepthStart) - .ThenBy(p => p.Id) - .AsNoTracking() - .ToArrayAsync(cancellationToken); - - return entities.Select(Convert); - } -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs index a5234dda..d0a15999 100644 --- a/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellCompositeRepository.cs @@ -1,5 +1,5 @@ using AsbCloudApp.Data; -using AsbCloudApp.Data.ProcessMap; +using AsbCloudApp.Data.ProcessMaps; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudDb.Model; @@ -17,12 +17,12 @@ namespace AsbCloudInfrastructure.Repository public class WellCompositeRepository : IWellCompositeRepository { private readonly IAsbCloudDbContext db; - private readonly IProcessMapPlanRepository processMapRepository; + private readonly IWellDrillingProcessMapRepository wellDrillingProcessMapRepository; - public WellCompositeRepository(IAsbCloudDbContext db, IProcessMapPlanRepository processMapRepository) + public WellCompositeRepository(IAsbCloudDbContext db, IWellDrillingProcessMapRepository wellDrillingProcessMapRepository) { this.db = db; - this.processMapRepository = processMapRepository; + this.wellDrillingProcessMapRepository = wellDrillingProcessMapRepository; } /// @@ -50,16 +50,16 @@ namespace AsbCloudInfrastructure.Repository } /// - public async Task> GetCompositeProcessMap(int idWell, CancellationToken token) + public async Task> GetCompositeProcessMap(int idWell, CancellationToken token) { var dtos = await GetAsync(idWell, token); - var requests = dtos.Select(x => new ProcessMapRequest { + var requests = dtos.Select(x => new WellDrillingProcessMapRequest { IdWell = x.IdWellSrc, IdWellSectionType = x.IdWellSectionType }); - var result = await processMapRepository.GetProcessMapAsync(requests, token); + var result = await wellDrillingProcessMapRepository.GetAsync(requests, token); return result; } @@ -75,5 +75,5 @@ namespace AsbCloudInfrastructure.Repository return dto; } } - + } diff --git a/AsbCloudInfrastructure/Repository/WellDrillingProcessMapRepository.cs b/AsbCloudInfrastructure/Repository/WellDrillingProcessMapRepository.cs new file mode 100644 index 00000000..e37a1a2b --- /dev/null +++ b/AsbCloudInfrastructure/Repository/WellDrillingProcessMapRepository.cs @@ -0,0 +1,129 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data; +using AsbCloudApp.Data.ProcessMaps; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using AsbCloudDb.Model.ProcessMaps; +using Mapster; +using Microsoft.EntityFrameworkCore; + +namespace AsbCloudInfrastructure.Repository; + +public class WellDrillingProcessMapRepository : CrudWellRelatedRepositoryBase, + IWellDrillingProcessMapRepository +{ + private readonly IWellService wellService; + + public WellDrillingProcessMapRepository(IAsbCloudDbContext context, IWellService wellService) + : base(context, dbSet => + dbSet + .Include(p => p.WellSectionType) + .Include(p => p.Well)) + { + this.wellService = wellService; + } + + public async Task> GetAsync(WellDrillingProcessMapRequest request, + CancellationToken cancellationToken) + { + var requests = new[] { request }; + + var entities = await BuildQuery(requests) + .ToArrayAsync(cancellationToken); + + return entities.Select(Convert); + } + + public async Task> GetAsync( + IEnumerable requests, + CancellationToken cancellationToken) + { + var entities = await BuildQuery(requests) + .ToArrayAsync(cancellationToken); + + return entities.Select(Convert); + } + + private IQueryable BuildQuery(IEnumerable requests) + { + var query = GetQuery(); + + foreach (var request in requests) + { + query = query.Where(p => p.IdWell == request.IdWell); + + if (request.IdWellSectionType is not null) + query = query.Where(p => p.IdWellSectionType == request.IdWellSectionType); + + if (request.UpdateFrom is not null) + { + var timezone = wellService.GetTimezone(request.IdWell); + var updateFromUtc = request.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); + + query = query.Where(p => p.LastUpdate >= updateFromUtc); + } + } + + return query.OrderBy(e => e.DepthStart) + .ThenBy(e => e.Id) + .AsNoTracking(); + } + + protected override WellDrillingProcessMapDto Convert(WellDrillingProcessMap entity) + { + var dto = entity.Adapt(); + dto.LastUpdate = entity.LastUpdate.ToRemoteDateTime(entity.Well.Timezone.Hours); + dto.AxialLoad = new PlanLimitDto + { + LimitMax = entity.AxialLoadLimitMax, + Plan = entity.AxialLoadPlan + }; + dto.Flow = new PlanLimitDto + { + LimitMax = entity.FlowLimitMax, + Plan = entity.FlowPlan + }; + dto.Pressure = new PlanLimitDto + { + LimitMax = entity.PressureLimitMax, + Plan = entity.PressurePlan + }; + dto.TopDriveSpeed = new PlanLimitDto + { + LimitMax = entity.TopDriveSpeedLimitMax, + Plan = entity.TopDriveSpeedPlan + }; + dto.TopDriveTorque = new PlanLimitDto + { + LimitMax = entity.TopDriveTorqueLimitMax, + Plan = entity.TopDriveTorquePlan + }; + return dto; + } + + protected override WellDrillingProcessMap Convert(WellDrillingProcessMapDto dto) + { + var entity = dto.Adapt(); + entity.AxialLoadPlan = dto.AxialLoad.Plan; + entity.AxialLoadLimitMax = dto.AxialLoad.LimitMax; + + entity.FlowPlan = dto.Flow.Plan; + entity.FlowLimitMax = dto.Flow.LimitMax; + + entity.PressurePlan = dto.Pressure.Plan; + entity.PressureLimitMax = dto.Pressure.LimitMax; + + entity.TopDriveSpeedPlan = dto.TopDriveSpeed.Plan; + entity.TopDriveSpeedLimitMax = dto.TopDriveSpeed.LimitMax; + + entity.TopDriveTorquePlan = dto.TopDriveTorque.Plan; + entity.TopDriveTorqueLimitMax = dto.TopDriveTorque.LimitMax; + + return entity; + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/WellReamProcessMapRepository.cs b/AsbCloudInfrastructure/Repository/WellReamProcessMapRepository.cs new file mode 100644 index 00000000..7e982173 --- /dev/null +++ b/AsbCloudInfrastructure/Repository/WellReamProcessMapRepository.cs @@ -0,0 +1,48 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using AsbCloudApp.Data.ProcessMaps; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using AsbCloudDb.Model.ProcessMaps; +using Microsoft.EntityFrameworkCore; + +namespace AsbCloudInfrastructure.Repository; + +internal class WellReamProcessMapRepository : CrudWellRelatedRepositoryBase, + IWellReamProcessMapRepository +{ + private readonly IWellService wellService; + + public WellReamProcessMapRepository(IAsbCloudDbContext context, IWellService wellService) + : base(context, dbSet => + dbSet.Include(p => p.Well)) + { + this.wellService = wellService; + } + + public async Task> GetAsync(WellReamProcessMapRequest request, + CancellationToken cancellationToken) + { + var query = GetQuery() + .Where(p => p.IdWell == request.IdWell); + + if (request.UpdateFrom is not null) + { + var timezone = wellService.GetTimezone(request.IdWell); + var updateFromUtc = request.UpdateFrom?.ToUtcDateTimeOffset(timezone.Hours); + + query = query.Where(p => p.LastUpdate >= updateFromUtc); + } + + var entities = await query.OrderBy(e => e.DepthStart) + .ThenBy(e => e.Id) + .AsNoTracking() + .ToArrayAsync(cancellationToken); + + return entities.Select(Convert); + } +} \ No newline at end of file