diff --git a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs
index 0abc05b3..9ae3c6ff 100644
--- a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs
+++ b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs
@@ -10,7 +10,6 @@ public abstract class ProcessMapPlanBaseDto : ChangeLogAbstract, IId, IWellRelat
///
/// Id скважины
///
- [Range(1, int.MaxValue, ErrorMessage = "Id скважины не может быть меньше 1")]
public int IdWell { get; set; }
///
diff --git a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanDrillingDto.cs b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanDrillingDto.cs
index 67d6c74b..ea2555a8 100644
--- a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanDrillingDto.cs
+++ b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanDrillingDto.cs
@@ -17,7 +17,7 @@ public class ProcessMapPlanDrillingDto : ProcessMapPlanBaseDto
/// Название режима бурения
///
public string? Mode { get; set; }
-
+
///
/// Осевая нагрузка, т план
///
diff --git a/AsbCloudApp/Data/WellOperationDataDto.cs b/AsbCloudApp/Data/WellOperationDataDto.cs
new file mode 100644
index 00000000..874bd65c
--- /dev/null
+++ b/AsbCloudApp/Data/WellOperationDataDto.cs
@@ -0,0 +1,39 @@
+namespace AsbCloudApp.Data
+{
+ /// Операция на скважине
+ public class WellOperationDataDto : IWellRelated
+ {
+ ///
+ public int IdWell { get; set; }
+
+ ///
+ /// id секции скважины
+ ///
+ public int IdWellSectionType { get; set; }
+
+ ///
+ /// id категории операции
+ ///
+ public int IdCategory { get; set; }
+
+ ///
+ /// Глубина на начало операции, м
+ ///
+ public double DepthStart { get; set; }
+
+ ///
+ /// Продолжительность, часы
+ ///
+ public double DurationHours { get; set; }
+
+ ///
+ /// Наименование секции
+ ///
+ public string WellSectionTypeCaption { get; set; } = string.Empty;
+
+ ///
+ /// Наименование категории
+ ///
+ public string OperationCategoryName { get; set; } = string.Empty;
+ }
+}
diff --git a/AsbCloudApp/Repositories/IWellOperationRepository.cs b/AsbCloudApp/Repositories/IWellOperationRepository.cs
index cf277304..dd39ce52 100644
--- a/AsbCloudApp/Repositories/IWellOperationRepository.cs
+++ b/AsbCloudApp/Repositories/IWellOperationRepository.cs
@@ -42,6 +42,14 @@ namespace AsbCloudApp.Repositories
///
Task> GetAsync(WellOperationRequest request, CancellationToken token);
+ ///
+ /// Получить список операций по запросу
+ ///
+ ///
+ ///
+ ///
+ Task> GetAsync(WellsOperationRequest request, CancellationToken token);
+
///
/// Получить страницу списка операций
///
diff --git a/AsbCloudApp/Requests/ExportOptions/IExportOptionsRequest.cs b/AsbCloudApp/Requests/ExportOptions/IExportOptionsRequest.cs
new file mode 100644
index 00000000..8d65572b
--- /dev/null
+++ b/AsbCloudApp/Requests/ExportOptions/IExportOptionsRequest.cs
@@ -0,0 +1,8 @@
+namespace AsbCloudApp.Requests.ExportOptions;
+
+///
+/// Параметры экспорта
+///
+public interface IExportOptionsRequest
+{
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Requests/ExportOptions/WellRelatedExportRequest.cs b/AsbCloudApp/Requests/ExportOptions/WellRelatedExportRequest.cs
new file mode 100644
index 00000000..63b185cd
--- /dev/null
+++ b/AsbCloudApp/Requests/ExportOptions/WellRelatedExportRequest.cs
@@ -0,0 +1,21 @@
+namespace AsbCloudApp.Requests.ExportOptions;
+
+///
+/// Параметры экспорта
+///
+public class WellRelatedExportRequest : IExportOptionsRequest
+{
+ ///
+ /// Конструктор
+ ///
+ /// Id скважины
+ public WellRelatedExportRequest(int idWell)
+ {
+ IdWell = idWell;
+ }
+
+ ///
+ /// Id скважины
+ ///
+ public int IdWell { get; }
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Requests/ParserOptions/WellRelatedParserRequest.cs b/AsbCloudApp/Requests/ParserOptions/WellRelatedParserRequest.cs
new file mode 100644
index 00000000..3ffbf4d5
--- /dev/null
+++ b/AsbCloudApp/Requests/ParserOptions/WellRelatedParserRequest.cs
@@ -0,0 +1,21 @@
+namespace AsbCloudApp.Requests.ParserOptions;
+
+///
+/// Параметры парсинга
+///
+public class WellRelatedParserRequest : IParserOptionsRequest
+{
+ ///
+ /// Конструктор
+ ///
+ /// Id скважины
+ public WellRelatedParserRequest(int idWell)
+ {
+ IdWell = idWell;
+ }
+
+ ///
+ /// Id скважины
+ ///
+ public int IdWell { get; }
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs
index ab5b901e..1d190018 100644
--- a/AsbCloudApp/Requests/WellOperationRequest.cs
+++ b/AsbCloudApp/Requests/WellOperationRequest.cs
@@ -6,7 +6,7 @@ namespace AsbCloudApp.Requests
///
/// параметры для запроса списка операций
///
- public class WellOperationRequestBase: RequestBase
+ public class WellOperationRequestBase : RequestBase
{
///
/// фильтр по дате начала операции
@@ -42,12 +42,40 @@ namespace AsbCloudApp.Requests
/// фильтр по списку id конструкций секции
///
public IEnumerable? SectionTypeIds { get; set; }
+
+ ///
+ /// Параметры для запроса списка операций.
+ /// Базовый конструктор
+ ///
+ public WellOperationRequestBase()
+ { }
+
+ ///
+ /// Параметры для запроса списка операций.
+ /// Копирующий конструктор
+ ///
+ ///
+ public WellOperationRequestBase(WellOperationRequestBase request)
+ {
+ GeDepth = request.GeDepth;
+ LeDepth = request.LeDepth;
+ GeDate = request.GeDate;
+ LtDate = request.LtDate;
+
+ OperationCategoryIds = request.OperationCategoryIds;
+ OperationType = request.OperationType;
+ SectionTypeIds = request.SectionTypeIds;
+
+ Skip = request.Skip;
+ Take = request.Take;
+ SortFields = request.SortFields;
+ }
}
///
/// Параметры для запроса списка операций (с id скважины)
///
- public class WellOperationRequest: WellOperationRequestBase
+ public class WellOperationRequest : WellOperationRequestBase
{
///
/// id скважины
@@ -57,7 +85,7 @@ namespace AsbCloudApp.Requests
///
/// ctor
///
- public WellOperationRequest(){}
+ public WellOperationRequest() { }
///
/// копирующий конструктор
@@ -65,21 +93,20 @@ namespace AsbCloudApp.Requests
///
///
public WellOperationRequest(WellOperationRequestBase request, int idWell)
+ :base(request)
{
- this.IdWell = idWell;
-
- this.GeDepth = request.GeDepth;
- this.LeDepth = request.LeDepth;
- this.GeDate = request.GeDate;
- this.LtDate = request.LtDate;
-
- this.OperationCategoryIds = request.OperationCategoryIds;
- this.OperationType = request.OperationType;
- this.SectionTypeIds = request.SectionTypeIds;
-
- this.Skip= request.Skip;
- this.Take= request.Take;
- this.SortFields = request.SortFields;
+ IdWell = idWell;
}
}
+
+ ///
+ /// Параметры для запроса списка операций (с массивом id скважин)
+ ///
+ public class WellsOperationRequest : WellOperationRequestBase
+ {
+ ///
+ /// ids скважин
+ ///
+ public IEnumerable IdsWell { get; set; } = null!;
+ }
}
diff --git a/AsbCloudApp/Services/IExportService.cs b/AsbCloudApp/Services/IExportService.cs
new file mode 100644
index 00000000..b921fec5
--- /dev/null
+++ b/AsbCloudApp/Services/IExportService.cs
@@ -0,0 +1,21 @@
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+using AsbCloudApp.Requests.ExportOptions;
+
+namespace AsbCloudApp.Services;
+
+///
+/// Экспорт данных
+///
+public interface IExportService
+ where TOptions : IExportOptionsRequest
+{
+ ///
+ /// Экспортировать данные
+ ///
+ ///
+ ///
+ ///
+ Task<(string FileName, Stream File)> ExportAsync(TOptions options, CancellationToken token);
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Services/IParserService.cs b/AsbCloudApp/Services/IParserService.cs
index 8c01af5a..89212ba7 100644
--- a/AsbCloudApp/Services/IParserService.cs
+++ b/AsbCloudApp/Services/IParserService.cs
@@ -8,8 +8,10 @@ namespace AsbCloudApp.Services;
/// Сервис парсинга
///
///
-public interface IParserService : IParserService
+///
+public interface IParserService
where TDto : class, IId
+ where TOptions : IParserOptionsRequest
{
///
/// Распарсить файл
@@ -17,19 +19,11 @@ public interface IParserService : IParserService
///
///
///
- ParserResultDto Parse(Stream file, TOptions options)
- where TOptions : IParserOptionsRequest;
+ ParserResultDto Parse(Stream file, TOptions options);
///
/// Получение шаблона для заполнения
///
///
Stream GetTemplateFile();
-}
-
-///
-/// Сервис парсинга(интерфейс маркер)
-///
-public interface IParserService
-{
}
\ No newline at end of file
diff --git a/AsbCloudApp/Services/IWellCompositeOperationService.cs b/AsbCloudApp/Services/IWellCompositeOperationService.cs
new file mode 100644
index 00000000..94ba1f93
--- /dev/null
+++ b/AsbCloudApp/Services/IWellCompositeOperationService.cs
@@ -0,0 +1,21 @@
+using AsbCloudApp.Data;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace AsbCloudApp.Services
+{
+ ///
+ /// Интерфейс для вычисления композитной скважины
+ ///
+ public interface IWellCompositeOperationService
+ {
+ ///
+ /// Получение данных для построения композитной скважины
+ ///
+ ///
+ ///
+ ///
+ Task>> GetAsync(IEnumerable idsWells, CancellationToken token);
+ }
+}
diff --git a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs
index d7daf9ad..074c26ca 100644
--- a/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs
+++ b/AsbCloudInfrastructure/Background/PeriodicWorks/WorkDataSaubStat.cs
@@ -154,13 +154,19 @@ namespace AsbCloudInfrastructure.Background.PeriodicWorks
var hasOscillation = EnabledSubsystemsFlags.AutoOscillation.HasEnabledSubsystems(operation.EnabledSubsystems);
var aggregatedValues = CalcAggregate(span);
+ var dateStart = span[0].DateTime;
+ var dateEnd = span[^1].DateTime;
+ var depthStart = span[0].WellDepth;
+ var depthEnd = span[^1].WellDepth;
+ var speed = ((depthEnd - depthStart) / (dateEnd - dateStart).TotalHours);
+
var processMapDrillingCacheItem = new DataSaubStatDto
{
- DateStart = operation.DateStart,
- DateEnd = operation.DateEnd,
- DepthStart = operation.DepthStart,
- DepthEnd = operation.DepthEnd,
- Speed = (operation.DepthEnd - operation.DepthStart) / ((operation.DateEnd - operation.DateStart).TotalHours),
+ DateStart = dateStart,
+ DateEnd = dateEnd,
+ DepthStart = depthStart,
+ DepthEnd = depthEnd,
+ Speed = speed,
BlockSpeedSp = span[0].BlockSpeedSp,
Pressure = aggregatedValues.Pressure,
PressureIdle = span[0].PressureIdle,
diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs
index 2111356b..5ee77197 100644
--- a/AsbCloudInfrastructure/DependencyInjection.cs
+++ b/AsbCloudInfrastructure/DependencyInjection.cs
@@ -45,6 +45,7 @@ using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
+using AsbCloudInfrastructure.Services.ProcessMapPlan.Export;
namespace AsbCloudInfrastructure
{
@@ -161,9 +162,6 @@ namespace AsbCloudInfrastructure
services.AddScoped();
services.AddTransient();
services.AddTransient();
- services.AddTransient();
- services.AddTransient();
- services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
@@ -198,6 +196,7 @@ namespace AsbCloudInfrastructure
services.AddTransient, CrudCacheRepositoryBase>();
services.AddTransient();
+ services.AddTransient();
// admin crud services:
services.AddTransient, CrudCacheRepositoryBase>(s =>
@@ -294,7 +293,14 @@ namespace AsbCloudInfrastructure
services.AddTransient();
services.AddTransient();
services.AddTransient();
+
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+
return services;
}
}
diff --git a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs
index bfea0fe6..789da211 100644
--- a/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs
+++ b/AsbCloudInfrastructure/Repository/ProcessMapPlanBaseRepository.cs
@@ -28,6 +28,7 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb
.Include(e => e.Author)
.Include(e => e.Editor)
.Include(e => e.Well)
+ .Include(e => e.WellSectionType)
.Where(e => e.IdWell == request.IdWell);
if (request.IdWellSectionType.HasValue)
@@ -56,4 +57,11 @@ public class ProcessMapPlanBaseRepository : ChangeLogRepositoryAb
var offset = TimeSpan.FromHours(timezone.Hours);
return offset;
}
+
+ protected override TDto Convert(TEntity entity, TimeSpan offset)
+ {
+ var dto = base.Convert(entity, offset);
+ dto.Section = entity.WellSectionType.Caption;
+ return dto;
+ }
}
diff --git a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs
index 57bf3768..329d2502 100644
--- a/AsbCloudInfrastructure/Repository/WellOperationRepository.cs
+++ b/AsbCloudInfrastructure/Repository/WellOperationRepository.cs
@@ -205,6 +205,17 @@ public class WellOperationRepository : IWellOperationRepository
return dtos.Select(Convert);
}
+ public async Task> GetAsync(
+ WellsOperationRequest request,
+ CancellationToken token)
+ {
+ var query = BuildQuery(request)
+ .AsNoTracking();
+
+ var dtos = await query.ToArrayAsync(token);
+ return dtos;
+ }
+
///
public async Task> GetPageAsync(
WellOperationRequest request,
@@ -385,7 +396,6 @@ public class WellOperationRepository : IWellOperationRepository
.Include(s => s.OperationCategory)
.Where(o => o.IdWell == request.IdWell);
-
if (request.OperationType.HasValue)
query = query.Where(e => e.IdType == request.OperationType.Value);
@@ -420,6 +430,7 @@ public class WellOperationRepository : IWellOperationRepository
.Where(subOp => subOp.IdType == 1)
.Where(subOp => WellOperationCategory.NonProductiveTimeSubIds.Contains(subOp.IdCategory));
+ // TODO: Вынести query.Select из метода BuildQuery
var dtos = query.Select(o => new WellOperationDto
{
Id = o.Id,
@@ -472,6 +483,50 @@ public class WellOperationRepository : IWellOperationRepository
return dtos.AsNoTracking();
}
+ ///
+ /// Получение данных по запросу
+ ///
+ ///
+ ///
+ ///
+ private IQueryable BuildQuery(WellsOperationRequest request)
+ {
+ var query = db.WellOperations
+ .Where(o => request.IdsWell.Contains(o.IdWell))
+ .Where(o => request.OperationType == o.IdType);
+
+ if (request.SectionTypeIds?.Any() == true)
+ query = query.Where(o => request.SectionTypeIds.Contains(o.IdWellSectionType));
+
+ if (request.OperationCategoryIds?.Any() == true)
+ query = query.Where(o => request.OperationCategoryIds.Contains(o.IdCategory));
+
+ // TODO: Вынести query.Select из метода BuildQuery
+ var dtos = query.Select(o => new WellOperationDataDto
+ {
+ DepthStart = o.DepthStart,
+ DurationHours = o.DurationHours,
+ IdCategory = o.IdCategory,
+ IdWell = o.IdWell,
+ IdWellSectionType = o.IdWellSectionType,
+ OperationCategoryName = o.OperationCategory.Name,
+ WellSectionTypeCaption = o.WellSectionType.Caption,
+ });
+
+ if (request.SortFields?.Any() == true)
+ {
+ dtos = dtos.SortBy(request.SortFields);
+ }
+
+ if (request.Skip.HasValue)
+ dtos = dtos.Skip(request.Skip.Value);
+
+ if (request.Take.HasValue)
+ dtos = dtos.Take(request.Take.Value);
+
+ return dtos.AsNoTracking();
+ }
+
private WellOperationDto Convert(WellOperationDto dto)
{
var timezone = wellService.GetTimezone(dto.IdWell);
diff --git a/AsbCloudInfrastructure/Services/Parser/Cell.cs b/AsbCloudInfrastructure/Services/ExcelServices/Cell.cs
similarity index 97%
rename from AsbCloudInfrastructure/Services/Parser/Cell.cs
rename to AsbCloudInfrastructure/Services/ExcelServices/Cell.cs
index 381ca57b..a18fb167 100644
--- a/AsbCloudInfrastructure/Services/Parser/Cell.cs
+++ b/AsbCloudInfrastructure/Services/ExcelServices/Cell.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.IO;
using ClosedXML.Excel;
-namespace AsbCloudInfrastructure.Services.Parser;
+namespace AsbCloudInfrastructure.Services.ExcelServices;
public class Cell
{
diff --git a/AsbCloudInfrastructure/Services/ExcelServices/ExportExcelService.cs b/AsbCloudInfrastructure/Services/ExcelServices/ExportExcelService.cs
new file mode 100644
index 00000000..086eba97
--- /dev/null
+++ b/AsbCloudInfrastructure/Services/ExcelServices/ExportExcelService.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Threading;
+using System.Threading.Tasks;
+using AsbCloudApp.Requests.ExportOptions;
+using AsbCloudApp.Services;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates;
+using ClosedXML.Excel;
+using Mapster;
+
+namespace AsbCloudInfrastructure.Services.ExcelServices;
+
+public abstract class ExportExcelService : IExportService
+ where TOptions : IExportOptionsRequest
+{
+ protected abstract ITemplateParameters TemplateParameters { get; }
+
+ protected abstract Task BuildFileNameAsync(TOptions options, CancellationToken token);
+
+ protected abstract Task> GetDtosAsync(TOptions options, CancellationToken token);
+
+ public async Task<(string FileName, Stream File)> ExportAsync(TOptions options, CancellationToken token)
+ {
+ var dtos = await GetDtosAsync(options, token);
+
+ var fileName = await BuildFileNameAsync(options, token);
+ var file = BuildFile(dtos);
+ return (fileName, file);
+ }
+
+ private Stream BuildFile(IEnumerable dtos)
+ {
+ using var template = GetTemplateFile();
+ using var workbook = new XLWorkbook(template);
+ AddDtosToWorkbook(workbook, dtos);
+
+ var memoryStream = new MemoryStream();
+ workbook.SaveAs(memoryStream, new SaveOptions { });
+ memoryStream.Seek(0, SeekOrigin.Begin);
+ return memoryStream;
+ }
+
+ private void AddDtosToWorkbook(XLWorkbook workbook, IEnumerable dtos)
+ {
+ var dtosToArray = dtos.ToArray();
+
+ if (!dtosToArray.Any())
+ return;
+
+ var sheet = workbook.GetWorksheet(TemplateParameters.SheetName);
+ for (var i = 0; i < dtosToArray.Length; i++)
+ {
+ var row = sheet.Row(1 + i + TemplateParameters.HeaderRowsCount);
+ AddRow(row, dtosToArray[i]);
+ }
+ }
+
+ private void AddRow(IXLRow xlRow, TDto dto)
+ {
+ var properties = dto.Adapt>();
+
+ foreach (var (name, cellValue) in properties)
+ {
+ if (TemplateParameters.Cells.TryGetValue(name, out var cell))
+ xlRow.Cell(cell.ColumnNumber).SetCellValue(cellValue);
+ }
+ }
+
+ private Stream GetTemplateFile() =>
+ Assembly.GetExecutingAssembly().GetTemplateCopyStream(TemplateParameters.FileName)
+ ?? throw new ArgumentNullException($"Файл '{TemplateParameters.FileName}' не найден");
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/Parser/ParserExcelService.cs b/AsbCloudInfrastructure/Services/ExcelServices/ParserExcelService.cs
similarity index 72%
rename from AsbCloudInfrastructure/Services/Parser/ParserExcelService.cs
rename to AsbCloudInfrastructure/Services/ExcelServices/ParserExcelService.cs
index 661c729f..64e0259c 100644
--- a/AsbCloudInfrastructure/Services/Parser/ParserExcelService.cs
+++ b/AsbCloudInfrastructure/Services/ExcelServices/ParserExcelService.cs
@@ -7,39 +7,34 @@ using System.Reflection;
using AsbCloudApp.Data;
using AsbCloudApp.Requests.ParserOptions;
using AsbCloudApp.Services;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates;
using ClosedXML.Excel;
using Mapster;
-namespace AsbCloudInfrastructure.Services.Parser;
+namespace AsbCloudInfrastructure.Services.ExcelServices;
-public abstract class ParserExcelService : IParserService
+public abstract class ParserExcelService : IParserService
where TDto : class, IValidatableObject, IId
+ where TOptions : IParserOptionsRequest
{
- protected abstract string SheetName { get; }
+ protected abstract ITemplateParameters TemplateParameters { get; }
- protected virtual int HeaderRowsCount => 0;
-
- protected abstract string TemplateFileName { get; }
-
- protected abstract IDictionary Cells { get; }
-
- public virtual ParserResultDto Parse(Stream file, TOptions options)
- where TOptions : IParserOptionsRequest
+ public virtual ParserResultDto Parse(Stream file, TOptions options)
{
using var workbook = new XLWorkbook(file);
- var sheet = workbook.GetWorksheet(SheetName);
+ var sheet = workbook.GetWorksheet(TemplateParameters.SheetName);
var dtos = ParseExcelSheet(sheet);
return dtos;
}
public virtual Stream GetTemplateFile() =>
- Assembly.GetExecutingAssembly().GetTemplateCopyStream(TemplateFileName)
- ?? throw new ArgumentNullException($"Файл '{TemplateFileName}' не найден");
+ Assembly.GetExecutingAssembly().GetTemplateCopyStream(TemplateParameters.FileName)
+ ?? throw new ArgumentNullException($"Файл '{TemplateParameters.FileName}' не найден");
protected virtual IDictionary ParseRow(IXLRow xlRow)
{
- var cells = Cells.ToDictionary(x => x.Key, x =>
+ var cells = TemplateParameters.Cells.ToDictionary(x => x.Key, x =>
{
var columnNumber = x.Value.ColumnNumber;
var xlCell = xlRow.Cell(columnNumber);
@@ -72,7 +67,7 @@ public abstract class ParserExcelService : IParserService
return validDto;
}
- var columnsDict = Cells.ToDictionary(x => x.Key, x => x.Value.ColumnNumber);
+ var columnsDict = TemplateParameters.Cells.ToDictionary(x => x.Key, x => x.Value.ColumnNumber);
var invalidDto = new ValidationResultDto
{
@@ -84,7 +79,10 @@ public abstract class ParserExcelService : IParserService
{
var columnNumber = columnsDict[m];
var errorMessage = v.ErrorMessage;
- var warningMessage = string.Format(XLExtentions.ProblemDetailsTemplate, SheetName, rowNumber, columnNumber,
+ var warningMessage = string.Format(XLExtentions.ProblemDetailsTemplate,
+ TemplateParameters.SheetName,
+ rowNumber,
+ columnNumber,
errorMessage);
var warning = new ValidationResult(warningMessage, new[] { m });
return warning;
@@ -96,7 +94,7 @@ public abstract class ParserExcelService : IParserService
protected virtual ParserResultDto ParseExcelSheet(IXLWorksheet sheet)
{
- var count = sheet.RowsUsed().Count() - HeaderRowsCount;
+ var count = sheet.RowsUsed().Count() - TemplateParameters.HeaderRowsCount;
if (count <= 0)
return new ParserResultDto();
@@ -105,7 +103,7 @@ public abstract class ParserExcelService : IParserService
for (var i = 0; i < count; i++)
{
- var xlRow = sheet.Row(1 + i + HeaderRowsCount);
+ var xlRow = sheet.Row(1 + i + TemplateParameters.HeaderRowsCount);
var rowNumber = xlRow.RowNumber();
try
diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/ITemplateParameters.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/ITemplateParameters.cs
new file mode 100644
index 00000000..eeb1076c
--- /dev/null
+++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/ITemplateParameters.cs
@@ -0,0 +1,14 @@
+using System.Collections.Generic;
+
+namespace AsbCloudInfrastructure.Services.ExcelServices.Templates;
+
+public interface ITemplateParameters
+{
+ string SheetName { get; }
+
+ int HeaderRowsCount { get; }
+
+ string FileName { get; }
+
+ IDictionary Cells { get; }
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanDrillingTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanDrillingTemplate.cs
new file mode 100644
index 00000000..dff24dcf
--- /dev/null
+++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanDrillingTemplate.cs
@@ -0,0 +1,35 @@
+using System.Collections.Generic;
+using AsbCloudApp.Data.ProcessMaps;
+
+namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates;
+
+public class ProcessMapPlanDrillingTemplate : ITemplateParameters
+{
+ public string SheetName => "План";
+
+ public int HeaderRowsCount => 2;
+
+ public string FileName => "ProcessMapPlanDrillingTemplate.xlsx";
+
+ public IDictionary Cells => new Dictionary
+ {
+ { nameof(ProcessMapPlanDrillingDto.Section), new Cell(1, typeof(string)) },
+ { nameof(ProcessMapPlanDrillingDto.Mode), new Cell(2, typeof(string)) },
+ { nameof(ProcessMapPlanDrillingDto.DepthStart), new Cell(3, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.DepthEnd), new Cell(4, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.DeltaPressurePlan), new Cell(5, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.DeltaPressureLimitMax), new Cell(6, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.AxialLoadPlan), new Cell(7, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.AxialLoadLimitMax), new Cell(8, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.TopDriveTorquePlan), new Cell(9, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.TopDriveTorqueLimitMax), new Cell(10, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.TopDriveSpeedPlan), new Cell(11, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.TopDriveSpeedLimitMax), new Cell(12, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.FlowPlan), new Cell(13, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.FlowLimitMax), new Cell(14, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.RopPlan), new Cell(15, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.UsageSaub), new Cell(16, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.UsageSpin), new Cell(17, typeof(double)) },
+ { nameof(ProcessMapPlanDrillingDto.Comment), new Cell(18, typeof(string)) }
+ };
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanReamTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanReamTemplate.cs
new file mode 100644
index 00000000..5c454d7b
--- /dev/null
+++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/ProcessMapPlanTemplates/ProcessMapPlanReamTemplate.cs
@@ -0,0 +1,29 @@
+using System.Collections.Generic;
+using AsbCloudApp.Data.ProcessMaps;
+
+namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates;
+
+public class ProcessMapPlanReamTemplate : ITemplateParameters
+{
+ public string SheetName => "План";
+
+ public int HeaderRowsCount => 1;
+
+ public string FileName => "ProcessMapPlanReamTemplate.xlsx";
+
+ public IDictionary Cells => new Dictionary
+ {
+ { nameof(ProcessMapPlanReamDto.Section), new Cell(1, typeof(string)) },
+ { nameof(ProcessMapPlanReamDto.DepthStart), new Cell(2, typeof(double)) },
+ { nameof(ProcessMapPlanReamDto.DepthEnd), new Cell(3, typeof(double)) },
+ { nameof(ProcessMapPlanReamDto.Repeats), new Cell(4, typeof(double)) },
+ { nameof(ProcessMapPlanReamDto.SpinUpward), new Cell(5, typeof(double)) },
+ { nameof(ProcessMapPlanReamDto.SpinDownward), new Cell(6, typeof(double)) },
+ { nameof(ProcessMapPlanReamDto.SpeedUpward), new Cell(7, typeof(double)) },
+ { nameof(ProcessMapPlanReamDto.SpeedDownward), new Cell(8, typeof(double)) },
+ { nameof(ProcessMapPlanReamDto.SetpointDrag), new Cell(9, typeof(double)) },
+ { nameof(ProcessMapPlanReamDto.SetpointTight), new Cell(10, typeof(double)) },
+ { nameof(ProcessMapPlanReamDto.Pressure), new Cell(11, typeof(double)) },
+ { nameof(ProcessMapPlanReamDto.Torque), new Cell(12, typeof(double)) },
+ };
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryFactManualTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryFactManualTemplate.cs
new file mode 100644
index 00000000..8e604e1e
--- /dev/null
+++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryFactManualTemplate.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+using AsbCloudApp.Data.Trajectory;
+
+namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates;
+
+public class TrajectoryFactManualTemplate : ITemplateParameters
+{
+ public string SheetName => "Фактическая траектория";
+
+ public int HeaderRowsCount => 2;
+
+ public string FileName => "TrajectoryFactManualTemplate.xlsx";
+
+ public IDictionary Cells => new Dictionary
+ {
+ { nameof(TrajectoryGeoFactDto.WellboreDepth), new Cell(1, typeof(double)) },
+ { nameof(TrajectoryGeoFactDto.ZenithAngle), new Cell(2, typeof(double)) },
+ { nameof(TrajectoryGeoFactDto.AzimuthGeo), new Cell(3, typeof(double)) },
+ { nameof(TrajectoryGeoFactDto.AzimuthMagnetic), new Cell(4, typeof(double)) },
+ { nameof(TrajectoryGeoFactDto.VerticalDepth), new Cell(5, typeof(double)) },
+ { nameof(TrajectoryGeoFactDto.Comment), new Cell(6, typeof(string)) }
+ };
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryFactNnbTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryFactNnbTemplate.cs
new file mode 100644
index 00000000..87489d7c
--- /dev/null
+++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryFactNnbTemplate.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+using AsbCloudApp.Data.Trajectory;
+
+namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates;
+
+public class TrajectoryFactNnbTemplate : ITemplateParameters
+{
+ public string SheetName => "Фактическая ннб-траектория";
+
+ public int HeaderRowsCount => 2;
+
+ public string FileName => "TrajectoryFactNnbTemplate.xlsx";
+
+ public IDictionary Cells => new Dictionary
+ {
+ { nameof(TrajectoryGeoFactDto.WellboreDepth), new Cell(1, typeof(double)) },
+ { nameof(TrajectoryGeoFactDto.ZenithAngle), new Cell(2, typeof(double)) },
+ { nameof(TrajectoryGeoFactDto.AzimuthGeo), new Cell(3, typeof(double)) },
+ { nameof(TrajectoryGeoFactDto.AzimuthMagnetic), new Cell(4, typeof(double)) },
+ { nameof(TrajectoryGeoFactDto.VerticalDepth), new Cell(5, typeof(double)) },
+ { nameof(TrajectoryGeoFactDto.Comment), new Cell(6, typeof(string)) }
+ };
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryPlanTemplate.cs b/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryPlanTemplate.cs
new file mode 100644
index 00000000..d98c1d89
--- /dev/null
+++ b/AsbCloudInfrastructure/Services/ExcelServices/Templates/TrajectoryTemplates/TrajectoryPlanTemplate.cs
@@ -0,0 +1,21 @@
+using System.Collections.Generic;
+using AsbCloudApp.Data.Trajectory;
+
+namespace AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates;
+
+public class TrajectoryPlanTemplate : ITemplateParameters
+{
+ public string SheetName => "Плановая траектория";
+ public int HeaderRowsCount => 2;
+ public string FileName => "TrajectoryPlanTemplate.xlsx";
+ public IDictionary Cells => new Dictionary
+ {
+ { nameof(TrajectoryGeoPlanDto.WellboreDepth), new Cell(1, typeof(double)) },
+ { nameof(TrajectoryGeoPlanDto.ZenithAngle), new Cell(2, typeof(double)) },
+ { nameof(TrajectoryGeoPlanDto.AzimuthGeo), new Cell(3, typeof(double)) },
+ { nameof(TrajectoryGeoPlanDto.AzimuthMagnetic), new Cell(4, typeof(double)) },
+ { nameof(TrajectoryGeoPlanDto.VerticalDepth), new Cell(5, typeof(double)) },
+ { nameof(TrajectoryGeoPlanDto.Radius), new Cell(6, typeof(double)) },
+ { nameof(TrajectoryGeoPlanDto.Comment), new Cell(7, typeof(string)) }
+ };
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs
new file mode 100644
index 00000000..5b0935d2
--- /dev/null
+++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanDrillingExportService.cs
@@ -0,0 +1,52 @@
+using System;
+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.Requests.ExportOptions;
+using AsbCloudApp.Services;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates;
+
+namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export;
+
+public class ProcessMapPlanDrillingExportService : ProcessMapPlanExportService
+{
+ public ProcessMapPlanDrillingExportService(
+ IChangeLogRepository processMapPlanRepository,
+ IWellService wellService)
+ : base(processMapPlanRepository, wellService)
+ {
+ }
+
+ protected override ITemplateParameters TemplateParameters => new ProcessMapPlanDrillingTemplate();
+
+ protected override async Task BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token)
+ {
+ var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token);
+
+ return $"{caption}_РТК_План_бурение.xlsx";
+ }
+
+ protected override async Task> GetDtosAsync(WellRelatedExportRequest options,
+ CancellationToken token)
+ {
+ var dtos = await base.GetDtosAsync(options, token);
+ var dtosWithMode = dtos.Select(dto =>
+ {
+ dto.Mode = dto.IdMode switch
+ {
+ 1 => "Ротор",
+ 2 => "Слайд",
+ _ => throw new ArgumentOutOfRangeException()
+ };
+
+ return dto;
+ });
+
+ return dtosWithMode;
+ }
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs
new file mode 100644
index 00000000..458877d1
--- /dev/null
+++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanExportService.cs
@@ -0,0 +1,33 @@
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using AsbCloudApp.Data;
+using AsbCloudApp.Repositories;
+using AsbCloudApp.Requests;
+using AsbCloudApp.Requests.ExportOptions;
+using AsbCloudApp.Services;
+using AsbCloudInfrastructure.Services.ExcelServices;
+
+namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export;
+
+public abstract class ProcessMapPlanExportService : ExportExcelService
+ where TDto : ChangeLogAbstract
+{
+ protected readonly IWellService wellService;
+
+ private readonly IChangeLogRepository processMapPlanRepository;
+
+ protected ProcessMapPlanExportService(IChangeLogRepository processMapPlanRepository,
+ IWellService wellService)
+ {
+ this.processMapPlanRepository = processMapPlanRepository;
+ this.wellService = wellService;
+ }
+
+ protected override async Task> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token)
+ {
+ var request = new ProcessMapPlanBaseRequestWithWell(options.IdWell);
+ var dtos = await processMapPlanRepository.Get(request, token);
+ return dtos;
+ }
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs
new file mode 100644
index 00000000..c3dc5d69
--- /dev/null
+++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Export/ProcessMapPlanReamExportService.cs
@@ -0,0 +1,30 @@
+using System.Threading;
+using System.Threading.Tasks;
+using AsbCloudApp.Data.ProcessMaps;
+using AsbCloudApp.Repositories;
+using AsbCloudApp.Requests;
+using AsbCloudApp.Requests.ExportOptions;
+using AsbCloudApp.Services;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates;
+
+namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Export;
+
+public class ProcessMapPlanReamExportService : ProcessMapPlanExportService
+{
+ protected override ITemplateParameters TemplateParameters => new ProcessMapPlanReamTemplate();
+
+ public ProcessMapPlanReamExportService(
+ IChangeLogRepository processMapPlanRepository,
+ IWellService wellService)
+ : base(processMapPlanRepository, wellService)
+ {
+ }
+
+ protected override async Task BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token)
+ {
+ var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token);
+
+ return $"{caption}_РТК_План_проработка.xlsx";
+ }
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanDrillingParser.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanDrillingParser.cs
index c1717db1..fccffe3e 100644
--- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanDrillingParser.cs
+++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanDrillingParser.cs
@@ -2,50 +2,21 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using AsbCloudApp.Data;
using AsbCloudApp.Data.ProcessMaps;
using AsbCloudApp.Repositories;
-using AsbCloudInfrastructure.Services.Parser;
-using Microsoft.Extensions.DependencyInjection;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates;
namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Parser;
public class ProcessMapPlanDrillingParser : ProcessMapPlanParser
{
- private readonly IEnumerable sections;
-
public ProcessMapPlanDrillingParser(IWellOperationRepository wellOperationRepository)
+ : base(wellOperationRepository)
{
- sections = wellOperationRepository.GetSectionTypes();
}
-
- protected override string SheetName => "План";
- protected override string TemplateFileName => "ProcessMapPlanDrillingTemplate.xlsx";
- private const int ColumnSection = 1;
- private const int ColumnMode = 2;
-
- protected override IDictionary Cells => new Dictionary
- {
- { nameof(ProcessMapPlanDrillingDto.Section), new Cell(ColumnSection, typeof(string)) },
- { nameof(ProcessMapPlanDrillingDto.Mode), new Cell(ColumnMode, typeof(string)) },
- { nameof(ProcessMapPlanDrillingDto.DepthStart), new Cell(3, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.DepthEnd), new Cell(4, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.DeltaPressurePlan), new Cell(5, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.DeltaPressureLimitMax), new Cell(6, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.AxialLoadPlan), new Cell(7, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.AxialLoadLimitMax), new Cell(8, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.TopDriveTorquePlan), new Cell(9, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.TopDriveTorqueLimitMax), new Cell(10, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.TopDriveSpeedPlan), new Cell(11, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.TopDriveSpeedLimitMax), new Cell(12, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.FlowPlan), new Cell(13, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.FlowLimitMax), new Cell(14, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.RopPlan), new Cell(15, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.UsageSaub), new Cell(16, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.UsageSpin), new Cell(17, typeof(double)) },
- { nameof(ProcessMapPlanDrillingDto.Comment), new Cell(18, typeof(string)) }
- };
+ protected override ITemplateParameters TemplateParameters => new ProcessMapPlanDrillingTemplate();
protected override ProcessMapPlanDrillingDto BuildDto(IDictionary row, int rowNumber)
{
@@ -56,7 +27,10 @@ public class ProcessMapPlanDrillingParser : ProcessMapPlanParser : ParserExcelService
+public abstract class ProcessMapPlanParser : ParserExcelService
where TDto : ProcessMapPlanBaseDto
{
- protected override int HeaderRowsCount => 2;
+ protected readonly IEnumerable sections;
+
+ protected ProcessMapPlanParser(IWellOperationRepository wellOperationRepository)
+ {
+ sections = wellOperationRepository.GetSectionTypes();
+ }
+
+ public override ParserResultDto Parse(Stream file, WellRelatedParserRequest options)
+ {
+ var result = base.Parse(file, options);
+
+ foreach (var item in result.Item)
+ item.Item.IdWell = options.IdWell;
+
+ return result;
+ }
protected static int? GetIdMode(string? modeName) =>
modeName?.Trim().ToLower() switch
diff --git a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanReamParser.cs b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanReamParser.cs
index 20aca5ed..7bfaa880 100644
--- a/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanReamParser.cs
+++ b/AsbCloudInfrastructure/Services/ProcessMapPlan/Parser/ProcessMapPlanReamParser.cs
@@ -2,44 +2,21 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using AsbCloudApp.Data;
using AsbCloudApp.Data.ProcessMaps;
using AsbCloudApp.Repositories;
-using AsbCloudInfrastructure.Services.Parser;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates.ProcessMapPlanTemplates;
namespace AsbCloudInfrastructure.Services.ProcessMapPlan.Parser;
public class ProcessMapPlanReamParser : ProcessMapPlanParser
{
- private readonly IEnumerable sections;
-
public ProcessMapPlanReamParser(IWellOperationRepository wellOperationRepository)
+ : base(wellOperationRepository)
{
- sections = wellOperationRepository.GetSectionTypes();
}
-
- protected override string SheetName => "План";
- protected override string TemplateFileName => "ProcessMapPlanReamTemplate.xlsx";
- private const int ColumnSection = 1;
- private const int ColumnMode = 2;
-
- protected override IDictionary Cells => new Dictionary
- {
- { nameof(ProcessMapPlanReamDto.Section), new Cell(ColumnSection, typeof(string)) },
- { nameof(ProcessMapPlanReamDto.DepthStart), new Cell(2, typeof(double)) },
- { nameof(ProcessMapPlanReamDto.DepthEnd), new Cell(3, typeof(double)) },
-
- { nameof(ProcessMapPlanReamDto.Repeats), new Cell(4, typeof(double)) },
- { nameof(ProcessMapPlanReamDto.SpinUpward), new Cell(5, typeof(double)) },
- { nameof(ProcessMapPlanReamDto.SpinUpward), new Cell(6, typeof(double)) },
- { nameof(ProcessMapPlanReamDto.SpeedDownward), new Cell(7, typeof(double)) },
- { nameof(ProcessMapPlanReamDto.SpeedUpward), new Cell(8, typeof(double)) },
- { nameof(ProcessMapPlanReamDto.SetpointDrag), new Cell(9, typeof(double)) },
- { nameof(ProcessMapPlanReamDto.SetpointTight), new Cell(10, typeof(double)) },
- { nameof(ProcessMapPlanReamDto.Pressure), new Cell(11, typeof(double)) },
- { nameof(ProcessMapPlanReamDto.Torque), new Cell(12, typeof(double)) },
- };
+ protected override ITemplateParameters TemplateParameters => new ProcessMapPlanReamTemplate();
protected override ProcessMapPlanReamDto BuildDto(IDictionary row, int rowNumber)
{
@@ -50,7 +27,9 @@ public class ProcessMapPlanReamParser : ProcessMapPlanParser : ExportExcelService
+ where TDto : TrajectoryGeoDto
{
- public abstract class TrajectoryExportService where T : TrajectoryGeoDto
- {
- private readonly IWellService wellService;
+ protected readonly IWellService wellService;
- private readonly ITrajectoryRepository trajectoryRepository;
- public abstract string templateFileName { get; }
- public abstract string usingTemplateFile { get; }
- public abstract string sheetName { get; }
- public abstract int headerRowsCount { get; }
+ private readonly ITrajectoryRepository trajectoryRepository;
- public TrajectoryExportService(IWellService wellService, ITrajectoryRepository trajectoryRepository)
- {
- this.wellService = wellService;
- this.trajectoryRepository = trajectoryRepository;
- }
+ protected TrajectoryExportService(IWellService wellService, ITrajectoryRepository trajectoryRepository)
+ {
+ this.wellService = wellService;
+ this.trajectoryRepository = trajectoryRepository;
+ }
- protected abstract void AddCoordinatesToRow(IXLRow row, T trajectory);
-
- public async Task ExportAsync(int idWell, CancellationToken token)
- {
- var trajectorys = await trajectoryRepository.GetAsync(idWell, token);
- return MakeExelFileStream(trajectorys);
- }
-
- public async Task GetFileNameAsync(int idWell, CancellationToken token)
- {
- var caption = await wellService.GetWellCaptionByIdAsync(idWell, token);
- return string.Format("{0}_{1}", caption, templateFileName);
- }
-
- public Stream GetTemplateFile()
- {
- var stream = System.Reflection.Assembly.GetExecutingAssembly()
- .GetManifestResourceStream($"{usingTemplateFile}.{templateFileName}");
- if (stream is null)
- throw new Exception($"Область {usingTemplateFile} не содержит файла с названием {templateFileName}");
- return stream;
- }
-
- private Stream MakeExelFileStream(IEnumerable trajectories)
- {
- using Stream ecxelTemplateStream = GetTemplateFile();
- using var workbook = new XLWorkbook(ecxelTemplateStream);
- AddTrajecoryToWorkbook(workbook, trajectories);
- MemoryStream memoryStream = new MemoryStream();
- workbook.SaveAs(memoryStream, new SaveOptions { });
- memoryStream.Seek(0, SeekOrigin.Begin);
- return memoryStream;
- }
-
- private void AddTrajecoryToWorkbook(XLWorkbook workbook, IEnumerable trajectories)
- {
- if (trajectories.Any())
- {
- var sheet = workbook.GetWorksheet(sheetName);
- AddTrajecoryToSheet(sheet, trajectories);
- }
- }
-
- private void AddTrajecoryToSheet(IXLWorksheet sheet, IEnumerable trajectories)
- {
- var rowList = trajectories.ToList();
- for (int i = 0; i < rowList.Count; i++)
- {
- var row = sheet.Row(1 + i + headerRowsCount);
- AddCoordinatesToRow(row, rowList[i]);
- }
- }
- }
-}
+ protected override Task> GetDtosAsync(WellRelatedExportRequest options, CancellationToken token) =>
+ trajectoryRepository.GetAsync(options.IdWell, token);
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs
index 2662d62a..40b7d1c8 100644
--- a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs
+++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactManualExportService.cs
@@ -1,35 +1,28 @@
-using AsbCloudApp.Data.Trajectory;
+using System.Threading;
+using System.Threading.Tasks;
+using AsbCloudApp.Data.Trajectory;
using AsbCloudApp.Repositories;
+using AsbCloudApp.Requests.ExportOptions;
using AsbCloudApp.Services;
-using ClosedXML.Excel;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates;
-namespace AsbCloudInfrastructure.Services.Trajectory.Export
+namespace AsbCloudInfrastructure.Services.Trajectory.Export;
+
+public class TrajectoryFactManualExportService : TrajectoryExportService
{
+ public TrajectoryFactManualExportService(IWellService wellService,
+ ITrajectoryEditableRepository trajectoryRepository)
+ : base(wellService, trajectoryRepository)
+ {
+ }
- public class TrajectoryFactManualExportService : TrajectoryExportService
- {
- public override string templateFileName { get; } = "TrajectoryFactManualTemplate.xlsx";
- public override string usingTemplateFile { get; } = "AsbCloudInfrastructure.Services.Trajectory.Templates";
- public override string sheetName { get; } = "Фактическая траектория";
- public override int headerRowsCount { get; } = 2;
-
- public TrajectoryFactManualExportService(
- IWellService wellService,
- ITrajectoryEditableRepository factTrajectoryService)
- : base(wellService, factTrajectoryService)
- {
-
- }
-
- protected override void AddCoordinatesToRow(IXLRow row, TrajectoryGeoFactDto trajectory)
- {
- row.Cell(1).SetCellValue(trajectory.WellboreDepth);
- row.Cell(2).SetCellValue(trajectory.ZenithAngle);
- row.Cell(3).SetCellValue(trajectory.AzimuthGeo);
- row.Cell(4).SetCellValue(trajectory.AzimuthMagnetic);
- row.Cell(5).SetCellValue(trajectory.VerticalDepth);
- row.Cell(6).SetCellValue(trajectory.Comment);
- }
- }
-}
+ protected override ITemplateParameters TemplateParameters => new TrajectoryFactManualTemplate();
+
+ protected override async Task BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token)
+ {
+ var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token);
+ return $"{caption}_Фактическая_траектория.xlsx";
+ }
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs
index c32e6cff..3b3206f5 100644
--- a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs
+++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryFactNnbExportService.cs
@@ -1,35 +1,28 @@
-using AsbCloudApp.Data.Trajectory;
+using System.Threading;
+using System.Threading.Tasks;
+using AsbCloudApp.Data.Trajectory;
using AsbCloudApp.Repositories;
+using AsbCloudApp.Requests.ExportOptions;
using AsbCloudApp.Services;
-using ClosedXML.Excel;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates;
-namespace AsbCloudInfrastructure.Services.Trajectory.Export
+namespace AsbCloudInfrastructure.Services.Trajectory.Export;
+
+public class TrajectoryFactNnbExportService : TrajectoryExportService
{
+ public TrajectoryFactNnbExportService(IWellService wellService,
+ ITrajectoryNnbRepository trajectoryRepository)
+ : base(wellService, trajectoryRepository)
+ {
+ }
- public class TrajectoryFactNnbExportService : TrajectoryExportService
- {
- public override string templateFileName { get; } = "TrajectoryFactNnbTemplate.xlsx";
- public override string usingTemplateFile { get; } = "AsbCloudInfrastructure.Services.Trajectory.Templates";
- public override string sheetName { get; } = "Фактическая ннб-траектория";
- public override int headerRowsCount { get; } = 2;
+ protected override ITemplateParameters TemplateParameters => new TrajectoryFactNnbTemplate();
- public TrajectoryFactNnbExportService(
- IWellService wellService,
- ITrajectoryNnbRepository nnbTrajectoryService)
- : base(wellService, nnbTrajectoryService)
- {
-
- }
-
- protected override void AddCoordinatesToRow(IXLRow row, TrajectoryGeoFactDto trajectory)
- {
- row.Cell(1).SetCellValue(trajectory.WellboreDepth);
- row.Cell(2).SetCellValue(trajectory.ZenithAngle);
- row.Cell(3).SetCellValue(trajectory.AzimuthGeo);
- row.Cell(4).SetCellValue(trajectory.AzimuthMagnetic);
- row.Cell(5).SetCellValue(trajectory.VerticalDepth);
- row.Cell(6).SetCellValue(trajectory.Comment);
- }
- }
-}
+ protected override async Task BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token)
+ {
+ var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token);
+ return $"{caption}_Траектория_ННБ.xlsx";
+ }
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlanExportService.cs b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlanExportService.cs
index 403ceccc..37bce068 100644
--- a/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlanExportService.cs
+++ b/AsbCloudInfrastructure/Services/Trajectory/Export/TrajectoryPlanExportService.cs
@@ -1,38 +1,28 @@
-using AsbCloudApp.Data.Trajectory;
+using System.Threading;
+using System.Threading.Tasks;
+using AsbCloudApp.Data.Trajectory;
using AsbCloudApp.Repositories;
+using AsbCloudApp.Requests.ExportOptions;
using AsbCloudApp.Services;
-using ClosedXML.Excel;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates;
-namespace AsbCloudInfrastructure.Services.Trajectory.Export
+namespace AsbCloudInfrastructure.Services.Trajectory.Export;
+
+public class TrajectoryPlanExportService : TrajectoryExportService
{
- public class TrajectoryPlanExportService : TrajectoryExportService
- {
- /*
- * password for PlannedTrajectoryTemplate.xlsx is Drill2022
- */
- public override string templateFileName { get; } = "TrajectoryPlanTemplate.xlsx";
- public override string usingTemplateFile { get; } = "AsbCloudInfrastructure.Services.Trajectory.Templates";
- public override string sheetName { get; } = "Плановая траектория";
- public override int headerRowsCount { get; } = 2;
+ public TrajectoryPlanExportService(IWellService wellService,
+ ITrajectoryEditableRepository trajectoryRepository)
+ : base(wellService, trajectoryRepository)
+ {
+ }
- public TrajectoryPlanExportService(
- IWellService wellService,
- ITrajectoryEditableRepository trajectoryPlanService)
- : base(wellService, trajectoryPlanService)
- {
- }
+ protected override ITemplateParameters TemplateParameters => new TrajectoryPlanTemplate();
- protected override void AddCoordinatesToRow(IXLRow row, TrajectoryGeoPlanDto trajectory)
- {
- row.Cell(1).SetCellValue(trajectory.WellboreDepth);
- row.Cell(2).SetCellValue(trajectory.ZenithAngle);
- row.Cell(3).SetCellValue(trajectory.AzimuthGeo);
- row.Cell(4).SetCellValue(trajectory.AzimuthMagnetic);
- row.Cell(5).SetCellValue(trajectory.VerticalDepth);
- row.Cell(6).SetCellValue(trajectory.Radius);
- row.Cell(7).SetCellValue(trajectory.Comment);
- }
- }
-
-}
+ protected override async Task BuildFileNameAsync(WellRelatedExportRequest options, CancellationToken token)
+ {
+ var caption = await wellService.GetWellCaptionByIdAsync(options.IdWell, token);
+ return $"{caption}_Плановая_Траектория.xlsx";
+ }
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryFactManualParser.cs b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryFactManualParser.cs
index 5de4e2c5..19b2ebed 100644
--- a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryFactManualParser.cs
+++ b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryFactManualParser.cs
@@ -1,24 +1,10 @@
-using System.Collections.Generic;
-using AsbCloudApp.Data.Trajectory;
-using AsbCloudInfrastructure.Services.Parser;
+using AsbCloudApp.Data.Trajectory;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates;
namespace AsbCloudInfrastructure.Services.Trajectory.Parser;
-public class TrajectoryFactManualParser : ParserExcelService
+public class TrajectoryFactManualParser : TrajectoryParser
{
- protected override string SheetName => "Фактическая траектория";
-
- protected override int HeaderRowsCount => 2;
-
- protected override string TemplateFileName => "TrajectoryFactManualTemplate.xlsx";
-
- protected override IDictionary Cells => new Dictionary
- {
- { nameof(TrajectoryGeoFactDto.WellboreDepth), new Cell(1, typeof(double)) },
- { nameof(TrajectoryGeoFactDto.ZenithAngle), new Cell(2, typeof(double)) },
- { nameof(TrajectoryGeoFactDto.AzimuthGeo), new Cell(3, typeof(double)) },
- { nameof(TrajectoryGeoFactDto.AzimuthMagnetic), new Cell(4, typeof(double)) },
- { nameof(TrajectoryGeoFactDto.VerticalDepth), new Cell(5, typeof(double)) },
- { nameof(TrajectoryGeoFactDto.Comment), new Cell(6, typeof(string)) }
- };
+ protected override ITemplateParameters TemplateParameters => new TrajectoryFactManualTemplate();
}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryParser.cs b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryParser.cs
new file mode 100644
index 00000000..f2aca93d
--- /dev/null
+++ b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryParser.cs
@@ -0,0 +1,21 @@
+using System.IO;
+using AsbCloudApp.Data;
+using AsbCloudApp.Data.Trajectory;
+using AsbCloudApp.Requests.ParserOptions;
+using AsbCloudInfrastructure.Services.ExcelServices;
+
+namespace AsbCloudInfrastructure.Services.Trajectory.Parser;
+
+public abstract class TrajectoryParser : ParserExcelService
+ where TDto : TrajectoryGeoDto
+{
+ public override ParserResultDto Parse(Stream file, WellRelatedParserRequest options)
+ {
+ var result = base.Parse(file, options);
+
+ foreach (var item in result.Item)
+ item.Item.IdWell = options.IdWell;
+
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryPlanParser.cs b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryPlanParser.cs
index 4c100766..d99f0b9f 100644
--- a/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryPlanParser.cs
+++ b/AsbCloudInfrastructure/Services/Trajectory/Parser/TrajectoryPlanParser.cs
@@ -1,25 +1,10 @@
-using System.Collections.Generic;
-using AsbCloudApp.Data.Trajectory;
-using AsbCloudInfrastructure.Services.Parser;
+using AsbCloudApp.Data.Trajectory;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates;
+using AsbCloudInfrastructure.Services.ExcelServices.Templates.TrajectoryTemplates;
namespace AsbCloudInfrastructure.Services.Trajectory.Parser;
-public class TrajectoryPlanParser : ParserExcelService
+public class TrajectoryPlanParser : TrajectoryParser
{
- protected override string SheetName => "Плановая траектория";
-
- protected override int HeaderRowsCount => 2;
-
- protected override string TemplateFileName => "TrajectoryPlanTemplate.xlsx";
-
- protected override IDictionary Cells => new Dictionary
- {
- { nameof(TrajectoryGeoPlanDto.WellboreDepth), new Cell(1, typeof(double)) },
- { nameof(TrajectoryGeoPlanDto.ZenithAngle), new Cell(2, typeof(double)) },
- { nameof(TrajectoryGeoPlanDto.AzimuthGeo), new Cell(3, typeof(double)) },
- { nameof(TrajectoryGeoPlanDto.AzimuthMagnetic), new Cell(4, typeof(double)) },
- { nameof(TrajectoryGeoPlanDto.VerticalDepth), new Cell(5, typeof(double)) },
- { nameof(TrajectoryGeoPlanDto.Radius), new Cell(6, typeof(double)) },
- { nameof(TrajectoryGeoPlanDto.Comment), new Cell(7, typeof(string)) }
- };
+ protected override ITemplateParameters TemplateParameters => new TrajectoryPlanTemplate();
}
\ No newline at end of file
diff --git a/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs
new file mode 100644
index 00000000..6ba97ea0
--- /dev/null
+++ b/AsbCloudInfrastructure/Services/WellCompositeOperationService.cs
@@ -0,0 +1,220 @@
+using AsbCloudApp.Data;
+using AsbCloudApp.Repositories;
+using AsbCloudApp.Requests;
+using AsbCloudApp.Services;
+using AsbCloudDb.Model;
+using Microsoft.EntityFrameworkCore;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace AsbCloudInfrastructure.Services
+{
+ public class WellCompositeOperationService : IWellCompositeOperationService
+ {
+ private ICrudRepository wellSectionTypeRepository;
+ private IWellOperationCategoryRepository wellOperationCategoryRepository;
+ private IWellOperationRepository wellOperationRepository;
+
+ ///
+ /// Тип секции "Транспортный стол"
+ ///
+ private const int wellSectionTransportTable = 5;
+
+ ///
+ /// Тип секции "Эксплуатационная колонна"
+ ///
+ private const int wellSectionProductionString = 4;
+
+
+ ///
+ /// набор настроек для замены одной категории секции на другую
+ ///
+ private static Dictionary<(int, int), int> SettingsForSectionCategoryChange = new Dictionary<(int, int), int>() {
+ { (2, 5096), 5013 },
+ { (2, 5008), 5013 },
+ { (3, 5096), 5084 },
+ { (3, 5008), 5084 },
+ { (3, 5085), 5015 },
+ { (3, 5014), 5015 },
+ { (31, 5014), 5015 },
+ { (31, 5012), 5013 },
+ { (31, 5083), 5013 },
+ { (4, 5085), 5015 },
+ { (4, 5087), 5015 },
+ { (4, 5014), 5015 },
+ { (4, 5053), 5037 },
+ { (4, 5084), 5096 },
+ { (4, 5086), 5013 },
+ { (6, 5085), 5015 },
+ { (6, 5036), 5034 },
+ { (6, 5035), 5097 }
+ };
+
+ private HashSet<(int IdSectionType, int IdCategory)> WellSectionTypesWithCategories = new HashSet<(int IdSectionType, int IdCategory)>()
+ {
+ { (2, 5001) },
+ { (2, 5003) },
+ { (2, 5013) },
+ { (2, 5000) },
+ { (2, 5022) },
+ { (2, 5017) },
+ { (2, 5023) },
+ { (2, 4007) },
+ { (2, 5090) },
+ { (3, 5001) },
+ { (3, 5015) },
+ { (3, 5037) },
+ { (3, 5057) },
+ { (3, 5003) },
+ { (3, 5036) },
+ { (3, 5084) },
+ { (3, 5013) },
+ { (3, 5000) },
+ { (3, 5022) },
+ { (3, 5017) },
+ { (3, 4007) },
+ { (3, 5090) },
+ { (3, 5045) },
+ { (3, 5042) },
+ { (3, 5046) },
+ { (31, 5001) },
+ { (31, 5015) },
+ { (31, 5037) },
+ { (31, 5057) },
+ { (31, 5003) },
+ { (31, 5036) },
+ { (31, 5013) },
+ { (31, 5022) },
+ { (31, 5017) },
+ { (31, 5023) },
+ { (31, 4007) },
+ { (31, 5045) },
+ { (31, 5042) },
+ { (31, 5046) },
+ { (4, 5001) },
+ { (4, 5015) },
+ { (4, 5046) },
+ { (4, 5037) },
+ { (4, 5097) },
+ { (4, 5057) },
+ { (4, 5003) },
+ { (4, 5036) },
+ { (4, 5008) },
+ { (4, 5003) },
+ { (4, 5036) },
+ { (4, 5013) },
+ { (4, 5000) },
+ { (4, 5029) },
+ { (4, 5022) },
+ { (4, 5017) },
+ { (4, 5019) },
+ { (4, 5042) },
+ { (4, 5046) },
+ { (6, 5001) },
+ { (6, 5015) },
+ { (6, 5034) },
+ { (6, 5037) },
+ { (6, 5097) },
+ { (6, 5057) },
+ { (6, 5003) }
+ };
+
+
+
+ public WellCompositeOperationService(
+ ICrudRepository wellSectionTypeRepository,
+ IWellOperationCategoryRepository wellOperationCategoryRepository,
+ IWellOperationRepository wellOperationRepository)
+ {
+ this.wellSectionTypeRepository = wellSectionTypeRepository;
+ this.wellOperationCategoryRepository = wellOperationCategoryRepository;
+ this.wellOperationRepository = wellOperationRepository;
+ }
+
+ public async Task>> GetAsync(IEnumerable idsWells, CancellationToken token)
+ {
+ var sections = await wellSectionTypeRepository.GetAllAsync(token);
+ var sectionsDict = sections.ToDictionary(s => s.Id, s => s.Caption);
+
+ var categories = wellOperationCategoryRepository.Get(true);
+ var categoriesDict = categories.ToDictionary(s => s.Id, s => s.Name);
+
+ var idsWellSectionTypes = WellSectionTypesWithCategories.Select(t => t.IdSectionType).Distinct();
+ var usedCategories = WellSectionTypesWithCategories.Select(c => c.IdCategory).Distinct();
+
+ var wellOperationRequest = new WellsOperationRequest()
+ {
+ IdsWell = idsWells,
+ OperationCategoryIds = usedCategories,
+ SectionTypeIds = idsWellSectionTypes,
+ OperationType = WellOperation.IdOperationTypeFact
+ };
+ var operations = await wellOperationRepository.GetAsync(wellOperationRequest, token);
+
+ var renamedOperations = operations.Select(o => UpdateIdWellSectionAndIdCategory(o, sectionsDict, categoriesDict));
+
+ var wellOperationsWithComposite = new List>();
+ var compositeDepth = 0d;
+ foreach ((int IdSection, int IdCategory) in WellSectionTypesWithCategories)
+ {
+ var filteredByTemplate = renamedOperations
+ .Where(o => o.IdWellSectionType == IdSection)
+ .Where(o => o.IdCategory == IdCategory);
+
+ if (!filteredByTemplate.Any())
+ continue;
+
+ var groupedByWell = filteredByTemplate.GroupBy(o => o.IdWell);
+
+ var aggreagtedByWell = groupedByWell.Select(g => new WellOperationDataDto
+ {
+ IdCategory = IdCategory,
+ IdWell = g.Key,
+ IdWellSectionType = IdSection,
+ DepthStart = g.Min(o => o.DepthStart),
+ DurationHours = g.Sum(o => o.DurationHours),
+ OperationCategoryName = g.First().OperationCategoryName,
+ WellSectionTypeCaption = g.First().WellSectionTypeCaption,
+ });
+
+ var composite = aggreagtedByWell.OrderBy(o => o.DurationHours).
+ ThenByDescending(o => o.DepthStart)
+ .First();
+
+ composite.IdWell = 0;
+ if (compositeDepth > composite.DepthStart)
+ composite.DepthStart = compositeDepth;
+
+ compositeDepth = composite.DepthStart;
+
+ var resultItem = aggreagtedByWell.ToDictionary(o => o.IdWell);
+ resultItem.Add(0, composite);
+
+ wellOperationsWithComposite.Add(resultItem);
+ }
+ return wellOperationsWithComposite;
+ }
+
+ private static WellOperationDataDto UpdateIdWellSectionAndIdCategory(
+ WellOperationDataDto dto,
+ Dictionary sectionTypes,
+ Dictionary operationCategories)
+ {
+ if (dto.IdWellSectionType == wellSectionTransportTable)
+ {
+ dto.IdWellSectionType = wellSectionProductionString;
+ dto.WellSectionTypeCaption = sectionTypes[dto.IdWellSectionType] ?? string.Empty;
+ }
+
+ if ((SettingsForSectionCategoryChange.TryGetValue((dto.IdWellSectionType, dto.IdCategory), out int newIdCategory)))
+ {
+ dto.IdCategory = newIdCategory;
+ dto.OperationCategoryName = operationCategories[dto.IdCategory] ?? string.Empty;
+ }
+
+ return dto;
+ }
+ }
+}
diff --git a/AsbCloudWebApi.IntegrationTests/BaseIntegrationTest.cs b/AsbCloudWebApi.IntegrationTests/BaseIntegrationTest.cs
index add2e07b..aeaab07f 100644
--- a/AsbCloudWebApi.IntegrationTests/BaseIntegrationTest.cs
+++ b/AsbCloudWebApi.IntegrationTests/BaseIntegrationTest.cs
@@ -4,15 +4,23 @@ using Xunit;
namespace AsbCloudWebApi.IntegrationTests;
-public abstract class BaseIntegrationTest : IClassFixture
+public abstract class BaseIntegrationTest : IClassFixture,
+ IDisposable
{
protected readonly IServiceScope scope;
-
- protected readonly IAsbCloudDbContext dbContext;
+
+ protected readonly AsbCloudDbContext dbContext;
protected BaseIntegrationTest(WebAppFactoryFixture factory)
{
scope = factory.Services.CreateScope();
- dbContext = scope.ServiceProvider.GetRequiredService();
+
+ dbContext = scope.ServiceProvider.GetRequiredService();
+ }
+
+ public void Dispose()
+ {
+ scope.Dispose();
+ dbContext.Dispose();
}
}
\ No newline at end of file
diff --git a/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs b/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs
index 2a151573..93ce768b 100644
--- a/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs
+++ b/AsbCloudWebApi.IntegrationTests/Clients/IProcessMapPlanDrillingClient.cs
@@ -35,5 +35,5 @@ public interface IProcessMapPlanDrillingClient
[Multipart]
[Post(BaseRoute + "/parse")]
- Task>> Parse(int idWell, [AliasAs("files")] IEnumerable streams);
+ Task>> Parse(int idWell, [AliasAs("file")] StreamPart stream);
}
diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/AdminDepositControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/AdminDepositControllerTest.cs
index 331c7b7d..06ce5f69 100644
--- a/AsbCloudWebApi.IntegrationTests/Controllers/AdminDepositControllerTest.cs
+++ b/AsbCloudWebApi.IntegrationTests/Controllers/AdminDepositControllerTest.cs
@@ -1,6 +1,5 @@
using System.Net;
using AsbCloudApp.Data;
-using AsbCloudDb.Model;
using AsbCloudWebApi.IntegrationTests.Clients;
using Mapster;
using Microsoft.EntityFrameworkCore;
@@ -27,8 +26,6 @@ public class AdminDepositControllerTest : BaseIntegrationTest
: base(factory)
{
client = factory.GetAuthorizedHttpClient(string.Empty);
-
- dbContext.CleanupDbSet();
}
[Fact]
@@ -130,11 +127,8 @@ public class AdminDepositControllerTest : BaseIntegrationTest
[Fact]
public async Task GetOrDefault_returns_NoContent_for_IdDeposit()
{
- //arrange
- const int idInvalid = 0;
-
//act
- var responce = await client.GetOrDefaultAsync(idInvalid);
+ var responce = await client.GetOrDefaultAsync(0);
//assert
Assert.Equal(HttpStatusCode.NoContent, responce.StatusCode);
@@ -143,9 +137,6 @@ public class AdminDepositControllerTest : BaseIntegrationTest
[Fact]
public async Task GetAll_returns_success()
{
- //arrange
- await client.InsertAsync(dto);
-
//act
var response = await client.GetAllAsync();
@@ -155,10 +146,6 @@ public class AdminDepositControllerTest : BaseIntegrationTest
var expectedCount = await dbContext.Deposits.CountAsync();
Assert.Equal(expectedCount, response.Content.Count());
-
- var deposit = response.Content.First();
- var excludeProps = new[] { nameof(DepositBaseDto.Id) };
- MatchHelper.Match(dto, deposit, excludeProps);
}
[Fact]
@@ -182,11 +169,8 @@ public class AdminDepositControllerTest : BaseIntegrationTest
[Fact]
public async Task Delete_returns_NoContent_IdDeposit()
{
- //arrange
- const int idInvalid = 0;
-
//act
- var response = await client.DeleteAsync(idInvalid);
+ var response = await client.DeleteAsync(0);
//assert
Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);
diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs
index 0ff8bb97..4701ee15 100644
--- a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs
+++ b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapPlanDrillingControllerTest.cs
@@ -15,6 +15,8 @@ namespace AsbCloudWebApi.IntegrationTests.Controllers.ProcessMapPlan;
public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
{
+ private const int IdWell = 1;
+
private readonly ProcessMapPlanDrillingDto dto = new (){
Id = 0,
Creation = new(),
@@ -22,14 +24,13 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
IdState = 0,
IdPrevious = null,
- IdWell = 1,
+ IdWell = IdWell,
Section = "Кондуктор",
IdWellSectionType = 3,
DepthStart = 0.5,
DepthEnd = 1.5,
IdMode = 1,
- Mode = "Ротор",
AxialLoadPlan = 2.718281,
AxialLoadLimitMax = 3.1415926,
DeltaPressurePlan = 4,
@@ -55,7 +56,7 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
IdState = AsbCloudDb.Model.ChangeLogAbstract.IdStateActual,
IdPrevious = null,
- IdWell = 1,
+ IdWell = IdWell,
IdWellSectionType = 1,
DepthStart = 0.5,
DepthEnd = 1.5,
@@ -115,7 +116,6 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
nameof(ProcessMapPlanDrillingDto.IdState),
nameof(ProcessMapPlanDrillingDto.Author),
nameof(ProcessMapPlanDrillingDto.Creation),
- nameof(ProcessMapPlanDrillingDto.Mode),
nameof(ProcessMapPlanDrillingDto.Section)
};
MatchHelper.Match(expected, actual, excludeProps);
@@ -148,21 +148,7 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
//assert
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
}
-
- [Fact]
- public async Task InsertRange_returns_BadRequest_for_IdWell()
- {
- //arrange
- var badDto = dto.Adapt();
- badDto.IdWell = int.MaxValue;
-
- //act
- var response = await client.InsertRange(dto.IdWell, new[] { badDto });
-
- //assert
- Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
- }
-
+
[Fact]
public async Task ClearAndInsertRange_returns_success()
{
@@ -214,6 +200,7 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
entry.State = EntityState.Detached;
var dtoUpdate = dto.Adapt();
+ dtoUpdate.IdWell = 0;
dtoUpdate.Id = entry.Entity.Id;
dtoUpdate.Comment = "nebuchadnezzar";
dtoUpdate.DeltaPressureLimitMax++;
@@ -275,6 +262,7 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
var expected = dtoUpdate.Adapt();
var excludeProps = new[] {
nameof(ProcessMapPlanDrilling.Id),
+ nameof(ProcessMapPlanDrilling.IdWell),
nameof(ProcessMapPlanDrilling.Author),
nameof(ProcessMapPlanDrilling.IdAuthor),
nameof(ProcessMapPlanDrilling.Editor),
@@ -346,7 +334,6 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
Assert.InRange(actual.Obsolete.Value, startTime, doneTime);
}
-
[Fact]
public async Task GetDatesChange_returns_success()
{
@@ -358,7 +345,7 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
dbset.Add(entity);
dbset.Add(entity2);
dbContext.SaveChanges();
- var timezoneHours = Data.Defaults.Wells[0].Timezone.Hours;
+ var timezoneHours = Defaults.Timezone.Hours;
var offset = TimeSpan.FromHours(timezoneHours);
var dates = new[] { entity.Creation, entity2.Creation }
.Select(d => d.ToOffset(offset))
@@ -537,7 +524,7 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
dbContext.SaveChanges();
- var timezoneHours = Data.Defaults.Wells[0].Timezone.Hours;
+ var timezoneHours = Defaults.Timezone.Hours;
var offset = TimeSpan.FromHours(timezoneHours);
var updateFrom = entity.Creation.ToOffset(offset).AddHours(0.5);
@@ -572,9 +559,10 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
const string fileName = "ProcessMapPlanDrillingValid.xlsx";
var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName);
- //act
var streamPart = new StreamPart(stream, fileName, "application/octet-stream");
- var response = await client.Parse(Defaults.Wells[0].Id, new[] { streamPart });
+
+ //act
+ var response = await client.Parse(IdWell, streamPart);
//assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
@@ -601,9 +589,10 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
const string fileName = "ProcessMapPlanDrillingInvalid.xlsx";
var stream = Assembly.GetExecutingAssembly().GetFileCopyStream(fileName);
- //act
var streamPart = new StreamPart(stream, fileName, "application/octet-stream");
- var response = await client.Parse(Defaults.Wells[0].Id, new[] { streamPart });
+
+ //act
+ var response = await client.Parse(IdWell, streamPart);
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
@@ -619,4 +608,4 @@ public class ProcessMapPlanDrillingControllerTest: BaseIntegrationTest
Assert.False(row.IsValid);
Assert.Equal(2, row.Warnings.Count());
}
-}
+}
\ No newline at end of file
diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapReportDrillingControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapReportDrillingControllerTest.cs
index 3083d514..7de0acd5 100644
--- a/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapReportDrillingControllerTest.cs
+++ b/AsbCloudWebApi.IntegrationTests/Controllers/ProcessMapPlan/ProcessMapReportDrillingControllerTest.cs
@@ -2,314 +2,255 @@
using AsbCloudDb.Model;
using AsbCloudDb.Model.ProcessMaps;
using AsbCloudWebApi.IntegrationTests.Clients;
-using Org.BouncyCastle.Asn1.Ocsp;
using System.Net;
-using System.Net.Http.Headers;
+using AsbCloudWebApi.IntegrationTests.Data;
using Xunit;
namespace AsbCloudWebApi.IntegrationTests.Controllers.ProcessMapPlan;
public class ProcessMapReportDrillingControllerTest : BaseIntegrationTest
{
+ private IProcessMapReportDrilling client;
- private readonly WellSectionType wellSection = new WellSectionType()
- {
- Id = 1,
- Caption = "Секция 1",
- Order = 1
- };
+ public ProcessMapReportDrillingControllerTest(WebAppFactoryFixture factory)
+ : base(factory)
+ {
+ dbContext.CleanupDbSet();
+ dbContext.CleanupDbSet();
+ client = factory.GetAuthorizedHttpClient(string.Empty);
+ }
- private readonly WellOperationCategory wellOperationCategory = new WellOperationCategory()
- {
- Id = 1,
- IdParent = null,
- KeyValueName = "Name",
- Name = "Name"
- };
+ [Fact]
+ public async Task Get_rtk_report_by_default_request_returns_success()
+ {
+ //arrange
+ var well = dbContext.Wells.First();
- private readonly WellOperation wellOperation = new WellOperation()
- {
- CategoryInfo = "CategoryInfo",
- Id = 10,
- Comment = "Comment",
- DateStart = DateTimeOffset.UtcNow,
- DepthEnd = 1,
- DepthStart = 0.6,
- DurationHours = 10,
- IdCategory = 1,
- IdPlan = null,
- IdType = 1,
- IdUser = 1,
- IdWell = 1,
- IdWellSectionType = 1,
- LastUpdateDate = DateTimeOffset.UtcNow
- };
+ var processMapPlanDrilling = CreateProcessMapPlanDrilling(well.Id);
+ dbContext.ProcessMapPlanDrilling.Add(processMapPlanDrilling);
- private readonly List dataSaubStats = new List()
- {
+ var wellOperation = CreateWellOperation(well.Id);
+ dbContext.WellOperations.Add(wellOperation);
- new DataSaubStat()
- {
- AxialLoad = 0,
- AxialLoadLimitMax = 10,
- AxialLoadSp = 8,
- BlockSpeedSp = 50.0,
- DateEnd = DateTimeOffset.UtcNow.AddMinutes(40),
- DateStart = DateTimeOffset.UtcNow.AddMinutes(30),
- DepthEnd = 85.99299621582031,
- DepthStart = 85.9260025024414,
- EnabledSubsystems = 0,
- Flow = 10,
- HasOscillation = true,
- Id = 1,
- IdCategory = 1,
- IdFeedRegulator = 0,
- IdTelemetry = 1,
- Pressure = 24,
- PressureIdle = 0,
- PressureSp = 40,
- RotorSpeed = 11.3,
- RotorTorque = 1,
- RotorTorqueLimitMax = 26.5,
- RotorTorqueSp = 5,
- Speed = 80.3924560546875
- },
- new DataSaubStat()
- {
- AxialLoad = 2,
- AxialLoadLimitMax = 10.0,
- AxialLoadSp = 8,
- BlockSpeedSp = 20,
- DateEnd = DateTimeOffset.UtcNow.AddMinutes(30),
- DateStart = DateTimeOffset.UtcNow.AddMinutes(20),
- DepthEnd = 86.28099822998047,
- DepthStart = 86.21900177001953,
- EnabledSubsystems = 1,
- Flow = 20,
- HasOscillation = true,
- Id = 2,
- IdCategory = 1,
- IdFeedRegulator = 1,
- IdTelemetry = 1,
- Pressure = 30,
- PressureIdle = 20,
- PressureSp = 40,
- RotorSpeed = 11.251153300212916,
- RotorTorque = 7,
- RotorTorqueLimitMax = 26.5,
- RotorTorqueSp = 9,
- Speed = 74.395751953125
- },
- new DataSaubStat()
- {
- AxialLoad = 4,
- AxialLoadLimitMax = 15.0,
- AxialLoadSp = 8,
- BlockSpeedSp = 110.0,
- DateEnd = DateTimeOffset.UtcNow.AddMinutes(20),
- DateStart = DateTimeOffset.UtcNow.AddMinutes(10),
- DepthEnd = 106.7490005493164,
- DepthStart = 106.47899627685547,
- EnabledSubsystems = 1,
- Flow = 30,
- HasOscillation = true,
- Id = 3,
- IdCategory = 1,
- IdFeedRegulator = 1,
- IdTelemetry = 1,
- Pressure = 36,
- PressureIdle = 23.0,
- PressureSp = 63.0,
- RotorSpeed = 11.334207942999628,
- RotorTorque = 14,
- RotorTorqueLimitMax = 15.0,
- RotorTorqueSp = 13,
- Speed = 108.001708984375
- }
- };
+ var dataSaubStats = CreateDataSaubStats(well.IdTelemetry!.Value, wellOperation.IdCategory);
+ dbContext.DataSaubStat.AddRange(dataSaubStats);
+ await dbContext.SaveChangesAsync();
+ //act
+ var request = new DataSaubStatRequest();
+ var response = await client.GetReportAsync(well.Id, request, CancellationToken.None);
+ //assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.NotNull(response.Content);
+ Assert.Equal(dataSaubStats.Count() - 1, response.Content.Count());
+ }
- private readonly ProcessMapPlanDrilling entity = new()
- {
- Id = 0,
- IdAuthor = 1,
- IdEditor = null,
- Creation = DateTimeOffset.UtcNow,
- Obsolete = null,
- IdState = AsbCloudDb.Model.ChangeLogAbstract.IdStateActual,
- IdPrevious = null,
+ [Fact]
+ public async Task Get_rtk_report_by_parametrize_request_returns_success()
+ {
+ //arrange
+ var well = dbContext.Wells.First();
- IdWell = 1,
- IdWellSectionType = 1,
- DepthStart = 0.5,
- DepthEnd = 1.5,
+ var processMapPlanDrilling = CreateProcessMapPlanDrilling(well.Id);
+ dbContext.ProcessMapPlanDrilling.Add(processMapPlanDrilling);
- IdMode = 1,
- AxialLoadPlan = 2.718281,
- AxialLoadLimitMax = 3.1415926,
- DeltaPressurePlan = 4,
- DeltaPressureLimitMax = 5,
- TopDriveTorquePlan = 6,
- TopDriveTorqueLimitMax = 7,
- TopDriveSpeedPlan = 8,
- TopDriveSpeedLimitMax = 9,
- FlowPlan = 10,
- FlowLimitMax = 11,
- RopPlan = 12,
- UsageSaub = 13,
- UsageSpin = 14,
- Comment = "это тестовая запись",
- };
+ var wellOperation = CreateWellOperation(well.Id);
+ dbContext.WellOperations.Add(wellOperation);
- private IProcessMapReportDrilling client;
+ var dataSaubStats = CreateDataSaubStats(well.IdTelemetry!.Value, wellOperation.IdCategory);
+ dbContext.DataSaubStat.AddRange(dataSaubStats);
- public ProcessMapReportDrillingControllerTest(WebAppFactoryFixture factory) : base(factory)
- {
- client = factory.GetAuthorizedHttpClient(string.Empty);
- }
+ await dbContext.SaveChangesAsync();
+
+ var request = new DataSaubStatRequest
+ {
+ DeltaAxialLoad = 5,
+ DeltaPressure = 15,
+ DeltaRotorTorque = 10
+ };
+
+ //act
+ var response = await client.GetReportAsync(well.Id, request, CancellationToken.None);
+
+ //assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.NotNull(response.Content);
+ Assert.Equal(1, response.Content.Count());
+ }
+
+ [Fact]
+ public async Task Get_rtk_report_returns_BadRequest()
+ {
+ //act
+ var request = new DataSaubStatRequest()
+ {
+ DeltaAxialLoad = 15,
+ DeltaPressure = 25,
+ DeltaRotorTorque = 20
+ };
+ var response = await client.GetReportAsync(0, request, CancellationToken.None);
+
+ //assert
+ Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
+ }
+
+ [Fact]
+ public async Task Export_rtk_report_returns_success()
+ {
+ //arrange
+ var well = dbContext.Wells.First();
+ var processMapPlanDrilling = CreateProcessMapPlanDrilling(well.Id);
+ dbContext.ProcessMapPlanDrilling.Add(processMapPlanDrilling);
- [Fact]
- public async Task Get_rtk_report_by_default_request_returns_success()
- {
- //arrange
- dbContext.CleanupDbSet();
- var dbset = dbContext.Set();
- dbset.Add(entity);
- entity.Id = 1;
- dbset.Add(entity);
- entity.Id = 2;
- dbset.Add(entity);
+ var wellOperation = CreateWellOperation(well.Id);
+ dbContext.WellOperations.Add(wellOperation);
- var dbSetWellOperationCategory = dbContext.Set();
- dbSetWellOperationCategory.Add(wellOperationCategory);
+ var dataSaubStats = CreateDataSaubStats(well.IdTelemetry!.Value, wellOperation.IdCategory);
+ dbContext.DataSaubStat.AddRange(dataSaubStats);
- var dbSetWellOperation = dbContext.Set();
- dbSetWellOperation.Add(wellOperation);
+ await dbContext.SaveChangesAsync();
+
+ //act
+ var request = new DataSaubStatRequest();
+ var response = await client.ExportReportAsync(1, request, CancellationToken.None);
+
+ //assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.Equal("application/octet-stream", response.ContentHeaders?.ContentType?.MediaType);
+ Assert.True(response.ContentHeaders?.ContentLength > 0);
+ }
- var dbSetDataSaubStat = dbContext.Set();
- dbSetDataSaubStat.AddRange(dataSaubStats);
+ private static WellOperation CreateWellOperation(int idWell) =>
+ new()
+ {
+ CategoryInfo = "CategoryInfo",
+ Comment = "Comment",
+ DateStart = DateTimeOffset.UtcNow,
+ DepthEnd = 1,
+ DepthStart = 0.6,
+ DurationHours = 10,
+ IdCategory = WellOperationCategory.IdSlide,
+ IdPlan = null,
+ IdType = WellOperation.IdOperationTypeFact,
+ IdUser = 1,
+ IdWell = idWell,
+ IdWellSectionType = 1,
+ LastUpdateDate = DateTimeOffset.UtcNow
+ };
- dbContext.SaveChanges();
+ private static ProcessMapPlanDrilling CreateProcessMapPlanDrilling(int idWell) =>
+ new()
+ {
+ IdAuthor = 1,
+ IdEditor = null,
+ Creation = DateTimeOffset.UtcNow,
+ Obsolete = null,
+ IdState = ChangeLogAbstract.IdStateActual,
+ IdPrevious = null,
- //act
- var request = new DataSaubStatRequest();
- var response = await client.GetReportAsync(1, request, CancellationToken.None);
+ IdWell = idWell,
+ IdWellSectionType = 1,
+ DepthStart = 0.5,
+ DepthEnd = 1.5,
- //assert
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- Assert.NotNull(response.Content);
- Assert.Equal(dataSaubStats.Count() - 1, response.Content.Count());
- }
+ IdMode = 1,
+ AxialLoadPlan = 2.718281,
+ AxialLoadLimitMax = 3.1415926,
+ DeltaPressurePlan = 4,
+ DeltaPressureLimitMax = 5,
+ TopDriveTorquePlan = 6,
+ TopDriveTorqueLimitMax = 7,
+ TopDriveSpeedPlan = 8,
+ TopDriveSpeedLimitMax = 9,
+ FlowPlan = 10,
+ FlowLimitMax = 11,
+ RopPlan = 12,
+ UsageSaub = 13,
+ UsageSpin = 14,
+ Comment = "это тестовая запись",
+ };
- [Fact]
- public async Task Get_rtk_report_by_parametrize_request_returns_success()
- {
- //arrange
- dbContext.CleanupDbSet();
- var dbset = dbContext.Set();
- dbset.Add(entity);
- entity.Id = 1;
- dbset.Add(entity);
- entity.Id = 2;
- dbset.Add(entity);
-
- var dbSetWellOperationCategory = dbContext.Set();
- dbSetWellOperationCategory.Add(wellOperationCategory);
-
- var dbSetWellOperation = dbContext.Set();
- dbSetWellOperation.Add(wellOperation);
-
- var dbSetDataSaubStat = dbContext.Set();
- dbSetDataSaubStat.AddRange(dataSaubStats);
-
- dbContext.SaveChanges();
-
- //act
- var request = new DataSaubStatRequest()
- {
- DeltaAxialLoad = 5,
- DeltaPressure = 15,
- DeltaRotorTorque = 10
- };
- var response = await client.GetReportAsync(1, request, CancellationToken.None);
-
- //assert
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- Assert.NotNull(response.Content);
- Assert.Equal(1, response.Content.Count());
- }
-
- [Fact]
- public async Task Get_rtk_report_returns_BadRequest()
- {
- //arrange
- dbContext.CleanupDbSet();
- var dbset = dbContext.Set();
- dbset.Add(entity);
- entity.Id = 1;
- dbset.Add(entity);
- entity.Id = 2;
- dbset.Add(entity);
-
- var dbSetWellOperationCategory = dbContext.Set();
- dbSetWellOperationCategory.Add(wellOperationCategory);
-
- var dbSetWellOperation = dbContext.Set();
- dbSetWellOperation.Add(wellOperation);
-
- var dbSetDataSaubStat = dbContext.Set();
- dbSetDataSaubStat.AddRange(dataSaubStats);
-
- dbContext.SaveChanges();
-
- //act
- var request = new DataSaubStatRequest()
- {
- DeltaAxialLoad = 15,
- DeltaPressure = 25,
- DeltaRotorTorque = 20
- };
- var response = await client.GetReportAsync(1, request, CancellationToken.None);
-
- //assert
- Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
- }
-
- [Fact]
- public async Task Export_rtk_report_returns_success()
- {
- //clear
- dbContext.CleanupDbSet();
-
- //arrange
- var dbset = dbContext.Set();
- dbset.Add(entity);
- entity.Id = 1;
- dbset.Add(entity);
- entity.Id = 2;
- dbset.Add(entity);
-
- var dbSetWellOperationCategory = dbContext.Set();
- dbSetWellOperationCategory.Add(wellOperationCategory);
-
- var dbSetWellOperation = dbContext.Set();
- dbSetWellOperation.Add(wellOperation);
-
- var dbSetDataSaubStat = dbContext.Set();
- dbSetDataSaubStat.AddRange(dataSaubStats);
-
- dbContext.SaveChanges();
-
- //act
- var request = new DataSaubStatRequest();
- var response = await client.ExportReportAsync(1, request, CancellationToken.None);
-
- //assert
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- Assert.Equal("application/octet-stream", response.ContentHeaders?.ContentType?.MediaType);
- Assert.True(response.ContentHeaders?.ContentLength > 0);
- }
-}
+ private static IEnumerable CreateDataSaubStats(int idTelemetry,
+ int idCategory) =>
+ new[]
+ {
+ new DataSaubStat
+ {
+ AxialLoad = 0,
+ AxialLoadLimitMax = 10,
+ AxialLoadSp = 8,
+ BlockSpeedSp = 50.0,
+ DateEnd = DateTimeOffset.UtcNow.AddMinutes(40),
+ DateStart = DateTimeOffset.UtcNow.AddMinutes(30),
+ DepthEnd = 85.99299621582031,
+ DepthStart = 85.9260025024414,
+ EnabledSubsystems = 0,
+ Flow = 10,
+ IdCategory = idCategory,
+ HasOscillation = true,
+ IdFeedRegulator = 0,
+ IdTelemetry = idTelemetry,
+ Pressure = 24,
+ PressureIdle = 0,
+ PressureSp = 40,
+ RotorSpeed = 11.3,
+ RotorTorque = 1,
+ RotorTorqueLimitMax = 26.5,
+ RotorTorqueSp = 5,
+ Speed = 80.3924560546875
+ },
+ new DataSaubStat
+ {
+ AxialLoad = 2,
+ AxialLoadLimitMax = 10.0,
+ AxialLoadSp = 8,
+ BlockSpeedSp = 20,
+ DateEnd = DateTimeOffset.UtcNow.AddMinutes(30),
+ DateStart = DateTimeOffset.UtcNow.AddMinutes(20),
+ DepthEnd = 86.28099822998047,
+ DepthStart = 86.21900177001953,
+ EnabledSubsystems = 1,
+ Flow = 20,
+ HasOscillation = true,
+ IdCategory = idCategory,
+ IdFeedRegulator = 1,
+ IdTelemetry = idTelemetry,
+ Pressure = 30,
+ PressureIdle = 20,
+ PressureSp = 40,
+ RotorSpeed = 11.251153300212916,
+ RotorTorque = 7,
+ RotorTorqueLimitMax = 26.5,
+ RotorTorqueSp = 9,
+ Speed = 74.395751953125
+ },
+ new DataSaubStat
+ {
+ AxialLoad = 4,
+ AxialLoadLimitMax = 15.0,
+ AxialLoadSp = 8,
+ BlockSpeedSp = 110.0,
+ DateEnd = DateTimeOffset.UtcNow.AddMinutes(20),
+ DateStart = DateTimeOffset.UtcNow.AddMinutes(10),
+ DepthEnd = 106.7490005493164,
+ DepthStart = 106.47899627685547,
+ EnabledSubsystems = 1,
+ Flow = 30,
+ HasOscillation = true,
+ IdFeedRegulator = 1,
+ IdTelemetry = idTelemetry,
+ IdCategory = idCategory,
+ Pressure = 36,
+ PressureIdle = 23.0,
+ PressureSp = 63.0,
+ RotorSpeed = 11.334207942999628,
+ RotorTorque = 14,
+ RotorTorqueLimitMax = 15.0,
+ RotorTorqueSp = 13,
+ Speed = 108.001708984375
+ }
+ };
+}
\ No newline at end of file
diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/ScheduleControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/ScheduleControllerTest.cs
index a58e20f1..ad7571a2 100644
--- a/AsbCloudWebApi.IntegrationTests/Controllers/ScheduleControllerTest.cs
+++ b/AsbCloudWebApi.IntegrationTests/Controllers/ScheduleControllerTest.cs
@@ -1,228 +1,228 @@
-using AsbCloudApp.Data;
-using AsbCloudDb.Model;
-using AsbCloudInfrastructure;
-using AsbCloudWebApi.IntegrationTests.Clients;
-using Mapster;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.ChangeTracking;
-using System.Net;
-using Xunit;
-
-namespace AsbCloudWebApi.IntegrationTests.Controllers
-{
- public abstract class CrudWellRelatedClient : BaseIntegrationTest
- where TDto : AsbCloudApp.Data.IId, AsbCloudApp.Data.IWellRelated
- where TEntity : class, AsbCloudDb.Model.IId, AsbCloudDb.Model.IWellRelated
- {
- public abstract IEnumerable ValidDtos { get; }
- public abstract IEnumerable InvalidDtos { get; }
- public abstract IEnumerable ForbiddenDtos { get; }
- protected List ExcludeProps { get; set; } = new() { "Id" };
-
- protected ICrudWellRelatedClient client;
-
- public CrudWellRelatedClient(WebAppFactoryFixture factory, string uriSuffix)
- : base(factory)
- {
- client = factory.GetAuthorizedHttpClient>(uriSuffix);
- }
-
- protected async Task> GetCleanDbSet()
- {
- var dbset = dbContext.Set();
- dbset.RemoveRange(dbset);
- await dbContext.SaveChangesAsync(CancellationToken.None);
- return dbset;
- }
-
- [Fact]
- public async Task Insert_returns_success_for_validDtos()
- {
- foreach (var validDto in ValidDtos)
- await Insert_returns_success(validDto);
- }
-
- private async Task Insert_returns_success(TDto validDto)
- {
- var dbset = await GetCleanDbSet();
-
- //act
- var response = await client.InsertAsync(validDto);
-
- //assert
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- Assert.True(response.Content > 0);
-
- var entity = dbset.First();
- var fromDbDto = Convert(entity);
- MatchHelper.Match(validDto, fromDbDto, ExcludeProps);
- }
-
- [Fact]
- public async Task Insert_returns_badRequest_for_invalidDtos()
- {
- foreach (var inValidDto in InvalidDtos)
- await Insert_returns_badRequest(inValidDto);
- }
-
- private async Task Insert_returns_badRequest(TDto invalidDto)
- {
- await GetCleanDbSet();
-
- //act
- var response = await client.InsertAsync(invalidDto);
-
- //assert
- Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
- }
-
- [Fact]
- public async Task Insert_returns_forbidden_for_forbiddenDtos()
- {
- foreach (var forbiddenDto in ForbiddenDtos)
- await Insert_returns_forbidden(forbiddenDto);
- }
-
- private async Task Insert_returns_forbidden(TDto forbiddenDto)
- {
- await GetCleanDbSet();
-
- //act
- var response = await client.InsertAsync(forbiddenDto);
-
- //assert
- Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode);
- }
-
- [Fact]
- public async Task GetAllAsync_returns_data()
- {
- //arrange
- var dbset = await GetCleanDbSet();
- var entries = new List<(EntityEntry, TDto)>();
-
- foreach (var dto in ValidDtos)
- {
- var entity = Convert(dto);
- entity.Id = 0;
- var entry = dbset.Add(entity);
- entries.Add((entry, dto));
- }
- dbContext.SaveChanges();
-
- //act
- var response = await client.GetAllAsync();
-
- //assert
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- Assert.NotNull(response.Content);
- Assert.Equal(entries.Count, response.Content.Count());
-
- foreach (var item in response.Content)
- {
- var entry = entries.First(e => e.Item1.Entity.Id == item.Id);
- MatchHelper.Match(entry.Item2, item, ExcludeProps);
- }
- }
-
- protected virtual TDto Convert(TEntity entity)
- {
- var dto = entity.Adapt();
- return dto;
- }
-
- protected virtual TEntity Convert(TDto dto)
- {
- var entity = dto.Adapt();
- return entity;
- }
- }
-
- public class ScheduleControllerTest : CrudWellRelatedClient
- {
- static Driller driller = Data.Defaults.Drillers.First();
- static DrillerDto drillerDto = driller.Adapt();
-
- static Well well = Data.Defaults.Wells.First();
-
- public override IEnumerable ValidDtos { get; } = new ScheduleDto[]
- {
- new() {
- Id = 1,
- IdWell = well.Id,
- Driller = drillerDto,
- IdDriller = driller.Id,
- DrillStart = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Unspecified),
- DrillEnd = new DateTime(2024, 1, 2, 0, 0, 0, DateTimeKind.Unspecified),
- ShiftStart = new TimeDto(8, 0, 0),
- ShiftEnd = new TimeDto(20, 0, 0),
- },
- new() {
- Id = 1,
- IdWell = well.Id,
- Driller = drillerDto,
- IdDriller = driller.Id,
- DrillStart = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Unspecified),
- DrillEnd = new DateTime(2024, 1, 2, 0, 0, 0, DateTimeKind.Unspecified),
- ShiftStart = new TimeDto(20, 0, 0),
- ShiftEnd = new TimeDto(8, 0, 0),
- }
- };
-
- public override IEnumerable InvalidDtos { get; } = new ScheduleDto[]
- {
- new() {
- IdWell = well.Id,
- Driller = drillerDto,
- IdDriller = driller.Id,
- DrillStart = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Unspecified),
- DrillEnd = new DateTime(2022, 1, 2, 0, 0, 0, DateTimeKind.Unspecified),
- ShiftStart = new TimeDto(8, 0, 0),
- ShiftEnd = new TimeDto(20, 0, 0),
- },
- new() {
- IdWell = well.Id,
- Driller = drillerDto,
- IdDriller = int.MaxValue - 1,
- DrillStart = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Unspecified),
- DrillEnd = new DateTime(2024, 1, 2, 0, 0, 0, DateTimeKind.Unspecified),
- ShiftStart = new TimeDto(8, 0, 0),
- ShiftEnd = new TimeDto(20, 0, 0),
- }
- };
-
- public override IEnumerable ForbiddenDtos { get; } = new ScheduleDto[] {
- new() {
- IdWell = int.MaxValue - 1,
- Driller = drillerDto,
- IdDriller = driller.Id,
- DrillStart = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Unspecified),
- DrillEnd = new DateTime(2022, 1, 2, 0, 0, 0, DateTimeKind.Unspecified),
- ShiftStart = new TimeDto(8, 0, 0),
- ShiftEnd = new TimeDto(20, 0, 0),
- }
- };
-
- public ScheduleControllerTest(WebAppFactoryFixture factory)
- : base(factory, "api/schedule")
- {
- ExcludeProps.Add(nameof(ScheduleDto.Driller));
- }
-
- protected override ScheduleDto Convert(Schedule entity)
- {
- var dto = base.Convert(entity);
- dto.DrillStart = entity.DrillStart.ToRemoteDateTime(well.Timezone.Hours);
- dto.DrillEnd = entity.DrillEnd.ToRemoteDateTime(well.Timezone.Hours);
- return dto;
- }
-
- protected override Schedule Convert(ScheduleDto dto)
- {
- var entity = base.Convert(dto);
- entity.DrillStart = dto.DrillStart.FromTimeZoneOffsetHours(well.Timezone.Hours);
- entity.DrillEnd = dto.DrillEnd.FromTimeZoneOffsetHours(well.Timezone.Hours);
- return entity;
- }
- }
-}
+// using AsbCloudApp.Data;
+// using AsbCloudDb.Model;
+// using AsbCloudInfrastructure;
+// using AsbCloudWebApi.IntegrationTests.Clients;
+// using Mapster;
+// using Microsoft.EntityFrameworkCore;
+// using Microsoft.EntityFrameworkCore.ChangeTracking;
+// using System.Net;
+// using Xunit;
+//
+// namespace AsbCloudWebApi.IntegrationTests.Controllers
+// {
+// public abstract class CrudWellRelatedClient : BaseIntegrationTest
+// where TDto : AsbCloudApp.Data.IId, AsbCloudApp.Data.IWellRelated
+// where TEntity : class, AsbCloudDb.Model.IId, AsbCloudDb.Model.IWellRelated
+// {
+// public abstract IEnumerable ValidDtos { get; }
+// public abstract IEnumerable InvalidDtos { get; }
+// public abstract IEnumerable ForbiddenDtos { get; }
+// protected List ExcludeProps { get; set; } = new() { "Id" };
+//
+// protected ICrudWellRelatedClient client;
+//
+// public CrudWellRelatedClient(WebAppFactoryFixture factory, string uriSuffix)
+// : base(factory)
+// {
+// client = factory.GetAuthorizedHttpClient>(uriSuffix);
+// }
+//
+// protected async Task> GetCleanDbSet()
+// {
+// var dbset = dbContext.Set();
+// dbset.RemoveRange(dbset);
+// await dbContext.SaveChangesAsync(CancellationToken.None);
+// return dbset;
+// }
+//
+// [Fact]
+// public async Task Insert_returns_success_for_validDtos()
+// {
+// foreach (var validDto in ValidDtos)
+// await Insert_returns_success(validDto);
+// }
+//
+// private async Task Insert_returns_success(TDto validDto)
+// {
+// var dbset = await GetCleanDbSet();
+//
+// //act
+// var response = await client.InsertAsync(validDto);
+//
+// //assert
+// Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+// Assert.True(response.Content > 0);
+//
+// var entity = dbset.First();
+// var fromDbDto = Convert(entity);
+// MatchHelper.Match(validDto, fromDbDto, ExcludeProps);
+// }
+//
+// [Fact]
+// public async Task Insert_returns_badRequest_for_invalidDtos()
+// {
+// foreach (var inValidDto in InvalidDtos)
+// await Insert_returns_badRequest(inValidDto);
+// }
+//
+// private async Task Insert_returns_badRequest(TDto invalidDto)
+// {
+// await GetCleanDbSet();
+//
+// //act
+// var response = await client.InsertAsync(invalidDto);
+//
+// //assert
+// Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
+// }
+//
+// [Fact]
+// public async Task Insert_returns_forbidden_for_forbiddenDtos()
+// {
+// foreach (var forbiddenDto in ForbiddenDtos)
+// await Insert_returns_forbidden(forbiddenDto);
+// }
+//
+// private async Task Insert_returns_forbidden(TDto forbiddenDto)
+// {
+// await GetCleanDbSet();
+//
+// //act
+// var response = await client.InsertAsync(forbiddenDto);
+//
+// //assert
+// Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode);
+// }
+//
+// [Fact]
+// public async Task GetAllAsync_returns_data()
+// {
+// //arrange
+// var dbset = await GetCleanDbSet();
+// var entries = new List<(EntityEntry, TDto)>();
+//
+// foreach (var dto in ValidDtos)
+// {
+// var entity = Convert(dto);
+// entity.Id = 0;
+// var entry = dbset.Add(entity);
+// entries.Add((entry, dto));
+// }
+// dbContext.SaveChanges();
+//
+// //act
+// var response = await client.GetAllAsync();
+//
+// //assert
+// Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+// Assert.NotNull(response.Content);
+// Assert.Equal(entries.Count, response.Content.Count());
+//
+// foreach (var item in response.Content)
+// {
+// var entry = entries.First(e => e.Item1.Entity.Id == item.Id);
+// MatchHelper.Match(entry.Item2, item, ExcludeProps);
+// }
+// }
+//
+// protected virtual TDto Convert(TEntity entity)
+// {
+// var dto = entity.Adapt();
+// return dto;
+// }
+//
+// protected virtual TEntity Convert(TDto dto)
+// {
+// var entity = dto.Adapt();
+// return entity;
+// }
+// }
+//
+// public class ScheduleControllerTest : CrudWellRelatedClient
+// {
+// static Driller driller = Data.Defaults.Drillers.First();
+// static DrillerDto drillerDto = driller.Adapt();
+//
+// static Well well = Data.Defaults.Wells.First();
+//
+// public override IEnumerable ValidDtos { get; } = new ScheduleDto[]
+// {
+// new() {
+// Id = 1,
+// IdWell = well.Id,
+// Driller = drillerDto,
+// IdDriller = driller.Id,
+// DrillStart = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Unspecified),
+// DrillEnd = new DateTime(2024, 1, 2, 0, 0, 0, DateTimeKind.Unspecified),
+// ShiftStart = new TimeDto(8, 0, 0),
+// ShiftEnd = new TimeDto(20, 0, 0),
+// },
+// new() {
+// Id = 1,
+// IdWell = well.Id,
+// Driller = drillerDto,
+// IdDriller = driller.Id,
+// DrillStart = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Unspecified),
+// DrillEnd = new DateTime(2024, 1, 2, 0, 0, 0, DateTimeKind.Unspecified),
+// ShiftStart = new TimeDto(20, 0, 0),
+// ShiftEnd = new TimeDto(8, 0, 0),
+// }
+// };
+//
+// public override IEnumerable InvalidDtos { get; } = new ScheduleDto[]
+// {
+// new() {
+// IdWell = well.Id,
+// Driller = drillerDto,
+// IdDriller = driller.Id,
+// DrillStart = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Unspecified),
+// DrillEnd = new DateTime(2022, 1, 2, 0, 0, 0, DateTimeKind.Unspecified),
+// ShiftStart = new TimeDto(8, 0, 0),
+// ShiftEnd = new TimeDto(20, 0, 0),
+// },
+// new() {
+// IdWell = well.Id,
+// Driller = drillerDto,
+// IdDriller = int.MaxValue - 1,
+// DrillStart = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Unspecified),
+// DrillEnd = new DateTime(2024, 1, 2, 0, 0, 0, DateTimeKind.Unspecified),
+// ShiftStart = new TimeDto(8, 0, 0),
+// ShiftEnd = new TimeDto(20, 0, 0),
+// }
+// };
+//
+// public override IEnumerable ForbiddenDtos { get; } = new ScheduleDto[] {
+// new() {
+// IdWell = int.MaxValue - 1,
+// Driller = drillerDto,
+// IdDriller = driller.Id,
+// DrillStart = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Unspecified),
+// DrillEnd = new DateTime(2022, 1, 2, 0, 0, 0, DateTimeKind.Unspecified),
+// ShiftStart = new TimeDto(8, 0, 0),
+// ShiftEnd = new TimeDto(20, 0, 0),
+// }
+// };
+//
+// public ScheduleControllerTest(WebAppFactoryFixture factory)
+// : base(factory, "api/schedule")
+// {
+// ExcludeProps.Add(nameof(ScheduleDto.Driller));
+// }
+//
+// protected override ScheduleDto Convert(Schedule entity)
+// {
+// var dto = base.Convert(entity);
+// dto.DrillStart = entity.DrillStart.ToRemoteDateTime(well.Timezone.Hours);
+// dto.DrillEnd = entity.DrillEnd.ToRemoteDateTime(well.Timezone.Hours);
+// return dto;
+// }
+//
+// protected override Schedule Convert(ScheduleDto dto)
+// {
+// var entity = base.Convert(dto);
+// entity.DrillStart = dto.DrillStart.FromTimeZoneOffsetHours(well.Timezone.Hours);
+// entity.DrillEnd = dto.DrillEnd.FromTimeZoneOffsetHours(well.Timezone.Hours);
+// return entity;
+// }
+// }
+// }
\ No newline at end of file
diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/SlipsStatControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/SlipsStatControllerTest.cs
index 57eacadf..70f72369 100644
--- a/AsbCloudWebApi.IntegrationTests/Controllers/SlipsStatControllerTest.cs
+++ b/AsbCloudWebApi.IntegrationTests/Controllers/SlipsStatControllerTest.cs
@@ -2,77 +2,38 @@ using AsbCloudApp.Data;
using AsbCloudApp.Requests;
using AsbCloudDb.Model;
using AsbCloudWebApi.IntegrationTests.Clients;
-using Microsoft.EntityFrameworkCore;
using Xunit;
namespace AsbCloudWebApi.IntegrationTests.Controllers;
public class SlipsStatControllerTest : BaseIntegrationTest
{
- private static readonly Schedule schedule = new()
- {
- Id = 0,
- IdDriller = Data.Defaults.Drillers[0].Id,
- IdWell = Data.Defaults.Wells[0].Id,
- ShiftStart = new TimeOnly(8, 0, 0),
- ShiftEnd = new TimeOnly(20, 0, 0),
- DrillStart = new DateTimeOffset(new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc)),
- DrillEnd = new DateTimeOffset(new DateTime(2024, 2, 1, 0, 0, 0, DateTimeKind.Utc))
- };
-
- private static readonly DetectedOperation detectedOperation = new()
- {
- Id = 0,
- IdTelemetry = Data.Defaults.Telemetries[0].Id,
- IdCategory = WellOperationCategory.IdSlipsTime,
- DateStart = new DateTimeOffset(new DateTime(2024, 1, 23, 15, 0, 0, 0, DateTimeKind.Utc)),
- DateEnd = new DateTimeOffset(new DateTime(2024, 1, 23, 15, 2, 0, 0, DateTimeKind.Utc)),
- ExtraData = new Dictionary
- {
- { "test", 5 }
- }
- };
-
- private static readonly WellOperation factWellOperation = new()
- {
- Id = 0,
- IdWell = Data.Defaults.Wells[0].Id,
- IdWellSectionType = 1,
- IdCategory = WellOperationCategory.IdRotor,
- IdType = WellOperation.IdOperationTypeFact,
- DepthStart = 0,
- DepthEnd = 100,
- LastUpdateDate = DateTimeOffset.UtcNow,
- DateStart = new DateTimeOffset(new DateTime(2024, 1, 15, 15, 0, 0, DateTimeKind.Utc)),
- DurationHours = 1
- };
-
private readonly ISlipsTimeClient client;
public SlipsStatControllerTest(WebAppFactoryFixture factory)
: base(factory)
{
- var schedules = dbContext.Set();
- var detectedOperations = dbContext.Set();
- var wellOperations = dbContext.Set();
-
- schedules.RemoveRange(schedules);
- detectedOperations.RemoveRange(detectedOperations);
- wellOperations.RemoveRange(wellOperations);
- dbContext.SaveChanges();
-
- schedules.Add(schedule);
- detectedOperations.Add(detectedOperation);
- wellOperations.Add(factWellOperation);
- dbContext.SaveChanges();
-
client = factory.GetAuthorizedHttpClient(string.Empty);
+
+ dbContext.CleanupDbSet();
+ dbContext.CleanupDbSet();
+ dbContext.CleanupDbSet();
}
[Fact]
public async Task GetAll_returns_success()
{
//arrange
+ var well = dbContext.Wells.First();
+ var schedule = CreateScheduleAsync(well.Id);
+ var factWellOperation = CreateFactWellOperation(well.Id);
+ var detectedOperation = CreateDetectedOperation(well.IdTelemetry!.Value);
+
+ dbContext.Schedule.Add(schedule);
+ dbContext.WellOperations.Add(factWellOperation);
+ dbContext.DetectedOperations.Add(detectedOperation);
+ await dbContext.SaveChangesAsync();
+
var request = new OperationStatRequest
{
DateStartUTC = schedule.DrillStart.DateTime,
@@ -83,7 +44,7 @@ public class SlipsStatControllerTest : BaseIntegrationTest
var dtoExpected = new SlipsStatDto
{
- DrillerName = $"{Data.Defaults.Drillers[0].Surname} {Data.Defaults.Drillers[0].Name} {Data.Defaults.Drillers[0].Patronymic}",
+ DrillerName = $"{schedule.Driller.Surname} {schedule.Driller.Name} {schedule.Driller.Patronymic}",
WellCount = 1,
SectionCaption = "Пилотный ствол",
SlipsCount = 1,
@@ -101,4 +62,46 @@ public class SlipsStatControllerTest : BaseIntegrationTest
var slipsStat = response.Content.First();
MatchHelper.Match(dtoExpected, slipsStat);
}
+
+ private static Schedule CreateScheduleAsync(int idWell) => new()
+ {
+ IdWell = idWell,
+ ShiftStart = new TimeOnly(8, 0, 0),
+ ShiftEnd = new TimeOnly(20, 0, 0),
+ DrillStart = new DateTimeOffset(new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc)),
+ DrillEnd = new DateTimeOffset(new DateTime(2024, 2, 1, 0, 0, 0, DateTimeKind.Utc)),
+ Driller = new Driller
+ {
+ Name = "TestName",
+ Surname = "TestSurname",
+ Patronymic = "TestPatronymic"
+ }
+ };
+
+ private static WellOperation CreateFactWellOperation(int idWell) =>
+ new()
+ {
+ IdWell = idWell,
+ IdWellSectionType = 1,
+ IdCategory = WellOperationCategory.IdRotor,
+ IdType = WellOperation.IdOperationTypeFact,
+ DepthStart = 0,
+ DepthEnd = 100,
+ LastUpdateDate = DateTimeOffset.UtcNow,
+ DateStart = new DateTimeOffset(new DateTime(2024, 1, 15, 15, 0, 0, DateTimeKind.Utc)),
+ DurationHours = 1
+ };
+
+ private static DetectedOperation CreateDetectedOperation(int idTelemetry) =>
+ new()
+ {
+ IdTelemetry = idTelemetry,
+ IdCategory = WellOperationCategory.IdSlipsTime,
+ DateStart = new DateTimeOffset(new DateTime(2024, 1, 23, 15, 0, 0, 0, DateTimeKind.Utc)),
+ DateEnd = new DateTimeOffset(new DateTime(2024, 1, 23, 15, 2, 0, 0, DateTimeKind.Utc)),
+ ExtraData = new Dictionary
+ {
+ { "test", 5 }
+ }
+ };
}
\ No newline at end of file
diff --git a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperationControllerTest.cs b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperationControllerTest.cs
index 459e6b52..830f2e14 100644
--- a/AsbCloudWebApi.IntegrationTests/Controllers/WellOperationControllerTest.cs
+++ b/AsbCloudWebApi.IntegrationTests/Controllers/WellOperationControllerTest.cs
@@ -5,6 +5,8 @@ using System.Net;
using System.Reflection;
using AsbCloudApp.Requests;
using AsbCloudWebApi.IntegrationTests.Data;
+using Mapster;
+using Microsoft.EntityFrameworkCore;
using Refit;
using Xunit;
@@ -12,85 +14,76 @@ namespace AsbCloudWebApi.IntegrationTests.Controllers;
public class WellOperationControllerTest : BaseIntegrationTest
{
- private static int idWell = 1;
-
- private readonly WellOperationDto[] dtos = new WellOperationDto[]
- {
- new()
- {
- IdWell = 1,
- IdWellSectionType = 1,
- WellSectionTypeName = "Пилотный ствол",
- IdCategory = 5000,
- IdPlan = null,
- CategoryName = "Разборка КНБК",
- IdParentCategory = 4000,
- CategoryInfo = "1",
- IdType = 0,
- DepthStart = 10.0,
- DepthEnd = 20.0,
- Day = 0.0,
- NptHours = 0.0,
- DateStart = new DateTimeOffset(new DateTime(2023, 1, 10), TimeSpan.FromHours(Defaults.Wells[0].Timezone.Hours)),
- DurationHours = 1.0,
- Comment = "1",
- IdUser = 1,
- UserName = null,
- }
- };
-
private IWellOperationClient client;
- public WellOperationControllerTest(WebAppFactoryFixture factory)
- : base(factory)
- {
- client = factory.GetAuthorizedHttpClient(string.Empty);
- }
+ public WellOperationControllerTest(WebAppFactoryFixture factory)
+ : base(factory)
+ {
+ client = factory.GetAuthorizedHttpClient(string.Empty);
- ///
- /// Успешное добавление операций (без предварительной очистки данных)
- ///
- ///
- [Fact]
- public async Task InsertRange_returns_success()
- {
- dbContext.CleanupDbSet();
- //act
- var response = await client.InsertRangeAsync(idWell, 1, false, dtos);
+ dbContext.CleanupDbSet();
+ }
- //assert
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- }
+ ///
+ /// Успешное добавление операций (без предварительной очистки данных)
+ ///
+ ///
+ [Fact]
+ public async Task InsertRange_returns_success()
+ {
+ //arrange
+ var well = await dbContext.Wells.FirstAsync();
+ var entity = CreateWellOperation(well.Id);
+ var dtos = new[] { entity.Adapt() };
- ///
- /// Успешное добавление операций (с предварительной очисткой данных)
- ///
- ///
- [Fact]
- public async Task InsertRangeWithDeleteBefore_returns_success()
- {
- //act
- var response = await client.InsertRangeAsync(idWell, 1, true, dtos);
+ //act
+ var response = await client.InsertRangeAsync(well.Id, 1, false, dtos);
- //assert
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- }
+ //assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ }
- ///
- /// Успешное обновление операции
- ///
- ///
- [Fact]
- public async Task UpdateAsync_returns_success()
- {
- //act
- var dto = dtos.FirstOrDefault()!;
- var response = await client.UpdateAsync(idWell, 1, dto, CancellationToken.None);
+ ///
+ /// Успешное добавление операций (с предварительной очисткой данных)
+ ///
+ ///
+ [Fact]
+ public async Task InsertRangeWithDeleteBefore_returns_success()
+ {
+ //arrange
+ var well = await dbContext.Wells.FirstAsync();
+ var entity = CreateWellOperation(well.Id);
+ var dtos = new[] { entity.Adapt() };
+
+ //act
+ var response = await client.InsertRangeAsync(well.Id, 1, true, dtos);
+
+ //assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ }
+
+ ///
+ /// Успешное обновление операции
+ ///
+ ///
+ [Fact]
+ public async Task UpdateAsync_returns_success()
+ {
+ //arrange
+ var well = await dbContext.Wells.FirstAsync();
+ var entity = CreateWellOperation(well.Id);
+ dbContext.WellOperations.Add(entity);
+ await dbContext.SaveChangesAsync();
+
+ var dto = entity.Adapt();
+
+ //act
+ var response = await client.UpdateAsync(well.Id, entity.Id, dto, CancellationToken.None);
+
+ //assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ }
- //assert
- Assert.Equal(HttpStatusCode.OK, response.StatusCode);
- }
-
///
/// Получение плановых операций
///
@@ -99,8 +92,14 @@ public class WellOperationControllerTest : BaseIntegrationTest
public async Task GetPageOperationsPlanAsync_returns_success()
{
//arrange
- dbContext.CleanupDbSet();
- await client.InsertRangeAsync(idWell, WellOperation.IdOperationTypePlan, false, dtos);
+ var well = await dbContext.Wells.FirstAsync();
+ var entity = CreateWellOperation(well.Id);
+ dbContext.WellOperations.Add(entity);
+ await dbContext.SaveChangesAsync();
+
+ var dto = entity.Adapt();
+ var timezoneOffset = TimeSpan.FromHours(well.Timezone.Hours);
+ dto.DateStart = dto.DateStart.ToOffset(timezoneOffset);
var request = new WellOperationRequestBase
{
@@ -108,49 +107,59 @@ public class WellOperationControllerTest : BaseIntegrationTest
};
//act
- var response = await client.GetPageOperationsPlanAsync(idWell, request, CancellationToken.None);
+ var response = await client.GetPageOperationsPlanAsync(well.Id, request, CancellationToken.None);
//assert
Assert.NotNull(response.Content);
Assert.Single(response.Content.Items);
- var dto = dtos[0];
- var wellOperation = response.Content.Items.First();
+ var actualDto = response.Content.Items.First();
- var excludeProps = new[] { nameof(WellOperationDto.Id) };
- MatchHelper.Match(dto, wellOperation, excludeProps);
+ var excludeProps = new[]
+ {
+ nameof(WellOperationDto.LastUpdateDate)
+ };
+ MatchHelper.Match(dto, actualDto, excludeProps);
}
[Fact]
public async Task ImportPlanDefaultExcelFileAsync_returns_success()
{
//arrange
- //TODO: вынести в метод расширения. Сделать когда доберёмся до рефакторинга операций по скважине
- var resourceName = Assembly.GetExecutingAssembly()
- .GetManifestResourceNames()
- .FirstOrDefault(n => n.EndsWith("WellOperationsPlan.xlsx"));
-
- if (string.IsNullOrWhiteSpace(resourceName))
- throw new ArgumentNullException(nameof(resourceName));
-
- var stream = Assembly.GetExecutingAssembly()
- .GetManifestResourceStream(resourceName);
-
- if (stream is null)
- throw new ArgumentNullException(nameof(stream));
+ var stream = Assembly.GetExecutingAssembly().GetFileCopyStream("WellOperationsPlan.xlsx");
var memoryStream = new MemoryStream();
- stream.CopyTo(memoryStream);
+ await stream.CopyToAsync(memoryStream);
memoryStream.Position = 0;
+ var well = await dbContext.Wells.FirstAsync();
+
//act
var streamPart = new StreamPart(memoryStream, "WellOperations.xlsx", "application/octet-stream");
- var response = await client.ImportPlanDefaultExcelFileAsync(idWell, new[] { streamPart }, CancellationToken.None);
+ var response = await client.ImportPlanDefaultExcelFileAsync(well.Id, new[] { streamPart }, CancellationToken.None);
//assert
Assert.NotNull(response.Content);
Assert.Equal(4, response.Content.Count());
- Assert.True(response.Content.All(w => Math.Abs(w.DateStart.Offset.Hours - Defaults.Wells[0].Timezone.Hours) < 0.1));
+ Assert.True(response.Content.All(w => Math.Abs(w.DateStart.Offset.Hours - Defaults.Timezone.Hours) < 0.1));
}
+
+ private static WellOperation CreateWellOperation(int idWell) =>
+ new()
+ {
+ IdWell = idWell,
+ IdWellSectionType = 2,
+ LastUpdateDate = DateTimeOffset.UtcNow,
+ IdCategory = 5000,
+ IdPlan = null,
+ CategoryInfo = "1",
+ IdType = 0,
+ 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
+ };
}
\ No newline at end of file
diff --git a/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs b/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs
index 4142705c..a3667662 100644
--- a/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs
+++ b/AsbCloudWebApi.IntegrationTests/Data/Defaults.cs
@@ -2,110 +2,55 @@
namespace AsbCloudWebApi.IntegrationTests.Data
{
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2211:Поля, не являющиеся константами, не должны быть видимыми", Justification = "<Ожидание>")]
- public static class Defaults
- {
- public static Driller[] Drillers = new Driller[]
- {
- new()
- {
- Id = 1,
- Name = "test1",
- Surname = "test1",
- Patronymic = "test1"
- },
- new()
- {
- Id = 2,
- Name = "test2",
- Surname = "test2",
- Patronymic = "test2"
- }
- };
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2211:Поля, не являющиеся константами, не должны быть видимыми",
+ Justification = "<Ожидание>")]
+ public static class Defaults
+ {
+ public static SimpleTimezone Timezone => new()
+ {
+ Hours = 1
+ };
- public static WellOperation[] WellOperations = new WellOperation[]
- {
- new()
- {
- Id = 1,
- IdWell = 1,
- IdType = 1,
- DateStart = DateTimeOffset.UtcNow.AddDays(-1),
- CategoryInfo = "1",
- Comment = "1",
- DepthEnd = 20,
- DepthStart = 10,
- DurationHours = 1,
- IdCategory = 5000,
- IdPlan = null,
- IdUser = 1,
- IdWellSectionType = 1,
- LastUpdateDate = DateTimeOffset.UtcNow
- }
- };
-
- public static Deposit[] Deposits = new Deposit[] {
- new()
- {
- Id = 1,
- Caption = "Deposit1",
- Latitude = 10,
- Longitude = 20,
- Timezone = GetTimezone()
- }
- };
-
- public static Cluster[] Clusters = new Cluster[] {
- new()
- {
- Id = 1,
- IdDeposit = Deposits[0].Id,
- Caption = "Cluster1",
- Latitude = 10,
- Longitude = 20,
- Timezone = GetTimezone()
- }
- };
-
- public static Telemetry[] Telemetries = new Telemetry[]
- {
- new()
- {
- Id = 1,
- RemoteUid = "555-555-555",
- TimeZone = GetTimezone()
- }
- };
-
- public static Well[] Wells = new Well[] {
- new()
- {
- Id = 1,
- IdCluster = Clusters[0].Id,
- IdWellType = 1,
- IdState = 1,
- Caption = "Well1",
- Latitude = 10,
- Longitude = 20,
- IdTelemetry = Telemetries[0].Id,
- Timezone = GetTimezone()
- }
- };
-
- public static RelationCompanyWell[] RelationsCompanyWell = new RelationCompanyWell[]
- {
- new() { IdCompany = 1, IdWell = Wells[0].Id },
- };
-
- public static RelationUserUserRole[] RelationsUserUserRole = new RelationUserUserRole[]
- {
- new(){ IdUserRole= 1, IdUser = 1}
- };
-
- private static SimpleTimezone GetTimezone() =>
- new ()
- {
- Hours = 1
- };
- }
-}
+ public static Deposit[] Deposits => new Deposit[]
+ {
+ new()
+ {
+ Caption = "Deposit1",
+ Latitude = 10,
+ Longitude = 20,
+ Timezone = Timezone,
+ Clusters = new[]
+ {
+ new Cluster
+ {
+ Caption = "Cluster1",
+ Latitude = 10,
+ Longitude = 20,
+ Timezone = Timezone,
+ Wells = new[]
+ {
+ new Well
+ {
+ IdWellType = 1,
+ IdState = 1,
+ Caption = "Well1",
+ Latitude = 10,
+ Longitude = 20,
+ Timezone = Timezone,
+ Telemetry = new Telemetry
+ {
+ RemoteUid = "555-555-555",
+ TimeZone = Timezone
+ },
+ RelationCompaniesWells = new RelationCompanyWell[]
+ {
+ new() { IdCompany = 1 },
+ },
+ }
+ }
+ }
+ }
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/AsbCloudWebApi.IntegrationTests/DbConnection.cs b/AsbCloudWebApi.IntegrationTests/DbConnection.cs
new file mode 100644
index 00000000..fad06ed8
--- /dev/null
+++ b/AsbCloudWebApi.IntegrationTests/DbConnection.cs
@@ -0,0 +1,15 @@
+namespace AsbCloudWebApi.IntegrationTests;
+
+public class DbConnection
+{
+ public string Host { get; set; } = null!;
+
+ public int Port { get; set; }
+
+ public string Username { get; set; } = null!;
+
+ public string Password { get; set; } = null!;
+
+ public string GetConnectionString() =>
+ $"Host={Host};Database={Guid.NewGuid()};Port={Port};Username={Username};Password={Password};Persist Security Info=True;Include Error Detail=True";
+}
\ No newline at end of file
diff --git a/AsbCloudWebApi.IntegrationTests/Repository/DataSaubStatRepositoryTest.cs b/AsbCloudWebApi.IntegrationTests/Repository/DataSaubStatRepositoryTest.cs
index f44d32ed..9641dc3c 100644
--- a/AsbCloudWebApi.IntegrationTests/Repository/DataSaubStatRepositoryTest.cs
+++ b/AsbCloudWebApi.IntegrationTests/Repository/DataSaubStatRepositoryTest.cs
@@ -2,6 +2,7 @@
using AsbCloudApp.Repositories;
using AsbCloudDb.Model;
using Mapster;
+using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
@@ -9,157 +10,128 @@ namespace AsbCloudWebApi.IntegrationTests.Repository;
public class DataSaubStatRepositoryTest : BaseIntegrationTest
{
- private static readonly TimeSpan timeSpan = TimeSpan.FromHours(1);
+ private readonly IDataSaubStatRepository dataSaubStatRepository;
+
+ public DataSaubStatRepositoryTest(WebAppFactoryFixture factory)
+ : base(factory)
+ {
+ dataSaubStatRepository = scope.ServiceProvider.GetRequiredService();
+ dbContext.CleanupDbSet();
+ }
- private static readonly DataSaubStatDto[] statDtos = new DataSaubStatDto[2]
- {
- new()
- {
- IdTelemetry = 1,
- DateEnd = new DateTimeOffset(2024, 1, 1, 20, 25, 0, timeSpan),
- DateStart = new DateTimeOffset(2024, 1, 1, 20, 15, 0, timeSpan),
- AxialLoad = 10.0,
- AxialLoadLimitMax = 10.0,
- AxialLoadSp = 10.0,
- BlockSpeedSp = 1000,
- DepthEnd = 10.0,
- DepthStart = 5.0,
- EnabledSubsystems = 1,
- Flow = 10.0,
- HasOscillation = true,
- Id = default,
- IdCategory = 2,
- IdFeedRegulator = 1,
- Pressure = 10.0,
- PressureIdle = 10.0,
- PressureSp = 10.0,
- RotorSpeed = 9.0,
- RotorTorque = 9.0,
- RotorTorqueSp = 9.0,
- RotorTorqueLimitMax = 9.0,
- Speed = 10.0
- },
- new()
- {
- IdTelemetry = 1,
- DateEnd = new DateTimeOffset(2024, 2, 2, 20, 25, 0, timeSpan),
- DateStart = new DateTimeOffset(2024, 2, 2, 20, 15, 0, timeSpan),
- AxialLoad = 10.0,
- AxialLoadLimitMax = 10.0,
- AxialLoadSp = 10.0,
- BlockSpeedSp = 1000,
- DepthEnd = 10.0,
- DepthStart = 5.0,
- EnabledSubsystems = 1,
- Flow = 10.0,
- HasOscillation = true,
- Id = default,
- IdCategory = 2,
- IdFeedRegulator = 1,
- Pressure = 10.0,
- PressureIdle = 10.0,
- PressureSp = 10.0,
- RotorSpeed = 10.0,
- RotorTorque = 10.0,
- RotorTorqueSp = 10.0,
- RotorTorqueLimitMax = 10.0,
- Speed = 10.0
- }
- };
- private static readonly WellOperationCategory category = new()
- {
- Id = 2,
- IdParent = null,
- Name = "Категория 2"
- };
+ [Fact]
+ public async Task GetLastDatesAsync_returns_success()
+ {
+ //arrange
+ var telemetry = await dbContext.Telemetries.FirstAsync();
+ var timeZoneOffset = TimeSpan.FromHours(telemetry.TimeZone.Hours);
+ var dataSaubStat = CreateDataSaubStat(telemetry.Id, timeZoneOffset);
+ dbContext.AddRange(dataSaubStat);
+ await dbContext.SaveChangesAsync();
- private readonly IDataSaubStatRepository dataSaubStatRepository;
+ var telemetryIds = dataSaubStat.Select(stat => stat.IdTelemetry).ToArray();
- public DataSaubStatRepositoryTest(WebAppFactoryFixture factory) : base(factory)
- {
- dataSaubStatRepository = scope.ServiceProvider.GetRequiredService();
- }
+ //act
+ var result = await dataSaubStatRepository.GetLastsAsync(telemetryIds, CancellationToken.None);
- [Fact]
- public async Task GetLastDatesAsync_returns_success()
- {
- //prepare
- dbContext.CleanupDbSet();
- dbContext.CleanupDbSet();
+ //assert
+ var expected = dataSaubStat.Max(stat => stat.DateEnd).ToOffset(timeZoneOffset);
+ var actual = result.First().DateEnd;
+ Assert.True((expected - actual).Ticks == 0.0);
+ }
- var dbSetSaubStat = dbContext.Set();
- var dbSetCategories = dbContext.Set();
+ [Fact]
+ public async Task InsertRangeAsync_returns_success()
+ {
+ //arrange
+ var telemetry = await dbContext.Telemetries.FirstAsync();
+ var timeZoneOffset = TimeSpan.FromHours(telemetry.TimeZone.Hours);
+ var dataSaubStat = CreateDataSaubStat(telemetry.Id, timeZoneOffset);
+ var expectedDtos = dataSaubStat.Select(entity => ConvertToDto(entity, timeZoneOffset));
- var entities = statDtos.Select(stat => ConvertToEntity(stat));
+ //act
+ await dataSaubStatRepository.InsertRangeAsync(expectedDtos, CancellationToken.None);
- dbSetCategories.Add(category);
- dbContext.SaveChanges();
+ //assert
+ var entities = await dbContext.DataSaubStat.ToArrayAsync();
+ var actualDtos = entities.Select(entity => ConvertToDto(entity, timeZoneOffset));
- dbSetSaubStat.AddRange(entities);
- dbContext.SaveChanges();
+ var excludedProps = new[]
+ {
+ nameof(DataSaubStat.Telemetry),
+ nameof(DataSaubStat.Id),
+ nameof(DataSaubStat.OperationCategory)
+ };
- //act
- var telemetryIds = statDtos.Select(stat => stat.IdTelemetry).ToArray();
- var result = await dataSaubStatRepository.GetLastsAsync(telemetryIds, CancellationToken.None);
+ foreach (var actualDto in actualDtos)
+ {
+ var statDto = expectedDtos.FirstOrDefault(stat => stat.DateEnd == actualDto.DateEnd &&
+ stat.DateStart == actualDto.DateStart);
- var expected = statDtos.Max(stat => stat.DateEnd);
- var actual = result.First().DateEnd;
+ MatchHelper.Match(actualDto, statDto, excludedProps);
+ }
+ }
- //assert
- Assert.True((expected - actual).Ticks == 0.0);
- }
+ private static IEnumerable CreateDataSaubStat(int idTelemetry, TimeSpan timeZoneOffset) => new DataSaubStat[]
+ {
+ new()
+ {
+ IdTelemetry = idTelemetry,
+ DateEnd = new DateTimeOffset(2024, 1, 1, 20, 25, 0, timeZoneOffset).ToUniversalTime(),
+ DateStart = new DateTimeOffset(2024, 1, 1, 20, 15, 0, timeZoneOffset).ToUniversalTime(),
+ AxialLoad = 10.0,
+ AxialLoadLimitMax = 10.0,
+ AxialLoadSp = 10.0,
+ BlockSpeedSp = 1000,
+ DepthEnd = 10.0,
+ DepthStart = 5.0,
+ EnabledSubsystems = 1,
+ Flow = 10.0,
+ HasOscillation = true,
+ IdCategory = WellOperationCategory.IdSlide,
+ IdFeedRegulator = 1,
+ Pressure = 10.0,
+ PressureIdle = 10.0,
+ PressureSp = 10.0,
+ RotorSpeed = 9.0,
+ RotorTorque = 9.0,
+ RotorTorqueSp = 9.0,
+ RotorTorqueLimitMax = 9.0,
+ Speed = 10.0
+ },
+ new()
+ {
+ IdTelemetry = idTelemetry,
+ DateEnd = new DateTimeOffset(2024, 2, 2, 20, 25, 0, timeZoneOffset).ToUniversalTime(),
+ DateStart = new DateTimeOffset(2024, 2, 2, 20, 15, 0, timeZoneOffset).ToUniversalTime(),
+ AxialLoad = 10.0,
+ AxialLoadLimitMax = 10.0,
+ AxialLoadSp = 10.0,
+ BlockSpeedSp = 1000,
+ DepthEnd = 10.0,
+ DepthStart = 5.0,
+ EnabledSubsystems = 1,
+ Flow = 10.0,
+ HasOscillation = true,
+ IdCategory = WellOperationCategory.IdSlide,
+ IdFeedRegulator = 1,
+ Pressure = 10.0,
+ PressureIdle = 10.0,
+ PressureSp = 10.0,
+ RotorSpeed = 10.0,
+ RotorTorque = 10.0,
+ RotorTorqueSp = 10.0,
+ RotorTorqueLimitMax = 10.0,
+ Speed = 10.0
+ }
+ };
- [Fact]
- public async Task InsertRangeAsync_returns_success()
- {
- //prepare
- dbContext.CleanupDbSet();
- var dbSet = dbContext.Set();
-
- var dbSetCategories = dbContext.Set();
- dbSetCategories.Add(category);
+ private static DataSaubStatDto ConvertToDto(DataSaubStat entity, TimeSpan timeZoneOffset)
+ {
+ var dto = entity.Adapt();
+ dto.DateStart = dto.DateStart.ToOffset(timeZoneOffset);
+ dto.DateEnd = dto.DateEnd.ToOffset(timeZoneOffset);
- dbContext.SaveChanges();
-
- //act
- var result = await dataSaubStatRepository.InsertRangeAsync(statDtos, CancellationToken.None);
-
- //assert
- Assert.Equal(statDtos.Length, result);
-
- var statDtosFromDb = dbSet.Select(stat => ConvertToDto(stat, timeSpan)).ToArray();
-
- var excludedProps = new[] {
- nameof(DataSaubStat.Telemetry),
- nameof(DataSaubStat.Id),
- nameof(DataSaubStat.OperationCategory)
- };
- foreach (var statDtoFromDb in statDtosFromDb)
- {
- var statDto = statDtos
- .Where(stat => stat.DateStart == statDtoFromDb.DateStart)
- .Where(stat => stat.DateEnd == statDtoFromDb.DateEnd)
- .FirstOrDefault();
-
- MatchHelper.Match(statDtoFromDb, statDto, excludedProps);
- }
- }
-
- private static DataSaubStat ConvertToEntity(DataSaubStatDto stat)
- {
- var entity = stat.Adapt