diff --git a/AsbCloudApp/Data/DailyReport/DailyReportDto.cs b/AsbCloudApp/Data/DailyReport/DailyReportDto.cs
index d8d9d4c8..c31dd73c 100644
--- a/AsbCloudApp/Data/DailyReport/DailyReportDto.cs
+++ b/AsbCloudApp/Data/DailyReport/DailyReportDto.cs
@@ -74,7 +74,7 @@ public class DailyReportDto : IId,
///
/// Дата последнего обновления
///
- public DateTime? DateLastUpdate { get; set; }
+ public DateTimeOffset? DateLastUpdate { get; set; }
///
/// Блок фактической траектории
diff --git a/AsbCloudApp/Data/DataSaubStatDto.cs b/AsbCloudApp/Data/DataSaubStatDto.cs
index a3b80a5d..ceae4f9d 100644
--- a/AsbCloudApp/Data/DataSaubStatDto.cs
+++ b/AsbCloudApp/Data/DataSaubStatDto.cs
@@ -1,4 +1,5 @@
using System;
+using AsbCloudApp.Data.WellOperation;
namespace AsbCloudApp.Data
{
diff --git a/AsbCloudApp/Data/DatesRangeDto.cs b/AsbCloudApp/Data/DatesRangeDto.cs
index 3f12acb7..a61034b6 100644
--- a/AsbCloudApp/Data/DatesRangeDto.cs
+++ b/AsbCloudApp/Data/DatesRangeDto.cs
@@ -12,12 +12,12 @@ namespace AsbCloudApp.Data
/// Дата начала диапазона
///
[Required]
- public DateTime From { get; set; }
+ public DateTimeOffset From { get; set; }
///
/// Дата окончания диапазона
///
[Required]
- public DateTime To { get; set; }
+ public DateTimeOffset To { get; set; }
}
}
diff --git a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs
index e81a45fb..13af0e6e 100644
--- a/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs
+++ b/AsbCloudApp/Data/DetectedOperation/DetectedOperationDto.cs
@@ -1,91 +1,91 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
+using AsbCloudApp.Data.WellOperation;
namespace AsbCloudApp.Data.DetectedOperation;
///
/// Автоматически определенная операция
///
-public class DetectedOperationDto: IId
+public class DetectedOperationDto : IId
{
- ///
- [Required]
- public int Id { get; set; }
+ ///
+ [Required]
+ public int Id { get; set; }
- ///
- /// Id телеметрии
- ///
- [Required]
- public int IdTelemetry { get; set; }
+ ///
+ /// Id телеметрии
+ ///
+ [Required]
+ public int IdTelemetry { get; set; }
- ///
- /// Id названия/описания операции
- ///
- [Required]
- public int IdCategory { get; set; }
+ ///
+ /// Id названия/описания операции
+ ///
+ [Required]
+ public int IdCategory { get; set; }
- ///
- /// Id пользователя панели на момент начала операции
- ///
- [Required]
- public int IdUserAtStart { get; set; }
-
- ///
- /// Пользователь панели оператора
- ///
- public string? TelemetryUserName { get; set; }
+ ///
+ /// Id пользователя панели на момент начала операции
+ ///
+ public int? IdUserAtStart { get; set; }
+
+ ///
+ /// Id пользователя изменившего операцию
+ ///
+ public int? IdEditor { get; set; }
- ///
- /// Дата завершения операции в часовом поясе скважины
- ///
- [Required]
- public DateTimeOffset DateEnd { get; set; }
+ ///
+ /// Дата завершения операции в часовом поясе скважины
+ ///
+ [Required]
+ public DateTimeOffset DateEnd { get; set; }
- ///
- /// Дата начала операции в часовом поясе скважины
- ///
- [Required]
- public DateTimeOffset DateStart { get; set; }
+ ///
+ /// Дата начала операции в часовом поясе скважины
+ ///
+ [Required]
+ public DateTimeOffset DateStart { get; set; }
- ///
- /// глубина на завершения операции, м
- ///
- [Required]
- public double DepthEnd { get; set; }
+ ///
+ /// глубина на завершения операции, м
+ ///
+ [Required]
+ public double DepthEnd { get; set; }
- ///
- /// глубина на начало операции, м
- ///
- [Required]
- public double DepthStart { get; set; }
+ ///
+ /// глубина на начало операции, м
+ ///
+ [Required]
+ public double DepthStart { get; set; }
- ///
- /// Продолжительность операции в минутах
- ///
- [Required]
- public double DurationMinutes => (DateEnd - DateStart).TotalMinutes;
+ ///
+ /// Продолжительность операции в минутах
+ ///
+ [Required]
+ public double DurationMinutes => (DateEnd - DateStart).TotalMinutes;
+
+ ///
+ /// название/описание операции
+ ///
+ [Required]
+ public WellOperationCategoryDto OperationCategory { get; set; } = null!;
+
+ ///
+ /// Включенные подсистемы
+ ///
+ [Required]
+ public EnabledSubsystems EnabledSubsystems { get; set; }
- ///
- /// Флаг включенной подсистемы
- ///
- [Required]
- public int EnabledSubsystems { get; set; }
+ ///
+ /// Значение ключевой параметра операции
+ ///
+ [Required]
+ public double Value { get; set; }
- ///
- /// название/описание операции
- ///
- [Required]
- public WellOperationCategoryDto OperationCategory { get; set; } = null!;
-
- ///
- /// Ключевой параметр операции
- ///
- [Required]
- public double Value { get; set; }
-
- ///
- /// Доп. инфо по операции
- ///
- public IDictionary ExtraData { get; set; } = new Dictionary();
+ ///
+ /// Доп. инфо по операции
+ ///
+ public IDictionary ExtraData { get; set; } = new Dictionary();
}
\ No newline at end of file
diff --git a/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs b/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs
new file mode 100644
index 00000000..ee3c3459
--- /dev/null
+++ b/AsbCloudApp/Data/DetectedOperation/EnabledSubsystems.cs
@@ -0,0 +1,105 @@
+namespace AsbCloudApp.Data.DetectedOperation;
+
+///
+/// Включённые подсистемы
+///
+public struct EnabledSubsystems
+{
+ private int value;
+
+ private EnabledSubsystems(int value)
+ {
+ this.value = value;
+ }
+
+ ///
+ public static implicit operator int(EnabledSubsystems param) =>
+ param.value;
+
+ ///
+ public static implicit operator EnabledSubsystems(int param) =>
+ new(param);
+
+ ///
+ /// Бурение ротором
+ ///
+ public bool IsAutoRotor
+ {
+ get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoRotor);
+ set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoRotor);
+ }
+
+ ///
+ /// Бурение слайдом
+ ///
+ public bool IsAutoSlide
+ {
+ get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoSlide);
+ set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoSlide);
+ }
+
+ ///
+ /// ПРОРАБОТКА
+ ///
+ public bool IsAutoConditionig
+ {
+ get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoConditionig);
+ set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoConditionig);
+ }
+
+ ///
+ /// СПУСК СПО
+ ///
+ public bool IsAutoSinking
+ {
+ get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoSinking);
+ set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoSinking);
+ }
+
+ ///
+ /// ПОДЪЕМ СПО
+ ///
+ public bool IsAutoLifting
+ {
+ get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoLifting);
+ set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoLifting);
+ }
+
+ ///
+ /// ПОДЪЕМ С ПРОРАБОТКОЙ
+ ///
+ public bool IsAutoLiftingWithConditionig
+ {
+ get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoLiftingWithConditionig);
+ set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoLiftingWithConditionig);
+ }
+
+ ///
+ /// Блокировка
+ ///
+ public bool IsAutoBlocknig
+ {
+ get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoBlocknig);
+ set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoBlocknig);
+ }
+
+ ///
+ /// Осцилляция
+ ///
+ public bool IsAutoOscillation
+ {
+ get => IsEnabledSubsystem(EnabledSubsystemsFlags.AutoOscillation);
+ set => UpdateEnabledSubsystems(value, EnabledSubsystemsFlags.AutoOscillation);
+ }
+
+ private bool IsEnabledSubsystem(EnabledSubsystemsFlags flag) =>
+ (value & (int)flag) > 0;
+
+ private void UpdateEnabledSubsystems(bool isEnable, EnabledSubsystemsFlags flag)
+ {
+ if (isEnable)
+ value |= (int)flag;
+ else
+ value &= ~(int)flag;
+ }
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs b/AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs
index ee63bf9b..b45783e6 100644
--- a/AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs
+++ b/AsbCloudApp/Data/DrillTestReport/DrillTestReportDataDto.cs
@@ -21,6 +21,6 @@ namespace AsbCloudApp.Data.DrillTestReport
///
/// Дата отчета
///
- public DateTime Date { get; set; } = DateTime.Now;
+ public DateTimeOffset Date { get; set; } = DateTimeOffset.Now;
}
}
diff --git a/AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs b/AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs
index 39d37a11..a178e6fe 100644
--- a/AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs
+++ b/AsbCloudApp/Data/DrillTestReport/DrillTestReportInfoDto.cs
@@ -24,6 +24,6 @@ namespace AsbCloudApp.Data.DrillTestReport
/// Дата и время
///
[Required]
- public DateTime DateTime { get; set; }
+ public DateTimeOffset DateTime { get; set; }
}
}
diff --git a/AsbCloudApp/Data/FileInfoDto.cs b/AsbCloudApp/Data/FileInfoDto.cs
index 8e006661..ab44b317 100644
--- a/AsbCloudApp/Data/FileInfoDto.cs
+++ b/AsbCloudApp/Data/FileInfoDto.cs
@@ -43,7 +43,7 @@ namespace AsbCloudApp.Data
/// дата загрузки
///
[Required]
- public DateTime UploadDate { get; set; }
+ public DateTimeOffset UploadDate { get; set; }
///
/// размер в байтах
diff --git a/AsbCloudApp/Data/FileMarkDto.cs b/AsbCloudApp/Data/FileMarkDto.cs
index 7329821b..305fad5c 100644
--- a/AsbCloudApp/Data/FileMarkDto.cs
+++ b/AsbCloudApp/Data/FileMarkDto.cs
@@ -33,7 +33,7 @@ namespace AsbCloudApp.Data
/// .
///
[Required]
- public DateTime DateCreated { get; set; }
+ public DateTimeOffset DateCreated { get; set; }
///
///
diff --git a/AsbCloudApp/Data/GTR/GtrWitsDto.cs b/AsbCloudApp/Data/GTR/GtrWitsDto.cs
new file mode 100644
index 00000000..20d08dd6
--- /dev/null
+++ b/AsbCloudApp/Data/GTR/GtrWitsDto.cs
@@ -0,0 +1,234 @@
+using System;
+
+namespace AsbCloudApp.Data.GTR;
+
+///
+/// ГТИ
+///
+public class GtrWitsDto
+{
+ ///
+ /// Дата получения записи
+ ///
+ public DateTimeOffset DateTime { get; set; }
+
+ ///
+ /// Забой (скважины), м
+ ///
+ public float? DEPTMEAS { get; set; }
+
+ ///
+ /// Долото, м
+ ///
+ public float DEPTBITM { get; set; }
+
+ ///
+ /// Вес на крюке
+ ///
+ public float? HKLA { get; set; }
+
+ ///
+ /// Высота крюка
+ ///
+ public float? BLKPOS { get; set; }
+
+ ///
+ /// Нагрузка на долото
+ ///
+ public float? WOBA { get; set; }
+
+ ///
+ /// Момент на роторе/ВСП
+ ///
+ public float? TORQA { get; set; }
+
+ ///
+ /// Давление на входе (на стояке)
+ ///
+ public float? SPPA { get; set; }
+
+ ///
+ /// Обороты ротора/ВСП
+ ///
+ public float? RPMA { get; set; }
+
+ ///
+ /// Механическая скорость
+ ///
+ public float? ROPA { get; set; }
+
+ ///
+ /// Скорость инструмента вверх
+ ///
+ public float? RSUX { get; set; }
+
+ ///
+ /// Скорость инструмента вниз
+ ///
+ public float? RSDX { get; set; }
+
+ ///
+ /// Расход на входе
+ ///
+ public float? MFIA { get; set; }
+
+ ///
+ /// Расход на выходе
+ ///
+ public float? MFOA { get; set; }
+
+ ///
+ /// Температура на входе
+ ///
+ public float? MTIA { get; set; }
+
+ ///
+ /// Температура на выходе
+ ///
+ public float? MTOA { get; set; }
+
+ ///
+ /// Ходы насоса №1
+ ///
+ public float? SPM1 { get; set; }
+
+ ///
+ /// Ходы насоса №2
+ ///
+ public float? SPM2 { get; set; }
+
+ ///
+ /// Ходы насоса №3
+ ///
+ public float? SPM3 { get; set; }
+
+ ///
+ /// Общий объем бурового раствора на поверхности
+ ///
+ public float? TVOLACT { get; set; }
+
+ ///
+ /// Объем бурового раствора в доливной емкости №1
+ ///
+ public float? TTVOL1 { get; set; }
+
+ ///
+ /// Объем бурового раствора в доливной емкости №2
+ ///
+ public float? TTVOL2 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №1
+ ///
+ public float? TVOL01 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №2
+ ///
+ public float? TVOL02 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №3
+ ///
+ public float? TVOL03 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №4
+ ///
+ public float? TVOL04 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №5
+ ///
+ public float? TVOL05 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №6
+ ///
+ public float? TVOL06 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №7
+ ///
+ public float? TVOL07 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №8
+ ///
+ public float? TVOL08 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №9
+ ///
+ public float? TVOL09 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №10
+ ///
+ public float? TVOL10 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №11
+ ///
+ public float? TVOL11 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №12
+ ///
+ public float? TVOL12 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №13
+ ///
+ public float? TVOL13 { get; set; }
+
+ ///
+ /// Объем бурового раствора в емкости №14
+ ///
+ public float? TVOL14 { get; set; }
+
+ ///
+ /// Плотность (удельный вес) бурового раствора на выходе
+ ///
+ public float? MDOA { get; set; }
+
+ ///
+ /// Плотность (удельный вес) бурового раствора на входе
+ ///
+ public float? MDIA { get; set; }
+
+ ///
+ /// Процентное содержание метана
+ ///
+ public float? METHANE { get; set; }
+
+ ///
+ /// Процентное содержание этана
+ ///
+ public float? ETHANE { get; set; }
+
+ ///
+ /// Процентное содержание пропана
+ ///
+ public float? PROPANE { get; set; }
+
+ ///
+ /// Процентное содержание бутана
+ ///
+ public float? IBUTANE { get; set; }
+
+ ///
+ /// Процентное содержание пентана
+ ///
+ public float? NBUTANE { get; set; }
+
+ ///
+ /// Процентное содержание углеводородов
+ ///
+ public float? HydrocarbonPercentage => METHANE + ETHANE + PROPANE + IBUTANE + NBUTANE;
+
+ ///
+ /// Процентное содержание газов
+ ///
+ public float? GASA { get; set; }
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Data/LimitingParameterDataDto.cs b/AsbCloudApp/Data/LimitingParameterDataDto.cs
index 1bf982dc..c5692729 100644
--- a/AsbCloudApp/Data/LimitingParameterDataDto.cs
+++ b/AsbCloudApp/Data/LimitingParameterDataDto.cs
@@ -20,12 +20,12 @@ namespace AsbCloudApp.Data
///
/// Дата начала ограничения
///
- public DateTime DateStart { get; set; }
+ public DateTimeOffset DateStart { get; set; }
///
/// Дата окончания ограничения
///
- public DateTime DateEnd { get; set; }
+ public DateTimeOffset DateEnd { get; set; }
///
/// Глубина начала ограничения
diff --git a/AsbCloudApp/Data/Manuals/ManualDto.cs b/AsbCloudApp/Data/Manuals/ManualDto.cs
index bb89dfbe..c5aa92c4 100644
--- a/AsbCloudApp/Data/Manuals/ManualDto.cs
+++ b/AsbCloudApp/Data/Manuals/ManualDto.cs
@@ -18,7 +18,7 @@ public class ManualDto : IId
///
/// Дата загрузки
///
- public DateTime DateDownload { get; set; }
+ public DateTimeOffset DateDownload { get; set; }
///
/// Id автора
diff --git a/AsbCloudApp/Data/MeasureDto.cs b/AsbCloudApp/Data/MeasureDto.cs
index 9f823a91..4eddd78f 100644
--- a/AsbCloudApp/Data/MeasureDto.cs
+++ b/AsbCloudApp/Data/MeasureDto.cs
@@ -36,7 +36,7 @@ namespace AsbCloudApp.Data
/// отметка времени замера
///
[Required]
- public DateTime Timestamp { get; set; }
+ public DateTimeOffset Timestamp { get; set; }
///
/// данные замера
diff --git a/AsbCloudApp/Data/MessageDto.cs b/AsbCloudApp/Data/MessageDto.cs
index 071967d9..7234db7a 100644
--- a/AsbCloudApp/Data/MessageDto.cs
+++ b/AsbCloudApp/Data/MessageDto.cs
@@ -16,7 +16,7 @@ namespace AsbCloudApp.Data
/// дата появления события
///
[Required]
- public DateTime DateTime { get; set; }
+ public DateTimeOffset DateTime { get; set; }
///
/// категория события
diff --git a/AsbCloudApp/Data/NotificationDto.cs b/AsbCloudApp/Data/NotificationDto.cs
index ee42f8d7..0fd8b673 100644
--- a/AsbCloudApp/Data/NotificationDto.cs
+++ b/AsbCloudApp/Data/NotificationDto.cs
@@ -42,17 +42,17 @@ public class NotificationDto : IId
/// Дата регистрации уведомления
///
[Required]
- public DateTime RegistrationDate { get; set; }
+ public DateTimeOffset RegistrationDate { get; set; }
///
/// Дата отправки уведомления
///
- public DateTime? SentDate { get; set; }
+ public DateTimeOffset? SentDate { get; set; }
///
/// Дата прочтения уведомления
///
- public DateTime? ReadDate { get; set; }
+ public DateTimeOffset? ReadDate { get; set; }
///
/// Состояние уведомления
@@ -82,12 +82,12 @@ public class NotificationDto : IId
ReadDate = null;
break;
case 1:
- SentDate = DateTime.UtcNow;
+ SentDate = DateTimeOffset.UtcNow;
ReadDate = null;
break;
case 2:
- SentDate = DateTime.UtcNow;
- ReadDate = DateTime.UtcNow;
+ SentDate = DateTimeOffset.UtcNow;
+ ReadDate = DateTimeOffset.UtcNow;
break;
}
}
diff --git a/AsbCloudApp/Data/ParserResultDto.cs b/AsbCloudApp/Data/ParserResultDto.cs
index 5b6eca8d..ffb24d50 100644
--- a/AsbCloudApp/Data/ParserResultDto.cs
+++ b/AsbCloudApp/Data/ParserResultDto.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Linq;
namespace AsbCloudApp.Data;
@@ -9,4 +10,8 @@ namespace AsbCloudApp.Data;
public class ParserResultDto : ValidationResultDto>>
where TDto : class, IId
{
+ ///
+ /// Объекты полученные из файла
+ ///
+ public override IEnumerable> Item { get; set; } = Enumerable.Empty>();
}
\ No newline at end of file
diff --git a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs
index 9ae3c6ff..c2ce713a 100644
--- a/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs
+++ b/AsbCloudApp/Data/ProcessMaps/ProcessMapPlanBaseDto.cs
@@ -45,6 +45,6 @@ public abstract class ProcessMapPlanBaseDto : ChangeLogAbstract, IId, IWellRelat
public virtual IEnumerable Validate(ValidationContext validationContext)
{
if (DepthEnd <= DepthStart)
- yield return new("Глубина окончания должна быть больше глубины начала", new string[] { nameof(DepthEnd), nameof(DepthStart) });
+ yield return new("Глубина окончания должна быть больше глубины начала", new string[] { nameof(DepthEnd) });
}
}
\ No newline at end of file
diff --git a/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportDataSaubStatDto.cs b/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportDataSaubStatDto.cs
index 6255726f..4bf221de 100644
--- a/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportDataSaubStatDto.cs
+++ b/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportDataSaubStatDto.cs
@@ -44,7 +44,7 @@ public class ProcessMapReportDataSaubStatDto
/// на начало интервала
///
///
- public DateTime DateStart { get; set; }
+ public DateTimeOffset DateStart { get; set; }
///
/// Режим бурения (Ротор/слайд/ручной)
diff --git a/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs b/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs
index 16a9749c..cee53050 100644
--- a/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs
+++ b/AsbCloudApp/Data/ProcessMaps/Report/ProcessMapReportWellDrillingDto.cs
@@ -44,7 +44,7 @@ public class ProcessMapReportWellDrillingDto
/// на начало интервала
///
///
- public DateTime DateStart { get; set; }
+ public DateTimeOffset DateStart { get; set; }
///
/// Время мех бурения, ч
diff --git a/AsbCloudApp/Data/ReportPropertiesDto.cs b/AsbCloudApp/Data/ReportPropertiesDto.cs
index 82caa77e..f802a7e0 100644
--- a/AsbCloudApp/Data/ReportPropertiesDto.cs
+++ b/AsbCloudApp/Data/ReportPropertiesDto.cs
@@ -29,17 +29,17 @@ namespace AsbCloudApp.Data
///
/// Дата формирования
///
- public DateTime Date { get; set; }
+ public DateTimeOffset Date { get; set; }
///
/// Дата начала рапорта
///
- public DateTime Begin { get; set; }
+ public DateTimeOffset Begin { get; set; }
///
/// Дата окончания рапорта
///
- public DateTime End { get; set; }
+ public DateTimeOffset End { get; set; }
///
/// шаг между точками диаграммы
diff --git a/AsbCloudApp/Data/SAUB/SetpointsRequestDto.cs b/AsbCloudApp/Data/SAUB/SetpointsRequestDto.cs
index ed81c0ef..192805a6 100644
--- a/AsbCloudApp/Data/SAUB/SetpointsRequestDto.cs
+++ b/AsbCloudApp/Data/SAUB/SetpointsRequestDto.cs
@@ -33,7 +33,7 @@ namespace AsbCloudApp.Data.SAUB
///
/// отметка времени создания запроса
///
- public DateTime UploadDate { get; set; } = DateTime.Now;
+ public DateTimeOffset UploadDate { get; set; } = DateTimeOffset.Now;
///
/// время в секундах актуальности этого запроса
diff --git a/AsbCloudApp/Data/SAUB/TelemetryMessageDto.cs b/AsbCloudApp/Data/SAUB/TelemetryMessageDto.cs
index 6c246f16..ee86fc46 100644
--- a/AsbCloudApp/Data/SAUB/TelemetryMessageDto.cs
+++ b/AsbCloudApp/Data/SAUB/TelemetryMessageDto.cs
@@ -15,7 +15,7 @@ namespace AsbCloudApp.Data.SAUB
///
/// отметка времени
///
- public DateTime Date { get; set; }
+ public DateTimeOffset Date { get; set; }
///
/// глубина забоя
diff --git a/AsbCloudApp/Data/SAUB/TelemetryWirelineRunOutDto.cs b/AsbCloudApp/Data/SAUB/TelemetryWirelineRunOutDto.cs
index 69ac6929..213b67ec 100644
--- a/AsbCloudApp/Data/SAUB/TelemetryWirelineRunOutDto.cs
+++ b/AsbCloudApp/Data/SAUB/TelemetryWirelineRunOutDto.cs
@@ -10,7 +10,7 @@ namespace AsbCloudApp.Data.SAUB
///
/// отметка времени
///
- public DateTime DateTime { get; set; }
+ public DateTimeOffset DateTime { get; set; }
///
/// Наработка талевого каната с момента перетяжки каната, т*км
diff --git a/AsbCloudApp/Data/ScheduleDto.cs b/AsbCloudApp/Data/ScheduleDto.cs
index 84cbe515..a8c8d652 100644
--- a/AsbCloudApp/Data/ScheduleDto.cs
+++ b/AsbCloudApp/Data/ScheduleDto.cs
@@ -39,13 +39,13 @@ namespace AsbCloudApp.Data
/// Начало бурения
///
[Required]
- public DateTime DrillStart { get; set; }
+ public DateTimeOffset DrillStart { get; set; }
///
/// Конец бурения
///
[Required]
- public DateTime DrillEnd { get; set; }
+ public DateTimeOffset DrillEnd { get; set; }
///
/// Бурильщик
diff --git a/AsbCloudApp/Data/StatOperationsDto.cs b/AsbCloudApp/Data/StatOperationsDto.cs
index 7d082648..ec59eae0 100644
--- a/AsbCloudApp/Data/StatOperationsDto.cs
+++ b/AsbCloudApp/Data/StatOperationsDto.cs
@@ -11,12 +11,12 @@ namespace AsbCloudApp.Data
///
/// Дата и время начала
///
- public DateTime? Start { get; set; }
+ public DateTimeOffset? Start { get; set; }
///
/// Дата и время окончания
///
- public DateTime? End { get; set; }
+ public DateTimeOffset? End { get; set; }
///
/// Глубина, м
diff --git a/AsbCloudApp/Data/StatWellDto.cs b/AsbCloudApp/Data/StatWellDto.cs
index ece9756c..9cf27fe4 100644
--- a/AsbCloudApp/Data/StatWellDto.cs
+++ b/AsbCloudApp/Data/StatWellDto.cs
@@ -42,7 +42,7 @@ namespace AsbCloudApp.Data
/// дата прихода последней телеметрии
///
[Required]
- public DateTime LastTelemetryDate { get; set; }
+ public DateTimeOffset LastTelemetryDate { get; set; }
///
/// Статистика по секциям
diff --git a/AsbCloudApp/Data/Trajectory/TrajectoryGeoDto.cs b/AsbCloudApp/Data/Trajectory/TrajectoryGeoDto.cs
index 237c20b2..11b88141 100644
--- a/AsbCloudApp/Data/Trajectory/TrajectoryGeoDto.cs
+++ b/AsbCloudApp/Data/Trajectory/TrajectoryGeoDto.cs
@@ -46,7 +46,7 @@ namespace AsbCloudApp.Data.Trajectory
///
/// Дата загрузки
///
- public DateTime UpdateDate { get; set; }
+ public DateTimeOffset UpdateDate { get; set; }
///
/// ИД пользователя
diff --git a/AsbCloudApp/Data/ValidationResultDto.cs b/AsbCloudApp/Data/ValidationResultDto.cs
index 0116fe0a..1fe0f918 100644
--- a/AsbCloudApp/Data/ValidationResultDto.cs
+++ b/AsbCloudApp/Data/ValidationResultDto.cs
@@ -18,7 +18,7 @@ public class ValidationResultDto
///
/// Объект валидации
///
- public T Item { get; set; } = null!;
+ public virtual T Item { get; set; } = null!;
///
/// Предупреждения
diff --git a/AsbCloudApp/Data/WellCompositeOperationDto.cs b/AsbCloudApp/Data/WellCompositeOperationDto.cs
new file mode 100644
index 00000000..ce8e44f9
--- /dev/null
+++ b/AsbCloudApp/Data/WellCompositeOperationDto.cs
@@ -0,0 +1,26 @@
+using AsbCloudApp.Data.WellOperation;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AsbCloudApp.Data
+{
+ ///
+ /// Хранение операций по композитной скважине
+ /// и по скважинам, на основе которых была рассчитана композитная скважина
+ ///
+ public class WellCompositeOperationDto
+ {
+ ///
+ /// Список операций композитной скважины
+ ///
+ public IEnumerable WellOperationsComposite { get; set; } = null!;
+
+ ///
+ /// Список операций, на основе которых были рассчитаны операции по композитной скважине
+ ///
+ public IEnumerable WellCompositeSourceOperations { get; set; } = null!;
+ }
+}
diff --git a/AsbCloudApp/Data/WellCompositeOperationSourceDto.cs b/AsbCloudApp/Data/WellCompositeOperationSourceDto.cs
new file mode 100644
index 00000000..04ec7b3b
--- /dev/null
+++ b/AsbCloudApp/Data/WellCompositeOperationSourceDto.cs
@@ -0,0 +1,21 @@
+using AsbCloudApp.Data.WellOperation;
+using System.Collections.Generic;
+
+namespace AsbCloudApp.Data
+{
+ ///
+ /// Операции по скважине, по которой рассчитывается композитная скважина
+ ///
+ public class WellCompositeOperationSourceDto
+ {
+ ///
+ /// Скважина
+ ///
+ public WellDto Well { get; set; } = null!;
+
+ ///
+ /// Операции по скважине
+ ///
+ public IEnumerable Operations { get; set; } = null!;
+ }
+}
diff --git a/AsbCloudApp/Data/WellDto.cs b/AsbCloudApp/Data/WellDto.cs
index 30f524c2..368e58c9 100644
--- a/AsbCloudApp/Data/WellDto.cs
+++ b/AsbCloudApp/Data/WellDto.cs
@@ -67,12 +67,12 @@ namespace AsbCloudApp.Data
///
/// Дата/время первой операции
///
- public DateTime? StartDate { get; set; }
+ public DateTimeOffset? StartDate { get; set; }
///
/// Дата/время кода приходили данные последний раз
///
- public DateTime LastTelemetryDate { get; set; }
+ public DateTimeOffset LastTelemetryDate { get; set; }
///
/// ID телеметрии
diff --git a/AsbCloudApp/Data/WellMapInfoDto.cs b/AsbCloudApp/Data/WellMapInfoDto.cs
index a677a1e3..55098f4b 100644
--- a/AsbCloudApp/Data/WellMapInfoDto.cs
+++ b/AsbCloudApp/Data/WellMapInfoDto.cs
@@ -82,14 +82,14 @@ namespace AsbCloudApp.Data
/// Дата начала первой фактической операции
/// Используется как дата начала бурения
///
- public DateTime? FirstFactOperationDateStart { get; set; }
+ public DateTimeOffset? FirstFactOperationDateStart { get; set; }
///
/// Дата окончания последней прогнозируемой операции
/// Если скважина завершена, то дата окончания последней фактической операции
/// Используется как прогноз окончания бурения
///
- public DateTime? LastPredictOperationDateEnd { get; set; }
+ public DateTimeOffset? LastPredictOperationDateEnd { get; set; }
///
/// Рейсовая скорость проходки, последнего рейса
diff --git a/AsbCloudApp/Data/WellGroupOpertionDto.cs b/AsbCloudApp/Data/WellOperation/WellGroupOpertionDto.cs
similarity index 100%
rename from AsbCloudApp/Data/WellGroupOpertionDto.cs
rename to AsbCloudApp/Data/WellOperation/WellGroupOpertionDto.cs
diff --git a/AsbCloudApp/Data/WellOperationCategoryDto.cs b/AsbCloudApp/Data/WellOperation/WellOperationCategoryDto.cs
similarity index 96%
rename from AsbCloudApp/Data/WellOperationCategoryDto.cs
rename to AsbCloudApp/Data/WellOperation/WellOperationCategoryDto.cs
index 108a31f0..2fe0b177 100644
--- a/AsbCloudApp/Data/WellOperationCategoryDto.cs
+++ b/AsbCloudApp/Data/WellOperation/WellOperationCategoryDto.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace AsbCloudApp.Data
+namespace AsbCloudApp.Data.WellOperation
{
///
/// DTO категория операции
diff --git a/AsbCloudApp/Data/WellOperation/WellOperationDto.cs b/AsbCloudApp/Data/WellOperation/WellOperationDto.cs
new file mode 100644
index 00000000..17015451
--- /dev/null
+++ b/AsbCloudApp/Data/WellOperation/WellOperationDto.cs
@@ -0,0 +1,116 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+
+namespace AsbCloudApp.Data.WellOperation;
+
+public class WellOperationDto : ItemInfoDto,
+ IId,
+ IWellRelated,
+ IValidatableObject
+{
+ ///
+ [Required]
+ public int Id { get; set; }
+
+ ///
+ [Required]
+ public int IdWell { get; set; }
+
+ ///
+ /// Id секции скважины
+ ///
+ public int IdWellSectionType { get; set; }
+
+ ///
+ /// 0 = план или 1 = факт или прогноз = 2
+ ///
+ [Required]
+ public int IdType { get; set; }
+
+ ///
+ /// id категории операции
+ ///
+ public int IdCategory { get; set; }
+
+ ///
+ /// Глубина на начало операции, м
+ ///
+ public double DepthStart { get; set; }
+
+ ///
+ /// Глубина после завершения операции, м
+ ///
+ [Required]
+ [Range(0, 50_000)]
+ public double DepthEnd { get; set; }
+
+ ///
+ /// Дата начала операции
+ ///
+ [Required]
+ public DateTimeOffset DateStart { get; set; }
+
+ ///
+ /// Продолжительность, часы
+ ///
+ public double DurationHours { get; set; }
+
+ ///
+ /// Наименование секции
+ ///
+ public string? WellSectionTypeCaption { get; set; }
+
+ ///
+ /// Наименование категории
+ ///
+ public string? OperationCategoryName { get; set; }
+
+ ///
+ /// id плановой операции для сопоставления
+ ///
+ public int? IdPlan { get; set; }
+
+ ///
+ /// Ключ родителя у категории
+ ///
+ public int? IdParentCategory { get; set; }
+
+ ///
+ /// дополнительная информация по операции
+ ///
+ [StringLength(8192)]
+ public string? CategoryInfo { get; set; }
+
+ ///
+ /// Кол-во дней от даты начала первой плановой (а если её нет, то фактической) операции
+ ///
+ [Required]
+ public double Day { get; set; }
+
+ ///
+ /// Кол-во часов НПВ от даты начала первой плановой (а если её нет, то фактической) операции
+ ///
+ [Required]
+ public double NptHours { get; set; }
+
+ ///
+ /// Полезный комментарий
+ ///
+ [StringLength(4096, ErrorMessage = "Комментарий не может быть длиннее 4096 символов")]
+ public string? Comment { get; set; }
+
+ ///
+ /// Валидация даты
+ ///
+ ///
+ ///
+ public IEnumerable Validate(ValidationContext validationContext)
+ {
+ var gtDate = new DateTimeOffset(2010, 1, 1, 0, 0, 0, TimeSpan.Zero);
+ if (DateStart <= gtDate)
+ yield return new ValidationResult(
+ $"{nameof(DateStart)}: DateStart не может быть меньше {gtDate}",
+ new[] { nameof(DateStart) });
+ }
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Data/WellOperationDataDto.cs b/AsbCloudApp/Data/WellOperationDataDto.cs
deleted file mode 100644
index 874bd65c..00000000
--- a/AsbCloudApp/Data/WellOperationDataDto.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-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/Data/WellOperationDto.cs b/AsbCloudApp/Data/WellOperationDto.cs
deleted file mode 100644
index 725debfd..00000000
--- a/AsbCloudApp/Data/WellOperationDto.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-
-namespace AsbCloudApp.Data
-{
- ///
- /// Операции на скважине (заведенные пользователем)
- ///
- public class WellOperationDto : ItemInfoDto, IId, IWellRelated, IValidatableObject
- {
- ///
- [Required]
- public int Id { get; set; }
-
- ///
- [Required]
- public int IdWell { get; set; }
-
- ///
- /// id секции скважины
- ///
- [Required]
- public int IdWellSectionType { get; set; }
-
- ///
- /// название секции скважины
- ///
- public string? WellSectionTypeName { get; set; }
-
- ///
- /// id категории операции
- ///
- [Required]
- [Range(5000, int.MaxValue)]
- public int IdCategory { get; set; }
-
- ///
- /// id плановой операции для сопоставления
- ///
- public int? IdPlan { get; set; }
-
- ///
- /// название категории операции
- ///
- public string? CategoryName { get; set; }
-
- ///
- /// ключ родителя у категории
- ///
- public int? IdParentCategory { get; set; }
-
- ///
- /// дополнительная информация по операции
- ///
- [StringLength(8192)]
- public string? CategoryInfo { get; set; }
-
- ///
- /// 0 = план или 1 = факт или прогноз = 2
- ///
- [Required]
- public int IdType { get; set; }
-
- ///
- /// Глубина на начало операции, м
- ///
- [Required]
- [Range(0, 50_000)]
- public double DepthStart { get; set; }
-
- ///
- /// Глубина после завершения операции, м
- ///
- [Required]
- [Range(0, 50_000)]
- public double DepthEnd { get; set; }
-
- ///
- /// Кол-во дней от даты начала первой плановой (а если её нет, то фактической) операции
- ///
- [Required]
- public double Day { get; set; }
-
- ///
- /// Кол-во часов НПВ от даты начала первой плановой (а если её нет, то фактической) операции
- ///
- [Required]
- public double NptHours { get; set; }
-
- ///
- /// Дата начала операции
- ///
- [Required]
- public DateTimeOffset DateStart { get; set; }
-
- ///
- /// Продолжительность, часы
- ///
- [Required]
- [Range(0, 50)]
- public double DurationHours { get; set; }
-
- ///
- /// Полезный комментарий
- ///
- [StringLength(4096, ErrorMessage = "Комментарий не может быть длиннее 4096 символов")]
- public string? Comment { get; set; }
-
- ///
- /// Валидация даты
- ///
- ///
- ///
- public IEnumerable Validate(ValidationContext validationContext)
- {
- var gtDate = new DateTimeOffset(2010, 1, 1, 0, 0, 0, TimeSpan.Zero);
- if (DateStart <= gtDate)
- yield return new ValidationResult(
- $"{nameof(DateStart)}: DateStart не может быть меньше {gtDate}",
- new[] { nameof(DateStart) });
- }
- }
-}
diff --git a/AsbCloudApp/Data/WellOperationPlanDto.cs b/AsbCloudApp/Data/WellOperationPlanDto.cs
deleted file mode 100644
index 5c1bac9f..00000000
--- a/AsbCloudApp/Data/WellOperationPlanDto.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.Linq;
-
-namespace AsbCloudApp.Data
-{
- ///
- /// класс, который хранит список плановых операций для сопоставления
- /// и даты последней сопоставленной плановой операции
- ///
-#nullable enable
- public class WellOperationPlanDto
- {
- ///
- /// коллекция плановых операций
- ///
- [Required]
- public IEnumerable WellOperationsPlan { get; set; } = Enumerable.Empty();
-
- ///
- /// дата последней сопоставленной плановой операции
- ///
- public DateTime? DateLastAssosiatedPlanOperation { get; set; }
-
- }
-
-}
diff --git a/AsbCloudApp/Repositories/IDetectedOperationRepository.cs b/AsbCloudApp/Repositories/IDetectedOperationRepository.cs
index d7fe5865..a748984d 100644
--- a/AsbCloudApp/Repositories/IDetectedOperationRepository.cs
+++ b/AsbCloudApp/Repositories/IDetectedOperationRepository.cs
@@ -4,24 +4,40 @@ using AsbCloudApp.Requests;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Threading;
-using AsbCloudApp.Services;
+using AsbCloudApp.Data;
+using AsbCloudApp.Data.WellOperation;
namespace AsbCloudApp.Repositories;
///
/// Таблица автоматически определенных операций
///
-public interface IDetectedOperationRepository : ICrudRepository
+public interface IDetectedOperationRepository
{
///
- /// Добавление записей
+ /// Добавление нескольких записей
+ ///
+ ///
+ ///
+ /// количество добавленных
+ Task InsertRangeAsync(IEnumerable dtos, CancellationToken token);
+
+ ///
+ /// Обновить несколько записей
///
- ///
///
///
///
- Task Insert(int? idUser, IEnumerable dtos, CancellationToken token);
+ Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token);
+ ///
+ /// Удаление нескольких записей
+ ///
+ ///
+ ///
+ ///
+ Task DeleteRangeAsync(IEnumerable ids, CancellationToken token);
+
///
/// Получить автоматически определенные операции по телеметрии
///
@@ -31,40 +47,12 @@ public interface IDetectedOperationRepository : ICrudRepository> Get(DetectedOperationByTelemetryRequest request, CancellationToken token);
///
- /// Редактирование записей
+ /// Получить страницу списка операций
///
- ///
- ///
- ///
- ///
- Task Update(int idUser, IEnumerable dtos, CancellationToken token);
-
- ///
- /// Добавляет Dto у которых id == 0, изменяет dto у которых id != 0
- ///
- ///
- ///
- ///
- ///
- Task UpdateOrInsert(int idUser, IEnumerable dtos, CancellationToken token);
-
- ///
- /// Удалить операции
- ///
- ///
///
///
///
- Task Delete(int idUser, DetectedOperationByTelemetryRequest request, CancellationToken token);
-
- ///
- /// Удаление записей
- ///
- ///
- ///
- ///
- ///
- Task DeleteRange(int idUser, IEnumerable ids, CancellationToken token);
+ Task> GetPageAsync(DetectedOperationByTelemetryRequest request, CancellationToken token);
///
/// Получение дат последних определённых операций
@@ -72,4 +60,12 @@ public interface IDetectedOperationRepository : ICrudRepository
///
Task> GetLastDetectedDatesAsync(CancellationToken token);
+
+ ///
+ /// Удалить операции
+ ///
+ ///
+ ///
+ ///
+ Task DeleteAsync(DetectedOperationByTelemetryRequest request, CancellationToken token);
}
diff --git a/AsbCloudApp/Repositories/IDrillTestRepository.cs b/AsbCloudApp/Repositories/IDrillTestRepository.cs
index 22f11a06..b009273b 100644
--- a/AsbCloudApp/Repositories/IDrillTestRepository.cs
+++ b/AsbCloudApp/Repositories/IDrillTestRepository.cs
@@ -33,9 +33,9 @@ namespace AsbCloudApp.Repositories
/// Сохранить данные drill_test
///
/// ключ телеметрии
- /// запись drill test
+ /// записи drill test
///
///
- Task SaveDataAsync(int idTelemetry, DrillTestBaseDto dto, CancellationToken token);
+ Task SaveDataAsync(int idTelemetry, IEnumerable dtos, CancellationToken token);
}
}
diff --git a/AsbCloudApp/Repositories/IGtrRepository.cs b/AsbCloudApp/Repositories/IGtrRepository.cs
index 0d597dde..39fbef07 100644
--- a/AsbCloudApp/Repositories/IGtrRepository.cs
+++ b/AsbCloudApp/Repositories/IGtrRepository.cs
@@ -3,6 +3,8 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
+using AsbCloudApp.Requests;
+using AsbCloudApp.Data;
namespace AsbCloudApp.Repositories
{
@@ -19,6 +21,15 @@ namespace AsbCloudApp.Repositories
///
///
Task SaveDataAsync(int idTelemetry, IEnumerable dtos, CancellationToken token);
+
+ ///
+ /// получить данные ГТИ
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task> GetAsync(int idWell, GtrRequest request, CancellationToken token);
///
/// получить данные для клиента
@@ -29,6 +40,7 @@ namespace AsbCloudApp.Repositories
/// кол-во элементов до которых эти данные прореживаются
///
///
+ [Obsolete]
Task> GetAsync(int idWell,
DateTime? dateBegin, double intervalSec = 600d,
int approxPointsCount = 1024, CancellationToken token = default);
@@ -39,6 +51,7 @@ namespace AsbCloudApp.Repositories
///
///
///
+ [Obsolete]
IEnumerable GetLastDataByRecordId(int idWell, int idRecord);
///
@@ -46,6 +59,17 @@ namespace AsbCloudApp.Repositories
///
///
///
+ [Obsolete]
IEnumerable GetLastData(int idWell);
+
+ ///
+ /// Доступные даты по скважине
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task GetRangeAsync(int idWell, DateTimeOffset? geDate, DateTimeOffset? leDate, CancellationToken token);
}
}
diff --git a/AsbCloudApp/Repositories/IWellOperationCategoryRepository.cs b/AsbCloudApp/Repositories/IWellOperationCategoryRepository.cs
index 4e18c231..044dbd44 100644
--- a/AsbCloudApp/Repositories/IWellOperationCategoryRepository.cs
+++ b/AsbCloudApp/Repositories/IWellOperationCategoryRepository.cs
@@ -1,5 +1,5 @@
-using AsbCloudApp.Data;
-using System.Collections.Generic;
+using System.Collections.Generic;
+using AsbCloudApp.Data.WellOperation;
namespace AsbCloudApp.Repositories
{
@@ -12,6 +12,6 @@ namespace AsbCloudApp.Repositories
/// список названий операций
///
///
- IEnumerable Get(bool includeParents);
+ IEnumerable Get(bool includeParents, bool includeHidden = true);
}
}
\ No newline at end of file
diff --git a/AsbCloudApp/Repositories/IWellOperationRepository.cs b/AsbCloudApp/Repositories/IWellOperationRepository.cs
index dd39ce52..12246578 100644
--- a/AsbCloudApp/Repositories/IWellOperationRepository.cs
+++ b/AsbCloudApp/Repositories/IWellOperationRepository.cs
@@ -1,6 +1,6 @@
using AsbCloudApp.Data;
+using AsbCloudApp.Data.WellOperation;
using AsbCloudApp.Requests;
-using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
@@ -18,22 +18,6 @@ namespace AsbCloudApp.Repositories
///
IEnumerable GetSectionTypes();
- ///
- /// список плановых операций для сопоставления
- ///
- ///
- ///
- ///
- ///
- Task GetOperationsPlanAsync(int idWell, DateTime? currentDate, CancellationToken token);
-
- ///
- /// дата/время первой операции по скважине
- ///
- ///
- ///
- DateTimeOffset? FirstOperationDate(int idWell);
-
///
/// Получить страницу списка операций
///
@@ -42,14 +26,6 @@ namespace AsbCloudApp.Repositories
///
Task> GetAsync(WellOperationRequest request, CancellationToken token);
- ///
- /// Получить список операций по запросу
- ///
- ///
- ///
- ///
- Task> GetAsync(WellsOperationRequest request, CancellationToken token);
-
///
/// Получить страницу списка операций
///
@@ -58,39 +34,30 @@ namespace AsbCloudApp.Repositories
///
Task> GetPageAsync(WellOperationRequest request, CancellationToken token);
- ///
- /// Получить операцию по id
- ///
- ///
- ///
- ///
- Task GetOrDefaultAsync(int id, CancellationToken token);
-
///
/// Получить статистику операции по скважине с группировкой по категориям
///
///
///
///
- Task> GetGroupOperationsStatAsync(
- WellOperationRequest request,
- CancellationToken token);
+ Task> GetGroupOperationsStatAsync(WellOperationRequest request, CancellationToken token);
///
- /// Добавить несколько операций за один раз
+ /// Добавить несколько операций
///
- ///
+ ///
+ ///
///
///
- Task InsertRangeAsync(IEnumerable wellOperationDtos, CancellationToken token);
+ Task InsertRangeAsync(IEnumerable dtos, bool deleteBeforeInsert, CancellationToken token);
///
/// Обновить существующую операцию
///
- ///
+ ///
///
///
- Task UpdateAsync(WellOperationDto dto, CancellationToken token);
+ Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token);
///
/// Удалить операции по id
@@ -98,7 +65,7 @@ namespace AsbCloudApp.Repositories
///
///
///
- Task DeleteAsync(IEnumerable ids, CancellationToken token);
+ Task DeleteRangeAsync(IEnumerable ids, CancellationToken token);
///
/// Получить секции скважин из операций ГГД. Секцие поделены на плановые и фактические.
@@ -108,31 +75,20 @@ namespace AsbCloudApp.Repositories
///
Task> GetSectionsAsync(IEnumerable idsWells, CancellationToken token);
- ///
- /// Получить диапазон дат выполнения операций
- ///
- ///
- ///
- ///
- ///
- Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken);
+ ///
+ /// Получить диапазон дат выполнения операций
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task GetDatesRangeAsync(int idWell, int idType, CancellationToken cancellationToken);
///
- /// Удаление полных дубликатов операций по всем скважинам
+ /// Возвращает первую и последнюю фактическую операцию
///
- ///
- ///
+ ///
///
- Task RemoveDuplicates(Action onProgressCallback, CancellationToken token);
-
- ///
- /// Усечение пересекающейся последующей операции по дате и глубине забоя
- ///
- /// Фильтр по дате. Если хоть одна операция попадет в в фильтр, то будет обработана вся скважина, а не только эта операция
- /// Фильтр по дате. Если хоть одна операция попадет в в фильтр, то будет обработана вся скважина, а не только эта операция
- ///
- ///
- ///
- Task TrimOverlapping(DateTimeOffset? geDate, DateTimeOffset leDate, Action onProgressCallback, CancellationToken token);
+ (WellOperationDto First, WellOperationDto Last)? GetFirstAndLastFact(int idWell);
}
}
\ No newline at end of file
diff --git a/AsbCloudApp/Requests/ExportOptions/WellOperationExportRequest.cs b/AsbCloudApp/Requests/ExportOptions/WellOperationExportRequest.cs
new file mode 100644
index 00000000..facbba72
--- /dev/null
+++ b/AsbCloudApp/Requests/ExportOptions/WellOperationExportRequest.cs
@@ -0,0 +1,20 @@
+namespace AsbCloudApp.Requests.ExportOptions;
+
+///
+/// Параметры экспорта ГГД
+///
+public class WellOperationExportRequest : WellRelatedExportRequest
+{
+ ///
+ public WellOperationExportRequest(int idWell,
+ int idType)
+ : base(idWell)
+ {
+ IdType = idType;
+ }
+
+ ///
+ /// Тип операций
+ ///
+ public int IdType { get; }
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Requests/FileRequest.cs b/AsbCloudApp/Requests/FileRequest.cs
index 7ea84c7e..403c0655 100644
--- a/AsbCloudApp/Requests/FileRequest.cs
+++ b/AsbCloudApp/Requests/FileRequest.cs
@@ -33,12 +33,12 @@ namespace AsbCloudApp.Requests
///
/// Дата начала периода
///
- public DateTime? Begin { get; set; }
+ public DateTimeOffset? Begin { get; set; }
///
/// Дата окончания периода
///
- public DateTime? End { get; set; }
+ public DateTimeOffset? End { get; set; }
///
/// Признак удаления
diff --git a/AsbCloudApp/Requests/GetStatRequest.cs b/AsbCloudApp/Requests/GetStatRequest.cs
index 5ebb9550..6a942f48 100644
--- a/AsbCloudApp/Requests/GetStatRequest.cs
+++ b/AsbCloudApp/Requests/GetStatRequest.cs
@@ -1,20 +1,19 @@
using System.Collections.Generic;
-using System.Linq;
namespace AsbCloudApp.Requests;
///
-///
+/// Запрос на получение статистики использования подсистем бурильщиком
///
-public class GetStatRequest: RequestBase
+public class GetStatRequest : RequestBase
{
///
- /// id
+ /// id скважин
///
public IEnumerable IdsWells { get; set; } = new List();
///
- /// id
+ /// список ключей бурильщиков
///
- public int? IdDriller { get; set; }
+ public IEnumerable IdsDrillers { get; set; } = new List();
}
\ No newline at end of file
diff --git a/AsbCloudApp/Requests/GtrWithGetDataRequest.cs b/AsbCloudApp/Requests/GtrRequest.cs
similarity index 90%
rename from AsbCloudApp/Requests/GtrWithGetDataRequest.cs
rename to AsbCloudApp/Requests/GtrRequest.cs
index 8e93a02c..89d281a3 100644
--- a/AsbCloudApp/Requests/GtrWithGetDataRequest.cs
+++ b/AsbCloudApp/Requests/GtrRequest.cs
@@ -5,12 +5,12 @@ namespace AsbCloudApp.Requests;
///
/// Параметры запроса для получения загруженных данных ГТИ по скважине
///
-public class GtrWithGetDataRequest
+public class GtrRequest
{
///
/// Дата начала выборки.По умолчанию: текущее время - IntervalSec
///
- public DateTime? Begin { get; set; }
+ public DateTimeOffset? Begin { get; set; }
///
/// Интервал времени даты начала выборки, секунды
@@ -20,5 +20,6 @@ public class GtrWithGetDataRequest
///
/// Желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена.
///
+ [Obsolete]
public int ApproxPointsCount { get; set; } = 1024;
}
\ No newline at end of file
diff --git a/AsbCloudApp/Requests/LimitingParameterRequest.cs b/AsbCloudApp/Requests/LimitingParameterRequest.cs
index 31fb02f0..4e1b5d98 100644
--- a/AsbCloudApp/Requests/LimitingParameterRequest.cs
+++ b/AsbCloudApp/Requests/LimitingParameterRequest.cs
@@ -17,12 +17,12 @@ namespace AsbCloudApp.Requests
///
/// Больше или равно дате
///
- public DateTime? GtDate { get; set; }
+ public DateTimeOffset? GtDate { get; set; }
///
/// Меньше или равно дате
///
- public DateTime? LtDate { get; set; }
+ public DateTimeOffset? LtDate { get; set; }
///
/// Больше или равно глубины забоя
diff --git a/AsbCloudApp/Requests/MessageRequest.cs b/AsbCloudApp/Requests/MessageRequest.cs
index 1bfba1a2..a474c7b9 100644
--- a/AsbCloudApp/Requests/MessageRequest.cs
+++ b/AsbCloudApp/Requests/MessageRequest.cs
@@ -17,12 +17,12 @@ namespace AsbCloudApp.Requests
///
/// начальная дата
///
- public DateTime? Begin { get; set; }
+ public DateTimeOffset? Begin { get; set; }
///
/// конечная дата
///
- public DateTime? End { get; set; }
+ public DateTimeOffset? End { get; set; }
///
/// строка поиска
diff --git a/AsbCloudApp/Requests/NotificationDeleteRequest.cs b/AsbCloudApp/Requests/NotificationDeleteRequest.cs
index ec2026f3..56921d70 100644
--- a/AsbCloudApp/Requests/NotificationDeleteRequest.cs
+++ b/AsbCloudApp/Requests/NotificationDeleteRequest.cs
@@ -15,10 +15,10 @@ public class NotificationDeleteRequest
///
/// Меньше или равно дате отправки
///
- public DateTime? LtSentDate { get; set; }
+ public DateTimeOffset? LtSentDate { get; set; }
///
/// Меньше или равно дате прочтения
///
- public DateTime? LtReadDate { get; set; }
+ public DateTimeOffset? LtReadDate { get; set; }
}
\ No newline at end of file
diff --git a/AsbCloudApp/Requests/ParserOptions/WellOperationParserRequest.cs b/AsbCloudApp/Requests/ParserOptions/WellOperationParserRequest.cs
new file mode 100644
index 00000000..efb9aad2
--- /dev/null
+++ b/AsbCloudApp/Requests/ParserOptions/WellOperationParserRequest.cs
@@ -0,0 +1,29 @@
+using AsbCloudApp.Data;
+
+namespace AsbCloudApp.Requests.ParserOptions;
+
+///
+/// Параметры парсинга ГГД
+///
+public class WellOperationParserRequest : WellRelatedParserRequest
+{
+ ///
+ public WellOperationParserRequest(int idWell,
+ int idType,
+ SimpleTimezoneDto wellTimezone)
+ : base(idWell)
+ {
+ IdType = idType;
+ WellTimezone = wellTimezone;
+ }
+
+ ///
+ /// Тип операции
+ ///
+ public int IdType { get; }
+
+ ///
+ /// Часовой пояс в котором находится скважина
+ ///
+ public SimpleTimezoneDto WellTimezone { get; }
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Requests/ProcessMapPlanRequest.cs b/AsbCloudApp/Requests/ProcessMapPlanRequest.cs
index b614b8c3..b3247ce2 100644
--- a/AsbCloudApp/Requests/ProcessMapPlanRequest.cs
+++ b/AsbCloudApp/Requests/ProcessMapPlanRequest.cs
@@ -20,5 +20,5 @@ public class ProcessMapPlanRequest
///
/// Дата обновления
///
- public DateTime? UpdateFrom { get; set; }
+ public DateTimeOffset? UpdateFrom { get; set; }
}
\ No newline at end of file
diff --git a/AsbCloudApp/Requests/ReportParametersRequest.cs b/AsbCloudApp/Requests/ReportParametersRequest.cs
index 57b83e4d..74bc358a 100644
--- a/AsbCloudApp/Requests/ReportParametersRequest.cs
+++ b/AsbCloudApp/Requests/ReportParametersRequest.cs
@@ -24,12 +24,12 @@ public class ReportParametersRequest: IValidatableObject
///
/// Дата начала интервала
///
- public DateTime Begin { get; set; } = default;
+ public DateTimeOffset Begin { get; set; } = default;
///
/// Дата окончания интервала
///
- public DateTime End { get; set; } = default;
+ public DateTimeOffset End { get; set; } = default;
///
public IEnumerable Validate(ValidationContext validationContext)
@@ -37,7 +37,7 @@ public class ReportParametersRequest: IValidatableObject
if (End < Begin)
yield return new("End mast be less then begin");
- if (Begin < new DateTime(2000, 1, 1))
+ if (Begin < new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero))
yield return new("Begin mast be > 2000-1-1");
}
}
\ No newline at end of file
diff --git a/AsbCloudApp/Requests/SubsystemRequest.cs b/AsbCloudApp/Requests/SubsystemRequest.cs
index 23a7e70a..08b980ab 100644
--- a/AsbCloudApp/Requests/SubsystemRequest.cs
+++ b/AsbCloudApp/Requests/SubsystemRequest.cs
@@ -9,7 +9,7 @@ namespace AsbCloudApp.Requests
///
public class SubsystemRequest: RequestBase, IValidatableObject
{
- private static readonly DateTime validationMinDate = new DateTime(2020,01,01,0,0,0,DateTimeKind.Utc);
+ private static readonly DateTimeOffset validationMinDate = new DateTimeOffset(2020,01,01,0,0,0, TimeSpan.Zero);
///
/// идентификатор скважины
diff --git a/AsbCloudApp/Requests/TrajectoryRequest.cs b/AsbCloudApp/Requests/TrajectoryRequest.cs
index 954879bc..35eca8c3 100644
--- a/AsbCloudApp/Requests/TrajectoryRequest.cs
+++ b/AsbCloudApp/Requests/TrajectoryRequest.cs
@@ -15,10 +15,10 @@ public class TrajectoryRequest : RequestBase
///
/// Больше или равно дате
///
- public DateTime? GeDate { get; set; }
+ public DateTimeOffset? GeDate { get; set; }
///
/// Меньше или равно дате
///
- public DateTime? LeDate { get; set; }
+ public DateTimeOffset? LeDate { get; set; }
}
\ No newline at end of file
diff --git a/AsbCloudApp/Requests/WellOperationRequest.cs b/AsbCloudApp/Requests/WellOperationRequest.cs
index 1d190018..fa866378 100644
--- a/AsbCloudApp/Requests/WellOperationRequest.cs
+++ b/AsbCloudApp/Requests/WellOperationRequest.cs
@@ -1,112 +1,104 @@
using System;
using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
-namespace AsbCloudApp.Requests
+namespace AsbCloudApp.Requests;
+
+///
+/// Запрос получения ГГД
+///
+public class WellOperationRequestBase : RequestBase
{
///
- /// параметры для запроса списка операций
+ /// Больше или равно дате начала операции
///
- public class WellOperationRequestBase : RequestBase
+ public DateTimeOffset? GeDate { get; set; }
+
+ ///
+ /// Меньше или равно дате окончания операции
+ ///
+ public DateTimeOffset? LeDate { get; set; }
+
+ ///
+ /// Больше или равно глубины скважины на начало операции.
+ ///
+ public double? GeDepth { get; set; }
+
+ ///
+ /// Меньше или равно глубины скважины на конец операции.
+ ///
+ public double? LeDepth { get; set; }
+
+ ///
+ /// Идентификаторы категорий операции
+ ///
+ public IEnumerable? OperationCategoryIds { get; set; }
+
+ ///
+ /// Тип операций
+ ///
+ /// - 0 - плановая операция
+ /// - 1 - фактическая операция
+ ///
+ ///
+ public int? OperationType { get; set; }
+
+ ///
+ /// Идентификаторы конструкций секции
+ ///
+ public IEnumerable? SectionTypeIds { get; set; }
+
+ ///
+ ///
+ ///
+ public WellOperationRequestBase()
{
- ///
- /// фильтр по дате начала операции
- ///
- public DateTime? GeDate { get; set; }
-
- ///
- /// фильтр по дате окончания операции
- ///
- public DateTime? LtDate { get; set; }
-
- ///
- /// фильтр. Больше или равно глубины скважины на начало операции.
- ///
- public double? GeDepth { get; set; }
-
- ///
- /// фильтр. Меньше или равно глубины скважины на конец операции.
- ///
- public double? LeDepth { get; set; }
-
- ///
- /// фильтр по списку id категорий операции
- ///
- public IEnumerable? OperationCategoryIds { get; set; }
-
- ///
- /// фильтр по план = 0, факт = 1
- ///
- public int? OperationType { get; set; }
-
- ///
- /// фильтр по списку 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 WellOperationRequestBase(WellOperationRequestBase request)
{
- ///
- /// id скважины
- ///
- public int IdWell { get; set; }
+ GeDepth = request.GeDepth;
+ LeDepth = request.LeDepth;
+ GeDate = request.GeDate;
+ LeDate = request.LeDate;
- ///
- /// ctor
- ///
- public WellOperationRequest() { }
+ OperationCategoryIds = request.OperationCategoryIds;
+ OperationType = request.OperationType;
+ SectionTypeIds = request.SectionTypeIds;
- ///
- /// копирующий конструктор
- ///
- ///
- ///
- public WellOperationRequest(WellOperationRequestBase request, int idWell)
- :base(request)
- {
- IdWell = idWell;
- }
- }
-
- ///
- /// Параметры для запроса списка операций (с массивом id скважин)
- ///
- public class WellsOperationRequest : WellOperationRequestBase
- {
- ///
- /// ids скважин
- ///
- public IEnumerable IdsWell { get; set; } = null!;
+ Skip = request.Skip;
+ Take = request.Take;
+ SortFields = request.SortFields;
}
}
+
+///
+/// Запрос получения ГГД с идентификаторами скважин
+///
+public class WellOperationRequest : WellOperationRequestBase
+{
+ ///
+ public WellOperationRequest(IEnumerable idsWell)
+ {
+ IdsWell = idsWell;
+ }
+
+ ///
+ public WellOperationRequest(WellOperationRequestBase request, IEnumerable idsWell)
+ : base(request)
+ {
+ IdsWell = idsWell;
+ }
+
+ ///
+ /// Идентификаторы скважин
+ ///
+ [Required]
+ [Length(1, 100)]
+ public IEnumerable IdsWell { get; }
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Services/DailyReport/IDailyReportService.cs b/AsbCloudApp/Services/DailyReport/IDailyReportService.cs
index f0318025..b39375a6 100644
--- a/AsbCloudApp/Services/DailyReport/IDailyReportService.cs
+++ b/AsbCloudApp/Services/DailyReport/IDailyReportService.cs
@@ -42,12 +42,4 @@ public interface IDailyReportService
///
///
Task> GetAsync(int idWell, FileReportRequest request, CancellationToken cancellationToken);
-
- ///
- /// Получить диапазон дат по которым возможно сформировать суточный отчёты
- ///
- ///
- ///
- ///
- Task GetDatesRangeAsync(int idWell, CancellationToken cancellationToken);
}
\ No newline at end of file
diff --git a/AsbCloudApp/Services/IExportService.cs b/AsbCloudApp/Services/Export/IExportService.cs
similarity index 70%
rename from AsbCloudApp/Services/IExportService.cs
rename to AsbCloudApp/Services/Export/IExportService.cs
index b921fec5..ddfd50f9 100644
--- a/AsbCloudApp/Services/IExportService.cs
+++ b/AsbCloudApp/Services/Export/IExportService.cs
@@ -3,12 +3,12 @@ using System.Threading;
using System.Threading.Tasks;
using AsbCloudApp.Requests.ExportOptions;
-namespace AsbCloudApp.Services;
+namespace AsbCloudApp.Services.Export;
///
/// Экспорт данных
///
-public interface IExportService
+public interface IExportService : IExportService
where TOptions : IExportOptionsRequest
{
///
@@ -18,4 +18,12 @@ public interface IExportService
///
///
Task<(string FileName, Stream File)> ExportAsync(TOptions options, CancellationToken token);
+}
+
+///
+/// Экспорт данных
+///
+public interface IExportService
+{
+
}
\ No newline at end of file
diff --git a/AsbCloudApp/Services/Export/IExportServiceFactory.cs b/AsbCloudApp/Services/Export/IExportServiceFactory.cs
new file mode 100644
index 00000000..fb6b5fc9
--- /dev/null
+++ b/AsbCloudApp/Services/Export/IExportServiceFactory.cs
@@ -0,0 +1,20 @@
+using AsbCloudApp.Requests.ExportOptions;
+
+namespace AsbCloudApp.Services.Export;
+
+///
+/// Фабрика создания сервисов для экспорта
+///
+///
+public interface IExportServiceFactory
+ where TId : struct
+{
+ ///
+ /// Создать сервис экспорта
+ ///
+ ///
+ ///
+ ///
+ IExportService CreateExportService(TId id)
+ where TOptions : IExportOptionsRequest;
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Services/IDetectedOperationService.cs b/AsbCloudApp/Services/IDetectedOperationService.cs
index 998032ba..262b193f 100644
--- a/AsbCloudApp/Services/IDetectedOperationService.cs
+++ b/AsbCloudApp/Services/IDetectedOperationService.cs
@@ -1,10 +1,10 @@
using System;
-using AsbCloudApp.Data;
using AsbCloudApp.Data.DetectedOperation;
using AsbCloudApp.Requests;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
+using AsbCloudApp.Data.WellOperation;
namespace AsbCloudApp.Services
{
@@ -13,6 +13,26 @@ namespace AsbCloudApp.Services
///
public interface IDetectedOperationService
{
+ ///
+ /// Добавление операций
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task InsertRangeManualAsync(int idEditor, int idWell, IEnumerable dtos, CancellationToken token);
+
+ ///
+ /// Редактирование операций
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task UpdateRangeManualAsync(int idEditor, int idWell, IEnumerable dtos, CancellationToken token);
+
///
/// Список названий операций.
/// Если указан idWell, то возвращается список названий операций найденных на указанной скважине.
@@ -52,6 +72,7 @@ namespace AsbCloudApp.Services
///
///
///
+ [Obsolete]
Task> GetOperationsStatAsync(DetectedOperationByWellRequest request, CancellationToken token);
///
diff --git a/AsbCloudApp/Services/IOperationsStatService.cs b/AsbCloudApp/Services/IOperationsStatService.cs
index a92d0553..f5ec7c7c 100644
--- a/AsbCloudApp/Services/IOperationsStatService.cs
+++ b/AsbCloudApp/Services/IOperationsStatService.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
+using AsbCloudApp.Data.WellOperation;
namespace AsbCloudApp.Services
{
diff --git a/AsbCloudApp/Services/IReportService.cs b/AsbCloudApp/Services/IReportService.cs
index 5f992a20..4b259240 100644
--- a/AsbCloudApp/Services/IReportService.cs
+++ b/AsbCloudApp/Services/IReportService.cs
@@ -46,7 +46,7 @@ namespace AsbCloudApp.Services
///
///
///
- int GetReportPagesCount(int idWell, DateTime begin, DateTime end,
+ int GetReportPagesCount(int idWell, DateTimeOffset begin, DateTimeOffset end,
int stepSeconds, int format);
///
diff --git a/AsbCloudApp/Services/IScheduleService.cs b/AsbCloudApp/Services/IScheduleService.cs
index 5a28b4c2..81c0d385 100644
--- a/AsbCloudApp/Services/IScheduleService.cs
+++ b/AsbCloudApp/Services/IScheduleService.cs
@@ -19,7 +19,7 @@ namespace AsbCloudApp.Services
///
///
///
- Task> GetAsync(int idWell, DateTime workTime, CancellationToken token);
+ Task> GetAsync(int idWell, DateTimeOffset workTime, CancellationToken token);
///
/// получить бурильщика по idWell и времени
@@ -28,7 +28,7 @@ namespace AsbCloudApp.Services
///
///
///
- Task GetOrDefaultDrillerAsync(int idWell, DateTime workTime, CancellationToken token);
+ Task GetOrDefaultDrillerAsync(int idWell, DateTimeOffset workTime, CancellationToken token);
///
/// Получить расписание смен
diff --git a/AsbCloudApp/Services/IWellCompositeOperationService.cs b/AsbCloudApp/Services/IWellCompositeOperationService.cs
index 94ba1f93..f1af9865 100644
--- a/AsbCloudApp/Services/IWellCompositeOperationService.cs
+++ b/AsbCloudApp/Services/IWellCompositeOperationService.cs
@@ -16,6 +16,6 @@ namespace AsbCloudApp.Services
///
///
///
- Task>> GetAsync(IEnumerable idsWells, CancellationToken token);
+ Task GetAsync(IEnumerable idsWells, CancellationToken token);
}
}
diff --git a/AsbCloudApp/Services/IWellService.cs b/AsbCloudApp/Services/IWellService.cs
index edea98ae..4279f587 100644
--- a/AsbCloudApp/Services/IWellService.cs
+++ b/AsbCloudApp/Services/IWellService.cs
@@ -72,7 +72,7 @@ namespace AsbCloudApp.Services
///
///
///
- DateTime GetLastTelemetryDate(int idWell);
+ DateTimeOffset GetLastTelemetryDate(int idWell);
//TODO: выяснить и удалить отсюда
///
diff --git a/AsbCloudApp/Services/Notifications/NotificationService.cs b/AsbCloudApp/Services/Notifications/NotificationService.cs
index d703ffb4..97b8bfb5 100644
--- a/AsbCloudApp/Services/Notifications/NotificationService.cs
+++ b/AsbCloudApp/Services/Notifications/NotificationService.cs
@@ -49,7 +49,7 @@ public class NotificationService
var notification = new NotificationDto
{
IdUser = request.IdUser,
- RegistrationDate = DateTime.UtcNow,
+ RegistrationDate = DateTimeOffset.UtcNow,
IdNotificationCategory = notificationCategory.Id,
Title = request.Title,
Message = request.Message,
@@ -71,7 +71,7 @@ public class NotificationService
Console.WriteLine(ex.Message);
}
- notification.SentDate = DateTime.UtcNow;
+ notification.SentDate = DateTimeOffset.UtcNow;
await notificationRepository.UpdateAsync(notification, cancellationToken);
}
@@ -92,7 +92,7 @@ public class NotificationService
if(isRead && !notification.SentDate.HasValue)
throw new ArgumentInvalidException(nameof(isRead), "Уведомление не может быть прочитано");
- notification.ReadDate = isRead ? DateTime.UtcNow : null;
+ notification.ReadDate = isRead ? DateTimeOffset.UtcNow : null;
await notificationRepository.UpdateAsync(notification,
cancellationToken);
@@ -119,7 +119,7 @@ public class NotificationService
var tasks = notifications.Select(notification =>
{
- notification.SentDate = DateTime.UtcNow;
+ notification.SentDate = DateTimeOffset.UtcNow;
return notificationRepository.UpdateAsync(notification, cancellationToken);
});
diff --git a/AsbCloudApp/Services/Parsers/IParserFactory.cs b/AsbCloudApp/Services/Parsers/IParserFactory.cs
new file mode 100644
index 00000000..e0fc1aa2
--- /dev/null
+++ b/AsbCloudApp/Services/Parsers/IParserFactory.cs
@@ -0,0 +1,23 @@
+using AsbCloudApp.Data;
+using AsbCloudApp.Requests.ParserOptions;
+
+namespace AsbCloudApp.Services.Parsers;
+
+///
+/// Фабрика для создания сервиса парсинга
+///
+///
+///
+public interface IParserFactory
+ where TId : struct
+ where TDto : class, IId
+{
+ ///
+ /// Создать парсер
+ ///
+ ///
+ ///
+ ///
+ IParserService CreateParser(TId id)
+ where TOptions : IParserOptionsRequest;
+}
\ No newline at end of file
diff --git a/AsbCloudApp/Services/IParserService.cs b/AsbCloudApp/Services/Parsers/IParserService.cs
similarity index 76%
rename from AsbCloudApp/Services/IParserService.cs
rename to AsbCloudApp/Services/Parsers/IParserService.cs
index 89212ba7..672c9e2b 100644
--- a/AsbCloudApp/Services/IParserService.cs
+++ b/AsbCloudApp/Services/Parsers/IParserService.cs
@@ -2,14 +2,14 @@ using System.IO;
using AsbCloudApp.Data;
using AsbCloudApp.Requests.ParserOptions;
-namespace AsbCloudApp.Services;
+namespace AsbCloudApp.Services.Parsers;
///
/// Сервис парсинга
///
///
///
-public interface IParserService
+public interface IParserService : IParserService
where TDto : class, IId
where TOptions : IParserOptionsRequest
{
@@ -26,4 +26,11 @@ public interface IParserService
///
///
Stream GetTemplateFile();
+}
+
+///
+/// Сервис парсинга
+///
+public interface IParserService
+{
}
\ No newline at end of file
diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationExcelParser.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationExcelParser.cs
deleted file mode 100644
index 7a695beb..00000000
--- a/AsbCloudApp/Services/WellOperationImport/IWellOperationExcelParser.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System.IO;
-using AsbCloudApp.Data.WellOperationImport;
-using AsbCloudApp.Data.WellOperationImport.Options;
-
-namespace AsbCloudApp.Services.WellOperationImport;
-
-///
-/// Парсинг операций из excel файла
-///
-public interface IWellOperationExcelParser
- where TOptions : IWellOperationImportOptions
-{
- ///
- /// Метод парсинга документа
- ///
- ///
- ///
- ///
- SheetDto Parse(Stream stream, TOptions options);
-}
\ No newline at end of file
diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationExportService.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationExportService.cs
deleted file mode 100644
index 9b0a96ac..00000000
--- a/AsbCloudApp/Services/WellOperationImport/IWellOperationExportService.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace AsbCloudApp.Services.WellOperationImport;
-
-///
-/// Экспорт ГГД
-///
-public interface IWellOperationExportService
-{
- ///
- /// Скачать в excel
- ///
- ///
- ///
- ///
- Task ExportAsync(int idWell, CancellationToken cancellationToken);
-}
\ No newline at end of file
diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs
deleted file mode 100644
index f65d8888..00000000
--- a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportService.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System.Collections.Generic;
-using AsbCloudApp.Data;
-using AsbCloudApp.Data.WellOperationImport;
-
-namespace AsbCloudApp.Services.WellOperationImport;
-
-///
-/// Импорт ГГД
-///
-public interface IWellOperationImportService
-{
- ///
- /// Загрузить из excel список операций
- ///
- ///
- ///
- ///
- ///
- IEnumerable Import(int idWell, int idUser, int idType, SheetDto sheet);
-}
\ No newline at end of file
diff --git a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportTemplateService.cs b/AsbCloudApp/Services/WellOperationImport/IWellOperationImportTemplateService.cs
deleted file mode 100644
index 817f3ae5..00000000
--- a/AsbCloudApp/Services/WellOperationImport/IWellOperationImportTemplateService.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using System.IO;
-
-namespace AsbCloudApp.Services.WellOperationImport;
-
-///
-/// Сервис для получения шаблонов ГГД
-///
-public interface IWellOperationImportTemplateService
-{
- ///
- /// Скачать шаблон для заполнения
- ///
- ///
- Stream GetExcelTemplateStream();
-}
\ No newline at end of file
diff --git a/AsbCloudDb/EFExtensions.cs b/AsbCloudDb/EFExtensions.cs
index 9da4c626..4b8361e7 100644
--- a/AsbCloudDb/EFExtensions.cs
+++ b/AsbCloudDb/EFExtensions.cs
@@ -227,7 +227,7 @@ namespace AsbCloudDb
DateTime vDate => $"'{FormatDateValue(vDate)}'",
DateTimeOffset vDate => $"'{FormatDateValue(vDate.UtcDateTime)}'",
IFormattable vFormattable => FormatFormattableValue(vFormattable),
- _ => System.Text.Json.JsonSerializer.Serialize(v),
+ _ => $"'{EscapeCurlyBraces(JsonSerializer.Serialize(v))}'",
};
private static string EscapeCurlyBraces(string vStr)
diff --git a/AsbCloudDb/Migrations/20240329070104_Update_WellOperationCategory_IdConditioning.Designer.cs b/AsbCloudDb/Migrations/20240329070104_Update_WellOperationCategory_IdConditioning.Designer.cs
new file mode 100644
index 00000000..9a85b491
--- /dev/null
+++ b/AsbCloudDb/Migrations/20240329070104_Update_WellOperationCategory_IdConditioning.Designer.cs
@@ -0,0 +1,9389 @@
+//
+using System;
+using System.Text.Json;
+using AsbCloudDb.Model;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace AsbCloudDb.Migrations
+{
+ [DbContext(typeof(AsbCloudDbContext))]
+ [Migration("20240329070104_Update_WellOperationCategory_IdConditioning")]
+ partial class Update_WellOperationCategory_IdConditioning
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .UseCollation("Russian_Russia.1251")
+ .HasAnnotation("ProductVersion", "8.0.2")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "adminpack");
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("AsbCloudDb.Model.Cluster", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Caption")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("caption")
+ .HasComment("Название");
+
+ b.Property("IdDeposit")
+ .HasColumnType("integer")
+ .HasColumnName("id_deposit");
+
+ b.Property("Latitude")
+ .HasColumnType("double precision")
+ .HasColumnName("latitude");
+
+ b.Property("Longitude")
+ .HasColumnType("double precision")
+ .HasColumnName("longitude");
+
+ b.Property("Timezone")
+ .IsRequired()
+ .HasColumnType("jsonb")
+ .HasColumnName("timezone")
+ .HasComment("Смещение часового пояса от UTC");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdDeposit");
+
+ b.ToTable("t_cluster", t =>
+ {
+ t.HasComment("Кусты");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.Company", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Caption")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("caption");
+
+ b.Property("IdCompanyType")
+ .HasMaxLength(255)
+ .HasColumnType("integer")
+ .HasColumnName("id_company_type")
+ .HasComment("вид деятельности");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdCompanyType");
+
+ b.ToTable("t_company");
+
+ b.HasData(
+ new
+ {
+ Id = 1,
+ Caption = "ООО \"АСБ\"",
+ IdCompanyType = 3
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.CompanyType", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Caption")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("caption");
+
+ b.Property("IsContact")
+ .HasColumnType("boolean")
+ .HasColumnName("is_contact");
+
+ b.Property("Order")
+ .HasColumnType("integer")
+ .HasColumnName("order");
+
+ b.HasKey("Id");
+
+ b.ToTable("t_company_type");
+
+ b.HasData(
+ new
+ {
+ Id = 1,
+ Caption = "Недропользователь",
+ IsContact = true,
+ Order = 3
+ },
+ new
+ {
+ Id = 2,
+ Caption = "Буровой подрядчик",
+ IsContact = true,
+ Order = 2
+ },
+ new
+ {
+ Id = 3,
+ Caption = "Сервис автоматизации бурения",
+ IsContact = true,
+ Order = 0
+ },
+ new
+ {
+ Id = 4,
+ Caption = "Сервис по ГТИ",
+ IsContact = true,
+ Order = 6
+ },
+ new
+ {
+ Id = 5,
+ Caption = "Растворный сервис",
+ IsContact = true,
+ Order = 4
+ },
+ new
+ {
+ Id = 6,
+ Caption = "Сервис по ННБ",
+ IsContact = true,
+ Order = 5
+ },
+ new
+ {
+ Id = 7,
+ Caption = "Служба супервайзинга",
+ IsContact = false,
+ Order = 1
+ },
+ new
+ {
+ Id = 9,
+ Caption = "Сервис по цементированию",
+ IsContact = true,
+ Order = 7
+ },
+ new
+ {
+ Id = 11,
+ Caption = "Дизельный сервис",
+ IsContact = false,
+ Order = 9
+ },
+ new
+ {
+ Id = 12,
+ Caption = "Сервис по обслуживанию верхних силовых приводов",
+ IsContact = true,
+ Order = 8
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.Contact", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Company")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("company")
+ .HasComment("компания");
+
+ b.Property("Email")
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("email")
+ .HasComment("email");
+
+ b.Property("FullName")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("full_name")
+ .HasComment("ФИО");
+
+ b.Property("IdCompanyType")
+ .HasMaxLength(255)
+ .HasColumnType("integer")
+ .HasColumnName("id_company_type")
+ .HasComment("вид деятельности");
+
+ b.Property("IdWell")
+ .HasMaxLength(255)
+ .HasColumnType("integer")
+ .HasColumnName("id_well")
+ .HasComment("ключ скважины");
+
+ b.Property("Phone")
+ .HasMaxLength(50)
+ .HasColumnType("character varying(50)")
+ .HasColumnName("phone")
+ .HasComment("номер телефона");
+
+ b.Property("Position")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("position")
+ .HasComment("должность");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdCompanyType");
+
+ b.HasIndex("IdWell");
+
+ b.ToTable("t_contact", t =>
+ {
+ t.HasComment("Контакты");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.DailyReports.DailyReport", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Date")
+ .HasColumnType("date")
+ .HasColumnName("date")
+ .HasComment("Дата формирования отчёта");
+
+ b.Property("DateLastUpdate")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_last_update")
+ .HasComment("Дата последнего обновления");
+
+ b.Property("IdWell")
+ .HasColumnType("integer")
+ .HasColumnName("id_well")
+ .HasComment("ID скважины");
+
+ b.Property("SignBlock")
+ .HasColumnType("jsonb")
+ .HasColumnName("sign_block")
+ .HasComment("Подпись");
+
+ b.Property("SubsystemBlock")
+ .HasColumnType("jsonb")
+ .HasColumnName("subsystem_block")
+ .HasComment("Наработкой подсистем");
+
+ b.Property("TimeBalanceBlock")
+ .HasColumnType("jsonb")
+ .HasColumnName("time_balance_block")
+ .HasComment("Баланс времени");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdWell", "Date")
+ .IsUnique();
+
+ b.ToTable("t_daily_report", t =>
+ {
+ t.HasComment("Ежедневные отчёты");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.DataSaubStat", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("AxialLoad")
+ .HasColumnType("double precision")
+ .HasColumnName("axial_load")
+ .HasComment("Фактическая нагрузка");
+
+ b.Property("AxialLoadLimitMax")
+ .HasColumnType("double precision")
+ .HasColumnName("axial_load_limit_max")
+ .HasComment("Максимально допустимая нагрузка");
+
+ b.Property("AxialLoadSp")
+ .HasColumnType("double precision")
+ .HasColumnName("axial_load_sp")
+ .HasComment("Ограничение факт. нагрузки");
+
+ b.Property("BlockSpeedSp")
+ .HasColumnType("double precision")
+ .HasColumnName("block_speed_sp")
+ .HasComment("Ограничение скорости блока");
+
+ b.Property("DateEnd")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_end")
+ .HasComment("Дата и время окончания");
+
+ b.Property("DateStart")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_start")
+ .HasComment("Дата и время начала");
+
+ b.Property("DepthEnd")
+ .HasColumnType("double precision")
+ .HasColumnName("depth_end")
+ .HasComment("Глубина забоя по стволу конечная");
+
+ b.Property("DepthStart")
+ .HasColumnType("double precision")
+ .HasColumnName("depth_start")
+ .HasComment("Глубина забоя по стволу начальная");
+
+ b.Property("EnabledSubsystems")
+ .HasColumnType("integer")
+ .HasColumnName("enabled_subsystems")
+ .HasComment("Флаги подсистем");
+
+ b.Property("Flow")
+ .HasColumnType("double precision")
+ .HasColumnName("flow")
+ .HasComment("Фактический расход");
+
+ b.Property("HasOscillation")
+ .HasColumnType("boolean")
+ .HasColumnName("has_oscillation")
+ .HasComment("Наличие или отсутствие осцилляции");
+
+ b.Property("IdCategory")
+ .HasColumnType("integer")
+ .HasColumnName("id_category")
+ .HasComment("Название автоопределённой операции");
+
+ b.Property("IdFeedRegulator")
+ .HasColumnType("smallint")
+ .HasColumnName("id_feed_regulator")
+ .HasComment("Работа при достижении ограничения");
+
+ b.Property("IdTelemetry")
+ .HasColumnType("integer")
+ .HasColumnName("id_telemetry")
+ .HasComment("Ключ телеметрии");
+
+ b.Property("Pressure")
+ .HasColumnType("double precision")
+ .HasColumnName("pressure")
+ .HasComment("Давление");
+
+ b.Property("PressureIdle")
+ .HasColumnType("double precision")
+ .HasColumnName("pressure_idle")
+ .HasComment("Давление холостого хода");
+
+ b.Property("PressureSp")
+ .HasColumnType("double precision")
+ .HasColumnName("pressure_sp")
+ .HasComment("Ограничение фактического давления");
+
+ b.Property("RotorSpeed")
+ .HasColumnType("double precision")
+ .HasColumnName("rotor_speed")
+ .HasComment("Фактическая скорость оборотов ВСП");
+
+ b.Property("RotorTorque")
+ .HasColumnType("double precision")
+ .HasColumnName("rotor_torque")
+ .HasComment("Фактический момент");
+
+ b.Property("RotorTorqueLimitMax")
+ .HasColumnType("double precision")
+ .HasColumnName("rotor_torque_limit_max")
+ .HasComment("Максимально допустимый момент");
+
+ b.Property("RotorTorqueSp")
+ .HasColumnType("double precision")
+ .HasColumnName("rotor_torque_sp")
+ .HasComment("Ограничение факт. момента");
+
+ b.Property("Speed")
+ .HasColumnType("double precision")
+ .HasColumnName("speed")
+ .HasComment("Скорость бурения");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdCategory");
+
+ b.HasIndex("IdTelemetry");
+
+ b.ToTable("t_data_saub_stat", t =>
+ {
+ t.HasComment("Кеш-таблица для хранения данных для РТК-отчета");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.Deposit", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Caption")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("caption");
+
+ b.Property("Latitude")
+ .HasColumnType("double precision")
+ .HasColumnName("latitude");
+
+ b.Property("Longitude")
+ .HasColumnType("double precision")
+ .HasColumnName("longitude");
+
+ b.Property("Timezone")
+ .IsRequired()
+ .HasColumnType("jsonb")
+ .HasColumnName("timezone")
+ .HasComment("Смещение часового пояса от UTC");
+
+ b.HasKey("Id");
+
+ b.ToTable("t_deposit", t =>
+ {
+ t.HasComment("Месторождение");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("DateEnd")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_end")
+ .HasComment("Дата начала операции");
+
+ b.Property("DateStart")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_start")
+ .HasComment("Дата начала операции");
+
+ b.Property("DepthEnd")
+ .HasColumnType("double precision")
+ .HasColumnName("depth_end")
+ .HasComment("Глубина после завершения операции, м");
+
+ b.Property("DepthStart")
+ .HasColumnType("double precision")
+ .HasColumnName("depth_start")
+ .HasComment("Глубина на начало операции, м");
+
+ b.Property("EnabledSubsystems")
+ .HasColumnType("integer")
+ .HasColumnName("enabled_subsystems")
+ .HasComment("флаги включенных подсистем");
+
+ b.Property("ExtraData")
+ .IsRequired()
+ .HasColumnType("jsonb")
+ .HasColumnName("extra_data")
+ .HasComment("доп. инфо по операции");
+
+ b.Property("IdCategory")
+ .HasColumnType("integer")
+ .HasColumnName("id_category")
+ .HasComment("Id категории операции");
+
+ b.Property("IdTelemetry")
+ .HasColumnType("integer")
+ .HasColumnName("id_telemetry");
+
+ b.Property("IdUsersAtStart")
+ .HasColumnType("integer")
+ .HasColumnName("id_user")
+ .HasComment("Id пользователя по телеметрии на момент начала операции");
+
+ b.Property("Value")
+ .HasColumnType("double precision")
+ .HasColumnName("value")
+ .HasComment("Ключевой показатель операции");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdCategory");
+
+ b.HasIndex("IdTelemetry");
+
+ b.ToTable("t_detected_operation", t =>
+ {
+ t.HasComment("автоматически определенные операции по телеметрии");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.DrillTest", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasComment("Идентификатор");
+
+ b.Property("IdTelemetry")
+ .HasColumnType("integer")
+ .HasColumnName("id_telemetry")
+ .HasComment("Идентификатор телеметрии");
+
+ b.Property("DepthStart")
+ .HasColumnType("real")
+ .HasColumnName("depthStart")
+ .HasComment("Глубина начала");
+
+ b.Property("Params")
+ .IsRequired()
+ .HasColumnType("jsonb")
+ .HasColumnName("t_drill_test_params")
+ .HasComment("Параметры записи drill test");
+
+ b.Property("TimeStampStart")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("timestamp_start")
+ .HasComment("Время начала");
+
+ b.HasKey("Id", "IdTelemetry");
+
+ b.HasIndex("IdTelemetry");
+
+ b.ToTable("t_drill_test", t =>
+ {
+ t.HasComment("Drill_test");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.Driller", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasComment("Идентификатор");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("name")
+ .HasComment("Имя");
+
+ b.Property("Patronymic")
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("patronymic")
+ .HasComment("Отчество");
+
+ b.Property("Surname")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("surname")
+ .HasComment("Фамилия");
+
+ b.HasKey("Id");
+
+ b.ToTable("t_driller", t =>
+ {
+ t.HasComment("Бурильщик");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("IdFileCategory")
+ .HasColumnType("integer")
+ .HasColumnName("id_file_category");
+
+ b.Property("IdWell")
+ .HasColumnType("integer")
+ .HasColumnName("id_well");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdFileCategory");
+
+ b.HasIndex("IdWell", "IdFileCategory")
+ .IsUnique();
+
+ b.ToTable("t_drilling_program_part", t =>
+ {
+ t.HasComment("части программ бурения");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.Faq", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id")
+ .HasComment("Идентификатор");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Answer")
+ .HasColumnType("text")
+ .HasColumnName("answer")
+ .HasComment("Текст ответа");
+
+ b.Property("CounterQuestion")
+ .HasColumnType("integer")
+ .HasColumnName("counter_question")
+ .HasComment("Счетчик повторений вопроса");
+
+ b.Property("DateAnswer")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_answer")
+ .HasComment("Дата ответа");
+
+ b.Property("DateCreatedQuestion")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created_question")
+ .HasComment("Дата создания вопроса");
+
+ b.Property("DateLastEditedQuestion")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_last_edited_question")
+ .HasComment("Дата последнего редактирования вопроса");
+
+ b.Property("IdAuthorAnswer")
+ .HasColumnType("integer")
+ .HasColumnName("id_author_answer")
+ .HasComment("id автора ответа");
+
+ b.Property("IdAuthorQuestion")
+ .HasColumnType("integer")
+ .HasColumnName("id_author_question")
+ .HasComment("id автора вопроса");
+
+ b.Property("IdReplacementQuestion")
+ .HasColumnType("integer")
+ .HasColumnName("id_replacement_question")
+ .HasComment("Ключ заменяющего вопроса");
+
+ b.Property("IsFrequently")
+ .HasColumnType("boolean")
+ .HasColumnName("is_frequently")
+ .HasComment("Частый вопрос");
+
+ b.Property("Question")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("question")
+ .HasComment("Текст вопроса");
+
+ b.Property("State")
+ .HasColumnType("integer")
+ .HasColumnName("state")
+ .HasComment("Статус вопроса");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdAuthorAnswer");
+
+ b.HasIndex("IdAuthorQuestion");
+
+ b.ToTable("t_faq", t =>
+ {
+ t.HasComment("вопросы пользователей");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.FileCategory", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("name")
+ .HasComment("Название категории");
+
+ b.Property("ShortName")
+ .HasColumnType("text")
+ .HasColumnName("short_name")
+ .HasComment("Короткое название категории");
+
+ b.HasKey("Id");
+
+ b.ToTable("t_file_category", t =>
+ {
+ t.HasComment("Категории файлов");
+ });
+
+ b.HasData(
+ new
+ {
+ Id = 1,
+ Name = "Растворный сервис",
+ ShortName = "fluidService"
+ },
+ new
+ {
+ Id = 2,
+ Name = "Цементирование",
+ ShortName = "cement"
+ },
+ new
+ {
+ Id = 3,
+ Name = "ННБ",
+ ShortName = "nnb"
+ },
+ new
+ {
+ Id = 4,
+ Name = "ГТИ",
+ ShortName = "gti"
+ },
+ new
+ {
+ Id = 5,
+ Name = "Документы по скважине",
+ ShortName = "wellDocuments"
+ },
+ new
+ {
+ Id = 6,
+ Name = "Супервайзер",
+ ShortName = "supervisor"
+ },
+ new
+ {
+ Id = 7,
+ Name = "Мастер",
+ ShortName = "master"
+ },
+ new
+ {
+ Id = 8,
+ Name = "Долотный сервис",
+ ShortName = "toolService"
+ },
+ new
+ {
+ Id = 9,
+ Name = "Буровой подрядчик",
+ ShortName = "drillService"
+ },
+ new
+ {
+ Id = 10,
+ Name = "Сервис по заканчиванию скважины",
+ ShortName = "closingService"
+ },
+ new
+ {
+ Id = 12,
+ Name = "Рапорт",
+ ShortName = "report"
+ },
+ new
+ {
+ Id = 1000,
+ Name = "Программа бурения"
+ },
+ new
+ {
+ Id = 1001,
+ Name = "Задание от геологов"
+ },
+ new
+ {
+ Id = 1002,
+ Name = "Профиль ствола скважины (ННБ)"
+ },
+ new
+ {
+ Id = 1003,
+ Name = "Технологические расчеты (ННБ)"
+ },
+ new
+ {
+ Id = 1004,
+ Name = "Долотная программа"
+ },
+ new
+ {
+ Id = 1005,
+ Name = "Программа по растворам"
+ },
+ new
+ {
+ Id = 1006,
+ Name = "Программа геофизических исследований"
+ },
+ new
+ {
+ Id = 1007,
+ Name = "Планы спусков обсадных колонн"
+ },
+ new
+ {
+ Id = 1008,
+ Name = "Программы цементирования обсадных колонн"
+ },
+ new
+ {
+ Id = 10000,
+ Name = "Проект на бурение транспортного и горизонтального участков скважины"
+ },
+ new
+ {
+ Id = 10001,
+ Name = "Программа на бурение транспортного и горизонтального участков скважины"
+ },
+ new
+ {
+ Id = 10002,
+ Name = "Акт о начале бурения"
+ },
+ new
+ {
+ Id = 10003,
+ Name = "План работ спуска и цементирования направления"
+ },
+ new
+ {
+ Id = 10004,
+ Name = "Программа цементирования направления"
+ },
+ new
+ {
+ Id = 10005,
+ Name = "Мера обсадных труб (направление)"
+ },
+ new
+ {
+ Id = 10006,
+ Name = "Акт на выполненные работы по цементированию направления"
+ },
+ new
+ {
+ Id = 10007,
+ Name = "Отчет по цементированию направления (график)"
+ },
+ new
+ {
+ Id = 10008,
+ Name = "План работ спуска и цементирования кондуктора"
+ },
+ new
+ {
+ Id = 10009,
+ Name = "Программа цементирования (кондуктор)"
+ },
+ new
+ {
+ Id = 10010,
+ Name = "Мера обсадных труб (кондуктор)"
+ },
+ new
+ {
+ Id = 10011,
+ Name = "Карта крепления кондуктора"
+ },
+ new
+ {
+ Id = 10012,
+ Name = "Акт на выполненные работы по цементированию кондуктора"
+ },
+ new
+ {
+ Id = 10013,
+ Name = "Отчет по цементированию кондуктора (график)"
+ },
+ new
+ {
+ Id = 10014,
+ Name = "Акт о замере расстояния от стола ротора до муфты кондуктора"
+ },
+ new
+ {
+ Id = 10015,
+ Name = "Акт опресовки цементного кольца за кондуктором"
+ },
+ new
+ {
+ Id = 10016,
+ Name = "Акт опресовки ППГ с глухими плашками совместно с кондуктором"
+ },
+ new
+ {
+ Id = 10017,
+ Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с кондуктором"
+ },
+ new
+ {
+ Id = 10018,
+ Name = "План работ на крепление обсадной колонны (эк. колонна)"
+ },
+ new
+ {
+ Id = 10019,
+ Name = "Программа цементирования (эк. колонна)"
+ },
+ new
+ {
+ Id = 10020,
+ Name = "Мера труб эксплуатационной колонны"
+ },
+ new
+ {
+ Id = 10021,
+ Name = "Карта по креплению скважины (эк. колонна)"
+ },
+ new
+ {
+ Id = 10022,
+ Name = "Акт на установку пружинных центраторов"
+ },
+ new
+ {
+ Id = 10023,
+ Name = "Отчет по цементированию эксплуатационной колонны (график)"
+ },
+ new
+ {
+ Id = 10024,
+ Name = "Акт на выполненные работы по цементированию эксплуатационной колонны"
+ },
+ new
+ {
+ Id = 10025,
+ Name = "Акт об испытании эк. колонны на герметичность (СТОП)"
+ },
+ new
+ {
+ Id = 10026,
+ Name = "Акт опресовки ППГ с глухими плашками совместно с э/колонной"
+ },
+ new
+ {
+ Id = 10027,
+ Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с э/колонной"
+ },
+ new
+ {
+ Id = 10028,
+ Name = "Акт на вскрытие продуктивного пласта"
+ },
+ new
+ {
+ Id = 10029,
+ Name = "Акт замера параметров раствора при бурении горизонтального участка"
+ },
+ new
+ {
+ Id = 10030,
+ Name = "Разрешение на спуск «хвостовика» (телефонограмма)"
+ },
+ new
+ {
+ Id = 10031,
+ Name = "План работ на спуск «хвостовика»"
+ },
+ new
+ {
+ Id = 10032,
+ Name = "Акт готовности бурового и энергетического оборудования к спуску «хвостовика»"
+ },
+ new
+ {
+ Id = 10033,
+ Name = "Акт шаблонировки ствола скважины перед спуском «хвостовика»"
+ },
+ new
+ {
+ Id = 10034,
+ Name = "Мера обсадных труб (хвостовик)"
+ },
+ new
+ {
+ Id = 10035,
+ Name = "Акт выполненных работ по спуску хвостовика с закачкой (нефти, солевого раствора"
+ },
+ new
+ {
+ Id = 10036,
+ Name = "Акт о переводе скважины на тех. воду"
+ },
+ new
+ {
+ Id = 10037,
+ Name = "Акт об окончании бурения"
+ },
+ new
+ {
+ Id = 10038,
+ Name = "Акт на передачу скважины в освоение (КРС)"
+ },
+ new
+ {
+ Id = 10039,
+ Name = "Акт на опресовку межколонного пространства с КРС"
+ },
+ new
+ {
+ Id = 10040,
+ Name = "Акт на сдачу скважины в ЦДНГ"
+ },
+ new
+ {
+ Id = 10041,
+ Name = "Паспорт ОУС (заполняется геологами)"
+ },
+ new
+ {
+ Id = 10042,
+ Name = "Паспорт скважины (заполняется геологами)"
+ },
+ new
+ {
+ Id = 10043,
+ Name = "Фактические данные бурения (вставляются в паспорт скважины)"
+ },
+ new
+ {
+ Id = 20000,
+ Name = "Справки по страницам"
+ },
+ new
+ {
+ Id = 30000,
+ Name = "Инструкции"
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.FileInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("IdAuthor")
+ .HasColumnType("integer")
+ .HasColumnName("id_author")
+ .HasComment("Id пользователя, загрузившего файл");
+
+ b.Property("IdCategory")
+ .HasColumnType("integer")
+ .HasColumnName("id_category")
+ .HasComment("id категории файла");
+
+ b.Property("IdWell")
+ .HasColumnType("integer")
+ .HasColumnName("id_well")
+ .HasComment("id скважины");
+
+ b.Property("IsDeleted")
+ .HasColumnType("boolean")
+ .HasColumnName("is_deleted")
+ .HasComment("Удален ли файл");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("name")
+ .HasComment("Название файла");
+
+ b.Property("Size")
+ .HasColumnType("bigint")
+ .HasColumnName("file_size")
+ .HasComment("Размер файла");
+
+ b.Property("UploadDate")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdAuthor");
+
+ b.HasIndex("IdCategory");
+
+ b.HasIndex("IdWell");
+
+ b.ToTable("t_file_info", t =>
+ {
+ t.HasComment("Файлы всех категорий");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.FileMark", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Comment")
+ .HasMaxLength(255)
+ .HasColumnType("character varying(255)")
+ .HasColumnName("comment")
+ .HasComment("Комментарий");
+
+ b.Property("DateCreated")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date_created")
+ .HasComment("Дата совершенного действия");
+
+ b.Property("IdFile")
+ .HasColumnType("integer")
+ .HasColumnName("id_file")
+ .HasComment("id файла");
+
+ b.Property("IdMarkType")
+ .HasColumnType("integer")
+ .HasColumnName("id_mark_type")
+ .HasComment("0 - отклонен, 1 - согласован");
+
+ b.Property("IdUser")
+ .HasColumnType("integer")
+ .HasColumnName("id_user")
+ .HasComment("id пользователя");
+
+ b.Property("IsDeleted")
+ .HasColumnType("boolean")
+ .HasColumnName("is_deleted")
+ .HasComment("Помечен ли файл как удаленный");
+
+ b.HasKey("Id");
+
+ b.HasIndex("IdFile");
+
+ b.HasIndex("IdUser");
+
+ b.ToTable("t_file_mark", t =>
+ {
+ t.HasComment("Действия с файлами.");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemFloat", b =>
+ {
+ b.Property("IdTelemetry")
+ .HasColumnType("integer")
+ .HasColumnName("id_telemetry");
+
+ b.Property("IdRecord")
+ .HasColumnType("integer")
+ .HasColumnName("id_record");
+
+ b.Property("IdItem")
+ .HasColumnType("integer")
+ .HasColumnName("id_item");
+
+ b.Property("DateTime")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date");
+
+ b.Property("Value")
+ .HasColumnType("real")
+ .HasColumnName("value");
+
+ b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime");
+
+ b.ToTable("t_wits_float", t =>
+ {
+ t.HasComment("таблица данных ГТИ с типом значения float");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemInt", b =>
+ {
+ b.Property("IdTelemetry")
+ .HasColumnType("integer")
+ .HasColumnName("id_telemetry");
+
+ b.Property("IdRecord")
+ .HasColumnType("integer")
+ .HasColumnName("id_record");
+
+ b.Property("IdItem")
+ .HasColumnType("integer")
+ .HasColumnName("id_item");
+
+ b.Property("DateTime")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date");
+
+ b.Property("Value")
+ .HasColumnType("integer")
+ .HasColumnName("value");
+
+ b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime");
+
+ b.ToTable("t_wits_int", t =>
+ {
+ t.HasComment("таблица данных ГТИ с типом значения int");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.GTR.WitsItemString", b =>
+ {
+ b.Property("IdTelemetry")
+ .HasColumnType("integer")
+ .HasColumnName("id_telemetry");
+
+ b.Property("IdRecord")
+ .HasColumnType("integer")
+ .HasColumnName("id_record");
+
+ b.Property("IdItem")
+ .HasColumnType("integer")
+ .HasColumnName("id_item");
+
+ b.Property("DateTime")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("date");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasColumnType("text")
+ .HasColumnName("value");
+
+ b.HasKey("IdTelemetry", "IdRecord", "IdItem", "DateTime");
+
+ b.ToTable("t_wits_string", t =>
+ {
+ t.HasComment("таблица данных ГТИ с типом значения string");
+ });
+ });
+
+ modelBuilder.Entity("AsbCloudDb.Model.HelpPage", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasColumnName("id");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property