From 6b0db1adbc9f228d66c536ceb003e2a7a7ba81d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 3 Nov 2023 18:55:49 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Расширены репозитории: траектории, расписания 2. Расширил DTO, сервис РТК отчёт 3. Поправлен класс с методами расширения для формирования excel. В дальнейшем требуется удалить из него все неиспользуемые методы расширения --- .../Report/ProcessMapReportWellDrillingDto.cs | 17 +++- .../Repositories/ITrajectoryFactRepository.cs | 29 +++--- AsbCloudApp/Requests/TrajectoryFactRequest.cs | 24 +++++ AsbCloudApp/Services/IScheduleService.cs | 10 ++ .../Repository/ScheduleRepository.cs | 44 ++++++--- .../Repository/TrajectoryFactRepository.cs | 98 +++++++++++-------- ...ocessMapReportWellDrillingExportService.cs | 2 +- .../ProcessMapReportWellDrillingService.cs | 5 +- AsbCloudInfrastructure/XLExtentions.cs | 11 --- 9 files changed, 157 insertions(+), 83 deletions(-) create mode 100644 AsbCloudApp/Requests/TrajectoryFactRequest.cs diff --git a/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs b/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs index 49a96faf..59757c16 100644 --- a/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs +++ b/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs @@ -11,8 +11,16 @@ public class ProcessMapReportWellDrillingDto /// Идентификатор скважины /// public int IdWell { get; set; } + + /// + /// Режим работы + /// 0 - ручной + /// 1 - ротор + /// 2 - слайд + /// + public int? IdMode { get; set; } - /// + /// /// Id секции скважины /// public int IdWellSectionType { get; set; } @@ -91,8 +99,13 @@ public class ProcessMapReportWellDrillingDto /// public double UsageFact { get; set; } + /// + /// Плановая механическая скорость, м/ч + /// + public double? RopPlan { get; set; } + /// /// Фактическая механическая скорость, м/ч /// - public double? Rop { get; set; } + public double? RopFact { get; set; } } \ No newline at end of file diff --git a/AsbCloudApp/Repositories/ITrajectoryFactRepository.cs b/AsbCloudApp/Repositories/ITrajectoryFactRepository.cs index 95e991f5..79838333 100644 --- a/AsbCloudApp/Repositories/ITrajectoryFactRepository.cs +++ b/AsbCloudApp/Repositories/ITrajectoryFactRepository.cs @@ -1,16 +1,23 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Data.WITS; -using System.Collections.Generic; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Data; +using AsbCloudApp.Requests; namespace AsbCloudApp.Repositories { - /// - /// CRUD для работы с фактической траекторией из клиента - /// - /// - public interface ITrajectoryFactRepository : ITrajectoryRepository - { - } -} + /// + /// CRUD для работы с фактической траекторией из клиента + /// + /// + public interface ITrajectoryFactRepository : ITrajectoryRepository + { + /// + /// Получить траектории скважины + /// + /// + /// + /// + Task> GetAsync(TrajectoryGeoFactRequest request, CancellationToken token); + } +} \ No newline at end of file diff --git a/AsbCloudApp/Requests/TrajectoryFactRequest.cs b/AsbCloudApp/Requests/TrajectoryFactRequest.cs new file mode 100644 index 00000000..e1f72b72 --- /dev/null +++ b/AsbCloudApp/Requests/TrajectoryFactRequest.cs @@ -0,0 +1,24 @@ +using System; + +namespace AsbCloudApp.Requests; + +/// +/// Запрос для получения фактической траектории +/// +public class TrajectoryGeoFactRequest : RequestBase +{ + /// + /// Идентификатор скважины + /// + public int IdWell { get; set; } + + /// + /// Больше или равно дате + /// + public DateTime? GeDate { get; set; } + + /// + /// Меньше или равно дате + /// + public DateTime? LtDate { get; set; } +} \ No newline at end of file diff --git a/AsbCloudApp/Services/IScheduleService.cs b/AsbCloudApp/Services/IScheduleService.cs index 9a77b7b9..c4c0c1f5 100644 --- a/AsbCloudApp/Services/IScheduleService.cs +++ b/AsbCloudApp/Services/IScheduleService.cs @@ -1,5 +1,6 @@ using AsbCloudApp.Data; using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -10,6 +11,15 @@ namespace AsbCloudApp.Services /// public interface IScheduleRepository : IRepositoryWellRelated { + /// + /// Получить расписание смен + /// + /// + /// + /// + /// + Task> GetAsync(int idWell, DateTime workTime, CancellationToken token); + /// /// получить бурильщика по idWell и времени /// diff --git a/AsbCloudInfrastructure/Repository/ScheduleRepository.cs b/AsbCloudInfrastructure/Repository/ScheduleRepository.cs index 8cbb62f5..2e8bdc98 100644 --- a/AsbCloudInfrastructure/Repository/ScheduleRepository.cs +++ b/AsbCloudInfrastructure/Repository/ScheduleRepository.cs @@ -1,17 +1,19 @@ using AsbCloudApp.Data; using AsbCloudApp.Services; using AsbCloudDb.Model; -using Mapster; using Microsoft.EntityFrameworkCore; using System; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Mapster; namespace AsbCloudInfrastructure.Repository { - public class ScheduleRepository : CrudWellRelatedRepositoryBase, IScheduleRepository + public class ScheduleRepository : CrudWellRelatedRepositoryBase, + IScheduleRepository { private readonly IWellService wellService; @@ -21,31 +23,45 @@ namespace AsbCloudInfrastructure.Repository this.wellService = wellService; } + public async Task> GetAsync(int idWell, DateTime workTime, CancellationToken token) + { + var entities = await BuildQuery(idWell, workTime) + .AsNoTracking() + .ToArrayAsync(token); + + return entities.Select(Convert); + } + public async Task GetOrDefaultDrillerAsync(int idWell, DateTime workTime, CancellationToken token) { - var hoursOffset = wellService.GetTimezone(idWell).Hours; - var date = workTime.ToUtcDateTimeOffset(hoursOffset); - - var entities = await GetQuery() - .Where(s => s.IdWell == idWell - && s.DrillStart <= date - && s.DrillEnd >= date) - .ToListAsync(token); + var entities = await BuildQuery(idWell, workTime) + .AsNoTracking() + .ToArrayAsync(token); if (!entities.Any()) return null; - - var remoteDate = date.ToRemoteDateTime(hoursOffset); + + var hoursOffset = wellService.GetTimezone(idWell).Hours; + var remoteDate = workTime.ToUtcDateTimeOffset(hoursOffset).ToRemoteDateTime(hoursOffset); var time = new TimeOnly(remoteDate.Hour, remoteDate.Minute, remoteDate.Second); - + var entity = entities.FirstOrDefault(s => s.ShiftStart > s.ShiftEnd ^ (time >= s.ShiftStart && time < s.ShiftEnd) ); - + return entity?.Driller.Adapt(); } + private IQueryable BuildQuery(int idWell, DateTime workTime) + { + var hoursOffset = wellService.GetTimezone(idWell).Hours; + + return GetQuery().Where(s => s.IdWell == idWell + && s.DrillStart <= workTime.ToUtcDateTimeOffset(hoursOffset) + && s.DrillEnd >= workTime.ToUtcDateTimeOffset(hoursOffset)); + } + protected override Schedule Convert(ScheduleDto dto) { var hoursOffset = wellService.GetTimezone(dto.IdWell).Hours; diff --git a/AsbCloudInfrastructure/Repository/TrajectoryFactRepository.cs b/AsbCloudInfrastructure/Repository/TrajectoryFactRepository.cs index 5eb7b57d..c7ed3202 100644 --- a/AsbCloudInfrastructure/Repository/TrajectoryFactRepository.cs +++ b/AsbCloudInfrastructure/Repository/TrajectoryFactRepository.cs @@ -1,53 +1,65 @@ using AsbCloudApp.Data; -using AsbCloudApp.Repositories; -using AsbCloudApp.Services; -using AsbCloudDb.Model; -using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using AsbCloudApp.Exceptions; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudDb.Model; +using AsbCloudDb.Model.WITS; +using Microsoft.EntityFrameworkCore; -namespace AsbCloudInfrastructure.Repository +namespace AsbCloudInfrastructure.Repository; + +public class TrajectoryFactRepository : ITrajectoryFactRepository { - internal class TrajectoryFactRepository : ITrajectoryFactRepository - { - private readonly IAsbCloudDbContext db; - private readonly IWellService wellService; - public TrajectoryFactRepository(IAsbCloudDbContext db, IWellService wellService) - { - this.db = db; - this.wellService = wellService; - } - - public async Task> GetAsync(int idWell, CancellationToken token) - { - var well = await wellService.GetOrDefaultAsync(idWell, - token); - - if (well is null) - return Enumerable.Empty(); + private readonly IAsbCloudDbContext dbContext; - var entities = await db.Record7 - .AsNoTracking() - .Where(x => x.IdTelemetry == well.IdTelemetry) - .Where(coord => coord.Deptsvym != null && coord.Svyinc != null && coord.Svyazc != null) - .OrderBy(e => e.Deptsvym) - .ToArrayAsync(token); + public TrajectoryFactRepository(IAsbCloudDbContext dbContext) + { + this.dbContext = dbContext; + } - var result = entities - .Select(coord => new TrajectoryGeoFactDto - { - IdWell = idWell, - AzimuthMagnetic = coord.Svymtf, - VerticalDepth = coord.Deptsvyv, - WellboreDepth = coord.Deptsvym!.Value, - ZenithAngle = coord.Svyinc!.Value, - AzimuthGeo = coord.Svyazc!.Value - }) - .ToArray(); + public async Task> GetAsync(TrajectoryGeoFactRequest request, CancellationToken token) => + (await BuildQuery(request) + .Where(coord => coord.Deptsvym.HasValue && + coord.Svyinc.HasValue && + coord.Svyazc.HasValue) + .AsNoTracking() + .ToArrayAsync(token)) + .Select(r => new TrajectoryGeoFactDto + { + IdWell = request.IdWell, + AzimuthMagnetic = r.Svymtf, + VerticalDepth = r.Deptsvyv, + WellboreDepth = r.Deptsvym!.Value, + ZenithAngle = r.Svyinc!.Value, + AzimuthGeo = r.Svyazc!.Value + }); - return result; - } - } -} + public Task> GetAsync(int idWell, CancellationToken token) => + GetAsync(new TrajectoryGeoFactRequest + { + IdWell = idWell + }, token); + + private IQueryable BuildQuery(TrajectoryGeoFactRequest request) + { + var well = dbContext.Wells.SingleOrDefault(w => w.Id == request.IdWell); + + if (well is null) + throw new ArgumentInvalidException($"Скважина с Id: {request.IdWell} не найдена", nameof(request.IdWell)); + + var query = dbContext.Record7.Where(r => r.IdTelemetry == well.IdTelemetry) + .Where(x => x.IdTelemetry == well.IdTelemetry); + + if (request.GeDate.HasValue) + query = query.Where(r => r.DateTime >= request.GeDate.Value); + + if (request.LtDate.HasValue) + query = query.Where(r => r.DateTime <= request.LtDate.Value); + + return query.OrderBy(e => e.Deptsvym); + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportWellDrillingExportService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportWellDrillingExportService.cs index 246d03e6..df179df3 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportWellDrillingExportService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportWellDrillingExportService.cs @@ -149,7 +149,7 @@ public class ProcessMapReportWellDrillingExportService : IProcessMapReportWellDr .SetVal(modeData.UsageFact); sheet.Cell(row, columnRop) - .SetVal(modeData.Rop); + .SetVal(modeData.RopFact); return row + 1; } diff --git a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportWellDrillingService.cs b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportWellDrillingService.cs index a1fe7960..daebad97 100644 --- a/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportWellDrillingService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMaps/Report/ProcessMapReportWellDrillingService.cs @@ -171,6 +171,7 @@ public class ProcessMapReportWellDrillingService : IProcessMapReportWellDrilling var result = new ProcessMapReportWellDrillingDto { IdWell = processMapByMode?.IdWell ?? processMapFirst.IdWell, + IdMode = processMapByMode?.IdMode, IdWellSectionType = idWellSectionType, WellSectionTypeName = sectionTypes[idWellSectionType], @@ -188,7 +189,9 @@ public class ProcessMapReportWellDrillingService : IProcessMapReportWellDrilling TopDriveTorque = telemetryStat.RotorTorque.MakeParams(processMapByMode?.TopDriveTorque.Plan), SpeedLimit = telemetryStat.BlockSpeed.MakeParams(processMapByMode?.RopPlan), - Rop = telemetryStat.Rop, + RopPlan = processMapByMode?.RopPlan, + RopFact = telemetryStat.Rop, + UsagePlan = processMapByMode?.UsageSaub ?? telemetryStat.UsagePredictPlan, UsageFact = telemetryStat.UsageSaub, }; diff --git a/AsbCloudInfrastructure/XLExtentions.cs b/AsbCloudInfrastructure/XLExtentions.cs index ca083b6a..3a583bf9 100644 --- a/AsbCloudInfrastructure/XLExtentions.cs +++ b/AsbCloudInfrastructure/XLExtentions.cs @@ -186,17 +186,6 @@ internal static class XLExtentions return style; } - /// - /// Костыль исправляющий проблему в библиотеке IXLRange Range(this IXLWorksheet, IXLAddress, IXLAddress) с кастингом IXLAddress к XLAddress. - /// - /// - /// - /// - /// - internal static IXLRange _Range(this IXLWorksheet sheet, CellAddress begin, CellAddress end) - => sheet.Range(begin.RowNumber, begin.ColumnNumber, end.RowNumber, end.ColumnNumber); - - internal static T? GetCellValue(this IXLCell cell) { try