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